From 286181881284b504da0e10ae3144d7062ec2435d Mon Sep 17 00:00:00 2001 From: Anastasia Kubova Date: Fri, 15 May 2020 15:10:08 +0300 Subject: [PATCH 001/115] update sqlite binaries --- Vendor/SQLite3/sqlite3.c | 29506 ++++++++++++++++++++++++------------- Vendor/SQLite3/sqlite3.h | 875 +- 2 files changed, 20089 insertions(+), 10292 deletions(-) diff --git a/Vendor/SQLite3/sqlite3.c b/Vendor/SQLite3/sqlite3.c index 7b525c36bb..55dc686ee0 100644 --- a/Vendor/SQLite3/sqlite3.c +++ b/Vendor/SQLite3/sqlite3.c @@ -1,6 +1,6 @@ /****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite -** version 3.25.2. By combining all the individual C code files into this +** version 3.31.1. By combining all the individual C code files into this ** single large file, the entire code can be compiled as a single translation ** unit. This allows many compilers to do optimizations that would not be ** possible if the files were compiled separately. Performance improvements @@ -39,7 +39,7 @@ ** SQLite was built with. */ -#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS /* IMP: R-16824-07538 */ /* ** Include the configuration header output by 'configure' if we're using the @@ -260,6 +260,9 @@ static const char * const sqlite3azCompileOpt[] = { #if SQLITE_ENABLE_FTS5 "ENABLE_FTS5", #endif +#if SQLITE_ENABLE_GEOPOLY + "ENABLE_GEOPOLY", +#endif #if SQLITE_ENABLE_HIDDEN_COLUMNS "ENABLE_HIDDEN_COLUMNS", #endif @@ -290,6 +293,9 @@ static const char * const sqlite3azCompileOpt[] = { #if SQLITE_ENABLE_MULTIPLEX "ENABLE_MULTIPLEX", #endif +#if SQLITE_ENABLE_NORMALIZE + "ENABLE_NORMALIZE", +#endif #if SQLITE_ENABLE_NULL_TRIM "ENABLE_NULL_TRIM", #endif @@ -325,8 +331,6 @@ static const char * const sqlite3azCompileOpt[] = { #endif #if defined(SQLITE_ENABLE_STAT4) "ENABLE_STAT4", -#elif defined(SQLITE_ENABLE_STAT3) - "ENABLE_STAT3", #endif #if SQLITE_ENABLE_STMTVTAB "ENABLE_STMTVTAB", @@ -882,6 +886,11 @@ SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt){ #pragma warning(disable : 4706) #endif /* defined(_MSC_VER) */ +#if defined(_MSC_VER) && !defined(_WIN64) +#undef SQLITE_4_BYTE_ALIGNED_MALLOC +#define SQLITE_4_BYTE_ALIGNED_MALLOC +#endif /* defined(_MSC_VER) && !defined(_WIN64) */ + #endif /* SQLITE_MSVC_H */ /************** End of msvc.h ************************************************/ @@ -1156,9 +1165,9 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.25.2" -#define SQLITE_VERSION_NUMBER 3025002 -#define SQLITE_SOURCE_ID "2018-09-25 19:08:10 fb90e7189ae6d62e77ba3a308ca5d683f90bbe633cf681865365b8e92792d1c7" +#define SQLITE_VERSION "3.31.1" +#define SQLITE_VERSION_NUMBER 3031001 +#define SQLITE_SOURCE_ID "2020-01-27 19:55:54 3bfa9cc97da10598521b342961df8f5f68c7388fa117345eeb516eaa837bb4d6" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -1222,6 +1231,9 @@ SQLITE_API int sqlite3_libversion_number(void); #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS SQLITE_API int sqlite3_compileoption_used(const char *zOptName); SQLITE_API const char *sqlite3_compileoption_get(int N); +#else +# define sqlite3_compileoption_used(X) 0 +# define sqlite3_compileoption_get(X) ((void*)0) #endif /* @@ -1546,6 +1558,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8)) #define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) #define SQLITE_CANTOPEN_DIRTYWAL (SQLITE_CANTOPEN | (5<<8)) /* Not Used */ +#define SQLITE_CANTOPEN_SYMLINK (SQLITE_CANTOPEN | (6<<8)) #define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) #define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8)) #define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) @@ -1565,11 +1578,13 @@ SQLITE_API int sqlite3_exec( #define SQLITE_CONSTRAINT_UNIQUE (SQLITE_CONSTRAINT | (8<<8)) #define SQLITE_CONSTRAINT_VTAB (SQLITE_CONSTRAINT | (9<<8)) #define SQLITE_CONSTRAINT_ROWID (SQLITE_CONSTRAINT |(10<<8)) +#define SQLITE_CONSTRAINT_PINNED (SQLITE_CONSTRAINT |(11<<8)) #define SQLITE_NOTICE_RECOVER_WAL (SQLITE_NOTICE | (1<<8)) #define SQLITE_NOTICE_RECOVER_ROLLBACK (SQLITE_NOTICE | (2<<8)) #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)) /* ** CAPI3REF: Flags For File Open Operations @@ -1598,6 +1613,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_WAL 0x00080000 /* VFS only */ +#define SQLITE_OPEN_NOFOLLOW 0x01000000 /* Ok for sqlite3_open_v2() */ /* Reserved: 0x00F00000 */ @@ -1856,6 +1872,15 @@ struct sqlite3_io_methods { ** file space based on this hint in order to help writes to the database ** file run faster. ** +**
  • [[SQLITE_FCNTL_SIZE_LIMIT]] +** The [SQLITE_FCNTL_SIZE_LIMIT] opcode is used by in-memory VFS that +** implements [sqlite3_deserialize()] to set an upper bound on the size +** of the in-memory database. The argument is a pointer to a [sqlite3_int64]. +** If the integer pointed to is negative, then it is filled in with the +** current limit. Otherwise the limit is set to the larger of the value +** of the integer pointed to and the current database size. The integer +** pointed to is set to the new limit. +** **
  • [[SQLITE_FCNTL_CHUNK_SIZE]] ** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS ** extends and truncates the database file in chunks of a size specified @@ -2000,16 +2025,16 @@ struct sqlite3_io_methods { ** ^The [SQLITE_FCNTL_BUSYHANDLER] ** file-control may be invoked by SQLite on the database file handle ** shortly after it is opened in order to provide a custom VFS with access -** to the connections busy-handler callback. The argument is of type (void **) +** to the connection's busy-handler callback. The argument is of type (void**) ** - an array of two (void *) values. The first (void *) actually points -** to a function of type (int (*)(void *)). In order to invoke the connections +** to a function of type (int (*)(void *)). In order to invoke the connection's ** busy-handler, this function should be invoked with the second (void *) in ** the array as the only argument. If it returns non-zero, then the operation ** should be retried. If it returns zero, the custom VFS should abandon the ** current operation. ** **
  • [[SQLITE_FCNTL_TEMPFILENAME]] -** ^Application can invoke the [SQLITE_FCNTL_TEMPFILENAME] file-control +** ^Applications can invoke the [SQLITE_FCNTL_TEMPFILENAME] file-control ** to have SQLite generate a ** temporary filename using the same algorithm that is followed to generate ** temporary filenames for TEMP tables and other internal uses. The @@ -2122,12 +2147,18 @@ struct sqlite3_io_methods { ** not provide a mechanism to detect changes to MAIN only. Also, the ** [sqlite3_total_changes()] interface responds to internal changes only and ** omits changes made by other database connections. The -** [PRAGMA data_version] command provide a mechanism to detect changes to +** [PRAGMA data_version] command provides a mechanism to detect changes to ** a single attached database that occur due to other database connections, ** but omits changes implemented by the database connection on which it is ** called. This file control is the only mechanism to detect changes that ** happen either internally or externally and that are associated with ** a particular attached database. +** +**
  • [[SQLITE_FCNTL_CKPT_DONE]] +** The [SQLITE_FCNTL_CKPT_DONE] opcode is invoked from within a checkpoint +** in wal mode after the client has finished copying pages from the wal +** file to the database file, but before the *-shm file is updated to +** record the fact that the pages have been checkpointed. ** */ #define SQLITE_FCNTL_LOCKSTATE 1 @@ -2164,6 +2195,8 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 #define SQLITE_FCNTL_LOCK_TIMEOUT 34 #define SQLITE_FCNTL_DATA_VERSION 35 +#define SQLITE_FCNTL_SIZE_LIMIT 36 +#define SQLITE_FCNTL_CKPT_DONE 37 /* deprecated names */ #define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE @@ -2209,10 +2242,10 @@ typedef struct sqlite3_api_routines sqlite3_api_routines; ** to 3 with SQLite [version 3.7.6] on [dateof:3.7.6]. Additional fields ** may be appended to the sqlite3_vfs object and the iVersion value ** may increase again in future versions of SQLite. -** Note that the structure -** of the sqlite3_vfs object changes in the transition from +** Note that due to an oversight, the structure +** of the sqlite3_vfs object changed in the transition from ** SQLite [version 3.5.9] to [version 3.6.0] on [dateof:3.6.0] -** and yet the iVersion field was not modified. +** and yet the iVersion field was not increased. ** ** The szOsFile field is the size of the subclassed [sqlite3_file] ** structure used by this VFS. mxPathname is the maximum length of @@ -2303,7 +2336,7 @@ typedef struct sqlite3_api_routines sqlite3_api_routines; ** for exclusive access. ** ** ^At least szOsFile bytes of memory are allocated by SQLite -** to hold the [sqlite3_file] structure passed as the third +** to hold the [sqlite3_file] structure passed as the third ** argument to xOpen. The xOpen method does not have to ** allocate the structure; it should just fill it in. Note that ** the xOpen method must set the sqlite3_file.pMethods to either @@ -2316,8 +2349,14 @@ typedef struct sqlite3_api_routines sqlite3_api_routines; ** ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] ** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to ** test whether a file is readable and writable, or [SQLITE_ACCESS_READ] -** to test whether a file is at least readable. The file can be a -** directory. +** to test whether a file is at least readable. The SQLITE_ACCESS_READ +** flag is never actually used and is not implemented in the built-in +** VFSes of SQLite. The file is named by the second argument and can be a +** directory. The xAccess method returns [SQLITE_OK] on success or some +** non-zero error code if there is an I/O error or if the name of +** the file given in the second argument is illegal. If SQLITE_OK +** is returned, then non-zero or zero is written into *pResOut to indicate +** whether or not the file is accessible. ** ** ^SQLite will always allocate at least mxPathname+1 bytes for the ** output buffer xFullPathname. The exact size of the output buffer @@ -2634,7 +2673,7 @@ SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...); ** that causes the corresponding memory allocation to fail. ** ** The xInit method initializes the memory allocator. For example, -** it might allocate any require mutexes or initialize internal data +** it might allocate any required mutexes or initialize internal data ** structures. The xShutdown method is invoked (indirectly) by ** [sqlite3_shutdown()] and should deallocate any resources acquired ** by xInit. The pAppData pointer is used as the only parameter to @@ -2756,6 +2795,7 @@ struct sqlite3_mem_methods { ** memory allocation statistics. ^(When memory allocation statistics are ** disabled, the following SQLite interfaces become non-operational: ** )^ ** ^The eTextRep argument determines the encoding of strings passed -** to the collating function callback, xCallback. +** to the collating function callback, xCompare. ** ^The [SQLITE_UTF16] and [SQLITE_UTF16_ALIGNED] values for eTextRep ** force strings to be UTF16 with native byte order. ** ^The [SQLITE_UTF16_ALIGNED] value for eTextRep forces strings to begin @@ -6400,18 +6748,19 @@ SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); ** ^The fourth argument, pArg, is an application data pointer that is passed ** through as the first argument to the collating function callback. ** -** ^The fifth argument, xCallback, is a pointer to the collating function. +** ^The fifth argument, xCompare, is a pointer to the collating function. ** ^Multiple collating functions can be registered using the same name but ** with different eTextRep parameters and SQLite will use whichever ** function requires the least amount of data transformation. -** ^If the xCallback argument is NULL then the collating function is +** ^If the xCompare argument is NULL then the collating function is ** deleted. ^When all collating functions having the same name are deleted, ** that collation is no longer usable. ** ** ^The collating function callback is invoked with a copy of the pArg ** application data pointer and with two strings in the encoding specified -** by the eTextRep argument. The collating function must return an -** integer that is negative, zero, or positive +** by the eTextRep argument. The two integer parameters to the collating +** function callback are the length of the two strings, in bytes. The collating +** function must return an integer that is negative, zero, or positive ** if the first string is less than, equal to, or greater than the second, ** respectively. A collating function must always return the same answer ** given the same inputs. If two or more collating functions are registered @@ -6428,7 +6777,7 @@ SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); ** ** ** If a collating function fails any of the above constraints and that -** collating function is registered and used, then the behavior of SQLite +** collating function is registered and used, then the behavior of SQLite ** is undefined. ** ** ^The sqlite3_create_collation_v2() works like sqlite3_create_collation() @@ -6755,16 +7104,31 @@ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); ** CAPI3REF: Return The Filename For A Database Connection ** METHOD: sqlite3 ** -** ^The sqlite3_db_filename(D,N) interface returns a pointer to a filename -** associated with database N of connection D. ^The main database file -** has the name "main". If there is no attached database N on the database +** ^The sqlite3_db_filename(D,N) interface returns a pointer to the filename +** associated with database N of connection D. +** ^If there is no attached database N on the database ** connection D, or if database N is a temporary or in-memory database, then -** a NULL pointer is returned. +** this function will return either a NULL pointer or an empty string. +** +** ^The string value returned by this routine is owned and managed by +** the database connection. ^The value will be valid until the database N +** is [DETACH]-ed or until the database connection closes. ** ** ^The filename returned by this function is the output of the ** xFullPathname method of the [VFS]. ^In other words, the filename ** will be an absolute pathname, even if the filename used ** to open the database originally was a URI or relative pathname. +** +** If the filename pointer returned by this routine is not NULL, then it +** can be used as the filename input parameter to these routines: +** */ SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); @@ -6914,15 +7278,19 @@ SQLITE_API void *sqlite3_update_hook( ** ** ^(The cache sharing mode set by this interface effects all subsequent ** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()]. -** Existing database connections continue use the sharing mode +** Existing database connections continue to use the sharing mode ** that was in effect at the time they were opened.)^ ** ** ^(This routine returns [SQLITE_OK] if shared cache was enabled or disabled ** successfully. An [error code] is returned otherwise.)^ ** -** ^Shared cache is disabled by default. But this might change in -** future releases of SQLite. Applications that care about shared -** cache setting should set it explicitly. +** ^Shared cache is disabled by default. It is recommended that it stay +** that way. In other words, do not use this routine. This interface +** continues to be provided for historical compatibility, but its use is +** discouraged. Any use of shared cache is discouraged. If shared cache +** must be used, it is recommended that shared cache only be enabled for +** individual database connections using the [sqlite3_open_v2()] interface +** with the [SQLITE_OPEN_SHAREDCACHE] flag. ** ** Note: This method is disabled on MacOS X 10.7 and iOS version 5.0 ** and will always return SQLITE_MISUSE. On those systems, @@ -6969,6 +7337,9 @@ SQLITE_API int sqlite3_db_release_memory(sqlite3*); /* ** CAPI3REF: Impose A Limit On Heap Size ** +** These interfaces impose limits on the amount of heap memory that will be +** by all database connections within a single process. +** ** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the ** soft limit on the amount of heap memory that may be allocated by SQLite. ** ^SQLite strives to keep heap memory utilization below the soft heap @@ -6979,20 +7350,41 @@ SQLITE_API int sqlite3_db_release_memory(sqlite3*); ** an [SQLITE_NOMEM] error. In other words, the soft heap limit ** is advisory only. ** -** ^The return value from sqlite3_soft_heap_limit64() is the size of -** the soft heap limit prior to the call, or negative in the case of an -** error. ^If the argument N is negative -** then no change is made to the soft heap limit. Hence, the current -** size of the soft heap limit can be determined by invoking -** sqlite3_soft_heap_limit64() with a negative argument. -** -** ^If the argument N is zero then the soft heap limit is disabled. +** ^The sqlite3_hard_heap_limit64(N) interface sets a hard upper bound of +** N bytes on the amount of memory that will be allocated. ^The +** sqlite3_hard_heap_limit64(N) interface is similar to +** sqlite3_soft_heap_limit64(N) except that memory allocations will fail +** when the hard heap limit is reached. ** -** ^(The soft heap limit is not enforced in the current implementation +** ^The return value from both sqlite3_soft_heap_limit64() and +** sqlite3_hard_heap_limit64() is the size of +** the heap limit prior to the call, or negative in the case of an +** error. ^If the argument N is negative +** then no change is made to the heap limit. Hence, the current +** size of heap limits can be determined by invoking +** sqlite3_soft_heap_limit64(-1) or sqlite3_hard_heap_limit(-1). +** +** ^Setting the heap limits to zero disables the heap limiter mechanism. +** +** ^The soft heap limit may not be greater than the hard heap limit. +** ^If the hard heap limit is enabled and if sqlite3_soft_heap_limit(N) +** is invoked with a value of N that is greater than the hard heap limit, +** the the soft heap limit is set to the value of the hard heap limit. +** ^The soft heap limit is automatically enabled whenever the hard heap +** limit is enabled. ^When sqlite3_hard_heap_limit64(N) is invoked and +** the soft heap limit is outside the range of 1..N, then the soft heap +** limit is set to N. ^Invoking sqlite3_soft_heap_limit64(0) when the +** hard heap limit is enabled makes the soft heap limit equal to the +** hard heap limit. +** +** The memory allocation limits can also be adjusted using +** [PRAGMA soft_heap_limit] and [PRAGMA hard_heap_limit]. +** +** ^(The heap limits are not enforced in the current implementation ** if one or more of following conditions are true: ** ** )^ ** -** Beginning with SQLite [version 3.7.3] ([dateof:3.7.3]), -** the soft heap limit is enforced -** regardless of whether or not the [SQLITE_ENABLE_MEMORY_MANAGEMENT] -** compile-time option is invoked. With [SQLITE_ENABLE_MEMORY_MANAGEMENT], -** the soft heap limit is enforced on every memory allocation. Without -** [SQLITE_ENABLE_MEMORY_MANAGEMENT], the soft heap limit is only enforced -** when memory is allocated by the page cache. Testing suggests that because -** the page cache is the predominate memory user in SQLite, most -** applications will achieve adequate soft heap limit enforcement without -** the use of [SQLITE_ENABLE_MEMORY_MANAGEMENT]. -** -** The circumstances under which SQLite will enforce the soft heap limit may +** The circumstances under which SQLite will enforce the heap limits may ** changes in future releases of SQLite. */ SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N); +SQLITE_API sqlite3_int64 sqlite3_hard_heap_limit64(sqlite3_int64 N); /* ** CAPI3REF: Deprecated Soft Heap Limit Interface @@ -7041,7 +7423,7 @@ SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); ** interface returns SQLITE_OK and fills in the non-NULL pointers in ** the final five arguments with appropriate values if the specified ** column exists. ^The sqlite3_table_column_metadata() interface returns -** SQLITE_ERROR and if the specified column does not exist. +** SQLITE_ERROR if the specified column does not exist. ** ^If the column-name parameter to sqlite3_table_column_metadata() is a ** NULL pointer, then this routine simply checks for the existence of the ** table and returns SQLITE_OK if the table exists and SQLITE_ERROR if it @@ -7183,7 +7565,7 @@ SQLITE_API int sqlite3_load_extension( ** to enable or disable only the C-API.)^ ** ** Security warning: It is recommended that extension loading -** be disabled using the [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method +** be enabled using the [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method ** rather than this interface, so the [load_extension()] SQL function ** remains disabled. This will prevent SQL injections from giving attackers ** access to extension loading capabilities. @@ -7270,7 +7652,7 @@ typedef struct sqlite3_module sqlite3_module; ** KEYWORDS: sqlite3_module {virtual table module} ** ** This structure, sometimes called a "virtual table module", -** defines the implementation of a [virtual tables]. +** defines the implementation of a [virtual table]. ** This structure consists mostly of methods for the module. ** ** ^A virtual table module is created by filling in a persistent @@ -7314,6 +7696,9 @@ struct sqlite3_module { int (*xSavepoint)(sqlite3_vtab *pVTab, int); int (*xRelease)(sqlite3_vtab *pVTab, int); int (*xRollbackTo)(sqlite3_vtab *pVTab, int); + /* The methods above are in versions 1 and 2 of the sqlite_module object. + ** Those below are for version 3 and greater. */ + int (*xShadowName)(const char*); }; /* @@ -7364,7 +7749,13 @@ struct sqlite3_module { ** the right-hand side of the corresponding aConstraint[] is evaluated ** and becomes the argvIndex-th entry in argv. ^(If aConstraintUsage[].omit ** is true, then the constraint is assumed to be fully handled by the -** virtual table and is not checked again by SQLite.)^ +** virtual table and might not be checked again by the byte code.)^ ^(The +** aConstraintUsage[].omit flag is an optimization hint. When the omit flag +** is left in its default setting of false, the constraint will always be +** checked separately in byte code. If the omit flag is change to true, then +** the constraint may or may not be checked in byte code. In other words, +** when the omit flag is true there is no guarantee that the constraint will +** not be checked again using byte code.)^ ** ** ^The idxNum and idxPtr values are recorded and passed into the ** [xFilter] method. @@ -7404,7 +7795,7 @@ struct sqlite3_module { ** If a virtual table extension is ** used with an SQLite version earlier than 3.8.2, the results of attempting ** to read or write the estimatedRows field are undefined (but are likely -** to included crashing the application). The estimatedRows field should +** to include crashing the application). The estimatedRows field should ** therefore only be used if [sqlite3_libversion_number()] returns a ** value greater than or equal to 3008002. Similarly, the idxFlags field ** was added for [version 3.9.0] ([dateof:3.9.0]). @@ -7456,7 +7847,7 @@ struct sqlite3_index_info { /* ** CAPI3REF: Virtual Table Constraint Operator Codes ** -** These macros defined the allowed values for the +** 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 ** a query that uses a [virtual table]. @@ -7502,6 +7893,12 @@ struct sqlite3_index_info { ** ^The sqlite3_create_module() ** interface is equivalent to sqlite3_create_module_v2() with a NULL ** 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 +** same name are dropped. +** +** See also: [sqlite3_drop_modules()] */ SQLITE_API int sqlite3_create_module( sqlite3 *db, /* SQLite connection to register module with */ @@ -7517,6 +7914,23 @@ SQLITE_API int sqlite3_create_module_v2( void(*xDestroy)(void*) /* Module destructor function */ ); +/* +** CAPI3REF: Remove Unnecessary Virtual Table Implementations +** METHOD: sqlite3 +** +** ^The sqlite3_drop_modules(D,L) interface removes all virtual +** table modules from database connection D except those named on list L. +** The L parameter must be either NULL or a pointer to an array of pointers +** to strings where the array is terminated by a single NULL pointer. +** ^If the L parameter is NULL, then all virtual table modules are removed. +** +** See also: [sqlite3_create_module()] +*/ +SQLITE_API int sqlite3_drop_modules( + sqlite3 *db, /* Remove modules from this connection */ + const char **azKeep /* Except, do not remove the ones named here */ +); + /* ** CAPI3REF: Virtual Table Instance Object ** KEYWORDS: sqlite3_vtab @@ -8043,7 +8457,7 @@ SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); ** The only difference is that the public sqlite3_XXX functions enumerated ** above silently ignore any invocations that pass a NULL pointer instead ** of a valid mutex handle. The implementations of the methods defined -** by this structure are not required to handle this case, the results +** by this structure are not required to handle this case. The results ** of passing a NULL pointer instead of a valid mutex handle are undefined ** (i.e. it is acceptable to provide an implementation that segfaults if ** it is passed a NULL pointer). @@ -8225,7 +8639,7 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_FIRST 5 #define SQLITE_TESTCTRL_PRNG_SAVE 5 #define SQLITE_TESTCTRL_PRNG_RESTORE 6 -#define SQLITE_TESTCTRL_PRNG_RESET 7 +#define SQLITE_TESTCTRL_PRNG_RESET 7 /* NOT USED */ #define SQLITE_TESTCTRL_BITVEC_TEST 8 #define SQLITE_TESTCTRL_FAULT_INSTALL 9 #define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 @@ -8236,6 +8650,7 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_OPTIMIZATIONS 15 #define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */ #define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */ +#define SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 17 #define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 #define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */ #define SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD 19 @@ -8246,7 +8661,10 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_SORTER_MMAP 24 #define SQLITE_TESTCTRL_IMPOSTER 25 #define SQLITE_TESTCTRL_PARSER_COVERAGE 26 -#define SQLITE_TESTCTRL_LAST 26 /* Largest TESTCTRL */ +#define SQLITE_TESTCTRL_RESULT_INTREAL 27 +#define SQLITE_TESTCTRL_PRNG_SEED 28 +#define SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS 29 +#define SQLITE_TESTCTRL_LAST 29 /* Largest TESTCTRL */ /* ** CAPI3REF: SQL Keyword Checking @@ -8512,7 +8930,7 @@ SQLITE_API int sqlite3_status64( ** ** [[SQLITE_STATUS_PAGECACHE_SIZE]] ^(
    SQLITE_STATUS_PAGECACHE_SIZE
    **
    This parameter records the largest memory allocation request -** handed to [pagecache memory allocator]. Only the value returned in the +** handed to the [pagecache memory allocator]. Only the value returned in the ** *pHighwater parameter to [sqlite3_status()] is of interest. ** The value written into the *pCurrent parameter is undefined.
    )^ ** @@ -8588,7 +9006,7 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** checked out.)^ ** ** [[SQLITE_DBSTATUS_LOOKASIDE_HIT]] ^(
    SQLITE_DBSTATUS_LOOKASIDE_HIT
    -**
    This parameter returns the number malloc attempts that were +**
    This parameter returns the number of malloc attempts that were ** satisfied using lookaside memory. Only the high-water value is meaningful; ** the current value is always zero.)^ ** @@ -8670,7 +9088,7 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** cache overflowing. Transactions are more efficient if they are written ** to disk all at once. When pages spill mid-transaction, that introduces ** additional overhead. This parameter can be used help identify -** inefficiencies that can be resolve by increasing the cache size. +** inefficiencies that can be resolved by increasing the cache size. **
    ** ** [[SQLITE_DBSTATUS_DEFERRED_FKS]] ^(
    SQLITE_DBSTATUS_DEFERRED_FKS
    @@ -8759,7 +9177,7 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); ** ** [[SQLITE_STMTSTATUS_REPREPARE]]
    SQLITE_STMTSTATUS_REPREPARE
    **
    ^This is the number of times that the prepare statement has been -** automatically regenerated due to schema changes or change to +** automatically regenerated due to schema changes or changes to ** [bound parameters] that might affect the query plan. ** ** [[SQLITE_STMTSTATUS_RUN]]
    SQLITE_STMTSTATUS_RUN
    @@ -8930,7 +9348,7 @@ struct sqlite3_pcache_page { ** ** ^(SQLite will normally invoke xFetch() with a createFlag of 0 or 1. SQLite ** will only use a createFlag of 2 after a prior call with a createFlag of 1 -** failed.)^ In between the to xFetch() calls, SQLite may +** failed.)^ In between the xFetch() calls, SQLite may ** attempt to unpin one or more cache pages by spilling the content of ** pinned pages to disk and synching the operating system disk cache. ** @@ -9248,7 +9666,7 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** the first argument to register for a callback that will be invoked ** when the blocking connections current transaction is concluded. ^The ** callback is invoked from within the [sqlite3_step] or [sqlite3_close] -** call that concludes the blocking connections transaction. +** call that concludes the blocking connection's transaction. ** ** ^(If sqlite3_unlock_notify() is called in a multi-threaded application, ** there is a chance that the blocking connection will have already @@ -9286,7 +9704,7 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** an unlock-notify callback is a pointer to an array of void* pointers, ** and the second is the number of entries in the array. ** -** When a blocking connections transaction is concluded, there may be +** When a blocking connection's transaction is concluded, there may be ** more than one blocked connection that has registered for an unlock-notify ** callback. ^If two or more such blocked connections have specified the ** same callback function, then instead of invoking the callback function @@ -9634,21 +10052,28 @@ SQLITE_API int sqlite3_wal_checkpoint_v2( ** If this interface is invoked outside the context of an xConnect or ** xCreate virtual table method then the behavior is undefined. ** -** At present, there is only one option that may be configured using -** this function. (See [SQLITE_VTAB_CONSTRAINT_SUPPORT].) Further options -** may be added in the future. +** In the call sqlite3_vtab_config(D,C,...) the D parameter is the +** [database connection] in which the virtual table is being created and +** which is passed in as the first argument to the [xConnect] or [xCreate] +** method that is invoking sqlite3_vtab_config(). The C parameter is one +** of the [virtual table configuration options]. The presence and meaning +** of parameters after C depend on which [virtual table configuration option] +** is used. */ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); /* ** CAPI3REF: Virtual Table Configuration Options +** KEYWORDS: {virtual table configuration options} +** KEYWORDS: {virtual table configuration option} ** ** These macros define the various options to the ** [sqlite3_vtab_config()] interface that [virtual table] implementations ** can use to customize and optimize their behavior. ** **
    -**
    SQLITE_VTAB_CONSTRAINT_SUPPORT +** [[SQLITE_VTAB_CONSTRAINT_SUPPORT]] +**
    SQLITE_VTAB_CONSTRAINT_SUPPORT
    **
    Calls of the form ** [sqlite3_vtab_config](db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X) are supported, ** where X is an integer. If X is zero, then the [virtual table] whose @@ -9677,9 +10102,31 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); ** return SQLITE_OK. Or, if this is not possible, it may return ** SQLITE_CONSTRAINT, in which case SQLite falls back to OR ABORT ** constraint handling. +**
    +** +** [[SQLITE_VTAB_DIRECTONLY]]
    SQLITE_VTAB_DIRECTONLY
    +**
    Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_DIRECTONLY) from within the +** the [xConnect] or [xCreate] methods of a [virtual table] implmentation +** prohibits that virtual table from being used from within triggers and +** views. +**
    +** +** [[SQLITE_VTAB_INNOCUOUS]]
    SQLITE_VTAB_INNOCUOUS
    +**
    Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_INNOCUOUS) from within the +** the [xConnect] or [xCreate] methods of a [virtual table] implmentation +** identify that virtual table as being safe to use from within triggers +** and views. Conceptually, the SQLITE_VTAB_INNOCUOUS tag means that the +** virtual table can do no serious harm even if it is controlled by a +** malicious hacker. Developers should avoid setting the SQLITE_VTAB_INNOCUOUS +** flag unless absolutely necessary. +**
    **
    */ #define SQLITE_VTAB_CONSTRAINT_SUPPORT 1 +#define SQLITE_VTAB_INNOCUOUS 2 +#define SQLITE_VTAB_DIRECTONLY 3 /* ** CAPI3REF: Determine The Virtual Table Conflict Policy @@ -9759,15 +10206,15 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_ ** **
    ** [[SQLITE_SCANSTAT_NLOOP]]
    SQLITE_SCANSTAT_NLOOP
    -**
    ^The [sqlite3_int64] variable pointed to by the T parameter will be +**
    ^The [sqlite3_int64] variable pointed to by the V parameter will be ** set to the total number of times that the X-th loop has run.
    ** ** [[SQLITE_SCANSTAT_NVISIT]]
    SQLITE_SCANSTAT_NVISIT
    -**
    ^The [sqlite3_int64] variable pointed to by the T parameter will be set +**
    ^The [sqlite3_int64] variable pointed to by the V parameter will be set ** to the total number of rows examined by all iterations of the X-th loop.
    ** ** [[SQLITE_SCANSTAT_EST]]
    SQLITE_SCANSTAT_EST
    -**
    ^The "double" variable pointed to by the T parameter will be set to the +**
    ^The "double" variable pointed to by the V parameter will be set to the ** query planner's estimate for the average number of rows output from each ** iteration of the X-th loop. If the query planner's estimates was accurate, ** then this value will approximate the quotient NVISIT/NLOOP and the @@ -9775,17 +10222,17 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_ ** be the NLOOP value for the current loop. ** ** [[SQLITE_SCANSTAT_NAME]]
    SQLITE_SCANSTAT_NAME
    -**
    ^The "const char *" variable pointed to by the T parameter will be set +**
    ^The "const char *" variable pointed to by the V parameter will be set ** to a zero-terminated UTF-8 string containing the name of the index or table ** used for the X-th loop. ** ** [[SQLITE_SCANSTAT_EXPLAIN]]
    SQLITE_SCANSTAT_EXPLAIN
    -**
    ^The "const char *" variable pointed to by the T parameter will be set +**
    ^The "const char *" variable pointed to by the V parameter will be set ** to a zero-terminated UTF-8 string containing the [EXPLAIN QUERY PLAN] ** description for the X-th loop. ** ** [[SQLITE_SCANSTAT_SELECTID]]
    SQLITE_SCANSTAT_SELECT
    -**
    ^The "int" variable pointed to by the T parameter will be set to the +**
    ^The "int" variable pointed to by the V parameter will be set to the ** "select-id" for the X-th loop. The select-id identifies which query or ** subquery the loop is part of. The main query has a select-id of zero. ** The select-id is the same value as is output in the first column @@ -10417,7 +10864,7 @@ struct sqlite3_rtree_query_info { sqlite3_int64 iRowid; /* Rowid for current entry */ sqlite3_rtree_dbl rParentScore; /* Score of parent node */ int eParentWithin; /* Visibility of parent node */ - int eWithin; /* OUT: Visiblity */ + int eWithin; /* OUT: Visibility */ sqlite3_rtree_dbl rScore; /* OUT: Write the score here */ /* The following fields are only available in 3.8.11 and later */ sqlite3_value **apSqlParam; /* Original SQL values of parameters */ @@ -10640,7 +11087,7 @@ SQLITE_API int sqlite3session_attach( ** The second argument (xFilter) is the "filter callback". For changes to rows ** in tables that are not attached to the Session object, the filter is called ** to determine whether changes to the table's rows should be tracked or not. -** If xFilter returns 0, changes is not tracked. Note that once a table is +** If xFilter returns 0, changes are not tracked. Note that once a table is ** attached, xFilter will not be called again. */ SQLITE_API void sqlite3session_table_filter( @@ -10814,7 +11261,7 @@ SQLITE_API int sqlite3session_changeset( ** It an error if database zFrom does not exist or does not contain the ** required compatible table. ** -** If the operation successful, SQLITE_OK is returned. Otherwise, an SQLite +** If the operation is successful, SQLITE_OK is returned. Otherwise, an SQLite ** error code. In this case, if argument pzErrMsg is not NULL, *pzErrMsg ** may be set to point to a buffer containing an English language error ** message. It is the responsibility of the caller to free this buffer using @@ -10913,19 +11360,45 @@ SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession); ** consecutively. There is no chance that the iterator will visit a change ** the applies to table X, then one for table Y, and then later on visit ** another change for table X. +** +** The behavior of sqlite3changeset_start_v2() and its streaming equivalent +** may be modified by passing a combination of +** [SQLITE_CHANGESETSTART_INVERT | supported flags] as the 4th parameter. +** +** Note that the sqlite3changeset_start_v2() API is still experimental +** and therefore subject to change. */ SQLITE_API int sqlite3changeset_start( sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ int nChangeset, /* Size of changeset blob in bytes */ void *pChangeset /* Pointer to blob containing changeset */ ); +SQLITE_API int sqlite3changeset_start_v2( + sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ + int nChangeset, /* Size of changeset blob in bytes */ + void *pChangeset, /* Pointer to blob containing changeset */ + int flags /* SESSION_CHANGESETSTART_* flags */ +); + +/* +** CAPI3REF: Flags for sqlite3changeset_start_v2 +** +** The following flags may passed via the 4th parameter to +** [sqlite3changeset_start_v2] and [sqlite3changeset_start_v2_strm]: +** +**
    SQLITE_CHANGESETAPPLY_INVERT
    +** Invert the changeset while iterating through it. This is equivalent to +** inverting a changeset using sqlite3changeset_invert() before applying it. +** It is an error to specify this flag with a patchset. +*/ +#define SQLITE_CHANGESETSTART_INVERT 0x0002 /* ** CAPI3REF: Advance A Changeset Iterator ** METHOD: sqlite3_changeset_iter ** -** This function may only be used with iterators created by function +** This function may only be used with iterators created by the function ** [sqlite3changeset_start()]. If it is called on an iterator passed to ** a conflict-handler callback by [sqlite3changeset_apply()], SQLITE_MISUSE ** is returned and the call has no effect. @@ -10962,7 +11435,7 @@ SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter); ** sqlite3changeset_next() is called on the iterator or until the ** conflict-handler function returns. If pnCol is not NULL, then *pnCol is ** set to the number of columns in the table affected by the change. If -** pbIncorrect is not NULL, then *pbIndirect is set to true (1) if the change +** pbIndirect is not NULL, then *pbIndirect is set to true (1) if the change ** is an indirect change, or false (0) otherwise. See the documentation for ** [sqlite3session_indirect()] for a description of direct and indirect ** changes. Finally, if pOp is not NULL, then *pOp is set to one of @@ -11341,8 +11814,8 @@ SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); ** case, this function fails with SQLITE_SCHEMA. If the input changeset ** appears to be corrupt and the corruption is detected, SQLITE_CORRUPT is ** returned. Or, if an out-of-memory condition occurs during processing, this -** function returns SQLITE_NOMEM. In all cases, if an error occurs the -** final contents of the changegroup is undefined. +** function returns SQLITE_NOMEM. In all cases, if an error occurs the state +** of the final contents of the changegroup is undefined. ** ** If no error occurs, SQLITE_OK is returned. */ @@ -11517,7 +11990,7 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); ** ** It is safe to execute SQL statements, including those that write to the ** table that the callback related to, from within the xConflict callback. -** This can be used to further customize the applications conflict +** This can be used to further customize the application's conflict ** resolution strategy. ** ** All changes made by these functions are enclosed in a savepoint transaction. @@ -11573,7 +12046,7 @@ SQLITE_API int sqlite3changeset_apply_v2( ), void *pCtx, /* First argument passed to xConflict */ void **ppRebase, int *pnRebase, /* OUT: Rebase data */ - int flags /* Combination of SESSION_APPLY_* flags */ + int flags /* SESSION_CHANGESETAPPLY_* flags */ ); /* @@ -11591,8 +12064,14 @@ SQLITE_API int sqlite3changeset_apply_v2( ** causes the sessions module to omit this savepoint. In this case, if the ** caller has an open transaction or savepoint when apply_v2() is called, ** it may revert the partially applied changeset by rolling it back. +** +**
    SQLITE_CHANGESETAPPLY_INVERT
    +** Invert the changeset before applying it. This is equivalent to inverting +** a changeset using sqlite3changeset_invert() before applying it. It is +** an error to specify this flag with a patchset. */ #define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001 +#define SQLITE_CHANGESETAPPLY_INVERT 0x0002 /* ** CAPI3REF: Constants Passed To The Conflict Handler @@ -11821,9 +12300,9 @@ SQLITE_API int sqlite3rebaser_configure( ** ** Argument pIn must point to a buffer containing a changeset nIn bytes ** in size. This function allocates and populates a buffer with a copy -** of the changeset rebased rebased according to the configuration of the +** of the changeset rebased according to the configuration of the ** rebaser object passed as the first argument. If successful, (*ppOut) -** is set to point to the new buffer containing the rebased changset and +** is set to point to the new buffer containing the rebased changeset and ** (*pnOut) to its size in bytes and SQLITE_OK returned. It is the ** responsibility of the caller to eventually free the new buffer using ** sqlite3_free(). Otherwise, if an error occurs, (*ppOut) and (*pnOut) @@ -11986,6 +12465,12 @@ SQLITE_API int sqlite3changeset_start_strm( int (*xInput)(void *pIn, void *pData, int *pnData), void *pIn ); +SQLITE_API int sqlite3changeset_start_v2_strm( + sqlite3_changeset_iter **pp, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int flags +); SQLITE_API int sqlite3session_changeset_strm( sqlite3_session *pSession, int (*xOutput)(void *pOut, const void *pData, int nData), @@ -12012,6 +12497,45 @@ SQLITE_API int sqlite3rebaser_rebase_strm( void *pOut ); +/* +** CAPI3REF: Configure global parameters +** +** The sqlite3session_config() interface is used to make global configuration +** changes to the sessions module in order to tune it to the specific needs +** of the application. +** +** The sqlite3session_config() interface is not threadsafe. If it is invoked +** while any other thread is inside any other sessions method then the +** results are undefined. Furthermore, if it is invoked after any sessions +** related objects have been created, the results are also undefined. +** +** The first argument to the sqlite3session_config() function must be one +** of the SQLITE_SESSION_CONFIG_XXX constants defined below. The +** interpretation of the (void*) value passed as the second parameter and +** the effect of calling this function depends on the value of the first +** parameter. +** +**
    +**
    SQLITE_SESSION_CONFIG_STRMSIZE
    +** By default, the sessions module streaming interfaces attempt to input +** and output data in approximately 1 KiB chunks. This operand may be used +** to set and query the value of this configuration setting. The pointer +** passed as the second argument must point to a value of type (int). +** If this value is greater than 0, it is used as the new streaming data +** chunk size for both input and output. Before returning, the (int) value +** pointed to by pArg is set to the final value of the streaming interface +** chunk size. +**
    +** +** This function returns SQLITE_OK if successful, or an SQLite error code +** otherwise. +*/ +SQLITE_API int sqlite3session_config(int op, void *pArg); + +/* +** CAPI3REF: Values for sqlite3session_config(). +*/ +#define SQLITE_SESSION_CONFIG_STRMSIZE 1 /* ** Make sure we can call this stuff from C++. @@ -12145,12 +12669,8 @@ struct Fts5PhraseIter { ** ** Usually, output parameter *piPhrase is set to the phrase number, *piCol ** to the column in which it occurs and *piOff the token offset of the -** first token of the phrase. The exception is if the table was created -** with the offsets=0 option specified. In this case *piOff is always -** set to -1. -** -** Returns SQLITE_OK if successful, or an error code (i.e. SQLITE_NOMEM) -** if an error occurs. +** first token of the phrase. Returns SQLITE_OK if successful, or an error +** code (i.e. SQLITE_NOMEM) if an error occurs. ** ** This API can be quite slow if used with an FTS5 table created with the ** "detail=none" or "detail=column" option. @@ -12188,10 +12708,10 @@ struct Fts5PhraseIter { ** ** xSetAuxdata(pFts5, pAux, xDelete) ** -** Save the pointer passed as the second argument as the extension functions +** Save the pointer passed as the second argument as the extension function's ** "auxiliary data". The pointer may then be retrieved by the current or any ** future invocation of the same fts5 extension function made as part of -** of the same MATCH query using the xGetAuxdata() API. +** the same MATCH query using the xGetAuxdata() API. ** ** Each extension function is allocated a single auxiliary data slot for ** each FTS query (MATCH expression). If the extension function is invoked @@ -12206,7 +12726,7 @@ struct Fts5PhraseIter { ** The xDelete callback, if one is specified, is also invoked on the ** auxiliary data pointer after the FTS5 query has finished. ** -** If an error (e.g. an OOM condition) occurs within this function, an +** If an error (e.g. an OOM condition) occurs within this function, ** the auxiliary data is set to NULL and an error code returned. If the ** xDelete parameter was not NULL, it is invoked on the auxiliary data ** pointer before returning. @@ -12430,8 +12950,8 @@ struct Fts5ExtensionApi { ** ** There are several ways to approach this in FTS5: ** -**
    1. By mapping all synonyms to a single token. In this case, the -** In the above example, this means that the tokenizer returns the +**
      1. By mapping all synonyms to a single token. In this case, using +** the above example, this means that the tokenizer returns the ** same token for inputs "first" and "1st". Say that token is in ** fact "first", so that when the user inserts the document "I won ** 1st place" entries are added to the index for tokens "i", "won", @@ -12439,11 +12959,11 @@ struct Fts5ExtensionApi { ** the tokenizer substitutes "first" for "1st" and the query works ** as expected. ** -**
      2. By adding multiple synonyms for a single term to the FTS index. -** In this case, when tokenizing query text, the tokenizer may -** provide multiple synonyms for a single term within the document. -** FTS5 then queries the index for each synonym individually. For -** example, faced with the query: +**
      3. By querying the index for all synonyms of each query term +** separately. In this case, when tokenizing query text, the +** tokenizer may provide multiple synonyms for a single term +** within the document. FTS5 then queries the index for each +** synonym individually. For example, faced with the query: ** ** ** ... MATCH 'first place' @@ -12467,7 +12987,7 @@ struct Fts5ExtensionApi { ** "place". ** ** This way, even if the tokenizer does not provide synonyms -** when tokenizing query text (it should not - to do would be +** when tokenizing query text (it should not - to do so would be ** inefficient), it doesn't matter if the user queries for ** 'first + place' or '1st + place', as there are entries in the ** FTS index corresponding to both forms of the first token. @@ -12869,15 +13389,15 @@ struct fts5_api { ** So we have to define the macros in different ways depending on the ** compiler. */ -#if defined(__PTRDIFF_TYPE__) /* This case should work for GCC */ +#if defined(HAVE_STDINT_H) /* Use this case if we have ANSI headers */ +# define SQLITE_INT_TO_PTR(X) ((void*)(intptr_t)(X)) +# define SQLITE_PTR_TO_INT(X) ((int)(intptr_t)(X)) +#elif defined(__PTRDIFF_TYPE__) /* This case should work for GCC */ # define SQLITE_INT_TO_PTR(X) ((void*)(__PTRDIFF_TYPE__)(X)) # define SQLITE_PTR_TO_INT(X) ((int)(__PTRDIFF_TYPE__)(X)) #elif !defined(__GNUC__) /* Works for compilers other than LLVM */ # define SQLITE_INT_TO_PTR(X) ((void*)&((char*)0)[X]) # define SQLITE_PTR_TO_INT(X) ((int)(((char*)X)-(char*)0)) -#elif defined(HAVE_STDINT_H) /* Use this case if we have ANSI headers */ -# define SQLITE_INT_TO_PTR(X) ((void*)(intptr_t)(X)) -# define SQLITE_PTR_TO_INT(X) ((int)(intptr_t)(X)) #else /* Generates a warning - but it always works */ # define SQLITE_INT_TO_PTR(X) ((void*)(X)) # define SQLITE_PTR_TO_INT(X) ((int)(X)) @@ -13103,6 +13623,26 @@ SQLITE_PRIVATE void sqlite3Coverage(int); # define NEVER(X) (X) #endif +/* +** The harmless(X) macro indicates that expression X is usually false +** but can be true without causing any problems, but we don't know of +** any way to cause X to be true. +** +** In debugging and testing builds, this macro will abort if X is ever +** true. In this way, developers are alerted to a possible test case +** that causes X to be true. If a harmless macro ever fails, that is +** an opportunity to change the macro into a testcase() and add a new +** test case to the test suite. +** +** For normal production builds, harmless(X) is a no-op, since it does +** not matter whether expression X is true or false. +*/ +#ifdef SQLITE_DEBUG +# define harmless(X) assert(!(X)); +#else +# define harmless(X) +#endif + /* ** Some conditionals are optimizations only. In other words, if the ** conditionals are replaced with a constant 1 (true) or 0 (false) then @@ -13232,7 +13772,7 @@ struct Hash { unsigned int count; /* Number of entries in this table */ HashElem *first; /* The first element of the array */ struct _ht { /* the hash table */ - int count; /* Number of entries with this hash */ + unsigned int count; /* Number of entries with this hash */ HashElem *chain; /* Pointer to first entry with this hash */ } *ht; }; @@ -13367,105 +13907,105 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); #define TK_VIEW 79 #define TK_VIRTUAL 80 #define TK_WITH 81 -#define TK_CURRENT 82 -#define TK_FOLLOWING 83 -#define TK_PARTITION 84 -#define TK_PRECEDING 85 -#define TK_RANGE 86 -#define TK_UNBOUNDED 87 -#define TK_REINDEX 88 -#define TK_RENAME 89 -#define TK_CTIME_KW 90 -#define TK_ANY 91 -#define TK_BITAND 92 -#define TK_BITOR 93 -#define TK_LSHIFT 94 -#define TK_RSHIFT 95 -#define TK_PLUS 96 -#define TK_MINUS 97 -#define TK_STAR 98 -#define TK_SLASH 99 -#define TK_REM 100 -#define TK_CONCAT 101 -#define TK_COLLATE 102 -#define TK_BITNOT 103 -#define TK_ON 104 -#define TK_INDEXED 105 -#define TK_STRING 106 -#define TK_JOIN_KW 107 -#define TK_CONSTRAINT 108 -#define TK_DEFAULT 109 -#define TK_NULL 110 -#define TK_PRIMARY 111 -#define TK_UNIQUE 112 -#define TK_CHECK 113 -#define TK_REFERENCES 114 -#define TK_AUTOINCR 115 -#define TK_INSERT 116 -#define TK_DELETE 117 -#define TK_UPDATE 118 -#define TK_SET 119 -#define TK_DEFERRABLE 120 -#define TK_FOREIGN 121 -#define TK_DROP 122 -#define TK_UNION 123 -#define TK_ALL 124 -#define TK_EXCEPT 125 -#define TK_INTERSECT 126 -#define TK_SELECT 127 -#define TK_VALUES 128 -#define TK_DISTINCT 129 -#define TK_DOT 130 -#define TK_FROM 131 -#define TK_JOIN 132 -#define TK_USING 133 -#define TK_ORDER 134 -#define TK_GROUP 135 -#define TK_HAVING 136 -#define TK_LIMIT 137 -#define TK_WHERE 138 -#define TK_INTO 139 -#define TK_NOTHING 140 -#define TK_FLOAT 141 -#define TK_BLOB 142 -#define TK_INTEGER 143 -#define TK_VARIABLE 144 -#define TK_CASE 145 -#define TK_WHEN 146 -#define TK_THEN 147 -#define TK_ELSE 148 -#define TK_INDEX 149 -#define TK_ALTER 150 -#define TK_ADD 151 -#define TK_WINDOW 152 -#define TK_OVER 153 -#define TK_FILTER 154 -#define TK_TRUEFALSE 155 -#define TK_ISNOT 156 -#define TK_FUNCTION 157 -#define TK_COLUMN 158 -#define TK_AGG_FUNCTION 159 -#define TK_AGG_COLUMN 160 -#define TK_UMINUS 161 -#define TK_UPLUS 162 -#define TK_TRUTH 163 -#define TK_REGISTER 164 -#define TK_VECTOR 165 -#define TK_SELECT_COLUMN 166 -#define TK_IF_NULL_ROW 167 -#define TK_ASTERISK 168 -#define TK_SPAN 169 -#define TK_END_OF_FILE 170 -#define TK_UNCLOSED_STRING 171 -#define TK_SPACE 172 -#define TK_ILLEGAL 173 - -/* The token codes above must all fit in 8 bits */ -#define TKFLG_MASK 0xff - -/* Flags that can be added to a token code when it is not -** being stored in a u8: */ -#define TKFLG_DONTFOLD 0x100 /* Omit constant folding optimizations */ +#define TK_NULLS 82 +#define TK_FIRST 83 +#define TK_LAST 84 +#define TK_CURRENT 85 +#define TK_FOLLOWING 86 +#define TK_PARTITION 87 +#define TK_PRECEDING 88 +#define TK_RANGE 89 +#define TK_UNBOUNDED 90 +#define TK_EXCLUDE 91 +#define TK_GROUPS 92 +#define TK_OTHERS 93 +#define TK_TIES 94 +#define TK_GENERATED 95 +#define TK_ALWAYS 96 +#define TK_REINDEX 97 +#define TK_RENAME 98 +#define TK_CTIME_KW 99 +#define TK_ANY 100 +#define TK_BITAND 101 +#define TK_BITOR 102 +#define TK_LSHIFT 103 +#define TK_RSHIFT 104 +#define TK_PLUS 105 +#define TK_MINUS 106 +#define TK_STAR 107 +#define TK_SLASH 108 +#define TK_REM 109 +#define TK_CONCAT 110 +#define TK_COLLATE 111 +#define TK_BITNOT 112 +#define TK_ON 113 +#define TK_INDEXED 114 +#define TK_STRING 115 +#define TK_JOIN_KW 116 +#define TK_CONSTRAINT 117 +#define TK_DEFAULT 118 +#define TK_NULL 119 +#define TK_PRIMARY 120 +#define TK_UNIQUE 121 +#define TK_CHECK 122 +#define TK_REFERENCES 123 +#define TK_AUTOINCR 124 +#define TK_INSERT 125 +#define TK_DELETE 126 +#define TK_UPDATE 127 +#define TK_SET 128 +#define TK_DEFERRABLE 129 +#define TK_FOREIGN 130 +#define TK_DROP 131 +#define TK_UNION 132 +#define TK_ALL 133 +#define TK_EXCEPT 134 +#define TK_INTERSECT 135 +#define TK_SELECT 136 +#define TK_VALUES 137 +#define TK_DISTINCT 138 +#define TK_DOT 139 +#define TK_FROM 140 +#define TK_JOIN 141 +#define TK_USING 142 +#define TK_ORDER 143 +#define TK_GROUP 144 +#define TK_HAVING 145 +#define TK_LIMIT 146 +#define TK_WHERE 147 +#define TK_INTO 148 +#define TK_NOTHING 149 +#define TK_FLOAT 150 +#define TK_BLOB 151 +#define TK_INTEGER 152 +#define TK_VARIABLE 153 +#define TK_CASE 154 +#define TK_WHEN 155 +#define TK_THEN 156 +#define TK_ELSE 157 +#define TK_INDEX 158 +#define TK_ALTER 159 +#define TK_ADD 160 +#define TK_WINDOW 161 +#define TK_OVER 162 +#define TK_FILTER 163 +#define TK_COLUMN 164 +#define TK_AGG_FUNCTION 165 +#define TK_AGG_COLUMN 166 +#define TK_TRUEFALSE 167 +#define TK_ISNOT 168 +#define TK_FUNCTION 169 +#define TK_UMINUS 170 +#define TK_UPLUS 171 +#define TK_TRUTH 172 +#define TK_REGISTER 173 +#define TK_VECTOR 174 +#define TK_SELECT_COLUMN 175 +#define TK_IF_NULL_ROW 176 +#define TK_ASTERISK 177 +#define TK_SPAN 178 +#define TK_SPACE 179 +#define TK_ILLEGAL 180 /************** End of parse.h ***********************************************/ /************** Continuing where we left off in sqliteInt.h ******************/ @@ -13771,12 +14311,13 @@ typedef INT16_TYPE LogEst; ** at run-time. */ #ifndef SQLITE_BYTEORDER -# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ - defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ - defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ - defined(__arm__) || defined(_M_ARM64) +# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ + defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ + defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ + defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) # define SQLITE_BYTEORDER 1234 -# elif defined(sparc) || defined(__ppc__) +# elif defined(sparc) || defined(__ppc__) || \ + defined(__ARMEB__) || defined(__AARCH64EB__) # define SQLITE_BYTEORDER 4321 # else # define SQLITE_BYTEORDER 0 @@ -13875,20 +14416,6 @@ typedef INT16_TYPE LogEst; # define SQLITE_DEFAULT_MMAP_SIZE SQLITE_MAX_MMAP_SIZE #endif -/* -** Only one of SQLITE_ENABLE_STAT3 or SQLITE_ENABLE_STAT4 can be defined. -** Priority is given to SQLITE_ENABLE_STAT4. If either are defined, also -** define SQLITE_ENABLE_STAT3_OR_STAT4 -*/ -#ifdef SQLITE_ENABLE_STAT4 -# undef SQLITE_ENABLE_STAT3 -# define SQLITE_ENABLE_STAT3_OR_STAT4 1 -#elif SQLITE_ENABLE_STAT3 -# define SQLITE_ENABLE_STAT3_OR_STAT4 1 -#elif SQLITE_ENABLE_STAT3_OR_STAT4 -# undef SQLITE_ENABLE_STAT3_OR_STAT4 -#endif - /* ** SELECTTRACE_ENABLED will be either 1 or 0 depending on whether or not ** the Select query generator tracing logic is turned on. @@ -14076,6 +14603,7 @@ typedef struct With With; ** A bit in a Bitmask */ #define MASKBIT(n) (((Bitmask)1)<<(n)) +#define MASKBIT64(n) (((u64)1)<<(n)) #define MASKBIT32(n) (((unsigned int)1)<<(n)) #define ALLBITS ((Bitmask)-1) @@ -14397,22 +14925,22 @@ struct BtreePayload { SQLITE_PRIVATE int sqlite3BtreeInsert(BtCursor*, const BtreePayload *pPayload, int flags, int seekResult); SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor*, int *pRes); -#ifndef SQLITE_OMIT_WINDOWFUNC -SQLITE_PRIVATE void sqlite3BtreeSkipNext(BtCursor*); -#endif SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor*, int *pRes); SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor*, int flags); SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor*); SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor*, int flags); SQLITE_PRIVATE i64 sqlite3BtreeIntegerKey(BtCursor*); +SQLITE_PRIVATE void sqlite3BtreeCursorPin(BtCursor*); +SQLITE_PRIVATE void sqlite3BtreeCursorUnpin(BtCursor*); #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC SQLITE_PRIVATE i64 sqlite3BtreeOffset(BtCursor*); #endif SQLITE_PRIVATE int sqlite3BtreePayload(BtCursor*, u32 offset, u32 amt, void*); SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor*, u32 *pAmt); SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor*); +SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor*); -SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*); +SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(sqlite3*,Btree*,int*aRoot,int nRoot,int,int*); SQLITE_PRIVATE struct Pager *sqlite3BtreePager(Btree*); SQLITE_PRIVATE i64 sqlite3BtreeRowCountEst(BtCursor*); @@ -14433,7 +14961,7 @@ SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor*); SQLITE_PRIVATE int sqlite3BtreeCursorIsValidNN(BtCursor*); #ifndef SQLITE_OMIT_BTREECOUNT -SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *, i64 *); +SQLITE_PRIVATE int sqlite3BtreeCount(sqlite3*, BtCursor*, i64*); #endif #ifdef SQLITE_TEST @@ -14650,12 +15178,11 @@ typedef struct VdbeOpList VdbeOpList; #endif /* -** The following macro converts a relative address in the p2 field -** of a VdbeOp structure into a negative number so that -** sqlite3VdbeAddOpList() knows that the address is relative. Calling -** the macro again restores the address. +** The following macro converts a label returned by sqlite3VdbeMakeLabel() +** into an index into the Parse.aLabel[] array that contains the resolved +** address of that label. */ -#define ADDR(X) (-1-(X)) +#define ADDR(X) (~(X)) /* ** The makefile scans the vdbe.c source file and creates the "opcodes.h" @@ -14691,30 +15218,30 @@ typedef struct VdbeOpList VdbeOpList; #define OP_SeekLE 23 /* jump, synopsis: key=r[P3@P4] */ #define OP_SeekGE 24 /* jump, synopsis: key=r[P3@P4] */ #define OP_SeekGT 25 /* jump, synopsis: key=r[P3@P4] */ -#define OP_IfNoHope 26 /* jump, synopsis: key=r[P3@P4] */ -#define OP_NoConflict 27 /* jump, synopsis: key=r[P3@P4] */ -#define OP_NotFound 28 /* jump, synopsis: key=r[P3@P4] */ -#define OP_Found 29 /* jump, synopsis: key=r[P3@P4] */ -#define OP_SeekRowid 30 /* jump, synopsis: intkey=r[P3] */ -#define OP_NotExists 31 /* jump, synopsis: intkey=r[P3] */ -#define OP_Last 32 /* jump */ -#define OP_IfSmaller 33 /* jump */ -#define OP_SorterSort 34 /* jump */ -#define OP_Sort 35 /* jump */ -#define OP_Rewind 36 /* jump */ -#define OP_IdxLE 37 /* jump, synopsis: key=r[P3@P4] */ -#define OP_IdxGT 38 /* jump, synopsis: key=r[P3@P4] */ -#define OP_IdxLT 39 /* jump, synopsis: key=r[P3@P4] */ -#define OP_IdxGE 40 /* jump, synopsis: key=r[P3@P4] */ -#define OP_RowSetRead 41 /* jump, synopsis: r[P3]=rowset(P1) */ -#define OP_RowSetTest 42 /* jump, synopsis: if r[P3] in rowset(P1) goto P2 */ +#define OP_IfNotOpen 26 /* jump, synopsis: if( !csr[P1] ) goto P2 */ +#define OP_IfNoHope 27 /* jump, synopsis: key=r[P3@P4] */ +#define OP_NoConflict 28 /* jump, synopsis: key=r[P3@P4] */ +#define OP_NotFound 29 /* jump, synopsis: key=r[P3@P4] */ +#define OP_Found 30 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekRowid 31 /* jump, synopsis: intkey=r[P3] */ +#define OP_NotExists 32 /* jump, synopsis: intkey=r[P3] */ +#define OP_Last 33 /* jump */ +#define OP_IfSmaller 34 /* jump */ +#define OP_SorterSort 35 /* jump */ +#define OP_Sort 36 /* jump */ +#define OP_Rewind 37 /* jump */ +#define OP_IdxLE 38 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IdxGT 39 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IdxLT 40 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IdxGE 41 /* jump, synopsis: key=r[P3@P4] */ +#define OP_RowSetRead 42 /* jump, synopsis: r[P3]=rowset(P1) */ #define OP_Or 43 /* same as TK_OR, synopsis: r[P3]=(r[P1] || r[P2]) */ #define OP_And 44 /* same as TK_AND, synopsis: r[P3]=(r[P1] && r[P2]) */ -#define OP_Program 45 /* jump */ -#define OP_FkIfZero 46 /* jump, synopsis: if fkctr[P1]==0 goto P2 */ -#define OP_IfPos 47 /* jump, synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 */ -#define OP_IfNotZero 48 /* jump, synopsis: if r[P1]!=0 then r[P1]--, goto P2 */ -#define OP_DecrJumpZero 49 /* jump, synopsis: if (--r[P1])==0 goto P2 */ +#define OP_RowSetTest 45 /* jump, synopsis: if r[P3] in rowset(P1) goto P2 */ +#define OP_Program 46 /* jump */ +#define OP_FkIfZero 47 /* jump, synopsis: if fkctr[P1]==0 goto P2 */ +#define OP_IfPos 48 /* jump, synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 */ +#define OP_IfNotZero 49 /* jump, synopsis: if r[P1]!=0 then r[P1]--, goto P2 */ #define OP_IsNull 50 /* jump, same as TK_ISNULL, synopsis: if r[P1]==NULL goto P2 */ #define OP_NotNull 51 /* jump, same as TK_NOTNULL, synopsis: if r[P1]!=NULL goto P2 */ #define OP_Ne 52 /* jump, same as TK_NE, synopsis: IF r[P3]!=r[P1] */ @@ -14724,121 +15251,123 @@ typedef struct VdbeOpList VdbeOpList; #define OP_Lt 56 /* jump, same as TK_LT, synopsis: IF r[P3]=r[P1] */ #define OP_ElseNotEq 58 /* jump, same as TK_ESCAPE */ -#define OP_IncrVacuum 59 /* jump */ -#define OP_VNext 60 /* jump */ -#define OP_Init 61 /* jump, synopsis: Start at P2 */ -#define OP_PureFunc0 62 -#define OP_Function0 63 /* synopsis: r[P3]=func(r[P2@P5]) */ -#define OP_PureFunc 64 -#define OP_Function 65 /* synopsis: r[P3]=func(r[P2@P5]) */ -#define OP_Return 66 -#define OP_EndCoroutine 67 -#define OP_HaltIfNull 68 /* synopsis: if r[P3]=null halt */ -#define OP_Halt 69 -#define OP_Integer 70 /* synopsis: r[P2]=P1 */ -#define OP_Int64 71 /* synopsis: r[P2]=P4 */ -#define OP_String 72 /* synopsis: r[P2]='P4' (len=P1) */ -#define OP_Null 73 /* synopsis: r[P2..P3]=NULL */ -#define OP_SoftNull 74 /* synopsis: r[P1]=NULL */ -#define OP_Blob 75 /* synopsis: r[P2]=P4 (len=P1) */ -#define OP_Variable 76 /* synopsis: r[P2]=parameter(P1,P4) */ -#define OP_Move 77 /* synopsis: r[P2@P3]=r[P1@P3] */ -#define OP_Copy 78 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ -#define OP_SCopy 79 /* synopsis: r[P2]=r[P1] */ -#define OP_IntCopy 80 /* synopsis: r[P2]=r[P1] */ -#define OP_ResultRow 81 /* synopsis: output=r[P1@P2] */ -#define OP_CollSeq 82 -#define OP_AddImm 83 /* synopsis: r[P1]=r[P1]+P2 */ -#define OP_RealAffinity 84 -#define OP_Cast 85 /* synopsis: affinity(r[P1]) */ -#define OP_Permutation 86 -#define OP_Compare 87 /* synopsis: r[P1@P3] <-> r[P2@P3] */ -#define OP_IsTrue 88 /* synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 */ -#define OP_Offset 89 /* synopsis: r[P3] = sqlite_offset(P1) */ -#define OP_Column 90 /* synopsis: r[P3]=PX */ -#define OP_Affinity 91 /* synopsis: affinity(r[P1@P2]) */ -#define OP_BitAnd 92 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ -#define OP_BitOr 93 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ -#define OP_ShiftLeft 94 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<>r[P1] */ -#define OP_Add 96 /* same as TK_PLUS, synopsis: r[P3]=r[P1]+r[P2] */ -#define OP_Subtract 97 /* same as TK_MINUS, synopsis: r[P3]=r[P2]-r[P1] */ -#define OP_Multiply 98 /* same as TK_STAR, synopsis: r[P3]=r[P1]*r[P2] */ -#define OP_Divide 99 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */ -#define OP_Remainder 100 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */ -#define OP_Concat 101 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */ -#define OP_MakeRecord 102 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ -#define OP_BitNot 103 /* same as TK_BITNOT, synopsis: r[P2]= ~r[P1] */ -#define OP_Count 104 /* synopsis: r[P2]=count() */ -#define OP_ReadCookie 105 -#define OP_String8 106 /* same as TK_STRING, synopsis: r[P2]='P4' */ -#define OP_SetCookie 107 -#define OP_ReopenIdx 108 /* synopsis: root=P2 iDb=P3 */ -#define OP_OpenRead 109 /* synopsis: root=P2 iDb=P3 */ -#define OP_OpenWrite 110 /* synopsis: root=P2 iDb=P3 */ -#define OP_OpenDup 111 -#define OP_OpenAutoindex 112 /* synopsis: nColumn=P2 */ -#define OP_OpenEphemeral 113 /* synopsis: nColumn=P2 */ -#define OP_SorterOpen 114 -#define OP_SequenceTest 115 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */ -#define OP_OpenPseudo 116 /* synopsis: P3 columns in r[P2] */ -#define OP_Close 117 -#define OP_ColumnsUsed 118 -#define OP_SeekHit 119 /* synopsis: seekHit=P2 */ -#define OP_Sequence 120 /* synopsis: r[P2]=cursor[P1].ctr++ */ -#define OP_NewRowid 121 /* synopsis: r[P2]=rowid */ -#define OP_Insert 122 /* synopsis: intkey=r[P3] data=r[P2] */ -#define OP_InsertInt 123 /* synopsis: intkey=P3 data=r[P2] */ -#define OP_Delete 124 -#define OP_ResetCount 125 -#define OP_SorterCompare 126 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */ -#define OP_SorterData 127 /* synopsis: r[P2]=data */ -#define OP_RowData 128 /* synopsis: r[P2]=data */ -#define OP_Rowid 129 /* synopsis: r[P2]=rowid */ -#define OP_NullRow 130 -#define OP_SeekEnd 131 -#define OP_SorterInsert 132 /* synopsis: key=r[P2] */ -#define OP_IdxInsert 133 /* synopsis: key=r[P2] */ -#define OP_IdxDelete 134 /* synopsis: key=r[P2@P3] */ -#define OP_DeferredSeek 135 /* synopsis: Move P3 to P1.rowid if needed */ -#define OP_IdxRowid 136 /* synopsis: r[P2]=rowid */ -#define OP_Destroy 137 -#define OP_Clear 138 -#define OP_ResetSorter 139 -#define OP_CreateBtree 140 /* synopsis: r[P2]=root iDb=P1 flags=P3 */ -#define OP_Real 141 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ -#define OP_SqlExec 142 -#define OP_ParseSchema 143 -#define OP_LoadAnalysis 144 -#define OP_DropTable 145 -#define OP_DropIndex 146 -#define OP_DropTrigger 147 -#define OP_IntegrityCk 148 -#define OP_RowSetAdd 149 /* synopsis: rowset(P1)=r[P2] */ -#define OP_Param 150 -#define OP_FkCounter 151 /* synopsis: fkctr[P1]+=P2 */ -#define OP_MemMax 152 /* synopsis: r[P1]=max(r[P1],r[P2]) */ -#define OP_OffsetLimit 153 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ -#define OP_AggInverse 154 /* synopsis: accum=r[P3] inverse(r[P2@P5]) */ -#define OP_AggStep 155 /* synopsis: accum=r[P3] step(r[P2@P5]) */ -#define OP_AggStep1 156 /* synopsis: accum=r[P3] step(r[P2@P5]) */ -#define OP_AggValue 157 /* synopsis: r[P3]=value N=P2 */ -#define OP_AggFinal 158 /* synopsis: accum=r[P1] N=P2 */ -#define OP_Expire 159 -#define OP_TableLock 160 /* synopsis: iDb=P1 root=P2 write=P3 */ -#define OP_VBegin 161 -#define OP_VCreate 162 -#define OP_VDestroy 163 -#define OP_VOpen 164 -#define OP_VColumn 165 /* synopsis: r[P3]=vcolumn(P2) */ -#define OP_VRename 166 -#define OP_Pagecount 167 -#define OP_MaxPgcnt 168 -#define OP_Trace 169 -#define OP_CursorHint 170 -#define OP_Noop 171 -#define OP_Explain 172 -#define OP_Abortable 173 +#define OP_DecrJumpZero 59 /* jump, synopsis: if (--r[P1])==0 goto P2 */ +#define OP_IncrVacuum 60 /* jump */ +#define OP_VNext 61 /* jump */ +#define OP_Init 62 /* jump, synopsis: Start at P2 */ +#define OP_PureFunc 63 /* synopsis: r[P3]=func(r[P2@P5]) */ +#define OP_Function 64 /* synopsis: r[P3]=func(r[P2@P5]) */ +#define OP_Return 65 +#define OP_EndCoroutine 66 +#define OP_HaltIfNull 67 /* synopsis: if r[P3]=null halt */ +#define OP_Halt 68 +#define OP_Integer 69 /* synopsis: r[P2]=P1 */ +#define OP_Int64 70 /* synopsis: r[P2]=P4 */ +#define OP_String 71 /* synopsis: r[P2]='P4' (len=P1) */ +#define OP_Null 72 /* synopsis: r[P2..P3]=NULL */ +#define OP_SoftNull 73 /* synopsis: r[P1]=NULL */ +#define OP_Blob 74 /* synopsis: r[P2]=P4 (len=P1) */ +#define OP_Variable 75 /* synopsis: r[P2]=parameter(P1,P4) */ +#define OP_Move 76 /* synopsis: r[P2@P3]=r[P1@P3] */ +#define OP_Copy 77 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ +#define OP_SCopy 78 /* synopsis: r[P2]=r[P1] */ +#define OP_IntCopy 79 /* synopsis: r[P2]=r[P1] */ +#define OP_ResultRow 80 /* synopsis: output=r[P1@P2] */ +#define OP_CollSeq 81 +#define OP_AddImm 82 /* synopsis: r[P1]=r[P1]+P2 */ +#define OP_RealAffinity 83 +#define OP_Cast 84 /* synopsis: affinity(r[P1]) */ +#define OP_Permutation 85 +#define OP_Compare 86 /* synopsis: r[P1@P3] <-> r[P2@P3] */ +#define OP_IsTrue 87 /* synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 */ +#define OP_Offset 88 /* synopsis: r[P3] = sqlite_offset(P1) */ +#define OP_Column 89 /* synopsis: r[P3]=PX */ +#define OP_Affinity 90 /* synopsis: affinity(r[P1@P2]) */ +#define OP_MakeRecord 91 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ +#define OP_Count 92 /* synopsis: r[P2]=count() */ +#define OP_ReadCookie 93 +#define OP_SetCookie 94 +#define OP_ReopenIdx 95 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenRead 96 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenWrite 97 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenDup 98 +#define OP_OpenAutoindex 99 /* synopsis: nColumn=P2 */ +#define OP_OpenEphemeral 100 /* synopsis: nColumn=P2 */ +#define OP_BitAnd 101 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ +#define OP_BitOr 102 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ +#define OP_ShiftLeft 103 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<>r[P1] */ +#define OP_Add 105 /* same as TK_PLUS, synopsis: r[P3]=r[P1]+r[P2] */ +#define OP_Subtract 106 /* same as TK_MINUS, synopsis: r[P3]=r[P2]-r[P1] */ +#define OP_Multiply 107 /* same as TK_STAR, synopsis: r[P3]=r[P1]*r[P2] */ +#define OP_Divide 108 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */ +#define OP_Remainder 109 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */ +#define OP_Concat 110 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */ +#define OP_SorterOpen 111 +#define OP_BitNot 112 /* same as TK_BITNOT, synopsis: r[P2]= ~r[P1] */ +#define OP_SequenceTest 113 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */ +#define OP_OpenPseudo 114 /* synopsis: P3 columns in r[P2] */ +#define OP_String8 115 /* same as TK_STRING, synopsis: r[P2]='P4' */ +#define OP_Close 116 +#define OP_ColumnsUsed 117 +#define OP_SeekHit 118 /* synopsis: seekHit=P2 */ +#define OP_Sequence 119 /* synopsis: r[P2]=cursor[P1].ctr++ */ +#define OP_NewRowid 120 /* synopsis: r[P2]=rowid */ +#define OP_Insert 121 /* synopsis: intkey=r[P3] data=r[P2] */ +#define OP_Delete 122 +#define OP_ResetCount 123 +#define OP_SorterCompare 124 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */ +#define OP_SorterData 125 /* synopsis: r[P2]=data */ +#define OP_RowData 126 /* synopsis: r[P2]=data */ +#define OP_Rowid 127 /* synopsis: r[P2]=rowid */ +#define OP_NullRow 128 +#define OP_SeekEnd 129 +#define OP_SorterInsert 130 /* synopsis: key=r[P2] */ +#define OP_IdxInsert 131 /* synopsis: key=r[P2] */ +#define OP_IdxDelete 132 /* synopsis: key=r[P2@P3] */ +#define OP_DeferredSeek 133 /* synopsis: Move P3 to P1.rowid if needed */ +#define OP_IdxRowid 134 /* synopsis: r[P2]=rowid */ +#define OP_FinishSeek 135 +#define OP_Destroy 136 +#define OP_Clear 137 +#define OP_ResetSorter 138 +#define OP_CreateBtree 139 /* synopsis: r[P2]=root iDb=P1 flags=P3 */ +#define OP_SqlExec 140 +#define OP_ParseSchema 141 +#define OP_LoadAnalysis 142 +#define OP_DropTable 143 +#define OP_DropIndex 144 +#define OP_DropTrigger 145 +#define OP_IntegrityCk 146 +#define OP_RowSetAdd 147 /* synopsis: rowset(P1)=r[P2] */ +#define OP_Param 148 +#define OP_FkCounter 149 /* synopsis: fkctr[P1]+=P2 */ +#define OP_Real 150 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ +#define OP_MemMax 151 /* synopsis: r[P1]=max(r[P1],r[P2]) */ +#define OP_OffsetLimit 152 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ +#define OP_AggInverse 153 /* synopsis: accum=r[P3] inverse(r[P2@P5]) */ +#define OP_AggStep 154 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggStep1 155 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggValue 156 /* synopsis: r[P3]=value N=P2 */ +#define OP_AggFinal 157 /* synopsis: accum=r[P1] N=P2 */ +#define OP_Expire 158 +#define OP_CursorLock 159 +#define OP_CursorUnlock 160 +#define OP_TableLock 161 /* synopsis: iDb=P1 root=P2 write=P3 */ +#define OP_VBegin 162 +#define OP_VCreate 163 +#define OP_VDestroy 164 +#define OP_VOpen 165 +#define OP_VColumn 166 /* synopsis: r[P3]=vcolumn(P2) */ +#define OP_VRename 167 +#define OP_Pagecount 168 +#define OP_MaxPgcnt 169 +#define OP_Trace 170 +#define OP_CursorHint 171 +#define OP_ReleaseReg 172 /* synopsis: release r[P1@P2] mask P3 */ +#define OP_Noop 173 +#define OP_Explain 174 +#define OP_Abortable 175 /* Properties such as "out2" or "jump" that are specified in ** comments following the "case" for each opcode in the vdbe.c @@ -14854,25 +15383,26 @@ typedef struct VdbeOpList VdbeOpList; /* 0 */ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x10,\ /* 8 */ 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03,\ /* 16 */ 0x01, 0x01, 0x03, 0x12, 0x03, 0x01, 0x09, 0x09,\ -/* 24 */ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,\ -/* 32 */ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\ -/* 40 */ 0x01, 0x23, 0x0b, 0x26, 0x26, 0x01, 0x01, 0x03,\ +/* 24 */ 0x09, 0x09, 0x01, 0x09, 0x09, 0x09, 0x09, 0x09,\ +/* 32 */ 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\ +/* 40 */ 0x01, 0x01, 0x23, 0x26, 0x26, 0x0b, 0x01, 0x01,\ /* 48 */ 0x03, 0x03, 0x03, 0x03, 0x0b, 0x0b, 0x0b, 0x0b,\ -/* 56 */ 0x0b, 0x0b, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,\ -/* 64 */ 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, 0x10, 0x10,\ -/* 72 */ 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10,\ -/* 80 */ 0x10, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00,\ -/* 88 */ 0x12, 0x20, 0x00, 0x00, 0x26, 0x26, 0x26, 0x26,\ -/* 96 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x00, 0x12,\ -/* 104 */ 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 112 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 120 */ 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 128 */ 0x00, 0x10, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00,\ -/* 136 */ 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\ -/* 144 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x00,\ -/* 152 */ 0x04, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 160 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,\ -/* 168 */ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,} +/* 56 */ 0x0b, 0x0b, 0x01, 0x03, 0x01, 0x01, 0x01, 0x00,\ +/* 64 */ 0x00, 0x02, 0x02, 0x08, 0x00, 0x10, 0x10, 0x10,\ +/* 72 */ 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10,\ +/* 80 */ 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x12,\ +/* 88 */ 0x20, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\ +/* 96 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x26, 0x26,\ +/* 104 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x00,\ +/* 112 */ 0x12, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10,\ +/* 120 */ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,\ +/* 128 */ 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x10, 0x00,\ +/* 136 */ 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,\ +/* 144 */ 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x10, 0x04,\ +/* 152 */ 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 160 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 168 */ 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +} /* The sqlite3P2Values() routine is able to run faster if it knows ** the value of the largest JUMP opcode. The smaller the maximum @@ -14880,7 +15410,7 @@ typedef struct VdbeOpList VdbeOpList; ** generated this include file strives to group all JUMP opcodes ** together near the beginning of the list. */ -#define SQLITE_MX_JUMP_OPCODE 61 /* Maximum JUMP opcode */ +#define SQLITE_MX_JUMP_OPCODE 62 /* Maximum JUMP opcode */ /************** End of opcodes.h *********************************************/ /************** Continuing where we left off in vdbe.h ***********************/ @@ -14896,6 +15426,7 @@ typedef struct VdbeOpList VdbeOpList; ** for a description of what each of these routines does. */ SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse*); +SQLITE_PRIVATE Parse *sqlite3VdbeParser(Vdbe*); SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe*,int); SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe*,int,int); SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe*,int,int,int); @@ -14906,6 +15437,7 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int); SQLITE_PRIVATE int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int); SQLITE_PRIVATE int sqlite3VdbeAddOp4Dup8(Vdbe*,int,int,int,int,const u8*,int); SQLITE_PRIVATE int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int); +SQLITE_PRIVATE int sqlite3VdbeAddFunctionCall(Parse*,int,int,int,int,const FuncDef*,int); SQLITE_PRIVATE void sqlite3VdbeEndCoroutine(Vdbe*,int); #if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) SQLITE_PRIVATE void sqlite3VdbeVerifyNoMallocRequired(Vdbe *p, int N); @@ -14931,22 +15463,33 @@ SQLITE_PRIVATE int sqlite3VdbeExplainParent(Parse*); # define ExplainQueryPlan(P) # define ExplainQueryPlanPop(P) # define ExplainQueryPlanParent(P) 0 +# define sqlite3ExplainBreakpoint(A,B) /*no-op*/ +#endif +#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_EXPLAIN) +SQLITE_PRIVATE void sqlite3ExplainBreakpoint(const char*,const char*); +#else +# define sqlite3ExplainBreakpoint(A,B) /*no-op*/ #endif SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*); -SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe*, u32 addr, u8); -SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, u32 addr, int P1); -SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, u32 addr, int P2); -SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, u32 addr, int P3); +SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe*, int addr, u8); +SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, int addr, int P1); +SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, int addr, int P2); +SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, int addr, int P3); SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, u16 P5); SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe*, int addr); SQLITE_PRIVATE int sqlite3VdbeChangeToNoop(Vdbe*, int addr); SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe*, u8 op); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3VdbeReleaseRegisters(Parse*,int addr, int n, u32 mask, int); +#else +# define sqlite3VdbeReleaseRegisters(P,A,N,M,F) +#endif SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N); SQLITE_PRIVATE void sqlite3VdbeAppendP4(Vdbe*, void *pP4, int p4type); SQLITE_PRIVATE void sqlite3VdbeSetP4KeyInfo(Parse*, Index*); SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe*, int); SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe*, int); -SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe*); +SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Parse*); SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe*); @@ -14967,6 +15510,10 @@ SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe*); SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe*); SQLITE_PRIVATE u8 sqlite3VdbePrepareFlags(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, u8); +#ifdef SQLITE_ENABLE_NORMALIZE +SQLITE_PRIVATE void sqlite3VdbeAddDblquoteStr(sqlite3*,Vdbe*,const char*); +SQLITE_PRIVATE int sqlite3VdbeUsesDoubleQuotedString(Vdbe*,const char*); +#endif SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe*,Vdbe*); SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe*, int*, int*); SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe*, int, u8); @@ -14985,9 +15532,8 @@ SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(KeyInfo*); typedef int (*RecordCompare)(int,const void*,UnpackedRecord*); SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord*); -#ifndef SQLITE_OMIT_TRIGGER SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *); -#endif +SQLITE_PRIVATE int sqlite3VdbeHasSubProgram(Vdbe*); SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context*); @@ -15277,9 +15823,6 @@ SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager); SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager); SQLITE_PRIVATE int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen); SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager, sqlite3*); -# ifdef SQLITE_DIRECT_OVERFLOW_READ -SQLITE_PRIVATE int sqlite3PagerUseWal(Pager *pPager, Pgno); -# endif # ifdef SQLITE_ENABLE_SNAPSHOT SQLITE_PRIVATE int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppSnapshot); SQLITE_PRIVATE int sqlite3PagerSnapshotOpen(Pager *pPager, sqlite3_snapshot *pSnapshot); @@ -15287,8 +15830,10 @@ SQLITE_PRIVATE int sqlite3PagerSnapshotRecover(Pager *pPager); SQLITE_PRIVATE int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pSnapshot); SQLITE_PRIVATE void sqlite3PagerSnapshotUnlock(Pager *pPager); # endif -#else -# define sqlite3PagerUseWal(x,y) 0 +#endif + +#ifdef SQLITE_DIRECT_OVERFLOW_READ +SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno); #endif #ifdef SQLITE_ENABLE_ZIPVFS @@ -15302,7 +15847,7 @@ SQLITE_PRIVATE u32 sqlite3PagerDataVersion(Pager*); SQLITE_PRIVATE int sqlite3PagerRefcount(Pager*); #endif SQLITE_PRIVATE int sqlite3PagerMemUsed(Pager*); -SQLITE_PRIVATE const char *sqlite3PagerFilename(Pager*, int); +SQLITE_PRIVATE const char *sqlite3PagerFilename(const Pager*, int); SQLITE_PRIVATE sqlite3_vfs *sqlite3PagerVfs(Pager*); SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager*); SQLITE_PRIVATE sqlite3_file *sqlite3PagerJrnlFile(Pager*); @@ -15533,6 +16078,10 @@ SQLITE_PRIVATE int sqlite3HeaderSizePcache1(void); /* Number of dirty pages as a percentage of the configured cache size */ SQLITE_PRIVATE int sqlite3PCachePercentDirty(PCache*); +#ifdef SQLITE_DIRECT_OVERFLOW_READ +SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache); +#endif + #endif /* _PCACHE_H_ */ /************** End of pcache.h **********************************************/ @@ -15886,6 +16435,7 @@ SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file *); #define MUTEX_LOGIC(X) #else #define MUTEX_LOGIC(X) X +SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); #endif /* defined(SQLITE_MUTEX_OMIT) */ /************** End of mutex.h ***********************************************/ @@ -16017,15 +16567,47 @@ struct Schema { ** is shared by multiple database connections. Therefore, while parsing ** schema information, the Lookaside.bEnabled flag is cleared so that ** lookaside allocations are not used to construct the schema objects. +** +** New lookaside allocations are only allowed if bDisable==0. When +** bDisable is greater than zero, sz is set to zero which effectively +** disables lookaside without adding a new test for the bDisable flag +** in a performance-critical path. sz should be set by to szTrue whenever +** bDisable changes back to zero. +** +** Lookaside buffers are initially held on the pInit list. As they are +** used and freed, they are added back to the pFree list. New allocations +** come off of pFree first, then pInit as a fallback. This dual-list +** allows use to compute a high-water mark - the maximum number of allocations +** outstanding at any point in the past - by subtracting the number of +** allocations on the pInit list from the total number of allocations. +** +** Enhancement on 2019-12-12: Two-size-lookaside +** The default lookaside configuration is 100 slots of 1200 bytes each. +** The larger slot sizes are important for performance, but they waste +** a lot of space, as most lookaside allocations are less than 128 bytes. +** The two-size-lookaside enhancement breaks up the lookaside allocation +** into two pools: One of 128-byte slots and the other of the default size +** (1200-byte) slots. Allocations are filled from the small-pool first, +** failing over to the full-size pool if that does not work. Thus more +** lookaside slots are available while also using less memory. +** This enhancement can be omitted by compiling with +** SQLITE_OMIT_TWOSIZE_LOOKASIDE. */ struct Lookaside { u32 bDisable; /* Only operate the lookaside when zero */ u16 sz; /* Size of each buffer in bytes */ + u16 szTrue; /* True value of sz, even if disabled */ u8 bMalloced; /* True if pStart obtained from sqlite3_malloc() */ u32 nSlot; /* Number of lookaside slots allocated */ u32 anStat[3]; /* 0: hits. 1: size misses. 2: full misses */ LookasideSlot *pInit; /* List of buffers not previously used */ LookasideSlot *pFree; /* List of available buffers */ +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + LookasideSlot *pSmallInit; /* List of small buffers not prediously used */ + LookasideSlot *pSmallFree; /* List of available small buffers */ + void *pMiddle; /* First byte past end of full-size buffers and + ** the first byte of LOOKASIDE_SMALL buffers */ +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ void *pStart; /* First byte of available memory space */ void *pEnd; /* First byte past end of available space */ }; @@ -16033,17 +16615,30 @@ struct LookasideSlot { LookasideSlot *pNext; /* Next buffer in the list of free buffers */ }; +#define DisableLookaside db->lookaside.bDisable++;db->lookaside.sz=0 +#define EnableLookaside db->lookaside.bDisable--;\ + db->lookaside.sz=db->lookaside.bDisable?0:db->lookaside.szTrue + +/* Size of the smaller allocations in two-size lookside */ +#ifdef SQLITE_OMIT_TWOSIZE_LOOKASIDE +# define LOOKASIDE_SMALL 0 +#else +# define LOOKASIDE_SMALL 128 +#endif + /* ** A hash table for built-in function definitions. (Application-defined ** functions use a regular table table from hash.h.) ** ** Hash each FuncDef structure into one of the FuncDefHash.a[] slots. -** Collisions are on the FuncDef.u.pHash chain. +** Collisions are on the FuncDef.u.pHash chain. Use the SQLITE_FUNC_HASH() +** macro to compute a hash on the function name. */ #define SQLITE_FUNC_HASH_SZ 23 struct FuncDefHash { FuncDef *a[SQLITE_FUNC_HASH_SZ]; /* Hash table for functions */ }; +#define SQLITE_FUNC_HASH(C,L) (((C)+(L))%SQLITE_FUNC_HASH_SZ) #ifdef SQLITE_USER_AUTHENTICATION /* @@ -16087,10 +16682,13 @@ SQLITE_PRIVATE void sqlite3CryptFunc(sqlite3_context*,int,sqlite3_value**); /* This is an extra SQLITE_TRACE macro that indicates "legacy" tracing ** in the style of sqlite3_trace() */ -#define SQLITE_TRACE_LEGACY 0x80 +#define SQLITE_TRACE_LEGACY 0x40 /* Use the legacy xTrace */ +#define SQLITE_TRACE_XPROFILE 0x80 /* Use the legacy xProfile */ #else -#define SQLITE_TRACE_LEGACY 0 +#define SQLITE_TRACE_LEGACY 0 +#define SQLITE_TRACE_XPROFILE 0 #endif /* SQLITE_OMIT_DEPRECATED */ +#define SQLITE_TRACE_NONLEGACY_MASK 0x0f /* Normal flags */ /* @@ -16104,7 +16702,7 @@ struct sqlite3 { Db *aDb; /* All backends */ int nDb; /* Number of backends currently in use */ u32 mDbFlags; /* flags recording internal state */ - u32 flags; /* flags settable by pragmas. See below */ + u64 flags; /* flags settable by pragmas. See below */ i64 lastRowid; /* ROWID of most recent insert (see above) */ i64 szMmap; /* Default mmap_size setting */ u32 nSchemaLock; /* Do not reset the schema when non-zero */ @@ -16139,6 +16737,7 @@ struct sqlite3 { unsigned orphanTrigger : 1; /* Last statement is orphaned TEMP trigger */ unsigned imposterTable : 1; /* Building an imposter table */ unsigned reopenMemdb : 1; /* ATTACH is really a reopen using MemDB */ + char **azInit; /* "type", "name", and "tbl_name" columns */ } init; int nVdbeActive; /* Number of VDBEs currently running */ int nVdbeRead; /* Number of active VDBEs that read or write */ @@ -16149,14 +16748,17 @@ struct sqlite3 { void **aExtension; /* Array of shared library handles */ int (*xTrace)(u32,void*,void*,void*); /* Trace function */ void *pTraceArg; /* Argument to the trace function */ +#ifndef SQLITE_OMIT_DEPRECATED void (*xProfile)(void*,const char*,u64); /* Profiling function */ void *pProfileArg; /* Argument to profile function */ +#endif void *pCommitArg; /* Argument to xCommitCallback() */ int (*xCommitCallback)(void*); /* Invoked at every commit. */ void *pRollbackArg; /* Argument to xRollbackCallback() */ void (*xRollbackCallback)(void*); /* Invoked at every commit. */ void *pUpdateArg; void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64); + Parse *pParse; /* Current parse */ #ifdef SQLITE_ENABLE_PREUPDATE_HOOK void *pPreUpdateArg; /* First argument to xPreUpdateCallback */ void (*xPreUpdateCallback)( /* Registered using sqlite3_preupdate_hook() */ @@ -16232,6 +16834,13 @@ struct sqlite3 { #define SCHEMA_ENC(db) ((db)->aDb[0].pSchema->enc) #define ENC(db) ((db)->enc) +/* +** A u64 constant where the lower 32 bits are all zeros. Only the +** upper 32 bits are included in the argument. Necessary because some +** C-compilers still do not accept LL integer literals. +*/ +#define HI(X) ((u64)(X)<<32) + /* ** Possible values for the sqlite3.flags. ** @@ -16247,9 +16856,8 @@ struct sqlite3 { #define SQLITE_CkptFullFSync 0x00000010 /* Use full fsync for checkpoint */ #define SQLITE_CacheSpill 0x00000020 /* OK to spill pager cache */ #define SQLITE_ShortColNames 0x00000040 /* Show short columns names */ -#define SQLITE_CountRows 0x00000080 /* Count rows changed by INSERT, */ - /* DELETE, or UPDATE and return */ - /* the count using a callback. */ +#define SQLITE_TrustedSchema 0x00000080 /* Allow unsafe functions and + ** vtabs in the schema definition */ #define SQLITE_NullCallback 0x00000100 /* Invoke the callback once if the */ /* result set is empty */ #define SQLITE_IgnoreChecks 0x00000200 /* Do not enforce check constraints */ @@ -16270,14 +16878,23 @@ struct sqlite3 { #define SQLITE_TriggerEQP 0x01000000 /* Show trigger EXPLAIN QUERY PLAN */ #define SQLITE_ResetDatabase 0x02000000 /* Reset the database */ #define SQLITE_LegacyAlter 0x04000000 /* Legacy ALTER TABLE behaviour */ +#define SQLITE_NoSchemaError 0x08000000 /* Do not report schema parse errors*/ +#define SQLITE_Defensive 0x10000000 /* Input SQL is likely hostile */ +#define SQLITE_DqsDDL 0x20000000 /* dbl-quoted strings allowed in DDL*/ +#define SQLITE_DqsDML 0x40000000 /* dbl-quoted strings allowed in DML*/ +#define SQLITE_EnableView 0x80000000 /* Enable the use of views */ +#define SQLITE_CountRows HI(0x00001) /* Count rows changed by INSERT, */ + /* DELETE, or UPDATE and return */ + /* the count using a callback. */ /* Flags used only if debugging */ #ifdef SQLITE_DEBUG -#define SQLITE_SqlTrace 0x08000000 /* Debug print SQL as it executes */ -#define SQLITE_VdbeListing 0x10000000 /* Debug listings of VDBE programs */ -#define SQLITE_VdbeTrace 0x20000000 /* True to trace VDBE execution */ -#define SQLITE_VdbeAddopTrace 0x40000000 /* Trace sqlite3VdbeAddOp() calls */ -#define SQLITE_VdbeEQP 0x80000000 /* Debug EXPLAIN QUERY PLAN */ +#define SQLITE_SqlTrace HI(0x0100000) /* Debug print SQL as it executes */ +#define SQLITE_VdbeListing HI(0x0200000) /* Debug listings of VDBE progs */ +#define SQLITE_VdbeTrace HI(0x0400000) /* True to trace VDBE execution */ +#define SQLITE_VdbeAddopTrace HI(0x0800000) /* Trace sqlite3VdbeAddOp() calls */ +#define SQLITE_VdbeEQP HI(0x1000000) /* Debug EXPLAIN QUERY PLAN */ +#define SQLITE_ParserTrace HI(0x2000000) /* PRAGMA parser_trace=ON */ #endif /* @@ -16286,7 +16903,9 @@ struct sqlite3 { #define DBFLAG_SchemaChange 0x0001 /* Uncommitted Hash table changes */ #define DBFLAG_PreferBuiltin 0x0002 /* Preference to built-in funcs */ #define DBFLAG_Vacuum 0x0004 /* Currently in a VACUUM */ -#define DBFLAG_SchemaKnownOk 0x0008 /* Schema is known to be valid */ +#define DBFLAG_VacuumInto 0x0008 /* Currently running VACUUM INTO */ +#define DBFLAG_SchemaKnownOk 0x0010 /* Schema is known to be valid */ +#define DBFLAG_InternalFunc 0x0020 /* Allow use of internal functions */ /* ** Bits of the sqlite3.dbOptFlags field that are used by the @@ -16294,7 +16913,7 @@ struct sqlite3 { ** selectively disable various optimizations. */ #define SQLITE_QueryFlattener 0x0001 /* Query flattening */ - /* 0x0002 available for reuse */ +#define SQLITE_WindowFunc 0x0002 /* Use xInverse for window functions */ #define SQLITE_GroupByOrder 0x0004 /* GROUPBY cover of ORDERBY */ #define SQLITE_FactorOutConst 0x0008 /* Constant factoring */ #define SQLITE_DistinctOpt 0x0010 /* DISTINCT using indexes */ @@ -16304,8 +16923,8 @@ struct sqlite3 { #define SQLITE_OmitNoopJoin 0x0100 /* Omit unused tables in joins */ #define SQLITE_CountOfView 0x0200 /* The count-of-view optimization */ #define SQLITE_CursorHints 0x0400 /* Add OP_CursorHint opcodes */ -#define SQLITE_Stat34 0x0800 /* Use STAT3 or STAT4 data */ - /* TH3 expects the Stat34 ^^^^^^ value to be 0x0800. Don't change it */ +#define SQLITE_Stat4 0x0800 /* Use STAT4 data */ + /* TH3 expects the Stat4 ^^^^^^ value to be 0x0800. Don't change it */ #define SQLITE_PushDown 0x1000 /* The push-down optimization */ #define SQLITE_SimplifyJoin 0x2000 /* Convert LEFT JOIN to JOIN */ #define SQLITE_SkipScan 0x4000 /* Skip-scans */ @@ -16393,6 +17012,8 @@ struct FuncDestructor { ** SQLITE_FUNC_LENGTH == OPFLAG_LENGTHARG ** SQLITE_FUNC_TYPEOF == OPFLAG_TYPEOFARG ** SQLITE_FUNC_CONSTANT == SQLITE_DETERMINISTIC from the API +** SQLITE_FUNC_DIRECT == SQLITE_DIRECTONLY from the API +** SQLITE_FUNC_UNSAFE == SQLITE_INNOCUOUS ** SQLITE_FUNC_ENCMASK depends on SQLITE_UTF* macros in the API */ #define SQLITE_FUNC_ENCMASK 0x0003 /* SQLITE_UTF8, SQLITE_UTF16BE or UTF16LE */ @@ -16409,10 +17030,22 @@ struct FuncDestructor { #define SQLITE_FUNC_MINMAX 0x1000 /* True for min() and max() aggregates */ #define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a ** single query - might change over time */ -#define SQLITE_FUNC_AFFINITY 0x4000 /* Built-in affinity() function */ +#define SQLITE_FUNC_TEST 0x4000 /* Built-in testing functions */ #define SQLITE_FUNC_OFFSET 0x8000 /* Built-in sqlite_offset() function */ -#define SQLITE_FUNC_WINDOW 0x10000 /* Built-in window-only function */ -#define SQLITE_FUNC_WINDOW_SIZE 0x20000 /* Requires partition size as arg. */ +#define SQLITE_FUNC_WINDOW 0x00010000 /* Built-in window-only function */ +#define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */ +#define SQLITE_FUNC_DIRECT 0x00080000 /* Not for use in TRIGGERs or VIEWs */ +#define SQLITE_FUNC_SUBTYPE 0x00100000 /* Result likely to have sub-type */ +#define SQLITE_FUNC_UNSAFE 0x00200000 /* Function has side effects */ +#define SQLITE_FUNC_INLINE 0x00400000 /* Functions implemented in-line */ + +/* Identifier numbers for each in-line function */ +#define INLINEFUNC_coalesce 0 +#define INLINEFUNC_implies_nonnull_row 1 +#define INLINEFUNC_expr_implies_expr 2 +#define INLINEFUNC_expr_compare 3 +#define INLINEFUNC_affinity 4 +#define INLINEFUNC_unlikely 99 /* Default case */ /* ** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are @@ -16428,6 +17061,22 @@ struct FuncDestructor { ** VFUNCTION(zName, nArg, iArg, bNC, xFunc) ** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag. ** +** SFUNCTION(zName, nArg, iArg, bNC, xFunc) +** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag and +** adds the SQLITE_DIRECTONLY flag. +** +** INLINE_FUNC(zName, nArg, iFuncId, mFlags) +** zName is the name of a function that is implemented by in-line +** byte code rather than by the usual callbacks. The iFuncId +** parameter determines the function id. The mFlags parameter is +** optional SQLITE_FUNC_ flags for this function. +** +** TEST_FUNC(zName, nArg, iFuncId, mFlags) +** zName is the name of a test-only function implemented by in-line +** byte code rather than by the usual callbacks. The iFuncId +** parameter determines the function id. The mFlags parameter is +** optional SQLITE_FUNC_ flags for this function. +** ** DFUNCTION(zName, nArg, iArg, bNC, xFunc) ** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag and ** adds the SQLITE_FUNC_SLOCHNG flag. Used for date & time functions @@ -16467,6 +17116,16 @@ struct FuncDestructor { #define VFUNCTION(zName, nArg, iArg, bNC, xFunc) \ {nArg, SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } +#define SFUNCTION(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_UTF8|SQLITE_DIRECTONLY|SQLITE_FUNC_UNSAFE, \ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } +#define INLINE_FUNC(zName, nArg, iArg, mFlags) \ + {nArg, SQLITE_UTF8|SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \ + SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} } +#define TEST_FUNC(zName, nArg, iArg, mFlags) \ + {nArg, SQLITE_UTF8|SQLITE_FUNC_INTERNAL|SQLITE_FUNC_TEST| \ + SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \ + SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} } #define DFUNCTION(zName, nArg, iArg, bNC, xFunc) \ {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8, \ 0, 0, xFunc, 0, 0, 0, #zName, {0} } @@ -16482,16 +17141,13 @@ struct FuncDestructor { #define LIKEFUNC(zName, nArg, arg, flags) \ {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|flags, \ (void *)arg, 0, likeFunc, 0, 0, 0, #zName, {0} } -#define AGGREGATE(zName, nArg, arg, nc, xStep, xFinal, xValue) \ - {nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL), \ - SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,xValue,0,#zName, {0}} -#define AGGREGATE2(zName, nArg, arg, nc, xStep, xFinal, extraFlags) \ - {nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|extraFlags, \ - SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,xFinal,0,#zName, {0}} - #define WAGGREGATE(zName, nArg, arg, nc, xStep, xFinal, xValue, xInverse, f) \ {nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|f, \ SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,xValue,xInverse,#zName, {0}} +#define INTERNAL_FUNCTION(zName, nArg, xFunc) \ + {nArg, SQLITE_FUNC_INTERNAL|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \ + 0, 0, xFunc, 0, 0, 0, #zName, {0} } + /* ** All current savepoints are stored in a linked list starting at @@ -16523,32 +17179,52 @@ struct Savepoint { struct Module { const sqlite3_module *pModule; /* Callback pointers */ const char *zName; /* Name passed to create_module() */ + int nRefModule; /* Number of pointers to this object */ void *pAux; /* pAux passed to create_module() */ void (*xDestroy)(void *); /* Module destructor function */ Table *pEpoTab; /* Eponymous table for this module */ }; /* -** information about each column of an SQL table is held in an instance -** of this structure. +** Information about each column of an SQL table is held in an instance +** of the Column structure, in the Table.aCol[] array. +** +** Definitions: +** +** "table column index" This is the index of the column in the +** Table.aCol[] array, and also the index of +** the column in the original CREATE TABLE stmt. +** +** "storage column index" This is the index of the column in the +** record BLOB generated by the OP_MakeRecord +** opcode. The storage column index is less than +** or equal to the table column index. It is +** equal if and only if there are no VIRTUAL +** columns to the left. */ struct Column { char *zName; /* Name of this column, \000, then the type */ - Expr *pDflt; /* Default value of this column */ + Expr *pDflt; /* Default value or GENERATED ALWAYS AS value */ char *zColl; /* Collating sequence. If NULL, use the default */ u8 notNull; /* An OE_ code for handling a NOT NULL constraint */ char affinity; /* One of the SQLITE_AFF_... values */ u8 szEst; /* Estimated size of value in this column. sizeof(INT)==1 */ - u8 colFlags; /* Boolean properties. See COLFLAG_ defines below */ + u16 colFlags; /* Boolean properties. See COLFLAG_ defines below */ }; /* Allowed values for Column.colFlags: */ -#define COLFLAG_PRIMKEY 0x0001 /* Column is part of the primary key */ -#define COLFLAG_HIDDEN 0x0002 /* A hidden column in a virtual table */ -#define COLFLAG_HASTYPE 0x0004 /* Type name follows column name */ -#define COLFLAG_UNIQUE 0x0008 /* Column def contains "UNIQUE" or "PK" */ +#define COLFLAG_PRIMKEY 0x0001 /* Column is part of the primary key */ +#define COLFLAG_HIDDEN 0x0002 /* A hidden column in a virtual table */ +#define COLFLAG_HASTYPE 0x0004 /* Type name follows column name */ +#define COLFLAG_UNIQUE 0x0008 /* Column def contains "UNIQUE" or "PK" */ #define COLFLAG_SORTERREF 0x0010 /* Use sorter-refs with this column */ +#define COLFLAG_VIRTUAL 0x0020 /* GENERATED ALWAYS AS ... VIRTUAL */ +#define COLFLAG_STORED 0x0040 /* GENERATED ALWAYS AS ... STORED */ +#define COLFLAG_NOTAVAIL 0x0080 /* STORED column not yet calculated */ +#define COLFLAG_BUSY 0x0100 /* Blocks recursion on GENERATED columns */ +#define COLFLAG_GENERATED 0x0060 /* Combo: _STORED, _VIRTUAL */ +#define COLFLAG_NOINSERT 0x0062 /* Combo: _HIDDEN, _STORED, _VIRTUAL */ /* ** A "Collating Sequence" is defined by an instance of the following @@ -16588,11 +17264,12 @@ struct CollSeq { ** Note also that the numeric types are grouped together so that testing ** for a numeric type is a single comparison. And the BLOB type is first. */ -#define SQLITE_AFF_BLOB 'A' -#define SQLITE_AFF_TEXT 'B' -#define SQLITE_AFF_NUMERIC 'C' -#define SQLITE_AFF_INTEGER 'D' -#define SQLITE_AFF_REAL 'E' +#define SQLITE_AFF_NONE 0x40 /* '@' */ +#define SQLITE_AFF_BLOB 0x41 /* 'A' */ +#define SQLITE_AFF_TEXT 0x42 /* 'B' */ +#define SQLITE_AFF_NUMERIC 0x43 /* 'C' */ +#define SQLITE_AFF_INTEGER 0x44 /* 'D' */ +#define SQLITE_AFF_REAL 0x45 /* 'E' */ #define sqlite3IsNumericAffinity(X) ((X)>=SQLITE_AFF_NUMERIC) @@ -16665,10 +17342,17 @@ struct VTable { sqlite3_vtab *pVtab; /* Pointer to vtab instance */ int nRef; /* Number of pointers to this structure */ u8 bConstraint; /* True if constraints are supported */ + u8 eVtabRisk; /* Riskiness of allowing hacker access */ int iSavepoint; /* Depth of the SAVEPOINT stack */ VTable *pNext; /* Next in linked list (see above) */ }; +/* Allowed values for VTable.eVtabRisk +*/ +#define SQLITE_VTABRISK_Low 0 +#define SQLITE_VTABRISK_Normal 1 +#define SQLITE_VTABRISK_High 2 + /* ** The schema for each SQL table and view is represented in memory ** by an instance of the following structure. @@ -16687,6 +17371,7 @@ struct Table { u32 tabFlags; /* Mask of TF_* values */ i16 iPKey; /* If not negative, use aCol[iPKey] as the rowid */ i16 nCol; /* Number of columns in this table */ + i16 nNVCol; /* Number of columns that are not VIRTUAL */ LogEst nRowLogEst; /* Estimated rows in table - from sqlite_stat1 table */ LogEst szTabRow; /* Estimated size of each table row in bytes */ #ifdef SQLITE_ENABLE_COSTMULT @@ -16713,19 +17398,28 @@ struct Table { ** followed by non-hidden columns. Example: "CREATE VIRTUAL TABLE x USING ** vtab1(a HIDDEN, b);". Since "b" is a non-hidden column but "a" is hidden, ** the TF_OOOHidden attribute would apply in this case. Such tables require -** special handling during INSERT processing. +** special handling during INSERT processing. The "OOO" means "Out Of Order". +** +** Constraints: +** +** TF_HasVirtual == COLFLAG_Virtual +** TF_HasStored == COLFLAG_Stored */ #define TF_Readonly 0x0001 /* Read-only system table */ #define TF_Ephemeral 0x0002 /* An ephemeral table */ #define TF_HasPrimaryKey 0x0004 /* Table has a primary key */ #define TF_Autoincrement 0x0008 /* Integer primary key is autoincrement */ #define TF_HasStat1 0x0010 /* nRowLogEst set from sqlite_stat1 */ -#define TF_WithoutRowid 0x0020 /* No rowid. PRIMARY KEY is the key */ -#define TF_NoVisibleRowid 0x0040 /* No user-visible "rowid" column */ -#define TF_OOOHidden 0x0080 /* Out-of-Order hidden columns */ +#define TF_HasVirtual 0x0020 /* Has one or more VIRTUAL columns */ +#define TF_HasStored 0x0040 /* Has one or more STORED columns */ +#define TF_HasGenerated 0x0060 /* Combo: HasVirtual + HasStored */ +#define TF_WithoutRowid 0x0080 /* No rowid. PRIMARY KEY is the key */ #define TF_StatsUsed 0x0100 /* Query planner decisions affected by ** Index.aiRowLogEst[] values */ -#define TF_HasNotNull 0x0200 /* Contains NOT NULL constraints */ +#define TF_NoVisibleRowid 0x0200 /* No user-visible "rowid" column */ +#define TF_OOOHidden 0x0400 /* Out-of-Order hidden columns */ +#define TF_HasNotNull 0x0800 /* Contains NOT NULL constraints */ +#define TF_Shadow 0x1000 /* True for a shadow table */ /* ** Test to see whether or not a table is a virtual table. This is @@ -16859,10 +17553,16 @@ struct KeyInfo { u16 nKeyField; /* Number of key columns in the index */ u16 nAllField; /* Total columns, including key plus others */ sqlite3 *db; /* The database connection */ - u8 *aSortOrder; /* Sort order for each column. */ + u8 *aSortFlags; /* Sort order for each column. */ CollSeq *aColl[1]; /* Collating sequence for each term of the key */ }; +/* +** Allowed bit values for entries in the KeyInfo.aSortFlags[] array. +*/ +#define KEYINFO_ORDER_DESC 0x01 /* DESC sort order */ +#define KEYINFO_ORDER_BIGNULL 0x02 /* NULL is larger than any other value */ + /* ** This object holds a record which has been parsed out into individual ** fields, for the purposes of doing a comparison. @@ -16961,7 +17661,7 @@ struct Index { u16 nKeyCol; /* Number of columns forming the key */ u16 nColumn; /* Number of columns stored in the index */ u8 onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ - unsigned idxType:2; /* 1==UNIQUE, 2==PRIMARY KEY, 0==CREATE INDEX */ + unsigned idxType:2; /* 0:Normal 1:UNIQUE, 2:PRIMARY KEY, 3:IPK */ unsigned bUnordered:1; /* Use this index for == or IN queries only */ unsigned uniqNotNull:1; /* True if UNIQUE and NOT NULL for all columns */ unsigned isResized:1; /* True if resizeIndexObject() has been called */ @@ -16969,7 +17669,9 @@ struct Index { unsigned noSkipScan:1; /* Do not try to use skip-scan if true */ unsigned hasStat1:1; /* aiRowLogEst values come from sqlite_stat1 */ unsigned bNoQuery:1; /* Do not use this index to optimize queries */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + unsigned bAscKeyBug:1; /* True if the bba7b69f9849b5bf bug applies */ + unsigned bHasVCol:1; /* Index references one or more VIRTUAL columns */ +#ifdef SQLITE_ENABLE_STAT4 int nSample; /* Number of elements in aSample[] */ int nSampleCol; /* Size of IndexSample.anEq[] and so on */ tRowcnt *aAvgEq; /* Average nEq values for keys not in aSample */ @@ -16986,6 +17688,7 @@ struct Index { #define SQLITE_IDXTYPE_APPDEF 0 /* Created using CREATE INDEX */ #define SQLITE_IDXTYPE_UNIQUE 1 /* Implements a UNIQUE constraint */ #define SQLITE_IDXTYPE_PRIMARYKEY 2 /* Is the PRIMARY KEY for the table */ +#define SQLITE_IDXTYPE_IPK 3 /* INTEGER PRIMARY KEY index */ /* Return true if index X is a PRIMARY KEY index */ #define IsPrimaryKeyIndex(X) ((X)->idxType==SQLITE_IDXTYPE_PRIMARYKEY) @@ -17000,7 +17703,7 @@ struct Index { #define XN_EXPR (-2) /* Indexed column is an expression */ /* -** Each sample stored in the sqlite_stat3 table is represented in memory +** Each sample stored in the sqlite_stat4 table is represented in memory ** using a structure of this type. See documentation at the top of the ** analyze.c source file for additional information. */ @@ -17012,6 +17715,12 @@ struct IndexSample { tRowcnt *anDLt; /* Est. number of distinct keys less than this sample */ }; +/* +** Possible values to use within the flags argument to sqlite3GetToken(). +*/ +#define SQLITE_TOKEN_QUOTED 0x1 /* Token is a quoted identifier. */ +#define SQLITE_TOKEN_KEYWORD 0x2 /* Token is a keyword. */ + /* ** Each token coming out of the lexer is an instance of ** this structure. Tokens are also used as part of an expression. @@ -17152,7 +17861,11 @@ typedef int ynVar; */ struct Expr { u8 op; /* Operation performed by this node */ - char affinity; /* The affinity of the column or 0 if not a column */ + char affExpr; /* affinity, or RAISE type */ + u8 op2; /* TK_REGISTER/TK_TRUTH: original value of Expr.op + ** TK_COLUMN: the value of p5 for OP_Column + ** TK_AGG_FUNCTION: nesting depth + ** TK_FUNCTION: NC_SelfRef flag if needs OP_PureFunc */ u32 flags; /* Various flags. EP_* See below */ union { char *zToken; /* Token value. Zero terminated and dequoted */ @@ -17183,50 +17896,64 @@ struct Expr { ** TK_REGISTER: register number ** TK_TRIGGER: 1 -> new, 0 -> old ** EP_Unlikely: 134217728 times likelihood + ** TK_IN: ephemerial table holding RHS + ** TK_SELECT_COLUMN: Number of columns on the LHS ** TK_SELECT: 1st register of result vector */ ynVar iColumn; /* TK_COLUMN: column index. -1 for rowid. ** TK_VARIABLE: variable number (always >= 1). ** TK_SELECT_COLUMN: column of the result vector */ i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */ i16 iRightJoinTable; /* If EP_FromJoin, the right table of the join */ - u8 op2; /* TK_REGISTER: original value of Expr.op - ** TK_COLUMN: the value of p5 for OP_Column - ** TK_AGG_FUNCTION: nesting depth */ AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */ - Table *pTab; /* Table for TK_COLUMN expressions. Can be NULL - ** for a column of an index on an expression */ -#ifndef SQLITE_OMIT_WINDOWFUNC - Window *pWin; /* Window definition for window functions */ -#endif + union { + Table *pTab; /* TK_COLUMN: Table containing column. Can be NULL + ** for a column of an index on an expression */ + Window *pWin; /* EP_WinFunc: Window/Filter defn for a function */ + struct { /* TK_IN, TK_SELECT, and TK_EXISTS */ + int iAddr; /* Subroutine entry address */ + int regReturn; /* Register used to hold return address */ + } sub; + } y; }; /* ** The following are the meanings of bits in the Expr.flags field. -*/ -#define EP_FromJoin 0x000001 /* Originates in ON/USING clause of outer join */ -#define EP_Agg 0x000002 /* Contains one or more aggregate functions */ -#define EP_HasFunc 0x000004 /* Contains one or more functions of any kind */ -#define EP_FixedCol 0x000008 /* TK_Column with a known fixed value */ -#define EP_Distinct 0x000010 /* Aggregate function with DISTINCT keyword */ -#define EP_VarSelect 0x000020 /* pSelect is correlated, not constant */ -#define EP_DblQuoted 0x000040 /* token.z was originally in "..." */ -#define EP_InfixFunc 0x000080 /* True for an infix function: LIKE, GLOB, etc */ -#define EP_Collate 0x000100 /* Tree contains a TK_COLLATE operator */ -#define EP_Generic 0x000200 /* Ignore COLLATE or affinity on this tree */ -#define EP_IntValue 0x000400 /* Integer value contained in u.iValue */ -#define EP_xIsSelect 0x000800 /* x.pSelect is valid (otherwise x.pList is) */ -#define EP_Skip 0x001000 /* COLLATE, AS, or UNLIKELY */ -#define EP_Reduced 0x002000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ -#define EP_TokenOnly 0x004000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ -#define EP_Static 0x008000 /* Held in memory not obtained from malloc() */ -#define EP_MemToken 0x010000 /* Need to sqlite3DbFree() Expr.zToken */ -#define EP_NoReduce 0x020000 /* Cannot EXPRDUP_REDUCE this Expr */ -#define EP_Unlikely 0x040000 /* unlikely() or likelihood() function */ -#define EP_ConstFunc 0x080000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */ -#define EP_CanBeNull 0x100000 /* Can be null despite NOT NULL constraint */ -#define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */ -#define EP_Alias 0x400000 /* Is an alias for a result set column */ -#define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ +** Value restrictions: +** +** EP_Agg == NC_HasAgg == SF_HasAgg +** EP_Win == NC_HasWin +*/ +#define EP_FromJoin 0x000001 /* Originates in ON/USING clause of outer join */ +#define EP_Distinct 0x000002 /* Aggregate function with DISTINCT keyword */ +#define EP_HasFunc 0x000004 /* Contains one or more functions of any kind */ +#define EP_FixedCol 0x000008 /* TK_Column with a known fixed value */ +#define EP_Agg 0x000010 /* Contains one or more aggregate functions */ +#define EP_VarSelect 0x000020 /* pSelect is correlated, not constant */ +#define EP_DblQuoted 0x000040 /* token.z was originally in "..." */ +#define EP_InfixFunc 0x000080 /* True for an infix function: LIKE, GLOB, etc */ +#define EP_Collate 0x000100 /* Tree contains a TK_COLLATE operator */ +#define EP_Commuted 0x000200 /* Comparison operator has been commuted */ +#define EP_IntValue 0x000400 /* Integer value contained in u.iValue */ +#define EP_xIsSelect 0x000800 /* x.pSelect is valid (otherwise x.pList is) */ +#define EP_Skip 0x001000 /* Operator does not contribute to affinity */ +#define EP_Reduced 0x002000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ +#define EP_TokenOnly 0x004000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ +#define EP_Win 0x008000 /* Contains window functions */ +#define EP_MemToken 0x010000 /* Need to sqlite3DbFree() Expr.zToken */ +#define EP_NoReduce 0x020000 /* Cannot EXPRDUP_REDUCE this Expr */ +#define EP_Unlikely 0x040000 /* unlikely() or likelihood() function */ +#define EP_ConstFunc 0x080000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */ +#define EP_CanBeNull 0x100000 /* Can be null despite NOT NULL constraint */ +#define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */ +#define EP_Alias 0x400000 /* Is an alias for a result set column */ +#define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ +#define EP_WinFunc 0x1000000 /* TK_FUNCTION with Expr.y.pWin set */ +#define EP_Subrtn 0x2000000 /* Uses Expr.y.sub. TK_IN, _SELECT, or _EXISTS */ +#define EP_Quoted 0x4000000 /* TK_ID was originally quoted */ +#define EP_Static 0x8000000 /* Held in memory not obtained from malloc() */ +#define EP_IsTrue 0x10000000 /* Always has boolean value of TRUE */ +#define EP_IsFalse 0x20000000 /* Always has boolean value of FALSE */ +#define EP_FromDDL 0x40000000 /* Originates from sqlite_master */ /* ** The EP_Propagate mask is a set of properties that automatically propagate @@ -17242,6 +17969,8 @@ struct Expr { #define ExprHasAllProperty(E,P) (((E)->flags&(P))==(P)) #define ExprSetProperty(E,P) (E)->flags|=(P) #define ExprClearProperty(E,P) (E)->flags&=~(P) +#define ExprAlwaysTrue(E) (((E)->flags&(EP_FromJoin|EP_IsTrue))==EP_IsTrue) +#define ExprAlwaysFalse(E) (((E)->flags&(EP_FromJoin|EP_IsFalse))==EP_IsFalse) /* The ExprSetVVAProperty() macro is used for Verification, Validation, ** and Accreditation only. It works like ExprSetProperty() during VVA @@ -17268,6 +17997,18 @@ struct Expr { */ #define EXPRDUP_REDUCE 0x0001 /* Used reduced-size Expr nodes */ +/* +** True if the expression passed as an argument was a function with +** an OVER() clause (a window function). +*/ +#ifdef SQLITE_OMIT_WINDOWFUNC +# define IsWindowFunc(p) 0 +#else +# define IsWindowFunc(p) ( \ + ExprHasProperty((p), EP_WinFunc) && p->y.pWin->eFrmType!=TK_FILTER \ + ) +#endif + /* ** A list of expressions. Each expression may optionally have a ** name. An expr/name combination can be used in several ways, such @@ -17276,25 +18017,31 @@ struct Expr { ** also be used as the argument to a function, in which case the a.zName ** field is not used. ** -** By default the Expr.zSpan field holds a human-readable description of -** the expression that is used in the generation of error messages and -** column labels. In this case, Expr.zSpan is typically the text of a -** column expression as it exists in a SELECT statement. However, if -** the bSpanIsTab flag is set, then zSpan is overloaded to mean the name -** of the result column in the form: DATABASE.TABLE.COLUMN. This later -** form is used for name resolution with nested FROM clauses. +** In order to try to keep memory usage down, the Expr.a.zEName field +** is used for multiple purposes: +** +** eEName Usage +** ---------- ------------------------- +** ENAME_NAME (1) the AS of result set column +** (2) COLUMN= of an UPDATE +** +** ENAME_TAB DB.TABLE.NAME used to resolve names +** of subqueries +** +** ENAME_SPAN Text of the original result set +** expression. */ struct ExprList { int nExpr; /* Number of expressions on the list */ struct ExprList_item { /* For each expression in the list */ Expr *pExpr; /* The parse tree for this expression */ - char *zName; /* Token associated with this expression */ - char *zSpan; /* Original text of the expression */ - u8 sortOrder; /* 1 for DESC or 0 for ASC */ + char *zEName; /* Token associated with this expression */ + u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */ + unsigned eEName :2; /* Meaning of zEName */ unsigned done :1; /* A flag to indicate when processing is finished */ - unsigned bSpanIsTab :1; /* zSpan holds DB.TABLE.COLUMN */ unsigned reusable :1; /* Constant expression is reusable */ unsigned bSorterRef :1; /* Defer evaluation until after sorting */ + unsigned bNulls: 1; /* True if explicit "NULLS FIRST/LAST" */ union { struct { u16 iOrderByCol; /* For ORDER BY, column number in result set */ @@ -17305,6 +18052,13 @@ struct ExprList { } a[1]; /* One slot for each expression in the list */ }; +/* +** Allowed values for Expr.a.eEName +*/ +#define ENAME_NAME 0 /* The AS clause of a result set */ +#define ENAME_SPAN 1 /* Complete text of the result set expression */ +#define ENAME_TAB 2 /* "DB.TABLE.NAME" for the result set */ + /* ** An instance of this structure can hold a simple list of identifiers, ** such as the list "a,b,c" in the following statements: @@ -17368,6 +18122,7 @@ struct SrcList { unsigned isCorrelated :1; /* True if sub-query is correlated */ unsigned viaCoroutine :1; /* Implemented as a co-routine */ unsigned isRecursive :1; /* True for recursive reference in WITH */ + unsigned fromDDL :1; /* Comes from sqlite_master */ } fg; int iCursor; /* The VDBE cursor number used to access this table */ Expr *pOn; /* The ON clause of a join */ @@ -17458,7 +18213,7 @@ struct NameContext { NameContext *pNext; /* Next outer name context. NULL for outermost */ int nRef; /* Number of names resolved by this context */ int nErr; /* Number of errors encountered while resolving names */ - u16 ncFlags; /* Zero or more NC_* flags defined below */ + int ncFlags; /* Zero or more NC_* flags defined below */ Select *pWinSelect; /* SELECT statement for any window functions */ }; @@ -17466,23 +18221,29 @@ struct NameContext { ** Allowed values for the NameContext, ncFlags field. ** ** Value constraints (all checked via assert()): -** NC_HasAgg == SF_HasAgg +** NC_HasAgg == SF_HasAgg == EP_Agg ** NC_MinMaxAgg == SF_MinMaxAgg == SQLITE_FUNC_MINMAX -** -*/ -#define NC_AllowAgg 0x0001 /* Aggregate functions are allowed here */ -#define NC_PartIdx 0x0002 /* True if resolving a partial index WHERE */ -#define NC_IsCheck 0x0004 /* True if resolving names in a CHECK constraint */ -#define NC_InAggFunc 0x0008 /* True if analyzing arguments to an agg func */ -#define NC_HasAgg 0x0010 /* One or more aggregate functions seen */ -#define NC_IdxExpr 0x0020 /* True if resolving columns of CREATE INDEX */ -#define NC_VarSelect 0x0040 /* A correlated subquery has been seen */ -#define NC_UEList 0x0080 /* True if uNC.pEList is used */ -#define NC_UAggInfo 0x0100 /* True if uNC.pAggInfo is used */ -#define NC_UUpsert 0x0200 /* True if uNC.pUpsert is used */ -#define NC_MinMaxAgg 0x1000 /* min/max aggregates seen. See note above */ -#define NC_Complex 0x2000 /* True if a function or subquery seen */ -#define NC_AllowWin 0x4000 /* Window functions are allowed here */ +** NC_HasWin == EP_Win +** +*/ +#define NC_AllowAgg 0x00001 /* Aggregate functions are allowed here */ +#define NC_PartIdx 0x00002 /* True if resolving a partial index WHERE */ +#define NC_IsCheck 0x00004 /* True if resolving a CHECK constraint */ +#define NC_GenCol 0x00008 /* True for a GENERATED ALWAYS AS clause */ +#define NC_HasAgg 0x00010 /* One or more aggregate functions seen */ +#define NC_IdxExpr 0x00020 /* True if resolving columns of CREATE INDEX */ +#define NC_SelfRef 0x0002e /* Combo: PartIdx, isCheck, GenCol, and IdxExpr */ +#define NC_VarSelect 0x00040 /* A correlated subquery has been seen */ +#define NC_UEList 0x00080 /* True if uNC.pEList is used */ +#define NC_UAggInfo 0x00100 /* True if uNC.pAggInfo is used */ +#define NC_UUpsert 0x00200 /* True if uNC.pUpsert is used */ +#define NC_MinMaxAgg 0x01000 /* min/max aggregates seen. See note above */ +#define NC_Complex 0x02000 /* True if a function or subquery seen */ +#define NC_AllowWin 0x04000 /* Window functions are allowed here */ +#define NC_HasWin 0x08000 /* One or more window functions seen */ +#define NC_IsDDL 0x10000 /* Resolving names in a CREATE statement */ +#define NC_InAggFunc 0x20000 /* True if analyzing arguments to an agg func */ +#define NC_FromDDL 0x40000 /* SQL text comes from sqlite_master */ /* ** An instance of the following object describes a single ON CONFLICT @@ -17532,13 +18293,13 @@ struct Upsert { ** sequences for the ORDER BY clause. */ struct Select { - ExprList *pEList; /* The fields of the result */ u8 op; /* One of: TK_UNION TK_ALL TK_INTERSECT TK_EXCEPT */ LogEst nSelectRow; /* Estimated number of result rows */ u32 selFlags; /* Various SF_* values */ int iLimit, iOffset; /* Memory registers holding LIMIT & OFFSET counters */ u32 selId; /* Unique identifier number for this SELECT */ int addrOpenEphm[2]; /* OP_OpenEphem opcodes related to this select */ + ExprList *pEList; /* The fields of the result */ SrcList *pSrc; /* The FROM clause */ Expr *pWhere; /* The WHERE clause */ ExprList *pGroupBy; /* The GROUP BY clause */ @@ -17563,25 +18324,28 @@ struct Select { ** SF_MinMaxAgg == NC_MinMaxAgg == SQLITE_FUNC_MINMAX ** SF_FixedLimit == WHERE_USE_LIMIT */ -#define SF_Distinct 0x00001 /* Output should be DISTINCT */ -#define SF_All 0x00002 /* Includes the ALL keyword */ -#define SF_Resolved 0x00004 /* Identifiers have been resolved */ -#define SF_Aggregate 0x00008 /* Contains agg functions or a GROUP BY */ -#define SF_HasAgg 0x00010 /* Contains aggregate functions */ -#define SF_UsesEphemeral 0x00020 /* Uses the OpenEphemeral opcode */ -#define SF_Expanded 0x00040 /* sqlite3SelectExpand() called on this */ -#define SF_HasTypeInfo 0x00080 /* FROM subqueries have Table metadata */ -#define SF_Compound 0x00100 /* Part of a compound query */ -#define SF_Values 0x00200 /* Synthesized from VALUES clause */ -#define SF_MultiValue 0x00400 /* Single VALUES term with multiple rows */ -#define SF_NestedFrom 0x00800 /* Part of a parenthesized FROM clause */ -#define SF_MinMaxAgg 0x01000 /* Aggregate containing min() or max() */ -#define SF_Recursive 0x02000 /* The recursive part of a recursive CTE */ -#define SF_FixedLimit 0x04000 /* nSelectRow set by a constant LIMIT */ -#define SF_MaybeConvert 0x08000 /* Need convertCompoundSelectToSubquery() */ -#define SF_Converted 0x10000 /* By convertCompoundSelectToSubquery() */ -#define SF_IncludeHidden 0x20000 /* Include hidden columns in output */ -#define SF_ComplexResult 0x40000 /* Result contains subquery or function */ +#define SF_Distinct 0x0000001 /* Output should be DISTINCT */ +#define SF_All 0x0000002 /* Includes the ALL keyword */ +#define SF_Resolved 0x0000004 /* Identifiers have been resolved */ +#define SF_Aggregate 0x0000008 /* Contains agg functions or a GROUP BY */ +#define SF_HasAgg 0x0000010 /* Contains aggregate functions */ +#define SF_UsesEphemeral 0x0000020 /* Uses the OpenEphemeral opcode */ +#define SF_Expanded 0x0000040 /* sqlite3SelectExpand() called on this */ +#define SF_HasTypeInfo 0x0000080 /* FROM subqueries have Table metadata */ +#define SF_Compound 0x0000100 /* Part of a compound query */ +#define SF_Values 0x0000200 /* Synthesized from VALUES clause */ +#define SF_MultiValue 0x0000400 /* Single VALUES term with multiple rows */ +#define SF_NestedFrom 0x0000800 /* Part of a parenthesized FROM clause */ +#define SF_MinMaxAgg 0x0001000 /* Aggregate containing min() or max() */ +#define SF_Recursive 0x0002000 /* The recursive part of a recursive CTE */ +#define SF_FixedLimit 0x0004000 /* nSelectRow set by a constant LIMIT */ +#define SF_MaybeConvert 0x0008000 /* Need convertCompoundSelectToSubquery() */ +#define SF_Converted 0x0010000 /* By convertCompoundSelectToSubquery() */ +#define SF_IncludeHidden 0x0020000 /* Include hidden columns in output */ +#define SF_ComplexResult 0x0040000 /* Result contains subquery or function */ +#define SF_WhereBegin 0x0080000 /* Really a WhereBegin() call. Debug Only */ +#define SF_WinRewrite 0x0100000 /* Window function rewrite accomplished */ +#define SF_View 0x0200000 /* SELECT statement is a view */ /* ** The results of a SELECT can be distributed in several ways, as defined @@ -17770,16 +18534,17 @@ struct Parse { u8 hasCompound; /* Need to invoke convertCompoundSelectToSubquery() */ u8 okConstFactor; /* OK to factor out constants */ u8 disableLookaside; /* Number of times lookaside has been disabled */ + u8 disableVtab; /* Disable all virtual tables for this parse */ int nRangeReg; /* Size of the temporary register block */ int iRangeReg; /* First register in temporary register block */ int nErr; /* Number of errors seen */ int nTab; /* Number of previously allocated VDBE cursors */ int nMem; /* Number of memory cells used so far */ - int nOpAlloc; /* Number of slots allocated for Vdbe.aOp[] */ int szOpAlloc; /* Bytes of memory space allocated for Vdbe.aOp[] */ int iSelfTab; /* Table associated with an index on expr, or negative ** of the base register during check-constraint eval */ - int nLabel; /* Number of labels used */ + int nLabel; /* The *negative* of the number of labels used */ + int nLabelAlloc; /* Number of slots in aLabel */ int *aLabel; /* Space to hold the labels */ ExprList *pConstExpr;/* Constant expressions */ Token constraintName;/* Name of the constraint currently being parsed */ @@ -17796,6 +18561,7 @@ struct Parse { AutoincInfo *pAinc; /* Information about AUTOINCREMENT counters */ Parse *pToplevel; /* Parse structure for main program (or NULL) */ Table *pTriggerTab; /* Table triggers are being coded for */ + Parse *pParentParse; /* Parent parser if this parser is nested */ int addrCrTab; /* Address of OP_CreateBtree opcode on CREATE TABLE */ u32 nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ u32 oldmask; /* Mask of old.* columns referenced */ @@ -17839,7 +18605,9 @@ struct Parse { Vdbe *pReprepare; /* VM being reprepared (sqlite3Reprepare()) */ const char *zTail; /* All SQL text past the last semicolon parsed */ Table *pNewTable; /* A table being constructed by CREATE TABLE */ - Index *pNewIndex; /* An index being constructed by CREATE INDEX */ + Index *pNewIndex; /* An index being constructed by CREATE INDEX. + ** Also used to hold redundant UNIQUE constraints + ** during a RENAME COLUMN */ Trigger *pNewTrigger; /* Trigger under construct by a CREATE TRIGGER */ const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */ #ifndef SQLITE_OMIT_VIRTUALTABLE @@ -17857,8 +18625,8 @@ struct Parse { #define PARSE_MODE_NORMAL 0 #define PARSE_MODE_DECLARE_VTAB 1 -#define PARSE_MODE_RENAME_COLUMN 2 -#define PARSE_MODE_RENAME_TABLE 3 +#define PARSE_MODE_RENAME 2 +#define PARSE_MODE_UNMAP 3 /* ** Sizes and pointers of various parts of the Parse object. @@ -17880,7 +18648,7 @@ struct Parse { #if defined(SQLITE_OMIT_ALTERTABLE) #define IN_RENAME_OBJECT 0 #else - #define IN_RENAME_OBJECT (pParse->eParseMode>=PARSE_MODE_RENAME_COLUMN) + #define IN_RENAME_OBJECT (pParse->eParseMode>=PARSE_MODE_RENAME) #endif #if defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_OMIT_ALTERTABLE) @@ -17912,6 +18680,7 @@ struct AuthContext { */ #define OPFLAG_NCHANGE 0x01 /* OP_Insert: Set to update db->nChange */ /* Also used in P2 (not P5) of OP_Delete */ +#define OPFLAG_NOCHNG 0x01 /* OP_VColumn nochange for UPDATE */ #define OPFLAG_EPHEM 0x01 /* OP_Column: Ephemeral output is ok */ #define OPFLAG_LASTROWID 0x20 /* Set to update db->lastRowid */ #define OPFLAG_ISUPDATE 0x04 /* This OP_Insert is an sql UPDATE */ @@ -18030,7 +18799,7 @@ typedef struct DbFixer DbFixer; struct DbFixer { Parse *pParse; /* The parsing context. Error messages written here */ Schema *pSchema; /* Fix items to this schema */ - int bVarOnly; /* Check for variable references only */ + u8 bTemp; /* True for TEMP schema entries */ const char *zDb; /* Make sure all objects are contained in this database */ const char *zType; /* Type of the container - used for error messages */ const Token *pName; /* Name of the container - used for error messages */ @@ -18066,6 +18835,7 @@ typedef struct { int iDb; /* 0 for main database. 1 for TEMP, 2.. for ATTACHed */ int rc; /* Result code stored here */ u32 mInitFlags; /* Flags controlling error messages */ + u32 nInitRow; /* Number of rows processed */ } InitData; /* @@ -18080,11 +18850,12 @@ typedef struct { */ struct Sqlite3Config { int bMemstat; /* True to enable memory status */ - int bCoreMutex; /* True to enable core mutexing */ - int bFullMutex; /* True to enable full mutexing */ - int bOpenUri; /* True to interpret filenames as URIs */ - int bUseCis; /* Use covering indices for full-scans */ - int bSmallMalloc; /* Avoid large memory allocations if true */ + u8 bCoreMutex; /* True to enable core mutexing */ + u8 bFullMutex; /* True to enable full mutexing */ + u8 bOpenUri; /* True to interpret filenames as URIs */ + u8 bUseCis; /* Use covering indices for full-scans */ + u8 bSmallMalloc; /* Avoid large memory allocations if true */ + u8 bExtraSchemaChecks; /* Verify type,name,tbl_name in schema */ int mxStrlen; /* Maximum string length */ int neverCorrupt; /* Database is always well-formed */ int szLookaside; /* Default lookaside buffer size */ @@ -18126,12 +18897,16 @@ struct Sqlite3Config { void (*xVdbeBranch)(void*,unsigned iSrcLine,u8 eThis,u8 eMx); /* Callback */ void *pVdbeBranchArg; /* 1st argument */ #endif +#ifdef SQLITE_ENABLE_DESERIALIZE + sqlite3_int64 mxMemdbSize; /* Default max memdb size */ +#endif #ifndef SQLITE_UNTESTABLE int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ #endif int bLocaltimeFault; /* True to fail localtime() calls */ int iOnceResetThreshold; /* When to reset OP_Once counters */ u32 szSorterRef; /* Min size in bytes to use sorter-refs */ + unsigned int iPrngSeed; /* Alternative fixed seed for the PRNG */ }; /* @@ -18161,7 +18936,7 @@ struct Walker { int (*xSelectCallback)(Walker*,Select*); /* Callback for SELECTs */ void (*xSelectCallback2)(Walker*,Select*);/* Second callback for SELECTs */ int walkerDepth; /* Number of subqueries */ - u8 eCode; /* A small processing code */ + u16 eCode; /* A small processing code */ union { /* Extra data for callback */ NameContext *pNC; /* Naming context */ int n; /* A counter */ @@ -18177,6 +18952,7 @@ struct Walker { struct WindowRewrite *pRewrite; /* Window rewrite context */ struct WhereConst *pConst; /* WHERE clause constants */ struct RenameCtx *pRename; /* RENAME COLUMN context */ + struct Table *pTab; /* Table of generated column */ } u; }; @@ -18228,10 +19004,11 @@ struct TreeView { #endif /* SQLITE_DEBUG */ /* -** This object is used in varioius ways, all related to window functions +** This object is used in various ways, most (but not all) related to window +** functions. ** ** (1) A single instance of this structure is attached to the -** the Expr.pWin field for each window function in an expression tree. +** the Expr.y.pWin field for each window function in an expression tree. ** This object holds the information contained in the OVER clause, ** plus additional fields used during code generation. ** @@ -18242,40 +19019,54 @@ struct TreeView { ** (3) The terms of the WINDOW clause of a SELECT are instances of this ** object on a linked list attached to Select.pWinDefn. ** +** (4) For an aggregate function with a FILTER clause, an instance +** of this object is stored in Expr.y.pWin with eFrmType set to +** TK_FILTER. In this case the only field used is Window.pFilter. +** ** The uses (1) and (2) are really the same Window object that just happens -** to be accessible in two different ways. Use (3) is are separate objects. +** to be accessible in two different ways. Use case (3) are separate objects. */ struct Window { char *zName; /* Name of window (may be NULL) */ + char *zBase; /* Name of base window for chaining (may be NULL) */ ExprList *pPartition; /* PARTITION BY clause */ ExprList *pOrderBy; /* ORDER BY clause */ - u8 eType; /* TK_RANGE or TK_ROWS */ + u8 eFrmType; /* TK_RANGE, TK_GROUPS, TK_ROWS, or 0 */ u8 eStart; /* UNBOUNDED, CURRENT, PRECEDING or FOLLOWING */ u8 eEnd; /* UNBOUNDED, CURRENT, PRECEDING or FOLLOWING */ + u8 bImplicitFrame; /* True if frame was implicitly specified */ + u8 eExclude; /* TK_NO, TK_CURRENT, TK_TIES, TK_GROUP, or 0 */ Expr *pStart; /* Expression for " PRECEDING" */ Expr *pEnd; /* Expression for " FOLLOWING" */ + Window **ppThis; /* Pointer to this object in Select.pWin list */ Window *pNextWin; /* Next window function belonging to this SELECT */ Expr *pFilter; /* The FILTER expression */ FuncDef *pFunc; /* The function */ int iEphCsr; /* Partition buffer or Peer buffer */ - int regAccum; - int regResult; + int regAccum; /* Accumulator */ + int regResult; /* Interim result */ int csrApp; /* Function cursor (used by min/max) */ int regApp; /* Function register (also used by min/max) */ - int regPart; /* First in a set of registers holding PARTITION BY - ** and ORDER BY values for the window */ + int regPart; /* Array of registers for PARTITION BY values */ Expr *pOwner; /* Expression object this window is attached to */ int nBufferCol; /* Number of columns in buffer table */ int iArgCol; /* Offset of first argument for this function */ + int regOne; /* Register containing constant value 1 */ + int regStartRowid; + int regEndRowid; + u8 bExprArgs; /* Defer evaluation of window function arguments + ** due to the SQLITE_SUBTYPE flag */ }; #ifndef SQLITE_OMIT_WINDOWFUNC SQLITE_PRIVATE void sqlite3WindowDelete(sqlite3*, Window*); +SQLITE_PRIVATE void sqlite3WindowUnlinkFromSelect(Window*); SQLITE_PRIVATE void sqlite3WindowListDelete(sqlite3 *db, Window *p); -SQLITE_PRIVATE Window *sqlite3WindowAlloc(Parse*, int, int, Expr*, int , Expr*); +SQLITE_PRIVATE Window *sqlite3WindowAlloc(Parse*, int, int, Expr*, int , Expr*, u8); SQLITE_PRIVATE void sqlite3WindowAttach(Parse*, Expr*, Window*); -SQLITE_PRIVATE int sqlite3WindowCompare(Parse*, Window*, Window*); -SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse*, Window*); +SQLITE_PRIVATE void sqlite3WindowLink(Select *pSel, Window *pWin); +SQLITE_PRIVATE int sqlite3WindowCompare(Parse*, Window*, Window*, int); +SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse*, Select*); SQLITE_PRIVATE void sqlite3WindowCodeStep(Parse*, Select*, WhereInfo*, int, int); SQLITE_PRIVATE int sqlite3WindowRewrite(Parse*, Select*); SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse*, struct SrcList_item*); @@ -18283,6 +19074,8 @@ SQLITE_PRIVATE void sqlite3WindowUpdate(Parse*, Window*, Window*, FuncDef*); SQLITE_PRIVATE Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p); SQLITE_PRIVATE Window *sqlite3WindowListDup(sqlite3 *db, Window *p); SQLITE_PRIVATE void sqlite3WindowFunctions(void); +SQLITE_PRIVATE void sqlite3WindowChain(Parse*, Window*, Window*); +SQLITE_PRIVATE Window *sqlite3WindowAssemble(Parse*, Window*, ExprList*, ExprList*, Token*); #else # define sqlite3WindowDelete(a,b) # define sqlite3WindowFunctions() @@ -18383,6 +19176,7 @@ SQLITE_PRIVATE int sqlite3IsIdChar(u8); */ SQLITE_PRIVATE int sqlite3StrICmp(const char*,const char*); SQLITE_PRIVATE int sqlite3Strlen30(const char*); +#define sqlite3Strlen30NN(C) (strlen(C)&0x3fffffff) SQLITE_PRIVATE char *sqlite3ColumnType(Column*,char*); #define sqlite3StrNICmp sqlite3_strnicmp @@ -18471,8 +19265,12 @@ SQLITE_PRIVATE void sqlite3MutexWarnOnContention(sqlite3_mutex*); #endif #ifndef SQLITE_OMIT_FLOATING_POINT +# define EXP754 (((u64)0x7ff)<<52) +# define MAN754 ((((u64)1)<<52)-1) +# define IsNaN(X) (((X)&EXP754)==EXP754 && ((X)&MAN754)!=0) SQLITE_PRIVATE int sqlite3IsNaN(double); #else +# define IsNaN(X) 0 # define sqlite3IsNaN(X) 0 #endif @@ -18499,6 +19297,7 @@ SQLITE_PRIVATE void *sqlite3TestTextToPtr(const char*); SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView*, const Expr*, u8); SQLITE_PRIVATE void sqlite3TreeViewBareExprList(TreeView*, const ExprList*, const char*); SQLITE_PRIVATE void sqlite3TreeViewExprList(TreeView*, const ExprList*, u8, const char*); +SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView*, const SrcList*); SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView*, const Select*, u8); SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView*, const With*, u8); #ifndef SQLITE_OMIT_WINDOWFUNC @@ -18510,7 +19309,9 @@ SQLITE_PRIVATE void sqlite3TreeViewWinFunc(TreeView*, const Window*, u8); SQLITE_PRIVATE void sqlite3SetString(char **, sqlite3*, const char*); SQLITE_PRIVATE void sqlite3ErrorMsg(Parse*, const char*, ...); +SQLITE_PRIVATE int sqlite3ErrorToParser(sqlite3*,int); SQLITE_PRIVATE void sqlite3Dequote(char*); +SQLITE_PRIVATE void sqlite3DequoteExpr(Expr*); SQLITE_PRIVATE void sqlite3TokenInit(Token*,char*); SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char*, int); SQLITE_PRIVATE int sqlite3RunParser(Parse*, const char*, char **); @@ -18528,17 +19329,21 @@ SQLITE_PRIVATE Expr *sqlite3Expr(sqlite3*,int,const char*); SQLITE_PRIVATE void sqlite3ExprAttachSubtrees(sqlite3*,Expr*,Expr*,Expr*); SQLITE_PRIVATE Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*); SQLITE_PRIVATE void sqlite3PExprAddSelect(Parse*, Expr*, Select*); -SQLITE_PRIVATE Expr *sqlite3ExprAnd(sqlite3*,Expr*, Expr*); +SQLITE_PRIVATE Expr *sqlite3ExprAnd(Parse*,Expr*, Expr*); +SQLITE_PRIVATE Expr *sqlite3ExprSimplifiedAndOr(Expr*); SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse*,ExprList*, Token*, int); +SQLITE_PRIVATE void sqlite3ExprFunctionUsable(Parse*,Expr*,FuncDef*); SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse*, Expr*, u32); SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3*, Expr*); +SQLITE_PRIVATE void sqlite3ExprUnmapAndDelete(Parse*, Expr*); SQLITE_PRIVATE ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*); SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector(Parse*,ExprList*,IdList*,Expr*); -SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList*,int); +SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList*,int,int); SQLITE_PRIVATE void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int); SQLITE_PRIVATE void sqlite3ExprListSetSpan(Parse*,ExprList*,const char*,const char*); SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3*, ExprList*); SQLITE_PRIVATE u32 sqlite3ExprListFlags(const ExprList*); +SQLITE_PRIVATE int sqlite3IndexHasDuplicateRootPage(Index*); SQLITE_PRIVATE int sqlite3Init(sqlite3*, char**); SQLITE_PRIVATE int sqlite3InitCallback(void*, int, char**, char**); SQLITE_PRIVATE int sqlite3InitOne(sqlite3*, int, char**, u32); @@ -18552,11 +19357,18 @@ SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3*); SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3*); SQLITE_PRIVATE void sqlite3DeleteColumnNames(sqlite3*,Table*); SQLITE_PRIVATE int sqlite3ColumnsFromExprList(Parse*,ExprList*,i16*,Column**); -SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation(Parse*,Table*,Select*); -SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse*,Select*); +SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation(Parse*,Table*,Select*,char); +SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse*,Select*,char); SQLITE_PRIVATE void sqlite3OpenMasterTable(Parse *, int); SQLITE_PRIVATE Index *sqlite3PrimaryKeyIndex(Table*); -SQLITE_PRIVATE i16 sqlite3ColumnOfIndex(Index*, i16); +SQLITE_PRIVATE i16 sqlite3TableColumnToIndex(Index*, i16); +#ifdef SQLITE_OMIT_GENERATED_COLUMNS +# define sqlite3TableColumnToStorage(T,X) (X) /* No-op pass-through */ +# define sqlite3StorageColumnToTable(T,X) (X) /* No-op pass-through */ +#else +SQLITE_PRIVATE i16 sqlite3TableColumnToStorage(Table*, i16); +SQLITE_PRIVATE i16 sqlite3StorageColumnToTable(Table*, i16); +#endif SQLITE_PRIVATE void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int); #if SQLITE_ENABLE_HIDDEN_COLUMNS SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table*, Column*); @@ -18569,9 +19381,15 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey(Parse*, ExprList*, int, int, int); SQLITE_PRIVATE void sqlite3AddCheckConstraint(Parse*, Expr*); SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse*,Expr*,const char*,const char*); SQLITE_PRIVATE void sqlite3AddCollateType(Parse*, Token*); +SQLITE_PRIVATE void sqlite3AddGenerated(Parse*,Expr*,Token*); SQLITE_PRIVATE void sqlite3EndTable(Parse*,Token*,Token*,u8,Select*); SQLITE_PRIVATE int sqlite3ParseUri(const char*,const char*,unsigned int*, sqlite3_vfs**,char**,char **); +#ifdef SQLITE_HAS_CODEC +SQLITE_PRIVATE int sqlite3CodecQueryParameters(sqlite3*,const char*,const char*); +#else +# define sqlite3CodecQueryParameters(A,B,C) 0 +#endif SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3*,const char*); #ifdef SQLITE_UNTESTABLE @@ -18621,11 +19439,14 @@ SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse); # define sqlite3AutoincrementEnd(X) #endif SQLITE_PRIVATE void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int, Upsert*); +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +SQLITE_PRIVATE void sqlite3ComputeGeneratedColumns(Parse*, int, Table*); +#endif SQLITE_PRIVATE void *sqlite3ArrayAllocate(sqlite3*,void*,int,int*,int*); SQLITE_PRIVATE IdList *sqlite3IdListAppend(Parse*, IdList*, Token*); SQLITE_PRIVATE int sqlite3IdListIndex(IdList*,const char*); -SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge(sqlite3*, SrcList*, int, int); -SQLITE_PRIVATE SrcList *sqlite3SrcListAppend(sqlite3*, SrcList*, Token*, Token*); +SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge(Parse*, SrcList*, int, int); +SQLITE_PRIVATE SrcList *sqlite3SrcListAppend(Parse*, SrcList*, Token*, Token*); SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*, Token*, Select*, Expr*, IdList*); SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *, SrcList *, Token *); @@ -18643,6 +19464,7 @@ SQLITE_PRIVATE int sqlite3Select(Parse*, Select*, SelectDest*); SQLITE_PRIVATE Select *sqlite3SelectNew(Parse*,ExprList*,SrcList*,Expr*,ExprList*, Expr*,ExprList*,u32,Expr*); SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3*, Select*); +SQLITE_PRIVATE void sqlite3SelectReset(Parse*, Select*); SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse*, SrcList*); SQLITE_PRIVATE int sqlite3IsReadOnly(Parse*, Table*, int); SQLITE_PRIVATE void sqlite3OpenTable(Parse*, int iCur, int iDb, Table*, int); @@ -18665,17 +19487,20 @@ SQLITE_PRIVATE int sqlite3WhereOkOnePass(WhereInfo*, int*); #define ONEPASS_OFF 0 /* Use of ONEPASS not allowed */ #define ONEPASS_SINGLE 1 /* ONEPASS valid for a single row update */ #define ONEPASS_MULTI 2 /* ONEPASS is valid for multiple rows */ +SQLITE_PRIVATE int sqlite3WhereUsesDeferredSeek(WhereInfo*); SQLITE_PRIVATE void sqlite3ExprCodeLoadIndexColumn(Parse*, Index*, int, int, int); SQLITE_PRIVATE int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int, u8); SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int); SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse*, int, int, int); SQLITE_PRIVATE void sqlite3ExprCode(Parse*, Expr*, int); +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +SQLITE_PRIVATE void sqlite3ExprCodeGeneratedColumn(Parse*, Column*, int); +#endif SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse*, Expr*, int); SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse*, Expr*, int); SQLITE_PRIVATE int sqlite3ExprCodeAtInit(Parse*, Expr*, int); SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse*, Expr*, int*); SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse*, Expr*, int); -SQLITE_PRIVATE void sqlite3ExprCodeAndCache(Parse*, Expr*, int); SQLITE_PRIVATE int sqlite3ExprCodeExprList(Parse*, ExprList*, int, int, u8); #define SQLITE_ECEL_DUP 0x01 /* Deep, not shallow copies */ #define SQLITE_ECEL_FACTOR 0x02 /* Factor out constant terms */ @@ -18692,8 +19517,8 @@ SQLITE_PRIVATE Table *sqlite3LocateTableItem(Parse*,u32 flags,struct SrcList_ite SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3*,const char*, const char*); SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3*,int,const char*); SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*); -SQLITE_PRIVATE void sqlite3Vacuum(Parse*,Token*); -SQLITE_PRIVATE int sqlite3RunVacuum(char**, sqlite3*, int); +SQLITE_PRIVATE void sqlite3Vacuum(Parse*,Token*,Expr*); +SQLITE_PRIVATE int sqlite3RunVacuum(char**, sqlite3*, int, sqlite3_value*); SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3*, Token*); SQLITE_PRIVATE int sqlite3ExprCompare(Parse*,Expr*, Expr*, int); SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr*, Expr*, int); @@ -18717,6 +19542,7 @@ SQLITE_PRIVATE void sqlite3EndTransaction(Parse*,int); SQLITE_PRIVATE void sqlite3Savepoint(Parse*, int, Token*); SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *); SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3*); +SQLITE_PRIVATE u32 sqlite3IsTrueOrFalse(const char*); SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr*); SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr*); SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr*); @@ -18736,6 +19562,7 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int, int*, int); SQLITE_PRIVATE int sqlite3GenerateIndexKey(Parse*, Index*, int, int, int, int*,Index*,int); SQLITE_PRIVATE void sqlite3ResolvePartIdxLabel(Parse*,int); +SQLITE_PRIVATE int sqlite3ExprReferencesUpdatedColumn(Expr*,int*,int); SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(Parse*,Table*,int*,int,int,int,int, u8,u8,int,int*,int*,Upsert*); #ifdef SQLITE_ENABLE_NULL_TRIM @@ -18756,6 +19583,7 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3*,ExprList*,int); SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3*,SrcList*,int); SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3*,IdList*); SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3*,Select*,int); +SQLITE_PRIVATE FuncDef *sqlite3FunctionSearch(int,const char*); SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs(FuncDef*,int); SQLITE_PRIVATE FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,u8,u8); SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void); @@ -18810,6 +19638,7 @@ SQLITE_PRIVATE u32 sqlite3TriggerColmask(Parse*,Trigger*,ExprList*,int,int,Tab #endif SQLITE_PRIVATE int sqlite3JoinType(Parse*, Token*, Token*, Token*); +SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr*,int); SQLITE_PRIVATE void sqlite3CreateForeignKey(Parse*, ExprList*, Token*, ExprList*, int); SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse*, int); #ifndef SQLITE_OMIT_AUTHORIZATION @@ -18832,6 +19661,7 @@ SQLITE_PRIVATE int sqlite3FixSelect(DbFixer*, Select*); SQLITE_PRIVATE int sqlite3FixExpr(DbFixer*, Expr*); SQLITE_PRIVATE int sqlite3FixExprList(DbFixer*, ExprList*); SQLITE_PRIVATE int sqlite3FixTriggerStep(DbFixer*, TriggerStep*); +SQLITE_PRIVATE int sqlite3RealSameAsInt(double,sqlite3_int64); SQLITE_PRIVATE int sqlite3AtoF(const char *z, double*, int, u8); SQLITE_PRIVATE int sqlite3GetInt32(const char *, int*); SQLITE_PRIVATE int sqlite3Atoi(const char*); @@ -18846,7 +19676,7 @@ SQLITE_PRIVATE LogEst sqlite3LogEstAdd(LogEst,LogEst); SQLITE_PRIVATE LogEst sqlite3LogEstFromDouble(double); #endif #if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ - defined(SQLITE_ENABLE_STAT3_OR_STAT4) || \ + defined(SQLITE_ENABLE_STAT4) || \ defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst); #endif @@ -18912,8 +19742,10 @@ SQLITE_PRIVATE int sqlite3ExprCollSeqMatch(Parse*,Expr*,Expr*); SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken(Parse *pParse, Expr*, const Token*, int); SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(Parse*,Expr*,const char*); SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr*); +SQLITE_PRIVATE Expr *sqlite3ExprSkipCollateAndLikely(Expr*); SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *, CollSeq *); -SQLITE_PRIVATE int sqlite3CheckObjectName(Parse *, const char *); +SQLITE_PRIVATE int sqlite3WritableSchema(sqlite3*); +SQLITE_PRIVATE int sqlite3CheckObjectName(Parse*, const char*,const char*,const char*); SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *, int); SQLITE_PRIVATE int sqlite3AddInt64(i64*,i64); SQLITE_PRIVATE int sqlite3SubInt64(i64*,i64); @@ -18932,6 +19764,9 @@ SQLITE_PRIVATE void sqlite3ValueSetStr(sqlite3_value*, int, const void *,u8, void(*)(void*)); SQLITE_PRIVATE void sqlite3ValueSetNull(sqlite3_value*); SQLITE_PRIVATE void sqlite3ValueFree(sqlite3_value*); +#ifndef SQLITE_UNTESTABLE +SQLITE_PRIVATE void sqlite3ResultIntReal(sqlite3_context*); +#endif SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *); #ifndef SQLITE_OMIT_UTF16 SQLITE_PRIVATE char *sqlite3Utf16to8(sqlite3 *, const void*, int, u8); @@ -18943,7 +19778,6 @@ SQLITE_PRIVATE const unsigned char sqlite3OpcodeProperty[]; SQLITE_PRIVATE const char sqlite3StrBINARY[]; SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[]; SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[]; -SQLITE_PRIVATE const Token sqlite3IntTokens[]; SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config; SQLITE_PRIVATE FuncDefHash sqlite3BuiltinFunctions; #ifndef SQLITE_OMIT_WSD @@ -18961,14 +19795,20 @@ SQLITE_PRIVATE void sqlite3AlterRenameColumn(Parse*, SrcList*, Token*, Token*); SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *, int *); SQLITE_PRIVATE void sqlite3NestedParse(Parse*, const char*, ...); SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3*, int); -SQLITE_PRIVATE int sqlite3CodeSubselect(Parse*, Expr *, int, int); +SQLITE_PRIVATE void sqlite3CodeRhsOfIN(Parse*, Expr*, int); +SQLITE_PRIVATE int sqlite3CodeSubselect(Parse*, Expr*); SQLITE_PRIVATE void sqlite3SelectPrep(Parse*, Select*, NameContext*); SQLITE_PRIVATE void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p); -SQLITE_PRIVATE int sqlite3MatchSpanName(const char*, const char*, const char*, const char*); +SQLITE_PRIVATE int sqlite3MatchEName( + const struct ExprList_item*, + const char*, + const char*, + const char* +); SQLITE_PRIVATE int sqlite3ResolveExprNames(NameContext*, Expr*); SQLITE_PRIVATE int sqlite3ResolveExprListNames(NameContext*, ExprList*); SQLITE_PRIVATE void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*); -SQLITE_PRIVATE void sqlite3ResolveSelfReference(Parse*,Table*,int,Expr*,ExprList*); +SQLITE_PRIVATE int sqlite3ResolveSelfReference(Parse*,Table*,int,Expr*,ExprList*); SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy(Parse*, Select*, ExprList*, const char*); SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *, Table *, int, int); SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *, Token *); @@ -18996,6 +19836,7 @@ SQLITE_PRIVATE void sqlite3KeyInfoUnref(KeyInfo*); SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoRef(KeyInfo*); SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse*, Index*); SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoFromExprList(Parse*, ExprList*, int, int); +SQLITE_PRIVATE int sqlite3HasExplicitNulls(Parse*, ExprList*); #ifdef SQLITE_DEBUG SQLITE_PRIVATE int sqlite3KeyInfoIsWriteable(KeyInfo*); @@ -19028,8 +19869,7 @@ SQLITE_PRIVATE int sqlite3ExprCheckIN(Parse*, Expr*); # define sqlite3ExprCheckIN(x,y) SQLITE_OK #endif -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 -SQLITE_PRIVATE void sqlite3AnalyzeFunctions(void); +#ifdef SQLITE_ENABLE_STAT4 SQLITE_PRIVATE int sqlite3Stat4ProbeSetValue( Parse*,Index*,UnpackedRecord**,Expr*,int,int,int*); SQLITE_PRIVATE int sqlite3Stat4ValueFromExpr(Parse*, Expr*, u8, sqlite3_value**); @@ -19076,6 +19916,7 @@ SQLITE_PRIVATE int sqlite3Utf8To8(unsigned char*); # define sqlite3VtabInSync(db) 0 # define sqlite3VtabLock(X) # define sqlite3VtabUnlock(X) +# define sqlite3VtabModuleUnref(D,X) # define sqlite3VtabUnlockList(X) # define sqlite3VtabSavepoint(X, Y, Z) SQLITE_OK # define sqlite3GetVTable(X,Y) ((VTable*)0) @@ -19087,6 +19928,7 @@ SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3 *db); SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3 *db); SQLITE_PRIVATE void sqlite3VtabLock(VTable *); SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *); +SQLITE_PRIVATE void sqlite3VtabModuleUnref(sqlite3*,Module*); SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3*); SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *, int, int); SQLITE_PRIVATE void sqlite3VtabImportErrmsg(Vdbe*, sqlite3_vtab*); @@ -19100,6 +19942,12 @@ SQLITE_PRIVATE Module *sqlite3VtabCreateModule( ); # define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0) #endif +SQLITE_PRIVATE int sqlite3ReadOnlyShadowTables(sqlite3 *db); +#ifndef SQLITE_OMIT_VIRTUALTABLE +SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName); +#else +# define sqlite3ShadowTableName(A,B) 0 +#endif SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse*,Module*); SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3*,Module*); SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse*,Table*); @@ -19116,8 +19964,12 @@ SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*); SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int); SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *); SQLITE_PRIVATE void sqlite3ParserReset(Parse*); +#ifdef SQLITE_ENABLE_NORMALIZE +SQLITE_PRIVATE char *sqlite3Normalize(Vdbe*, const char*); +#endif SQLITE_PRIVATE int sqlite3Reprepare(Vdbe*); SQLITE_PRIVATE void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*); +SQLITE_PRIVATE CollSeq *sqlite3ExprCompareCollSeq(Parse*,Expr*); SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq(Parse *, Expr *, Expr *); SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3*); SQLITE_PRIVATE const char *sqlite3JournalModename(int); @@ -19210,7 +20062,7 @@ SQLITE_PRIVATE void sqlite3EndBenignMalloc(void); #define IN_INDEX_NOOP_OK 0x0001 /* OK to return IN_INDEX_NOOP */ #define IN_INDEX_MEMBERSHIP 0x0002 /* IN operator used for membership test */ #define IN_INDEX_LOOP 0x0004 /* IN operator used as a loop */ -SQLITE_PRIVATE int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*); +SQLITE_PRIVATE int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*, int*); SQLITE_PRIVATE int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int); SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *); @@ -19424,7 +20276,6 @@ SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[] = { ** non-ASCII UTF character. Hence the test for whether or not a character is ** part of an identifier is 0x46. */ -#ifdef SQLITE_ASCII SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 00..07 ........ */ 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, /* 08..0f ........ */ @@ -19462,7 +20313,6 @@ SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* f0..f7 ........ */ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40 /* f8..ff ........ */ }; -#endif /* EVIDENCE-OF: R-02982-34736 In order to maintain full backwards ** compatibility for legacy applications, the URI filename capability is @@ -19490,8 +20340,15 @@ SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { ** SQLITE_ALLOW_COVERING_INDEX_SCAN compile-time option, or is "on" if ** that compile-time option is omitted. */ -#ifndef SQLITE_ALLOW_COVERING_INDEX_SCAN +#if !defined(SQLITE_ALLOW_COVERING_INDEX_SCAN) # define SQLITE_ALLOW_COVERING_INDEX_SCAN 1 +#else +# if !SQLITE_ALLOW_COVERING_INDEX_SCAN +# error "Compile-time disabling of covering index scan using the\ + -DSQLITE_ALLOW_COVERING_INDEX_SCAN=0 option is deprecated.\ + Contact SQLite developers if this is a problem for you, and\ + delete this #error macro to continue with your build." +# endif #endif /* The minimum PMA size is set to this value multiplied by the database @@ -19520,12 +20377,28 @@ SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { ** changed as start-time using sqlite3_config(SQLITE_CONFIG_LOOKASIDE) ** or at run-time for an individual database connection using ** sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE); +** +** With the two-size-lookaside enhancement, less lookaside is required. +** The default configuration of 1200,40 actually provides 30 1200-byte slots +** and 93 128-byte slots, which is more lookaside than is available +** using the older 1200,100 configuration without two-size-lookaside. */ #ifndef SQLITE_DEFAULT_LOOKASIDE -# define SQLITE_DEFAULT_LOOKASIDE 1200,100 +# ifdef SQLITE_OMIT_TWOSIZE_LOOKASIDE +# define SQLITE_DEFAULT_LOOKASIDE 1200,100 /* 120KB of memory */ +# else +# define SQLITE_DEFAULT_LOOKASIDE 1200,40 /* 48KB of memory */ +# endif #endif +/* The default maximum size of an in-memory database created using +** sqlite3_deserialize() +*/ +#ifndef SQLITE_MEMDB_DEFAULT_MAXSIZE +# define SQLITE_MEMDB_DEFAULT_MAXSIZE 1073741824 +#endif + /* ** The following singleton contains the global configuration for ** the SQLite library. @@ -19537,6 +20410,7 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = { SQLITE_USE_URI, /* bOpenUri */ SQLITE_ALLOW_COVERING_INDEX_SCAN, /* bUseCis */ 0, /* bSmallMalloc */ + 1, /* bExtraSchemaChecks */ 0x7ffffffe, /* mxStrlen */ 0, /* neverCorrupt */ SQLITE_DEFAULT_LOOKASIDE, /* szLookaside, nLookaside */ @@ -19573,12 +20447,16 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = { 0, /* xVdbeBranch */ 0, /* pVbeBranchArg */ #endif +#ifdef SQLITE_ENABLE_DESERIALIZE + SQLITE_MEMDB_DEFAULT_MAXSIZE, /* mxMemdbSize */ +#endif #ifndef SQLITE_UNTESTABLE 0, /* xTestCallback */ #endif 0, /* bLocaltimeFault */ 0x7ffffffe, /* iOnceResetThreshold */ - SQLITE_DEFAULT_SORTERREF_SIZE /* szSorterRef */ + SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ + 0, /* iPrngSeed */ }; /* @@ -19588,14 +20466,6 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = { */ SQLITE_PRIVATE FuncDefHash sqlite3BuiltinFunctions; -/* -** Constant tokens for values 0 and 1. -*/ -SQLITE_PRIVATE const Token sqlite3IntTokens[] = { - { "0", 1 }, - { "1", 1 } -}; - #ifdef VDBE_PROFILE /* ** The following performance counter can be used in place of @@ -19907,12 +20777,12 @@ struct sqlite3_value { #define MEM_Int 0x0004 /* Value is an integer */ #define MEM_Real 0x0008 /* Value is a real number */ #define MEM_Blob 0x0010 /* Value is a BLOB */ -#define MEM_AffMask 0x001f /* Mask of affinity bits */ -/* Available 0x0020 */ -/* Available 0x0040 */ +#define MEM_IntReal 0x0020 /* MEM_Int that stringifies like MEM_Real */ +#define MEM_AffMask 0x003f /* Mask of affinity bits */ +#define MEM_FromBind 0x0040 /* Value originates from sqlite3_bind() */ #define MEM_Undefined 0x0080 /* Value is undefined */ #define MEM_Cleared 0x0100 /* NULL set by OP_Null, not from data */ -#define MEM_TypeMask 0xc1ff /* Mask of type bits */ +#define MEM_TypeMask 0xc1bf /* Mask of type bits */ /* Whenever Mem contains a valid string or blob representation, one of @@ -19944,6 +20814,13 @@ struct sqlite3_value { #define MemSetTypeFlag(p, f) \ ((p)->flags = ((p)->flags&~(MEM_TypeMask|MEM_Zero))|f) +/* +** True if Mem X is a NULL-nochng type. +*/ +#define MemNullNochng(X) \ + (((X)->flags&MEM_TypeMask)==(MEM_Null|MEM_Zero) \ + && (X)->n==0 && (X)->u.nZero==0) + /* ** Return true if a memory cell is not marked as invalid. This macro ** is for use inside assert() statements only. @@ -19997,6 +20874,9 @@ struct sqlite3_context { */ typedef unsigned bft; /* Bit Field Type */ +/* The ScanStatus object holds a single value for the +** sqlite3_stmt_scanstatus() interface. +*/ typedef struct ScanStatus ScanStatus; struct ScanStatus { int addrExplain; /* OP_Explain for loop */ @@ -20007,6 +20887,19 @@ struct ScanStatus { char *zName; /* Name of table or index */ }; +/* The DblquoteStr object holds the text of a double-quoted +** string for a prepared statement. A linked list of these objects +** is constructed during statement parsing and is held on Vdbe.pDblStr. +** When computing a normalized SQL statement for an SQL statement, that +** list is consulted for each double-quoted identifier to see if the +** identifier should really be a string literal. +*/ +typedef struct DblquoteStr DblquoteStr; +struct DblquoteStr { + DblquoteStr *pNextStr; /* Next string literal in the list */ + char z[8]; /* Dequoted value for the string */ +}; + /* ** An instance of the virtual machine. This structure contains the complete ** state of the virtual machine. @@ -20026,28 +20919,29 @@ struct Vdbe { int pc; /* The program counter */ int rc; /* Value to return */ int nChange; /* Number of db changes made since last reset */ - int iStatement; /* Statement number (or 0 if has not opened stmt) */ + int iStatement; /* Statement number (or 0 if has no opened stmt) */ i64 iCurrentTime; /* Value of julianday('now') for this statement */ i64 nFkConstraint; /* Number of imm. FK constraints this VM */ i64 nStmtDefCons; /* Number of def. constraints when stmt started */ i64 nStmtDefImmCons; /* Number of def. imm constraints when stmt started */ + Mem *aMem; /* The memory locations */ + Mem **apArg; /* Arguments to currently executing user function */ + VdbeCursor **apCsr; /* One element of this array for each open cursor */ + Mem *aVar; /* Values for the OP_Variable opcode. */ /* When allocating a new Vdbe object, all of the fields below should be ** initialized to zero or NULL */ Op *aOp; /* Space to hold the virtual machine's program */ - Mem *aMem; /* The memory locations */ - Mem **apArg; /* Arguments to currently executing user function */ + int nOp; /* Number of instructions in the program */ + int nOpAlloc; /* Slots allocated for aOp[] */ Mem *aColName; /* Column names to return */ Mem *pResultSet; /* Pointer to an array of results */ char *zErrMsg; /* Error message written here */ - VdbeCursor **apCsr; /* One element of this array for each open cursor */ - Mem *aVar; /* Values for the OP_Variable opcode. */ VList *pVList; /* Name of variables */ #ifndef SQLITE_OMIT_TRACE i64 startTime; /* Time when query started - used for profiling */ #endif - int nOp; /* Number of instructions in the program */ #ifdef SQLITE_DEBUG int rcApp; /* errcode set by sqlite3_result_error_code() */ u32 nWrite; /* Number of write operations that have occurred */ @@ -20068,6 +20962,10 @@ struct Vdbe { yDbMask lockMask; /* Subset of btreeMask that requires a lock */ u32 aCounter[7]; /* Counters used by sqlite3_stmt_status() */ char *zSql; /* Text of the SQL statement that generated this */ +#ifdef SQLITE_ENABLE_NORMALIZE + char *zNormSql; /* Normalization of the associated SQL statement */ + DblquoteStr *pDblStr; /* List of double-quoted string literals */ +#endif void *pFree; /* Free this when deleting the vdbe */ VdbeFrame *pFrame; /* Parent frame */ VdbeFrame *pDelFrame; /* List of frame objects to free on VM reset */ @@ -20117,11 +21015,11 @@ struct PreUpdate { SQLITE_PRIVATE void sqlite3VdbeError(Vdbe*, const char *, ...); SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*); void sqliteVdbePopStack(Vdbe*,int); +SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor*); SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor**, int*); SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor*); SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32); SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8); -SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem*, int, u32*); SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32); SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int); @@ -20130,7 +21028,9 @@ int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *); SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(sqlite3*,VdbeCursor*,UnpackedRecord*,int*); SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3*, BtCursor*, i64*); SQLITE_PRIVATE int sqlite3VdbeExec(Vdbe*); +#ifndef SQLITE_OMIT_EXPLAIN SQLITE_PRIVATE int sqlite3VdbeList(Vdbe*); +#endif SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe*); SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *, int); SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem*); @@ -20162,14 +21062,16 @@ SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem*, int ifNull); SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem*); SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem*); SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem*); -SQLITE_PRIVATE void sqlite3VdbeMemCast(Mem*,u8,u8); +SQLITE_PRIVATE int sqlite3VdbeMemCast(Mem*,u8,u8); SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(BtCursor*,u32,u32,Mem*); SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p); SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem*, FuncDef*); #ifndef SQLITE_OMIT_WINDOWFUNC SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem*, Mem*, FuncDef*); #endif +#ifndef SQLITE_OMIT_EXPLAIN SQLITE_PRIVATE const char *sqlite3OpcodeName(int); +#endif SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve); SQLITE_PRIVATE int sqlite3VdbeMemClearAndResize(Mem *pMem, int n); SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *, int); @@ -20226,7 +21128,7 @@ SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *, int); #ifdef SQLITE_DEBUG SQLITE_PRIVATE void sqlite3VdbePrintSql(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf); +SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, StrAccum *pStr); #endif #ifndef SQLITE_OMIT_UTF16 SQLITE_PRIVATE int sqlite3VdbeMemTranslate(Mem*, u8); @@ -20418,6 +21320,10 @@ static u32 countLookasideSlots(LookasideSlot *p){ SQLITE_PRIVATE int sqlite3LookasideUsed(sqlite3 *db, int *pHighwater){ u32 nInit = countLookasideSlots(db->lookaside.pInit); u32 nFree = countLookasideSlots(db->lookaside.pFree); +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + nInit += countLookasideSlots(db->lookaside.pSmallInit); + nFree += countLookasideSlots(db->lookaside.pSmallFree); +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ if( pHighwater ) *pHighwater = db->lookaside.nSlot - nInit; return db->lookaside.nSlot - (nInit+nFree); } @@ -20450,6 +21356,15 @@ SQLITE_API int sqlite3_db_status( db->lookaside.pInit = db->lookaside.pFree; db->lookaside.pFree = 0; } +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + p = db->lookaside.pSmallFree; + if( p ){ + while( p->pNext ) p = p->pNext; + p->pNext = db->lookaside.pSmallInit; + db->lookaside.pSmallInit = db->lookaside.pSmallFree; + db->lookaside.pSmallFree = 0; + } +#endif } break; } @@ -21001,7 +21916,7 @@ static int parseDateOrTime( return 0; }else if( sqlite3StrICmp(zDate,"now")==0 && sqlite3NotPureFunc(context) ){ return setDateTimeToCurrent(context, p); - }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8) ){ + }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8)>0 ){ setRawDateNumber(p, r); return 0; } @@ -21301,7 +22216,7 @@ static int parseModifier( r = p->s*1000.0 + 210866760000000.0; if( r>=0.0 && r<464269060800000.0 ){ clearYMD_HMS_TZ(p); - p->iJD = (sqlite3_int64)r; + p->iJD = (sqlite3_int64)(r + 0.5); p->validJD = 1; p->rawS = 0; rc = 0; @@ -21335,7 +22250,7 @@ static int parseModifier( ** date is already on the appropriate weekday, this is a no-op. */ if( sqlite3_strnicmp(z, "weekday ", 8)==0 - && sqlite3AtoF(&z[8], &r, sqlite3Strlen30(&z[8]), SQLITE_UTF8) + && sqlite3AtoF(&z[8], &r, sqlite3Strlen30(&z[8]), SQLITE_UTF8)>0 && (n=(int)r)==r && n>=0 && r<7 ){ sqlite3_int64 Z; computeYMD_HMS(p); @@ -21394,7 +22309,7 @@ static int parseModifier( double rRounder; int i; for(n=1; z[n] && z[n]!=':' && !sqlite3Isspace(z[n]); n++){} - if( !sqlite3AtoF(z, &r, n, SQLITE_UTF8) ){ + if( sqlite3AtoF(z, &r, n, SQLITE_UTF8)<=0 ){ rc = 1; break; } @@ -22080,7 +22995,7 @@ SQLITE_PRIVATE int sqlite3OsOpen( ** down into the VFS layer. Some SQLITE_OPEN_ flags (for example, ** SQLITE_OPEN_FULLMUTEX or SQLITE_OPEN_SHAREDCACHE) are blocked before ** reaching the VFS. */ - rc = pVfs->xOpen(pVfs, zPath, pFile, flags & 0x87f7f, pFlagsOut); + rc = pVfs->xOpen(pVfs, zPath, pFile, flags & 0x1087f7f, pFlagsOut); assert( rc==SQLITE_OK || pFile->pMethods==0 ); return rc; } @@ -22123,7 +23038,15 @@ SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *pVfs, void *pHandle){ } #endif /* SQLITE_OMIT_LOAD_EXTENSION */ SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ - return pVfs->xRandomness(pVfs, nByte, zBufOut); + if( sqlite3Config.iPrngSeed ){ + memset(zBufOut, 0, nByte); + if( ALWAYS(nByte>(signed)sizeof(unsigned)) ) nByte = sizeof(unsigned int); + memcpy(zBufOut, &sqlite3Config.iPrngSeed, nByte); + return SQLITE_OK; + }else{ + return pVfs->xRandomness(pVfs, nByte, zBufOut); + } + } SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *pVfs, int nMicro){ return pVfs->xSleep(pVfs, nMicro); @@ -25590,7 +26513,7 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ ****************************************************************************** ** ** This file contains inline asm code for retrieving "high-performance" -** counters for x86 class CPUs. +** counters for x86 and x86_64 class CPUs. */ #ifndef SQLITE_HWTIME_H #define SQLITE_HWTIME_H @@ -25601,8 +26524,9 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ ** processor and returns that value. This can be used for high-res ** profiling. */ -#if (defined(__GNUC__) || defined(_MSC_VER)) && \ - (defined(i386) || defined(__i386__) || defined(_M_IX86)) +#if !defined(__STRICT_ANSI__) && \ + (defined(__GNUC__) || defined(_MSC_VER)) && \ + (defined(i386) || defined(__i386__) || defined(_M_IX86)) #if defined(__GNUC__) @@ -25623,7 +26547,7 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ #endif -#elif (defined(__GNUC__) && defined(__x86_64__)) +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__)) __inline__ sqlite_uint64 sqlite3Hwtime(void){ unsigned long val; @@ -25631,7 +26555,7 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ return val; } -#elif (defined(__GNUC__) && defined(__ppc__)) +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__)) __inline__ sqlite_uint64 sqlite3Hwtime(void){ unsigned long long retval; @@ -25648,14 +26572,13 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ #else - #error Need implementation of sqlite3Hwtime() for your platform. - /* - ** To compile without implementing sqlite3Hwtime() for your platform, - ** you can remove the above #error and use the following - ** stub function. You will lose timing support for many - ** of the debugging and testing utilities, but it should at - ** least compile and run. + ** asm() is needed for hardware timing support. Without asm(), + ** disable the sqlite3Hwtime() routine. + ** + ** sqlite3Hwtime() is only used for some obscure debugging + ** and analysis configurations, not in any deliverable, so this + ** should not be a great loss. */ SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } @@ -26239,19 +27162,27 @@ SQLITE_API int sqlite3_release_memory(int n){ #endif } +/* +** Default value of the hard heap limit. 0 means "no limit". +*/ +#ifndef SQLITE_MAX_MEMORY +# define SQLITE_MAX_MEMORY 0 +#endif + /* ** State information local to the memory allocation subsystem. */ static SQLITE_WSD struct Mem0Global { sqlite3_mutex *mutex; /* Mutex to serialize access */ sqlite3_int64 alarmThreshold; /* The soft heap limit */ + sqlite3_int64 hardLimit; /* The hard upper bound on memory */ /* ** True if heap is nearly "full" where "full" is defined by the ** sqlite3_soft_heap_limit() setting. */ int nearlyFull; -} mem0 = { 0, 0, 0 }; +} mem0 = { 0, SQLITE_MAX_MEMORY, SQLITE_MAX_MEMORY, 0 }; #define mem0 GLOBAL(struct Mem0Global, mem0) @@ -26281,8 +27212,15 @@ SQLITE_API int sqlite3_memory_alarm( #endif /* -** Set the soft heap-size limit for the library. Passing a zero or -** negative value indicates no limit. +** Set the soft heap-size limit for the library. An argument of +** zero disables the limit. A negative argument is a no-op used to +** obtain the return value. +** +** The return value is the value of the heap limit just before this +** interface was called. +** +** If the hard heap limit is enabled, then the soft heap limit cannot +** be disabled nor raised above the hard heap limit. */ SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 n){ sqlite3_int64 priorLimit; @@ -26298,6 +27236,9 @@ SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 n){ sqlite3_mutex_leave(mem0.mutex); return priorLimit; } + if( mem0.hardLimit>0 && (n>mem0.hardLimit || n==0) ){ + n = mem0.hardLimit; + } mem0.alarmThreshold = n; nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); mem0.nearlyFull = (n>0 && n<=nUsed); @@ -26311,6 +27252,37 @@ SQLITE_API void sqlite3_soft_heap_limit(int n){ sqlite3_soft_heap_limit64(n); } +/* +** Set the hard heap-size limit for the library. An argument of zero +** disables the hard heap limit. A negative argument is a no-op used +** to obtain the return value without affecting the hard heap limit. +** +** The return value is the value of the hard heap limit just prior to +** calling this interface. +** +** Setting the hard heap limit will also activate the soft heap limit +** and constrain the soft heap limit to be no more than the hard heap +** limit. +*/ +SQLITE_API sqlite3_int64 sqlite3_hard_heap_limit64(sqlite3_int64 n){ + sqlite3_int64 priorLimit; +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return -1; +#endif + sqlite3_mutex_enter(mem0.mutex); + priorLimit = mem0.hardLimit; + if( n>=0 ){ + mem0.hardLimit = n; + if( nSQLITE_MAX_MEMORY ){ - *pp = 0; - return; - } -#endif - sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, n); if( mem0.alarmThreshold>0 ){ sqlite3_int64 nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); if( nUsed >= mem0.alarmThreshold - nFull ){ mem0.nearlyFull = 1; sqlite3MallocAlarm(nFull); + if( mem0.hardLimit ){ + nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); + if( nUsed >= mem0.hardLimit - nFull ){ + *pp = 0; + return; + } + } }else{ mem0.nearlyFull = 0; } @@ -26490,10 +27462,17 @@ SQLITE_PRIVATE int sqlite3MallocSize(void *p){ assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); return sqlite3GlobalConfig.m.xSize(p); } +static int lookasideMallocSize(sqlite3 *db, void *p){ +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + return plookaside.pMiddle ? db->lookaside.szTrue : LOOKASIDE_SMALL; +#else + return db->lookaside.szTrue; +#endif +} SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, void *p){ assert( p!=0 ); - if( db==0 || !isLookaside(db,p) ){ #ifdef SQLITE_DEBUG + if( db==0 || !isLookaside(db,p) ){ if( db==0 ){ assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); @@ -26501,12 +27480,23 @@ SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, void *p){ assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); } + } #endif - return sqlite3GlobalConfig.m.xSize(p); - }else{ - assert( sqlite3_mutex_held(db->mutex) ); - return db->lookaside.sz; + if( db ){ + if( ((uptr)p)<(uptr)(db->lookaside.pEnd) ){ +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + if( ((uptr)p)>=(uptr)(db->lookaside.pMiddle) ){ + assert( sqlite3_mutex_held(db->mutex) ); + return LOOKASIDE_SMALL; + } +#endif + if( ((uptr)p)>=(uptr)(db->lookaside.pStart) ){ + assert( sqlite3_mutex_held(db->mutex) ); + return db->lookaside.szTrue; + } + } } + return sqlite3GlobalConfig.m.xSize(p); } SQLITE_API sqlite3_uint64 sqlite3_msize(void *p){ assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); @@ -26553,15 +27543,27 @@ SQLITE_PRIVATE void sqlite3DbFreeNN(sqlite3 *db, void *p){ measureAllocationSize(db, p); return; } - if( isLookaside(db, p) ){ - LookasideSlot *pBuf = (LookasideSlot*)p; + if( ((uptr)p)<(uptr)(db->lookaside.pEnd) ){ +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + if( ((uptr)p)>=(uptr)(db->lookaside.pMiddle) ){ + LookasideSlot *pBuf = (LookasideSlot*)p; #ifdef SQLITE_DEBUG - /* Trash all content in the buffer being freed */ - memset(p, 0xaa, db->lookaside.sz); + memset(p, 0xaa, LOOKASIDE_SMALL); /* Trash freed content */ #endif - pBuf->pNext = db->lookaside.pFree; - db->lookaside.pFree = pBuf; - return; + pBuf->pNext = db->lookaside.pSmallFree; + db->lookaside.pSmallFree = pBuf; + return; + } +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ + if( ((uptr)p)>=(uptr)(db->lookaside.pStart) ){ + LookasideSlot *pBuf = (LookasideSlot*)p; +#ifdef SQLITE_DEBUG + memset(p, 0xaa, db->lookaside.szTrue); /* Trash freed content */ +#endif + pBuf->pNext = db->lookaside.pFree; + db->lookaside.pFree = pBuf; + return; + } } } assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); @@ -26717,23 +27719,37 @@ SQLITE_PRIVATE void *sqlite3DbMallocRawNN(sqlite3 *db, u64 n){ assert( db!=0 ); assert( sqlite3_mutex_held(db->mutex) ); assert( db->pnBytesFreed==0 ); - if( db->lookaside.bDisable==0 ){ - assert( db->mallocFailed==0 ); - if( n>db->lookaside.sz ){ - db->lookaside.anStat[1]++; - }else if( (pBuf = db->lookaside.pFree)!=0 ){ - db->lookaside.pFree = pBuf->pNext; + if( n>db->lookaside.sz ){ + if( !db->lookaside.bDisable ){ + db->lookaside.anStat[1]++; + }else if( db->mallocFailed ){ + return 0; + } + return dbMallocRawFinish(db, n); + } +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + if( n<=LOOKASIDE_SMALL ){ + if( (pBuf = db->lookaside.pSmallFree)!=0 ){ + db->lookaside.pSmallFree = pBuf->pNext; db->lookaside.anStat[0]++; return (void*)pBuf; - }else if( (pBuf = db->lookaside.pInit)!=0 ){ - db->lookaside.pInit = pBuf->pNext; + }else if( (pBuf = db->lookaside.pSmallInit)!=0 ){ + db->lookaside.pSmallInit = pBuf->pNext; db->lookaside.anStat[0]++; return (void*)pBuf; - }else{ - db->lookaside.anStat[2]++; } - }else if( db->mallocFailed ){ - return 0; + } +#endif + if( (pBuf = db->lookaside.pFree)!=0 ){ + db->lookaside.pFree = pBuf->pNext; + db->lookaside.anStat[0]++; + return (void*)pBuf; + }else if( (pBuf = db->lookaside.pInit)!=0 ){ + db->lookaside.pInit = pBuf->pNext; + db->lookaside.anStat[0]++; + return (void*)pBuf; + }else{ + db->lookaside.anStat[2]++; } #else assert( db!=0 ); @@ -26757,7 +27773,16 @@ SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *db, void *p, u64 n){ assert( db!=0 ); if( p==0 ) return sqlite3DbMallocRawNN(db, n); assert( sqlite3_mutex_held(db->mutex) ); - if( isLookaside(db,p) && n<=db->lookaside.sz ) return p; + if( ((uptr)p)<(uptr)db->lookaside.pEnd ){ +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + if( ((uptr)p)>=(uptr)db->lookaside.pMiddle ){ + if( n<=LOOKASIDE_SMALL ) return p; + }else +#endif + if( ((uptr)p)>=(uptr)db->lookaside.pStart ){ + if( n<=db->lookaside.szTrue ) return p; + } + } return dbReallocFinish(db, p, n); } static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n){ @@ -26768,7 +27793,7 @@ static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n){ if( isLookaside(db, p) ){ pNew = sqlite3DbMallocRawNN(db, n); if( pNew ){ - memcpy(pNew, p, db->lookaside.sz); + memcpy(pNew, p, lookasideMallocSize(db, p)); sqlite3DbFree(db, p); } }else{ @@ -26867,7 +27892,10 @@ SQLITE_PRIVATE void sqlite3OomFault(sqlite3 *db){ if( db->nVdbeExec>0 ){ db->u1.isInterrupted = 1; } - db->lookaside.bDisable++; + DisableLookaside; + if( db->pParse ){ + db->pParse->rc = SQLITE_NOMEM_BKPT; + } } } @@ -26883,7 +27911,7 @@ SQLITE_PRIVATE void sqlite3OomClear(sqlite3 *db){ db->mallocFailed = 0; db->u1.isInterrupted = 0; assert( db->lookaside.bDisable>0 ); - db->lookaside.bDisable--; + EnableLookaside; } } @@ -27024,6 +28052,12 @@ static const et_info fmtinfo[] = { { 'r', 10, 1, etORDINAL, 0, 0 }, }; +/* Floating point constants used for rounding */ +static const double arRound[] = { + 5.0e-01, 5.0e-02, 5.0e-03, 5.0e-04, 5.0e-05, + 5.0e-06, 5.0e-07, 5.0e-08, 5.0e-09, 5.0e-10, +}; + /* ** If SQLITE_OMIT_FLOATING_POINT is defined, then none of the floating point ** conversions will work. @@ -27061,7 +28095,8 @@ static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){ static void setStrAccumError(StrAccum *p, u8 eError){ assert( eError==SQLITE_NOMEM || eError==SQLITE_TOOBIG ); p->accError = eError; - p->nAlloc = 0; + if( p->mxAlloc ) sqlite3_str_reset(p); + if( eError==SQLITE_TOOBIG ) sqlite3ErrorToParser(p->db, eError); } /* @@ -27080,6 +28115,28 @@ static char *getTextArg(PrintfArguments *p){ return (char*)sqlite3_value_text(p->apArg[p->nUsed++]); } +/* +** Allocate memory for a temporary buffer needed for printf rendering. +** +** If the requested size of the temp buffer is larger than the size +** of the output buffer in pAccum, then cause an SQLITE_TOOBIG error. +** Do the size check before the memory allocation to prevent rogue +** SQL from requesting large allocations using the precision or width +** field of the printf() function. +*/ +static char *printfTempBuf(sqlite3_str *pAccum, sqlite3_int64 n){ + char *z; + if( pAccum->accError ) return 0; + if( n>pAccum->nAlloc && n>pAccum->mxAlloc ){ + setStrAccumError(pAccum, SQLITE_TOOBIG); + return 0; + } + z = sqlite3DbMallocRaw(pAccum->db, n); + if( z==0 ){ + setStrAccumError(pAccum, SQLITE_NOMEM); + } + return z; +} /* ** On machines with a small stack size, you can redefine the @@ -27162,6 +28219,9 @@ SQLITE_API void sqlite3_str_vappendf( flag_leftjustify = flag_prefix = cThousand = flag_alternateform = flag_altform2 = flag_zeropad = 0; done = 0; + width = 0; + flag_long = 0; + precision = -1; do{ switch( c ){ case '-': flag_leftjustify = 1; break; @@ -27172,80 +28232,93 @@ SQLITE_API void sqlite3_str_vappendf( case '0': flag_zeropad = 1; break; case ',': cThousand = ','; break; default: done = 1; break; - } - }while( !done && (c=(*++fmt))!=0 ); - /* Get the field width */ - if( c=='*' ){ - if( bArgList ){ - width = (int)getIntArg(pArgList); - }else{ - width = va_arg(ap,int); - } - if( width<0 ){ - flag_leftjustify = 1; - width = width >= -2147483647 ? -width : 0; - } - c = *++fmt; - }else{ - unsigned wx = 0; - while( c>='0' && c<='9' ){ - wx = wx*10 + c - '0'; - c = *++fmt; - } - testcase( wx>0x7fffffff ); - width = wx & 0x7fffffff; - } - assert( width>=0 ); + case 'l': { + flag_long = 1; + c = *++fmt; + if( c=='l' ){ + c = *++fmt; + flag_long = 2; + } + done = 1; + break; + } + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': { + unsigned wx = c - '0'; + while( (c = *++fmt)>='0' && c<='9' ){ + wx = wx*10 + c - '0'; + } + testcase( wx>0x7fffffff ); + width = wx & 0x7fffffff; #ifdef SQLITE_PRINTF_PRECISION_LIMIT - if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ - width = SQLITE_PRINTF_PRECISION_LIMIT; - } + if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + width = SQLITE_PRINTF_PRECISION_LIMIT; + } #endif - - /* Get the precision */ - if( c=='.' ){ - c = *++fmt; - if( c=='*' ){ - if( bArgList ){ - precision = (int)getIntArg(pArgList); - }else{ - precision = va_arg(ap,int); + if( c!='.' && c!='l' ){ + done = 1; + }else{ + fmt--; + } + break; } - c = *++fmt; - if( precision<0 ){ - precision = precision >= -2147483647 ? -precision : -1; + case '*': { + if( bArgList ){ + width = (int)getIntArg(pArgList); + }else{ + width = va_arg(ap,int); + } + if( width<0 ){ + flag_leftjustify = 1; + width = width >= -2147483647 ? -width : 0; + } +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + width = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + if( (c = fmt[1])!='.' && c!='l' ){ + c = *++fmt; + done = 1; + } + break; } - }else{ - unsigned px = 0; - while( c>='0' && c<='9' ){ - px = px*10 + c - '0'; + case '.': { c = *++fmt; - } - testcase( px>0x7fffffff ); - precision = px & 0x7fffffff; - } - }else{ - precision = -1; - } - assert( precision>=(-1) ); + if( c=='*' ){ + if( bArgList ){ + precision = (int)getIntArg(pArgList); + }else{ + precision = va_arg(ap,int); + } + if( precision<0 ){ + precision = precision >= -2147483647 ? -precision : -1; + } + c = *++fmt; + }else{ + unsigned px = 0; + while( c>='0' && c<='9' ){ + px = px*10 + c - '0'; + c = *++fmt; + } + testcase( px>0x7fffffff ); + precision = px & 0x7fffffff; + } #ifdef SQLITE_PRINTF_PRECISION_LIMIT - if( precision>SQLITE_PRINTF_PRECISION_LIMIT ){ - precision = SQLITE_PRINTF_PRECISION_LIMIT; - } + if( precision>SQLITE_PRINTF_PRECISION_LIMIT ){ + precision = SQLITE_PRINTF_PRECISION_LIMIT; + } #endif - - - /* Get the conversion type modifier */ - if( c=='l' ){ - flag_long = 1; - c = *++fmt; - if( c=='l' ){ - flag_long = 2; - c = *++fmt; + if( c=='l' ){ + --fmt; + }else{ + done = 1; + } + break; + } } - }else{ - flag_long = 0; - } + }while( !done && (c=(*++fmt))!=0 ); + /* Fetch the info entry for the field */ infop = &fmtinfo[0]; xtype = etINVALID; @@ -27330,12 +28403,11 @@ SQLITE_API void sqlite3_str_vappendf( nOut = etBUFSIZE; zOut = buf; }else{ - u64 n = (u64)precision + 10 + precision/3; - zOut = zExtra = sqlite3Malloc( n ); - if( zOut==0 ){ - setStrAccumError(pAccum, SQLITE_NOMEM); - return; - } + u64 n; + n = (u64)precision + 10; + if( cThousand ) n += precision/3; + zOut = zExtra = printfTempBuf(pAccum, n); + if( zOut==0 ) return; nOut = (int)n; } bufpt = &zOut[nOut-1]; @@ -27404,8 +28476,18 @@ SQLITE_API void sqlite3_str_vappendf( } if( xtype==etGENERIC && precision>0 ) precision--; testcase( precision>0xfff ); - for(idx=precision&0xfff, rounder=0.5; idx>0; idx--, rounder*=0.1){} - if( xtype==etFLOAT ) realvalue += rounder; + idx = precision & 0xfff; + rounder = arRound[idx%10]; + while( idx>=10 ){ rounder *= 1.0e-10; idx -= 10; } + if( xtype==etFLOAT ){ + double rx = (double)realvalue; + sqlite3_uint64 u; + int ex; + memcpy(&u, &rx, sizeof(u)); + ex = -1023 + (int)((u>>52)&0x7ff); + if( precision+(ex/3) < 15 ) rounder += realvalue*3e-16; + realvalue += rounder; + } /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */ exp = 0; if( sqlite3IsNaN((double)realvalue) ){ @@ -27454,12 +28536,12 @@ SQLITE_API void sqlite3_str_vappendf( }else{ e2 = exp; } - if( MAX(e2,0)+(i64)precision+(i64)width > etBUFSIZE - 15 ){ - bufpt = zExtra - = sqlite3Malloc( MAX(e2,0)+(i64)precision+(i64)width+15 ); - if( bufpt==0 ){ - setStrAccumError(pAccum, SQLITE_NOMEM); - return; + { + i64 szBufNeeded; /* Size of a temporary buffer needed */ + szBufNeeded = MAX(e2,0)+(i64)precision+(i64)width+15; + if( szBufNeeded > etBUFSIZE ){ + bufpt = zExtra = printfTempBuf(pAccum, szBufNeeded); + if( bufpt==0 ) return; } } zOut = bufpt; @@ -27683,11 +28765,8 @@ SQLITE_API void sqlite3_str_vappendf( needQuote = !isnull && xtype==etSQLESCAPE2; n += i + 3; if( n>etBUFSIZE ){ - bufpt = zExtra = sqlite3Malloc( n ); - if( bufpt==0 ){ - setStrAccumError(pAccum, SQLITE_NOMEM); - return; - } + bufpt = zExtra = printfTempBuf(pAccum, n); + if( bufpt==0 ) return; }else{ bufpt = buf; } @@ -27777,9 +28856,8 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){ return 0; } if( p->mxAlloc==0 ){ - N = p->nAlloc - p->nChar - 1; setStrAccumError(p, SQLITE_TOOBIG); - return N; + return p->nAlloc - p->nChar - 1; }else{ char *zOld = isMalloced(p) ? p->zText : 0; i64 szNew = p->nChar; @@ -27851,7 +28929,7 @@ SQLITE_API void sqlite3_str_append(sqlite3_str *p, const char *z, int N){ assert( z!=0 || N==0 ); assert( p->zText!=0 || p->nChar==0 || p->accError ); assert( N>=0 ); - assert( p->accError==0 || p->nAlloc==0 ); + assert( p->accError==0 || p->nAlloc==0 || p->mxAlloc==0 ); if( p->nChar+N >= p->nAlloc ){ enlargeAndAppend(p,z,N); }else if( N ){ @@ -28241,7 +29319,7 @@ static void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ va_start(ap, zFormat); sqlite3_str_vappendf(&acc, zFormat, ap); va_end(ap); - assert( acc.nChar>0 ); + assert( acc.nChar>0 || acc.accError ); sqlite3_str_append(&acc, "\n", 1); } sqlite3StrAccumFinish(&acc); @@ -28281,7 +29359,7 @@ SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 m char cSep = '('; int j; for(j=0; jpCols->nExpr; j++){ - sqlite3_str_appendf(&x, "%c%s", cSep, pCte->pCols->a[j].zName); + sqlite3_str_appendf(&x, "%c%s", cSep, pCte->pCols->a[j].zEName); cSep = ','; } sqlite3_str_appendf(&x, ")"); @@ -28296,6 +29374,46 @@ SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 m } } +/* +** Generate a human-readable description of a SrcList object. +*/ +SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ + int i; + for(i=0; inSrc; i++){ + const struct SrcList_item *pItem = &pSrc->a[i]; + StrAccum x; + char zLine[100]; + sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); + sqlite3_str_appendf(&x, "{%d:*}", pItem->iCursor); + if( pItem->zDatabase ){ + sqlite3_str_appendf(&x, " %s.%s", pItem->zDatabase, pItem->zName); + }else if( pItem->zName ){ + sqlite3_str_appendf(&x, " %s", pItem->zName); + } + if( pItem->pTab ){ + sqlite3_str_appendf(&x, " tab=%Q nCol=%d ptr=%p", + pItem->pTab->zName, pItem->pTab->nCol, pItem->pTab); + } + if( pItem->zAlias ){ + sqlite3_str_appendf(&x, " (AS %s)", pItem->zAlias); + } + if( pItem->fg.jointype & JT_LEFT ){ + sqlite3_str_appendf(&x, " LEFT-JOIN"); + } + if( pItem->fg.fromDDL ){ + sqlite3_str_appendf(&x, " DDL"); + } + sqlite3StrAccumFinish(&x); + sqlite3TreeViewItem(pView, zLine, inSrc-1); + if( pItem->pSelect ){ + sqlite3TreeViewSelect(pView, pItem->pSelect, 0); + } + if( pItem->fg.isTabFunc ){ + sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:"); + } + sqlite3TreeViewPop(pView); + } +} /* ** Generate a human-readable description of a Select object. @@ -28314,13 +29432,17 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m sqlite3TreeViewPush(pView, 1); } do{ - sqlite3TreeViewLine(pView, - "SELECT%s%s (%u/%p) selFlags=0x%x nSelectRow=%d", - ((p->selFlags & SF_Distinct) ? " DISTINCT" : ""), - ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""), - p->selId, p, p->selFlags, - (int)p->nSelectRow - ); + if( p->selFlags & SF_WhereBegin ){ + sqlite3TreeViewLine(pView, "sqlite3WhereBegin()"); + }else{ + sqlite3TreeViewLine(pView, + "SELECT%s%s (%u/%p) selFlags=0x%x nSelectRow=%d", + ((p->selFlags & SF_Distinct) ? " DISTINCT" : ""), + ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""), + p->selId, p, p->selFlags, + (int)p->nSelectRow + ); + } if( cnt++ ) sqlite3TreeViewPop(pView); if( p->pPrior ){ n = 1000; @@ -28337,7 +29459,10 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m if( p->pWinDefn ) n++; #endif } - sqlite3TreeViewExprList(pView, p->pEList, (n--)>0, "result-set"); + if( p->pEList ){ + sqlite3TreeViewExprList(pView, p->pEList, n>0, "result-set"); + } + n--; #ifndef SQLITE_OMIT_WINDOWFUNC if( p->pWin ){ Window *pX; @@ -28350,39 +29475,9 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m } #endif if( p->pSrc && p->pSrc->nSrc ){ - int i; pView = sqlite3TreeViewPush(pView, (n--)>0); sqlite3TreeViewLine(pView, "FROM"); - for(i=0; ipSrc->nSrc; i++){ - struct SrcList_item *pItem = &p->pSrc->a[i]; - StrAccum x; - char zLine[100]; - sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); - sqlite3_str_appendf(&x, "{%d,*}", pItem->iCursor); - if( pItem->zDatabase ){ - sqlite3_str_appendf(&x, " %s.%s", pItem->zDatabase, pItem->zName); - }else if( pItem->zName ){ - sqlite3_str_appendf(&x, " %s", pItem->zName); - } - if( pItem->pTab ){ - sqlite3_str_appendf(&x, " tabname=%Q", pItem->pTab->zName); - } - if( pItem->zAlias ){ - sqlite3_str_appendf(&x, " (AS %s)", pItem->zAlias); - } - if( pItem->fg.jointype & JT_LEFT ){ - sqlite3_str_appendf(&x, " LEFT-JOIN"); - } - sqlite3StrAccumFinish(&x); - sqlite3TreeViewItem(pView, zLine, ipSrc->nSrc-1); - if( pItem->pSelect ){ - sqlite3TreeViewSelect(pView, pItem->pSelect, 0); - } - if( pItem->fg.isTabFunc ){ - sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:"); - } - sqlite3TreeViewPop(pView); - } + sqlite3TreeViewSrcList(pView, p->pSrc); sqlite3TreeViewPop(pView); } if( p->pWhere ){ @@ -28477,24 +29572,62 @@ SQLITE_PRIVATE void sqlite3TreeViewBound( ** Generate a human-readable explanation for a Window object */ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u8 more){ + int nElement = 0; + if( pWin->pFilter ){ + sqlite3TreeViewItem(pView, "FILTER", 1); + sqlite3TreeViewExpr(pView, pWin->pFilter, 0); + sqlite3TreeViewPop(pView); + } pView = sqlite3TreeViewPush(pView, more); if( pWin->zName ){ - sqlite3TreeViewLine(pView, "OVER %s", pWin->zName); + sqlite3TreeViewLine(pView, "OVER %s (%p)", pWin->zName, pWin); }else{ - sqlite3TreeViewLine(pView, "OVER"); + sqlite3TreeViewLine(pView, "OVER (%p)", pWin); + } + if( pWin->zBase ) nElement++; + if( pWin->pOrderBy ) nElement++; + if( pWin->eFrmType ) nElement++; + if( pWin->eExclude ) nElement++; + if( pWin->zBase ){ + sqlite3TreeViewPush(pView, (--nElement)>0); + sqlite3TreeViewLine(pView, "window: %s", pWin->zBase); + sqlite3TreeViewPop(pView); } if( pWin->pPartition ){ - sqlite3TreeViewExprList(pView, pWin->pPartition, 1, "PARTITION-BY"); + sqlite3TreeViewExprList(pView, pWin->pPartition, nElement>0,"PARTITION-BY"); } if( pWin->pOrderBy ){ - sqlite3TreeViewExprList(pView, pWin->pOrderBy, 1, "ORDER-BY"); - } - if( pWin->eType ){ - sqlite3TreeViewItem(pView, pWin->eType==TK_RANGE ? "RANGE" : "ROWS", 0); + sqlite3TreeViewExprList(pView, pWin->pOrderBy, (--nElement)>0, "ORDER-BY"); + } + if( pWin->eFrmType ){ + char zBuf[30]; + const char *zFrmType = "ROWS"; + if( pWin->eFrmType==TK_RANGE ) zFrmType = "RANGE"; + if( pWin->eFrmType==TK_GROUPS ) zFrmType = "GROUPS"; + sqlite3_snprintf(sizeof(zBuf),zBuf,"%s%s",zFrmType, + pWin->bImplicitFrame ? " (implied)" : ""); + sqlite3TreeViewItem(pView, zBuf, (--nElement)>0); sqlite3TreeViewBound(pView, pWin->eStart, pWin->pStart, 1); sqlite3TreeViewBound(pView, pWin->eEnd, pWin->pEnd, 0); sqlite3TreeViewPop(pView); } + if( pWin->eExclude ){ + char zBuf[30]; + const char *zExclude; + switch( pWin->eExclude ){ + case TK_NO: zExclude = "NO OTHERS"; break; + case TK_CURRENT: zExclude = "CURRENT ROW"; break; + case TK_GROUP: zExclude = "GROUP"; break; + case TK_TIES: zExclude = "TIES"; break; + default: + sqlite3_snprintf(sizeof(zBuf),zBuf,"invalid(%d)", pWin->eExclude); + zExclude = zBuf; + break; + } + sqlite3TreeViewPush(pView, 0); + sqlite3TreeViewLine(pView, "EXCLUDE %s", zExclude); + sqlite3TreeViewPop(pView); + } sqlite3TreeViewPop(pView); } #endif /* SQLITE_OMIT_WINDOWFUNC */ @@ -28525,13 +29658,18 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m sqlite3TreeViewPop(pView); return; } - if( pExpr->flags ){ + if( pExpr->flags || pExpr->affExpr ){ + StrAccum x; + sqlite3StrAccumInit(&x, 0, zFlgs, sizeof(zFlgs), 0); + sqlite3_str_appendf(&x, " fg.af=%x.%c", + pExpr->flags, pExpr->affExpr ? pExpr->affExpr : 'n'); if( ExprHasProperty(pExpr, EP_FromJoin) ){ - sqlite3_snprintf(sizeof(zFlgs),zFlgs," flags=0x%x iRJT=%d", - pExpr->flags, pExpr->iRightJoinTable); - }else{ - sqlite3_snprintf(sizeof(zFlgs),zFlgs," flags=0x%x",pExpr->flags); + sqlite3_str_appendf(&x, " iRJT=%d", pExpr->iRightJoinTable); } + if( ExprHasProperty(pExpr, EP_FromDDL) ){ + sqlite3_str_appendf(&x, " DDL"); + } + sqlite3StrAccumFinish(&x); }else{ zFlgs[0] = 0; } @@ -28544,10 +29682,18 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m case TK_COLUMN: { if( pExpr->iTable<0 ){ /* This only happens when coding check constraints */ - sqlite3TreeViewLine(pView, "COLUMN(%d)%s", pExpr->iColumn, zFlgs); + char zOp2[16]; + if( pExpr->op2 ){ + sqlite3_snprintf(sizeof(zOp2),zOp2," op2=0x%02x",pExpr->op2); + }else{ + zOp2[0] = 0; + } + sqlite3TreeViewLine(pView, "COLUMN(%d)%s%s", + pExpr->iColumn, zFlgs, zOp2); }else{ - sqlite3TreeViewLine(pView, "{%d:%d}%s", - pExpr->iTable, pExpr->iColumn, zFlgs); + sqlite3TreeViewLine(pView, "{%d:%d} pTab=%p%s", + pExpr->iTable, pExpr->iColumn, + pExpr->y.pTab, zFlgs); } if( ExprHasProperty(pExpr, EP_FixedCol) ){ sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); @@ -28644,7 +29790,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m }; assert( pExpr->op2==TK_IS || pExpr->op2==TK_ISNOT ); assert( pExpr->pRight ); - assert( pExpr->pRight->op==TK_TRUEFALSE ); + assert( sqlite3ExprSkipCollate(pExpr->pRight)->op==TK_TRUEFALSE ); x = (pExpr->op2==TK_ISNOT)*2 + sqlite3ExprTruthValue(pExpr->pRight); zUniOp = azOp[x]; break; @@ -28657,7 +29803,14 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m } case TK_COLLATE: { - sqlite3TreeViewLine(pView, "COLLATE %Q", pExpr->u.zToken); + /* COLLATE operators without the EP_Collate flag are intended to + ** emulate collation associated with a table column. These show + ** up in the treeview output as "SOFT-COLLATE". Explicit COLLATE + ** operators that appear in the original SQL always have the + ** EP_Collate bit set and appear in treeview output as just "COLLATE" */ + sqlite3TreeViewLine(pView, "%sCOLLATE %Q%s", + !ExprHasProperty(pExpr, EP_Collate) ? "SOFT-" : "", + pExpr->u.zToken, zFlgs); sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); break; } @@ -28672,16 +29825,27 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m }else{ pFarg = pExpr->x.pList; #ifndef SQLITE_OMIT_WINDOWFUNC - pWin = pExpr->pWin; + pWin = ExprHasProperty(pExpr, EP_WinFunc) ? pExpr->y.pWin : 0; #else pWin = 0; #endif } if( pExpr->op==TK_AGG_FUNCTION ){ - sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q", - pExpr->op2, pExpr->u.zToken); + sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q%s", + pExpr->op2, pExpr->u.zToken, zFlgs); + }else if( pExpr->op2!=0 ){ + const char *zOp2; + char zBuf[8]; + sqlite3_snprintf(sizeof(zBuf),zBuf,"0x%02x",pExpr->op2); + zOp2 = zBuf; + if( pExpr->op2==NC_IsCheck ) zOp2 = "NC_IsCheck"; + if( pExpr->op2==NC_IdxExpr ) zOp2 = "NC_IdxExpr"; + if( pExpr->op2==NC_PartIdx ) zOp2 = "NC_PartIdx"; + if( pExpr->op2==NC_GenCol ) zOp2 = "NC_GenCol"; + sqlite3TreeViewLine(pView, "FUNCTION %Q%s op2=%s", + pExpr->u.zToken, zFlgs, zOp2); }else{ - sqlite3TreeViewLine(pView, "FUNCTION %Q", pExpr->u.zToken); + sqlite3TreeViewLine(pView, "FUNCTION %Q%s", pExpr->u.zToken, zFlgs); } if( pFarg ){ sqlite3TreeViewExprList(pView, pFarg, pWin!=0, 0); @@ -28758,7 +29922,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m #ifndef SQLITE_OMIT_TRIGGER case TK_RAISE: { const char *zType = "unk"; - switch( pExpr->affinity ){ + switch( pExpr->affExpr ){ case OE_Rollback: zType = "rollback"; break; case OE_Abort: zType = "abort"; break; case OE_Fail: zType = "fail"; break; @@ -28775,7 +29939,9 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m break; } case TK_VECTOR: { - sqlite3TreeViewBareExprList(pView, pExpr->x.pList, "VECTOR"); + char *z = sqlite3_mprintf("VECTOR%s",zFlgs); + sqlite3TreeViewBareExprList(pView, pExpr->x.pList, z); + sqlite3_free(z); break; } case TK_SELECT_COLUMN: { @@ -28799,7 +29965,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m sqlite3TreeViewExpr(pView, pExpr->pRight, 0); }else if( zUniOp ){ sqlite3TreeViewLine(pView, "%s%s", zUniOp, zFlgs); - sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); } sqlite3TreeViewPop(pView); } @@ -28821,8 +29987,9 @@ SQLITE_PRIVATE void sqlite3TreeViewBareExprList( sqlite3TreeViewLine(pView, "%s", zLabel); for(i=0; inExpr; i++){ int j = pList->a[i].u.x.iOrderByCol; - char *zName = pList->a[i].zName; + char *zName = pList->a[i].zEName; int moreToFollow = inExpr - 1; + if( pList->a[i].eEName!=ENAME_NAME ) zName = 0; if( j || zName ){ sqlite3TreeViewPush(pView, moreToFollow); moreToFollow = 0; @@ -29474,11 +30641,11 @@ SQLITE_PRIVATE u32 sqlite3Utf8Read( ** encoding, or if *pMem does not contain a string value. */ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){ - int len; /* Maximum length of output string in bytes */ - unsigned char *zOut; /* Output buffer */ - unsigned char *zIn; /* Input iterator */ - unsigned char *zTerm; /* End of input */ - unsigned char *z; /* Output iterator */ + sqlite3_int64 len; /* Maximum length of output string in bytes */ + unsigned char *zOut; /* Output buffer */ + unsigned char *zIn; /* Input iterator */ + unsigned char *zTerm; /* End of input */ + unsigned char *z; /* Output iterator */ unsigned int c; assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); @@ -29489,9 +30656,11 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desired #if defined(TRANSLATE_TRACE) && defined(SQLITE_DEBUG) { - char zBuf[100]; - sqlite3VdbeMemPrettyPrint(pMem, zBuf); - fprintf(stderr, "INPUT: %s\n", zBuf); + StrAccum acc; + char zBuf[1000]; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + sqlite3VdbeMemPrettyPrint(pMem, &acc); + fprintf(stderr, "INPUT: %s\n", sqlite3StrAccumFinish(&acc)); } #endif @@ -29527,14 +30696,14 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desired ** nul-terminator. */ pMem->n &= ~1; - len = pMem->n * 2 + 1; + len = 2 * (sqlite3_int64)pMem->n + 1; }else{ /* When converting from UTF-8 to UTF-16 the maximum growth is caused ** when a 1-byte UTF-8 character is translated into a 2-byte UTF-16 ** character. Two bytes are required in the output buffer for the ** nul-terminator. */ - len = pMem->n * 2 + 2; + len = 2 * (sqlite3_int64)pMem->n + 2; } /* Set zIn to point at the start of the input buffer and zTerm to point 1 @@ -29599,9 +30768,11 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desired translate_out: #if defined(TRANSLATE_TRACE) && defined(SQLITE_DEBUG) { - char zBuf[100]; - sqlite3VdbeMemPrettyPrint(pMem, zBuf); - fprintf(stderr, "OUTPUT: %s\n", zBuf); + StrAccum acc; + char zBuf[1000]; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + sqlite3VdbeMemPrettyPrint(pMem, &acc); + fprintf(stderr, "OUTPUT: %s\n", sqlite3StrAccumFinish(&acc)); } #endif return SQLITE_OK; @@ -29826,8 +30997,8 @@ SQLITE_PRIVATE void sqlite3UtfSelfTest(void){ */ /* #include "sqliteInt.h" */ /* #include */ -#if HAVE_ISNAN || SQLITE_HAVE_ISNAN -# include +#ifndef SQLITE_OMIT_FLOATING_POINT +#include #endif /* @@ -29841,15 +31012,23 @@ SQLITE_PRIVATE void sqlite3Coverage(int x){ #endif /* -** Give a callback to the test harness that can be used to simulate faults -** in places where it is difficult or expensive to do so purely by means -** of inputs. +** Calls to sqlite3FaultSim() are used to simulate a failure during testing, +** or to bypass normal error detection during testing in order to let +** execute proceed futher downstream. ** -** The intent of the integer argument is to let the fault simulator know -** which of multiple sqlite3FaultSim() calls has been hit. +** In deployment, sqlite3FaultSim() *always* return SQLITE_OK (0). The +** sqlite3FaultSim() function only returns non-zero during testing. ** -** Return whatever integer value the test callback returns, or return -** SQLITE_OK if no test callback is installed. +** During testing, if the test harness has set a fault-sim callback using +** a call to sqlite3_test_control(SQLITE_TESTCTRL_FAULT_INSTALL), then +** each call to sqlite3FaultSim() is relayed to that application-supplied +** callback and the integer return value form the application-supplied +** callback is returned by sqlite3FaultSim(). +** +** The integer argument to sqlite3FaultSim() is a code to identify which +** sqlite3FaultSim() instance is being invoked. Each call to sqlite3FaultSim() +** should have a unique code. To prevent legacy testing applications from +** breaking, the codes should not be changed or reused. */ #ifndef SQLITE_UNTESTABLE SQLITE_PRIVATE int sqlite3FaultSim(int iTest){ @@ -29861,47 +31040,11 @@ SQLITE_PRIVATE int sqlite3FaultSim(int iTest){ #ifndef SQLITE_OMIT_FLOATING_POINT /* ** Return true if the floating point value is Not a Number (NaN). -** -** Use the math library isnan() function if compiled with SQLITE_HAVE_ISNAN. -** Otherwise, we have our own implementation that works on most systems. */ SQLITE_PRIVATE int sqlite3IsNaN(double x){ - int rc; /* The value return */ -#if !SQLITE_HAVE_ISNAN && !HAVE_ISNAN - /* - ** Systems that support the isnan() library function should probably - ** make use of it by compiling with -DSQLITE_HAVE_ISNAN. But we have - ** found that many systems do not have a working isnan() function so - ** this implementation is provided as an alternative. - ** - ** This NaN test sometimes fails if compiled on GCC with -ffast-math. - ** On the other hand, the use of -ffast-math comes with the following - ** warning: - ** - ** This option [-ffast-math] should never be turned on by any - ** -O option since it can result in incorrect output for programs - ** which depend on an exact implementation of IEEE or ISO - ** rules/specifications for math functions. - ** - ** Under MSVC, this NaN test may fail if compiled with a floating- - ** point precision mode other than /fp:precise. From the MSDN - ** documentation: - ** - ** The compiler [with /fp:precise] will properly handle comparisons - ** involving NaN. For example, x != x evaluates to true if x is NaN - ** ... - */ -#ifdef __FAST_MATH__ -# error SQLite will not work correctly with the -ffast-math option of GCC. -#endif - volatile double y = x; - volatile double z = y; - rc = (y!=z); -#else /* if HAVE_ISNAN */ - rc = isnan(x); -#endif /* HAVE_ISNAN */ - testcase( rc ); - return rc; + u64 y; + memcpy(&y,&x,sizeof(y)); + return IsNaN(y); } #endif /* SQLITE_OMIT_FLOATING_POINT */ @@ -30031,9 +31174,23 @@ SQLITE_PRIVATE void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ sqlite3DbFree(db, pParse->zErrMsg); pParse->zErrMsg = zMsg; pParse->rc = SQLITE_ERROR; + pParse->pWith = 0; } } +/* +** If database connection db is currently parsing SQL, then transfer +** error code errCode to that parser if the parser has not already +** encountered some other kind of error. +*/ +SQLITE_PRIVATE int sqlite3ErrorToParser(sqlite3 *db, int errCode){ + Parse *pParse; + if( db==0 || (pParse = db->pParse)==0 ) return errCode; + pParse->rc = errCode; + pParse->nErr++; + return errCode; +} + /* ** Convert an SQL-style quoted string into a normal string by removing ** the quote characters. The conversion is done in-place. If the @@ -30047,7 +31204,7 @@ SQLITE_PRIVATE void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ ** dequoted string, exclusive of the zero terminator, if dequoting does ** occur. ** -** 2002-Feb-14: This routine is extended to remove MS-Access style +** 2002-02-14: This routine is extended to remove MS-Access style ** brackets from around identifiers. For example: "[a-b-c]" becomes ** "a-b-c". */ @@ -30073,6 +31230,11 @@ SQLITE_PRIVATE void sqlite3Dequote(char *z){ } z[j] = 0; } +SQLITE_PRIVATE void sqlite3DequoteExpr(Expr *p){ + assert( sqlite3Isquote(p->u.zToken[0]) ); + p->flags |= p->u.zToken[0]=='"' ? EP_Quoted|EP_DblQuoted : EP_Quoted; + sqlite3Dequote(p->u.zToken); +} /* ** Generate a Token object from a string @@ -30105,12 +31267,18 @@ SQLITE_API int sqlite3_stricmp(const char *zLeft, const char *zRight){ } SQLITE_PRIVATE int sqlite3StrICmp(const char *zLeft, const char *zRight){ unsigned char *a, *b; - int c; + int c, x; a = (unsigned char *)zLeft; b = (unsigned char *)zRight; for(;;){ - c = (int)UpperToLower[*a] - (int)UpperToLower[*b]; - if( c || *a==0 ) break; + c = *a; + x = *b; + if( c==x ){ + if( c==0 ) break; + }else{ + c = (int)UpperToLower[c] - (int)UpperToLower[x]; + if( c ) break; + } a++; b++; } @@ -30138,15 +31306,15 @@ SQLITE_API int sqlite3_strnicmp(const char *zLeft, const char *zRight, int N){ static LONGDOUBLE_TYPE sqlite3Pow10(int E){ #if defined(_MSC_VER) static const LONGDOUBLE_TYPE x[] = { - 1.0e+001, - 1.0e+002, - 1.0e+004, - 1.0e+008, - 1.0e+016, - 1.0e+032, - 1.0e+064, - 1.0e+128, - 1.0e+256 + 1.0e+001L, + 1.0e+002L, + 1.0e+004L, + 1.0e+008L, + 1.0e+016L, + 1.0e+032L, + 1.0e+064L, + 1.0e+128L, + 1.0e+256L }; LONGDOUBLE_TYPE r = 1.0; int i; @@ -30176,8 +31344,15 @@ static LONGDOUBLE_TYPE sqlite3Pow10(int E){ ** uses the encoding enc. The string is not necessarily zero-terminated. ** ** Return TRUE if the result is a valid real number (or integer) and FALSE -** if the string is empty or contains extraneous text. Valid numbers -** are in one of these formats: +** if the string is empty or contains extraneous text. More specifically +** return +** 1 => The input string is a pure integer +** 2 or more => The input has a decimal point or eNNN clause +** 0 or less => The input string is not a valid number +** -1 => Not a valid number, but has a valid prefix which +** includes a decimal point and/or an eNNN clause +** +** Valid numbers are in one of these formats: ** ** [+-]digits[E[+-]digits] ** [+-]digits.[digits][E[+-]digits] @@ -30190,10 +31365,13 @@ static LONGDOUBLE_TYPE sqlite3Pow10(int E){ ** returns FALSE but it still converts the prefix and writes the result ** into *pResult. */ +#if defined(_MSC_VER) +#pragma warning(disable : 4756) +#endif SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){ #ifndef SQLITE_OMIT_FLOATING_POINT int incr; - const char *zEnd = z + length; + const char *zEnd; /* sign * significand * (10 ^ (esign * exponent)) */ int sign = 1; /* sign of significand */ i64 s = 0; /* significand */ @@ -30202,20 +31380,25 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en int e = 0; /* exponent */ int eValid = 1; /* True exponent is either not used or is well-formed */ double result; - int nDigits = 0; - int nonNum = 0; /* True if input contains UTF16 with high byte non-zero */ + int nDigit = 0; /* Number of digits processed */ + int eType = 1; /* 1: pure integer, 2+: fractional -1 or less: bad UTF16 */ assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); *pResult = 0.0; /* Default return value, in case of an error */ + if( length==0 ) return 0; if( enc==SQLITE_UTF8 ){ incr = 1; + zEnd = z + length; }else{ int i; incr = 2; + length &= ~1; assert( SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); + testcase( enc==SQLITE_UTF16LE ); + testcase( enc==SQLITE_UTF16BE ); for(i=3-enc; i=((LARGEST_INT64-9)/10) ){ + /* skip non-significant significand digits + ** (increase exponent by d to shift decimal left) */ + while( z=zEnd ) goto do_atof_calc; /* if decimal point is present */ if( *z=='.' ){ z+=incr; + eType++; /* copy digits from after decimal to significand ** (decrease exponent by d to shift decimal right) */ while( z=zEnd ) goto do_atof_calc; @@ -30262,6 +31448,7 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en if( *z=='e' || *z=='E' ){ z+=incr; eValid = 0; + eType++; /* This branch is needed to avoid a (harmless) buffer overread. The ** special comment alerts the mutation tester that the correct answer @@ -30360,11 +31547,20 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en *pResult = result; /* return true if number and no extra non-whitespace chracters after */ - return z==zEnd && nDigits>0 && eValid && nonNum==0; + if( z==zEnd && nDigit>0 && eValid && eType>0 ){ + return eType; + }else if( eType>=2 && (eType==3 || eValid) && nDigit>0 ){ + return -1; + }else{ + return 0; + } #else return !sqlite3Atoi64(z, pResult, length, enc); #endif /* SQLITE_OMIT_FLOATING_POINT */ } +#if defined(_MSC_VER) +#pragma warning(default : 4756) +#endif /* ** Compare the 19-character string zNum against the text representation @@ -30403,6 +31599,7 @@ static int compare2pow63(const char *zNum, int incr){ ** ** Returns: ** +** -1 Not even a prefix of the input text looks like an integer ** 0 Successful transformation. Fits in a 64-bit signed integer. ** 1 Excess non-space text after the integer value ** 2 Integer too large for a 64-bit signed integer or is malformed @@ -30462,9 +31659,9 @@ SQLITE_PRIVATE int sqlite3Atoi64(const char *zNum, i64 *pNum, int length, u8 enc *pNum = (i64)u; } rc = 0; - if( (i==0 && zStart==zNum) /* No digits */ - || nonNum /* UTF16 with high-order bytes non-zero */ - ){ + if( i==0 && zStart==zNum ){ /* No digits */ + rc = -1; + }else if( nonNum ){ /* UTF16 with high-order bytes non-zero */ rc = 1; }else if( &zNum[i]=0 ){ + *v = *p; return 1; } - - p++; - b = *p; - /* b: p1 (unmasked) */ - if (!(b&0x80)) - { - a &= 0x7f; - a = a<<7; - a |= b; - *v = a; + if( ((signed char*)p)[1]>=0 ){ + *v = ((u32)(p[0]&0x7f)<<7) | p[1]; return 2; } @@ -30719,8 +31905,9 @@ SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char *p, u64 *v){ assert( SLOT_2_0 == ((0x7f<<14) | (0x7f)) ); assert( SLOT_4_2_0 == ((0xfU<<28) | (0x7f<<14) | (0x7f)) ); - p++; - a = a<<14; + a = ((u32)p[0])<<14; + b = p[1]; + p += 2; a |= *p; /* a: p0<<14 | p2 (unmasked) */ if (!(a&0x80)) @@ -31303,7 +32490,7 @@ SQLITE_PRIVATE LogEst sqlite3LogEstFromDouble(double x){ #endif /* SQLITE_OMIT_VIRTUALTABLE */ #if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ - defined(SQLITE_ENABLE_STAT3_OR_STAT4) || \ + defined(SQLITE_ENABLE_STAT4) || \ defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) /* ** Convert a LogEst into an integer. @@ -31321,7 +32508,7 @@ SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst x){ defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) if( x>60 ) return (u64)LARGEST_INT64; #else - /* If only SQLITE_ENABLE_STAT3_OR_STAT4 is on, then the largest input + /* If only SQLITE_ENABLE_STAT4 is on, then the largest input ** possible to this routine is 310, resulting in a maximum x of 31 */ assert( x<=60 ); #endif @@ -31380,7 +32567,7 @@ SQLITE_PRIVATE VList *sqlite3VListAdd( assert( pIn==0 || pIn[0]>=3 ); /* Verify ok to add new elements */ if( pIn==0 || pIn[1]+nInt > pIn[0] ){ /* Enlarge the allocation */ - int nAlloc = (pIn ? pIn[0]*2 : 10) + nInt; + sqlite3_int64 nAlloc = (pIn ? 2*(sqlite3_int64)pIn[0] : 10) + nInt; VList *pOut = sqlite3DbRealloc(db, pIn, nAlloc*sizeof(int)); if( pOut==0 ) return pIn; if( pIn==0 ) pOut[1] = 2; @@ -31586,7 +32773,7 @@ static HashElem *findElementWithHash( unsigned int *pHash /* Write the hash value here */ ){ HashElem *elem; /* Used to loop thru the element list */ - int count; /* Number of elements left to test */ + unsigned int count; /* Number of elements left to test */ unsigned int h; /* The computed hash */ static HashElem nullElement = { 0, 0, 0, 0 }; @@ -31634,8 +32821,8 @@ static void removeElementGivenHash( if( pEntry->chain==elem ){ pEntry->chain = elem->next; } + assert( pEntry->count>0 ); pEntry->count--; - assert( pEntry->count>=0 ); } sqlite3_free( elem ); pH->count--; @@ -31744,30 +32931,30 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 23 */ "SeekLE" OpHelp("key=r[P3@P4]"), /* 24 */ "SeekGE" OpHelp("key=r[P3@P4]"), /* 25 */ "SeekGT" OpHelp("key=r[P3@P4]"), - /* 26 */ "IfNoHope" OpHelp("key=r[P3@P4]"), - /* 27 */ "NoConflict" OpHelp("key=r[P3@P4]"), - /* 28 */ "NotFound" OpHelp("key=r[P3@P4]"), - /* 29 */ "Found" OpHelp("key=r[P3@P4]"), - /* 30 */ "SeekRowid" OpHelp("intkey=r[P3]"), - /* 31 */ "NotExists" OpHelp("intkey=r[P3]"), - /* 32 */ "Last" OpHelp(""), - /* 33 */ "IfSmaller" OpHelp(""), - /* 34 */ "SorterSort" OpHelp(""), - /* 35 */ "Sort" OpHelp(""), - /* 36 */ "Rewind" OpHelp(""), - /* 37 */ "IdxLE" OpHelp("key=r[P3@P4]"), - /* 38 */ "IdxGT" OpHelp("key=r[P3@P4]"), - /* 39 */ "IdxLT" OpHelp("key=r[P3@P4]"), - /* 40 */ "IdxGE" OpHelp("key=r[P3@P4]"), - /* 41 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"), - /* 42 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"), + /* 26 */ "IfNotOpen" OpHelp("if( !csr[P1] ) goto P2"), + /* 27 */ "IfNoHope" OpHelp("key=r[P3@P4]"), + /* 28 */ "NoConflict" OpHelp("key=r[P3@P4]"), + /* 29 */ "NotFound" OpHelp("key=r[P3@P4]"), + /* 30 */ "Found" OpHelp("key=r[P3@P4]"), + /* 31 */ "SeekRowid" OpHelp("intkey=r[P3]"), + /* 32 */ "NotExists" OpHelp("intkey=r[P3]"), + /* 33 */ "Last" OpHelp(""), + /* 34 */ "IfSmaller" OpHelp(""), + /* 35 */ "SorterSort" OpHelp(""), + /* 36 */ "Sort" OpHelp(""), + /* 37 */ "Rewind" OpHelp(""), + /* 38 */ "IdxLE" OpHelp("key=r[P3@P4]"), + /* 39 */ "IdxGT" OpHelp("key=r[P3@P4]"), + /* 40 */ "IdxLT" OpHelp("key=r[P3@P4]"), + /* 41 */ "IdxGE" OpHelp("key=r[P3@P4]"), + /* 42 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"), /* 43 */ "Or" OpHelp("r[P3]=(r[P1] || r[P2])"), /* 44 */ "And" OpHelp("r[P3]=(r[P1] && r[P2])"), - /* 45 */ "Program" OpHelp(""), - /* 46 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"), - /* 47 */ "IfPos" OpHelp("if r[P1]>0 then r[P1]-=P3, goto P2"), - /* 48 */ "IfNotZero" OpHelp("if r[P1]!=0 then r[P1]--, goto P2"), - /* 49 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"), + /* 45 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"), + /* 46 */ "Program" OpHelp(""), + /* 47 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"), + /* 48 */ "IfPos" OpHelp("if r[P1]>0 then r[P1]-=P3, goto P2"), + /* 49 */ "IfNotZero" OpHelp("if r[P1]!=0 then r[P1]--, goto P2"), /* 50 */ "IsNull" OpHelp("if r[P1]==NULL goto P2"), /* 51 */ "NotNull" OpHelp("if r[P1]!=NULL goto P2"), /* 52 */ "Ne" OpHelp("IF r[P3]!=r[P1]"), @@ -31777,121 +32964,123 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 56 */ "Lt" OpHelp("IF r[P3]=r[P1]"), /* 58 */ "ElseNotEq" OpHelp(""), - /* 59 */ "IncrVacuum" OpHelp(""), - /* 60 */ "VNext" OpHelp(""), - /* 61 */ "Init" OpHelp("Start at P2"), - /* 62 */ "PureFunc0" OpHelp(""), - /* 63 */ "Function0" OpHelp("r[P3]=func(r[P2@P5])"), - /* 64 */ "PureFunc" OpHelp(""), - /* 65 */ "Function" OpHelp("r[P3]=func(r[P2@P5])"), - /* 66 */ "Return" OpHelp(""), - /* 67 */ "EndCoroutine" OpHelp(""), - /* 68 */ "HaltIfNull" OpHelp("if r[P3]=null halt"), - /* 69 */ "Halt" OpHelp(""), - /* 70 */ "Integer" OpHelp("r[P2]=P1"), - /* 71 */ "Int64" OpHelp("r[P2]=P4"), - /* 72 */ "String" OpHelp("r[P2]='P4' (len=P1)"), - /* 73 */ "Null" OpHelp("r[P2..P3]=NULL"), - /* 74 */ "SoftNull" OpHelp("r[P1]=NULL"), - /* 75 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), - /* 76 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), - /* 77 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), - /* 78 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), - /* 79 */ "SCopy" OpHelp("r[P2]=r[P1]"), - /* 80 */ "IntCopy" OpHelp("r[P2]=r[P1]"), - /* 81 */ "ResultRow" OpHelp("output=r[P1@P2]"), - /* 82 */ "CollSeq" OpHelp(""), - /* 83 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), - /* 84 */ "RealAffinity" OpHelp(""), - /* 85 */ "Cast" OpHelp("affinity(r[P1])"), - /* 86 */ "Permutation" OpHelp(""), - /* 87 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"), - /* 88 */ "IsTrue" OpHelp("r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4"), - /* 89 */ "Offset" OpHelp("r[P3] = sqlite_offset(P1)"), - /* 90 */ "Column" OpHelp("r[P3]=PX"), - /* 91 */ "Affinity" OpHelp("affinity(r[P1@P2])"), - /* 92 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), - /* 93 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), - /* 94 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<>r[P1]"), - /* 96 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"), - /* 97 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"), - /* 98 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"), - /* 99 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"), - /* 100 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"), - /* 101 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"), - /* 102 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), - /* 103 */ "BitNot" OpHelp("r[P2]= ~r[P1]"), - /* 104 */ "Count" OpHelp("r[P2]=count()"), - /* 105 */ "ReadCookie" OpHelp(""), - /* 106 */ "String8" OpHelp("r[P2]='P4'"), - /* 107 */ "SetCookie" OpHelp(""), - /* 108 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), - /* 109 */ "OpenRead" OpHelp("root=P2 iDb=P3"), - /* 110 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), - /* 111 */ "OpenDup" OpHelp(""), - /* 112 */ "OpenAutoindex" OpHelp("nColumn=P2"), - /* 113 */ "OpenEphemeral" OpHelp("nColumn=P2"), - /* 114 */ "SorterOpen" OpHelp(""), - /* 115 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"), - /* 116 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"), - /* 117 */ "Close" OpHelp(""), - /* 118 */ "ColumnsUsed" OpHelp(""), - /* 119 */ "SeekHit" OpHelp("seekHit=P2"), - /* 120 */ "Sequence" OpHelp("r[P2]=cursor[P1].ctr++"), - /* 121 */ "NewRowid" OpHelp("r[P2]=rowid"), - /* 122 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"), - /* 123 */ "InsertInt" OpHelp("intkey=P3 data=r[P2]"), - /* 124 */ "Delete" OpHelp(""), - /* 125 */ "ResetCount" OpHelp(""), - /* 126 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"), - /* 127 */ "SorterData" OpHelp("r[P2]=data"), - /* 128 */ "RowData" OpHelp("r[P2]=data"), - /* 129 */ "Rowid" OpHelp("r[P2]=rowid"), - /* 130 */ "NullRow" OpHelp(""), - /* 131 */ "SeekEnd" OpHelp(""), - /* 132 */ "SorterInsert" OpHelp("key=r[P2]"), - /* 133 */ "IdxInsert" OpHelp("key=r[P2]"), - /* 134 */ "IdxDelete" OpHelp("key=r[P2@P3]"), - /* 135 */ "DeferredSeek" OpHelp("Move P3 to P1.rowid if needed"), - /* 136 */ "IdxRowid" OpHelp("r[P2]=rowid"), - /* 137 */ "Destroy" OpHelp(""), - /* 138 */ "Clear" OpHelp(""), - /* 139 */ "ResetSorter" OpHelp(""), - /* 140 */ "CreateBtree" OpHelp("r[P2]=root iDb=P1 flags=P3"), - /* 141 */ "Real" OpHelp("r[P2]=P4"), - /* 142 */ "SqlExec" OpHelp(""), - /* 143 */ "ParseSchema" OpHelp(""), - /* 144 */ "LoadAnalysis" OpHelp(""), - /* 145 */ "DropTable" OpHelp(""), - /* 146 */ "DropIndex" OpHelp(""), - /* 147 */ "DropTrigger" OpHelp(""), - /* 148 */ "IntegrityCk" OpHelp(""), - /* 149 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), - /* 150 */ "Param" OpHelp(""), - /* 151 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), - /* 152 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), - /* 153 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), - /* 154 */ "AggInverse" OpHelp("accum=r[P3] inverse(r[P2@P5])"), - /* 155 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), - /* 156 */ "AggStep1" OpHelp("accum=r[P3] step(r[P2@P5])"), - /* 157 */ "AggValue" OpHelp("r[P3]=value N=P2"), - /* 158 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), - /* 159 */ "Expire" OpHelp(""), - /* 160 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), - /* 161 */ "VBegin" OpHelp(""), - /* 162 */ "VCreate" OpHelp(""), - /* 163 */ "VDestroy" OpHelp(""), - /* 164 */ "VOpen" OpHelp(""), - /* 165 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), - /* 166 */ "VRename" OpHelp(""), - /* 167 */ "Pagecount" OpHelp(""), - /* 168 */ "MaxPgcnt" OpHelp(""), - /* 169 */ "Trace" OpHelp(""), - /* 170 */ "CursorHint" OpHelp(""), - /* 171 */ "Noop" OpHelp(""), - /* 172 */ "Explain" OpHelp(""), - /* 173 */ "Abortable" OpHelp(""), + /* 59 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"), + /* 60 */ "IncrVacuum" OpHelp(""), + /* 61 */ "VNext" OpHelp(""), + /* 62 */ "Init" OpHelp("Start at P2"), + /* 63 */ "PureFunc" OpHelp("r[P3]=func(r[P2@P5])"), + /* 64 */ "Function" OpHelp("r[P3]=func(r[P2@P5])"), + /* 65 */ "Return" OpHelp(""), + /* 66 */ "EndCoroutine" OpHelp(""), + /* 67 */ "HaltIfNull" OpHelp("if r[P3]=null halt"), + /* 68 */ "Halt" OpHelp(""), + /* 69 */ "Integer" OpHelp("r[P2]=P1"), + /* 70 */ "Int64" OpHelp("r[P2]=P4"), + /* 71 */ "String" OpHelp("r[P2]='P4' (len=P1)"), + /* 72 */ "Null" OpHelp("r[P2..P3]=NULL"), + /* 73 */ "SoftNull" OpHelp("r[P1]=NULL"), + /* 74 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), + /* 75 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), + /* 76 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), + /* 77 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), + /* 78 */ "SCopy" OpHelp("r[P2]=r[P1]"), + /* 79 */ "IntCopy" OpHelp("r[P2]=r[P1]"), + /* 80 */ "ResultRow" OpHelp("output=r[P1@P2]"), + /* 81 */ "CollSeq" OpHelp(""), + /* 82 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), + /* 83 */ "RealAffinity" OpHelp(""), + /* 84 */ "Cast" OpHelp("affinity(r[P1])"), + /* 85 */ "Permutation" OpHelp(""), + /* 86 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"), + /* 87 */ "IsTrue" OpHelp("r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4"), + /* 88 */ "Offset" OpHelp("r[P3] = sqlite_offset(P1)"), + /* 89 */ "Column" OpHelp("r[P3]=PX"), + /* 90 */ "Affinity" OpHelp("affinity(r[P1@P2])"), + /* 91 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), + /* 92 */ "Count" OpHelp("r[P2]=count()"), + /* 93 */ "ReadCookie" OpHelp(""), + /* 94 */ "SetCookie" OpHelp(""), + /* 95 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), + /* 96 */ "OpenRead" OpHelp("root=P2 iDb=P3"), + /* 97 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), + /* 98 */ "OpenDup" OpHelp(""), + /* 99 */ "OpenAutoindex" OpHelp("nColumn=P2"), + /* 100 */ "OpenEphemeral" OpHelp("nColumn=P2"), + /* 101 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), + /* 102 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), + /* 103 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<>r[P1]"), + /* 105 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"), + /* 106 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"), + /* 107 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"), + /* 108 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"), + /* 109 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"), + /* 110 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"), + /* 111 */ "SorterOpen" OpHelp(""), + /* 112 */ "BitNot" OpHelp("r[P2]= ~r[P1]"), + /* 113 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"), + /* 114 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"), + /* 115 */ "String8" OpHelp("r[P2]='P4'"), + /* 116 */ "Close" OpHelp(""), + /* 117 */ "ColumnsUsed" OpHelp(""), + /* 118 */ "SeekHit" OpHelp("seekHit=P2"), + /* 119 */ "Sequence" OpHelp("r[P2]=cursor[P1].ctr++"), + /* 120 */ "NewRowid" OpHelp("r[P2]=rowid"), + /* 121 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"), + /* 122 */ "Delete" OpHelp(""), + /* 123 */ "ResetCount" OpHelp(""), + /* 124 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"), + /* 125 */ "SorterData" OpHelp("r[P2]=data"), + /* 126 */ "RowData" OpHelp("r[P2]=data"), + /* 127 */ "Rowid" OpHelp("r[P2]=rowid"), + /* 128 */ "NullRow" OpHelp(""), + /* 129 */ "SeekEnd" OpHelp(""), + /* 130 */ "SorterInsert" OpHelp("key=r[P2]"), + /* 131 */ "IdxInsert" OpHelp("key=r[P2]"), + /* 132 */ "IdxDelete" OpHelp("key=r[P2@P3]"), + /* 133 */ "DeferredSeek" OpHelp("Move P3 to P1.rowid if needed"), + /* 134 */ "IdxRowid" OpHelp("r[P2]=rowid"), + /* 135 */ "FinishSeek" OpHelp(""), + /* 136 */ "Destroy" OpHelp(""), + /* 137 */ "Clear" OpHelp(""), + /* 138 */ "ResetSorter" OpHelp(""), + /* 139 */ "CreateBtree" OpHelp("r[P2]=root iDb=P1 flags=P3"), + /* 140 */ "SqlExec" OpHelp(""), + /* 141 */ "ParseSchema" OpHelp(""), + /* 142 */ "LoadAnalysis" OpHelp(""), + /* 143 */ "DropTable" OpHelp(""), + /* 144 */ "DropIndex" OpHelp(""), + /* 145 */ "DropTrigger" OpHelp(""), + /* 146 */ "IntegrityCk" OpHelp(""), + /* 147 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), + /* 148 */ "Param" OpHelp(""), + /* 149 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), + /* 150 */ "Real" OpHelp("r[P2]=P4"), + /* 151 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), + /* 152 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), + /* 153 */ "AggInverse" OpHelp("accum=r[P3] inverse(r[P2@P5])"), + /* 154 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 155 */ "AggStep1" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 156 */ "AggValue" OpHelp("r[P3]=value N=P2"), + /* 157 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), + /* 158 */ "Expire" OpHelp(""), + /* 159 */ "CursorLock" OpHelp(""), + /* 160 */ "CursorUnlock" OpHelp(""), + /* 161 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), + /* 162 */ "VBegin" OpHelp(""), + /* 163 */ "VCreate" OpHelp(""), + /* 164 */ "VDestroy" OpHelp(""), + /* 165 */ "VOpen" OpHelp(""), + /* 166 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), + /* 167 */ "VRename" OpHelp(""), + /* 168 */ "Pagecount" OpHelp(""), + /* 169 */ "MaxPgcnt" OpHelp(""), + /* 170 */ "Trace" OpHelp(""), + /* 171 */ "CursorHint" OpHelp(""), + /* 172 */ "ReleaseReg" OpHelp("release r[P1@P2] mask P3"), + /* 173 */ "Noop" OpHelp(""), + /* 174 */ "Explain" OpHelp(""), + /* 175 */ "Abortable" OpHelp(""), }; return azName[i]; } @@ -32006,13 +33195,29 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ # include #endif /* SQLITE_ENABLE_LOCKING_STYLE */ -#if defined(__APPLE__) && ((__MAC_OS_X_VERSION_MIN_REQUIRED > 1050) || \ - (__IPHONE_OS_VERSION_MIN_REQUIRED > 2000)) -# if (!defined(TARGET_OS_EMBEDDED) || (TARGET_OS_EMBEDDED==0)) \ - && (!defined(TARGET_IPHONE_SIMULATOR) || (TARGET_IPHONE_SIMULATOR==0)) -# define HAVE_GETHOSTUUID 1 -# else -# warning "gethostuuid() is disabled." +/* +** Try to determine if gethostuuid() is available based on standard +** macros. This might sometimes compute the wrong value for some +** obscure platforms. For those cases, simply compile with one of +** the following: +** +** -DHAVE_GETHOSTUUID=0 +** -DHAVE_GETHOSTUUID=1 +** +** None if this matters except when building on Apple products with +** -DSQLITE_ENABLE_LOCKING_STYLE. +*/ +#ifndef HAVE_GETHOSTUUID +# define HAVE_GETHOSTUUID 0 +# if defined(__APPLE__) && ((__MAC_OS_X_VERSION_MIN_REQUIRED > 1050) || \ + (__IPHONE_OS_VERSION_MIN_REQUIRED > 2000)) +# if (!defined(TARGET_OS_EMBEDDED) || (TARGET_OS_EMBEDDED==0)) \ + && (!defined(TARGET_IPHONE_SIMULATOR) || (TARGET_IPHONE_SIMULATOR==0)) +# undef HAVE_GETHOSTUUID +# define HAVE_GETHOSTUUID 1 +# else +# warning "gethostuuid() is disabled." +# endif # endif #endif @@ -32037,12 +33242,10 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ #define SQLITE_FSFLAGS_IS_MSDOS 0x1 /* -** If we are to be thread-safe, include the pthreads header and define -** the SQLITE_UNIX_THREADS macro. +** If we are to be thread-safe, include the pthreads header. */ #if SQLITE_THREADSAFE /* # include */ -# define SQLITE_UNIX_THREADS 1 #endif /* @@ -32241,7 +33444,7 @@ static pid_t randomnessPid = 0; ****************************************************************************** ** ** This file contains inline asm code for retrieving "high-performance" -** counters for x86 class CPUs. +** counters for x86 and x86_64 class CPUs. */ #ifndef SQLITE_HWTIME_H #define SQLITE_HWTIME_H @@ -32252,8 +33455,9 @@ static pid_t randomnessPid = 0; ** processor and returns that value. This can be used for high-res ** profiling. */ -#if (defined(__GNUC__) || defined(_MSC_VER)) && \ - (defined(i386) || defined(__i386__) || defined(_M_IX86)) +#if !defined(__STRICT_ANSI__) && \ + (defined(__GNUC__) || defined(_MSC_VER)) && \ + (defined(i386) || defined(__i386__) || defined(_M_IX86)) #if defined(__GNUC__) @@ -32274,7 +33478,7 @@ static pid_t randomnessPid = 0; #endif -#elif (defined(__GNUC__) && defined(__x86_64__)) +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__)) __inline__ sqlite_uint64 sqlite3Hwtime(void){ unsigned long val; @@ -32282,7 +33486,7 @@ static pid_t randomnessPid = 0; return val; } -#elif (defined(__GNUC__) && defined(__ppc__)) +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__)) __inline__ sqlite_uint64 sqlite3Hwtime(void){ unsigned long long retval; @@ -32299,14 +33503,13 @@ static pid_t randomnessPid = 0; #else - #error Need implementation of sqlite3Hwtime() for your platform. - /* - ** To compile without implementing sqlite3Hwtime() for your platform, - ** you can remove the above #error and use the following - ** stub function. You will lose timing support for many - ** of the debugging and testing utilities, but it should at - ** least compile and run. + ** asm() is needed for hardware timing support. Without asm(), + ** disable the sqlite3Hwtime() routine. + ** + ** sqlite3Hwtime() is only used for some obscure debugging + ** and analysis configurations, not in any deliverable, so this + ** should not be a great loss. */ SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } @@ -32622,13 +33825,14 @@ static struct unix_syscall { #if defined(__linux__) && defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) # ifdef __ANDROID__ { "ioctl", (sqlite3_syscall_ptr)(int(*)(int, int, ...))ioctl, 0 }, +#define osIoctl ((int(*)(int,int,...))aSyscall[28].pCurrent) # else { "ioctl", (sqlite3_syscall_ptr)ioctl, 0 }, +#define osIoctl ((int(*)(int,unsigned long,...))aSyscall[28].pCurrent) # endif #else { "ioctl", (sqlite3_syscall_ptr)0, 0 }, #endif -#define osIoctl ((int(*)(int,int,...))aSyscall[28].pCurrent) }; /* End of the overrideable system calls */ @@ -33218,8 +34422,7 @@ struct unixFileId { /* ** An instance of the following structure is allocated for each open -** inode. Or, on LinuxThreads, there is one of these structures for -** each inode opened by each thread. +** inode. ** ** A single inode can have multiple file descriptors, so each unixFile ** structure contains a pointer to an instance of this object and this @@ -33265,13 +34468,16 @@ struct unixInodeInfo { /* ** A lists of all unixInodeInfo objects. +** +** Must hold unixBigLock in order to read or write this variable. */ static unixInodeInfo *inodeList = 0; /* All unixInodeInfo objects */ #ifdef SQLITE_DEBUG /* -** True if the inode mutex is held, or not. Used only within assert() -** to help verify correct mutex usage. +** True if the inode mutex (on the unixFile.pFileMutex field) is held, or not. +** This routine is used only within assert() to help verify correct mutex +** usage. */ int unixFileMutexHeld(unixFile *pFile){ assert( pFile->pInode ); @@ -33399,8 +34605,8 @@ static void closePendingFds(unixFile *pFile){ /* ** Release a unixInodeInfo structure previously allocated by findInodeInfo(). ** -** The mutex entered using the unixEnterMutex() function must be held -** when this function is called. +** The global mutex must be held when this routine is called, but the mutex +** on the inode being deleted must NOT be held. */ static void releaseInodeInfo(unixFile *pFile){ unixInodeInfo *pInode = pFile->pInode; @@ -33435,8 +34641,7 @@ static void releaseInodeInfo(unixFile *pFile){ ** describes that file descriptor. Create a new one if necessary. The ** return value might be uninitialized if an error occurs. ** -** The mutex entered using the unixEnterMutex() function must be held -** when this function is called. +** The global mutex must held when calling this routine. ** ** Return an appropriate error code. */ @@ -33497,6 +34702,7 @@ static int findInodeInfo( #else fileId.ino = (u64)statbuf.st_ino; #endif + assert( unixMutexHeld() ); pInode = inodeList; while( pInode && memcmp(&fileId, &pInode->fileId, sizeof(fileId)) ){ pInode = pInode->pNext; @@ -33516,6 +34722,7 @@ static int findInodeInfo( } } pInode->nRef = 1; + assert( unixMutexHeld() ); pInode->pNext = inodeList; pInode->pPrev = 0; if( inodeList ) inodeList->pPrev = pInode; @@ -35766,7 +36973,7 @@ static int openDirectory(const char *zFilename, int *pFd){ if( zDirname[0]!='/' ) zDirname[0] = '.'; zDirname[1] = 0; } - fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0); + fd = robust_open(zDirname, O_RDONLY|O_BINARY|O_NOFOLLOW, 0); if( fd>=0 ){ OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname)); } @@ -36313,18 +37520,18 @@ static int unixGetpagesize(void){ ** ** The following fields are read-only after the object is created: ** -** fid +** hShm ** zFilename ** -** Either unixShmNode.mutex must be held or unixShmNode.nRef==0 and +** Either unixShmNode.pShmMutex must be held or unixShmNode.nRef==0 and ** unixMutexHeld() is true when reading or writing any other field ** in this structure. */ struct unixShmNode { unixInodeInfo *pInode; /* unixInodeInfo that owns this SHM node */ - sqlite3_mutex *mutex; /* Mutex to access this object */ + sqlite3_mutex *pShmMutex; /* Mutex to access this object */ char *zFilename; /* Name of the mmapped file */ - int h; /* Open file descriptor */ + int hShm; /* Open file descriptor */ int szRegion; /* Size of shared-memory regions */ u16 nRegion; /* Size of array apRegion */ u8 isReadonly; /* True if read-only */ @@ -36346,16 +37553,16 @@ struct unixShmNode { ** The following fields are initialized when this object is created and ** are read-only thereafter: ** -** unixShm.pFile +** unixShm.pShmNode ** unixShm.id ** -** All other fields are read/write. The unixShm.pFile->mutex must be held -** while accessing any read/write fields. +** All other fields are read/write. The unixShm.pShmNode->pShmMutex must +** be held while accessing any read/write fields. */ struct unixShm { unixShmNode *pShmNode; /* The underlying unixShmNode object */ unixShm *pNext; /* Next unixShm with the same unixShmNode */ - u8 hasMutex; /* True if holding the unixShmNode mutex */ + u8 hasMutex; /* True if holding the unixShmNode->pShmMutex */ u8 id; /* Id of this connection within its unixShmNode */ u16 sharedMask; /* Mask of shared locks held */ u16 exclMask; /* Mask of exclusive locks held */ @@ -36385,7 +37592,8 @@ static int unixShmSystemLock( /* Access to the unixShmNode object is serialized by the caller */ pShmNode = pFile->pInode->pShmNode; - assert( pShmNode->nRef==0 || sqlite3_mutex_held(pShmNode->mutex) ); + assert( pShmNode->nRef==0 || sqlite3_mutex_held(pShmNode->pShmMutex) ); + assert( pShmNode->nRef>0 || unixMutexHeld() ); /* Shared locks never span more than one byte */ assert( n==1 || lockType!=F_RDLCK ); @@ -36393,13 +37601,13 @@ static int unixShmSystemLock( /* Locks are within range */ assert( n>=1 && n<=SQLITE_SHM_NLOCK ); - if( pShmNode->h>=0 ){ + if( pShmNode->hShm>=0 ){ /* Initialize the locking parameters */ f.l_type = lockType; f.l_whence = SEEK_SET; f.l_start = ofst; f.l_len = n; - rc = osSetPosixAdvisoryLock(pShmNode->h, &f, pFile); + rc = osSetPosixAdvisoryLock(pShmNode->hShm, &f, pFile); rc = (rc!=(-1)) ? SQLITE_OK : SQLITE_BUSY; } @@ -36471,18 +37679,18 @@ static void unixShmPurge(unixFile *pFd){ int nShmPerMap = unixShmRegionPerMap(); int i; assert( p->pInode==pFd->pInode ); - sqlite3_mutex_free(p->mutex); + sqlite3_mutex_free(p->pShmMutex); for(i=0; inRegion; i+=nShmPerMap){ - if( p->h>=0 ){ + if( p->hShm>=0 ){ osMunmap(p->apRegion[i], p->szRegion); }else{ sqlite3_free(p->apRegion[i]); } } sqlite3_free(p->apRegion); - if( p->h>=0 ){ - robust_close(pFd, p->h, __LINE__); - p->h = -1; + if( p->hShm>=0 ){ + robust_close(pFd, p->hShm, __LINE__); + p->hShm = -1; } p->pInode->pShmNode = 0; sqlite3_free(p); @@ -36524,7 +37732,7 @@ static int unixLockSharedMemory(unixFile *pDbFd, unixShmNode *pShmNode){ lock.l_start = UNIX_SHM_DMS; lock.l_len = 1; lock.l_type = F_WRLCK; - if( osFcntl(pShmNode->h, F_GETLK, &lock)!=0 ) { + if( osFcntl(pShmNode->hShm, F_GETLK, &lock)!=0 ) { rc = SQLITE_IOERR_LOCK; }else if( lock.l_type==F_UNLCK ){ if( pShmNode->isReadonly ){ @@ -36532,7 +37740,12 @@ static int unixLockSharedMemory(unixFile *pDbFd, unixShmNode *pShmNode){ rc = SQLITE_READONLY_CANTINIT; }else{ rc = unixShmSystemLock(pDbFd, F_WRLCK, UNIX_SHM_DMS, 1); - if( rc==SQLITE_OK && robust_ftruncate(pShmNode->h, 0) ){ + /* The first connection to attach must truncate the -shm file. We + ** truncate to 3 bytes (an arbitrary small number, less than the + ** -shm header size) rather than 0 as a system debugging aid, to + ** help detect if a -shm file truncation is legitimate or is the work + ** or a rogue process. */ + if( rc==SQLITE_OK && robust_ftruncate(pShmNode->hShm, 3) ){ rc = unixLogError(SQLITE_IOERR_SHMOPEN,"ftruncate",pShmNode->zFilename); } } @@ -36638,12 +37851,12 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ sqlite3_snprintf(nShmFilename, zShm, "%s-shm", zBasePath); sqlite3FileSuffix3(pDbFd->zPath, zShm); #endif - pShmNode->h = -1; + pShmNode->hShm = -1; pDbFd->pInode->pShmNode = pShmNode; pShmNode->pInode = pDbFd->pInode; if( sqlite3GlobalConfig.bCoreMutex ){ - pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); - if( pShmNode->mutex==0 ){ + pShmNode->pShmMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); + if( pShmNode->pShmMutex==0 ){ rc = SQLITE_NOMEM_BKPT; goto shm_open_err; } @@ -36651,11 +37864,13 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ if( pInode->bProcessLock==0 ){ if( 0==sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){ - pShmNode->h = robust_open(zShm, O_RDWR|O_CREAT, (sStat.st_mode&0777)); + pShmNode->hShm = robust_open(zShm, O_RDWR|O_CREAT|O_NOFOLLOW, + (sStat.st_mode&0777)); } - if( pShmNode->h<0 ){ - pShmNode->h = robust_open(zShm, O_RDONLY, (sStat.st_mode&0777)); - if( pShmNode->h<0 ){ + if( pShmNode->hShm<0 ){ + pShmNode->hShm = robust_open(zShm, O_RDONLY|O_NOFOLLOW, + (sStat.st_mode&0777)); + if( pShmNode->hShm<0 ){ rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zShm); goto shm_open_err; } @@ -36666,7 +37881,7 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ ** is owned by the same user that owns the original database. Otherwise, ** the original owner will not be able to connect. */ - robustFchown(pShmNode->h, sStat.st_uid, sStat.st_gid); + robustFchown(pShmNode->hShm, sStat.st_uid, sStat.st_gid); rc = unixLockSharedMemory(pDbFd, pShmNode); if( rc!=SQLITE_OK && rc!=SQLITE_READONLY_CANTINIT ) goto shm_open_err; @@ -36686,13 +37901,13 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ ** the cover of the unixEnterMutex() mutex and the pointer from the ** new (struct unixShm) object to the pShmNode has been set. All that is ** left to do is to link the new object into the linked list starting - ** at pShmNode->pFirst. This must be done while holding the pShmNode->mutex - ** mutex. + ** at pShmNode->pFirst. This must be done while holding the + ** pShmNode->pShmMutex. */ - sqlite3_mutex_enter(pShmNode->mutex); + sqlite3_mutex_enter(pShmNode->pShmMutex); p->pNext = pShmNode->pFirst; pShmNode->pFirst = p; - sqlite3_mutex_leave(pShmNode->mutex); + sqlite3_mutex_leave(pShmNode->pShmMutex); return rc; /* Jump here on any error */ @@ -36744,7 +37959,7 @@ static int unixShmMap( p = pDbFd->pShm; pShmNode = p->pShmNode; - sqlite3_mutex_enter(pShmNode->mutex); + sqlite3_mutex_enter(pShmNode->pShmMutex); if( pShmNode->isUnlocked ){ rc = unixLockSharedMemory(pDbFd, pShmNode); if( rc!=SQLITE_OK ) goto shmpage_out; @@ -36752,8 +37967,8 @@ static int unixShmMap( } assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 ); assert( pShmNode->pInode==pDbFd->pInode ); - assert( pShmNode->h>=0 || pDbFd->pInode->bProcessLock==1 ); - assert( pShmNode->h<0 || pDbFd->pInode->bProcessLock==0 ); + assert( pShmNode->hShm>=0 || pDbFd->pInode->bProcessLock==1 ); + assert( pShmNode->hShm<0 || pDbFd->pInode->bProcessLock==0 ); /* Minimum number of regions required to be mapped. */ nReqRegion = ((iRegion+nShmPerMap) / nShmPerMap) * nShmPerMap; @@ -36765,12 +37980,12 @@ static int unixShmMap( pShmNode->szRegion = szRegion; - if( pShmNode->h>=0 ){ + if( pShmNode->hShm>=0 ){ /* The requested region is not mapped into this processes address space. ** Check to see if it has been allocated (i.e. if the wal-index file is ** large enough to contain the requested region). */ - if( osFstat(pShmNode->h, &sStat) ){ + if( osFstat(pShmNode->hShm, &sStat) ){ rc = SQLITE_IOERR_SHMSIZE; goto shmpage_out; } @@ -36798,7 +38013,7 @@ static int unixShmMap( assert( (nByte % pgsz)==0 ); for(iPg=(sStat.st_size/pgsz); iPg<(nByte/pgsz); iPg++){ int x = 0; - if( seekAndWriteFd(pShmNode->h, iPg*pgsz + pgsz-1, "", 1, &x)!=1 ){ + if( seekAndWriteFd(pShmNode->hShm, iPg*pgsz + pgsz-1,"",1,&x)!=1 ){ const char *zFile = pShmNode->zFilename; rc = unixLogError(SQLITE_IOERR_SHMSIZE, "write", zFile); goto shmpage_out; @@ -36821,22 +38036,22 @@ static int unixShmMap( int nMap = szRegion*nShmPerMap; int i; void *pMem; - if( pShmNode->h>=0 ){ + if( pShmNode->hShm>=0 ){ pMem = osMmap(0, nMap, pShmNode->isReadonly ? PROT_READ : PROT_READ|PROT_WRITE, - MAP_SHARED, pShmNode->h, szRegion*(i64)pShmNode->nRegion + MAP_SHARED, pShmNode->hShm, szRegion*(i64)pShmNode->nRegion ); if( pMem==MAP_FAILED ){ rc = unixLogError(SQLITE_IOERR_SHMMAP, "mmap", pShmNode->zFilename); goto shmpage_out; } }else{ - pMem = sqlite3_malloc64(szRegion); + pMem = sqlite3_malloc64(nMap); if( pMem==0 ){ rc = SQLITE_NOMEM_BKPT; goto shmpage_out; } - memset(pMem, 0, szRegion); + memset(pMem, 0, nMap); } for(i=0; iisReadonly && rc==SQLITE_OK ) rc = SQLITE_READONLY; - sqlite3_mutex_leave(pShmNode->mutex); + sqlite3_mutex_leave(pShmNode->pShmMutex); return rc; } @@ -36887,12 +38102,12 @@ static int unixShmLock( || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED) || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) ); assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 ); - assert( pShmNode->h>=0 || pDbFd->pInode->bProcessLock==1 ); - assert( pShmNode->h<0 || pDbFd->pInode->bProcessLock==0 ); + assert( pShmNode->hShm>=0 || pDbFd->pInode->bProcessLock==1 ); + assert( pShmNode->hShm<0 || pDbFd->pInode->bProcessLock==0 ); mask = (1<<(ofst+n)) - (1<1 || mask==(1<mutex); + sqlite3_mutex_enter(pShmNode->pShmMutex); if( flags & SQLITE_SHM_UNLOCK ){ u16 allMask = 0; /* Mask of locks held by siblings */ @@ -36965,7 +38180,7 @@ static int unixShmLock( } } } - sqlite3_mutex_leave(pShmNode->mutex); + sqlite3_mutex_leave(pShmNode->pShmMutex); OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x\n", p->id, osGetpid(0), p->sharedMask, p->exclMask)); return rc; @@ -37015,14 +38230,14 @@ static int unixShmUnmap( /* Remove connection p from the set of connections associated ** with pShmNode */ - sqlite3_mutex_enter(pShmNode->mutex); + sqlite3_mutex_enter(pShmNode->pShmMutex); for(pp=&pShmNode->pFirst; (*pp)!=p; pp = &(*pp)->pNext){} *pp = p->pNext; /* Free the connection p */ sqlite3_free(p); pDbFd->pShm = 0; - sqlite3_mutex_leave(pShmNode->mutex); + sqlite3_mutex_leave(pShmNode->pShmMutex); /* If pShmNode->nRef has reached 0, then close the underlying ** shared-memory file, too */ @@ -37031,7 +38246,7 @@ static int unixShmUnmap( assert( pShmNode->nRef>0 ); pShmNode->nRef--; if( pShmNode->nRef==0 ){ - if( deleteFlag && pShmNode->h>=0 ){ + if( deleteFlag && pShmNode->hShm>=0 ){ osUnlink(pShmNode->zFilename); } unixShmPurge(pDbFd); @@ -37861,6 +39076,7 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){ UnixUnusedFd **pp; assert( sqlite3_mutex_notheld(pInode->pLockMutex) ); sqlite3_mutex_enter(pInode->pLockMutex); + flags &= (SQLITE_OPEN_READONLY|SQLITE_OPEN_READWRITE); for(pp=&pInode->pUnused; *pp && (*pp)->flags!=flags; pp=&((*pp)->pNext)); pUnused = *pp; if( pUnused ){ @@ -37914,7 +39130,7 @@ static int getFileMode( ** If the SQLITE_ENABLE_8_3_NAMES option is enabled, then the ** original filename is unavailable. But 8_3_NAMES is only used for ** FAT filesystems and permissions do not matter there, so just use -** the default permissions. +** the default permissions. In 8_3_NAMES mode, leave *pMode set to zero. */ static int findCreateFileMode( const char *zPath, /* Path of file (possibly) being created */ @@ -38003,7 +39219,7 @@ static int unixOpen( unixFile *p = (unixFile *)pFile; int fd = -1; /* File descriptor returned by open() */ int openFlags = 0; /* Flags to pass to open() */ - int eType = flags&0xFFFFFF00; /* Type of file to open */ + int eType = flags&0x0FFF00; /* Type of file to open */ int noLock; /* True to omit locking primitives */ int rc = SQLITE_OK; /* Function Return Code */ int ctrlFlags = 0; /* UNIXFILE_* flags */ @@ -38113,7 +39329,7 @@ static int unixOpen( if( isReadWrite ) openFlags |= O_RDWR; if( isCreate ) openFlags |= O_CREAT; if( isExclusive ) openFlags |= (O_EXCL|O_NOFOLLOW); - openFlags |= (O_LARGEFILE|O_BINARY); + openFlags |= (O_LARGEFILE|O_BINARY|O_NOFOLLOW); if( fd<0 ){ mode_t openMode; /* Permissions to create file with */ @@ -38149,11 +39365,19 @@ static int unixOpen( goto open_finished; } - /* If this process is running as root and if creating a new rollback - ** journal or WAL file, set the ownership of the journal or WAL to be - ** the same as the original database. + /* The owner of the rollback journal or WAL file should always be the + ** same as the owner of the database file. Try to ensure that this is + ** the case. The chown() system call will be a no-op if the current + ** process lacks root privileges, be we should at least try. Without + ** this step, if a root process opens a database file, it can leave + ** behinds a journal/WAL that is owned by root and hence make the + ** database inaccessible to unprivileged processes. + ** + ** If openMode==0, then that means uid and gid are not set correctly + ** (probably because SQLite is configured to use 8+3 filename mode) and + ** in that case we do not want to attempt the chown(). */ - if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){ + if( openMode && (flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL))!=0 ){ robustFchown(fd, uid, gid); } } @@ -38164,7 +39388,8 @@ static int unixOpen( if( p->pPreallocatedUnused ){ p->pPreallocatedUnused->fd = fd; - p->pPreallocatedUnused->flags = flags; + p->pPreallocatedUnused->flags = + flags & (SQLITE_OPEN_READONLY|SQLITE_OPEN_READWRITE); } if( isDelete ){ @@ -38322,7 +39547,8 @@ static int unixAccess( if( flags==SQLITE_ACCESS_EXISTS ){ struct stat buf; - *pResOut = (0==osStat(zPath, &buf) && buf.st_size>0); + *pResOut = 0==osStat(zPath, &buf) && + (!S_ISREG(buf.st_mode) || buf.st_size>0); }else{ *pResOut = osAccess(zPath, W_OK|R_OK)==0; } @@ -38376,7 +39602,7 @@ static int unixFullPathname( #else int rc = SQLITE_OK; int nByte; - int nLink = 1; /* Number of symbolic links followed so far */ + int nLink = 0; /* Number of symbolic links followed so far */ const char *zIn = zPath; /* Input path for each iteration of loop */ char *zDel = 0; @@ -38405,10 +39631,11 @@ static int unixFullPathname( } if( bLink ){ + nLink++; if( zDel==0 ){ zDel = sqlite3_malloc(nOut); if( zDel==0 ) rc = SQLITE_NOMEM_BKPT; - }else if( ++nLink>SQLITE_MAX_SYMLINKS ){ + }else if( nLink>=SQLITE_MAX_SYMLINKS ){ rc = SQLITE_CANTOPEN_BKPT; } @@ -38444,6 +39671,7 @@ static int unixFullPathname( }while( rc==SQLITE_OK ); sqlite3_free(zDel); + if( rc==SQLITE_OK && nLink ) rc = SQLITE_OK_SYMLINK; return rc; #endif /* HAVE_READLINK && HAVE_LSTAT */ } @@ -38929,7 +40157,7 @@ static int proxyCreateUnixFile( int fd = -1; unixFile *pNew; int rc = SQLITE_OK; - int openFlags = O_RDWR | O_CREAT; + int openFlags = O_RDWR | O_CREAT | O_NOFOLLOW; sqlite3_vfs dummyVfs; int terrno = 0; UnixUnusedFd *pUnused = NULL; @@ -38959,7 +40187,7 @@ static int proxyCreateUnixFile( } } if( fd<0 ){ - openFlags = O_RDONLY; + openFlags = O_RDONLY | O_NOFOLLOW; fd = robust_open(path, openFlags, 0); terrno = errno; } @@ -39010,7 +40238,7 @@ SQLITE_API int sqlite3_hostid_num = 0; #define PROXY_HOSTIDLEN 16 /* conch file host id length */ -#ifdef HAVE_GETHOSTUUID +#if HAVE_GETHOSTUUID /* Not always defined in the headers as it ought to be */ extern int gethostuuid(uuid_t id, const struct timespec *wait); #endif @@ -39021,7 +40249,7 @@ extern int gethostuuid(uuid_t id, const struct timespec *wait); static int proxyGetHostID(unsigned char *pHostID, int *pError){ assert(PROXY_HOSTIDLEN == sizeof(uuid_t)); memset(pHostID, 0, PROXY_HOSTIDLEN); -#ifdef HAVE_GETHOSTUUID +#if HAVE_GETHOSTUUID { struct timespec timeout = {1, 0}; /* 1 sec timeout */ if( gethostuuid(pHostID, &timeout) ){ @@ -39085,7 +40313,7 @@ static int proxyBreakConchLock(unixFile *pFile, uuid_t myHostID){ goto end_breaklock; } /* write it out to the temporary break file */ - fd = robust_open(tPath, (O_RDWR|O_CREAT|O_EXCL), 0); + fd = robust_open(tPath, (O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW), 0); if( fd<0 ){ sqlite3_snprintf(sizeof(errmsg), errmsg, "create failed (%d)", errno); goto end_breaklock; @@ -39695,7 +40923,7 @@ static int proxyFileControl(sqlite3_file *id, int op, void *pArg){ assert( 0 ); /* The call assures that only valid opcodes are sent */ } } - /*NOTREACHED*/ + /*NOTREACHED*/ assert(0); return SQLITE_ERROR; } @@ -40043,7 +41271,7 @@ SQLITE_API int sqlite3_os_end(void){ ****************************************************************************** ** ** This file contains inline asm code for retrieving "high-performance" -** counters for x86 class CPUs. +** counters for x86 and x86_64 class CPUs. */ #ifndef SQLITE_HWTIME_H #define SQLITE_HWTIME_H @@ -40054,8 +41282,9 @@ SQLITE_API int sqlite3_os_end(void){ ** processor and returns that value. This can be used for high-res ** profiling. */ -#if (defined(__GNUC__) || defined(_MSC_VER)) && \ - (defined(i386) || defined(__i386__) || defined(_M_IX86)) +#if !defined(__STRICT_ANSI__) && \ + (defined(__GNUC__) || defined(_MSC_VER)) && \ + (defined(i386) || defined(__i386__) || defined(_M_IX86)) #if defined(__GNUC__) @@ -40076,7 +41305,7 @@ SQLITE_API int sqlite3_os_end(void){ #endif -#elif (defined(__GNUC__) && defined(__x86_64__)) +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__)) __inline__ sqlite_uint64 sqlite3Hwtime(void){ unsigned long val; @@ -40084,7 +41313,7 @@ SQLITE_API int sqlite3_os_end(void){ return val; } -#elif (defined(__GNUC__) && defined(__ppc__)) +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__)) __inline__ sqlite_uint64 sqlite3Hwtime(void){ unsigned long long retval; @@ -40101,14 +41330,13 @@ SQLITE_API int sqlite3_os_end(void){ #else - #error Need implementation of sqlite3Hwtime() for your platform. - /* - ** To compile without implementing sqlite3Hwtime() for your platform, - ** you can remove the above #error and use the following - ** stub function. You will lose timing support for many - ** of the debugging and testing utilities, but it should at - ** least compile and run. + ** asm() is needed for hardware timing support. Without asm(), + ** disable the sqlite3Hwtime() routine. + ** + ** sqlite3Hwtime() is only used for some obscure debugging + ** and analysis configurations, not in any deliverable, so this + ** should not be a great loss. */ SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } @@ -40449,8 +41677,7 @@ struct winFile { int nFetchOut; /* Number of outstanding xFetch references */ HANDLE hMap; /* Handle for accessing memory mapping */ void *pMapRegion; /* Area memory mapped */ - sqlite3_int64 mmapSize; /* Usable size of mapped region */ - sqlite3_int64 mmapSizeActual; /* Actual size of mapped region */ + sqlite3_int64 mmapSize; /* Size of mapped region */ sqlite3_int64 mmapSizeMax; /* Configured FCNTL_MMAP_SIZE value */ #endif }; @@ -43071,6 +44298,26 @@ static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){ DWORD lastErrno; #if SQLITE_MAX_MMAP_SIZE>0 sqlite3_int64 oldMmapSize; + if( pFile->nFetchOut>0 ){ + /* File truncation is a no-op if there are outstanding memory mapped + ** pages. This is because truncating the file means temporarily unmapping + ** the file, and that might delete memory out from under existing cursors. + ** + ** This can result in incremental vacuum not truncating the file, + ** if there is an active read cursor when the incremental vacuum occurs. + ** No real harm comes of this - the database file is not corrupted, + ** though some folks might complain that the file is bigger than it + ** needs to be. + ** + ** The only feasible work-around is to defer the truncation until after + ** all references to memory-mapped content are closed. That is doable, + ** but involves adding a few branches in the common write code path which + ** could slow down normal operations slightly. Hence, we have decided for + ** now to simply make trancations a no-op if there are pending reads. We + ** can maybe revisit this decision in the future. + */ + return SQLITE_OK; + } #endif assert( pFile ); @@ -44361,6 +45608,7 @@ static int winShmMap( rc = winOpenSharedMemory(pDbFd); if( rc!=SQLITE_OK ) return rc; pShm = pDbFd->pShm; + assert( pShm!=0 ); } pShmNode = pShm->pShmNode; @@ -44499,9 +45747,9 @@ static int winShmMap( static int winUnmapfile(winFile *pFile){ assert( pFile!=0 ); OSTRACE(("UNMAP-FILE pid=%lu, pFile=%p, hMap=%p, pMapRegion=%p, " - "mmapSize=%lld, mmapSizeActual=%lld, mmapSizeMax=%lld\n", + "mmapSize=%lld, mmapSizeMax=%lld\n", osGetCurrentProcessId(), pFile, pFile->hMap, pFile->pMapRegion, - pFile->mmapSize, pFile->mmapSizeActual, pFile->mmapSizeMax)); + pFile->mmapSize, pFile->mmapSizeMax)); if( pFile->pMapRegion ){ if( !osUnmapViewOfFile(pFile->pMapRegion) ){ pFile->lastErrno = osGetLastError(); @@ -44513,7 +45761,6 @@ static int winUnmapfile(winFile *pFile){ } pFile->pMapRegion = 0; pFile->mmapSize = 0; - pFile->mmapSizeActual = 0; } if( pFile->hMap!=NULL ){ if( !osCloseHandle(pFile->hMap) ){ @@ -44624,7 +45871,6 @@ static int winMapfile(winFile *pFd, sqlite3_int64 nByte){ } pFd->pMapRegion = pNew; pFd->mmapSize = nMap; - pFd->mmapSizeActual = nMap; } OSTRACE(("MAP-FILE pid=%lu, pFile=%p, rc=SQLITE_OK\n", @@ -44665,6 +45911,7 @@ static int winFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){ } } if( pFd->mmapSize >= iOff+nAmt ){ + assert( pFd->pMapRegion!=0 ); *pp = &((u8 *)pFd->pMapRegion)[iOff]; pFd->nFetchOut++; } @@ -45426,7 +46673,6 @@ static int winOpen( pFile->hMap = NULL; pFile->pMapRegion = 0; pFile->mmapSize = 0; - pFile->mmapSizeActual = 0; pFile->mmapSizeMax = sqlite3GlobalConfig.szMmap; #endif @@ -46319,7 +47565,8 @@ typedef struct MemFile MemFile; struct MemFile { sqlite3_file base; /* IO methods */ sqlite3_int64 sz; /* Size of the file */ - sqlite3_int64 szMax; /* Space allocated to aData */ + sqlite3_int64 szAlloc; /* Space allocated to aData */ + sqlite3_int64 szMax; /* Maximum allowed size of the file */ unsigned char *aData; /* content of the file */ int nMmap; /* Number of memory mapped pages */ unsigned mFlags; /* Flags */ @@ -46445,10 +47692,15 @@ static int memdbEnlarge(MemFile *p, sqlite3_int64 newSz){ if( (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 || p->nMmap>0 ){ return SQLITE_FULL; } + if( newSz>p->szMax ){ + return SQLITE_FULL; + } + newSz *= 2; + if( newSz>p->szMax ) newSz = p->szMax; pNew = sqlite3_realloc64(p->aData, newSz); if( pNew==0 ) return SQLITE_NOMEM; p->aData = pNew; - p->szMax = newSz; + p->szAlloc = newSz; return SQLITE_OK; } @@ -46462,10 +47714,11 @@ static int memdbWrite( sqlite_int64 iOfst ){ MemFile *p = (MemFile *)pFile; + if( NEVER(p->mFlags & SQLITE_DESERIALIZE_READONLY) ) return SQLITE_READONLY; if( iOfst+iAmt>p->sz ){ int rc; - if( iOfst+iAmt>p->szMax - && (rc = memdbEnlarge(p, (iOfst+iAmt)*2))!=SQLITE_OK + if( iOfst+iAmt>p->szAlloc + && (rc = memdbEnlarge(p, iOfst+iAmt))!=SQLITE_OK ){ return rc; } @@ -46511,6 +47764,11 @@ static int memdbFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ */ static int memdbLock(sqlite3_file *pFile, int eLock){ MemFile *p = (MemFile *)pFile; + if( eLock>SQLITE_LOCK_SHARED + && (p->mFlags & SQLITE_DESERIALIZE_READONLY)!=0 + ){ + return SQLITE_READONLY; + } p->eLock = eLock; return SQLITE_OK; } @@ -46535,6 +47793,19 @@ static int memdbFileControl(sqlite3_file *pFile, int op, void *pArg){ *(char**)pArg = sqlite3_mprintf("memdb(%p,%lld)", p->aData, p->sz); rc = SQLITE_OK; } + if( op==SQLITE_FCNTL_SIZE_LIMIT ){ + sqlite3_int64 iLimit = *(sqlite3_int64*)pArg; + if( iLimitsz ){ + if( iLimit<0 ){ + iLimit = p->szMax; + }else{ + iLimit = p->sz; + } + } + p->szMax = iLimit; + *(sqlite3_int64*)pArg = iLimit; + rc = SQLITE_OK; + } return rc; } @@ -46565,8 +47836,12 @@ static int memdbFetch( void **pp ){ MemFile *p = (MemFile *)pFile; - p->nMmap++; - *pp = (void*)(p->aData + iOfst); + if( iOfst+iAmt>p->sz ){ + *pp = 0; + }else{ + p->nMmap++; + *pp = (void*)(p->aData + iOfst); + } return SQLITE_OK; } @@ -46596,6 +47871,7 @@ static int memdbOpen( assert( pOutFlags!=0 ); /* True because flags==SQLITE_OPEN_MAIN_DB */ *pOutFlags = flags | SQLITE_OPEN_MEMORY; p->base.pMethods = &memdb_io_methods; + p->szMax = sqlite3GlobalConfig.mxMemdbSize; return SQLITE_OK; } @@ -46845,7 +48121,11 @@ SQLITE_API int sqlite3_deserialize( }else{ p->aData = pData; p->sz = szDb; + p->szAlloc = szBuf; p->szMax = szBuf; + if( p->szMaxszMax = sqlite3GlobalConfig.mxMemdbSize; + } p->mFlags = mFlags; rc = SQLITE_OK; } @@ -47323,7 +48603,7 @@ SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){ ** The PCache.pSynced variable is used to optimize searching for a dirty ** page to eject from the cache mid-transaction. It is better to eject ** a page that does not require a journal sync than one that does. -** Therefore, pSynced is maintained to that it *almost* always points +** Therefore, pSynced is maintained so that it *almost* always points ** to either the oldest page in the pDirty/pDirtyTail list that has a ** clear PGHDR_NEED_SYNC flag or to a page that is older than this one ** (so that the right page to eject can be found by following pDirtyPrev @@ -47534,9 +48814,10 @@ static int numberOfCachePages(PCache *p){ ** suggested cache size is set to N. */ return p->szCache; }else{ - /* IMPLEMENTATION-OF: R-61436-13639 If the argument N is negative, then - ** the number of cache pages is adjusted to use approximately abs(N*1024) - ** bytes of memory. */ + /* IMPLEMANTATION-OF: R-59858-46238 If the argument N is negative, then the + ** number of cache pages is adjusted to be a number of pages that would + ** use approximately abs(N*1024) bytes of memory based on the current + ** page size. */ return (int)((-1024*(i64)p->szCache)/(p->szPage+p->szExtra)); } } @@ -47552,6 +48833,7 @@ SQLITE_PRIVATE int sqlite3PcacheInitialize(void){ ** built-in default page cache is used instead of the application defined ** page cache. */ sqlite3PCacheSetDefault(); + assert( sqlite3GlobalConfig.pcache2.xInit!=0 ); } return sqlite3GlobalConfig.pcache2.xInit(sqlite3GlobalConfig.pcache2.pArg); } @@ -48147,6 +49429,15 @@ SQLITE_PRIVATE int sqlite3PCachePercentDirty(PCache *pCache){ return nCache ? (int)(((i64)nDirty * 100) / nCache) : 0; } +#ifdef SQLITE_DIRECT_OVERFLOW_READ +/* +** Return true if there are one or more dirty pages in the cache. Else false. +*/ +SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache){ + return (pCache->pDirty!=0); +} +#endif + #if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG) /* ** For all dirty pages currently in the cache, invoke the specified @@ -48257,20 +49548,32 @@ typedef struct PGroup PGroup; ** structure. Unless SQLITE_PCACHE_SEPARATE_HEADER is defined, a buffer of ** PgHdr1.pCache->szPage bytes is allocated directly before this structure ** in memory. +** +** Note: Variables isBulkLocal and isAnchor were once type "u8". That works, +** but causes a 2-byte gap in the structure for most architectures (since +** pointers must be either 4 or 8-byte aligned). As this structure is located +** in memory directly after the associated page data, if the database is +** corrupt, code at the b-tree layer may overread the page buffer and +** read part of this structure before the corruption is detected. This +** can cause a valgrind error if the unitialized gap is accessed. Using u16 +** ensures there is no such gap, and therefore no bytes of unitialized memory +** in the structure. */ struct PgHdr1 { sqlite3_pcache_page page; /* Base class. Must be first. pBuf & pExtra */ unsigned int iKey; /* Key value (page number) */ - u8 isBulkLocal; /* This page from bulk local storage */ - u8 isAnchor; /* This is the PGroup.lru element */ + u16 isBulkLocal; /* This page from bulk local storage */ + u16 isAnchor; /* This is the PGroup.lru element */ PgHdr1 *pNext; /* Next in hash table chain */ PCache1 *pCache; /* Cache that currently owns this page */ PgHdr1 *pLruNext; /* Next in LRU list of unpinned pages */ PgHdr1 *pLruPrev; /* Previous in LRU list of unpinned pages */ + /* NB: pLruPrev is only valid if pLruNext!=0 */ }; /* -** A page is pinned if it is no on the LRU list +** A page is pinned if it is not on the LRU list. To be "pinned" means +** that the page is in active use and must not be deallocated. */ #define PAGE_IS_PINNED(p) ((p)->pLruNext==0) #define PAGE_IS_UNPINNED(p) ((p)->pLruNext!=0) @@ -48331,6 +49634,7 @@ struct PCache1 { unsigned int nMax; /* Configured "cache_size" value */ unsigned int n90pct; /* nMax*9/10 */ unsigned int iMaxKey; /* Largest key seen since xTruncate() */ + unsigned int nPurgeableDummy; /* pnPurgeable points here when not used*/ /* Hash table of all pages. The following variables may only be accessed ** when the accessor is holding the PGroup mutex. @@ -48465,6 +49769,7 @@ static int pcache1InitBulk(PCache1 *pCache){ pX->isBulkLocal = 1; pX->isAnchor = 0; pX->pNext = pCache->pFree; + pX->pLruPrev = 0; /* Initializing this saves a valgrind error */ pCache->pFree = pX; zBulk += pCache->szAlloc; }while( --nBulk ); @@ -48575,6 +49880,7 @@ static PgHdr1 *pcache1AllocPage(PCache1 *pCache, int benignMalloc){ assert( sqlite3_mutex_held(pCache->pGroup->mutex) ); if( pCache->pFree || (pCache->nPage==0 && pcache1InitBulk(pCache)) ){ + assert( pCache->pFree!=0 ); p = pCache->pFree; pCache->pFree = p->pNext; p->pNext = 0; @@ -48598,13 +49904,15 @@ static PgHdr1 *pcache1AllocPage(PCache1 *pCache, int benignMalloc){ } #else pPg = pcache1Alloc(pCache->szAlloc); - p = (PgHdr1 *)&((u8 *)pPg)[pCache->szPage]; #endif if( benignMalloc ){ sqlite3EndBenignMalloc(); } #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT pcache1EnterMutex(pCache->pGroup); #endif if( pPg==0 ) return 0; +#ifndef SQLITE_PCACHE_SEPARATE_HEADER + p = (PgHdr1 *)&((u8 *)pPg)[pCache->szPage]; +#endif p->page.pBuf = pPg; p->page.pExtra = &p[1]; p->isBulkLocal = 0; @@ -48640,6 +49948,7 @@ static void pcache1FreePage(PgHdr1 *p){ ** exists, this function falls back to sqlite3Malloc(). */ SQLITE_PRIVATE void *sqlite3PageMalloc(int sz){ + assert( sz<=65536+8 ); /* These allocations are never very large */ return pcache1Alloc(sz); } @@ -48734,7 +50043,8 @@ static PgHdr1 *pcache1PinPage(PgHdr1 *pPage){ pPage->pLruPrev->pLruNext = pPage->pLruNext; pPage->pLruNext->pLruPrev = pPage->pLruPrev; pPage->pLruNext = 0; - pPage->pLruPrev = 0; + /* pPage->pLruPrev = 0; + ** No need to clear pLruPrev as it is never accessed if pLruNext is 0 */ assert( pPage->isAnchor==0 ); assert( pPage->pCache->pGroup->lru.isAnchor==1 ); pPage->pCache->nRecyclable--; @@ -48927,6 +50237,7 @@ static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ }else{ pGroup = &pcache1.grp; } + pcache1EnterMutex(pGroup); if( pGroup->lru.isAnchor==0 ){ pGroup->lru.isAnchor = 1; pGroup->lru.pLruPrev = pGroup->lru.pLruNext = &pGroup->lru; @@ -48936,7 +50247,6 @@ static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ pCache->szExtra = szExtra; pCache->szAlloc = szPage + szExtra + ROUND8(sizeof(PgHdr1)); pCache->bPurgeable = (bPurgeable ? 1 : 0); - pcache1EnterMutex(pGroup); pcache1ResizeHash(pCache); if( bPurgeable ){ pCache->nMin = 10; @@ -48944,8 +50254,7 @@ static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; pCache->pnPurgeable = &pGroup->nPurgeable; }else{ - static unsigned int dummyCurrentPage; - pCache->pnPurgeable = &dummyCurrentPage; + pCache->pnPurgeable = &pCache->nPurgeableDummy; } pcache1LeaveMutex(pGroup); if( pCache->nHash==0 ){ @@ -49072,8 +50381,9 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( pPage->iKey = iKey; pPage->pNext = pCache->apHash[h]; pPage->pCache = pCache; - pPage->pLruPrev = 0; pPage->pLruNext = 0; + /* pPage->pLruPrev = 0; + ** No need to clear pLruPrev since it is not accessed when pLruNext==0 */ *(void **)pPage->page.pExtra = 0; pCache->apHash[h] = pPage; if( iKey>pCache->iMaxKey ){ @@ -49233,7 +50543,7 @@ static void pcache1Unpin( /* It is an error to call this function if the page is already ** part of the PGroup LRU list. */ - assert( pPage->pLruPrev==0 && pPage->pLruNext==0 ); + assert( pPage->pLruNext==0 ); assert( PAGE_IS_PINNED(pPage) ); if( reuseUnlikely || pGroup->nPurgeable>pGroup->nMaxPage ){ @@ -50910,19 +52220,33 @@ static const unsigned char aJournalMagic[] = { */ #define isOpen(pFd) ((pFd)->pMethods!=0) +#ifdef SQLITE_DIRECT_OVERFLOW_READ /* -** Return true if this pager uses a write-ahead log to read page pgno. -** Return false if the pager reads pgno directly from the database. +** Return true if page pgno can be read directly from the database file +** by the b-tree layer. This is the case if: +** +** * the database file is open, +** * there are no dirty pages in the cache, and +** * the desired page is not currently in the wal file. */ -#if !defined(SQLITE_OMIT_WAL) && defined(SQLITE_DIRECT_OVERFLOW_READ) -SQLITE_PRIVATE int sqlite3PagerUseWal(Pager *pPager, Pgno pgno){ - u32 iRead = 0; - int rc; - if( pPager->pWal==0 ) return 0; - rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iRead); - return rc || iRead; +SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ + if( pPager->fd->pMethods==0 ) return 0; + if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; +#ifdef SQLITE_HAS_CODEC + if( pPager->xCodec!=0 ) return 0; +#endif +#ifndef SQLITE_OMIT_WAL + if( pPager->pWal ){ + u32 iRead = 0; + int rc; + rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iRead); + return (rc==SQLITE_OK && iRead==0); + } +#endif + return 1; } #endif + #ifndef SQLITE_OMIT_WAL # define pagerUseWal(x) ((x)->pWal!=0) #else @@ -51243,6 +52567,7 @@ static int pagerUnlockDb(Pager *pPager, int eLock){ } IOTRACE(("UNLOCK %p %d\n", pPager, eLock)) } + pPager->changeCountDone = pPager->tempFile; /* ticket fb3b3024ea238d5c */ return rc; } @@ -51430,6 +52755,7 @@ static int readMasterJournal(sqlite3_file *pJrnl, char *zMaster, u32 nMaster){ len = 0; } zMaster[len] = '\0'; + zMaster[len+1] = '\0'; return SQLITE_OK; } @@ -51963,7 +53289,6 @@ static void pager_unlock(Pager *pPager){ ** code is cleared and the cache reset in the block below. */ assert( pPager->errCode || pPager->eState!=PAGER_ERROR ); - pPager->changeCountDone = 0; pPager->eState = PAGER_OPEN; } @@ -52227,7 +53552,6 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ && (!pagerUseWal(pPager) || sqlite3WalExclusiveMode(pPager->pWal, 0)) ){ rc2 = pagerUnlockDb(pPager, SHARED_LOCK); - pPager->changeCountDone = 0; } pPager->eState = PAGER_READER; pPager->setMaster = 0; @@ -52666,15 +53990,16 @@ static int pager_delmaster(Pager *pPager, const char *zMaster){ rc = sqlite3OsFileSize(pMaster, &nMasterJournal); if( rc!=SQLITE_OK ) goto delmaster_out; nMasterPtr = pVfs->mxPathname+1; - zMasterJournal = sqlite3Malloc(nMasterJournal + nMasterPtr + 1); + zMasterJournal = sqlite3Malloc(nMasterJournal + nMasterPtr + 2); if( !zMasterJournal ){ rc = SQLITE_NOMEM_BKPT; goto delmaster_out; } - zMasterPtr = &zMasterJournal[nMasterJournal+1]; + zMasterPtr = &zMasterJournal[nMasterJournal+2]; rc = sqlite3OsRead(pMaster, zMasterJournal, (int)nMasterJournal, 0); if( rc!=SQLITE_OK ) goto delmaster_out; zMasterJournal[nMasterJournal] = 0; + zMasterJournal[nMasterJournal+1] = 0; zJournal = zMasterJournal; while( (zJournal-zMasterJournal)fd, &nByte); } if( rc==SQLITE_OK ){ - pNew = (char *)sqlite3PageMalloc(pageSize); - if( !pNew ) rc = SQLITE_NOMEM_BKPT; + /* 8 bytes of zeroed overrun space is sufficient so that the b-tree + * cell header parser will never run off the end of the allocation */ + pNew = (char *)sqlite3PageMalloc(pageSize+8); + if( !pNew ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + memset(pNew+pageSize, 0, 8); + } } if( rc==SQLITE_OK ){ @@ -53913,7 +55244,10 @@ SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager *pPager, int mxPage){ pPager->mxPgno = mxPage; } assert( pPager->eState!=PAGER_OPEN ); /* Called only by OP_MaxPgcnt */ - assert( pPager->mxPgno>=pPager->dbSize ); /* OP_MaxPgcnt enforces this */ + /* assert( pPager->mxPgno>=pPager->dbSize ); */ + /* OP_MaxPgcnt ensures that the parameter passed to this function is not + ** less than the total number of valid pages in the database. But this + ** may be less than Pager.dbSize, and so the assert() above is not valid */ return pPager->mxPgno; } @@ -54822,7 +56156,8 @@ SQLITE_PRIVATE int sqlite3PagerOpen( int pcacheSize = sqlite3PcacheSize(); /* Bytes to allocate for PCache */ u32 szPageDflt = SQLITE_DEFAULT_PAGE_SIZE; /* Default page size */ const char *zUri = 0; /* URI args to copy */ - int nUri = 0; /* Number of bytes of URI args at *zUri */ + int nUriByte = 1; /* Number of bytes of URI args at *zUri */ + int nUri = 0; /* Number of URI parameters */ /* Figure out how much space is required for each journal file-handle ** (there are two of them, the main journal and the sub-journal). */ @@ -54856,14 +56191,24 @@ SQLITE_PRIVATE int sqlite3PagerOpen( } zPathname[0] = 0; /* Make sure initialized even if FullPathname() fails */ rc = sqlite3OsFullPathname(pVfs, zFilename, nPathname, zPathname); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_OK_SYMLINK ){ + if( vfsFlags & SQLITE_OPEN_NOFOLLOW ){ + rc = SQLITE_CANTOPEN_SYMLINK; + }else{ + rc = SQLITE_OK; + } + } + } nPathname = sqlite3Strlen30(zPathname); z = zUri = &zFilename[sqlite3Strlen30(zFilename)+1]; while( *z ){ - z += sqlite3Strlen30(z)+1; - z += sqlite3Strlen30(z)+1; + z += strlen(z)+1; + z += strlen(z)+1; + nUri++; } - nUri = (int)(&z[1] - zUri); - assert( nUri>=0 ); + nUriByte = (int)(&z[1] - zUri); + assert( nUriByte>=1 ); if( rc==SQLITE_OK && nPathname+8>pVfs->mxPathname ){ /* This branch is taken when the journal path required by ** the database being opened will be more than pVfs->mxPathname @@ -54888,50 +56233,103 @@ SQLITE_PRIVATE int sqlite3PagerOpen( ** Database file handle (pVfs->szOsFile bytes) ** Sub-journal file handle (journalFileSize bytes) ** Main journal file handle (journalFileSize bytes) + ** \0\0\0\0 database prefix (4 bytes) ** Database file name (nPathname+1 bytes) - ** Journal file name (nPathname+8+1 bytes) + ** URI query parameters (nUriByte bytes) + ** Journal filename (nPathname+8+1 bytes) + ** WAL filename (nPathname+4+1 bytes) + ** \0\0\0 terminator (3 bytes) + ** + ** Some 3rd-party software, over which we have no control, depends on + ** the specific order of the filenames and the \0 separators between them + ** so that it can (for example) find the database filename given the WAL + ** filename without using the sqlite3_filename_database() API. This is a + ** misuse of SQLite and a bug in the 3rd-party software, but the 3rd-party + ** software is in widespread use, so we try to avoid changing the filename + ** order and formatting if possible. In particular, the details of the + ** filename format expected by 3rd-party software should be as follows: + ** + ** - Main Database Path + ** - \0 + ** - Multiple URI components consisting of: + ** - Key + ** - \0 + ** - Value + ** - \0 + ** - \0 + ** - Journal Path + ** - \0 + ** - WAL Path (zWALName) + ** - \0 */ pPtr = (u8 *)sqlite3MallocZero( - ROUND8(sizeof(*pPager)) + /* Pager structure */ - ROUND8(pcacheSize) + /* PCache object */ - ROUND8(pVfs->szOsFile) + /* The main db file */ - journalFileSize * 2 + /* The two journal files */ - nPathname + 1 + nUri + /* zFilename */ - nPathname + 8 + 2 /* zJournal */ + ROUND8(sizeof(*pPager)) + /* Pager structure */ + ROUND8(pcacheSize) + /* PCache object */ + ROUND8(pVfs->szOsFile) + /* The main db file */ + journalFileSize * 2 + /* The two journal files */ + 4 + /* Database prefix */ + nPathname + 1 + /* database filename */ + nUriByte + /* query parameters */ + nPathname + 8 + 1 + /* Journal filename */ #ifndef SQLITE_OMIT_WAL - + nPathname + 4 + 2 /* zWal */ + nPathname + 4 + 1 + /* WAL filename */ #endif + 3 /* Terminator */ ); assert( EIGHT_BYTE_ALIGNMENT(SQLITE_INT_TO_PTR(journalFileSize)) ); if( !pPtr ){ sqlite3DbFree(0, zPathname); return SQLITE_NOMEM_BKPT; } - pPager = (Pager*)(pPtr); - pPager->pPCache = (PCache*)(pPtr += ROUND8(sizeof(*pPager))); - pPager->fd = (sqlite3_file*)(pPtr += ROUND8(pcacheSize)); - pPager->sjfd = (sqlite3_file*)(pPtr += ROUND8(pVfs->szOsFile)); - pPager->jfd = (sqlite3_file*)(pPtr += journalFileSize); - pPager->zFilename = (char*)(pPtr += journalFileSize); + pPager = (Pager*)pPtr; pPtr += ROUND8(sizeof(*pPager)); + pPager->pPCache = (PCache*)pPtr; pPtr += ROUND8(pcacheSize); + pPager->fd = (sqlite3_file*)pPtr; pPtr += ROUND8(pVfs->szOsFile); + pPager->sjfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; + pPager->jfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) ); - /* Fill in the Pager.zFilename and Pager.zJournal buffers, if required. */ - if( zPathname ){ - assert( nPathname>0 ); - pPager->zJournal = (char*)(pPtr += nPathname + 1 + nUri); - memcpy(pPager->zFilename, zPathname, nPathname); - if( nUri ) memcpy(&pPager->zFilename[nPathname+1], zUri, nUri); - memcpy(pPager->zJournal, zPathname, nPathname); - memcpy(&pPager->zJournal[nPathname], "-journal\000", 8+2); - sqlite3FileSuffix3(pPager->zFilename, pPager->zJournal); + /* Fill in the Pager.zFilename and pPager.zQueryParam fields */ + pPtr += 4; /* Skip zero prefix */ + pPager->zFilename = (char*)pPtr; + if( nPathname>0 ){ + memcpy(pPtr, zPathname, nPathname); pPtr += nPathname + 1; + if( zUri ){ + memcpy(pPtr, zUri, nUriByte); pPtr += nUriByte; + }else{ + pPtr++; + } + } + + + /* Fill in Pager.zJournal */ + if( nPathname>0 ){ + pPager->zJournal = (char*)pPtr; + memcpy(pPtr, zPathname, nPathname); pPtr += nPathname; + memcpy(pPtr, "-journal",8); pPtr += 8 + 1; +#ifdef SQLITE_ENABLE_8_3_NAMES + sqlite3FileSuffix3(zFilename,pPager->zJournal); + pPtr = (u8*)(pPager->zJournal + sqlite3Strlen30(pPager->zJournal)+1); +#endif + }else{ + pPager->zJournal = 0; + } + #ifndef SQLITE_OMIT_WAL - pPager->zWal = &pPager->zJournal[nPathname+8+1]; - memcpy(pPager->zWal, zPathname, nPathname); - memcpy(&pPager->zWal[nPathname], "-wal\000", 4+1); - sqlite3FileSuffix3(pPager->zFilename, pPager->zWal); + /* Fill in Pager.zWal */ + if( nPathname>0 ){ + pPager->zWal = (char*)pPtr; + memcpy(pPtr, zPathname, nPathname); pPtr += nPathname; + memcpy(pPtr, "-wal", 4); pPtr += 4 + 1; +#ifdef SQLITE_ENABLE_8_3_NAMES + sqlite3FileSuffix3(zFilename, pPager->zWal); + pPtr = (u8*)(pPager->zWal + sqlite3Strlen30(pPager->zWal)+1); #endif - sqlite3DbFree(0, zPathname); + }else{ + pPager->zWal = 0; } +#endif + + if( nPathname ) sqlite3DbFree(0, zPathname); pPager->pVfs = pVfs; pPager->vfsFlags = vfsFlags; @@ -54980,9 +56378,9 @@ SQLITE_PRIVATE int sqlite3PagerOpen( } #endif } - pPager->noLock = sqlite3_uri_boolean(zFilename, "nolock", 0); + pPager->noLock = sqlite3_uri_boolean(pPager->zFilename, "nolock", 0); if( (iDc & SQLITE_IOCAP_IMMUTABLE)!=0 - || sqlite3_uri_boolean(zFilename, "immutable", 0) ){ + || sqlite3_uri_boolean(pPager->zFilename, "immutable", 0) ){ vfsFlags |= SQLITE_OPEN_READONLY; goto act_like_temp_file; } @@ -56673,6 +58071,7 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager *pPager){ ** But if (due to a coding error elsewhere in the system) it does get ** called, just return the same error code without doing anything. */ if( NEVER(pPager->errCode) ) return pPager->errCode; + pPager->iDataVersion++; assert( pPager->eState==PAGER_WRITER_LOCKED || pPager->eState==PAGER_WRITER_FINISHED @@ -56701,7 +58100,6 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager *pPager){ } PAGERTRACE(("COMMIT %d\n", PAGERID(pPager))); - pPager->iDataVersion++; rc = pager_end_transaction(pPager, pPager->setMaster, 1); return pager_error(pPager, rc); } @@ -57045,9 +58443,13 @@ SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ ** behavior. But when the Btree needs to know the filename for matching to ** shared cache, it uses nullIfMemDb==0 so that in-memory databases can ** participate in shared-cache. +** +** The return value to this routine is always safe to use with +** sqlite3_uri_parameter() and sqlite3_filename_database() and friends. */ -SQLITE_PRIVATE const char *sqlite3PagerFilename(Pager *pPager, int nullIfMemDb){ - return (nullIfMemDb && pPager->memDb) ? "" : pPager->zFilename; +SQLITE_PRIVATE const char *sqlite3PagerFilename(const Pager *pPager, int nullIfMemDb){ + static const char zFake[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + return (nullIfMemDb && pPager->memDb) ? &zFake[4] : pPager->zFilename; } /* @@ -57106,7 +58508,11 @@ SQLITE_PRIVATE void sqlite3PagerSetCodec( void (*xCodecFree)(void*), void *pCodec ){ - if( pPager->xCodecFree ) pPager->xCodecFree(pPager->pCodec); + if( pPager->xCodecFree ){ + pPager->xCodecFree(pPager->pCodec); + }else{ + pager_reset(pPager); + } pPager->xCodec = pPager->memDb ? 0 : xCodec; pPager->xCodecSizeChng = xCodecSizeChng; pPager->xCodecFree = xCodecFree; @@ -57235,8 +58641,12 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i */ pPg->flags &= ~PGHDR_NEED_SYNC; pPgOld = sqlite3PagerLookup(pPager, pgno); - assert( !pPgOld || pPgOld->nRef==1 ); + assert( !pPgOld || pPgOld->nRef==1 || CORRUPT_DB ); if( pPgOld ){ + if( pPgOld->nRef>1 ){ + sqlite3PagerUnrefNotNull(pPgOld); + return SQLITE_CORRUPT_BKPT; + } pPg->flags |= (pPgOld->flags&PGHDR_NEED_SYNC); if( pPager->tempFile ){ /* Do not discard pages from an in-memory database since we might @@ -57694,6 +59104,8 @@ SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager, sqlite3 *db){ return rc; } + + #ifdef SQLITE_ENABLE_SNAPSHOT /* ** If this is a WAL database, obtain a snapshot handle for the snapshot @@ -57764,7 +59176,7 @@ SQLITE_PRIVATE int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pS */ SQLITE_PRIVATE void sqlite3PagerSnapshotUnlock(Pager *pPager){ assert( pPager->pWal ); - return sqlite3WalSnapshotUnlock(pPager->pWal); + sqlite3WalSnapshotUnlock(pPager->pWal); } #endif /* SQLITE_ENABLE_SNAPSHOT */ @@ -58365,7 +59777,7 @@ static SQLITE_NOINLINE int walIndexPageRealloc( /* Enlarge the pWal->apWiData[] array if required */ if( pWal->nWiData<=iPage ){ - int nByte = sizeof(u32*)*(iPage+1); + sqlite3_int64 nByte = sizeof(u32*)*(iPage+1); volatile u32 **apNew; apNew = (volatile u32 **)sqlite3_realloc64((void *)pWal->apWiData, nByte); if( !apNew ){ @@ -58469,6 +59881,7 @@ static void walChecksumBytes( assert( nByte>=8 ); assert( (nByte&0x00000007)==0 ); + assert( nByte<=65536 ); if( nativeCksum ){ do { @@ -58776,6 +60189,7 @@ static void walCleanupHash(Wal *pWal){ int iLimit = 0; /* Zero values greater than this */ int nByte; /* Number of bytes to zero in aPgno[] */ int i; /* Used to iterate through aHash[] */ + int rc; /* Return code form walHashGet() */ assert( pWal->writeLock ); testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE-1 ); @@ -58786,11 +60200,12 @@ static void walCleanupHash(Wal *pWal){ /* Obtain pointers to the hash-table and page-number array containing ** the entry that corresponds to frame pWal->hdr.mxFrame. It is guaranteed - ** that the page said hash-table and array reside on is already mapped. + ** that the page said hash-table and array reside on is already mapped.(1) */ assert( pWal->nWiData>walFramePage(pWal->hdr.mxFrame) ); assert( pWal->apWiData[walFramePage(pWal->hdr.mxFrame)] ); - walHashGet(pWal, walFramePage(pWal->hdr.mxFrame), &sLoc); + rc = walHashGet(pWal, walFramePage(pWal->hdr.mxFrame), &sLoc); + if( NEVER(rc) ) return; /* Defense-in-depth, in case (1) above is wrong */ /* Zero all hash-table entries that correspond to frame numbers greater ** than pWal->hdr.mxFrame. @@ -59404,7 +60819,7 @@ static int walIteratorInit(Wal *pWal, u32 nBackfill, WalIterator **pp){ WalIterator *p; /* Return value */ int nSegment; /* Number of segments to merge */ u32 iLast; /* Last frame in log */ - int nByte; /* Number of bytes to allocate */ + sqlite3_int64 nByte; /* Number of bytes to allocate */ int i; /* Iterator variable */ ht_slot *aTmp; /* Temp space used by merge-sort */ int rc = SQLITE_OK; /* Return Code */ @@ -59611,7 +61026,19 @@ static int walCheckpoint( ** not decreasing it. So assuming either that either the "old" or ** "new" version of the value is read, and not some arbitrary value ** that would never be written by a real client, things are still - ** safe. */ + ** safe. + ** + ** Astute readers have pointed out that the assumption stated in the + ** last sentence of the previous paragraph is not guaranteed to be + ** true for all conforming systems. However, the assumption is true + ** for all compilers and architectures in common use today (circa + ** 2019-11-27) and the alternatives are both slow and complex, and + ** so we will continue to go with the current design for now. If this + ** bothers you, or if you really are running on a system where aligned + ** 32-bit reads and writes are not atomic, then you can simply avoid + ** the use of WAL mode, or only use WAL mode together with + ** PRAGMA locking_mode=EXCLUSIVE and all will be well. + */ u32 y = pInfo->aReadMark[i]; if( mxSafeFrame>y ){ assert( y<=pWal->hdr.mxFrame ); @@ -59688,6 +61115,10 @@ static int walCheckpoint( rc = sqlite3OsSync(pWal->pDbFd, CKPT_SYNC_FLAGS(sync_flags)); } } + if( rc==SQLITE_OK ){ + rc = sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_DONE, 0); + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + } if( rc==SQLITE_OK ){ pInfo->nBackfill = mxSafeFrame; } @@ -60695,9 +62126,9 @@ SQLITE_PRIVATE int sqlite3WalFindFrame( } nCollide = HASHTABLE_NSLOT; for(iKey=walHash(pgno); sLoc.aHash[iKey]; iKey=walNextHash(iKey)){ - u32 iFrame = sLoc.aHash[iKey] + sLoc.iZero; - if( iFrame<=iLast && iFrame>=pWal->minFrame - && sLoc.aPgno[sLoc.aHash[iKey]]==pgno ){ + u32 iH = sLoc.aHash[iKey]; + u32 iFrame = iH + sLoc.iZero; + if( iFrame<=iLast && iFrame>=pWal->minFrame && sLoc.aPgno[iH]==pgno ){ assert( iFrame>iRead || CORRUPT_DB ); iRead = iFrame; } @@ -61265,6 +62696,7 @@ SQLITE_PRIVATE int sqlite3WalFrames( if( rc ) return rc; iOffset += szFrame; nExtra++; + assert( pLast!=0 ); } } if( bSync ){ @@ -61297,6 +62729,7 @@ SQLITE_PRIVATE int sqlite3WalFrames( iFrame++; rc = walIndexAppend(pWal, iFrame, p->pgno); } + assert( pLast!=0 || nExtra==0 ); while( rc==SQLITE_OK && nExtra>0 ){ iFrame++; nExtra--; @@ -61940,7 +63373,7 @@ struct MemPage { u16 maxLocal; /* Copy of BtShared.maxLocal or BtShared.maxLeaf */ u16 minLocal; /* Copy of BtShared.minLocal or BtShared.minLeaf */ u16 cellOffset; /* Index in aData of first cell pointer */ - u16 nFree; /* Number of free bytes on the page */ + int nFree; /* Number of free bytes on the page. -1 for unknown */ u16 nCell; /* Number of cells on this page, local and ovfl */ u16 maskPage; /* Mask for page offset */ u16 aiOvfl[4]; /* Insert the i-th overflow cell before the aiOvfl-th @@ -62148,9 +63581,16 @@ struct CellInfo { ** found at self->pBt->mutex. ** ** skipNext meaning: -** eState==SKIPNEXT && skipNext>0: Next sqlite3BtreeNext() is no-op. -** eState==SKIPNEXT && skipNext<0: Next sqlite3BtreePrevious() is no-op. -** eState==FAULT: Cursor fault with skipNext as error code. +** The meaning of skipNext depends on the value of eState: +** +** eState Meaning of skipNext +** VALID skipNext is meaningless and is ignored +** INVALID skipNext is meaningless and is ignored +** SKIPNEXT sqlite3BtreeNext() is a no-op if skipNext>0 and +** sqlite3BtreePrevious() is no-op if skipNext<0. +** REQUIRESEEK restoreCursorPosition() restores the cursor to +** eState=SKIPNEXT if skipNext!=0 +** FAULT skipNext holds the cursor fault error code. */ struct BtCursor { u8 eState; /* One of the CURSOR_XXX constants (see below) */ @@ -62189,6 +63629,7 @@ struct BtCursor { #define BTCF_AtLast 0x08 /* Cursor is pointing ot the last entry */ #define BTCF_Incrblob 0x10 /* True if an incremental I/O handle */ #define BTCF_Multiple 0x20 /* Maybe another cursor on the same btree */ +#define BTCF_Pinned 0x40 /* Cursor is busy and cannot be moved */ /* ** Potential values for BtCursor.eState. @@ -62332,6 +63773,7 @@ struct IntegrityCk { int v1, v2; /* Values for up to two %d fields in zPfx */ StrAccum errMsg; /* Accumulate the error message text here */ u32 *heap; /* Min-heap used for analyzing cell coverage */ + sqlite3 *db; /* Database connection running the check */ }; /* @@ -63314,13 +64756,19 @@ static int saveCursorKey(BtCursor *pCur){ /* Only the rowid is required for a table btree */ pCur->nKey = sqlite3BtreeIntegerKey(pCur); }else{ - /* For an index btree, save the complete key content */ + /* For an index btree, save the complete key content. It is possible + ** that the current key is corrupt. In that case, it is possible that + ** the sqlite3VdbeRecordUnpack() function may overread the buffer by + ** up to the size of 1 varint plus 1 8-byte value when the cursor + ** position is restored. Hence the 17 bytes of padding allocated + ** below. */ void *pKey; pCur->nKey = sqlite3BtreePayloadSize(pCur); - pKey = sqlite3Malloc( pCur->nKey ); + pKey = sqlite3Malloc( pCur->nKey + 9 + 8 ); if( pKey ){ rc = sqlite3BtreePayload(pCur, 0, (int)pCur->nKey, pKey); if( rc==SQLITE_OK ){ + memset(((u8*)pKey)+pCur->nKey, 0, 9+8); pCur->pKey = pKey; }else{ sqlite3_free(pKey); @@ -63347,6 +64795,9 @@ static int saveCursorPosition(BtCursor *pCur){ assert( 0==pCur->pKey ); assert( cursorHoldsMutex(pCur) ); + if( pCur->curFlags & BTCF_Pinned ){ + return SQLITE_CONSTRAINT_PINNED; + } if( pCur->eState==CURSOR_SKIPNEXT ){ pCur->eState = CURSOR_VALID; }else{ @@ -63452,11 +64903,12 @@ static int btreeMoveto( UnpackedRecord *pIdxKey; /* Unpacked index key */ if( pKey ){ + KeyInfo *pKeyInfo = pCur->pKeyInfo; assert( nKey==(i64)(int)nKey ); - pIdxKey = sqlite3VdbeAllocUnpackedRecord(pCur->pKeyInfo); + pIdxKey = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); if( pIdxKey==0 ) return SQLITE_NOMEM_BKPT; - sqlite3VdbeRecordUnpack(pCur->pKeyInfo, (int)nKey, pKey, pIdxKey); - if( pIdxKey->nField==0 ){ + sqlite3VdbeRecordUnpack(pKeyInfo, (int)nKey, pKey, pIdxKey); + if( pIdxKey->nField==0 || pIdxKey->nField>pKeyInfo->nAllField ){ rc = SQLITE_CORRUPT_BKPT; goto moveto_done; } @@ -63480,19 +64932,23 @@ static int btreeMoveto( */ static int btreeRestoreCursorPosition(BtCursor *pCur){ int rc; - int skipNext; + int skipNext = 0; assert( cursorOwnsBtShared(pCur) ); assert( pCur->eState>=CURSOR_REQUIRESEEK ); if( pCur->eState==CURSOR_FAULT ){ return pCur->skipNext; } pCur->eState = CURSOR_INVALID; - rc = btreeMoveto(pCur, pCur->pKey, pCur->nKey, 0, &skipNext); + if( sqlite3FaultSim(410) ){ + rc = SQLITE_IOERR; + }else{ + rc = btreeMoveto(pCur, pCur->pKey, pCur->nKey, 0, &skipNext); + } if( rc==SQLITE_OK ){ sqlite3_free(pCur->pKey); pCur->pKey = 0; assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_INVALID ); - pCur->skipNext |= skipNext; + if( skipNext ) pCur->skipNext = skipNext; if( pCur->skipNext && pCur->eState==CURSOR_VALID ){ pCur->eState = CURSOR_SKIPNEXT; } @@ -63562,7 +65018,6 @@ SQLITE_PRIVATE int sqlite3BtreeCursorRestore(BtCursor *pCur, int *pDifferentRow) if( pCur->eState!=CURSOR_VALID ){ *pDifferentRow = 1; }else{ - assert( pCur->skipNext==0 ); *pDifferentRow = 0; } return SQLITE_OK; @@ -63646,6 +65101,13 @@ static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){ *pRC = rc; return; } + if( ((char*)sqlite3PagerGetExtra(pDbPage))[0]!=0 ){ + /* The first byte of the extra data is the MemPage.isInit byte. + ** If that byte is set, it means this page is also being used + ** as a btree page. */ + *pRC = SQLITE_CORRUPT_BKPT; + goto ptrmap_exit; + } offset = PTRMAP_PTROFFSET(iPtrmap, key); if( offset<0 ){ *pRC = SQLITE_CORRUPT_BKPT; @@ -63708,7 +65170,7 @@ static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){ #else /* if defined SQLITE_OMIT_AUTOVACUUM */ #define ptrmapPut(w,x,y,z,rc) #define ptrmapGet(w,x,y,z) SQLITE_OK - #define ptrmapPutOvflPtr(x, y, rc) + #define ptrmapPutOvflPtr(x, y, z, rc) #endif /* @@ -64001,17 +65463,24 @@ static u16 cellSize(MemPage *pPage, int iCell){ #ifndef SQLITE_OMIT_AUTOVACUUM /* -** If the cell pCell, part of page pPage contains a pointer -** to an overflow page, insert an entry into the pointer-map -** for the overflow page. +** The cell pCell is currently part of page pSrc but will ultimately be part +** of pPage. (pSrc and pPager are often the same.) If pCell contains a +** pointer to an overflow page, insert an entry into the pointer-map for +** the overflow page that will be valid after pCell has been moved to pPage. */ -static void ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){ +static void ptrmapPutOvflPtr(MemPage *pPage, MemPage *pSrc, u8 *pCell,int *pRC){ CellInfo info; if( *pRC ) return; assert( pCell!=0 ); pPage->xParseCell(pPage, pCell, &info); if( info.nLocalaDataEnd, pCell, pCell+info.nLocal) ){ + testcase( pSrc!=pPage ); + *pRC = SQLITE_CORRUPT_BKPT; + return; + } + ovfl = get4byte(&pCell[info.nSize-4]); ptrmapPut(pPage->pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, pRC); } } @@ -64055,7 +65524,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ hdr = pPage->hdrOffset; cellOffset = pPage->cellOffset; nCell = pPage->nCell; - assert( nCell==get2byte(&data[hdr+3]) ); + assert( nCell==get2byte(&data[hdr+3]) || CORRUPT_DB ); iCellFirst = cellOffset + 2*nCell; usableSize = pPage->pBt->usableSize; @@ -64066,35 +65535,29 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ ** reconstruct the entire page. */ if( (int)data[hdr+7]<=nMaxFrag ){ int iFree = get2byte(&data[hdr+1]); + if( iFree>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage); if( iFree ){ int iFree2 = get2byte(&data[iFree]); - - /* pageFindSlot() has already verified that free blocks are sorted - ** in order of offset within the page, and that no block extends - ** past the end of the page. Provided the two free slots do not - ** overlap, this guarantees that the memmove() calls below will not - ** overwrite the usableSize byte buffer, even if the database page - ** is corrupt. */ - assert( iFree2==0 || iFree2>iFree ); - assert( iFree+get2byte(&data[iFree+2]) <= usableSize ); - assert( iFree2==0 || iFree2+get2byte(&data[iFree2+2]) <= usableSize ); - + if( iFree2>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage); if( 0==iFree2 || (data[iFree2]==0 && data[iFree2+1]==0) ){ u8 *pEnd = &data[cellOffset + nCell*2]; u8 *pAddr; int sz2 = 0; int sz = get2byte(&data[iFree+2]); int top = get2byte(&data[hdr+5]); - if( top>=iFree ){ + if( NEVER(top>=iFree) ){ return SQLITE_CORRUPT_PAGE(pPage); } if( iFree2 ){ - assert( iFree+sz<=iFree2 ); /* Verified by pageFindSlot() */ + if( iFree+sz>iFree2 ) return SQLITE_CORRUPT_PAGE(pPage); sz2 = get2byte(&data[iFree2+2]); - assert( iFree+sz+sz2+iFree2-(iFree+sz) <= usableSize ); + if( iFree2+sz2 > usableSize ) return SQLITE_CORRUPT_PAGE(pPage); memmove(&data[iFree+sz+sz2], &data[iFree+sz], iFree2-(iFree+sz)); sz += sz2; + }else if( NEVER(iFree+sz>usableSize) ){ + return SQLITE_CORRUPT_PAGE(pPage); } + cbrk = top+sz; assert( cbrk+(iFree-top) <= usableSize ); memmove(&data[cbrk], &data[top], iFree-top); @@ -64145,6 +65608,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ data[hdr+7] = 0; defragment_out: + assert( pPage->nFree>=0 ); if( data[hdr+7]+cbrk-iCellFirst!=pPage->nFree ){ return SQLITE_CORRUPT_PAGE(pPage); } @@ -64172,16 +65636,16 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ ** causes the fragmentation count to exceed 60. */ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ - const int hdr = pPg->hdrOffset; - u8 * const aData = pPg->aData; - int iAddr = hdr + 1; - int pc = get2byte(&aData[iAddr]); - int x; - int usableSize = pPg->pBt->usableSize; - int size; /* Size of the free slot */ + const int hdr = pPg->hdrOffset; /* Offset to page header */ + u8 * const aData = pPg->aData; /* Page data */ + int iAddr = hdr + 1; /* Address of ptr to pc */ + int pc = get2byte(&aData[iAddr]); /* Address of a free slot */ + int x; /* Excess size of the slot */ + int maxPC = pPg->pBt->usableSize - nByte; /* Max address for a usable slot */ + int size; /* Size of the free slot */ assert( pc>0 ); - while( pc<=usableSize-4 ){ + while( pc<=maxPC ){ /* EVIDENCE-OF: R-22710-53328 The third and fourth bytes of each ** freeblock form a big-endian integer which is the size of the freeblock ** in bytes, including the 4-byte header. */ @@ -64189,10 +65653,7 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ if( (x = size - nByte)>=0 ){ testcase( x==4 ); testcase( x==3 ); - if( size+pc > usableSize ){ - *pRc = SQLITE_CORRUPT_PAGE(pPg); - return 0; - }else if( x<4 ){ + if( x<4 ){ /* EVIDENCE-OF: R-11498-58022 In a well-formed b-tree page, the total ** number of bytes in fragments may not exceed 60. */ if( aData[hdr+7]>57 ) return 0; @@ -64201,21 +65662,31 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ ** fragmented bytes within the page. */ memcpy(&aData[iAddr], &aData[pc], 2); aData[hdr+7] += (u8)x; + }else if( x+pc > maxPC ){ + /* This slot extends off the end of the usable part of the page */ + *pRc = SQLITE_CORRUPT_PAGE(pPg); + return 0; }else{ /* The slot remains on the free-list. Reduce its size to account - ** for the portion used by the new allocation. */ + ** for the portion used by the new allocation. */ put2byte(&aData[pc+2], x); } return &aData[pc + x]; } iAddr = pc; pc = get2byte(&aData[pc]); - if( pcmaxPC+nByte-4 ){ + /* The free slot chain extends off the end of the page */ *pRc = SQLITE_CORRUPT_PAGE(pPg); } - return 0; } @@ -64256,7 +65727,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ ** However, that integer is too large to be stored in a 2-byte unsigned ** integer, so a value of 0 is used in its place. */ top = get2byte(&data[hdr+5]); - assert( top<=(int)pPage->pBt->usableSize ); /* Prevent by getAndInitPage() */ + assert( top<=(int)pPage->pBt->usableSize ); /* by btreeComputeFreeSpace() */ if( gap>top ){ if( top==0 && pPage->pBt->usableSize==65536 ){ top = 65536; @@ -64265,9 +65736,9 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ } } - /* If there is enough space between gap and top for one more cell pointer - ** array entry offset, and if the freelist is not empty, then search the - ** freelist looking for a free slot big enough to satisfy the request. + /* If there is enough space between gap and top for one more cell pointer, + ** and if the freelist is not empty, then search the + ** freelist looking for a slot big enough to satisfy the request. */ testcase( gap+2==top ); testcase( gap+1==top ); @@ -64275,9 +65746,14 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ if( (data[hdr+2] || data[hdr+1]) && gap+2<=top ){ u8 *pSpace = pageFindSlot(pPage, nByte, &rc); if( pSpace ){ - assert( pSpace>=data && (pSpace - data)<65536 ); - *pIdx = (int)(pSpace - data); - return SQLITE_OK; + int g2; + assert( pSpace+nByte<=data+pPage->pBt->usableSize ); + *pIdx = g2 = (int)(pSpace-data); + if( NEVER(g2<=gap) ){ + return SQLITE_CORRUPT_PAGE(pPage); + }else{ + return SQLITE_OK; + } }else if( rc ){ return rc; } @@ -64289,6 +65765,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ testcase( gap+2+nByte==top ); if( gap+2+nByte>top ){ assert( pPage->nCell>0 || CORRUPT_DB ); + assert( pPage->nFree>=0 ); rc = defragmentPage(pPage, MIN(4, pPage->nFree - (2+nByte))); if( rc ) return rc; top = get2byteNotZero(&data[hdr+5]); @@ -64297,7 +65774,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ /* Allocate memory from the gap in between the cell pointer array - ** and the cell content area. The btreeInitPage() call has already + ** and the cell content area. The btreeComputeFreeSpace() call has already ** validated the freelist. Given that the freelist is valid, there ** is no way that the allocation can extend off the end of the page. ** The assert() below verifies the previous sentence. @@ -64316,7 +65793,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ ** ** Adjacent freeblocks are coalesced. ** -** Note that even though the freeblock list was checked by btreeInitPage(), +** Even though the freeblock list was checked by btreeComputeFreeSpace(), ** that routine will not detect overlap between cells or freeblocks. Nor ** does it detect cells or freeblocks that encrouch into the reserved bytes ** at the end of the page. So do additional corruption checks inside this @@ -64350,12 +65827,12 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ }else{ while( (iFreeBlk = get2byte(&data[iPtr]))pPage->pBt->usableSize-4 ){ + if( iFreeBlk>pPage->pBt->usableSize-4 ){ /* TH3: corrupt081.100 */ return SQLITE_CORRUPT_PAGE(pPage); } assert( iFreeBlk>iPtr || iFreeBlk==0 ); @@ -64370,7 +65847,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ nFrag = iFreeBlk - iEnd; if( iEnd>iFreeBlk ) return SQLITE_CORRUPT_PAGE(pPage); iEnd = iFreeBlk + get2byte(&data[iFreeBlk+2]); - if( iEnd > pPage->pBt->usableSize ){ + if( NEVER(iEnd > pPage->pBt->usableSize) ){ return SQLITE_CORRUPT_PAGE(pPage); } iSize = iEnd - iStart; @@ -64398,7 +65875,8 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ /* The new freeblock is at the beginning of the cell content area, ** so just extend the cell content area rather than create another ** freelist entry */ - if( iStartnFree field. */ -static int btreeInitPage(MemPage *pPage){ +static int btreeComputeFreeSpace(MemPage *pPage){ int pc; /* Address of a freeblock within pPage->aData[] */ u8 hdr; /* Offset to beginning of page header */ u8 *data; /* Equal to pPage->aData */ - BtShared *pBt; /* The main btree structure */ int usableSize; /* Amount of usable space on each page */ - u16 cellOffset; /* Offset from start of page to first cell pointer */ int nFree; /* Number of unused bytes on the page */ int top; /* First byte of the cell content area */ int iCellFirst; /* First allowable cell or freeblock offset */ @@ -64504,71 +65975,18 @@ static int btreeInitPage(MemPage *pPage){ assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) ); assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) ); - assert( pPage->isInit==0 ); + assert( pPage->isInit==1 ); + assert( pPage->nFree<0 ); - pBt = pPage->pBt; + usableSize = pPage->pBt->usableSize; hdr = pPage->hdrOffset; data = pPage->aData; - /* EVIDENCE-OF: R-28594-02890 The one-byte flag at offset 0 indicating - ** the b-tree page type. */ - if( decodeFlags(pPage, data[hdr]) ){ - return SQLITE_CORRUPT_PAGE(pPage); - } - assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); - pPage->maskPage = (u16)(pBt->pageSize - 1); - pPage->nOverflow = 0; - usableSize = pBt->usableSize; - pPage->cellOffset = cellOffset = hdr + 8 + pPage->childPtrSize; - pPage->aDataEnd = &data[usableSize]; - pPage->aCellIdx = &data[cellOffset]; - pPage->aDataOfst = &data[pPage->childPtrSize]; /* EVIDENCE-OF: R-58015-48175 The two-byte integer at offset 5 designates ** the start of the cell content area. A zero value for this integer is ** interpreted as 65536. */ top = get2byteNotZero(&data[hdr+5]); - /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the - ** number of cells on the page. */ - pPage->nCell = get2byte(&data[hdr+3]); - if( pPage->nCell>MX_CELL(pBt) ){ - /* To many cells for a single page. The page must be corrupt */ - return SQLITE_CORRUPT_PAGE(pPage); - } - testcase( pPage->nCell==MX_CELL(pBt) ); - /* EVIDENCE-OF: R-24089-57979 If a page contains no cells (which is only - ** possible for a root page of a table that contains no rows) then the - ** offset to the cell content area will equal the page size minus the - ** bytes of reserved space. */ - assert( pPage->nCell>0 || top==usableSize || CORRUPT_DB ); - - /* A malformed database page might cause us to read past the end - ** of page when parsing a cell. - ** - ** The following block of code checks early to see if a cell extends - ** past the end of a page boundary and causes SQLITE_CORRUPT to be - ** returned if it does. - */ - iCellFirst = cellOffset + 2*pPage->nCell; + iCellFirst = hdr + 8 + pPage->childPtrSize + 2*pPage->nCell; iCellLast = usableSize - 4; - if( pBt->db->flags & SQLITE_CellSizeCk ){ - int i; /* Index into the cell pointer array */ - int sz; /* Size of a cell */ - - if( !pPage->leaf ) iCellLast--; - for(i=0; inCell; i++){ - pc = get2byteAligned(&data[cellOffset+i*2]); - testcase( pc==iCellFirst ); - testcase( pc==iCellLast ); - if( pciCellLast ){ - return SQLITE_CORRUPT_PAGE(pPage); - } - sz = pPage->xCellSize(pPage, &data[pc]); - testcase( pc+sz==usableSize ); - if( pc+sz>usableSize ){ - return SQLITE_CORRUPT_PAGE(pPage); - } - } - if( !pPage->leaf ) iCellLast++; - } /* Compute the total free space on the page ** EVIDENCE-OF: R-23588-34450 The two-byte integer at offset 1 gives the @@ -64578,7 +65996,7 @@ static int btreeInitPage(MemPage *pPage){ nFree = data[hdr+7] + top; /* Init nFree to non-freeblock free space */ if( pc>0 ){ u32 next, size; - if( pcusableSize ){ + if( nFree>usableSize || nFreenFree = (u16)(nFree - iCellFirst); + return SQLITE_OK; +} + +/* +** Do additional sanity check after btreeInitPage() if +** PRAGMA cell_size_check=ON +*/ +static SQLITE_NOINLINE int btreeCellSizeCheck(MemPage *pPage){ + int iCellFirst; /* First allowable cell or freeblock offset */ + int iCellLast; /* Last possible cell or freeblock offset */ + int i; /* Index into the cell pointer array */ + int sz; /* Size of a cell */ + int pc; /* Address of a freeblock within pPage->aData[] */ + u8 *data; /* Equal to pPage->aData */ + int usableSize; /* Maximum usable space on the page */ + int cellOffset; /* Start of cell content area */ + + iCellFirst = pPage->cellOffset + 2*pPage->nCell; + usableSize = pPage->pBt->usableSize; + iCellLast = usableSize - 4; + data = pPage->aData; + cellOffset = pPage->cellOffset; + if( !pPage->leaf ) iCellLast--; + for(i=0; inCell; i++){ + pc = get2byteAligned(&data[cellOffset+i*2]); + testcase( pc==iCellFirst ); + testcase( pc==iCellLast ); + if( pciCellLast ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + sz = pPage->xCellSize(pPage, &data[pc]); + testcase( pc+sz==usableSize ); + if( pc+sz>usableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + } + return SQLITE_OK; +} + +/* +** Initialize the auxiliary information for a disk block. +** +** Return SQLITE_OK on success. If we see that the page does +** not contain a well-formed database page, then return +** SQLITE_CORRUPT. Note that a return of SQLITE_OK does not +** guarantee that the page is well-formed. It only shows that +** we failed to detect any corruption. +*/ +static int btreeInitPage(MemPage *pPage){ + u8 *data; /* Equal to pPage->aData */ + BtShared *pBt; /* The main btree structure */ + + assert( pPage->pBt!=0 ); + assert( pPage->pBt->db!=0 ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); + assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) ); + assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) ); + assert( pPage->isInit==0 ); + + pBt = pPage->pBt; + data = pPage->aData + pPage->hdrOffset; + /* EVIDENCE-OF: R-28594-02890 The one-byte flag at offset 0 indicating + ** the b-tree page type. */ + if( decodeFlags(pPage, data[0]) ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); + pPage->maskPage = (u16)(pBt->pageSize - 1); + pPage->nOverflow = 0; + pPage->cellOffset = pPage->hdrOffset + 8 + pPage->childPtrSize; + pPage->aCellIdx = data + pPage->childPtrSize + 8; + pPage->aDataEnd = pPage->aData + pBt->usableSize; + pPage->aDataOfst = pPage->aData + pPage->childPtrSize; + /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the + ** number of cells on the page. */ + pPage->nCell = get2byte(&data[3]); + if( pPage->nCell>MX_CELL(pBt) ){ + /* To many cells for a single page. The page must be corrupt */ + return SQLITE_CORRUPT_PAGE(pPage); + } + testcase( pPage->nCell==MX_CELL(pBt) ); + /* EVIDENCE-OF: R-24089-57979 If a page contains no cells (which is only + ** possible for a root page of a table that contains no rows) then the + ** offset to the cell content area will equal the page size minus the + ** bytes of reserved space. */ + assert( pPage->nCell>0 + || get2byteNotZero(&data[5])==(int)pBt->usableSize + || CORRUPT_DB ); + pPage->nFree = -1; /* Indicate that this value is yet uncomputed */ pPage->isInit = 1; + if( pBt->db->flags & SQLITE_CellSizeCk ){ + return btreeCellSizeCheck(pPage); + } return SQLITE_OK; } @@ -64722,12 +66233,12 @@ static MemPage *btreePageLookup(BtShared *pBt, Pgno pgno){ ** error, return ((unsigned int)-1). */ static Pgno btreePagecount(BtShared *pBt){ + assert( (pBt->nPage & 0x80000000)==0 || CORRUPT_DB ); return pBt->nPage; } SQLITE_PRIVATE u32 sqlite3BtreeLastPage(Btree *p){ assert( sqlite3BtreeHoldsMutex(p) ); - assert( ((p->pBt->nPage)&0x80000000)==0 ); - return btreePagecount(p->pBt); + return btreePagecount(p->pBt) & 0x7fffffff; } /* @@ -64759,19 +66270,18 @@ static int getAndInitPage( if( pgno>btreePagecount(pBt) ){ rc = SQLITE_CORRUPT_BKPT; - goto getAndInitPage_error; + goto getAndInitPage_error1; } rc = sqlite3PagerGet(pBt->pPager, pgno, (DbPage**)&pDbPage, bReadOnly); if( rc ){ - goto getAndInitPage_error; + goto getAndInitPage_error1; } *ppPage = (MemPage*)sqlite3PagerGetExtra(pDbPage); if( (*ppPage)->isInit==0 ){ btreePageFromDbPage(pDbPage, pgno, pBt); rc = btreeInitPage(*ppPage); if( rc!=SQLITE_OK ){ - releasePage(*ppPage); - goto getAndInitPage_error; + goto getAndInitPage_error2; } } assert( (*ppPage)->pgno==pgno ); @@ -64781,12 +66291,13 @@ static int getAndInitPage( ** compatible with the root page. */ if( pCur && ((*ppPage)->nCell<1 || (*ppPage)->intKey!=pCur->curIntKey) ){ rc = SQLITE_CORRUPT_PGNO(pgno); - releasePage(*ppPage); - goto getAndInitPage_error; + goto getAndInitPage_error2; } return SQLITE_OK; -getAndInitPage_error: +getAndInitPage_error2: + releasePage(*ppPage); +getAndInitPage_error1: if( pCur ){ pCur->iPage--; pCur->pPage = pCur->apPage[pCur->iPage]; @@ -64994,9 +66505,13 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( rc = sqlite3OsFullPathname(pVfs, zFilename, nFullPathname, zFullPathname); if( rc ){ - sqlite3_free(zFullPathname); - sqlite3_free(p); - return rc; + if( rc==SQLITE_OK_SYMLINK ){ + rc = SQLITE_OK; + }else{ + sqlite3_free(zFullPathname); + sqlite3_free(p); + return rc; + } } } #if SQLITE_THREADSAFE @@ -65646,9 +67161,9 @@ static int newDatabase(BtShared*); static int lockBtree(BtShared *pBt){ int rc; /* Result code from subfunctions */ MemPage *pPage1; /* Page 1 of the database file */ - int nPage; /* Number of pages in the database */ - int nPageFile = 0; /* Number of pages in the database file */ - int nPageHeader; /* Number of pages in the database according to hdr */ + u32 nPage; /* Number of pages in the database */ + u32 nPageFile = 0; /* Number of pages in the database file */ + u32 nPageHeader; /* Number of pages in the database according to hdr */ assert( sqlite3_mutex_held(pBt->mutex) ); assert( pBt->pPage1==0 ); @@ -65661,7 +67176,7 @@ static int lockBtree(BtShared *pBt){ ** a valid database file. */ nPage = nPageHeader = get4byte(28+(u8*)pPage1->aData); - sqlite3PagerPagecount(pBt->pPager, &nPageFile); + sqlite3PagerPagecount(pBt->pPager, (int*)&nPageFile); if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){ nPage = nPageFile; } @@ -65742,6 +67257,7 @@ static int lockBtree(BtShared *pBt){ ){ goto page1_init_failed; } + pBt->btsFlags |= BTS_PAGESIZE_FIXED; assert( (pageSize & 7)==0 ); /* EVIDENCE-OF: R-59310-51205 The "reserved space" size in the 1-byte ** integer at offset 20 is the number of bytes of space at the end of @@ -65766,7 +67282,7 @@ static int lockBtree(BtShared *pBt){ pageSize-usableSize); return rc; } - if( (pBt->db->flags & SQLITE_WriteSchema)==0 && nPage>nPageFile ){ + if( sqlite3WritableSchema(pBt->db)==0 && nPage>nPageFile ){ rc = SQLITE_CORRUPT_BKPT; goto page1_init_failed; } @@ -66132,7 +67648,7 @@ static int setChildPtrmaps(MemPage *pPage){ for(i=0; ileaf ){ Pgno childPgno = get4byte(pCell); @@ -66240,6 +67756,7 @@ static int relocatePage( eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE ); assert( sqlite3_mutex_held(pBt->mutex) ); assert( pDbPage->pBt==pBt ); + if( iDbPage<3 ) return SQLITE_CORRUPT_BKPT; /* Move page iDbPage from its current location to page number iFreePage */ TRACE(("AUTOVACUUM: Moving %d to free page %d (ptr page %d type %d)\n", @@ -66745,6 +68262,18 @@ SQLITE_PRIVATE int sqlite3BtreeTripAllCursors(Btree *pBtree, int errCode, int wr return rc; } +/* +** Set the pBt->nPage field correctly, according to the current +** state of the database. Assume pBt->pPage1 is valid. +*/ +static void btreeSetNPage(BtShared *pBt, MemPage *pPage1){ + int nPage = get4byte(&pPage1->aData[28]); + testcase( nPage==0 ); + if( nPage==0 ) sqlite3PagerPagecount(pBt->pPager, &nPage); + testcase( pBt->nPage!=nPage ); + pBt->nPage = nPage; +} + /* ** Rollback the transaction in progress. ** @@ -66790,11 +68319,7 @@ SQLITE_PRIVATE int sqlite3BtreeRollback(Btree *p, int tripCode, int writeOnly){ ** call btreeGetPage() on page 1 again to make ** sure pPage1->aData is set correctly. */ if( btreeGetPage(pBt, 1, &pPage1, 0)==SQLITE_OK ){ - int nPage = get4byte(28+(u8*)pPage1->aData); - testcase( nPage==0 ); - if( nPage==0 ) sqlite3PagerPagecount(pBt->pPager, &nPage); - testcase( pBt->nPage!=nPage ); - pBt->nPage = nPage; + btreeSetNPage(pBt, pPage1); releasePageOne(pPage1); } assert( countValidCursors(pBt, 1)==0 ); @@ -66874,12 +68399,11 @@ SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){ pBt->nPage = 0; } rc = newDatabase(pBt); - pBt->nPage = get4byte(28 + pBt->pPage1->aData); + btreeSetNPage(pBt, pBt->pPage1); - /* The database size was written into the offset 28 of the header - ** when the transaction started, so we know that the value at offset - ** 28 is nonzero. */ - assert( pBt->nPage>0 ); + /* pBt->nPage might be zero if the database was corrupt when + ** the transaction was started. Otherwise, it must be at least 1. */ + assert( CORRUPT_DB || pBt->nPage>0 ); } sqlite3BtreeLeave(p); } @@ -66947,8 +68471,9 @@ static int btreeCursor( /* The following assert statements verify that if this is a sharable ** b-tree database, the connection is holding the required table locks, ** and that no other connection has any open cursor that conflicts with - ** this lock. */ - assert( hasSharedCacheTableLock(p, iTable, pKeyInfo!=0, (wrFlag?2:1)) ); + ** this lock. The iTable<1 term disables the check for corrupt schemas. */ + assert( hasSharedCacheTableLock(p, iTable, pKeyInfo!=0, (wrFlag?2:1)) + || iTable<1 ); assert( wrFlag==0 || !hasReadConflicts(p, iTable) ); /* Assert that the caller has opened the required transaction. */ @@ -66961,9 +68486,13 @@ static int btreeCursor( allocateTempSpace(pBt); if( pBt->pTmpSpace==0 ) return SQLITE_NOMEM_BKPT; } - if( iTable==1 && btreePagecount(pBt)==0 ){ - assert( wrFlag==0 ); - iTable = 0; + if( iTable<=1 ){ + if( iTable<1 ){ + return SQLITE_CORRUPT_BKPT; + }else if( btreePagecount(pBt)==0 ){ + assert( wrFlag==0 ); + iTable = 0; + } } /* Now that no other errors can occur, finish filling in the BtCursor @@ -66988,6 +68517,19 @@ static int btreeCursor( pCur->eState = CURSOR_INVALID; return SQLITE_OK; } +static int btreeCursorWithLock( + Btree *p, /* The btree */ + int iTable, /* Root page of table to open */ + int wrFlag, /* 1 to write. 0 read-only */ + struct KeyInfo *pKeyInfo, /* First arg to comparison function */ + BtCursor *pCur /* Space for new cursor */ +){ + int rc; + sqlite3BtreeEnter(p); + rc = btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur); + sqlite3BtreeLeave(p); + return rc; +} SQLITE_PRIVATE int sqlite3BtreeCursor( Btree *p, /* The btree */ int iTable, /* Root page of table to open */ @@ -66995,15 +68537,11 @@ SQLITE_PRIVATE int sqlite3BtreeCursor( struct KeyInfo *pKeyInfo, /* First arg to xCompare() */ BtCursor *pCur /* Write new cursor here */ ){ - int rc; - if( iTable<1 ){ - rc = SQLITE_CORRUPT_BKPT; + if( p->sharable ){ + return btreeCursorWithLock(p, iTable, wrFlag, pKeyInfo, pCur); }else{ - sqlite3BtreeEnter(p); - rc = btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur); - sqlite3BtreeLeave(p); + return btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur); } - return rc; } /* @@ -67057,6 +68595,7 @@ SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor *pCur){ sqlite3_free(pCur->aOverflow); sqlite3_free(pCur->pKey); sqlite3BtreeLeave(pBtree); + pCur->pBtree = 0; } return SQLITE_OK; } @@ -67125,6 +68664,18 @@ SQLITE_PRIVATE i64 sqlite3BtreeIntegerKey(BtCursor *pCur){ return pCur->info.nKey; } +/* +** Pin or unpin a cursor. +*/ +SQLITE_PRIVATE void sqlite3BtreeCursorPin(BtCursor *pCur){ + assert( (pCur->curFlags & BTCF_Pinned)==0 ); + pCur->curFlags |= BTCF_Pinned; +} +SQLITE_PRIVATE void sqlite3BtreeCursorUnpin(BtCursor *pCur){ + assert( (pCur->curFlags & BTCF_Pinned)!=0 ); + pCur->curFlags &= ~BTCF_Pinned; +} + #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC /* ** Return the offset into the database file for the start of the @@ -67155,6 +68706,25 @@ SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor *pCur){ return pCur->info.nPayload; } +/* +** Return an upper bound on the size of any record for the table +** that the cursor is pointing into. +** +** This is an optimization. Everything will still work if this +** routine always returns 2147483647 (which is the largest record +** that SQLite can handle) or more. But returning a smaller value might +** prevent large memory allocations when trying to interpret a +** corrupt datrabase. +** +** The current implementation merely returns the size of the underlying +** database file. +*/ +SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + return pCur->pBt->pageSize * (sqlite3_int64)pCur->pBt->nPage; +} + /* ** Given the page number of an overflow page in the database (parameter ** ovfl), this function finds the page number of the next page in the @@ -67411,9 +68981,6 @@ static int accessPayload( /* Need to read this page properly. It contains some of the ** range of data that is being read (eOp==0) or written (eOp!=0). */ -#ifdef SQLITE_DIRECT_OVERFLOW_READ - sqlite3_file *fd; /* File from which to do direct overflow read */ -#endif int a = amt; if( a + offset > ovflSize ){ a = ovflSize - offset; @@ -67424,7 +68991,7 @@ static int accessPayload( ** ** 1) this is a read operation, and ** 2) data is required from the start of this overflow page, and - ** 3) there is no open write-transaction, and + ** 3) there are no dirty pages in the page-cache ** 4) the database is file-backed, and ** 5) the page is not in the WAL file ** 6) at least 4 bytes have already been read into the output buffer @@ -67435,16 +69002,16 @@ static int accessPayload( */ if( eOp==0 /* (1) */ && offset==0 /* (2) */ - && pBt->inTransaction==TRANS_READ /* (3) */ - && (fd = sqlite3PagerFile(pBt->pPager))->pMethods /* (4) */ - && 0==sqlite3PagerUseWal(pBt->pPager, nextPage) /* (5) */ + && sqlite3PagerDirectReadOk(pBt->pPager, nextPage) /* (3,4,5) */ && &pBuf[-4]>=pBufStart /* (6) */ ){ + sqlite3_file *fd = sqlite3PagerFile(pBt->pPager); u8 aSave[4]; u8 *aWrite = &pBuf[-4]; assert( aWrite>=pBufStart ); /* due to (6) */ memcpy(aSave, aWrite, 4); rc = sqlite3OsRead(fd, aWrite, a+4, (i64)pBt->pageSize*(nextPage-1)); + if( rc && nextPage>pBt->nPage ) rc = SQLITE_CORRUPT_BKPT; nextPage = get4byte(aWrite); memcpy(aWrite, aSave, 4); }else @@ -67849,23 +69416,6 @@ SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){ return rc; } -/* -** This function is a no-op if cursor pCur does not point to a valid row. -** Otherwise, if pCur is valid, configure it so that the next call to -** sqlite3BtreeNext() is a no-op. -*/ -#ifndef SQLITE_OMIT_WINDOWFUNC -SQLITE_PRIVATE void sqlite3BtreeSkipNext(BtCursor *pCur){ - /* We believe that the cursor must always be in the valid state when - ** this routine is called, but the proof is difficult, so we add an - ** ALWaYS() test just in case we are wrong. */ - if( ALWAYS(pCur->eState==CURSOR_VALID) ){ - pCur->eState = CURSOR_SKIPNEXT; - pCur->skipNext = 1; - } -} -#endif /* SQLITE_OMIT_WINDOWFUNC */ - /* Move the cursor to the last entry in the table. Return SQLITE_OK ** on success. Set *pRes to 0 if the cursor actually points to something ** or set *pRes to 1 if the table is empty. @@ -67888,6 +69438,7 @@ SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){ assert( pCur->ix==pCur->pPage->nCell-1 ); assert( pCur->pPage->leaf ); #endif + *pRes = 0; return SQLITE_OK; } @@ -67973,7 +69524,7 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( ** try to get there using sqlite3BtreeNext() rather than a full ** binary search. This is an optimization only. The correct answer ** is still obtained without this case, only a little more slowely */ - if( pCur->info.nKey+1==intKey && !pCur->skipNext ){ + if( pCur->info.nKey+1==intKey ){ *pRes = 0; rc = sqlite3BtreeNext(pCur, 0); if( rc==SQLITE_OK ){ @@ -68109,29 +69660,31 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( ** case this happens. */ void *pCellKey; u8 * const pCellBody = pCell - pPage->childPtrSize; + const int nOverrun = 18; /* Size of the overrun padding */ pPage->xParseCell(pPage, pCellBody, &pCur->info); nCell = (int)pCur->info.nKey; testcase( nCell<0 ); /* True if key size is 2^32 or more */ testcase( nCell==0 ); /* Invalid key size: 0x80 0x80 0x00 */ testcase( nCell==1 ); /* Invalid key size: 0x80 0x80 0x01 */ testcase( nCell==2 ); /* Minimum legal index key size */ - if( nCell<2 ){ + if( nCell<2 || nCell/pCur->pBt->usableSize>pCur->pBt->nPage ){ rc = SQLITE_CORRUPT_PAGE(pPage); goto moveto_finish; } - pCellKey = sqlite3Malloc( nCell+18 ); + pCellKey = sqlite3Malloc( nCell+nOverrun ); if( pCellKey==0 ){ rc = SQLITE_NOMEM_BKPT; goto moveto_finish; } pCur->ix = (u16)idx; rc = accessPayload(pCur, 0, nCell, (unsigned char*)pCellKey, 0); + memset(((u8*)pCellKey)+nCell,0,nOverrun); /* Fix uninit warnings */ pCur->curFlags &= ~BTCF_ValidOvfl; if( rc ){ sqlite3_free(pCellKey); goto moveto_finish; } - c = xRecordCompare(nCell, pCellKey, pIdxKey); + c = sqlite3VdbeRecordCompare(nCell, pCellKey, pIdxKey); sqlite3_free(pCellKey); } assert( @@ -68247,7 +69800,6 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ MemPage *pPage; assert( cursorOwnsBtShared(pCur) ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); if( pCur->eState!=CURSOR_VALID ){ assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); rc = restoreCursorPosition(pCur); @@ -68257,14 +69809,9 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ if( CURSOR_INVALID==pCur->eState ){ return SQLITE_DONE; } - if( pCur->skipNext ){ - assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_SKIPNEXT ); + if( pCur->eState==CURSOR_SKIPNEXT ){ pCur->eState = CURSOR_VALID; - if( pCur->skipNext>0 ){ - pCur->skipNext = 0; - return SQLITE_OK; - } - pCur->skipNext = 0; + if( pCur->skipNext>0 ) return SQLITE_OK; } } @@ -68285,8 +69832,11 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ ** to be invalid here. This can only occur if a second cursor modifies ** the page while cursor pCur is holding a reference to it. Which can ** only happen if the database is corrupt in such a way as to link the - ** page into more than one b-tree structure. */ - testcase( idx>pPage->nCell ); + ** page into more than one b-tree structure. + ** + ** Update 2019-12-23: appears to long longer be possible after the + ** addition of anotherValidCursor() condition on balance_deeper(). */ + harmless( idx>pPage->nCell ); if( idx>=pPage->nCell ){ if( !pPage->leaf ){ @@ -68319,7 +69869,6 @@ SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int flags){ UNUSED_PARAMETER( flags ); /* Used in COMDB2 but not native SQLite */ assert( cursorOwnsBtShared(pCur) ); assert( flags==0 || flags==1 ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); pCur->info.nSize = 0; pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); if( pCur->eState!=CURSOR_VALID ) return btreeNext(pCur); @@ -68360,7 +69909,6 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ MemPage *pPage; assert( cursorOwnsBtShared(pCur) ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); assert( (pCur->curFlags & (BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey))==0 ); assert( pCur->info.nSize==0 ); if( pCur->eState!=CURSOR_VALID ){ @@ -68371,14 +69919,9 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ if( CURSOR_INVALID==pCur->eState ){ return SQLITE_DONE; } - if( pCur->skipNext ){ - assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_SKIPNEXT ); + if( CURSOR_SKIPNEXT==pCur->eState ){ pCur->eState = CURSOR_VALID; - if( pCur->skipNext<0 ){ - pCur->skipNext = 0; - return SQLITE_OK; - } - pCur->skipNext = 0; + if( pCur->skipNext<0 ) return SQLITE_OK; } } @@ -68413,7 +69956,6 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor *pCur, int flags){ assert( cursorOwnsBtShared(pCur) ); assert( flags==0 || flags==1 ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); UNUSED_PARAMETER( flags ); /* Used in COMDB2 but not native SQLite */ pCur->curFlags &= ~(BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey); pCur->info.nSize = 0; @@ -68749,7 +70291,7 @@ static int allocateBtreePage( TRACE(("ALLOCATE: %d from end of file\n", *pPgno)); } - assert( *pPgno!=PENDING_BYTE_PAGE(pBt) ); + assert( CORRUPT_DB || *pPgno!=PENDING_BYTE_PAGE(pBt) ); end_allocate_page: releasePage(pTrunk); @@ -68777,13 +70319,15 @@ static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){ MemPage *pPage1 = pBt->pPage1; /* Local reference to page 1 */ MemPage *pPage; /* Page being freed. May be NULL. */ int rc; /* Return Code */ - int nFree; /* Initial number of pages on free-list */ + u32 nFree; /* Initial number of pages on free-list */ assert( sqlite3_mutex_held(pBt->mutex) ); assert( CORRUPT_DB || iPage>1 ); assert( !pMemPage || pMemPage->pgno==iPage ); - if( iPage<2 ) return SQLITE_CORRUPT_BKPT; + if( iPage<2 || iPage>pBt->nPage ){ + return SQLITE_CORRUPT_BKPT; + } if( pMemPage ){ pPage = pMemPage; sqlite3PagerRef(pPage->pDbPage); @@ -69194,6 +70738,7 @@ static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ assert( CORRUPT_DB || sz==cellSize(pPage, idx) ); assert( sqlite3PagerIswriteable(pPage->pDbPage) ); assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->nFree>=0 ); data = pPage->aData; ptr = &pPage->aCellIdx[2*idx]; pc = get2byte(ptr); @@ -69258,12 +70803,8 @@ static void insertCell( assert( pPage->nOverflow<=ArraySize(pPage->apOvfl) ); assert( ArraySize(pPage->apOvfl)==ArraySize(pPage->aiOvfl) ); assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - /* The cell should normally be sized correctly. However, when moving a - ** malformed cell from a leaf page to an interior page, if the cell size - ** wanted to be less than 4 but got rounded up to 4 on the leaf, then size - ** might be less than 8 (leaf-size + pointer) on the interior node. Hence - ** the term after the || in the following assert(). */ - assert( sz==pPage->xCellSize(pPage, pCell) || (sz==8 && iChild>0) ); + assert( sz==pPage->xCellSize(pPage, pCell) || CORRUPT_DB ); + assert( pPage->nFree>=0 ); if( pPage->nOverflow || sz+2>pPage->nFree ){ if( pTemp ){ memcpy(pTemp, pCell, sz); @@ -69304,9 +70845,16 @@ static void insertCell( assert( idx >= pPage->cellOffset+2*pPage->nCell+2 || CORRUPT_DB ); assert( idx+sz <= (int)pPage->pBt->usableSize ); pPage->nFree -= (u16)(2 + sz); - memcpy(&data[idx], pCell, sz); if( iChild ){ + /* In a corrupt database where an entry in the cell index section of + ** a btree page has a value of 3 or less, the pCell value might point + ** as many as 4 bytes in front of the start of the aData buffer for + ** the source page. Make sure this does not cause problems by not + ** reading the first 4 bytes */ + memcpy(&data[idx+4], pCell+4, sz-4); put4byte(&data[idx], iChild); + }else{ + memcpy(&data[idx], pCell, sz); } pIns = pPage->aCellIdx + i*2; memmove(pIns+2, pIns, 2*(pPage->nCell - i)); @@ -69314,21 +70862,100 @@ static void insertCell( pPage->nCell++; /* increment the cell count */ if( (++data[pPage->hdrOffset+4])==0 ) data[pPage->hdrOffset+3]++; - assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell ); + assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell || CORRUPT_DB ); #ifndef SQLITE_OMIT_AUTOVACUUM if( pPage->pBt->autoVacuum ){ /* The cell may contain a pointer to an overflow page. If so, write ** the entry for the overflow page into the pointer map. */ - ptrmapPutOvflPtr(pPage, pCell, pRC); + ptrmapPutOvflPtr(pPage, pPage, pCell, pRC); } #endif } } +/* +** The following parameters determine how many adjacent pages get involved +** in a balancing operation. NN is the number of neighbors on either side +** of the page that participate in the balancing operation. NB is the +** total number of pages that participate, including the target page and +** NN neighbors on either side. +** +** The minimum value of NN is 1 (of course). Increasing NN above 1 +** (to 2 or 3) gives a modest improvement in SELECT and DELETE performance +** in exchange for a larger degradation in INSERT and UPDATE performance. +** The value of NN appears to give the best results overall. +** +** (Later:) The description above makes it seem as if these values are +** tunable - as if you could change them and recompile and it would all work. +** But that is unlikely. NB has been 3 since the inception of SQLite and +** we have never tested any other value. +*/ +#define NN 1 /* Number of neighbors on either side of pPage */ +#define NB 3 /* (NN*2+1): Total pages involved in the balance */ + /* ** A CellArray object contains a cache of pointers and sizes for a ** consecutive sequence of cells that might be held on multiple pages. +** +** The cells in this array are the divider cell or cells from the pParent +** page plus up to three child pages. There are a total of nCell cells. +** +** pRef is a pointer to one of the pages that contributes cells. This is +** used to access information such as MemPage.intKey and MemPage.pBt->pageSize +** which should be common to all pages that contribute cells to this array. +** +** apCell[] and szCell[] hold, respectively, pointers to the start of each +** cell and the size of each cell. Some of the apCell[] pointers might refer +** to overflow cells. In other words, some apCel[] pointers might not point +** to content area of the pages. +** +** A szCell[] of zero means the size of that cell has not yet been computed. +** +** The cells come from as many as four different pages: +** +** ----------- +** | Parent | +** ----------- +** / | \ +** / | \ +** --------- --------- --------- +** |Child-1| |Child-2| |Child-3| +** --------- --------- --------- +** +** The order of cells is in the array is for an index btree is: +** +** 1. All cells from Child-1 in order +** 2. The first divider cell from Parent +** 3. All cells from Child-2 in order +** 4. The second divider cell from Parent +** 5. All cells from Child-3 in order +** +** For a table-btree (with rowids) the items 2 and 4 are empty because +** content exists only in leaves and there are no divider cells. +** +** For an index btree, the apEnd[] array holds pointer to the end of page +** for Child-1, the Parent, Child-2, the Parent (again), and Child-3, +** respectively. The ixNx[] array holds the number of cells contained in +** each of these 5 stages, and all stages to the left. Hence: +** +** ixNx[0] = Number of cells in Child-1. +** ixNx[1] = Number of cells in Child-1 plus 1 for first divider. +** ixNx[2] = Number of cells in Child-1 and Child-2 + 1 for 1st divider. +** ixNx[3] = Number of cells in Child-1 and Child-2 + both divider cells +** ixNx[4] = Total number of cells. +** +** For a table-btree, the concept is similar, except only apEnd[0]..apEnd[2] +** are used and they point to the leaf pages only, and the ixNx value are: +** +** ixNx[0] = Number of cells in Child-1. +** ixNx[1] = Number of cells in Child-1 and Child-2. +** ixNx[2] = Total number of cells. +** +** Sometimes when deleting, a child page can have zero cells. In those +** cases, ixNx[] entries with higher indexes, and the corresponding apEnd[] +** entries, shift down. The end result is that each ixNx[] entry should +** be larger than the previous */ typedef struct CellArray CellArray; struct CellArray { @@ -69336,6 +70963,8 @@ struct CellArray { MemPage *pRef; /* Reference page */ u8 **apCell; /* All cells begin balanced */ u16 *szCell; /* Local size of all cells in apCell[] */ + u8 *apEnd[NB*2]; /* MemPage.aDataEnd values */ + int ixNx[NB*2]; /* Index of at which we move to the next apEnd[] */ }; /* @@ -69386,36 +71015,59 @@ static u16 cachedCellSize(CellArray *p, int N){ ** responsibility of the caller to set it correctly. */ static int rebuildPage( - MemPage *pPg, /* Edit this page */ + CellArray *pCArray, /* Content to be added to page pPg */ + int iFirst, /* First cell in pCArray to use */ int nCell, /* Final number of cells on page */ - u8 **apCell, /* Array of cells */ - u16 *szCell /* Array of cell sizes */ + MemPage *pPg /* The page to be reconstructed */ ){ const int hdr = pPg->hdrOffset; /* Offset of header on pPg */ u8 * const aData = pPg->aData; /* Pointer to data for pPg */ const int usableSize = pPg->pBt->usableSize; u8 * const pEnd = &aData[usableSize]; - int i; + int i = iFirst; /* Which cell to copy from pCArray*/ + u32 j; /* Start of cell content area */ + int iEnd = i+nCell; /* Loop terminator */ u8 *pCellptr = pPg->aCellIdx; u8 *pTmp = sqlite3PagerTempSpace(pPg->pBt->pPager); u8 *pData; + int k; /* Current slot in pCArray->apEnd[] */ + u8 *pSrcEnd; /* Current pCArray->apEnd[k] value */ - i = get2byte(&aData[hdr+5]); - memcpy(&pTmp[i], &aData[i], usableSize - i); + assert( i(u32)usableSize) ){ j = 0; } + memcpy(&pTmp[j], &aData[j], usableSize - j); + + for(k=0; pCArray->ixNx[k]<=i && ALWAYS(kapEnd[k]; pData = pEnd; - for(i=0; iapCell[i]; + u16 sz = pCArray->szCell[i]; + assert( sz>0 ); if( SQLITE_WITHIN(pCell,aData,pEnd) ){ + if( ((uptr)(pCell+sz))>(uptr)pEnd ) return SQLITE_CORRUPT_BKPT; pCell = &pTmp[pCell - aData]; + }else if( (uptr)(pCell+sz)>(uptr)pSrcEnd + && (uptr)(pCell)<(uptr)pSrcEnd + ){ + return SQLITE_CORRUPT_BKPT; } - pData -= szCell[i]; + + pData -= sz; put2byte(pCellptr, (pData - aData)); pCellptr += 2; if( pData < pCellptr ) return SQLITE_CORRUPT_BKPT; - memcpy(pData, pCell, szCell[i]); - assert( szCell[i]==pPg->xCellSize(pPg, pCell) || CORRUPT_DB ); - testcase( szCell[i]!=pPg->xCellSize(pPg,pCell) ); + memcpy(pData, pCell, sz); + assert( sz==pPg->xCellSize(pPg, pCell) || CORRUPT_DB ); + testcase( sz!=pPg->xCellSize(pPg,pCell) ) + i++; + if( i>=iEnd ) break; + if( pCArray->ixNx[k]<=i ){ + k++; + pSrcEnd = pCArray->apEnd[k]; + } } /* The pPg->nFree field is now set incorrectly. The caller will fix it. */ @@ -69430,12 +71082,11 @@ static int rebuildPage( } /* -** Array apCell[] contains nCell pointers to b-tree cells. Array szCell -** contains the size in bytes of each such cell. This function attempts to -** add the cells stored in the array to page pPg. If it cannot (because -** the page needs to be defragmented before the cells will fit), non-zero -** is returned. Otherwise, if the cells are added successfully, zero is -** returned. +** The pCArray objects contains pointers to b-tree cells and the cell sizes. +** This function attempts to add the cells stored in the array to page pPg. +** If it cannot (because the page needs to be defragmented before the cells +** will fit), non-zero is returned. Otherwise, if the cells are added +** successfully, zero is returned. ** ** Argument pCellptr points to the first entry in the cell-pointer array ** (part of page pPg) to populate. After cell apCell[0] is written to the @@ -69457,21 +71108,27 @@ static int rebuildPage( static int pageInsertArray( MemPage *pPg, /* Page to add cells to */ u8 *pBegin, /* End of cell-pointer array */ - u8 **ppData, /* IN/OUT: Page content -area pointer */ + u8 **ppData, /* IN/OUT: Page content-area pointer */ u8 *pCellptr, /* Pointer to cell-pointer area */ int iFirst, /* Index of first cell to add */ int nCell, /* Number of cells to add to pPg */ CellArray *pCArray /* Array of cells */ ){ - int i; - u8 *aData = pPg->aData; - u8 *pData = *ppData; - int iEnd = iFirst + nCell; + int i = iFirst; /* Loop counter - cell index to insert */ + u8 *aData = pPg->aData; /* Complete page */ + u8 *pData = *ppData; /* Content area. A subset of aData[] */ + int iEnd = iFirst + nCell; /* End of loop. One past last cell to ins */ + int k; /* Current slot in pCArray->apEnd[] */ + u8 *pEnd; /* Maximum extent of cell data */ assert( CORRUPT_DB || pPg->hdrOffset==0 ); /* Never called on page 1 */ - for(i=iFirst; iixNx[k]<=i && ALWAYS(kapEnd[k]; + while( 1 /*Exit by break*/ ){ int sz, rc; u8 *pSlot; - sz = cachedCellSize(pCArray, i); + assert( pCArray->szCell[i]!=0 ); + sz = pCArray->szCell[i]; if( (aData[1]==0 && aData[2]==0) || (pSlot = pageFindSlot(pPg,sz,&rc))==0 ){ if( (pData - pBegin)apCell[i] || pSlot>=(pCArray->apCell[i]+sz) || CORRUPT_DB ); + if( (uptr)(pCArray->apCell[i]+sz)>(uptr)pEnd + && (uptr)(pCArray->apCell[i])<(uptr)pEnd + ){ + assert( CORRUPT_DB ); + (void)SQLITE_CORRUPT_BKPT; + return 1; + } memmove(pSlot, pCArray->apCell[i], sz); put2byte(pCellptr, (pSlot - aData)); pCellptr += 2; + i++; + if( i>=iEnd ) break; + if( pCArray->ixNx[k]<=i ){ + k++; + pEnd = pCArray->apEnd[k]; + } } *ppData = pData; return 0; } /* -** Array apCell[] contains nCell pointers to b-tree cells. Array szCell -** contains the size in bytes of each such cell. This function adds the -** space associated with each cell in the array that is currently stored -** within the body of pPg to the pPg free-list. The cell-pointers and other -** fields of the page are not updated. +** The pCArray object contains pointers to b-tree cells and their sizes. +** +** This function adds the space associated with each cell in the array +** that is currently stored within the body of pPg to the pPg free-list. +** The cell-pointers and other fields of the page are not updated. ** ** This function returns the total number of cells added to the free-list. */ @@ -69546,9 +71216,9 @@ static int pageFreeArray( } /* -** apCell[] and szCell[] contains pointers to and sizes of all cells in the -** pages being balanced. The current page, pPg, has pPg->nCell cells starting -** with apCell[iOld]. After balancing, this page should hold nNew cells +** pCArray contains pointers to and sizes of all cells in the page being +** balanced. The current page, pPg, has pPg->nCell cells starting with +** pCArray->apCell[iOld]. After balancing, this page should hold nNew cells ** starting at apCell[iNew]. ** ** This routine makes the necessary adjustments to pPg so that it contains @@ -69580,13 +71250,17 @@ static int editPage( #endif /* Remove cells from the start and end of the page */ + assert( nCell>=0 ); if( iOldnCell ) return SQLITE_CORRUPT_BKPT; memmove(pPg->aCellIdx, &pPg->aCellIdx[nShift*2], nCell*2); nCell -= nShift; } if( iNewEnd < iOldEnd ){ - nCell -= pageFreeArray(pPg, iNewEnd, iOldEnd - iNewEnd, pCArray); + int nTail = pageFreeArray(pPg, iNewEnd, iOldEnd - iNewEnd, pCArray); + assert( nCell>=nTail ); + nCell -= nTail; } pData = &aData[get2byteNotZero(&aData[hdr+5])]; @@ -69596,6 +71270,7 @@ static int editPage( if( iNew=0 ); pCellptr = pPg->aCellIdx; memmove(&pCellptr[nAdd*2], pCellptr, nCell*2); if( pageInsertArray( @@ -69610,8 +71285,11 @@ static int editPage( int iCell = (iOld + pPg->aiOvfl[i]) - iNew; if( iCell>=0 && iCellaCellIdx[iCell * 2]; - memmove(&pCellptr[2], pCellptr, (nCell - iCell) * 2); + if( nCell>iCell ){ + memmove(&pCellptr[2], pCellptr, (nCell - iCell) * 2); + } nCell++; + cachedCellSize(pCArray, iCell+iNew); if( pageInsertArray( pPg, pBegin, &pData, pCellptr, iCell+iNew, 1, pCArray @@ -69620,6 +71298,7 @@ static int editPage( } /* Append cells to the end of the page */ + assert( nCell>=0 ); pCellptr = &pPg->aCellIdx[nCell*2]; if( pageInsertArray( pPg, pBegin, &pData, pCellptr, @@ -69648,24 +71327,9 @@ static int editPage( editpage_fail: /* Unable to edit this page. Rebuild it from scratch instead. */ populateCellCache(pCArray, iNew, nNew); - return rebuildPage(pPg, nNew, &pCArray->apCell[iNew], &pCArray->szCell[iNew]); + return rebuildPage(pCArray, iNew, nNew, pPg); } -/* -** The following parameters determine how many adjacent pages get involved -** in a balancing operation. NN is the number of neighbors on either side -** of the page that participate in the balancing operation. NB is the -** total number of pages that participate, including the target page and -** NN neighbors on either side. -** -** The minimum value of NN is 1 (of course). Increasing NN above 1 -** (to 2 or 3) gives a modest improvement in SELECT and DELETE performance -** in exchange for a larger degradation in INSERT and UPDATE performance. -** The value of NN appears to give the best results overall. -*/ -#define NN 1 /* Number of neighbors on either side of pPage */ -#define NB (NN*2+1) /* Total pages involved in the balance */ - #ifndef SQLITE_OMIT_QUICKBALANCE /* @@ -69700,9 +71364,10 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ assert( sqlite3_mutex_held(pPage->pBt->mutex) ); assert( sqlite3PagerIswriteable(pParent->pDbPage) ); assert( pPage->nOverflow==1 ); - - /* This error condition is now caught prior to reaching this function */ - if( NEVER(pPage->nCell==0) ) return SQLITE_CORRUPT_BKPT; + + if( pPage->nCell==0 ) return SQLITE_CORRUPT_BKPT; /* dbfuzz001.test */ + assert( pPage->nFree>=0 ); + assert( pParent->nFree>=0 ); /* Allocate a new page. This page will become the right-sibling of ** pPage. Make the parent page writable, so that the new divider cell @@ -69716,12 +71381,22 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ u8 *pCell = pPage->apOvfl[0]; u16 szCell = pPage->xCellSize(pPage, pCell); u8 *pStop; + CellArray b; assert( sqlite3PagerIswriteable(pNew->pDbPage) ); - assert( pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) ); + assert( CORRUPT_DB || pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) ); zeroPage(pNew, PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF); - rc = rebuildPage(pNew, 1, &pCell, &szCell); - if( NEVER(rc) ) return rc; + b.nCell = 1; + b.pRef = pPage; + b.apCell = &pCell; + b.szCell = &szCell; + b.apEnd[0] = pPage->aDataEnd; + b.ixNx[0] = 2; + rc = rebuildPage(&b, 0, 1, pNew); + if( NEVER(rc) ){ + releasePage(pNew); + return rc; + } pNew->nFree = pBt->usableSize - pNew->cellOffset - 2 - szCell; /* If this is an auto-vacuum database, update the pointer map @@ -69736,7 +71411,7 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ if( ISAUTOVACUUM ){ ptrmapPut(pBt, pgnoNew, PTRMAP_BTREE, pParent->pgno, &rc); if( szCell>pNew->minLocal ){ - ptrmapPutOvflPtr(pNew, pCell, &rc); + ptrmapPutOvflPtr(pNew, pNew, pCell, &rc); } } @@ -69862,6 +71537,7 @@ static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){ */ pTo->isInit = 0; rc = btreeInitPage(pTo); + if( rc==SQLITE_OK ) rc = btreeComputeFreeSpace(pTo); if( rc!=SQLITE_OK ){ *pRC = rc; return; @@ -69959,10 +71635,6 @@ static int balance_nonroot( assert( sqlite3_mutex_held(pBt->mutex) ); assert( sqlite3PagerIswriteable(pParent->pDbPage) ); -#if 0 - TRACE(("BALANCE: begin page %d child of %d\n", pPage->pgno, pParent->pgno)); -#endif - /* At this point pParent may have at most one overflow cell. And if ** this overflow cell is present, it must be the cell with ** index iParentIdx. This scenario comes about when this function @@ -69974,6 +71646,7 @@ static int balance_nonroot( if( !aOvflSpace ){ return SQLITE_NOMEM_BKPT; } + assert( pParent->nFree>=0 ); /* Find the sibling pages to balance. Also locate the cells in pParent ** that divide the siblings. An attempt is made to find NN siblings on @@ -70013,7 +71686,13 @@ static int balance_nonroot( memset(apOld, 0, (i+1)*sizeof(MemPage*)); goto balance_cleanup; } - nMaxCells += 1+apOld[i]->nCell+apOld[i]->nOverflow; + if( apOld[i]->nFree<0 ){ + rc = btreeComputeFreeSpace(apOld[i]); + if( rc ){ + memset(apOld, 0, (i)*sizeof(MemPage*)); + goto balance_cleanup; + } + } if( (i--)==0 ) break; if( pParent->nOverflow && i+nxDiv==pParent->aiOvfl[0] ){ @@ -70057,6 +71736,7 @@ static int balance_nonroot( /* Make nMaxCells a multiple of 4 in order to preserve 8-byte ** alignment */ + nMaxCells = nOld*(MX_CELL(pBt) + ArraySize(pParent->apOvfl)); nMaxCells = (nMaxCells + 3)&~3; /* @@ -70067,7 +71747,7 @@ static int balance_nonroot( + nMaxCells*sizeof(u16) /* b.szCell */ + pBt->pageSize; /* aSpace1 */ - assert( szScratch<=6*(int)pBt->pageSize ); + assert( szScratch<=7*(int)pBt->pageSize ); b.apCell = sqlite3StackAllocRaw(0, szScratch ); if( b.apCell==0 ){ rc = SQLITE_NOMEM_BKPT; @@ -70103,6 +71783,7 @@ static int balance_nonroot( u16 maskPage = pOld->maskPage; u8 *piCell = aData + pOld->cellOffset; u8 *piEnd; + VVA_ONLY( int nCellAtStart = b.nCell; ) /* Verify that all sibling pages are of the same "type" (table-leaf, ** table-interior, index-leaf, or index-interior). @@ -70131,6 +71812,10 @@ static int balance_nonroot( */ memset(&b.szCell[b.nCell], 0, sizeof(b.szCell[0])*(limit+pOld->nOverflow)); if( pOld->nOverflow>0 ){ + if( NEVER(limitaiOvfl[0]) ){ + rc = SQLITE_CORRUPT_BKPT; + goto balance_cleanup; + } limit = pOld->aiOvfl[0]; for(j=0; jnCell+pOld->nOverflow) ); cntOld[i] = b.nCell; if( iusableSize - 12 + leafCorrection; - for(i=0; iaDataEnd; + b.ixNx[k] = cntOld[i]; + if( k && b.ixNx[k]==b.ixNx[k-1] ){ + k--; /* Omit b.ixNx[] entry for child pages with no cells */ + } + if( !leafData ){ + k++; + b.apEnd[k] = pParent->aDataEnd; + b.ixNx[k] = cntOld[i]+1; + } + assert( p->nFree>=0 ); szNew[i] = usableSpace - p->nFree; for(j=0; jnOverflow; j++){ szNew[i] += 2 + p->xCellSize(p, p->apOvfl[j]); @@ -70401,6 +72098,8 @@ static int balance_nonroot( )); assert( sqlite3PagerIswriteable(pParent->pDbPage) ); + assert( nNew>=1 && nNew<=ArraySize(apNew) ); + assert( apNew[nNew-1]!=0 ); put4byte(pRight, apNew[nNew-1]->pgno); /* If the sibling pages are not leaves, ensure that the right-child pointer @@ -70428,19 +72127,20 @@ static int balance_nonroot( ** populated, not here. */ if( ISAUTOVACUUM ){ - MemPage *pNew = apNew[0]; - u8 *aOld = pNew->aData; + MemPage *pOld; + MemPage *pNew = pOld = apNew[0]; int cntOldNext = pNew->nCell + pNew->nOverflow; - int usableSize = pBt->usableSize; int iNew = 0; int iOld = 0; for(i=0; i=0 && iOldnCell + pOld->nOverflow + !leafData; - aOld = pOld->aData; } if( i==cntNew[iNew] ){ pNew = apNew[++iNew]; @@ -70455,13 +72155,13 @@ static int balance_nonroot( ** overflow cell), we can skip updating the pointer map entries. */ if( iOld>=nNew || pNew->pgno!=aPgno[iOld] - || !SQLITE_WITHIN(pCell,aOld,&aOld[usableSize]) + || !SQLITE_WITHIN(pCell,pOld->aData,pOld->aDataEnd) ){ if( !leafCorrection ){ ptrmapPut(pBt, get4byte(pCell), PTRMAP_BTREE, pNew->pgno, &rc); } if( cachedCellSize(&b,i)>pNew->minLocal ){ - ptrmapPutOvflPtr(pNew, pCell, &rc); + ptrmapPutOvflPtr(pNew, pOld, pCell, &rc); } if( rc ) goto balance_cleanup; } @@ -70606,7 +72306,8 @@ static int balance_nonroot( rc = defragmentPage(apNew[0], -1); testcase( rc!=SQLITE_OK ); assert( apNew[0]->nFree == - (get2byte(&apNew[0]->aData[5])-apNew[0]->cellOffset-apNew[0]->nCell*2) + (get2byteNotZero(&apNew[0]->aData[5]) - apNew[0]->cellOffset + - apNew[0]->nCell*2) || rc!=SQLITE_OK ); copyNodeContent(apNew[0], pParent, &rc); @@ -70705,7 +72406,7 @@ static int balance_deeper(MemPage *pRoot, MemPage **ppChild){ } assert( sqlite3PagerIswriteable(pChild->pDbPage) ); assert( sqlite3PagerIswriteable(pRoot->pDbPage) ); - assert( pChild->nCell==pRoot->nCell ); + assert( pChild->nCell==pRoot->nCell || CORRUPT_DB ); TRACE(("BALANCE: copy root %d into %d\n", pRoot->pgno, pChild->pgno)); @@ -70724,6 +72425,30 @@ static int balance_deeper(MemPage *pRoot, MemPage **ppChild){ return SQLITE_OK; } +/* +** Return SQLITE_CORRUPT if any cursor other than pCur is currently valid +** on the same B-tree as pCur. +** +** This can if a database is corrupt with two or more SQL tables +** pointing to the same b-tree. If an insert occurs on one SQL table +** and causes a BEFORE TRIGGER to do a secondary insert on the other SQL +** table linked to the same b-tree. If the secondary insert causes a +** rebalance, that can change content out from under the cursor on the +** first SQL table, violating invariants on the first insert. +*/ +static int anotherValidCursor(BtCursor *pCur){ + BtCursor *pOther; + for(pOther=pCur->pBt->pCursor; pOther; pOther=pOther->pNext){ + if( pOther!=pCur + && pOther->eState==CURSOR_VALID + && pOther->pPage==pCur->pPage + ){ + return SQLITE_CORRUPT_BKPT; + } + } + return SQLITE_OK; +} + /* ** The page that pCur currently points to has just been modified in ** some way. This function figures out if this modification means the @@ -70744,11 +72469,14 @@ static int balance(BtCursor *pCur){ VVA_ONLY( int balance_deeper_called = 0 ); do { - int iPage = pCur->iPage; + int iPage; MemPage *pPage = pCur->pPage; - if( iPage==0 ){ - if( pPage->nOverflow ){ + if( NEVER(pPage->nFree<0) && btreeComputeFreeSpace(pPage) ) break; + if( pPage->nOverflow==0 && pPage->nFree<=nMin ){ + break; + }else if( (iPage = pCur->iPage)==0 ){ + if( pPage->nOverflow && (rc = anotherValidCursor(pCur))==SQLITE_OK ){ /* The root page of the b-tree is overfull. In this case call the ** balance_deeper() function to create a new child for the root-page ** and copy the current contents of the root-page to it. The @@ -70768,13 +72496,14 @@ static int balance(BtCursor *pCur){ }else{ break; } - }else if( pPage->nOverflow==0 && pPage->nFree<=nMin ){ - break; }else{ MemPage * const pParent = pCur->apPage[iPage-1]; int const iIdx = pCur->aiIdx[iPage-1]; rc = sqlite3PagerWrite(pParent->pDbPage); + if( rc==SQLITE_OK && pParent->nFree<0 ){ + rc = btreeComputeFreeSpace(pParent); + } if( rc==SQLITE_OK ){ #ifndef SQLITE_OMIT_QUICKBALANCE if( pPage->intKeyLeaf @@ -70885,7 +72614,11 @@ static int btreeOverwriteContent( if( memcmp(pDest, ((u8*)pX->pData) + iOffset, iAmt)!=0 ){ int rc = sqlite3PagerWrite(pPage->pDbPage); if( rc ) return rc; - memcpy(pDest, ((u8*)pX->pData) + iOffset, iAmt); + /* In a corrupt database, it is possible for the source and destination + ** buffers to overlap. This is harmless since the database is already + ** corrupt but it does cause valgrind and ASAN warnings. So use + ** memmove(). */ + memmove(pDest, ((u8*)pX->pData) + iOffset, iAmt); } } return SQLITE_OK; @@ -70904,7 +72637,9 @@ static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){ Pgno ovflPgno; /* Next overflow page to write */ u32 ovflPageSize; /* Size to write on overflow page */ - if( pCur->info.pPayload + pCur->info.nLocal > pPage->aDataEnd ){ + if( pCur->info.pPayload + pCur->info.nLocal > pPage->aDataEnd + || pCur->info.pPayload < pPage->aData + pPage->cellOffset + ){ return SQLITE_CORRUPT_BKPT; } /* Overwrite the local portion first */ @@ -71037,7 +72772,6 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( if( flags & BTREE_SAVEPOSITION ){ assert( pCur->curFlags & BTCF_ValidNKey ); assert( pX->nKey==pCur->info.nKey ); - assert( pCur->info.nSize!=0 ); assert( loc==0 ); } #endif @@ -71112,11 +72846,17 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( } } - assert( pCur->eState==CURSOR_VALID || (pCur->eState==CURSOR_INVALID && loc) ); + assert( pCur->eState==CURSOR_VALID + || (pCur->eState==CURSOR_INVALID && loc) + || CORRUPT_DB ); pPage = pCur->pPage; assert( pPage->intKey || pX->nKey>=0 ); assert( pPage->leaf || !pPage->intKey ); + if( pPage->nFree<0 ){ + rc = btreeComputeFreeSpace(pPage); + if( rc ) return rc; + } TRACE(("INSERT: table=%d nkey=%lld ndata=%d page=%d %s\n", pCur->pgnoRoot, pX->nKey, pX->nData, pPage->pgno, @@ -71141,6 +72881,8 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( memcpy(newCell, oldCell, 4); } rc = clearCell(pPage, oldCell, &info); + testcase( pCur->curFlags & BTCF_ValidOvfl ); + invalidateOverflowCache(pCur); if( info.nSize==szNew && info.nLocal==info.nPayload && (!ISAUTOVACUUM || szNewminLocal) ){ @@ -71154,7 +72896,12 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( ** new entry uses overflow pages, as the insertCell() call below is ** necessary to add the PTRMAP_OVERFLOW1 pointer-map entry. */ assert( rc==SQLITE_OK ); /* clearCell never fails when nLocal==nPayload */ - if( oldCell+szNew > pPage->aDataEnd ) return SQLITE_CORRUPT_BKPT; + if( oldCell < pPage->aData+pPage->hdrOffset+10 ){ + return SQLITE_CORRUPT_BKPT; + } + if( oldCell+szNew > pPage->aDataEnd ){ + return SQLITE_CORRUPT_BKPT; + } memcpy(oldCell, newCell, szNew); return SQLITE_OK; } @@ -71259,14 +73006,18 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ assert( pCur->curFlags & BTCF_WriteFlag ); assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) ); assert( !hasReadConflicts(p, pCur->pgnoRoot) ); - assert( pCur->ixpPage->nCell ); - assert( pCur->eState==CURSOR_VALID ); assert( (flags & ~(BTREE_SAVEPOSITION | BTREE_AUXDELETE))==0 ); + if( pCur->eState==CURSOR_REQUIRESEEK ){ + rc = btreeRestoreCursorPosition(pCur); + if( rc ) return rc; + } + assert( pCur->eState==CURSOR_VALID ); iCellDepth = pCur->iPage; iCellIdx = pCur->ix; pPage = pCur->pPage; pCell = findCell(pPage, iCellIdx); + if( pPage->nFree<0 && btreeComputeFreeSpace(pPage) ) return SQLITE_CORRUPT; /* If the bPreserve flag is set to true, then the cursor position must ** be preserved following this delete operation. If the current delete @@ -71280,6 +73031,7 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ if( bPreserve ){ if( !pPage->leaf || (pPage->nFree+cellSizePtr(pPage,pCell)+2)>(int)(pBt->usableSize*2/3) + || pPage->nCell==1 /* See dbfuzz001.test for a test case */ ){ /* A b-tree rebalance will be required after deleting this entry. ** Save the cursor key. */ @@ -71336,6 +73088,10 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ Pgno n; unsigned char *pTmp; + if( pLeaf->nFree<0 ){ + rc = btreeComputeFreeSpace(pLeaf); + if( rc ) return rc; + } if( iCellDepthiPage-1 ){ n = pCur->apPage[iCellDepth+1]->pgno; }else{ @@ -71694,6 +73450,9 @@ static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){ assert( sqlite3BtreeHoldsMutex(p) ); assert( p->inTrans==TRANS_WRITE ); assert( iTable>=2 ); + if( iTable>btreePagecount(pBt) ){ + return SQLITE_CORRUPT_BKPT; + } rc = btreeGetPage(pBt, (Pgno)iTable, &pPage, 0); if( rc ) return rc; @@ -71860,7 +73619,7 @@ SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree *p, int idx, u32 iMeta){ ** Otherwise, if an error is encountered (i.e. an IO error or database ** corruption) an SQLite error code is returned. */ -SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *pCur, i64 *pnEntry){ +SQLITE_PRIVATE int sqlite3BtreeCount(sqlite3 *db, BtCursor *pCur, i64 *pnEntry){ i64 nEntry = 0; /* Value to return in *pnEntry */ int rc; /* Return code */ @@ -71873,7 +73632,7 @@ SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *pCur, i64 *pnEntry){ /* Unless an error occurs, the following loop runs one iteration for each ** page in the B-Tree structure (not including overflow pages). */ - while( rc==SQLITE_OK ){ + while( rc==SQLITE_OK && !db->u1.isInterrupted ){ int iIdx; /* Index of child node in parent */ MemPage *pPage; /* Current page of the b-tree */ @@ -71999,6 +73758,7 @@ static int checkRef(IntegrityCk *pCheck, Pgno iPage){ checkAppendMsg(pCheck, "2nd reference to page %d", iPage); return 1; } + if( pCheck->db->u1.isInterrupted ) return 1; setPageReferenced(pCheck, iPage); return 0; } @@ -72042,10 +73802,10 @@ static void checkList( IntegrityCk *pCheck, /* Integrity checking context */ int isFreeList, /* True for a freelist. False for overflow page list */ int iPage, /* Page number for first page in the list */ - int N /* Expected number of pages in the list */ + u32 N /* Expected number of pages in the list */ ){ int i; - int expected = N; + u32 expected = N; int nErrAtStart = pCheck->nErr; while( iPage!=0 && pCheck->mxErr ){ DbPage *pOvflPage; @@ -72058,18 +73818,18 @@ static void checkList( } pOvflData = (unsigned char *)sqlite3PagerGetData(pOvflPage); if( isFreeList ){ - int n = get4byte(&pOvflData[4]); + u32 n = (u32)get4byte(&pOvflData[4]); #ifndef SQLITE_OMIT_AUTOVACUUM if( pCheck->pBt->autoVacuum ){ checkPtrmap(pCheck, iPage, PTRMAP_FREEPAGE, 0); } #endif - if( n>(int)pCheck->pBt->usableSize/4-2 ){ + if( n>pCheck->pBt->usableSize/4-2 ){ checkAppendMsg(pCheck, "freelist leaf count too big on page %d", iPage); N--; }else{ - for(i=0; ipBt->autoVacuum ){ @@ -72227,6 +73987,11 @@ static int checkTreePage( "btreeInitPage() returns error code %d", rc); goto end_of_check; } + if( (rc = btreeComputeFreeSpace(pPage))!=0 ){ + assert( rc==SQLITE_CORRUPT ); + checkAppendMsg(pCheck, "free space corruption", rc); + goto end_of_check; + } data = pPage->aData; hdr = pPage->hdrOffset; @@ -72299,7 +74064,7 @@ static int checkTreePage( /* Check the content overflow list */ if( info.nPayload>info.nLocal ){ - int nPage; /* Number of pages on the overflow chain */ + u32 nPage; /* Number of pages on the overflow chain */ Pgno pgnoOvfl; /* First page of the overflow chain */ assert( pc + info.nSize - 4 <= usableSize ); nPage = (info.nPayload - info.nLocal + usableSize - 5)/(usableSize - 4); @@ -72359,9 +74124,9 @@ static int checkTreePage( i = get2byte(&data[hdr+1]); while( i>0 ){ int size, j; - assert( (u32)i<=usableSize-4 ); /* Enforced by btreeInitPage() */ + assert( (u32)i<=usableSize-4 ); /* Enforced by btreeComputeFreeSpace() */ size = get2byte(&data[i+2]); - assert( (u32)(i+size)<=usableSize ); /* Enforced by btreeInitPage() */ + assert( (u32)(i+size)<=usableSize ); /* due to btreeComputeFreeSpace() */ btreeHeapInsert(heap, (((u32)i)<<16)|(i+size-1)); /* EVIDENCE-OF: R-58208-19414 The first 2 bytes of a freeblock are a ** big-endian integer which is the offset in the b-tree page of the next @@ -72370,8 +74135,8 @@ static int checkTreePage( j = get2byte(&data[i]); /* EVIDENCE-OF: R-06866-39125 Freeblocks are always connected in order of ** increasing offset. */ - assert( j==0 || j>i+size ); /* Enforced by btreeInitPage() */ - assert( (u32)j<=usableSize-4 ); /* Enforced by btreeInitPage() */ + assert( j==0 || j>i+size ); /* Enforced by btreeComputeFreeSpace() */ + assert( (u32)j<=usableSize-4 ); /* Enforced by btreeComputeFreeSpace() */ i = j; } /* Analyze the min-heap looking for overlap between cells and/or @@ -72437,6 +74202,7 @@ static int checkTreePage( ** returned. If a memory allocation error occurs, NULL is returned. */ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( + sqlite3 *db, /* Database connection that is running the check */ Btree *p, /* The btree to be checked */ int *aRoot, /* An array of root pages numbers for individual trees */ int nRoot, /* Number of entries in aRoot[] */ @@ -72446,7 +74212,7 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( Pgno i; IntegrityCk sCheck; BtShared *pBt = p->pBt; - int savedDbFlags = pBt->db->flags; + u64 savedDbFlags = pBt->db->flags; char zErr[100]; VVA_ONLY( int nRef ); @@ -72454,6 +74220,7 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( assert( p->inTrans>TRANS_NONE && pBt->inTransaction>TRANS_NONE ); VVA_ONLY( nRef = sqlite3PagerRefcount(pBt->pPager) ); assert( nRef>=0 ); + sCheck.db = db; sCheck.pBt = pBt; sCheck.pPager = pBt->pPager; sCheck.nPage = btreePagecount(sCheck.pBt); @@ -72513,7 +74280,7 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( } #endif testcase( pBt->db->flags & SQLITE_CellSizeCk ); - pBt->db->flags &= ~SQLITE_CellSizeCk; + pBt->db->flags &= ~(u64)SQLITE_CellSizeCk; for(i=0; (int)iisAttached ){ pp = sqlite3PagerBackupPtr(sqlite3BtreePager(p->pSrc)); + assert( pp!=0 ); while( *pp!=p ){ pp = &(*pp)->pNext; + assert( pp!=0 ); } *pp = p->pNext; } @@ -73676,6 +75445,11 @@ SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){ /* #include "sqliteInt.h" */ /* #include "vdbeInt.h" */ +/* True if X is a power of two. 0 is considered a power of two here. +** In other words, return true if X has at most one bit set. +*/ +#define ISPOWEROF2(X) (((X)&((X)-1))==0) + #ifdef SQLITE_DEBUG /* ** Check invariants on a Mem object. @@ -73695,8 +75469,8 @@ SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){ ** That saves a few cycles in inner loops. */ assert( (p->flags & MEM_Dyn)==0 || p->szMalloc==0 ); - /* Cannot be both MEM_Int and MEM_Real at the same time */ - assert( (p->flags & (MEM_Int|MEM_Real))!=(MEM_Int|MEM_Real) ); + /* Cannot have more than one of MEM_Int, MEM_Real, or MEM_IntReal */ + assert( ISPOWEROF2(p->flags & (MEM_Int|MEM_Real|MEM_IntReal)) ); if( p->flags & MEM_Null ){ /* Cannot be both MEM_Null and some other type */ @@ -73715,7 +75489,7 @@ SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){ ((p->flags&MEM_Static)!=0 ? 1 : 0) <= 1 ); /* No other bits set */ - assert( (p->flags & ~(MEM_Null|MEM_Term|MEM_Subtype + assert( (p->flags & ~(MEM_Null|MEM_Term|MEM_Subtype|MEM_FromBind |MEM_Dyn|MEM_Ephem|MEM_Static))==0 ); }else{ /* A pure NULL might have other flags, such as MEM_Static, MEM_Dyn, @@ -73750,9 +75524,31 @@ SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){ } #endif +/* +** Render a Mem object which is one of MEM_Int, MEM_Real, or MEM_IntReal +** into a buffer. +*/ +static void vdbeMemRenderNum(int sz, char *zBuf, Mem *p){ + StrAccum acc; + assert( p->flags & (MEM_Int|MEM_Real|MEM_IntReal) ); + sqlite3StrAccumInit(&acc, 0, zBuf, sz, 0); + if( p->flags & MEM_Int ){ + sqlite3_str_appendf(&acc, "%lld", p->u.i); + }else if( p->flags & MEM_IntReal ){ + sqlite3_str_appendf(&acc, "%!.15g", (double)p->u.i); + }else{ + sqlite3_str_appendf(&acc, "%!.15g", p->u.r); + } + assert( acc.zText==zBuf && acc.mxAlloc<=0 ); + zBuf[acc.nChar] = 0; /* Fast version of sqlite3StrAccumFinish(&acc) */ +} + #ifdef SQLITE_DEBUG /* -** Check that string value of pMem agrees with its integer or real value. +** Validity checks on pMem. pMem holds a string. +** +** (1) Check that string value of pMem agrees with its integer or real value. +** (2) Check that the string is correctly zero terminated ** ** A single int or real value always converts to the same strings. But ** many different strings can be converted into the same int or real. @@ -73770,17 +75566,24 @@ SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){ ** ** This routine is for use inside of assert() statements only. */ -SQLITE_PRIVATE int sqlite3VdbeMemConsistentDualRep(Mem *p){ +SQLITE_PRIVATE int sqlite3VdbeMemValidStrRep(Mem *p){ char zBuf[100]; char *z; int i, j, incr; if( (p->flags & MEM_Str)==0 ) return 1; - if( (p->flags & (MEM_Int|MEM_Real))==0 ) return 1; - if( p->flags & MEM_Int ){ - sqlite3_snprintf(sizeof(zBuf),zBuf,"%lld",p->u.i); - }else{ - sqlite3_snprintf(sizeof(zBuf),zBuf,"%!.15g",p->u.r); - } + if( p->flags & MEM_Term ){ + /* Insure that the string is properly zero-terminated. Pay particular + ** attention to the case where p->n is odd */ + if( p->szMalloc>0 && p->z==p->zMalloc ){ + assert( p->enc==SQLITE_UTF8 || p->szMalloc >= ((p->n+1)&~1)+2 ); + assert( p->enc!=SQLITE_UTF8 || p->szMalloc >= p->n+1 ); + } + assert( p->z[p->n]==0 ); + assert( p->enc==SQLITE_UTF8 || p->z[(p->n+1)&~1]==0 ); + assert( p->enc==SQLITE_UTF8 || p->z[((p->n+1)&~1)+1]==0 ); + } + if( (p->flags & (MEM_Int|MEM_Real|MEM_IntReal))==0 ) return 1; + vdbeMemRenderNum(sizeof(zBuf), zBuf, p); z = p->z; i = j = 0; incr = 1; @@ -73836,8 +75639,7 @@ SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){ } /* -** Make sure pMem->z points to a writable allocation of at least -** min(n,32) bytes. +** Make sure pMem->z points to a writable allocation of at least n bytes. ** ** If the bPreserve argument is true, then copy of the content of ** pMem->z into the new allocation. pMem must be either a string or @@ -73856,9 +75658,14 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPre assert( pMem->szMalloc==0 || pMem->szMalloc==sqlite3DbMallocSize(pMem->db, pMem->zMalloc) ); - if( n<32 ) n = 32; if( pMem->szMalloc>0 && bPreserve && pMem->z==pMem->zMalloc ){ - pMem->z = pMem->zMalloc = sqlite3DbReallocOrFree(pMem->db, pMem->z, n); + if( pMem->db ){ + pMem->z = pMem->zMalloc = sqlite3DbReallocOrFree(pMem->db, pMem->z, n); + }else{ + pMem->zMalloc = sqlite3Realloc(pMem->z, n); + if( pMem->zMalloc==0 ) sqlite3_free(pMem->z); + pMem->z = pMem->zMalloc; + } bPreserve = 0; }else{ if( pMem->szMalloc>0 ) sqlite3DbFreeNN(pMem->db, pMem->zMalloc); @@ -73894,34 +75701,40 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPre ** ** Any prior string or blob content in the pMem object may be discarded. ** The pMem->xDel destructor is called, if it exists. Though MEM_Str -** and MEM_Blob values may be discarded, MEM_Int, MEM_Real, and MEM_Null -** values are preserved. +** and MEM_Blob values may be discarded, MEM_Int, MEM_Real, MEM_IntReal, +** and MEM_Null values are preserved. ** ** Return SQLITE_OK on success or an error code (probably SQLITE_NOMEM) ** if unable to complete the resizing. */ SQLITE_PRIVATE int sqlite3VdbeMemClearAndResize(Mem *pMem, int szNew){ - assert( szNew>0 ); + assert( CORRUPT_DB || szNew>0 ); assert( (pMem->flags & MEM_Dyn)==0 || pMem->szMalloc==0 ); if( pMem->szMallocflags & MEM_Dyn)==0 ); pMem->z = pMem->zMalloc; - pMem->flags &= (MEM_Null|MEM_Int|MEM_Real); + pMem->flags &= (MEM_Null|MEM_Int|MEM_Real|MEM_IntReal); return SQLITE_OK; } /* ** It is already known that pMem contains an unterminated string. ** Add the zero terminator. +** +** Three bytes of zero are added. In this way, there is guaranteed +** to be a double-zero byte at an even byte boundary in order to +** terminate a UTF16 string, even if the initial size of the buffer +** is an odd number of bytes. */ static SQLITE_NOINLINE int vdbeMemAddTerminator(Mem *pMem){ - if( sqlite3VdbeMemGrow(pMem, pMem->n+2, 1) ){ + if( sqlite3VdbeMemGrow(pMem, pMem->n+3, 1) ){ return SQLITE_NOMEM_BKPT; } pMem->z[pMem->n] = 0; pMem->z[pMem->n+1] = 0; + pMem->z[pMem->n+2] = 0; pMem->flags |= MEM_Term; return SQLITE_OK; } @@ -73958,13 +75771,15 @@ SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem *pMem){ SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *pMem){ int nByte; assert( pMem->flags & MEM_Zero ); - assert( pMem->flags&MEM_Blob ); + assert( (pMem->flags&MEM_Blob)!=0 || MemNullNochng(pMem) ); + testcase( sqlite3_value_nochange(pMem) ); assert( !sqlite3VdbeMemIsRowSet(pMem) ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); /* Set nByte to the number of bytes required to store the expanded blob. */ nByte = pMem->n + pMem->u.nZero; if( nByte<=0 ){ + if( (pMem->flags & MEM_Blob)==0 ) return SQLITE_OK; nByte = 1; } if( sqlite3VdbeMemGrow(pMem, nByte, 1) ){ @@ -73993,12 +75808,12 @@ SQLITE_PRIVATE int sqlite3VdbeMemNulTerminate(Mem *pMem){ } /* -** Add MEM_Str to the set of representations for the given Mem. Numbers -** are converted using sqlite3_snprintf(). Converting a BLOB to a string -** is a no-op. +** Add MEM_Str to the set of representations for the given Mem. This +** routine is only called if pMem is a number of some kind, not a NULL +** or a BLOB. ** -** Existing representations MEM_Int and MEM_Real are invalidated if -** bForce is true but are retained if bForce is false. +** Existing representations MEM_Int, MEM_Real, or MEM_IntReal are invalidated +** if bForce is true but are retained if bForce is false. ** ** A MEM_Null value will never be passed to this function. This function is ** used for converting values to text for returning to the user (i.e. via @@ -74007,13 +75822,12 @@ SQLITE_PRIVATE int sqlite3VdbeMemNulTerminate(Mem *pMem){ ** user and the latter is an internal programming error. */ SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){ - int fg = pMem->flags; const int nByte = 32; assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); - assert( !(fg&MEM_Zero) ); - assert( !(fg&(MEM_Str|MEM_Blob)) ); - assert( fg&(MEM_Int|MEM_Real) ); + assert( !(pMem->flags&MEM_Zero) ); + assert( !(pMem->flags&(MEM_Str|MEM_Blob)) ); + assert( pMem->flags&(MEM_Int|MEM_Real|MEM_IntReal) ); assert( !sqlite3VdbeMemIsRowSet(pMem) ); assert( EIGHT_BYTE_ALIGNMENT(pMem) ); @@ -74023,22 +75837,12 @@ SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){ return SQLITE_NOMEM_BKPT; } - /* For a Real or Integer, use sqlite3_snprintf() to produce the UTF-8 - ** string representation of the value. Then, if the required encoding - ** is UTF-16le or UTF-16be do a translation. - ** - ** FIX ME: It would be better if sqlite3_snprintf() could do UTF-16. - */ - if( fg & MEM_Int ){ - sqlite3_snprintf(nByte, pMem->z, "%lld", pMem->u.i); - }else{ - assert( fg & MEM_Real ); - sqlite3_snprintf(nByte, pMem->z, "%!.15g", pMem->u.r); - } - pMem->n = sqlite3Strlen30(pMem->z); + vdbeMemRenderNum(nByte, pMem->z, pMem); + assert( pMem->z!=0 ); + pMem->n = sqlite3Strlen30NN(pMem->z); pMem->enc = SQLITE_UTF8; pMem->flags |= MEM_Str|MEM_Term; - if( bForce ) pMem->flags &= ~(MEM_Int|MEM_Real); + if( bForce ) pMem->flags &= ~(MEM_Int|MEM_Real|MEM_IntReal); sqlite3VdbeChangeEncoding(pMem, enc); return SQLITE_OK; } @@ -74083,15 +75887,11 @@ SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){ #ifndef SQLITE_OMIT_WINDOWFUNC SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem *pAccum, Mem *pOut, FuncDef *pFunc){ sqlite3_context ctx; - Mem t; assert( pFunc!=0 ); assert( pFunc->xValue!=0 ); assert( (pAccum->flags & MEM_Null)!=0 || pFunc==pAccum->u.pDef ); assert( pAccum->db==0 || sqlite3_mutex_held(pAccum->db->mutex) ); memset(&ctx, 0, sizeof(ctx)); - memset(&t, 0, sizeof(t)); - t.flags = MEM_Null; - t.db = pAccum->db; sqlite3VdbeMemSetNull(pOut); ctx.pOut = pOut; ctx.pMem = pAccum; @@ -74212,12 +76012,12 @@ SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem *pMem){ assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); assert( EIGHT_BYTE_ALIGNMENT(pMem) ); flags = pMem->flags; - if( flags & MEM_Int ){ + if( flags & (MEM_Int|MEM_IntReal) ){ + testcase( flags & MEM_IntReal ); return pMem->u.i; }else if( flags & MEM_Real ){ return doubleToInt64(pMem->u.r); - }else if( flags & (MEM_Str|MEM_Blob) ){ - assert( pMem->z || pMem->n==0 ); + }else if( (flags & (MEM_Str|MEM_Blob))!=0 && pMem->z!=0 ){ return memIntValue(pMem); }else{ return 0; @@ -74241,7 +76041,8 @@ SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem *pMem){ assert( EIGHT_BYTE_ALIGNMENT(pMem) ); if( pMem->flags & MEM_Real ){ return pMem->u.r; - }else if( pMem->flags & MEM_Int ){ + }else if( pMem->flags & (MEM_Int|MEM_IntReal) ){ + testcase( pMem->flags & MEM_IntReal ); return (double)pMem->u.i; }else if( pMem->flags & (MEM_Str|MEM_Blob) ){ return memRealValue(pMem); @@ -74256,7 +76057,8 @@ SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem *pMem){ ** Return the value ifNull if pMem is NULL. */ SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem *pMem, int ifNull){ - if( pMem->flags & MEM_Int ) return pMem->u.i!=0; + testcase( pMem->flags & MEM_IntReal ); + if( pMem->flags & (MEM_Int|MEM_IntReal) ) return pMem->u.i!=0; if( pMem->flags & MEM_Null ) return ifNull; return sqlite3VdbeRealValue(pMem)!=0.0; } @@ -74319,17 +76121,21 @@ SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem *pMem){ /* Compare a floating point value to an integer. Return true if the two ** values are the same within the precision of the floating point value. ** +** This function assumes that i was obtained by assignment from r1. +** ** For some versions of GCC on 32-bit machines, if you do the more obvious ** comparison of "r1==(double)i" you sometimes get an answer of false even ** though the r1 and (double)i values are bit-for-bit the same. */ -static int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){ +SQLITE_PRIVATE int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){ double r2 = (double)i; - return memcmp(&r1, &r2, sizeof(r1))==0; + return r1==0.0 + || (memcmp(&r1, &r2, sizeof(r1))==0 + && i >= -2251799813685248LL && i < 2251799813685248LL); } /* -** Convert pMem so that it has types MEM_Real or MEM_Int or both. +** Convert pMem so that it has type MEM_Real or MEM_Int. ** Invalidate any prior representations. ** ** Every effort is made to force the conversion, even if the input @@ -74337,25 +76143,26 @@ static int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){ ** as much of the string as we can and ignore the rest. */ SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem *pMem){ - if( (pMem->flags & (MEM_Int|MEM_Real|MEM_Null))==0 ){ + testcase( pMem->flags & MEM_Int ); + testcase( pMem->flags & MEM_Real ); + testcase( pMem->flags & MEM_IntReal ); + testcase( pMem->flags & MEM_Null ); + if( (pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Null))==0 ){ int rc; + sqlite3_int64 ix; assert( (pMem->flags & (MEM_Blob|MEM_Str))!=0 ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); - rc = sqlite3Atoi64(pMem->z, &pMem->u.i, pMem->n, pMem->enc); - if( rc==0 ){ + rc = sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc); + if( ((rc==0 || rc==1) && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)<=1) + || sqlite3RealSameAsInt(pMem->u.r, (ix = (i64)pMem->u.r)) + ){ + pMem->u.i = ix; MemSetTypeFlag(pMem, MEM_Int); }else{ - i64 i = pMem->u.i; - sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc); - if( rc==1 && sqlite3RealSameAsInt(pMem->u.r, i) ){ - pMem->u.i = i; - MemSetTypeFlag(pMem, MEM_Int); - }else{ - MemSetTypeFlag(pMem, MEM_Real); - } + MemSetTypeFlag(pMem, MEM_Real); } } - assert( (pMem->flags & (MEM_Int|MEM_Real|MEM_Null))!=0 ); + assert( (pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Null))!=0 ); pMem->flags &= ~(MEM_Str|MEM_Blob|MEM_Zero); return SQLITE_OK; } @@ -74367,8 +76174,8 @@ SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem *pMem){ ** affinity even if that results in loss of data. This routine is ** used (for example) to implement the SQL "cast()" operator. */ -SQLITE_PRIVATE void sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){ - if( pMem->flags & MEM_Null ) return; +SQLITE_PRIVATE int sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){ + if( pMem->flags & MEM_Null ) return SQLITE_OK; switch( aff ){ case SQLITE_AFF_BLOB: { /* Really a cast to BLOB */ if( (pMem->flags & MEM_Blob)==0 ){ @@ -74398,10 +76205,11 @@ SQLITE_PRIVATE void sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){ pMem->flags |= (pMem->flags&MEM_Blob)>>3; sqlite3ValueApplyAffinity(pMem, SQLITE_AFF_TEXT, encoding); assert( pMem->flags & MEM_Str || pMem->db->mallocFailed ); - pMem->flags &= ~(MEM_Int|MEM_Real|MEM_Blob|MEM_Zero); - break; + pMem->flags &= ~(MEM_Int|MEM_Real|MEM_IntReal|MEM_Blob|MEM_Zero); + return sqlite3VdbeChangeEncoding(pMem, encoding); } } + return SQLITE_OK; } /* @@ -74567,23 +76375,30 @@ SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem *p){ ** its link to a shallow copy and by marking any current shallow ** copies of this cell as invalid. ** -** This is used for testing and debugging only - to make sure shallow -** copies are not misused. +** This is used for testing and debugging only - to help ensure that shallow +** copies (created by OP_SCopy) are not misused. */ SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ int i; Mem *pX; - for(i=0, pX=pVdbe->aMem; inMem; i++, pX++){ + for(i=1, pX=pVdbe->aMem+1; inMem; i++, pX++){ if( pX->pScopyFrom==pMem ){ + u16 mFlags; + if( pVdbe->db->flags & SQLITE_VdbeTrace ){ + sqlite3DebugPrintf("Invalidate R[%d] due to change in R[%d]\n", + (int)(pX - pVdbe->aMem), (int)(pMem - pVdbe->aMem)); + } /* If pX is marked as a shallow copy of pMem, then verify that ** no significant changes have been made to pX since the OP_SCopy. ** A significant change would indicated a missed call to this ** function for pX. Minor changes, such as adding or removing a ** dual type, are allowed, as long as the underlying value is the ** same. */ - u16 mFlags = pMem->flags & pX->flags & pX->mScopyFlags; - assert( (mFlags&MEM_Int)==0 || pMem->u.i==pX->u.i ); - assert( (mFlags&MEM_Real)==0 || pMem->u.r==pX->u.r ); + mFlags = pMem->flags & pX->flags & pX->mScopyFlags; + assert( (mFlags&(MEM_Int|MEM_IntReal))==0 || pMem->u.i==pX->u.i ); + /* assert( (mFlags&MEM_Real)==0 || pMem->u.r==pX->u.r ); */ + /* ^^ */ + /* Cannot reliably compare doubles for equality */ assert( (mFlags&MEM_Str)==0 || (pMem->n==pX->n && pMem->z==pX->z) ); assert( (mFlags&MEM_Blob)==0 || sqlite3BlobCompare(pMem,pX)==0 ); @@ -74597,7 +76412,6 @@ SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ } #endif /* SQLITE_DEBUG */ - /* ** Make an shallow copy of pFrom into pTo. Prior contents of ** pTo are freed. The pFrom->z field is not duplicated. If @@ -74704,7 +76518,6 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( assert( enc!=0 ); if( enc==SQLITE_UTF8 ){ nByte = 0x7fffffff & (int)strlen(z); - if( nByte>iLimit ) nByte = iLimit+1; }else{ for(nByte=0; nByte<=iLimit && (z[nByte] | z[nByte+1]); nByte+=2){} } @@ -74716,37 +76529,47 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( ** management (one of MEM_Dyn or MEM_Static). */ if( xDel==SQLITE_TRANSIENT ){ - int nAlloc = nByte; + u32 nAlloc = nByte; if( flags&MEM_Term ){ nAlloc += (enc==SQLITE_UTF8?1:2); } if( nByte>iLimit ){ - return SQLITE_TOOBIG; + return sqlite3ErrorToParser(pMem->db, SQLITE_TOOBIG); } testcase( nAlloc==0 ); testcase( nAlloc==31 ); testcase( nAlloc==32 ); - if( sqlite3VdbeMemClearAndResize(pMem, MAX(nAlloc,32)) ){ + if( sqlite3VdbeMemClearAndResize(pMem, (int)MAX(nAlloc,32)) ){ return SQLITE_NOMEM_BKPT; } memcpy(pMem->z, z, nAlloc); - }else if( xDel==SQLITE_DYNAMIC ){ - sqlite3VdbeMemRelease(pMem); - pMem->zMalloc = pMem->z = (char *)z; - pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->zMalloc); }else{ sqlite3VdbeMemRelease(pMem); pMem->z = (char *)z; - pMem->xDel = xDel; - flags |= ((xDel==SQLITE_STATIC)?MEM_Static:MEM_Dyn); + if( xDel==SQLITE_DYNAMIC ){ + pMem->zMalloc = pMem->z; + pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->zMalloc); + }else{ + pMem->xDel = xDel; + flags |= ((xDel==SQLITE_STATIC)?MEM_Static:MEM_Dyn); + } } pMem->n = nByte; pMem->flags = flags; - pMem->enc = (enc==0 ? SQLITE_UTF8 : enc); + if( enc ){ + pMem->enc = enc; +#ifdef SQLITE_ENABLE_SESSION + }else if( pMem->db==0 ){ + pMem->enc = SQLITE_UTF8; +#endif + }else{ + assert( pMem->db!=0 ); + pMem->enc = ENC(pMem->db); + } #ifndef SQLITE_OMIT_UTF16 - if( pMem->enc!=SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){ + if( enc>SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){ return SQLITE_NOMEM_BKPT; } #endif @@ -74781,6 +76604,9 @@ static SQLITE_NOINLINE int vdbeMemFromBtreeResize( ){ int rc; pMem->flags = MEM_Null; + if( sqlite3BtreeMaxRecordSize(pCur)z); if( rc==SQLITE_OK ){ @@ -74854,7 +76680,7 @@ static SQLITE_NOINLINE const void *valueToText(sqlite3_value* pVal, u8 enc){ assert(pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) || pVal->db==0 || pVal->db->mallocFailed ); if( pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) ){ - assert( sqlite3VdbeMemConsistentDualRep(pVal) ); + assert( sqlite3VdbeMemValidStrRep(pVal) ); return pVal->z; }else{ return 0; @@ -74877,7 +76703,7 @@ SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){ assert( (enc&3)==(enc&~SQLITE_UTF16_ALIGNED) ); assert( !sqlite3VdbeMemIsRowSet(pVal) ); if( (pVal->flags&(MEM_Str|MEM_Term))==(MEM_Str|MEM_Term) && pVal->enc==enc ){ - assert( sqlite3VdbeMemConsistentDualRep(pVal) ); + assert( sqlite3VdbeMemValidStrRep(pVal) ); return pVal->z; } if( pVal->flags&MEM_Null ){ @@ -74921,7 +76747,7 @@ struct ValueNewStat4Ctx { ** an sqlite3_value within the UnpackedRecord.a[] array. */ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 if( p ){ UnpackedRecord *pRec = p->ppRec[0]; @@ -74957,7 +76783,7 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ } #else UNUSED_PARAMETER(p); -#endif /* defined(SQLITE_ENABLE_STAT3_OR_STAT4) */ +#endif /* defined(SQLITE_ENABLE_STAT4) */ return sqlite3ValueNew(db); } @@ -74981,7 +76807,7 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ ** and sets (*ppVal) to NULL. Or, if an error occurs, (*ppVal) is set to ** NULL and an SQLite error code returned. */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 static int valueFromFunction( sqlite3 *db, /* The database connection */ Expr *p, /* The expression to evaluate */ @@ -75064,7 +76890,7 @@ static int valueFromFunction( } #else # define valueFromFunction(a,b,c,d,e,f) SQLITE_OK -#endif /* defined(SQLITE_ENABLE_STAT3_OR_STAT4) */ +#endif /* defined(SQLITE_ENABLE_STAT4) */ /* ** Extract a value from the supplied expression in the manner described @@ -75093,7 +76919,7 @@ static int valueFromExpr( assert( pExpr!=0 ); while( (op = pExpr->op)==TK_UPLUS || op==TK_SPAN ) pExpr = pExpr->pLeft; -#if defined(SQLITE_ENABLE_STAT3_OR_STAT4) +#if defined(SQLITE_ENABLE_STAT4) if( op==TK_REGISTER ) op = pExpr->op2; #else if( NEVER(op==TK_REGISTER) ) op = pExpr->op2; @@ -75142,7 +76968,12 @@ static int valueFromExpr( }else{ sqlite3ValueApplyAffinity(pVal, affinity, SQLITE_UTF8); } - if( pVal->flags & (MEM_Int|MEM_Real) ) pVal->flags &= ~MEM_Str; + assert( (pVal->flags & MEM_IntReal)==0 ); + if( pVal->flags & (MEM_Int|MEM_IntReal|MEM_Real) ){ + testcase( pVal->flags & MEM_Int ); + testcase( pVal->flags & MEM_Real ); + pVal->flags &= ~MEM_Str; + } if( enc!=SQLITE_UTF8 ){ rc = sqlite3VdbeChangeEncoding(pVal, enc); } @@ -75155,7 +76986,11 @@ static int valueFromExpr( if( pVal->flags & MEM_Real ){ pVal->u.r = -pVal->u.r; }else if( pVal->u.i==SMALLEST_INT64 ){ +#ifndef SQLITE_OMIT_FLOATING_POINT pVal->u.r = -(double)SMALLEST_INT64; +#else + pVal->u.r = LARGEST_INT64; +#endif MemSetTypeFlag(pVal, MEM_Real); }else{ pVal->u.i = -pVal->u.i; @@ -75165,7 +77000,7 @@ static int valueFromExpr( }else if( op==TK_NULL ){ pVal = valueNew(db, pCtx); if( pVal==0 ) goto no_mem; - sqlite3VdbeMemNumerify(pVal); + sqlite3VdbeMemSetNull(pVal); } #ifndef SQLITE_OMIT_BLOB_LITERAL else if( op==TK_BLOB ){ @@ -75181,28 +77016,30 @@ static int valueFromExpr( 0, SQLITE_DYNAMIC); } #endif -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 else if( op==TK_FUNCTION && pCtx!=0 ){ rc = valueFromFunction(db, pExpr, enc, affinity, &pVal, pCtx); } #endif else if( op==TK_TRUEFALSE ){ - pVal = valueNew(db, pCtx); - pVal->flags = MEM_Int; - pVal->u.i = pExpr->u.zToken[4]==0; + pVal = valueNew(db, pCtx); + if( pVal ){ + pVal->flags = MEM_Int; + pVal->u.i = pExpr->u.zToken[4]==0; + } } *ppVal = pVal; return rc; no_mem: -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 if( pCtx==0 || pCtx->pParse->nErr==0 ) #endif sqlite3OomFault(db); sqlite3DbFree(db, zVal); assert( *ppVal==0 ); -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 if( pCtx==0 ) sqlite3ValueFree(pVal); #else assert( pCtx==0 ); sqlite3ValueFree(pVal); @@ -75230,56 +77067,7 @@ SQLITE_PRIVATE int sqlite3ValueFromExpr( return pExpr ? valueFromExpr(db, pExpr, enc, affinity, ppVal, 0) : 0; } -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 -/* -** The implementation of the sqlite_record() function. This function accepts -** a single argument of any type. The return value is a formatted database -** record (a blob) containing the argument value. -** -** This is used to convert the value stored in the 'sample' column of the -** sqlite_stat3 table to the record format SQLite uses internally. -*/ -static void recordFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - const int file_format = 1; - u32 iSerial; /* Serial type */ - int nSerial; /* Bytes of space for iSerial as varint */ - u32 nVal; /* Bytes of space required for argv[0] */ - int nRet; - sqlite3 *db; - u8 *aRet; - - UNUSED_PARAMETER( argc ); - iSerial = sqlite3VdbeSerialType(argv[0], file_format, &nVal); - nSerial = sqlite3VarintLen(iSerial); - db = sqlite3_context_db_handle(context); - - nRet = 1 + nSerial + nVal; - aRet = sqlite3DbMallocRawNN(db, nRet); - if( aRet==0 ){ - sqlite3_result_error_nomem(context); - }else{ - aRet[0] = nSerial+1; - putVarint32(&aRet[1], iSerial); - sqlite3VdbeSerialPut(&aRet[1+nSerial], argv[0], iSerial); - sqlite3_result_blob(context, aRet, nRet, SQLITE_TRANSIENT); - sqlite3DbFreeNN(db, aRet); - } -} - -/* -** Register built-in functions used to help read ANALYZE data. -*/ -SQLITE_PRIVATE void sqlite3AnalyzeFunctions(void){ - static FuncDef aAnalyzeTableFuncs[] = { - FUNCTION(sqlite_record, 1, 0, 0, recordFunc), - }; - sqlite3InsertBuiltinFuncs(aAnalyzeTableFuncs, ArraySize(aAnalyzeTableFuncs)); -} - +#ifdef SQLITE_ENABLE_STAT4 /* ** Attempt to extract a value from pExpr and use it to construct *ppVal. ** @@ -75561,6 +77349,10 @@ SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){ /* #include "sqliteInt.h" */ /* #include "vdbeInt.h" */ +/* Forward references */ +static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef); +static void vdbeFreeOpArray(sqlite3 *, Op *, int); + /* ** Create a new virtual database engine. */ @@ -75582,12 +77374,19 @@ SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse *pParse){ pParse->pVdbe = p; assert( pParse->aLabel==0 ); assert( pParse->nLabel==0 ); - assert( pParse->nOpAlloc==0 ); + assert( p->nOpAlloc==0 ); assert( pParse->szOpAlloc==0 ); sqlite3VdbeAddOp2(p, OP_Init, 0, 1); return p; } +/* +** Return the Parse object that owns a Vdbe object. +*/ +SQLITE_PRIVATE Parse *sqlite3VdbeParser(Vdbe *p){ + return p->pParse; +} + /* ** Change the error string stored in Vdbe.zErrMsg */ @@ -75612,6 +77411,43 @@ SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe *p, const char *z, int n, u8 prepFlag p->zSql = sqlite3DbStrNDup(p->db, z, n); } +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** Add a new element to the Vdbe->pDblStr list. +*/ +SQLITE_PRIVATE void sqlite3VdbeAddDblquoteStr(sqlite3 *db, Vdbe *p, const char *z){ + if( p ){ + int n = sqlite3Strlen30(z); + DblquoteStr *pStr = sqlite3DbMallocRawNN(db, + sizeof(*pStr)+n+1-sizeof(pStr->z)); + if( pStr ){ + pStr->pNextStr = p->pDblStr; + p->pDblStr = pStr; + memcpy(pStr->z, z, n+1); + } + } +} +#endif + +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** zId of length nId is a double-quoted identifier. Check to see if +** that identifier is really used as a string literal. +*/ +SQLITE_PRIVATE int sqlite3VdbeUsesDoubleQuotedString( + Vdbe *pVdbe, /* The prepared statement */ + const char *zId /* The double-quoted identifier, already dequoted */ +){ + DblquoteStr *pStr; + assert( zId!=0 ); + if( pVdbe->pDblStr==0 ) return 0; + for(pStr=pVdbe->pDblStr; pStr; pStr=pStr->pNextStr){ + if( strcmp(zId, pStr->z)==0 ) return 1; + } + return 0; +} +#endif + /* ** Swap all content between two VDBE structures. */ @@ -75631,6 +77467,11 @@ SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ zTmp = pA->zSql; pA->zSql = pB->zSql; pB->zSql = zTmp; +#ifdef SQLITE_ENABLE_NORMALIZE + zTmp = pA->zNormSql; + pA->zNormSql = pB->zNormSql; + pB->zNormSql = zTmp; +#endif pB->expmask = pA->expmask; pB->prepFlags = pA->prepFlags; memcpy(pB->aCounter, pA->aCounter, sizeof(pB->aCounter)); @@ -75643,7 +77484,7 @@ SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ ** to 1024/sizeof(Op). ** ** If an out-of-memory error occurs while resizing the array, return -** SQLITE_NOMEM. In this case Vdbe.aOp and Parse.nOpAlloc remain +** SQLITE_NOMEM. In this case Vdbe.aOp and Vdbe.nOpAlloc remain ** unchanged (this is so that any opcodes already allocated can be ** correctly deallocated along with the rest of the Vdbe). */ @@ -75659,9 +77500,11 @@ static int growOpArray(Vdbe *v, int nOp){ ** operation (without SQLITE_TEST_REALLOC_STRESS) is to double the current ** size of the op array or add 1KB of space, whichever is smaller. */ #ifdef SQLITE_TEST_REALLOC_STRESS - int nNew = (p->nOpAlloc>=512 ? p->nOpAlloc*2 : p->nOpAlloc+nOp); + sqlite3_int64 nNew = (v->nOpAlloc>=512 ? 2*(sqlite3_int64)v->nOpAlloc + : (sqlite3_int64)v->nOpAlloc+nOp); #else - int nNew = (p->nOpAlloc ? p->nOpAlloc*2 : (int)(1024/sizeof(Op))); + sqlite3_int64 nNew = (v->nOpAlloc ? 2*(sqlite3_int64)v->nOpAlloc + : (sqlite3_int64)(1024/sizeof(Op))); UNUSED_PARAMETER(nOp); #endif @@ -75672,11 +77515,11 @@ static int growOpArray(Vdbe *v, int nOp){ } assert( nOp<=(1024/sizeof(Op)) ); - assert( nNew>=(p->nOpAlloc+nOp) ); + assert( nNew>=(v->nOpAlloc+nOp) ); pNew = sqlite3DbRealloc(p->db, v->aOp, nNew*sizeof(Op)); if( pNew ){ p->szOpAlloc = sqlite3DbMallocSize(p->db, pNew); - p->nOpAlloc = p->szOpAlloc/sizeof(Op); + v->nOpAlloc = p->szOpAlloc/sizeof(Op); v->aOp = pNew; } return (pNew ? SQLITE_OK : SQLITE_NOMEM_BKPT); @@ -75685,9 +77528,16 @@ static int growOpArray(Vdbe *v, int nOp){ #ifdef SQLITE_DEBUG /* This routine is just a convenient place to set a breakpoint that will ** fire after each opcode is inserted and displayed using -** "PRAGMA vdbe_addoptrace=on". +** "PRAGMA vdbe_addoptrace=on". Parameters "pc" (program counter) and +** pOp are available to make the breakpoint conditional. +** +** Other useful labels for breakpoints include: +** test_trace_breakpoint(pc,pOp) +** sqlite3CorruptError(lineno) +** sqlite3MisuseError(lineno) +** sqlite3CantopenError(lineno) */ -static void test_addop_breakpoint(void){ +static void test_addop_breakpoint(int pc, Op *pOp){ static int n = 0; n++; } @@ -75710,9 +77560,9 @@ static void test_addop_breakpoint(void){ ** operand. */ static SQLITE_NOINLINE int growOp3(Vdbe *p, int op, int p1, int p2, int p3){ - assert( p->pParse->nOpAlloc<=p->nOp ); + assert( p->nOpAlloc<=p->nOp ); if( growOpArray(p, 1) ) return 1; - assert( p->pParse->nOpAlloc>p->nOp ); + assert( p->nOpAlloc>p->nOp ); return sqlite3VdbeAddOp3(p, op, p1, p2, p3); } SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ @@ -75722,7 +77572,7 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ i = p->nOp; assert( p->magic==VDBE_MAGIC_INIT ); assert( op>=0 && op<0xff ); - if( p->pParse->nOpAlloc<=i ){ + if( p->nOpAlloc<=i ){ return growOp3(p, op, p1, p2, p3); } p->nOp++; @@ -75740,7 +77590,7 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ #ifdef SQLITE_DEBUG if( p->db->flags & SQLITE_VdbeAddopTrace ){ sqlite3VdbePrintOp(0, i, &p->aOp[i]); - test_addop_breakpoint(); + test_addop_breakpoint(i, &p->aOp[i]); } #endif #ifdef VDBE_PROFILE @@ -75823,6 +77673,49 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp4( return addr; } +/* +** Add an OP_Function or OP_PureFunc opcode. +** +** The eCallCtx argument is information (typically taken from Expr.op2) +** that describes the calling context of the function. 0 means a general +** function call. NC_IsCheck means called by a check constraint, +** NC_IdxExpr means called as part of an index expression. NC_PartIdx +** means in the WHERE clause of a partial index. NC_GenCol means called +** while computing a generated column value. 0 is the usual case. +*/ +SQLITE_PRIVATE int sqlite3VdbeAddFunctionCall( + Parse *pParse, /* Parsing context */ + int p1, /* Constant argument mask */ + int p2, /* First argument register */ + int p3, /* Register into which results are written */ + int nArg, /* Number of argument */ + const FuncDef *pFunc, /* The function to be invoked */ + int eCallCtx /* Calling context */ +){ + Vdbe *v = pParse->pVdbe; + int nByte; + int addr; + sqlite3_context *pCtx; + assert( v ); + nByte = sizeof(*pCtx) + (nArg-1)*sizeof(sqlite3_value*); + pCtx = sqlite3DbMallocRawNN(pParse->db, nByte); + if( pCtx==0 ){ + assert( pParse->db->mallocFailed ); + freeEphemeralFunction(pParse->db, (FuncDef*)pFunc); + return 0; + } + pCtx->pOut = 0; + pCtx->pFunc = (FuncDef*)pFunc; + pCtx->pVdbe = 0; + pCtx->isError = 0; + pCtx->argc = nArg; + pCtx->iOp = sqlite3VdbeCurrentAddr(v); + addr = sqlite3VdbeAddOp4(v, eCallCtx ? OP_PureFunc : OP_Function, + p1, p2, p3, (char*)pCtx, P4_FUNCCTX); + sqlite3VdbeChangeP5(v, eCallCtx & NC_SelfRef); + return addr; +} + /* ** Add an opcode that includes the p4 value with a P4_INT64 or ** P4_REAL type. @@ -75854,13 +77747,29 @@ SQLITE_PRIVATE int sqlite3VdbeExplainParent(Parse *pParse){ } /* -** Add a new OP_Explain opcode. +** Set a debugger breakpoint on the following routine in order to +** monitor the EXPLAIN QUERY PLAN code generation. +*/ +#if defined(SQLITE_DEBUG) +SQLITE_PRIVATE void sqlite3ExplainBreakpoint(const char *z1, const char *z2){ + (void)z1; + (void)z2; +} +#endif + +/* +** Add a new OP_ opcode. ** ** If the bPush flag is true, then make this opcode the parent for ** subsequent Explains until sqlite3VdbeExplainPop() is called. */ SQLITE_PRIVATE void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){ - if( pParse->explain==2 ){ +#ifndef SQLITE_DEBUG + /* Always include the OP_Explain opcodes if SQLITE_DEBUG is defined. + ** But omit them (for performance) during production builds */ + if( pParse->explain==2 ) +#endif + { char *zMsg; Vdbe *v; va_list ap; @@ -75872,7 +77781,10 @@ SQLITE_PRIVATE void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt iThis = v->nOp; sqlite3VdbeAddOp4(v, OP_Explain, iThis, pParse->addrExplain, 0, zMsg, P4_DYNAMIC); - if( bPush) pParse->addrExplain = iThis; + sqlite3ExplainBreakpoint(bPush?"PUSH":"", sqlite3VdbeGetOp(v,-1)->p4.z); + if( bPush){ + pParse->addrExplain = iThis; + } } } @@ -75880,6 +77792,7 @@ SQLITE_PRIVATE void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt ** Pop the EXPLAIN QUERY PLAN stack one level. */ SQLITE_PRIVATE void sqlite3VdbeExplainPop(Parse *pParse){ + sqlite3ExplainBreakpoint("POP", 0); pParse->addrExplain = sqlite3VdbeExplainParent(pParse); } #endif /* SQLITE_OMIT_EXPLAIN */ @@ -75944,21 +77857,22 @@ SQLITE_PRIVATE void sqlite3VdbeEndCoroutine(Vdbe *v, int regYield){ ** The VDBE knows that a P2 value is a label because labels are ** always negative and P2 values are suppose to be non-negative. ** Hence, a negative P2 value is a label that has yet to be resolved. +** (Later:) This is only true for opcodes that have the OPFLG_JUMP +** property. ** -** Zero is returned if a malloc() fails. +** Variable usage notes: +** +** Parse.aLabel[x] Stores the address that the x-th label resolves +** into. For testing (SQLITE_DEBUG), unresolved +** labels stores -1, but that is not required. +** Parse.nLabelAlloc Number of slots allocated to Parse.aLabel[] +** Parse.nLabel The *negative* of the number of labels that have +** been issued. The negative is stored because +** that gives a performance improvement over storing +** the equivalent positive value. */ -SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe *v){ - Parse *p = v->pParse; - int i = p->nLabel++; - assert( v->magic==VDBE_MAGIC_INIT ); - if( (i & (i-1))==0 ){ - p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel, - (i*2+1)*sizeof(p->aLabel[0])); - } - if( p->aLabel ){ - p->aLabel[i] = -1; - } - return ADDR(i); +SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Parse *pParse){ + return --pParse->nLabel; } /* @@ -75966,18 +77880,35 @@ SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe *v){ ** be inserted. The parameter "x" must have been obtained from ** a prior call to sqlite3VdbeMakeLabel(). */ +static SQLITE_NOINLINE void resizeResolveLabel(Parse *p, Vdbe *v, int j){ + int nNewSize = 10 - p->nLabel; + p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel, + nNewSize*sizeof(p->aLabel[0])); + if( p->aLabel==0 ){ + p->nLabelAlloc = 0; + }else{ +#ifdef SQLITE_DEBUG + int i; + for(i=p->nLabelAlloc; iaLabel[i] = -1; +#endif + p->nLabelAlloc = nNewSize; + p->aLabel[j] = v->nOp; + } +} SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *v, int x){ Parse *p = v->pParse; int j = ADDR(x); assert( v->magic==VDBE_MAGIC_INIT ); - assert( jnLabel ); + assert( j<-p->nLabel ); assert( j>=0 ); - if( p->aLabel ){ #ifdef SQLITE_DEBUG - if( p->db->flags & SQLITE_VdbeAddopTrace ){ - printf("RESOLVE LABEL %d to %d\n", x, v->nOp); - } + if( p->db->flags & SQLITE_VdbeAddopTrace ){ + printf("RESOLVE LABEL %d to %d\n", x, v->nOp); + } #endif + if( p->nLabelAlloc + p->nLabel < 0 ){ + resizeResolveLabel(p,v,j); + }else{ assert( p->aLabel[j]==(-1) ); /* Labels may only be resolved once */ p->aLabel[j] = v->nOp; } @@ -76077,6 +78008,7 @@ static Op *opIterNext(VdbeOpIter *p){ ** * OP_HaltIfNull with P1=SQLITE_CONSTRAINT and P2=OE_Abort. ** * OP_Destroy ** * OP_VUpdate +** * OP_VCreate ** * OP_VRename ** * OP_FkCounter with P2==0 (immediate foreign key constraint) ** * OP_CreateBtree/BTREE_INTKEY and OP_InitCoroutine @@ -76093,6 +78025,7 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ int hasAbort = 0; int hasFkCounter = 0; int hasCreateTable = 0; + int hasCreateIndex = 0; int hasInitCoroutine = 0; Op *pOp; VdbeOpIter sIter; @@ -76102,13 +78035,24 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ while( (pOp = opIterNext(&sIter))!=0 ){ int opcode = pOp->opcode; if( opcode==OP_Destroy || opcode==OP_VUpdate || opcode==OP_VRename + || opcode==OP_VDestroy + || opcode==OP_VCreate + || (opcode==OP_ParseSchema && pOp->p4.z==0) || ((opcode==OP_Halt || opcode==OP_HaltIfNull) - && ((pOp->p1&0xff)==SQLITE_CONSTRAINT && pOp->p2==OE_Abort)) + && ((pOp->p1)!=SQLITE_OK && pOp->p2==OE_Abort)) ){ hasAbort = 1; break; } if( opcode==OP_CreateBtree && pOp->p3==BTREE_INTKEY ) hasCreateTable = 1; + if( mayAbort ){ + /* hasCreateIndex may also be set for some DELETE statements that use + ** OP_Clear. So this routine may end up returning true in the case + ** where a "DELETE FROM tbl" has a statement-journal but does not + ** require one. This is not so bad - it is an inefficiency, not a bug. */ + if( opcode==OP_CreateBtree && pOp->p3==BTREE_BLOBKEY ) hasCreateIndex = 1; + if( opcode==OP_Clear ) hasCreateIndex = 1; + } if( opcode==OP_InitCoroutine ) hasInitCoroutine = 1; #ifndef SQLITE_OMIT_FOREIGN_KEY if( opcode==OP_FkCounter && pOp->p1==0 && pOp->p2==1 ){ @@ -76124,7 +78068,8 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ ** true for this case to prevent the assert() in the callers frame ** from failing. */ return ( v->db->mallocFailed || hasAbort==mayAbort || hasFkCounter - || (hasCreateTable && hasInitCoroutine) ); + || (hasCreateTable && hasInitCoroutine) || hasCreateIndex + ); } #endif /* SQLITE_DEBUG - the sqlite3AssertMayAbort() function */ @@ -76252,7 +78197,7 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ ** non-jump opcodes less than SQLITE_MX_JUMP_CODE are guaranteed to ** have non-negative values for P2. */ assert( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP)!=0 ); - assert( ADDR(pOp->p2)nLabel ); + assert( ADDR(pOp->p2)<-pParse->nLabel ); pOp->p2 = aLabel[ADDR(pOp->p2)]; } break; @@ -76291,7 +78236,7 @@ SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe *p){ */ #if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) SQLITE_PRIVATE void sqlite3VdbeVerifyNoMallocRequired(Vdbe *p, int N){ - assert( p->nOp + N <= p->pParse->nOpAlloc ); + assert( p->nOp + N <= p->nOpAlloc ); } #endif @@ -76363,7 +78308,7 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList( VdbeOp *pOut, *pFirst; assert( nOp>0 ); assert( p->magic==VDBE_MAGIC_INIT ); - if( p->nOp + nOp > p->pParse->nOpAlloc && growOpArray(p, nOp) ){ + if( p->nOp + nOp > p->nOpAlloc && growOpArray(p, nOp) ){ return 0; } pFirst = pOut = &p->aOp[p->nOp]; @@ -76409,7 +78354,7 @@ SQLITE_PRIVATE void sqlite3VdbeScanStatus( LogEst nEst, /* Estimated number of output rows */ const char *zName /* Name of table or index being scanned */ ){ - int nByte = (p->nScan+1) * sizeof(ScanStatus); + sqlite3_int64 nByte = (p->nScan+1) * sizeof(ScanStatus); ScanStatus *aNew; aNew = (ScanStatus*)sqlite3DbRealloc(p->db, p->aScan, nByte); if( aNew ){ @@ -76429,16 +78374,16 @@ SQLITE_PRIVATE void sqlite3VdbeScanStatus( ** Change the value of the opcode, or P1, P2, P3, or P5 operands ** for a specific instruction. */ -SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe *p, u32 addr, u8 iNewOpcode){ +SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe *p, int addr, u8 iNewOpcode){ sqlite3VdbeGetOp(p,addr)->opcode = iNewOpcode; } -SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe *p, u32 addr, int val){ +SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe *p, int addr, int val){ sqlite3VdbeGetOp(p,addr)->p1 = val; } -SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe *p, u32 addr, int val){ +SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe *p, int addr, int val){ sqlite3VdbeGetOp(p,addr)->p2 = val; } -SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe *p, u32 addr, int val){ +SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe *p, int addr, int val){ sqlite3VdbeGetOp(p,addr)->p3 = val; } SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe *p, u16 p5){ @@ -76465,8 +78410,6 @@ static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){ } } -static void vdbeFreeOpArray(sqlite3 *, Op *, int); - /* ** Delete a P4 value if necessary. */ @@ -76476,7 +78419,7 @@ static SQLITE_NOINLINE void freeP4Mem(sqlite3 *db, Mem *p){ } static SQLITE_NOINLINE void freeP4FuncCtx(sqlite3 *db, sqlite3_context *p){ freeEphemeralFunction(db, p->pFunc); - sqlite3DbFreeNN(db, p); + sqlite3DbFreeNN(db, p); } static void freeP4(sqlite3 *db, int p4type, void *p4){ assert( db ); @@ -76550,6 +78493,13 @@ SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *pVdbe, SubProgram *p){ pVdbe->pProgram = p; } +/* +** Return true if the given Vdbe has any SubPrograms. +*/ +SQLITE_PRIVATE int sqlite3VdbeHasSubProgram(Vdbe *pVdbe){ + return pVdbe->pProgram!=0; +} + /* ** Change the opcode at addr into OP_Noop */ @@ -76577,6 +78527,41 @@ SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe *p, u8 op){ } } +#ifdef SQLITE_DEBUG +/* +** Generate an OP_ReleaseReg opcode to indicate that a range of +** registers, except any identified by mask, are no longer in use. +*/ +SQLITE_PRIVATE void sqlite3VdbeReleaseRegisters( + Parse *pParse, /* Parsing context */ + int iFirst, /* Index of first register to be released */ + int N, /* Number of registers to release */ + u32 mask, /* Mask of registers to NOT release */ + int bUndefine /* If true, mark registers as undefined */ +){ + if( N==0 ) return; + assert( pParse->pVdbe ); + assert( iFirst>=1 ); + assert( iFirst+N-1<=pParse->nMem ); + if( N<=31 && mask!=0 ){ + while( N>0 && (mask&1)!=0 ){ + mask >>= 1; + iFirst++; + N--; + } + while( N>0 && N<=32 && (mask & MASKBIT32(N-1))!=0 ){ + mask &= ~MASKBIT32(N-1); + N--; + } + } + if( N>0 ){ + sqlite3VdbeAddOp3(pParse->pVdbe, OP_ReleaseReg, iFirst, N, *(int*)&mask); + if( bUndefine ) sqlite3VdbeChangeP5(pParse->pVdbe, 1); + } +} +#endif /* SQLITE_DEBUG */ + + /* ** Change the value of the P4 operand for a specific instruction. ** This routine is useful when a large program is loaded from a @@ -76694,7 +78679,8 @@ SQLITE_PRIVATE void sqlite3VdbeSetP4KeyInfo(Parse *pParse, Index *pIdx){ */ static void vdbeVComment(Vdbe *p, const char *zFormat, va_list ap){ assert( p->nOp>0 || p->aOp==0 ); - assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->db->mallocFailed ); + assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->db->mallocFailed + || p->pParse->nErr>0 ); if( p->nOp ){ assert( p->aOp ); sqlite3DbFree(p->db, p->aOp[p->nOp-1].zComment); @@ -76945,14 +78931,16 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){ case P4_KEYINFO: { int j; KeyInfo *pKeyInfo = pOp->p4.pKeyInfo; - assert( pKeyInfo->aSortOrder!=0 ); + assert( pKeyInfo->aSortFlags!=0 ); sqlite3_str_appendf(&x, "k(%d", pKeyInfo->nKeyField); for(j=0; jnKeyField; j++){ CollSeq *pColl = pKeyInfo->aColl[j]; const char *zColl = pColl ? pColl->zName : ""; if( strcmp(zColl, "BINARY")==0 ) zColl = "B"; - sqlite3_str_appendf(&x, ",%s%s", - pKeyInfo->aSortOrder[j] ? "-" : "", zColl); + sqlite3_str_appendf(&x, ",%s%s%s", + (pKeyInfo->aSortFlags[j] & KEYINFO_ORDER_DESC) ? "-" : "", + (pKeyInfo->aSortFlags[j] & KEYINFO_ORDER_BIGNULL)? "N." : "", + zColl); } sqlite3_str_append(&x, ")", 1); break; @@ -76973,13 +78961,11 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){ sqlite3_str_appendf(&x, "%s(%d)", pDef->zName, pDef->nArg); break; } -#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) case P4_FUNCCTX: { FuncDef *pDef = pOp->p4.pCtx->pFunc; sqlite3_str_appendf(&x, "%s(%d)", pDef->zName, pDef->nArg); break; } -#endif case P4_INT64: { sqlite3_str_appendf(&x, "%lld", *pOp->p4.pI64); break; @@ -76996,7 +78982,7 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){ Mem *pMem = pOp->p4.pMem; if( pMem->flags & MEM_Str ){ zP4 = pMem->z; - }else if( pMem->flags & MEM_Int ){ + }else if( pMem->flags & (MEM_Int|MEM_IntReal) ){ sqlite3_str_appendf(&x, "%lld", pMem->u.i); }else if( pMem->flags & MEM_Real ){ sqlite3_str_appendf(&x, "%.16g", pMem->u.r); @@ -77359,8 +79345,11 @@ SQLITE_PRIVATE int sqlite3VdbeList( ** pick up the appropriate opcode. */ int j; i -= p->nOp; + assert( apSub!=0 ); + assert( nSub>0 ); for(j=0; i>=apSub[j]->nOp; j++){ i -= apSub[j]->nOp; + assert( inOp || j+1aOp[i]; } @@ -77530,9 +79519,9 @@ SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe *p){ ** of a ReusableSpace object by the allocSpace() routine below. */ struct ReusableSpace { - u8 *pSpace; /* Available memory */ - int nFree; /* Bytes of available memory */ - int nNeeded; /* Total bytes that could not be allocated */ + u8 *pSpace; /* Available memory */ + sqlite3_int64 nFree; /* Bytes of available memory */ + sqlite3_int64 nNeeded; /* Total bytes that could not be allocated */ }; /* Try to allocate nByte bytes of 8-byte aligned bulk memory for pBuf @@ -77552,7 +79541,7 @@ struct ReusableSpace { static void *allocSpace( struct ReusableSpace *p, /* Bulk memory available for allocation */ void *pBuf, /* Pointer to a prior allocation */ - int nByte /* Bytes of memory needed */ + sqlite3_int64 nByte /* Bytes of memory needed */ ){ assert( EIGHT_BYTE_ALIGNMENT(p->pSpace) ); if( pBuf==0 ){ @@ -77670,8 +79659,26 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( resolveP2Values(p, &nArg); p->usesStmtJournal = (u8)(pParse->isMultiWrite && pParse->mayAbort); - if( pParse->explain && nMem<10 ){ - nMem = 10; + if( pParse->explain ){ + static const char * const azColName[] = { + "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment", + "id", "parent", "notused", "detail" + }; + int iFirst, mx, i; + if( nMem<10 ) nMem = 10; + if( pParse->explain==2 ){ + sqlite3VdbeSetNumCols(p, 4); + iFirst = 8; + mx = 12; + }else{ + sqlite3VdbeSetNumCols(p, 8); + iFirst = 0; + mx = 8; + } + for(i=iFirst; iexpired = 0; @@ -77685,19 +79692,27 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( ** the leftover memory at the end of the opcode array. This can significantly ** reduce the amount of memory held by a prepared statement. */ - do { - x.nNeeded = 0; - p->aMem = allocSpace(&x, p->aMem, nMem*sizeof(Mem)); - p->aVar = allocSpace(&x, p->aVar, nVar*sizeof(Mem)); - p->apArg = allocSpace(&x, p->apArg, nArg*sizeof(Mem*)); - p->apCsr = allocSpace(&x, p->apCsr, nCursor*sizeof(VdbeCursor*)); + x.nNeeded = 0; + p->aMem = allocSpace(&x, 0, nMem*sizeof(Mem)); + p->aVar = allocSpace(&x, 0, nVar*sizeof(Mem)); + p->apArg = allocSpace(&x, 0, nArg*sizeof(Mem*)); + p->apCsr = allocSpace(&x, 0, nCursor*sizeof(VdbeCursor*)); #ifdef SQLITE_ENABLE_STMT_SCANSTATUS - p->anExec = allocSpace(&x, p->anExec, p->nOp*sizeof(i64)); + p->anExec = allocSpace(&x, 0, p->nOp*sizeof(i64)); #endif - if( x.nNeeded==0 ) break; + if( x.nNeeded ){ x.pSpace = p->pFree = sqlite3DbMallocRawNN(db, x.nNeeded); x.nFree = x.nNeeded; - }while( !db->mallocFailed ); + if( !db->mallocFailed ){ + p->aMem = allocSpace(&x, p->aMem, nMem*sizeof(Mem)); + p->aVar = allocSpace(&x, p->aVar, nVar*sizeof(Mem)); + p->apArg = allocSpace(&x, p->apArg, nArg*sizeof(Mem*)); + p->apCsr = allocSpace(&x, p->apCsr, nCursor*sizeof(VdbeCursor*)); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + p->anExec = allocSpace(&x, p->anExec, p->nOp*sizeof(i64)); +#endif + } + } p->pVList = pParse->pVList; pParse->pVList = 0; @@ -78013,7 +80028,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ /* Select a master journal file name */ nMainFile = sqlite3Strlen30(zMainFile); - zMaster = sqlite3MPrintf(db, "%s-mjXXXXXX9XXz", zMainFile); + zMaster = sqlite3MPrintf(db, "%s-mjXXXXXX9XXz%c%c", zMainFile, 0, 0); if( zMaster==0 ) return SQLITE_NOMEM_BKPT; do { u32 iRandom; @@ -78350,7 +80365,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ } /* Check for immediate foreign key violations. */ - if( p->rc==SQLITE_OK ){ + if( p->rc==SQLITE_OK || (p->errorAction==OE_Fail && !isSpecialError) ){ sqlite3VdbeCheckFk(p, 0); } @@ -78389,7 +80404,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ }else{ db->nDeferredCons = 0; db->nDeferredImmCons = 0; - db->flags &= ~SQLITE_DeferFKs; + db->flags &= ~(u64)SQLITE_DeferFKs; sqlite3CommitInternalChanges(db); } }else{ @@ -78702,6 +80717,16 @@ SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ vdbeFreeOpArray(db, p->aOp, p->nOp); sqlite3DbFree(db, p->aColName); sqlite3DbFree(db, p->zSql); +#ifdef SQLITE_ENABLE_NORMALIZE + sqlite3DbFree(db, p->zNormSql); + { + DblquoteStr *pThis, *pNext; + for(pThis=p->pDblStr; pThis; pThis=pNext){ + pNext = pThis->pNextStr; + sqlite3DbFree(db, pThis); + } + } +#endif #ifdef SQLITE_ENABLE_STMT_SCANSTATUS { int i; @@ -78742,7 +80767,7 @@ SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe *p){ ** carried out. Seek the cursor now. If an error occurs, return ** the appropriate error code. */ -static int SQLITE_NOINLINE handleDeferredMoveto(VdbeCursor *p){ +SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor *p){ int res, rc; #ifdef SQLITE_TEST extern int sqlite3_search_count; @@ -78814,7 +80839,7 @@ SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor **pp, int *piCol){ *piCol = iMap - 1; return SQLITE_OK; } - return handleDeferredMoveto(p); + return sqlite3VdbeFinishMoveto(p); } if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){ return handleMovedCursor(p); @@ -78864,8 +80889,17 @@ SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor **pp, int *piCol){ ** of SQLite will not understand those serial types. */ +#if 0 /* Inlined into the OP_MakeRecord opcode */ /* ** Return the serial-type for the value stored in pMem. +** +** This routine might convert a large MEM_IntReal value into MEM_Real. +** +** 2019-07-11: The primary user of this subroutine was the OP_MakeRecord +** opcode in the byte-code engine. But by moving this routine in-line, we +** can omit some redundant tests and make that opcode a lot faster. So +** this routine is now only used by the STAT3 logic and STAT3 support has +** ended. The code is kept here for historical reference only. */ SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ int flags = pMem->flags; @@ -78876,11 +80910,13 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ *pLen = 0; return 0; } - if( flags&MEM_Int ){ + if( flags&(MEM_Int|MEM_IntReal) ){ /* Figure out whether to use 1, 2, 4, 6 or 8 bytes. */ # define MAX_6BYTE ((((i64)0x00008000)<<32)-1) i64 i = pMem->u.i; u64 u; + testcase( flags & MEM_Int ); + testcase( flags & MEM_IntReal ); if( i<0 ){ u = ~i; }else{ @@ -78900,6 +80936,15 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ if( u<=2147483647 ){ *pLen = 4; return 4; } if( u<=MAX_6BYTE ){ *pLen = 6; return 5; } *pLen = 8; + if( flags&MEM_IntReal ){ + /* If the value is IntReal and is going to take up 8 bytes to store + ** as an integer, then we might as well make it an 8-byte floating + ** point value */ + pMem->u.r = (double)pMem->u.i; + pMem->flags &= ~MEM_IntReal; + pMem->flags |= MEM_Real; + return 7; + } return 6; } if( flags&MEM_Real ){ @@ -78915,6 +80960,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ *pLen = n; return ((n*2) + 12 + ((flags&MEM_Str)!=0)); } +#endif /* inlined into OP_MakeRecord */ /* ** The sizes for serial types less than 128 @@ -79073,7 +81119,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type){ ** routine so that in most cases the overhead of moving the stack pointer ** is avoided. */ -static u32 SQLITE_NOINLINE serialGet( +static u32 serialGet( const unsigned char *buf, /* Buffer to deserialize from */ u32 serial_type, /* Serial type to deserialize */ Mem *pMem /* Memory cell to write value into */ @@ -79105,7 +81151,7 @@ static u32 SQLITE_NOINLINE serialGet( assert( sizeof(x)==8 && sizeof(pMem->u.r)==8 ); swapMixedEndianFloat(x); memcpy(&pMem->u.r, &x, sizeof(x)); - pMem->flags = sqlite3IsNaN(pMem->u.r) ? MEM_Null : MEM_Real; + pMem->flags = IsNaN(x) ? MEM_Null : MEM_Real; } return 8; } @@ -79223,7 +81269,7 @@ SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord( p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte); if( !p ) return 0; p->aMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))]; - assert( pKeyInfo->aSortOrder!=0 ); + assert( pKeyInfo->aSortFlags!=0 ); p->pKeyInfo = pKeyInfo; p->nField = pKeyInfo->nKeyField + 1; return p; @@ -79241,7 +81287,7 @@ SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( UnpackedRecord *p /* Populate this structure before returning. */ ){ const unsigned char *aKey = (const unsigned char *)pKey; - int d; + u32 d; u32 idx; /* Offset in aKey[] to read from */ u16 u; /* Unsigned loop counter */ u32 szHdr; @@ -79252,7 +81298,7 @@ SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( idx = getVarint32(aKey, szHdr); d = szHdr; u = 0; - while( idx=p->nField ) break; } + if( d>(u32)nKey && u ){ + assert( CORRUPT_DB ); + /* In a corrupt record entry, the last pMem might have been set up using + ** uninitialized memory. Overwrite its value with NULL, to prevent + ** warnings from MSAN. */ + sqlite3VdbeMemSetNull(pMem-1); + } assert( u<=pKeyInfo->nKeyField + 1 ); p->nField = u; } @@ -79315,7 +81368,7 @@ static int vdbeRecordCompareDebug( if( szHdr1>98307 ) return SQLITE_CORRUPT; d1 = szHdr1; assert( pKeyInfo->nAllField>=pPKey2->nField || CORRUPT_DB ); - assert( pKeyInfo->aSortOrder!=0 ); + assert( pKeyInfo->aSortFlags!=0 ); assert( pKeyInfo->nKeyField>0 ); assert( idx1<=szHdr1 || CORRUPT_DB ); do{ @@ -79330,8 +81383,8 @@ static int vdbeRecordCompareDebug( ** Use that approximation to avoid the more expensive call to ** sqlite3VdbeSerialTypeLen() in the common case. */ - if( d1+serial_type1+2>(u32)nKey1 - && d1+sqlite3VdbeSerialTypeLen(serial_type1)>(u32)nKey1 + if( d1+(u64)serial_type1+2>(u64)nKey1 + && d1+(u64)sqlite3VdbeSerialTypeLen(serial_type1)>(u64)nKey1 ){ break; } @@ -79342,10 +81395,16 @@ static int vdbeRecordCompareDebug( /* Do the comparison */ - rc = sqlite3MemCompare(&mem1, &pPKey2->aMem[i], pKeyInfo->aColl[i]); + rc = sqlite3MemCompare(&mem1, &pPKey2->aMem[i], + pKeyInfo->nAllField>i ? pKeyInfo->aColl[i] : 0); if( rc!=0 ){ assert( mem1.szMalloc==0 ); /* See comment below */ - if( pKeyInfo->aSortOrder[i] ){ + if( (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) + && ((mem1.flags & MEM_Null) || (pPKey2->aMem[i].flags & MEM_Null)) + ){ + rc = -rc; + } + if( pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_DESC ){ rc = -rc; /* Invert the result for DESC sort order. */ } goto debugCompareEnd; @@ -79547,8 +81606,13 @@ SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const C /* At least one of the two values is a number */ - if( combined_flags&(MEM_Int|MEM_Real) ){ - if( (f1 & f2 & MEM_Int)!=0 ){ + if( combined_flags&(MEM_Int|MEM_Real|MEM_IntReal) ){ + testcase( combined_flags & MEM_Int ); + testcase( combined_flags & MEM_Real ); + testcase( combined_flags & MEM_IntReal ); + if( (f1 & f2 & (MEM_Int|MEM_IntReal))!=0 ){ + testcase( f1 & f2 & MEM_Int ); + testcase( f1 & f2 & MEM_IntReal ); if( pMem1->u.i < pMem2->u.i ) return -1; if( pMem1->u.i > pMem2->u.i ) return +1; return 0; @@ -79558,15 +81622,23 @@ SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const C if( pMem1->u.r > pMem2->u.r ) return +1; return 0; } - if( (f1&MEM_Int)!=0 ){ + if( (f1&(MEM_Int|MEM_IntReal))!=0 ){ + testcase( f1 & MEM_Int ); + testcase( f1 & MEM_IntReal ); if( (f2&MEM_Real)!=0 ){ return sqlite3IntFloatCompare(pMem1->u.i, pMem2->u.r); + }else if( (f2&(MEM_Int|MEM_IntReal))!=0 ){ + if( pMem1->u.i < pMem2->u.i ) return -1; + if( pMem1->u.i > pMem2->u.i ) return +1; + return 0; }else{ return -1; } } if( (f1&MEM_Real)!=0 ){ - if( (f2&MEM_Int)!=0 ){ + if( (f2&(MEM_Int|MEM_IntReal))!=0 ){ + testcase( f2 & MEM_Int ); + testcase( f2 & MEM_IntReal ); return -sqlite3IntFloatCompare(pMem2->u.i, pMem1->u.r); }else{ return -1; @@ -79698,24 +81770,26 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( }else{ idx1 = getVarint32(aKey1, szHdr1); d1 = szHdr1; - if( d1>(unsigned)nKey1 ){ - pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; - return 0; /* Corruption */ - } i = 0; } + if( d1>(unsigned)nKey1 ){ + pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; + return 0; /* Corruption */ + } VVA_ONLY( mem1.szMalloc = 0; ) /* Only needed by assert() statements */ assert( pPKey2->pKeyInfo->nAllField>=pPKey2->nField || CORRUPT_DB ); - assert( pPKey2->pKeyInfo->aSortOrder!=0 ); + assert( pPKey2->pKeyInfo->aSortFlags!=0 ); assert( pPKey2->pKeyInfo->nKeyField>0 ); assert( idx1<=szHdr1 || CORRUPT_DB ); do{ u32 serial_type; /* RHS is an integer */ - if( pRhs->flags & MEM_Int ){ + if( pRhs->flags & (MEM_Int|MEM_IntReal) ){ + testcase( pRhs->flags & MEM_Int ); + testcase( pRhs->flags & MEM_IntReal ); serial_type = aKey1[idx1]; testcase( serial_type==12 ); if( serial_type>=10 ){ @@ -79773,10 +81847,12 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( mem1.n = (serial_type - 12) / 2; testcase( (d1+mem1.n)==(unsigned)nKey1 ); testcase( (d1+mem1.n+1)==(unsigned)nKey1 ); - if( (d1+mem1.n) > (unsigned)nKey1 ){ + if( (d1+mem1.n) > (unsigned)nKey1 + || (pKeyInfo = pPKey2->pKeyInfo)->nAllField<=i + ){ pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; return 0; /* Corruption */ - }else if( (pKeyInfo = pPKey2->pKeyInfo)->aColl[i] ){ + }else if( pKeyInfo->aColl[i] ){ mem1.enc = pKeyInfo->enc; mem1.db = pKeyInfo->db; mem1.flags = MEM_Str; @@ -79827,8 +81903,14 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( } if( rc!=0 ){ - if( pPKey2->pKeyInfo->aSortOrder[i] ){ - rc = -rc; + int sortFlags = pPKey2->pKeyInfo->aSortFlags[i]; + if( sortFlags ){ + if( (sortFlags & KEYINFO_ORDER_BIGNULL)==0 + || ((sortFlags & KEYINFO_ORDER_DESC) + !=(serial_type==0 || (pRhs->flags&MEM_Null))) + ){ + rc = -rc; + } } assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, rc) ); assert( mem1.szMalloc==0 ); /* See comment below */ @@ -79996,7 +82078,11 @@ static int vdbeRecordCompareString( nCmp = MIN( pPKey2->aMem[0].n, nStr ); res = memcmp(&aKey1[szHdr], pPKey2->aMem[0].z, nCmp); - if( res==0 ){ + if( res>0 ){ + res = pPKey2->r2; + }else if( res<0 ){ + res = pPKey2->r1; + }else{ res = nStr - pPKey2->aMem[0].n; if( res==0 ){ if( pPKey2->nField>1 ){ @@ -80010,10 +82096,6 @@ static int vdbeRecordCompareString( }else{ res = pPKey2->r1; } - }else if( res>0 ){ - res = pPKey2->r2; - }else{ - res = pPKey2->r1; } } @@ -80045,7 +82127,10 @@ SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){ ** header size is (12*5 + 1 + 1) bytes. */ if( p->pKeyInfo->nAllField<=13 ){ int flags = p->aMem[0].flags; - if( p->pKeyInfo->aSortOrder[0] ){ + if( p->pKeyInfo->aSortFlags[0] ){ + if( p->pKeyInfo->aSortFlags[0] & KEYINFO_ORDER_BIGNULL ){ + return sqlite3VdbeRecordCompare; + } p->r1 = 1; p->r2 = -1; }else{ @@ -80058,7 +82143,9 @@ SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){ testcase( flags & MEM_Real ); testcase( flags & MEM_Null ); testcase( flags & MEM_Blob ); - if( (flags & (MEM_Real|MEM_Null|MEM_Blob))==0 && p->pKeyInfo->aColl[0]==0 ){ + if( (flags & (MEM_Real|MEM_IntReal|MEM_Null|MEM_Blob))==0 + && p->pKeyInfo->aColl[0]==0 + ){ assert( flags & MEM_Str ); return vdbeRecordCompareString; } @@ -80103,7 +82190,9 @@ SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3 *db, BtCursor *pCur, i64 *rowid){ (void)getVarint32((u8*)m.z, szHdr); testcase( szHdr==3 ); testcase( szHdr==m.n ); - if( unlikely(szHdr<3 || (int)szHdr>m.n) ){ + testcase( szHdr>0x7fffffff ); + assert( m.n>=0 ); + if( unlikely(szHdr<3 || szHdr>(unsigned)m.n) ){ goto idx_rowid_corruption; } @@ -80290,13 +82379,25 @@ SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){ ** features such as 'now'. */ SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context *pCtx){ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + const VdbeOp *pOp; +#ifdef SQLITE_ENABLE_STAT4 if( pCtx->pVdbe==0 ) return 1; #endif - if( pCtx->pVdbe->aOp[pCtx->iOp].opcode==OP_PureFunc ){ - sqlite3_result_error(pCtx, - "non-deterministic function in index expression or CHECK constraint", - -1); + pOp = pCtx->pVdbe->aOp + pCtx->iOp; + if( pOp->opcode==OP_PureFunc ){ + const char *zContext; + char *zMsg; + if( pOp->p5 & NC_IsCheck ){ + zContext = "a CHECK constraint"; + }else if( pOp->p5 & NC_GenCol ){ + zContext = "a generated column"; + }else{ + zContext = "an index"; + } + zMsg = sqlite3_mprintf("non-deterministic use of %s() in %s", + pCtx->pFunc->zName, zContext); + sqlite3_result_error(pCtx, zMsg, -1); + sqlite3_free(zMsg); return 0; } return 1; @@ -80387,7 +82488,7 @@ SQLITE_PRIVATE void sqlite3VdbePreUpdateHook( preupdate.keyinfo.db = db; preupdate.keyinfo.enc = ENC(db); preupdate.keyinfo.nKeyField = pTab->nCol; - preupdate.keyinfo.aSortOrder = (u8*)&fakeSortOrder; + preupdate.keyinfo.aSortFlags = (u8*)&fakeSortOrder; preupdate.iKey1 = iKey1; preupdate.iKey2 = iKey2; preupdate.pTab = pTab; @@ -80474,14 +82575,16 @@ static SQLITE_NOINLINE void invokeProfileCallback(sqlite3 *db, Vdbe *p){ sqlite3_int64 iNow; sqlite3_int64 iElapse; assert( p->startTime>0 ); - assert( db->xProfile!=0 || (db->mTrace & SQLITE_TRACE_PROFILE)!=0 ); + assert( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 ); assert( db->init.busy==0 ); assert( p->zSql!=0 ); sqlite3OsCurrentTimeInt64(db->pVfs, &iNow); iElapse = (iNow - p->startTime)*1000000; +#ifndef SQLITE_OMIT_DEPRECATED if( db->xProfile ){ db->xProfile(db->pProfileArg, p->zSql, iElapse); } +#endif if( db->mTrace & SQLITE_TRACE_PROFILE ){ db->xTrace(SQLITE_TRACE_PROFILE, db->pTraceArg, p, (void*)&iElapse); } @@ -80644,39 +82747,86 @@ SQLITE_API const void *sqlite3_value_text16le(sqlite3_value *pVal){ */ SQLITE_API int sqlite3_value_type(sqlite3_value* pVal){ static const u8 aType[] = { - SQLITE_BLOB, /* 0x00 */ - SQLITE_NULL, /* 0x01 */ - SQLITE_TEXT, /* 0x02 */ - SQLITE_NULL, /* 0x03 */ - SQLITE_INTEGER, /* 0x04 */ - SQLITE_NULL, /* 0x05 */ - SQLITE_INTEGER, /* 0x06 */ - SQLITE_NULL, /* 0x07 */ - SQLITE_FLOAT, /* 0x08 */ - SQLITE_NULL, /* 0x09 */ - SQLITE_FLOAT, /* 0x0a */ - SQLITE_NULL, /* 0x0b */ - SQLITE_INTEGER, /* 0x0c */ - SQLITE_NULL, /* 0x0d */ - SQLITE_INTEGER, /* 0x0e */ - SQLITE_NULL, /* 0x0f */ - SQLITE_BLOB, /* 0x10 */ - SQLITE_NULL, /* 0x11 */ - SQLITE_TEXT, /* 0x12 */ - SQLITE_NULL, /* 0x13 */ - SQLITE_INTEGER, /* 0x14 */ - SQLITE_NULL, /* 0x15 */ - SQLITE_INTEGER, /* 0x16 */ - SQLITE_NULL, /* 0x17 */ - SQLITE_FLOAT, /* 0x18 */ - SQLITE_NULL, /* 0x19 */ - SQLITE_FLOAT, /* 0x1a */ - SQLITE_NULL, /* 0x1b */ - SQLITE_INTEGER, /* 0x1c */ - SQLITE_NULL, /* 0x1d */ - SQLITE_INTEGER, /* 0x1e */ - SQLITE_NULL, /* 0x1f */ + SQLITE_BLOB, /* 0x00 (not possible) */ + SQLITE_NULL, /* 0x01 NULL */ + SQLITE_TEXT, /* 0x02 TEXT */ + SQLITE_NULL, /* 0x03 (not possible) */ + SQLITE_INTEGER, /* 0x04 INTEGER */ + SQLITE_NULL, /* 0x05 (not possible) */ + SQLITE_INTEGER, /* 0x06 INTEGER + TEXT */ + SQLITE_NULL, /* 0x07 (not possible) */ + SQLITE_FLOAT, /* 0x08 FLOAT */ + SQLITE_NULL, /* 0x09 (not possible) */ + SQLITE_FLOAT, /* 0x0a FLOAT + TEXT */ + SQLITE_NULL, /* 0x0b (not possible) */ + SQLITE_INTEGER, /* 0x0c (not possible) */ + SQLITE_NULL, /* 0x0d (not possible) */ + SQLITE_INTEGER, /* 0x0e (not possible) */ + SQLITE_NULL, /* 0x0f (not possible) */ + SQLITE_BLOB, /* 0x10 BLOB */ + SQLITE_NULL, /* 0x11 (not possible) */ + SQLITE_TEXT, /* 0x12 (not possible) */ + SQLITE_NULL, /* 0x13 (not possible) */ + SQLITE_INTEGER, /* 0x14 INTEGER + BLOB */ + SQLITE_NULL, /* 0x15 (not possible) */ + SQLITE_INTEGER, /* 0x16 (not possible) */ + SQLITE_NULL, /* 0x17 (not possible) */ + SQLITE_FLOAT, /* 0x18 FLOAT + BLOB */ + SQLITE_NULL, /* 0x19 (not possible) */ + SQLITE_FLOAT, /* 0x1a (not possible) */ + SQLITE_NULL, /* 0x1b (not possible) */ + SQLITE_INTEGER, /* 0x1c (not possible) */ + SQLITE_NULL, /* 0x1d (not possible) */ + SQLITE_INTEGER, /* 0x1e (not possible) */ + SQLITE_NULL, /* 0x1f (not possible) */ + SQLITE_FLOAT, /* 0x20 INTREAL */ + SQLITE_NULL, /* 0x21 (not possible) */ + SQLITE_TEXT, /* 0x22 INTREAL + TEXT */ + SQLITE_NULL, /* 0x23 (not possible) */ + SQLITE_FLOAT, /* 0x24 (not possible) */ + SQLITE_NULL, /* 0x25 (not possible) */ + SQLITE_FLOAT, /* 0x26 (not possible) */ + SQLITE_NULL, /* 0x27 (not possible) */ + SQLITE_FLOAT, /* 0x28 (not possible) */ + SQLITE_NULL, /* 0x29 (not possible) */ + SQLITE_FLOAT, /* 0x2a (not possible) */ + SQLITE_NULL, /* 0x2b (not possible) */ + SQLITE_FLOAT, /* 0x2c (not possible) */ + SQLITE_NULL, /* 0x2d (not possible) */ + SQLITE_FLOAT, /* 0x2e (not possible) */ + SQLITE_NULL, /* 0x2f (not possible) */ + SQLITE_BLOB, /* 0x30 (not possible) */ + SQLITE_NULL, /* 0x31 (not possible) */ + SQLITE_TEXT, /* 0x32 (not possible) */ + SQLITE_NULL, /* 0x33 (not possible) */ + SQLITE_FLOAT, /* 0x34 (not possible) */ + SQLITE_NULL, /* 0x35 (not possible) */ + SQLITE_FLOAT, /* 0x36 (not possible) */ + SQLITE_NULL, /* 0x37 (not possible) */ + SQLITE_FLOAT, /* 0x38 (not possible) */ + SQLITE_NULL, /* 0x39 (not possible) */ + SQLITE_FLOAT, /* 0x3a (not possible) */ + SQLITE_NULL, /* 0x3b (not possible) */ + SQLITE_FLOAT, /* 0x3c (not possible) */ + SQLITE_NULL, /* 0x3d (not possible) */ + SQLITE_FLOAT, /* 0x3e (not possible) */ + SQLITE_NULL, /* 0x3f (not possible) */ }; +#ifdef SQLITE_DEBUG + { + int eType = SQLITE_BLOB; + if( pVal->flags & MEM_Null ){ + eType = SQLITE_NULL; + }else if( pVal->flags & (MEM_Real|MEM_IntReal) ){ + eType = SQLITE_FLOAT; + }else if( pVal->flags & MEM_Int ){ + eType = SQLITE_INTEGER; + }else if( pVal->flags & MEM_Str ){ + eType = SQLITE_TEXT; + } + assert( eType == aType[pVal->flags&MEM_AffMask] ); + } +#endif return aType[pVal->flags&MEM_AffMask]; } @@ -80685,6 +82835,11 @@ SQLITE_API int sqlite3_value_nochange(sqlite3_value *pVal){ return (pVal->flags&(MEM_Null|MEM_Zero))==(MEM_Null|MEM_Zero); } +/* Return true if a parameter value originated from an sqlite3_bind() */ +SQLITE_API int sqlite3_value_frombind(sqlite3_value *pVal){ + return (pVal->flags&MEM_FromBind)!=0; +} + /* Make a copy of an sqlite3_value object */ SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value *pOrig){ @@ -80921,6 +83076,21 @@ SQLITE_API void sqlite3_result_error_nomem(sqlite3_context *pCtx){ sqlite3OomFault(pCtx->pOut->db); } +#ifndef SQLITE_UNTESTABLE +/* Force the INT64 value currently stored as the result to be +** a MEM_IntReal value. See the SQLITE_TESTCTRL_RESULT_INTREAL +** test-control. +*/ +SQLITE_PRIVATE void sqlite3ResultIntReal(sqlite3_context *pCtx){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + if( pCtx->pOut->flags & MEM_Int ){ + pCtx->pOut->flags &= ~MEM_Int; + pCtx->pOut->flags |= MEM_IntReal; + } +} +#endif + + /* ** This function is called after a transaction has been committed. It ** invokes callbacks registered with sqlite3_wal_hook() as required. @@ -80995,7 +83165,7 @@ static int sqlite3Step(Vdbe *p){ return SQLITE_NOMEM_BKPT; } - if( p->pc<=0 && p->expired ){ + if( p->pc<0 && p->expired ){ p->rc = SQLITE_SCHEMA; rc = SQLITE_ERROR; goto end_of_step; @@ -81014,7 +83184,7 @@ static int sqlite3Step(Vdbe *p){ ); #ifndef SQLITE_OMIT_TRACE - if( (db->xProfile || (db->mTrace & SQLITE_TRACE_PROFILE)!=0) + if( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 && !db->init.busy && p->zSql ){ sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime); }else{ @@ -81041,16 +83211,18 @@ static int sqlite3Step(Vdbe *p){ db->nVdbeExec--; } + if( rc!=SQLITE_ROW ){ #ifndef SQLITE_OMIT_TRACE - /* If the statement completed successfully, invoke the profile callback */ - if( rc!=SQLITE_ROW ) checkProfileCallback(db, p); + /* If the statement completed successfully, invoke the profile callback */ + checkProfileCallback(db, p); #endif - if( rc==SQLITE_DONE && db->autoCommit ){ - assert( p->rc==SQLITE_OK ); - p->rc = doWalCallbacks(db); - if( p->rc!=SQLITE_OK ){ - rc = SQLITE_ERROR; + if( rc==SQLITE_DONE && db->autoCommit ){ + assert( p->rc==SQLITE_OK ); + p->rc = doWalCallbacks(db); + if( p->rc!=SQLITE_OK ){ + rc = SQLITE_ERROR; + } } } @@ -81070,9 +83242,9 @@ static int sqlite3Step(Vdbe *p){ || (rc&0xff)==SQLITE_BUSY || rc==SQLITE_MISUSE ); assert( (p->rc!=SQLITE_ROW && p->rc!=SQLITE_DONE) || p->rc==p->rcApp ); - if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 - && rc!=SQLITE_ROW - && rc!=SQLITE_DONE + if( rc!=SQLITE_ROW + && rc!=SQLITE_DONE + && (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ){ /* If this statement was prepared using saved SQL and an ** error has occurred, then return the error code in p->rc to the @@ -81185,7 +83357,7 @@ SQLITE_API int sqlite3_vtab_nochange(sqlite3_context *p){ */ SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context *p){ int rc; -#ifndef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifndef SQLITE_ENABLE_STAT4 sqlite3_int64 *piTime = &p->pVdbe->iCurrentTime; assert( p->pVdbe!=0 ); #else @@ -81250,7 +83422,7 @@ SQLITE_API void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){ AuxData *pAuxData; assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); -#if SQLITE_ENABLE_STAT3_OR_STAT4 +#if SQLITE_ENABLE_STAT4 if( pCtx->pVdbe==0 ) return 0; #else assert( pCtx->pVdbe!=0 ); @@ -81284,7 +83456,7 @@ SQLITE_API void sqlite3_set_auxdata( Vdbe *pVdbe = pCtx->pVdbe; assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 if( pVdbe==0 ) goto failed; #else assert( pVdbe!=0 ); @@ -81528,10 +83700,10 @@ SQLITE_API int sqlite3_column_type(sqlite3_stmt *pStmt, int i){ ** or a constant) then useTypes 2, 3, and 4 return NULL. */ static const void *columnName( - sqlite3_stmt *pStmt, - int N, - const void *(*xFunc)(Mem*), - int useType + sqlite3_stmt *pStmt, /* The statement */ + int N, /* Which column to get the name for */ + int useUtf16, /* True to return the name as UTF16 */ + int useType /* What type of name */ ){ const void *ret; Vdbe *p; @@ -81552,8 +83724,15 @@ static const void *columnName( N += useType*n; sqlite3_mutex_enter(db->mutex); assert( db->mallocFailed==0 ); - ret = xFunc(&p->aColName[N]); - /* A malloc may have failed inside of the xFunc() call. If this +#ifndef SQLITE_OMIT_UTF16 + if( useUtf16 ){ + ret = sqlite3_value_text16((sqlite3_value*)&p->aColName[N]); + }else +#endif + { + ret = sqlite3_value_text((sqlite3_value*)&p->aColName[N]); + } + /* A malloc may have failed inside of the _text() call. If this ** is the case, clear the mallocFailed flag and return NULL. */ if( db->mallocFailed ){ @@ -81570,13 +83749,11 @@ static const void *columnName( ** statement pStmt. */ SQLITE_API const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_NAME); + return columnName(pStmt, N, 0, COLNAME_NAME); } #ifndef SQLITE_OMIT_UTF16 SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_NAME); + return columnName(pStmt, N, 1, COLNAME_NAME); } #endif @@ -81595,13 +83772,11 @@ SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){ ** of the result set of SQL statement pStmt. */ SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DECLTYPE); + return columnName(pStmt, N, 0, COLNAME_DECLTYPE); } #ifndef SQLITE_OMIT_UTF16 SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DECLTYPE); + return columnName(pStmt, N, 1, COLNAME_DECLTYPE); } #endif /* SQLITE_OMIT_UTF16 */ #endif /* SQLITE_OMIT_DECLTYPE */ @@ -81613,13 +83788,11 @@ SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){ ** anything else which is not an unambiguous reference to a database column. */ SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DATABASE); + return columnName(pStmt, N, 0, COLNAME_DATABASE); } #ifndef SQLITE_OMIT_UTF16 SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DATABASE); + return columnName(pStmt, N, 1, COLNAME_DATABASE); } #endif /* SQLITE_OMIT_UTF16 */ @@ -81629,13 +83802,11 @@ SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N ** anything else which is not an unambiguous reference to a database column. */ SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_TABLE); + return columnName(pStmt, N, 0, COLNAME_TABLE); } #ifndef SQLITE_OMIT_UTF16 SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_TABLE); + return columnName(pStmt, N, 1, COLNAME_TABLE); } #endif /* SQLITE_OMIT_UTF16 */ @@ -81645,13 +83816,11 @@ SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){ ** anything else which is not an unambiguous reference to a database column. */ SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_COLUMN); + return columnName(pStmt, N, 0, COLNAME_COLUMN); } #ifndef SQLITE_OMIT_UTF16 SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_COLUMN); + return columnName(pStmt, N, 1, COLNAME_COLUMN); } #endif /* SQLITE_OMIT_UTF16 */ #endif /* SQLITE_ENABLE_COLUMN_METADATA */ @@ -81694,7 +83863,7 @@ static int vdbeUnbind(Vdbe *p, int i){ pVar = &p->aVar[i]; sqlite3VdbeMemRelease(pVar); pVar->flags = MEM_Null; - sqlite3Error(p->db, SQLITE_OK); + p->db->errCode = SQLITE_OK; /* If the bit corresponding to this variable in Vdbe.expmask is set, then ** binding a new value to this variable invalidates the current query plan. @@ -82019,6 +84188,14 @@ SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt){ return pStmt ? ((Vdbe*)pStmt)->readOnly : 1; } +/* +** Return 1 if the statement is an EXPLAIN and return 2 if the +** statement is an EXPLAIN QUERY PLAN +*/ +SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt){ + return pStmt ? ((Vdbe*)pStmt)->explain : 0; +} + /* ** Return true if the prepared statement is in need of being reset. */ @@ -82114,6 +84291,22 @@ SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt){ #endif } +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** Return the normalized SQL associated with a prepared statement. +*/ +SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt){ + Vdbe *p = (Vdbe *)pStmt; + if( p==0 ) return 0; + if( p->zNormSql==0 && ALWAYS(p->zSql!=0) ){ + sqlite3_mutex_enter(p->db->mutex); + p->zNormSql = sqlite3Normalize(p, p->zSql); + sqlite3_mutex_leave(p->db->mutex); + } + return p->zNormSql; +} +#endif /* SQLITE_ENABLE_NORMALIZE */ + #ifdef SQLITE_ENABLE_PREUPDATE_HOOK /* ** Allocate and populate an UnpackedRecord structure based on the serialized @@ -82151,7 +84344,7 @@ SQLITE_API int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppVa goto preupdate_old_out; } if( p->pPk ){ - iIdx = sqlite3ColumnOfIndex(p->pPk, iIdx); + iIdx = sqlite3TableColumnToIndex(p->pPk, iIdx); } if( iIdx>=p->pCsr->nField || iIdx<0 ){ rc = SQLITE_RANGE; @@ -82184,7 +84377,9 @@ SQLITE_API int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppVa }else if( iIdx>=p->pUnpacked->nField ){ *ppValue = (sqlite3_value *)columnNullValue(); }else if( p->pTab->aCol[iIdx].affinity==SQLITE_AFF_REAL ){ - if( pMem->flags & MEM_Int ){ + if( pMem->flags & (MEM_Int|MEM_IntReal) ){ + testcase( pMem->flags & MEM_Int ); + testcase( pMem->flags & MEM_IntReal ); sqlite3VdbeMemRealify(pMem); } } @@ -82239,7 +84434,7 @@ SQLITE_API int sqlite3_preupdate_new(sqlite3 *db, int iIdx, sqlite3_value **ppVa goto preupdate_new_out; } if( p->pPk && p->op!=SQLITE_UPDATE ){ - iIdx = sqlite3ColumnOfIndex(p->pPk, iIdx); + iIdx = sqlite3TableColumnToIndex(p->pPk, iIdx); } if( iIdx>=p->pCsr->nField || iIdx<0 ){ rc = SQLITE_RANGE; @@ -82503,7 +84698,7 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql( pVar = &p->aVar[idx-1]; if( pVar->flags & MEM_Null ){ sqlite3_str_append(&out, "NULL", 4); - }else if( pVar->flags & MEM_Int ){ + }else if( pVar->flags & (MEM_Int|MEM_IntReal) ){ sqlite3_str_appendf(&out, "%lld", pVar->u.i); }else if( pVar->flags & MEM_Real ){ sqlite3_str_appendf(&out, "%!.15g", pVar->u.r); @@ -82687,17 +84882,45 @@ SQLITE_API int sqlite3_found_count = 0; # define UPDATE_MAX_BLOBSIZE(P) #endif +#ifdef SQLITE_DEBUG +/* This routine provides a convenient place to set a breakpoint during +** tracing with PRAGMA vdbe_trace=on. The breakpoint fires right after +** each opcode is printed. Variables "pc" (program counter) and pOp are +** available to add conditionals to the breakpoint. GDB example: +** +** break test_trace_breakpoint if pc=22 +** +** Other useful labels for breakpoints include: +** test_addop_breakpoint(pc,pOp) +** sqlite3CorruptError(lineno) +** sqlite3MisuseError(lineno) +** sqlite3CantopenError(lineno) +*/ +static void test_trace_breakpoint(int pc, Op *pOp, Vdbe *v){ + static int n = 0; + n++; +} +#endif + /* ** Invoke the VDBE coverage callback, if that callback is defined. This ** feature is used for test suite validation only and does not appear an ** production builds. ** -** M is an integer between 2 and 4. 2 indicates a ordinary two-way -** branch (I=0 means fall through and I=1 means taken). 3 indicates -** a 3-way branch where the third way is when one of the operands is -** NULL. 4 indicates the OP_Jump instruction which has three destinations -** depending on whether the first operand is less than, equal to, or greater -** than the second. +** M is the type of branch. I is the direction taken for this instance of +** the branch. +** +** M: 2 - two-way branch (I=0: fall-thru 1: jump ) +** 3 - two-way + NULL (I=0: fall-thru 1: jump 2: NULL ) +** 4 - OP_Jump (I=0: jump p1 1: jump p2 2: jump p3) +** +** In other words, if M is 2, then I is either 0 (for fall-through) or +** 1 (for when the branch is taken). If M is 3, the I is 0 for an +** ordinary fall-through, I is 1 if the branch was taken, and I is 2 +** if the result of comparison is NULL. For M=3, I=2 the jump may or +** may not be taken, depending on the SQLITE_JUMPIFNULL flags in p5. +** When M is 4, that means that an OP_Jump is being run. I is 0, 1, or 2 +** depending on if the operands are less than, equal, or greater than. ** ** iSrcLine is the source code line (from the __LINE__ macro) that ** generated the VDBE instruction combined with flag bits. The source @@ -82708,9 +84931,9 @@ SQLITE_API int sqlite3_found_count = 0; ** alternate branch are never taken. If a branch is never taken then ** flags should be 0x06 since only the fall-through approach is allowed. ** -** Bit 0x04 of the flags indicates an OP_Jump opcode that is only +** Bit 0x08 of the flags indicates an OP_Jump opcode that is only ** interested in equal or not-equal. In other words, I==0 and I==2 -** should be treated the same. +** should be treated as equivalent ** ** Since only a line number is retained, not the filename, this macro ** only works for amalgamation builds. But that is ok, since these macros @@ -82734,6 +84957,18 @@ SQLITE_API int sqlite3_found_count = 0; mNever = iSrcLine >> 24; assert( (I & mNever)==0 ); if( sqlite3GlobalConfig.xVdbeBranch==0 ) return; /*NO_TEST*/ + /* Invoke the branch coverage callback with three arguments: + ** iSrcLine - the line number of the VdbeCoverage() macro, with + ** flags removed. + ** I - Mask of bits 0x07 indicating which cases are are + ** fulfilled by this instance of the jump. 0x01 means + ** fall-thru, 0x02 means taken, 0x04 means NULL. Any + ** impossible cases (ex: if the comparison is never NULL) + ** are filled in automatically so that the coverage + ** measurement logic does not flag those impossible cases + ** as missed coverage. + ** M - Type of jump. Same as M argument above + */ I |= mNever; if( M==2 ) I |= 0x04; if( M==4 ){ @@ -82745,14 +84980,6 @@ SQLITE_API int sqlite3_found_count = 0; } #endif -/* -** Convert the given register into a string if it isn't one -** already. Return non-zero if a malloc() fails. -*/ -#define Stringify(P, enc) \ - if(((P)->flags&(MEM_Str|MEM_Blob))==0 && sqlite3VdbeMemStringify(P,enc,0)) \ - { goto no_mem; } - /* ** An ephemeral string value (signified by the MEM_Ephem flag) contains ** a pointer to a dynamically allocated string where some other entity @@ -82810,6 +85037,11 @@ static VdbeCursor *allocateCursor( assert( iCur>=0 && iCurnCursor ); if( p->apCsr[iCur] ){ /*OPTIMIZATION-IF-FALSE*/ + /* Before calling sqlite3VdbeFreeCursor(), ensure the isEphemeral flag + ** is clear. Otherwise, if this is an ephemeral cursor created by + ** OP_OpenDup, the cursor will not be closed and will still be part + ** of a BtShared.pCursor list. */ + if( p->apCsr[iCur]->pBtx==0 ) p->apCsr[iCur]->isEphemeral = 0; sqlite3VdbeFreeCursor(p, p->apCsr[iCur]); p->apCsr[iCur] = 0; } @@ -82829,6 +85061,21 @@ static VdbeCursor *allocateCursor( return pCx; } +/* +** The string in pRec is known to look like an integer and to have a +** floating point value of rValue. Return true and set *piValue to the +** integer value if the string is in range to be an integer. Otherwise, +** return false. +*/ +static int alsoAnInt(Mem *pRec, double rValue, i64 *piValue){ + i64 iValue = (double)rValue; + if( sqlite3RealSameAsInt(rValue,iValue) ){ + *piValue = iValue; + return 1; + } + return 0==sqlite3Atoi64(pRec->z, piValue, pRec->n, pRec->enc); +} + /* ** Try to convert a value into a numeric representation if we can ** do so without loss of information. In other words, if the string @@ -82846,12 +85093,12 @@ static VdbeCursor *allocateCursor( */ static void applyNumericAffinity(Mem *pRec, int bTryForInt){ double rValue; - i64 iValue; u8 enc = pRec->enc; - assert( (pRec->flags & (MEM_Str|MEM_Int|MEM_Real))==MEM_Str ); - if( sqlite3AtoF(pRec->z, &rValue, pRec->n, enc)==0 ) return; - if( 0==sqlite3Atoi64(pRec->z, &iValue, pRec->n, enc) ){ - pRec->u.i = iValue; + int rc; + assert( (pRec->flags & (MEM_Str|MEM_Int|MEM_Real|MEM_IntReal))==MEM_Str ); + rc = sqlite3AtoF(pRec->z, &rValue, pRec->n, enc); + if( rc<=0 ) return; + if( rc==1 && alsoAnInt(pRec, rValue, &pRec->u.i) ){ pRec->flags |= MEM_Int; }else{ pRec->u.r = rValue; @@ -82881,6 +85128,7 @@ static void applyNumericAffinity(Mem *pRec, int bTryForInt){ ** Convert pRec to a text representation. ** ** SQLITE_AFF_BLOB: +** SQLITE_AFF_NONE: ** No-op. pRec is unchanged. */ static void applyAffinity( @@ -82905,11 +85153,14 @@ static void applyAffinity( ** there is already a string rep, but it is pointless to waste those ** CPU cycles. */ if( 0==(pRec->flags&MEM_Str) ){ /*OPTIMIZATION-IF-FALSE*/ - if( (pRec->flags&(MEM_Real|MEM_Int)) ){ + if( (pRec->flags&(MEM_Real|MEM_Int|MEM_IntReal)) ){ + testcase( pRec->flags & MEM_Int ); + testcase( pRec->flags & MEM_Real ); + testcase( pRec->flags & MEM_IntReal ); sqlite3VdbeMemStringify(pRec, enc, 1); } } - pRec->flags &= ~(MEM_Real|MEM_Int); + pRec->flags &= ~(MEM_Real|MEM_Int|MEM_IntReal); } } @@ -82948,12 +85199,21 @@ SQLITE_PRIVATE void sqlite3ValueApplyAffinity( ** accordingly. */ static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){ - assert( (pMem->flags & (MEM_Int|MEM_Real))==0 ); + int rc; + sqlite3_int64 ix; + assert( (pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal))==0 ); assert( (pMem->flags & (MEM_Str|MEM_Blob))!=0 ); - if( sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc)==0 ){ - return 0; - } - if( sqlite3Atoi64(pMem->z, &pMem->u.i, pMem->n, pMem->enc)==0 ){ + ExpandBlob(pMem); + rc = sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc); + if( rc<=0 ){ + if( rc==0 && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)<=1 ){ + pMem->u.i = ix; + return MEM_Int; + }else{ + return MEM_Real; + } + }else if( rc==1 && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)==0 ){ + pMem->u.i = ix; return MEM_Int; } return MEM_Real; @@ -82967,10 +85227,15 @@ static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){ ** But it does set pMem->u.r and pMem->u.i appropriately. */ static u16 numericType(Mem *pMem){ - if( pMem->flags & (MEM_Int|MEM_Real) ){ - return pMem->flags & (MEM_Int|MEM_Real); + if( pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal) ){ + testcase( pMem->flags & MEM_Int ); + testcase( pMem->flags & MEM_Real ); + testcase( pMem->flags & MEM_IntReal ); + return pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal); } if( pMem->flags & (MEM_Str|MEM_Blob) ){ + testcase( pMem->flags & MEM_Str ); + testcase( pMem->flags & MEM_Blob ); return computeNumericType(pMem); } return 0; @@ -82981,12 +85246,9 @@ static u16 numericType(Mem *pMem){ ** Write a nice string representation of the contents of cell pMem ** into buffer zBuf, length nBuf. */ -SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf){ - char *zCsr = zBuf; +SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, StrAccum *pStr){ int f = pMem->flags; - static const char *const encnames[] = {"(X)", "(8)", "(16LE)", "(16BE)"}; - if( f&MEM_Blob ){ int i; char c; @@ -83002,55 +85264,40 @@ SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf){ }else{ c = 's'; } - *(zCsr++) = c; - sqlite3_snprintf(100, zCsr, "%d[", pMem->n); - zCsr += sqlite3Strlen30(zCsr); - for(i=0; i<16 && in; i++){ - sqlite3_snprintf(100, zCsr, "%02X", ((int)pMem->z[i] & 0xFF)); - zCsr += sqlite3Strlen30(zCsr); + sqlite3_str_appendf(pStr, "%cx[", c); + for(i=0; i<25 && in; i++){ + sqlite3_str_appendf(pStr, "%02X", ((int)pMem->z[i] & 0xFF)); } - for(i=0; i<16 && in; i++){ + sqlite3_str_appendf(pStr, "|"); + for(i=0; i<25 && in; i++){ char z = pMem->z[i]; - if( z<32 || z>126 ) *zCsr++ = '.'; - else *zCsr++ = z; + sqlite3_str_appendchar(pStr, 1, (z<32||z>126)?'.':z); } - *(zCsr++) = ']'; + sqlite3_str_appendf(pStr,"]"); if( f & MEM_Zero ){ - sqlite3_snprintf(100, zCsr,"+%dz",pMem->u.nZero); - zCsr += sqlite3Strlen30(zCsr); + sqlite3_str_appendf(pStr, "+%dz",pMem->u.nZero); } - *zCsr = '\0'; }else if( f & MEM_Str ){ - int j, k; - zBuf[0] = ' '; + int j; + u8 c; if( f & MEM_Dyn ){ - zBuf[1] = 'z'; + c = 'z'; assert( (f & (MEM_Static|MEM_Ephem))==0 ); }else if( f & MEM_Static ){ - zBuf[1] = 't'; + c = 't'; assert( (f & (MEM_Dyn|MEM_Ephem))==0 ); }else if( f & MEM_Ephem ){ - zBuf[1] = 'e'; + c = 'e'; assert( (f & (MEM_Static|MEM_Dyn))==0 ); }else{ - zBuf[1] = 's'; + c = 's'; } - k = 2; - sqlite3_snprintf(100, &zBuf[k], "%d", pMem->n); - k += sqlite3Strlen30(&zBuf[k]); - zBuf[k++] = '['; - for(j=0; j<15 && jn; j++){ - u8 c = pMem->z[j]; - if( c>=0x20 && c<0x7f ){ - zBuf[k++] = c; - }else{ - zBuf[k++] = '.'; - } + sqlite3_str_appendf(pStr, " %c%d[", c, pMem->n); + for(j=0; j<25 && jn; j++){ + c = pMem->z[j]; + sqlite3_str_appendchar(pStr, 1, (c>=0x20&&c<=0x7f) ? c : '.'); } - zBuf[k++] = ']'; - sqlite3_snprintf(100,&zBuf[k], encnames[pMem->enc]); - k += sqlite3Strlen30(&zBuf[k]); - zBuf[k++] = 0; + sqlite3_str_appendf(pStr, "]%s", encnames[pMem->enc]); } } #endif @@ -83066,29 +85313,48 @@ static void memTracePrint(Mem *p){ printf(p->flags & MEM_Zero ? " NULL-nochng" : " NULL"); }else if( (p->flags & (MEM_Int|MEM_Str))==(MEM_Int|MEM_Str) ){ printf(" si:%lld", p->u.i); + }else if( (p->flags & (MEM_IntReal))!=0 ){ + printf(" ir:%lld", p->u.i); }else if( p->flags & MEM_Int ){ printf(" i:%lld", p->u.i); #ifndef SQLITE_OMIT_FLOATING_POINT }else if( p->flags & MEM_Real ){ - printf(" r:%g", p->u.r); + printf(" r:%.17g", p->u.r); #endif }else if( sqlite3VdbeMemIsRowSet(p) ){ printf(" (rowset)"); }else{ - char zBuf[200]; - sqlite3VdbeMemPrettyPrint(p, zBuf); - printf(" %s", zBuf); + StrAccum acc; + char zBuf[1000]; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + sqlite3VdbeMemPrettyPrint(p, &acc); + printf(" %s", sqlite3StrAccumFinish(&acc)); } if( p->flags & MEM_Subtype ) printf(" subtype=0x%02x", p->eSubtype); } static void registerTrace(int iReg, Mem *p){ - printf("REG[%d] = ", iReg); + printf("R[%d] = ", iReg); memTracePrint(p); + if( p->pScopyFrom ){ + printf(" <== R[%d]", (int)(p->pScopyFrom - &p[-iReg])); + } printf("\n"); sqlite3VdbeCheckMemInvariants(p); } #endif +#ifdef SQLITE_DEBUG +/* +** Show the values of all registers in the virtual machine. Used for +** interactive debugging. +*/ +SQLITE_PRIVATE void sqlite3VdbeRegisterDump(Vdbe *v){ + int i; + for(i=1; inMem; i++) registerTrace(i, v->aMem+i); +} +#endif /* SQLITE_DEBUG */ + + #ifdef SQLITE_DEBUG # define REGISTER_TRACE(R,M) if(db->flags&SQLITE_VdbeTrace)registerTrace(R,M) #else @@ -83117,7 +85383,7 @@ static void registerTrace(int iReg, Mem *p){ ****************************************************************************** ** ** This file contains inline asm code for retrieving "high-performance" -** counters for x86 class CPUs. +** counters for x86 and x86_64 class CPUs. */ #ifndef SQLITE_HWTIME_H #define SQLITE_HWTIME_H @@ -83128,8 +85394,9 @@ static void registerTrace(int iReg, Mem *p){ ** processor and returns that value. This can be used for high-res ** profiling. */ -#if (defined(__GNUC__) || defined(_MSC_VER)) && \ - (defined(i386) || defined(__i386__) || defined(_M_IX86)) +#if !defined(__STRICT_ANSI__) && \ + (defined(__GNUC__) || defined(_MSC_VER)) && \ + (defined(i386) || defined(__i386__) || defined(_M_IX86)) #if defined(__GNUC__) @@ -83150,7 +85417,7 @@ static void registerTrace(int iReg, Mem *p){ #endif -#elif (defined(__GNUC__) && defined(__x86_64__)) +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__)) __inline__ sqlite_uint64 sqlite3Hwtime(void){ unsigned long val; @@ -83158,7 +85425,7 @@ static void registerTrace(int iReg, Mem *p){ return val; } -#elif (defined(__GNUC__) && defined(__ppc__)) +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__)) __inline__ sqlite_uint64 sqlite3Hwtime(void){ unsigned long long retval; @@ -83175,14 +85442,13 @@ static void registerTrace(int iReg, Mem *p){ #else - #error Need implementation of sqlite3Hwtime() for your platform. - /* - ** To compile without implementing sqlite3Hwtime() for your platform, - ** you can remove the above #error and use the following - ** stub function. You will lose timing support for many - ** of the debugging and testing utilities, but it should at - ** least compile and run. + ** asm() is needed for hardware timing support. Without asm(), + ** disable the sqlite3Hwtime() routine. + ** + ** sqlite3Hwtime() is only used for some obscure debugging + ** and analysis configurations, not in any deliverable, so this + ** should not be a great loss. */ SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } @@ -83275,6 +85541,15 @@ SQLITE_PRIVATE int sqlite3VdbeExec( assert( p->magic==VDBE_MAGIC_RUN ); /* sqlite3_step() verifies this */ sqlite3VdbeEnter(p); +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + if( db->xProgress ){ + u32 iPrior = p->aCounter[SQLITE_STMTSTATUS_VM_STEP]; + assert( 0 < db->nProgressOps ); + nProgressLimit = db->nProgressOps - (iPrior % db->nProgressOps); + }else{ + nProgressLimit = 0xffffffff; + } +#endif if( p->rc==SQLITE_NOMEM ){ /* This happens if a malloc() inside a call to sqlite3_column_text() or ** sqlite3_column_text16() failed. */ @@ -83288,15 +85563,6 @@ SQLITE_PRIVATE int sqlite3VdbeExec( db->busyHandler.nBusy = 0; if( db->u1.isInterrupted ) goto abort_due_to_interrupt; sqlite3VdbeIOTraceSql(p); -#ifndef SQLITE_OMIT_PROGRESS_CALLBACK - if( db->xProgress ){ - u32 iPrior = p->aCounter[SQLITE_STMTSTATUS_VM_STEP]; - assert( 0 < db->nProgressOps ); - nProgressLimit = db->nProgressOps - (iPrior % db->nProgressOps); - }else{ - nProgressLimit = 0xffffffff; - } -#endif #ifdef SQLITE_DEBUG sqlite3BeginBenignMalloc(); if( p->pc==0 @@ -83343,6 +85609,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec( #ifdef SQLITE_DEBUG if( db->flags & SQLITE_VdbeTrace ){ sqlite3VdbePrintOp(stdout, (int)(pOp - aOp), pOp); + test_trace_breakpoint((int)(pOp - aOp),pOp,p); } #endif @@ -83450,6 +85717,20 @@ SQLITE_PRIVATE int sqlite3VdbeExec( ** to the current line should be indented for EXPLAIN output. */ case OP_Goto: { /* jump */ + +#ifdef SQLITE_DEBUG + /* In debuggging mode, when the p5 flags is set on an OP_Goto, that + ** means we should really jump back to the preceeding OP_ReleaseReg + ** instruction. */ + if( pOp->p5 ){ + assert( pOp->p2 < (int)(pOp - aOp) ); + assert( pOp->p2 > 1 ); + pOp = &aOp[pOp->p2 - 2]; + assert( pOp[1].opcode==OP_ReleaseReg ); + goto check_for_interrupt; + } +#endif + jump_to_p2_and_check_for_interrupt: pOp = &aOp[pOp->p2 - 1]; @@ -83472,10 +85753,11 @@ case OP_Goto: { /* jump */ ** If the progress callback returns non-zero, exit the virtual machine with ** a return code SQLITE_ABORT. */ - if( nVmStep>=nProgressLimit && db->xProgress!=0 ){ + while( nVmStep>=nProgressLimit && db->xProgress!=0 ){ assert( db->nProgressOps!=0 ); - nProgressLimit = nVmStep + db->nProgressOps - (nVmStep%db->nProgressOps); + nProgressLimit += db->nProgressOps; if( db->xProgress(db->pProgressArg) ){ + nProgressLimit = 0xffffffff; rc = SQLITE_INTERRUPT; goto abort_due_to_error; } @@ -83747,13 +86029,13 @@ case OP_Real: { /* same as TK_FLOAT, out2 */ case OP_String8: { /* same as TK_STRING, out2 */ assert( pOp->p4.z!=0 ); pOut = out2Prerelease(p, pOp); - pOp->opcode = OP_String; pOp->p1 = sqlite3Strlen30(pOp->p4.z); #ifndef SQLITE_OMIT_UTF16 if( encoding!=SQLITE_UTF8 ){ rc = sqlite3VdbeMemSetStr(pOut, pOp->p4.z, -1, SQLITE_UTF8, SQLITE_STATIC); assert( rc==SQLITE_OK || rc==SQLITE_TOOBIG ); + if( rc ) goto too_big; if( SQLITE_OK!=sqlite3VdbeChangeEncoding(pOut, encoding) ) goto no_mem; assert( pOut->szMalloc>0 && pOut->zMalloc==pOut->z ); assert( VdbeMemDynamic(pOut)==0 ); @@ -83766,11 +86048,11 @@ case OP_String8: { /* same as TK_STRING, out2 */ pOp->p4.z = pOut->z; pOp->p1 = pOut->n; } - testcase( rc==SQLITE_TOOBIG ); #endif if( pOp->p1>db->aLimit[SQLITE_LIMIT_LENGTH] ){ goto too_big; } + pOp->opcode = OP_String; assert( rc==SQLITE_OK ); /* Fall through to the next case, OP_String */ } @@ -83888,7 +86170,10 @@ case OP_Variable: { /* out2 */ goto too_big; } pOut = &aMem[pOp->p2]; - sqlite3VdbeMemShallowCopy(pOut, pVar, MEM_Static); + if( VdbeMemDynamic(pOut) ) sqlite3VdbeMemSetNull(pOut); + memcpy(pOut, pVar, MEMCELLSIZE); + pOut->flags &= ~(MEM_Dyn|MEM_Ephem); + pOut->flags |= MEM_Static|MEM_FromBind; UPDATE_MAX_BLOBSIZE(pOut); break; } @@ -83922,8 +86207,13 @@ case OP_Move: { memAboutToChange(p, pOut); sqlite3VdbeMemMove(pOut, pIn1); #ifdef SQLITE_DEBUG - if( pOut->pScopyFrom>=&aMem[p1] && pOut->pScopyFrompScopyFrom += pOp->p2 - p1; + pIn1->pScopyFrom = 0; + { int i; + for(i=1; inMem; i++){ + if( aMem[i].pScopyFrom==pIn1 ){ + aMem[i].pScopyFrom = pOut; + } + } } #endif Deephemeralize(pOut); @@ -84021,18 +86311,6 @@ case OP_ResultRow: { assert( pOp->p1>0 ); assert( pOp->p1+pOp->p2<=(p->nMem+1 - p->nCursor)+1 ); -#ifndef SQLITE_OMIT_PROGRESS_CALLBACK - /* Run the progress counter just before returning. - */ - if( db->xProgress!=0 - && nVmStep>=nProgressLimit - && db->xProgress(db->pProgressArg)!=0 - ){ - rc = SQLITE_INTERRUPT; - goto abort_due_to_error; - } -#endif - /* If this statement has violated immediate foreign key constraints, do ** not return the number of rows modified. And do not RELEASE the statement ** transaction. It needs to be rolled back. */ @@ -84076,6 +86354,14 @@ case OP_ResultRow: { || (pMem[i].flags & (MEM_Str|MEM_Blob))==0 ); sqlite3VdbeMemNulTerminate(&pMem[i]); REGISTER_TRACE(pOp->p1+i, &pMem[i]); +#ifdef SQLITE_DEBUG + /* The registers in the result will not be used again when the + ** prepared statement restarts. This is because sqlite3_column() + ** APIs might have caused type conversions of made other changes to + ** the register values. Therefore, we can go ahead and break any + ** OP_SCopy dependencies. */ + pMem[i].pScopyFrom = 0; +#endif } if( db->mallocFailed ) goto no_mem; @@ -84083,6 +86369,7 @@ case OP_ResultRow: { db->xTrace(SQLITE_TRACE_ROW, db->pTraceArg, p, 0); } + /* Return SQLITE_ROW */ p->pc = (int)(pOp - aOp) + 1; @@ -84104,33 +86391,57 @@ case OP_ResultRow: { ** to avoid a memcpy(). */ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ - i64 nByte; + i64 nByte; /* Total size of the output string or blob */ + u16 flags1; /* Initial flags for P1 */ + u16 flags2; /* Initial flags for P2 */ pIn1 = &aMem[pOp->p1]; pIn2 = &aMem[pOp->p2]; pOut = &aMem[pOp->p3]; + testcase( pIn1==pIn2 ); + testcase( pOut==pIn2 ); assert( pIn1!=pOut ); - if( (pIn1->flags | pIn2->flags) & MEM_Null ){ + flags1 = pIn1->flags; + testcase( flags1 & MEM_Null ); + testcase( pIn2->flags & MEM_Null ); + if( (flags1 | pIn2->flags) & MEM_Null ){ sqlite3VdbeMemSetNull(pOut); break; } - if( ExpandBlob(pIn1) || ExpandBlob(pIn2) ) goto no_mem; - Stringify(pIn1, encoding); - Stringify(pIn2, encoding); + if( (flags1 & (MEM_Str|MEM_Blob))==0 ){ + if( sqlite3VdbeMemStringify(pIn1,encoding,0) ) goto no_mem; + flags1 = pIn1->flags & ~MEM_Str; + }else if( (flags1 & MEM_Zero)!=0 ){ + if( sqlite3VdbeMemExpandBlob(pIn1) ) goto no_mem; + flags1 = pIn1->flags & ~MEM_Str; + } + flags2 = pIn2->flags; + if( (flags2 & (MEM_Str|MEM_Blob))==0 ){ + if( sqlite3VdbeMemStringify(pIn2,encoding,0) ) goto no_mem; + flags2 = pIn2->flags & ~MEM_Str; + }else if( (flags2 & MEM_Zero)!=0 ){ + if( sqlite3VdbeMemExpandBlob(pIn2) ) goto no_mem; + flags2 = pIn2->flags & ~MEM_Str; + } nByte = pIn1->n + pIn2->n; if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ goto too_big; } - if( sqlite3VdbeMemGrow(pOut, (int)nByte+2, pOut==pIn2) ){ + if( sqlite3VdbeMemGrow(pOut, (int)nByte+3, pOut==pIn2) ){ goto no_mem; } MemSetTypeFlag(pOut, MEM_Str); if( pOut!=pIn2 ){ memcpy(pOut->z, pIn2->z, pIn2->n); + assert( (pIn2->flags & MEM_Dyn) == (flags2 & MEM_Dyn) ); + pIn2->flags = flags2; } memcpy(&pOut->z[pIn2->n], pIn1->z, pIn1->n); + assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) ); + pIn1->flags = flags1; pOut->z[nByte]=0; pOut->z[nByte+1] = 0; + pOut->z[nByte+2] = 0; pOut->flags |= MEM_Term; pOut->n = (int)nByte; pOut->enc = encoding; @@ -84181,7 +86492,6 @@ case OP_Subtract: /* same as TK_MINUS, in1, in2, out3 */ case OP_Multiply: /* same as TK_STAR, in1, in2, out3 */ case OP_Divide: /* same as TK_SLASH, in1, in2, out3 */ case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ - char bIntint; /* Started out as two integer operands */ u16 flags; /* Combined MEM_* flags from both inputs */ u16 type1; /* Numeric type of left operand */ u16 type2; /* Numeric type of right operand */ @@ -84199,7 +86509,6 @@ case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ if( (type1 & type2 & MEM_Int)!=0 ){ iA = pIn1->u.i; iB = pIn2->u.i; - bIntint = 1; switch( pOp->opcode ){ case OP_Add: if( sqlite3AddInt64(&iB,iA) ) goto fp_math; break; case OP_Subtract: if( sqlite3SubInt64(&iB,iA) ) goto fp_math; break; @@ -84222,7 +86531,6 @@ case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ }else if( (flags & MEM_Null)!=0 ){ goto arithmetic_result_is_null; }else{ - bIntint = 0; fp_math: rA = sqlite3VdbeRealValue(pIn1); rB = sqlite3VdbeRealValue(pIn2); @@ -84237,8 +86545,8 @@ case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ break; } default: { - iA = (i64)rA; - iB = (i64)rB; + iA = sqlite3VdbeIntValue(pIn1); + iB = sqlite3VdbeIntValue(pIn2); if( iA==0 ) goto arithmetic_result_is_null; if( iA==-1 ) iA = 1; rB = (double)(iB % iA); @@ -84254,9 +86562,6 @@ case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ } pOut->u.r = rB; MemSetTypeFlag(pOut, MEM_Real); - if( ((type1|type2)&MEM_Real)==0 && !bIntint ){ - sqlite3VdbeIntegerAffinity(pOut); - } #endif } break; @@ -84398,8 +86703,8 @@ case OP_MustBeInt: { /* jump, in1 */ pIn1 = &aMem[pOp->p1]; if( (pIn1->flags & MEM_Int)==0 ){ applyAffinity(pIn1, SQLITE_AFF_NUMERIC, encoding); - VdbeBranchTaken((pIn1->flags&MEM_Int)==0, 2); if( (pIn1->flags & MEM_Int)==0 ){ + VdbeBranchTaken(1, 2); if( pOp->p2==0 ){ rc = SQLITE_MISMATCH; goto abort_due_to_error; @@ -84408,6 +86713,7 @@ case OP_MustBeInt: { /* jump, in1 */ } } } + VdbeBranchTaken(0, 2); MemSetTypeFlag(pIn1, MEM_Int); break; } @@ -84424,8 +86730,11 @@ case OP_MustBeInt: { /* jump, in1 */ */ case OP_RealAffinity: { /* in1 */ pIn1 = &aMem[pOp->p1]; - if( pIn1->flags & MEM_Int ){ + if( pIn1->flags & (MEM_Int|MEM_IntReal) ){ + testcase( pIn1->flags & MEM_Int ); + testcase( pIn1->flags & MEM_IntReal ); sqlite3VdbeMemRealify(pIn1); + REGISTER_TRACE(pOp->p1, pIn1); } break; } @@ -84457,9 +86766,11 @@ case OP_Cast: { /* in1 */ pIn1 = &aMem[pOp->p1]; memAboutToChange(p, pIn1); rc = ExpandBlob(pIn1); - sqlite3VdbeMemCast(pIn1, pOp->p2, encoding); - UPDATE_MAX_BLOBSIZE(pIn1); if( rc ) goto abort_due_to_error; + rc = sqlite3VdbeMemCast(pIn1, pOp->p2, encoding); + if( rc ) goto abort_due_to_error; + UPDATE_MAX_BLOBSIZE(pIn1); + REGISTER_TRACE(pOp->p1, pIn1); break; } #endif /* SQLITE_OMIT_CAST */ @@ -84582,15 +86893,15 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ ** OP_Eq or OP_Ne) then take the jump or not depending on whether ** or not both operands are null. */ - assert( pOp->opcode==OP_Eq || pOp->opcode==OP_Ne ); assert( (flags1 & MEM_Cleared)==0 ); - assert( (pOp->p5 & SQLITE_JUMPIFNULL)==0 ); + assert( (pOp->p5 & SQLITE_JUMPIFNULL)==0 || CORRUPT_DB ); + testcase( (pOp->p5 & SQLITE_JUMPIFNULL)!=0 ); if( (flags1&flags3&MEM_Null)!=0 && (flags3&MEM_Cleared)==0 ){ res = 0; /* Operands are equal */ }else{ - res = 1; /* Operands are not equal */ + res = ((flags3 & MEM_Null) ? -1 : +1); /* Operands are not equal */ } }else{ /* SQLITE_NULLEQ is clear and at least one operand is NULL, @@ -84616,17 +86927,12 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ affinity = pOp->p5 & SQLITE_AFF_MASK; if( affinity>=SQLITE_AFF_NUMERIC ){ if( (flags1 | flags3)&MEM_Str ){ - if( (flags1 & (MEM_Int|MEM_Real|MEM_Str))==MEM_Str ){ + if( (flags1 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ applyNumericAffinity(pIn1,0); - assert( flags3==pIn3->flags ); - /* testcase( flags3!=pIn3->flags ); - ** this used to be possible with pIn1==pIn3, but not since - ** the column cache was removed. The following assignment - ** is essentially a no-op. But, it provides defense-in-depth - ** in case our analysis is incorrect, so it is left in. */ + testcase( flags3!=pIn3->flags ); flags3 = pIn3->flags; } - if( (flags3 & (MEM_Int|MEM_Real|MEM_Str))==MEM_Str ){ + if( (flags3 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ applyNumericAffinity(pIn3,0); } } @@ -84639,17 +86945,19 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ goto compare_op; } }else if( affinity==SQLITE_AFF_TEXT ){ - if( (flags1 & MEM_Str)==0 && (flags1 & (MEM_Int|MEM_Real))!=0 ){ + if( (flags1 & MEM_Str)==0 && (flags1&(MEM_Int|MEM_Real|MEM_IntReal))!=0 ){ testcase( pIn1->flags & MEM_Int ); testcase( pIn1->flags & MEM_Real ); + testcase( pIn1->flags & MEM_IntReal ); sqlite3VdbeMemStringify(pIn1, encoding, 1); testcase( (flags1&MEM_Dyn) != (pIn1->flags&MEM_Dyn) ); flags1 = (pIn1->flags & ~MEM_TypeMask) | (flags1 & MEM_TypeMask); - assert( pIn1!=pIn3 ); + if( pIn1==pIn3 ) flags3 = flags1 | MEM_Str; } - if( (flags3 & MEM_Str)==0 && (flags3 & (MEM_Int|MEM_Real))!=0 ){ + if( (flags3 & MEM_Str)==0 && (flags3&(MEM_Int|MEM_Real|MEM_IntReal))!=0 ){ testcase( pIn3->flags & MEM_Int ); testcase( pIn3->flags & MEM_Real ); + testcase( pIn3->flags & MEM_IntReal ); sqlite3VdbeMemStringify(pIn3, encoding, 1); testcase( (flags3&MEM_Dyn) != (pIn3->flags&MEM_Dyn) ); flags3 = (pIn3->flags & ~MEM_TypeMask) | (flags3 & MEM_TypeMask); @@ -84679,10 +86987,10 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ } /* Undo any changes made by applyAffinity() to the input registers. */ - assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) ); - pIn1->flags = flags1; assert( (pIn3->flags & MEM_Dyn) == (flags3 & MEM_Dyn) ); pIn3->flags = flags3; + assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) ); + pIn1->flags = flags1; if( pOp->p5 & SQLITE_STOREP2 ){ pOut = &aMem[pOp->p2]; @@ -84708,7 +87016,7 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ pOut->u.i = res2; REGISTER_TRACE(pOp->p2, pOut); }else{ - VdbeBranchTaken(res!=0, (pOp->p5 & SQLITE_NULLEQ)?2:3); + VdbeBranchTaken(res2!=0, (pOp->p5 & SQLITE_NULLEQ)?2:3); if( res2 ){ goto jump_to_p2; } @@ -84718,16 +87026,31 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ /* Opcode: ElseNotEq * P2 * * * ** -** This opcode must immediately follow an OP_Lt or OP_Gt comparison operator. -** If result of an OP_Eq comparison on the same two operands -** would have be NULL or false (0), then then jump to P2. -** If the result of an OP_Eq comparison on the two previous operands -** would have been true (1), then fall through. +** This opcode must follow an OP_Lt or OP_Gt comparison operator. There +** can be zero or more OP_ReleaseReg opcodes intervening, but no other +** opcodes are allowed to occur between this instruction and the previous +** OP_Lt or OP_Gt. Furthermore, the prior OP_Lt or OP_Gt must have the +** SQLITE_STOREP2 bit set in the P5 field. +** +** If result of an OP_Eq comparison on the same two operands as the +** prior OP_Lt or OP_Gt would have been NULL or false (0), then then +** jump to P2. If the result of an OP_Eq comparison on the two previous +** operands would have been true (1), then fall through. */ case OP_ElseNotEq: { /* same as TK_ESCAPE, jump */ - assert( pOp>aOp ); - assert( pOp[-1].opcode==OP_Lt || pOp[-1].opcode==OP_Gt ); - assert( pOp[-1].p5 & SQLITE_STOREP2 ); + +#ifdef SQLITE_DEBUG + /* Verify the preconditions of this opcode - that it follows an OP_Lt or + ** OP_Gt with the SQLITE_STOREP2 flag set, with zero or more intervening + ** OP_ReleaseReg opcodes */ + int iAddr; + for(iAddr = (int)(pOp - aOp) - 1; ALWAYS(iAddr>=0); iAddr--){ + if( aOp[iAddr].opcode==OP_ReleaseReg ) continue; + assert( aOp[iAddr].opcode==OP_Lt || aOp[iAddr].opcode==OP_Gt ); + assert( aOp[iAddr].p5 & SQLITE_STOREP2 ); + break; + } +#endif /* SQLITE_DEBUG */ VdbeBranchTaken(iCompare!=0, 2); if( iCompare!=0 ) goto jump_to_p2; break; @@ -84819,9 +87142,14 @@ case OP_Compare: { REGISTER_TRACE(p2+idx, &aMem[p2+idx]); assert( inKeyField ); pColl = pKeyInfo->aColl[i]; - bRev = pKeyInfo->aSortOrder[i]; + bRev = (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_DESC); iCompare = sqlite3MemCompare(&aMem[p1+idx], &aMem[p2+idx], pColl); if( iCompare ){ + if( (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) + && ((aMem[p1+idx].flags & MEM_Null) || (aMem[p2+idx].flags & MEM_Null)) + ){ + iCompare = -iCompare; + } if( bRev ) iCompare = -iCompare; break; } @@ -85112,11 +87440,6 @@ case OP_Offset: { /* out3 */ ** if the P4 argument is a P4_MEM use the value of the P4 argument as ** the result. ** -** If the OPFLAG_CLEARCACHE bit is set on P5 and P1 is a pseudo-table cursor, -** then the cache of the cursor is reset prior to extracting the column. -** The first OP_Column against a pseudo-table after the value of the content -** register has changed should have this bit set. -** ** If the OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG bits are set on P5 then ** the result is guaranteed to only be used as the argument of a length() ** or typeof() function, respectively. The loading of large blobs can be @@ -85138,7 +87461,9 @@ case OP_Column: { u32 t; /* A type code from the record header */ Mem *pReg; /* PseudoTable input register */ + assert( pOp->p1>=0 && pOp->p1nCursor ); pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); p2 = pOp->p2; /* If the cursor cache is stale (meaning it is not currently point at @@ -85150,7 +87475,6 @@ case OP_Column: { assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); pDest = &aMem[pOp->p3]; memAboutToChange(p, pDest); - assert( pOp->p1>=0 && pOp->p1nCursor ); assert( pC!=0 ); assert( p2nField ); aOffset = pC->aOffset; @@ -85258,15 +87582,15 @@ case OP_Column: { zEndHdr = zData + aOffset[0]; testcase( zHdr>=zEndHdr ); do{ - if( (t = zHdr[0])<0x80 ){ + if( (pC->aType[i] = t = zHdr[0])<0x80 ){ zHdr++; offset64 += sqlite3VdbeOneByteSerialTypeLen(t); }else{ zHdr += sqlite3GetVarint32(zHdr, &t); + pC->aType[i] = t; offset64 += sqlite3VdbeSerialTypeLen(t); } - pC->aType[i++] = t; - aOffset[i] = (u32)(offset64 & 0xffffffff); + aOffset[++i] = (u32)(offset64 & 0xffffffff); }while( i<=p2 && zHdruc.pCursor, aOffset[p2], len, pDest); if( rc!=SQLITE_OK ) goto abort_due_to_error; @@ -85405,12 +87730,33 @@ case OP_Affinity: { assert( pOp->p2>0 ); assert( zAffinity[pOp->p2]==0 ); pIn1 = &aMem[pOp->p1]; - do{ + while( 1 /*exit-by-break*/ ){ assert( pIn1 <= &p->aMem[(p->nMem+1 - p->nCursor)] ); - assert( memIsValid(pIn1) ); - applyAffinity(pIn1, *(zAffinity++), encoding); + assert( zAffinity[0]==SQLITE_AFF_NONE || memIsValid(pIn1) ); + applyAffinity(pIn1, zAffinity[0], encoding); + if( zAffinity[0]==SQLITE_AFF_REAL && (pIn1->flags & MEM_Int)!=0 ){ + /* When applying REAL affinity, if the result is still an MEM_Int + ** that will fit in 6 bytes, then change the type to MEM_IntReal + ** so that we keep the high-resolution integer value but know that + ** the type really wants to be REAL. */ + testcase( pIn1->u.i==140737488355328LL ); + testcase( pIn1->u.i==140737488355327LL ); + testcase( pIn1->u.i==-140737488355328LL ); + testcase( pIn1->u.i==-140737488355329LL ); + if( pIn1->u.i<=140737488355327LL && pIn1->u.i>=-140737488355328LL ){ + pIn1->flags |= MEM_IntReal; + pIn1->flags &= ~MEM_Int; + }else{ + pIn1->u.r = (double)pIn1->u.i; + pIn1->flags |= MEM_Real; + pIn1->flags &= ~MEM_Int; + } + } + REGISTER_TRACE((int)(pIn1-aMem), pIn1); + zAffinity++; + if( zAffinity[0]==0 ) break; pIn1++; - }while( zAffinity[0] ); + } break; } @@ -85431,7 +87777,6 @@ case OP_Affinity: { ** If P4 is NULL then all index fields have the affinity BLOB. */ case OP_MakeRecord: { - u8 *zNewRecord; /* A buffer to hold the data for the new record */ Mem *pRec; /* The new record */ u64 nData; /* Number of bytes of data space */ int nHdr; /* Number of bytes of header space */ @@ -85444,9 +87789,9 @@ case OP_MakeRecord: { int nField; /* Number of fields in the record */ char *zAffinity; /* The affinity string for the record */ int file_format; /* File format to use for encoding */ - int i; /* Space used in zNewRecord[] header */ - int j; /* Space used in zNewRecord[] content */ u32 len; /* Length of a field */ + u8 *zHdr; /* Where to write next byte of the header */ + u8 *zPayload; /* Where to write next byte of the payload */ /* Assuming the record contains N fields, the record format looks ** like this: @@ -85485,7 +87830,14 @@ case OP_MakeRecord: { if( zAffinity ){ pRec = pData0; do{ - applyAffinity(pRec++, *(zAffinity++), encoding); + applyAffinity(pRec, zAffinity[0], encoding); + if( zAffinity[0]==SQLITE_AFF_REAL && (pRec->flags & MEM_Int) ){ + pRec->flags |= MEM_IntReal; + pRec->flags &= ~(MEM_Int); + } + REGISTER_TRACE((int)(pRec-aMem), pRec); + zAffinity++; + pRec++; assert( zAffinity[0]==0 || pRec<=pLast ); }while( zAffinity[0] ); } @@ -85505,14 +87857,36 @@ case OP_MakeRecord: { #endif /* Loop through the elements that will make up the record to figure - ** out how much space is required for the new record. + ** out how much space is required for the new record. After this loop, + ** the Mem.uTemp field of each term should hold the serial-type that will + ** be used for that term in the generated record: + ** + ** Mem.uTemp value type + ** --------------- --------------- + ** 0 NULL + ** 1 1-byte signed integer + ** 2 2-byte signed integer + ** 3 3-byte signed integer + ** 4 4-byte signed integer + ** 5 6-byte signed integer + ** 6 8-byte signed integer + ** 7 IEEE float + ** 8 Integer constant 0 + ** 9 Integer constant 1 + ** 10,11 reserved for expansion + ** N>=12 and even BLOB + ** N>=13 and odd text + ** + ** The following additional values are computed: + ** nHdr Number of bytes needed for the record header + ** nData Number of bytes of data space needed for the record + ** nZero Zero bytes at the end of the record */ pRec = pLast; do{ assert( memIsValid(pRec) ); - serial_type = sqlite3VdbeSerialType(pRec, file_format, &len); - if( pRec->flags & MEM_Zero ){ - if( serial_type==0 ){ + if( pRec->flags & MEM_Null ){ + if( pRec->flags & MEM_Zero ){ /* Values with MEM_Null and MEM_Zero are created by xColumn virtual ** table methods that never invoke sqlite3_result_xxxxx() while ** computing an unchanging column value in an UPDATE statement. @@ -85520,19 +87894,83 @@ case OP_MakeRecord: { ** so that they can be passed through to xUpdate and have ** a true sqlite3_value_nochange(). */ assert( pOp->p5==OPFLAG_NOCHNG_MAGIC || CORRUPT_DB ); - serial_type = 10; - }else if( nData ){ - if( sqlite3VdbeMemExpandBlob(pRec) ) goto no_mem; + pRec->uTemp = 10; + }else{ + pRec->uTemp = 0; + } + nHdr++; + }else if( pRec->flags & (MEM_Int|MEM_IntReal) ){ + /* Figure out whether to use 1, 2, 4, 6 or 8 bytes. */ + i64 i = pRec->u.i; + u64 uu; + testcase( pRec->flags & MEM_Int ); + testcase( pRec->flags & MEM_IntReal ); + if( i<0 ){ + uu = ~i; + }else{ + uu = i; + } + nHdr++; + testcase( uu==127 ); testcase( uu==128 ); + testcase( uu==32767 ); testcase( uu==32768 ); + testcase( uu==8388607 ); testcase( uu==8388608 ); + testcase( uu==2147483647 ); testcase( uu==2147483648 ); + testcase( uu==140737488355327LL ); testcase( uu==140737488355328LL ); + if( uu<=127 ){ + if( (i&1)==i && file_format>=4 ){ + pRec->uTemp = 8+(u32)uu; + }else{ + nData++; + pRec->uTemp = 1; + } + }else if( uu<=32767 ){ + nData += 2; + pRec->uTemp = 2; + }else if( uu<=8388607 ){ + nData += 3; + pRec->uTemp = 3; + }else if( uu<=2147483647 ){ + nData += 4; + pRec->uTemp = 4; + }else if( uu<=140737488355327LL ){ + nData += 6; + pRec->uTemp = 5; }else{ - nZero += pRec->u.nZero; - len -= pRec->u.nZero; + nData += 8; + if( pRec->flags & MEM_IntReal ){ + /* If the value is IntReal and is going to take up 8 bytes to store + ** as an integer, then we might as well make it an 8-byte floating + ** point value */ + pRec->u.r = (double)pRec->u.i; + pRec->flags &= ~MEM_IntReal; + pRec->flags |= MEM_Real; + pRec->uTemp = 7; + }else{ + pRec->uTemp = 6; + } + } + }else if( pRec->flags & MEM_Real ){ + nHdr++; + nData += 8; + pRec->uTemp = 7; + }else{ + assert( db->mallocFailed || pRec->flags&(MEM_Str|MEM_Blob) ); + assert( pRec->n>=0 ); + len = (u32)pRec->n; + serial_type = (len*2) + 12 + ((pRec->flags & MEM_Str)!=0); + if( pRec->flags & MEM_Zero ){ + serial_type += pRec->u.nZero*2; + if( nData ){ + if( sqlite3VdbeMemExpandBlob(pRec) ) goto no_mem; + len += pRec->u.nZero; + }else{ + nZero += pRec->u.nZero; + } } + nData += len; + nHdr += sqlite3VarintLen(serial_type); + pRec->uTemp = serial_type; } - nData += len; - testcase( serial_type==127 ); - testcase( serial_type==128 ); - nHdr += serial_type<=127 ? 1 : sqlite3VarintLen(serial_type); - pRec->uTemp = serial_type; if( pRec==pData0 ) break; pRec--; }while(1); @@ -85553,46 +87991,54 @@ case OP_MakeRecord: { if( nVarintdb->aLimit[SQLITE_LIMIT_LENGTH] ){ - goto too_big; - } /* Make sure the output register has a buffer large enough to store ** the new record. The output register (pOp->p3) is not allowed to ** be one of the input registers (because the following call to ** sqlite3VdbeMemClearAndResize() could clobber the value before it is used). */ - if( sqlite3VdbeMemClearAndResize(pOut, (int)nByte) ){ - goto no_mem; + if( nByte+nZero<=pOut->szMalloc ){ + /* The output register is already large enough to hold the record. + ** No error checks or buffer enlargement is required */ + pOut->z = pOut->zMalloc; + }else{ + /* Need to make sure that the output is not too big and then enlarge + ** the output register to hold the full result */ + if( nByte+nZero>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + goto too_big; + } + if( sqlite3VdbeMemClearAndResize(pOut, (int)nByte) ){ + goto no_mem; + } } - zNewRecord = (u8 *)pOut->z; + pOut->n = (int)nByte; + pOut->flags = MEM_Blob; + if( nZero ){ + pOut->u.nZero = nZero; + pOut->flags |= MEM_Zero; + } + UPDATE_MAX_BLOBSIZE(pOut); + zHdr = (u8 *)pOut->z; + zPayload = zHdr + nHdr; /* Write the record */ - i = putVarint32(zNewRecord, nHdr); - j = nHdr; + zHdr += putVarint32(zHdr, nHdr); assert( pData0<=pLast ); pRec = pData0; do{ serial_type = pRec->uTemp; /* EVIDENCE-OF: R-06529-47362 Following the size varint are one or more ** additional varints, one per column. */ - i += putVarint32(&zNewRecord[i], serial_type); /* serial type */ + zHdr += putVarint32(zHdr, serial_type); /* serial type */ /* EVIDENCE-OF: R-64536-51728 The values for each column in the record ** immediately follow the header. */ - j += sqlite3VdbeSerialPut(&zNewRecord[j], pRec, serial_type); /* content */ + zPayload += sqlite3VdbeSerialPut(zPayload, pRec, serial_type); /* content */ }while( (++pRec)<=pLast ); - assert( i==nHdr ); - assert( j==nByte ); + assert( nHdr==(int)(zHdr - (u8*)pOut->z) ); + assert( nByte==(int)(zPayload - (u8*)pOut->z) ); assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); - pOut->n = (int)nByte; - pOut->flags = MEM_Blob; - if( nZero ){ - pOut->u.nZero = nZero; - pOut->flags |= MEM_Zero; - } REGISTER_TRACE(pOp->p3, pOut); - UPDATE_MAX_BLOBSIZE(pOut); break; } @@ -85611,19 +88057,20 @@ case OP_Count: { /* out2 */ pCrsr = p->apCsr[pOp->p1]->uc.pCursor; assert( pCrsr ); nEntry = 0; /* Not needed. Only used to silence a warning. */ - rc = sqlite3BtreeCount(pCrsr, &nEntry); + rc = sqlite3BtreeCount(db, pCrsr, &nEntry); if( rc ) goto abort_due_to_error; pOut = out2Prerelease(p, pOp); pOut->u.i = nEntry; - break; + goto check_for_interrupt; } #endif /* Opcode: Savepoint P1 * * P4 * ** ** Open, release or rollback the savepoint named by parameter P4, depending -** on the value of P1. To open a new savepoint, P1==0. To release (commit) an -** existing savepoint, P1==1, or to rollback an existing savepoint P1==2. +** on the value of P1. To open a new savepoint set P1==0 (SAVEPOINT_BEGIN). +** To release (commit) an existing savepoint set P1==1 (SAVEPOINT_RELEASE). +** To rollback an existing savepoint set P1==2 (SAVEPOINT_ROLLBACK). */ case OP_Savepoint: { int p1; /* Value of P1 operand */ @@ -85691,6 +88138,7 @@ case OP_Savepoint: { } } }else{ + assert( p1==SAVEPOINT_RELEASE || p1==SAVEPOINT_ROLLBACK ); iSavepoint = 0; /* Find the named savepoint. If there is no such savepoint, then an @@ -85730,8 +88178,12 @@ case OP_Savepoint: { p->rc = rc = SQLITE_BUSY; goto vdbe_return; } - db->isTransactionSavepoint = 0; rc = p->rc; + if( rc ){ + db->autoCommit = 0; + }else{ + db->isTransactionSavepoint = 0; + } }else{ int isSchemaChange; iSavepoint = db->nSavepoint - iSavepoint - 1; @@ -85744,6 +88196,7 @@ case OP_Savepoint: { if( rc!=SQLITE_OK ) goto abort_due_to_error; } }else{ + assert( p1==SAVEPOINT_RELEASE ); isSchemaChange = 0; } for(ii=0; iinDb; ii++){ @@ -85758,6 +88211,7 @@ case OP_Savepoint: { db->mDbFlags |= DBFLAG_SchemaChange; } } + if( rc ) goto abort_due_to_error; /* Regardless of whether this is a RELEASE or ROLLBACK, destroy all ** savepoints nested inside of the savepoint being operated on. */ @@ -85780,6 +88234,7 @@ case OP_Savepoint: { db->nSavepoint--; } }else{ + assert( p1==SAVEPOINT_ROLLBACK ); db->nDeferredCons = pSavepoint->nDeferredCons; db->nDeferredImmCons = pSavepoint->nDeferredImmCons; } @@ -85839,7 +88294,6 @@ case OP_AutoCommit: { p->rc = rc = SQLITE_BUSY; goto vdbe_return; } - assert( db->nStatement==0 ); sqlite3CloseSavepoints(db); if( p->rc==SQLITE_OK ){ rc = SQLITE_DONE; @@ -85856,7 +88310,7 @@ case OP_AutoCommit: { rc = SQLITE_ERROR; goto abort_due_to_error; } - break; + /*NOTREACHED*/ assert(0); } /* Opcode: Transaction P1 P2 P3 P4 P5 @@ -85920,7 +88374,8 @@ case OP_Transaction: { goto abort_due_to_error; } - if( pOp->p2 && p->usesStmtJournal + if( p->usesStmtJournal + && pOp->p2 && (db->autoCommit==0 || db->nVdbeRead>1) ){ assert( sqlite3BtreeIsInTrans(pBt) ); @@ -86252,6 +88707,7 @@ case OP_OpenDup: { VdbeCursor *pCx; /* The new cursor */ pOrig = p->apCsr[pOp->p2]; + assert( pOrig ); assert( pOrig->pBtx!=0 ); /* Only ephemeral cursors can be duplicated */ pCx = allocateCursor(p, pOp->p1, pOrig->nField, -1, CURTYPE_BTREE); @@ -86260,7 +88716,9 @@ case OP_OpenDup: { pCx->isEphemeral = 1; pCx->pKeyInfo = pOrig->pKeyInfo; pCx->isTable = pOrig->isTable; - rc = sqlite3BtreeCursor(pOrig->pBtx, MASTER_ROOT, BTREE_WRCSR, + pCx->pgnoRoot = pOrig->pgnoRoot; + pCx->isOrdered = pOrig->isOrdered; + rc = sqlite3BtreeCursor(pOrig->pBtx, pCx->pgnoRoot, BTREE_WRCSR, pCx->pKeyInfo, pCx->uc.pCursor); /* The sqlite3BtreeCursor() routine can only fail for the first cursor ** opened for a database. Since there is already an open cursor when this @@ -86278,6 +88736,9 @@ case OP_OpenDup: { ** the main database is read-only. The ephemeral ** table is deleted automatically when the cursor is closed. ** +** If the cursor P1 is already opened on an ephemeral table, the table +** is cleared (all content is erased). +** ** P2 is the number of columns in the ephemeral table. ** The cursor points to a BTree table if P4==0 and to a BTree index ** if P4 is not 0. If P4 is not NULL, it points to a KeyInfo structure @@ -86309,41 +88770,53 @@ case OP_OpenEphemeral: { SQLITE_OPEN_TRANSIENT_DB; assert( pOp->p1>=0 ); assert( pOp->p2>=0 ); - pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_BTREE); - if( pCx==0 ) goto no_mem; - pCx->nullRow = 1; - pCx->isEphemeral = 1; - rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx, - BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags); - if( rc==SQLITE_OK ){ - rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1, 0); - } - if( rc==SQLITE_OK ){ - /* If a transient index is required, create it by calling - ** sqlite3BtreeCreateTable() with the BTREE_BLOBKEY flag before - ** opening it. If a transient table is required, just use the - ** automatically created table with root-page 1 (an BLOB_INTKEY table). - */ - if( (pCx->pKeyInfo = pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ - int pgno; - assert( pOp->p4type==P4_KEYINFO ); - rc = sqlite3BtreeCreateTable(pCx->pBtx, &pgno, BTREE_BLOBKEY | pOp->p5); - if( rc==SQLITE_OK ){ - assert( pgno==MASTER_ROOT+1 ); - assert( pKeyInfo->db==db ); - assert( pKeyInfo->enc==ENC(db) ); - rc = sqlite3BtreeCursor(pCx->pBtx, pgno, BTREE_WRCSR, - pKeyInfo, pCx->uc.pCursor); + pCx = p->apCsr[pOp->p1]; + if( pCx && pCx->pBtx ){ + /* If the ephermeral table is already open, erase all existing content + ** so that the table is empty again, rather than creating a new table. */ + assert( pCx->isEphemeral ); + pCx->seqCount = 0; + pCx->cacheStatus = CACHE_STALE; + rc = sqlite3BtreeClearTable(pCx->pBtx, pCx->pgnoRoot, 0); + }else{ + pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_BTREE); + if( pCx==0 ) goto no_mem; + pCx->isEphemeral = 1; + rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx, + BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, + vfsFlags); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1, 0); + } + if( rc==SQLITE_OK ){ + /* If a transient index is required, create it by calling + ** sqlite3BtreeCreateTable() with the BTREE_BLOBKEY flag before + ** opening it. If a transient table is required, just use the + ** automatically created table with root-page 1 (an BLOB_INTKEY table). + */ + if( (pCx->pKeyInfo = pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ + assert( pOp->p4type==P4_KEYINFO ); + rc = sqlite3BtreeCreateTable(pCx->pBtx, (int*)&pCx->pgnoRoot, + BTREE_BLOBKEY | pOp->p5); + if( rc==SQLITE_OK ){ + assert( pCx->pgnoRoot==MASTER_ROOT+1 ); + assert( pKeyInfo->db==db ); + assert( pKeyInfo->enc==ENC(db) ); + rc = sqlite3BtreeCursor(pCx->pBtx, pCx->pgnoRoot, BTREE_WRCSR, + pKeyInfo, pCx->uc.pCursor); + } + pCx->isTable = 0; + }else{ + pCx->pgnoRoot = MASTER_ROOT; + rc = sqlite3BtreeCursor(pCx->pBtx, MASTER_ROOT, BTREE_WRCSR, + 0, pCx->uc.pCursor); + pCx->isTable = 1; } - pCx->isTable = 0; - }else{ - rc = sqlite3BtreeCursor(pCx->pBtx, MASTER_ROOT, BTREE_WRCSR, - 0, pCx->uc.pCursor); - pCx->isTable = 1; } + pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); } if( rc ) goto abort_due_to_error; - pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); + pCx->nullRow = 1; break; } @@ -86572,7 +89045,10 @@ case OP_SeekGT: { /* jump, in3, group */ pC->seekOp = pOp->opcode; #endif + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; if( pC->isTable ){ + u16 flags3, newType; /* The BTREE_SEEK_EQ flag is only set on index cursors */ assert( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ)==0 || CORRUPT_DB ); @@ -86581,20 +89057,27 @@ case OP_SeekGT: { /* jump, in3, group */ ** blob, or NULL. But it needs to be an integer before we can do ** the seek, so convert it. */ pIn3 = &aMem[pOp->p3]; - if( (pIn3->flags & (MEM_Int|MEM_Real|MEM_Str))==MEM_Str ){ + flags3 = pIn3->flags; + if( (flags3 & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Str))==MEM_Str ){ applyNumericAffinity(pIn3, 0); } - iKey = sqlite3VdbeIntValue(pIn3); + iKey = sqlite3VdbeIntValue(pIn3); /* Get the integer key value */ + newType = pIn3->flags; /* Record the type after applying numeric affinity */ + pIn3->flags = flags3; /* But convert the type back to its original */ /* If the P3 value could not be converted into an integer without ** loss of information, then special processing is required... */ - if( (pIn3->flags & MEM_Int)==0 ){ - if( (pIn3->flags & MEM_Real)==0 ){ - /* If the P3 value cannot be converted into any kind of a number, - ** then the seek is not possible, so jump to P2 */ - VdbeBranchTaken(1,2); goto jump_to_p2; - break; - } + if( (newType & (MEM_Int|MEM_IntReal))==0 ){ + if( (newType & MEM_Real)==0 ){ + if( (newType & MEM_Null) || oc>=OP_SeekGE ){ + VdbeBranchTaken(1,2); + goto jump_to_p2; + }else{ + rc = sqlite3BtreeLast(pC->uc.pCursor, &res); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + goto seek_not_found; + } + }else /* If the approximation iKey is larger than the actual real search ** term, substitute >= for > and < for <=. e.g. if the search term @@ -86618,7 +89101,7 @@ case OP_SeekGT: { /* jump, in3, group */ assert( (OP_SeekLT & 0x0001)==(OP_SeekGE & 0x0001) ); if( (oc & 0x0001)==(OP_SeekLT & 0x0001) ) oc++; } - } + } rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, 0, (u64)iKey, 0, &res); pC->movetoTarget = iKey; /* Used by OP_Delete */ if( rc!=SQLITE_OK ){ @@ -86672,8 +89155,6 @@ case OP_SeekGT: { /* jump, in3, group */ goto seek_not_found; } } - pC->deferredMoveto = 0; - pC->cacheStatus = CACHE_STALE; #ifdef SQLITE_TEST sqlite3_search_count++; #endif @@ -86728,7 +89209,7 @@ case OP_SeekGT: { /* jump, in3, group */ ** Synopsis: seekHit=P2 ** ** Set the seekHit flag on cursor P1 to the value in P2. -** The seekHit flag is used by the IfNoHope opcode. +* The seekHit flag is used by the IfNoHope opcode. ** ** P1 must be a valid b-tree cursor. P2 must be a boolean value, ** either 0 or 1. @@ -86743,6 +89224,20 @@ case OP_SeekHit: { break; } +/* Opcode: IfNotOpen P1 P2 * * * +** Synopsis: if( !csr[P1] ) goto P2 +** +** If cursor P1 is not open, jump to instruction P2. Otherwise, fall through. +*/ +case OP_IfNotOpen: { /* jump */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + VdbeBranchTaken(p->apCsr[pOp->p1]==0, 2); + if( !p->apCsr[pOp->p1] ){ + goto jump_to_p2_and_check_for_interrupt; + } + break; +} + /* Opcode: Found P1 P2 P3 P4 * ** Synopsis: key=r[P3@P4] ** @@ -86973,34 +89468,39 @@ case OP_SeekRowid: { /* jump, in3 */ u64 iKey; pIn3 = &aMem[pOp->p3]; - if( (pIn3->flags & MEM_Int)==0 ){ - /* Make sure pIn3->u.i contains a valid integer representation of - ** the key value, but do not change the datatype of the register, as - ** other parts of the perpared statement might be depending on the - ** current datatype. */ - u16 origFlags = pIn3->flags; - int isNotInt; - applyAffinity(pIn3, SQLITE_AFF_NUMERIC, encoding); - isNotInt = (pIn3->flags & MEM_Int)==0; - pIn3->flags = origFlags; - if( isNotInt ) goto jump_to_p2; + testcase( pIn3->flags & MEM_Int ); + testcase( pIn3->flags & MEM_IntReal ); + testcase( pIn3->flags & MEM_Real ); + testcase( (pIn3->flags & (MEM_Str|MEM_Int))==MEM_Str ); + if( (pIn3->flags & (MEM_Int|MEM_IntReal))==0 ){ + /* If pIn3->u.i does not contain an integer, compute iKey as the + ** integer value of pIn3. Jump to P2 if pIn3 cannot be converted + ** into an integer without loss of information. Take care to avoid + ** changing the datatype of pIn3, however, as it is used by other + ** parts of the prepared statement. */ + Mem x = pIn3[0]; + applyAffinity(&x, SQLITE_AFF_NUMERIC, encoding); + if( (x.flags & MEM_Int)==0 ) goto jump_to_p2; + iKey = x.u.i; + goto notExistsWithKey; } /* Fall through into OP_NotExists */ case OP_NotExists: /* jump, in3 */ pIn3 = &aMem[pOp->p3]; assert( (pIn3->flags & MEM_Int)!=0 || pOp->opcode==OP_SeekRowid ); assert( pOp->p1>=0 && pOp->p1nCursor ); + iKey = pIn3->u.i; +notExistsWithKey: pC = p->apCsr[pOp->p1]; assert( pC!=0 ); #ifdef SQLITE_DEBUG - pC->seekOp = OP_SeekRowid; + if( pOp->opcode==OP_SeekRowid ) pC->seekOp = OP_SeekRowid; #endif assert( pC->isTable ); assert( pC->eCurType==CURTYPE_BTREE ); pCrsr = pC->uc.pCursor; assert( pCrsr!=0 ); res = 0; - iKey = pIn3->u.i; rc = sqlite3BtreeMovetoUnpacked(pCrsr, 0, iKey, 0, &res); assert( rc==SQLITE_OK || res==0 ); pC->movetoTarget = iKey; /* Used by OP_Delete */ @@ -87211,14 +89711,7 @@ case OP_NewRowid: { /* out2 */ ** This instruction only works on tables. The equivalent instruction ** for indices is OP_IdxInsert. */ -/* Opcode: InsertInt P1 P2 P3 P4 P5 -** Synopsis: intkey=P3 data=r[P2] -** -** This works exactly like OP_Insert except that the key is the -** integer value P3, not the value of the integer stored in register P3. -*/ -case OP_Insert: -case OP_InsertInt: { +case OP_Insert: { Mem *pData; /* MEM cell holding data for the record to be inserted */ Mem *pKey; /* MEM cell holding key for the record */ VdbeCursor *pC; /* Cursor to table into which insert is written */ @@ -87233,22 +89726,18 @@ case OP_InsertInt: { pC = p->apCsr[pOp->p1]; assert( pC!=0 ); assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->deferredMoveto==0 ); assert( pC->uc.pCursor!=0 ); assert( (pOp->p5 & OPFLAG_ISNOOP) || pC->isTable ); assert( pOp->p4type==P4_TABLE || pOp->p4type>=P4_STATIC ); REGISTER_TRACE(pOp->p2, pData); sqlite3VdbeIncrWriteCounter(p, pC); - if( pOp->opcode==OP_Insert ){ - pKey = &aMem[pOp->p3]; - assert( pKey->flags & MEM_Int ); - assert( memIsValid(pKey) ); - REGISTER_TRACE(pOp->p3, pKey); - x.nKey = pKey->u.i; - }else{ - assert( pOp->opcode==OP_InsertInt ); - x.nKey = pOp->p3; - } + pKey = &aMem[pOp->p3]; + assert( pKey->flags & MEM_Int ); + assert( memIsValid(pKey) ); + REGISTER_TRACE(pOp->p3, pKey); + x.nKey = pKey->u.i; if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){ assert( pC->iDb>=0 ); @@ -87355,12 +89844,16 @@ case OP_Delete: { sqlite3VdbeIncrWriteCounter(p, pC); #ifdef SQLITE_DEBUG - if( pOp->p4type==P4_TABLE && HasRowid(pOp->p4.pTab) && pOp->p5==0 ){ + if( pOp->p4type==P4_TABLE + && HasRowid(pOp->p4.pTab) + && pOp->p5==0 + && sqlite3BtreeCursorIsValidNN(pC->uc.pCursor) + ){ /* If p5 is zero, the seek operation that positioned the cursor prior to ** OP_Delete will have also set the pC->movetoTarget field to the rowid of ** the row that is being deleted */ i64 iKey = sqlite3BtreeIntegerKey(pC->uc.pCursor); - assert( pC->movetoTarget==iKey ); + assert( CORRUPT_DB || pC->movetoTarget==iKey ); } #endif @@ -87768,7 +90261,7 @@ case OP_Sort: { /* jump */ p->aCounter[SQLITE_STMTSTATUS_SORT]++; /* Fall through into OP_Rewind */ } -/* Opcode: Rewind P1 P2 * * P5 +/* Opcode: Rewind P1 P2 * * * ** ** The next use of the Rowid or Column or Next instruction for P1 ** will refer to the first entry in the database table or index. @@ -87776,10 +90269,6 @@ case OP_Sort: { /* jump */ ** If the table or index is not empty, fall through to the following ** instruction. ** -** If P5 is non-zero and the table is not empty, then the "skip-next" -** flag is set on the cursor so that the next OP_Next instruction -** executed on it is a no-op. -** ** This opcode leaves the cursor configured to move in forward order, ** from the beginning toward the end. In other words, the cursor is ** configured to use Next, not Prev. @@ -87790,6 +90279,7 @@ case OP_Rewind: { /* jump */ int res; assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p5==0 ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); assert( isSorter(pC)==(pOp->opcode==OP_SorterSort) ); @@ -87804,9 +90294,6 @@ case OP_Rewind: { /* jump */ pCrsr = pC->uc.pCursor; assert( pCrsr ); rc = sqlite3BtreeFirst(pCrsr, &res); -#ifndef SQLITE_OMIT_WINDOWFUNC - if( pOp->p5 ) sqlite3BtreeSkipNext(pCrsr); -#endif pC->deferredMoveto = 0; pC->cacheStatus = CACHE_STALE; } @@ -87900,11 +90387,12 @@ case OP_Next: /* jump */ ** The Prev opcode is only used after SeekLT, SeekLE, and Last. */ assert( pOp->opcode!=OP_Next || pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE - || pC->seekOp==OP_Rewind || pC->seekOp==OP_Found - || pC->seekOp==OP_NullRow); + || pC->seekOp==OP_Rewind || pC->seekOp==OP_Found + || pC->seekOp==OP_NullRow|| pC->seekOp==OP_SeekRowid + || pC->seekOp==OP_IfNoHope); assert( pOp->opcode!=OP_Prev || pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE - || pC->seekOp==OP_Last + || pC->seekOp==OP_Last || pC->seekOp==OP_IfNoHope || pC->seekOp==OP_NullRow); rc = pOp->p4.xAdvance(pC->uc.pCursor, pOp->p3); @@ -88116,6 +90604,24 @@ case OP_IdxRowid: { /* out2 */ break; } +/* Opcode: FinishSeek P1 * * * * +** +** If cursor P1 was previously moved via OP_DeferredSeek, complete that +** seek operation now, without further delay. If the cursor seek has +** already occurred, this instruction is a no-op. +*/ +case OP_FinishSeek: { + VdbeCursor *pC; /* The P1 index cursor */ + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + if( pC->deferredMoveto ){ + rc = sqlite3VdbeFinishMoveto(pC); + if( rc ) goto abort_due_to_error; + } + break; +} + /* Opcode: IdxGE P1 P2 P3 P4 P5 ** Synopsis: key=r[P3@P4] ** @@ -88419,11 +90925,11 @@ case OP_ParseSchema: { { zMaster = MASTER_NAME; initData.db = db; - initData.iDb = pOp->p1; + initData.iDb = iDb; initData.pzErrMsg = &p->zErrMsg; initData.mInitFlags = 0; zSql = sqlite3MPrintf(db, - "SELECT name, rootpage, sql FROM '%q'.%s WHERE %s ORDER BY rowid", + "SELECT*FROM\"%w\".%s WHERE %s ORDER BY rowid", db->aDb[iDb].zDbSName, zMaster, pOp->p4.z); if( zSql==0 ){ rc = SQLITE_NOMEM_BKPT; @@ -88431,9 +90937,16 @@ case OP_ParseSchema: { assert( db->init.busy==0 ); db->init.busy = 1; initData.rc = SQLITE_OK; + initData.nInitRow = 0; assert( !db->mallocFailed ); rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0); if( rc==SQLITE_OK ) rc = initData.rc; + if( rc==SQLITE_OK && initData.nInitRow==0 ){ + /* The OP_ParseSchema opcode with a non-NULL P4 argument should parse + ** at least one SQL statement. Any less than that indicates that + ** the sqlite_master table is corrupt. */ + rc = SQLITE_CORRUPT_BKPT; + } sqlite3DbFreeNN(db, zSql); db->init.busy = 0; } @@ -88545,7 +91058,7 @@ case OP_IntegrityCk: { pIn1 = &aMem[pOp->p1]; assert( pOp->p5nDb ); assert( DbMaskTest(p->btreeMask, pOp->p5) ); - z = sqlite3BtreeIntegrityCheck(db->aDb[pOp->p5].pBt, &aRoot[1], nRoot, + z = sqlite3BtreeIntegrityCheck(db, db->aDb[pOp->p5].pBt, &aRoot[1], nRoot, (int)pnErr->u.i+1, &nErr); sqlite3VdbeMemSetNull(pIn1); if( nErr==0 ){ @@ -88558,7 +91071,7 @@ case OP_IntegrityCk: { } UPDATE_MAX_BLOBSIZE(pIn1); sqlite3VdbeChangeEncoding(pIn1, encoding); - break; + goto check_for_interrupt; } #endif /* SQLITE_OMIT_INTEGRITY_CHECK */ @@ -88796,10 +91309,20 @@ case OP_Program: { /* jump */ p->nOp = pProgram->nOp; #ifdef SQLITE_ENABLE_STMT_SCANSTATUS p->anExec = 0; +#endif +#ifdef SQLITE_DEBUG + /* Verify that second and subsequent executions of the same trigger do not + ** try to reuse register values from the first use. */ + { + int i; + for(i=0; inMem; i++){ + aMem[i].pScopyFrom = 0; /* Prevent false-positive AboutToChange() errs */ + aMem[i].flags |= MEM_Undefined; /* Cause a fault if this reg is reused */ + } + } #endif pOp = &aOp[-1]; - - break; + goto check_for_interrupt; } /* Opcode: Param P1 P2 * * * @@ -89171,6 +91694,7 @@ case OP_AggFinal: { assert( (pMem->flags & ~(MEM_Null|MEM_Agg))==0 ); #ifndef SQLITE_OMIT_WINDOWFUNC if( pOp->p3 ){ + memAboutToChange(p, &aMem[pOp->p3]); rc = sqlite3VdbeMemAggValue(pMem, &aMem[pOp->p3], pOp->p4.pFunc); pMem = &aMem[pOp->p3]; }else @@ -89335,14 +91859,19 @@ case OP_JournalMode: { /* out2 */ #endif /* SQLITE_OMIT_PRAGMA */ #if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH) -/* Opcode: Vacuum P1 * * * * +/* Opcode: Vacuum P1 P2 * * * ** ** Vacuum the entire database P1. P1 is 0 for "main", and 2 or more ** for an attached database. The "temp" database may not be vacuumed. +** +** If P2 is not zero, then it is a register holding a string which is +** the file into which the result of vacuum should be written. When +** P2 is zero, the vacuum overwrites the original database. */ case OP_Vacuum: { assert( p->readOnly==0 ); - rc = sqlite3RunVacuum(&p->zErrMsg, db, pOp->p1); + rc = sqlite3RunVacuum(&p->zErrMsg, db, pOp->p1, + pOp->p2 ? &aMem[pOp->p2] : 0); if( rc ) goto abort_due_to_error; break; } @@ -89399,6 +91928,36 @@ case OP_Expire: { break; } +/* Opcode: CursorLock P1 * * * * +** +** Lock the btree to which cursor P1 is pointing so that the btree cannot be +** written by an other cursor. +*/ +case OP_CursorLock: { + VdbeCursor *pC; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + sqlite3BtreeCursorPin(pC->uc.pCursor); + break; +} + +/* Opcode: CursorUnlock P1 * * * * +** +** Unlock the btree to which cursor P1 is pointing so that it can be +** written by other cursors. +*/ +case OP_CursorUnlock: { + VdbeCursor *pC; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + sqlite3BtreeCursorUnpin(pC->uc.pCursor); + break; +} + #ifndef SQLITE_OMIT_SHARED_CACHE /* Opcode: TableLock P1 P2 P3 P4 * ** Synopsis: iDb=P1 root=P2 write=P3 @@ -89494,6 +92053,7 @@ case OP_VDestroy: { db->nVDestroy++; rc = sqlite3VtabCallDestroy(db, pOp->p1, pOp->p4.z); db->nVDestroy--; + assert( p->errorAction==OE_Abort && p->usesStmtJournal ); if( rc ) goto abort_due_to_error; break; } @@ -89616,10 +92176,11 @@ case OP_VFilter: { /* jump */ ** ** If the VColumn opcode is being used to fetch the value of ** an unchanging column during an UPDATE operation, then the P5 -** value is 1. Otherwise, P5 is 0. The P5 value is returned -** by sqlite3_vtab_nochange() routine and can be used -** by virtual table implementations to return special "no-change" -** marks which can be more efficient, depending on the virtual table. +** value is OPFLAG_NOCHNG. This will cause the sqlite3_vtab_nochange() +** function to return true inside the xColumn method of the virtual +** table implementation. The P5 column might also contain other +** bits (OPFLAG_LENGTHARG or OPFLAG_TYPEOFARG) but those bits are +** unused by OP_VColumn. */ case OP_VColumn: { sqlite3_vtab *pVtab; @@ -89641,7 +92202,8 @@ case OP_VColumn: { assert( pModule->xColumn ); memset(&sContext, 0, sizeof(sContext)); sContext.pOut = pDest; - if( pOp->p5 ){ + assert( pOp->p5==OPFLAG_NOCHNG || pOp->p5==0 ); + if( pOp->p5 & OPFLAG_NOCHNG ){ sqlite3VdbeMemSetNull(pDest); pDest->flags = MEM_Null|MEM_Zero; pDest->u.nZero = 0; @@ -89735,7 +92297,7 @@ case OP_VRename: { rc = sqlite3VdbeChangeEncoding(pName, SQLITE_UTF8); if( rc ) goto abort_due_to_error; rc = pVtab->pModule->xRename(pVtab, pName->z); - if( isLegacy==0 ) db->flags &= ~SQLITE_LegacyAlter; + if( isLegacy==0 ) db->flags &= ~(u64)SQLITE_LegacyAlter; sqlite3VtabImportErrmsg(p, pVtab); p->expired = 0; if( rc ) goto abort_due_to_error; @@ -89865,13 +92427,15 @@ case OP_MaxPgcnt: { /* out2 */ } #endif -/* Opcode: Function0 P1 P2 P3 P4 P5 +/* Opcode: Function P1 P2 P3 P4 * ** Synopsis: r[P3]=func(r[P2@P5]) ** -** Invoke a user function (P4 is a pointer to a FuncDef object that -** defines the function) with P5 arguments taken from register P2 and -** successors. The result of the function is stored in register P3. -** Register P3 must not be one of the function inputs. +** Invoke a user function (P4 is a pointer to an sqlite3_context object that +** contains a pointer to the function to be run) with arguments taken +** from register P2 and successors. The number of arguments is in +** the sqlite3_context object that P4 points to. +** The result of the function is stored +** in register P3. Register P3 must not be one of the function inputs. ** ** P1 is a 32-bit bitmask indicating whether or not each argument to the ** function was determined to be constant at compile time. If the first @@ -89880,14 +92444,16 @@ case OP_MaxPgcnt: { /* out2 */ ** sqlite3_set_auxdata() API may be safely retained until the next ** invocation of this opcode. ** -** See also: Function, AggStep, AggFinal +** See also: AggStep, AggFinal, PureFunc */ -/* Opcode: Function P1 P2 P3 P4 P5 +/* Opcode: PureFunc P1 P2 P3 P4 * ** Synopsis: r[P3]=func(r[P2@P5]) ** ** Invoke a user function (P4 is a pointer to an sqlite3_context object that -** contains a pointer to the function to be run) with P5 arguments taken -** from register P2 and successors. The result of the function is stored +** contains a pointer to the function to be run) with arguments taken +** from register P2 and successors. The number of arguments is in +** the sqlite3_context object that P4 points to. +** The result of the function is stored ** in register P3. Register P3 must not be one of the function inputs. ** ** P1 is a 32-bit bitmask indicating whether or not each argument to the @@ -89897,40 +92463,16 @@ case OP_MaxPgcnt: { /* out2 */ ** sqlite3_set_auxdata() API may be safely retained until the next ** invocation of this opcode. ** -** SQL functions are initially coded as OP_Function0 with P4 pointing -** to a FuncDef object. But on first evaluation, the P4 operand is -** automatically converted into an sqlite3_context object and the operation -** changed to this OP_Function opcode. In this way, the initialization of -** the sqlite3_context object occurs only once, rather than once for each -** evaluation of the function. +** This opcode works exactly like OP_Function. The only difference is in +** its name. This opcode is used in places where the function must be +** purely non-deterministic. Some built-in date/time functions can be +** either determinitic of non-deterministic, depending on their arguments. +** When those function are used in a non-deterministic way, they will check +** to see if they were called using OP_PureFunc instead of OP_Function, and +** if they were, they throw an error. ** -** See also: Function0, AggStep, AggFinal +** See also: AggStep, AggFinal, Function */ -case OP_PureFunc0: /* group */ -case OP_Function0: { /* group */ - int n; - sqlite3_context *pCtx; - - assert( pOp->p4type==P4_FUNCDEF ); - n = pOp->p5; - assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); - assert( n==0 || (pOp->p2>0 && pOp->p2+n<=(p->nMem+1 - p->nCursor)+1) ); - assert( pOp->p3p2 || pOp->p3>=pOp->p2+n ); - pCtx = sqlite3DbMallocRawNN(db, sizeof(*pCtx) + (n-1)*sizeof(sqlite3_value*)); - if( pCtx==0 ) goto no_mem; - pCtx->pOut = 0; - pCtx->pFunc = pOp->p4.pFunc; - pCtx->iOp = (int)(pOp - aOp); - pCtx->pVdbe = p; - pCtx->isError = 0; - pCtx->argc = n; - pOp->p4type = P4_FUNCCTX; - pOp->p4.pCtx = pCtx; - assert( OP_PureFunc == OP_PureFunc0+2 ); - assert( OP_Function == OP_Function0+2 ); - pOp->opcode += 2; - /* Fall through into OP_Function */ -} case OP_PureFunc: /* group */ case OP_Function: { /* group */ int i; @@ -89945,9 +92487,11 @@ case OP_Function: { /* group */ ** reinitializes the relavant parts of the sqlite3_context object */ pOut = &aMem[pOp->p3]; if( pCtx->pOut != pOut ){ + pCtx->pVdbe = p; pCtx->pOut = pOut; for(i=pCtx->argc-1; i>=0; i--) pCtx->argv[i] = &aMem[pOp->p2+i]; } + assert( pCtx->pVdbe==p ); memAboutToChange(p, pOut); #ifdef SQLITE_DEBUG @@ -90119,6 +92663,55 @@ case OP_Abortable: { } #endif +#ifdef SQLITE_DEBUG +/* Opcode: ReleaseReg P1 P2 P3 * P5 +** Synopsis: release r[P1@P2] mask P3 +** +** Release registers from service. Any content that was in the +** the registers is unreliable after this opcode completes. +** +** The registers released will be the P2 registers starting at P1, +** except if bit ii of P3 set, then do not release register P1+ii. +** In other words, P3 is a mask of registers to preserve. +** +** Releasing a register clears the Mem.pScopyFrom pointer. That means +** that if the content of the released register was set using OP_SCopy, +** a change to the value of the source register for the OP_SCopy will no longer +** generate an assertion fault in sqlite3VdbeMemAboutToChange(). +** +** If P5 is set, then all released registers have their type set +** to MEM_Undefined so that any subsequent attempt to read the released +** register (before it is reinitialized) will generate an assertion fault. +** +** P5 ought to be set on every call to this opcode. +** However, there are places in the code generator will release registers +** before their are used, under the (valid) assumption that the registers +** will not be reallocated for some other purpose before they are used and +** hence are safe to release. +** +** This opcode is only available in testing and debugging builds. It is +** not generated for release builds. The purpose of this opcode is to help +** validate the generated bytecode. This opcode does not actually contribute +** to computing an answer. +*/ +case OP_ReleaseReg: { + Mem *pMem; + int i; + u32 constMask; + assert( pOp->p1>0 ); + assert( pOp->p1+pOp->p2<=(p->nMem+1 - p->nCursor)+1 ); + pMem = &aMem[pOp->p1]; + constMask = pOp->p3; + for(i=0; ip2; i++, pMem++){ + if( i>=32 || (constMask & MASKBIT32(i))==0 ){ + pMem->pScopyFrom = 0; + if( i<32 && pOp->p5 ) MemSetTypeFlag(pMem, MEM_Undefined); + } + } + break; +} +#endif + /* Opcode: Noop * * * * * ** ** Do nothing. This instruction is often useful as a jump @@ -90170,6 +92763,12 @@ default: { /* This is really OP_Noop, OP_Explain */ if( opProperty & OPFLG_OUT3 ){ registerTrace(pOrigOp->p3, &aMem[pOrigOp->p3]); } + if( opProperty==0xff ){ + /* Never happens. This code exists to avoid a harmless linkage + ** warning aboud sqlite3VdbeRegisterDump() being defined but not + ** used. */ + sqlite3VdbeRegisterDump(p); + } } #endif /* SQLITE_DEBUG */ #endif /* NDEBUG */ @@ -90200,7 +92799,16 @@ default: { /* This is really OP_Noop, OP_Explain */ ** release the mutexes on btrees that were acquired at the ** top. */ vdbe_return: - testcase( nVmStep>0 ); +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + while( nVmStep>=nProgressLimit && db->xProgress!=0 ){ + nProgressLimit += db->nProgressOps; + if( db->xProgress(db->pProgressArg) ){ + nProgressLimit = 0xffffffff; + rc = SQLITE_INTERRUPT; + goto abort_due_to_error; + } + } +#endif p->aCounter[SQLITE_STMTSTATUS_VM_STEP] += (int)nVmStep; sqlite3VdbeLeave(p); assert( rc!=SQLITE_OK || nExtraDelete==0 @@ -90595,11 +93203,12 @@ SQLITE_API int sqlite3_blob_close(sqlite3_blob *pBlob){ sqlite3 *db; if( p ){ + sqlite3_stmt *pStmt = p->pStmt; db = p->db; sqlite3_mutex_enter(db->mutex); - rc = sqlite3_finalize(p->pStmt); sqlite3DbFree(db, p); sqlite3_mutex_leave(db->mutex); + rc = sqlite3_finalize(pStmt); }else{ rc = SQLITE_OK; } @@ -91287,7 +93896,7 @@ static int vdbePmaReadBlob( /* Extend the p->aAlloc[] allocation if required. */ if( p->nAllocnAlloc*2); + sqlite3_int64 nNew = MAX(128, 2*(sqlite3_int64)p->nAlloc); while( nByte>nNew ) nNew = nNew*2; aNew = sqlite3Realloc(p->aAlloc, nNew); if( !aNew ) return SQLITE_NOMEM_BKPT; @@ -91579,7 +94188,8 @@ static int vdbeSorterCompareText( ); } }else{ - if( pTask->pSorter->pKeyInfo->aSortOrder[0] ){ + assert( !(pTask->pSorter->pKeyInfo->aSortFlags[0]&KEYINFO_ORDER_BIGNULL) ); + if( pTask->pSorter->pKeyInfo->aSortFlags[0] ){ res = res * -1; } } @@ -91647,7 +94257,8 @@ static int vdbeSorterCompareInt( pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2 ); } - }else if( pTask->pSorter->pKeyInfo->aSortOrder[0] ){ + }else if( pTask->pSorter->pKeyInfo->aSortFlags[0] ){ + assert( !(pTask->pSorter->pKeyInfo->aSortFlags[0]&KEYINFO_ORDER_BIGNULL) ); res = res * -1; } @@ -91762,6 +94373,7 @@ SQLITE_PRIVATE int sqlite3VdbeSorterInit( if( pKeyInfo->nAllField<13 && (pKeyInfo->aColl[0]==0 || pKeyInfo->aColl[0]==db->pDfltColl) + && (pKeyInfo->aSortFlags[0] & KEYINFO_ORDER_BIGNULL)==0 ){ pSorter->typeMask = SORTER_TYPE_INTEGER | SORTER_TYPE_TEXT; } @@ -92143,20 +94755,16 @@ static SorterCompare vdbeSorterGetCompare(VdbeSorter *p){ */ static int vdbeSorterSort(SortSubtask *pTask, SorterList *pList){ int i; - SorterRecord **aSlot; SorterRecord *p; int rc; + SorterRecord *aSlot[64]; rc = vdbeSortAllocUnpacked(pTask); if( rc!=SQLITE_OK ) return rc; p = pList->pList; pTask->xCompare = vdbeSorterGetCompare(pTask->pSorter); - - aSlot = (SorterRecord **)sqlite3MallocZero(64 * sizeof(SorterRecord *)); - if( !aSlot ){ - return SQLITE_NOMEM_BKPT; - } + memset(aSlot, 0, sizeof(aSlot)); while( p ){ SorterRecord *pNext; @@ -92181,13 +94789,12 @@ static int vdbeSorterSort(SortSubtask *pTask, SorterList *pList){ } p = 0; - for(i=0; i<64; i++){ + for(i=0; ipList = p; - sqlite3_free(aSlot); assert( pTask->pUnpacked->errCode==SQLITE_OK || pTask->pUnpacked->errCode==SQLITE_NOMEM ); @@ -92478,13 +95085,16 @@ static int vdbeSorterFlushPMA(VdbeSorter *pSorter){ rc = vdbeSorterListToPMA(&pSorter->aTask[nWorker], &pSorter->list); }else{ /* Launch a background thread for this operation */ - u8 *aMem = pTask->list.aMemory; - void *pCtx = (void*)pTask; + u8 *aMem; + void *pCtx; + assert( pTask!=0 ); assert( pTask->pThread==0 && pTask->bDone==0 ); assert( pTask->list.pList==0 ); assert( pTask->list.aMemory==0 || pSorter->list.aMemory!=0 ); + aMem = pTask->list.aMemory; + pCtx = (void*)pTask; pSorter->iPrev = (u8)(pTask - pSorter->aTask); pTask->list = pSorter->list; pSorter->list.pList = 0; @@ -92578,15 +95188,19 @@ SQLITE_PRIVATE int sqlite3VdbeSorterWrite( if( nMin>pSorter->nMemory ){ u8 *aNew; - int iListOff = (u8*)pSorter->list.pList - pSorter->list.aMemory; - int nNew = pSorter->nMemory * 2; + sqlite3_int64 nNew = 2 * (sqlite3_int64)pSorter->nMemory; + int iListOff = -1; + if( pSorter->list.pList ){ + iListOff = (u8*)pSorter->list.pList - pSorter->list.aMemory; + } while( nNew < nMin ) nNew = nNew*2; if( nNew > pSorter->mxPmaSize ) nNew = pSorter->mxPmaSize; if( nNew < nMin ) nNew = nMin; - aNew = sqlite3Realloc(pSorter->list.aMemory, nNew); if( !aNew ) return SQLITE_NOMEM_BKPT; - pSorter->list.pList = (SorterRecord*)&aNew[iListOff]; + if( iListOff>=0 ){ + pSorter->list.pList = (SorterRecord*)&aNew[iListOff]; + } pSorter->list.aMemory = aNew; pSorter->nMemory = nNew; } @@ -93604,14 +96218,9 @@ static int memjrnlRead( int iChunkOffset; FileChunk *pChunk; -#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ - || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) if( (iAmt+iOfst)>p->endpoint.iOffset ){ return SQLITE_IOERR_SHORT_READ; } -#endif - - assert( (iAmt+iOfst)<=p->endpoint.iOffset ); assert( p->readpoint.iOffset==0 || p->readpoint.pChunk!=0 ); if( p->readpoint.iOffset!=iOfst || iOfst==0 ){ sqlite3_int64 iOff = 0; @@ -93962,6 +96571,35 @@ SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *pVfs){ /* #include */ +#if !defined(SQLITE_OMIT_WINDOWFUNC) +/* +** Walk all expressions linked into the list of Window objects passed +** as the second argument. +*/ +static int walkWindowList(Walker *pWalker, Window *pList){ + Window *pWin; + for(pWin=pList; pWin; pWin=pWin->pNextWin){ + int rc; + rc = sqlite3WalkExprList(pWalker, pWin->pOrderBy); + if( rc ) return WRC_Abort; + rc = sqlite3WalkExprList(pWalker, pWin->pPartition); + if( rc ) return WRC_Abort; + rc = sqlite3WalkExpr(pWalker, pWin->pFilter); + if( rc ) return WRC_Abort; + + /* The next two are purely for calls to sqlite3RenameExprUnmap() + ** within sqlite3WindowOffsetExpr(). Because of constraints imposed + ** by sqlite3WindowOffsetExpr(), they can never fail. The results do + ** not matter anyhow. */ + rc = sqlite3WalkExpr(pWalker, pWin->pStart); + if( NEVER(rc) ) return WRC_Abort; + rc = sqlite3WalkExpr(pWalker, pWin->pEnd); + if( NEVER(rc) ) return WRC_Abort; + } + return WRC_Continue; +} +#endif + /* ** Walk an expression tree. Invoke the callback once for each node ** of the expression, while descending. (In other words, the callback @@ -93989,24 +96627,25 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ rc = pWalker->xExprCallback(pWalker, pExpr); if( rc ) return rc & WRC_Abort; if( !ExprHasProperty(pExpr,(EP_TokenOnly|EP_Leaf)) ){ + assert( pExpr->x.pList==0 || pExpr->pRight==0 ); if( pExpr->pLeft && walkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort; - assert( pExpr->x.pList==0 || pExpr->pRight==0 ); if( pExpr->pRight ){ + assert( !ExprHasProperty(pExpr, EP_WinFunc) ); pExpr = pExpr->pRight; continue; }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + assert( !ExprHasProperty(pExpr, EP_WinFunc) ); if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort; - }else if( pExpr->x.pList ){ - if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort; - } + }else{ + if( pExpr->x.pList ){ + if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort; + } #ifndef SQLITE_OMIT_WINDOWFUNC - if( !ExprHasProperty(pExpr, EP_Reduced) && pExpr->pWin ){ - Window *pWin = pExpr->pWin; - if( sqlite3WalkExprList(pWalker, pWin->pPartition) ) return WRC_Abort; - if( sqlite3WalkExprList(pWalker, pWin->pOrderBy) ) return WRC_Abort; - if( sqlite3WalkExpr(pWalker, pWin->pFilter) ) return WRC_Abort; - } + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + if( walkWindowList(pWalker, pExpr->y.pWin) ) return WRC_Abort; + } #endif + } } break; } @@ -94044,6 +96683,17 @@ SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){ if( sqlite3WalkExpr(pWalker, p->pHaving) ) return WRC_Abort; if( sqlite3WalkExprList(pWalker, p->pOrderBy) ) return WRC_Abort; if( sqlite3WalkExpr(pWalker, p->pLimit) ) return WRC_Abort; +#if !defined(SQLITE_OMIT_WINDOWFUNC) && !defined(SQLITE_OMIT_ALTERTABLE) + { + Parse *pParse = pWalker->pParse; + if( pParse && IN_RENAME_OBJECT ){ + /* The following may return WRC_Abort if there are unresolvable + ** symbols (e.g. a table that does not exist) in a window definition. */ + int rc = walkWindowList(pWalker, p->pWinDefn); + return rc; + } + } +#endif return WRC_Continue; } @@ -94195,7 +96845,6 @@ static void resolveAlias( if( pExpr->op==TK_COLLATE ){ pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken); } - ExprSetProperty(pDup, EP_Alias); /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This ** prevents ExprDelete() from deleting the Expr structure itself, @@ -94212,6 +96861,13 @@ static void resolveAlias( pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken); pExpr->flags |= EP_MemToken; } + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + if( pExpr->y.pWin!=0 ){ + pExpr->y.pWin->pOwner = pExpr; + }else{ + assert( db->mallocFailed ); + } + } sqlite3DbFree(db, pDup); } ExprSetProperty(pExpr, EP_Alias); @@ -94241,13 +96897,16 @@ static int nameInUsingClause(IdList *pUsing, const char *zCol){ ** and zCol. If any of zDb, zTab, and zCol are NULL then those fields will ** match anything. */ -SQLITE_PRIVATE int sqlite3MatchSpanName( - const char *zSpan, +SQLITE_PRIVATE int sqlite3MatchEName( + const struct ExprList_item *pItem, const char *zCol, const char *zTab, const char *zDb ){ int n; + const char *zSpan; + if( NEVER(pItem->eEName!=ENAME_TAB) ) return 0; + zSpan = pItem->zEName; for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){ return 0; @@ -94264,6 +96923,23 @@ SQLITE_PRIVATE int sqlite3MatchSpanName( return 1; } +/* +** Return TRUE if the double-quoted string mis-feature should be supported. +*/ +static int areDoubleQuotedStringsEnabled(sqlite3 *db, NameContext *pTopNC){ + if( db->init.busy ) return 1; /* Always support for legacy schemas */ + if( pTopNC->ncFlags & NC_IsDDL ){ + /* Currently parsing a DDL statement */ + if( sqlite3WritableSchema(db) && (db->flags & SQLITE_DqsDML)!=0 ){ + return 1; + } + return (db->flags & SQLITE_DqsDDL)!=0; + }else{ + /* Currently parsing a DML statement */ + return (db->flags & SQLITE_DqsDML)!=0; + } +} + /* ** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up ** that name in the set of source tables in pSrcList and make the pExpr @@ -94274,7 +96950,7 @@ SQLITE_PRIVATE int sqlite3MatchSpanName( ** (even if X is implied). ** pExpr->iTable Set to the cursor number for the table obtained ** from pSrcList. -** pExpr->pTab Points to the Table structure of X.Y (even if +** pExpr->y.pTab Points to the Table structure of X.Y (even if ** X and/or Y are implied.) ** pExpr->iColumn Set to the column number within the table. ** pExpr->op Set to TK_COLUMN. @@ -94318,7 +96994,6 @@ static int lookupName( /* Initialize the node to no-match */ pExpr->iTable = -1; - pExpr->pTab = 0; ExprSetVVAProperty(pExpr, EP_NoReduce); /* Translate the schema name in zDb into a pointer to the corresponding @@ -94360,7 +97035,7 @@ static int lookupName( int hit = 0; pEList = pItem->pSelect->pEList; for(j=0; jnExpr; j++){ - if( sqlite3MatchSpanName(pEList->a[j].zSpan, zCol, zTab, zDb) ){ + if( sqlite3MatchEName(&pEList->a[j], zCol, zTab, zDb) ){ cnt++; cntTab = 2; pMatch = pItem; @@ -94380,7 +97055,7 @@ static int lookupName( continue; } if( IN_RENAME_OBJECT && pItem->zAlias ){ - sqlite3RenameTokenRemap(pParse, 0, (void*)&pExpr->pTab); + sqlite3RenameTokenRemap(pParse, 0, (void*)&pExpr->y.pTab); } } if( 0==(cntTab++) ){ @@ -94406,13 +97081,13 @@ static int lookupName( } if( pMatch ){ pExpr->iTable = pMatch->iCursor; - pExpr->pTab = pMatch->pTab; + pExpr->y.pTab = pMatch->pTab; /* RIGHT JOIN not (yet) supported */ assert( (pMatch->fg.jointype & JT_RIGHT)==0 ); if( (pMatch->fg.jointype & JT_LEFT)!=0 ){ ExprSetProperty(pExpr, EP_CanBeNull); } - pSchema = pExpr->pTab->pSchema; + pSchema = pExpr->y.pTab->pSchema; } } /* if( pSrcList ) */ @@ -94469,7 +97144,7 @@ static int lookupName( testcase( iCol==(-1) ); if( IN_RENAME_OBJECT ){ pExpr->iColumn = iCol; - pExpr->pTab = pTab; + pExpr->y.pTab = pTab; eNewExprOp = TK_COLUMN; }else{ pExpr->iTable = pNC->uNC.pUpsert->regData + iCol; @@ -94481,7 +97156,7 @@ static int lookupName( { #ifndef SQLITE_OMIT_TRIGGER if( iCol<0 ){ - pExpr->affinity = SQLITE_AFF_INTEGER; + pExpr->affExpr = SQLITE_AFF_INTEGER; }else if( pExpr->iTable==0 ){ testcase( iCol==31 ); testcase( iCol==32 ); @@ -94491,7 +97166,7 @@ static int lookupName( testcase( iCol==32 ); pParse->newmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<pTab = pTab; + pExpr->y.pTab = pTab; pExpr->iColumn = (i16)iCol; eNewExprOp = TK_TRIGGER; #endif /* SQLITE_OMIT_TRIGGER */ @@ -94507,13 +97182,13 @@ static int lookupName( if( cnt==0 && cntTab==1 && pMatch - && (pNC->ncFlags & NC_IdxExpr)==0 + && (pNC->ncFlags & (NC_IdxExpr|NC_GenCol))==0 && sqlite3IsRowid(zCol) && VisibleRowid(pMatch->pTab) ){ cnt = 1; pExpr->iColumn = -1; - pExpr->affinity = SQLITE_AFF_INTEGER; + pExpr->affExpr = SQLITE_AFF_INTEGER; } /* @@ -94541,8 +97216,10 @@ static int lookupName( pEList = pNC->uNC.pEList; assert( pEList!=0 ); for(j=0; jnExpr; j++){ - char *zAs = pEList->a[j].zName; - if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){ + char *zAs = pEList->a[j].zEName; + if( pEList->a[j].eEName==ENAME_NAME + && sqlite3_stricmp(zAs, zCol)==0 + ){ Expr *pOrig; assert( pExpr->pLeft==0 && pExpr->pRight==0 ); assert( pExpr->x.pList==0 ); @@ -94552,6 +97229,12 @@ static int lookupName( sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs); return WRC_Abort; } + if( ExprHasProperty(pOrig, EP_Win) + && ((pNC->ncFlags&NC_AllowWin)==0 || pNC!=pTopNC ) + ){ + sqlite3ErrorMsg(pParse, "misuse of aliased window function %s",zAs); + return WRC_Abort; + } if( sqlite3ExprVectorSize(pOrig)!=1 ){ sqlite3ErrorMsg(pParse, "row value misused"); return WRC_Abort; @@ -94589,9 +97272,30 @@ static int lookupName( */ if( cnt==0 && zTab==0 ){ assert( pExpr->op==TK_ID ); - if( ExprHasProperty(pExpr,EP_DblQuoted) ){ + if( ExprHasProperty(pExpr,EP_DblQuoted) + && areDoubleQuotedStringsEnabled(db, pTopNC) + ){ + /* If a double-quoted identifier does not match any known column name, + ** then treat it as a string. + ** + ** This hack was added in the early days of SQLite in a misguided attempt + ** to be compatible with MySQL 3.x, which used double-quotes for strings. + ** I now sorely regret putting in this hack. The effect of this hack is + ** that misspelled identifier names are silently converted into strings + ** rather than causing an error, to the frustration of countless + ** programmers. To all those frustrated programmers, my apologies. + ** + ** Someday, I hope to get rid of this hack. Unfortunately there is + ** a huge amount of legacy SQL that uses it. So for now, we just + ** issue a warning. + */ + sqlite3_log(SQLITE_WARNING, + "double-quoted string literal: \"%w\"", zCol); +#ifdef SQLITE_ENABLE_NORMALIZE + sqlite3VdbeAddDblquoteStr(db, pParse->pVdbe, zCol); +#endif pExpr->op = TK_STRING; - pExpr->pTab = 0; + pExpr->y.pTab = 0; return WRC_Prune; } if( sqlite3ExprIdToTrueFalse(pExpr) ){ @@ -94619,18 +97323,35 @@ static int lookupName( /* If a column from a table in pSrcList is referenced, then record ** this fact in the pSrcList.a[].colUsed bitmask. Column 0 causes - ** bit 0 to be set. Column 1 sets bit 1. And so forth. If the - ** column number is greater than the number of bits in the bitmask - ** then set the high-order bit of the bitmask. + ** bit 0 to be set. Column 1 sets bit 1. And so forth. Bit 63 is + ** set if the 63rd or any subsequent column is used. + ** + ** The colUsed mask is an optimization used to help determine if an + ** index is a covering index. The correct answer is still obtained + ** if the mask contains extra set bits. However, it is important to + ** avoid setting bits beyond the maximum column number of the table. + ** (See ticket [b92e5e8ec2cdbaa1]). + ** + ** If a generated column is referenced, set bits for every column + ** of the table. */ if( pExpr->iColumn>=0 && pMatch!=0 ){ int n = pExpr->iColumn; - testcase( n==BMS-1 ); - if( n>=BMS ){ - n = BMS-1; - } + Table *pExTab = pExpr->y.pTab; + assert( pExTab!=0 ); assert( pMatch->iCursor==pExpr->iTable ); - pMatch->colUsed |= ((Bitmask)1)<tabFlags & TF_HasGenerated)!=0 + && (pExTab->aCol[n].colFlags & COLFLAG_GENERATED)!=0 + ){ + testcase( pExTab->nCol==BMS-1 ); + testcase( pExTab->nCol==BMS ); + pMatch->colUsed = pExTab->nCol>=BMS ? ALLBITS : MASKBIT(pExTab->nCol)-1; + }else{ + testcase( n==BMS-1 ); + testcase( n==BMS ); + if( n>=BMS ) n = BMS-1; + pMatch->colUsed |= ((Bitmask)1)<a[iSrc]; - p->pTab = pItem->pTab; + Table *pTab = p->y.pTab = pItem->pTab; p->iTable = pItem->iCursor; - if( p->pTab->iPKey==iCol ){ + if( p->y.pTab->iPKey==iCol ){ p->iColumn = -1; }else{ p->iColumn = (ynVar)iCol; - testcase( iCol==BMS ); - testcase( iCol==BMS-1 ); - pItem->colUsed |= ((Bitmask)1)<<(iCol>=BMS ? BMS-1 : iCol); + if( (pTab->tabFlags & TF_HasGenerated)!=0 + && (pTab->aCol[iCol].colFlags & COLFLAG_GENERATED)!=0 + ){ + testcase( pTab->nCol==63 ); + testcase( pTab->nCol==64 ); + pItem->colUsed = pTab->nCol>=64 ? ALLBITS : MASKBIT(pTab->nCol)-1; + }else{ + testcase( iCol==BMS ); + testcase( iCol==BMS-1 ); + pItem->colUsed |= ((Bitmask)1)<<(iCol>=BMS ? BMS-1 : iCol); + } } } return p; @@ -94686,23 +97415,39 @@ SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *db, SrcList *pSrc, int iSr /* ** Report an error that an expression is not valid for some set of ** pNC->ncFlags values determined by validMask. -*/ -static void notValid( - Parse *pParse, /* Leave error message here */ - NameContext *pNC, /* The name context */ - const char *zMsg, /* Type of error */ - int validMask /* Set of contexts for which prohibited */ -){ - assert( (validMask&~(NC_IsCheck|NC_PartIdx|NC_IdxExpr))==0 ); - if( (pNC->ncFlags & validMask)!=0 ){ - const char *zIn = "partial index WHERE clauses"; - if( pNC->ncFlags & NC_IdxExpr ) zIn = "index expressions"; +** +** static void notValid( +** Parse *pParse, // Leave error message here +** NameContext *pNC, // The name context +** const char *zMsg, // Type of error +** int validMask, // Set of contexts for which prohibited +** Expr *pExpr // Invalidate this expression on error +** ){...} +** +** As an optimization, since the conditional is almost always false +** (because errors are rare), the conditional is moved outside of the +** function call using a macro. +*/ +static void notValidImpl( + Parse *pParse, /* Leave error message here */ + NameContext *pNC, /* The name context */ + const char *zMsg, /* Type of error */ + Expr *pExpr /* Invalidate this expression on error */ +){ + const char *zIn = "partial index WHERE clauses"; + if( pNC->ncFlags & NC_IdxExpr ) zIn = "index expressions"; #ifndef SQLITE_OMIT_CHECK - else if( pNC->ncFlags & NC_IsCheck ) zIn = "CHECK constraints"; + else if( pNC->ncFlags & NC_IsCheck ) zIn = "CHECK constraints"; #endif - sqlite3ErrorMsg(pParse, "%s prohibited in %s", zMsg, zIn); - } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + else if( pNC->ncFlags & NC_GenCol ) zIn = "generated columns"; +#endif + sqlite3ErrorMsg(pParse, "%s prohibited in %s", zMsg, zIn); + if( pExpr ) pExpr->op = TK_NULL; } +#define sqlite3ResolveNotValid(P,N,M,X,E) \ + assert( ((X)&~(NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol))==0 ); \ + if( ((N)->ncFlags & (X))!=0 ) notValidImpl(P,N,M,E); /* ** Expression p should encode a floating point value between 1.0 and 0.0. @@ -94761,10 +97506,10 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ pItem = pSrcList->a; assert( HasRowid(pItem->pTab) && pItem->pTab->pSelect==0 ); pExpr->op = TK_COLUMN; - pExpr->pTab = pItem->pTab; + pExpr->y.pTab = pItem->pTab; pExpr->iTable = pItem->iCursor; pExpr->iColumn = -1; - pExpr->affinity = SQLITE_AFF_INTEGER; + pExpr->affExpr = SQLITE_AFF_INTEGER; break; } #endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) @@ -94791,7 +97536,10 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ zColumn = pExpr->u.zToken; }else{ Expr *pLeft = pExpr->pLeft; - notValid(pParse, pNC, "the \".\" operator", NC_IdxExpr); + testcase( pNC->ncFlags & NC_IdxExpr ); + testcase( pNC->ncFlags & NC_GenCol ); + sqlite3ResolveNotValid(pParse, pNC, "the \".\" operator", + NC_IdxExpr|NC_GenCol, 0); pRight = pExpr->pRight; if( pRight->op==TK_ID ){ zDb = 0; @@ -94805,9 +97553,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ zColumn = pRight->u.zToken; if( IN_RENAME_OBJECT ){ sqlite3RenameTokenRemap(pParse, (void*)pExpr, (void*)pRight); - } - if( IN_RENAME_OBJECT ){ - sqlite3RenameTokenRemap(pParse, (void*)&pExpr->pTab, (void*)pLeft); + sqlite3RenameTokenRemap(pParse, (void*)&pExpr->y.pTab, (void*)pLeft); } } return lookupName(pParse, zDb, zTable, zColumn, pNC, pExpr); @@ -94825,7 +97571,10 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ const char *zId; /* The function name. */ FuncDef *pDef; /* Information about the function */ u8 enc = ENC(pParse->db); /* The database encoding */ - + int savedAllowFlags = (pNC->ncFlags & (NC_AllowAgg | NC_AllowWin)); +#ifndef SQLITE_OMIT_WINDOWFUNC + Window *pWin = (IsWindowFunc(pExpr) ? pExpr->y.pWin : 0); +#endif assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); zId = pExpr->u.zToken; nId = sqlite3Strlen30(zId); @@ -94840,7 +97589,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ }else{ is_agg = pDef->xFinalize!=0; if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){ - ExprSetProperty(pExpr, EP_Unlikely|EP_Skip); + ExprSetProperty(pExpr, EP_Unlikely); if( n==2 ){ pExpr->iTable = exprProbability(pList->a[1].pExpr); if( pExpr->iTable<0 ){ @@ -94879,15 +97628,39 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ if( pDef->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG) ){ /* For the purposes of the EP_ConstFunc flag, date and time ** functions and other functions that change slowly are considered - ** constant because they are constant for the duration of one query */ + ** constant because they are constant for the duration of one query. + ** This allows them to be factored out of inner loops. */ ExprSetProperty(pExpr,EP_ConstFunc); } if( (pDef->funcFlags & SQLITE_FUNC_CONSTANT)==0 ){ - /* Date/time functions that use 'now', and other functions like + /* Clearly non-deterministic functions like random(), but also + ** date/time functions that use 'now', and other functions like ** sqlite_version() that might change over time cannot be used - ** in an index. */ - notValid(pParse, pNC, "non-deterministic functions", - NC_IdxExpr|NC_PartIdx); + ** in an index or generated column. Curiously, they can be used + ** in a CHECK constraint. SQLServer, MySQL, and PostgreSQL all + ** all this. */ + sqlite3ResolveNotValid(pParse, pNC, "non-deterministic functions", + NC_IdxExpr|NC_PartIdx|NC_GenCol, 0); + }else{ + assert( (NC_SelfRef & 0xff)==NC_SelfRef ); /* Must fit in 8 bits */ + pExpr->op2 = pNC->ncFlags & NC_SelfRef; + if( pNC->ncFlags & NC_FromDDL ) ExprSetProperty(pExpr, EP_FromDDL); + } + if( (pDef->funcFlags & SQLITE_FUNC_INTERNAL)!=0 + && pParse->nested==0 + && (pParse->db->mDbFlags & DBFLAG_InternalFunc)==0 + ){ + /* Internal-use-only functions are disallowed unless the + ** SQL is being compiled using sqlite3NestedParse() or + ** the SQLITE_TESTCTRL_INTERNAL_FUNCTIONS test-control has be + ** used to activate internal functionsn for testing purposes */ + no_such_func = 1; + pDef = 0; + }else + if( (pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE))!=0 + && !IN_RENAME_OBJECT + ){ + sqlite3ExprFunctionUsable(pParse, pExpr, pDef); } } @@ -94897,18 +97670,18 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ || (pDef->xValue==0 && pDef->xInverse==0) || (pDef->xValue && pDef->xInverse && pDef->xSFunc && pDef->xFinalize) ); - if( pDef && pDef->xValue==0 && pExpr->pWin ){ + if( pDef && pDef->xValue==0 && pWin ){ sqlite3ErrorMsg(pParse, "%.*s() may not be used as a window function", nId, zId ); pNC->nErr++; }else if( (is_agg && (pNC->ncFlags & NC_AllowAgg)==0) - || (is_agg && (pDef->funcFlags & SQLITE_FUNC_WINDOW) && !pExpr->pWin) - || (is_agg && pExpr->pWin && (pNC->ncFlags & NC_AllowWin)==0) + || (is_agg && (pDef->funcFlags&SQLITE_FUNC_WINDOW) && !pWin) + || (is_agg && pWin && (pNC->ncFlags & NC_AllowWin)==0) ){ const char *zType; - if( (pDef->funcFlags & SQLITE_FUNC_WINDOW) || pExpr->pWin ){ + if( (pDef->funcFlags & SQLITE_FUNC_WINDOW) || pWin ){ zType = "window"; }else{ zType = "aggregate"; @@ -94936,49 +97709,69 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ nId, zId); pNC->nErr++; } +#ifndef SQLITE_OMIT_WINDOWFUNC + else if( is_agg==0 && ExprHasProperty(pExpr, EP_WinFunc) ){ + sqlite3ErrorMsg(pParse, + "FILTER may not be used with non-aggregate %.*s()", + nId, zId + ); + pNC->nErr++; + } +#endif if( is_agg ){ + /* Window functions may not be arguments of aggregate functions. + ** Or arguments of other window functions. But aggregate functions + ** may be arguments for window functions. */ #ifndef SQLITE_OMIT_WINDOWFUNC - pNC->ncFlags &= ~(pExpr->pWin ? NC_AllowWin : NC_AllowAgg); + pNC->ncFlags &= ~(NC_AllowWin | (!pWin ? NC_AllowAgg : 0)); #else pNC->ncFlags &= ~NC_AllowAgg; #endif } } +#ifndef SQLITE_OMIT_WINDOWFUNC + else if( ExprHasProperty(pExpr, EP_WinFunc) ){ + is_agg = 1; + } +#endif sqlite3WalkExprList(pWalker, pList); if( is_agg ){ #ifndef SQLITE_OMIT_WINDOWFUNC - if( pExpr->pWin ){ + if( pWin ){ Select *pSel = pNC->pWinSelect; - sqlite3WalkExprList(pWalker, pExpr->pWin->pPartition); - sqlite3WalkExprList(pWalker, pExpr->pWin->pOrderBy); - sqlite3WalkExpr(pWalker, pExpr->pWin->pFilter); - sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->pWin, pDef); - if( 0==pSel->pWin - || 0==sqlite3WindowCompare(pParse, pSel->pWin, pExpr->pWin) - ){ - pExpr->pWin->pNextWin = pSel->pWin; - pSel->pWin = pExpr->pWin; + assert( pWin==pExpr->y.pWin ); + if( IN_RENAME_OBJECT==0 ){ + sqlite3WindowUpdate(pParse, pSel ? pSel->pWinDefn : 0, pWin, pDef); } - pNC->ncFlags |= NC_AllowWin; + sqlite3WalkExprList(pWalker, pWin->pPartition); + sqlite3WalkExprList(pWalker, pWin->pOrderBy); + sqlite3WalkExpr(pWalker, pWin->pFilter); + sqlite3WindowLink(pSel, pWin); + pNC->ncFlags |= NC_HasWin; }else #endif /* SQLITE_OMIT_WINDOWFUNC */ { NameContext *pNC2 = pNC; pExpr->op = TK_AGG_FUNCTION; pExpr->op2 = 0; +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + sqlite3WalkExpr(pWalker, pExpr->y.pWin->pFilter); + } +#endif while( pNC2 && !sqlite3FunctionUsesThisSrc(pExpr, pNC2->pSrcList) ){ pExpr->op2++; pNC2 = pNC2->pNext; } - assert( pDef!=0 ); - if( pNC2 ){ + assert( pDef!=0 || IN_RENAME_OBJECT ); + if( pNC2 && pDef ){ assert( SQLITE_FUNC_MINMAX==NC_MinMaxAgg ); testcase( (pDef->funcFlags & SQLITE_FUNC_MINMAX)!=0 ); pNC2->ncFlags |= NC_HasAgg | (pDef->funcFlags & SQLITE_FUNC_MINMAX); } - pNC->ncFlags |= NC_AllowAgg; } + pNC->ncFlags |= savedAllowFlags; } /* FIX ME: Compute pExpr->affinity based on the expected return ** type of the function @@ -94993,7 +97786,12 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_IN ); if( ExprHasProperty(pExpr, EP_xIsSelect) ){ int nRef = pNC->nRef; - notValid(pParse, pNC, "subqueries", NC_IsCheck|NC_PartIdx|NC_IdxExpr); + testcase( pNC->ncFlags & NC_IsCheck ); + testcase( pNC->ncFlags & NC_PartIdx ); + testcase( pNC->ncFlags & NC_IdxExpr ); + testcase( pNC->ncFlags & NC_GenCol ); + sqlite3ResolveNotValid(pParse, pNC, "subqueries", + NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol, pExpr); sqlite3WalkSelect(pWalker, pExpr->x.pSelect); assert( pNC->nRef>=nRef ); if( nRef!=pNC->nRef ){ @@ -95004,16 +97802,21 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ break; } case TK_VARIABLE: { - notValid(pParse, pNC, "parameters", NC_IsCheck|NC_PartIdx|NC_IdxExpr); + testcase( pNC->ncFlags & NC_IsCheck ); + testcase( pNC->ncFlags & NC_PartIdx ); + testcase( pNC->ncFlags & NC_IdxExpr ); + testcase( pNC->ncFlags & NC_GenCol ); + sqlite3ResolveNotValid(pParse, pNC, "parameters", + NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol, pExpr); break; } case TK_IS: case TK_ISNOT: { - Expr *pRight; + Expr *pRight = sqlite3ExprSkipCollateAndLikely(pExpr->pRight); assert( !ExprHasProperty(pExpr, EP_Reduced) ); /* Handle special cases of "x IS TRUE", "x IS FALSE", "x IS NOT TRUE", ** and "x IS NOT FALSE". */ - if( (pRight = pExpr->pRight)->op==TK_ID ){ + if( pRight->op==TK_ID ){ int rc = resolveExprStep(pWalker, pRight); if( rc==WRC_Abort ) return WRC_Abort; if( pRight->op==TK_TRUEFALSE ){ @@ -95086,8 +97889,9 @@ static int resolveAsName( if( pE->op==TK_ID ){ char *zCol = pE->u.zToken; for(i=0; inExpr; i++){ - char *zAs = pEList->a[i].zName; - if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){ + if( pEList->a[i].eEName==ENAME_NAME + && sqlite3_stricmp(pEList->a[i].zEName, zCol)==0 + ){ return i+1; } } @@ -95220,7 +98024,7 @@ static int resolveCompoundOrderBy( int iCol = -1; Expr *pE, *pDup; if( pItem->done ) continue; - pE = sqlite3ExprSkipCollate(pItem->pExpr); + pE = sqlite3ExprSkipCollateAndLikely(pItem->pExpr); if( sqlite3ExprIsInteger(pE, &iCol) ){ if( iCol<=0 || iCol>pEList->nExpr ){ resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr); @@ -95229,32 +98033,53 @@ static int resolveCompoundOrderBy( }else{ iCol = resolveAsName(pParse, pEList, pE); if( iCol==0 ){ - pDup = sqlite3ExprDup(db, pE, 0); + /* Now test if expression pE matches one of the values returned + ** by pSelect. In the usual case this is done by duplicating the + ** expression, resolving any symbols in it, and then comparing + ** it against each expression returned by the SELECT statement. + ** Once the comparisons are finished, the duplicate expression + ** is deleted. + ** + ** Or, if this is running as part of an ALTER TABLE operation, + ** resolve the symbols in the actual expression, not a duplicate. + ** And, if one of the comparisons is successful, leave the expression + ** as is instead of transforming it to an integer as in the usual + ** case. This allows the code in alter.c to modify column + ** refererences within the ORDER BY expression as required. */ + if( IN_RENAME_OBJECT ){ + pDup = pE; + }else{ + pDup = sqlite3ExprDup(db, pE, 0); + } if( !db->mallocFailed ){ assert(pDup); iCol = resolveOrderByTermToExprList(pParse, pSelect, pDup); } - sqlite3ExprDelete(db, pDup); + if( !IN_RENAME_OBJECT ){ + sqlite3ExprDelete(db, pDup); + } } } if( iCol>0 ){ /* Convert the ORDER BY term into an integer column number iCol, ** taking care to preserve the COLLATE clause if it exists */ - Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); - if( pNew==0 ) return 1; - pNew->flags |= EP_IntValue; - pNew->u.iValue = iCol; - if( pItem->pExpr==pE ){ - pItem->pExpr = pNew; - }else{ - Expr *pParent = pItem->pExpr; - assert( pParent->op==TK_COLLATE ); - while( pParent->pLeft->op==TK_COLLATE ) pParent = pParent->pLeft; - assert( pParent->pLeft==pE ); - pParent->pLeft = pNew; + if( !IN_RENAME_OBJECT ){ + Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); + if( pNew==0 ) return 1; + pNew->flags |= EP_IntValue; + pNew->u.iValue = iCol; + if( pItem->pExpr==pE ){ + pItem->pExpr = pNew; + }else{ + Expr *pParent = pItem->pExpr; + assert( pParent->op==TK_COLLATE ); + while( pParent->pLeft->op==TK_COLLATE ) pParent = pParent->pLeft; + assert( pParent->pLeft==pE ); + pParent->pLeft = pNew; + } + sqlite3ExprDelete(db, pE); + pItem->u.x.iOrderByCol = (u16)iCol; } - sqlite3ExprDelete(db, pE); - pItem->u.x.iOrderByCol = (u16)iCol; pItem->done = 1; }else{ moreToDo = 1; @@ -95293,7 +98118,7 @@ SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy( ExprList *pEList; struct ExprList_item *pItem; - if( pOrderBy==0 || pParse->db->mallocFailed ) return 0; + if( pOrderBy==0 || pParse->db->mallocFailed || IN_RENAME_OBJECT ) return 0; if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ sqlite3ErrorMsg(pParse, "too many terms in %s BY clause", zType); return 1; @@ -95313,6 +98138,36 @@ SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy( return 0; } +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** Walker callback for windowRemoveExprFromSelect(). +*/ +static int resolveRemoveWindowsCb(Walker *pWalker, Expr *pExpr){ + UNUSED_PARAMETER(pWalker); + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + Window *pWin = pExpr->y.pWin; + sqlite3WindowUnlinkFromSelect(pWin); + } + return WRC_Continue; +} + +/* +** Remove any Window objects owned by the expression pExpr from the +** Select.pWin list of Select object pSelect. +*/ +static void windowRemoveExprFromSelect(Select *pSelect, Expr *pExpr){ + if( pSelect->pWin ){ + Walker sWalker; + memset(&sWalker, 0, sizeof(Walker)); + sWalker.xExprCallback = resolveRemoveWindowsCb; + sWalker.u.pSelect = pSelect; + sqlite3WalkExpr(&sWalker, pExpr); + } +} +#else +# define windowRemoveExprFromSelect(a, b) +#endif /* SQLITE_OMIT_WINDOWFUNC */ + /* ** pOrderBy is an ORDER BY or GROUP BY clause in SELECT statement pSelect. ** The Name context of the SELECT statement is pNC. zType is either @@ -95348,7 +98203,7 @@ static int resolveOrderGroupBy( pParse = pNC->pParse; for(i=0, pItem=pOrderBy->a; inExpr; i++, pItem++){ Expr *pE = pItem->pExpr; - Expr *pE2 = sqlite3ExprSkipCollate(pE); + Expr *pE2 = sqlite3ExprSkipCollateAndLikely(pE); if( zType[0]!='G' ){ iCol = resolveAsName(pParse, pSelect->pEList, pE2); if( iCol>0 ){ @@ -95379,19 +98234,10 @@ static int resolveOrderGroupBy( } for(j=0; jpEList->nExpr; j++){ if( sqlite3ExprCompare(0, pE, pSelect->pEList->a[j].pExpr, -1)==0 ){ -#ifndef SQLITE_OMIT_WINDOWFUNC - if( pE->pWin ){ - /* Since this window function is being changed into a reference - ** to the same window function the result set, remove the instance - ** of this window function from the Select.pWin list. */ - Window **pp; - for(pp=&pSelect->pWin; *pp; pp=&(*pp)->pNextWin){ - if( *pp==pE->pWin ){ - *pp = (*pp)->pNextWin; - } - } - } -#endif + /* Since this expresion is being changed into a reference + ** to an identical expression in the result set, remove all Window + ** objects belonging to the expression from the Select.pWin list. */ + windowRemoveExprFromSelect(pSelect, pE); pItem->u.x.iOrderByCol = j+1; } } @@ -95471,7 +98317,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ */ for(i=0; ipSrc->nSrc; i++){ struct SrcList_item *pItem = &p->pSrc->a[i]; - if( pItem->pSelect ){ + if( pItem->pSelect && (pItem->pSelect->selFlags & SF_Resolved)==0 ){ NameContext *pNC; /* Used to iterate name contexts */ int nRef = 0; /* Refcount for pOuterNC and outer contexts */ const char *zSavedContext = pParse->zAuthContext; @@ -95603,6 +98449,19 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ } } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( IN_RENAME_OBJECT ){ + Window *pWin; + for(pWin=p->pWinDefn; pWin; pWin=pWin->pNextWin){ + if( sqlite3ResolveExprListNames(&sNC, pWin->pOrderBy) + || sqlite3ResolveExprListNames(&sNC, pWin->pPartition) + ){ + return WRC_Abort; + } + } + } +#endif + /* If this is part of a compound SELECT, check that it has the right ** number of expressions in the select list. */ if( p->pNext && p->pEList->nExpr!=p->pNext->pEList->nExpr ){ @@ -95678,12 +98537,12 @@ SQLITE_PRIVATE int sqlite3ResolveExprNames( NameContext *pNC, /* Namespace to resolve expressions in. */ Expr *pExpr /* The expression to be analyzed. */ ){ - u16 savedHasAgg; + int savedHasAgg; Walker w; if( pExpr==0 ) return SQLITE_OK; - savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg); - pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg); + savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin); + pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin); w.pParse = pNC->pParse; w.xExprCallback = resolveExprStep; w.xSelectCallback = resolveSelectStep; @@ -95699,9 +98558,11 @@ SQLITE_PRIVATE int sqlite3ResolveExprNames( #if SQLITE_MAX_EXPR_DEPTH>0 w.pParse->nHeight -= pExpr->nHeight; #endif - if( pNC->ncFlags & NC_HasAgg ){ - ExprSetProperty(pExpr, EP_Agg); - } + assert( EP_Agg==NC_HasAgg ); + assert( EP_Win==NC_HasWin ); + testcase( pNC->ncFlags & NC_HasAgg ); + testcase( pNC->ncFlags & NC_HasWin ); + ExprSetProperty(pExpr, pNC->ncFlags & (NC_HasAgg|NC_HasWin) ); pNC->ncFlags |= savedHasAgg; return pNC->nErr>0 || w.pParse->nErr>0; } @@ -95753,38 +98614,56 @@ SQLITE_PRIVATE void sqlite3ResolveSelectNames( } /* -** Resolve names in expressions that can only reference a single table: +** Resolve names in expressions that can only reference a single table +** or which cannot reference any tables at all. Examples: ** -** * CHECK constraints -** * WHERE clauses on partial indices +** "type" flag +** ------------ +** (1) CHECK constraints NC_IsCheck +** (2) WHERE clauses on partial indices NC_PartIdx +** (3) Expressions in indexes on expressions NC_IdxExpr +** (4) Expression arguments to VACUUM INTO. 0 +** (5) GENERATED ALWAYS as expressions NC_GenCol ** -** The Expr.iTable value for Expr.op==TK_COLUMN nodes of the expression -** is set to -1 and the Expr.iColumn value is set to the column number. +** In all cases except (4), the Expr.iTable value for Expr.op==TK_COLUMN +** nodes of the expression is set to -1 and the Expr.iColumn value is +** set to the column number. In case (4), TK_COLUMN nodes cause an error. ** ** Any errors cause an error message to be set in pParse. */ -SQLITE_PRIVATE void sqlite3ResolveSelfReference( - Parse *pParse, /* Parsing context */ - Table *pTab, /* The table being referenced */ - int type, /* NC_IsCheck or NC_PartIdx or NC_IdxExpr */ - Expr *pExpr, /* Expression to resolve. May be NULL. */ - ExprList *pList /* Expression list to resolve. May be NULL. */ +SQLITE_PRIVATE int sqlite3ResolveSelfReference( + Parse *pParse, /* Parsing context */ + Table *pTab, /* The table being referenced, or NULL */ + int type, /* NC_IsCheck, NC_PartIdx, NC_IdxExpr, NC_GenCol, or 0 */ + Expr *pExpr, /* Expression to resolve. May be NULL. */ + ExprList *pList /* Expression list to resolve. May be NULL. */ ){ SrcList sSrc; /* Fake SrcList for pParse->pNewTable */ NameContext sNC; /* Name context for pParse->pNewTable */ + int rc; - assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr ); + assert( type==0 || pTab!=0 ); + assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr + || type==NC_GenCol || pTab==0 ); memset(&sNC, 0, sizeof(sNC)); memset(&sSrc, 0, sizeof(sSrc)); - sSrc.nSrc = 1; - sSrc.a[0].zName = pTab->zName; - sSrc.a[0].pTab = pTab; - sSrc.a[0].iCursor = -1; + if( pTab ){ + sSrc.nSrc = 1; + sSrc.a[0].zName = pTab->zName; + sSrc.a[0].pTab = pTab; + sSrc.a[0].iCursor = -1; + if( pTab->pSchema!=pParse->db->aDb[1].pSchema ){ + /* Cause EP_FromDDL to be set on TK_FUNCTION nodes of non-TEMP + ** schema elements */ + type |= NC_FromDDL; + } + } sNC.pParse = pParse; sNC.pSrcList = &sSrc; - sNC.ncFlags = type; - if( sqlite3ResolveExprNames(&sNC, pExpr) ) return; - if( pList ) sqlite3ResolveExprListNames(&sNC, pList); + sNC.ncFlags = type | NC_IsDDL; + if( (rc = sqlite3ResolveExprNames(&sNC, pExpr))!=SQLITE_OK ) return rc; + if( pList ) rc = sqlite3ResolveExprListNames(&sNC, pList); + return rc; } /************** End of resolve.c *********************************************/ @@ -95835,8 +98714,11 @@ SQLITE_PRIVATE char sqlite3TableColumnAffinity(Table *pTab, int iCol){ */ SQLITE_PRIVATE char sqlite3ExprAffinity(Expr *pExpr){ int op; - pExpr = sqlite3ExprSkipCollate(pExpr); - if( pExpr->flags & EP_Generic ) return 0; + while( ExprHasProperty(pExpr, EP_Skip) ){ + assert( pExpr->op==TK_COLLATE ); + pExpr = pExpr->pLeft; + assert( pExpr!=0 ); + } op = pExpr->op; if( op==TK_SELECT ){ assert( pExpr->flags&EP_xIsSelect ); @@ -95849,8 +98731,8 @@ SQLITE_PRIVATE char sqlite3ExprAffinity(Expr *pExpr){ return sqlite3AffinityType(pExpr->u.zToken, 0); } #endif - if( (op==TK_AGG_COLUMN || op==TK_COLUMN) && pExpr->pTab ){ - return sqlite3TableColumnAffinity(pExpr->pTab, pExpr->iColumn); + if( (op==TK_AGG_COLUMN || op==TK_COLUMN) && pExpr->y.pTab ){ + return sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn); } if( op==TK_SELECT_COLUMN ){ assert( pExpr->pLeft->flags&EP_xIsSelect ); @@ -95858,7 +98740,10 @@ SQLITE_PRIVATE char sqlite3ExprAffinity(Expr *pExpr){ pExpr->pLeft->x.pSelect->pEList->a[pExpr->iColumn].pExpr ); } - return pExpr->affinity; + if( op==TK_VECTOR ){ + return sqlite3ExprAffinity(pExpr->x.pList->a[0].pExpr); + } + return pExpr->affExpr; } /* @@ -95893,11 +98778,23 @@ SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(Parse *pParse, Expr *pExpr, con } /* -** Skip over any TK_COLLATE operators and any unlikely() -** or likelihood() function at the root of an expression. +** Skip over any TK_COLLATE operators. */ SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr *pExpr){ while( pExpr && ExprHasProperty(pExpr, EP_Skip) ){ + assert( pExpr->op==TK_COLLATE ); + pExpr = pExpr->pLeft; + } + return pExpr; +} + +/* +** Skip over any TK_COLLATE operators and/or any unlikely() +** or likelihood() or likely() functions at the root of an +** expression. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprSkipCollateAndLikely(Expr *pExpr){ + while( pExpr && ExprHasProperty(pExpr, EP_Skip|EP_Unlikely) ){ if( ExprHasProperty(pExpr, EP_Unlikely) ){ assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); assert( pExpr->x.pList->nExpr>0 ); @@ -95931,16 +98828,15 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ Expr *p = pExpr; while( p ){ int op = p->op; - if( p->flags & EP_Generic ) break; - if( (op==TK_AGG_COLUMN || op==TK_COLUMN - || op==TK_REGISTER || op==TK_TRIGGER) - && p->pTab!=0 + if( op==TK_REGISTER ) op = p->op2; + if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_TRIGGER) + && p->y.pTab!=0 ){ - /* op==TK_REGISTER && p->pTab!=0 happens when pExpr was originally + /* op==TK_REGISTER && p->y.pTab!=0 happens when pExpr was originally ** a TK_COLUMN but was previously evaluated and cached in a register */ int j = p->iColumn; if( j>=0 ){ - const char *zColl = p->pTab->aCol[j].zColl; + const char *zColl = p->y.pTab->aCol[j].zColl; pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0); } break; @@ -95949,7 +98845,11 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ p = p->pLeft; continue; } - if( op==TK_COLLATE || (op==TK_REGISTER && p->op2==TK_COLLATE) ){ + if( op==TK_VECTOR ){ + p = p->x.pList->a[0].pExpr; + continue; + } + if( op==TK_COLLATE ){ pColl = sqlite3GetCollSeq(pParse, ENC(db), 0, p->u.zToken); break; } @@ -95960,12 +98860,12 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ Expr *pNext = p->pRight; /* The Expr.x union is never used at the same time as Expr.pRight */ assert( p->x.pList==0 || p->pRight==0 ); - /* p->flags holds EP_Collate and p->pLeft->flags does not. And - ** p->x.pSelect cannot. So if p->x.pLeft exists, it must hold at - ** least one EP_Collate. Thus the following two ALWAYS. */ - if( p->x.pList!=0 && ALWAYS(!ExprHasProperty(p, EP_xIsSelect)) ){ + if( p->x.pList!=0 + && !db->mallocFailed + && ALWAYS(!ExprHasProperty(p, EP_xIsSelect)) + ){ int i; - for(i=0; ALWAYS(ix.pList->nExpr); i++){ + for(i=0; ix.pList->nExpr; i++){ if( ExprHasProperty(p->x.pList->a[i].pExpr, EP_Collate) ){ pNext = p->x.pList->a[i].pExpr; break; @@ -96017,7 +98917,7 @@ SQLITE_PRIVATE int sqlite3ExprCollSeqMatch(Parse *pParse, Expr *pE1, Expr *pE2){ */ SQLITE_PRIVATE char sqlite3CompareAffinity(Expr *pExpr, char aff2){ char aff1 = sqlite3ExprAffinity(pExpr); - if( aff1 && aff2 ){ + if( aff1>SQLITE_AFF_NONE && aff2>SQLITE_AFF_NONE ){ /* Both sides of the comparison are columns. If one has numeric ** affinity, use that. Otherwise use no affinity. */ @@ -96026,15 +98926,10 @@ SQLITE_PRIVATE char sqlite3CompareAffinity(Expr *pExpr, char aff2){ }else{ return SQLITE_AFF_BLOB; } - }else if( !aff1 && !aff2 ){ - /* Neither side of the comparison is a column. Compare the - ** results directly. - */ - return SQLITE_AFF_BLOB; }else{ /* One side is a column, the other is not. Use the columns affinity. */ - assert( aff1==0 || aff2==0 ); - return (aff1 + aff2); + assert( aff1<=SQLITE_AFF_NONE || aff2<=SQLITE_AFF_NONE ); + return (aff1<=SQLITE_AFF_NONE ? aff2 : aff1) | SQLITE_AFF_NONE; } } @@ -96067,14 +98962,13 @@ static char comparisonAffinity(Expr *pExpr){ */ SQLITE_PRIVATE int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity){ char aff = comparisonAffinity(pExpr); - switch( aff ){ - case SQLITE_AFF_BLOB: - return 1; - case SQLITE_AFF_TEXT: - return idx_affinity==SQLITE_AFF_TEXT; - default: - return sqlite3IsNumericAffinity(idx_affinity); + if( affpRight, p->pLeft); + }else{ + return sqlite3BinaryCompareCollSeq(pParse, p->pLeft, p->pRight); + } +} + /* ** Generate code for a comparison operator. */ @@ -96129,13 +99039,19 @@ static int codeCompare( int opcode, /* The comparison opcode */ int in1, int in2, /* Register holding operands */ int dest, /* Jump here if true. */ - int jumpIfNull /* If true, jump if either operand is NULL */ + int jumpIfNull, /* If true, jump if either operand is NULL */ + int isCommuted /* The comparison has been commuted */ ){ int p5; int addr; CollSeq *p4; - p4 = sqlite3BinaryCompareCollSeq(pParse, pLeft, pRight); + if( pParse->nErr ) return 0; + if( isCommuted ){ + p4 = sqlite3BinaryCompareCollSeq(pParse, pRight, pLeft); + }else{ + p4 = sqlite3BinaryCompareCollSeq(pParse, pLeft, pRight); + } p5 = binaryCompareP5(pLeft, pRight, jumpIfNull); addr = sqlite3VdbeAddOp4(pParse->pVdbe, opcode, in2, dest, in1, (void*)p4, P4_COLLSEQ); @@ -96256,6 +99172,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprForVectorField( }else{ if( pVector->op==TK_VECTOR ) pVector = pVector->x.pList->a[iField].pExpr; pRet = sqlite3ExprDup(pParse->db, pVector, 0); + sqlite3RenameTokenRemap(pParse, pRet, pVector); } return pRet; } @@ -96272,7 +99189,7 @@ static int exprCodeSubselect(Parse *pParse, Expr *pExpr){ int reg = 0; #ifndef SQLITE_OMIT_SUBQUERY if( pExpr->op==TK_SELECT ){ - reg = sqlite3CodeSubselect(pParse, pExpr, 0, 0); + reg = sqlite3CodeSubselect(pParse, pExpr); } #endif return reg; @@ -96344,8 +99261,10 @@ static void codeVectorCompare( int regLeft = 0; int regRight = 0; u8 opx = op; - int addrDone = sqlite3VdbeMakeLabel(v); + int addrDone = sqlite3VdbeMakeLabel(pParse); + int isCommuted = ExprHasProperty(pExpr,EP_Commuted); + if( pParse->nErr ) return; if( nLeft!=sqlite3ExprVectorSize(pRight) ){ sqlite3ErrorMsg(pParse, "row value misused"); return; @@ -96374,7 +99293,7 @@ static void codeVectorCompare( assert( i>=0 && iiAgg = -1; if( pToken ){ if( nExtra==0 ){ - pNew->flags |= EP_IntValue|EP_Leaf; + pNew->flags |= EP_IntValue|EP_Leaf|(iValue?EP_IsTrue:EP_IsFalse); pNew->u.iValue = iValue; }else{ pNew->u.zToken = (char*)&pNew[1]; @@ -96571,8 +99490,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprAlloc( if( pToken->n ) memcpy(pNew->u.zToken, pToken->z, pToken->n); pNew->u.zToken[pToken->n] = 0; if( dequote && sqlite3Isquote(pNew->u.zToken[0]) ){ - if( pNew->u.zToken[0]=='"' ) pNew->flags |= EP_DblQuoted; - sqlite3Dequote(pNew->u.zToken); + sqlite3DequoteExpr(pNew); } } } @@ -96641,20 +99559,16 @@ SQLITE_PRIVATE Expr *sqlite3PExpr( Expr *pRight /* Right operand */ ){ Expr *p; - if( op==TK_AND && pParse->nErr==0 ){ - /* Take advantage of short-circuit false optimization for AND */ - p = sqlite3ExprAnd(pParse->db, pLeft, pRight); - }else{ - p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)); - if( p ){ - memset(p, 0, sizeof(Expr)); - p->op = op & TKFLG_MASK; - p->iAgg = -1; - } + p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)); + if( p ){ + memset(p, 0, sizeof(Expr)); + p->op = op & 0xff; + p->iAgg = -1; sqlite3ExprAttachSubtrees(pParse->db, p, pLeft, pRight); - } - if( p ) { sqlite3ExprCheckHeight(pParse, p->nHeight); + }else{ + sqlite3ExprDelete(pParse->db, pLeft); + sqlite3ExprDelete(pParse->db, pRight); } return p; } @@ -96675,33 +99589,6 @@ SQLITE_PRIVATE void sqlite3PExprAddSelect(Parse *pParse, Expr *pExpr, Select *pS } -/* -** If the expression is always either TRUE or FALSE (respectively), -** then return 1. If one cannot determine the truth value of the -** expression at compile-time return 0. -** -** This is an optimization. If is OK to return 0 here even if -** the expression really is always false or false (a false negative). -** But it is a bug to return 1 if the expression might have different -** boolean values in different circumstances (a false positive.) -** -** Note that if the expression is part of conditional for a -** LEFT JOIN, then we cannot determine at compile-time whether or not -** is it true or false, so always return 0. -*/ -static int exprAlwaysTrue(Expr *p){ - int v = 0; - if( ExprHasProperty(p, EP_FromJoin) ) return 0; - if( !sqlite3ExprIsInteger(p, &v) ) return 0; - return v!=0; -} -static int exprAlwaysFalse(Expr *p){ - int v = 0; - if( ExprHasProperty(p, EP_FromJoin) ) return 0; - if( !sqlite3ExprIsInteger(p, &v) ) return 0; - return v==0; -} - /* ** Join two expressions using an AND operator. If either expression is ** NULL, then just return the other expression. @@ -96710,19 +99597,20 @@ static int exprAlwaysFalse(Expr *p){ ** of returning an AND expression, just return a constant expression with ** a value of false. */ -SQLITE_PRIVATE Expr *sqlite3ExprAnd(sqlite3 *db, Expr *pLeft, Expr *pRight){ - if( pLeft==0 ){ +SQLITE_PRIVATE Expr *sqlite3ExprAnd(Parse *pParse, Expr *pLeft, Expr *pRight){ + sqlite3 *db = pParse->db; + if( pLeft==0 ){ return pRight; }else if( pRight==0 ){ return pLeft; - }else if( exprAlwaysFalse(pLeft) || exprAlwaysFalse(pRight) ){ + }else if( (ExprAlwaysFalse(pLeft) || ExprAlwaysFalse(pRight)) + && !IN_RENAME_OBJECT + ){ sqlite3ExprDelete(db, pLeft); sqlite3ExprDelete(db, pRight); - return sqlite3ExprAlloc(db, TK_INTEGER, &sqlite3IntTokens[0], 0); + return sqlite3Expr(db, TK_INTEGER, "0"); }else{ - Expr *pNew = sqlite3ExprAlloc(db, TK_AND, 0, 0); - sqlite3ExprAttachSubtrees(db, pNew, pLeft, pRight); - return pNew; + return sqlite3PExpr(pParse, TK_AND, pLeft, pRight); } } @@ -96755,6 +99643,40 @@ SQLITE_PRIVATE Expr *sqlite3ExprFunction( return pNew; } +/* +** Check to see if a function is usable according to current access +** rules: +** +** SQLITE_FUNC_DIRECT - Only usable from top-level SQL +** +** SQLITE_FUNC_UNSAFE - Usable if TRUSTED_SCHEMA or from +** top-level SQL +** +** If the function is not usable, create an error. +*/ +SQLITE_PRIVATE void sqlite3ExprFunctionUsable( + Parse *pParse, /* Parsing and code generating context */ + Expr *pExpr, /* The function invocation */ + FuncDef *pDef /* The function being invoked */ +){ + assert( !IN_RENAME_OBJECT ); + assert( (pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE))!=0 ); + if( ExprHasProperty(pExpr, EP_FromDDL) ){ + if( (pDef->funcFlags & SQLITE_FUNC_DIRECT)!=0 + || (pParse->db->flags & SQLITE_TrustedSchema)==0 + ){ + /* Functions prohibited in triggers and views if: + ** (1) tagged with SQLITE_DIRECTONLY + ** (2) not tagged with SQLITE_INNOCUOUS (which means it + ** is tagged with SQLITE_FUNC_UNSAFE) and + ** SQLITE_DBCONFIG_TRUSTED_SCHEMA is off (meaning + ** that the schema is possibly tainted). + */ + sqlite3ErrorMsg(pParse, "unsafe use of %s()", pDef->zName); + } + } +} + /* ** Assign a variable number to an expression that encodes a wildcard ** in the original SQL statement. @@ -96843,6 +99765,10 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ assert( p!=0 ); /* Sanity check: Assert that the IntValue is non-negative if it exists */ assert( !ExprHasProperty(p, EP_IntValue) || p->u.iValue>=0 ); + + assert( !ExprHasProperty(p, EP_WinFunc) || p->y.pWin!=0 || db->mallocFailed ); + assert( p->op!=TK_FUNCTION || ExprHasProperty(p, EP_TokenOnly|EP_Reduced) + || p->y.pWin==0 || ExprHasProperty(p, EP_WinFunc) ); #ifdef SQLITE_DEBUG if( ExprHasProperty(p, EP_Leaf) && !ExprHasProperty(p, EP_TokenOnly) ){ assert( p->pLeft==0 ); @@ -96855,14 +99781,18 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ assert( p->x.pList==0 || p->pRight==0 ); if( p->pLeft && p->op!=TK_SELECT_COLUMN ) sqlite3ExprDeleteNN(db, p->pLeft); if( p->pRight ){ + assert( !ExprHasProperty(p, EP_WinFunc) ); sqlite3ExprDeleteNN(db, p->pRight); }else if( ExprHasProperty(p, EP_xIsSelect) ){ + assert( !ExprHasProperty(p, EP_WinFunc) ); sqlite3SelectDelete(db, p->x.pSelect); }else{ sqlite3ExprListDelete(db, p->x.pList); - } - if( !ExprHasProperty(p, EP_Reduced) ){ - sqlite3WindowDelete(db, p->pWin); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(p, EP_WinFunc) ){ + sqlite3WindowDelete(db, p->y.pWin); + } +#endif } } if( ExprHasProperty(p, EP_MemToken) ) sqlite3DbFree(db, p->u.zToken); @@ -96874,6 +99804,18 @@ SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3 *db, Expr *p){ if( p ) sqlite3ExprDeleteNN(db, p); } +/* Invoke sqlite3RenameExprUnmap() and sqlite3ExprDelete() on the +** expression. +*/ +SQLITE_PRIVATE void sqlite3ExprUnmapAndDelete(Parse *pParse, Expr *p){ + if( p ){ + if( IN_RENAME_OBJECT ){ + sqlite3RenameExprUnmap(pParse, p); + } + sqlite3ExprDeleteNN(pParse->db, p); + } +} + /* ** Return the number of bytes allocated for the expression structure ** passed as the first argument. This is always one of EXPR_FULLSIZE, @@ -96926,7 +99868,7 @@ static int dupedExprStructSize(Expr *p, int flags){ assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 ); if( 0==flags || p->op==TK_SELECT_COLUMN #ifndef SQLITE_OMIT_WINDOWFUNC - || p->pWin + || ExprHasProperty(p, EP_WinFunc) #endif ){ nSize = EXPR_FULLSIZE; @@ -96953,7 +99895,7 @@ static int dupedExprStructSize(Expr *p, int flags){ static int dupedExprNodeSize(Expr *p, int flags){ int nByte = dupedExprStructSize(p, flags) & 0xfff; if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ - nByte += sqlite3Strlen30(p->u.zToken)+1; + nByte += sqlite3Strlen30NN(p->u.zToken)+1; } return ROUND8(nByte); } @@ -97056,22 +99998,24 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ } /* Fill in pNew->pLeft and pNew->pRight. */ - zAlloc += dupedExprNodeSize(p, dupFlags); - if( ExprHasProperty(pNew, EP_Reduced|EP_TokenOnly) ){ + if( ExprHasProperty(pNew, EP_Reduced|EP_TokenOnly|EP_WinFunc) ){ + zAlloc += dupedExprNodeSize(p, dupFlags); if( !ExprHasProperty(pNew, EP_TokenOnly|EP_Leaf) ){ pNew->pLeft = p->pLeft ? exprDup(db, p->pLeft, EXPRDUP_REDUCE, &zAlloc) : 0; pNew->pRight = p->pRight ? exprDup(db, p->pRight, EXPRDUP_REDUCE, &zAlloc) : 0; } - }else{ #ifndef SQLITE_OMIT_WINDOWFUNC - if( ExprHasProperty(p, EP_Reduced|EP_TokenOnly) ){ - pNew->pWin = 0; - }else{ - pNew->pWin = sqlite3WindowDup(db, pNew, p->pWin); + if( ExprHasProperty(p, EP_WinFunc) ){ + pNew->y.pWin = sqlite3WindowDup(db, pNew, p->y.pWin); + assert( ExprHasProperty(pNew, EP_WinFunc) ); } #endif /* SQLITE_OMIT_WINDOWFUNC */ + if( pzBuffer ){ + *pzBuffer = zAlloc; + } + }else{ if( !ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){ if( pNew->op==TK_SELECT_COLUMN ){ pNew->pLeft = p->pLeft; @@ -97083,9 +100027,6 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ pNew->pRight = sqlite3ExprDup(db, p->pRight, 0); } } - if( pzBuffer ){ - *pzBuffer = zAlloc; - } } return pNew; } @@ -97099,7 +100040,7 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ static With *withDup(sqlite3 *db, With *p){ With *pRet = 0; if( p ){ - int nByte = sizeof(*p) + sizeof(p->a[0]) * (p->nCte-1); + sqlite3_int64 nByte = sizeof(*p) + sizeof(p->a[0]) * (p->nCte-1); pRet = sqlite3DbMallocZero(db, nByte); if( pRet ){ int i; @@ -97117,6 +100058,39 @@ static With *withDup(sqlite3 *db, With *p){ # define withDup(x,y) 0 #endif +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** The gatherSelectWindows() procedure and its helper routine +** gatherSelectWindowsCallback() are used to scan all the expressions +** an a newly duplicated SELECT statement and gather all of the Window +** objects found there, assembling them onto the linked list at Select->pWin. +*/ +static int gatherSelectWindowsCallback(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_FUNCTION && ExprHasProperty(pExpr, EP_WinFunc) ){ + Select *pSelect = pWalker->u.pSelect; + Window *pWin = pExpr->y.pWin; + assert( pWin ); + assert( IsWindowFunc(pExpr) ); + assert( pWin->ppThis==0 ); + sqlite3WindowLink(pSelect, pWin); + } + return WRC_Continue; +} +static int gatherSelectWindowsSelectCallback(Walker *pWalker, Select *p){ + return p==pWalker->u.pSelect ? WRC_Continue : WRC_Prune; +} +static void gatherSelectWindows(Select *p){ + Walker w; + w.xExprCallback = gatherSelectWindowsCallback; + w.xSelectCallback = gatherSelectWindowsSelectCallback; + w.xSelectCallback2 = 0; + w.pParse = 0; + w.u.pSelect = p; + sqlite3WalkSelect(&w, p); +} +#endif + + /* ** The following group of routines make deep copies of expressions, ** expression lists, ID lists, and select statements. The copies can @@ -97170,11 +100144,11 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags) pNewExpr->pLeft = pPriorSelectCol; } } - pItem->zName = sqlite3DbStrDup(db, pOldItem->zName); - pItem->zSpan = sqlite3DbStrDup(db, pOldItem->zSpan); - pItem->sortOrder = pOldItem->sortOrder; + pItem->zEName = sqlite3DbStrDup(db, pOldItem->zEName); + pItem->sortFlags = pOldItem->sortFlags; + pItem->eEName = pOldItem->eEName; pItem->done = 0; - pItem->bSpanIsTab = pOldItem->bSpanIsTab; + pItem->bNulls = pOldItem->bNulls; pItem->bSorterRef = pOldItem->bSorterRef; pItem->u = pOldItem->u; } @@ -97284,6 +100258,7 @@ SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){ #ifndef SQLITE_OMIT_WINDOWFUNC pNew->pWin = 0; pNew->pWinDefn = sqlite3WindowListDup(db, p->pWinDefn); + if( p->pWin && db->mallocFailed==0 ) gatherSelectWindows(pNew); #endif pNew->selId = p->selId; *pp = pNew; @@ -97333,16 +100308,16 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppend( }else if( (pList->nExpr & (pList->nExpr-1))==0 ){ ExprList *pNew; pNew = sqlite3DbRealloc(db, pList, - sizeof(*pList)+(2*pList->nExpr - 1)*sizeof(pList->a[0])); + sizeof(*pList)+(2*(sqlite3_int64)pList->nExpr-1)*sizeof(pList->a[0])); if( pNew==0 ){ goto no_mem; } pList = pNew; } pItem = &pList->a[pList->nExpr++]; - assert( offsetof(struct ExprList_item,zName)==sizeof(pItem->pExpr) ); + assert( offsetof(struct ExprList_item,zEName)==sizeof(pItem->pExpr) ); assert( offsetof(struct ExprList_item,pExpr)==0 ); - memset(&pItem->zName,0,sizeof(*pItem)-offsetof(struct ExprList_item,zName)); + memset(&pItem->zEName,0,sizeof(*pItem)-offsetof(struct ExprList_item,zEName)); pItem->pExpr = pExpr; return pList; @@ -97392,10 +100367,14 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector( for(i=0; inId; i++){ Expr *pSubExpr = sqlite3ExprForVectorField(pParse, pExpr, i); + assert( pSubExpr!=0 || db->mallocFailed ); + assert( pSubExpr==0 || pSubExpr->iTable==0 ); + if( pSubExpr==0 ) continue; + pSubExpr->iTable = pColumns->nId; pList = sqlite3ExprListAppend(pParse, pList, pSubExpr); if( pList ){ assert( pList->nExpr==iFirst+i+1 ); - pList->a[pList->nExpr-1].zName = pColumns->a[i].zName; + pList->a[pList->nExpr-1].zEName = pColumns->a[i].zName; pColumns->a[i].zName = 0; } } @@ -97416,7 +100395,7 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector( } vector_append_error: - sqlite3ExprDelete(db, pExpr); + sqlite3ExprUnmapAndDelete(pParse, pExpr); sqlite3IdListDelete(db, pColumns); return pList; } @@ -97424,19 +100403,38 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector( /* ** Set the sort order for the last element on the given ExprList. */ -SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder){ +SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder, int eNulls){ + struct ExprList_item *pItem; if( p==0 ) return; - assert( SQLITE_SO_UNDEFINED<0 && SQLITE_SO_ASC>=0 && SQLITE_SO_DESC>0 ); assert( p->nExpr>0 ); - if( iSortOrder<0 ){ - assert( p->a[p->nExpr-1].sortOrder==SQLITE_SO_ASC ); - return; + + assert( SQLITE_SO_UNDEFINED<0 && SQLITE_SO_ASC==0 && SQLITE_SO_DESC>0 ); + assert( iSortOrder==SQLITE_SO_UNDEFINED + || iSortOrder==SQLITE_SO_ASC + || iSortOrder==SQLITE_SO_DESC + ); + assert( eNulls==SQLITE_SO_UNDEFINED + || eNulls==SQLITE_SO_ASC + || eNulls==SQLITE_SO_DESC + ); + + pItem = &p->a[p->nExpr-1]; + assert( pItem->bNulls==0 ); + if( iSortOrder==SQLITE_SO_UNDEFINED ){ + iSortOrder = SQLITE_SO_ASC; + } + pItem->sortFlags = (u8)iSortOrder; + + if( eNulls!=SQLITE_SO_UNDEFINED ){ + pItem->bNulls = 1; + if( iSortOrder!=eNulls ){ + pItem->sortFlags |= KEYINFO_ORDER_BIGNULL; + } } - p->a[p->nExpr-1].sortOrder = (u8)iSortOrder; } /* -** Set the ExprList.a[].zName element of the most recently added item +** Set the ExprList.a[].zEName element of the most recently added item ** on the expression list. ** ** pList might be NULL following an OOM error. But pName should never be @@ -97454,11 +100452,12 @@ SQLITE_PRIVATE void sqlite3ExprListSetName( struct ExprList_item *pItem; assert( pList->nExpr>0 ); pItem = &pList->a[pList->nExpr-1]; - assert( pItem->zName==0 ); - pItem->zName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n); - if( dequote ) sqlite3Dequote(pItem->zName); + assert( pItem->zEName==0 ); + assert( pItem->eEName==ENAME_NAME ); + pItem->zEName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n); + if( dequote ) sqlite3Dequote(pItem->zEName); if( IN_RENAME_OBJECT ){ - sqlite3RenameTokenMap(pParse, (void*)pItem->zName, pName); + sqlite3RenameTokenMap(pParse, (void*)pItem->zEName, pName); } } } @@ -97482,8 +100481,10 @@ SQLITE_PRIVATE void sqlite3ExprListSetSpan( if( pList ){ struct ExprList_item *pItem = &pList->a[pList->nExpr-1]; assert( pList->nExpr>0 ); - sqlite3DbFree(db, pItem->zSpan); - pItem->zSpan = sqlite3DbSpanDup(db, zStart, zEnd); + if( pItem->zEName==0 ){ + pItem->zEName = sqlite3DbSpanDup(db, zStart, zEnd); + pItem->eEName = ENAME_SPAN; + } } } @@ -97513,8 +100514,7 @@ static SQLITE_NOINLINE void exprListDeleteNN(sqlite3 *db, ExprList *pList){ assert( pList->nExpr>0 ); do{ sqlite3ExprDelete(db, pItem->pExpr); - sqlite3DbFree(db, pItem->zName); - sqlite3DbFree(db, pItem->zSpan); + sqlite3DbFree(db, pItem->zEName); pItem++; }while( --i>0 ); sqlite3DbFreeNN(db, pList); @@ -97552,17 +100552,34 @@ SQLITE_PRIVATE int sqlite3SelectWalkFail(Walker *pWalker, Select *NotUsed){ return WRC_Abort; } +/* +** Check the input string to see if it is "true" or "false" (in any case). +** +** If the string is.... Return +** "true" EP_IsTrue +** "false" EP_IsFalse +** anything else 0 +*/ +SQLITE_PRIVATE u32 sqlite3IsTrueOrFalse(const char *zIn){ + if( sqlite3StrICmp(zIn, "true")==0 ) return EP_IsTrue; + if( sqlite3StrICmp(zIn, "false")==0 ) return EP_IsFalse; + return 0; +} + + /* ** If the input expression is an ID with the name "true" or "false" ** then convert it into an TK_TRUEFALSE term. Return non-zero if ** the conversion happened, and zero if the expression is unaltered. */ SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr *pExpr){ + u32 v; assert( pExpr->op==TK_ID || pExpr->op==TK_STRING ); - if( sqlite3StrICmp(pExpr->u.zToken, "true")==0 - || sqlite3StrICmp(pExpr->u.zToken, "false")==0 + if( !ExprHasProperty(pExpr, EP_Quoted) + && (v = sqlite3IsTrueOrFalse(pExpr->u.zToken))!=0 ){ pExpr->op = TK_TRUEFALSE; + ExprSetProperty(pExpr, v); return 1; } return 0; @@ -97573,12 +100590,40 @@ SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr *pExpr){ ** and 0 if it is FALSE. */ SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr *pExpr){ + pExpr = sqlite3ExprSkipCollate((Expr*)pExpr); assert( pExpr->op==TK_TRUEFALSE ); assert( sqlite3StrICmp(pExpr->u.zToken,"true")==0 || sqlite3StrICmp(pExpr->u.zToken,"false")==0 ); return pExpr->u.zToken[4]==0; } +/* +** If pExpr is an AND or OR expression, try to simplify it by eliminating +** terms that are always true or false. Return the simplified expression. +** Or return the original expression if no simplification is possible. +** +** Examples: +** +** (x<10) AND true => (x<10) +** (x<10) AND false => false +** (x<10) AND (y=22 OR false) => (x<10) AND (y=22) +** (x<10) AND (y=22 OR true) => (x<10) +** (y=22) OR true => true +*/ +SQLITE_PRIVATE Expr *sqlite3ExprSimplifiedAndOr(Expr *pExpr){ + assert( pExpr!=0 ); + if( pExpr->op==TK_AND || pExpr->op==TK_OR ){ + Expr *pRight = sqlite3ExprSimplifiedAndOr(pExpr->pRight); + Expr *pLeft = sqlite3ExprSimplifiedAndOr(pExpr->pLeft); + if( ExprAlwaysTrue(pLeft) || ExprAlwaysFalse(pRight) ){ + pExpr = pExpr->op==TK_AND ? pRight : pLeft; + }else if( ExprAlwaysTrue(pRight) || ExprAlwaysFalse(pLeft) ){ + pExpr = pExpr->op==TK_AND ? pLeft : pRight; + } + } + return pExpr; +} + /* ** These routines are Walker callbacks used to check expressions to @@ -97596,10 +100641,11 @@ SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr *pExpr){ ** In all cases, the callbacks set Walker.eCode=0 and abort if the expression ** is found to not be a constant. ** -** The sqlite3ExprIsConstantOrFunction() is used for evaluating expressions -** in a CREATE TABLE statement. The Walker.eCode value is 5 when parsing -** an existing schema and 4 when processing a new statement. A bound -** parameter raises an error for new statements, but is silently converted +** The sqlite3ExprIsConstantOrFunction() is used for evaluating DEFAULT +** expressions in a CREATE TABLE statement. The Walker.eCode value is 5 +** when parsing an existing schema out of the sqlite_master table and 4 +** when processing a new CREATE TABLE statement. A bound parameter raises +** an error for new statements, but is silently converted ** to NULL for existing schemas. This allows sqlite_master tables that ** contain a bound parameter because they were generated by older versions ** of SQLite to be parsed by newer versions of SQLite without raising a @@ -97620,7 +100666,10 @@ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ ** and either pWalker->eCode==4 or 5 or the function has the ** SQLITE_FUNC_CONST flag. */ case TK_FUNCTION: - if( pWalker->eCode>=4 || ExprHasProperty(pExpr,EP_ConstFunc) ){ + if( (pWalker->eCode>=4 || ExprHasProperty(pExpr,EP_ConstFunc)) + && !ExprHasProperty(pExpr, EP_WinFunc) + ){ + if( pWalker->eCode==5 ) ExprSetProperty(pExpr, EP_FromDDL); return WRC_Continue; }else{ pWalker->eCode = 0; @@ -97784,9 +100833,21 @@ SQLITE_PRIVATE int sqlite3ExprIsConstantOrGroupBy(Parse *pParse, Expr *p, ExprLi } /* -** Walk an expression tree. Return non-zero if the expression is constant -** or a function call with constant arguments. Return and 0 if there -** are any variables. +** Walk an expression tree for the DEFAULT field of a column definition +** in a CREATE TABLE statement. Return non-zero if the expression is +** acceptable for use as a DEFAULT. That is to say, return non-zero if +** the expression is constant or a function call with constant arguments. +** Return and 0 if there are any variables. +** +** isInit is true when parsing from sqlite_master. isInit is false when +** processing a new CREATE TABLE statement. When isInit is true, parameters +** (such as ? or $abc) in the expression are converted into NULL. When +** isInit is false, parameters raise an error. Parameters should not be +** allowed in a CREATE TABLE statement, but some legacy versions of SQLite +** allowed it, so we need to support it when reading sqlite_master for +** backwards compatibility. +** +** If isInit is true, set EP_FromDDL on every TK_FUNCTION node. ** ** For the purposes of this function, a double-quoted string (ex: "abc") ** is considered a variable but a single-quoted string (ex: 'abc') is @@ -97823,7 +100884,7 @@ SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr *p){ */ SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr *p, int *pValue){ int rc = 0; - if( p==0 ) return 0; /* Can only happen following on OOM */ + if( NEVER(p==0) ) return 0; /* Used to only happen following on OOM */ /* If an expression is an integer literal that fits in a signed 32-bit ** integer, then the EP_IntValue flag will have already been set */ @@ -97869,7 +100930,9 @@ SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr *p, int *pValue){ */ SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){ u8 op; - while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; } + while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ + p = p->pLeft; + } op = p->op; if( op==TK_REGISTER ) op = p->op2; switch( op ){ @@ -97880,8 +100943,10 @@ SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){ return 0; case TK_COLUMN: return ExprHasProperty(p, EP_CanBeNull) || - p->pTab==0 || /* Reference to column of index on expression */ - (p->iColumn>=0 && p->pTab->aCol[p->iColumn].notNull==0); + p->y.pTab==0 || /* Reference to column of index on expression */ + (p->iColumn>=0 + && ALWAYS(p->y.pTab->aCol!=0) /* Defense against OOM problems */ + && p->y.pTab->aCol[p->iColumn].notNull==0); default: return 1; } @@ -97899,27 +100964,30 @@ SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){ */ SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){ u8 op; + int unaryMinus = 0; if( aff==SQLITE_AFF_BLOB ) return 1; - while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; } + while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ + if( p->op==TK_UMINUS ) unaryMinus = 1; + p = p->pLeft; + } op = p->op; if( op==TK_REGISTER ) op = p->op2; switch( op ){ case TK_INTEGER: { - return aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC; + return aff>=SQLITE_AFF_NUMERIC; } case TK_FLOAT: { - return aff==SQLITE_AFF_REAL || aff==SQLITE_AFF_NUMERIC; + return aff>=SQLITE_AFF_NUMERIC; } case TK_STRING: { - return aff==SQLITE_AFF_TEXT; + return !unaryMinus && aff==SQLITE_AFF_TEXT; } case TK_BLOB: { - return 1; + return !unaryMinus; } case TK_COLUMN: { assert( p->iTable>=0 ); /* p cannot be part of a CHECK constraint */ - return p->iColumn<0 - && (aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC); + return aff>=SQLITE_AFF_NUMERIC && p->iColumn<0; } default: { return 0; @@ -98102,10 +101170,11 @@ static int sqlite3InRhsIsConstant(Expr *pIn){ #ifndef SQLITE_OMIT_SUBQUERY SQLITE_PRIVATE int sqlite3FindInIndex( Parse *pParse, /* Parsing context */ - Expr *pX, /* The right-hand side (RHS) of the IN operator */ + Expr *pX, /* The IN expression */ u32 inFlags, /* IN_INDEX_LOOP, _MEMBERSHIP, and/or _NOOP_OK */ int *prRhsHasNull, /* Register holding NULL status. See notes */ - int *aiMap /* Mapping from Index fields to RHS fields */ + int *aiMap, /* Mapping from Index fields to RHS fields */ + int *piTab /* OUT: index to use */ ){ Select *p; /* SELECT to the right of IN operator */ int eType = 0; /* Type of RHS table. IN_INDEX_* */ @@ -98200,6 +101269,7 @@ SQLITE_PRIVATE int sqlite3FindInIndex( Bitmask colUsed; /* Columns of the index used */ Bitmask mCol; /* Mask for the current column */ if( pIdx->nColumnpPartIdxWhere!=0 ) continue; /* Maximum nColumn is BMS-2, not BMS-1, so that we can compute ** BITMASK(nExpr) without overflowing */ testcase( pIdx->nColumn==BMS-2 ); @@ -98290,16 +101360,15 @@ SQLITE_PRIVATE int sqlite3FindInIndex( eType = IN_INDEX_EPH; if( inFlags & IN_INDEX_LOOP ){ pParse->nQueryLoop = 0; - if( pX->pLeft->iColumn<0 && !ExprHasProperty(pX, EP_xIsSelect) ){ - eType = IN_INDEX_ROWID; - } }else if( prRhsHasNull ){ *prRhsHasNull = rMayHaveNull = ++pParse->nMem; } - sqlite3CodeSubselect(pParse, pX, rMayHaveNull, eType==IN_INDEX_ROWID); + assert( pX->op==TK_IN ); + sqlite3CodeRhsOfIN(pParse, pX, iTab); + if( rMayHaveNull ){ + sqlite3SetHasNullFlag(v, iTab, rMayHaveNull); + } pParse->nQueryLoop = savedNQueryLoop; - }else{ - pX->iTable = iTab; } if( aiMap && eType!=IN_INDEX_INDEX_ASC && eType!=IN_INDEX_INDEX_DESC ){ @@ -98307,6 +101376,7 @@ SQLITE_PRIVATE int sqlite3FindInIndex( n = sqlite3ExprVectorSize(pX->pLeft); for(i=0; inErr==0 ){ + const char *zFmt = "sub-select returns %d columns - expected %d"; + sqlite3ErrorMsg(pParse, zFmt, nActual, nExpect); + } } #endif @@ -98380,260 +101452,316 @@ SQLITE_PRIVATE void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ } } +#ifndef SQLITE_OMIT_SUBQUERY /* -** Generate code for scalar subqueries used as a subquery expression, EXISTS, -** or IN operators. Examples: +** Generate code that will construct an ephemeral table containing all terms +** in the RHS of an IN operator. The IN operator can be in either of two +** forms: ** -** (SELECT a FROM b) -- subquery -** EXISTS (SELECT a FROM b) -- EXISTS subquery ** x IN (4,5,11) -- IN operator with list on right-hand side ** x IN (SELECT a FROM b) -- IN operator with subquery on the right ** -** The pExpr parameter describes the expression that contains the IN -** operator or subquery. -** -** If parameter isRowid is non-zero, then expression pExpr is guaranteed -** to be of the form " IN (?, ?, ?)", where is a reference -** to some integer key column of a table B-Tree. In this case, use an -** intkey B-Tree to store the set of IN(...) values instead of the usual -** (slower) variable length keys B-Tree. -** -** If rMayHaveNull is non-zero, that means that the operation is an IN -** (not a SELECT or EXISTS) and that the RHS might contains NULLs. -** All this routine does is initialize the register given by rMayHaveNull -** to NULL. Calling routines will take care of changing this register -** value to non-NULL if the RHS is NULL-free. -** -** For a SELECT or EXISTS operator, return the register that holds the -** result. For a multi-column SELECT, the result is stored in a contiguous -** array of registers and the return value is the register of the left-most -** result column. Return 0 for IN operators or if an error occurs. -*/ -#ifndef SQLITE_OMIT_SUBQUERY -SQLITE_PRIVATE int sqlite3CodeSubselect( +** The pExpr parameter is the IN operator. The cursor number for the +** constructed ephermeral table is returned. The first time the ephemeral +** table is computed, the cursor number is also stored in pExpr->iTable, +** however the cursor number returned might not be the same, as it might +** have been duplicated using OP_OpenDup. +** +** If the LHS expression ("x" in the examples) is a column value, or +** the SELECT statement returns a column value, then the affinity of that +** column is used to build the index keys. If both 'x' and the +** SELECT... statement are columns, then numeric affinity is used +** if either column has NUMERIC or INTEGER affinity. If neither +** 'x' nor the SELECT... statement are columns, then numeric affinity +** is used. +*/ +SQLITE_PRIVATE void sqlite3CodeRhsOfIN( Parse *pParse, /* Parsing context */ - Expr *pExpr, /* The IN, SELECT, or EXISTS operator */ - int rHasNullFlag, /* Register that records whether NULLs exist in RHS */ - int isRowid /* If true, LHS of IN operator is a rowid */ + Expr *pExpr, /* The IN operator */ + int iTab /* Use this cursor number */ ){ - int jmpIfDynamic = -1; /* One-time test address */ - int rReg = 0; /* Register storing resulting */ - Vdbe *v = sqlite3GetVdbe(pParse); - if( NEVER(v==0) ) return 0; + int addrOnce = 0; /* Address of the OP_Once instruction at top */ + int addr; /* Address of OP_OpenEphemeral instruction */ + Expr *pLeft; /* the LHS of the IN operator */ + KeyInfo *pKeyInfo = 0; /* Key information */ + int nVal; /* Size of vector pLeft */ + Vdbe *v; /* The prepared statement under construction */ + + v = pParse->pVdbe; + assert( v!=0 ); - /* The evaluation of the IN/EXISTS/SELECT must be repeated every time it + /* The evaluation of the IN must be repeated every time it ** is encountered if any of the following is true: ** ** * The right-hand side is a correlated subquery ** * The right-hand side is an expression list containing variables ** * We are inside a trigger ** - ** If all of the above are false, then we can run this code just once - ** save the results, and reuse the same result on subsequent invocations. + ** If all of the above are false, then we can compute the RHS just once + ** and reuse it many names. */ - if( !ExprHasProperty(pExpr, EP_VarSelect) ){ - jmpIfDynamic = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); - } + if( !ExprHasProperty(pExpr, EP_VarSelect) && pParse->iSelfTab==0 ){ + /* Reuse of the RHS is allowed */ + /* If this routine has already been coded, but the previous code + ** might not have been invoked yet, so invoke it now as a subroutine. + */ + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + ExplainQueryPlan((pParse, 0, "REUSE LIST SUBQUERY %d", + pExpr->x.pSelect->selId)); + } + sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr); + sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable); + sqlite3VdbeJumpHere(v, addrOnce); + return; + } - switch( pExpr->op ){ - case TK_IN: { - int addr; /* Address of OP_OpenEphemeral instruction */ - Expr *pLeft = pExpr->pLeft; /* the LHS of the IN operator */ - KeyInfo *pKeyInfo = 0; /* Key information */ - int nVal; /* Size of vector pLeft */ - - nVal = sqlite3ExprVectorSize(pLeft); - assert( !isRowid || nVal==1 ); + /* Begin coding the subroutine */ + ExprSetProperty(pExpr, EP_Subrtn); + pExpr->y.sub.regReturn = ++pParse->nMem; + pExpr->y.sub.iAddr = + sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1; + VdbeComment((v, "return address")); - /* Whether this is an 'x IN(SELECT...)' or an 'x IN()' - ** expression it is handled the same way. An ephemeral table is - ** filled with index keys representing the results from the - ** SELECT or the . - ** - ** If the 'x' expression is a column value, or the SELECT... - ** statement returns a column value, then the affinity of that - ** column is used to build the index keys. If both 'x' and the - ** SELECT... statement are columns, then numeric affinity is used - ** if either column has NUMERIC or INTEGER affinity. If neither - ** 'x' nor the SELECT... statement are columns, then numeric affinity - ** is used. - */ - pExpr->iTable = pParse->nTab++; - addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, - pExpr->iTable, (isRowid?0:nVal)); - pKeyInfo = isRowid ? 0 : sqlite3KeyInfoAlloc(pParse->db, nVal, 1); + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ - /* Case 1: expr IN (SELECT ...) - ** - ** Generate code to write the results of the select into the temporary - ** table allocated and opened above. - */ - Select *pSelect = pExpr->x.pSelect; - ExprList *pEList = pSelect->pEList; - - ExplainQueryPlan((pParse, 1, "%sLIST SUBQUERY", - jmpIfDynamic>=0?"":"CORRELATED " - )); - assert( !isRowid ); - /* If the LHS and RHS of the IN operator do not match, that - ** error will have been caught long before we reach this point. */ - if( ALWAYS(pEList->nExpr==nVal) ){ - SelectDest dest; - int i; - sqlite3SelectDestInit(&dest, SRT_Set, pExpr->iTable); - dest.zAffSdst = exprINAffinity(pParse, pExpr); - pSelect->iLimit = 0; - testcase( pSelect->selFlags & SF_Distinct ); - testcase( pKeyInfo==0 ); /* Caused by OOM in sqlite3KeyInfoAlloc() */ - if( sqlite3Select(pParse, pSelect, &dest) ){ - sqlite3DbFree(pParse->db, dest.zAffSdst); - sqlite3KeyInfoUnref(pKeyInfo); - return 0; - } - sqlite3DbFree(pParse->db, dest.zAffSdst); - assert( pKeyInfo!=0 ); /* OOM will cause exit after sqlite3Select() */ - assert( pEList!=0 ); - assert( pEList->nExpr>0 ); - assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); - for(i=0; iaColl[i] = sqlite3BinaryCompareCollSeq( - pParse, p, pEList->a[i].pExpr - ); - } - } - }else if( ALWAYS(pExpr->x.pList!=0) ){ - /* Case 2: expr IN (exprlist) - ** - ** For each expression, build an index key from the evaluation and - ** store it in the temporary table. If is a column, then use - ** that columns affinity when building index keys. If is not - ** a column, use numeric affinity. - */ - char affinity; /* Affinity of the LHS of the IN */ - int i; - ExprList *pList = pExpr->x.pList; - struct ExprList_item *pItem; - int r1, r2, r3; - affinity = sqlite3ExprAffinity(pLeft); - if( !affinity ){ - affinity = SQLITE_AFF_BLOB; - } - if( pKeyInfo ){ - assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); - pKeyInfo->aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft); - } + /* Check to see if this is a vector IN operator */ + pLeft = pExpr->pLeft; + nVal = sqlite3ExprVectorSize(pLeft); - /* Loop through each expression in . */ - r1 = sqlite3GetTempReg(pParse); - r2 = sqlite3GetTempReg(pParse); - if( isRowid ) sqlite3VdbeAddOp4(v, OP_Blob, 0, r2, 0, "", P4_STATIC); - for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ - Expr *pE2 = pItem->pExpr; - int iValToIns; - - /* If the expression is not constant then we will need to - ** disable the test that was generated above that makes sure - ** this code only executes once. Because for a non-constant - ** expression we need to rerun this code each time. - */ - if( jmpIfDynamic>=0 && !sqlite3ExprIsConstant(pE2) ){ - sqlite3VdbeChangeToNoop(v, jmpIfDynamic); - jmpIfDynamic = -1; - } + /* Construct the ephemeral table that will contain the content of + ** RHS of the IN operator. + */ + pExpr->iTable = iTab; + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, nVal); +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + VdbeComment((v, "Result of SELECT %u", pExpr->x.pSelect->selId)); + }else{ + VdbeComment((v, "RHS of IN operator")); + } +#endif + pKeyInfo = sqlite3KeyInfoAlloc(pParse->db, nVal, 1); - /* Evaluate the expression and insert it into the temp table */ - if( isRowid && sqlite3ExprIsInteger(pE2, &iValToIns) ){ - sqlite3VdbeAddOp3(v, OP_InsertInt, pExpr->iTable, r2, iValToIns); - }else{ - r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); - if( isRowid ){ - sqlite3VdbeAddOp2(v, OP_MustBeInt, r3, - sqlite3VdbeCurrentAddr(v)+2); - VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_Insert, pExpr->iTable, r2, r3); - }else{ - sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); - sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pExpr->iTable, r2, r3, 1); - } - } - } - sqlite3ReleaseTempReg(pParse, r1); - sqlite3ReleaseTempReg(pParse, r2); + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + /* Case 1: expr IN (SELECT ...) + ** + ** Generate code to write the results of the select into the temporary + ** table allocated and opened above. + */ + Select *pSelect = pExpr->x.pSelect; + ExprList *pEList = pSelect->pEList; + + ExplainQueryPlan((pParse, 1, "%sLIST SUBQUERY %d", + addrOnce?"":"CORRELATED ", pSelect->selId + )); + /* If the LHS and RHS of the IN operator do not match, that + ** error will have been caught long before we reach this point. */ + if( ALWAYS(pEList->nExpr==nVal) ){ + SelectDest dest; + int i; + sqlite3SelectDestInit(&dest, SRT_Set, iTab); + dest.zAffSdst = exprINAffinity(pParse, pExpr); + pSelect->iLimit = 0; + testcase( pSelect->selFlags & SF_Distinct ); + testcase( pKeyInfo==0 ); /* Caused by OOM in sqlite3KeyInfoAlloc() */ + if( sqlite3Select(pParse, pSelect, &dest) ){ + sqlite3DbFree(pParse->db, dest.zAffSdst); + sqlite3KeyInfoUnref(pKeyInfo); + return; } - if( pKeyInfo ){ - sqlite3VdbeChangeP4(v, addr, (void *)pKeyInfo, P4_KEYINFO); + sqlite3DbFree(pParse->db, dest.zAffSdst); + assert( pKeyInfo!=0 ); /* OOM will cause exit after sqlite3Select() */ + assert( pEList!=0 ); + assert( pEList->nExpr>0 ); + assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); + for(i=0; iaColl[i] = sqlite3BinaryCompareCollSeq( + pParse, p, pEList->a[i].pExpr + ); } - break; + } + }else if( ALWAYS(pExpr->x.pList!=0) ){ + /* Case 2: expr IN (exprlist) + ** + ** For each expression, build an index key from the evaluation and + ** store it in the temporary table. If is a column, then use + ** that columns affinity when building index keys. If is not + ** a column, use numeric affinity. + */ + char affinity; /* Affinity of the LHS of the IN */ + int i; + ExprList *pList = pExpr->x.pList; + struct ExprList_item *pItem; + int r1, r2; + affinity = sqlite3ExprAffinity(pLeft); + if( affinity<=SQLITE_AFF_NONE ){ + affinity = SQLITE_AFF_BLOB; + } + if( pKeyInfo ){ + assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); + pKeyInfo->aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft); } - case TK_EXISTS: - case TK_SELECT: - default: { - /* Case 3: (SELECT ... FROM ...) - ** or: EXISTS(SELECT ... FROM ...) - ** - ** For a SELECT, generate code to put the values for all columns of - ** the first row into an array of registers and return the index of - ** the first register. - ** - ** If this is an EXISTS, write an integer 0 (not exists) or 1 (exists) - ** into a register and return that register number. - ** - ** In both cases, the query is augmented with "LIMIT 1". Any - ** preexisting limit is discarded in place of the new LIMIT 1. + /* Loop through each expression in . */ + r1 = sqlite3GetTempReg(pParse); + r2 = sqlite3GetTempReg(pParse); + for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ + Expr *pE2 = pItem->pExpr; + + /* If the expression is not constant then we will need to + ** disable the test that was generated above that makes sure + ** this code only executes once. Because for a non-constant + ** expression we need to rerun this code each time. */ - Select *pSel; /* SELECT statement to encode */ - SelectDest dest; /* How to deal with SELECT result */ - int nReg; /* Registers to allocate */ - Expr *pLimit; /* New limit expression */ - - testcase( pExpr->op==TK_EXISTS ); - testcase( pExpr->op==TK_SELECT ); - assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT ); - assert( ExprHasProperty(pExpr, EP_xIsSelect) ); - - pSel = pExpr->x.pSelect; - ExplainQueryPlan((pParse, 1, "%sSCALAR SUBQUERY", - jmpIfDynamic>=0?"":"CORRELATED ")); - nReg = pExpr->op==TK_SELECT ? pSel->pEList->nExpr : 1; - sqlite3SelectDestInit(&dest, 0, pParse->nMem+1); - pParse->nMem += nReg; - if( pExpr->op==TK_SELECT ){ - dest.eDest = SRT_Mem; - dest.iSdst = dest.iSDParm; - dest.nSdst = nReg; - sqlite3VdbeAddOp3(v, OP_Null, 0, dest.iSDParm, dest.iSDParm+nReg-1); - VdbeComment((v, "Init subquery result")); - }else{ - dest.eDest = SRT_Exists; - sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm); - VdbeComment((v, "Init EXISTS result")); - } - pLimit = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[1], 0); - if( pSel->pLimit ){ - sqlite3ExprDelete(pParse->db, pSel->pLimit->pLeft); - pSel->pLimit->pLeft = pLimit; - }else{ - pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0); - } - pSel->iLimit = 0; - if( sqlite3Select(pParse, pSel, &dest) ){ - return 0; + if( addrOnce && !sqlite3ExprIsConstant(pE2) ){ + sqlite3VdbeChangeToNoop(v, addrOnce); + ExprClearProperty(pExpr, EP_Subrtn); + addrOnce = 0; } - rReg = dest.iSDParm; - ExprSetVVAProperty(pExpr, EP_NoReduce); - break; + + /* Evaluate the expression and insert it into the temp table */ + sqlite3ExprCode(pParse, pE2, r1); + sqlite3VdbeAddOp4(v, OP_MakeRecord, r1, 1, r2, &affinity, 1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r2, r1, 1); } + sqlite3ReleaseTempReg(pParse, r1); + sqlite3ReleaseTempReg(pParse, r2); + } + if( pKeyInfo ){ + sqlite3VdbeChangeP4(v, addr, (void *)pKeyInfo, P4_KEYINFO); } + if( addrOnce ){ + sqlite3VdbeJumpHere(v, addrOnce); + /* Subroutine return */ + sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); + sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); + sqlite3ClearTempRegCache(pParse); + } +} +#endif /* SQLITE_OMIT_SUBQUERY */ + +/* +** Generate code for scalar subqueries used as a subquery expression +** or EXISTS operator: +** +** (SELECT a FROM b) -- subquery +** EXISTS (SELECT a FROM b) -- EXISTS subquery +** +** The pExpr parameter is the SELECT or EXISTS operator to be coded. +** +** Return the register that holds the result. For a multi-column SELECT, +** the result is stored in a contiguous array of registers and the +** return value is the register of the left-most result column. +** Return 0 if an error occurs. +*/ +#ifndef SQLITE_OMIT_SUBQUERY +SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ + int addrOnce = 0; /* Address of OP_Once at top of subroutine */ + int rReg = 0; /* Register storing resulting */ + Select *pSel; /* SELECT statement to encode */ + SelectDest dest; /* How to deal with SELECT result */ + int nReg; /* Registers to allocate */ + Expr *pLimit; /* New limit expression */ + + Vdbe *v = pParse->pVdbe; + assert( v!=0 ); + testcase( pExpr->op==TK_EXISTS ); + testcase( pExpr->op==TK_SELECT ); + assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT ); + assert( ExprHasProperty(pExpr, EP_xIsSelect) ); + pSel = pExpr->x.pSelect; + + /* The evaluation of the EXISTS/SELECT must be repeated every time it + ** is encountered if any of the following is true: + ** + ** * The right-hand side is a correlated subquery + ** * The right-hand side is an expression list containing variables + ** * We are inside a trigger + ** + ** If all of the above are false, then we can run this code just once + ** save the results, and reuse the same result on subsequent invocations. + */ + if( !ExprHasProperty(pExpr, EP_VarSelect) ){ + /* If this routine has already been coded, then invoke it as a + ** subroutine. */ + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + ExplainQueryPlan((pParse, 0, "REUSE SUBQUERY %d", pSel->selId)); + sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr); + return pExpr->iTable; + } + + /* Begin coding the subroutine */ + ExprSetProperty(pExpr, EP_Subrtn); + pExpr->y.sub.regReturn = ++pParse->nMem; + pExpr->y.sub.iAddr = + sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1; + VdbeComment((v, "return address")); - if( rHasNullFlag ){ - sqlite3SetHasNullFlag(v, pExpr->iTable, rHasNullFlag); + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } + + /* For a SELECT, generate code to put the values for all columns of + ** the first row into an array of registers and return the index of + ** the first register. + ** + ** If this is an EXISTS, write an integer 0 (not exists) or 1 (exists) + ** into a register and return that register number. + ** + ** In both cases, the query is augmented with "LIMIT 1". Any + ** preexisting limit is discarded in place of the new LIMIT 1. + */ + ExplainQueryPlan((pParse, 1, "%sSCALAR SUBQUERY %d", + addrOnce?"":"CORRELATED ", pSel->selId)); + nReg = pExpr->op==TK_SELECT ? pSel->pEList->nExpr : 1; + sqlite3SelectDestInit(&dest, 0, pParse->nMem+1); + pParse->nMem += nReg; + if( pExpr->op==TK_SELECT ){ + dest.eDest = SRT_Mem; + dest.iSdst = dest.iSDParm; + dest.nSdst = nReg; + sqlite3VdbeAddOp3(v, OP_Null, 0, dest.iSDParm, dest.iSDParm+nReg-1); + VdbeComment((v, "Init subquery result")); + }else{ + dest.eDest = SRT_Exists; + sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm); + VdbeComment((v, "Init EXISTS result")); + } + if( pSel->pLimit ){ + /* The subquery already has a limit. If the pre-existing limit is X + ** then make the new limit X<>0 so that the new limit is either 1 or 0 */ + sqlite3 *db = pParse->db; + pLimit = sqlite3Expr(db, TK_INTEGER, "0"); + if( pLimit ){ + pLimit->affExpr = SQLITE_AFF_NUMERIC; + pLimit = sqlite3PExpr(pParse, TK_NE, + sqlite3ExprDup(db, pSel->pLimit->pLeft, 0), pLimit); + } + sqlite3ExprDelete(db, pSel->pLimit->pLeft); + pSel->pLimit->pLeft = pLimit; + }else{ + /* If there is no pre-existing limit add a limit of 1 */ + pLimit = sqlite3Expr(pParse->db, TK_INTEGER, "1"); + pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0); + } + pSel->iLimit = 0; + if( sqlite3Select(pParse, pSel, &dest) ){ + return 0; } + pExpr->iTable = rReg = dest.iSDParm; + ExprSetVVAProperty(pExpr, EP_NoReduce); + if( addrOnce ){ + sqlite3VdbeJumpHere(v, addrOnce); - if( jmpIfDynamic>=0 ){ - sqlite3VdbeJumpHere(v, jmpIfDynamic); + /* Subroutine return */ + sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); + sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); + sqlite3ClearTempRegCache(pParse); } return rReg; @@ -98710,6 +101838,7 @@ static void sqlite3ExprCodeIN( int addrTruthOp; /* Address of opcode that determines the IN is true */ int destNotNull; /* Jump here if a comparison is not true in step 6 */ int addrTop; /* Top of the step-6 loop */ + int iTab = 0; /* Index to use */ pLeft = pExpr->pLeft; if( sqlite3ExprCheckIN(pParse, pExpr) ) return; @@ -98721,7 +101850,7 @@ static void sqlite3ExprCodeIN( if( pParse->db->mallocFailed ) goto sqlite3ExprCodeIN_oom_error; /* Attempt to compute the RHS. After this step, if anything other than - ** IN_INDEX_NOOP is returned, the table opened ith cursor pExpr->iTable + ** IN_INDEX_NOOP is returned, the table opened with cursor iTab ** contains the values that make up the RHS. If IN_INDEX_NOOP is returned, ** the RHS has not yet been coded. */ v = pParse->pVdbe; @@ -98729,7 +101858,8 @@ static void sqlite3ExprCodeIN( VdbeNoopComment((v, "begin IN expr")); eType = sqlite3FindInIndex(pParse, pExpr, IN_INDEX_MEMBERSHIP | IN_INDEX_NOOP_OK, - destIfFalse==destIfNull ? 0 : &rRhsHasNull, aiMap); + destIfFalse==destIfNull ? 0 : &rRhsHasNull, + aiMap, &iTab); assert( pParse->nErr || nVector==1 || eType==IN_INDEX_EPH || eType==IN_INDEX_INDEX_ASC || eType==IN_INDEX_INDEX_DESC @@ -98775,33 +101905,47 @@ static void sqlite3ExprCodeIN( if( eType==IN_INDEX_NOOP ){ ExprList *pList = pExpr->x.pList; CollSeq *pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft); - int labelOk = sqlite3VdbeMakeLabel(v); + int labelOk = sqlite3VdbeMakeLabel(pParse); int r2, regToFree; int regCkNull = 0; int ii; + int bLhsReal; /* True if the LHS of the IN has REAL affinity */ assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); if( destIfNull!=destIfFalse ){ regCkNull = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_BitAnd, rLhs, rLhs, regCkNull); } + bLhsReal = sqlite3ExprAffinity(pExpr->pLeft)==SQLITE_AFF_REAL; for(ii=0; iinExpr; ii++){ - r2 = sqlite3ExprCodeTemp(pParse, pList->a[ii].pExpr, ®ToFree); + if( bLhsReal ){ + r2 = regToFree = sqlite3GetTempReg(pParse); + sqlite3ExprCode(pParse, pList->a[ii].pExpr, r2); + sqlite3VdbeAddOp4(v, OP_Affinity, r2, 1, 0, "E", P4_STATIC); + }else{ + r2 = sqlite3ExprCodeTemp(pParse, pList->a[ii].pExpr, ®ToFree); + } if( regCkNull && sqlite3ExprCanBeNull(pList->a[ii].pExpr) ){ sqlite3VdbeAddOp3(v, OP_BitAnd, regCkNull, r2, regCkNull); } + sqlite3ReleaseTempReg(pParse, regToFree); if( iinExpr-1 || destIfNull!=destIfFalse ){ - sqlite3VdbeAddOp4(v, OP_Eq, rLhs, labelOk, r2, + int op = rLhs!=r2 ? OP_Eq : OP_NotNull; + sqlite3VdbeAddOp4(v, op, rLhs, labelOk, r2, (void*)pColl, P4_COLLSEQ); - VdbeCoverageIf(v, iinExpr-1); - VdbeCoverageIf(v, ii==pList->nExpr-1); + VdbeCoverageIf(v, iinExpr-1 && op==OP_Eq); + VdbeCoverageIf(v, ii==pList->nExpr-1 && op==OP_Eq); + VdbeCoverageIf(v, iinExpr-1 && op==OP_NotNull); + VdbeCoverageIf(v, ii==pList->nExpr-1 && op==OP_NotNull); sqlite3VdbeChangeP5(v, zAff[0]); }else{ + int op = rLhs!=r2 ? OP_Ne : OP_IsNull; assert( destIfNull==destIfFalse ); - sqlite3VdbeAddOp4(v, OP_Ne, rLhs, destIfFalse, r2, - (void*)pColl, P4_COLLSEQ); VdbeCoverage(v); + sqlite3VdbeAddOp4(v, op, rLhs, destIfFalse, r2, + (void*)pColl, P4_COLLSEQ); + VdbeCoverageIf(v, op==OP_Ne); + VdbeCoverageIf(v, op==OP_IsNull); sqlite3VdbeChangeP5(v, zAff[0] | SQLITE_JUMPIFNULL); } - sqlite3ReleaseTempReg(pParse, regToFree); } if( regCkNull ){ sqlite3VdbeAddOp2(v, OP_IsNull, regCkNull, destIfNull); VdbeCoverage(v); @@ -98819,8 +101963,9 @@ static void sqlite3ExprCodeIN( if( destIfNull==destIfFalse ){ destStep2 = destIfFalse; }else{ - destStep2 = destStep6 = sqlite3VdbeMakeLabel(v); + destStep2 = destStep6 = sqlite3VdbeMakeLabel(pParse); } + if( pParse->nErr ) goto sqlite3ExprCodeIN_finished; for(i=0; ipLeft, i); if( sqlite3ExprCanBeNull(p) ){ @@ -98837,19 +101982,19 @@ static void sqlite3ExprCodeIN( /* In this case, the RHS is the ROWID of table b-tree and so we also ** know that the RHS is non-NULL. Hence, we combine steps 3 and 4 ** into a single opcode. */ - sqlite3VdbeAddOp3(v, OP_SeekRowid, pExpr->iTable, destIfFalse, rLhs); + sqlite3VdbeAddOp3(v, OP_SeekRowid, iTab, destIfFalse, rLhs); VdbeCoverage(v); addrTruthOp = sqlite3VdbeAddOp0(v, OP_Goto); /* Return True */ }else{ sqlite3VdbeAddOp4(v, OP_Affinity, rLhs, nVector, 0, zAff, nVector); if( destIfFalse==destIfNull ){ /* Combine Step 3 and Step 5 into a single opcode */ - sqlite3VdbeAddOp4Int(v, OP_NotFound, pExpr->iTable, destIfFalse, + sqlite3VdbeAddOp4Int(v, OP_NotFound, iTab, destIfFalse, rLhs, nVector); VdbeCoverage(v); goto sqlite3ExprCodeIN_finished; } /* Ordinary Step 3, for the case where FALSE and NULL are distinct */ - addrTruthOp = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, + addrTruthOp = sqlite3VdbeAddOp4Int(v, OP_Found, iTab, 0, rLhs, nVector); VdbeCoverage(v); } @@ -98874,10 +102019,10 @@ static void sqlite3ExprCodeIN( ** of the RHS. */ if( destStep6 ) sqlite3VdbeResolveLabel(v, destStep6); - addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, pExpr->iTable, destIfFalse); + addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, destIfFalse); VdbeCoverage(v); if( nVector>1 ){ - destNotNull = sqlite3VdbeMakeLabel(v); + destNotNull = sqlite3VdbeMakeLabel(pParse); }else{ /* For nVector==1, combine steps 6 and 7 by immediately returning ** FALSE if the first comparison is not NULL */ @@ -98889,7 +102034,7 @@ static void sqlite3ExprCodeIN( int r3 = sqlite3GetTempReg(pParse); p = sqlite3VectorFieldSubexpr(pLeft, i); pColl = sqlite3ExprCollSeq(pParse, p); - sqlite3VdbeAddOp3(v, OP_Column, pExpr->iTable, i, r3); + sqlite3VdbeAddOp3(v, OP_Column, iTab, i, r3); sqlite3VdbeAddOp4(v, OP_Ne, rLhs+i, destNotNull, r3, (void*)pColl, P4_COLLSEQ); VdbeCoverage(v); @@ -98898,7 +102043,7 @@ static void sqlite3ExprCodeIN( sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfNull); if( nVector>1 ){ sqlite3VdbeResolveLabel(v, destNotNull); - sqlite3VdbeAddOp2(v, OP_Next, pExpr->iTable, addrTop+1); + sqlite3VdbeAddOp2(v, OP_Next, iTab, addrTop+1); VdbeCoverage(v); /* Step 7: If we reach this point, we know that the result must @@ -99002,16 +102147,45 @@ SQLITE_PRIVATE void sqlite3ExprCodeLoadIndexColumn( } } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* +** Generate code that will compute the value of generated column pCol +** and store the result in register regOut +*/ +SQLITE_PRIVATE void sqlite3ExprCodeGeneratedColumn( + Parse *pParse, + Column *pCol, + int regOut +){ + int iAddr; + Vdbe *v = pParse->pVdbe; + assert( v!=0 ); + assert( pParse->iSelfTab!=0 ); + if( pParse->iSelfTab>0 ){ + iAddr = sqlite3VdbeAddOp3(v, OP_IfNullRow, pParse->iSelfTab-1, 0, regOut); + }else{ + iAddr = 0; + } + sqlite3ExprCode(pParse, pCol->pDflt, regOut); + if( pCol->affinity>=SQLITE_AFF_TEXT ){ + sqlite3VdbeAddOp4(v, OP_Affinity, regOut, 1, 0, &pCol->affinity, 1); + } + if( iAddr ) sqlite3VdbeJumpHere(v, iAddr); +} +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + /* ** Generate code to extract the value of the iCol-th column of a table. */ SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable( - Vdbe *v, /* The VDBE under construction */ + Vdbe *v, /* Parsing context */ Table *pTab, /* The table containing the value */ int iTabCur, /* The table cursor. Or the PK cursor for WITHOUT ROWID */ int iCol, /* Index of the column to extract */ int regOut /* Extract the value into this register */ ){ + Column *pCol; + assert( v!=0 ); if( pTab==0 ){ sqlite3VdbeAddOp3(v, OP_Column, iTabCur, iCol, regOut); return; @@ -99019,14 +102193,36 @@ SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable( if( iCol<0 || iCol==pTab->iPKey ){ sqlite3VdbeAddOp2(v, OP_Rowid, iTabCur, regOut); }else{ - int op = IsVirtual(pTab) ? OP_VColumn : OP_Column; - int x = iCol; - if( !HasRowid(pTab) && !IsVirtual(pTab) ){ - x = sqlite3ColumnOfIndex(sqlite3PrimaryKeyIndex(pTab), iCol); + int op; + int x; + if( IsVirtual(pTab) ){ + op = OP_VColumn; + x = iCol; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + }else if( (pCol = &pTab->aCol[iCol])->colFlags & COLFLAG_VIRTUAL ){ + Parse *pParse = sqlite3VdbeParser(v); + if( pCol->colFlags & COLFLAG_BUSY ){ + sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", pCol->zName); + }else{ + int savedSelfTab = pParse->iSelfTab; + pCol->colFlags |= COLFLAG_BUSY; + pParse->iSelfTab = iTabCur+1; + sqlite3ExprCodeGeneratedColumn(pParse, pCol, regOut); + pParse->iSelfTab = savedSelfTab; + pCol->colFlags &= ~COLFLAG_BUSY; + } + return; +#endif + }else if( !HasRowid(pTab) ){ + testcase( iCol!=sqlite3TableColumnToStorage(pTab, iCol) ); + x = sqlite3TableColumnToIndex(sqlite3PrimaryKeyIndex(pTab), iCol); + op = OP_Column; + }else{ + x = sqlite3TableColumnToStorage(pTab,iCol); + testcase( x!=iCol ); + op = OP_Column; } sqlite3VdbeAddOp3(v, op, iTabCur, x, regOut); - } - if( iCol>=0 ){ sqlite3ColumnDefault(v, pTab, iCol, regOut); } } @@ -99046,11 +102242,11 @@ SQLITE_PRIVATE int sqlite3ExprCodeGetColumn( int iReg, /* Store results here */ u8 p5 /* P5 value for OP_Column + FLAGS */ ){ - Vdbe *v = pParse->pVdbe; - assert( v!=0 ); - sqlite3ExprCodeGetColumnOfTable(v, pTab, iTable, iColumn, iReg); + assert( pParse->pVdbe!=0 ); + sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pTab, iTable, iColumn, iReg); if( p5 ){ - sqlite3VdbeChangeP5(v, p5); + VdbeOp *pOp = sqlite3VdbeGetOp(pParse->pVdbe,-1); + if( pOp->opcode==OP_Column ) pOp->p5 = p5; } return iReg; } @@ -99060,7 +102256,6 @@ SQLITE_PRIVATE int sqlite3ExprCodeGetColumn( ** over to iTo..iTo+nReg-1. */ SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo, int nReg){ - assert( iFrom>=iTo+nReg || iFrom+nReg<=iTo ); sqlite3VdbeAddOp3(pParse->pVdbe, OP_Move, iFrom, iTo, nReg); } @@ -99069,7 +102264,8 @@ SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo, int n ** register iReg. The caller must ensure that iReg already contains ** the correct value for the expression. */ -static void exprToRegister(Expr *p, int iReg){ +static void exprToRegister(Expr *pExpr, int iReg){ + Expr *p = sqlite3ExprSkipCollateAndLikely(pExpr); p->op2 = p->op; p->op = TK_REGISTER; p->iTable = iReg; @@ -99097,7 +102293,7 @@ static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){ #if SQLITE_OMIT_SUBQUERY iResult = 0; #else - iResult = sqlite3CodeSubselect(pParse, p, 0, 0); + iResult = sqlite3CodeSubselect(pParse, p); #endif }else{ int i; @@ -99111,6 +102307,109 @@ static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){ return iResult; } +/* +** Generate code to implement special SQL functions that are implemented +** in-line rather than by using the usual callbacks. +*/ +static int exprCodeInlineFunction( + Parse *pParse, /* Parsing context */ + ExprList *pFarg, /* List of function arguments */ + int iFuncId, /* Function ID. One of the INTFUNC_... values */ + int target /* Store function result in this register */ +){ + int nFarg; + Vdbe *v = pParse->pVdbe; + assert( v!=0 ); + assert( pFarg!=0 ); + nFarg = pFarg->nExpr; + assert( nFarg>0 ); /* All in-line functions have at least one argument */ + switch( iFuncId ){ + case INLINEFUNC_coalesce: { + /* Attempt a direct implementation of the built-in COALESCE() and + ** IFNULL() functions. This avoids unnecessary evaluation of + ** arguments past the first non-NULL argument. + */ + int endCoalesce = sqlite3VdbeMakeLabel(pParse); + int i; + assert( nFarg>=2 ); + sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); + for(i=1; ia[i].pExpr, target); + } + if( sqlite3VdbeGetOp(v, -1)->opcode==OP_Copy ){ + sqlite3VdbeChangeP5(v, 1); /* Tag trailing OP_Copy as not mergable */ + } + sqlite3VdbeResolveLabel(v, endCoalesce); + break; + } + + default: { + /* The UNLIKELY() function is a no-op. The result is the value + ** of the first argument. + */ + assert( nFarg==1 || nFarg==2 ); + target = sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target); + break; + } + + /*********************************************************************** + ** Test-only SQL functions that are only usable if enabled + ** via SQLITE_TESTCTRL_INTERNAL_FUNCTIONS + */ + case INLINEFUNC_expr_compare: { + /* Compare two expressions using sqlite3ExprCompare() */ + assert( nFarg==2 ); + sqlite3VdbeAddOp2(v, OP_Integer, + sqlite3ExprCompare(0,pFarg->a[0].pExpr, pFarg->a[1].pExpr,-1), + target); + break; + } + + case INLINEFUNC_expr_implies_expr: { + /* Compare two expressions using sqlite3ExprImpliesExpr() */ + assert( nFarg==2 ); + sqlite3VdbeAddOp2(v, OP_Integer, + sqlite3ExprImpliesExpr(pParse,pFarg->a[0].pExpr, pFarg->a[1].pExpr,-1), + target); + break; + } + + case INLINEFUNC_implies_nonnull_row: { + /* REsult of sqlite3ExprImpliesNonNullRow() */ + Expr *pA1; + assert( nFarg==2 ); + pA1 = pFarg->a[1].pExpr; + if( pA1->op==TK_COLUMN ){ + sqlite3VdbeAddOp2(v, OP_Integer, + sqlite3ExprImpliesNonNullRow(pFarg->a[0].pExpr,pA1->iTable), + target); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + } + break; + } + +#ifdef SQLITE_DEBUG + case INLINEFUNC_affinity: { + /* The AFFINITY() function evaluates to a string that describes + ** the type affinity of the argument. This is used for testing of + ** the SQLite type logic. + */ + const char *azAff[] = { "blob", "text", "numeric", "integer", "real" }; + char aff; + assert( nFarg==1 ); + aff = sqlite3ExprAffinity(pFarg->a[0].pExpr); + sqlite3VdbeLoadString(v, target, + (aff<=SQLITE_AFF_NONE) ? "none" : azAff[aff-SQLITE_AFF_BLOB]); + break; + } +#endif + } + return target; +} + /* ** Generate code into the current Vdbe to evaluate the given @@ -99161,6 +102460,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) } case TK_COLUMN: { int iTab = pExpr->iTable; + int iReg; if( ExprHasProperty(pExpr, EP_FixedCol) ){ /* This COLUMN expression is really a constant due to WHERE clause ** constraints, and that constant is coded by the pExpr->pLeft @@ -99168,9 +102468,14 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) ** datatype by applying the Affinity of the table column to the ** constant. */ - int iReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft,target); - int aff = sqlite3TableColumnAffinity(pExpr->pTab, pExpr->iColumn); - if( aff!=SQLITE_AFF_BLOB ){ + int aff; + iReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft,target); + if( pExpr->y.pTab ){ + aff = sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn); + }else{ + aff = pExpr->affExpr; + } + if( aff>SQLITE_AFF_BLOB ){ static const char zAff[] = "B\000C\000D\000E"; assert( SQLITE_AFF_BLOB=='A' ); assert( SQLITE_AFF_TEXT=='B' ); @@ -99185,17 +102490,60 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) } if( iTab<0 ){ if( pParse->iSelfTab<0 ){ - /* Generating CHECK constraints or inserting into partial index */ - return pExpr->iColumn - pParse->iSelfTab; + /* Other columns in the same row for CHECK constraints or + ** generated columns or for inserting into partial index. + ** The row is unpacked into registers beginning at + ** 0-(pParse->iSelfTab). The rowid (if any) is in a register + ** immediately prior to the first column. + */ + Column *pCol; + Table *pTab = pExpr->y.pTab; + int iSrc; + int iCol = pExpr->iColumn; + assert( pTab!=0 ); + assert( iCol>=XN_ROWID ); + assert( iColnCol ); + if( iCol<0 ){ + return -1-pParse->iSelfTab; + } + pCol = pTab->aCol + iCol; + testcase( iCol!=sqlite3TableColumnToStorage(pTab,iCol) ); + iSrc = sqlite3TableColumnToStorage(pTab, iCol) - pParse->iSelfTab; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pCol->colFlags & COLFLAG_GENERATED ){ + if( pCol->colFlags & COLFLAG_BUSY ){ + sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", + pCol->zName); + return 0; + } + pCol->colFlags |= COLFLAG_BUSY; + if( pCol->colFlags & COLFLAG_NOTAVAIL ){ + sqlite3ExprCodeGeneratedColumn(pParse, pCol, iSrc); + } + pCol->colFlags &= ~(COLFLAG_BUSY|COLFLAG_NOTAVAIL); + return iSrc; + }else +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + if( pCol->affinity==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp2(v, OP_SCopy, iSrc, target); + sqlite3VdbeAddOp1(v, OP_RealAffinity, target); + return target; + }else{ + return iSrc; + } }else{ /* Coding an expression that is part of an index where column names ** in the index refer to the table to which the index belongs */ iTab = pParse->iSelfTab - 1; } } - return sqlite3ExprCodeGetColumn(pParse, pExpr->pTab, + iReg = sqlite3ExprCodeGetColumn(pParse, pExpr->y.pTab, pExpr->iColumn, iTab, target, pExpr->op2); + if( pExpr->y.pTab==0 && pExpr->affExpr==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg); + } + return iReg; } case TK_INTEGER: { codeInteger(pParse, pExpr, 0, target); @@ -99217,7 +102565,12 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) sqlite3VdbeLoadString(v, target, pExpr->u.zToken); return target; } - case TK_NULL: { + default: { + /* Make NULL the default case so that if a bug causes an illegal + ** Expr node to be passed into this function, it will be handled + ** sanely and not crash. But keep the assert() to bring the problem + ** to the attention of the developers. */ + assert( op==TK_NULL ); sqlite3VdbeAddOp2(v, OP_Null, 0, target); return target; } @@ -99244,7 +102597,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) sqlite3VdbeAddOp2(v, OP_Variable, pExpr->iColumn, target); if( pExpr->u.zToken[1]!=0 ){ const char *z = sqlite3VListNumToName(pParse->pVList, pExpr->iColumn); - assert( pExpr->u.zToken[0]=='?' || strcmp(pExpr->u.zToken, z)==0 ); + assert( pExpr->u.zToken[0]=='?' || (z && !strcmp(pExpr->u.zToken, z)) ); pParse->pVList[0] = 0; /* Indicate VList may no longer be enlarged */ sqlite3VdbeAppendP4(v, (char*)z, P4_STATIC); } @@ -99284,7 +102637,8 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) r1 = sqlite3ExprCodeTemp(pParse, pLeft, ®Free1); r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); codeCompare(pParse, pLeft, pExpr->pRight, op, - r1, r2, inReg, SQLITE_STOREP2 | p5); + r1, r2, inReg, SQLITE_STOREP2 | p5, + ExprHasProperty(pExpr,EP_Commuted)); assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); @@ -99407,8 +102761,8 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) CollSeq *pColl = 0; /* A collating sequence */ #ifndef SQLITE_OMIT_WINDOWFUNC - if( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) && pExpr->pWin ){ - return pExpr->pWin->regResult; + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + return pExpr->y.pWin->regResult; } #endif @@ -99436,47 +102790,14 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) sqlite3ErrorMsg(pParse, "unknown function: %s()", zId); break; } - - /* Attempt a direct implementation of the built-in COALESCE() and - ** IFNULL() functions. This avoids unnecessary evaluation of - ** arguments past the first non-NULL argument. - */ - if( pDef->funcFlags & SQLITE_FUNC_COALESCE ){ - int endCoalesce = sqlite3VdbeMakeLabel(v); - assert( nFarg>=2 ); - sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); - for(i=1; ia[i].pExpr, target); - } - sqlite3VdbeResolveLabel(v, endCoalesce); - break; - } - - /* The UNLIKELY() function is a no-op. The result is the value - ** of the first argument. - */ - if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){ - assert( nFarg>=1 ); - return sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target); - } - -#ifdef SQLITE_DEBUG - /* The AFFINITY() function evaluates to a string that describes - ** the type affinity of the argument. This is used for testing of - ** the SQLite type logic. - */ - if( pDef->funcFlags & SQLITE_FUNC_AFFINITY ){ - const char *azAff[] = { "blob", "text", "numeric", "integer", "real" }; - char aff; - assert( nFarg==1 ); - aff = sqlite3ExprAffinity(pFarg->a[0].pExpr); - sqlite3VdbeLoadString(v, target, - aff ? azAff[aff-SQLITE_AFF_BLOB] : "none"); - return target; + if( pDef->funcFlags & SQLITE_FUNC_INLINE ){ + assert( (pDef->funcFlags & SQLITE_FUNC_UNSAFE)==0 ); + assert( (pDef->funcFlags & SQLITE_FUNC_DIRECT)==0 ); + return exprCodeInlineFunction(pParse, pFarg, + SQLITE_PTR_TO_INT(pDef->pUserData), target); + }else if( pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE) ){ + sqlite3ExprFunctionUsable(pParse, pExpr, pDef); } -#endif for(i=0; ia[i].pExpr) ){ @@ -99553,12 +102874,15 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) }else #endif { - sqlite3VdbeAddOp4(v, pParse->iSelfTab ? OP_PureFunc0 : OP_Function0, - constMask, r1, target, (char*)pDef, P4_FUNCDEF); - sqlite3VdbeChangeP5(v, (u8)nFarg); + sqlite3VdbeAddFunctionCall(pParse, constMask, r1, target, nFarg, + pDef, pExpr->op2); } - if( nFarg && constMask==0 ){ - sqlite3ReleaseTempRange(pParse, r1, nFarg); + if( nFarg ){ + if( constMask==0 ){ + sqlite3ReleaseTempRange(pParse, r1, nFarg); + }else{ + sqlite3VdbeReleaseRegisters(pParse, r1, nFarg, constMask, 1); + } } return target; } @@ -99571,18 +102895,18 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) if( op==TK_SELECT && (nCol = pExpr->x.pSelect->pEList->nExpr)!=1 ){ sqlite3SubselectError(pParse, nCol, 1); }else{ - return sqlite3CodeSubselect(pParse, pExpr, 0, 0); + return sqlite3CodeSubselect(pParse, pExpr); } break; } case TK_SELECT_COLUMN: { int n; if( pExpr->pLeft->iTable==0 ){ - pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft, 0, 0); + pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft); } assert( pExpr->iTable==0 || pExpr->pLeft->op==TK_SELECT ); - if( pExpr->iTable - && pExpr->iTable!=(n = sqlite3ExprVectorSize(pExpr->pLeft)) + if( pExpr->iTable!=0 + && pExpr->iTable!=(n = sqlite3ExprVectorSize(pExpr->pLeft)) ){ sqlite3ErrorMsg(pParse, "%d columns assigned %d values", pExpr->iTable, n); @@ -99590,8 +102914,8 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) return pExpr->pLeft->iTable + pExpr->iColumn; } case TK_IN: { - int destIfFalse = sqlite3VdbeMakeLabel(v); - int destIfNull = sqlite3VdbeMakeLabel(v); + int destIfFalse = sqlite3VdbeMakeLabel(pParse); + int destIfNull = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeAddOp2(v, OP_Null, 0, target); sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); sqlite3VdbeAddOp2(v, OP_Integer, 1, target); @@ -99651,18 +102975,20 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) ** p1==1 -> old.a p1==4 -> new.a ** p1==2 -> old.b p1==5 -> new.b */ - Table *pTab = pExpr->pTab; - int p1 = pExpr->iTable * (pTab->nCol+1) + 1 + pExpr->iColumn; + Table *pTab = pExpr->y.pTab; + int iCol = pExpr->iColumn; + int p1 = pExpr->iTable * (pTab->nCol+1) + 1 + + sqlite3TableColumnToStorage(pTab, iCol); assert( pExpr->iTable==0 || pExpr->iTable==1 ); - assert( pExpr->iColumn>=-1 && pExpr->iColumnnCol ); - assert( pTab->iPKey<0 || pExpr->iColumn!=pTab->iPKey ); + assert( iCol>=-1 && iColnCol ); + assert( pTab->iPKey<0 || iCol!=pTab->iPKey ); assert( p1>=0 && p1<(pTab->nCol*2+2) ); sqlite3VdbeAddOp2(v, OP_Param, p1, target); VdbeComment((v, "r[%d]=%s.%s", target, (pExpr->iTable ? "new" : "old"), - (pExpr->iColumn<0 ? "rowid" : pExpr->pTab->aCol[pExpr->iColumn].zName) + (pExpr->iColumn<0 ? "rowid" : pExpr->y.pTab->aCol[iCol].zName) )); #ifndef SQLITE_OMIT_FLOATING_POINT @@ -99671,9 +102997,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) ** ** EVIDENCE-OF: R-60985-57662 SQLite will convert the value back to ** floating point when extracting it from the record. */ - if( pExpr->iColumn>=0 - && pTab->aCol[pExpr->iColumn].affinity==SQLITE_AFF_REAL - ){ + if( iCol>=0 && pTab->aCol[iCol].affinity==SQLITE_AFF_REAL ){ sqlite3VdbeAddOp1(v, OP_RealAffinity, target); } #endif @@ -99685,10 +103009,23 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) break; } + /* TK_IF_NULL_ROW Expr nodes are inserted ahead of expressions + ** that derive from the right-hand table of a LEFT JOIN. The + ** Expr.iTable value is the table number for the right-hand table. + ** The expression is only evaluated if that table is not currently + ** on a LEFT JOIN NULL row. + */ case TK_IF_NULL_ROW: { int addrINR; + u8 okConstFactor = pParse->okConstFactor; addrINR = sqlite3VdbeAddOp1(v, OP_IfNullRow, pExpr->iTable); + /* Temporarily disable factoring of constant expressions, since + ** even though expressions may appear to be constant, they are not + ** really constant because they originate from the right-hand side + ** of a LEFT JOIN. */ + pParse->okConstFactor = 0; inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); + pParse->okConstFactor = okConstFactor; sqlite3VdbeJumpHere(v, addrINR); sqlite3VdbeChangeP3(v, addrINR, inReg); break; @@ -99715,7 +103052,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) ** or if there is no matching Ei, the ELSE term Y, or if there is ** no ELSE term, NULL. */ - default: assert( op==TK_CASE ); { + case TK_CASE: { int endLabel; /* GOTO label for end of CASE stmt */ int nextCase; /* GOTO label for next WHEN clause */ int nExpr; /* 2x number of WHEN terms */ @@ -99725,21 +103062,27 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) Expr opCompare; /* The X==Ei expression */ Expr *pX; /* The X expression */ Expr *pTest = 0; /* X==Ei (form A) or just Ei (form B) */ + Expr *pDel = 0; + sqlite3 *db = pParse->db; assert( !ExprHasProperty(pExpr, EP_xIsSelect) && pExpr->x.pList ); assert(pExpr->x.pList->nExpr > 0); pEList = pExpr->x.pList; aListelem = pEList->a; nExpr = pEList->nExpr; - endLabel = sqlite3VdbeMakeLabel(v); + endLabel = sqlite3VdbeMakeLabel(pParse); if( (pX = pExpr->pLeft)!=0 ){ - tempX = *pX; + pDel = sqlite3ExprDup(db, pX, 0); + if( db->mallocFailed ){ + sqlite3ExprDelete(db, pDel); + break; + } testcase( pX->op==TK_COLUMN ); - exprToRegister(&tempX, exprCodeVector(pParse, &tempX, ®Free1)); + exprToRegister(pDel, exprCodeVector(pParse, pDel, ®Free1)); testcase( regFree1==0 ); memset(&opCompare, 0, sizeof(opCompare)); opCompare.op = TK_EQ; - opCompare.pLeft = &tempX; + opCompare.pLeft = pDel; pTest = &opCompare; /* Ticket b351d95f9cd5ef17e9d9dbae18f5ca8611190001: ** The value in regFree1 might get SCopy-ed into the file result. @@ -99754,7 +103097,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) }else{ pTest = aListelem[i].pExpr; } - nextCase = sqlite3VdbeMakeLabel(v); + nextCase = sqlite3VdbeMakeLabel(pParse); testcase( pTest->op==TK_COLUMN ); sqlite3ExprIfFalse(pParse, pTest, nextCase, SQLITE_JUMPIFNULL); testcase( aListelem[i+1].pExpr->op==TK_COLUMN ); @@ -99767,32 +103110,33 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) }else{ sqlite3VdbeAddOp2(v, OP_Null, 0, target); } + sqlite3ExprDelete(db, pDel); sqlite3VdbeResolveLabel(v, endLabel); break; } #ifndef SQLITE_OMIT_TRIGGER case TK_RAISE: { - assert( pExpr->affinity==OE_Rollback - || pExpr->affinity==OE_Abort - || pExpr->affinity==OE_Fail - || pExpr->affinity==OE_Ignore + assert( pExpr->affExpr==OE_Rollback + || pExpr->affExpr==OE_Abort + || pExpr->affExpr==OE_Fail + || pExpr->affExpr==OE_Ignore ); if( !pParse->pTriggerTab ){ sqlite3ErrorMsg(pParse, "RAISE() may only be used within a trigger-program"); return 0; } - if( pExpr->affinity==OE_Abort ){ + if( pExpr->affExpr==OE_Abort ){ sqlite3MayAbort(pParse); } assert( !ExprHasProperty(pExpr, EP_IntValue) ); - if( pExpr->affinity==OE_Ignore ){ + if( pExpr->affExpr==OE_Ignore ){ sqlite3VdbeAddOp4( v, OP_Halt, SQLITE_OK, OE_Ignore, 0, pExpr->u.zToken,0); VdbeCoverage(v); }else{ sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_TRIGGER, - pExpr->affinity, pExpr->u.zToken, 0, 0); + pExpr->affExpr, pExpr->u.zToken, 0, 0); } break; @@ -99857,7 +103201,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeAtInit( */ SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse *pParse, Expr *pExpr, int *pReg){ int r2; - pExpr = sqlite3ExprSkipCollate(pExpr); + pExpr = sqlite3ExprSkipCollateAndLikely(pExpr); if( ConstFactorOk(pParse) && pExpr->op!=TK_REGISTER && sqlite3ExprIsConstantNotJoin(pExpr) @@ -99886,14 +103230,16 @@ SQLITE_PRIVATE void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ int inReg; assert( target>0 && target<=pParse->nMem ); - if( pExpr && pExpr->op==TK_REGISTER ){ - sqlite3VdbeAddOp2(pParse->pVdbe, OP_Copy, pExpr->iTable, target); - }else{ - inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); - assert( pParse->pVdbe!=0 || pParse->db->mallocFailed ); - if( inReg!=target && pParse->pVdbe ){ - sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, inReg, target); + inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); + assert( pParse->pVdbe!=0 || pParse->db->mallocFailed ); + if( inReg!=target && pParse->pVdbe ){ + u8 op; + if( ExprHasProperty(pExpr,EP_Subquery) ){ + op = OP_Copy; + }else{ + op = OP_SCopy; } + sqlite3VdbeAddOp2(pParse->pVdbe, op, inReg, target); } } @@ -99923,30 +103269,6 @@ SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse *pParse, Expr *pExpr, int ta } } -/* -** Generate code that evaluates the given expression and puts the result -** in register target. -** -** Also make a copy of the expression results into another "cache" register -** and modify the expression so that the next time it is evaluated, -** the result is a copy of the cache register. -** -** This routine is used for expressions that are used multiple -** times. They are evaluated once and the results of the expression -** are reused. -*/ -SQLITE_PRIVATE void sqlite3ExprCodeAndCache(Parse *pParse, Expr *pExpr, int target){ - Vdbe *v = pParse->pVdbe; - int iMem; - - assert( target>0 ); - assert( pExpr->op!=TK_REGISTER ); - sqlite3ExprCode(pParse, pExpr, target); - iMem = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_Copy, target, iMem); - exprToRegister(pExpr, iMem); -} - /* ** Generate code that pushes the value of every element of the given ** expression list into a sequence of registers beginning at target. @@ -100010,6 +103332,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeExprList( && (pOp=sqlite3VdbeGetOp(v, -1))->opcode==OP_Copy && pOp->p1+pOp->p3+1==inReg && pOp->p2+pOp->p3+1==target+i + && pOp->p5==0 /* The do-not-merge flag must be clear */ ){ pOp->p3++; }else{ @@ -100048,41 +103371,44 @@ static void exprCodeBetween( void (*xJump)(Parse*,Expr*,int,int), /* Action to take */ int jumpIfNull /* Take the jump if the BETWEEN is NULL */ ){ - Expr exprAnd; /* The AND operator in x>=y AND x<=z */ + Expr exprAnd; /* The AND operator in x>=y AND x<=z */ Expr compLeft; /* The x>=y term */ Expr compRight; /* The x<=z term */ - Expr exprX; /* The x subexpression */ int regFree1 = 0; /* Temporary use register */ - + Expr *pDel = 0; + sqlite3 *db = pParse->db; memset(&compLeft, 0, sizeof(Expr)); memset(&compRight, 0, sizeof(Expr)); memset(&exprAnd, 0, sizeof(Expr)); assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); - exprX = *pExpr->pLeft; - exprAnd.op = TK_AND; - exprAnd.pLeft = &compLeft; - exprAnd.pRight = &compRight; - compLeft.op = TK_GE; - compLeft.pLeft = &exprX; - compLeft.pRight = pExpr->x.pList->a[0].pExpr; - compRight.op = TK_LE; - compRight.pLeft = &exprX; - compRight.pRight = pExpr->x.pList->a[1].pExpr; - exprToRegister(&exprX, exprCodeVector(pParse, &exprX, ®Free1)); - if( xJump ){ - xJump(pParse, &exprAnd, dest, jumpIfNull); - }else{ - /* Mark the expression is being from the ON or USING clause of a join - ** so that the sqlite3ExprCodeTarget() routine will not attempt to move - ** it into the Parse.pConstExpr list. We should use a new bit for this, - ** for clarity, but we are out of bits in the Expr.flags field so we - ** have to reuse the EP_FromJoin bit. Bummer. */ - exprX.flags |= EP_FromJoin; - sqlite3ExprCodeTarget(pParse, &exprAnd, dest); + pDel = sqlite3ExprDup(db, pExpr->pLeft, 0); + if( db->mallocFailed==0 ){ + exprAnd.op = TK_AND; + exprAnd.pLeft = &compLeft; + exprAnd.pRight = &compRight; + compLeft.op = TK_GE; + compLeft.pLeft = pDel; + compLeft.pRight = pExpr->x.pList->a[0].pExpr; + compRight.op = TK_LE; + compRight.pLeft = pDel; + compRight.pRight = pExpr->x.pList->a[1].pExpr; + exprToRegister(pDel, exprCodeVector(pParse, pDel, ®Free1)); + if( xJump ){ + xJump(pParse, &exprAnd, dest, jumpIfNull); + }else{ + /* Mark the expression is being from the ON or USING clause of a join + ** so that the sqlite3ExprCodeTarget() routine will not attempt to move + ** it into the Parse.pConstExpr list. We should use a new bit for this, + ** for clarity, but we are out of bits in the Expr.flags field so we + ** have to reuse the EP_FromJoin bit. Bummer. */ + pDel->flags |= EP_FromJoin; + sqlite3ExprCodeTarget(pParse, &exprAnd, dest); + } + sqlite3ReleaseTempReg(pParse, regFree1); } - sqlite3ReleaseTempReg(pParse, regFree1); + sqlite3ExprDelete(db, pDel); /* Ensure adequate test coverage */ testcase( xJump==sqlite3ExprIfTrue && jumpIfNull==0 && regFree1==0 ); @@ -100122,18 +103448,23 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int if( NEVER(pExpr==0) ) return; /* No way this can happen */ op = pExpr->op; switch( op ){ - case TK_AND: { - int d2 = sqlite3VdbeMakeLabel(v); - testcase( jumpIfNull==0 ); - sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2,jumpIfNull^SQLITE_JUMPIFNULL); - sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); - sqlite3VdbeResolveLabel(v, d2); - break; - } + case TK_AND: case TK_OR: { - testcase( jumpIfNull==0 ); - sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); - sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); + Expr *pAlt = sqlite3ExprSimplifiedAndOr(pExpr); + if( pAlt!=pExpr ){ + sqlite3ExprIfTrue(pParse, pAlt, dest, jumpIfNull); + }else if( op==TK_AND ){ + int d2 = sqlite3VdbeMakeLabel(pParse); + testcase( jumpIfNull==0 ); + sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2, + jumpIfNull^SQLITE_JUMPIFNULL); + sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); + sqlite3VdbeResolveLabel(v, d2); + }else{ + testcase( jumpIfNull==0 ); + sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); + sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); + } break; } case TK_NOT: { @@ -100176,7 +103507,7 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, - r1, r2, dest, jumpIfNull); + r1, r2, dest, jumpIfNull, ExprHasProperty(pExpr,EP_Commuted)); assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); @@ -100209,7 +103540,7 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int } #ifndef SQLITE_OMIT_SUBQUERY case TK_IN: { - int destIfFalse = sqlite3VdbeMakeLabel(v); + int destIfFalse = sqlite3VdbeMakeLabel(pParse); int destIfNull = jumpIfNull ? dest : destIfFalse; sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); sqlite3VdbeGoto(v, dest); @@ -100219,9 +103550,9 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int #endif default: { default_expr: - if( exprAlwaysTrue(pExpr) ){ + if( ExprAlwaysTrue(pExpr) ){ sqlite3VdbeGoto(v, dest); - }else if( exprAlwaysFalse(pExpr) ){ + }else if( ExprAlwaysFalse(pExpr) ){ /* No-op */ }else{ r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); @@ -100289,18 +103620,23 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int assert( pExpr->op!=TK_GE || op==OP_Lt ); switch( pExpr->op ){ - case TK_AND: { - testcase( jumpIfNull==0 ); - sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); - sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); - break; - } + case TK_AND: case TK_OR: { - int d2 = sqlite3VdbeMakeLabel(v); - testcase( jumpIfNull==0 ); - sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, jumpIfNull^SQLITE_JUMPIFNULL); - sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); - sqlite3VdbeResolveLabel(v, d2); + Expr *pAlt = sqlite3ExprSimplifiedAndOr(pExpr); + if( pAlt!=pExpr ){ + sqlite3ExprIfFalse(pParse, pAlt, dest, jumpIfNull); + }else if( pExpr->op==TK_AND ){ + testcase( jumpIfNull==0 ); + sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); + sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); + }else{ + int d2 = sqlite3VdbeMakeLabel(pParse); + testcase( jumpIfNull==0 ); + sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, + jumpIfNull^SQLITE_JUMPIFNULL); + sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); + sqlite3VdbeResolveLabel(v, d2); + } break; } case TK_NOT: { @@ -100346,7 +103682,7 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, - r1, r2, dest, jumpIfNull); + r1, r2, dest, jumpIfNull,ExprHasProperty(pExpr,EP_Commuted)); assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); @@ -100380,7 +103716,7 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int if( jumpIfNull ){ sqlite3ExprCodeIN(pParse, pExpr, dest, dest); }else{ - int destIfNull = sqlite3VdbeMakeLabel(v); + int destIfNull = sqlite3VdbeMakeLabel(pParse); sqlite3ExprCodeIN(pParse, pExpr, dest, destIfNull); sqlite3VdbeResolveLabel(v, destIfNull); } @@ -100389,9 +103725,9 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int #endif default: { default_expr: - if( exprAlwaysFalse(pExpr) ){ + if( ExprAlwaysFalse(pExpr) ){ sqlite3VdbeGoto(v, dest); - }else if( exprAlwaysTrue(pExpr) ){ + }else if( ExprAlwaysTrue(pExpr) ){ /* no-op */ }else{ r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); @@ -100501,7 +103837,7 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTa } return 2; } - if( pA->op!=pB->op ){ + if( pA->op!=pB->op || pA->op==TK_RAISE ){ if( pA->op==TK_COLLATE && sqlite3ExprCompare(pParse, pA->pLeft,pB,iTab)<2 ){ return 1; } @@ -100511,49 +103847,67 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTa return 2; } if( pA->op!=TK_COLUMN && pA->op!=TK_AGG_COLUMN && pA->u.zToken ){ - if( pA->op==TK_FUNCTION ){ + if( pA->op==TK_FUNCTION || pA->op==TK_AGG_FUNCTION ){ if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; +#ifndef SQLITE_OMIT_WINDOWFUNC + assert( pA->op==pB->op ); + if( ExprHasProperty(pA,EP_WinFunc)!=ExprHasProperty(pB,EP_WinFunc) ){ + return 2; + } + if( ExprHasProperty(pA,EP_WinFunc) ){ + if( sqlite3WindowCompare(pParse, pA->y.pWin, pB->y.pWin, 1)!=0 ){ + return 2; + } + } +#endif + }else if( pA->op==TK_NULL ){ + return 0; }else if( pA->op==TK_COLLATE ){ if( sqlite3_stricmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; - }else if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ + }else if( ALWAYS(pB->u.zToken!=0) && strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ return 2; } } - if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2; - if( ALWAYS((combinedFlags & EP_TokenOnly)==0) ){ + if( (pA->flags & (EP_Distinct|EP_Commuted)) + != (pB->flags & (EP_Distinct|EP_Commuted)) ) return 2; + if( (combinedFlags & EP_TokenOnly)==0 ){ if( combinedFlags & EP_xIsSelect ) return 2; if( (combinedFlags & EP_FixedCol)==0 && sqlite3ExprCompare(pParse, pA->pLeft, pB->pLeft, iTab) ) return 2; if( sqlite3ExprCompare(pParse, pA->pRight, pB->pRight, iTab) ) return 2; if( sqlite3ExprListCompare(pA->x.pList, pB->x.pList, iTab) ) return 2; - assert( (combinedFlags & EP_Reduced)==0 ); - if( pA->op!=TK_STRING && pA->op!=TK_TRUEFALSE ){ + if( pA->op!=TK_STRING + && pA->op!=TK_TRUEFALSE + && (combinedFlags & EP_Reduced)==0 + ){ if( pA->iColumn!=pB->iColumn ) return 2; - if( pA->iTable!=pB->iTable - && (pA->iTable!=iTab || NEVER(pB->iTable>=0)) ) return 2; - } -#ifndef SQLITE_OMIT_WINDOWFUNC - /* Justification for the assert(): - ** window functions have p->op==TK_FUNCTION but aggregate functions - ** have p->op==TK_AGG_FUNCTION. So any comparison between an aggregate - ** function and a window function should have failed before reaching - ** this point. And, it is not possible to have a window function and - ** a scalar function with the same name and number of arguments. So - ** if we reach this point, either A and B both window functions or - ** neither are a window functions. */ - assert( (pA->pWin==0)==(pB->pWin==0) ); - - if( pA->pWin!=0 ){ - if( sqlite3WindowCompare(pParse,pA->pWin,pB->pWin)!=0 ) return 2; + if( pA->op2!=pB->op2 ){ + if( pA->op==TK_TRUTH ) return 2; + if( pA->op==TK_FUNCTION && iTab<0 ){ + /* Ex: CREATE TABLE t1(a CHECK( aop!=TK_IN && pA->iTable!=pB->iTable && pA->iTable!=iTab ){ + return 2; + } } -#endif } return 0; } /* -** Compare two ExprList objects. Return 0 if they are identical and -** non-zero if they differ in any way. +** Compare two ExprList objects. Return 0 if they are identical, 1 +** if they are certainly different, or 2 if it is not possible to +** determine if they are identical or not. ** ** If any subelement of pB has Expr.iTable==(-1) then it is allowed ** to compare equal to an equivalent element in pA with Expr.iTable==iTab. @@ -100572,10 +103926,11 @@ SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList *pA, ExprList *pB, int iTab){ if( pA==0 || pB==0 ) return 1; if( pA->nExpr!=pB->nExpr ) return 1; for(i=0; inExpr; i++){ + int res; Expr *pExprA = pA->a[i].pExpr; Expr *pExprB = pB->a[i].pExpr; - if( pA->a[i].sortOrder!=pB->a[i].sortOrder ) return 1; - if( sqlite3ExprCompare(0, pExprA, pExprB, iTab) ) return 1; + if( pA->a[i].sortFlags!=pB->a[i].sortFlags ) return 1; + if( (res = sqlite3ExprCompare(0, pExprA, pExprB, iTab)) ) return res; } return 0; } @@ -100586,11 +103941,88 @@ SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList *pA, ExprList *pB, int iTab){ */ SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr *pA, Expr *pB, int iTab){ return sqlite3ExprCompare(0, - sqlite3ExprSkipCollate(pA), - sqlite3ExprSkipCollate(pB), + sqlite3ExprSkipCollateAndLikely(pA), + sqlite3ExprSkipCollateAndLikely(pB), iTab); } +/* +** Return non-zero if Expr p can only be true if pNN is not NULL. +** +** Or if seenNot is true, return non-zero if Expr p can only be +** non-NULL if pNN is not NULL +*/ +static int exprImpliesNotNull( + Parse *pParse, /* Parsing context */ + Expr *p, /* The expression to be checked */ + Expr *pNN, /* The expression that is NOT NULL */ + int iTab, /* Table being evaluated */ + int seenNot /* Return true only if p can be any non-NULL value */ +){ + assert( p ); + assert( pNN ); + if( sqlite3ExprCompare(pParse, p, pNN, iTab)==0 ){ + return pNN->op!=TK_NULL; + } + switch( p->op ){ + case TK_IN: { + if( seenNot && ExprHasProperty(p, EP_xIsSelect) ) return 0; + assert( ExprHasProperty(p,EP_xIsSelect) + || (p->x.pList!=0 && p->x.pList->nExpr>0) ); + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); + } + case TK_BETWEEN: { + ExprList *pList = p->x.pList; + assert( pList!=0 ); + assert( pList->nExpr==2 ); + if( seenNot ) return 0; + if( exprImpliesNotNull(pParse, pList->a[0].pExpr, pNN, iTab, 1) + || exprImpliesNotNull(pParse, pList->a[1].pExpr, pNN, iTab, 1) + ){ + return 1; + } + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); + } + case TK_EQ: + case TK_NE: + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_PLUS: + case TK_MINUS: + case TK_BITOR: + case TK_LSHIFT: + case TK_RSHIFT: + case TK_CONCAT: + seenNot = 1; + /* Fall thru */ + case TK_STAR: + case TK_REM: + case TK_BITAND: + case TK_SLASH: { + if( exprImpliesNotNull(pParse, p->pRight, pNN, iTab, seenNot) ) return 1; + /* Fall thru into the next case */ + } + case TK_SPAN: + case TK_COLLATE: + case TK_UPLUS: + case TK_UMINUS: { + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, seenNot); + } + case TK_TRUTH: { + if( seenNot ) return 0; + if( p->op2!=TK_IS ) return 0; + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); + } + case TK_BITNOT: + case TK_NOT: { + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); + } + } + return 0; +} + /* ** Return true if we can prove the pE2 will always be true if pE1 is ** true. Return false if we cannot complete the proof or if pE2 might @@ -100626,16 +104058,16 @@ SQLITE_PRIVATE int sqlite3ExprImpliesExpr(Parse *pParse, Expr *pE1, Expr *pE2, i ){ return 1; } - if( pE2->op==TK_NOTNULL && pE1->op!=TK_ISNULL && pE1->op!=TK_IS ){ - Expr *pX = sqlite3ExprSkipCollate(pE1->pLeft); - testcase( pX!=pE1->pLeft ); - if( sqlite3ExprCompare(pParse, pX, pE2->pLeft, iTab)==0 ) return 1; + if( pE2->op==TK_NOTNULL + && exprImpliesNotNull(pParse, pE1, pE2->pLeft, iTab, 0) + ){ + return 1; } return 0; } /* -** This is the Expr node callback for sqlite3ExprImpliesNotNullRow(). +** This is the Expr node callback for sqlite3ExprImpliesNonNullRow(). ** If the expression node requires that the table at pWalker->iCur ** have one or more non-NULL column, then set pWalker->eCode to 1 and abort. ** @@ -100649,21 +104081,25 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ if( ExprHasProperty(pExpr, EP_FromJoin) ) return WRC_Prune; switch( pExpr->op ){ case TK_ISNOT: - case TK_NOT: case TK_ISNULL: + case TK_NOTNULL: case TK_IS: case TK_OR: + case TK_VECTOR: case TK_CASE: case TK_IN: case TK_FUNCTION: + case TK_TRUTH: testcase( pExpr->op==TK_ISNOT ); - testcase( pExpr->op==TK_NOT ); testcase( pExpr->op==TK_ISNULL ); + testcase( pExpr->op==TK_NOTNULL ); testcase( pExpr->op==TK_IS ); testcase( pExpr->op==TK_OR ); + testcase( pExpr->op==TK_VECTOR ); testcase( pExpr->op==TK_CASE ); testcase( pExpr->op==TK_IN ); testcase( pExpr->op==TK_FUNCTION ); + testcase( pExpr->op==TK_TRUTH ); return WRC_Prune; case TK_COLUMN: if( pWalker->u.iCur==pExpr->iTable ){ @@ -100672,6 +104108,23 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ } return WRC_Prune; + case TK_AND: + if( pWalker->eCode==0 ){ + sqlite3WalkExpr(pWalker, pExpr->pLeft); + if( pWalker->eCode ){ + pWalker->eCode = 0; + sqlite3WalkExpr(pWalker, pExpr->pRight); + } + } + return WRC_Prune; + + case TK_BETWEEN: + if( sqlite3WalkExpr(pWalker, pExpr->pLeft)==WRC_Abort ){ + assert( pWalker->eCode ); + return WRC_Abort; + } + return WRC_Prune; + /* Virtual tables are allowed to use constraints like x=NULL. So ** a term of the form x=y does not prove that y is not null if x ** is the column of a virtual table */ @@ -100687,11 +104140,12 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_LE ); testcase( pExpr->op==TK_GT ); testcase( pExpr->op==TK_GE ); - if( (pExpr->pLeft->op==TK_COLUMN && IsVirtual(pExpr->pLeft->pTab)) - || (pExpr->pRight->op==TK_COLUMN && IsVirtual(pExpr->pRight->pTab)) + if( (pExpr->pLeft->op==TK_COLUMN && IsVirtual(pExpr->pLeft->y.pTab)) + || (pExpr->pRight->op==TK_COLUMN && IsVirtual(pExpr->pRight->y.pTab)) ){ return WRC_Prune; } + default: return WRC_Continue; } @@ -100721,6 +104175,16 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ */ SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){ Walker w; + p = sqlite3ExprSkipCollateAndLikely(p); + if( p==0 ) return 0; + if( p->op==TK_NOTNULL ){ + p = p->pLeft; + }else{ + while( p->op==TK_AND ){ + if( sqlite3ExprImpliesNonNullRow(p->pLeft, iTab) ) return 1; + p = p->pRight; + } + } w.xExprCallback = impliesNotNullRow; w.xSelectCallback = 0; w.xSelectCallback2 = 0; @@ -100750,7 +104214,7 @@ struct IdxCover { static int exprIdxCover(Walker *pWalker, Expr *pExpr){ if( pExpr->op==TK_COLUMN && pExpr->iTable==pWalker->u.pIdxCover->iCur - && sqlite3ColumnOfIndex(pWalker->u.pIdxCover->pIdx, pExpr->iColumn)<0 + && sqlite3TableColumnToIndex(pWalker->u.pIdxCover->pIdx, pExpr->iColumn)<0 ){ pWalker->eCode = 1; return WRC_Abort; @@ -100801,12 +104265,13 @@ struct SrcCount { ** Count the number of references to columns. */ static int exprSrcCount(Walker *pWalker, Expr *pExpr){ - /* The NEVER() on the second term is because sqlite3FunctionUsesThisSrc() - ** is always called before sqlite3ExprAnalyzeAggregates() and so the - ** TK_COLUMNs have not yet been converted into TK_AGG_COLUMN. If - ** sqlite3FunctionUsesThisSrc() is used differently in the future, the - ** NEVER() will need to be removed. */ - if( pExpr->op==TK_COLUMN || NEVER(pExpr->op==TK_AGG_COLUMN) ){ + /* There was once a NEVER() on the second term on the grounds that + ** sqlite3FunctionUsesThisSrc() was always called before + ** sqlite3ExprAnalyzeAggregates() and so the TK_COLUMNs have not yet + ** been converted into TK_AGG_COLUMN. But this is no longer true due + ** to window functions - sqlite3WindowRewrite() may now indirectly call + ** FunctionUsesThisSrc() when creating a new sub-select. */ + if( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN ){ int i; struct SrcCount *p = pWalker->u.pSrcCount; SrcList *pSrc = p->pSrc; @@ -100816,7 +104281,10 @@ static int exprSrcCount(Walker *pWalker, Expr *pExpr){ } if( inThis++; - }else{ + }else if( nSrc==0 || pExpr->iTablea[0].iCursor ){ + /* In a well-formed parse tree (no name resolution errors), + ** TK_COLUMN nodes with smaller Expr.iTable values are in an + ** outer context. Those are the only ones to count as "other" */ p->nOther++; } } @@ -100833,13 +104301,19 @@ SQLITE_PRIVATE int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){ Walker w; struct SrcCount cnt; assert( pExpr->op==TK_AGG_FUNCTION ); + memset(&w, 0, sizeof(w)); w.xExprCallback = exprSrcCount; - w.xSelectCallback = 0; + w.xSelectCallback = sqlite3SelectWalkNoop; w.u.pSrcCount = &cnt; cnt.pSrc = pSrcList; cnt.nThis = 0; cnt.nOther = 0; sqlite3WalkExprList(&w, pExpr->x.pList); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + sqlite3WalkExpr(&w, pExpr->y.pWin->pFilter); + } +#endif return cnt.nThis>0 || cnt.nOther==0; } @@ -100919,7 +104393,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ && (k = addAggInfoColumn(pParse->db, pAggInfo))>=0 ){ pCol = &pAggInfo->aCol[k]; - pCol->pTab = pExpr->pTab; + pCol->pTab = pExpr->y.pTab; pCol->iTable = pExpr->iTable; pCol->iColumn = pExpr->iColumn; pCol->iMem = ++pParse->nMem; @@ -101032,6 +104506,7 @@ SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){ w.xSelectCallback2 = analyzeAggregatesInSelectEnd; w.walkerDepth = 0; w.u.pNC = pNC; + w.pParse = 0; assert( pNC->pSrcList!=0 ); sqlite3WalkExpr(&w, pExpr); } @@ -101067,8 +104542,11 @@ SQLITE_PRIVATE int sqlite3GetTempReg(Parse *pParse){ ** purpose. */ SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse *pParse, int iReg){ - if( iReg && pParse->nTempRegaTempReg) ){ - pParse->aTempReg[pParse->nTempReg++] = iReg; + if( iReg ){ + sqlite3VdbeReleaseRegisters(pParse, iReg, 1, 0, 0); + if( pParse->nTempRegaTempReg) ){ + pParse->aTempReg[pParse->nTempReg++] = iReg; + } } } @@ -101094,6 +104572,7 @@ SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){ sqlite3ReleaseTempReg(pParse, iReg); return; } + sqlite3VdbeReleaseRegisters(pParse, iReg, nReg, 0, 0); if( nReg>pParse->nRangeReg ){ pParse->nRangeReg = nReg; pParse->iRangeReg = iReg; @@ -101102,6 +104581,11 @@ SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){ /* ** Mark all temporary registers as being unavailable for reuse. +** +** Always invoke this procedure after coding a subroutine or co-routine +** that might be invoked from other parts of the code, to ensure that +** the sub/co-routine does not use registers in common with the code that +** invokes the sub/co-routine. */ SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse *pParse){ pParse->nTempReg = 0; @@ -101163,9 +104647,15 @@ SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse *pParse, int iFirst, int iLast){ ** ** Or, if zName is not a system table, zero is returned. */ -static int isSystemTable(Parse *pParse, const char *zName){ - if( 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){ - sqlite3ErrorMsg(pParse, "table %s may not be altered", zName); +static int isAlterableTable(Parse *pParse, Table *pTab){ + if( 0==sqlite3StrNICmp(pTab->zName, "sqlite_", 7) +#ifndef SQLITE_OMIT_VIRTUALTABLE + || ( (pTab->tabFlags & TF_Shadow)!=0 + && sqlite3ReadOnlyShadowTables(pParse->db) + ) +#endif + ){ + sqlite3ErrorMsg(pParse, "table %s may not be altered", pTab->zName); return 1; } return 0; @@ -101182,7 +104672,7 @@ static void renameTestSchema(Parse *pParse, const char *zDb, int bTemp){ sqlite3NestedParse(pParse, "SELECT 1 " "FROM \"%w\".%s " - "WHERE name NOT LIKE 'sqlite_%%'" + "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" " AND sql NOT LIKE 'create virtual%%'" " AND sqlite_rename_test(%Q, sql, type, name, %d)=NULL ", zDb, MASTER_NAME, @@ -101193,7 +104683,7 @@ static void renameTestSchema(Parse *pParse, const char *zDb, int bTemp){ sqlite3NestedParse(pParse, "SELECT 1 " "FROM temp.%s " - "WHERE name NOT LIKE 'sqlite_%%'" + "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" " AND sql NOT LIKE 'create virtual%%'" " AND sqlite_rename_test(%Q, sql, type, name, 1)=NULL ", MASTER_NAME, zDb @@ -101261,11 +104751,11 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( /* Make sure it is not a system table being altered, or a reserved name ** that the table is being renamed to. */ - if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ){ + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ){ goto exit_rename_table; } - if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ goto - exit_rename_table; + if( SQLITE_OK!=sqlite3CheckObjectName(pParse,zName,"table",zName) ){ + goto exit_rename_table; } #ifndef SQLITE_OMIT_VIEW @@ -101294,15 +104784,15 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( } #endif - /* Begin a transaction for database iDb. - ** Then modify the schema cookie (since the ALTER TABLE modifies the - ** schema). Open a statement transaction if the table is a virtual - ** table. - */ + /* Begin a transaction for database iDb. Then modify the schema cookie + ** (since the ALTER TABLE modifies the schema). Call sqlite3MayAbort(), + ** as the scalar functions (e.g. sqlite_rename_table()) invoked by the + ** nested SQL may raise an exception. */ v = sqlite3GetVdbe(pParse); if( v==0 ){ goto exit_rename_table; } + sqlite3MayAbort(pParse); /* figure out how many UTF-8 characters are in zName */ zTabName = pTab->zName; @@ -101314,7 +104804,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( "UPDATE \"%w\".%s SET " "sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, %d) " "WHERE (type!='index' OR tbl_name=%Q COLLATE nocase)" - "AND name NOT LIKE 'sqlite_%%'" + "AND name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" , zDb, MASTER_NAME, zDb, zTabName, zName, (iDb==1), zTabName ); @@ -101325,7 +104815,8 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( "tbl_name = %Q, " "name = CASE " "WHEN type='table' THEN %Q " - "WHEN name LIKE 'sqlite_autoindex%%' AND type='index' THEN " + "WHEN name LIKE 'sqliteX_autoindex%%' ESCAPE 'X' " + " AND type='index' THEN " "'sqlite_autoindex_' || %Q || substr(name,%d+18) " "ELSE name END " "WHERE tbl_name=%Q COLLATE nocase AND " @@ -101371,7 +104862,6 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( int i = ++pParse->nMem; sqlite3VdbeLoadString(v, i, zName); sqlite3VdbeAddOp4(v, OP_VRename, i, 0, 0,(const char*)pVTab, P4_VTAB); - sqlite3MayAbort(pParse); } #endif @@ -101426,14 +104916,6 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ } #endif - /* If the default value for the new column was specified with a - ** literal NULL, then set pDflt to 0. This simplifies checking - ** for an SQL NULL default below. - */ - assert( pDflt==0 || pDflt->op==TK_SPAN ); - if( pDflt && pDflt->pLeft->op==TK_NULL ){ - pDflt = 0; - } /* Check that the new column is not specified as PRIMARY KEY or UNIQUE. ** If there is a NOT NULL constraint, then the default value for the @@ -101447,36 +104929,50 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ sqlite3ErrorMsg(pParse, "Cannot add a UNIQUE column"); return; } - if( (db->flags&SQLITE_ForeignKeys) && pNew->pFKey && pDflt ){ - sqlite3ErrorMsg(pParse, - "Cannot add a REFERENCES column with non-NULL default value"); - return; - } - if( pCol->notNull && !pDflt ){ - sqlite3ErrorMsg(pParse, - "Cannot add a NOT NULL column with default value NULL"); - return; - } - - /* Ensure the default expression is something that sqlite3ValueFromExpr() - ** can handle (i.e. not CURRENT_TIME etc.) - */ - if( pDflt ){ - sqlite3_value *pVal = 0; - int rc; - rc = sqlite3ValueFromExpr(db, pDflt, SQLITE_UTF8, SQLITE_AFF_BLOB, &pVal); - assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); - if( rc!=SQLITE_OK ){ - assert( db->mallocFailed == 1 ); + if( (pCol->colFlags & COLFLAG_GENERATED)==0 ){ + /* If the default value for the new column was specified with a + ** literal NULL, then set pDflt to 0. This simplifies checking + ** for an SQL NULL default below. + */ + assert( pDflt==0 || pDflt->op==TK_SPAN ); + if( pDflt && pDflt->pLeft->op==TK_NULL ){ + pDflt = 0; + } + if( (db->flags&SQLITE_ForeignKeys) && pNew->pFKey && pDflt ){ + sqlite3ErrorMsg(pParse, + "Cannot add a REFERENCES column with non-NULL default value"); return; } - if( !pVal ){ - sqlite3ErrorMsg(pParse, "Cannot add a column with non-constant default"); + if( pCol->notNull && !pDflt ){ + sqlite3ErrorMsg(pParse, + "Cannot add a NOT NULL column with default value NULL"); return; } - sqlite3ValueFree(pVal); + + /* Ensure the default expression is something that sqlite3ValueFromExpr() + ** can handle (i.e. not CURRENT_TIME etc.) + */ + if( pDflt ){ + sqlite3_value *pVal = 0; + int rc; + rc = sqlite3ValueFromExpr(db, pDflt, SQLITE_UTF8, SQLITE_AFF_BLOB, &pVal); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + if( rc!=SQLITE_OK ){ + assert( db->mallocFailed == 1 ); + return; + } + if( !pVal ){ + sqlite3ErrorMsg(pParse,"Cannot add a column with non-constant default"); + return; + } + sqlite3ValueFree(pVal); + } + }else if( pCol->colFlags & COLFLAG_STORED ){ + sqlite3ErrorMsg(pParse, "cannot add a STORED column"); + return; } + /* Modify the CREATE TABLE statement. */ zCol = sqlite3DbStrNDup(db, (char*)pColDef->z, pColDef->n); if( zCol ){ @@ -101559,10 +105055,11 @@ SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ sqlite3ErrorMsg(pParse, "Cannot add a column to a view"); goto exit_begin_add_column; } - if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ){ + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ){ goto exit_begin_add_column; } + sqlite3MayAbort(pParse); assert( pTab->addColOffset>0 ); iDb = sqlite3SchemaToIndex(db, pTab->pSchema); @@ -101661,7 +105158,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameColumn( if( !pTab ) goto exit_rename_column; /* Cannot alter a system table */ - if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ) goto exit_rename_column; + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ) goto exit_rename_column; if( SQLITE_OK!=isRealTable(pParse, pTab) ) goto exit_rename_column; /* Which schema holds the table to be altered */ @@ -101692,6 +105189,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameColumn( ** uses the sqlite_rename_column() SQL function to compute the new ** CREATE statement text for the sqlite_master table. */ + sqlite3MayAbort(pParse); zNew = sqlite3NameFromToken(db, pNew); if( !zNew ) goto exit_rename_column; assert( pNew->n>0 ); @@ -101699,7 +105197,8 @@ SQLITE_PRIVATE void sqlite3AlterRenameColumn( sqlite3NestedParse(pParse, "UPDATE \"%w\".%s SET " "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) " - "WHERE name NOT LIKE 'sqlite_%%' AND (type != 'index' OR tbl_name = %Q)" + "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' " + " AND (type != 'index' OR tbl_name = %Q)" " AND sql NOT LIKE 'create virtual%%'", zDb, MASTER_NAME, zDb, pTab->zName, iCol, zNew, bQuote, iSchema==1, @@ -101802,21 +105301,29 @@ static void renameTokenCheckAll(Parse *pParse, void *pPtr){ #endif /* -** Add a new RenameToken object mapping parse tree element pPtr into -** token *pToken to the Parse object currently under construction. +** Remember that the parser tree element pPtr was created using +** the token pToken. ** -** Return a copy of pPtr. +** In other words, construct a new RenameToken object and add it +** to the list of RenameToken objects currently being built up +** in pParse->pRename. +** +** The pPtr argument is returned so that this routine can be used +** with tail recursion in tokenExpr() routine, for a small performance +** improvement. */ SQLITE_PRIVATE void *sqlite3RenameTokenMap(Parse *pParse, void *pPtr, Token *pToken){ RenameToken *pNew; assert( pPtr || pParse->db->mallocFailed ); renameTokenCheckAll(pParse, pPtr); - pNew = sqlite3DbMallocZero(pParse->db, sizeof(RenameToken)); - if( pNew ){ - pNew->p = pPtr; - pNew->t = *pToken; - pNew->pNext = pParse->pRename; - pParse->pRename = pNew; + if( pParse->eParseMode!=PARSE_MODE_UNMAP ){ + pNew = sqlite3DbMallocZero(pParse->db, sizeof(RenameToken)); + if( pNew ){ + pNew->p = pPtr; + pNew->t = *pToken; + pNew->pNext = pParse->pRename; + pParse->pRename = pNew; + } } return pPtr; @@ -101847,15 +105354,67 @@ static int renameUnmapExprCb(Walker *pWalker, Expr *pExpr){ return WRC_Continue; } +/* +** Iterate through the Select objects that are part of WITH clauses attached +** to select statement pSelect. +*/ +static void renameWalkWith(Walker *pWalker, Select *pSelect){ + With *pWith = pSelect->pWith; + if( pWith ){ + int i; + for(i=0; inCte; i++){ + Select *p = pWith->a[i].pSelect; + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pWalker->pParse; + sqlite3SelectPrep(sNC.pParse, p, &sNC); + sqlite3WalkSelect(pWalker, p); + sqlite3RenameExprlistUnmap(pWalker->pParse, pWith->a[i].pCols); + } + } +} + +/* +** Walker callback used by sqlite3RenameExprUnmap(). +*/ +static int renameUnmapSelectCb(Walker *pWalker, Select *p){ + Parse *pParse = pWalker->pParse; + int i; + if( pParse->nErr ) return WRC_Abort; + if( NEVER(p->selFlags & SF_View) ) return WRC_Prune; + if( ALWAYS(p->pEList) ){ + ExprList *pList = p->pEList; + for(i=0; inExpr; i++){ + if( pList->a[i].zEName && pList->a[i].eEName==ENAME_NAME ){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pList->a[i].zEName); + } + } + } + if( ALWAYS(p->pSrc) ){ /* Every Select as a SrcList, even if it is empty */ + SrcList *pSrc = p->pSrc; + for(i=0; inSrc; i++){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pSrc->a[i].zName); + if( sqlite3WalkExpr(pWalker, pSrc->a[i].pOn) ) return WRC_Abort; + } + } + + renameWalkWith(pWalker, p); + return WRC_Continue; +} + /* ** Remove all nodes that are part of expression pExpr from the rename list. */ SQLITE_PRIVATE void sqlite3RenameExprUnmap(Parse *pParse, Expr *pExpr){ + u8 eMode = pParse->eParseMode; Walker sWalker; memset(&sWalker, 0, sizeof(Walker)); sWalker.pParse = pParse; sWalker.xExprCallback = renameUnmapExprCb; + sWalker.xSelectCallback = renameUnmapSelectCb; + pParse->eParseMode = PARSE_MODE_UNMAP; sqlite3WalkExpr(&sWalker, pExpr); + pParse->eParseMode = eMode; } /* @@ -101871,7 +105430,9 @@ SQLITE_PRIVATE void sqlite3RenameExprlistUnmap(Parse *pParse, ExprList *pEList){ sWalker.xExprCallback = renameUnmapExprCb; sqlite3WalkExprList(&sWalker, pEList); for(i=0; inExpr; i++){ - sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zName); + if( ALWAYS(pEList->a[i].eEName==ENAME_NAME) ){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName); + } } } } @@ -101915,8 +105476,8 @@ static void renameTokenFind(Parse *pParse, struct RenameCtx *pCtx, void *pPtr){ ** descend into sub-select statements. */ static int renameColumnSelectCb(Walker *pWalker, Select *p){ - UNUSED_PARAMETER(pWalker); - UNUSED_PARAMETER(p); + if( p->selFlags & SF_View ) return WRC_Prune; + renameWalkWith(pWalker, p); return WRC_Continue; } @@ -101938,7 +105499,7 @@ static int renameColumnExprCb(Walker *pWalker, Expr *pExpr){ renameTokenFind(pWalker->pParse, p, (void*)pExpr); }else if( pExpr->op==TK_COLUMN && pExpr->iColumn==p->iCol - && p->pTab==pExpr->pTab + && p->pTab==pExpr->y.pTab ){ renameTokenFind(pWalker->pParse, p, (void*)pExpr); } @@ -102009,8 +105570,11 @@ static void renameColumnElistNames( if( pEList ){ int i; for(i=0; inExpr; i++){ - char *zName = pEList->a[i].zName; - if( 0==sqlite3_stricmp(zName, zOld) ){ + char *zName = pEList->a[i].zEName; + if( ALWAYS(pEList->a[i].eEName==ENAME_NAME) + && ALWAYS(zName!=0) + && 0==sqlite3_stricmp(zName, zOld) + ){ renameTokenFind(pParse, pCtx, (void*)zName); } } @@ -102046,7 +105610,6 @@ static void renameColumnIdlistNames( static int renameParseSql( Parse *p, /* Memory to use for Parse object */ const char *zDb, /* Name of schema SQL belongs to */ - int bTable, /* 1 -> RENAME TABLE, 0 -> RENAME COLUMN */ sqlite3 *db, /* Database handle */ const char *zSql, /* SQL to parse */ int bTemp /* True if SQL is from temp schema */ @@ -102060,13 +105623,12 @@ static int renameParseSql( ** occurs and the parse does not result in a new table, index or ** trigger object, the database must be corrupt. */ memset(p, 0, sizeof(Parse)); - p->eParseMode = (bTable ? PARSE_MODE_RENAME_TABLE : PARSE_MODE_RENAME_COLUMN); + p->eParseMode = PARSE_MODE_RENAME; p->db = db; p->nQueryLoop = 1; rc = sqlite3RunParser(p, zSql, &zErr); assert( p->zErrMsg==0 ); assert( rc!=SQLITE_OK || zErr==0 ); - assert( (0!=p->pNewTable) + (0!=p->pNewIndex) + (0!=p->pNewTrigger)<2 ); p->zErrMsg = zErr; if( db->mallocFailed ) rc = SQLITE_NOMEM; if( rc==SQLITE_OK @@ -102196,9 +105758,14 @@ static int renameResolveTrigger(Parse *pParse, const char *zDb){ db->aDb[sqlite3SchemaToIndex(db, pNew->pTabSchema)].zDbSName ); pParse->eTriggerOp = pNew->op; + /* ALWAYS() because if the table of the trigger does not exist, the + ** error would have been hit before this point */ + if( ALWAYS(pParse->pTriggerTab) ){ + rc = sqlite3ViewGetColumnNames(pParse, pParse->pTriggerTab); + } /* Resolve symbols in WHEN clause */ - if( pNew->pWhen ){ + if( rc==SQLITE_OK && pNew->pWhen ){ rc = sqlite3ResolveExprNames(&sNC, pNew->pWhen); } @@ -102244,6 +105811,7 @@ static int renameResolveTrigger(Parse *pParse, const char *zDb){ } sNC.ncFlags = 0; } + sNC.pSrcList = 0; } } } @@ -102281,11 +105849,15 @@ static void renameWalkTrigger(Walker *pWalker, Trigger *pTrigger){ */ static void renameParseCleanup(Parse *pParse){ sqlite3 *db = pParse->db; + Index *pIdx; if( pParse->pVdbe ){ sqlite3VdbeFinalize(pParse->pVdbe); } sqlite3DeleteTable(db, pParse->pNewTable); - if( pParse->pNewIndex ) sqlite3FreeIndex(db, pParse->pNewIndex); + while( (pIdx = pParse->pNewIndex)!=0 ){ + pParse->pNewIndex = pIdx->pNext; + sqlite3FreeIndex(db, pIdx); + } sqlite3DeleteTrigger(db, pParse->pNewTrigger); sqlite3DbFree(db, pParse->zErrMsg); renameTokenFree(db, pParse->pRename); @@ -102312,15 +105884,8 @@ static void renameParseCleanup(Parse *pParse){ ** into zNew. The name should be quoted if bQuote is true. ** ** This function is used internally by the ALTER TABLE RENAME COLUMN command. -** Though accessible to application code, it is not intended for use by -** applications. The existance of this function, and the way it works, -** is subject to change without notice. -** -** If any of the parameters are out-of-bounds, then simply return NULL. -** An out-of-bounds parameter can only occur when the application calls -** this function directly. The parameters will always be well-formed when -** this routine is invoked by the bytecode for a legitimate ALTER TABLE -** statement. +** It is only accessible to SQL created using sqlite3NestedParse(). It is +** not reachable from ordinary SQL passed into sqlite3_prepare(). */ static void renameColumnFunc( sqlite3_context *context, @@ -102365,7 +105930,7 @@ static void renameColumnFunc( #ifndef SQLITE_OMIT_AUTHORIZATION db->xAuth = 0; #endif - rc = renameParseSql(&sParse, zDb, 0, db, zSql, bTemp); + rc = renameParseSql(&sParse, zDb, db, zSql, bTemp); /* Find tokens that need to be replaced. */ memset(&sWalker, 0, sizeof(Walker)); @@ -102379,8 +105944,9 @@ static void renameColumnFunc( if( sParse.pNewTable ){ Select *pSelect = sParse.pNewTable->pSelect; if( pSelect ){ + pSelect->selFlags &= ~SF_View; sParse.rc = SQLITE_OK; - sqlite3SelectPrep(&sParse, sParse.pNewTable->pSelect, 0); + sqlite3SelectPrep(&sParse, pSelect, 0); rc = (db->mallocFailed ? SQLITE_NOMEM : sParse.rc); if( rc==SQLITE_OK ){ sqlite3WalkSelect(&sWalker, pSelect); @@ -102403,7 +105969,15 @@ static void renameColumnFunc( for(pIdx=sParse.pNewTable->pIndex; pIdx; pIdx=pIdx->pNext){ sqlite3WalkExprList(&sWalker, pIdx->aColExpr); } + for(pIdx=sParse.pNewIndex; pIdx; pIdx=pIdx->pNext){ + sqlite3WalkExprList(&sWalker, pIdx->aColExpr); + } + } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + for(i=0; inCol; i++){ + sqlite3WalkExpr(&sWalker, sParse.pNewTable->aCol[i].pDflt); } +#endif for(pFKey=sParse.pNewTable->pFKey; pFKey; pFKey=pFKey->pNextFrom){ for(i=0; inCol; i++){ @@ -102476,8 +106050,8 @@ static void renameColumnFunc( */ static int renameTableExprCb(Walker *pWalker, Expr *pExpr){ RenameCtx *p = pWalker->u.pRename; - if( pExpr->op==TK_COLUMN && p->pTab==pExpr->pTab ){ - renameTokenFind(pWalker->pParse, p, (void*)&pExpr->pTab); + if( pExpr->op==TK_COLUMN && p->pTab==pExpr->y.pTab ){ + renameTokenFind(pWalker->pParse, p, (void*)&pExpr->y.pTab); } return WRC_Continue; } @@ -102489,12 +106063,18 @@ static int renameTableSelectCb(Walker *pWalker, Select *pSelect){ int i; RenameCtx *p = pWalker->u.pRename; SrcList *pSrc = pSelect->pSrc; + if( pSelect->selFlags & SF_View ) return WRC_Prune; + if( pSrc==0 ){ + assert( pWalker->pParse->db->mallocFailed ); + return WRC_Abort; + } for(i=0; inSrc; i++){ struct SrcList_item *pItem = &pSrc->a[i]; if( pItem->pTab==p->pTab ){ renameTokenFind(pWalker->pParse, p, pItem->zName); } } + renameWalkWith(pWalker, pSelect); return WRC_Continue; } @@ -102554,7 +106134,7 @@ static void renameTableFunc( sWalker.xSelectCallback = renameTableSelectCb; sWalker.u.pRename = &sCtx; - rc = renameParseSql(&sParse, zDb, 1, db, zInput, bTemp); + rc = renameParseSql(&sParse, zDb, db, zInput, bTemp); if( rc==SQLITE_OK ){ int isLegacy = (db->flags & SQLITE_LegacyAlter); @@ -102563,18 +106143,24 @@ static void renameTableFunc( if( pTab->pSelect ){ if( isLegacy==0 ){ + Select *pSelect = pTab->pSelect; NameContext sNC; memset(&sNC, 0, sizeof(sNC)); sNC.pParse = &sParse; + assert( pSelect->selFlags & SF_View ); + pSelect->selFlags &= ~SF_View; sqlite3SelectPrep(&sParse, pTab->pSelect, &sNC); - if( sParse.nErr ) rc = sParse.rc; - sqlite3WalkSelect(&sWalker, pTab->pSelect); + if( sParse.nErr ){ + rc = sParse.rc; + }else{ + sqlite3WalkSelect(&sWalker, pTab->pSelect); + } } }else{ /* Modify any FK definitions to point to the new table. */ #ifndef SQLITE_OMIT_FOREIGN_KEY - if( db->flags & SQLITE_ForeignKeys ){ + if( isLegacy==0 || (db->flags & SQLITE_ForeignKeys) ){ FKey *pFKey; for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){ if( sqlite3_stricmp(pFKey->zTo, zOld)==0 ){ @@ -102690,7 +106276,7 @@ static void renameTableTest( if( zDb && zInput ){ int rc; Parse sParse; - rc = renameParseSql(&sParse, zDb, 1, db, zInput, bTemp); + rc = renameParseSql(&sParse, zDb, db, zInput, bTemp); if( rc==SQLITE_OK ){ if( isLegacy==0 && sParse.pNewTable && sParse.pNewTable->pSelect ){ NameContext sNC; @@ -102728,9 +106314,9 @@ static void renameTableTest( */ SQLITE_PRIVATE void sqlite3AlterFunctions(void){ static FuncDef aAlterTableFuncs[] = { - FUNCTION(sqlite_rename_column, 9, 0, 0, renameColumnFunc), - FUNCTION(sqlite_rename_table, 7, 0, 0, renameTableFunc), - FUNCTION(sqlite_rename_test, 5, 0, 0, renameTableTest), + INTERNAL_FUNCTION(sqlite_rename_column, 9, renameColumnFunc), + INTERNAL_FUNCTION(sqlite_rename_table, 7, renameTableFunc), + INTERNAL_FUNCTION(sqlite_rename_test, 5, renameTableTest), }; sqlite3InsertBuiltinFuncs(aAlterTableFuncs, ArraySize(aAlterTableFuncs)); } @@ -102767,13 +106353,13 @@ SQLITE_PRIVATE void sqlite3AlterFunctions(void){ ** is between 3.6.18 and 3.7.8, inclusive, and unless SQLite is compiled ** with SQLITE_ENABLE_STAT2. The sqlite_stat2 table is deprecated. ** The sqlite_stat2 table is superseded by sqlite_stat3, which is only -** created and used by SQLite versions 3.7.9 and later and with +** created and used by SQLite versions 3.7.9 through 3.29.0 when ** SQLITE_ENABLE_STAT3 defined. The functionality of sqlite_stat3 -** is a superset of sqlite_stat2. The sqlite_stat4 is an enhanced -** version of sqlite_stat3 and is only available when compiled with -** SQLITE_ENABLE_STAT4 and in SQLite versions 3.8.1 and later. It is -** not possible to enable both STAT3 and STAT4 at the same time. If they -** are both enabled, then STAT4 takes precedence. +** is a superset of sqlite_stat2 and is also now deprecated. The +** sqlite_stat4 is an enhanced version of sqlite_stat3 and is only +** available when compiled with SQLITE_ENABLE_STAT4 and in SQLite +** versions 3.8.1 and later. STAT4 is the only variant that is still +** supported. ** ** For most applications, sqlite_stat1 provides all the statistics required ** for the query planner to make good choices. @@ -102884,17 +106470,11 @@ SQLITE_PRIVATE void sqlite3AlterFunctions(void){ #if defined(SQLITE_ENABLE_STAT4) # define IsStat4 1 -# define IsStat3 0 -#elif defined(SQLITE_ENABLE_STAT3) -# define IsStat4 0 -# define IsStat3 1 #else # define IsStat4 0 -# define IsStat3 0 # undef SQLITE_STAT4_SAMPLES # define SQLITE_STAT4_SAMPLES 1 #endif -#define IsStat34 (IsStat3+IsStat4) /* 1 for STAT3 or STAT4. 0 otherwise */ /* ** This routine generates code that opens the sqlite_statN tables. @@ -102923,14 +106503,10 @@ static void openStatTable( { "sqlite_stat1", "tbl,idx,stat" }, #if defined(SQLITE_ENABLE_STAT4) { "sqlite_stat4", "tbl,idx,neq,nlt,ndlt,sample" }, - { "sqlite_stat3", 0 }, -#elif defined(SQLITE_ENABLE_STAT3) - { "sqlite_stat3", "tbl,idx,neq,nlt,ndlt,sample" }, - { "sqlite_stat4", 0 }, #else - { "sqlite_stat3", 0 }, { "sqlite_stat4", 0 }, #endif + { "sqlite_stat3", 0 }, }; int i; sqlite3 *db = pParse->db; @@ -103011,7 +106587,7 @@ typedef struct Stat4Sample Stat4Sample; struct Stat4Sample { tRowcnt *anEq; /* sqlite_stat4.nEq */ tRowcnt *anDLt; /* sqlite_stat4.nDLt */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 tRowcnt *anLt; /* sqlite_stat4.nLt */ union { i64 iRowid; /* Rowid in main table of the key */ @@ -103042,7 +106618,7 @@ struct Stat4Accum { /* Reclaim memory used by a Stat4Sample */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 static void sampleClear(sqlite3 *db, Stat4Sample *p){ assert( db!=0 ); if( p->nRowid ){ @@ -103054,7 +106630,7 @@ static void sampleClear(sqlite3 *db, Stat4Sample *p){ /* Initialize the BLOB value of a ROWID */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 static void sampleSetRowid(sqlite3 *db, Stat4Sample *p, int n, const u8 *pData){ assert( db!=0 ); if( p->nRowid ) sqlite3DbFree(db, p->u.aRowid); @@ -103070,7 +106646,7 @@ static void sampleSetRowid(sqlite3 *db, Stat4Sample *p, int n, const u8 *pData){ /* Initialize the INTEGER value of a ROWID. */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 static void sampleSetRowidInt64(sqlite3 *db, Stat4Sample *p, i64 iRowid){ assert( db!=0 ); if( p->nRowid ) sqlite3DbFree(db, p->u.aRowid); @@ -103083,7 +106659,7 @@ static void sampleSetRowidInt64(sqlite3 *db, Stat4Sample *p, i64 iRowid){ /* ** Copy the contents of object (*pFrom) into (*pTo). */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 static void sampleCopy(Stat4Accum *p, Stat4Sample *pTo, Stat4Sample *pFrom){ pTo->isPSample = pFrom->isPSample; pTo->iCol = pFrom->iCol; @@ -103104,7 +106680,7 @@ static void sampleCopy(Stat4Accum *p, Stat4Sample *pTo, Stat4Sample *pFrom){ */ static void stat4Destructor(void *pOld){ Stat4Accum *p = (Stat4Accum*)pOld; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 int i; for(i=0; inCol; i++) sampleClear(p->db, p->aBest+i); for(i=0; imxSample; i++) sampleClear(p->db, p->a+i); @@ -103124,7 +106700,7 @@ static void stat4Destructor(void *pOld){ ** WITHOUT ROWID table, N is the number of PRIMARY KEY columns, not the ** total number of columns in the table. ** -** Note 2: C is only used for STAT3 and STAT4. +** Note 2: C is only used for STAT4. ** ** For indexes on ordinary rowid tables, N==K+1. But for indexes on ** WITHOUT ROWID tables, N=K+P where P is the number of columns in the @@ -103147,7 +106723,7 @@ static void statInit( int nColUp; /* nCol rounded up for alignment */ int n; /* Bytes of space to allocate */ sqlite3 *db; /* Database connection */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 int mxSample = SQLITE_STAT4_SAMPLES; #endif @@ -103164,7 +106740,7 @@ static void statInit( n = sizeof(*p) + sizeof(tRowcnt)*nColUp /* Stat4Accum.anEq */ + sizeof(tRowcnt)*nColUp /* Stat4Accum.anDLt */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 + sizeof(tRowcnt)*nColUp /* Stat4Accum.anLt */ + sizeof(Stat4Sample)*(nCol+mxSample) /* Stat4Accum.aBest[], a[] */ + sizeof(tRowcnt)*3*nColUp*(nCol+mxSample) @@ -103184,7 +106760,7 @@ static void statInit( p->current.anDLt = (tRowcnt*)&p[1]; p->current.anEq = &p->current.anDLt[nColUp]; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 { u8 *pSpace; /* Allocated space not yet assigned */ int i; /* Used to iterate through p->aSample[] */ @@ -103219,7 +106795,7 @@ static void statInit( sqlite3_result_blob(context, p, sizeof(*p), stat4Destructor); } static const FuncDef statInitFuncdef = { - 2+IsStat34, /* nArg */ + 2+IsStat4, /* nArg */ SQLITE_UTF8, /* funcFlags */ 0, /* pUserData */ 0, /* pNext */ @@ -103259,7 +106835,7 @@ static int sampleIsBetterPost( } #endif -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 /* ** Return true if pNew is to be preferred over pOld. ** @@ -103278,15 +106854,11 @@ static int sampleIsBetter( assert( IsStat4 || (pNew->iCol==0 && pOld->iCol==0) ); if( (nEqNew>nEqOld) ) return 1; -#ifdef SQLITE_ENABLE_STAT4 if( nEqNew==nEqOld ){ if( pNew->iColiCol ) return 1; return (pNew->iCol==pOld->iCol && sampleIsBetterPost(pAccum, pNew, pOld)); } return 0; -#else - return (nEqNew==nEqOld && pNew->iHash>pOld->iHash); -#endif } /* @@ -103299,7 +106871,6 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){ assert( IsStat4 || nEqZero==0 ); -#ifdef SQLITE_ENABLE_STAT4 /* Stat4Accum.nMaxEqZero is set to the maximum number of leading 0 ** values in the anEq[] array of any sample in Stat4Accum.a[]. In ** other words, if nMaxEqZero is n, then it is guaranteed that there @@ -103333,7 +106904,6 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){ goto find_new_min; } } -#endif /* If necessary, remove sample iMin to make room for the new sample. */ if( p->nSample>=p->mxSample ){ @@ -103354,10 +106924,8 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){ /* The "rows less-than" for the rowid column must be greater than that ** for the last sample in the p->a[] array. Otherwise, the samples would ** be out of order. */ -#ifdef SQLITE_ENABLE_STAT4 assert( p->nSample==0 || pNew->anLt[p->nCol-1] > p->a[p->nSample-1].anLt[p->nCol-1] ); -#endif /* Insert the new sample */ pSample = &p->a[p->nSample]; @@ -103367,9 +106935,7 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){ /* Zero the first nEqZero entries in the anEq[] array. */ memset(pSample->anEq, 0, sizeof(tRowcnt)*nEqZero); -#ifdef SQLITE_ENABLE_STAT4 - find_new_min: -#endif +find_new_min: if( p->nSample>=p->mxSample ){ int iMin = -1; for(i=0; imxSample; i++){ @@ -103382,7 +106948,7 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){ p->iMin = iMin; } } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ /* ** Field iChng of the index being scanned has changed. So at this point @@ -103423,28 +106989,7 @@ static void samplePushPrevious(Stat4Accum *p, int iChng){ } #endif -#if defined(SQLITE_ENABLE_STAT3) && !defined(SQLITE_ENABLE_STAT4) - if( iChng==0 ){ - tRowcnt nLt = p->current.anLt[0]; - tRowcnt nEq = p->current.anEq[0]; - - /* Check if this is to be a periodic sample. If so, add it. */ - if( (nLt/p->nPSample)!=(nLt+nEq)/p->nPSample ){ - p->current.isPSample = 1; - sampleInsert(p, &p->current, 0); - p->current.isPSample = 0; - }else - - /* Or if it is a non-periodic sample. Add it in this case too. */ - if( p->nSamplemxSample - || sampleIsBetter(p, &p->current, &p->a[p->iMin]) - ){ - sampleInsert(p, &p->current, 0); - } - } -#endif - -#ifndef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifndef SQLITE_ENABLE_STAT4 UNUSED_PARAMETER( p ); UNUSED_PARAMETER( iChng ); #endif @@ -103464,7 +107009,7 @@ static void samplePushPrevious(Stat4Accum *p, int iChng){ ** index being analyzed. The stat_get() SQL function will later be used to ** extract relevant information for constructing the sqlite_statN tables. ** -** The R parameter is only used for STAT3 and STAT4 +** The R parameter is only used for STAT4 */ static void statPush( sqlite3_context *context, @@ -103496,14 +107041,14 @@ static void statPush( } for(i=iChng; inCol; i++){ p->current.anDLt[i]++; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 p->current.anLt[i] += p->current.anEq[i]; #endif p->current.anEq[i] = 1; } } p->nRow++; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 if( sqlite3_value_type(argv[2])==SQLITE_INTEGER ){ sampleSetRowidInt64(p->db, &p->current, sqlite3_value_int64(argv[2])); }else{ @@ -103536,7 +107081,7 @@ static void statPush( #endif } static const FuncDef statPushFuncdef = { - 2+IsStat34, /* nArg */ + 2+IsStat4, /* nArg */ SQLITE_UTF8, /* funcFlags */ 0, /* pUserData */ 0, /* pNext */ @@ -103567,7 +107112,7 @@ static const FuncDef statPushFuncdef = { ** parameter will always be a poiner to a Stat4Accum object, never a ** NULL. ** -** If neither STAT3 nor STAT4 are enabled, then J is always +** If STAT4 is not enabled, then J is always ** STAT_GET_STAT1 and is hence omitted and this routine becomes ** a one-parameter function, stat_get(P), that always returns the ** stat1 table entry information. @@ -103578,8 +107123,8 @@ static void statGet( sqlite3_value **argv ){ Stat4Accum *p = (Stat4Accum*)sqlite3_value_blob(argv[0]); -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 - /* STAT3 and STAT4 have a parameter on this routine. */ +#ifdef SQLITE_ENABLE_STAT4 + /* STAT4 has a parameter on this routine. */ int eCall = sqlite3_value_int(argv[1]); assert( argc==2 ); assert( eCall==STAT_GET_STAT1 || eCall==STAT_GET_NEQ @@ -103634,7 +107179,7 @@ static void statGet( sqlite3_result_text(context, zRet, -1, sqlite3_free); } -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 else if( eCall==STAT_GET_ROWID ){ if( p->iGet<0 ){ samplePushPrevious(p, 0); @@ -103663,9 +107208,7 @@ static void statGet( } } - if( IsStat3 ){ - sqlite3_result_int64(context, (i64)aCnt[0]); - }else{ + { char *zRet = sqlite3MallocZero(p->nCol * 25); if( zRet==0 ){ sqlite3_result_error_nomem(context); @@ -103682,13 +107225,13 @@ static void statGet( } } } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ #ifndef SQLITE_DEBUG UNUSED_PARAMETER( argc ); #endif } static const FuncDef statGetFuncdef = { - 1+IsStat34, /* nArg */ + 1+IsStat4, /* nArg */ SQLITE_UTF8, /* funcFlags */ 0, /* pUserData */ 0, /* pNext */ @@ -103699,18 +107242,17 @@ static const FuncDef statGetFuncdef = { {0} }; -static void callStatGet(Vdbe *v, int regStat4, int iParam, int regOut){ - assert( regOut!=regStat4 && regOut!=regStat4+1 ); -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 - sqlite3VdbeAddOp2(v, OP_Integer, iParam, regStat4+1); +static void callStatGet(Parse *pParse, int regStat4, int iParam, int regOut){ +#ifdef SQLITE_ENABLE_STAT4 + sqlite3VdbeAddOp2(pParse->pVdbe, OP_Integer, iParam, regStat4+1); #elif SQLITE_DEBUG assert( iParam==STAT_GET_STAT1 ); #else UNUSED_PARAMETER( iParam ); #endif - sqlite3VdbeAddOp4(v, OP_Function0, 0, regStat4, regOut, - (char*)&statGetFuncdef, P4_FUNCDEF); - sqlite3VdbeChangeP5(v, 1 + IsStat34); + assert( regOut!=regStat4 && regOut!=regStat4+1 ); + sqlite3VdbeAddFunctionCall(pParse, 0, regStat4, regOut, 1+IsStat4, + &statGetFuncdef, 0); } /* @@ -103737,7 +107279,7 @@ static void analyzeOneTable( int regNewRowid = iMem++; /* Rowid for the inserted record */ int regStat4 = iMem++; /* Register to hold Stat4Accum object */ int regChng = iMem++; /* Index of changed index field */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 int regRowid = iMem++; /* Rowid argument passed to stat_push() */ #endif int regTemp = iMem++; /* Temporary use register */ @@ -103871,16 +107413,15 @@ static void analyzeOneTable( ** (3) the number of rows in the index, ** ** - ** The third argument is only used for STAT3 and STAT4 + ** The third argument is only used for STAT4 */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regStat4+3); #endif sqlite3VdbeAddOp2(v, OP_Integer, nCol, regStat4+1); sqlite3VdbeAddOp2(v, OP_Integer, pIdx->nKeyCol, regStat4+2); - sqlite3VdbeAddOp4(v, OP_Function0, 0, regStat4+1, regStat4, - (char*)&statInitFuncdef, P4_FUNCDEF); - sqlite3VdbeChangeP5(v, 2+IsStat34); + sqlite3VdbeAddFunctionCall(pParse, 0, regStat4+1, regStat4, 2+IsStat4, + &statInitFuncdef, 0); /* Implementation of the following: ** @@ -103896,7 +107437,7 @@ static void analyzeOneTable( addrNextRow = sqlite3VdbeCurrentAddr(v); if( nColTest>0 ){ - int endDistinctTest = sqlite3VdbeMakeLabel(v); + int endDistinctTest = sqlite3VdbeMakeLabel(pParse); int *aGotoChng; /* Array of jump instruction addresses */ aGotoChng = sqlite3DbMallocRawNN(db, sizeof(int)*nColTest); if( aGotoChng==0 ) continue; @@ -103951,12 +107492,12 @@ static void analyzeOneTable( /* ** chng_addr_N: - ** regRowid = idx(rowid) // STAT34 only - ** stat_push(P, regChng, regRowid) // 3rd parameter STAT34 only + ** regRowid = idx(rowid) // STAT4 only + ** stat_push(P, regChng, regRowid) // 3rd parameter STAT4 only ** Next csr ** if !eof(csr) goto next_row; */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 assert( regRowid==(regStat4+2) ); if( HasRowid(pTab) ){ sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, regRowid); @@ -103965,7 +107506,7 @@ static void analyzeOneTable( int j, k, regKey; regKey = sqlite3GetTempRange(pParse, pPk->nKeyCol); for(j=0; jnKeyCol; j++){ - k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[j]); + k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[j]); assert( k>=0 && knColumn ); sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, regKey+j); VdbeComment((v, "%s", pTab->aCol[pPk->aiColumn[j]].zName)); @@ -103975,13 +107516,12 @@ static void analyzeOneTable( } #endif assert( regChng==(regStat4+1) ); - sqlite3VdbeAddOp4(v, OP_Function0, 1, regStat4, regTemp, - (char*)&statPushFuncdef, P4_FUNCDEF); - sqlite3VdbeChangeP5(v, 2+IsStat34); + sqlite3VdbeAddFunctionCall(pParse, 1, regStat4, regTemp, 2+IsStat4, + &statPushFuncdef, 0); sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); /* Add the entry to the stat1 table. */ - callStatGet(v, regStat4, STAT_GET_STAT1, regStat1); + callStatGet(pParse, regStat4, STAT_GET_STAT1, regStat1); assert( "BBB"[0]==SQLITE_AFF_TEXT ); sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regTemp, "BBB", 0); sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid); @@ -103991,8 +107531,8 @@ static void analyzeOneTable( #endif sqlite3VdbeChangeP5(v, OPFLAG_APPEND); - /* Add the entries to the stat3 or stat4 table. */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + /* Add the entries to the stat4 table. */ +#ifdef SQLITE_ENABLE_STAT4 { int regEq = regStat1; int regLt = regStat1+1; @@ -104007,29 +107547,25 @@ static void analyzeOneTable( pParse->nMem = MAX(pParse->nMem, regCol+nCol); addrNext = sqlite3VdbeCurrentAddr(v); - callStatGet(v, regStat4, STAT_GET_ROWID, regSampleRowid); + callStatGet(pParse, regStat4, STAT_GET_ROWID, regSampleRowid); addrIsNull = sqlite3VdbeAddOp1(v, OP_IsNull, regSampleRowid); VdbeCoverage(v); - callStatGet(v, regStat4, STAT_GET_NEQ, regEq); - callStatGet(v, regStat4, STAT_GET_NLT, regLt); - callStatGet(v, regStat4, STAT_GET_NDLT, regDLt); + callStatGet(pParse, regStat4, STAT_GET_NEQ, regEq); + callStatGet(pParse, regStat4, STAT_GET_NLT, regLt); + callStatGet(pParse, regStat4, STAT_GET_NDLT, regDLt); sqlite3VdbeAddOp4Int(v, seekOp, iTabCur, addrNext, regSampleRowid, 0); VdbeCoverage(v); -#ifdef SQLITE_ENABLE_STAT3 - sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iTabCur, 0, regSample); -#else for(i=0; ibUnordered = 1; }else if( sqlite3_strglob("sz=[0-9]*", z)==0 ){ - pIndex->szIdxRow = sqlite3LogEst(sqlite3Atoi(z+3)); + int sz = sqlite3Atoi(z+3); + if( sz<2 ) sz = 2; + pIndex->szIdxRow = sqlite3LogEst(sz); }else if( sqlite3_strglob("noskipscan*", z)==0 ){ pIndex->noSkipScan = 1; } @@ -104291,7 +107829,7 @@ static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){ if( pIndex ){ tRowcnt *aiRowEst = 0; int nCol = pIndex->nKeyCol+1; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 /* Index.aiRowEst may already be set here if there are duplicate ** sqlite_stat1 entries for this index. In that case just clobber ** the old data with the new instead of allocating a new array. */ @@ -104327,7 +107865,7 @@ static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){ ** and its contents. */ SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 if( pIdx->aSample ){ int j; for(j=0; jnSample; j++){ @@ -104343,10 +107881,10 @@ SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){ #else UNUSED_PARAMETER(db); UNUSED_PARAMETER(pIdx); -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ } -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 /* ** Populate the pIdx->aAvgEq[] array based on the samples currently ** stored in pIdx->aSample[]. @@ -104424,12 +107962,11 @@ static Index *findIndexOrPrimaryKey( } /* -** Load the content from either the sqlite_stat4 or sqlite_stat3 table +** Load the content from either the sqlite_stat4 ** into the relevant Index.aSample[] arrays. ** ** Arguments zSql1 and zSql2 must point to SQL statements that return -** data equivalent to the following (statements are different for stat3, -** see the caller of this function for details): +** data equivalent to the following: ** ** zSql1: SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx ** zSql2: SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4 @@ -104438,7 +107975,6 @@ static Index *findIndexOrPrimaryKey( */ static int loadStatTbl( sqlite3 *db, /* Database handle */ - int bStat3, /* Assume single column records only */ const char *zSql1, /* SQL statement 1 (see above) */ const char *zSql2, /* SQL statement 2 (see above) */ const char *zDb /* Database name (e.g. "main") */ @@ -104472,17 +108008,13 @@ static int loadStatTbl( if( zIndex==0 ) continue; nSample = sqlite3_column_int(pStmt, 1); pIdx = findIndexOrPrimaryKey(db, zIndex, zDb); - assert( pIdx==0 || bStat3 || pIdx->nSample==0 ); - /* Index.nSample is non-zero at this point if data has already been - ** loaded from the stat4 table. In this case ignore stat3 data. */ - if( pIdx==0 || pIdx->nSample ) continue; - if( bStat3==0 ){ - assert( !HasRowid(pIdx->pTable) || pIdx->nColumn==pIdx->nKeyCol+1 ); - if( !HasRowid(pIdx->pTable) && IsPrimaryKeyIndex(pIdx) ){ - nIdxCol = pIdx->nKeyCol; - }else{ - nIdxCol = pIdx->nColumn; - } + assert( pIdx==0 || pIdx->nSample==0 ); + if( pIdx==0 ) continue; + assert( !HasRowid(pIdx->pTable) || pIdx->nColumn==pIdx->nKeyCol+1 ); + if( !HasRowid(pIdx->pTable) && IsPrimaryKeyIndex(pIdx) ){ + nIdxCol = pIdx->nKeyCol; + }else{ + nIdxCol = pIdx->nColumn; } pIdx->nSampleCol = nIdxCol; nByte = sizeof(IndexSample) * nSample; @@ -104524,9 +108056,8 @@ static int loadStatTbl( pIdx = findIndexOrPrimaryKey(db, zIndex, zDb); if( pIdx==0 ) continue; /* This next condition is true if data has already been loaded from - ** the sqlite_stat4 table. In this case ignore stat3 data. */ + ** the sqlite_stat4 table. */ nCol = pIdx->nSampleCol; - if( bStat3 && nCol>1 ) continue; if( pIdx!=pPrevIdx ){ initAvgEq(pPrevIdx); pPrevIdx = pIdx; @@ -104559,7 +108090,7 @@ static int loadStatTbl( } /* -** Load content from the sqlite_stat4 and sqlite_stat3 tables into +** Load content from the sqlite_stat4 table into ** the Index.aSample[] arrays of all indices. */ static int loadStat4(sqlite3 *db, const char *zDb){ @@ -104567,37 +108098,28 @@ static int loadStat4(sqlite3 *db, const char *zDb){ assert( db->lookaside.bDisable ); if( sqlite3FindTable(db, "sqlite_stat4", zDb) ){ - rc = loadStatTbl(db, 0, + rc = loadStatTbl(db, "SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx", "SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4", zDb ); } - - if( rc==SQLITE_OK && sqlite3FindTable(db, "sqlite_stat3", zDb) ){ - rc = loadStatTbl(db, 1, - "SELECT idx,count(*) FROM %Q.sqlite_stat3 GROUP BY idx", - "SELECT idx,neq,nlt,ndlt,sqlite_record(sample) FROM %Q.sqlite_stat3", - zDb - ); - } - return rc; } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ /* -** Load the content of the sqlite_stat1 and sqlite_stat3/4 tables. The +** Load the content of the sqlite_stat1 and sqlite_stat4 tables. The ** contents of sqlite_stat1 are used to populate the Index.aiRowEst[] -** arrays. The contents of sqlite_stat3/4 are used to populate the +** arrays. The contents of sqlite_stat4 are used to populate the ** Index.aSample[] arrays. ** ** If the sqlite_stat1 table is not present in the database, SQLITE_ERROR -** is returned. In this case, even if SQLITE_ENABLE_STAT3/4 was defined -** during compilation and the sqlite_stat3/4 table is present, no data is +** is returned. In this case, even if SQLITE_ENABLE_STAT4 was defined +** during compilation and the sqlite_stat4 table is present, no data is ** read from it. ** -** If SQLITE_ENABLE_STAT3/4 was defined during compilation and the +** If SQLITE_ENABLE_STAT4 was defined during compilation and the ** sqlite_stat4 table is not present in the database, SQLITE_ERROR is ** returned. However, in this case, data is read from the sqlite_stat1 ** table (if it is present) before returning. @@ -104625,7 +108147,7 @@ SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ Index *pIdx = sqliteHashData(i); pIdx->hasStat1 = 0; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 sqlite3DeleteIndexSamples(db, pIdx); pIdx->aSample = 0; #endif @@ -104653,11 +108175,11 @@ SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ } /* Load the statistics from the sqlite_stat4 table. */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 if( rc==SQLITE_OK ){ - db->lookaside.bDisable++; + DisableLookaside; rc = loadStat4(db, sInfo.zDatabase); - db->lookaside.bDisable--; + EnableLookaside; } for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ Index *pIdx = sqliteHashData(i); @@ -104779,7 +108301,7 @@ static void attachFunc( if( pNew->pBt ) sqlite3BtreeClose(pNew->pBt); pNew->pBt = 0; pNew->pSchema = 0; - rc = sqlite3BtreeOpen(pVfs, "x", db, &pNew->pBt, 0, SQLITE_OPEN_MAIN_DB); + rc = sqlite3BtreeOpen(pVfs, "x\0", db, &pNew->pBt, 0, SQLITE_OPEN_MAIN_DB); }else{ /* This is a real ATTACH ** @@ -104834,8 +108356,8 @@ static void attachFunc( assert( pVfs ); flags |= SQLITE_OPEN_MAIN_DB; rc = sqlite3BtreeOpen(pVfs, zPath, db, &pNew->pBt, 0, flags); - sqlite3_free( zPath ); db->nDb++; + pNew->zDbSName = sqlite3DbStrDup(db, zName); } db->noSharedCache = 0; if( rc==SQLITE_CONSTRAINT ){ @@ -104863,7 +108385,6 @@ static void attachFunc( sqlite3BtreeLeave(pNew->pBt); } pNew->safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; - if( !REOPEN_AS_MEMDB(db) ) pNew->zDbSName = sqlite3DbStrDup(db, zName); if( rc==SQLITE_OK && pNew->zDbSName==0 ){ rc = SQLITE_NOMEM_BKPT; } @@ -104891,15 +108412,19 @@ static void attachFunc( break; case SQLITE_NULL: - /* No key specified. Use the key from the main database */ - sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey); - if( nKey || sqlite3BtreeGetOptimalReserve(db->aDb[0].pBt)>0 ){ - rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); + /* No key specified. Use the key from URI filename, or if none, + ** use the key from the main database. */ + if( sqlite3CodecQueryParameters(db, zName, zPath)==0 ){ + sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey); + if( nKey || sqlite3BtreeGetOptimalReserve(db->aDb[0].pBt)>0 ){ + rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); + } } break; } } #endif + sqlite3_free( zPath ); /* If the file was opened successfully, read the schema for the new database. ** If this fails, or if opening the file failed, then close the file and @@ -104910,12 +108435,14 @@ static void attachFunc( sqlite3BtreeEnterAll(db); db->init.iDb = 0; db->mDbFlags &= ~(DBFLAG_SchemaKnownOk); - rc = sqlite3Init(db, &zErrDyn); + if( !REOPEN_AS_MEMDB(db) ){ + rc = sqlite3Init(db, &zErrDyn); + } sqlite3BtreeLeaveAll(db); assert( zErrDyn==0 || rc!=SQLITE_OK ); } #ifdef SQLITE_USER_AUTHENTICATION - if( rc==SQLITE_OK ){ + if( rc==SQLITE_OK && !REOPEN_AS_MEMDB(db) ){ u8 newAuth = 0; rc = sqlite3UserAuthCheckLogin(db, zName, &newAuth); if( newAuthauth.authLevel ){ @@ -104973,6 +108500,7 @@ static void detachFunc( sqlite3 *db = sqlite3_context_db_handle(context); int i; Db *pDb = 0; + HashElem *pEntry; char zErr[128]; UNUSED_PARAMETER(NotUsed); @@ -104997,6 +108525,18 @@ static void detachFunc( goto detach_error; } + /* If any TEMP triggers reference the schema being detached, move those + ** triggers to reference the TEMP schema itself. */ + assert( db->aDb[1].pSchema ); + pEntry = sqliteHashFirst(&db->aDb[1].pSchema->trigHash); + while( pEntry ){ + Trigger *pTrig = (Trigger*)sqliteHashData(pEntry); + if( pTrig->pTabSchema==pDb->pSchema ){ + pTrig->pTabSchema = pTrig->pSchema; + } + pEntry = sqliteHashNext(pEntry); + } + sqlite3BtreeClose(pDb->pBt); pDb->pBt = 0; pDb->pSchema = 0; @@ -105062,11 +108602,8 @@ static void codeAttach( assert( v || db->mallocFailed ); if( v ){ - sqlite3VdbeAddOp4(v, OP_Function0, 0, regArgs+3-pFunc->nArg, regArgs+3, - (char *)pFunc, P4_FUNCDEF); - assert( pFunc->nArg==-1 || (pFunc->nArg&0xff)==pFunc->nArg ); - sqlite3VdbeChangeP5(v, (u8)(pFunc->nArg)); - + sqlite3VdbeAddFunctionCall(pParse, 0, regArgs+3-pFunc->nArg, regArgs+3, + pFunc->nArg, pFunc, 0); /* Code an OP_Expire. For an ATTACH statement, set P1 to true (expire this ** statement only). For DETACH, set it to false (expire all existing ** statements). @@ -105141,7 +108678,7 @@ SQLITE_PRIVATE void sqlite3FixInit( pFix->pSchema = db->aDb[iDb].pSchema; pFix->zType = zType; pFix->pName = pName; - pFix->bVarOnly = (iDb==1); + pFix->bTemp = (iDb==1); } /* @@ -105169,7 +108706,7 @@ SQLITE_PRIVATE int sqlite3FixSrcList( if( NEVER(pList==0) ) return 0; zDb = pFix->zDb; for(i=0, pItem=pList->a; inSrc; i++, pItem++){ - if( pFix->bVarOnly==0 ){ + if( pFix->bTemp==0 ){ if( pItem->zDatabase && sqlite3StrICmp(pItem->zDatabase, zDb) ){ sqlite3ErrorMsg(pFix->pParse, "%s %T cannot reference objects in database %s", @@ -105179,6 +108716,7 @@ SQLITE_PRIVATE int sqlite3FixSrcList( sqlite3DbFree(pFix->pParse->db, pItem->zDatabase); pItem->zDatabase = 0; pItem->pSchema = pFix->pSchema; + pItem->fg.fromDDL = 1; } #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) if( sqlite3FixSelect(pFix, pItem->pSelect) ) return 1; @@ -105234,6 +108772,7 @@ SQLITE_PRIVATE int sqlite3FixExpr( Expr *pExpr /* The expression to be fixed to one database */ ){ while( pExpr ){ + if( !pFix->bTemp ) ExprSetProperty(pExpr, EP_FromDDL); if( pExpr->op==TK_VARIABLE ){ if( pFix->pParse->db->init.busy ){ pExpr->op = TK_NULL; @@ -105386,7 +108925,7 @@ SQLITE_API int sqlite3_set_authorizer( sqlite3_mutex_enter(db->mutex); db->xAuth = (sqlite3_xauth)xAuth; db->pAuthArg = pArg; - sqlite3ExpirePreparedStatements(db, 0); + if( db->xAuth ) sqlite3ExpirePreparedStatements(db, 1); sqlite3_mutex_leave(db->mutex); return SQLITE_OK; } @@ -105459,6 +108998,7 @@ SQLITE_PRIVATE void sqlite3AuthRead( int iCol; /* Index of column in table */ assert( pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER ); + assert( !IN_RENAME_OBJECT || db->xAuth==0 ); if( db->xAuth==0 ) return; iDb = sqlite3SchemaToIndex(pParse->db, pSchema); if( iDb<0 ){ @@ -105515,6 +109055,7 @@ SQLITE_PRIVATE int sqlite3AuthCheck( /* Don't do any authorization checks if the database is initialising ** or if the parser is being invoked from within sqlite3_declare_vtab. */ + assert( !IN_RENAME_OBJECT || db->xAuth==0 ); if( db->init.busy || IN_SPECIAL_PARSE ){ return SQLITE_OK; } @@ -105809,7 +109350,7 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ if( v && pParse->nErr==0 && !db->mallocFailed ){ /* A minimum of one cursor is required if autoincrement is used * See ticket [a696379c1f08866] */ - if( pParse->pAinc!=0 && pParse->nTab==0 ) pParse->nTab = 1; + assert( pParse->pAinc==0 || pParse->nTab>0 ); sqlite3VdbeMakeReady(v, pParse); pParse->rc = SQLITE_DONE; }else{ @@ -105842,7 +109383,12 @@ SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ zSql = sqlite3VMPrintf(db, zFormat, ap); va_end(ap); if( zSql==0 ){ - return; /* A malloc must have failed */ + /* This can result either from an OOM or because the formatted string + ** exceeds SQLITE_LIMIT_LENGTH. In the latter case, we need to set + ** an error */ + if( !db->mallocFailed ) pParse->rc = SQLITE_TOOBIG; + pParse->nErr++; + return; } pParse->nested++; memcpy(saveBuf, PARSE_TAIL(pParse), PARSE_TAIL_SZ); @@ -105936,12 +109482,11 @@ SQLITE_PRIVATE Table *sqlite3LocateTable( p = sqlite3FindTable(db, zName, zDbase); if( p==0 ){ - const char *zMsg = flags & LOCATE_VIEW ? "no such view" : "no such table"; #ifndef SQLITE_OMIT_VIRTUALTABLE - if( sqlite3FindDbName(db, zDbase)<1 ){ - /* If zName is the not the name of a table in the schema created using - ** CREATE, then check to see if it is the name of an virtual table that - ** can be an eponymous virtual table. */ + /* If zName is the not the name of a table in the schema created using + ** CREATE, then check to see if it is the name of an virtual table that + ** can be an eponymous virtual table. */ + if( pParse->disableVtab==0 ){ Module *pMod = (Module*)sqlite3HashFind(&db->aModule, zName); if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){ pMod = sqlite3PragmaVtabRegister(db, zName); @@ -105951,13 +109496,18 @@ SQLITE_PRIVATE Table *sqlite3LocateTable( } } #endif - if( (flags & LOCATE_NOERR)==0 ){ - if( zDbase ){ - sqlite3ErrorMsg(pParse, "%s: %s.%s", zMsg, zDbase, zName); - }else{ - sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName); - } - pParse->checkSchema = 1; + if( flags & LOCATE_NOERR ) return 0; + pParse->checkSchema = 1; + }else if( IsVirtual(p) && pParse->disableVtab ){ + p = 0; + } + + if( p==0 ){ + const char *zMsg = flags & LOCATE_VIEW ? "no such view" : "no such table"; + if( zDbase ){ + sqlite3ErrorMsg(pParse, "%s: %s.%s", zMsg, zDbase, zName); + }else{ + sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName); } } @@ -106029,7 +109579,7 @@ SQLITE_PRIVATE void sqlite3FreeIndex(sqlite3 *db, Index *p){ sqlite3ExprListDelete(db, p->aColExpr); sqlite3DbFree(db, p->zColAff); if( p->isResized ) sqlite3DbFree(db, (void *)p->azColl); -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 sqlite3_free(p->aiRowEst); #endif sqlite3DbFree(db, p); @@ -106128,17 +109678,22 @@ SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3 *db, int iDb){ SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3 *db){ int i; sqlite3BtreeEnterAll(db); - assert( db->nSchemaLock==0 ); for(i=0; inDb; i++){ Db *pDb = &db->aDb[i]; if( pDb->pSchema ){ - sqlite3SchemaClear(pDb->pSchema); + if( db->nSchemaLock==0 ){ + sqlite3SchemaClear(pDb->pSchema); + }else{ + DbSetProperty(db, i, DB_ResetWanted); + } } } db->mDbFlags &= ~(DBFLAG_SchemaChange|DBFLAG_SchemaKnownOk); sqlite3VtabUnlockList(db); sqlite3BtreeLeaveAll(db); - sqlite3CollapseDatabaseArray(db); + if( db->nSchemaLock==0 ){ + sqlite3CollapseDatabaseArray(db); + } } /* @@ -106186,10 +109741,14 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){ #ifdef SQLITE_DEBUG /* Record the number of outstanding lookaside allocations in schema Tables - ** prior to doing any free() operations. Since schema Tables do not use - ** lookaside, this number should not change. */ + ** prior to doing any free() operations. Since schema Tables do not use + ** lookaside, this number should not change. + ** + ** If malloc has already failed, it may be that it failed while allocating + ** a Table object that was going to be marked ephemeral. So do not check + ** that no lookaside memory is used in this case either. */ int nLookaside = 0; - if( db && (pTable->tabFlags & TF_Ephemeral)==0 ){ + if( db && !db->mallocFailed && (pTable->tabFlags & TF_Ephemeral)==0 ){ nLookaside = sqlite3LookasideUsed(db, 0); } #endif @@ -106373,19 +109932,61 @@ SQLITE_PRIVATE int sqlite3TwoPartName( return iDb; } +/* +** True if PRAGMA writable_schema is ON +*/ +SQLITE_PRIVATE int sqlite3WritableSchema(sqlite3 *db){ + testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))==0 ); + testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))== + SQLITE_WriteSchema ); + testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))== + SQLITE_Defensive ); + testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))== + (SQLITE_WriteSchema|SQLITE_Defensive) ); + return (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))==SQLITE_WriteSchema; +} + /* ** This routine is used to check if the UTF-8 string zName is a legal ** unqualified name for a new schema object (table, index, view or ** trigger). All names are legal except those that begin with the string ** "sqlite_" (in upper, lower or mixed case). This portion of the namespace ** is reserved for internal use. +** +** When parsing the sqlite_master table, this routine also checks to +** make sure the "type", "name", and "tbl_name" columns are consistent +** with the SQL. */ -SQLITE_PRIVATE int sqlite3CheckObjectName(Parse *pParse, const char *zName){ - if( !pParse->db->init.busy && pParse->nested==0 - && (pParse->db->flags & SQLITE_WriteSchema)==0 - && 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){ - sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", zName); - return SQLITE_ERROR; +SQLITE_PRIVATE int sqlite3CheckObjectName( + Parse *pParse, /* Parsing context */ + const char *zName, /* Name of the object to check */ + const char *zType, /* Type of this object */ + const char *zTblName /* Parent table name for triggers and indexes */ +){ + sqlite3 *db = pParse->db; + if( sqlite3WritableSchema(db) || db->init.imposterTable ){ + /* Skip these error checks for writable_schema=ON */ + return SQLITE_OK; + } + if( db->init.busy ){ + if( sqlite3_stricmp(zType, db->init.azInit[0]) + || sqlite3_stricmp(zName, db->init.azInit[1]) + || sqlite3_stricmp(zTblName, db->init.azInit[2]) + ){ + if( sqlite3Config.bExtraSchemaChecks ){ + sqlite3ErrorMsg(pParse, ""); /* corruptSchema() will supply the error */ + return SQLITE_ERROR; + } + } + }else{ + if( (pParse->nested==0 && 0==sqlite3StrNICmp(zName, "sqlite_", 7)) + || (sqlite3ReadOnlyShadowTables(db) && sqlite3ShadowTableName(db, zName)) + ){ + sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", + zName); + return SQLITE_ERROR; + } + } return SQLITE_OK; } @@ -106400,10 +110001,12 @@ SQLITE_PRIVATE Index *sqlite3PrimaryKeyIndex(Table *pTab){ } /* -** Return the column of index pIdx that corresponds to table -** column iCol. Return -1 if not found. +** Convert an table column number into a index column number. That is, +** for the column iCol in the table (as defined by the CREATE TABLE statement) +** find the (first) offset of that column in index pIdx. Or return -1 +** if column iCol is not used in index pIdx. */ -SQLITE_PRIVATE i16 sqlite3ColumnOfIndex(Index *pIdx, i16 iCol){ +SQLITE_PRIVATE i16 sqlite3TableColumnToIndex(Index *pIdx, i16 iCol){ int i; for(i=0; inColumn; i++){ if( iCol==pIdx->aiColumn[i] ) return i; @@ -106411,6 +110014,84 @@ SQLITE_PRIVATE i16 sqlite3ColumnOfIndex(Index *pIdx, i16 iCol){ return -1; } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* Convert a storage column number into a table column number. +** +** The storage column number (0,1,2,....) is the index of the value +** as it appears in the record on disk. The true column number +** is the index (0,1,2,...) of the column in the CREATE TABLE statement. +** +** The storage column number is less than the table column number if +** and only there are VIRTUAL columns to the left. +** +** If SQLITE_OMIT_GENERATED_COLUMNS, this routine is a no-op macro. +*/ +SQLITE_PRIVATE i16 sqlite3StorageColumnToTable(Table *pTab, i16 iCol){ + if( pTab->tabFlags & TF_HasVirtual ){ + int i; + for(i=0; i<=iCol; i++){ + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) iCol++; + } + } + return iCol; +} +#endif + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* Convert a table column number into a storage column number. +** +** The storage column number (0,1,2,....) is the index of the value +** as it appears in the record on disk. Or, if the input column is +** the N-th virtual column (zero-based) then the storage number is +** the number of non-virtual columns in the table plus N. +** +** The true column number is the index (0,1,2,...) of the column in +** the CREATE TABLE statement. +** +** If the input column is a VIRTUAL column, then it should not appear +** in storage. But the value sometimes is cached in registers that +** follow the range of registers used to construct storage. This +** avoids computing the same VIRTUAL column multiple times, and provides +** values for use by OP_Param opcodes in triggers. Hence, if the +** input column is a VIRTUAL table, put it after all the other columns. +** +** In the following, N means "normal column", S means STORED, and +** V means VIRTUAL. Suppose the CREATE TABLE has columns like this: +** +** CREATE TABLE ex(N,S,V,N,S,V,N,S,V); +** -- 0 1 2 3 4 5 6 7 8 +** +** Then the mapping from this function is as follows: +** +** INPUTS: 0 1 2 3 4 5 6 7 8 +** OUTPUTS: 0 1 6 2 3 7 4 5 8 +** +** So, in other words, this routine shifts all the virtual columns to +** the end. +** +** If SQLITE_OMIT_GENERATED_COLUMNS then there are no virtual columns and +** this routine is a no-op macro. If the pTab does not have any virtual +** columns, then this routine is no-op that always return iCol. If iCol +** is negative (indicating the ROWID column) then this routine return iCol. +*/ +SQLITE_PRIVATE i16 sqlite3TableColumnToStorage(Table *pTab, i16 iCol){ + int i; + i16 n; + assert( iColnCol ); + if( (pTab->tabFlags & TF_HasVirtual)==0 || iCol<0 ) return iCol; + for(i=0, n=0; iaCol[i].colFlags & COLFLAG_VIRTUAL)==0 ) n++; + } + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ){ + /* iCol is a virtual column itself */ + return pTab->nNVCol + i - n; + }else{ + /* iCol is a normal or stored column */ + return n; + } +} +#endif + /* ** Begin constructing a new table representation in memory. This is ** the first of several action routines that get called in response @@ -106466,7 +110147,7 @@ SQLITE_PRIVATE void sqlite3StartTable( } pParse->sNameToken = *pName; if( zName==0 ) return; - if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ + if( sqlite3CheckObjectName(pParse, zName, isView?"view":"table", zName) ){ goto begin_table_error; } if( db->init.iDb==1 ) isTemp = 1; @@ -106701,6 +110382,7 @@ SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){ pCol->colFlags |= COLFLAG_HASTYPE; } p->nCol++; + p->nNVCol++; pParse->constraintName.n = 0; } @@ -106845,10 +110527,17 @@ SQLITE_PRIVATE void sqlite3AddDefaultValue( sqlite3 *db = pParse->db; p = pParse->pNewTable; if( p!=0 ){ + int isInit = db->init.busy && db->init.iDb!=1; pCol = &(p->aCol[p->nCol-1]); - if( !sqlite3ExprIsConstantOrFunction(pExpr, db->init.busy) ){ + if( !sqlite3ExprIsConstantOrFunction(pExpr, isInit) ){ sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant", pCol->zName); +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + }else if( pCol->colFlags & COLFLAG_GENERATED ){ + testcase( pCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pCol->colFlags & COLFLAG_STORED ); + sqlite3ErrorMsg(pParse, "cannot use DEFAULT on a generated column"); +#endif }else{ /* A copy of pExpr is used instead of the original, as pExpr contains ** tokens that point to volatile memory. @@ -106883,7 +110572,7 @@ SQLITE_PRIVATE void sqlite3AddDefaultValue( ** accept it. This routine does the necessary conversion. It converts ** the expression given in its argument from a TK_STRING into a TK_ID ** if the expression is just a TK_STRING with an optional COLLATE clause. -** If the epxression is anything other than TK_STRING, the expression is +** If the expression is anything other than TK_STRING, the expression is ** unchanged. */ static void sqlite3StringToId(Expr *p){ @@ -106894,6 +110583,21 @@ static void sqlite3StringToId(Expr *p){ } } +/* +** Tag the given column as being part of the PRIMARY KEY +*/ +static void makeColumnPartOfPrimaryKey(Parse *pParse, Column *pCol){ + pCol->colFlags |= COLFLAG_PRIMKEY; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pCol->colFlags & COLFLAG_GENERATED ){ + testcase( pCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pCol->colFlags & COLFLAG_STORED ); + sqlite3ErrorMsg(pParse, + "generated columns cannot be part of the PRIMARY KEY"); + } +#endif +} + /* ** Designate the PRIMARY KEY for the table. pList is a list of names ** of columns that form the primary key. If pList is NULL, then the @@ -106933,7 +110637,7 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey( if( pList==0 ){ iCol = pTab->nCol - 1; pCol = &pTab->aCol[iCol]; - pCol->colFlags |= COLFLAG_PRIMKEY; + makeColumnPartOfPrimaryKey(pParse, pCol); nTerm = 1; }else{ nTerm = pList->nExpr; @@ -106946,7 +110650,7 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey( for(iCol=0; iColnCol; iCol++){ if( sqlite3StrICmp(zCName, pTab->aCol[iCol].zName)==0 ){ pCol = &pTab->aCol[iCol]; - pCol->colFlags |= COLFLAG_PRIMKEY; + makeColumnPartOfPrimaryKey(pParse, pCol); break; } } @@ -106959,13 +110663,15 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey( && sortOrder!=SQLITE_SO_DESC ){ if( IN_RENAME_OBJECT && pList ){ - sqlite3RenameTokenRemap(pParse, &pTab->iPKey, pList->a[0].pExpr); + Expr *pCExpr = sqlite3ExprSkipCollate(pList->a[0].pExpr); + sqlite3RenameTokenRemap(pParse, &pTab->iPKey, pCExpr); } pTab->iPKey = iCol; pTab->keyConf = (u8)onError; assert( autoInc==0 || autoInc==1 ); pTab->tabFlags |= autoInc*TF_Autoincrement; - if( pList ) pParse->iPkSortOrder = pList->a[0].sortOrder; + if( pList ) pParse->iPkSortOrder = pList->a[0].sortFlags; + (void)sqlite3HasExplicitNulls(pParse, pList); }else if( autoInc ){ #ifndef SQLITE_OMIT_AUTOINCREMENT sqlite3ErrorMsg(pParse, "AUTOINCREMENT is only allowed on an " @@ -107042,41 +110748,58 @@ SQLITE_PRIVATE void sqlite3AddCollateType(Parse *pParse, Token *pToken){ } } -/* -** This function returns the collation sequence for database native text -** encoding identified by the string zName, length nName. -** -** If the requested collation sequence is not available, or not available -** in the database native encoding, the collation factory is invoked to -** request it. If the collation factory does not supply such a sequence, -** and the sequence is available in another text encoding, then that is -** returned instead. -** -** If no versions of the requested collations sequence are available, or -** another error occurs, NULL is returned and an error message written into -** pParse. -** -** This routine is a wrapper around sqlite3FindCollSeq(). This routine -** invokes the collation factory if the named collation cannot be found -** and generates an error message. -** -** See also: sqlite3FindCollSeq(), sqlite3GetCollSeq() +/* Change the most recently parsed column to be a GENERATED ALWAYS AS +** column. */ -SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName){ - sqlite3 *db = pParse->db; - u8 enc = ENC(db); - u8 initbusy = db->init.busy; - CollSeq *pColl; - - pColl = sqlite3FindCollSeq(db, enc, zName, initbusy); - if( !initbusy && (!pColl || !pColl->xCmp) ){ - pColl = sqlite3GetCollSeq(pParse, enc, pColl, zName); +SQLITE_PRIVATE void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType){ +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + u8 eType = COLFLAG_VIRTUAL; + Table *pTab = pParse->pNewTable; + Column *pCol; + if( pTab==0 ){ + /* generated column in an CREATE TABLE IF NOT EXISTS that already exists */ + goto generated_done; } + pCol = &(pTab->aCol[pTab->nCol-1]); + if( IN_DECLARE_VTAB ){ + sqlite3ErrorMsg(pParse, "virtual tables cannot use computed columns"); + goto generated_done; + } + if( pCol->pDflt ) goto generated_error; + if( pType ){ + if( pType->n==7 && sqlite3StrNICmp("virtual",pType->z,7)==0 ){ + /* no-op */ + }else if( pType->n==6 && sqlite3StrNICmp("stored",pType->z,6)==0 ){ + eType = COLFLAG_STORED; + }else{ + goto generated_error; + } + } + if( eType==COLFLAG_VIRTUAL ) pTab->nNVCol--; + pCol->colFlags |= eType; + assert( TF_HasVirtual==COLFLAG_VIRTUAL ); + assert( TF_HasStored==COLFLAG_STORED ); + pTab->tabFlags |= eType; + if( pCol->colFlags & COLFLAG_PRIMKEY ){ + makeColumnPartOfPrimaryKey(pParse, pCol); /* For the error message */ + } + pCol->pDflt = pExpr; + pExpr = 0; + goto generated_done; - return pColl; +generated_error: + sqlite3ErrorMsg(pParse, "error in generated column \"%s\"", + pCol->zName); +generated_done: + sqlite3ExprDelete(pParse->db, pExpr); +#else + /* Throw and error for the GENERATED ALWAYS AS clause if the + ** SQLITE_OMIT_GENERATED_COLUMNS compile-time option is used. */ + sqlite3ErrorMsg(pParse, "generated columns not supported"); + sqlite3ExprDelete(pParse->db, pExpr); +#endif } - /* ** Generate code that will increment the schema cookie. ** @@ -107279,10 +111002,51 @@ static void estimateIndexWidth(Index *pIdx){ pIdx->szIdxRow = sqlite3LogEst(wIndex*4); } -/* Return true if value x is found any of the first nCol entries of aiCol[] +/* Return true if column number x is any of the first nCol entries of aiCol[]. +** This is used to determine if the column number x appears in any of the +** first nCol entries of an index. */ static int hasColumn(const i16 *aiCol, int nCol, int x){ - while( nCol-- > 0 ) if( x==*(aiCol++) ) return 1; + while( nCol-- > 0 ){ + assert( aiCol[0]>=0 ); + if( x==*(aiCol++) ){ + return 1; + } + } + return 0; +} + +/* +** Return true if any of the first nKey entries of index pIdx exactly +** match the iCol-th entry of pPk. pPk is always a WITHOUT ROWID +** PRIMARY KEY index. pIdx is an index on the same table. pIdx may +** or may not be the same index as pPk. +** +** The first nKey entries of pIdx are guaranteed to be ordinary columns, +** not a rowid or expression. +** +** This routine differs from hasColumn() in that both the column and the +** collating sequence must match for this routine, but for hasColumn() only +** the column name must match. +*/ +static int isDupColumn(Index *pIdx, int nKey, Index *pPk, int iCol){ + int i, j; + assert( nKey<=pIdx->nColumn ); + assert( iColnColumn,pPk->nKeyCol) ); + assert( pPk->idxType==SQLITE_IDXTYPE_PRIMARYKEY ); + assert( pPk->pTable->tabFlags & TF_WithoutRowid ); + assert( pPk->pTable==pIdx->pTable ); + testcase( pPk==pIdx ); + j = pPk->aiColumn[iCol]; + assert( j!=XN_ROWID && j!=XN_EXPR ); + for(i=0; iaiColumn[i]>=0 || j>=0 ); + if( pIdx->aiColumn[i]==j + && sqlite3StrICmp(pIdx->azColl[i], pPk->azColl[iCol])==0 + ){ + return 1; + } + } return 0; } @@ -107293,15 +111057,24 @@ static int hasColumn(const i16 *aiCol, int nCol, int x){ ** high-order bit of colNotIdxed is always 1. All unindexed columns ** of the table have a 1. ** +** 2019-10-24: For the purpose of this computation, virtual columns are +** not considered to be covered by the index, even if they are in the +** index, because we do not trust the logic in whereIndexExprTrans() to be +** able to find all instances of a reference to the indexed table column +** and convert them into references to the index. Hence we always want +** the actual table at hand in order to recompute the virtual column, if +** necessary. +** ** The colNotIdxed mask is AND-ed with the SrcList.a[].colUsed mask ** to determine if the index is covering index. */ static void recomputeColumnsNotIndexed(Index *pIdx){ Bitmask m = 0; int j; + Table *pTab = pIdx->pTable; for(j=pIdx->nColumn-1; j>=0; j--){ int x = pIdx->aiColumn[j]; - if( x>=0 ){ + if( x>=0 && (pTab->aCol[x].colFlags & COLFLAG_VIRTUAL)==0 ){ testcase( x==BMS-1 ); testcase( x==BMS-2 ); if( xdb; Vdbe *v = pParse->pVdbe; @@ -107351,6 +111125,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ pTab->aCol[i].notNull = OE_Abort; } } + pTab->tabFlags |= TF_HasNotNull; } /* Convert the P3 operand of the OP_CreateBtree opcode from BTREE_INTKEY @@ -107371,15 +111146,20 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ pList = sqlite3ExprListAppend(pParse, 0, sqlite3ExprAlloc(db, TK_ID, &ipkToken, 0)); if( pList==0 ) return; - pList->a[0].sortOrder = pParse->iPkSortOrder; + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenRemap(pParse, pList->a[0].pExpr, &pTab->iPKey); + } + pList->a[0].sortFlags = pParse->iPkSortOrder; assert( pParse->pNewTable==pTab ); + pTab->iPKey = -1; sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0, SQLITE_IDXTYPE_PRIMARYKEY); if( db->mallocFailed || pParse->nErr ) return; pPk = sqlite3PrimaryKeyIndex(pTab); - pTab->iPKey = -1; + assert( pPk->nKeyCol==1 ); }else{ pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); /* ** Remove all redundant columns from the PRIMARY KEY. For example, change @@ -107387,9 +111167,12 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ ** code assumes the PRIMARY KEY contains no repeated columns. */ for(i=j=1; inKeyCol; i++){ - if( hasColumn(pPk->aiColumn, j, pPk->aiColumn[i]) ){ + if( isDupColumn(pPk, j, pPk, i) ){ pPk->nColumn--; }else{ + testcase( hasColumn(pPk->aiColumn, j, pPk->aiColumn[i]) ); + pPk->azColl[j] = pPk->azColl[i]; + pPk->aSortOrder[j] = pPk->aSortOrder[i]; pPk->aiColumn[j++] = pPk->aiColumn[i]; } } @@ -107398,7 +111181,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ assert( pPk!=0 ); pPk->isCovering = 1; if( !db->init.imposterTable ) pPk->uniqNotNull = 1; - nPk = pPk->nKeyCol; + nPk = pPk->nColumn = pPk->nKeyCol; /* Bypass the creation of the PRIMARY KEY btree and the sqlite_master ** table entry. This is only required if currently generating VDBE @@ -107419,7 +111202,10 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ int n; if( IsPrimaryKeyIndex(pIdx) ) continue; for(i=n=0; iaiColumn, pIdx->nKeyCol, pPk->aiColumn[i]) ) n++; + if( !isDupColumn(pIdx, pIdx->nKeyCol, pPk, i) ){ + testcase( hasColumn(pIdx->aiColumn, pIdx->nKeyCol, pPk->aiColumn[i]) ); + n++; + } } if( n==0 ){ /* This index is a superset of the primary key */ @@ -107428,9 +111214,14 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ } if( resizeIndexObject(db, pIdx, pIdx->nKeyCol+n) ) return; for(i=0, j=pIdx->nKeyCol; iaiColumn, pIdx->nKeyCol, pPk->aiColumn[i]) ){ + if( !isDupColumn(pIdx, pIdx->nKeyCol, pPk, i) ){ + testcase( hasColumn(pIdx->aiColumn, pIdx->nKeyCol, pPk->aiColumn[i]) ); pIdx->aiColumn[j] = pPk->aiColumn[i]; pIdx->azColl[j] = pPk->azColl[i]; + if( pPk->aSortOrder[i] ){ + /* See ticket https://www.sqlite.org/src/info/bba7b69f9849b5bf */ + pIdx->bAscKeyBug = 1; + } j++; } } @@ -107440,24 +111231,55 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ /* Add all table columns to the PRIMARY KEY index */ - if( nPknCol ){ - if( resizeIndexObject(db, pPk, pTab->nCol) ) return; - for(i=0, j=nPk; inCol; i++){ - if( !hasColumn(pPk->aiColumn, j, i) ){ - assert( jnColumn ); - pPk->aiColumn[j] = i; - pPk->azColl[j] = sqlite3StrBINARY; - j++; - } + nExtra = 0; + for(i=0; inCol; i++){ + if( !hasColumn(pPk->aiColumn, nPk, i) + && (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ) nExtra++; + } + if( resizeIndexObject(db, pPk, nPk+nExtra) ) return; + for(i=0, j=nPk; inCol; i++){ + if( !hasColumn(pPk->aiColumn, j, i) + && (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 + ){ + assert( jnColumn ); + pPk->aiColumn[j] = i; + pPk->azColl[j] = sqlite3StrBINARY; + j++; } - assert( pPk->nColumn==j ); - assert( pTab->nCol==j ); - }else{ - pPk->nColumn = pTab->nCol; } + assert( pPk->nColumn==j ); + assert( pTab->nNVCol<=j ); recomputeColumnsNotIndexed(pPk); } +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Return true if zName is a shadow table name in the current database +** connection. +** +** zName is temporarily modified while this routine is running, but is +** restored to its original value prior to this routine returning. +*/ +SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName){ + char *zTail; /* Pointer to the last "_" in zName */ + Table *pTab; /* Table that zName is a shadow of */ + Module *pMod; /* Module for the virtual table */ + + zTail = strrchr(zName, '_'); + if( zTail==0 ) return 0; + *zTail = 0; + pTab = sqlite3FindTable(db, zName, 0); + *zTail = '_'; + if( pTab==0 ) return 0; + if( !IsVirtual(pTab) ) return 0; + pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->azModuleArg[0]); + if( pMod==0 ) return 0; + if( pMod->pModule->iVersion<3 ) return 0; + if( pMod->pModule->xShadowName==0 ) return 0; + return pMod->pModule->xShadowName(zTail+1); +} +#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ + /* ** This routine is called to report the final ")" that terminates ** a CREATE TABLE statement. @@ -107497,6 +111319,10 @@ SQLITE_PRIVATE void sqlite3EndTable( p = pParse->pNewTable; if( p==0 ) return; + if( pSelect==0 && sqlite3ShadowTableName(db, p->zName) ){ + p->tabFlags |= TF_Shadow; + } + /* If the db->init.busy is 1 it means we are reading the SQL off the ** "sqlite_master" or "sqlite_temp_master" table on the disk. ** So do not write to the disk again. Extract the root page number @@ -107515,6 +111341,11 @@ SQLITE_PRIVATE void sqlite3EndTable( if( p->tnum==1 ) p->tabFlags |= TF_Readonly; } + assert( (p->tabFlags & TF_HasPrimaryKey)==0 + || p->iPKey>=0 || sqlite3PrimaryKeyIndex(p)!=0 ); + assert( (p->tabFlags & TF_HasPrimaryKey)!=0 + || (p->iPKey<0 && sqlite3PrimaryKeyIndex(p)==0) ); + /* Special processing for WITHOUT ROWID Tables */ if( tabOpts & TF_WithoutRowid ){ if( (p->tabFlags & TF_Autoincrement) ){ @@ -107524,12 +111355,11 @@ SQLITE_PRIVATE void sqlite3EndTable( } if( (p->tabFlags & TF_HasPrimaryKey)==0 ){ sqlite3ErrorMsg(pParse, "PRIMARY KEY missing on table %s", p->zName); - }else{ - p->tabFlags |= TF_WithoutRowid | TF_NoVisibleRowid; - convertToWithoutRowidTable(pParse, p); + return; } + p->tabFlags |= TF_WithoutRowid | TF_NoVisibleRowid; + convertToWithoutRowidTable(pParse, p); } - iDb = sqlite3SchemaToIndex(db, p->pSchema); #ifndef SQLITE_OMIT_CHECK @@ -107537,8 +111367,45 @@ SQLITE_PRIVATE void sqlite3EndTable( */ if( p->pCheck ){ sqlite3ResolveSelfReference(pParse, p, NC_IsCheck, 0, p->pCheck); + if( pParse->nErr ){ + /* If errors are seen, delete the CHECK constraints now, else they might + ** actually be used if PRAGMA writable_schema=ON is set. */ + sqlite3ExprListDelete(db, p->pCheck); + p->pCheck = 0; + } } #endif /* !defined(SQLITE_OMIT_CHECK) */ +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( p->tabFlags & TF_HasGenerated ){ + int ii, nNG = 0; + testcase( p->tabFlags & TF_HasVirtual ); + testcase( p->tabFlags & TF_HasStored ); + for(ii=0; iinCol; ii++){ + u32 colFlags = p->aCol[ii].colFlags; + if( (colFlags & COLFLAG_GENERATED)!=0 ){ + Expr *pX = p->aCol[ii].pDflt; + testcase( colFlags & COLFLAG_VIRTUAL ); + testcase( colFlags & COLFLAG_STORED ); + if( sqlite3ResolveSelfReference(pParse, p, NC_GenCol, pX, 0) ){ + /* If there are errors in resolving the expression, change the + ** expression to a NULL. This prevents code generators that operate + ** on the expression from inserting extra parts into the expression + ** tree that have been allocated from lookaside memory, which is + ** illegal in a schema and will lead to errors or heap corruption + ** when the database connection closes. */ + sqlite3ExprDelete(db, pX); + p->aCol[ii].pDflt = sqlite3ExprAlloc(db, TK_NULL, 0, 0); + } + }else{ + nNG++; + } + } + if( nNG==0 ){ + sqlite3ErrorMsg(pParse, "must have at least one non-generated column"); + return; + } + } +#endif /* Estimate the average row size for the table and for all implied indices */ estimateTableWidth(p); @@ -107612,10 +111479,10 @@ SQLITE_PRIVATE void sqlite3EndTable( addrTop = sqlite3VdbeCurrentAddr(v) + 1; sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop); if( pParse->nErr ) return; - pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect); + pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect, SQLITE_AFF_BLOB); if( pSelTab==0 ) return; assert( p->aCol==0 ); - p->nCol = pSelTab->nCol; + p->nCol = p->nNVCol = pSelTab->nCol; p->aCol = pSelTab->aCol; pSelTab->nCol = 0; pSelTab->aCol = 0; @@ -107688,7 +111555,6 @@ SQLITE_PRIVATE void sqlite3EndTable( sqlite3MPrintf(db, "tbl_name='%q' AND type!='trigger'", p->zName)); } - /* Add the table to the in-memory representation of the database. */ if( db->init.busy ){ @@ -107759,6 +111625,7 @@ SQLITE_PRIVATE void sqlite3CreateView( ** allocated rather than point to the input string - which means that ** they will persist after the current sqlite3_exec() call returns. */ + pSelect->selFlags |= SF_View; if( IN_RENAME_OBJECT ){ p->pSelect = pSelect; pSelect = 0; @@ -107872,17 +111739,20 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ n = pParse->nTab; sqlite3SrcListAssignCursors(pParse, pSel->pSrc); pTable->nCol = -1; - db->lookaside.bDisable++; + DisableLookaside; #ifndef SQLITE_OMIT_AUTHORIZATION xAuth = db->xAuth; db->xAuth = 0; - pSelTab = sqlite3ResultSetOfSelect(pParse, pSel); + pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, SQLITE_AFF_NONE); db->xAuth = xAuth; #else - pSelTab = sqlite3ResultSetOfSelect(pParse, pSel); + pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, SQLITE_AFF_NONE); #endif pParse->nTab = n; - if( pTable->pCheck ){ + if( pSelTab==0 ){ + pTable->nCol = 0; + nErr++; + }else if( pTable->pCheck ){ /* CREATE VIEW name(arglist) AS ... ** The names of the columns in the table are taken from ** arglist which is stored in pTable->pCheck. The pCheck field @@ -107895,9 +111765,10 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ && pParse->nErr==0 && pTable->nCol==pSel->pEList->nExpr ){ - sqlite3SelectAddColumnTypeAndCollation(pParse, pTable, pSel); + sqlite3SelectAddColumnTypeAndCollation(pParse, pTable, pSel, + SQLITE_AFF_NONE); } - }else if( pSelTab ){ + }else{ /* CREATE VIEW name AS... without an argument list. Construct ** the column names from the SELECT statement that defines the view. */ @@ -107907,13 +111778,11 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ pSelTab->nCol = 0; pSelTab->aCol = 0; assert( sqlite3SchemaMutexHeld(db, 0, pTable->pSchema) ); - }else{ - pTable->nCol = 0; - nErr++; } + pTable->nNVCol = pTable->nCol; sqlite3DeleteTable(db, pSelTab); sqlite3SelectDelete(db, pSel); - db->lookaside.bDisable--; + EnableLookaside; #ifndef SQLITE_OMIT_ALTERTABLE pParse->eParseMode = eParseMode; #endif @@ -108004,7 +111873,7 @@ SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3 *db, int iDb, int iFrom, int iT static void destroyRootPage(Parse *pParse, int iTable, int iDb){ Vdbe *v = sqlite3GetVdbe(pParse); int r1 = sqlite3GetTempReg(pParse); - assert( iTable>1 ); + if( iTable<2 ) sqlite3ErrorMsg(pParse, "corrupt schema"); sqlite3VdbeAddOp3(v, OP_Destroy, iTable, r1, iDb); sqlite3MayAbort(pParse); #ifndef SQLITE_OMIT_AUTOVACUUM @@ -108163,12 +112032,44 @@ SQLITE_PRIVATE void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, in */ if( IsVirtual(pTab) ){ sqlite3VdbeAddOp4(v, OP_VDestroy, iDb, 0, 0, pTab->zName, 0); + sqlite3MayAbort(pParse); } sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0); sqlite3ChangeCookie(pParse, iDb); sqliteViewResetAll(db, iDb); } +/* +** Return TRUE if shadow tables should be read-only in the current +** context. +*/ +SQLITE_PRIVATE int sqlite3ReadOnlyShadowTables(sqlite3 *db){ +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( (db->flags & SQLITE_Defensive)!=0 + && db->pVtabCtx==0 + && db->nVdbeExec==0 + ){ + return 1; + } +#endif + return 0; +} + +/* +** Return true if it is not allowed to drop the given table +*/ +static int tableMayNotBeDropped(sqlite3 *db, Table *pTab){ + if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 ){ + if( sqlite3StrNICmp(pTab->zName+7, "stat", 4)==0 ) return 0; + if( sqlite3StrNICmp(pTab->zName+7, "parameters", 10)==0 ) return 0; + return 1; + } + if( (pTab->tabFlags & TF_Shadow)!=0 && sqlite3ReadOnlyShadowTables(db) ){ + return 1; + } + return 0; +} + /* ** This routine is called to do the work of a DROP TABLE statement. ** pName is the name of the table to be dropped. @@ -108238,8 +112139,7 @@ SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, } } #endif - if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 - && sqlite3StrNICmp(pTab->zName, "sqlite_stat", 11)!=0 ){ + if( tableMayNotBeDropped(db, pTab) ){ sqlite3ErrorMsg(pParse, "table %s may not be dropped", pTab->zName); goto exit_drop_table; } @@ -108331,7 +112231,7 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey( nByte = sizeof(*pFKey) + (nCol-1)*sizeof(pFKey->aCol[0]) + pTo->n + 1; if( pToCol ){ for(i=0; inExpr; i++){ - nByte += sqlite3Strlen30(pToCol->a[i].zName) + 1; + nByte += sqlite3Strlen30(pToCol->a[i].zEName) + 1; } } pFKey = sqlite3DbMallocZero(db, nByte ); @@ -108356,7 +112256,7 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey( for(i=0; inCol; j++){ - if( sqlite3StrICmp(p->aCol[j].zName, pFromCol->a[i].zName)==0 ){ + if( sqlite3StrICmp(p->aCol[j].zName, pFromCol->a[i].zEName)==0 ){ pFKey->aCol[i].iFrom = j; break; } @@ -108364,22 +112264,22 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey( if( j>=p->nCol ){ sqlite3ErrorMsg(pParse, "unknown column \"%s\" in foreign key definition", - pFromCol->a[i].zName); + pFromCol->a[i].zEName); goto fk_end; } if( IN_RENAME_OBJECT ){ - sqlite3RenameTokenRemap(pParse, &pFKey->aCol[i], pFromCol->a[i].zName); + sqlite3RenameTokenRemap(pParse, &pFKey->aCol[i], pFromCol->a[i].zEName); } } } if( pToCol ){ for(i=0; ia[i].zName); + int n = sqlite3Strlen30(pToCol->a[i].zEName); pFKey->aCol[i].zCol = z; if( IN_RENAME_OBJECT ){ - sqlite3RenameTokenRemap(pParse, z, pToCol->a[i].zName); + sqlite3RenameTokenRemap(pParse, z, pToCol->a[i].zEName); } - memcpy(z, pToCol->a[i].zName, n); + memcpy(z, pToCol->a[i].zEName, n); z[n] = 0; z += n+1; } @@ -108509,10 +112409,27 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ sqlite3UniqueConstraint(pParse, OE_Abort, pIndex); sqlite3VdbeJumpHere(v, j2); }else{ + /* Most CREATE INDEX and REINDEX statements that are not UNIQUE can not + ** abort. The exception is if one of the indexed expressions contains a + ** user function that throws an exception when it is evaluated. But the + ** overhead of adding a statement journal to a CREATE INDEX statement is + ** very small (since most of the pages written do not contain content that + ** needs to be restored if the statement aborts), so we call + ** sqlite3MayAbort() for all CREATE INDEX statements. */ + sqlite3MayAbort(pParse); addr2 = sqlite3VdbeCurrentAddr(v); } sqlite3VdbeAddOp3(v, OP_SorterData, iSorter, regRecord, iIdx); - sqlite3VdbeAddOp1(v, OP_SeekEnd, iIdx); + if( !pIndex->bAscKeyBug ){ + /* This OP_SeekEnd opcode makes index insert for a REINDEX go much + ** faster by avoiding unnecessary seeks. But the optimization does + ** not work for UNIQUE constraint indexes on WITHOUT ROWID tables + ** with DESC primary keys, since those indexes have there keys in + ** a different order from the main table. + ** See ticket: https://www.sqlite.org/src/info/bba7b69f9849b5bf + */ + sqlite3VdbeAddOp1(v, OP_SeekEnd, iIdx); + } sqlite3VdbeAddOp2(v, OP_IdxInsert, iIdx, regRecord); sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); sqlite3ReleaseTempReg(pParse, regRecord); @@ -108559,6 +112476,27 @@ SQLITE_PRIVATE Index *sqlite3AllocateIndexObject( return p; } +/* +** If expression list pList contains an expression that was parsed with +** an explicit "NULLS FIRST" or "NULLS LAST" clause, leave an error in +** pParse and return non-zero. Otherwise, return zero. +*/ +SQLITE_PRIVATE int sqlite3HasExplicitNulls(Parse *pParse, ExprList *pList){ + if( pList ){ + int i; + for(i=0; inExpr; i++){ + if( pList->a[i].bNulls ){ + u8 sf = pList->a[i].sortFlags; + sqlite3ErrorMsg(pParse, "unsupported use of NULLS %s", + (sf==0 || sf==3) ? "FIRST" : "LAST" + ); + return 1; + } + } + } + return 0; +} + /* ** Create a new index for an SQL table. pName1.pName2 is the name of the index ** and pTblList is the name of the table that is to be indexed. Both will @@ -108610,6 +112548,9 @@ SQLITE_PRIVATE void sqlite3CreateIndex( if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ goto exit_create_index; } + if( sqlite3HasExplicitNulls(pParse, pList) ){ + goto exit_create_index; + } /* ** Find the table that is to be indexed. Return early if not found. @@ -108667,13 +112608,13 @@ SQLITE_PRIVATE void sqlite3CreateIndex( assert( pParse->nErr==0 ); if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 && db->init.busy==0 + && pTblName!=0 #if SQLITE_USER_AUTHENTICATION && sqlite3UserAuthTable(pTab->zName)==0 #endif #ifdef SQLITE_ALLOW_SQLITE_MASTER_INDEX && sqlite3StrICmp(&pTab->zName[7],"master")!=0 #endif - && sqlite3StrNICmp(&pTab->zName[7],"altertab_",9)!=0 ){ sqlite3ErrorMsg(pParse, "table %s may not be indexed", pTab->zName); goto exit_create_index; @@ -108708,7 +112649,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( zName = sqlite3NameFromToken(db, pName); if( zName==0 ) goto exit_create_index; assert( pName->z!=0 ); - if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ + if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName,"index",pTab->zName) ){ goto exit_create_index; } if( !IN_RENAME_OBJECT ){ @@ -108774,9 +112715,10 @@ SQLITE_PRIVATE void sqlite3CreateIndex( sqlite3ExprAlloc(db, TK_ID, &prevCol, 0)); if( pList==0 ) goto exit_create_index; assert( pList->nExpr==1 ); - sqlite3ExprListSetSortOrder(pList, sortOrder); + sqlite3ExprListSetSortOrder(pList, sortOrder, SQLITE_SO_UNDEFINED); }else{ sqlite3ExprListCheckLength(pParse, pList, "index"); + if( pParse->nErr ) goto exit_create_index; } /* Figure out how many bytes of space are required to store explicitly @@ -108795,6 +112737,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( */ nName = sqlite3Strlen30(zName); nExtraCol = pPk ? pPk->nKeyCol : 1; + assert( pList->nExpr + nExtraCol <= 32767 /* Fits in i16 */ ); pIndex = sqlite3AllocateIndexObject(db, pList->nExpr + nExtraCol, nName + nExtra + 1, &zExtra); if( db->mallocFailed ){ @@ -108867,8 +112810,13 @@ SQLITE_PRIVATE void sqlite3CreateIndex( assert( j<=0x7fff ); if( j<0 ){ j = pTab->iPKey; - }else if( pTab->aCol[j].notNull==0 ){ - pIndex->uniqNotNull = 0; + }else{ + if( pTab->aCol[j].notNull==0 ){ + pIndex->uniqNotNull = 0; + } + if( pTab->aCol[j].colFlags & COLFLAG_VIRTUAL ){ + pIndex->bHasVCol = 1; + } } pIndex->aiColumn[i] = (i16)j; } @@ -108890,7 +112838,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( goto exit_create_index; } pIndex->azColl[i] = zColl; - requestedSortOrder = pListItem->sortOrder & sortOrderMask; + requestedSortOrder = pListItem->sortFlags & sortOrderMask; pIndex->aSortOrder[i] = (u8)requestedSortOrder; } @@ -108902,9 +112850,10 @@ SQLITE_PRIVATE void sqlite3CreateIndex( for(j=0; jnKeyCol; j++){ int x = pPk->aiColumn[j]; assert( x>=0 ); - if( hasColumn(pIndex->aiColumn, pIndex->nKeyCol, x) ){ + if( isDupColumn(pIndex, pIndex->nKeyCol, pPk, j) ){ pIndex->nColumn--; }else{ + testcase( hasColumn(pIndex->aiColumn,pIndex->nKeyCol,x) ); pIndex->aiColumn[i] = x; pIndex->azColl[i] = pPk->azColl[j]; pIndex->aSortOrder[i] = pPk->aSortOrder[j]; @@ -108922,13 +112871,13 @@ SQLITE_PRIVATE void sqlite3CreateIndex( /* If this index contains every column of its table, then mark ** it as a covering index */ assert( HasRowid(pTab) - || pTab->iPKey<0 || sqlite3ColumnOfIndex(pIndex, pTab->iPKey)>=0 ); + || pTab->iPKey<0 || sqlite3TableColumnToIndex(pIndex, pTab->iPKey)>=0 ); recomputeColumnsNotIndexed(pIndex); if( pTblName!=0 && pIndex->nColumn>=pTab->nCol ){ pIndex->isCovering = 1; for(j=0; jnCol; j++){ if( j==pTab->iPKey ) continue; - if( sqlite3ColumnOfIndex(pIndex,j)>=0 ) continue; + if( sqlite3TableColumnToIndex(pIndex,j)>=0 ) continue; pIndex->isCovering = 0; break; } @@ -108991,6 +112940,11 @@ SQLITE_PRIVATE void sqlite3CreateIndex( } } if( idxType==SQLITE_IDXTYPE_PRIMARYKEY ) pIdx->idxType = idxType; + if( IN_RENAME_OBJECT ){ + pIndex->pNext = pParse->pNewIndex; + pParse->pNewIndex = pIndex; + pIndex = 0; + } goto exit_create_index; } } @@ -109006,6 +112960,14 @@ SQLITE_PRIVATE void sqlite3CreateIndex( Index *p; assert( !IN_SPECIAL_PARSE ); assert( sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) ); + if( pTblName!=0 ){ + pIndex->tnum = db->init.newTnum; + if( sqlite3IndexHasDuplicateRootPage(pIndex) ){ + sqlite3ErrorMsg(pParse, "invalid rootpage"); + pParse->rc = SQLITE_CORRUPT_BKPT; + goto exit_create_index; + } + } p = sqlite3HashInsert(&pIndex->pSchema->idxHash, pIndex->zName, pIndex); if( p ){ @@ -109014,9 +112976,6 @@ SQLITE_PRIVATE void sqlite3CreateIndex( goto exit_create_index; } db->mDbFlags |= DBFLAG_SchemaChange; - if( pTblName!=0 ){ - pIndex->tnum = db->init.newTnum; - } } /* If this is the initial CREATE INDEX statement (or CREATE TABLE if the @@ -109054,6 +113013,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( /* Gather the complete text of the CREATE INDEX statement into ** the zStmt variable */ + assert( pName!=0 || pStart==0 ); if( pStart ){ int n = (int)(pParse->sLastToken.z - pName->z) + pParse->sLastToken.n; if( pName->z[n-1]==';' ) n--; @@ -109092,26 +113052,9 @@ SQLITE_PRIVATE void sqlite3CreateIndex( sqlite3VdbeJumpHere(v, pIndex->tnum); } } - - /* When adding an index to the list of indices for a table, make - ** sure all indices labeled OE_Replace come after all those labeled - ** OE_Ignore. This is necessary for the correct constraint check - ** processing (in sqlite3GenerateConstraintChecks()) as part of - ** UPDATE and INSERT statements. - */ if( db->init.busy || pTblName==0 ){ - if( onError!=OE_Replace || pTab->pIndex==0 - || pTab->pIndex->onError==OE_Replace){ - pIndex->pNext = pTab->pIndex; - pTab->pIndex = pIndex; - }else{ - Index *pOther = pTab->pIndex; - while( pOther->pNext && pOther->pNext->onError!=OE_Replace ){ - pOther = pOther->pNext; - } - pIndex->pNext = pOther->pNext; - pOther->pNext = pIndex; - } + pIndex->pNext = pTab->pIndex; + pTab->pIndex = pIndex; pIndex = 0; } else if( IN_RENAME_OBJECT ){ @@ -109123,6 +113066,21 @@ SQLITE_PRIVATE void sqlite3CreateIndex( /* Clean up before exiting */ exit_create_index: if( pIndex ) sqlite3FreeIndex(db, pIndex); + if( pTab ){ /* Ensure all REPLACE indexes are at the end of the list */ + Index **ppFrom = &pTab->pIndex; + Index *pThis; + for(ppFrom=&pTab->pIndex; (pThis = *ppFrom)!=0; ppFrom=&pThis->pNext){ + Index *pNext; + if( pThis->onError!=OE_Replace ) continue; + while( (pNext = pThis->pNext)!=0 && pNext->onError!=OE_Replace ){ + *ppFrom = pNext; + pThis->pNext = pNext->pNext; + pNext->pNext = pThis; + ppFrom = &pNext->pNext; + } + break; + } + } sqlite3ExprDelete(db, pPIWhere); sqlite3ExprListDelete(db, pList); sqlite3SrcListDelete(db, pTblName); @@ -109268,9 +113226,9 @@ SQLITE_PRIVATE void *sqlite3ArrayAllocate( int *pIdx /* Write the index of a new slot here */ ){ char *z; - int n = *pnEntry; + sqlite3_int64 n = *pIdx = *pnEntry; if( (n & (n-1))==0 ){ - int sz = (n==0) ? 1 : 2*n; + sqlite3_int64 sz = (n==0) ? 1 : 2*n; void *pNew = sqlite3DbRealloc(db, pArray, sz*szEntry); if( pNew==0 ){ *pIdx = -1; @@ -109280,7 +113238,6 @@ SQLITE_PRIVATE void *sqlite3ArrayAllocate( } z = (char*)pArray; memset(&z[n * szEntry], 0, szEntry); - *pIdx = n; ++*pnEntry; return pArray; } @@ -109342,6 +113299,18 @@ SQLITE_PRIVATE int sqlite3IdListIndex(IdList *pList, const char *zName){ return -1; } +/* +** Maximum size of a SrcList object. +** The SrcList object is used to represent the FROM clause of a +** SELECT statement, and the query planner cannot deal with more +** than 64 tables in a join. So any value larger than 64 here +** is sufficient for most uses. Smaller values, like say 10, are +** appropriate for small and memory-limited applications. +*/ +#ifndef SQLITE_MAX_SRCLIST +# define SQLITE_MAX_SRCLIST 200 +#endif + /* ** Expand the space allocated for the given SrcList object by ** creating nExtra new slots beginning at iStart. iStart is zero based. @@ -109358,11 +113327,12 @@ SQLITE_PRIVATE int sqlite3IdListIndex(IdList *pList, const char *zName){ ** the iStart value would be 0. The result then would ** be: nil, nil, nil, A, B. ** -** If a memory allocation fails the SrcList is unchanged. The -** db->mallocFailed flag will be set to true. +** If a memory allocation fails or the SrcList becomes too large, leave +** the original SrcList unchanged, return NULL, and leave an error message +** in pParse. */ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( - sqlite3 *db, /* Database connection to notify of OOM errors */ + Parse *pParse, /* Parsing context into which errors are reported */ SrcList *pSrc, /* The SrcList to be enlarged */ int nExtra, /* Number of new slots to add to pSrc->a[] */ int iStart /* Index in pSrc->a[] of first new slot */ @@ -109378,17 +113348,23 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( /* Allocate additional space if needed */ if( (u32)pSrc->nSrc+nExtra>pSrc->nAlloc ){ SrcList *pNew; - int nAlloc = pSrc->nSrc*2+nExtra; - int nGot; + sqlite3_int64 nAlloc = 2*(sqlite3_int64)pSrc->nSrc+nExtra; + sqlite3 *db = pParse->db; + + if( pSrc->nSrc+nExtra>=SQLITE_MAX_SRCLIST ){ + sqlite3ErrorMsg(pParse, "too many FROM clause terms, max: %d", + SQLITE_MAX_SRCLIST); + return 0; + } + if( nAlloc>SQLITE_MAX_SRCLIST ) nAlloc = SQLITE_MAX_SRCLIST; pNew = sqlite3DbRealloc(db, pSrc, sizeof(*pSrc) + (nAlloc-1)*sizeof(pSrc->a[0]) ); if( pNew==0 ){ assert( db->mallocFailed ); - return pSrc; + return 0; } pSrc = pNew; - nGot = (sqlite3DbMallocSize(db, pNew) - sizeof(*pSrc))/sizeof(pSrc->a[0])+1; - pSrc->nAlloc = nGot; + pSrc->nAlloc = nAlloc; } /* Move existing slots that come after the newly inserted slots @@ -109413,7 +113389,8 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( ** Append a new table name to the given SrcList. Create a new SrcList if ** need be. A new entry is created in the SrcList even if pTable is NULL. ** -** A SrcList is returned, or NULL if there is an OOM error. The returned +** A SrcList is returned, or NULL if there is an OOM error or if the +** SrcList grows to large. The returned ** SrcList might be the same as the SrcList that was input or it might be ** a new one. If an OOM error does occurs, then the prior value of pList ** that is input to this routine is automatically freed. @@ -109444,27 +113421,32 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( ** before being added to the SrcList. */ SQLITE_PRIVATE SrcList *sqlite3SrcListAppend( - sqlite3 *db, /* Connection to notify of malloc failures */ + Parse *pParse, /* Parsing context, in which errors are reported */ SrcList *pList, /* Append to this SrcList. NULL creates a new SrcList */ Token *pTable, /* Table to append */ Token *pDatabase /* Database of the table */ ){ struct SrcList_item *pItem; + sqlite3 *db; assert( pDatabase==0 || pTable!=0 ); /* Cannot have C without B */ - assert( db!=0 ); + assert( pParse!=0 ); + assert( pParse->db!=0 ); + db = pParse->db; if( pList==0 ){ - pList = sqlite3DbMallocRawNN(db, sizeof(SrcList) ); + pList = sqlite3DbMallocRawNN(pParse->db, sizeof(SrcList) ); if( pList==0 ) return 0; pList->nAlloc = 1; pList->nSrc = 1; memset(&pList->a[0], 0, sizeof(pList->a[0])); pList->a[0].iCursor = -1; }else{ - pList = sqlite3SrcListEnlarge(db, pList, 1, pList->nSrc); - } - if( db->mallocFailed ){ - sqlite3SrcListDelete(db, pList); - return 0; + SrcList *pNew = sqlite3SrcListEnlarge(pParse, pList, 1, pList->nSrc); + if( pNew==0 ){ + sqlite3SrcListDelete(db, pList); + return 0; + }else{ + pList = pNew; + } } pItem = &pList->a[pList->nSrc-1]; if( pDatabase && pDatabase->z==0 ){ @@ -109553,7 +113535,7 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm( ); goto append_from_error; } - p = sqlite3SrcListAppend(db, p, pTable, pDatabase); + p = sqlite3SrcListAppend(pParse, p, pTable, pDatabase); if( p==0 ){ goto append_from_error; } @@ -109873,7 +113855,8 @@ SQLITE_PRIVATE void sqlite3UniqueConstraint( StrAccum errMsg; Table *pTab = pIdx->pTable; - sqlite3StrAccumInit(&errMsg, pParse->db, 0, 0, 200); + sqlite3StrAccumInit(&errMsg, pParse->db, 0, 0, + pParse->db->aLimit[SQLITE_LIMIT_LENGTH]); if( pIdx->aColExpr ){ sqlite3_str_appendf(&errMsg, "index '%q'", pIdx->zName); }else{ @@ -109942,13 +113925,15 @@ static int collationMatch(const char *zColl, Index *pIndex){ */ #ifndef SQLITE_OMIT_REINDEX static void reindexTable(Parse *pParse, Table *pTab, char const *zColl){ - Index *pIndex; /* An index associated with pTab */ + if( !IsVirtual(pTab) ){ + Index *pIndex; /* An index associated with pTab */ - for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ - if( zColl==0 || collationMatch(zColl, pIndex) ){ - int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); - sqlite3BeginWriteOperation(pParse, 0, iDb); - sqlite3RefillIndex(pParse, pIndex, -1); + for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ + if( zColl==0 || collationMatch(zColl, pIndex) ){ + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3RefillIndex(pParse, pIndex, -1); + } } } } @@ -110069,7 +114054,8 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse *pParse, Index *pIdx){ const char *zColl = pIdx->azColl[i]; pKey->aColl[i] = zColl==sqlite3StrBINARY ? 0 : sqlite3LocateCollSeq(pParse, zColl); - pKey->aSortOrder[i] = pIdx->aSortOrder[i]; + pKey->aSortFlags[i] = pIdx->aSortOrder[i]; + assert( 0==(pKey->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) ); } if( pParse->nErr ){ assert( pParse->rc==SQLITE_ERROR_MISSING_COLLSEQ ); @@ -110120,7 +114106,7 @@ SQLITE_PRIVATE With *sqlite3WithAdd( } if( pWith ){ - int nByte = sizeof(*pWith) + (sizeof(pWith->a[1]) * pWith->nCte); + sqlite3_int64 nByte = sizeof(*pWith) + (sizeof(pWith->a[1]) * pWith->nCte); pNew = sqlite3DbRealloc(db, pWith, nByte); }else{ pNew = sqlite3DbMallocZero(db, sizeof(*pWith)); @@ -110229,51 +114215,6 @@ static int synthCollSeq(sqlite3 *db, CollSeq *pColl){ return SQLITE_ERROR; } -/* -** This function is responsible for invoking the collation factory callback -** or substituting a collation sequence of a different encoding when the -** requested collation sequence is not available in the desired encoding. -** -** If it is not NULL, then pColl must point to the database native encoding -** collation sequence with name zName, length nName. -** -** The return value is either the collation sequence to be used in database -** db for collation type name zName, length nName, or NULL, if no collation -** sequence can be found. If no collation is found, leave an error message. -** -** See also: sqlite3LocateCollSeq(), sqlite3FindCollSeq() -*/ -SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq( - Parse *pParse, /* Parsing context */ - u8 enc, /* The desired encoding for the collating sequence */ - CollSeq *pColl, /* Collating sequence with native encoding, or NULL */ - const char *zName /* Collating sequence name */ -){ - CollSeq *p; - sqlite3 *db = pParse->db; - - p = pColl; - if( !p ){ - p = sqlite3FindCollSeq(db, enc, zName, 0); - } - if( !p || !p->xCmp ){ - /* No collation sequence of this type for this encoding is registered. - ** Call the collation factory to see if it can supply us with one. - */ - callCollNeeded(db, enc, zName); - p = sqlite3FindCollSeq(db, enc, zName, 0); - } - if( p && !p->xCmp && synthCollSeq(db, p) ){ - p = 0; - } - assert( !p || p->xCmp ); - if( p==0 ){ - sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName); - pParse->rc = SQLITE_ERROR_MISSING_COLLSEQ; - } - return p; -} - /* ** This routine is called on a collation sequence before it is used to ** check that it is defined. An undefined collation sequence exists when @@ -110366,10 +114307,10 @@ static CollSeq *findCollSeqEntry( ** See also: sqlite3LocateCollSeq(), sqlite3GetCollSeq() */ SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq( - sqlite3 *db, - u8 enc, - const char *zName, - int create + sqlite3 *db, /* Database connection to search */ + u8 enc, /* Desired text encoding */ + const char *zName, /* Name of the collating sequence. Might be NULL */ + int create /* True to create CollSeq if doesn't already exist */ ){ CollSeq *pColl; if( zName ){ @@ -110383,6 +114324,85 @@ SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq( return pColl; } +/* +** This function is responsible for invoking the collation factory callback +** or substituting a collation sequence of a different encoding when the +** requested collation sequence is not available in the desired encoding. +** +** If it is not NULL, then pColl must point to the database native encoding +** collation sequence with name zName, length nName. +** +** The return value is either the collation sequence to be used in database +** db for collation type name zName, length nName, or NULL, if no collation +** sequence can be found. If no collation is found, leave an error message. +** +** See also: sqlite3LocateCollSeq(), sqlite3FindCollSeq() +*/ +SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq( + Parse *pParse, /* Parsing context */ + u8 enc, /* The desired encoding for the collating sequence */ + CollSeq *pColl, /* Collating sequence with native encoding, or NULL */ + const char *zName /* Collating sequence name */ +){ + CollSeq *p; + sqlite3 *db = pParse->db; + + p = pColl; + if( !p ){ + p = sqlite3FindCollSeq(db, enc, zName, 0); + } + if( !p || !p->xCmp ){ + /* No collation sequence of this type for this encoding is registered. + ** Call the collation factory to see if it can supply us with one. + */ + callCollNeeded(db, enc, zName); + p = sqlite3FindCollSeq(db, enc, zName, 0); + } + if( p && !p->xCmp && synthCollSeq(db, p) ){ + p = 0; + } + assert( !p || p->xCmp ); + if( p==0 ){ + sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName); + pParse->rc = SQLITE_ERROR_MISSING_COLLSEQ; + } + return p; +} + +/* +** This function returns the collation sequence for database native text +** encoding identified by the string zName. +** +** If the requested collation sequence is not available, or not available +** in the database native encoding, the collation factory is invoked to +** request it. If the collation factory does not supply such a sequence, +** and the sequence is available in another text encoding, then that is +** returned instead. +** +** If no versions of the requested collations sequence are available, or +** another error occurs, NULL is returned and an error message written into +** pParse. +** +** This routine is a wrapper around sqlite3FindCollSeq(). This routine +** invokes the collation factory if the named collation cannot be found +** and generates an error message. +** +** See also: sqlite3FindCollSeq(), sqlite3GetCollSeq() +*/ +SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName){ + sqlite3 *db = pParse->db; + u8 enc = ENC(db); + u8 initbusy = db->init.busy; + CollSeq *pColl; + + pColl = sqlite3FindCollSeq(db, enc, zName, initbusy); + if( !initbusy && (!pColl || !pColl->xCmp) ){ + pColl = sqlite3GetCollSeq(pParse, enc, pColl, zName); + } + + return pColl; +} + /* During the search for the best function definition, this procedure ** is called to test how well the function passed as the first argument ** matches the request for a function with nArg arguments in a system @@ -110418,12 +114438,13 @@ static int matchQuality( u8 enc /* Desired text encoding */ ){ int match; - - /* nArg of -2 is a special case */ - if( nArg==(-2) ) return (p->xSFunc==0) ? 0 : FUNC_PERFECT_MATCH; + assert( p->nArg>=-1 ); /* Wrong number of arguments means "no match" */ - if( p->nArg!=nArg && p->nArg>=0 ) return 0; + if( p->nArg!=nArg ){ + if( nArg==(-2) ) return (p->xSFunc==0) ? 0 : FUNC_PERFECT_MATCH; + if( p->nArg>=0 ) return 0; + } /* Give a better score to a function with a specific number of arguments ** than to function that accepts any number of arguments. */ @@ -110447,7 +114468,7 @@ static int matchQuality( ** Search a FuncDefHash for a function with the given name. Return ** a pointer to the matching FuncDef if found, or 0 if there is no match. */ -static FuncDef *functionSearch( +SQLITE_PRIVATE FuncDef *sqlite3FunctionSearch( int h, /* Hash of the name */ const char *zFunc /* Name of function */ ){ @@ -110472,9 +114493,9 @@ SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs( FuncDef *pOther; const char *zName = aDef[i].zName; int nName = sqlite3Strlen30(zName); - int h = (zName[0] + nName) % SQLITE_FUNC_HASH_SZ; + int h = SQLITE_FUNC_HASH(zName[0], nName); assert( zName[0]>='a' && zName[0]<='z' ); - pOther = functionSearch(h, zName); + pOther = sqlite3FunctionSearch(h, zName); if( pOther ){ assert( pOther!=&aDef[i] && pOther->pNext!=&aDef[i] ); aDef[i].pNext = pOther->pNext; @@ -110551,8 +114572,8 @@ SQLITE_PRIVATE FuncDef *sqlite3FindFunction( */ if( !createFlag && (pBest==0 || (db->mDbFlags & DBFLAG_PreferBuiltin)!=0) ){ bestScore = 0; - h = (sqlite3UpperToLower[(u8)zName[0]] + nName) % SQLITE_FUNC_HASH_SZ; - p = functionSearch(h, zName); + h = SQLITE_FUNC_HASH(sqlite3UpperToLower[(u8)zName[0]], nName); + p = sqlite3FunctionSearch(h, zName); while( p ){ int score = matchQuality(p, nArg, enc); if( score>bestScore ){ @@ -110699,32 +114720,45 @@ SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){ return pTab; } +/* Return true if table pTab is read-only. +** +** A table is read-only if any of the following are true: +** +** 1) It is a virtual table and no implementation of the xUpdate method +** has been provided +** +** 2) It is a system table (i.e. sqlite_master), this call is not +** part of a nested parse and writable_schema pragma has not +** been specified +** +** 3) The table is a shadow table, the database connection is in +** defensive mode, and the current sqlite3_prepare() +** is for a top-level SQL statement. +*/ +static int tabIsReadOnly(Parse *pParse, Table *pTab){ + sqlite3 *db; + if( IsVirtual(pTab) ){ + return sqlite3GetVTable(pParse->db, pTab)->pMod->pModule->xUpdate==0; + } + if( (pTab->tabFlags & (TF_Readonly|TF_Shadow))==0 ) return 0; + db = pParse->db; + if( (pTab->tabFlags & TF_Readonly)!=0 ){ + return sqlite3WritableSchema(db)==0 && pParse->nested==0; + } + assert( pTab->tabFlags & TF_Shadow ); + return sqlite3ReadOnlyShadowTables(db); +} + /* ** Check to make sure the given table is writable. If it is not ** writable, generate an error message and return 1. If it is ** writable return 0; */ SQLITE_PRIVATE int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){ - /* A table is not writable under the following circumstances: - ** - ** 1) It is a virtual table and no implementation of the xUpdate method - ** has been provided, or - ** 2) It is a system table (i.e. sqlite_master), this call is not - ** part of a nested parse and writable_schema pragma has not - ** been specified. - ** - ** In either case leave an error message in pParse and return non-zero. - */ - if( ( IsVirtual(pTab) - && sqlite3GetVTable(pParse->db, pTab)->pMod->pModule->xUpdate==0 ) - || ( (pTab->tabFlags & TF_Readonly)!=0 - && (pParse->db->flags & SQLITE_WriteSchema)==0 - && pParse->nested==0 ) - ){ + if( tabIsReadOnly(pParse, pTab) ){ sqlite3ErrorMsg(pParse, "table %s may not be modified", pTab->zName); return 1; } - #ifndef SQLITE_OMIT_VIEW if( !viewOk && pTab->pSelect ){ sqlite3ErrorMsg(pParse,"cannot modify %s because it is a view",pTab->zName); @@ -110755,7 +114789,7 @@ SQLITE_PRIVATE void sqlite3MaterializeView( sqlite3 *db = pParse->db; int iDb = sqlite3SchemaToIndex(db, pView->pSchema); pWhere = sqlite3ExprDup(db, pWhere, 0); - pFrom = sqlite3SrcListAppend(db, 0, 0, 0); + pFrom = sqlite3SrcListAppend(pParse, 0, 0, 0); if( pFrom ){ assert( pFrom->nSrc==1 ); pFrom->a[0].zName = sqlite3DbStrDup(db, pView->zName); @@ -111155,7 +115189,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( /* If this DELETE cannot use the ONEPASS strategy, this is the ** end of the WHERE loop */ if( eOnePass!=ONEPASS_OFF ){ - addrBypass = sqlite3VdbeMakeLabel(v); + addrBypass = sqlite3VdbeMakeLabel(pParse); }else{ sqlite3WhereEnd(pWInfo); } @@ -111344,7 +115378,7 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( /* Seek cursor iCur to the row to delete. If this row no longer exists ** (this can happen if a trigger program has already deleted it), do ** not attempt to delete it or fire any DELETE triggers. */ - iLabel = sqlite3VdbeMakeLabel(v); + iLabel = sqlite3VdbeMakeLabel(pParse); opSeek = HasRowid(pTab) ? OP_NotExists : OP_NotFound; if( eMode==ONEPASS_OFF ){ sqlite3VdbeAddOp4Int(v, opSeek, iDataCur, iLabel, iPk, nPk); @@ -111375,7 +115409,8 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( testcase( mask!=0xffffffff && iCol==31 ); testcase( mask!=0xffffffff && iCol==32 ); if( mask==0xffffffff || (iCol<=31 && (mask & MASKBIT32(iCol))!=0) ){ - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, iCol, iOld+iCol+1); + int kk = sqlite3TableColumnToStorage(pTab, iCol); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, iCol, iOld+kk+1); } } @@ -111550,11 +115585,13 @@ SQLITE_PRIVATE int sqlite3GenerateIndexKey( if( piPartIdxLabel ){ if( pIdx->pPartIdxWhere ){ - *piPartIdxLabel = sqlite3VdbeMakeLabel(v); + *piPartIdxLabel = sqlite3VdbeMakeLabel(pParse); pParse->iSelfTab = iDataCur + 1; sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, SQLITE_JUMPIFNULL); pParse->iSelfTab = 0; + pPrior = 0; /* Ticket a9efb42811fa41ee 2019-11-02; + ** pPartIdxWhere may have corrupted regPrior registers */ }else{ *piPartIdxLabel = 0; } @@ -111621,6 +115658,9 @@ SQLITE_PRIVATE void sqlite3ResolvePartIdxLabel(Parse *pParse, int iLabel){ /* #include "sqliteInt.h" */ /* #include */ /* #include */ +#ifndef SQLITE_OMIT_FLOATING_POINT +/* #include */ +#endif /* #include "vdbeInt.h" */ /* @@ -111806,6 +115846,9 @@ static void instrFunc( int typeHaystack, typeNeedle; int N = 1; int isText; + unsigned char firstChar; + sqlite3_value *pC1 = 0; + sqlite3_value *pC2 = 0; UNUSED_PARAMETER(argc); typeHaystack = sqlite3_value_type(argv[0]); @@ -111818,13 +115861,26 @@ static void instrFunc( zHaystack = sqlite3_value_blob(argv[0]); zNeedle = sqlite3_value_blob(argv[1]); isText = 0; - }else{ + }else if( typeHaystack!=SQLITE_BLOB && typeNeedle!=SQLITE_BLOB ){ zHaystack = sqlite3_value_text(argv[0]); zNeedle = sqlite3_value_text(argv[1]); isText = 1; + }else{ + pC1 = sqlite3_value_dup(argv[0]); + zHaystack = sqlite3_value_text(pC1); + if( zHaystack==0 ) goto endInstrOOM; + nHaystack = sqlite3_value_bytes(pC1); + pC2 = sqlite3_value_dup(argv[1]); + zNeedle = sqlite3_value_text(pC2); + if( zNeedle==0 ) goto endInstrOOM; + nNeedle = sqlite3_value_bytes(pC2); + isText = 1; } - if( zNeedle==0 || (nHaystack && zHaystack==0) ) return; - while( nNeedle<=nHaystack && memcmp(zHaystack, zNeedle, nNeedle)!=0 ){ + if( zNeedle==0 || (nHaystack && zHaystack==0) ) goto endInstrOOM; + firstChar = zNeedle[0]; + while( nNeedle<=nHaystack + && (zHaystack[0]!=firstChar || memcmp(zHaystack, zNeedle, nNeedle)!=0) + ){ N++; do{ nHaystack--; @@ -111834,6 +115890,13 @@ static void instrFunc( if( nNeedle>nHaystack ) N = 0; } sqlite3_result_int(context, N); +endInstr: + sqlite3_value_free(pC1); + sqlite3_value_free(pC2); + return; +endInstrOOM: + sqlite3_result_error_nomem(context); + goto endInstr; } /* @@ -111987,10 +116050,10 @@ static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ ** handle the rounding directly, ** otherwise use printf. */ - if( n==0 && r>=0 && r+4503599627370496.0 ){ + /* The value has no fractional part so there is nothing to round */ + }else if( n==0 ){ + r = (double)((sqlite_int64)(r+(r<0?-0.5:+0.5))); }else{ zBuf = sqlite3_mprintf("%.*f",n,r); if( zBuf==0 ){ @@ -112115,11 +116178,11 @@ static void randomBlob( int argc, sqlite3_value **argv ){ - int n; + sqlite3_int64 n; unsigned char *p; assert( argc==1 ); UNUSED_PARAMETER(argc); - n = sqlite3_value_int(argv[0]); + n = sqlite3_value_int64(argv[0]); if( n<1 ){ n = 1; } @@ -112444,8 +116507,6 @@ static void likeFunc( return; } #endif - zB = sqlite3_value_text(argv[0]); - zA = sqlite3_value_text(argv[1]); /* Limit the length of the LIKE or GLOB pattern to avoid problems ** of deep recursion and N*N behavior in patternCompare(). @@ -112457,8 +116518,6 @@ static void likeFunc( sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1); return; } - assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */ - if( argc==3 ){ /* The escape character string must consist of a single UTF-8 character. ** Otherwise, return an error. @@ -112474,6 +116533,8 @@ static void likeFunc( }else{ escape = pInfo->matchSet; } + zB = sqlite3_value_text(argv[0]); + zA = sqlite3_value_text(argv[1]); if( zA && zB ){ #ifdef SQLITE_TEST sqlite3_like_count++; @@ -113399,35 +117460,24 @@ SQLITE_PRIVATE void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3 *db){ } /* -** Set the LIKEOPT flag on the 2-argument function with the given name. -*/ -static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){ - FuncDef *pDef; - pDef = sqlite3FindFunction(db, zName, 2, SQLITE_UTF8, 0); - if( ALWAYS(pDef) ){ - pDef->funcFlags |= flagVal; - } -} - -/* -** Register the built-in LIKE and GLOB functions. The caseSensitive +** Re-register the built-in LIKE functions. The caseSensitive ** parameter determines whether or not the LIKE operator is case -** sensitive. GLOB is always case sensitive. +** sensitive. */ SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){ struct compareInfo *pInfo; + int flags; if( caseSensitive ){ pInfo = (struct compareInfo*)&likeInfoAlt; + flags = SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE; }else{ pInfo = (struct compareInfo*)&likeInfoNorm; + flags = SQLITE_FUNC_LIKE; } sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0, 0, 0); sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0, 0, 0); - sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8, - (struct compareInfo*)&globInfo, likeFunc, 0, 0, 0, 0, 0); - setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE); - setLikeOptFlag(db, "like", - caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE); + sqlite3FindFunction(db, "like", 2, SQLITE_UTF8, 0)->funcFlags |= flags; + sqlite3FindFunction(db, "like", 3, SQLITE_UTF8, 0)->funcFlags |= flags; } /* @@ -113456,6 +117506,9 @@ SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocas assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); nExpr = pExpr->x.pList->nExpr; pDef = sqlite3FindFunction(db, pExpr->u.zToken, nExpr, SQLITE_UTF8, 0); +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + if( pDef==0 ) return 0; +#endif if( NEVER(pDef==0) || (pDef->funcFlags & SQLITE_FUNC_LIKE)==0 ){ return 0; } @@ -113501,12 +117554,20 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ ** For peak efficiency, put the most frequently used function last. */ static FuncDef aBuiltinFunc[] = { +/***** Functions only available with SQLITE_TESTCTRL_INTERNAL_FUNCTIONS *****/ + TEST_FUNC(implies_nonnull_row, 2, INLINEFUNC_implies_nonnull_row, 0), + TEST_FUNC(expr_compare, 2, INLINEFUNC_expr_compare, 0), + TEST_FUNC(expr_implies_expr, 2, INLINEFUNC_expr_implies_expr, 0), +#ifdef SQLITE_DEBUG + TEST_FUNC(affinity, 1, INLINEFUNC_affinity, 0), +#endif +/***** Regular functions *****/ #ifdef SQLITE_SOUNDEX FUNCTION(soundex, 1, 0, 0, soundexFunc ), #endif #ifndef SQLITE_OMIT_LOAD_EXTENSION - VFUNCTION(load_extension, 1, 0, 0, loadExt ), - VFUNCTION(load_extension, 2, 0, 0, loadExt ), + SFUNCTION(load_extension, 1, 0, 0, loadExt ), + SFUNCTION(load_extension, 2, 0, 0, loadExt ), #endif #if SQLITE_USER_AUTHENTICATION FUNCTION(sqlite_crypt, 2, 0, 0, sqlite3CryptFunc ), @@ -113515,12 +117576,9 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ DFUNCTION(sqlite_compileoption_used,1, 0, 0, compileoptionusedFunc ), DFUNCTION(sqlite_compileoption_get, 1, 0, 0, compileoptiongetFunc ), #endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ - FUNCTION2(unlikely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), - FUNCTION2(likelihood, 2, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), - FUNCTION2(likely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), -#ifdef SQLITE_DEBUG - FUNCTION2(affinity, 1, 0, 0, noopFunc, SQLITE_FUNC_AFFINITY), -#endif + INLINE_FUNC(unlikely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), + INLINE_FUNC(likelihood, 2, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), + INLINE_FUNC(likely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC FUNCTION2(sqlite_offset, 1, 0, 0, noopFunc, SQLITE_FUNC_OFFSET| SQLITE_FUNC_TYPEOF), @@ -113553,7 +117611,7 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ FUNCTION(upper, 1, 0, 0, upperFunc ), FUNCTION(lower, 1, 0, 0, lowerFunc ), FUNCTION(hex, 1, 0, 0, hexFunc ), - FUNCTION2(ifnull, 2, 0, 0, noopFunc, SQLITE_FUNC_COALESCE), + INLINE_FUNC(ifnull, 2, INLINEFUNC_coalesce, SQLITE_FUNC_COALESCE), VFUNCTION(random, 0, 0, 0, randomFunc ), VFUNCTION(randomblob, 1, 0, 0, randomBlob ), FUNCTION(nullif, 2, 0, 1, nullifFunc ), @@ -113593,15 +117651,12 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ #endif FUNCTION(coalesce, 1, 0, 0, 0 ), FUNCTION(coalesce, 0, 0, 0, 0 ), - FUNCTION2(coalesce, -1, 0, 0, noopFunc, SQLITE_FUNC_COALESCE), + INLINE_FUNC(coalesce, -1, INLINEFUNC_coalesce, SQLITE_FUNC_COALESCE), }; #ifndef SQLITE_OMIT_ALTERTABLE sqlite3AlterFunctions(); #endif sqlite3WindowFunctions(); -#if defined(SQLITE_ENABLE_STAT3) || defined(SQLITE_ENABLE_STAT4) - sqlite3AnalyzeFunctions(); -#endif sqlite3RegisterDateTimeFunctions(); sqlite3InsertBuiltinFuncs(aBuiltinFunc, ArraySize(aBuiltinFunc)); @@ -113955,7 +118010,7 @@ static void fkLookupParent( int i; /* Iterator variable */ Vdbe *v = sqlite3GetVdbe(pParse); /* Vdbe to add code to */ int iCur = pParse->nTab - 1; /* Cursor number to use */ - int iOk = sqlite3VdbeMakeLabel(v); /* jump here if parent key found */ + int iOk = sqlite3VdbeMakeLabel(pParse); /* jump here if parent key found */ sqlite3VdbeVerifyAbortable(v, (!pFKey->isDeferred @@ -113975,7 +118030,7 @@ static void fkLookupParent( VdbeCoverage(v); } for(i=0; inCol; i++){ - int iReg = aiCol[i] + regData + 1; + int iReg = sqlite3TableColumnToStorage(pFKey->pFrom,aiCol[i]) + regData + 1; sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iOk); VdbeCoverage(v); } @@ -113991,7 +118046,8 @@ static void fkLookupParent( ** is no matching parent key. Before using MustBeInt, make a copy of ** the value. Otherwise, the value inserted into the child key column ** will have INTEGER affinity applied to it, which may not be correct. */ - sqlite3VdbeAddOp2(v, OP_SCopy, aiCol[0]+1+regData, regTemp); + sqlite3VdbeAddOp2(v, OP_SCopy, + sqlite3TableColumnToStorage(pFKey->pFrom,aiCol[0])+1+regData, regTemp); iMustBeInt = sqlite3VdbeAddOp2(v, OP_MustBeInt, regTemp, 0); VdbeCoverage(v); @@ -114018,7 +118074,9 @@ static void fkLookupParent( sqlite3VdbeAddOp3(v, OP_OpenRead, iCur, pIdx->tnum, iDb); sqlite3VdbeSetP4KeyInfo(pParse, pIdx); for(i=0; ipFrom, aiCol[i])+1+regData, + regTemp+i); } /* If the parent table is the same as the child table, and we are about @@ -114034,8 +118092,11 @@ static void fkLookupParent( if( pTab==pFKey->pFrom && nIncr==1 ){ int iJump = sqlite3VdbeCurrentAddr(v) + nCol + 1; for(i=0; iaiColumn[i]+1+regData; + int iChild = sqlite3TableColumnToStorage(pFKey->pFrom,aiCol[i]) + +1+regData; + int iParent = 1+regData; + iParent += sqlite3TableColumnToStorage(pIdx->pTable, + pIdx->aiColumn[i]); assert( pIdx->aiColumn[i]>=0 ); assert( aiCol[i]!=pTab->iPKey ); if( pIdx->aiColumn[i]==pTab->iPKey ){ @@ -114103,14 +118164,14 @@ static Expr *exprTableRegister( if( pExpr ){ if( iCol>=0 && iCol!=pTab->iPKey ){ pCol = &pTab->aCol[iCol]; - pExpr->iTable = regBase + iCol + 1; - pExpr->affinity = pCol->affinity; + pExpr->iTable = regBase + sqlite3TableColumnToStorage(pTab,iCol) + 1; + pExpr->affExpr = pCol->affinity; zColl = pCol->zColl; if( zColl==0 ) zColl = db->pDfltColl->zName; pExpr = sqlite3ExprAddCollateString(pParse, pExpr, zColl); }else{ pExpr->iTable = regBase; - pExpr->affinity = SQLITE_AFF_INTEGER; + pExpr->affExpr = SQLITE_AFF_INTEGER; } } return pExpr; @@ -114128,7 +118189,7 @@ static Expr *exprTableColumn( ){ Expr *pExpr = sqlite3Expr(db, TK_COLUMN, 0); if( pExpr ){ - pExpr->pTab = pTab; + pExpr->y.pTab = pTab; pExpr->iTable = iCursor; pExpr->iColumn = iCol; } @@ -114217,7 +118278,7 @@ static void fkScanChildren( zCol = pFKey->pFrom->aCol[iCol].zName; pRight = sqlite3Expr(db, TK_ID, zCol); pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight); - pWhere = sqlite3ExprAnd(db, pWhere, pEq); + pWhere = sqlite3ExprAnd(pParse, pWhere, pEq); } /* If the child table is the same as the parent table, then add terms @@ -114228,8 +118289,11 @@ static void fkScanChildren( ** NOT( $current_a==a AND $current_b==b AND ... ) ** ** The first form is used for rowid tables. The second form is used - ** for WITHOUT ROWID tables. In the second form, the primary key is - ** (a,b,...) + ** for WITHOUT ROWID tables. In the second form, the *parent* key is + ** (a,b,...). Either the parent or primary key could be used to + ** uniquely identify the current row, but the parent key is more convenient + ** as the required values have already been loaded into registers + ** by the caller. */ if( pTab==pFKey->pFrom && nIncr>0 ){ Expr *pNe; /* Expression (pLeft != pRight) */ @@ -114241,19 +118305,18 @@ static void fkScanChildren( pNe = sqlite3PExpr(pParse, TK_NE, pLeft, pRight); }else{ Expr *pEq, *pAll = 0; - Index *pPk = sqlite3PrimaryKeyIndex(pTab); assert( pIdx!=0 ); - for(i=0; inKeyCol; i++){ + for(i=0; inKeyCol; i++){ i16 iCol = pIdx->aiColumn[i]; assert( iCol>=0 ); pLeft = exprTableRegister(pParse, pTab, regData, iCol); - pRight = exprTableColumn(db, pTab, pSrc->a[0].iCursor, iCol); - pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight); - pAll = sqlite3ExprAnd(db, pAll, pEq); + pRight = sqlite3Expr(db, TK_ID, pTab->aCol[iCol].zName); + pEq = sqlite3PExpr(pParse, TK_IS, pLeft, pRight); + pAll = sqlite3ExprAnd(pParse, pAll, pEq); } pNe = sqlite3PExpr(pParse, TK_NOT, pAll, 0); } - pWhere = sqlite3ExprAnd(db, pWhere, pNe); + pWhere = sqlite3ExprAnd(pParse, pWhere, pNe); } /* Resolve the references in the WHERE clause. */ @@ -114353,7 +118416,7 @@ SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTa if( p->isDeferred || (db->flags & SQLITE_DeferFKs) ) break; } if( !p ) return; - iSkip = sqlite3VdbeMakeLabel(v); + iSkip = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeAddOp2(v, OP_FkIfZero, 1, iSkip); VdbeCoverage(v); } @@ -114550,7 +118613,9 @@ SQLITE_PRIVATE void sqlite3FkCheck( Vdbe *v = sqlite3GetVdbe(pParse); int iJump = sqlite3VdbeCurrentAddr(v) + pFKey->nCol + 1; for(i=0; inCol; i++){ - int iReg = pFKey->aCol[i].iFrom + regOld + 1; + int iFromCol, iReg; + iFromCol = pFKey->aCol[i].iFrom; + iReg = sqlite3TableColumnToStorage(pFKey->pFrom,iFromCol) + regOld+1; sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iJump); VdbeCoverage(v); } sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, -1); @@ -114638,7 +118703,7 @@ SQLITE_PRIVATE void sqlite3FkCheck( /* Create a SrcList structure containing the child table. We need the ** child table as a SrcList for sqlite3WhereBegin() */ - pSrc = sqlite3SrcListAppend(db, 0, 0, 0); + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( pSrc ){ struct SrcList_item *pItem = pSrc->a; pItem->pTab = pFKey->pFrom; @@ -114859,7 +118924,7 @@ static Trigger *fkActionTrigger( sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)), sqlite3ExprAlloc(db, TK_ID, &tFromCol, 0) ); - pWhere = sqlite3ExprAnd(db, pWhere, pEq); + pWhere = sqlite3ExprAnd(pParse, pWhere, pEq); /* For ON UPDATE, construct the next term of the WHEN clause. ** The final WHEN clause will be like this: @@ -114875,7 +118940,7 @@ static Trigger *fkActionTrigger( sqlite3ExprAlloc(db, TK_ID, &tNew, 0), sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)) ); - pWhen = sqlite3ExprAnd(db, pWhen, pEq); + pWhen = sqlite3ExprAnd(pParse, pWhen, pEq); } if( action!=OE_Restrict && (action!=OE_Cascade || pChanges) ){ @@ -114885,7 +118950,15 @@ static Trigger *fkActionTrigger( sqlite3ExprAlloc(db, TK_ID, &tNew, 0), sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)); }else if( action==OE_SetDflt ){ - Expr *pDflt = pFKey->pFrom->aCol[iFromCol].pDflt; + Column *pCol = pFKey->pFrom->aCol + iFromCol; + Expr *pDflt; + if( pCol->colFlags & COLFLAG_GENERATED ){ + testcase( pCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pCol->colFlags & COLFLAG_STORED ); + pDflt = 0; + }else{ + pDflt = pCol->pDflt; + } if( pDflt ){ pNew = sqlite3ExprDup(db, pDflt, 0); }else{ @@ -114911,11 +118984,11 @@ static Trigger *fkActionTrigger( tFrom.n = nFrom; pRaise = sqlite3Expr(db, TK_RAISE, "FOREIGN KEY constraint failed"); if( pRaise ){ - pRaise->affinity = OE_Abort; + pRaise->affExpr = OE_Abort; } pSelect = sqlite3SelectNew(pParse, sqlite3ExprListAppend(pParse, 0, pRaise), - sqlite3SrcListAppend(db, 0, &tFrom, 0), + sqlite3SrcListAppend(pParse, 0, &tFrom, 0), pWhere, 0, 0, 0, 0, 0 ); @@ -114923,7 +118996,7 @@ static Trigger *fkActionTrigger( } /* Disable lookaside memory allocation */ - db->lookaside.bDisable++; + DisableLookaside; pTrigger = (Trigger *)sqlite3DbMallocZero(db, sizeof(Trigger) + /* struct Trigger */ @@ -114945,7 +119018,7 @@ static Trigger *fkActionTrigger( } /* Re-enable the lookaside buffer, if it was disabled earlier. */ - db->lookaside.bDisable--; + EnableLookaside; sqlite3ExprDelete(db, pWhere); sqlite3ExprDelete(db, pWhen); @@ -114956,6 +119029,7 @@ static Trigger *fkActionTrigger( return 0; } assert( pStep!=0 ); + assert( pTrigger!=0 ); switch( action ){ case OE_Restrict: @@ -115095,7 +119169,7 @@ SQLITE_PRIVATE void sqlite3OpenTable( sqlite3TableLock(pParse, iDb, pTab->tnum, (opcode==OP_OpenWrite)?1:0, pTab->zName); if( HasRowid(pTab) ){ - sqlite3VdbeAddOp4Int(v, opcode, iCur, pTab->tnum, iDb, pTab->nCol); + sqlite3VdbeAddOp4Int(v, opcode, iCur, pTab->tnum, iDb, pTab->nNVCol); VdbeComment((v, "%s", pTab->zName)); }else{ Index *pPk = sqlite3PrimaryKeyIndex(pTab); @@ -115146,18 +119220,19 @@ SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ } for(n=0; nnColumn; n++){ i16 x = pIdx->aiColumn[n]; + char aff; if( x>=0 ){ - pIdx->zColAff[n] = pTab->aCol[x].affinity; + aff = pTab->aCol[x].affinity; }else if( x==XN_ROWID ){ - pIdx->zColAff[n] = SQLITE_AFF_INTEGER; + aff = SQLITE_AFF_INTEGER; }else{ - char aff; assert( x==XN_EXPR ); assert( pIdx->aColExpr!=0 ); aff = sqlite3ExprAffinity(pIdx->aColExpr->a[n].pExpr); - if( aff==0 ) aff = SQLITE_AFF_BLOB; - pIdx->zColAff[n] = aff; } + if( affSQLITE_AFF_NUMERIC) aff = SQLITE_AFF_NUMERIC; + pIdx->zColAff[n] = aff; } pIdx->zColAff[n] = 0; } @@ -115186,7 +119261,7 @@ SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ ** 'E' REAL */ SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ - int i; + int i, j; char *zColAff = pTab->zColAff; if( zColAff==0 ){ sqlite3 *db = sqlite3VdbeDb(v); @@ -115196,15 +119271,19 @@ SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ return; } - for(i=0; inCol; i++){ - zColAff[i] = pTab->aCol[i].affinity; + for(i=j=0; inCol; i++){ + assert( pTab->aCol[i].affinity!=0 ); + if( (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ){ + zColAff[j++] = pTab->aCol[i].affinity; + } } do{ - zColAff[i--] = 0; - }while( i>=0 && zColAff[i]==SQLITE_AFF_BLOB ); + zColAff[j--] = 0; + }while( j>=0 && zColAff[j]<=SQLITE_AFF_BLOB ); pTab->zColAff = zColAff; } - i = sqlite3Strlen30(zColAff); + assert( zColAff!=0 ); + i = sqlite3Strlen30NN(zColAff); if( i ){ if( iReg ){ sqlite3VdbeAddOp4(v, OP_Affinity, iReg, i, 0, zColAff, i); @@ -115254,6 +119333,119 @@ static int readsTable(Parse *p, int iDb, Table *pTab){ return 0; } +/* This walker callback will compute the union of colFlags flags for all +** referenced columns in a CHECK constraint or generated column expression. +*/ +static int exprColumnFlagUnion(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_COLUMN && pExpr->iColumn>=0 ){ + assert( pExpr->iColumn < pWalker->u.pTab->nCol ); + pWalker->eCode |= pWalker->u.pTab->aCol[pExpr->iColumn].colFlags; + } + return WRC_Continue; +} + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* +** All regular columns for table pTab have been puts into registers +** starting with iRegStore. The registers that correspond to STORED +** or VIRTUAL columns have not yet been initialized. This routine goes +** back and computes the values for those columns based on the previously +** computed normal columns. +*/ +SQLITE_PRIVATE void sqlite3ComputeGeneratedColumns( + Parse *pParse, /* Parsing context */ + int iRegStore, /* Register holding the first column */ + Table *pTab /* The table */ +){ + int i; + Walker w; + Column *pRedo; + int eProgress; + VdbeOp *pOp; + + assert( pTab->tabFlags & TF_HasGenerated ); + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + + /* Before computing generated columns, first go through and make sure + ** that appropriate affinity has been applied to the regular columns + */ + sqlite3TableAffinity(pParse->pVdbe, pTab, iRegStore); + if( (pTab->tabFlags & TF_HasStored)!=0 + && (pOp = sqlite3VdbeGetOp(pParse->pVdbe,-1))->opcode==OP_Affinity + ){ + /* Change the OP_Affinity argument to '@' (NONE) for all stored + ** columns. '@' is the no-op affinity and those columns have not + ** yet been computed. */ + int ii, jj; + char *zP4 = pOp->p4.z; + assert( zP4!=0 ); + assert( pOp->p4type==P4_DYNAMIC ); + for(ii=jj=0; zP4[jj]; ii++){ + if( pTab->aCol[ii].colFlags & COLFLAG_VIRTUAL ){ + continue; + } + if( pTab->aCol[ii].colFlags & COLFLAG_STORED ){ + zP4[jj] = SQLITE_AFF_NONE; + } + jj++; + } + } + + /* Because there can be multiple generated columns that refer to one another, + ** this is a two-pass algorithm. On the first pass, mark all generated + ** columns as "not available". + */ + for(i=0; inCol; i++){ + if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ + testcase( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ); + testcase( pTab->aCol[i].colFlags & COLFLAG_STORED ); + pTab->aCol[i].colFlags |= COLFLAG_NOTAVAIL; + } + } + + w.u.pTab = pTab; + w.xExprCallback = exprColumnFlagUnion; + w.xSelectCallback = 0; + w.xSelectCallback2 = 0; + + /* On the second pass, compute the value of each NOT-AVAILABLE column. + ** Companion code in the TK_COLUMN case of sqlite3ExprCodeTarget() will + ** compute dependencies and mark remove the COLSPAN_NOTAVAIL mark, as + ** they are needed. + */ + pParse->iSelfTab = -iRegStore; + do{ + eProgress = 0; + pRedo = 0; + for(i=0; inCol; i++){ + Column *pCol = pTab->aCol + i; + if( (pCol->colFlags & COLFLAG_NOTAVAIL)!=0 ){ + int x; + pCol->colFlags |= COLFLAG_BUSY; + w.eCode = 0; + sqlite3WalkExpr(&w, pCol->pDflt); + pCol->colFlags &= ~COLFLAG_BUSY; + if( w.eCode & COLFLAG_NOTAVAIL ){ + pRedo = pCol; + continue; + } + eProgress = 1; + assert( pCol->colFlags & COLFLAG_GENERATED ); + x = sqlite3TableColumnToStorage(pTab, i) + iRegStore; + sqlite3ExprCodeGeneratedColumn(pParse, pCol, x); + pCol->colFlags &= ~COLFLAG_NOTAVAIL; + } + } + }while( pRedo && eProgress ); + if( pRedo ){ + sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", pRedo->zName); + } + pParse->iSelfTab = 0; +} +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + + #ifndef SQLITE_OMIT_AUTOINCREMENT /* ** Locate or create an AutoincInfo structure associated with table pTab @@ -115376,6 +119568,7 @@ SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse){ aOp[7].p2 = memId+2; aOp[7].p1 = memId; aOp[10].p2 = memId; + if( pParse->nTab==0 ) pParse->nTab = 1; } } @@ -115560,7 +119753,7 @@ SQLITE_PRIVATE void sqlite3Insert( Parse *pParse, /* Parser context */ SrcList *pTabList, /* Name of table into which we are inserting */ Select *pSelect, /* A SELECT statement to use as the data source */ - IdList *pColumn, /* Column names corresponding to IDLIST. */ + IdList *pColumn, /* Column names corresponding to IDLIST, or NULL. */ int onError, /* How to handle constraint errors */ Upsert *pUpsert /* ON CONFLICT clauses for upsert, or NULL */ ){ @@ -115585,6 +119778,7 @@ SQLITE_PRIVATE void sqlite3Insert( u8 withoutRowid; /* 0 for normal table. 1 for WITHOUT ROWID table */ u8 bIdListInOrder; /* True if IDLIST is in table order */ ExprList *pList = 0; /* List of VALUES() to be inserted */ + int iRegStore; /* Register in which to store next column */ /* Register allocations */ int regFromSelect = 0;/* Base register for data coming from SELECT */ @@ -115692,8 +119886,8 @@ SQLITE_PRIVATE void sqlite3Insert( */ regAutoinc = autoIncBegin(pParse, iDb, pTab); - /* Allocate registers for holding the rowid of the new row, - ** the content of the new row, and the assembled row record. + /* Allocate a block registers to hold the rowid and the values + ** for all columns of the new row. */ regRowid = regIns = pParse->nMem+1; pParse->nMem += pTab->nCol + 1; @@ -115712,9 +119906,17 @@ SQLITE_PRIVATE void sqlite3Insert( ** the index into IDLIST of the primary key column. ipkColumn is ** the index of the primary key as it appears in IDLIST, not as ** is appears in the original table. (The index of the INTEGER - ** PRIMARY KEY in the original table is pTab->iPKey.) + ** PRIMARY KEY in the original table is pTab->iPKey.) After this + ** loop, if ipkColumn==(-1), that means that integer primary key + ** is unspecified, and hence the table is either WITHOUT ROWID or + ** it will automatically generated an integer primary key. + ** + ** bIdListInOrder is true if the columns in IDLIST are in storage + ** order. This enables an optimization that avoids shuffling the + ** columns into storage order. False negatives are harmless, + ** but false positives will cause database corruption. */ - bIdListInOrder = (pTab->tabFlags & TF_OOOHidden)==0; + bIdListInOrder = (pTab->tabFlags & (TF_OOOHidden|TF_HasStored))==0; if( pColumn ){ for(i=0; inId; i++){ pColumn->a[i].idx = -1; @@ -115727,6 +119929,14 @@ SQLITE_PRIVATE void sqlite3Insert( if( j==pTab->iPKey ){ ipkColumn = i; assert( !withoutRowid ); } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pTab->aCol[j].colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL) ){ + sqlite3ErrorMsg(pParse, + "cannot INSERT into generated column \"%s\"", + pTab->aCol[j].zName); + goto insert_cleanup; + } +#endif break; } } @@ -115836,13 +120046,26 @@ SQLITE_PRIVATE void sqlite3Insert( */ if( pColumn==0 && nColumn>0 ){ ipkColumn = pTab->iPKey; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( ipkColumn>=0 && (pTab->tabFlags & TF_HasGenerated)!=0 ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + for(i=ipkColumn-1; i>=0; i--){ + if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ + testcase( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ); + testcase( pTab->aCol[i].colFlags & COLFLAG_STORED ); + ipkColumn--; + } + } + } +#endif } /* Make sure the number of columns in the source data matches the number ** of columns to be inserted into the table. */ for(i=0; inCol; i++){ - nHidden += (IsHiddenColumn(&pTab->aCol[i]) ? 1 : 0); + if( pTab->aCol[i].colFlags & COLFLAG_NOINSERT ) nHidden++; } if( pColumn==0 && nColumn && nColumn!=(pTab->nCol-nHidden) ){ sqlite3ErrorMsg(pParse, @@ -115870,7 +120093,7 @@ SQLITE_PRIVATE void sqlite3Insert( int nIdx; nIdx = sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, -1, 0, &iDataCur, &iIdxCur); - aRegIdx = sqlite3DbMallocRawNN(db, sizeof(int)*(nIdx+1)); + aRegIdx = sqlite3DbMallocRawNN(db, sizeof(int)*(nIdx+2)); if( aRegIdx==0 ){ goto insert_cleanup; } @@ -115879,9 +120102,22 @@ SQLITE_PRIVATE void sqlite3Insert( aRegIdx[i] = ++pParse->nMem; pParse->nMem += pIdx->nColumn; } + aRegIdx[i] = ++pParse->nMem; /* Register to store the table record */ } #ifndef SQLITE_OMIT_UPSERT if( pUpsert ){ + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "UPSERT not implemented for virtual table \"%s\"", + pTab->zName); + goto insert_cleanup; + } + if( pTab->pSelect ){ + sqlite3ErrorMsg(pParse, "cannot UPSERT a view"); + goto insert_cleanup; + } + if( sqlite3HasExplicitNulls(pParse, pUpsert->pUpsertTarget) ){ + goto insert_cleanup; + } pTabList->a[0].iCursor = iDataCur; pUpsert->pUpsertSrc = pTabList; pUpsert->regData = regData; @@ -115916,13 +120152,94 @@ SQLITE_PRIVATE void sqlite3Insert( ** goto C ** D: ... */ + sqlite3VdbeReleaseRegisters(pParse, regData, pTab->nCol, 0, 0); addrInsTop = addrCont = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); VdbeCoverage(v); + if( ipkColumn>=0 ){ + /* tag-20191021-001: If the INTEGER PRIMARY KEY is being generated by the + ** SELECT, go ahead and copy the value into the rowid slot now, so that + ** the value does not get overwritten by a NULL at tag-20191021-002. */ + sqlite3VdbeAddOp2(v, OP_Copy, regFromSelect+ipkColumn, regRowid); + } } + /* Compute data for ordinary columns of the new entry. Values + ** are written in storage order into registers starting with regData. + ** Only ordinary columns are computed in this loop. The rowid + ** (if there is one) is computed later and generated columns are + ** computed after the rowid since they might depend on the value + ** of the rowid. + */ + nHidden = 0; + iRegStore = regData; assert( regData==regRowid+1 ); + for(i=0; inCol; i++, iRegStore++){ + int k; + u32 colFlags; + assert( i>=nHidden ); + if( i==pTab->iPKey ){ + /* tag-20191021-002: References to the INTEGER PRIMARY KEY are filled + ** using the rowid. So put a NULL in the IPK slot of the record to avoid + ** using excess space. The file format definition requires this extra + ** NULL - we cannot optimize further by skipping the column completely */ + sqlite3VdbeAddOp1(v, OP_SoftNull, iRegStore); + continue; + } + if( ((colFlags = pTab->aCol[i].colFlags) & COLFLAG_NOINSERT)!=0 ){ + nHidden++; + if( (colFlags & COLFLAG_VIRTUAL)!=0 ){ + /* Virtual columns do not participate in OP_MakeRecord. So back up + ** iRegStore by one slot to compensate for the iRegStore++ in the + ** outer for() loop */ + iRegStore--; + continue; + }else if( (colFlags & COLFLAG_STORED)!=0 ){ + /* Stored columns are computed later. But if there are BEFORE + ** triggers, the slots used for stored columns will be OP_Copy-ed + ** to a second block of registers, so the register needs to be + ** initialized to NULL to avoid an uninitialized register read */ + if( tmask & TRIGGER_BEFORE ){ + sqlite3VdbeAddOp1(v, OP_SoftNull, iRegStore); + } + continue; + }else if( pColumn==0 ){ + /* Hidden columns that are not explicitly named in the INSERT + ** get there default value */ + sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); + continue; + } + } + if( pColumn ){ + for(j=0; jnId && pColumn->a[j].idx!=i; j++){} + if( j>=pColumn->nId ){ + /* A column not named in the insert column list gets its + ** default value */ + sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); + continue; + } + k = j; + }else if( nColumn==0 ){ + /* This is INSERT INTO ... DEFAULT VALUES. Load the default value. */ + sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); + continue; + }else{ + k = i - nHidden; + } + + if( useTempTable ){ + sqlite3VdbeAddOp3(v, OP_Column, srcTab, k, iRegStore); + }else if( pSelect ){ + if( regFromSelect!=regData ){ + sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+k, iRegStore); + } + }else{ + sqlite3ExprCode(pParse, pList->a[k].pExpr, iRegStore); + } + } + + /* Run the BEFORE and INSTEAD OF triggers, if there are any */ - endOfLoop = sqlite3VdbeMakeLabel(v); + endOfLoop = sqlite3VdbeMakeLabel(pParse); if( tmask & TRIGGER_BEFORE ){ int regCols = sqlite3GetTempRange(pParse, pTab->nCol+1); @@ -115954,25 +120271,21 @@ SQLITE_PRIVATE void sqlite3Insert( */ assert( !IsVirtual(pTab) ); - /* Create the new column data - */ - for(i=j=0; inCol; i++){ - if( pColumn ){ - for(j=0; jnId; j++){ - if( pColumn->a[j].idx==i ) break; - } - } - if( (!useTempTable && !pList) || (pColumn && j>=pColumn->nId) - || (pColumn==0 && IsOrdinaryHiddenColumn(&pTab->aCol[i])) ){ - sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regCols+i+1); - }else if( useTempTable ){ - sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, regCols+i+1); - }else{ - assert( pSelect==0 ); /* Otherwise useTempTable is true */ - sqlite3ExprCodeAndCache(pParse, pList->a[j].pExpr, regCols+i+1); - } - if( pColumn==0 && !IsOrdinaryHiddenColumn(&pTab->aCol[i]) ) j++; + /* Copy the new data already generated. */ + assert( pTab->nNVCol>0 ); + sqlite3VdbeAddOp3(v, OP_Copy, regRowid+1, regCols+1, pTab->nNVCol-1); + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + /* Compute the new value for generated columns after all other + ** columns have already been computed. This must be done after + ** computing the ROWID in case one of the generated columns + ** refers to the ROWID. */ + if( pTab->tabFlags & TF_HasGenerated ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + sqlite3ComputeGeneratedColumns(pParse, regCols+1, pTab); } +#endif /* If this is an INSERT on a view with an INSTEAD OF INSERT trigger, ** do not attempt any conversions before assembling the record. @@ -115990,30 +120303,24 @@ SQLITE_PRIVATE void sqlite3Insert( sqlite3ReleaseTempRange(pParse, regCols, pTab->nCol+1); } - /* Compute the content of the next row to insert into a range of - ** registers beginning at regIns. - */ if( !isView ){ if( IsVirtual(pTab) ){ /* The row that the VUpdate opcode will delete: none */ sqlite3VdbeAddOp2(v, OP_Null, 0, regIns); } if( ipkColumn>=0 ){ + /* Compute the new rowid */ if( useTempTable ){ sqlite3VdbeAddOp3(v, OP_Column, srcTab, ipkColumn, regRowid); }else if( pSelect ){ - sqlite3VdbeAddOp2(v, OP_Copy, regFromSelect+ipkColumn, regRowid); + /* Rowid already initialized at tag-20191021-001 */ }else{ - VdbeOp *pOp; - sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid); - pOp = sqlite3VdbeGetOp(v, -1); - assert( pOp!=0 ); - if( pOp->opcode==OP_Null && !IsVirtual(pTab) ){ + Expr *pIpk = pList->a[ipkColumn].pExpr; + if( pIpk->op==TK_NULL && !IsVirtual(pTab) ){ + sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); appendFlag = 1; - pOp->opcode = OP_NewRowid; - pOp->p1 = iDataCur; - pOp->p2 = regRowid; - pOp->p3 = regAutoinc; + }else{ + sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid); } } /* If the PRIMARY KEY expression is NULL, then use OP_NewRowid @@ -116039,45 +120346,15 @@ SQLITE_PRIVATE void sqlite3Insert( } autoIncStep(pParse, regAutoinc, regRowid); - /* Compute data for all columns of the new entry, beginning - ** with the first column. - */ - nHidden = 0; - for(i=0; inCol; i++){ - int iRegStore = regRowid+1+i; - if( i==pTab->iPKey ){ - /* The value of the INTEGER PRIMARY KEY column is always a NULL. - ** Whenever this column is read, the rowid will be substituted - ** in its place. Hence, fill this column with a NULL to avoid - ** taking up data space with information that will never be used. - ** As there may be shallow copies of this value, make it a soft-NULL */ - sqlite3VdbeAddOp1(v, OP_SoftNull, iRegStore); - continue; - } - if( pColumn==0 ){ - if( IsHiddenColumn(&pTab->aCol[i]) ){ - j = -1; - nHidden++; - }else{ - j = i - nHidden; - } - }else{ - for(j=0; jnId; j++){ - if( pColumn->a[j].idx==i ) break; - } - } - if( j<0 || nColumn==0 || (pColumn && j>=pColumn->nId) ){ - sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); - }else if( useTempTable ){ - sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, iRegStore); - }else if( pSelect ){ - if( regFromSelect!=regData ){ - sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+j, iRegStore); - } - }else{ - sqlite3ExprCode(pParse, pList->a[j].pExpr, iRegStore); - } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + /* Compute the new value for generated columns after all other + ** columns have already been computed. This must be done after + ** computing the ROWID in case one of the generated columns + ** is derived from the INTEGER PRIMARY KEY. */ + if( pTab->tabFlags & TF_HasGenerated ){ + sqlite3ComputeGeneratedColumns(pParse, regRowid+1, pTab); } +#endif /* Generate code to check constraints and generate index keys and ** do the insertion. @@ -116107,9 +120384,7 @@ SQLITE_PRIVATE void sqlite3Insert( ** cursor that is disturbed. And these instructions both clear the ** VdbeCursor.seekResult variable, disabling the OPFLAG_USESEEKRESULT ** functionality. */ - bUseSeek = (isReplace==0 || (pTrigger==0 && - ((db->flags & SQLITE_ForeignKeys)==0 || sqlite3FkReferences(pTab)==0) - )); + bUseSeek = (isReplace==0 || !sqlite3VdbeHasSubProgram(v)); sqlite3CompleteInsertion(pParse, pTab, iDataCur, iIdxCur, regIns, aRegIdx, 0, appendFlag, bUseSeek ); @@ -116138,6 +120413,15 @@ SQLITE_PRIVATE void sqlite3Insert( sqlite3VdbeAddOp1(v, OP_Close, srcTab); }else if( pSelect ){ sqlite3VdbeGoto(v, addrCont); +#ifdef SQLITE_DEBUG + /* If we are jumping back to an OP_Yield that is preceded by an + ** OP_ReleaseReg, set the p5 flag on the OP_Goto so that the + ** OP_ReleaseReg will be included in the loop. */ + if( sqlite3VdbeGetOp(v, addrCont-1)->opcode==OP_ReleaseReg ){ + assert( sqlite3VdbeGetOp(v, addrCont)->opcode==OP_Yield ); + sqlite3VdbeChangeP5(v, 1); + } +#endif sqlite3VdbeJumpHere(v, addrInsTop); } @@ -116184,14 +120468,15 @@ SQLITE_PRIVATE void sqlite3Insert( #endif /* -** Meanings of bits in of pWalker->eCode for checkConstraintUnchanged() +** Meanings of bits in of pWalker->eCode for +** sqlite3ExprReferencesUpdatedColumn() */ #define CKCNSTRNT_COLUMN 0x01 /* CHECK constraint uses a changing column */ #define CKCNSTRNT_ROWID 0x02 /* CHECK constraint references the ROWID */ -/* This is the Walker callback from checkConstraintUnchanged(). Set -** bit 0x01 of pWalker->eCode if -** pWalker->eCode to 0 if this expression node references any of the +/* This is the Walker callback from sqlite3ExprReferencesUpdatedColumn(). +* Set bit 0x01 of pWalker->eCode if pWalker->eCode to 0 and if this +** expression node references any of the ** columns that are being modifed by an UPDATE statement. */ static int checkConstraintExprNode(Walker *pWalker, Expr *pExpr){ @@ -116213,12 +120498,21 @@ static int checkConstraintExprNode(Walker *pWalker, Expr *pExpr){ ** only columns that are modified by the UPDATE are those for which ** aiChng[i]>=0, and also the ROWID is modified if chngRowid is true. ** -** Return true if CHECK constraint pExpr does not use any of the +** Return true if CHECK constraint pExpr uses any of the ** changing columns (or the rowid if it is changing). In other words, -** return true if this CHECK constraint can be skipped when validating +** return true if this CHECK constraint must be validated for ** the new row in the UPDATE statement. +** +** 2018-09-15: pExpr might also be an expression for an index-on-expressions. +** The operation of this routine is the same - return true if an only if +** the expression uses one or more of columns identified by the second and +** third arguments. */ -static int checkConstraintUnchanged(Expr *pExpr, int *aiChng, int chngRowid){ +SQLITE_PRIVATE int sqlite3ExprReferencesUpdatedColumn( + Expr *pExpr, /* The expression to be checked */ + int *aiChng, /* aiChng[x]>=0 if column x changed by the UPDATE */ + int chngRowid /* True if UPDATE changes the rowid */ +){ Walker w; memset(&w, 0, sizeof(w)); w.eCode = 0; @@ -116233,7 +120527,7 @@ static int checkConstraintUnchanged(Expr *pExpr, int *aiChng, int chngRowid){ testcase( w.eCode==CKCNSTRNT_COLUMN ); testcase( w.eCode==CKCNSTRNT_ROWID ); testcase( w.eCode==(CKCNSTRNT_ROWID|CKCNSTRNT_COLUMN) ); - return !w.eCode; + return w.eCode!=0; } /* @@ -116271,6 +120565,14 @@ static int checkConstraintUnchanged(Expr *pExpr, int *aiChng, int chngRowid){ ** the same as the order of indices on the linked list of indices ** at pTab->pIndex. ** +** (2019-05-07) The generated code also creates a new record for the +** main table, if pTab is a rowid table, and stores that record in the +** register identified by aRegIdx[nIdx] - in other words in the first +** entry of aRegIdx[] past the last index. It is important that the +** record be generated during constraint checks to avoid affinity changes +** to the register content that occur after constraint checks but before +** the new record is inserted. +** ** The caller must have already opened writeable cursors on the main ** table and all applicable indices (that is to say, all indices for which ** aRegIdx[] is not zero). iDataCur is the cursor for the main table when @@ -116342,7 +120644,6 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( int ix; /* Index loop counter */ int nCol; /* Number of columns */ int onError; /* Conflict resolution strategy */ - int addr1; /* Address of jump instruction */ int seenReplace = 0; /* True if REPLACE is used to resolve INT PK conflict */ int nPkField; /* Number of fields in PRIMARY KEY. 1 for ROWID tables */ Index *pUpIdx = 0; /* Index to which to apply the upsert */ @@ -116352,6 +120653,13 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( int upsertJump = 0; /* Address of Goto that jumps into upsert subroutine */ int ipkTop = 0; /* Top of the IPK uniqueness check */ int ipkBottom = 0; /* OP_Goto at the end of the IPK uniqueness check */ + /* Variables associated with retesting uniqueness constraints after + ** replace triggers fire have run */ + int regTrigCnt; /* Register used to count replace trigger invocations */ + int addrRecheck = 0; /* Jump here to recheck all uniqueness constraints */ + int lblRecheckOk = 0; /* Each recheck jumps to this label if it passes */ + Trigger *pTrigger; /* List of DELETE triggers on the table pTab */ + int nReplaceTrig = 0; /* Number of replace triggers coded */ isUpdate = regOldData!=0; db = pParse->db; @@ -116378,56 +120686,103 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( /* Test all NOT NULL constraints. */ - for(i=0; iiPKey ){ - continue; /* ROWID is never NULL */ - } - if( aiChng && aiChng[i]<0 ){ - /* Don't bother checking for NOT NULL on columns that do not change */ - continue; - } - onError = pTab->aCol[i].notNull; - if( onError==OE_None ) continue; /* This column is allowed to be NULL */ - if( overrideError!=OE_Default ){ - onError = overrideError; - }else if( onError==OE_Default ){ - onError = OE_Abort; - } - if( onError==OE_Replace && pTab->aCol[i].pDflt==0 ){ - onError = OE_Abort; - } - assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail - || onError==OE_Ignore || onError==OE_Replace ); - switch( onError ){ - case OE_Abort: - sqlite3MayAbort(pParse); - /* Fall through */ - case OE_Rollback: - case OE_Fail: { - char *zMsg = sqlite3MPrintf(db, "%s.%s", pTab->zName, - pTab->aCol[i].zName); - sqlite3VdbeAddOp3(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, onError, - regNewData+1+i); - sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC); - sqlite3VdbeChangeP5(v, P5_ConstraintNotNull); - VdbeCoverage(v); - break; - } - case OE_Ignore: { - sqlite3VdbeAddOp2(v, OP_IsNull, regNewData+1+i, ignoreDest); - VdbeCoverage(v); + if( pTab->tabFlags & TF_HasNotNull ){ + int b2ndPass = 0; /* True if currently running 2nd pass */ + int nSeenReplace = 0; /* Number of ON CONFLICT REPLACE operations */ + int nGenerated = 0; /* Number of generated columns with NOT NULL */ + while(1){ /* Make 2 passes over columns. Exit loop via "break" */ + for(i=0; iaCol[i]; /* The column to check for NOT NULL */ + int isGenerated; /* non-zero if column is generated */ + onError = pCol->notNull; + if( onError==OE_None ) continue; /* No NOT NULL on this column */ + if( i==pTab->iPKey ){ + continue; /* ROWID is never NULL */ + } + isGenerated = pCol->colFlags & COLFLAG_GENERATED; + if( isGenerated && !b2ndPass ){ + nGenerated++; + continue; /* Generated columns processed on 2nd pass */ + } + if( aiChng && aiChng[i]<0 && !isGenerated ){ + /* Do not check NOT NULL on columns that do not change */ + continue; + } + if( overrideError!=OE_Default ){ + onError = overrideError; + }else if( onError==OE_Default ){ + onError = OE_Abort; + } + if( onError==OE_Replace ){ + if( b2ndPass /* REPLACE becomes ABORT on the 2nd pass */ + || pCol->pDflt==0 /* REPLACE is ABORT if no DEFAULT value */ + ){ + testcase( pCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pCol->colFlags & COLFLAG_STORED ); + testcase( pCol->colFlags & COLFLAG_GENERATED ); + onError = OE_Abort; + }else{ + assert( !isGenerated ); + } + }else if( b2ndPass && !isGenerated ){ + continue; + } + assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail + || onError==OE_Ignore || onError==OE_Replace ); + testcase( i!=sqlite3TableColumnToStorage(pTab, i) ); + iReg = sqlite3TableColumnToStorage(pTab, i) + regNewData + 1; + switch( onError ){ + case OE_Replace: { + int addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, iReg); + VdbeCoverage(v); + assert( (pCol->colFlags & COLFLAG_GENERATED)==0 ); + nSeenReplace++; + sqlite3ExprCode(pParse, pCol->pDflt, iReg); + sqlite3VdbeJumpHere(v, addr1); + break; + } + case OE_Abort: + sqlite3MayAbort(pParse); + /* Fall through */ + case OE_Rollback: + case OE_Fail: { + char *zMsg = sqlite3MPrintf(db, "%s.%s", pTab->zName, + pCol->zName); + sqlite3VdbeAddOp3(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, + onError, iReg); + sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC); + sqlite3VdbeChangeP5(v, P5_ConstraintNotNull); + VdbeCoverage(v); + break; + } + default: { + assert( onError==OE_Ignore ); + sqlite3VdbeAddOp2(v, OP_IsNull, iReg, ignoreDest); + VdbeCoverage(v); + break; + } + } /* end switch(onError) */ + } /* end loop i over columns */ + if( nGenerated==0 && nSeenReplace==0 ){ + /* If there are no generated columns with NOT NULL constraints + ** and no NOT NULL ON CONFLICT REPLACE constraints, then a single + ** pass is sufficient */ break; } - default: { - assert( onError==OE_Replace ); - addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regNewData+1+i); - VdbeCoverage(v); - sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); - sqlite3VdbeJumpHere(v, addr1); - break; + if( b2ndPass ) break; /* Never need more than 2 passes */ + b2ndPass = 1; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( nSeenReplace>0 && (pTab->tabFlags & TF_HasGenerated)!=0 ){ + /* If any NOT NULL ON CONFLICT REPLACE constraints fired on the + ** first pass, recomputed values for all generated columns, as + ** those values might depend on columns affected by the REPLACE. + */ + sqlite3ComputeGeneratedColumns(pParse, regNewData+1, pTab); } - } - } +#endif + } /* end of 2-pass loop */ + } /* end if( has-not-null-constraints ) */ /* Test all CHECK constraints */ @@ -116439,16 +120794,22 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( for(i=0; inExpr; i++){ int allOk; Expr *pExpr = pCheck->a[i].pExpr; - if( aiChng && checkConstraintUnchanged(pExpr, aiChng, pkChng) ) continue; - allOk = sqlite3VdbeMakeLabel(v); + if( aiChng + && !sqlite3ExprReferencesUpdatedColumn(pExpr, aiChng, pkChng) + ){ + /* The check constraints do not reference any of the columns being + ** updated so there is no point it verifying the check constraint */ + continue; + } + allOk = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeVerifyAbortable(v, onError); sqlite3ExprIfTrue(pParse, pExpr, allOk, SQLITE_JUMPIFNULL); if( onError==OE_Ignore ){ sqlite3VdbeGoto(v, ignoreDest); }else{ - char *zName = pCheck->a[i].zName; + char *zName = pCheck->a[i].zEName; if( zName==0 ) zName = pTab->zName; - if( onError==OE_Replace ) onError = OE_Abort; /* IMP: R-15569-63625 */ + if( onError==OE_Replace ) onError = OE_Abort; /* IMP: R-26383-51744 */ sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_CHECK, onError, zName, P4_TRANSIENT, P5_ConstraintCheck); @@ -116503,11 +120864,55 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( } } + /* Determine if it is possible that triggers (either explicitly coded + ** triggers or FK resolution actions) might run as a result of deletes + ** that happen when OE_Replace conflict resolution occurs. (Call these + ** "replace triggers".) If any replace triggers run, we will need to + ** recheck all of the uniqueness constraints after they have all run. + ** But on the recheck, the resolution is OE_Abort instead of OE_Replace. + ** + ** If replace triggers are a possibility, then + ** + ** (1) Allocate register regTrigCnt and initialize it to zero. + ** That register will count the number of replace triggers that + ** fire. Constraint recheck only occurs if the number is positive. + ** (2) Initialize pTrigger to the list of all DELETE triggers on pTab. + ** (3) Initialize addrRecheck and lblRecheckOk + ** + ** The uniqueness rechecking code will create a series of tests to run + ** in a second pass. The addrRecheck and lblRecheckOk variables are + ** used to link together these tests which are separated from each other + ** in the generate bytecode. + */ + if( (db->flags & (SQLITE_RecTriggers|SQLITE_ForeignKeys))==0 ){ + /* There are not DELETE triggers nor FK constraints. No constraint + ** rechecks are needed. */ + pTrigger = 0; + regTrigCnt = 0; + }else{ + if( db->flags&SQLITE_RecTriggers ){ + pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); + regTrigCnt = pTrigger!=0 || sqlite3FkRequired(pParse, pTab, 0, 0); + }else{ + pTrigger = 0; + regTrigCnt = sqlite3FkRequired(pParse, pTab, 0, 0); + } + if( regTrigCnt ){ + /* Replace triggers might exist. Allocate the counter and + ** initialize it to zero. */ + regTrigCnt = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regTrigCnt); + VdbeComment((v, "trigger count")); + lblRecheckOk = sqlite3VdbeMakeLabel(pParse); + addrRecheck = lblRecheckOk; + } + } + /* If rowid is changing, make sure the new rowid does not previously ** exist in the table. */ if( pkChng && pPk==0 ){ - int addrRowidOk = sqlite3VdbeMakeLabel(v); + int addrRowidOk = sqlite3VdbeMakeLabel(pParse); /* Figure out what action to take in case of a rowid collision */ onError = pTab->keyConf; @@ -116592,14 +120997,12 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** to run without a statement journal if there are no indexes on the ** table. */ - Trigger *pTrigger = 0; - if( db->flags&SQLITE_RecTriggers ){ - pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); - } - if( pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0) ){ + if( regTrigCnt ){ sqlite3MultiWrite(pParse); sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, regNewData, 1, 0, OE_Replace, 1, -1); + sqlite3VdbeAddOp2(v, OP_AddImm, regTrigCnt, 1); /* incr trigger cnt */ + nReplaceTrig++; }else{ #ifdef SQLITE_ENABLE_PREUPDATE_HOOK assert( HasRowid(pTab) ); @@ -116649,6 +121052,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( int regR; /* Range of registers holding conflicting PK */ int iThisCur; /* Cursor for this UNIQUE index */ int addrUniqueOk; /* Jump here if the UNIQUE constraint is satisfied */ + int addrConflictCk; /* First opcode in the conflict check logic */ if( aRegIdx[ix]==0 ) continue; /* Skip indices that do not change */ if( pUpIdx==pIdx ){ @@ -116657,7 +121061,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( VdbeComment((v, "Skip upsert subroutine")); sqlite3VdbeJumpHere(v, upsertJump); }else{ - addrUniqueOk = sqlite3VdbeMakeLabel(v); + addrUniqueOk = sqlite3VdbeMakeLabel(pParse); } if( bAffinityDone==0 && (pUpIdx==0 || pUpIdx==pIdx) ){ sqlite3TableAffinity(v, pTab, regNewData+1); @@ -116688,21 +121092,25 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( sqlite3ExprCodeCopy(pParse, pIdx->aColExpr->a[i].pExpr, regIdx+i); pParse->iSelfTab = 0; VdbeComment((v, "%s column %d", pIdx->zName, i)); + }else if( iField==XN_ROWID || iField==pTab->iPKey ){ + x = regNewData; + sqlite3VdbeAddOp2(v, OP_IntCopy, x, regIdx+i); + VdbeComment((v, "rowid")); }else{ - if( iField==XN_ROWID || iField==pTab->iPKey ){ - x = regNewData; - }else{ - x = iField + regNewData + 1; - } - sqlite3VdbeAddOp2(v, iField<0 ? OP_IntCopy : OP_SCopy, x, regIdx+i); - VdbeComment((v, "%s", iField<0 ? "rowid" : pTab->aCol[iField].zName)); + testcase( sqlite3TableColumnToStorage(pTab, iField)!=iField ); + x = sqlite3TableColumnToStorage(pTab, iField) + regNewData + 1; + sqlite3VdbeAddOp2(v, OP_SCopy, x, regIdx+i); + VdbeComment((v, "%s", pTab->aCol[iField].zName)); } } sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn, aRegIdx[ix]); VdbeComment((v, "for %s", pIdx->zName)); #ifdef SQLITE_ENABLE_NULL_TRIM - if( pIdx->idxType==2 ) sqlite3SetMakeRecordP5(v, pIdx->pTable); + if( pIdx->idxType==SQLITE_IDXTYPE_PRIMARYKEY ){ + sqlite3SetMakeRecordP5(v, pIdx->pTable); + } #endif + sqlite3VdbeReleaseRegisters(pParse, regIdx, pIdx->nColumn, 0, 0); /* In an UPDATE operation, if this index is the PRIMARY KEY index ** of a WITHOUT ROWID table and there has been no change the @@ -116740,7 +121148,11 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** (3) There are no secondary indexes on the table ** (4) No delete triggers need to be fired if there is a conflict ** (5) No FK constraint counters need to be updated if a conflict occurs. - */ + ** + ** This is not possible for ENABLE_PREUPDATE_HOOK builds, as the row + ** must be explicitly deleted in order to ensure any pre-update hook + ** is invoked. */ +#ifndef SQLITE_ENABLE_PREUPDATE_HOOK if( (ix==0 && pIdx->pNext==0) /* Condition 3 */ && pPk==pIdx /* Condition 2 */ && onError==OE_Replace /* Condition 1 */ @@ -116752,11 +121164,13 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( sqlite3VdbeResolveLabel(v, addrUniqueOk); continue; } +#endif /* ifndef SQLITE_ENABLE_PREUPDATE_HOOK */ /* Check to see if the new index entry will be unique */ sqlite3VdbeVerifyAbortable(v, onError); - sqlite3VdbeAddOp4Int(v, OP_NoConflict, iThisCur, addrUniqueOk, - regIdx, pIdx->nKeyCol); VdbeCoverage(v); + addrConflictCk = + sqlite3VdbeAddOp4Int(v, OP_NoConflict, iThisCur, addrUniqueOk, + regIdx, pIdx->nKeyCol); VdbeCoverage(v); /* Generate code to handle collisions */ regR = (pIdx==pPk) ? regIdx : sqlite3GetTempRange(pParse, nPkField); @@ -116777,7 +121191,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( if( pIdx!=pPk ){ for(i=0; inKeyCol; i++){ assert( pPk->aiColumn[i]>=0 ); - x = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]); + x = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[i]); sqlite3VdbeAddOp3(v, OP_Column, iThisCur, x, regR+i); VdbeComment((v, "%s.%s", pTab->zName, pTab->aCol[pPk->aiColumn[i]].zName)); @@ -116803,6 +121217,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( addrJump = addrUniqueOk; op = OP_Eq; } + x = sqlite3TableColumnToStorage(pTab, x); sqlite3VdbeAddOp4(v, op, regOldData+1+x, addrJump, regCmp+i, p4, P4_COLLSEQ ); @@ -116839,17 +121254,71 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( break; } default: { - Trigger *pTrigger = 0; + int nConflictCk; /* Number of opcodes in conflict check logic */ + assert( onError==OE_Replace ); - if( db->flags&SQLITE_RecTriggers ){ - pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); - } - if( pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0) ){ + nConflictCk = sqlite3VdbeCurrentAddr(v) - addrConflictCk; + assert( nConflictCk>0 ); + testcase( nConflictCk>1 ); + if( regTrigCnt ){ sqlite3MultiWrite(pParse); + nReplaceTrig++; + } + if( pTrigger && isUpdate ){ + sqlite3VdbeAddOp1(v, OP_CursorLock, iDataCur); } sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, regR, nPkField, 0, OE_Replace, (pIdx==pPk ? ONEPASS_SINGLE : ONEPASS_OFF), iThisCur); + if( pTrigger && isUpdate ){ + sqlite3VdbeAddOp1(v, OP_CursorUnlock, iDataCur); + } + if( regTrigCnt ){ + int addrBypass; /* Jump destination to bypass recheck logic */ + + sqlite3VdbeAddOp2(v, OP_AddImm, regTrigCnt, 1); /* incr trigger cnt */ + addrBypass = sqlite3VdbeAddOp0(v, OP_Goto); /* Bypass recheck */ + VdbeComment((v, "bypass recheck")); + + /* Here we insert code that will be invoked after all constraint + ** checks have run, if and only if one or more replace triggers + ** fired. */ + sqlite3VdbeResolveLabel(v, lblRecheckOk); + lblRecheckOk = sqlite3VdbeMakeLabel(pParse); + if( pIdx->pPartIdxWhere ){ + /* Bypass the recheck if this partial index is not defined + ** for the current row */ + sqlite3VdbeAddOp2(v, OP_IsNull, regIdx-1, lblRecheckOk); + VdbeCoverage(v); + } + /* Copy the constraint check code from above, except change + ** the constraint-ok jump destination to be the address of + ** the next retest block */ + while( nConflictCk>0 ){ + VdbeOp x; /* Conflict check opcode to copy */ + /* The sqlite3VdbeAddOp4() call might reallocate the opcode array. + ** Hence, make a complete copy of the opcode, rather than using + ** a pointer to the opcode. */ + x = *sqlite3VdbeGetOp(v, addrConflictCk); + if( x.opcode!=OP_IdxRowid ){ + int p2; /* New P2 value for copied conflict check opcode */ + if( sqlite3OpcodeProperty[x.opcode]&OPFLG_JUMP ){ + p2 = lblRecheckOk; + }else{ + p2 = x.p2; + } + sqlite3VdbeAddOp4(v, x.opcode, x.p1, p2, x.p3, x.p4.z, x.p4type); + sqlite3VdbeChangeP5(v, x.p5); + VdbeCoverageIf(v, p2!=x.p2); + } + nConflictCk--; + addrConflictCk++; + } + /* If the retest fails, issue an abort */ + sqlite3UniqueConstraint(pParse, OE_Abort, pIdx); + + sqlite3VdbeJumpHere(v, addrBypass); /* Terminate the recheck bypass */ + } seenReplace = 1; break; } @@ -116865,11 +121334,41 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( /* If the IPK constraint is a REPLACE, run it last */ if( ipkTop ){ - sqlite3VdbeGoto(v, ipkTop+1); + sqlite3VdbeGoto(v, ipkTop); VdbeComment((v, "Do IPK REPLACE")); sqlite3VdbeJumpHere(v, ipkBottom); } + /* Recheck all uniqueness constraints after replace triggers have run */ + testcase( regTrigCnt!=0 && nReplaceTrig==0 ); + assert( regTrigCnt!=0 || nReplaceTrig==0 ); + if( nReplaceTrig ){ + sqlite3VdbeAddOp2(v, OP_IfNot, regTrigCnt, lblRecheckOk);VdbeCoverage(v); + if( !pPk ){ + if( isUpdate ){ + sqlite3VdbeAddOp3(v, OP_Eq, regNewData, addrRecheck, regOldData); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + VdbeCoverage(v); + } + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, addrRecheck, regNewData); + VdbeCoverage(v); + sqlite3RowidConstraint(pParse, OE_Abort, pTab); + }else{ + sqlite3VdbeGoto(v, addrRecheck); + } + sqlite3VdbeResolveLabel(v, lblRecheckOk); + } + + /* Generate the table record */ + if( HasRowid(pTab) ){ + int regRec = aRegIdx[ix]; + sqlite3VdbeAddOp3(v, OP_MakeRecord, regNewData+1, pTab->nNVCol, regRec); + sqlite3SetMakeRecordP5(v, pTab); + if( !bAffinityDone ){ + sqlite3TableAffinity(v, pTab, 0); + } + } + *pbMayReplace = seenReplace; VdbeModuleComment((v, "END: GenCnstCks(%d)", seenReplace)); } @@ -116919,10 +121418,7 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion( Vdbe *v; /* Prepared statements under construction */ Index *pIdx; /* An index being inserted or updated */ u8 pik_flags; /* flag values passed to the btree insert */ - int regData; /* Content registers (after the rowid) */ - int regRec; /* Register holding assembled record for the table */ int i; /* Loop counter */ - u8 bAffinityDone = 0; /* True if OP_Affinity has been run already */ assert( update_flags==0 || update_flags==OPFLAG_ISUPDATE @@ -116933,8 +121429,11 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion( assert( v!=0 ); assert( pTab->pSelect==0 ); /* This table is not a VIEW */ for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ + /* All REPLACE indexes are at the end of the list */ + assert( pIdx->onError!=OE_Replace + || pIdx->pNext==0 + || pIdx->pNext->onError==OE_Replace ); if( aRegIdx[i]==0 ) continue; - bAffinityDone = 1; if( pIdx->pPartIdxWhere ){ sqlite3VdbeAddOp2(v, OP_IsNull, aRegIdx[i], sqlite3VdbeCurrentAddr(v)+2); VdbeCoverage(v); @@ -116946,10 +121445,13 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion( pik_flags |= (update_flags & OPFLAG_SAVEPOSITION); #ifdef SQLITE_ENABLE_PREUPDATE_HOOK if( update_flags==0 ){ - sqlite3VdbeAddOp4(v, OP_InsertInt, - iIdxCur+i, aRegIdx[i], 0, (char*)pTab, P4_TABLE + int r = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_Integer, 0, r); + sqlite3VdbeAddOp4(v, OP_Insert, + iIdxCur+i, aRegIdx[i], r, (char*)pTab, P4_TABLE ); sqlite3VdbeChangeP5(v, OPFLAG_ISNOOP); + sqlite3ReleaseTempReg(pParse, r); } #endif } @@ -116959,13 +121461,6 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion( sqlite3VdbeChangeP5(v, pik_flags); } if( !HasRowid(pTab) ) return; - regData = regNewData + 1; - regRec = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp3(v, OP_MakeRecord, regData, pTab->nCol, regRec); - sqlite3SetMakeRecordP5(v, pTab); - if( !bAffinityDone ){ - sqlite3TableAffinity(v, pTab, 0); - } if( pParse->nested ){ pik_flags = 0; }else{ @@ -116978,7 +121473,7 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion( if( useSeekResult ){ pik_flags |= OPFLAG_USESEEKRESULT; } - sqlite3VdbeAddOp3(v, OP_Insert, iDataCur, regRec, regNewData); + sqlite3VdbeAddOp3(v, OP_Insert, iDataCur, aRegIdx[i], regNewData); if( !pParse->nested ){ sqlite3VdbeAppendP4(v, pTab, P4_TABLE); } @@ -117088,7 +121583,7 @@ static int xferCompatibleIndex(Index *pDest, Index *pSrc){ int i; assert( pDest && pSrc ); assert( pDest->pTable!=pSrc->pTable ); - if( pDest->nKeyCol!=pSrc->nKeyCol ){ + if( pDest->nKeyCol!=pSrc->nKeyCol || pDest->nColumn!=pSrc->nColumn ){ return 0; /* Different number of columns */ } if( pDest->onError!=pSrc->onError ){ @@ -117235,7 +121730,8 @@ static int xferOptimization( if( pSrc==0 ){ return 0; /* FROM clause does not contain a real table */ } - if( pSrc==pDest ){ + if( pSrc->tnum==pDest->tnum && pSrc->pSchema==pDest->pSchema ){ + testcase( pSrc!=pDest ); /* Possible due to bad sqlite_master.rootpage */ return 0; /* tab1 and tab2 may not be the same table */ } if( HasRowid(pDest)!=HasRowid(pSrc) ){ @@ -117264,6 +121760,39 @@ static int xferOptimization( ){ return 0; /* Neither table may have __hidden__ columns */ } +#endif +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + /* Even if tables t1 and t2 have identical schemas, if they contain + ** generated columns, then this statement is semantically incorrect: + ** + ** INSERT INTO t2 SELECT * FROM t1; + ** + ** The reason is that generated column values are returned by the + ** the SELECT statement on the right but the INSERT statement on the + ** left wants them to be omitted. + ** + ** Nevertheless, this is a useful notational shorthand to tell SQLite + ** to do a bulk transfer all of the content from t1 over to t2. + ** + ** We could, in theory, disable this (except for internal use by the + ** VACUUM command where it is actually needed). But why do that? It + ** seems harmless enough, and provides a useful service. + */ + if( (pDestCol->colFlags & COLFLAG_GENERATED) != + (pSrcCol->colFlags & COLFLAG_GENERATED) ){ + return 0; /* Both columns have the same generated-column type */ + } + /* But the transfer is only allowed if both the source and destination + ** tables have the exact same expressions for generated columns. + ** This requirement could be relaxed for VIRTUAL columns, I suppose. + */ + if( (pDestCol->colFlags & COLFLAG_GENERATED)!=0 ){ + if( sqlite3ExprCompare(0, pSrcCol->pDflt, pDestCol->pDflt, -1)!=0 ){ + testcase( pDestCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pDestCol->colFlags & COLFLAG_STORED ); + return 0; /* Different generator expressions */ + } + } #endif if( pDestCol->affinity!=pSrcCol->affinity ){ return 0; /* Affinity must be the same on all columns */ @@ -117275,7 +121804,7 @@ static int xferOptimization( return 0; /* tab2 must be NOT NULL if tab1 is */ } /* Default values for second and subsequent columns need to match. */ - if( i>0 ){ + if( (pDestCol->colFlags & COLFLAG_GENERATED)==0 && i>0 ){ assert( pDestCol->pDflt==0 || pDestCol->pDflt->op==TK_SPAN ); assert( pSrcCol->pDflt==0 || pSrcCol->pDflt->op==TK_SPAN ); if( (pDestCol->pDflt==0)!=(pSrcCol->pDflt==0) @@ -117296,6 +121825,13 @@ static int xferOptimization( if( pSrcIdx==0 ){ return 0; /* pDestIdx has no corresponding index in pSrc */ } + if( pSrcIdx->tnum==pDestIdx->tnum && pSrc->pSchema==pDest->pSchema + && sqlite3FaultSim(411)==SQLITE_OK ){ + /* The sqlite3FaultSim() call allows this corruption test to be + ** bypassed during testing, in order to exercise other corruption tests + ** further downstream. */ + return 0; /* Corrupt schema - two indexes on the same btree */ + } } #ifndef SQLITE_OMIT_CHECK if( pDest->pCheck && sqlite3ExprListCompare(pSrc->pCheck,pDest->pCheck,-1) ){ @@ -117373,7 +121909,7 @@ static int xferOptimization( sqlite3RowidConstraint(pParse, onError, pDest); sqlite3VdbeJumpHere(v, addr2); autoIncStep(pParse, regAutoinc, regRowid); - }else if( pDest->pIndex==0 ){ + }else if( pDest->pIndex==0 && !(db->mDbFlags & DBFLAG_VacuumInto) ){ addr1 = sqlite3VdbeAddOp2(v, OP_NewRowid, iDest, regRowid); }else{ addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); @@ -117436,7 +121972,7 @@ static int xferOptimization( sqlite3VdbeAddOp1(v, OP_SeekEnd, iDest); } } - if( !HasRowid(pSrc) && pDestIdx->idxType==2 ){ + if( !HasRowid(pSrc) && pDestIdx->idxType==SQLITE_IDXTYPE_PRIMARYKEY ){ idxInsFlags |= OPFLAG_NCHANGE; } sqlite3VdbeAddOp2(v, OP_IdxInsert, iDest, regData); @@ -117511,7 +122047,7 @@ SQLITE_API int sqlite3_exec( sqlite3_mutex_enter(db->mutex); sqlite3Error(db, SQLITE_OK); while( rc==SQLITE_OK && zSql[0] ){ - int nCol; + int nCol = 0; char **azVals = 0; pStmt = 0; @@ -117525,9 +122061,7 @@ SQLITE_API int sqlite3_exec( zSql = zLeftover; continue; } - callbackIsInit = 0; - nCol = sqlite3_column_count(pStmt); while( 1 ){ int i; @@ -117538,6 +122072,7 @@ SQLITE_API int sqlite3_exec( (SQLITE_DONE==rc && !callbackIsInit && db->flags&SQLITE_NullCallback)) ){ if( !callbackIsInit ){ + nCol = sqlite3_column_count(pStmt); azCols = sqlite3DbMallocRaw(db, (2*nCol+1)*sizeof(const char*)); if( azCols==0 ){ goto exec_out; @@ -117940,12 +122475,26 @@ struct sqlite3_api_routines { int (*str_errcode)(sqlite3_str*); int (*str_length)(sqlite3_str*); char *(*str_value)(sqlite3_str*); + /* Version 3.25.0 and later */ int (*create_window_function)(sqlite3*,const char*,int,int,void*, void (*xStep)(sqlite3_context*,int,sqlite3_value**), void (*xFinal)(sqlite3_context*), void (*xValue)(sqlite3_context*), void (*xInv)(sqlite3_context*,int,sqlite3_value**), void(*xDestroy)(void*)); + /* Version 3.26.0 and later */ + const char *(*normalized_sql)(sqlite3_stmt*); + /* Version 3.28.0 and later */ + int (*stmt_isexplain)(sqlite3_stmt*); + int (*value_frombind)(sqlite3_value*); + /* Version 3.30.0 and later */ + int (*drop_modules)(sqlite3*,const char**); + /* Version 3.31.0 and later */ + sqlite3_int64 (*hard_heap_limit64)(sqlite3_int64); + const char *(*uri_key)(const char*,int); + const char *(*filename_database)(const char*); + const char *(*filename_journal)(const char*); + const char *(*filename_wal)(const char*); }; /* @@ -118233,6 +122782,19 @@ typedef int (*sqlite3_loadext_entry)( #define sqlite3_str_value sqlite3_api->str_value /* Version 3.25.0 and later */ #define sqlite3_create_window_function sqlite3_api->create_window_function +/* Version 3.26.0 and later */ +#define sqlite3_normalized_sql sqlite3_api->normalized_sql +/* Version 3.28.0 and later */ +#define sqlite3_stmt_isexplain sqlite3_api->stmt_isexplain +#define sqlite3_value_frombind sqlite3_api->value_frombind +/* Version 3.30.0 and later */ +#define sqlite3_drop_modules sqlite3_api->drop_modules +/* Version 3.31.0 and later */ +#define sqlite3_hard_heap_limit64 sqlite3_api->hard_heap_limit64 +#define sqlite3_uri_key sqlite3_api->uri_key +#define sqlite3_filename_database sqlite3_api->filename_database +#define sqlite3_filename_journal sqlite3_api->filename_journal +#define sqlite3_filename_wal sqlite3_api->filename_wal #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) @@ -118321,6 +122883,7 @@ typedef int (*sqlite3_loadext_entry)( # define sqlite3_declare_vtab 0 # define sqlite3_vtab_config 0 # define sqlite3_vtab_on_conflict 0 +# define sqlite3_vtab_collation 0 #endif #ifdef SQLITE_OMIT_SHARED_CACHE @@ -118688,7 +123251,28 @@ static const sqlite3_api_routines sqlite3Apis = { sqlite3_str_length, sqlite3_str_value, /* Version 3.25.0 and later */ - sqlite3_create_window_function + sqlite3_create_window_function, + /* Version 3.26.0 and later */ +#ifdef SQLITE_ENABLE_NORMALIZE + sqlite3_normalized_sql, +#else + 0, +#endif + /* Version 3.28.0 and later */ + sqlite3_stmt_isexplain, + sqlite3_value_frombind, + /* Version 3.30.0 and later */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + sqlite3_drop_modules, +#else + 0, +#endif + /* Version 3.31.0 and later */ + sqlite3_hard_heap_limit64, + sqlite3_uri_key, + sqlite3_filename_database, + sqlite3_filename_journal, + sqlite3_filename_wal, }; /* @@ -118880,7 +123464,7 @@ SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff){ if( onoff ){ db->flags |= SQLITE_LoadExtension|SQLITE_LoadExtFunc; }else{ - db->flags &= ~(SQLITE_LoadExtension|SQLITE_LoadExtFunc); + db->flags &= ~(u64)(SQLITE_LoadExtension|SQLITE_LoadExtFunc); } sqlite3_mutex_leave(db->mutex); return SQLITE_OK; @@ -119111,37 +123695,35 @@ SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){ #define PragTyp_FOREIGN_KEY_CHECK 13 #define PragTyp_FOREIGN_KEY_LIST 14 #define PragTyp_FUNCTION_LIST 15 -#define PragTyp_INCREMENTAL_VACUUM 16 -#define PragTyp_INDEX_INFO 17 -#define PragTyp_INDEX_LIST 18 -#define PragTyp_INTEGRITY_CHECK 19 -#define PragTyp_JOURNAL_MODE 20 -#define PragTyp_JOURNAL_SIZE_LIMIT 21 -#define PragTyp_LOCK_PROXY_FILE 22 -#define PragTyp_LOCKING_MODE 23 -#define PragTyp_PAGE_COUNT 24 -#define PragTyp_MMAP_SIZE 25 -#define PragTyp_MODULE_LIST 26 -#define PragTyp_OPTIMIZE 27 -#define PragTyp_PAGE_SIZE 28 -#define PragTyp_PRAGMA_LIST 29 -#define PragTyp_SECURE_DELETE 30 -#define PragTyp_SHRINK_MEMORY 31 -#define PragTyp_SOFT_HEAP_LIMIT 32 -#define PragTyp_SYNCHRONOUS 33 -#define PragTyp_TABLE_INFO 34 -#define PragTyp_TEMP_STORE 35 -#define PragTyp_TEMP_STORE_DIRECTORY 36 -#define PragTyp_THREADS 37 -#define PragTyp_WAL_AUTOCHECKPOINT 38 -#define PragTyp_WAL_CHECKPOINT 39 -#define PragTyp_ACTIVATE_EXTENSIONS 40 -#define PragTyp_HEXKEY 41 +#define PragTyp_HARD_HEAP_LIMIT 16 +#define PragTyp_INCREMENTAL_VACUUM 17 +#define PragTyp_INDEX_INFO 18 +#define PragTyp_INDEX_LIST 19 +#define PragTyp_INTEGRITY_CHECK 20 +#define PragTyp_JOURNAL_MODE 21 +#define PragTyp_JOURNAL_SIZE_LIMIT 22 +#define PragTyp_LOCK_PROXY_FILE 23 +#define PragTyp_LOCKING_MODE 24 +#define PragTyp_PAGE_COUNT 25 +#define PragTyp_MMAP_SIZE 26 +#define PragTyp_MODULE_LIST 27 +#define PragTyp_OPTIMIZE 28 +#define PragTyp_PAGE_SIZE 29 +#define PragTyp_PRAGMA_LIST 30 +#define PragTyp_SECURE_DELETE 31 +#define PragTyp_SHRINK_MEMORY 32 +#define PragTyp_SOFT_HEAP_LIMIT 33 +#define PragTyp_SYNCHRONOUS 34 +#define PragTyp_TABLE_INFO 35 +#define PragTyp_TEMP_STORE 36 +#define PragTyp_TEMP_STORE_DIRECTORY 37 +#define PragTyp_THREADS 38 +#define PragTyp_WAL_AUTOCHECKPOINT 39 +#define PragTyp_WAL_CHECKPOINT 40 +#define PragTyp_ACTIVATE_EXTENSIONS 41 #define PragTyp_KEY 42 -#define PragTyp_REKEY 43 -#define PragTyp_LOCK_STATUS 44 -#define PragTyp_PARSER_TRACE 45 -#define PragTyp_STATS 46 +#define PragTyp_LOCK_STATUS 43 +#define PragTyp_STATS 44 /* Property flags associated with various pragma. */ #define PragFlg_NeedSchema 0x01 /* Force schema load before running */ @@ -119158,58 +123740,61 @@ SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){ ** result column is different from the name of the pragma */ static const char *const pragCName[] = { - /* 0 */ "cache_size", /* Used by: default_cache_size */ - /* 1 */ "cid", /* Used by: table_info */ - /* 2 */ "name", - /* 3 */ "type", - /* 4 */ "notnull", - /* 5 */ "dflt_value", - /* 6 */ "pk", - /* 7 */ "tbl", /* Used by: stats */ - /* 8 */ "idx", - /* 9 */ "wdth", - /* 10 */ "hght", - /* 11 */ "flgs", - /* 12 */ "seqno", /* Used by: index_info */ - /* 13 */ "cid", - /* 14 */ "name", + /* 0 */ "id", /* Used by: foreign_key_list */ + /* 1 */ "seq", + /* 2 */ "table", + /* 3 */ "from", + /* 4 */ "to", + /* 5 */ "on_update", + /* 6 */ "on_delete", + /* 7 */ "match", + /* 8 */ "cid", /* Used by: table_xinfo */ + /* 9 */ "name", + /* 10 */ "type", + /* 11 */ "notnull", + /* 12 */ "dflt_value", + /* 13 */ "pk", + /* 14 */ "hidden", + /* table_info reuses 8 */ /* 15 */ "seqno", /* Used by: index_xinfo */ /* 16 */ "cid", /* 17 */ "name", /* 18 */ "desc", /* 19 */ "coll", /* 20 */ "key", - /* 21 */ "seq", /* Used by: index_list */ - /* 22 */ "name", - /* 23 */ "unique", - /* 24 */ "origin", - /* 25 */ "partial", - /* 26 */ "seq", /* Used by: database_list */ - /* 27 */ "name", - /* 28 */ "file", - /* 29 */ "name", /* Used by: function_list */ - /* 30 */ "builtin", - /* 31 */ "name", /* Used by: module_list pragma_list */ - /* 32 */ "seq", /* Used by: collation_list */ + /* 21 */ "name", /* Used by: function_list */ + /* 22 */ "builtin", + /* 23 */ "type", + /* 24 */ "enc", + /* 25 */ "narg", + /* 26 */ "flags", + /* 27 */ "tbl", /* Used by: stats */ + /* 28 */ "idx", + /* 29 */ "wdth", + /* 30 */ "hght", + /* 31 */ "flgs", + /* 32 */ "seq", /* Used by: index_list */ /* 33 */ "name", - /* 34 */ "id", /* Used by: foreign_key_list */ - /* 35 */ "seq", - /* 36 */ "table", - /* 37 */ "from", - /* 38 */ "to", - /* 39 */ "on_update", - /* 40 */ "on_delete", - /* 41 */ "match", - /* 42 */ "table", /* Used by: foreign_key_check */ - /* 43 */ "rowid", - /* 44 */ "parent", - /* 45 */ "fkid", - /* 46 */ "busy", /* Used by: wal_checkpoint */ - /* 47 */ "log", - /* 48 */ "checkpointed", - /* 49 */ "timeout", /* Used by: busy_timeout */ - /* 50 */ "database", /* Used by: lock_status */ - /* 51 */ "status", + /* 34 */ "unique", + /* 35 */ "origin", + /* 36 */ "partial", + /* 37 */ "table", /* Used by: foreign_key_check */ + /* 38 */ "rowid", + /* 39 */ "parent", + /* 40 */ "fkid", + /* index_info reuses 15 */ + /* 41 */ "seq", /* Used by: database_list */ + /* 42 */ "name", + /* 43 */ "file", + /* 44 */ "busy", /* Used by: wal_checkpoint */ + /* 45 */ "log", + /* 46 */ "checkpointed", + /* collation_list reuses 32 */ + /* 47 */ "database", /* Used by: lock_status */ + /* 48 */ "status", + /* 49 */ "cache_size", /* Used by: default_cache_size */ + /* module_list pragma_list reuses 9 */ + /* 50 */ "timeout", /* Used by: busy_timeout */ }; /* Definitions of all built-in pragmas */ @@ -119219,7 +123804,7 @@ typedef struct PragmaName { u8 mPragFlg; /* Zero or more PragFlg_XXX values */ u8 iPragCName; /* Start of column names in pragCName[] */ u8 nPragCName; /* Num of col names. 0 means use pragma name */ - u32 iArg; /* Extra argument */ + u64 iArg; /* Extra argument */ } PragmaName; static const PragmaName aPragmaName[] = { #if defined(SQLITE_HAS_CODEC) || defined(SQLITE_ENABLE_CEROD) @@ -119255,7 +123840,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "busy_timeout", /* ePragTyp: */ PragTyp_BUSY_TIMEOUT, /* ePragFlg: */ PragFlg_Result0, - /* ColNames: */ 49, 1, + /* ColNames: */ 50, 1, /* iArg: */ 0 }, #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) {/* zName: */ "cache_size", @@ -119271,11 +123856,13 @@ static const PragmaName aPragmaName[] = { /* ColNames: */ 0, 0, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA) {/* zName: */ "case_sensitive_like", /* ePragTyp: */ PragTyp_CASE_SENSITIVE_LIKE, /* ePragFlg: */ PragFlg_NoColumns, /* ColNames: */ 0, 0, /* iArg: */ 0 }, +#endif {/* zName: */ "cell_size_check", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, @@ -119327,14 +123914,14 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "database_list", /* ePragTyp: */ PragTyp_DATABASE_LIST, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0, - /* ColNames: */ 26, 3, + /* ColNames: */ 41, 3, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "default_cache_size", /* ePragTyp: */ PragTyp_DEFAULT_CACHE_SIZE, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, - /* ColNames: */ 0, 1, + /* ColNames: */ 49, 1, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) @@ -119364,14 +123951,14 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "foreign_key_check", /* ePragTyp: */ PragTyp_FOREIGN_KEY_CHECK, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0, - /* ColNames: */ 42, 4, + /* ColNames: */ 37, 4, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FOREIGN_KEY) {/* zName: */ "foreign_key_list", /* ePragTyp: */ PragTyp_FOREIGN_KEY_LIST, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, - /* ColNames: */ 34, 8, + /* ColNames: */ 0, 8, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) @@ -119403,25 +123990,30 @@ static const PragmaName aPragmaName[] = { /* iArg: */ SQLITE_FullFSync }, #endif #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) -#if defined(SQLITE_INTROSPECTION_PRAGMAS) +#if !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) {/* zName: */ "function_list", /* ePragTyp: */ PragTyp_FUNCTION_LIST, /* ePragFlg: */ PragFlg_Result0, - /* ColNames: */ 29, 2, + /* ColNames: */ 21, 6, /* iArg: */ 0 }, #endif #endif + {/* zName: */ "hard_heap_limit", + /* ePragTyp: */ PragTyp_HARD_HEAP_LIMIT, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #if defined(SQLITE_HAS_CODEC) {/* zName: */ "hexkey", - /* ePragTyp: */ PragTyp_HEXKEY, + /* ePragTyp: */ PragTyp_KEY, /* ePragFlg: */ 0, /* ColNames: */ 0, 0, - /* iArg: */ 0 }, + /* iArg: */ 2 }, {/* zName: */ "hexrekey", - /* ePragTyp: */ PragTyp_HEXKEY, + /* ePragTyp: */ PragTyp_KEY, /* ePragFlg: */ 0, /* ColNames: */ 0, 0, - /* iArg: */ 0 }, + /* iArg: */ 3 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_CHECK) @@ -119443,12 +124035,12 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "index_info", /* ePragTyp: */ PragTyp_INDEX_INFO, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, - /* ColNames: */ 12, 3, + /* ColNames: */ 15, 3, /* iArg: */ 0 }, {/* zName: */ "index_list", /* ePragTyp: */ PragTyp_INDEX_LIST, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, - /* ColNames: */ 21, 5, + /* ColNames: */ 32, 5, /* iArg: */ 0 }, {/* zName: */ "index_xinfo", /* ePragTyp: */ PragTyp_INDEX_INFO, @@ -119488,11 +124080,6 @@ static const PragmaName aPragmaName[] = { /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ SQLITE_LegacyAlter }, - {/* zName: */ "legacy_file_format", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, - /* ColNames: */ 0, 0, - /* iArg: */ SQLITE_LegacyFileFmt }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE {/* zName: */ "lock_proxy_file", @@ -119505,7 +124092,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "lock_status", /* ePragTyp: */ PragTyp_LOCK_STATUS, /* ePragFlg: */ PragFlg_Result0, - /* ColNames: */ 50, 2, + /* ColNames: */ 47, 2, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) @@ -119527,11 +124114,11 @@ static const PragmaName aPragmaName[] = { #endif #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) #if !defined(SQLITE_OMIT_VIRTUALTABLE) -#if defined(SQLITE_INTROSPECTION_PRAGMAS) +#if !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) {/* zName: */ "module_list", /* ePragTyp: */ PragTyp_MODULE_LIST, /* ePragFlg: */ PragFlg_Result0, - /* ColNames: */ 31, 1, + /* ColNames: */ 9, 1, /* iArg: */ 0 }, #endif #endif @@ -119553,18 +124140,20 @@ static const PragmaName aPragmaName[] = { /* ColNames: */ 0, 0, /* iArg: */ 0 }, #endif -#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_PARSER_TRACE) +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if defined(SQLITE_DEBUG) {/* zName: */ "parser_trace", - /* ePragTyp: */ PragTyp_PARSER_TRACE, - /* ePragFlg: */ 0, + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, - /* iArg: */ 0 }, + /* iArg: */ SQLITE_ParserTrace }, #endif -#if defined(SQLITE_INTROSPECTION_PRAGMAS) +#endif +#if !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) {/* zName: */ "pragma_list", /* ePragTyp: */ PragTyp_PRAGMA_LIST, /* ePragFlg: */ PragFlg_Result0, - /* ColNames: */ 31, 1, + /* ColNames: */ 9, 1, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) @@ -119595,10 +124184,10 @@ static const PragmaName aPragmaName[] = { #endif #if defined(SQLITE_HAS_CODEC) {/* zName: */ "rekey", - /* ePragTyp: */ PragTyp_REKEY, + /* ePragTyp: */ PragTyp_KEY, /* ePragFlg: */ 0, /* ColNames: */ 0, 0, - /* iArg: */ 0 }, + /* iArg: */ 1 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) {/* zName: */ "reverse_unordered_selects", @@ -119651,7 +124240,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "stats", /* ePragTyp: */ PragTyp_STATS, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, - /* ColNames: */ 7, 5, + /* ColNames: */ 27, 5, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) @@ -119665,8 +124254,13 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "table_info", /* ePragTyp: */ PragTyp_TABLE_INFO, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, - /* ColNames: */ 1, 6, + /* ColNames: */ 8, 6, /* iArg: */ 0 }, + {/* zName: */ "table_xinfo", + /* ePragTyp: */ PragTyp_TABLE_INFO, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 8, 7, + /* iArg: */ 1 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) {/* zName: */ "temp_store", @@ -119679,12 +124273,31 @@ static const PragmaName aPragmaName[] = { /* ePragFlg: */ PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ 0 }, +#endif +#if defined(SQLITE_HAS_CODEC) + {/* zName: */ "textkey", + /* ePragTyp: */ PragTyp_KEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 4 }, + {/* zName: */ "textrekey", + /* ePragTyp: */ PragTyp_KEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 5 }, #endif {/* zName: */ "threads", /* ePragTyp: */ PragTyp_THREADS, /* ePragFlg: */ PragFlg_Result0, /* ColNames: */ 0, 0, /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "trusted_schema", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_TrustedSchema }, +#endif #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) {/* zName: */ "user_version", /* ePragTyp: */ PragTyp_HEADER_VALUE, @@ -119730,7 +124343,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "wal_checkpoint", /* ePragTyp: */ PragTyp_WAL_CHECKPOINT, /* ePragFlg: */ PragFlg_NeedSchema, - /* ColNames: */ 46, 3, + /* ColNames: */ 44, 3, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) @@ -119738,10 +124351,10 @@ static const PragmaName aPragmaName[] = { /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, - /* iArg: */ SQLITE_WriteSchema }, + /* iArg: */ SQLITE_WriteSchema|SQLITE_NoSchemaError }, #endif }; -/* Number of pragmas: 61 on by default, 78 total. */ +/* Number of pragmas: 66 on by default, 82 total. */ /************** End of pragma.h **********************************************/ /************** Continuing where we left off in pragma.c *********************/ @@ -120011,6 +124624,55 @@ static const PragmaName *pragmaLocate(const char *zName){ return lwr>upr ? 0 : &aPragmaName[mid]; } +/* +** Create zero or more entries in the output for the SQL functions +** defined by FuncDef p. +*/ +static void pragmaFunclistLine( + Vdbe *v, /* The prepared statement being created */ + FuncDef *p, /* A particular function definition */ + int isBuiltin, /* True if this is a built-in function */ + int showInternFuncs /* True if showing internal functions */ +){ + for(; p; p=p->pNext){ + const char *zType; + static const u32 mask = + SQLITE_DETERMINISTIC | + SQLITE_DIRECTONLY | + SQLITE_SUBTYPE | + SQLITE_INNOCUOUS | + SQLITE_FUNC_INTERNAL + ; + static const char *azEnc[] = { 0, "utf8", "utf16le", "utf16be" }; + + assert( SQLITE_FUNC_ENCMASK==0x3 ); + assert( strcmp(azEnc[SQLITE_UTF8],"utf8")==0 ); + assert( strcmp(azEnc[SQLITE_UTF16LE],"utf16le")==0 ); + assert( strcmp(azEnc[SQLITE_UTF16BE],"utf16be")==0 ); + + if( p->xSFunc==0 ) continue; + if( (p->funcFlags & SQLITE_FUNC_INTERNAL)!=0 + && showInternFuncs==0 + ){ + continue; + } + if( p->xValue!=0 ){ + zType = "w"; + }else if( p->xFinalize!=0 ){ + zType = "a"; + }else{ + zType = "s"; + } + sqlite3VdbeMultiLoad(v, 1, "sissii", + p->zName, isBuiltin, + zType, azEnc[p->funcFlags&SQLITE_FUNC_ENCMASK], + p->nArg, + (p->funcFlags & mask) ^ SQLITE_INNOCUOUS + ); + } +} + + /* ** Helper subroutine for PRAGMA integrity_check: ** @@ -120360,6 +125022,11 @@ SQLITE_PRIVATE void sqlite3Pragma( ** then do a query */ eMode = PAGER_JOURNALMODE_QUERY; } + if( eMode==PAGER_JOURNALMODE_OFF && (db->flags & SQLITE_Defensive)!=0 ){ + /* Do not allow journal-mode "OFF" in defensive since the database + ** can become corrupted using ordinary SQL when the journal is off */ + eMode = PAGER_JOURNALMODE_QUERY; + } } if( eMode==PAGER_JOURNALMODE_QUERY && pId2->n==0 ){ /* Convert "PRAGMA journal_mode" into "PRAGMA main.journal_mode" */ @@ -120532,7 +125199,7 @@ SQLITE_PRIVATE void sqlite3Pragma( if( sqlite3GetBoolean(zRight, size!=0) ){ db->flags |= SQLITE_CacheSpill; }else{ - db->flags &= ~SQLITE_CacheSpill; + db->flags &= ~(u64)SQLITE_CacheSpill; } setAllPagerFlags(db); } @@ -120753,7 +125420,7 @@ SQLITE_PRIVATE void sqlite3Pragma( setPragmaResultColumnNames(v, pPragma); returnSingleInt(v, (db->flags & pPragma->iArg)!=0 ); }else{ - int mask = pPragma->iArg; /* Mask of bits to set or clear. */ + u64 mask = pPragma->iArg; /* Mask of bits to set or clear. */ if( db->autoCommit==0 ){ /* Foreign key support may not be enabled or disabled while not ** in auto-commit mode. */ @@ -120802,17 +125469,28 @@ SQLITE_PRIVATE void sqlite3Pragma( Table *pTab; pTab = sqlite3LocateTable(pParse, LOCATE_NOERR, zRight, zDb); if( pTab ){ + int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); int i, k; int nHidden = 0; Column *pCol; Index *pPk = sqlite3PrimaryKeyIndex(pTab); - pParse->nMem = 6; - sqlite3CodeVerifySchema(pParse, iDb); + pParse->nMem = 7; + sqlite3CodeVerifySchema(pParse, iTabDb); sqlite3ViewGetColumnNames(pParse, pTab); for(i=0, pCol=pTab->aCol; inCol; i++, pCol++){ - if( IsHiddenColumn(pCol) ){ - nHidden++; - continue; + int isHidden = 0; + if( pCol->colFlags & COLFLAG_NOINSERT ){ + if( pPragma->iArg==0 ){ + nHidden++; + continue; + } + if( pCol->colFlags & COLFLAG_VIRTUAL ){ + isHidden = 2; /* GENERATED ALWAYS AS ... VIRTUAL */ + }else if( pCol->colFlags & COLFLAG_STORED ){ + isHidden = 3; /* GENERATED ALWAYS AS ... STORED */ + }else{ assert( pCol->colFlags & COLFLAG_HIDDEN ); + isHidden = 1; /* HIDDEN */ + } } if( (pCol->colFlags & COLFLAG_PRIMKEY)==0 ){ k = 0; @@ -120821,14 +125499,15 @@ SQLITE_PRIVATE void sqlite3Pragma( }else{ for(k=1; k<=pTab->nCol && pPk->aiColumn[k-1]!=i; k++){} } - assert( pCol->pDflt==0 || pCol->pDflt->op==TK_SPAN ); - sqlite3VdbeMultiLoad(v, 1, "issisi", + assert( pCol->pDflt==0 || pCol->pDflt->op==TK_SPAN || isHidden>=2 ); + sqlite3VdbeMultiLoad(v, 1, pPragma->iArg ? "issisii" : "issisi", i-nHidden, pCol->zName, sqlite3ColumnType(pCol,""), pCol->notNull ? 1 : 0, - pCol->pDflt ? pCol->pDflt->u.zToken : 0, - k); + pCol->pDflt && isHidden<2 ? pCol->pDflt->u.zToken : 0, + k, + isHidden); } } } @@ -120865,7 +125544,17 @@ SQLITE_PRIVATE void sqlite3Pragma( Index *pIdx; Table *pTab; pIdx = sqlite3FindIndex(db, zRight, zDb); + if( pIdx==0 ){ + /* If there is no index named zRight, check to see if there is a + ** WITHOUT ROWID table named zRight, and if there is, show the + ** structure of the PRIMARY KEY index for that table. */ + pTab = sqlite3LocateTable(pParse, LOCATE_NOERR, zRight, zDb); + if( pTab && !HasRowid(pTab) ){ + pIdx = sqlite3PrimaryKeyIndex(pTab); + } + } if( pIdx ){ + int iIdxDb = sqlite3SchemaToIndex(db, pIdx->pSchema); int i; int mx; if( pPragma->iArg ){ @@ -120878,7 +125567,7 @@ SQLITE_PRIVATE void sqlite3Pragma( pParse->nMem = 3; } pTab = pIdx->pTable; - sqlite3CodeVerifySchema(pParse, iDb); + sqlite3CodeVerifySchema(pParse, iIdxDb); assert( pParse->nMem<=pPragma->nPragCName ); for(i=0; iaiColumn[i]; @@ -120902,8 +125591,9 @@ SQLITE_PRIVATE void sqlite3Pragma( int i; pTab = sqlite3FindTable(db, zRight, zDb); if( pTab ){ + int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); pParse->nMem = 5; - sqlite3CodeVerifySchema(pParse, iDb); + sqlite3CodeVerifySchema(pParse, iTabDb); for(pIdx=pTab->pIndex, i=0; pIdx; pIdx=pIdx->pNext, i++){ const char *azOrigin[] = { "c", "u", "pk" }; sqlite3VdbeMultiLoad(v, 1, "isisi", @@ -120942,20 +125632,21 @@ SQLITE_PRIVATE void sqlite3Pragma( } break; -#ifdef SQLITE_INTROSPECTION_PRAGMAS +#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS case PragTyp_FUNCTION_LIST: { int i; HashElem *j; FuncDef *p; - pParse->nMem = 2; + int showInternFunc = (db->mDbFlags & DBFLAG_InternalFunc)!=0; + pParse->nMem = 6; for(i=0; iu.pHash ){ - sqlite3VdbeMultiLoad(v, 1, "si", p->zName, 1); + pragmaFunclistLine(v, p, 1, showInternFunc); } } for(j=sqliteHashFirst(&db->aFunc); j; j=sqliteHashNext(j)){ p = (FuncDef*)sqliteHashData(j); - sqlite3VdbeMultiLoad(v, 1, "si", p->zName, 0); + pragmaFunclistLine(v, p, 0, showInternFunc); } } break; @@ -120991,9 +125682,10 @@ SQLITE_PRIVATE void sqlite3Pragma( if( pTab ){ pFK = pTab->pFKey; if( pFK ){ + int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); int i = 0; pParse->nMem = 8; - sqlite3CodeVerifySchema(pParse, iDb); + sqlite3CodeVerifySchema(pParse, iTabDb); while(pFK){ int j; for(j=0; jnCol; j++){ @@ -121038,9 +125730,9 @@ SQLITE_PRIVATE void sqlite3Pragma( pParse->nMem += 4; regKey = ++pParse->nMem; regRow = ++pParse->nMem; - sqlite3CodeVerifySchema(pParse, iDb); k = sqliteHashFirst(&db->aDb[iDb].pSchema->tblHash); while( k ){ + int iTabDb; if( zRight ){ pTab = sqlite3LocateTable(pParse, 0, zRight, zDb); k = 0; @@ -121049,21 +125741,23 @@ SQLITE_PRIVATE void sqlite3Pragma( k = sqliteHashNext(k); } if( pTab==0 || pTab->pFKey==0 ) continue; - sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); + iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); + sqlite3CodeVerifySchema(pParse, iTabDb); + sqlite3TableLock(pParse, iTabDb, pTab->tnum, 0, pTab->zName); if( pTab->nCol+regRow>pParse->nMem ) pParse->nMem = pTab->nCol + regRow; - sqlite3OpenTable(pParse, 0, iDb, pTab, OP_OpenRead); + sqlite3OpenTable(pParse, 0, iTabDb, pTab, OP_OpenRead); sqlite3VdbeLoadString(v, regResult, pTab->zName); for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){ pParent = sqlite3FindTable(db, pFK->zTo, zDb); if( pParent==0 ) continue; pIdx = 0; - sqlite3TableLock(pParse, iDb, pParent->tnum, 0, pParent->zName); + sqlite3TableLock(pParse, iTabDb, pParent->tnum, 0, pParent->zName); x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, 0); if( x==0 ){ if( pIdx==0 ){ - sqlite3OpenTable(pParse, i, iDb, pParent, OP_OpenRead); + sqlite3OpenTable(pParse, i, iTabDb, pParent, OP_OpenRead); }else{ - sqlite3VdbeAddOp3(v, OP_OpenRead, i, pIdx->tnum, iDb); + sqlite3VdbeAddOp3(v, OP_OpenRead, i, pIdx->tnum, iTabDb); sqlite3VdbeSetP4KeyInfo(pParse, pIdx); } }else{ @@ -121083,7 +125777,7 @@ SQLITE_PRIVATE void sqlite3Pragma( x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, &aiCols); assert( x==0 ); } - addrOk = sqlite3VdbeMakeLabel(v); + addrOk = sqlite3VdbeMakeLabel(pParse); /* Generate code to read the child key values into registers ** regRow..regRow+n. If any of the child key values are NULL, this @@ -121128,19 +125822,7 @@ SQLITE_PRIVATE void sqlite3Pragma( #endif /* !defined(SQLITE_OMIT_TRIGGER) */ #endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ -#ifndef NDEBUG - case PragTyp_PARSER_TRACE: { - if( zRight ){ - if( sqlite3GetBoolean(zRight, 0) ){ - sqlite3ParserTrace(stdout, "parser: "); - }else{ - sqlite3ParserTrace(0, 0); - } - } - } - break; -#endif - +#ifndef SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA /* Reinstall the LIKE and GLOB functions. The variant of LIKE ** used will be case sensitive or not depending on the RHS. */ @@ -121150,6 +125832,7 @@ SQLITE_PRIVATE void sqlite3Pragma( } } break; +#endif /* SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA */ #ifndef SQLITE_INTEGRITY_CHECK_ERROR_MAX # define SQLITE_INTEGRITY_CHECK_ERROR_MAX 100 @@ -121281,7 +125964,7 @@ SQLITE_PRIVATE void sqlite3Pragma( loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1); if( !isQuick ){ /* Sanity check on record header decoding */ - sqlite3VdbeAddOp3(v, OP_Column, iDataCur, pTab->nCol-1, 3); + sqlite3VdbeAddOp3(v, OP_Column, iDataCur, pTab->nNVCol-1,3); sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); } /* Verify that all NOT NULL columns really are NOT NULL */ @@ -121291,7 +125974,9 @@ SQLITE_PRIVATE void sqlite3Pragma( if( j==pTab->iPKey ) continue; if( pTab->aCol[j].notNull==0 ) continue; sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, j, 3); - sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); + if( sqlite3VdbeGetOp(v,-1)->opcode==OP_Column ){ + sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); + } jmp2 = sqlite3VdbeAddOp1(v, OP_NotNull, 3); VdbeCoverage(v); zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName, pTab->aCol[j].zName); @@ -121303,8 +125988,8 @@ SQLITE_PRIVATE void sqlite3Pragma( if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){ ExprList *pCheck = sqlite3ExprListDup(db, pTab->pCheck, 0); if( db->mallocFailed==0 ){ - int addrCkFault = sqlite3VdbeMakeLabel(v); - int addrCkOk = sqlite3VdbeMakeLabel(v); + int addrCkFault = sqlite3VdbeMakeLabel(pParse); + int addrCkOk = sqlite3VdbeMakeLabel(pParse); char *zErr; int k; pParse->iSelfTab = iDataCur + 1; @@ -121327,7 +126012,7 @@ SQLITE_PRIVATE void sqlite3Pragma( /* Validate index entries for the current row */ for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ int jmp2, jmp3, jmp4, jmp5; - int ckUniq = sqlite3VdbeMakeLabel(v); + int ckUniq = sqlite3VdbeMakeLabel(pParse); if( pPk==pIdx ) continue; r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 0, &jmp3, pPrior, r1); @@ -121348,7 +126033,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** current key. The entry is unique if (1) any column is NULL ** or (2) the next entry has a different key */ if( IsUniqueIndex(pIdx) ){ - int uniqOk = sqlite3VdbeMakeLabel(v); + int uniqOk = sqlite3VdbeMakeLabel(pParse); int jmp6; int kk; for(kk=0; kknKeyCol; kk++){ @@ -121468,10 +126153,17 @@ SQLITE_PRIVATE void sqlite3Pragma( ** will be overwritten when the schema is next loaded. If it does not ** already exists, it will be created to use the new encoding value. */ - if( - !(DbHasProperty(db, 0, DB_SchemaLoaded)) || - DbHasProperty(db, 0, DB_Empty) - ){ + int canChangeEnc = 1; /* True if allowed to change the encoding */ + int i; /* For looping over all attached databases */ + for(i=0; inDb; i++){ + if( db->aDb[i].pBt!=0 + && DbHasProperty(db,i,DB_SchemaLoaded) + && !DbHasProperty(db,i,DB_Empty) + ){ + canChangeEnc = 0; + } + } + if( canChangeEnc ){ for(pEnc=&encnames[0]; pEnc->zName; pEnc++){ if( 0==sqlite3StrICmp(zRight, pEnc->zName) ){ SCHEMA_ENC(db) = ENC(db) = @@ -121784,6 +126476,27 @@ SQLITE_PRIVATE void sqlite3Pragma( break; } + /* + ** PRAGMA hard_heap_limit + ** PRAGMA hard_heap_limit = N + ** + ** Invoke sqlite3_hard_heap_limit64() to query or set the hard heap + ** limit. The hard heap limit can be activated or lowered by this + ** pragma, but not raised or deactivated. Only the + ** sqlite3_hard_heap_limit64() C-language API can raise or deactivate + ** the hard heap limit. This allows an application to set a heap limit + ** constraint that cannot be relaxed by an untrusted SQL script. + */ + case PragTyp_HARD_HEAP_LIMIT: { + sqlite3_int64 N; + if( zRight && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK ){ + sqlite3_int64 iPrior = sqlite3_hard_heap_limit64(-1); + if( N>0 && (iPrior==0 || iPrior>N) ) sqlite3_hard_heap_limit64(N); + } + returnSingleInt(v, sqlite3_hard_heap_limit64(-1)); + break; + } + /* ** PRAGMA threads ** PRAGMA threads = N @@ -121832,27 +126545,41 @@ SQLITE_PRIVATE void sqlite3Pragma( #endif #ifdef SQLITE_HAS_CODEC + /* Pragma iArg + ** ---------- ------ + ** key 0 + ** rekey 1 + ** hexkey 2 + ** hexrekey 3 + ** textkey 4 + ** textrekey 5 + */ case PragTyp_KEY: { - if( zRight ) sqlite3_key_v2(db, zDb, zRight, sqlite3Strlen30(zRight)); - break; - } - case PragTyp_REKEY: { - if( zRight ) sqlite3_rekey_v2(db, zDb, zRight, sqlite3Strlen30(zRight)); - break; - } - case PragTyp_HEXKEY: { if( zRight ){ - u8 iByte; - int i; - char zKey[40]; - for(i=0, iByte=0; iiArg==2 || pPragma->iArg==3 ){ + u8 iByte; + int i; + for(i=0, iByte=0; iiArg<4 ? sqlite3Strlen30(zRight) : -1; } - if( (zLeft[3] & 0xf)==0xb ){ - sqlite3_key_v2(db, zDb, zKey, i/2); + if( (pPragma->iArg & 1)==0 ){ + rc = sqlite3_key_v2(db, zDb, zKey, n); }else{ - sqlite3_rekey_v2(db, zDb, zKey, i/2); + rc = sqlite3_rekey_v2(db, zDb, zKey, n); + } + if( rc==SQLITE_OK && n!=0 ){ + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "ok", SQLITE_STATIC); + returnSingleText(v, "ok"); } } break; @@ -122179,7 +126906,8 @@ static const sqlite3_module pragmaVtabModule = { 0, /* xRename - rename the table */ 0, /* xSavepoint */ 0, /* xRelease */ - 0 /* xRollbackTo */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ }; /* @@ -122249,6 +126977,31 @@ static void corruptSchema( } } +/* +** Check to see if any sibling index (another index on the same table) +** of pIndex has the same root page number, and if it does, return true. +** This would indicate a corrupt schema. +*/ +SQLITE_PRIVATE int sqlite3IndexHasDuplicateRootPage(Index *pIndex){ + Index *p; + for(p=pIndex->pTable->pIndex; p; p=p->pNext){ + if( p->tnum==pIndex->tnum && p!=pIndex ) return 1; + } + return 0; +} + +/* forward declaration */ +static int sqlite3Prepare( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + u32 prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ + Vdbe *pReprepare, /* VM being reprepared */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +); + + /* ** This is the callback routine for the code that initializes the ** database. See sqlite3Init() below for additional information. @@ -122256,9 +127009,11 @@ static void corruptSchema( ** ** Each callback contains the following information: ** -** argv[0] = name of thing being created -** argv[1] = root page number for table or index. 0 for trigger or view. -** argv[2] = SQL text for the CREATE statement. +** argv[0] = type of object: "table", "index", "trigger", or "view". +** argv[1] = name of thing being created +** argv[2] = associated table if an index or trigger +** argv[3] = root page number for table or index. 0 for trigger or view. +** argv[4] = SQL text for the CREATE statement. ** */ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ @@ -122266,20 +127021,21 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char sqlite3 *db = pData->db; int iDb = pData->iDb; - assert( argc==3 ); + assert( argc==5 ); UNUSED_PARAMETER2(NotUsed, argc); assert( sqlite3_mutex_held(db->mutex) ); DbClearProperty(db, iDb, DB_Empty); + pData->nInitRow++; if( db->mallocFailed ){ - corruptSchema(pData, argv[0], 0); + corruptSchema(pData, argv[1], 0); return 1; } assert( iDb>=0 && iDbnDb ); if( argv==0 ) return 0; /* Might happen if EMPTY_RESULT_CALLBACKS are on */ - if( argv[1]==0 ){ - corruptSchema(pData, argv[0], 0); - }else if( sqlite3_strnicmp(argv[2],"create ",7)==0 ){ + if( argv[3]==0 ){ + corruptSchema(pData, argv[1], 0); + }else if( sqlite3_strnicmp(argv[4],"create ",7)==0 ){ /* Call the parser to process a CREATE TABLE, INDEX or VIEW. ** But because db->init.busy is set to 1, no VDBE code is generated ** or executed. All the parser does is build the internal data @@ -122292,9 +127048,11 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char assert( db->init.busy ); db->init.iDb = iDb; - db->init.newTnum = sqlite3Atoi(argv[1]); + db->init.newTnum = sqlite3Atoi(argv[3]); db->init.orphanTrigger = 0; - TESTONLY(rcp = ) sqlite3_prepare(db, argv[2], -1, &pStmt, 0); + db->init.azInit = argv; + pStmt = 0; + TESTONLY(rcp = ) sqlite3Prepare(db, argv[4], -1, 0, 0, &pStmt, 0); rc = db->errCode; assert( (rc&0xFF)==(rcp&0xFF) ); db->init.iDb = saved_iDb; @@ -122303,17 +127061,17 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char if( db->init.orphanTrigger ){ assert( iDb==1 ); }else{ - pData->rc = rc; + if( rc > pData->rc ) pData->rc = rc; if( rc==SQLITE_NOMEM ){ sqlite3OomFault(db); }else if( rc!=SQLITE_INTERRUPT && (rc&0xFF)!=SQLITE_LOCKED ){ - corruptSchema(pData, argv[0], sqlite3_errmsg(db)); + corruptSchema(pData, argv[1], sqlite3_errmsg(db)); } } } sqlite3_finalize(pStmt); - }else if( argv[0]==0 || (argv[2]!=0 && argv[2][0]!=0) ){ - corruptSchema(pData, argv[0], 0); + }else if( argv[1]==0 || (argv[4]!=0 && argv[4][0]!=0) ){ + corruptSchema(pData, argv[1], 0); }else{ /* If the SQL column is blank it means this is an index that ** was created to be the PRIMARY KEY or to fulfill a UNIQUE @@ -122322,16 +127080,13 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char ** to do here is record the root page number for that index. */ Index *pIndex; - pIndex = sqlite3FindIndex(db, argv[0], db->aDb[iDb].zDbSName); - if( pIndex==0 ){ - /* This can occur if there exists an index on a TEMP table which - ** has the same name as another index on a permanent index. Since - ** the permanent table is hidden by the TEMP table, we can also - ** safely ignore the index on the permanent table. - */ - /* Do Nothing */; - }else if( sqlite3GetInt32(argv[1], &pIndex->tnum)==0 ){ - corruptSchema(pData, argv[0], "invalid rootpage"); + pIndex = sqlite3FindIndex(db, argv[1], db->aDb[iDb].zDbSName); + if( pIndex==0 + || sqlite3GetInt32(argv[3],&pIndex->tnum)==0 + || pIndex->tnum<2 + || sqlite3IndexHasDuplicateRootPage(pIndex) + ){ + corruptSchema(pData, argv[1], pIndex?"invalid rootpage":"orphan index"); } } return 0; @@ -122352,7 +127107,7 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl int size; #endif Db *pDb; - char const *azArg[4]; + char const *azArg[6]; int meta[5]; InitData initData; const char *zMasterName; @@ -122371,17 +127126,20 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl ** table name will be inserted automatically by the parser so we can just ** use the abbreviation "x" here. The parser will also automatically tag ** the schema table as read-only. */ - azArg[0] = zMasterName = SCHEMA_TABLE(iDb); - azArg[1] = "1"; - azArg[2] = "CREATE TABLE x(type text,name text,tbl_name text," + azArg[0] = "table"; + azArg[1] = zMasterName = SCHEMA_TABLE(iDb); + azArg[2] = azArg[1]; + azArg[3] = "1"; + azArg[4] = "CREATE TABLE x(type text,name text,tbl_name text," "rootpage int,sql text)"; - azArg[3] = 0; + azArg[5] = 0; initData.db = db; initData.iDb = iDb; initData.rc = SQLITE_OK; initData.pzErrMsg = pzErrMsg; initData.mInitFlags = mFlags; - sqlite3InitCallback(&initData, 3, (char **)azArg, 0); + initData.nInitRow = 0; + sqlite3InitCallback(&initData, 5, (char **)azArg, 0); if( initData.rc ){ rc = initData.rc; goto error_out; @@ -122498,7 +127256,7 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl ** indices that the user might have created. */ if( iDb==0 && meta[BTREE_FILE_FORMAT-1]>=4 ){ - db->flags &= ~SQLITE_LegacyFileFmt; + db->flags &= ~(u64)SQLITE_LegacyFileFmt; } /* Read the schema information out of the schema tables @@ -122507,7 +127265,7 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl { char *zSql; zSql = sqlite3MPrintf(db, - "SELECT name, rootpage, sql FROM \"%w\".%s ORDER BY rowid", + "SELECT*FROM\"%w\".%s ORDER BY rowid", db->aDb[iDb].zDbSName, zMasterName); #ifndef SQLITE_OMIT_AUTHORIZATION { @@ -122532,8 +127290,8 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl rc = SQLITE_NOMEM_BKPT; sqlite3ResetAllSchemasOfConnection(db); } - if( rc==SQLITE_OK || (db->flags&SQLITE_WriteSchema)){ - /* Black magic: If the SQLITE_WriteSchema flag is set, then consider + if( rc==SQLITE_OK || (db->flags&SQLITE_NoSchemaError)){ + /* Black magic: If the SQLITE_NoSchemaError flag is set, then consider ** the schema loaded, even if errors occurred. In this situation the ** current sqlite3_prepare() operation will fail, but the following one ** will attempt to compile the supplied statement against whatever subset @@ -122715,6 +127473,7 @@ SQLITE_PRIVATE void sqlite3ParserReset(Parse *pParse){ if( db ){ assert( db->lookaside.bDisable >= pParse->disableLookaside ); db->lookaside.bDisable -= pParse->disableLookaside; + db->lookaside.sz = db->lookaside.bDisable ? 0 : db->lookaside.szTrue; } pParse->disableLookaside = 0; } @@ -122748,8 +127507,9 @@ static int sqlite3Prepare( */ if( prepFlags & SQLITE_PREPARE_PERSISTENT ){ sParse.disableLookaside++; - db->lookaside.bDisable++; + DisableLookaside; } + sParse.disableVtab = (prepFlags & SQLITE_PREPARE_NO_VTAB)!=0; /* Check to verify that it is possible to get a read lock on all ** database schemas. The inability to get a read lock indicates that @@ -122774,16 +127534,18 @@ static int sqlite3Prepare( ** but it does *not* override schema lock detection, so this all still ** works even if READ_UNCOMMITTED is set. */ - for(i=0; inDb; i++) { - Btree *pBt = db->aDb[i].pBt; - if( pBt ){ - assert( sqlite3BtreeHoldsMutex(pBt) ); - rc = sqlite3BtreeSchemaLocked(pBt); - if( rc ){ - const char *zDb = db->aDb[i].zDbSName; - sqlite3ErrorWithMsg(db, rc, "database schema is locked: %s", zDb); - testcase( db->flags & SQLITE_ReadUncommit ); - goto end_prepare; + if( !db->noSharedCache ){ + for(i=0; inDb; i++) { + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + assert( sqlite3BtreeHoldsMutex(pBt) ); + rc = sqlite3BtreeSchemaLocked(pBt); + if( rc ){ + const char *zDb = db->aDb[i].zDbSName; + sqlite3ErrorWithMsg(db, rc, "database schema is locked: %s", zDb); + testcase( db->flags & SQLITE_ReadUncommit ); + goto end_prepare; + } } } } @@ -122814,46 +127576,25 @@ static int sqlite3Prepare( } assert( 0==sParse.nQueryLoop ); - if( sParse.rc==SQLITE_DONE ) sParse.rc = SQLITE_OK; + if( sParse.rc==SQLITE_DONE ){ + sParse.rc = SQLITE_OK; + } if( sParse.checkSchema ){ schemaIsValid(&sParse); } - if( db->mallocFailed ){ - sParse.rc = SQLITE_NOMEM_BKPT; - } if( pzTail ){ *pzTail = sParse.zTail; } - rc = sParse.rc; - -#ifndef SQLITE_OMIT_EXPLAIN - if( rc==SQLITE_OK && sParse.pVdbe && sParse.explain ){ - static const char * const azColName[] = { - "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment", - "id", "parent", "notused", "detail" - }; - int iFirst, mx; - if( sParse.explain==2 ){ - sqlite3VdbeSetNumCols(sParse.pVdbe, 4); - iFirst = 8; - mx = 12; - }else{ - sqlite3VdbeSetNumCols(sParse.pVdbe, 8); - iFirst = 0; - mx = 8; - } - for(i=iFirst; iinit.busy==0 ){ sqlite3VdbeSetSql(sParse.pVdbe, zSql, (int)(sParse.zTail-zSql), prepFlags); } - if( sParse.pVdbe && (rc!=SQLITE_OK || db->mallocFailed) ){ - sqlite3VdbeFinalize(sParse.pVdbe); + if( db->mallocFailed ){ + sParse.rc = SQLITE_NOMEM_BKPT; + } + rc = sParse.rc; + if( rc!=SQLITE_OK ){ + if( sParse.pVdbe ) sqlite3VdbeFinalize(sParse.pVdbe); assert(!(*ppStmt)); }else{ *ppStmt = (sqlite3_stmt*)sParse.pVdbe; @@ -122914,6 +127655,7 @@ static int sqlite3LockAndPrepare( return rc; } + /* ** Rerun the compilation of a statement after a schema change. ** @@ -123207,7 +127949,10 @@ struct SortCtx { /* ** Delete all the content of a Select structure. Deallocate the structure -** itself only if bFree is true. +** itself depending on the value of bFree +** +** If bFree==1, call sqlite3DbFree() on the p object. +** If bFree==0, Leave the first Select object unfreed */ static void clearSelect(sqlite3 *db, Select *p, int bFree){ while( p ){ @@ -123223,6 +127968,7 @@ static void clearSelect(sqlite3 *db, Select *p, int bFree){ if( OK_IF_ALWAYS_TRUE(p->pWinDefn) ){ sqlite3WindowListDelete(db, p->pWinDefn); } + assert( p->pWin==0 ); #endif if( OK_IF_ALWAYS_TRUE(p->pWith) ) sqlite3WithDelete(db, p->pWith); if( bFree ) sqlite3DbFreeNN(db, p); @@ -123310,6 +128056,21 @@ SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3 *db, Select *p){ if( OK_IF_ALWAYS_TRUE(p) ) clearSelect(db, p, 1); } +/* +** Delete all the substructure for p, but keep p allocated. Redefine +** p to be a single SELECT where every column of the result set has a +** value of NULL. +*/ +SQLITE_PRIVATE void sqlite3SelectReset(Parse *pParse, Select *p){ + if( ALWAYS(p) ){ + clearSelect(pParse->db, p, 0); + memset(&p->iLimit, 0, sizeof(Select) - offsetof(Select,iLimit)); + p->pEList = sqlite3ExprListAppend(pParse, 0, + sqlite3ExprAlloc(pParse->db,TK_NULL,0,0)); + p->pSrc = sqlite3DbMallocZero(pParse->db, sizeof(SrcList)); + } +} + /* ** Return a pointer to the right-most SELECT statement in a compound. */ @@ -123418,7 +128179,8 @@ static int tableAndColumnIndex( int N, /* Number of tables in pSrc->a[] to search */ const char *zCol, /* Name of the column we are looking for */ int *piTab, /* Write index of pSrc->a[] here */ - int *piCol /* Write index of pSrc->a[*piTab].pTab->aCol[] here */ + int *piCol, /* Write index of pSrc->a[*piTab].pTab->aCol[] here */ + int bIgnoreHidden /* True to ignore hidden columns */ ){ int i; /* For looping over tables in pSrc */ int iCol; /* Index of column matching zCol */ @@ -123426,7 +128188,9 @@ static int tableAndColumnIndex( assert( (piTab==0)==(piCol==0) ); /* Both or neither are NULL */ for(i=0; ia[i].pTab, zCol); - if( iCol>=0 ){ + if( iCol>=0 + && (bIgnoreHidden==0 || IsHiddenColumn(&pSrc->a[i].pTab->aCol[iCol])==0) + ){ if( piTab ){ *piTab = i; *piCol = iCol; @@ -123478,7 +128242,7 @@ static void addWhereTerm( ExprSetVVAProperty(pEq, EP_NoReduce); pEq->iRightJoinTable = (i16)pE2->iTable; } - *ppWhere = sqlite3ExprAnd(db, *ppWhere, pEq); + *ppWhere = sqlite3ExprAnd(pParse, *ppWhere, pEq); } /* @@ -123507,7 +128271,7 @@ static void addWhereTerm( ** after the t1 loop and rows with t1.x!=5 will never appear in ** the output, which is incorrect. */ -static void setJoinExpr(Expr *p, int iTable){ +SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr *p, int iTable){ while( p ){ ExprSetProperty(p, EP_FromJoin); assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); @@ -123516,15 +128280,15 @@ static void setJoinExpr(Expr *p, int iTable){ if( p->op==TK_FUNCTION && p->x.pList ){ int i; for(i=0; ix.pList->nExpr; i++){ - setJoinExpr(p->x.pList->a[i].pExpr, iTable); + sqlite3SetJoinExpr(p->x.pList->a[i].pExpr, iTable); } } - setJoinExpr(p->pLeft, iTable); + sqlite3SetJoinExpr(p->pLeft, iTable); p = p->pRight; } } -/* Undo the work of setJoinExpr(). In the expression tree p, convert every +/* Undo the work of sqlite3SetJoinExpr(). In the expression p, convert every ** term that is marked with EP_FromJoin and iRightJoinTable==iTable into ** an ordinary term that omits the EP_FromJoin mark. ** @@ -123591,10 +128355,11 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ int iLeft; /* Matching left table */ int iLeftCol; /* Matching column in the left table */ + if( IsHiddenColumn(&pRightTab->aCol[j]) ) continue; zName = pRightTab->aCol[j].zName; - if( tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol) ){ + if( tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol, 1) ){ addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, j, - isOuter, &p->pWhere); + isOuter, &p->pWhere); } } } @@ -123611,8 +128376,8 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ ** an AND operator. */ if( pRight->pOn ){ - if( isOuter ) setJoinExpr(pRight->pOn, pRight->iCursor); - p->pWhere = sqlite3ExprAnd(pParse->db, p->pWhere, pRight->pOn); + if( isOuter ) sqlite3SetJoinExpr(pRight->pOn, pRight->iCursor); + p->pWhere = sqlite3ExprAnd(pParse, p->pWhere, pRight->pOn); pRight->pOn = 0; } @@ -123634,7 +128399,7 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ zName = pList->a[j].zName; iRightCol = columnIndex(pRightTab, zName); if( iRightCol<0 - || !tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol) + || !tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol, 0) ){ sqlite3ErrorMsg(pParse, "cannot join using column %s - column " "not present in both tables", zName); @@ -123754,7 +128519,7 @@ static void pushOntoSorter( } assert( pSelect->iOffset==0 || pSelect->iLimit!=0 ); iLimit = pSelect->iOffset ? pSelect->iOffset+1 : pSelect->iLimit; - pSort->labelDone = sqlite3VdbeMakeLabel(v); + pSort->labelDone = sqlite3VdbeMakeLabel(pParse); sqlite3ExprCodeExprList(pParse, pSort->pOrderBy, regBase, regOrigData, SQLITE_ECEL_DUP | (regOrigData? SQLITE_ECEL_REF : 0)); if( bSeq ){ @@ -123786,14 +128551,15 @@ static void pushOntoSorter( if( pParse->db->mallocFailed ) return; pOp->p2 = nKey + nData; pKI = pOp->p4.pKeyInfo; - memset(pKI->aSortOrder, 0, pKI->nKeyField); /* Makes OP_Jump testable */ + memset(pKI->aSortFlags, 0, pKI->nKeyField); /* Makes OP_Jump testable */ sqlite3VdbeChangeP4(v, -1, (char*)pKI, P4_KEYINFO); testcase( pKI->nAllField > pKI->nKeyField+2 ); pOp->p4.pKeyInfo = sqlite3KeyInfoFromExprList(pParse,pSort->pOrderBy,nOBSat, pKI->nAllField-pKI->nKeyField-1); + pOp = 0; /* Ensure pOp not used after sqltie3VdbeAddOp3() */ addrJmp = sqlite3VdbeCurrentAddr(v); sqlite3VdbeAddOp3(v, OP_Jump, addrJmp+1, 0, addrJmp+1); VdbeCoverage(v); - pSort->labelBkOut = sqlite3VdbeMakeLabel(v); + pSort->labelBkOut = sqlite3VdbeMakeLabel(pParse); pSort->regReturn = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut); sqlite3VdbeAddOp1(v, OP_ResetSorter, pSort->iECursor); @@ -123926,7 +128692,7 @@ static void selectExprDefer( struct ExprList_item *pItem = &pEList->a[i]; if( pItem->u.x.iOrderByCol==0 ){ Expr *pExpr = pItem->pExpr; - Table *pTab = pExpr->pTab; + Table *pTab = pExpr->y.pTab; if( pExpr->op==TK_COLUMN && pExpr->iColumn>=0 && pTab && !IsVirtual(pTab) && (pTab->aCol[pExpr->iColumn].colFlags & COLFLAG_SORTERREF) ){ @@ -123949,12 +128715,12 @@ static void selectExprDefer( Expr *pNew = sqlite3PExpr(pParse, TK_COLUMN, 0, 0); if( pNew ){ pNew->iTable = pExpr->iTable; - pNew->pTab = pExpr->pTab; + pNew->y.pTab = pExpr->y.pTab; pNew->iColumn = pPk ? pPk->aiColumn[k] : -1; pExtra = sqlite3ExprListAppend(pParse, pExtra, pNew); } } - pSort->aDefer[nDefer].pTab = pExpr->pTab; + pSort->aDefer[nDefer].pTab = pExpr->y.pTab; pSort->aDefer[nDefer].iCsr = pExpr->iTable; pSort->aDefer[nDefer].nKey = nKey; nDefer++; @@ -124039,7 +128805,7 @@ static void selectInnerLoop( if( srcTab>=0 ){ for(i=0; ipEList->a[i].zName)); + VdbeComment((v, "%s", p->pEList->a[i].zEName)); } }else if( eDest!=SRT_Exists ){ #ifdef SQLITE_ENABLE_SORTER_REFERENCES @@ -124153,6 +128919,7 @@ static void selectInnerLoop( pOp->opcode = OP_Null; pOp->p1 = 1; pOp->p2 = regPrev; + pOp = 0; /* Ensure pOp is not used after sqlite3VdbeAddOp() */ iJump = sqlite3VdbeCurrentAddr(v) + nResultCol; for(i=0; iaSortOrder = (u8*)&p->aColl[N+X]; + p->aSortFlags = (u8*)&p->aColl[N+X]; p->nKeyField = (u16)N; p->nAllField = (u16)(N+X); p->enc = ENC(db); @@ -124474,7 +129241,7 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoFromExprList( assert( sqlite3KeyInfoIsWriteable(pInfo) ); for(i=iStart, pItem=pList->a+iStart; iaColl[i-iStart] = sqlite3ExprNNCollSeq(pParse, pItem->pExpr); - pInfo->aSortOrder[i-iStart] = pItem->sortOrder; + pInfo->aSortFlags[i-iStart] = pItem->sortFlags; } } return pInfo; @@ -124540,7 +129307,7 @@ static void generateSortTail( ){ Vdbe *v = pParse->pVdbe; /* The prepared statement */ int addrBreak = pSort->labelDone; /* Jump here to exit loop */ - int addrContinue = sqlite3VdbeMakeLabel(v); /* Jump here for next cycle */ + int addrContinue = sqlite3VdbeMakeLabel(pParse);/* Jump here for next cycle */ int addr; /* Top of output loop. Jump for Next. */ int addrOnce = 0; int iTab; @@ -124580,7 +129347,12 @@ static void generateSortTail( regRow = pDest->iSdst; }else{ regRowid = sqlite3GetTempReg(pParse); - regRow = sqlite3GetTempRange(pParse, nColumn); + if( eDest==SRT_EphemTab || eDest==SRT_Table ){ + regRow = sqlite3GetTempReg(pParse); + nColumn = 0; + }else{ + regRow = sqlite3GetTempRange(pParse, nColumn); + } } nKey = pOrderBy->nExpr - pSort->nOBSat; if( pSort->sortFlags & SORTFLAG_UseSorter ){ @@ -124654,12 +129426,13 @@ static void generateSortTail( iRead = iCol--; } sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iRead, regRow+i); - VdbeComment((v, "%s", aOutEx[i].zName?aOutEx[i].zName : aOutEx[i].zSpan)); + VdbeComment((v, "%s", aOutEx[i].zEName)); } } switch( eDest ){ case SRT_Table: case SRT_EphemTab: { + sqlite3VdbeAddOp3(v, OP_Column, iSortTab, nKey+bSeq, regRow); sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, regRowid); sqlite3VdbeAddOp3(v, OP_Insert, iParm, regRow, regRowid); sqlite3VdbeChangeP5(v, OPFLAG_APPEND); @@ -124760,8 +129533,6 @@ static const char *columnTypeImpl( assert( pExpr!=0 ); assert( pNC->pSrcList!=0 ); - assert( pExpr->op!=TK_AGG_COLUMN ); /* This routine runes before aggregates - ** are processed */ switch( pExpr->op ){ case TK_COLUMN: { /* The expression is a column. Locate the table the column is being @@ -124803,7 +129574,7 @@ static const char *columnTypeImpl( break; } - assert( pTab && pExpr->pTab==pTab ); + assert( pTab && pExpr->y.pTab==pTab ); if( pS ){ /* The "table" is actually a sub-select or a view in the FROM clause ** of the SELECT statement. Return the declaration type and origin @@ -124988,15 +129759,15 @@ static void generateColumnNames( assert( p!=0 ); assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */ - assert( p->op!=TK_COLUMN || p->pTab!=0 ); /* Covering idx not yet coded */ - if( pEList->a[i].zName ){ + assert( p->op!=TK_COLUMN || p->y.pTab!=0 ); /* Covering idx not yet coded */ + if( pEList->a[i].zEName && pEList->a[i].eEName==ENAME_NAME ){ /* An AS clause always takes first priority */ - char *zName = pEList->a[i].zName; + char *zName = pEList->a[i].zEName; sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT); }else if( srcName && p->op==TK_COLUMN ){ char *zCol; int iCol = p->iColumn; - pTab = p->pTab; + pTab = p->y.pTab; assert( pTab!=0 ); if( iCol<0 ) iCol = pTab->iPKey; assert( iCol==-1 || (iCol>=0 && iColnCol) ); @@ -125013,7 +129784,7 @@ static void generateColumnNames( sqlite3VdbeSetColName(v, i, COLNAME_NAME, zCol, SQLITE_TRANSIENT); } }else{ - const char *z = pEList->a[i].zSpan; + const char *z = pEList->a[i].zEName; z = z==0 ? sqlite3MPrintf(db, "column%d", i+1) : sqlite3DbStrDup(db, z); sqlite3VdbeSetColName(v, i, COLNAME_NAME, z, SQLITE_DYNAMIC); } @@ -125075,19 +129846,18 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList( for(i=0, pCol=aCol; imallocFailed; i++, pCol++){ /* Get an appropriate name for the column */ - if( (zName = pEList->a[i].zName)!=0 ){ + if( (zName = pEList->a[i].zEName)!=0 && pEList->a[i].eEName==ENAME_NAME ){ /* If the column contains an "AS " phrase, use as the name */ }else{ - Expr *pColExpr = sqlite3ExprSkipCollate(pEList->a[i].pExpr); + Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pEList->a[i].pExpr); while( pColExpr->op==TK_DOT ){ pColExpr = pColExpr->pRight; assert( pColExpr!=0 ); } - assert( pColExpr->op!=TK_AGG_COLUMN ); if( pColExpr->op==TK_COLUMN ){ /* For columns use the column name name */ int iCol = pColExpr->iColumn; - Table *pTab = pColExpr->pTab; + Table *pTab = pColExpr->y.pTab; assert( pTab!=0 ); if( iCol<0 ) iCol = pTab->iPKey; zName = iCol>=0 ? pTab->aCol[iCol].zName : "rowid"; @@ -125096,10 +129866,10 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList( zName = pColExpr->u.zToken; }else{ /* Use the original text of the column expression as its name */ - zName = pEList->a[i].zSpan; + zName = pEList->a[i].zEName; } } - if( zName ){ + if( zName && !sqlite3IsTrueOrFalse(zName) ){ zName = sqlite3DbStrDup(db, zName); }else{ zName = sqlite3MPrintf(db,"column%d",i+1); @@ -125151,7 +129921,8 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList( SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation( Parse *pParse, /* Parsing contexts */ Table *pTab, /* Add column type information to this table */ - Select *pSelect /* SELECT used to determine types and collations */ + Select *pSelect, /* SELECT used to determine types and collations */ + char aff /* Default affinity for columns */ ){ sqlite3 *db = pParse->db; NameContext sNC; @@ -125184,7 +129955,7 @@ SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation( pCol->colFlags |= COLFLAG_HASTYPE; } } - if( pCol->affinity==0 ) pCol->affinity = SQLITE_AFF_BLOB; + if( pCol->affinity<=SQLITE_AFF_NONE ) pCol->affinity = aff; pColl = sqlite3ExprCollSeq(pParse, p); if( pColl && pCol->zColl==0 ){ pCol->zColl = sqlite3DbStrDup(db, pColl->zName); @@ -125197,30 +129968,27 @@ SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation( ** Given a SELECT statement, generate a Table structure that describes ** the result set of that SELECT. */ -SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){ +SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect, char aff){ Table *pTab; sqlite3 *db = pParse->db; - int savedFlags; + u64 savedFlags; savedFlags = db->flags; - db->flags &= ~SQLITE_FullColNames; + db->flags &= ~(u64)SQLITE_FullColNames; db->flags |= SQLITE_ShortColNames; sqlite3SelectPrep(pParse, pSelect, 0); + db->flags = savedFlags; if( pParse->nErr ) return 0; while( pSelect->pPrior ) pSelect = pSelect->pPrior; - db->flags = savedFlags; pTab = sqlite3DbMallocZero(db, sizeof(Table) ); if( pTab==0 ){ return 0; } - /* The sqlite3ResultSetOfSelect() is only used n contexts where lookaside - ** is disabled */ - assert( db->lookaside.bDisable ); pTab->nTabRef = 1; pTab->zName = 0; pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); sqlite3ColumnsFromExprList(pParse, pSelect->pEList, &pTab->nCol, &pTab->aCol); - sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSelect); + sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSelect, aff); pTab->iPKey = -1; if( db->mallocFailed ){ sqlite3DeleteTable(db, pTab); @@ -125374,7 +130142,7 @@ static KeyInfo *multiSelectOrderByKeyInfo(Parse *pParse, Select *p, int nExtra){ } assert( sqlite3KeyInfoIsWriteable(pRet) ); pRet->aColl[i] = pColl; - pRet->aSortOrder[i] = pOrderBy->a[i].sortOrder; + pRet->aSortFlags[i] = pOrderBy->a[i].sortFlags; } } @@ -125441,11 +130209,18 @@ static void generateWithRecursiveQuery( Expr *pLimit; /* Saved LIMIT and OFFSET */ int regLimit, regOffset; /* Registers used by LIMIT and OFFSET */ +#ifndef SQLITE_OMIT_WINDOWFUNC + if( p->pWin ){ + sqlite3ErrorMsg(pParse, "cannot use window functions in recursive queries"); + return; + } +#endif + /* Obtain authorization to do a recursive query */ if( sqlite3AuthCheck(pParse, SQLITE_RECURSIVE, 0, 0, 0) ) return; /* Process the LIMIT and OFFSET clauses, if they exist */ - addrBreak = sqlite3VdbeMakeLabel(v); + addrBreak = sqlite3VdbeMakeLabel(pParse); p->nSelectRow = 320; /* 4 billion rows */ computeLimitRegisters(pParse, p, addrBreak); pLimit = p->pLimit; @@ -125515,7 +130290,7 @@ static void generateWithRecursiveQuery( sqlite3VdbeAddOp1(v, OP_Delete, iQueue); /* Output the single row in Current */ - addrCont = sqlite3VdbeMakeLabel(v); + addrCont = sqlite3VdbeMakeLabel(pParse); codeOffset(v, regOffset, addrCont); selectInnerLoop(pParse, p, iCurrent, 0, 0, pDest, addrCont, addrBreak); @@ -125586,6 +130361,9 @@ static int multiSelectValues( assert( p->selFlags & SF_Values ); assert( p->op==TK_ALL || (p->op==TK_SELECT && p->pPrior==0) ); assert( p->pNext==0 || p->pEList->nExpr==p->pNext->pEList->nExpr ); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( p->pWin ) return -1; +#endif if( p->pPrior==0 ) break; assert( p->pPrior->pNext==p ); p = p->pPrior; @@ -125650,6 +130428,7 @@ static int multiSelect( */ assert( p && p->pPrior ); /* Calling function guarantees this much */ assert( (p->selFlags & SF_Recursive)==0 || p->op==TK_ALL || p->op==TK_UNION ); + assert( p->selFlags & SF_Compound ); db = pParse->db; pPrior = p->pPrior; dest = *pDest; @@ -125675,7 +130454,8 @@ static int multiSelect( */ if( p->selFlags & SF_MultiValue ){ rc = multiSelectValues(pParse, p, &dest); - goto multi_select_end; + if( rc>=0 ) goto multi_select_end; + rc = SQLITE_OK; } /* Make sure all SELECTs in the statement have the same number of elements @@ -125820,11 +130600,11 @@ static int multiSelect( ** it is that we currently need. */ assert( unionTab==dest.iSDParm || dest.eDest!=priorOp ); - if( dest.eDest!=priorOp ){ + assert( p->pEList || db->mallocFailed ); + if( dest.eDest!=priorOp && db->mallocFailed==0 ){ int iCont, iBreak, iStart; - assert( p->pEList ); - iBreak = sqlite3VdbeMakeLabel(v); - iCont = sqlite3VdbeMakeLabel(v); + iBreak = sqlite3VdbeMakeLabel(pParse); + iCont = sqlite3VdbeMakeLabel(pParse); computeLimitRegisters(pParse, p, iBreak); sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); VdbeCoverage(v); iStart = sqlite3VdbeCurrentAddr(v); @@ -125892,8 +130672,8 @@ static int multiSelect( ** tables. */ assert( p->pEList ); - iBreak = sqlite3VdbeMakeLabel(v); - iCont = sqlite3VdbeMakeLabel(v); + iBreak = sqlite3VdbeMakeLabel(pParse); + iCont = sqlite3VdbeMakeLabel(pParse); computeLimitRegisters(pParse, p, iBreak); sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v); r1 = sqlite3GetTempReg(pParse); @@ -125918,6 +130698,7 @@ static int multiSelect( } #endif } + if( pParse->nErr ) goto multi_select_end; /* Compute collating sequences used by ** temporary tables needed to implement the compound select. @@ -126023,7 +130804,7 @@ static int generateOutputSubroutine( int addr; addr = sqlite3VdbeCurrentAddr(v); - iContinue = sqlite3VdbeMakeLabel(v); + iContinue = sqlite3VdbeMakeLabel(pParse); /* Suppress duplicates for UNION, EXCEPT, and INTERSECT */ @@ -126077,11 +130858,14 @@ static int generateOutputSubroutine( /* If this is a scalar select that is part of an expression, then ** store the results in the appropriate memory cell and break out - ** of the scan loop. + ** of the scan loop. Note that the select might return multiple columns + ** if it is the RHS of a row-value IN operator. */ case SRT_Mem: { - assert( pIn->nSdst==1 || pParse->nErr>0 ); testcase( pIn->nSdst!=1 ); - sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSDParm, 1); + if( pParse->nErr==0 ){ + testcase( pIn->nSdst>1 ); + sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSDParm, pIn->nSdst); + } /* The LIMIT clause will jump out of the loop for us */ break; } @@ -126260,8 +131044,8 @@ static int multiSelectOrderBy( db = pParse->db; v = pParse->pVdbe; assert( v!=0 ); /* Already thrown the error if VDBE alloc failed */ - labelEnd = sqlite3VdbeMakeLabel(v); - labelCmpr = sqlite3VdbeMakeLabel(v); + labelEnd = sqlite3VdbeMakeLabel(pParse); + labelCmpr = sqlite3VdbeMakeLabel(pParse); /* Patch up the ORDER BY clause @@ -126338,7 +131122,7 @@ static int multiSelectOrderBy( assert( sqlite3KeyInfoIsWriteable(pKeyDup) ); for(i=0; iaColl[i] = multiSelectCollSeq(pParse, p, i); - pKeyDup->aSortOrder[i] = 0; + pKeyDup->aSortFlags[i] = 0; } } } @@ -126577,6 +131361,7 @@ static Expr *substExpr( ifNullRow.iTable = pSubst->iNewTable; pCopy = &ifNullRow; } + testcase( ExprHasProperty(pCopy, EP_Subquery) ); pNew = sqlite3ExprDup(db, pCopy, 0); if( pNew && pSubst->isLeftJoin ){ ExprSetProperty(pNew, EP_CanBeNull); @@ -126587,6 +131372,18 @@ static Expr *substExpr( } sqlite3ExprDelete(db, pExpr); pExpr = pNew; + + /* Ensure that the expression now has an implicit collation sequence, + ** just as it did when it was a column of a view or sub-query. */ + if( pExpr ){ + if( pExpr->op!=TK_COLUMN && pExpr->op!=TK_COLLATE ){ + CollSeq *pColl = sqlite3ExprCollSeq(pSubst->pParse, pExpr); + pExpr = sqlite3ExprAddCollateString(pSubst->pParse, pExpr, + (pColl ? pColl->zName : "BINARY") + ); + } + ExprClearProperty(pExpr, EP_Collate); + } } } }else{ @@ -126600,6 +131397,14 @@ static Expr *substExpr( }else{ substExprList(pSubst, pExpr->x.pList); } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + Window *pWin = pExpr->y.pWin; + pWin->pFilter = substExpr(pSubst, pWin->pFilter); + substExprList(pSubst, pWin->pPartition); + substExprList(pSubst, pWin->pOrderBy); + } +#endif } return pExpr; } @@ -126685,6 +131490,7 @@ static void substSelect( ** (3b) the FROM clause of the subquery may not contain a virtual ** table and ** (3c) the outer query may not be an aggregate. +** (3d) the outer query may not be DISTINCT. ** ** (4) The subquery can not be DISTINCT. ** @@ -126735,6 +131541,7 @@ static void substSelect( ** (17d1) aggregate, or ** (17d2) DISTINCT, or ** (17d3) a join. +** (17e) the subquery may not contain window functions ** ** The parent and sub-query may contain WHERE clauses. Subject to ** rules (11), (13) and (14), they may also contain ORDER BY, @@ -126881,8 +131688,11 @@ static int flattenSubquery( */ if( (pSubitem->fg.jointype & JT_OUTER)!=0 ){ isLeftJoin = 1; - if( pSubSrc->nSrc>1 || isAgg || IsVirtual(pSubSrc->a[0].pTab) ){ - /* (3a) (3c) (3b) */ + if( pSubSrc->nSrc>1 /* (3a) */ + || isAgg /* (3b) */ + || IsVirtual(pSubSrc->a[0].pTab) /* (3c) */ + || (p->selFlags & SF_Distinct)!=0 /* (3d) */ + ){ return 0; } } @@ -126916,6 +131726,9 @@ static int flattenSubquery( if( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))!=0 /* (17b) */ || (pSub1->pPrior && pSub1->op!=TK_ALL) /* (17a) */ || pSub1->pSrc->nSrc<1 /* (17c) */ +#ifndef SQLITE_OMIT_WINDOWFUNC + || pSub1->pWin /* (17e) */ +#endif ){ return 0; } @@ -127060,6 +131873,7 @@ static int flattenSubquery( for(pParent=p; pParent; pParent=pParent->pPrior, pSub=pSub->pPrior){ int nSubSrc; u8 jointype = 0; + assert( pSub!=0 ); pSubSrc = pSub->pSrc; /* FROM clause of subquery */ nSubSrc = pSubSrc->nSrc; /* Number of terms in subquery FROM clause */ pSrc = pParent->pSrc; /* FROM clause of the outer query */ @@ -127069,11 +131883,9 @@ static int flattenSubquery( jointype = pSubitem->fg.jointype; }else{ assert( pParent!=p ); /* 2nd and subsequent times through the loop */ - pSrc = pParent->pSrc = sqlite3SrcListAppend(db, 0, 0, 0); - if( pSrc==0 ){ - assert( db->mallocFailed ); - break; - } + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); + if( pSrc==0 ) break; + pParent->pSrc = pSrc; } /* The subquery uses a single slot of the FROM clause of the outer @@ -127092,10 +131904,9 @@ static int flattenSubquery( ** for the two elements in the FROM clause of the subquery. */ if( nSubSrc>1 ){ - pParent->pSrc = pSrc = sqlite3SrcListEnlarge(db, pSrc, nSubSrc-1,iFrom+1); - if( db->mallocFailed ){ - break; - } + pSrc = sqlite3SrcListEnlarge(pParse, pSrc, nSubSrc-1,iFrom+1); + if( pSrc==0 ) break; + pParent->pSrc = pSrc; } /* Transfer the FROM clause terms from the subquery into the @@ -127141,11 +131952,12 @@ static int flattenSubquery( pParent->pOrderBy = pOrderBy; pSub->pOrderBy = 0; } - pWhere = sqlite3ExprDup(db, pSub->pWhere, 0); + pWhere = pSub->pWhere; + pSub->pWhere = 0; if( isLeftJoin>0 ){ - setJoinExpr(pWhere, iNewParent); + sqlite3SetJoinExpr(pWhere, iNewParent); } - pParent->pWhere = sqlite3ExprAnd(db, pWhere, pParent->pWhere); + pParent->pWhere = sqlite3ExprAnd(pParse, pWhere, pParent->pWhere); if( db->mallocFailed==0 ){ SubstContext x; x.pParse = pParse; @@ -127156,10 +131968,10 @@ static int flattenSubquery( substSelect(&x, pParent, 0); } - /* The flattened query is distinct if either the inner or the - ** outer query is distinct. - */ - pParent->selFlags |= pSub->selFlags & SF_Distinct; + /* The flattened query is a compound if either the inner or the + ** outer query is a compound. */ + pParent->selFlags |= pSub->selFlags & SF_Compound; + assert( (pSub->selFlags & SF_Distinct)==0 ); /* restriction (17b) */ /* ** SELECT ... FROM (SELECT ... LIMIT a OFFSET b) LIMIT x OFFSET y; @@ -127190,7 +132002,7 @@ static int flattenSubquery( #endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ /* -** A structure to keep track of all of the column values that fixed to +** A structure to keep track of all of the column values that are fixed to ** a known value due to WHERE clause constraints of the form COLUMN=VALUE. */ typedef struct WhereConst WhereConst; @@ -127202,13 +132014,41 @@ struct WhereConst { }; /* -** Add a new entry to the pConst object +** Add a new entry to the pConst object. Except, do not add duplicate +** pColumn entires. Also, do not add if doing so would not be appropriate. +** +** The caller guarantees the pColumn is a column and pValue is a constant. +** This routine has to do some additional checks before completing the +** insert. */ static void constInsert( - WhereConst *pConst, - Expr *pColumn, - Expr *pValue + WhereConst *pConst, /* The WhereConst into which we are inserting */ + Expr *pColumn, /* The COLUMN part of the constraint */ + Expr *pValue, /* The VALUE part of the constraint */ + Expr *pExpr /* Overall expression: COLUMN=VALUE or VALUE=COLUMN */ ){ + int i; + assert( pColumn->op==TK_COLUMN ); + assert( sqlite3ExprIsConstant(pValue) ); + + if( !ExprHasProperty(pValue, EP_FixedCol) && sqlite3ExprAffinity(pValue)!=0 ){ + return; + } + if( !sqlite3IsBinary(sqlite3ExprCompareCollSeq(pConst->pParse,pExpr)) ){ + return; + } + + /* 2018-10-25 ticket [cf5ed20f] + ** Make sure the same pColumn is not inserted more than once */ + for(i=0; inConst; i++){ + const Expr *pE2 = pConst->apExpr[i*2]; + assert( pE2->op==TK_COLUMN ); + if( pE2->iTable==pColumn->iTable + && pE2->iColumn==pColumn->iColumn + ){ + return; /* Already present. Return without doing anything. */ + } + } pConst->nConst++; pConst->apExpr = sqlite3DbReallocOrFree(pConst->pParse->db, pConst->apExpr, @@ -127216,7 +132056,9 @@ static void constInsert( if( pConst->apExpr==0 ){ pConst->nConst = 0; }else{ - if( ExprHasProperty(pValue, EP_FixedCol) ) pValue = pValue->pLeft; + if( ExprHasProperty(pValue, EP_FixedCol) ){ + pValue = pValue->pLeft; + } pConst->apExpr[pConst->nConst*2-2] = pColumn; pConst->apExpr[pConst->nConst*2-1] = pValue; } @@ -127242,19 +132084,11 @@ static void findConstInWhere(WhereConst *pConst, Expr *pExpr){ pLeft = pExpr->pLeft; assert( pRight!=0 ); assert( pLeft!=0 ); - if( pRight->op==TK_COLUMN - && !ExprHasProperty(pRight, EP_FixedCol) - && sqlite3ExprIsConstant(pLeft) - && sqlite3IsBinary(sqlite3BinaryCompareCollSeq(pConst->pParse,pLeft,pRight)) - ){ - constInsert(pConst, pRight, pLeft); - }else - if( pLeft->op==TK_COLUMN - && !ExprHasProperty(pLeft, EP_FixedCol) - && sqlite3ExprIsConstant(pRight) - && sqlite3IsBinary(sqlite3BinaryCompareCollSeq(pConst->pParse,pLeft,pRight)) - ){ - constInsert(pConst, pLeft, pRight); + if( pRight->op==TK_COLUMN && sqlite3ExprIsConstant(pLeft) ){ + constInsert(pConst,pRight,pLeft,pExpr); + } + if( pLeft->op==TK_COLUMN && sqlite3ExprIsConstant(pRight) ){ + constInsert(pConst,pLeft,pRight,pExpr); } } @@ -127268,7 +132102,11 @@ static int propagateConstantExprRewrite(Walker *pWalker, Expr *pExpr){ int i; WhereConst *pConst; if( pExpr->op!=TK_COLUMN ) return WRC_Continue; - if( ExprHasProperty(pExpr, EP_FixedCol) ) return WRC_Continue; + if( ExprHasProperty(pExpr, EP_FixedCol|EP_FromJoin) ){ + testcase( ExprHasProperty(pExpr, EP_FixedCol) ); + testcase( ExprHasProperty(pExpr, EP_FromJoin) ); + return WRC_Continue; + } pConst = pWalker->u.pConst; for(i=0; inConst; i++){ Expr *pColumn = pConst->apExpr[i*2]; @@ -127290,10 +132128,9 @@ static int propagateConstantExprRewrite(Walker *pWalker, Expr *pExpr){ ** The WHERE-clause constant propagation optimization. ** ** If the WHERE clause contains terms of the form COLUMN=CONSTANT or -** CONSTANT=COLUMN that must be tree (in other words, if the terms top-level -** AND-connected terms that are not part of a ON clause from a LEFT JOIN) -** then throughout the query replace all other occurrences of COLUMN -** with CONSTANT within the WHERE clause. +** CONSTANT=COLUMN that are top-level AND-connected terms that are not +** part of a ON clause from a LEFT JOIN, then throughout the query +** replace all other occurrences of COLUMN with CONSTANT. ** ** For example, the query: ** @@ -127465,9 +132302,9 @@ static int pushDownWhereTerms( x.pEList = pSubq->pEList; pNew = substExpr(&x, pNew); if( pSubq->selFlags & SF_Aggregate ){ - pSubq->pHaving = sqlite3ExprAnd(pParse->db, pSubq->pHaving, pNew); + pSubq->pHaving = sqlite3ExprAnd(pParse, pSubq->pHaving, pNew); }else{ - pSubq->pWhere = sqlite3ExprAnd(pParse->db, pSubq->pWhere, pNew); + pSubq->pWhere = sqlite3ExprAnd(pParse, pSubq->pWhere, pNew); } pSubq = pSubq->pPrior; } @@ -127497,24 +132334,27 @@ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){ ExprList *pEList = pFunc->x.pList; /* Arguments to agg function */ const char *zFunc; /* Name of aggregate function pFunc */ ExprList *pOrderBy; - u8 sortOrder; + u8 sortFlags; assert( *ppMinMax==0 ); assert( pFunc->op==TK_AGG_FUNCTION ); - if( pEList==0 || pEList->nExpr!=1 ) return eRet; + assert( !IsWindowFunc(pFunc) ); + if( pEList==0 || pEList->nExpr!=1 || ExprHasProperty(pFunc, EP_WinFunc) ){ + return eRet; + } zFunc = pFunc->u.zToken; if( sqlite3StrICmp(zFunc, "min")==0 ){ eRet = WHERE_ORDERBY_MIN; - sortOrder = SQLITE_SO_ASC; + sortFlags = KEYINFO_ORDER_BIGNULL; }else if( sqlite3StrICmp(zFunc, "max")==0 ){ eRet = WHERE_ORDERBY_MAX; - sortOrder = SQLITE_SO_DESC; + sortFlags = KEYINFO_ORDER_DESC; }else{ return eRet; } *ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0); assert( pOrderBy!=0 || db->mallocFailed ); - if( pOrderBy ) pOrderBy->a[0].sortOrder = sortOrder; + if( pOrderBy ) pOrderBy->a[0].sortFlags = sortFlags; return eRet; } @@ -127548,7 +132388,7 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ if( pExpr->op!=TK_AGG_FUNCTION ) return 0; if( NEVER(pAggInfo->nFunc==0) ) return 0; if( (pAggInfo->aFunc[0].pFunc->funcFlags&SQLITE_FUNC_COUNT)==0 ) return 0; - if( pExpr->flags&EP_Distinct ) return 0; + if( ExprHasProperty(pExpr, EP_Distinct|EP_WinFunc) ) return 0; return pTab; } @@ -127639,6 +132479,9 @@ static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){ p->pPrior = 0; p->pNext = 0; p->pWith = 0; +#ifndef SQLITE_OMIT_WINDOWFUNC + p->pWinDefn = 0; +#endif p->selFlags &= ~SF_Compound; assert( (p->selFlags & SF_Converted)==0 ); p->selFlags |= SF_Converted; @@ -127738,6 +132581,9 @@ static int withExpand( With *pWith; /* WITH clause that pCte belongs to */ assert( pFrom->pTab==0 ); + if( pParse->nErr ){ + return SQLITE_ERROR; + } pCte = searchWith(pParse->pWith, pFrom, &pWith); if( pCte ){ @@ -127858,7 +132704,7 @@ static void selectPopWith(Walker *pWalker, Select *p){ if( OK_IF_ALWAYS_TRUE(pParse->pWith) && p->pPrior==0 ){ With *pWith = findRightmost(p)->pWith; if( pWith!=0 ){ - assert( pParse->pWith==pWith ); + assert( pParse->pWith==pWith || pParse->nErr ); pParse->pWith = pWith->pOuter; } } @@ -127893,7 +132739,7 @@ SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse *pParse, struct SrcList_item *pFr pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); pTab->tabFlags |= TF_Ephemeral; - return SQLITE_OK; + return pParse->nErr ? SQLITE_ERROR : SQLITE_OK; } /* @@ -127939,6 +132785,10 @@ static int selectExpander(Walker *pWalker, Select *p){ if( (selFlags & SF_Expanded)!=0 ){ return WRC_Prune; } + if( pWalker->eCode ){ + /* Renumber selId because it has been copied from a view */ + p->selId = ++pParse->nSelect; + } pTabList = p->pSrc; pEList = p->pEList; sqlite3WithPush(pParse, p->pWith, 0); @@ -127985,15 +132835,32 @@ static int selectExpander(Walker *pWalker, Select *p){ if( !IsVirtual(pTab) && cannotBeFunction(pParse, pFrom) ){ return WRC_Abort; } -#if !defined(SQLITE_OMIT_VIEW) || !defined (SQLITE_OMIT_VIRTUALTABLE) +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) if( IsVirtual(pTab) || pTab->pSelect ){ i16 nCol; + u8 eCodeOrig = pWalker->eCode; if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort; assert( pFrom->pSelect==0 ); + if( pTab->pSelect && (db->flags & SQLITE_EnableView)==0 ){ + sqlite3ErrorMsg(pParse, "access to view \"%s\" prohibited", + pTab->zName); + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) + && pFrom->fg.fromDDL + && ALWAYS(pTab->pVTable!=0) + && pTab->pVTable->eVtabRisk > ((db->flags & SQLITE_TrustedSchema)!=0) + ){ + sqlite3ErrorMsg(pParse, "unsafe use of virtual table \"%s\"", + pTab->zName); + } +#endif pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0); nCol = pTab->nCol; pTab->nCol = -1; + pWalker->eCode = 1; /* Turn on Select.selId renumbering */ sqlite3WalkSelect(pWalker, pFrom->pSelect); + pWalker->eCode = eCodeOrig; pTab->nCol = nCol; } #endif @@ -128007,7 +132874,7 @@ static int selectExpander(Walker *pWalker, Select *p){ /* Process NATURAL keywords, and ON and USING clauses of joins. */ - if( db->mallocFailed || sqliteProcessJoin(pParse, p) ){ + if( pParse->nErr || db->mallocFailed || sqliteProcessJoin(pParse, p) ){ return WRC_Abort; } @@ -128054,10 +132921,9 @@ static int selectExpander(Walker *pWalker, Select *p){ */ pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr); if( pNew ){ - pNew->a[pNew->nExpr-1].zName = a[k].zName; - pNew->a[pNew->nExpr-1].zSpan = a[k].zSpan; - a[k].zName = 0; - a[k].zSpan = 0; + pNew->a[pNew->nExpr-1].zEName = a[k].zEName; + pNew->a[pNew->nExpr-1].eEName = a[k].eEName; + a[k].zEName = 0; } a[k].pExpr = 0; }else{ @@ -128096,7 +132962,7 @@ static int selectExpander(Walker *pWalker, Select *p){ assert( zName ); if( zTName && pSub - && sqlite3MatchSpanName(pSub->pEList->a[j].zSpan, 0, zTName, 0)==0 + && sqlite3MatchEName(&pSub->pEList->a[j], 0, zTName, 0)==0 ){ continue; } @@ -128114,7 +132980,7 @@ static int selectExpander(Walker *pWalker, Select *p){ if( i>0 && zTName==0 ){ if( (pFrom->fg.jointype & JT_NATURAL)!=0 - && tableAndColumnIndex(pTabList, i, zName, 0, 0) + && tableAndColumnIndex(pTabList, i, zName, 0, 0, 1) ){ /* In a NATURAL join, omit the join columns from the ** table to the right of the join */ @@ -128149,15 +133015,16 @@ static int selectExpander(Walker *pWalker, Select *p){ sqlite3ExprListSetName(pParse, pNew, &sColname, 0); if( pNew && (p->selFlags & SF_NestedFrom)!=0 ){ struct ExprList_item *pX = &pNew->a[pNew->nExpr-1]; + sqlite3DbFree(db, pX->zEName); if( pSub ){ - pX->zSpan = sqlite3DbStrDup(db, pSub->pEList->a[j].zSpan); - testcase( pX->zSpan==0 ); + pX->zEName = sqlite3DbStrDup(db, pSub->pEList->a[j].zEName); + testcase( pX->zEName==0 ); }else{ - pX->zSpan = sqlite3MPrintf(db, "%s.%s.%s", + pX->zEName = sqlite3MPrintf(db, "%s.%s.%s", zSchemaName, zTabName, zColname); - testcase( pX->zSpan==0 ); + testcase( pX->zEName==0 ); } - pX->bSpanIsTab = 1; + pX->eEName = ENAME_TAB; } sqlite3DbFree(db, zToFree); } @@ -128243,6 +133110,7 @@ static void sqlite3SelectExpand(Parse *pParse, Select *pSelect){ } w.xSelectCallback = selectExpander; w.xSelectCallback2 = selectPopWith; + w.eCode = 0; sqlite3WalkSelect(&w, pSelect); } @@ -128280,7 +133148,8 @@ static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){ Select *pSel = pFrom->pSelect; if( pSel ){ while( pSel->pPrior ) pSel = pSel->pPrior; - sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSel); + sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSel, + SQLITE_AFF_NONE); } } } @@ -128402,7 +133271,7 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ ** ** If regAcc is non-zero and there are no min() or max() aggregates ** in pAggInfo, then only populate the pAggInfo->nAccumulator accumulator -** registers i register regAcc contains 0. The caller will take care +** registers if register regAcc contains 0. The caller will take care ** of setting and clearing regAcc. */ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ @@ -128420,6 +133289,25 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ int regAgg; ExprList *pList = pF->pExpr->x.pList; assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) ); + assert( !IsWindowFunc(pF->pExpr) ); + if( ExprHasProperty(pF->pExpr, EP_WinFunc) ){ + Expr *pFilter = pF->pExpr->y.pWin->pFilter; + if( pAggInfo->nAccumulator + && (pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) + ){ + if( regHit==0 ) regHit = ++pParse->nMem; + /* If this is the first row of the group (regAcc==0), clear the + ** "magnet" register regHit so that the accumulator registers + ** are populated if the FILTER clause jumps over the the + ** invocation of min() or max() altogether. Or, if this is not + ** the first row (regAcc==1), set the magnet register so that the + ** accumulators are not populated unless the min()/max() is invoked and + ** indicates that they should be. */ + sqlite3VdbeAddOp2(v, OP_Copy, regAcc, regHit); + } + addrNext = sqlite3VdbeMakeLabel(pParse); + sqlite3ExprIfFalse(pParse, pFilter, addrNext, SQLITE_JUMPIFNULL); + } if( pList ){ nArg = pList->nExpr; regAgg = sqlite3GetTempRange(pParse, nArg); @@ -128429,7 +133317,9 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ regAgg = 0; } if( pF->iDistinct>=0 ){ - addrNext = sqlite3VdbeMakeLabel(v); + if( addrNext==0 ){ + addrNext = sqlite3VdbeMakeLabel(pParse); + } testcase( nArg==0 ); /* Error condition */ testcase( nArg>1 ); /* Also an error */ codeDistinct(pParse, pF->iDistinct, addrNext, 1, regAgg); @@ -128465,6 +133355,7 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ for(i=0, pC=pAggInfo->aCol; inAccumulator; i++, pC++){ sqlite3ExprCode(pParse, pC->pExpr, pC->iMem); } + pAggInfo->directMode = 0; if( addrHitTest ){ sqlite3VdbeJumpHere(v, addrHitTest); @@ -128510,11 +133401,11 @@ static int havingToWhereExprCb(Walker *pWalker, Expr *pExpr){ Select *pS = pWalker->u.pSelect; if( sqlite3ExprIsConstantOrGroupBy(pWalker->pParse, pExpr, pS->pGroupBy) ){ sqlite3 *db = pWalker->pParse->db; - Expr *pNew = sqlite3ExprAlloc(db, TK_INTEGER, &sqlite3IntTokens[1], 0); + Expr *pNew = sqlite3Expr(db, TK_INTEGER, "1"); if( pNew ){ Expr *pWhere = pS->pWhere; SWAP(Expr, *pNew, *pExpr); - pNew = sqlite3ExprAnd(db, pWhere, pNew); + pNew = sqlite3ExprAnd(pWalker->pParse, pWhere, pNew); pS->pWhere = pNew; pWalker->eCode = 1; } @@ -128565,13 +133456,22 @@ static struct SrcList_item *isSelfJoinView( ){ struct SrcList_item *pItem; for(pItem = pTabList->a; pItempSelect==0 ) continue; if( pItem->fg.viaCoroutine ) continue; if( pItem->zName==0 ) continue; - if( sqlite3_stricmp(pItem->zDatabase, pThis->zDatabase)!=0 ) continue; + assert( pItem->pTab!=0 ); + assert( pThis->pTab!=0 ); + if( pItem->pTab->pSchema!=pThis->pTab->pSchema ) continue; if( sqlite3_stricmp(pItem->zName, pThis->zName)!=0 ) continue; - if( sqlite3ExprCompare(0, - pThis->pSelect->pWhere, pItem->pSelect->pWhere, -1) + pS1 = pItem->pSelect; + if( pItem->pTab->pSchema==0 && pThis->pSelect->selId!=pS1->selId ){ + /* The query flattener left two different CTE tables with identical + ** names in the same FROM clause. */ + continue; + } + if( sqlite3ExprCompare(0, pThis->pSelect->pWhere, pS1->pWhere, -1) + || sqlite3ExprCompare(0, pThis->pSelect->pHaving, pS1->pHaving, -1) ){ /* The view was modified by some other optimization such as ** pushDownWhereTerms() */ @@ -128597,7 +133497,8 @@ static struct SrcList_item *isSelfJoinView( ** * The subquery is a UNION ALL of two or more terms ** * The subquery does not have a LIMIT clause ** * There is no WHERE or GROUP BY or HAVING clauses on the subqueries -** * The outer query is a simple count(*) +** * The outer query is a simple count(*) with no WHERE clause or other +** extraneous syntax. ** ** Return TRUE if the optimization is undertaken. */ @@ -128608,6 +133509,8 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ sqlite3 *db; if( (p->selFlags & SF_Aggregate)==0 ) return 0; /* This is an aggregate */ if( p->pEList->nExpr!=1 ) return 0; /* Single result column */ + if( p->pWhere ) return 0; + if( p->pGroupBy ) return 0; pExpr = p->pEList->a[0].pExpr; if( pExpr->op!=TK_AGG_FUNCTION ) return 0; /* Result is an aggregate */ if( sqlite3_stricmp(pExpr->u.zToken,"count") ) return 0; /* Is count() */ @@ -128748,11 +133651,13 @@ SQLITE_PRIVATE int sqlite3Select( } #ifndef SQLITE_OMIT_WINDOWFUNC - if( sqlite3WindowRewrite(pParse, p) ){ + rc = sqlite3WindowRewrite(pParse, p); + if( rc ){ + assert( db->mallocFailed || pParse->nErr>0 ); goto select_end; } #if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x108 ){ + if( p->pWin && (sqlite3SelectTrace & 0x108)!=0 ){ SELECTTRACE(0x104,pParse,p, ("after window rewrite:\n")); sqlite3TreeViewSelect(0, p, 0); } @@ -128834,6 +133739,7 @@ SQLITE_PRIVATE int sqlite3Select( } if( flattenSubquery(pParse, p, i, isAgg) ){ + if( pParse->nErr ) goto select_end; /* This subquery can be absorbed into its parent. */ i = -1; } @@ -128919,7 +133825,7 @@ SQLITE_PRIVATE int sqlite3Select( ** assume the column name is non-NULL and segfault. The use of an empty ** string for the fake column name seems safer. */ - if( pItem->colUsed==0 ){ + if( pItem->colUsed==0 && pItem->zName!=0 ){ sqlite3AuthCheck(pParse, SQLITE_READ, pItem->zName, "", pItem->zDatabase); } @@ -128929,22 +133835,19 @@ SQLITE_PRIVATE int sqlite3Select( pSub = pItem->pSelect; if( pSub==0 ) continue; - /* Sometimes the code for a subquery will be generated more than - ** once, if the subquery is part of the WHERE clause in a LEFT JOIN, - ** for example. In that case, do not regenerate the code to manifest - ** a view or the co-routine to implement a view. The first instance - ** is sufficient, though the subroutine to manifest the view does need - ** to be invoked again. */ - if( pItem->addrFillSub ){ - if( pItem->fg.viaCoroutine==0 ){ - /* The subroutine that manifests the view might be a one-time routine, - ** or it might need to be rerun on each iteration because it - ** encodes a correlated subquery. */ - testcase( sqlite3VdbeGetOp(v, pItem->addrFillSub)->opcode==OP_Once ); - sqlite3VdbeAddOp2(v, OP_Gosub, pItem->regReturn, pItem->addrFillSub); - } - continue; - } + /* The code for a subquery should only be generated once, though it is + ** technically harmless for it to be generated multiple times. The + ** following assert() will detect if something changes to cause + ** the same subquery to be coded multiple times, as a signal to the + ** developers to try to optimize the situation. + ** + ** Update 2019-07-24: + ** See ticket https://sqlite.org/src/tktview/c52b09c7f38903b1311cec40. + ** The dbsqlfuzz fuzzer found a case where the same subquery gets + ** coded twice. So this assert() now becomes a testcase(). It should + ** be very rare, though. + */ + testcase( pItem->addrFillSub!=0 ); /* Increment Parse.nHeight by the height of the largest expression ** tree referred to by this, the parent select. The child select @@ -129018,7 +133921,7 @@ SQLITE_PRIVATE int sqlite3Select( int retAddr; struct SrcList_item *pPrior; - assert( pItem->addrFillSub==0 ); + testcase( pItem->addrFillSub==0 ); /* Ticket c52b09c7f38903b1311 */ pItem->regReturn = ++pParse->nMem; topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn); pItem->addrFillSub = topAddr+1; @@ -129086,9 +133989,13 @@ SQLITE_PRIVATE int sqlite3Select( */ if( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct && sqlite3ExprListCompare(sSort.pOrderBy, pEList, -1)==0 +#ifndef SQLITE_OMIT_WINDOWFUNC + && p->pWin==0 +#endif ){ p->selFlags &= ~SF_Distinct; pGroupBy = p->pGroupBy = sqlite3ExprListDup(db, pEList, 0); + p->selFlags |= SF_Aggregate; /* Notice that even thought SF_Distinct has been cleared from p->selFlags, ** the sDistinct.isTnct is still set. Hence, isTnct represents the ** original setting of the SF_Distinct flag, not the current setting */ @@ -129132,7 +134039,7 @@ SQLITE_PRIVATE int sqlite3Select( /* Set the limiter. */ - iEnd = sqlite3VdbeMakeLabel(v); + iEnd = sqlite3VdbeMakeLabel(pParse); if( (p->selFlags & SF_FixedLimit)==0 ){ p->nSelectRow = 320; /* 4 billion rows */ } @@ -129163,7 +134070,7 @@ SQLITE_PRIVATE int sqlite3Select( #ifndef SQLITE_OMIT_WINDOWFUNC Window *pWin = p->pWin; /* Master window object (or NULL) */ if( pWin ){ - sqlite3WindowCodeInit(pParse, pWin); + sqlite3WindowCodeInit(pParse, p); } #endif assert( WHERE_USE_LIMIT==SF_FixedLimit ); @@ -129199,9 +134106,9 @@ SQLITE_PRIVATE int sqlite3Select( assert( p->pEList==pEList ); #ifndef SQLITE_OMIT_WINDOWFUNC if( pWin ){ - int addrGosub = sqlite3VdbeMakeLabel(v); - int iCont = sqlite3VdbeMakeLabel(v); - int iBreak = sqlite3VdbeMakeLabel(v); + int addrGosub = sqlite3VdbeMakeLabel(pParse); + int iCont = sqlite3VdbeMakeLabel(pParse); + int iBreak = sqlite3VdbeMakeLabel(pParse); int regGosub = ++pParse->nMem; sqlite3WindowCodeStep(pParse, p, pWInfo, regGosub, addrGosub); @@ -129258,25 +134165,37 @@ SQLITE_PRIVATE int sqlite3Select( } assert( 66==sqlite3LogEst(100) ); if( p->nSelectRow>66 ) p->nSelectRow = 66; + + /* If there is both a GROUP BY and an ORDER BY clause and they are + ** identical, then it may be possible to disable the ORDER BY clause + ** on the grounds that the GROUP BY will cause elements to come out + ** in the correct order. It also may not - the GROUP BY might use a + ** database index that causes rows to be grouped together as required + ** but not actually sorted. Either way, record the fact that the + ** ORDER BY and GROUP BY clauses are the same by setting the orderByGrp + ** variable. */ + if( sSort.pOrderBy && pGroupBy->nExpr==sSort.pOrderBy->nExpr ){ + int ii; + /* The GROUP BY processing doesn't care whether rows are delivered in + ** ASC or DESC order - only that each group is returned contiguously. + ** So set the ASC/DESC flags in the GROUP BY to match those in the + ** ORDER BY to maximize the chances of rows being delivered in an + ** order that makes the ORDER BY redundant. */ + for(ii=0; iinExpr; ii++){ + u8 sortFlags = sSort.pOrderBy->a[ii].sortFlags & KEYINFO_ORDER_DESC; + pGroupBy->a[ii].sortFlags = sortFlags; + } + if( sqlite3ExprListCompare(pGroupBy, sSort.pOrderBy, -1)==0 ){ + orderByGrp = 1; + } + } }else{ assert( 0==sqlite3LogEst(1) ); p->nSelectRow = 0; } - /* If there is both a GROUP BY and an ORDER BY clause and they are - ** identical, then it may be possible to disable the ORDER BY clause - ** on the grounds that the GROUP BY will cause elements to come out - ** in the correct order. It also may not - the GROUP BY might use a - ** database index that causes rows to be grouped together as required - ** but not actually sorted. Either way, record the fact that the - ** ORDER BY and GROUP BY clauses are the same by setting the orderByGrp - ** variable. */ - if( sqlite3ExprListCompare(pGroupBy, sSort.pOrderBy, -1)==0 ){ - orderByGrp = 1; - } - /* Create a label to jump to when we want to abort the query */ - addrEnd = sqlite3VdbeMakeLabel(v); + addrEnd = sqlite3VdbeMakeLabel(pParse); /* Convert TK_COLUMN nodes into TK_AGG_COLUMN and make entries in ** sAggInfo for all TK_AGG_FUNCTION nodes in expressions of the @@ -129309,9 +134228,16 @@ SQLITE_PRIVATE int sqlite3Select( minMaxFlag = WHERE_ORDERBY_NORMAL; } for(i=0; ix.pList); + sqlite3ExprAnalyzeAggList(&sNC, pExpr->x.pList); +#ifndef SQLITE_OMIT_WINDOWFUNC + assert( !IsWindowFunc(pExpr) ); + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + sqlite3ExprAnalyzeAggregates(&sNC, pExpr->y.pWin->pFilter); + } +#endif sNC.ncFlags &= ~NC_InAggFunc; } sAggInfo.mxReg = pParse->nMem; @@ -129365,9 +134291,9 @@ SQLITE_PRIVATE int sqlite3Select( iUseFlag = ++pParse->nMem; iAbortFlag = ++pParse->nMem; regOutputRow = ++pParse->nMem; - addrOutputRow = sqlite3VdbeMakeLabel(v); + addrOutputRow = sqlite3VdbeMakeLabel(pParse); regReset = ++pParse->nMem; - addrReset = sqlite3VdbeMakeLabel(v); + addrReset = sqlite3VdbeMakeLabel(pParse); iAMem = pParse->nMem + 1; pParse->nMem += pGroupBy->nExpr; iBMem = pParse->nMem + 1; @@ -129623,13 +134549,18 @@ SQLITE_PRIVATE int sqlite3Select( { int regAcc = 0; /* "populate accumulators" flag */ - /* If there are accumulator registers but no min() or max() functions, - ** allocate register regAcc. Register regAcc will contain 0 the first - ** time the inner loop runs, and 1 thereafter. The code generated - ** by updateAccumulator() only updates the accumulator registers if - ** regAcc contains 0. */ + /* If there are accumulator registers but no min() or max() functions + ** without FILTER clauses, allocate register regAcc. Register regAcc + ** will contain 0 the first time the inner loop runs, and 1 thereafter. + ** The code generated by updateAccumulator() uses this to ensure + ** that the accumulator registers are (a) updated only once if + ** there are no min() or max functions or (b) always updated for the + ** first row visited by the aggregate, so that they are updated at + ** least once even if the FILTER clause means the min() or max() + ** function visits zero rows. */ if( sAggInfo.nAccumulator ){ for(i=0; ifuncFlags&SQLITE_FUNC_NEEDCOLL ) break; } if( i==sAggInfo.nFunc ){ @@ -130100,7 +135031,11 @@ SQLITE_PRIVATE void sqlite3BeginTrigger( /* Check that the trigger name is not reserved and that no trigger of the ** specified name exists */ zName = sqlite3NameFromToken(db, pName); - if( !zName || SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ + if( zName==0 ){ + assert( db->mallocFailed ); + goto trigger_cleanup; + } + if( sqlite3CheckObjectName(pParse, zName, "trigger", pTab->zName) ){ goto trigger_cleanup; } assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); @@ -130263,6 +135198,7 @@ SQLITE_PRIVATE void sqlite3FinishTrigger( Trigger *pLink = pTrig; Hash *pHash = &db->aDb[iDb].pSchema->trigHash; assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + assert( pLink!=0 ); pTrig = sqlite3HashInsert(pHash, zName, pTrig); if( pTrig ){ sqlite3OomFault(db); @@ -130381,6 +135317,9 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep( pTriggerStep->pIdList = pColumn; pTriggerStep->pUpsert = pUpsert; pTriggerStep->orconf = orconf; + if( pUpsert ){ + sqlite3HasExplicitNulls(pParse, pUpsert->pUpsertTarget); + } }else{ testcase( pColumn ); sqlite3IdListDelete(db, pColumn); @@ -130536,10 +135475,9 @@ SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ iDb = sqlite3SchemaToIndex(pParse->db, pTrigger->pSchema); assert( iDb>=0 && iDbnDb ); pTable = tableOfTrigger(pTrigger); - assert( pTable ); - assert( pTable->pSchema==pTrigger->pSchema || iDb==1 ); + assert( (pTable && pTable->pSchema==pTrigger->pSchema) || iDb==1 ); #ifndef SQLITE_OMIT_AUTHORIZATION - { + if( pTable ){ int code = SQLITE_DROP_TRIGGER; const char *zDb = db->aDb[iDb].zDbSName; const char *zTab = SCHEMA_TABLE(iDb); @@ -130553,7 +135491,6 @@ SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ /* Generate code to destroy the database record of the trigger. */ - assert( pTable!=0 ); if( (v = sqlite3GetVdbe(pParse))!=0 ){ sqlite3NestedParse(pParse, "DELETE FROM %Q.%s WHERE name=%Q AND type='trigger'", @@ -130577,9 +135514,15 @@ SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3 *db, int iDb, const ch if( ALWAYS(pTrigger) ){ if( pTrigger->pSchema==pTrigger->pTabSchema ){ Table *pTab = tableOfTrigger(pTrigger); - Trigger **pp; - for(pp=&pTab->pTrigger; *pp!=pTrigger; pp=&((*pp)->pNext)); - *pp = (*pp)->pNext; + if( pTab ){ + Trigger **pp; + for(pp=&pTab->pTrigger; *pp; pp=&((*pp)->pNext)){ + if( *pp==pTrigger ){ + *pp = (*pp)->pNext; + break; + } + } + } } sqlite3DeleteTrigger(db, pTrigger); db->mDbFlags |= DBFLAG_SchemaChange; @@ -130599,7 +135542,7 @@ static int checkColumnOverlap(IdList *pIdList, ExprList *pEList){ int e; if( pIdList==0 || NEVER(pEList==0) ) return 1; for(e=0; enExpr; e++){ - if( sqlite3IdListIndex(pIdList, pEList->a[e].zName)>=0 ) return 1; + if( sqlite3IdListIndex(pIdList, pEList->a[e].zEName)>=0 ) return 1; } return 0; } @@ -130654,7 +135597,7 @@ static SrcList *targetSrcList( int iDb; /* Index of the database to use */ SrcList *pSrc; /* SrcList to be returned */ - pSrc = sqlite3SrcListAppend(db, 0, 0, 0); + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( pSrc ){ assert( pSrc->nSrc>0 ); pSrc->a[pSrc->nSrc-1].zName = sqlite3DbStrDup(db, pStep->zTarget); @@ -130839,6 +135782,7 @@ static TriggerPrg *codeRowTrigger( pSubParse->zAuthContext = pTrigger->zName; pSubParse->eTriggerOp = pTrigger->op; pSubParse->nQueryLoop = pParse->nQueryLoop; + pSubParse->disableVtab = pParse->disableVtab; v = sqlite3GetVdbe(pSubParse); if( v ){ @@ -130866,7 +135810,7 @@ static TriggerPrg *codeRowTrigger( if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen) && db->mallocFailed==0 ){ - iEndTrigger = sqlite3VdbeMakeLabel(v); + iEndTrigger = sqlite3VdbeMakeLabel(pSubParse); sqlite3ExprIfFalse(pSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL); } sqlite3ExprDelete(db, pWhen); @@ -131190,6 +136134,57 @@ SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ #endif } +/* +** Check to see if column iCol of index pIdx references any of the +** columns defined by aXRef and chngRowid. Return true if it does +** and false if not. This is an optimization. False-positives are a +** performance degradation, but false-negatives can result in a corrupt +** index and incorrect answers. +** +** aXRef[j] will be non-negative if column j of the original table is +** being updated. chngRowid will be true if the rowid of the table is +** being updated. +*/ +static int indexColumnIsBeingUpdated( + Index *pIdx, /* The index to check */ + int iCol, /* Which column of the index to check */ + int *aXRef, /* aXRef[j]>=0 if column j is being updated */ + int chngRowid /* true if the rowid is being updated */ +){ + i16 iIdxCol = pIdx->aiColumn[iCol]; + assert( iIdxCol!=XN_ROWID ); /* Cannot index rowid */ + if( iIdxCol>=0 ){ + return aXRef[iIdxCol]>=0; + } + assert( iIdxCol==XN_EXPR ); + assert( pIdx->aColExpr!=0 ); + assert( pIdx->aColExpr->a[iCol].pExpr!=0 ); + return sqlite3ExprReferencesUpdatedColumn(pIdx->aColExpr->a[iCol].pExpr, + aXRef,chngRowid); +} + +/* +** Check to see if index pIdx is a partial index whose conditional +** expression might change values due to an UPDATE. Return true if +** the index is subject to change and false if the index is guaranteed +** to be unchanged. This is an optimization. False-positives are a +** performance degradation, but false-negatives can result in a corrupt +** index and incorrect answers. +** +** aXRef[j] will be non-negative if column j of the original table is +** being updated. chngRowid will be true if the rowid of the table is +** being updated. +*/ +static int indexWhereClauseMightChange( + Index *pIdx, /* The index to check */ + int *aXRef, /* aXRef[j]>=0 if column j is being updated */ + int chngRowid /* true if the rowid is being updated */ +){ + if( pIdx->pPartIdxWhere==0 ) return 0; + return sqlite3ExprReferencesUpdatedColumn(pIdx->pPartIdxWhere, + aXRef, chngRowid); +} + /* ** Process an UPDATE statement. ** @@ -131207,7 +136202,7 @@ SQLITE_PRIVATE void sqlite3Update( Expr *pLimit, /* LIMIT clause. May be null */ Upsert *pUpsert /* ON CONFLICT clause, or null */ ){ - int i, j; /* Loop counters */ + int i, j, k; /* Loop counters */ Table *pTab; /* The table to be updated */ int addrTop = 0; /* VDBE instruction address of the start of the loop */ WhereInfo *pWInfo; /* Information about the WHERE clause */ @@ -131215,11 +136210,12 @@ SQLITE_PRIVATE void sqlite3Update( Index *pIdx; /* For looping over indices */ Index *pPk; /* The PRIMARY KEY index for WITHOUT ROWID tables */ int nIdx; /* Number of indices that need updating */ + int nAllIdx; /* Total number of indexes */ int iBaseCur; /* Base cursor number */ int iDataCur; /* Cursor for the canonical data btree */ int iIdxCur; /* Cursor for the first index */ sqlite3 *db; /* The database structure */ - int *aRegIdx = 0; /* First register in array assigned to each index */ + int *aRegIdx = 0; /* Registers for to each index and the main table */ int *aXRef = 0; /* aXRef[i] is the index in pChanges->a[] of the ** an expression for the i-th column of the table. ** aXRef[i]==-1 if the i-th column is not changed. */ @@ -131250,6 +136246,7 @@ SQLITE_PRIVATE void sqlite3Update( int iPk = 0; /* First of nPk cells holding PRIMARY KEY value */ i16 nPk = 0; /* Number of components of the PRIMARY KEY */ int bReplace = 0; /* True if REPLACE conflict resolution might happen */ + int bFinishSeek = 1; /* The OP_FinishSeek opcode is needed */ /* Register Allocations */ int regRowCount = 0; /* A count of rows changed */ @@ -131333,10 +136330,10 @@ SQLITE_PRIVATE void sqlite3Update( /* Allocate space for aXRef[], aRegIdx[], and aToOpen[]. ** Initialize aXRef[] and aToOpen[] to their default values. */ - aXRef = sqlite3DbMallocRawNN(db, sizeof(int) * (pTab->nCol+nIdx) + nIdx+2 ); + aXRef = sqlite3DbMallocRawNN(db, sizeof(int) * (pTab->nCol+nIdx+1) + nIdx+2 ); if( aXRef==0 ) goto update_cleanup; aRegIdx = aXRef+pTab->nCol; - aToOpen = (u8*)(aRegIdx+nIdx); + aToOpen = (u8*)(aRegIdx+nIdx+1); memset(aToOpen, 1, nIdx+1); aToOpen[nIdx+1] = 0; for(i=0; inCol; i++) aXRef[i] = -1; @@ -131348,6 +136345,10 @@ SQLITE_PRIVATE void sqlite3Update( sNC.uNC.pUpsert = pUpsert; sNC.ncFlags = NC_UUpsert; + /* Begin generating code. */ + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto update_cleanup; + /* Resolve the column names in all the expressions of the ** of the UPDATE statement. Also find the column index ** for each column to be updated in the pChanges array. For each @@ -131360,24 +136361,34 @@ SQLITE_PRIVATE void sqlite3Update( goto update_cleanup; } for(j=0; jnCol; j++){ - if( sqlite3StrICmp(pTab->aCol[j].zName, pChanges->a[i].zName)==0 ){ + if( sqlite3StrICmp(pTab->aCol[j].zName, pChanges->a[i].zEName)==0 ){ if( j==pTab->iPKey ){ chngRowid = 1; pRowidExpr = pChanges->a[i].pExpr; }else if( pPk && (pTab->aCol[j].colFlags & COLFLAG_PRIMKEY)!=0 ){ chngPk = 1; } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + else if( pTab->aCol[j].colFlags & COLFLAG_GENERATED ){ + testcase( pTab->aCol[j].colFlags & COLFLAG_VIRTUAL ); + testcase( pTab->aCol[j].colFlags & COLFLAG_STORED ); + sqlite3ErrorMsg(pParse, + "cannot UPDATE generated column \"%s\"", + pTab->aCol[j].zName); + goto update_cleanup; + } +#endif aXRef[j] = i; break; } } if( j>=pTab->nCol ){ - if( pPk==0 && sqlite3IsRowid(pChanges->a[i].zName) ){ + if( pPk==0 && sqlite3IsRowid(pChanges->a[i].zEName) ){ j = -1; chngRowid = 1; pRowidExpr = pChanges->a[i].pExpr; }else{ - sqlite3ErrorMsg(pParse, "no such column: %s", pChanges->a[i].zName); + sqlite3ErrorMsg(pParse, "no such column: %s", pChanges->a[i].zEName); pParse->checkSchema = 1; goto update_cleanup; } @@ -131401,6 +136412,33 @@ SQLITE_PRIVATE void sqlite3Update( assert( chngPk==0 || chngPk==1 ); chngKey = chngRowid + chngPk; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + /* Mark generated columns as changing if their generator expressions + ** reference any changing column. The actual aXRef[] value for + ** generated expressions is not used, other than to check to see that it + ** is non-negative, so the value of aXRef[] for generated columns can be + ** set to any non-negative number. We use 99999 so that the value is + ** obvious when looking at aXRef[] in a symbolic debugger. + */ + if( pTab->tabFlags & TF_HasGenerated ){ + int bProgress; + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + do{ + bProgress = 0; + for(i=0; inCol; i++){ + if( aXRef[i]>=0 ) continue; + if( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)==0 ) continue; + if( sqlite3ExprReferencesUpdatedColumn(pTab->aCol[i].pDflt, + aXRef, chngRowid) ){ + aXRef[i] = 99999; + bProgress = 1; + } + } + }while( bProgress ); + } +#endif + /* The SET expressions are not actually used inside the WHERE loop. ** So reset the colUsed mask. Unless this is a virtual table. In that ** case, set all bits of the colUsed mask (to ensure that the virtual @@ -131413,48 +136451,50 @@ SQLITE_PRIVATE void sqlite3Update( /* There is one entry in the aRegIdx[] array for each index on the table ** being updated. Fill in aRegIdx[] with a register number that will hold ** the key for accessing each index. - ** - ** FIXME: Be smarter about omitting indexes that use expressions. */ - for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ + if( onError==OE_Replace ) bReplace = 1; + for(nAllIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nAllIdx++){ int reg; - if( chngKey || hasFK>1 || pIdx->pPartIdxWhere || pIdx==pPk ){ + if( chngKey || hasFK>1 || pIdx==pPk + || indexWhereClauseMightChange(pIdx,aXRef,chngRowid) + ){ reg = ++pParse->nMem; pParse->nMem += pIdx->nColumn; }else{ reg = 0; for(i=0; inKeyCol; i++){ - i16 iIdxCol = pIdx->aiColumn[i]; - if( iIdxCol<0 || aXRef[iIdxCol]>=0 ){ + if( indexColumnIsBeingUpdated(pIdx, i, aXRef, chngRowid) ){ reg = ++pParse->nMem; pParse->nMem += pIdx->nColumn; - if( (onError==OE_Replace) - || (onError==OE_Default && pIdx->onError==OE_Replace) - ){ + if( onError==OE_Default && pIdx->onError==OE_Replace ){ bReplace = 1; } break; } } } - if( reg==0 ) aToOpen[j+1] = 0; - aRegIdx[j] = reg; + if( reg==0 ) aToOpen[nAllIdx+1] = 0; + aRegIdx[nAllIdx] = reg; } + aRegIdx[nAllIdx] = ++pParse->nMem; /* Register storing the table record */ if( bReplace ){ /* If REPLACE conflict resolution might be invoked, open cursors on all ** indexes in case they are needed to delete records. */ memset(aToOpen, 1, nIdx+1); } - /* Begin generating code. */ - v = sqlite3GetVdbe(pParse); - if( v==0 ) goto update_cleanup; if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); sqlite3BeginWriteOperation(pParse, pTrigger || hasFK, iDb); /* Allocate required registers. */ if( !IsVirtual(pTab) ){ - regRowSet = ++pParse->nMem; + /* For now, regRowSet and aRegIdx[nAllIdx] share the same register. + ** If regRowSet turns out to be needed, then aRegIdx[nAllIdx] will be + ** reallocated. aRegIdx[nAllIdx] is the register in which the main + ** table record is written. regRowSet holds the RowSet for the + ** two-pass update algorithm. */ + assert( aRegIdx[nAllIdx]==pParse->nMem ); + regRowSet = aRegIdx[nAllIdx]; regOldRowid = regNewRowid = ++pParse->nMem; if( chngPk || pTrigger || hasFK ){ regOld = pParse->nMem + 1; @@ -131502,7 +136542,7 @@ SQLITE_PRIVATE void sqlite3Update( #endif /* Jump to labelBreak to abandon further processing of this UPDATE */ - labelContinue = labelBreak = sqlite3VdbeMakeLabel(v); + labelContinue = labelBreak = sqlite3VdbeMakeLabel(pParse); /* Not an UPSERT. Normal processing. Begin by ** initialize the count of updated rows */ @@ -131540,6 +136580,7 @@ SQLITE_PRIVATE void sqlite3Update( pWInfo = 0; eOnePass = ONEPASS_SINGLE; sqlite3ExprIfFalse(pParse, pWhere, labelBreak, SQLITE_JUMPIFNULL); + bFinishSeek = 0; }else{ /* Begin the database scan. ** @@ -131566,6 +136607,7 @@ SQLITE_PRIVATE void sqlite3Update( ** strategy that uses an index for which one or more columns are being ** updated. */ eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); + bFinishSeek = sqlite3WhereUsesDeferredSeek(pWInfo); if( eOnePass!=ONEPASS_SINGLE ){ sqlite3MultiWrite(pParse); if( eOnePass==ONEPASS_MULTI ){ @@ -131584,6 +136626,8 @@ SQLITE_PRIVATE void sqlite3Update( ** leave it in register regOldRowid. */ sqlite3VdbeAddOp2(v, OP_Rowid, iDataCur, regOldRowid); if( eOnePass==ONEPASS_OFF ){ + /* We need to use regRowSet, so reallocate aRegIdx[nAllIdx] */ + aRegIdx[nAllIdx] = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_RowSetAdd, regRowSet, regOldRowid); } }else{ @@ -131594,7 +136638,8 @@ SQLITE_PRIVATE void sqlite3Update( ** is not required) and leave the PK fields in the array of registers. */ for(i=0; iaiColumn[i]>=0 ); - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur,pPk->aiColumn[i],iPk+i); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, + pPk->aiColumn[i], iPk+i); } if( eOnePass ){ if( addrOpen ) sqlite3VdbeChangeToNoop(v, addrOpen); @@ -131637,13 +136682,13 @@ SQLITE_PRIVATE void sqlite3Update( VdbeCoverage(v); } if( eOnePass!=ONEPASS_SINGLE ){ - labelContinue = sqlite3VdbeMakeLabel(v); + labelContinue = sqlite3VdbeMakeLabel(pParse); } sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak); VdbeCoverageIf(v, pPk==0); VdbeCoverageIf(v, pPk!=0); }else if( pPk ){ - labelContinue = sqlite3VdbeMakeLabel(v); + labelContinue = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v); addrTop = sqlite3VdbeAddOp2(v, OP_RowData, iEph, regKey); sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0); @@ -131675,14 +136720,16 @@ SQLITE_PRIVATE void sqlite3Update( pTrigger, pChanges, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onError ); for(i=0; inCol; i++){ + u32 colFlags = pTab->aCol[i].colFlags; + k = sqlite3TableColumnToStorage(pTab, i) + regOld; if( oldmask==0xffffffff || (i<32 && (oldmask & MASKBIT32(i))!=0) - || (pTab->aCol[i].colFlags & COLFLAG_PRIMKEY)!=0 + || (colFlags & COLFLAG_PRIMKEY)!=0 ){ testcase( oldmask!=0xffffffff && i==31 ); - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, regOld+i); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k); }else{ - sqlite3VdbeAddOp2(v, OP_Null, 0, regOld+i); + sqlite3VdbeAddOp2(v, OP_Null, 0, k); } } if( chngRowid==0 && pPk==0 ){ @@ -131706,13 +136753,15 @@ SQLITE_PRIVATE void sqlite3Update( newmask = sqlite3TriggerColmask( pParse, pTrigger, pChanges, 1, TRIGGER_BEFORE, pTab, onError ); - for(i=0; inCol; i++){ + for(i=0, k=regNew; inCol; i++, k++){ if( i==pTab->iPKey ){ - sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i); + sqlite3VdbeAddOp2(v, OP_Null, 0, k); + }else if( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)!=0 ){ + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) k--; }else{ j = aXRef[i]; if( j>=0 ){ - sqlite3ExprCode(pParse, pChanges->a[j].pExpr, regNew+i); + sqlite3ExprCode(pParse, pChanges->a[j].pExpr, k); }else if( 0==(tmask&TRIGGER_BEFORE) || i>31 || (newmask & MASKBIT32(i)) ){ /* This branch loads the value of a column that will not be changed ** into a register. This is done if there are no BEFORE triggers, or @@ -131721,12 +136770,20 @@ SQLITE_PRIVATE void sqlite3Update( */ testcase( i==31 ); testcase( i==32 ); - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, regNew+i); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k); + bFinishSeek = 0; }else{ - sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i); + sqlite3VdbeAddOp2(v, OP_Null, 0, k); } } } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pTab->tabFlags & TF_HasGenerated ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + sqlite3ComputeGeneratedColumns(pParse, regNew, pTab); + } +#endif /* Fire any BEFORE UPDATE triggers. This happens before constraints are ** verified. One could argue that this is wrong. @@ -131759,38 +136816,58 @@ SQLITE_PRIVATE void sqlite3Update( ** BEFORE trigger runs. See test case trigger1-18.0 (added 2018-04-26) ** for an example. */ - for(i=0; inCol; i++){ - if( aXRef[i]<0 && i!=pTab->iPKey ){ - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, regNew+i); + for(i=0, k=regNew; inCol; i++, k++){ + if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) k--; + }else if( aXRef[i]<0 && i!=pTab->iPKey ){ + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k); } } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pTab->tabFlags & TF_HasGenerated ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + sqlite3ComputeGeneratedColumns(pParse, regNew, pTab); + } +#endif } if( !isView ){ - int addr1 = 0; /* Address of jump instruction */ - /* Do constraint checks. */ assert( regOldRowid>0 ); sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur, regNewRowid, regOldRowid, chngKey, onError, labelContinue, &bReplace, aXRef, 0); - /* Do FK constraint checks. */ - if( hasFK ){ - sqlite3FkCheck(pParse, pTab, regOldRowid, 0, aXRef, chngKey); - } - - /* Delete the index entries associated with the current record. */ + /* If REPLACE conflict handling may have been used, or if the PK of the + ** row is changing, then the GenerateConstraintChecks() above may have + ** moved cursor iDataCur. Reseek it. */ if( bReplace || chngKey ){ if( pPk ){ - addr1 = sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, 0, regKey, nKey); + sqlite3VdbeAddOp4Int(v, OP_NotFound,iDataCur,labelContinue,regKey,nKey); }else{ - addr1 = sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, 0, regOldRowid); + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue,regOldRowid); } VdbeCoverageNeverTaken(v); } + + /* Do FK constraint checks. */ + if( hasFK ){ + sqlite3FkCheck(pParse, pTab, regOldRowid, 0, aXRef, chngKey); + } + + /* Delete the index entries associated with the current record. */ sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, aRegIdx, -1); + /* We must run the OP_FinishSeek opcode to resolve a prior + ** OP_DeferredSeek if there is any possibility that there have been + ** no OP_Column opcodes since the OP_DeferredSeek was issued. But + ** we want to avoid the OP_FinishSeek if possible, as running it + ** costs CPU cycles. */ + if( bFinishSeek ){ + sqlite3VdbeAddOp1(v, OP_FinishSeek, iDataCur); + } + /* If changing the rowid value, or if there are foreign key constraints ** to process, delete the old record. Otherwise, add a noop OP_Delete ** to invoke the pre-update hook. @@ -131818,9 +136895,6 @@ SQLITE_PRIVATE void sqlite3Update( sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, 0); } #endif - if( bReplace || chngKey ){ - sqlite3VdbeJumpHere(v, addr1); - } if( hasFK ){ sqlite3FkCheck(pParse, pTab, 0, regNewRowid, aXRef, chngKey); @@ -131970,11 +137044,12 @@ static void updateVirtualTable( /* Populate the argument registers. */ for(i=0; inCol; i++){ + assert( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)==0 ); if( aXRef[i]>=0 ){ sqlite3ExprCode(pParse, pChanges->a[aXRef[i]].pExpr, regArg+2+i); }else{ sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, i, regArg+2+i); - sqlite3VdbeChangeP5(v, 1); /* Enable sqlite3_vtab_nochange() */ + sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG);/* Enable sqlite3_vtab_nochange() */ } } if( HasRowid(pTab) ){ @@ -132259,6 +137334,7 @@ SQLITE_PRIVATE void sqlite3UpsertDoUpdate( sqlite3 *db = pParse->db; SrcList *pSrc; /* FROM clause for the UPDATE */ int iDataCur; + int i; assert( v!=0 ); assert( pUpsert!=0 ); @@ -132275,12 +137351,11 @@ SQLITE_PRIVATE void sqlite3UpsertDoUpdate( Index *pPk = sqlite3PrimaryKeyIndex(pTab); int nPk = pPk->nKeyCol; int iPk = pParse->nMem+1; - int i; pParse->nMem += nPk; for(i=0; iaiColumn[i]>=0 ); - k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]); + k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[i]); sqlite3VdbeAddOp3(v, OP_Column, iCur, k, iPk+i); VdbeComment((v, "%s.%s", pIdx->zName, pTab->aCol[pPk->aiColumn[i]].zName)); @@ -132290,12 +137365,19 @@ SQLITE_PRIVATE void sqlite3UpsertDoUpdate( VdbeCoverage(v); sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CORRUPT, OE_Abort, 0, "corrupt database", P4_STATIC); + sqlite3MayAbort(pParse); sqlite3VdbeJumpHere(v, i); } } /* pUpsert does not own pUpsertSrc - the outer INSERT statement does. So ** we have to make a copy before passing it down into sqlite3Update() */ pSrc = sqlite3SrcListDup(db, pUpsert->pUpsertSrc, 0); + /* excluded.* columns of type REAL need to be converted to a hard real */ + for(i=0; inCol; i++){ + if( pTab->aCol[i].affinity==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, pUpsert->regData+i); + } + } sqlite3Update(pParse, pSrc, pUpsert->pUpsertSet, pUpsert->pUpsertWhere, OE_Abort, 0, 0, pUpsert); pUpsert->pUpsertSet = 0; /* Will have been deleted by sqlite3Update() */ @@ -132411,16 +137493,17 @@ static int execSqlF(sqlite3 *db, char **pzErrMsg, const char *zSql, ...){ ** transient would cause the database file to appear to be deleted ** following reboot. */ -SQLITE_PRIVATE void sqlite3Vacuum(Parse *pParse, Token *pNm){ +SQLITE_PRIVATE void sqlite3Vacuum(Parse *pParse, Token *pNm, Expr *pInto){ Vdbe *v = sqlite3GetVdbe(pParse); int iDb = 0; - if( v==0 ) return; + if( v==0 ) goto build_vacuum_end; + if( pParse->nErr ) goto build_vacuum_end; if( pNm ){ #ifndef SQLITE_BUG_COMPATIBLE_20160819 /* Default behavior: Report an error if the argument to VACUUM is ** not recognized */ iDb = sqlite3TwoPartName(pParse, pNm, pNm, &pNm); - if( iDb<0 ) return; + if( iDb<0 ) goto build_vacuum_end; #else /* When SQLITE_BUG_COMPATIBLE_20160819 is defined, unrecognized arguments ** to VACUUM are silently ignored. This is a back-out of a bug fix that @@ -132432,37 +137515,63 @@ SQLITE_PRIVATE void sqlite3Vacuum(Parse *pParse, Token *pNm){ #endif } if( iDb!=1 ){ - sqlite3VdbeAddOp1(v, OP_Vacuum, iDb); + int iIntoReg = 0; + if( pInto && sqlite3ResolveSelfReference(pParse,0,0,pInto,0)==0 ){ + iIntoReg = ++pParse->nMem; + sqlite3ExprCode(pParse, pInto, iIntoReg); + } + sqlite3VdbeAddOp2(v, OP_Vacuum, iDb, iIntoReg); sqlite3VdbeUsesBtree(v, iDb); } +build_vacuum_end: + sqlite3ExprDelete(pParse->db, pInto); return; } /* ** This routine implements the OP_Vacuum opcode of the VDBE. */ -SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ +SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( + char **pzErrMsg, /* Write error message here */ + sqlite3 *db, /* Database connection */ + int iDb, /* Which attached DB to vacuum */ + sqlite3_value *pOut /* Write results here, if not NULL. VACUUM INTO */ +){ int rc = SQLITE_OK; /* Return code from service routines */ Btree *pMain; /* The database being vacuumed */ Btree *pTemp; /* The temporary database we vacuum into */ - u16 saved_mDbFlags; /* Saved value of db->mDbFlags */ - u32 saved_flags; /* Saved value of db->flags */ + u32 saved_mDbFlags; /* Saved value of db->mDbFlags */ + u64 saved_flags; /* Saved value of db->flags */ int saved_nChange; /* Saved value of db->nChange */ int saved_nTotalChange; /* Saved value of db->nTotalChange */ + u32 saved_openFlags; /* Saved value of db->openFlags */ u8 saved_mTrace; /* Saved trace settings */ Db *pDb = 0; /* Database to detach at end of vacuum */ int isMemDb; /* True if vacuuming a :memory: database */ int nRes; /* Bytes of reserved space at the end of each page */ int nDb; /* Number of attached databases */ const char *zDbMain; /* Schema name of database to vacuum */ + const char *zOut; /* Name of output file */ if( !db->autoCommit ){ sqlite3SetString(pzErrMsg, db, "cannot VACUUM from within a transaction"); - return SQLITE_ERROR; + return SQLITE_ERROR; /* IMP: R-12218-18073 */ } if( db->nVdbeActive>1 ){ sqlite3SetString(pzErrMsg, db,"cannot VACUUM - SQL statements in progress"); - return SQLITE_ERROR; + return SQLITE_ERROR; /* IMP: R-15610-35227 */ + } + saved_openFlags = db->openFlags; + if( pOut ){ + if( sqlite3_value_type(pOut)!=SQLITE_TEXT ){ + sqlite3SetString(pzErrMsg, db, "non-text filename"); + return SQLITE_ERROR; + } + zOut = (const char*)sqlite3_value_text(pOut); + db->openFlags &= ~SQLITE_OPEN_READONLY; + db->openFlags |= SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE; + }else{ + zOut = ""; } /* Save the current value of the database flags so that it can be @@ -132475,7 +137584,8 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ saved_mTrace = db->mTrace; db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks; db->mDbFlags |= DBFLAG_PreferBuiltin | DBFLAG_Vacuum; - db->flags &= ~(SQLITE_ForeignKeys | SQLITE_ReverseOrder | SQLITE_CountRows); + db->flags &= ~(u64)(SQLITE_ForeignKeys | SQLITE_ReverseOrder + | SQLITE_Defensive | SQLITE_CountRows); db->mTrace = 0; zDbMain = db->aDb[iDb].zDbSName; @@ -132497,19 +137607,23 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ ** to write the journal header file. */ nDb = db->nDb; - rc = execSql(db, pzErrMsg, "ATTACH''AS vacuum_db"); + rc = execSqlF(db, pzErrMsg, "ATTACH %Q AS vacuum_db", zOut); + db->openFlags = saved_openFlags; if( rc!=SQLITE_OK ) goto end_of_vacuum; assert( (db->nDb-1)==nDb ); pDb = &db->aDb[nDb]; assert( strcmp(pDb->zDbSName,"vacuum_db")==0 ); pTemp = pDb->pBt; - - /* The call to execSql() to attach the temp database has left the file - ** locked (as there was more than one active statement when the transaction - ** to read the schema was concluded. Unlock it here so that this doesn't - ** cause problems for the call to BtreeSetPageSize() below. */ - sqlite3BtreeCommit(pTemp); - + if( pOut ){ + sqlite3_file *id = sqlite3PagerFile(sqlite3BtreePager(pTemp)); + i64 sz = 0; + if( id->pMethods!=0 && (sqlite3OsFileSize(id, &sz)!=SQLITE_OK || sz>0) ){ + rc = SQLITE_ERROR; + sqlite3SetString(pzErrMsg, db, "output file already exists"); + goto end_of_vacuum; + } + db->mDbFlags |= DBFLAG_VacuumInto; + } nRes = sqlite3BtreeGetOptimalReserve(pMain); /* A VACUUM cannot change the pagesize of an encrypted database. */ @@ -132533,7 +137647,7 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ */ rc = execSql(db, pzErrMsg, "BEGIN"); if( rc!=SQLITE_OK ) goto end_of_vacuum; - rc = sqlite3BtreeBeginTrans(pMain, 2, 0); + rc = sqlite3BtreeBeginTrans(pMain, pOut==0 ? 2 : 0, 0); if( rc!=SQLITE_OK ) goto end_of_vacuum; /* Do not attempt to change the page size for a WAL database */ @@ -132628,7 +137742,7 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ }; assert( 1==sqlite3BtreeIsInTrans(pTemp) ); - assert( 1==sqlite3BtreeIsInTrans(pMain) ); + assert( pOut!=0 || 1==sqlite3BtreeIsInTrans(pMain) ); /* Copy Btree meta values */ for(i=0; iflags */ @@ -132721,6 +137841,9 @@ struct VtabCtx { ** Construct and install a Module object for a virtual table. When this ** routine is called, it is guaranteed that all appropriate locks are held ** and the module is not already part of the connection. +** +** If there already exists a module with zName, replace it with the new one. +** If pModule==0, then delete the module zName if it exists. */ SQLITE_PRIVATE Module *sqlite3VtabCreateModule( sqlite3 *db, /* Database in which module is registered */ @@ -132730,25 +137853,36 @@ SQLITE_PRIVATE Module *sqlite3VtabCreateModule( void (*xDestroy)(void *) /* Module destructor function */ ){ Module *pMod; - int nName = sqlite3Strlen30(zName); - pMod = (Module *)sqlite3Malloc(sizeof(Module) + nName + 1); - if( pMod==0 ){ - sqlite3OomFault(db); + Module *pDel; + char *zCopy; + if( pModule==0 ){ + zCopy = (char*)zName; + pMod = 0; }else{ - Module *pDel; - char *zCopy = (char *)(&pMod[1]); + int nName = sqlite3Strlen30(zName); + pMod = (Module *)sqlite3Malloc(sizeof(Module) + nName + 1); + if( pMod==0 ){ + sqlite3OomFault(db); + return 0; + } + zCopy = (char *)(&pMod[1]); memcpy(zCopy, zName, nName+1); pMod->zName = zCopy; pMod->pModule = pModule; pMod->pAux = pAux; pMod->xDestroy = xDestroy; pMod->pEpoTab = 0; - pDel = (Module *)sqlite3HashInsert(&db->aModule,zCopy,(void*)pMod); - assert( pDel==0 || pDel==pMod ); - if( pDel ){ + pMod->nRefModule = 1; + } + pDel = (Module *)sqlite3HashInsert(&db->aModule,zCopy,(void*)pMod); + if( pDel ){ + if( pDel==pMod ){ sqlite3OomFault(db); sqlite3DbFree(db, pDel); pMod = 0; + }else{ + sqlite3VtabEponymousTableClear(db, pDel); + sqlite3VtabModuleUnref(db, pDel); } } return pMod; @@ -132769,11 +137903,7 @@ static int createModule( int rc = SQLITE_OK; sqlite3_mutex_enter(db->mutex); - if( sqlite3HashFind(&db->aModule, zName) ){ - rc = SQLITE_MISUSE_BKPT; - }else{ - (void)sqlite3VtabCreateModule(db, zName, pModule, pAux, xDestroy); - } + (void)sqlite3VtabCreateModule(db, zName, pModule, pAux, xDestroy); rc = sqlite3ApiExit(db, rc); if( rc!=SQLITE_OK && xDestroy ) xDestroy(pAux); sqlite3_mutex_leave(db->mutex); @@ -132812,6 +137942,44 @@ SQLITE_API int sqlite3_create_module_v2( return createModule(db, zName, pModule, pAux, xDestroy); } +/* +** External API to drop all virtual-table modules, except those named +** on the azNames list. +*/ +SQLITE_API int sqlite3_drop_modules(sqlite3 *db, const char** azNames){ + HashElem *pThis, *pNext; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + for(pThis=sqliteHashFirst(&db->aModule); pThis; pThis=pNext){ + Module *pMod = (Module*)sqliteHashData(pThis); + pNext = sqliteHashNext(pThis); + if( azNames ){ + int ii; + for(ii=0; azNames[ii]!=0 && strcmp(azNames[ii],pMod->zName)!=0; ii++){} + if( azNames[ii]!=0 ) continue; + } + createModule(db, pMod->zName, 0, 0, 0); + } + return SQLITE_OK; +} + +/* +** Decrement the reference count on a Module object. Destroy the +** module when the reference count reaches zero. +*/ +SQLITE_PRIVATE void sqlite3VtabModuleUnref(sqlite3 *db, Module *pMod){ + assert( pMod->nRefModule>0 ); + pMod->nRefModule--; + if( pMod->nRefModule==0 ){ + if( pMod->xDestroy ){ + pMod->xDestroy(pMod->pAux); + } + assert( pMod->pEpoTab==0 ); + sqlite3DbFree(db, pMod); + } +} + /* ** Lock the virtual table so that it cannot be disconnected. ** Locks nest. Every lock should have a corresponding unlock. @@ -132851,6 +138019,7 @@ SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *pVTab){ pVTab->nRef--; if( pVTab->nRef==0 ){ sqlite3_vtab *p = pVTab->pVtab; + sqlite3VtabModuleUnref(pVTab->db, pVTab->pMod); if( p ){ p->pModule->xDisconnect(p); } @@ -132945,12 +138114,12 @@ SQLITE_PRIVATE void sqlite3VtabDisconnect(sqlite3 *db, Table *p){ */ SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3 *db){ VTable *p = db->pDisconnect; - db->pDisconnect = 0; assert( sqlite3BtreeHoldsAllMutexes(db) ); assert( sqlite3_mutex_held(db->mutex) ); if( p ){ + db->pDisconnect = 0; sqlite3ExpirePreparedStatements(db, 0); do { VTable *pNext = p->pNext; @@ -132991,9 +138160,13 @@ SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table *p){ ** string will be freed automatically when the table is ** deleted. */ -static void addModuleArgument(sqlite3 *db, Table *pTable, char *zArg){ - int nBytes = sizeof(char *)*(2+pTable->nModuleArg); +static void addModuleArgument(Parse *pParse, Table *pTable, char *zArg){ + sqlite3_int64 nBytes = sizeof(char *)*(2+pTable->nModuleArg); char **azModuleArg; + sqlite3 *db = pParse->db; + if( pTable->nModuleArg+3>=db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many columns on %s", pTable->zName); + } azModuleArg = sqlite3DbRealloc(db, pTable->azModuleArg, nBytes); if( azModuleArg==0 ){ sqlite3DbFree(db, zArg); @@ -133017,7 +138190,6 @@ SQLITE_PRIVATE void sqlite3VtabBeginParse( Token *pModuleName, /* Name of the module for the virtual table */ int ifNotExists /* No error if the table already exists */ ){ - int iDb; /* The database the table is being created in */ Table *pTable; /* The new virtual table */ sqlite3 *db; /* Database connection */ @@ -133027,13 +138199,11 @@ SQLITE_PRIVATE void sqlite3VtabBeginParse( assert( 0==pTable->pIndex ); db = pParse->db; - iDb = sqlite3SchemaToIndex(db, pTable->pSchema); - assert( iDb>=0 ); assert( pTable->nModuleArg==0 ); - addModuleArgument(db, pTable, sqlite3NameFromToken(db, pModuleName)); - addModuleArgument(db, pTable, 0); - addModuleArgument(db, pTable, sqlite3DbStrDup(db, pTable->zName)); + addModuleArgument(pParse, pTable, sqlite3NameFromToken(db, pModuleName)); + addModuleArgument(pParse, pTable, 0); + addModuleArgument(pParse, pTable, sqlite3DbStrDup(db, pTable->zName)); assert( (pParse->sNameToken.z==pName2->z && pName2->z!=0) || (pParse->sNameToken.z==pName1->z && pName2->z==0) ); @@ -133048,6 +138218,8 @@ SQLITE_PRIVATE void sqlite3VtabBeginParse( ** The second call, to obtain permission to create the table, is made now. */ if( pTable->azModuleArg ){ + int iDb = sqlite3SchemaToIndex(db, pTable->pSchema); + assert( iDb>=0 ); /* The database the table is being created in */ sqlite3AuthCheck(pParse, SQLITE_CREATE_VTABLE, pTable->zName, pTable->azModuleArg[0], pParse->db->aDb[iDb].zDbSName); } @@ -133064,7 +138236,7 @@ static void addArgumentToVtab(Parse *pParse){ const char *z = (const char*)pParse->sArg.z; int n = pParse->sArg.n; sqlite3 *db = pParse->db; - addModuleArgument(db, pParse->pNewTable, sqlite3DbStrNDup(db, z, n)); + addModuleArgument(pParse, pParse->pNewTable, sqlite3DbStrNDup(db, z, n)); } } @@ -133094,6 +138266,8 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ int iReg; Vdbe *v; + sqlite3MayAbort(pParse); + /* Compute the complete text of the CREATE VIRTUAL TABLE statement */ if( pEnd ){ pParse->sNameToken.n = (int)(pEnd->z - pParse->sNameToken.z) + pEnd->n; @@ -133119,13 +138293,13 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ zStmt, pParse->regRowid ); - sqlite3DbFree(db, zStmt); v = sqlite3GetVdbe(pParse); sqlite3ChangeCookie(pParse, iDb); sqlite3VdbeAddOp0(v, OP_Expire); - zWhere = sqlite3MPrintf(db, "name='%q' AND type='table'", pTab->zName); + zWhere = sqlite3MPrintf(db, "name=%Q AND sql=%Q", pTab->zName, zStmt); sqlite3VdbeAddParseSchemaOp(v, iDb, zWhere); + sqlite3DbFree(db, zStmt); iReg = ++pParse->nMem; sqlite3VdbeLoadString(v, iReg, pTab->zName); @@ -133222,6 +138396,7 @@ static int vtabCallConstructor( } pVTable->db = db; pVTable->pMod = pMod; + pVTable->eVtabRisk = SQLITE_VTABRISK_Normal; iDb = sqlite3SchemaToIndex(db, pTab->pSchema); pTab->azModuleArg[1] = db->aDb[iDb].zDbSName; @@ -133252,6 +138427,7 @@ static int vtabCallConstructor( ** the sqlite3_vtab object if successful. */ memset(pVTable->pVtab, 0, sizeof(pVTable->pVtab[0])); pVTable->pVtab->pModule = pMod->pModule; + pMod->nRefModule++; pVTable->nRef = 1; if( sCtx.bDeclared==0 ){ const char *zFormat = "vtable constructor did not declare schema: %s"; @@ -133260,7 +138436,7 @@ static int vtabCallConstructor( rc = SQLITE_ERROR; }else{ int iCol; - u8 oooHidden = 0; + u16 oooHidden = 0; /* If everything went according to plan, link the new VTable structure ** into the linked list headed by pTab->pVTable. Then loop through the ** columns of the table to see if any of them contain the token "hidden". @@ -133353,7 +138529,8 @@ static int growVTrans(sqlite3 *db){ /* Grow the sqlite3.aVTrans array if required */ if( (db->nVTrans%ARRAY_INCR)==0 ){ VTable **aVTrans; - int nBytes = sizeof(sqlite3_vtab *) * (db->nVTrans + ARRAY_INCR); + sqlite3_int64 nBytes = sizeof(sqlite3_vtab*)* + ((sqlite3_int64)db->nVTrans + ARRAY_INCR); aVTrans = sqlite3DbRealloc(db, (void *)db->aVTrans, nBytes); if( !aVTrans ){ return SQLITE_NOMEM_BKPT; @@ -133525,7 +138702,9 @@ SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab } p = vtabDisconnectAll(db, pTab); xDestroy = p->pMod->pModule->xDestroy; - assert( xDestroy!=0 ); /* Checked before the virtual table is created */ + if( xDestroy==0 ) xDestroy = p->pMod->pModule->xDisconnect; + assert( xDestroy!=0 ); + pTab->nTabRef++; rc = xDestroy(p->pVtab); /* Remove the sqlite3_vtab* from the aVTrans[] array, if applicable */ if( rc==SQLITE_OK ){ @@ -133534,6 +138713,7 @@ SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab pTab->pVTable = 0; sqlite3VtabUnlock(p); } + sqlite3DeleteTable(db, pTab); } return rc; @@ -133691,6 +138871,7 @@ SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ const sqlite3_module *pMod = pVTab->pMod->pModule; if( pVTab->pVtab && pMod->iVersion>=2 ){ int (*xMethod)(sqlite3_vtab *, int); + sqlite3VtabLock(pVTab); switch( op ){ case SAVEPOINT_BEGIN: xMethod = pMod->xSavepoint; @@ -133706,6 +138887,7 @@ SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ if( xMethod && pVTab->iSavepoint>iSavepoint ){ rc = xMethod(pVTab->pVtab, iSavepoint); } + sqlite3VtabUnlock(pVTab); } } } @@ -133742,7 +138924,7 @@ SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction( /* Check to see the left operand is a column in a virtual table */ if( NEVER(pExpr==0) ) return pDef; if( pExpr->op!=TK_COLUMN ) return pDef; - pTab = pExpr->pTab; + pTab = pExpr->y.pTab; if( pTab==0 ) return pDef; if( !IsVirtual(pTab) ) return pDef; pVtab = sqlite3GetVTable(db, pTab)->pVtab; @@ -133847,9 +139029,9 @@ SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse *pParse, Module *pMod){ pTab->pSchema = db->aDb[0].pSchema; assert( pTab->nModuleArg==0 ); pTab->iPKey = -1; - addModuleArgument(db, pTab, sqlite3DbStrDup(db, pTab->zName)); - addModuleArgument(db, pTab, 0); - addModuleArgument(db, pTab, sqlite3DbStrDup(db, pTab->zName)); + addModuleArgument(pParse, pTab, sqlite3DbStrDup(db, pTab->zName)); + addModuleArgument(pParse, pTab, 0); + addModuleArgument(pParse, pTab, sqlite3DbStrDup(db, pTab->zName)); rc = vtabCallConstructor(db, pTab, pMod, pModule->xConnect, &zErr); if( rc ){ sqlite3ErrorMsg(pParse, "%s", zErr); @@ -133904,28 +139086,38 @@ SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *db){ SQLITE_API int sqlite3_vtab_config(sqlite3 *db, int op, ...){ va_list ap; int rc = SQLITE_OK; + VtabCtx *p; #ifdef SQLITE_ENABLE_API_ARMOR if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; #endif sqlite3_mutex_enter(db->mutex); - va_start(ap, op); - switch( op ){ - case SQLITE_VTAB_CONSTRAINT_SUPPORT: { - VtabCtx *p = db->pVtabCtx; - if( !p ){ - rc = SQLITE_MISUSE_BKPT; - }else{ - assert( p->pTab==0 || IsVirtual(p->pTab) ); + p = db->pVtabCtx; + if( !p ){ + rc = SQLITE_MISUSE_BKPT; + }else{ + assert( p->pTab==0 || IsVirtual(p->pTab) ); + va_start(ap, op); + switch( op ){ + case SQLITE_VTAB_CONSTRAINT_SUPPORT: { p->pVTable->bConstraint = (u8)va_arg(ap, int); + break; + } + case SQLITE_VTAB_INNOCUOUS: { + p->pVTable->eVtabRisk = SQLITE_VTABRISK_Low; + break; + } + case SQLITE_VTAB_DIRECTONLY: { + p->pVTable->eVtabRisk = SQLITE_VTABRISK_High; + break; + } + default: { + rc = SQLITE_MISUSE_BKPT; + break; } - break; } - default: - rc = SQLITE_MISUSE_BKPT; - break; + va_end(ap); } - va_end(ap); if( rc!=SQLITE_OK ) sqlite3Error(db, rc); sqlite3_mutex_leave(db->mutex); @@ -133974,6 +139166,8 @@ SQLITE_API int sqlite3_vtab_config(sqlite3 *db, int op, ...){ ** planner logic in "where.c". These definitions are broken out into ** a separate source file for easier editing. */ +#ifndef SQLITE_WHEREINT_H +#define SQLITE_WHEREINT_H /* ** Trace output macros @@ -134029,13 +139223,15 @@ struct WhereLevel { int addrCont; /* Jump here to continue with the next loop cycle */ int addrFirst; /* First instruction of interior of the loop */ int addrBody; /* Beginning of the body of this loop */ + int regBignull; /* big-null flag reg. True if a NULL-scan is needed */ + int addrBignull; /* Jump here for next part of big-null scan */ #ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS u32 iLikeRepCntr; /* LIKE range processing counter register (times 2) */ int addrLikeRep; /* LIKE range processing address */ #endif u8 iFrom; /* Which entry in the FROM clause */ u8 op, p3, p5; /* Opcode, P3 & P5 of the opcode that ends the loop */ - int p1, p2; /* Operands of the opcode used to ends the loop */ + int p1, p2; /* Operands of the opcode used to end the loop */ union { /* Information that depends on pWLoop->wsFlags */ struct { int nIn; /* Number of entries in aInLoop[] */ @@ -134086,7 +139282,7 @@ struct WhereLoop { u16 nEq; /* Number of equality constraints */ u16 nBtm; /* Size of BTM vector */ u16 nTop; /* Size of TOP vector */ - u16 nIdxCol; /* Index column used for ORDER BY */ + u16 nDistinctCol; /* Index columns used to sort for DISTINCT */ Index *pIndex; /* Index used, or NULL */ } btree; struct { /* Information for virtual tables */ @@ -134230,22 +139426,22 @@ struct WhereTerm { /* ** Allowed values of WhereTerm.wtFlags */ -#define TERM_DYNAMIC 0x01 /* Need to call sqlite3ExprDelete(db, pExpr) */ -#define TERM_VIRTUAL 0x02 /* Added by the optimizer. Do not code */ -#define TERM_CODED 0x04 /* This term is already coded */ -#define TERM_COPIED 0x08 /* Has a child */ -#define TERM_ORINFO 0x10 /* Need to free the WhereTerm.u.pOrInfo object */ -#define TERM_ANDINFO 0x20 /* Need to free the WhereTerm.u.pAndInfo obj */ -#define TERM_OR_OK 0x40 /* Used during OR-clause processing */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 -# define TERM_VNULL 0x80 /* Manufactured x>NULL or x<=NULL term */ -#else -# define TERM_VNULL 0x00 /* Disabled if not using stat3 */ -#endif -#define TERM_LIKEOPT 0x100 /* Virtual terms from the LIKE optimization */ -#define TERM_LIKECOND 0x200 /* Conditionally this LIKE operator term */ -#define TERM_LIKE 0x400 /* The original LIKE operator */ -#define TERM_IS 0x800 /* Term.pExpr is an IS operator */ +#define TERM_DYNAMIC 0x0001 /* Need to call sqlite3ExprDelete(db, pExpr) */ +#define TERM_VIRTUAL 0x0002 /* Added by the optimizer. Do not code */ +#define TERM_CODED 0x0004 /* This term is already coded */ +#define TERM_COPIED 0x0008 /* Has a child */ +#define TERM_ORINFO 0x0010 /* Need to free the WhereTerm.u.pOrInfo object */ +#define TERM_ANDINFO 0x0020 /* Need to free the WhereTerm.u.pAndInfo obj */ +#define TERM_OR_OK 0x0040 /* Used during OR-clause processing */ +#ifdef SQLITE_ENABLE_STAT4 +# define TERM_VNULL 0x0080 /* Manufactured x>NULL or x<=NULL term */ +#else +# define TERM_VNULL 0x0000 /* Disabled if not using stat4 */ +#endif +#define TERM_LIKEOPT 0x0100 /* Virtual terms from the LIKE optimization */ +#define TERM_LIKECOND 0x0200 /* Conditionally this LIKE operator term */ +#define TERM_LIKE 0x0400 /* The original LIKE operator */ +#define TERM_IS 0x0800 /* Term.pExpr is an IS operator */ #define TERM_VARSELECT 0x1000 /* Term.pExpr contains a correlated sub-query */ /* @@ -134357,17 +139553,52 @@ struct WhereLoopBuilder { ExprList *pOrderBy; /* ORDER BY clause */ WhereLoop *pNew; /* Template WhereLoop */ WhereOrSet *pOrSet; /* Record best loops here, if not NULL */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 UnpackedRecord *pRec; /* Probe for stat4 (if required) */ int nRecValid; /* Number of valid fields currently in pRec */ #endif unsigned int bldFlags; /* SQLITE_BLDF_* flags */ + unsigned int iPlanLimit; /* Search limiter */ }; /* Allowed values for WhereLoopBuider.bldFlags */ #define SQLITE_BLDF_INDEXED 0x0001 /* An index is used */ #define SQLITE_BLDF_UNIQUE 0x0002 /* All keys of a UNIQUE index used */ +/* The WhereLoopBuilder.iPlanLimit is used to limit the number of +** index+constraint combinations the query planner will consider for a +** particular query. If this parameter is unlimited, then certain +** pathological queries can spend excess time in the sqlite3WhereBegin() +** routine. The limit is high enough that is should not impact real-world +** queries. +** +** SQLITE_QUERY_PLANNER_LIMIT is the baseline limit. The limit is +** increased by SQLITE_QUERY_PLANNER_LIMIT_INCR before each term of the FROM +** clause is processed, so that every table in a join is guaranteed to be +** able to propose a some index+constraint combinations even if the initial +** baseline limit was exhausted by prior tables of the join. +*/ +#ifndef SQLITE_QUERY_PLANNER_LIMIT +# define SQLITE_QUERY_PLANNER_LIMIT 20000 +#endif +#ifndef SQLITE_QUERY_PLANNER_LIMIT_INCR +# define SQLITE_QUERY_PLANNER_LIMIT_INCR 1000 +#endif + +/* +** Each instance of this object records a change to a single node +** in an expression tree to cause that node to point to a column +** of an index rather than an expression or a virtual column. All +** such transformations need to be undone at the end of WHERE clause +** processing. +*/ +typedef struct WhereExprMod WhereExprMod; +struct WhereExprMod { + WhereExprMod *pNext; /* Next translation on a list of them all */ + Expr *pExpr; /* The Expr node that was transformed */ + Expr orig; /* Original value of the Expr node */ +}; + /* ** The WHERE clause processing routine has two halves. The ** first part does the start of the WHERE loop and the second @@ -134384,23 +139615,25 @@ struct WhereInfo { ExprList *pOrderBy; /* The ORDER BY clause or NULL */ ExprList *pResultSet; /* Result set of the query */ Expr *pWhere; /* The complete WHERE clause */ - LogEst iLimit; /* LIMIT if wctrlFlags has WHERE_USE_LIMIT */ int aiCurOnePass[2]; /* OP_OpenWrite cursors for the ONEPASS opt */ int iContinue; /* Jump here to continue with next record */ int iBreak; /* Jump here to break out of the loop */ int savedNQueryLoop; /* pParse->nQueryLoop outside the WHERE loop */ u16 wctrlFlags; /* Flags originally passed to sqlite3WhereBegin() */ + LogEst iLimit; /* LIMIT if wctrlFlags has WHERE_USE_LIMIT */ u8 nLevel; /* Number of nested loop */ i8 nOBSat; /* Number of ORDER BY terms satisfied by indices */ - u8 sorted; /* True if really sorted (not just grouped) */ u8 eOnePass; /* ONEPASS_OFF, or _SINGLE, or _MULTI */ - u8 untestedTerms; /* Not all WHERE terms resolved by outer loop */ u8 eDistinct; /* One of the WHERE_DISTINCT_* values */ - u8 bOrderedInnerLoop; /* True if only the inner-most loop is ordered */ + unsigned bDeferredSeek :1; /* Uses OP_DeferredSeek */ + unsigned untestedTerms :1; /* Not all WHERE terms resolved by outer loop */ + unsigned bOrderedInnerLoop:1;/* True if only the inner-most loop is ordered */ + unsigned sorted :1; /* True if really sorted (not just grouped) */ + LogEst nRowOut; /* Estimated number of output rows */ int iTop; /* The very beginning of the WHERE loop */ WhereLoop *pLoops; /* List of all WhereLoop objects */ + WhereExprMod *pExprMods; /* Expression modifications */ Bitmask revMask; /* Mask of ORDER BY terms that need reversing */ - LogEst nRowOut; /* Estimated number of output rows */ WhereClause sWC; /* Decomposition of the WHERE clause */ WhereMaskSet sMaskSet; /* Map cursor numbers to bitmasks */ WhereLevel a[1]; /* Information about each nest loop in WHERE */ @@ -134414,6 +139647,8 @@ struct WhereInfo { SQLITE_PRIVATE Bitmask sqlite3WhereGetMask(WhereMaskSet*,int); #ifdef WHERETRACE_ENABLED SQLITE_PRIVATE void sqlite3WhereClausePrint(WhereClause *pWC); +SQLITE_PRIVATE void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm); +SQLITE_PRIVATE void sqlite3WhereLoopPrint(WhereLoop *p, WhereClause *pWC); #endif SQLITE_PRIVATE WhereTerm *sqlite3WhereFindTerm( WhereClause *pWC, /* The WHERE clause to be searched */ @@ -134446,8 +139681,11 @@ SQLITE_PRIVATE void sqlite3WhereAddScanStatus( # define sqlite3WhereAddScanStatus(a, b, c, d) ((void)d) #endif SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( + Parse *pParse, /* Parsing context */ + Vdbe *v, /* Prepared statement under construction */ WhereInfo *pWInfo, /* Complete information about the WHERE clause */ int iLevel, /* Which level of pWInfo->a[] should be coded */ + WhereLevel *pLevel, /* The current level pointer */ Bitmask notReady /* Which tables are currently available */ ); @@ -134520,6 +139758,9 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(Parse*, struct SrcList_item*, WhereC #define WHERE_UNQ_WANTED 0x00010000 /* WHERE_ONEROW would have been helpful*/ #define WHERE_PARTIALIDX 0x00020000 /* The automatic index is partial */ #define WHERE_IN_EARLYOUT 0x00040000 /* Perhaps quit IN loops early */ +#define WHERE_BIGNULL_SORT 0x00080000 /* Column nEq of index is BIGNULL */ + +#endif /* !defined(SQLITE_WHEREINT_H) */ /************** End of whereInt.h ********************************************/ /************** Continuing where we left off in wherecode.c ******************/ @@ -134717,6 +139958,7 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan( } #endif zMsg = sqlite3StrAccumFinish(&str); + sqlite3ExplainBreakpoint("",zMsg); ret = sqlite3VdbeAddOp4(v, OP_Explain, sqlite3VdbeCurrentAddr(v), pParse->addrExplain, 0, zMsg,P4_DYNAMIC); } @@ -134821,9 +140063,9 @@ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ ** Code an OP_Affinity opcode to apply the column affinity string zAff ** to the n registers starting at base. ** -** As an optimization, SQLITE_AFF_BLOB entries (which are no-ops) at the -** beginning and end of zAff are ignored. If all entries in zAff are -** SQLITE_AFF_BLOB, then no code gets generated. +** As an optimization, SQLITE_AFF_BLOB and SQLITE_AFF_NONE entries (which +** are no-ops) at the beginning and end of zAff are ignored. If all entries +** in zAff are SQLITE_AFF_BLOB or SQLITE_AFF_NONE, then no code gets generated. ** ** This routine makes its own copy of zAff so that the caller is free ** to modify zAff after this routine returns. @@ -134836,15 +140078,16 @@ static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){ } assert( v!=0 ); - /* Adjust base and n to skip over SQLITE_AFF_BLOB entries at the beginning - ** and end of the affinity string. + /* Adjust base and n to skip over SQLITE_AFF_BLOB and SQLITE_AFF_NONE + ** entries at the beginning and end of the affinity string. */ - while( n>0 && zAff[0]==SQLITE_AFF_BLOB ){ + assert( SQLITE_AFF_NONE0 && zAff[0]<=SQLITE_AFF_BLOB ){ n--; base++; zAff++; } - while( n>1 && zAff[n-1]==SQLITE_AFF_BLOB ){ + while( n>1 && zAff[n-1]<=SQLITE_AFF_BLOB ){ n--; } @@ -134917,7 +140160,8 @@ static Expr *removeUnindexableInClauseTerms( Expr *pX /* The IN expression to be reduced */ ){ sqlite3 *db = pParse->db; - Expr *pNew = sqlite3ExprDup(db, pX, 0); + Expr *pNew; + pNew = sqlite3ExprDup(db, pX, 0); if( db->mallocFailed==0 ){ ExprList *pOrigRhs = pNew->x.pSelect->pEList; /* Original unmodified RHS */ ExprList *pOrigLhs = pNew->pLeft->x.pList; /* Original unmodified LHS */ @@ -134929,7 +140173,7 @@ static Expr *removeUnindexableInClauseTerms( for(i=iEq; inLTerm; i++){ if( pLoop->aLTerm[i]->pExpr==pX ){ int iField = pLoop->aLTerm[i]->iField - 1; - assert( pOrigRhs->a[iField].pExpr!=0 ); + if( pOrigRhs->a[iField].pExpr==0 ) continue; /* Duplicate PK column */ pRhs = sqlite3ExprListAppend(pParse, pRhs, pOrigRhs->a[iField].pExpr); pOrigRhs->a[iField].pExpr = 0; assert( pOrigLhs->a[iField].pExpr!=0 ); @@ -135042,16 +140286,17 @@ static int codeEqualityTerm( if( pLoop->aLTerm[i]->pExpr==pX ) nEq++; } + iTab = 0; if( (pX->flags & EP_xIsSelect)==0 || pX->x.pSelect->pEList->nExpr==1 ){ - eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0); + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab); }else{ sqlite3 *db = pParse->db; pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); if( !db->mallocFailed ){ aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); - eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap); - pTerm->pExpr->iTable = pX->iTable; + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab); + pTerm->pExpr->iTable = iTab; } sqlite3ExprDelete(db, pX); pX = pTerm->pExpr; @@ -135061,7 +140306,6 @@ static int codeEqualityTerm( testcase( bRev ); bRev = !bRev; } - iTab = pX->iTable; sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iTab, 0); VdbeCoverageIf(v, bRev); VdbeCoverageIf(v, !bRev); @@ -135069,7 +140313,7 @@ static int codeEqualityTerm( pLoop->wsFlags |= WHERE_IN_ABLE; if( pLevel->u.in.nIn==0 ){ - pLevel->addrNxt = sqlite3VdbeMakeLabel(v); + pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse); } i = pLevel->u.in.nIn; @@ -135085,7 +140329,6 @@ static int codeEqualityTerm( if( pLoop->aLTerm[i]->pExpr==pX ){ int iOut = iReg + i - iEq; if( eType==IN_INDEX_ROWID ){ - testcase( nEq>1 ); /* Happens with a UNIQUE index on ROWID */ pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iOut); }else{ int iCol = aiMap ? aiMap[iMap++] : 0; @@ -135095,7 +140338,7 @@ static int codeEqualityTerm( if( i==iEq ){ pIn->iCur = iTab; pIn->eEndLoopOp = bRev ? OP_Prev : OP_Next; - if( iEq>0 && (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 ){ + if( iEq>0 ){ pIn->iBase = iReg - i; pIn->nPrefix = i; pLoop->wsFlags |= WHERE_IN_EARLYOUT; @@ -135326,7 +140569,7 @@ static int codeCursorHintCheckExpr(Walker *pWalker, Expr *pExpr){ assert( pHint->pIdx!=0 ); if( pExpr->op==TK_COLUMN && pExpr->iTable==pHint->iTabCur - && sqlite3ColumnOfIndex(pHint->pIdx, pExpr->iColumn)<0 + && sqlite3TableColumnToIndex(pHint->pIdx, pExpr->iColumn)<0 ){ pWalker->eCode = 1; } @@ -135394,7 +140637,7 @@ static int codeCursorHintFixExpr(Walker *pWalker, Expr *pExpr){ pExpr->iTable = reg; }else if( pHint->pIdx!=0 ){ pExpr->iTable = pHint->iIdxCur; - pExpr->iColumn = sqlite3ColumnOfIndex(pHint->pIdx, pExpr->iColumn); + pExpr->iColumn = sqlite3TableColumnToIndex(pHint->pIdx, pExpr->iColumn); assert( pExpr->iColumn>=0 ); } }else if( pExpr->op==TK_AGG_FUNCTION ){ @@ -135503,7 +140746,7 @@ static void codeCursorHint( } /* If we survive all prior tests, that means this term is worth hinting */ - pExpr = sqlite3ExprAnd(db, pExpr, sqlite3ExprDup(db, pTerm->pExpr, 0)); + pExpr = sqlite3ExprAnd(pParse, pExpr, sqlite3ExprDup(db, pTerm->pExpr, 0)); } if( pExpr!=0 ){ sWalker.xExprCallback = codeCursorHintFixExpr; @@ -135547,6 +140790,7 @@ static void codeDeferredSeek( assert( iIdxCur>0 ); assert( pIdx->aiColumn[pIdx->nColumn-1]==-1 ); + pWInfo->bDeferredSeek = 1; sqlite3VdbeAddOp3(v, OP_DeferredSeek, iIdxCur, 0, iCur); if( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE) && DbMaskAllZero(sqlite3ParseToplevel(pParse)->writeMask) @@ -135557,8 +140801,12 @@ static void codeDeferredSeek( if( ai ){ ai[0] = pTab->nCol; for(i=0; inColumn-1; i++){ + int x1, x2; assert( pIdx->aiColumn[i]nCol ); - if( pIdx->aiColumn[i]>=0 ) ai[pIdx->aiColumn[i]+1] = i+1; + x1 = pIdx->aiColumn[i]; + x2 = sqlite3TableColumnToStorage(pTab, x1); + testcase( x1!=x2 ); + if( x1>=0 ) ai[x2+1] = i+1; } sqlite3VdbeChangeP4(v, -1, (char*)ai, P4_INTARRAY); } @@ -135580,7 +140828,9 @@ static void codeExprOrVector(Parse *pParse, Expr *p, int iReg, int nReg){ #ifndef SQLITE_OMIT_SUBQUERY if( (p->flags & EP_xIsSelect) ){ Vdbe *v = pParse->pVdbe; - int iSelect = sqlite3CodeSubselect(pParse, p, 0, 0); + int iSelect; + assert( p->op==TK_SELECT ); + iSelect = sqlite3CodeSubselect(pParse, p); sqlite3VdbeAddOp3(v, OP_Copy, iSelect, iReg, nReg-1); }else #endif @@ -135607,8 +140857,24 @@ typedef struct IdxExprTrans { int iTabCur; /* The cursor of the corresponding table */ int iIdxCur; /* The cursor for the index */ int iIdxCol; /* The column for the index */ + int iTabCol; /* The column for the table */ + WhereInfo *pWInfo; /* Complete WHERE clause information */ + sqlite3 *db; /* Database connection (for malloc()) */ } IdxExprTrans; +/* +** Preserve pExpr on the WhereETrans list of the WhereInfo. +*/ +static void preserveExpr(IdxExprTrans *pTrans, Expr *pExpr){ + WhereExprMod *pNew; + pNew = sqlite3DbMallocRaw(pTrans->db, sizeof(*pNew)); + if( pNew==0 ) return; + pNew->pNext = pTrans->pWInfo->pExprMods; + pTrans->pWInfo->pExprMods = pNew; + pNew->pExpr = pExpr; + memcpy(&pNew->orig, pExpr, sizeof(*pExpr)); +} + /* The walker node callback used to transform matching expressions into ** a reference to an index column for an index on an expression. ** @@ -135618,20 +140884,49 @@ typedef struct IdxExprTrans { static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ IdxExprTrans *pX = p->u.pIdxTrans; if( sqlite3ExprCompare(0, pExpr, pX->pIdxExpr, pX->iTabCur)==0 ){ + preserveExpr(pX, pExpr); + pExpr->affExpr = sqlite3ExprAffinity(pExpr); pExpr->op = TK_COLUMN; pExpr->iTable = pX->iIdxCur; pExpr->iColumn = pX->iIdxCol; - pExpr->pTab = 0; + pExpr->y.pTab = 0; + testcase( ExprHasProperty(pExpr, EP_Skip) ); + testcase( ExprHasProperty(pExpr, EP_Unlikely) ); + ExprClearProperty(pExpr, EP_Skip|EP_Unlikely); return WRC_Prune; }else{ return WRC_Continue; } } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* A walker node callback that translates a column reference to a table +** into a corresponding column reference of an index. +*/ +static int whereIndexExprTransColumn(Walker *p, Expr *pExpr){ + if( pExpr->op==TK_COLUMN ){ + IdxExprTrans *pX = p->u.pIdxTrans; + if( pExpr->iTable==pX->iTabCur && pExpr->iColumn==pX->iTabCol ){ + assert( pExpr->y.pTab!=0 ); + preserveExpr(pX, pExpr); + pExpr->affExpr = sqlite3TableColumnAffinity(pExpr->y.pTab,pExpr->iColumn); + pExpr->iTable = pX->iIdxCur; + pExpr->iColumn = pX->iIdxCol; + pExpr->y.pTab = 0; + } + } + return WRC_Continue; +} +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + /* ** For an indexes on expression X, locate every instance of expression X ** in pExpr and change that subexpression into a reference to the appropriate ** column of the index. +** +** 2019-10-24: Updated to also translate references to a VIRTUAL column in +** the table into references to the corresponding (stored) column of the +** index. */ static void whereIndexExprTrans( Index *pIdx, /* The Index */ @@ -135641,47 +140936,102 @@ static void whereIndexExprTrans( ){ int iIdxCol; /* Column number of the index */ ExprList *aColExpr; /* Expressions that are indexed */ + Table *pTab; Walker w; IdxExprTrans x; aColExpr = pIdx->aColExpr; - if( aColExpr==0 ) return; /* Not an index on expressions */ + if( aColExpr==0 && !pIdx->bHasVCol ){ + /* The index does not reference any expressions or virtual columns + ** so no translations are needed. */ + return; + } + pTab = pIdx->pTable; memset(&w, 0, sizeof(w)); - w.xExprCallback = whereIndexExprTransNode; w.u.pIdxTrans = &x; x.iTabCur = iTabCur; x.iIdxCur = iIdxCur; - for(iIdxCol=0; iIdxColnExpr; iIdxCol++){ - if( pIdx->aiColumn[iIdxCol]!=XN_EXPR ) continue; - assert( aColExpr->a[iIdxCol].pExpr!=0 ); + x.pWInfo = pWInfo; + x.db = pWInfo->pParse->db; + for(iIdxCol=0; iIdxColnColumn; iIdxCol++){ + i16 iRef = pIdx->aiColumn[iIdxCol]; + if( iRef==XN_EXPR ){ + assert( aColExpr->a[iIdxCol].pExpr!=0 ); + x.pIdxExpr = aColExpr->a[iIdxCol].pExpr; + if( sqlite3ExprIsConstant(x.pIdxExpr) ) continue; + w.xExprCallback = whereIndexExprTransNode; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + }else if( iRef>=0 + && (pTab->aCol[iRef].colFlags & COLFLAG_VIRTUAL)!=0 + && (pTab->aCol[iRef].zColl==0 + || sqlite3StrICmp(pTab->aCol[iRef].zColl, sqlite3StrBINARY)==0) + ){ + /* Check to see if there are direct references to generated columns + ** that are contained in the index. Pulling the generated column + ** out of the index is an optimization only - the main table is always + ** available if the index cannot be used. To avoid unnecessary + ** complication, omit this optimization if the collating sequence for + ** the column is non-standard */ + x.iTabCol = iRef; + w.xExprCallback = whereIndexExprTransColumn; +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + }else{ + continue; + } x.iIdxCol = iIdxCol; - x.pIdxExpr = aColExpr->a[iIdxCol].pExpr; sqlite3WalkExpr(&w, pWInfo->pWhere); sqlite3WalkExprList(&w, pWInfo->pOrderBy); sqlite3WalkExprList(&w, pWInfo->pResultSet); } } +/* +** The pTruth expression is always true because it is the WHERE clause +** a partial index that is driving a query loop. Look through all of the +** WHERE clause terms on the query, and if any of those terms must be +** true because pTruth is true, then mark those WHERE clause terms as +** coded. +*/ +static void whereApplyPartialIndexConstraints( + Expr *pTruth, + int iTabCur, + WhereClause *pWC +){ + int i; + WhereTerm *pTerm; + while( pTruth->op==TK_AND ){ + whereApplyPartialIndexConstraints(pTruth->pLeft, iTabCur, pWC); + pTruth = pTruth->pRight; + } + for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ + Expr *pExpr; + if( pTerm->wtFlags & TERM_CODED ) continue; + pExpr = pTerm->pExpr; + if( sqlite3ExprCompare(0, pExpr, pTruth, iTabCur)==0 ){ + pTerm->wtFlags |= TERM_CODED; + } + } +} + /* ** Generate code for the start of the iLevel-th loop in the WHERE clause ** implementation described by pWInfo. */ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( + Parse *pParse, /* Parsing context */ + Vdbe *v, /* Prepared statement under construction */ WhereInfo *pWInfo, /* Complete information about the WHERE clause */ int iLevel, /* Which level of pWInfo->a[] should be coded */ + WhereLevel *pLevel, /* The current level pointer */ Bitmask notReady /* Which tables are currently available */ ){ int j, k; /* Loop counters */ int iCur; /* The VDBE cursor for the table */ int addrNxt; /* Where to jump to continue with the next IN case */ - int omitTable; /* True if we use the index only */ int bRev; /* True if we need to scan in reverse order */ - WhereLevel *pLevel; /* The where level to be coded */ WhereLoop *pLoop; /* The WhereLoop object being coded */ WhereClause *pWC; /* Decomposition of the entire WHERE clause */ WhereTerm *pTerm; /* A WHERE clause term */ - Parse *pParse; /* Parsing context */ sqlite3 *db; /* Database connection */ - Vdbe *v; /* The prepared stmt under constructions */ struct SrcList_item *pTabItem; /* FROM clause term being coded */ int addrBrk; /* Jump here to break out of the loop */ int addrHalt; /* addrBrk for the outermost loop */ @@ -135691,19 +141041,29 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( Index *pIdx = 0; /* Index used by loop (if any) */ int iLoop; /* Iteration of constraint generator loop */ - pParse = pWInfo->pParse; - v = pParse->pVdbe; pWC = &pWInfo->sWC; db = pParse->db; - pLevel = &pWInfo->a[iLevel]; pLoop = pLevel->pWLoop; pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; iCur = pTabItem->iCursor; pLevel->notReady = notReady & ~sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur); bRev = (pWInfo->revMask>>iLevel)&1; - omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 - && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0; VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName)); +#if WHERETRACE_ENABLED /* 0x20800 */ + if( sqlite3WhereTrace & 0x800 ){ + sqlite3DebugPrintf("Coding level %d of %d: notReady=%llx iFrom=%d\n", + iLevel, pWInfo->nLevel, (u64)notReady, pLevel->iFrom); + sqlite3WhereLoopPrint(pLoop, pWC); + } + if( sqlite3WhereTrace & 0x20000 ){ + if( iLevel==0 ){ + sqlite3DebugPrintf("WHERE clause being coded:\n"); + sqlite3TreeViewExpr(0, pWInfo->pWhere, 0); + } + sqlite3DebugPrintf("All WHERE-clause terms before coding:\n"); + sqlite3WhereClausePrint(pWC); + } +#endif /* Create labels for the "break" and "continue" instructions ** for the current loop. Jump to addrBrk to break out of a loop. @@ -135715,8 +141075,8 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** there are no IN operators in the constraints, the "addrNxt" label ** is the same as "addrBrk". */ - addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(v); - addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(v); + addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse); + addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(pParse); /* If this is the right table of a LEFT OUTER JOIN, allocate and ** initialize a memory cell that records if this table matches any @@ -135783,9 +141143,12 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( iIn = pLevel->u.in.nIn; for(j=nConstraint-1; j>=0; j--){ pTerm = pLoop->aLTerm[j]; + if( (pTerm->eOperator & WO_IN)!=0 ) iIn--; if( j<16 && (pLoop->u.vtab.omitMask>>j)&1 ){ disableTerm(pLevel, pTerm); - }else if( (pTerm->eOperator & WO_IN)!=0 ){ + }else if( (pTerm->eOperator & WO_IN)!=0 + && sqlite3ExprVectorSize(pTerm->pExpr->pLeft)==1 + ){ Expr *pCompare; /* The comparison operator */ Expr *pRight; /* RHS of the comparison */ VdbeOp *pOp; /* Opcode to access the value of the IN constraint */ @@ -135796,8 +141159,8 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** encoding of the value in the register, so it *must* be reloaded. */ assert( pLevel->u.in.aInLoop!=0 || db->mallocFailed ); if( !db->mallocFailed ){ - assert( iIn>0 ); - pOp = sqlite3VdbeGetOp(v, pLevel->u.in.aInLoop[--iIn].addrInTop); + assert( iIn>=0 && iInu.in.nIn ); + pOp = sqlite3VdbeGetOp(v, pLevel->u.in.aInLoop[iIn].addrInTop); assert( pOp->opcode==OP_Column || pOp->opcode==OP_Rowid ); assert( pOp->opcode!=OP_Column || pOp->p3==iReg+j+2 ); assert( pOp->opcode!=OP_Rowid || pOp->p2==iReg+j+2 ); @@ -135821,6 +141184,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( } } } + assert( iIn==0 || db->mallocFailed ); /* These registers need to be preserved in case there is an IN operator ** loop. So we could deallocate the registers here (and potentially ** reuse them later) if (pLoop->wsFlags & WHERE_IN_ABLE)==0. But it seems @@ -135843,7 +141207,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( pTerm = pLoop->aLTerm[0]; assert( pTerm!=0 ); assert( pTerm->pExpr!=0 ); - assert( omitTable==0 ); testcase( pTerm->wtFlags & TERM_VIRTUAL ); iReleaseReg = ++pParse->nMem; iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, 0, bRev, iReleaseReg); @@ -135852,6 +141215,9 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeAddOp3(v, OP_SeekRowid, iCur, addrNxt, iRowidReg); VdbeCoverage(v); pLevel->op = OP_Noop; + if( (pTerm->prereqAll & pLevel->notReady)==0 ){ + pTerm->wtFlags |= TERM_CODED; + } }else if( (pLoop->wsFlags & WHERE_IPK)!=0 && (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0 ){ @@ -135862,7 +141228,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( int memEndValue = 0; WhereTerm *pStart, *pEnd; - assert( omitTable==0 ); j = 0; pStart = pEnd = 0; if( pLoop->wsFlags & WHERE_BTM_LIMIT ) pStart = pLoop->aLTerm[j++]; @@ -136026,31 +141391,13 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( char *zEndAff = 0; /* Affinity for end of range constraint */ u8 bSeekPastNull = 0; /* True to seek past initial nulls */ u8 bStopAtNull = 0; /* Add condition to terminate at NULLs */ + int omitTable; /* True if we use the index only */ + int regBignull = 0; /* big-null flag register */ pIdx = pLoop->u.btree.pIndex; iIdxCur = pLevel->iIdxCur; assert( nEq>=pLoop->nSkip ); - /* If this loop satisfies a sort order (pOrderBy) request that - ** was passed to this function to implement a "SELECT min(x) ..." - ** query, then the caller will only allow the loop to run for - ** a single iteration. This means that the first row returned - ** should not have a NULL value stored in 'x'. If column 'x' is - ** the first one after the nEq equality constraints in the index, - ** this requires some special handling. - */ - assert( pWInfo->pOrderBy==0 - || pWInfo->pOrderBy->nExpr==1 - || (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 ); - if( (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)!=0 - && pWInfo->nOBSat>0 - && (pIdx->nKeyCol>nEq) - ){ - assert( pLoop->nSkip==0 ); - bSeekPastNull = 1; - nExtraReg = 1; - } - /* Find any inequality constraint terms for the start and end ** of the range. */ @@ -136091,6 +141438,25 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( } assert( pRangeEnd==0 || (pRangeEnd->wtFlags & TERM_VNULL)==0 ); + /* If the WHERE_BIGNULL_SORT flag is set, then index column nEq uses + ** a non-default "big-null" sort (either ASC NULLS LAST or DESC NULLS + ** FIRST). In both cases separate ordered scans are made of those + ** index entries for which the column is null and for those for which + ** it is not. For an ASC sort, the non-NULL entries are scanned first. + ** For DESC, NULL entries are scanned first. + */ + if( (pLoop->wsFlags & (WHERE_TOP_LIMIT|WHERE_BTM_LIMIT))==0 + && (pLoop->wsFlags & WHERE_BIGNULL_SORT)!=0 + ){ + assert( bSeekPastNull==0 && nExtraReg==0 && nBtm==0 && nTop==0 ); + assert( pRangeEnd==0 && pRangeStart==0 ); + testcase( pLoop->nSkip>0 ); + nExtraReg = 1; + bSeekPastNull = 1; + pLevel->regBignull = regBignull = ++pParse->nMem; + pLevel->addrBignull = sqlite3VdbeMakeLabel(pParse); + } + /* If we are doing a reverse order scan on an ascending index, or ** a forward order scan on a descending index, interchange the ** start and end terms (pRangeStart and pRangeEnd). @@ -136113,7 +141479,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( if( zStartAff && nTop ){ zEndAff = sqlite3DbStrDup(db, &zStartAff[nEq]); } - addrNxt = pLevel->addrNxt; + addrNxt = (regBignull ? pLevel->addrBignull : pLevel->addrNxt); testcase( pRangeStart && (pRangeStart->eOperator & WO_LE)!=0 ); testcase( pRangeStart && (pRangeStart->eOperator & WO_GE)!=0 ); @@ -136147,10 +141513,14 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( } bSeekPastNull = 0; }else if( bSeekPastNull ){ + startEq = 0; sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); + start_constraints = 1; nConstraint++; - startEq = 0; + }else if( regBignull ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); start_constraints = 1; + nConstraint++; } codeApplyAffinity(pParse, regBase, nConstraint - bSeekPastNull, zStartAff); if( pLoop->nSkip>0 && nConstraint==pLoop->nSkip ){ @@ -136161,6 +141531,11 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( if( pLoop->wsFlags & WHERE_IN_EARLYOUT ){ sqlite3VdbeAddOp1(v, OP_SeekHit, iIdxCur); } + if( regBignull ){ + sqlite3VdbeAddOp2(v, OP_Integer, 1, regBignull); + VdbeComment((v, "NULL-scan pass ctr")); + } + op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; assert( op!=0 ); sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); @@ -136171,6 +141546,23 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); + + assert( bSeekPastNull==0 || bStopAtNull==0 ); + if( regBignull ){ + assert( bSeekPastNull==1 || bStopAtNull==1 ); + assert( bSeekPastNull==!bStopAtNull ); + assert( bStopAtNull==startEq ); + sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); + op = aStartOp[(nConstraint>1)*4 + 2 + bRev]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, + nConstraint-startEq); + VdbeCoverage(v); + VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); + VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); + VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); + VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); + assert( op==OP_Rewind || op==OP_Last || op==OP_SeekGE || op==OP_SeekLE); + } } /* Load the value for the inequality constraint at the end of the @@ -136202,8 +141594,10 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( endEq = 1; } }else if( bStopAtNull ){ - sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); - endEq = 0; + if( regBignull==0 ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); + endEq = 0; + } nConstraint++; } sqlite3DbFree(db, zStartAff); @@ -136214,6 +141608,12 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( /* Check if the index cursor is past the end of the range. */ if( nConstraint ){ + if( regBignull ){ + /* Except, skip the end-of-range check while doing the NULL-scan */ + sqlite3VdbeAddOp2(v, OP_IfNot, regBignull, sqlite3VdbeCurrentAddr(v)+3); + VdbeComment((v, "If NULL-scan 2nd pass")); + VdbeCoverage(v); + } op = aEndOp[bRev*2 + endEq]; sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); @@ -136221,19 +141621,38 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); } + if( regBignull ){ + /* During a NULL-scan, check to see if we have reached the end of + ** the NULLs */ + assert( bSeekPastNull==!bStopAtNull ); + assert( bSeekPastNull+bStopAtNull==1 ); + assert( nConstraint+bSeekPastNull>0 ); + sqlite3VdbeAddOp2(v, OP_If, regBignull, sqlite3VdbeCurrentAddr(v)+2); + VdbeComment((v, "If NULL-scan 1st pass")); + VdbeCoverage(v); + op = aEndOp[bRev*2 + bSeekPastNull]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, + nConstraint+bSeekPastNull); + testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); + testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); + testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); + testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); + } if( pLoop->wsFlags & WHERE_IN_EARLYOUT ){ sqlite3VdbeAddOp2(v, OP_SeekHit, iIdxCur, 1); } /* Seek the table cursor, if required */ + omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0; if( omitTable ){ /* pIdx is a covering index. No need to access the main table. */ }else if( HasRowid(pIdx->pTable) ){ - if( (pWInfo->wctrlFlags & WHERE_SEEK_TABLE) || ( - (pWInfo->wctrlFlags & WHERE_SEEK_UNIQ_TABLE) - && (pWInfo->eOnePass==ONEPASS_SINGLE) - )){ + if( (pWInfo->wctrlFlags & WHERE_SEEK_TABLE) + || ( (pWInfo->wctrlFlags & WHERE_SEEK_UNIQ_TABLE)!=0 + && (pWInfo->eOnePass==ONEPASS_SINGLE || pLoop->nLTerm==0) ) + ){ iRowidReg = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, iRowidReg); sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, iRowidReg); @@ -136245,27 +141664,53 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( Index *pPk = sqlite3PrimaryKeyIndex(pIdx->pTable); iRowidReg = sqlite3GetTempRange(pParse, pPk->nKeyCol); for(j=0; jnKeyCol; j++){ - k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[j]); + k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[j]); sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, iRowidReg+j); } sqlite3VdbeAddOp4Int(v, OP_NotFound, iCur, addrCont, iRowidReg, pPk->nKeyCol); VdbeCoverage(v); } - /* If pIdx is an index on one or more expressions, then look through - ** all the expressions in pWInfo and try to transform matching expressions - ** into reference to index columns. - ** - ** Do not do this for the RHS of a LEFT JOIN. This is because the - ** expression may be evaluated after OP_NullRow has been executed on - ** the cursor. In this case it is important to do the full evaluation, - ** as the result of the expression may not be NULL, even if all table - ** column values are. https://www.sqlite.org/src/info/7fa8049685b50b5a - */ if( pLevel->iLeftJoin==0 ){ - whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo); + /* If pIdx is an index on one or more expressions, then look through + ** all the expressions in pWInfo and try to transform matching expressions + ** into reference to index columns. Also attempt to translate references + ** to virtual columns in the table into references to (stored) columns + ** of the index. + ** + ** Do not do this for the RHS of a LEFT JOIN. This is because the + ** expression may be evaluated after OP_NullRow has been executed on + ** the cursor. In this case it is important to do the full evaluation, + ** as the result of the expression may not be NULL, even if all table + ** column values are. https://www.sqlite.org/src/info/7fa8049685b50b5a + ** + ** Also, do not do this when processing one index an a multi-index + ** OR clause, since the transformation will become invalid once we + ** move forward to the next index. + ** https://sqlite.org/src/info/4e8e4857d32d401f + */ + if( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ + whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo); + } + + /* If a partial index is driving the loop, try to eliminate WHERE clause + ** terms from the query that must be true due to the WHERE clause of + ** the partial index. + ** + ** 2019-11-02 ticket 623eff57e76d45f6: This optimization does not work + ** for a LEFT JOIN. + */ + if( pIdx->pPartIdxWhere ){ + whereApplyPartialIndexConstraints(pIdx->pPartIdxWhere, iCur, pWC); + } + }else{ + testcase( pIdx->pPartIdxWhere ); + /* The following assert() is not a requirement, merely an observation: + ** The OR-optimization doesn't work for the right hand table of + ** a LEFT JOIN: */ + assert( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ); } - + /* Record the instruction used to terminate the loop. */ if( pLoop->wsFlags & WHERE_ONEROW ){ pLevel->op = OP_Noop; @@ -136337,7 +141782,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( int regReturn = ++pParse->nMem; /* Register used with OP_Gosub */ int regRowset = 0; /* Register for RowSet object */ int regRowid = 0; /* Register holding rowid */ - int iLoopBody = sqlite3VdbeMakeLabel(v); /* Start of loop body */ + int iLoopBody = sqlite3VdbeMakeLabel(pParse);/* Start of loop body */ int iRetInit; /* Address of regReturn init */ int untestedTerms = 0; /* Some terms not completely tested */ int ii; /* Loop counter */ @@ -136426,10 +141871,15 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue; testcase( pWC->a[iTerm].wtFlags & TERM_ORINFO ); pExpr = sqlite3ExprDup(db, pExpr, 0); - pAndExpr = sqlite3ExprAnd(db, pAndExpr, pExpr); + pAndExpr = sqlite3ExprAnd(pParse, pAndExpr, pExpr); } if( pAndExpr ){ - pAndExpr = sqlite3PExpr(pParse, TK_AND|TKFLG_DONTFOLD, 0, pAndExpr); + /* The extra 0x10000 bit on the opcode is masked off and does not + ** become part of the new Expr.op. However, it does make the + ** op==TK_AND comparison inside of sqlite3PExpr() false, and this + ** prevents sqlite3PExpr() from implementing AND short-circuit + ** optimization, which we do not want here. */ + pAndExpr = sqlite3PExpr(pParse, TK_AND|0x10000, 0, pAndExpr); } } @@ -136445,14 +141895,15 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( WhereInfo *pSubWInfo; /* Info for single OR-term scan */ Expr *pOrExpr = pOrTerm->pExpr; /* Current OR clause term */ int jmp1 = 0; /* Address of jump operation */ - assert( (pTabItem[0].fg.jointype & JT_LEFT)==0 - || ExprHasProperty(pOrExpr, EP_FromJoin) - ); + testcase( (pTabItem[0].fg.jointype & JT_LEFT)!=0 + && !ExprHasProperty(pOrExpr, EP_FromJoin) + ); /* See TH3 vtab25.400 and ticket 614b25314c766238 */ if( pAndExpr ){ pAndExpr->pLeft = pOrExpr; pOrExpr = pAndExpr; } /* Loop through table entries that match term pOrTerm. */ + ExplainQueryPlan((pParse, 1, "INDEX %d", ii+1)); WHERETRACE(0xffff, ("Subplan for OR-clause:\n")); pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0, wctrlFlags, iCovCur); @@ -136486,7 +141937,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( r = sqlite3GetTempRange(pParse, nPk); for(iPk=0; iPkaiColumn[iPk]; - sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol, r+iPk); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol,r+iPk); } /* Check if the temp table already contains this key. If so, @@ -136556,6 +142007,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( /* Finish the loop through table entries that match term pOrTerm. */ sqlite3WhereEnd(pSubWInfo); + ExplainQueryPlanPop(pParse); } } } @@ -136570,7 +142022,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeGoto(v, pLevel->addrBrk); sqlite3VdbeResolveLabel(v, iLoopBody); - if( pWInfo->nLevel>1 ) sqlite3StackFree(db, pOrTab); + if( pWInfo->nLevel>1 ){ sqlite3StackFree(db, pOrTab); } if( !untestedTerms ) disableTerm(pLevel, pTerm); }else #endif /* SQLITE_OMIT_OR_OPTIMIZATION */ @@ -136657,8 +142109,9 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( u32 x = pLevel->iLikeRepCntr; if( x>0 ){ skipLikeAddr = sqlite3VdbeAddOp1(v, (x&1)?OP_IfNot:OP_If,(int)(x>>1)); + VdbeCoverageIf(v, (x&1)==1); + VdbeCoverageIf(v, (x&1)==0); } - VdbeCoverage(v); #endif } #ifdef WHERETRACE_ENABLED /* 0xffff */ @@ -136666,6 +142119,10 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( VdbeNoopComment((v, "WhereTerm[%d] (%p) priority=%d", pWC->nTerm-j, pTerm, iLoop)); } + if( sqlite3WhereTrace & 0x800 ){ + sqlite3DebugPrintf("Coding auxiliary constraint:\n"); + sqlite3WhereTermPrint(pTerm, pWC->nTerm-j); + } #endif sqlite3ExprIfFalse(pParse, pE, addrCont, SQLITE_JUMPIFNULL); if( skipLikeAddr ) sqlite3VdbeJumpHere(v, skipLikeAddr); @@ -136689,8 +142146,14 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) continue; if( (pTerm->eOperator & WO_EQUIV)==0 ) continue; if( pTerm->leftCursor!=iCur ) continue; - if( pLevel->iLeftJoin ) continue; + if( pTabItem->fg.jointype & JT_LEFT ) continue; pE = pTerm->pExpr; +#ifdef WHERETRACE_ENABLED /* 0x800 */ + if( sqlite3WhereTrace & 0x800 ){ + sqlite3DebugPrintf("Coding transitive constraint:\n"); + sqlite3WhereTermPrint(pTerm, pWC->nTerm-j); + } +#endif assert( !ExprHasProperty(pE, EP_FromJoin) ); assert( (pTerm->prereqRight & pLevel->notReady)!=0 ); pAlt = sqlite3WhereFindTerm(pWC, iCur, pTerm->u.leftColumn, notReady, @@ -136733,6 +142196,17 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( } } +#if WHERETRACE_ENABLED /* 0x20800 */ + if( sqlite3WhereTrace & 0x20000 ){ + sqlite3DebugPrintf("All WHERE-clause terms after coding level %d:\n", + iLevel); + sqlite3WhereClausePrint(pWC); + } + if( sqlite3WhereTrace & 0x800 ){ + sqlite3DebugPrintf("End Coding level %d: notReady=%llx\n", + iLevel, (u64)pLevel->notReady); + } +#endif return pLevel->notReady; } @@ -136824,7 +142298,7 @@ static int whereClauseInsert(WhereClause *pWC, Expr *p, u16 wtFlags){ }else{ pTerm->truthProb = 1; } - pTerm->pExpr = sqlite3ExprSkipCollate(p); + pTerm->pExpr = sqlite3ExprSkipCollateAndLikely(p); pTerm->wtFlags = wtFlags; pTerm->pWC = pWC; pTerm->iParent = -1; @@ -136849,31 +142323,14 @@ static int allowedOp(int op){ /* ** Commute a comparison operator. Expressions of the form "X op Y" ** are converted into "Y op X". -** -** If left/right precedence rules come into play when determining the -** collating sequence, then COLLATE operators are adjusted to ensure -** that the collating sequence does not change. For example: -** "Y collate NOCASE op X" becomes "X op Y" because any collation sequence on -** the left hand side of a comparison overrides any collation sequence -** attached to the right. For the same reason the EP_Collate flag -** is not commuted. -*/ -static void exprCommute(Parse *pParse, Expr *pExpr){ - u16 expRight = (pExpr->pRight->flags & EP_Collate); - u16 expLeft = (pExpr->pLeft->flags & EP_Collate); - assert( allowedOp(pExpr->op) && pExpr->op!=TK_IN ); - if( expRight==expLeft ){ - /* Either X and Y both have COLLATE operator or neither do */ - if( expRight ){ - /* Both X and Y have COLLATE operators. Make sure X is always - ** used by clearing the EP_Collate flag from Y. */ - pExpr->pRight->flags &= ~EP_Collate; - }else if( sqlite3ExprCollSeq(pParse, pExpr->pLeft)!=0 ){ - /* Neither X nor Y have COLLATE operators, but X has a non-default - ** collating sequence. So add the EP_Collate marker on X to cause - ** it to be searched first. */ - pExpr->pLeft->flags |= EP_Collate; - } +*/ +static u16 exprCommute(Parse *pParse, Expr *pExpr){ + if( pExpr->pLeft->op==TK_VECTOR + || pExpr->pRight->op==TK_VECTOR + || sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft, pExpr->pRight) != + sqlite3BinaryCompareCollSeq(pParse, pExpr->pRight, pExpr->pLeft) + ){ + pExpr->flags ^= EP_Commuted; } SWAP(Expr*,pExpr->pRight,pExpr->pLeft); if( pExpr->op>=TK_GT ){ @@ -136884,6 +142341,7 @@ static void exprCommute(Parse *pParse, Expr *pExpr){ assert( pExpr->op>=TK_GT && pExpr->op<=TK_GE ); pExpr->op = ((pExpr->op-TK_GT)^2)+TK_GT; } + return 0; } /* @@ -137002,27 +142460,38 @@ static int isLikeOrGlob( zNew[iTo++] = zNew[iFrom]; } zNew[iTo] = 0; + assert( iTo>0 ); - /* If the RHS begins with a digit or a minus sign, then the LHS must be - ** an ordinary column (not a virtual table column) with TEXT affinity. - ** Otherwise the LHS might be numeric and "lhs >= rhs" would be false - ** even though "lhs LIKE rhs" is true. But if the RHS does not start - ** with a digit or '-', then "lhs LIKE rhs" will always be false if - ** the LHS is numeric and so the optimization still works. + /* If the LHS is not an ordinary column with TEXT affinity, then the + ** pattern prefix boundaries (both the start and end boundaries) must + ** not look like a number. Otherwise the pattern might be treated as + ** a number, which will invalidate the LIKE optimization. ** - ** 2018-09-10 ticket c94369cae9b561b1f996d0054bfab11389f9d033 - ** The RHS pattern must not be '/%' because the termination condition - ** will then become "x<'0'" and if the affinity is numeric, will then - ** be converted into "x<0", which is incorrect. + ** Getting this right has been a persistent source of bugs in the + ** LIKE optimization. See, for example: + ** 2018-09-10 https://sqlite.org/src/info/c94369cae9b561b1 + ** 2019-05-02 https://sqlite.org/src/info/b043a54c3de54b28 + ** 2019-06-10 https://sqlite.org/src/info/fd76310a5e843e07 + ** 2019-06-14 https://sqlite.org/src/info/ce8717f0885af975 + ** 2019-09-03 https://sqlite.org/src/info/0f0428096f17252a */ - if( sqlite3Isdigit(zNew[0]) - || zNew[0]=='-' - || (zNew[0]+1=='0' && iTo==1) + if( pLeft->op!=TK_COLUMN + || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT + || IsVirtual(pLeft->y.pTab) /* Value might be numeric */ ){ - if( pLeft->op!=TK_COLUMN - || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT - || IsVirtual(pLeft->pTab) /* Value might be numeric */ - ){ + int isNum; + double rDummy; + isNum = sqlite3AtoF(zNew, &rDummy, iTo, SQLITE_UTF8); + if( isNum<=0 ){ + if( iTo==1 && zNew[0]=='-' ){ + isNum = +1; + }else{ + zNew[iTo-1]++; + isNum = sqlite3AtoF(zNew, &rDummy, iTo, SQLITE_UTF8); + zNew[iTo-1]--; + } + } + if( isNum>0 ){ sqlite3ExprDelete(db, pPrefix); sqlite3ValueFree(pVal); return 0; @@ -137122,7 +142591,7 @@ static int isAuxiliaryVtabOperator( ** MATCH(expression,vtab_column) */ pCol = pList->a[1].pExpr; - if( pCol->op==TK_COLUMN && IsVirtual(pCol->pTab) ){ + if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){ for(i=0; iu.zToken, aOp[i].zOp)==0 ){ *peOp2 = aOp[i].eOp2; @@ -137144,12 +142613,12 @@ static int isAuxiliaryVtabOperator( ** with function names in an arbitrary case. */ pCol = pList->a[0].pExpr; - if( pCol->op==TK_COLUMN && IsVirtual(pCol->pTab) ){ + if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){ sqlite3_vtab *pVtab; sqlite3_module *pMod; void (*xNotUsed)(sqlite3_context*,int,sqlite3_value**); void *pNotUsed; - pVtab = sqlite3GetVTable(db, pCol->pTab)->pVtab; + pVtab = sqlite3GetVTable(db, pCol->y.pTab)->pVtab; assert( pVtab!=0 ); assert( pVtab->pModule!=0 ); pMod = (sqlite3_module *)pVtab->pModule; @@ -137167,10 +142636,10 @@ static int isAuxiliaryVtabOperator( int res = 0; Expr *pLeft = pExpr->pLeft; Expr *pRight = pExpr->pRight; - if( pLeft->op==TK_COLUMN && IsVirtual(pLeft->pTab) ){ + if( pLeft->op==TK_COLUMN && IsVirtual(pLeft->y.pTab) ){ res++; } - if( pRight && pRight->op==TK_COLUMN && IsVirtual(pRight->pTab) ){ + if( pRight && pRight->op==TK_COLUMN && IsVirtual(pRight->y.pTab) ){ res++; SWAP(Expr*, pLeft, pRight); } @@ -137517,6 +142986,7 @@ static void exprAnalyzeOrTerm( ** and column is found but leave okToChngToIN false if not found. */ for(j=0; j<2 && !okToChngToIN; j++){ + Expr *pLeft = 0; pOrTerm = pOrWc->a; for(i=pOrWc->nTerm-1; i>=0; i--, pOrTerm++){ assert( pOrTerm->eOperator & WO_EQ ); @@ -137540,6 +143010,7 @@ static void exprAnalyzeOrTerm( } iColumn = pOrTerm->u.leftColumn; iCursor = pOrTerm->leftCursor; + pLeft = pOrTerm->pExpr->pLeft; break; } if( i<0 ){ @@ -137559,7 +143030,9 @@ static void exprAnalyzeOrTerm( assert( pOrTerm->eOperator & WO_EQ ); if( pOrTerm->leftCursor!=iCursor ){ pOrTerm->wtFlags &= ~TERM_OR_OK; - }else if( pOrTerm->u.leftColumn!=iColumn ){ + }else if( pOrTerm->u.leftColumn!=iColumn || (iColumn==XN_EXPR + && sqlite3ExprCompare(pParse, pOrTerm->pExpr->pLeft, pLeft, -1) + )){ okToChngToIN = 0; }else{ int affLeft, affRight; @@ -137646,7 +143119,7 @@ static int termIsEquivalence(Parse *pParse, Expr *pExpr){ ){ return 0; } - pColl = sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft, pExpr->pRight); + pColl = sqlite3ExprCompareCollSeq(pParse, pExpr); if( sqlite3IsBinary(pColl) ) return 1; return sqlite3ExprCollSeqMatch(pParse, pExpr->pLeft, pExpr->pRight); } @@ -137870,7 +143343,7 @@ static void exprAnalyze( pDup = pExpr; pNew = pTerm; } - exprCommute(pParse, pDup); + pNew->wtFlags |= exprCommute(pParse, pDup); pNew->leftCursor = aiCurCol[0]; pNew->u.leftColumn = aiCurCol[1]; testcase( (prereqLeft | extraRight) != prereqLeft ); @@ -138039,6 +143512,7 @@ static void exprAnalyze( 0, sqlite3ExprDup(db, pRight, 0)); if( ExprHasProperty(pExpr, EP_FromJoin) && pNewExpr ){ ExprSetProperty(pNewExpr, EP_FromJoin); + pNewExpr->iRightJoinTable = pExpr->iRightJoinTable; } idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); testcase( idxNew==0 ); @@ -138095,11 +143569,15 @@ static void exprAnalyze( ** expression). The WhereTerm.iField variable identifies the index within ** the vector on the LHS that the virtual term represents. ** - ** This only works if the RHS is a simple SELECT, not a compound + ** This only works if the RHS is a simple SELECT (not a compound) that does + ** not use window functions. */ if( pWC->op==TK_AND && pExpr->op==TK_IN && pTerm->iField==0 && pExpr->pLeft->op==TK_VECTOR && pExpr->x.pSelect->pPrior==0 +#ifndef SQLITE_OMIT_WINDOWFUNC + && pExpr->x.pSelect->pWin==0 +#endif ){ int i; for(i=0; ipLeft); i++){ @@ -138111,8 +143589,8 @@ static void exprAnalyze( } } -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 - /* When sqlite_stat3 histogram data is available an operator of the +#ifdef SQLITE_ENABLE_STAT4 + /* When sqlite_stat4 histogram data is available an operator of the ** form "x IS NOT NULL" can sometimes be evaluated more efficiently ** as "x>NULL" if x is not an INTEGER PRIMARY KEY. So construct a ** virtual term of that form. @@ -138122,7 +143600,8 @@ static void exprAnalyze( if( pExpr->op==TK_NOTNULL && pExpr->pLeft->op==TK_COLUMN && pExpr->pLeft->iColumn>=0 - && OptimizationEnabled(db, SQLITE_Stat34) + && !ExprHasProperty(pExpr, EP_FromJoin) + && OptimizationEnabled(db, SQLITE_Stat4) ){ Expr *pNewExpr; Expr *pLeft = pExpr->pLeft; @@ -138147,7 +143626,7 @@ static void exprAnalyze( pNewTerm->prereqAll = pTerm->prereqAll; } } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ /* Prevent ON clause terms of a LEFT JOIN from being used to drive ** an index for tables to the left of the join. @@ -138180,7 +143659,7 @@ static void exprAnalyze( ** all terms of the WHERE clause. */ SQLITE_PRIVATE void sqlite3WhereSplit(WhereClause *pWC, Expr *pExpr, u8 op){ - Expr *pE2 = sqlite3ExprSkipCollate(pExpr); + Expr *pE2 = sqlite3ExprSkipCollateAndLikely(pExpr); pWC->op = op; if( pE2==0 ) return; if( pE2->op!=op ){ @@ -138255,6 +143734,13 @@ SQLITE_PRIVATE Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){ }else if( p->x.pList ){ mask |= sqlite3WhereExprListUsage(pMaskSet, p->x.pList); } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( (p->op==TK_FUNCTION || p->op==TK_AGG_FUNCTION) && p->y.pWin ){ + mask |= sqlite3WhereExprListUsage(pMaskSet, p->y.pWin->pPartition); + mask |= sqlite3WhereExprListUsage(pMaskSet, p->y.pWin->pOrderBy); + mask |= sqlite3WhereExprUsage(pMaskSet, p->y.pWin->pFilter); + } +#endif return mask; } SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet *pMaskSet, Expr *p){ @@ -138313,6 +143799,7 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs( pArgs = pItem->u1.pFuncArg; if( pArgs==0 ) return; for(j=k=0; jnExpr; j++){ + Expr *pRhs; while( knCol && (pTab->aCol[k].colFlags & COLFLAG_HIDDEN)==0 ){k++;} if( k>=pTab->nCol ){ sqlite3ErrorMsg(pParse, "too many arguments on %s() - max %d", @@ -138323,9 +143810,13 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs( if( pColRef==0 ) return; pColRef->iTable = pItem->iCursor; pColRef->iColumn = k++; - pColRef->pTab = pTab; - pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef, - sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0)); + pColRef->y.pTab = pTab; + pRhs = sqlite3PExpr(pParse, TK_UPLUS, + sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0), 0); + pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef, pRhs); + if( pItem->fg.jointype & JT_LEFT ){ + sqlite3SetJoinExpr(pTerm, pItem->iCursor); + } whereClauseInsert(pWC, pTerm, TERM_DYNAMIC); } } @@ -138454,7 +143945,7 @@ SQLITE_PRIVATE int sqlite3WhereBreakLabel(WhereInfo *pWInfo){ /* ** Return ONEPASS_OFF (0) if an UPDATE or DELETE statement is unable to -** operate directly on the rowis returned by a WHERE clause. Return +** operate directly on the rowids returned by a WHERE clause. Return ** ONEPASS_SINGLE (1) if the statement can operation directly because only ** a single row is to be changed. Return ONEPASS_MULTI (2) if the one-pass ** optimization can be used on multiple @@ -138481,6 +143972,14 @@ SQLITE_PRIVATE int sqlite3WhereOkOnePass(WhereInfo *pWInfo, int *aiCur){ return pWInfo->eOnePass; } +/* +** Return TRUE if the WHERE loop uses the OP_DeferredSeek opcode to move +** the data cursor to the row selected by the index cursor. +*/ +SQLITE_PRIVATE int sqlite3WhereUsesDeferredSeek(WhereInfo *pWInfo){ + return pWInfo->bDeferredSeek; +} + /* ** Move the content of pSrc into pDest */ @@ -138587,7 +144086,8 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ ){ if( (pTerm->eOperator & WO_EQUIV)!=0 && pScan->nEquivaiCur) - && (pX = sqlite3ExprSkipCollate(pTerm->pExpr->pRight))->op==TK_COLUMN + && (pX = sqlite3ExprSkipCollateAndLikely(pTerm->pExpr->pRight))->op + ==TK_COLUMN ){ int j; for(j=0; jnEquiv; j++){ @@ -138612,8 +144112,7 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ continue; } assert(pX->pLeft); - pColl = sqlite3BinaryCompareCollSeq(pParse, - pX->pLeft, pX->pRight); + pColl = sqlite3ExprCompareCollSeq(pParse, pX); if( pColl==0 ) pColl = pParse->db->pDfltColl; if( sqlite3StrICmp(pColl->zName, pScan->zCollName) ){ continue; @@ -138644,6 +144143,17 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ return 0; } +/* +** This is whereScanInit() for the case of an index on an expression. +** It is factored out into a separate tail-recursion subroutine so that +** the normal whereScanInit() routine, which is a high-runner, does not +** need to push registers onto the stack as part of its prologue. +*/ +static SQLITE_NOINLINE WhereTerm *whereScanInitIndexExpr(WhereScan *pScan){ + pScan->idxaff = sqlite3ExprAffinity(pScan->pIdxExpr); + return whereScanNext(pScan); +} + /* ** Initialize a WHERE clause scanner object. Return a pointer to the ** first match. Return NULL if there are no matches. @@ -138676,12 +144186,19 @@ static WhereTerm *whereScanInit( pScan->pIdxExpr = 0; pScan->idxaff = 0; pScan->zCollName = 0; + pScan->opMask = opMask; + pScan->k = 0; + pScan->aiCur[0] = iCur; + pScan->nEquiv = 1; + pScan->iEquiv = 1; if( pIdx ){ int j = iColumn; iColumn = pIdx->aiColumn[j]; if( iColumn==XN_EXPR ){ pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; pScan->zCollName = pIdx->azColl[j]; + pScan->aiColumn[0] = XN_EXPR; + return whereScanInitIndexExpr(pScan); }else if( iColumn==pIdx->pTable->iPKey ){ iColumn = XN_ROWID; }else if( iColumn>=0 ){ @@ -138691,12 +144208,7 @@ static WhereTerm *whereScanInit( }else if( iColumn==XN_EXPR ){ return 0; } - pScan->opMask = opMask; - pScan->k = 0; - pScan->aiCur[0] = iCur; pScan->aiColumn[0] = iColumn; - pScan->nEquiv = 1; - pScan->iEquiv = 1; return whereScanNext(pScan); } @@ -138770,7 +144282,7 @@ static int findIndexCol( const char *zColl = pIdx->azColl[iCol]; for(i=0; inExpr; i++){ - Expr *p = sqlite3ExprSkipCollate(pList->a[i].pExpr); + Expr *p = sqlite3ExprSkipCollateAndLikely(pList->a[i].pExpr); if( p->op==TK_COLUMN && p->iColumn==pIdx->aiColumn[iCol] && p->iTable==iBase @@ -138834,7 +144346,7 @@ static int isDistinctRedundant( ** current SELECT is a correlated sub-query. */ for(i=0; inExpr; i++){ - Expr *p = sqlite3ExprSkipCollate(pDistinct->a[i].pExpr); + Expr *p = sqlite3ExprSkipCollateAndLikely(pDistinct->a[i].pExpr); if( p->op==TK_COLUMN && p->iTable==iBase && p->iColumn<0 ) return 1; } @@ -138883,17 +144395,17 @@ static LogEst estLog(LogEst N){ ** opcodes into OP_Copy when the table is being accessed via co-routine ** instead of via table lookup. ** -** If the bIncrRowid parameter is 0, then any OP_Rowid instructions on -** cursor iTabCur are transformed into OP_Null. Or, if bIncrRowid is non-zero, -** then each OP_Rowid is transformed into an instruction to increment the -** value stored in its output register. +** If the iAutoidxCur is not zero, then any OP_Rowid instructions on +** cursor iTabCur are transformed into OP_Sequence opcode for the +** iAutoidxCur cursor, in order to generate unique rowids for the +** automatic index being generated. */ static void translateColumnToCopy( Parse *pParse, /* Parsing context */ int iStart, /* Translate from this opcode to the end */ int iTabCur, /* OP_Column/OP_Rowid references to this table */ int iRegister, /* The first column is in this register */ - int bIncrRowid /* If non-zero, transform OP_rowid to OP_AddImm(1) */ + int iAutoidxCur /* If non-zero, cursor of autoindex being generated */ ){ Vdbe *v = pParse->pVdbe; VdbeOp *pOp = sqlite3VdbeGetOp(v, iStart); @@ -138907,11 +144419,9 @@ static void translateColumnToCopy( pOp->p2 = pOp->p3; pOp->p3 = 0; }else if( pOp->opcode==OP_Rowid ){ - if( bIncrRowid ){ - /* Increment the value stored in the P2 operand of the OP_Rowid. */ - pOp->opcode = OP_AddImm; - pOp->p1 = pOp->p2; - pOp->p2 = 1; + if( iAutoidxCur ){ + pOp->opcode = OP_Sequence; + pOp->p1 = iAutoidxCur; }else{ pOp->opcode = OP_Null; pOp->p1 = 0; @@ -138928,7 +144438,7 @@ static void translateColumnToCopy( ** are no-ops. */ #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(WHERETRACE_ENABLED) -static void TRACE_IDX_INPUTS(sqlite3_index_info *p){ +static void whereTraceIndexInfoInputs(sqlite3_index_info *p){ int i; if( !sqlite3WhereTrace ) return; for(i=0; inConstraint; i++){ @@ -138946,7 +144456,7 @@ static void TRACE_IDX_INPUTS(sqlite3_index_info *p){ p->aOrderBy[i].desc); } } -static void TRACE_IDX_OUTPUTS(sqlite3_index_info *p){ +static void whereTraceIndexInfoOutputs(sqlite3_index_info *p){ int i; if( !sqlite3WhereTrace ) return; for(i=0; inConstraint; i++){ @@ -138962,8 +144472,8 @@ static void TRACE_IDX_OUTPUTS(sqlite3_index_info *p){ sqlite3DebugPrintf(" estimatedRows=%lld\n", p->estimatedRows); } #else -#define TRACE_IDX_INPUTS(A) -#define TRACE_IDX_OUTPUTS(A) +#define whereTraceIndexInfoInputs(A) +#define whereTraceIndexInfoOutputs(A) #endif #ifndef SQLITE_OMIT_AUTOMATIC_INDEX @@ -139058,7 +144568,7 @@ static void constructAutomaticIndex( && (pTerm->wtFlags & TERM_VIRTUAL)==0 && !ExprHasProperty(pExpr, EP_FromJoin) && sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor) ){ - pPartial = sqlite3ExprAnd(pParse->db, pPartial, + pPartial = sqlite3ExprAnd(pParse, pPartial, sqlite3ExprDup(pParse->db, pExpr, 0)); } if( termCanDriveIndex(pTerm, pSrc, notReady) ){ @@ -139123,7 +144633,8 @@ static void constructAutomaticIndex( Expr *pX = pTerm->pExpr; idxCols |= cMask; pIdx->aiColumn[n] = pTerm->u.leftColumn; - pColl = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pX->pRight); + pColl = sqlite3ExprCompareCollSeq(pParse, pX); + assert( pColl!=0 || pParse->nErr>0 ); /* TH3 collate01.800 */ pIdx->azColl[n] = pColl ? pColl->zName : sqlite3StrBINARY; n++; } @@ -139171,7 +144682,7 @@ static void constructAutomaticIndex( addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); VdbeCoverage(v); } if( pPartial ){ - iContinue = sqlite3VdbeMakeLabel(v); + iContinue = sqlite3VdbeMakeLabel(pParse); sqlite3ExprIfFalse(pParse, pPartial, iContinue, SQLITE_JUMPIFNULL); pLoop->wsFlags |= WHERE_PARTIALIDX; } @@ -139185,14 +144696,15 @@ static void constructAutomaticIndex( if( pTabItem->fg.viaCoroutine ){ sqlite3VdbeChangeP2(v, addrCounter, regBase+n); testcase( pParse->db->mallocFailed ); + assert( pLevel->iIdxCur>0 ); translateColumnToCopy(pParse, addrTop, pLevel->iTabCur, - pTabItem->regResult, 1); + pTabItem->regResult, pLevel->iIdxCur); sqlite3VdbeGoto(v, addrTop); pTabItem->fg.viaCoroutine = 0; }else{ sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX); } - sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX); sqlite3VdbeJumpHere(v, addrTop); sqlite3ReleaseTempReg(pParse, regRecord); @@ -139255,6 +144767,7 @@ static sqlite3_index_info *allocateIndexInfo( for(i=0; ia[i].pExpr; if( pExpr->op!=TK_COLUMN || pExpr->iTable!=pSrc->iCursor ) break; + if( pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL ) break; } if( i==n){ nOrderBy = n; @@ -139270,23 +144783,14 @@ static sqlite3_index_info *allocateIndexInfo( sqlite3ErrorMsg(pParse, "out of memory"); return 0; } - - /* Initialize the structure. The sqlite3_index_info structure contains - ** many fields that are declared "const" to prevent xBestIndex from - ** changing them. We have to do some funky casting in order to - ** initialize those fields. - */ pHidden = (struct HiddenIndexInfo*)&pIdxInfo[1]; pIdxCons = (struct sqlite3_index_constraint*)&pHidden[1]; pIdxOrderBy = (struct sqlite3_index_orderby*)&pIdxCons[nTerm]; pUsage = (struct sqlite3_index_constraint_usage*)&pIdxOrderBy[nOrderBy]; - *(int*)&pIdxInfo->nConstraint = nTerm; - *(int*)&pIdxInfo->nOrderBy = nOrderBy; - *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint = pIdxCons; - *(struct sqlite3_index_orderby**)&pIdxInfo->aOrderBy = pIdxOrderBy; - *(struct sqlite3_index_constraint_usage**)&pIdxInfo->aConstraintUsage = - pUsage; - + pIdxInfo->nOrderBy = nOrderBy; + pIdxInfo->aConstraint = pIdxCons; + pIdxInfo->aOrderBy = pIdxOrderBy; + pIdxInfo->aConstraintUsage = pUsage; pHidden->pWC = pWC; pHidden->pParse = pParse; for(i=j=0, pTerm=pWC->a; inTerm; i++, pTerm++){ @@ -139300,18 +144804,13 @@ static sqlite3_index_info *allocateIndexInfo( testcase( pTerm->eOperator & WO_ALL ); if( (pTerm->eOperator & ~(WO_EQUIV))==0 ) continue; if( pTerm->wtFlags & TERM_VNULL ) continue; + + /* tag-20191211-002: WHERE-clause constraints are not useful to the + ** right-hand table of a LEFT JOIN. See tag-20191211-001 for the + ** equivalent restriction for ordinary tables. */ if( (pSrc->fg.jointype & JT_LEFT)!=0 && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) - && (pTerm->eOperator & (WO_IS|WO_ISNULL)) ){ - /* An "IS" term in the WHERE clause where the virtual table is the rhs - ** of a LEFT JOIN. Do not pass this term to the virtual table - ** implementation, as this can lead to incorrect results from SQL such - ** as: - ** - ** "LEFT JOIN vtab WHERE vtab.col IS NULL" */ - testcase( pTerm->eOperator & WO_ISNULL ); - testcase( pTerm->eOperator & WO_IS ); continue; } assert( pTerm->u.leftColumn>=(-1) ); @@ -139342,7 +144841,8 @@ static sqlite3_index_info *allocateIndexInfo( if( op & (WO_LT|WO_LE|WO_GT|WO_GE) && sqlite3ExprIsVector(pTerm->pExpr->pRight) ){ - if( i<16 ) mNoOmit |= (1 << i); + testcase( j!=i ); + if( j<16 ) mNoOmit |= (1 << j); if( op==WO_LT ) pIdxCons[j].op = WO_LE; if( op==WO_GT ) pIdxCons[j].op = WO_GE; } @@ -139350,10 +144850,11 @@ static sqlite3_index_info *allocateIndexInfo( j++; } + pIdxInfo->nConstraint = j; for(i=0; ia[i].pExpr; pIdxOrderBy[i].iColumn = pExpr->iColumn; - pIdxOrderBy[i].desc = pOrderBy->a[i].sortOrder; + pIdxOrderBy[i].desc = pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC; } *pmNoOmit = mNoOmit; @@ -139366,9 +144867,11 @@ static sqlite3_index_info *allocateIndexInfo( ** method of the virtual table with the sqlite3_index_info object that ** comes in as the 3rd argument to this function. ** -** If an error occurs, pParse is populated with an error message and a -** non-zero value is returned. Otherwise, 0 is returned and the output -** part of the sqlite3_index_info structure is left populated. +** If an error occurs, pParse is populated with an error message and an +** appropriate error code is returned. A return of SQLITE_CONSTRAINT from +** xBestIndex is not considered an error. SQLITE_CONSTRAINT indicates that +** the current configuration of "unusable" flags in sqlite3_index_info can +** not result in a valid plan. ** ** Whether or not an error is returned, it is the responsibility of the ** caller to eventually free p->idxStr if p->needToFreeIdxStr indicates @@ -139378,11 +144881,11 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ sqlite3_vtab *pVtab = sqlite3GetVTable(pParse->db, pTab)->pVtab; int rc; - TRACE_IDX_INPUTS(p); + whereTraceIndexInfoInputs(p); rc = pVtab->pModule->xBestIndex(pVtab, p); - TRACE_IDX_OUTPUTS(p); + whereTraceIndexInfoOutputs(p); - if( rc!=SQLITE_OK ){ + if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT ){ if( rc==SQLITE_NOMEM ){ sqlite3OomFault(pParse->db); }else if( !pVtab->zErrMsg ){ @@ -139393,23 +144896,11 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ } sqlite3_free(pVtab->zErrMsg); pVtab->zErrMsg = 0; - -#if 0 - /* This error is now caught by the caller. - ** Search for "xBestIndex malfunction" below */ - for(i=0; inConstraint; i++){ - if( !p->aConstraint[i].usable && p->aConstraintUsage[i].argvIndex>0 ){ - sqlite3ErrorMsg(pParse, - "table %s: xBestIndex returned an invalid plan", pTab->zName); - } - } -#endif - - return pParse->nErr; + return rc; } #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 /* ** Estimate the location of a particular key among all keys in an ** index. Store the results in aStat as follows: @@ -139602,7 +145093,7 @@ static int whereKeyStats( pRec->nField = nField; return i; } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ /* ** If it is not NULL, pTerm is a term that provides an upper or lower @@ -139628,7 +145119,7 @@ static LogEst whereRangeAdjust(WhereTerm *pTerm, LogEst nNew){ } -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 /* ** Return the affinity for a single column of an index. */ @@ -139637,12 +145128,13 @@ SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3 *db, Index *pIdx, int iCo if( !pIdx->zColAff ){ if( sqlite3IndexAffinityStr(db, pIdx)==0 ) return SQLITE_AFF_BLOB; } + assert( pIdx->zColAff[iCol]!=0 ); return pIdx->zColAff[iCol]; } #endif -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 /* ** This function is called to estimate the number of rows visited by a ** range-scan on a skip-scan index. For example: @@ -139748,7 +145240,7 @@ static int whereRangeSkipScanEst( return rc; } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ /* ** This function is used to estimate the number of rows that will be visited @@ -139801,12 +145293,12 @@ static int whereRangeScanEst( int nOut = pLoop->nOut; LogEst nNew; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 Index *p = pLoop->u.btree.pIndex; int nEq = pLoop->u.btree.nEq; - if( p->nSample>0 && nEqnSampleCol - && OptimizationEnabled(pParse->db, SQLITE_Stat34) + if( p->nSample>0 && ALWAYS(nEqnSampleCol) + && OptimizationEnabled(pParse->db, SQLITE_Stat4) ){ if( nEq==pBuilder->nRecValid ){ UnpackedRecord *pRec = pBuilder->pRec; @@ -139904,7 +145396,7 @@ static int whereRangeScanEst( /* TUNING: If both iUpper and iLower are derived from the same ** sample, then assume they are 4x more selective. This brings ** the estimated selectivity more in line with what it would be - ** if estimated without the use of STAT3/4 tables. */ + ** if estimated without the use of STAT4 tables. */ if( iLwrIdx==iUprIdx ) nNew -= 20; assert( 20==sqlite3LogEst(4) ); }else{ nNew = 10; assert( 10==sqlite3LogEst(2) ); @@ -139953,12 +145445,12 @@ static int whereRangeScanEst( return rc; } -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 /* ** Estimate the number of rows that will be returned based on ** an equality constraint x=VALUE and where that VALUE occurs in ** the histogram data. This only works when x is the left-most -** column of an index and sqlite_stat3 histogram data is available +** column of an index and sqlite_stat4 histogram data is available ** for that index. When pExpr==NULL that means the constraint is ** "x IS NULL" instead of "x=VALUE". ** @@ -140016,9 +145508,9 @@ static int whereEqualScanEst( return rc; } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 /* ** Estimate the number of rows that will be returned based on ** an IN constraint where the right-hand side of the IN operator @@ -140065,23 +145557,24 @@ static int whereInScanEst( assert( pBuilder->nRecValid==nRecValid ); return rc; } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ #ifdef WHERETRACE_ENABLED /* ** Print the content of a WhereTerm object */ -static void whereTermPrint(WhereTerm *pTerm, int iTerm){ +SQLITE_PRIVATE void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm){ if( pTerm==0 ){ sqlite3DebugPrintf("TERM-%-3d NULL\n", iTerm); }else{ - char zType[4]; + char zType[8]; char zLeft[50]; - memcpy(zType, "...", 4); + memcpy(zType, "....", 5); if( pTerm->wtFlags & TERM_VIRTUAL ) zType[0] = 'V'; if( pTerm->eOperator & WO_EQUIV ) zType[1] = 'E'; if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) zType[2] = 'L'; + if( pTerm->wtFlags & TERM_CODED ) zType[3] = 'C'; if( pTerm->eOperator & WO_SINGLE ){ sqlite3_snprintf(sizeof(zLeft),zLeft,"left={%d:%d}", pTerm->leftCursor, pTerm->u.leftColumn); @@ -140092,14 +145585,21 @@ static void whereTermPrint(WhereTerm *pTerm, int iTerm){ sqlite3_snprintf(sizeof(zLeft),zLeft,"left=%d", pTerm->leftCursor); } sqlite3DebugPrintf( - "TERM-%-3d %p %s %-12s prob=%-3d op=0x%03x wtFlags=0x%04x", - iTerm, pTerm, zType, zLeft, pTerm->truthProb, - pTerm->eOperator, pTerm->wtFlags); + "TERM-%-3d %p %s %-12s op=%03x wtFlags=%04x", + iTerm, pTerm, zType, zLeft, pTerm->eOperator, pTerm->wtFlags); + /* The 0x10000 .wheretrace flag causes extra information to be + ** shown about each Term */ + if( sqlite3WhereTrace & 0x10000 ){ + sqlite3DebugPrintf(" prob=%-3d prereq=%llx,%llx", + pTerm->truthProb, (u64)pTerm->prereqAll, (u64)pTerm->prereqRight); + } if( pTerm->iField ){ - sqlite3DebugPrintf(" iField=%d\n", pTerm->iField); - }else{ - sqlite3DebugPrintf("\n"); + sqlite3DebugPrintf(" iField=%d", pTerm->iField); } + if( pTerm->iParent>=0 ){ + sqlite3DebugPrintf(" iParent=%d", pTerm->iParent); + } + sqlite3DebugPrintf("\n"); sqlite3TreeViewExpr(0, pTerm->pExpr, 0); } } @@ -140112,7 +145612,7 @@ static void whereTermPrint(WhereTerm *pTerm, int iTerm){ SQLITE_PRIVATE void sqlite3WhereClausePrint(WhereClause *pWC){ int i; for(i=0; inTerm; i++){ - whereTermPrint(&pWC->a[i], i); + sqlite3WhereTermPrint(&pWC->a[i], i); } } #endif @@ -140121,7 +145621,7 @@ SQLITE_PRIVATE void sqlite3WhereClausePrint(WhereClause *pWC){ /* ** Print a WhereLoop object for debugging purposes */ -static void whereLoopPrint(WhereLoop *p, WhereClause *pWC){ +SQLITE_PRIVATE void sqlite3WhereLoopPrint(WhereLoop *p, WhereClause *pWC){ WhereInfo *pWInfo = pWC->pWInfo; int nb = 1+(pWInfo->pTabList->nSrc+3)/4; struct SrcList_item *pItem = pWInfo->pTabList->a + p->iTab; @@ -140146,7 +145646,7 @@ static void whereLoopPrint(WhereLoop *p, WhereClause *pWC){ }else{ char *z; if( p->u.vtab.idxStr ){ - z = sqlite3_mprintf("(%d,\"%s\",%x)", + z = sqlite3_mprintf("(%d,\"%s\",%#x)", p->u.vtab.idxNum, p->u.vtab.idxStr, p->u.vtab.omitMask); }else{ z = sqlite3_mprintf("(%d,%x)", p->u.vtab.idxNum, p->u.vtab.omitMask); @@ -140163,7 +145663,7 @@ static void whereLoopPrint(WhereLoop *p, WhereClause *pWC){ if( p->nLTerm && (sqlite3WhereTrace & 0x100)!=0 ){ int i; for(i=0; inLTerm; i++){ - whereTermPrint(p->aLTerm[i], i); + sqlite3WhereTermPrint(p->aLTerm[i], i); } } } @@ -140267,6 +145767,7 @@ static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ pWInfo->pLoops = p->pNextLoop; whereLoopDelete(db, p); } + assert( pWInfo->pExprMods==0 ); sqlite3DbFreeNN(db, pWInfo); } @@ -140460,6 +145961,16 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ sqlite3 *db = pWInfo->pParse->db; int rc; + /* Stop the search once we hit the query planner search limit */ + if( pBuilder->iPlanLimit==0 ){ + WHERETRACE(0xffffffff,("=== query planner search limit reached ===\n")); + if( pBuilder->pOrSet ) pBuilder->pOrSet->n = 0; + return SQLITE_DONE; + } + pBuilder->iPlanLimit--; + + whereLoopAdjustCost(pWInfo->pLoops, pTemplate); + /* If pBuilder->pOrSet is defined, then only keep track of the costs ** and prereqs. */ @@ -140474,7 +145985,7 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ #if WHERETRACE_ENABLED /* 0x8 */ if( sqlite3WhereTrace & 0x8 ){ sqlite3DebugPrintf(x?" or-%d: ":" or-X: ", n); - whereLoopPrint(pTemplate, pBuilder->pWC); + sqlite3WhereLoopPrint(pTemplate, pBuilder->pWC); } #endif } @@ -140483,7 +145994,6 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ /* Look for an existing WhereLoop to replace with pTemplate */ - whereLoopAdjustCost(pWInfo->pLoops, pTemplate); ppPrev = whereLoopFindLesser(&pWInfo->pLoops, pTemplate); if( ppPrev==0 ){ @@ -140492,7 +146002,7 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ #if WHERETRACE_ENABLED /* 0x8 */ if( sqlite3WhereTrace & 0x8 ){ sqlite3DebugPrintf(" skip: "); - whereLoopPrint(pTemplate, pBuilder->pWC); + sqlite3WhereLoopPrint(pTemplate, pBuilder->pWC); } #endif return SQLITE_OK; @@ -140508,12 +146018,12 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ if( sqlite3WhereTrace & 0x8 ){ if( p!=0 ){ sqlite3DebugPrintf("replace: "); - whereLoopPrint(p, pBuilder->pWC); + sqlite3WhereLoopPrint(p, pBuilder->pWC); sqlite3DebugPrintf(" with: "); }else{ sqlite3DebugPrintf(" add: "); } - whereLoopPrint(pTemplate, pBuilder->pWC); + sqlite3WhereLoopPrint(pTemplate, pBuilder->pWC); } #endif if( p==0 ){ @@ -140537,7 +146047,7 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ #if WHERETRACE_ENABLED /* 0x8 */ if( sqlite3WhereTrace & 0x8 ){ sqlite3DebugPrintf(" delete: "); - whereLoopPrint(pToDel, pBuilder->pWC); + sqlite3WhereLoopPrint(pToDel, pBuilder->pWC); } #endif whereLoopDelete(db, pToDel); @@ -140546,7 +146056,7 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ rc = whereLoopXfer(db, p, pTemplate); if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ Index *pIndex = p->u.btree.pIndex; - if( pIndex && pIndex->tnum==0 ){ + if( pIndex && pIndex->idxType==SQLITE_IDXTYPE_IPK ){ p->u.btree.pIndex = 0; } } @@ -140589,11 +146099,12 @@ static void whereLoopOutputAdjust( ){ WhereTerm *pTerm, *pX; Bitmask notAllowed = ~(pLoop->prereq|pLoop->maskSelf); - int i, j, k; + int i, j; LogEst iReduce = 0; /* pLoop->nOut should not exceed nRow-iReduce */ assert( (pLoop->wsFlags & WHERE_AUTO_INDEX)==0 ); for(i=pWC->nTerm, pTerm=pWC->a; i>0; i--, pTerm++){ + assert( pTerm!=0 ); if( (pTerm->wtFlags & TERM_VIRTUAL)!=0 ) break; if( (pTerm->prereqAll & pLoop->maskSelf)==0 ) continue; if( (pTerm->prereqAll & notAllowed)!=0 ) continue; @@ -140614,6 +146125,7 @@ static void whereLoopOutputAdjust( pLoop->nOut--; if( pTerm->eOperator&(WO_EQ|WO_IS) ){ Expr *pRight = pTerm->pExpr->pRight; + int k = 0; testcase( pTerm->pExpr->op==TK_IS ); if( sqlite3ExprIsInteger(pRight, &k) && k>=(-1) && k<=1 ){ k = 10; @@ -140713,8 +146225,8 @@ static int whereRangeVectorLen( ** terms only. If it is modified, this value is restored before this ** function returns. ** -** If pProbe->tnum==0, that means pIndex is a fake index used for the -** INTEGER PRIMARY KEY. +** If pProbe->idxType==SQLITE_IDXTYPE_IPK, that means pIndex is +** a fake index used for the INTEGER PRIMARY KEY. */ static int whereLoopAddBtreeIndex( WhereLoopBuilder *pBuilder, /* The WhereLoop factory */ @@ -140744,8 +146256,9 @@ static int whereLoopAddBtreeIndex( pNew = pBuilder->pNew; if( db->mallocFailed ) return SQLITE_NOMEM_BKPT; - WHERETRACE(0x800, ("BEGIN %s.addBtreeIdx(%s), nEq=%d\n", - pProbe->pTable->zName,pProbe->zName, pNew->u.btree.nEq)); + WHERETRACE(0x800, ("BEGIN %s.addBtreeIdx(%s), nEq=%d, nSkip=%d\n", + pProbe->pTable->zName,pProbe->zName, + pNew->u.btree.nEq, pNew->nSkip)); assert( (pNew->wsFlags & WHERE_VIRTUALTABLE)==0 ); assert( (pNew->wsFlags & WHERE_TOP_LIMIT)==0 ); @@ -140777,7 +146290,7 @@ static int whereLoopAddBtreeIndex( LogEst rCostIdx; LogEst nOutUnadjusted; /* nOut before IN() and WHERE adjustments */ int nIn = 0; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 int nRecValid = pBuilder->nRecValid; #endif if( (eOp==WO_ISNULL || (pTerm->wtFlags&TERM_VNULL)!=0) @@ -140791,9 +146304,9 @@ static int whereLoopAddBtreeIndex( ** to mix with a lower range bound from some other source */ if( pTerm->wtFlags & TERM_LIKEOPT && pTerm->eOperator==WO_LT ) continue; - /* Do not allow constraints from the WHERE clause to be used by the - ** right table of a LEFT JOIN. Only constraints in the ON clause are - ** allowed */ + /* tag-20191211-001: Do not allow constraints from the WHERE clause to + ** be used by the right table of a LEFT JOIN. Only constraints in the + ** ON clause are allowed. See tag-20191211-002 for the vtab equivalent. */ if( (pSrc->fg.jointype & JT_LEFT)!=0 && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) ){ @@ -140838,8 +146351,6 @@ static int whereLoopAddBtreeIndex( }else if( ALWAYS(pExpr->x.pList && pExpr->x.pList->nExpr) ){ /* "x IN (value, value, ...)" */ nIn = sqlite3LogEst(pExpr->x.pList->nExpr); - assert( nIn>0 ); /* RHS always has 2 or more terms... The parser - ** changes "x IN (?)" into "x=?". */ } if( pProbe->hasStat1 ){ LogEst M, logK, safetyMargin; @@ -140935,7 +146446,7 @@ static int whereLoopAddBtreeIndex( ** the value of pNew->nOut to account for pTerm (but not nIn/nInMul). */ assert( pNew->nOut==saved_nOut ); if( pNew->wsFlags & WHERE_COLUMN_RANGE ){ - /* Adjust nOut using stat3/stat4 data. Or, if there is no stat3/stat4 + /* Adjust nOut using stat4 data. Or, if there is no stat4 ** data, using some other estimate. */ whereRangeScanEst(pParse, pBuilder, pBtm, pTop, pNew); }else{ @@ -140949,13 +146460,13 @@ static int whereLoopAddBtreeIndex( pNew->nOut += pTerm->truthProb; pNew->nOut -= nIn; }else{ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 tRowcnt nOut = 0; if( nInMul==0 && pProbe->nSample && pNew->u.btree.nEq<=pProbe->nSampleCol && ((eOp & WO_IN)==0 || !ExprHasProperty(pTerm->pExpr, EP_xIsSelect)) - && OptimizationEnabled(db, SQLITE_Stat34) + && OptimizationEnabled(db, SQLITE_Stat4) ){ Expr *pExpr = pTerm->pExpr; if( (eOp & (WO_EQ|WO_ISNULL|WO_IS))!=0 ){ @@ -140992,6 +146503,7 @@ static int whereLoopAddBtreeIndex( ** it to pNew->rRun, which is currently set to the cost of the index ** seek only. Then, if this is a non-covering index, add the cost of ** visiting the rows in the main table. */ + assert( pSrc->pTab->szTabRow>0 ); rCostIdx = pNew->nOut + 1 + (15*pProbe->szIdxRow)/pSrc->pTab->szTabRow; pNew->rRun = sqlite3LogEstAdd(rLogSize, rCostIdx); if( (pNew->wsFlags & (WHERE_IDX_ONLY|WHERE_IPK))==0 ){ @@ -141017,7 +146529,7 @@ static int whereLoopAddBtreeIndex( whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, nInMul+nIn); } pNew->nOut = saved_nOut; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 pBuilder->nRecValid = nRecValid; #endif } @@ -141043,6 +146555,7 @@ static int whereLoopAddBtreeIndex( assert( 42==sqlite3LogEst(18) ); if( saved_nEq==saved_nSkip && saved_nEq+1nKeyCol + && saved_nEq==pNew->nLTerm && pProbe->noSkipScan==0 && OptimizationEnabled(db, SQLITE_SkipScan) && pProbe->aiRowLogEst[saved_nEq+1]>=42 /* TUNING: Minimum for skip-scan */ @@ -141090,7 +146603,7 @@ static int indexMightHelpWithOrderBy( if( pIndex->bUnordered ) return 0; if( (pOB = pBuilder->pWInfo->pOrderBy)==0 ) return 0; for(ii=0; iinExpr; ii++){ - Expr *pExpr = sqlite3ExprSkipCollate(pOB->a[ii].pExpr); + Expr *pExpr = sqlite3ExprSkipCollateAndLikely(pOB->a[ii].pExpr); if( pExpr->op==TK_COLUMN && pExpr->iTable==iCursor ){ if( pExpr->iColumn<0 ) return 1; for(jj=0; jjnKeyCol; jj++){ @@ -141111,18 +146624,25 @@ static int indexMightHelpWithOrderBy( /* Check to see if a partial index with pPartIndexWhere can be used ** in the current query. Return true if it can be and false if not. */ -static int whereUsablePartialIndex(int iTab, WhereClause *pWC, Expr *pWhere){ +static int whereUsablePartialIndex( + int iTab, /* The table for which we want an index */ + int isLeft, /* True if iTab is the right table of a LEFT JOIN */ + WhereClause *pWC, /* The WHERE clause of the query */ + Expr *pWhere /* The WHERE clause from the partial index */ +){ int i; WhereTerm *pTerm; Parse *pParse = pWC->pWInfo->pParse; while( pWhere->op==TK_AND ){ - if( !whereUsablePartialIndex(iTab,pWC,pWhere->pLeft) ) return 0; + if( !whereUsablePartialIndex(iTab,isLeft,pWC,pWhere->pLeft) ) return 0; pWhere = pWhere->pRight; } if( pParse->db->flags & SQLITE_EnableQPSG ) pParse = 0; for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ - Expr *pExpr = pTerm->pExpr; + Expr *pExpr; + pExpr = pTerm->pExpr; if( (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->iRightJoinTable==iTab) + && (isLeft==0 || ExprHasProperty(pExpr, EP_FromJoin)) && sqlite3ExprImpliesExpr(pParse, pExpr, pWhere, iTab) ){ return 1; @@ -141214,6 +146734,7 @@ static int whereLoopAddBtree( sPk.onError = OE_Replace; sPk.pTable = pTab; sPk.szIdxRow = pTab->szTabRow; + sPk.idxType = SQLITE_IDXTYPE_IPK; aiRowEstPk[0] = pTab->nRowLogEst; aiRowEstPk[1] = 0; pFirst = pSrc->pTab->pIndex; @@ -141284,8 +146805,11 @@ static int whereLoopAddBtree( for(; rc==SQLITE_OK && pProbe; pProbe=(pSrc->pIBIndex ? 0 : pProbe->pNext), iSortIdx++ ){ + int isLeft = (pSrc->fg.jointype & JT_OUTER)!=0; if( pProbe->pPartIdxWhere!=0 - && !whereUsablePartialIndex(pSrc->iCursor, pWC, pProbe->pPartIdxWhere) ){ + && !whereUsablePartialIndex(pSrc->iCursor, isLeft, pWC, + pProbe->pPartIdxWhere) + ){ testcase( pNew->iTab!=pSrc->iCursor ); /* See ticket [98d973b8f5] */ continue; /* Partial index inappropriate for this query */ } @@ -141304,7 +146828,7 @@ static int whereLoopAddBtree( b = indexMightHelpWithOrderBy(pBuilder, pProbe, pSrc->iCursor); /* The ONEPASS_DESIRED flags never occurs together with ORDER BY */ assert( (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || b==0 ); - if( pProbe->tnum<=0 ){ + if( pProbe->idxType==SQLITE_IDXTYPE_IPK ){ /* Integer primary key index */ pNew->wsFlags = WHERE_IPK; @@ -141389,7 +146913,7 @@ static int whereLoopAddBtree( ** plan */ pTab->tabFlags |= TF_StatsUsed; } -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 sqlite3Stat4ProbeFree(pBuilder->pRec); pBuilder->nRecValid = 0; pBuilder->pRec = 0; @@ -141470,7 +146994,17 @@ static int whereLoopAddVirtualOne( /* Invoke the virtual table xBestIndex() method */ rc = vtabBestIndex(pParse, pSrc->pTab, pIdxInfo); - if( rc ) return rc; + if( rc ){ + if( rc==SQLITE_CONSTRAINT ){ + /* If the xBestIndex method returns SQLITE_CONSTRAINT, that means + ** that the particular combination of parameters provided is unusable. + ** Make no entries in the loop table. + */ + WHERETRACE(0xffff, (" ^^^^--- non-viable plan rejected!\n")); + return SQLITE_OK; + } + return rc; + } mxTerm = -1; assert( pNew->nLSlot>=nConstraint ); @@ -141502,7 +147036,14 @@ static int whereLoopAddVirtualOne( if( iTerm>mxTerm ) mxTerm = iTerm; testcase( iTerm==15 ); testcase( iTerm==16 ); - if( iTerm<16 && pUsage[i].omit ) pNew->u.vtab.omitMask |= 1<u.vtab.omitMask |= 1<eOperator & WO_IN)!=0 ){ /* A virtual table that is constrained by an IN clause may not ** consume the ORDER BY clause because (1) the order of IN terms @@ -141515,7 +147056,6 @@ static int whereLoopAddVirtualOne( } } } - pNew->u.vtab.omitMask &= ~mNoOmit; pNew->nLTerm = mxTerm+1; for(i=0; i<=mxTerm; i++){ @@ -141572,7 +147112,7 @@ SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info *pIdxInfo, int int iTerm = pIdxInfo->aConstraint[iCons].iTermOffset; Expr *pX = pHidden->pWC->a[iTerm].pExpr; if( pX->pLeft ){ - pC = sqlite3BinaryCompareCollSeq(pHidden->pParse, pX->pLeft, pX->pRight); + pC = sqlite3ExprCompareCollSeq(pHidden->pParse, pX); } zRet = (pC ? pC->zName : sqlite3StrBINARY); } @@ -141647,11 +147187,11 @@ static int whereLoopAddVirtual( rc = whereLoopAddVirtualOne(pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn); /* If the call to xBestIndex() with all terms enabled produced a plan - ** that does not require any source tables (IOW: a plan with mBest==0), - ** then there is no point in making any further calls to xBestIndex() - ** since they will all return the same result (if the xBestIndex() - ** implementation is sane). */ - if( rc==SQLITE_OK && (mBest = (pNew->prereq & ~mPrereq))!=0 ){ + ** that does not require any source tables (IOW: a plan with mBest==0) + ** and does not use an IN(...) operator, then there is no point in making + ** any further calls to xBestIndex() since they will all return the same + ** result (if the xBestIndex() implementation is sane). */ + if( rc==SQLITE_OK && ((mBest = (pNew->prereq & ~mPrereq))!=0 || bIn) ){ int seenZero = 0; /* True if a plan with no prereqs seen */ int seenZeroNoIN = 0; /* Plan with no prereqs and no IN(...) seen */ Bitmask mPrev = 0; @@ -141797,7 +147337,8 @@ static int whereLoopAddOr( if( rc==SQLITE_OK ){ rc = whereLoopAddOr(&sSubBuild, mPrereq, mUnusable); } - assert( rc==SQLITE_OK || sCur.n==0 ); + assert( rc==SQLITE_OK || rc==SQLITE_DONE || sCur.n==0 ); + testcase( rc==SQLITE_DONE ); if( sCur.n==0 ){ sSum.n = 0; break; @@ -141866,9 +147407,11 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ /* Loop over the tables in the join, from left to right */ pNew = pBuilder->pNew; whereLoopInit(pNew); + pBuilder->iPlanLimit = SQLITE_QUERY_PLANNER_LIMIT; for(iTab=0, pItem=pTabList->a; pItemiTab = iTab; + pBuilder->iPlanLimit += SQLITE_QUERY_PLANNER_LIMIT_INCR; pNew->maskSelf = sqlite3WhereGetMask(&pWInfo->sMaskSet, pItem->iCursor); if( ((pItem->fg.jointype|priorJointype) & (JT_LEFT|JT_CROSS))!=0 ){ /* This condition is true when pItem is the FROM clause term on the @@ -141894,7 +147437,15 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ rc = whereLoopAddOr(pBuilder, mPrereq, mUnusable); } mPrior |= pNew->maskSelf; - if( rc || db->mallocFailed ) break; + if( rc || db->mallocFailed ){ + if( rc==SQLITE_DONE ){ + /* We hit the query planner search limit set by iPlanLimit */ + sqlite3_log(SQLITE_WARNING, "abbreviated query algorithm search"); + rc = SQLITE_OK; + }else{ + break; + } + } } whereLoopClear(db, pNew); @@ -141995,10 +147546,12 @@ static i8 wherePathSatisfiesOrderBy( pLoop = pLast; } if( pLoop->wsFlags & WHERE_VIRTUALTABLE ){ - if( pLoop->u.vtab.isOrdered ) obSat = obDone; + if( pLoop->u.vtab.isOrdered && (wctrlFlags & WHERE_DISTINCTBY)==0 ){ + obSat = obDone; + } break; - }else{ - pLoop->u.btree.nIdxCol = 0; + }else if( wctrlFlags & WHERE_DISTINCTBY ){ + pLoop->u.btree.nDistinctCol = 0; } iCur = pWInfo->pTabList->a[pLoop->iTab].iCursor; @@ -142009,7 +147562,7 @@ static i8 wherePathSatisfiesOrderBy( */ for(i=0; ia[i].pExpr); + pOBExpr = sqlite3ExprSkipCollateAndLikely(pOrderBy->a[i].pExpr); if( pOBExpr->op!=TK_COLUMN ) continue; if( pOBExpr->iTable!=iCur ) continue; pTerm = sqlite3WhereFindTerm(&pWInfo->sWC, iCur, pOBExpr->iColumn, @@ -142046,7 +147599,8 @@ static i8 wherePathSatisfiesOrderBy( assert( nColumn==nKeyCol+1 || !HasRowid(pIndex->pTable) ); assert( pIndex->aiColumn[nColumn-1]==XN_ROWID || !HasRowid(pIndex->pTable)); - isOrderDistinct = IsUniqueIndex(pIndex); + isOrderDistinct = IsUniqueIndex(pIndex) + && (pLoop->wsFlags & WHERE_SKIPSCAN)==0; } /* Loop through all columns of the index and deal with the ones @@ -142064,15 +147618,21 @@ static i8 wherePathSatisfiesOrderBy( u16 eOp = pLoop->aLTerm[j]->eOperator; /* Skip over == and IS and ISNULL terms. (Also skip IN terms when - ** doing WHERE_ORDERBY_LIMIT processing). + ** doing WHERE_ORDERBY_LIMIT processing). Except, IS and ISNULL + ** terms imply that the index is not UNIQUE NOT NULL in which case + ** the loop need to be marked as not order-distinct because it can + ** have repeated NULL rows. ** ** If the current term is a column of an ((?,?) IN (SELECT...)) ** expression for which the SELECT returns more than one column, ** check that it is the only column used by this loop. Otherwise, ** if it is one of two or more, none of the columns can be - ** considered to match an ORDER BY term. */ + ** considered to match an ORDER BY term. + */ if( (eOp & eqOpMask)!=0 ){ - if( eOp & WO_ISNULL ){ + if( eOp & (WO_ISNULL|WO_IS) ){ + testcase( eOp & WO_ISNULL ); + testcase( eOp & WO_IS ); testcase( isOrderDistinct ); isOrderDistinct = 0; } @@ -142098,7 +147658,7 @@ static i8 wherePathSatisfiesOrderBy( */ if( pIndex ){ iColumn = pIndex->aiColumn[j]; - revIdx = pIndex->aSortOrder[j]; + revIdx = pIndex->aSortOrder[j] & KEYINFO_ORDER_DESC; if( iColumn==pIndex->pTable->iPKey ) iColumn = XN_ROWID; }else{ iColumn = XN_ROWID; @@ -142122,7 +147682,7 @@ static i8 wherePathSatisfiesOrderBy( isMatch = 0; for(i=0; bOnce && ia[i].pExpr); + pOBExpr = sqlite3ExprSkipCollateAndLikely(pOrderBy->a[i].pExpr); testcase( wctrlFlags & WHERE_GROUPBY ); testcase( wctrlFlags & WHERE_DISTINCTBY ); if( (wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY))==0 ) bOnce = 0; @@ -142140,7 +147700,9 @@ static i8 wherePathSatisfiesOrderBy( pColl = sqlite3ExprNNCollSeq(pWInfo->pParse, pOrderBy->a[i].pExpr); if( sqlite3StrICmp(pColl->zName, pIndex->azColl[j])!=0 ) continue; } - pLoop->u.btree.nIdxCol = j+1; + if( wctrlFlags & WHERE_DISTINCTBY ){ + pLoop->u.btree.nDistinctCol = j+1; + } isMatch = 1; break; } @@ -142148,13 +147710,22 @@ static i8 wherePathSatisfiesOrderBy( /* Make sure the sort order is compatible in an ORDER BY clause. ** Sort order is irrelevant for a GROUP BY clause. */ if( revSet ){ - if( (rev ^ revIdx)!=pOrderBy->a[i].sortOrder ) isMatch = 0; + if( (rev ^ revIdx)!=(pOrderBy->a[i].sortFlags&KEYINFO_ORDER_DESC) ){ + isMatch = 0; + } }else{ - rev = revIdx ^ pOrderBy->a[i].sortOrder; + rev = revIdx ^ (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC); if( rev ) *pRevMask |= MASKBIT(iLoop); revSet = 1; } } + if( isMatch && (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL) ){ + if( j==pLoop->u.btree.nEq ){ + pLoop->wsFlags |= WHERE_BIGNULL_SORT; + }else{ + isMatch = 0; + } + } if( isMatch ){ if( iColumn==XN_ROWID ){ testcase( distinctColumns==0 ); @@ -142960,7 +148531,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( pWInfo->pResultSet = pResultSet; pWInfo->aiCurOnePass[0] = pWInfo->aiCurOnePass[1] = -1; pWInfo->nLevel = nTabList; - pWInfo->iBreak = pWInfo->iContinue = sqlite3VdbeMakeLabel(v); + pWInfo->iBreak = pWInfo->iContinue = sqlite3VdbeMakeLabel(pParse); pWInfo->wctrlFlags = wctrlFlags; pWInfo->iLimit = iAuxArg; pWInfo->savedNQueryLoop = pParse->nQueryLoop; @@ -143068,8 +148639,19 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( sqlite3DebugPrintf(", limit: %d", iAuxArg); } sqlite3DebugPrintf(")\n"); + if( sqlite3WhereTrace & 0x100 ){ + Select sSelect; + memset(&sSelect, 0, sizeof(sSelect)); + sSelect.selFlags = SF_WhereBegin; + sSelect.pSrc = pTabList; + sSelect.pWhere = pWhere; + sSelect.pOrderBy = pOrderBy; + sSelect.pEList = pResultSet; + sqlite3TreeViewSelect(0, &sSelect, 0); + } } if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */ + sqlite3DebugPrintf("---- WHERE clause at start of analysis:\n"); sqlite3WhereClausePrint(sWLB.pWC); } #endif @@ -143086,7 +148668,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( "ABCDEFGHIJKLMNOPQRSTUVWYXZ"; for(p=pWInfo->pLoops, i=0; p; p=p->pNextLoop, i++){ p->cId = zLabel[i%(sizeof(zLabel)-1)]; - whereLoopPrint(p, sWLB.pWC); + sqlite3WhereLoopPrint(p, sWLB.pWC); } } #endif @@ -143126,7 +148708,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( } sqlite3DebugPrintf("\n"); for(ii=0; iinLevel; ii++){ - whereLoopPrint(pWInfo->a[ii].pWLoop, sWLB.pWC); + sqlite3WhereLoopPrint(pWInfo->a[ii].pWLoop, sWLB.pWC); } } #endif @@ -143151,14 +148733,14 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** then table t2 can be omitted from the following: ** ** SELECT v1, v3 FROM t1 - ** LEFT JOIN t2 USING (t1.ipk=t2.ipk) - ** LEFT JOIN t3 USING (t1.ipk=t3.ipk) + ** LEFT JOIN t2 ON (t1.ipk=t2.ipk) + ** LEFT JOIN t3 ON (t1.ipk=t3.ipk) ** ** or from: ** ** SELECT DISTINCT v1, v3 FROM t1 ** LEFT JOIN t2 - ** LEFT JOIN t3 USING (t1.ipk=t3.ipk) + ** LEFT JOIN t3 ON (t1.ipk=t3.ipk) */ notReady = ~(Bitmask)0; if( pWInfo->nLevel>=2 @@ -143208,7 +148790,13 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( nTabList--; } } +#if defined(WHERETRACE_ENABLED) + if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */ + sqlite3DebugPrintf("---- WHERE clause at end of analysis:\n"); + sqlite3WhereClausePrint(sWLB.pWC); + } WHERETRACE(0xffff,("*** Optimizer Finished ***\n")); +#endif pWInfo->pParse->nQueryLoop += pWInfo->nRowOut; /* If the caller is an UPDATE or DELETE statement that is requesting @@ -143234,9 +148822,10 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 ){ int wsFlags = pWInfo->a[0].pWLoop->wsFlags; int bOnerow = (wsFlags & WHERE_ONEROW)!=0; + assert( !(wsFlags & WHERE_VIRTUALTABLE) || IsVirtual(pTabList->a[0].pTab) ); if( bOnerow || ( 0!=(wctrlFlags & WHERE_ONEPASS_MULTIROW) - && 0==(wsFlags & WHERE_VIRTUALTABLE) + && !IsVirtual(pTabList->a[0].pTab) && (0==(wsFlags & WHERE_MULTI_OR) || (wctrlFlags & WHERE_DUPLICATES_OK)) )){ pWInfo->eOnePass = bOnerow ? ONEPASS_SINGLE : ONEPASS_MULTI; @@ -143284,7 +148873,13 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( assert( pTabItem->iCursor==pLevel->iTabCur ); testcase( pWInfo->eOnePass==ONEPASS_OFF && pTab->nCol==BMS-1 ); testcase( pWInfo->eOnePass==ONEPASS_OFF && pTab->nCol==BMS ); - if( pWInfo->eOnePass==ONEPASS_OFF && pTab->nColeOnePass==ONEPASS_OFF + && pTab->nColtabFlags & (TF_HasGenerated|TF_WithoutRowid))==0 + ){ + /* If we know that only a prefix of the record will be used, + ** it is advantageous to reduce the "column count" field in + ** the P4 operand of the OP_OpenRead/Write opcode. */ Bitmask b = pTabItem->colUsed; int n = 0; for(; b; b=b>>1, n++){} @@ -143343,6 +148938,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( sqlite3VdbeSetP4KeyInfo(pParse, pIx); if( (pLoop->wsFlags & WHERE_CONSTRAINT)!=0 && (pLoop->wsFlags & (WHERE_COLUMN_RANGE|WHERE_SKIPSCAN))==0 + && (pLoop->wsFlags & WHERE_BIGNULL_SORT)==0 && (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 && pWInfo->eDistinct!=WHERE_DISTINCT_ORDERED ){ @@ -143391,7 +148987,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( pParse, pTabList, pLevel, wctrlFlags ); pLevel->addrBody = sqlite3VdbeCurrentAddr(v); - notReady = sqlite3WhereCodeOneLoopStart(pWInfo, ii, notReady); + notReady = sqlite3WhereCodeOneLoopStart(pParse,v,pWInfo,ii,pLevel,notReady); pWInfo->iContinue = pLevel->addrCont; if( (wsFlags&WHERE_MULTI_OR)==0 && (wctrlFlags&WHERE_OR_SUBCLAUSE)==0 ){ sqlite3WhereAddScanStatus(v, pTabList, pLevel, addrExplain); @@ -143460,7 +149056,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ && i==pWInfo->nLevel-1 /* Ticket [ef9318757b152e3] 2017-10-21 */ && (pLoop->wsFlags & WHERE_INDEXED)!=0 && (pIdx = pLoop->u.btree.pIndex)->hasStat1 - && (n = pLoop->u.btree.nIdxCol)>0 + && (n = pLoop->u.btree.nDistinctCol)>0 && pIdx->aiRowLogEst[n]>=36 ){ int r1 = pParse->nMem+1; @@ -143484,6 +149080,11 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ VdbeCoverageIf(v, pLevel->op==OP_Next); VdbeCoverageIf(v, pLevel->op==OP_Prev); VdbeCoverageIf(v, pLevel->op==OP_VNext); + if( pLevel->regBignull ){ + sqlite3VdbeResolveLabel(v, pLevel->addrBignull); + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, pLevel->regBignull, pLevel->p2-1); + VdbeCoverage(v); + } #ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT if( addrSeek ) sqlite3VdbeJumpHere(v, addrSeek); #endif @@ -143499,10 +149100,26 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ if( pIn->eEndLoopOp!=OP_Noop ){ if( pIn->nPrefix ){ assert( pLoop->wsFlags & WHERE_IN_EARLYOUT ); - sqlite3VdbeAddOp4Int(v, OP_IfNoHope, pLevel->iIdxCur, - sqlite3VdbeCurrentAddr(v)+2, - pIn->iBase, pIn->nPrefix); - VdbeCoverage(v); + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 ){ + sqlite3VdbeAddOp4Int(v, OP_IfNoHope, pLevel->iIdxCur, + sqlite3VdbeCurrentAddr(v)+2+(pLevel->iLeftJoin!=0), + pIn->iBase, pIn->nPrefix); + VdbeCoverage(v); + } + if( pLevel->iLeftJoin ){ + /* For LEFT JOIN queries, cursor pIn->iCur may not have been + ** opened yet. This occurs for WHERE clauses such as + ** "a = ? AND b IN (...)", where the index is on (a, b). If + ** the RHS of the (a=?) is NULL, then the "b IN (...)" may + ** never have been coded, but the body of the loop run to + ** return the null-row. So, if the cursor is not open yet, + ** jump over the OP_Next or OP_Prev instruction about to + ** be coded. */ + sqlite3VdbeAddOp2(v, OP_IfNotOpen, pIn->iCur, + sqlite3VdbeCurrentAddr(v) + 2 + ); + VdbeCoverage(v); + } } sqlite3VdbeAddOp2(v, pIn->eEndLoopOp, pIn->iCur, pIn->addrInTop); VdbeCoverage(v); @@ -143576,6 +149193,29 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ continue; } +#ifdef SQLITE_ENABLE_EARLY_CURSOR_CLOSE + /* Close all of the cursors that were opened by sqlite3WhereBegin. + ** Except, do not close cursors that will be reused by the OR optimization + ** (WHERE_OR_SUBCLAUSE). And do not close the OP_OpenWrite cursors + ** created for the ONEPASS optimization. + */ + if( (pTab->tabFlags & TF_Ephemeral)==0 + && pTab->pSelect==0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + ){ + int ws = pLoop->wsFlags; + if( pWInfo->eOnePass==ONEPASS_OFF && (ws & WHERE_IDX_ONLY)==0 ){ + sqlite3VdbeAddOp1(v, OP_Close, pTabItem->iCursor); + } + if( (ws & WHERE_INDEXED)!=0 + && (ws & (WHERE_IPK|WHERE_AUTO_INDEX))==0 + && pLevel->iIdxCur!=pWInfo->aiCurOnePass[1] + ){ + sqlite3VdbeAddOp1(v, OP_Close, pLevel->iIdxCur); + } + } +#endif + /* If this scan uses an index, make VDBE code substitutions to read data ** from the index instead of from the table where possible. In some cases ** this optimization prevents the table from ever being read, which can @@ -143617,8 +149257,11 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ Index *pPk = sqlite3PrimaryKeyIndex(pTab); x = pPk->aiColumn[x]; assert( x>=0 ); + }else{ + testcase( x!=sqlite3StorageColumnToTable(pTab,x) ); + x = sqlite3StorageColumnToTable(pTab,x); } - x = sqlite3ColumnOfIndex(pIdx, x); + x = sqlite3TableColumnToIndex(pIdx, x); if( x>=0 ){ pOp->p2 = x; pOp->p1 = pLevel->iIdxCur; @@ -143641,6 +149284,14 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ } } + /* Undo all Expr node modifications */ + while( pWInfo->pExprMods ){ + WhereExprMod *p = pWInfo->pExprMods; + pWInfo->pExprMods = p->pNext; + memcpy(p->pExpr, &p->orig, sizeof(p->orig)); + sqlite3DbFree(db, p); + } + /* Final cleanup */ pParse->nQueryLoop = pWInfo->savedNQueryLoop; @@ -143850,6 +149501,96 @@ static void dense_rankValueFunc(sqlite3_context *pCtx){ } } +/* +** Implementation of built-in window function nth_value(). This +** implementation is used in "slow mode" only - when the EXCLUDE clause +** is not set to the default value "NO OTHERS". +*/ +struct NthValueCtx { + i64 nStep; + sqlite3_value *pValue; +}; +static void nth_valueStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct NthValueCtx *p; + p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + i64 iVal; + switch( sqlite3_value_numeric_type(apArg[1]) ){ + case SQLITE_INTEGER: + iVal = sqlite3_value_int64(apArg[1]); + break; + case SQLITE_FLOAT: { + double fVal = sqlite3_value_double(apArg[1]); + if( ((i64)fVal)!=fVal ) goto error_out; + iVal = (i64)fVal; + break; + } + default: + goto error_out; + } + if( iVal<=0 ) goto error_out; + + p->nStep++; + if( iVal==p->nStep ){ + p->pValue = sqlite3_value_dup(apArg[0]); + if( !p->pValue ){ + sqlite3_result_error_nomem(pCtx); + } + } + } + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); + return; + + error_out: + sqlite3_result_error( + pCtx, "second argument to nth_value must be a positive integer", -1 + ); +} +static void nth_valueFinalizeFunc(sqlite3_context *pCtx){ + struct NthValueCtx *p; + p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, 0); + if( p && p->pValue ){ + sqlite3_result_value(pCtx, p->pValue); + sqlite3_value_free(p->pValue); + p->pValue = 0; + } +} +#define nth_valueInvFunc noopStepFunc +#define nth_valueValueFunc noopValueFunc + +static void first_valueStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct NthValueCtx *p; + p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p && p->pValue==0 ){ + p->pValue = sqlite3_value_dup(apArg[0]); + if( !p->pValue ){ + sqlite3_result_error_nomem(pCtx); + } + } + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); +} +static void first_valueFinalizeFunc(sqlite3_context *pCtx){ + struct NthValueCtx *p; + p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p && p->pValue ){ + sqlite3_result_value(pCtx, p->pValue); + sqlite3_value_free(p->pValue); + p->pValue = 0; + } +} +#define first_valueInvFunc noopStepFunc +#define first_valueValueFunc noopValueFunc + /* ** Implementation of built-in window function rank(). Assumes that ** the window frame has been set to: @@ -143885,7 +149626,7 @@ static void rankValueFunc(sqlite3_context *pCtx){ ** Implementation of built-in window function percent_rank(). Assumes that ** the window frame has been set to: ** -** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW +** GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING */ static void percent_rankStepFunc( sqlite3_context *pCtx, @@ -143893,38 +149634,44 @@ static void percent_rankStepFunc( sqlite3_value **apArg ){ struct CallCount *p; - UNUSED_PARAMETER(nArg); assert( nArg==1 ); - + UNUSED_PARAMETER(nArg); assert( nArg==0 ); + UNUSED_PARAMETER(apArg); p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); if( p ){ - if( p->nTotal==0 ){ - p->nTotal = sqlite3_value_int64(apArg[0]); - } - p->nStep++; - if( p->nValue==0 ){ - p->nValue = p->nStep; - } + p->nTotal++; } } +static void percent_rankInvFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct CallCount *p; + UNUSED_PARAMETER(nArg); assert( nArg==0 ); + UNUSED_PARAMETER(apArg); + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + p->nStep++; +} static void percent_rankValueFunc(sqlite3_context *pCtx){ struct CallCount *p; p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); if( p ){ + p->nValue = p->nStep; if( p->nTotal>1 ){ - double r = (double)(p->nValue-1) / (double)(p->nTotal-1); + double r = (double)p->nValue / (double)(p->nTotal-1); sqlite3_result_double(pCtx, r); }else{ sqlite3_result_double(pCtx, 0.0); } - p->nValue = 0; } } +#define percent_rankFinalizeFunc percent_rankValueFunc /* ** Implementation of built-in window function cume_dist(). Assumes that ** the window frame has been set to: ** -** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW +** GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING */ static void cume_distStepFunc( sqlite3_context *pCtx, @@ -143932,24 +149679,33 @@ static void cume_distStepFunc( sqlite3_value **apArg ){ struct CallCount *p; - assert( nArg==1 ); UNUSED_PARAMETER(nArg); - + UNUSED_PARAMETER(nArg); assert( nArg==0 ); + UNUSED_PARAMETER(apArg); p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); if( p ){ - if( p->nTotal==0 ){ - p->nTotal = sqlite3_value_int64(apArg[0]); - } - p->nStep++; + p->nTotal++; } } -static void cume_distValueFunc(sqlite3_context *pCtx){ +static void cume_distInvFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ struct CallCount *p; + UNUSED_PARAMETER(nArg); assert( nArg==0 ); + UNUSED_PARAMETER(apArg); p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); - if( p && p->nTotal ){ + p->nStep++; +} +static void cume_distValueFunc(sqlite3_context *pCtx){ + struct CallCount *p; + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, 0); + if( p ){ double r = (double)(p->nStep) / (double)(p->nTotal); sqlite3_result_double(pCtx, r); } } +#define cume_distFinalizeFunc cume_distValueFunc /* ** Context object for ntile() window function. @@ -143964,7 +149720,7 @@ struct NtileCtx { ** Implementation of ntile(). This assumes that the window frame has ** been coerced to: ** -** ROWS UNBOUNDED PRECEDING AND CURRENT ROW +** ROWS CURRENT ROW AND UNBOUNDED FOLLOWING */ static void ntileStepFunc( sqlite3_context *pCtx, @@ -143972,32 +149728,42 @@ static void ntileStepFunc( sqlite3_value **apArg ){ struct NtileCtx *p; - assert( nArg==2 ); UNUSED_PARAMETER(nArg); + assert( nArg==1 ); UNUSED_PARAMETER(nArg); p = (struct NtileCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); if( p ){ if( p->nTotal==0 ){ p->nParam = sqlite3_value_int64(apArg[0]); - p->nTotal = sqlite3_value_int64(apArg[1]); if( p->nParam<=0 ){ sqlite3_result_error( pCtx, "argument of ntile must be a positive integer", -1 ); } } - p->iRow++; + p->nTotal++; } } +static void ntileInvFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct NtileCtx *p; + assert( nArg==1 ); UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); + p = (struct NtileCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + p->iRow++; +} static void ntileValueFunc(sqlite3_context *pCtx){ struct NtileCtx *p; p = (struct NtileCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); if( p && p->nParam>0 ){ int nSize = (p->nTotal / p->nParam); if( nSize==0 ){ - sqlite3_result_int64(pCtx, p->iRow); + sqlite3_result_int64(pCtx, p->iRow+1); }else{ i64 nLarge = p->nTotal - p->nParam*nSize; i64 iSmall = nLarge*(nSize+1); - i64 iRow = p->iRow-1; + i64 iRow = p->iRow; assert( (nLarge*(nSize+1) + (p->nParam-nLarge)*nSize)==p->nTotal ); @@ -144009,6 +149775,7 @@ static void ntileValueFunc(sqlite3_context *pCtx){ } } } +#define ntileFinalizeFunc ntileValueFunc /* ** Context object for last_value() window function. @@ -144058,7 +149825,7 @@ static void last_valueInvFunc( } static void last_valueValueFunc(sqlite3_context *pCtx){ struct LastValueCtx *p; - p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, 0); if( p && p->pVal ){ sqlite3_result_value(pCtx, p->pVal); } @@ -144148,12 +149915,12 @@ SQLITE_PRIVATE void sqlite3WindowFunctions(void){ WINDOWFUNCX(row_number, 0, 0), WINDOWFUNCX(dense_rank, 0, 0), WINDOWFUNCX(rank, 0, 0), - WINDOWFUNCX(percent_rank, 0, SQLITE_FUNC_WINDOW_SIZE), - WINDOWFUNCX(cume_dist, 0, SQLITE_FUNC_WINDOW_SIZE), - WINDOWFUNCX(ntile, 1, SQLITE_FUNC_WINDOW_SIZE), + WINDOWFUNCALL(percent_rank, 0, 0), + WINDOWFUNCALL(cume_dist, 0, 0), + WINDOWFUNCALL(ntile, 1, 0), WINDOWFUNCALL(last_value, 1, 0), - WINDOWFUNCNOOP(nth_value, 2, 0), - WINDOWFUNCNOOP(first_value, 1, 0), + WINDOWFUNCALL(nth_value, 2, 0), + WINDOWFUNCALL(first_value, 1, 0), WINDOWFUNCNOOP(lead, 1, 0), WINDOWFUNCNOOP(lead, 2, 0), WINDOWFUNCNOOP(lead, 3, 0), @@ -144164,6 +149931,17 @@ SQLITE_PRIVATE void sqlite3WindowFunctions(void){ sqlite3InsertBuiltinFuncs(aWindowFuncs, ArraySize(aWindowFuncs)); } +static Window *windowFind(Parse *pParse, Window *pList, const char *zName){ + Window *p; + for(p=pList; p; p=p->pNextWin){ + if( sqlite3StrICmp(p->zName, zName)==0 ) break; + } + if( p==0 ){ + sqlite3ErrorMsg(pParse, "no such window: %s", zName); + } + return p; +} + /* ** This function is called immediately after resolving the function name ** for a window function within a SELECT statement. Argument pList is a @@ -144187,48 +149965,66 @@ SQLITE_PRIVATE void sqlite3WindowUpdate( Window *pWin, /* Window frame to update */ FuncDef *pFunc /* Window function definition */ ){ - if( pWin->zName && pWin->eType==0 ){ - Window *p; - for(p=pList; p; p=p->pNextWin){ - if( sqlite3StrICmp(p->zName, pWin->zName)==0 ) break; - } - if( p==0 ){ - sqlite3ErrorMsg(pParse, "no such window: %s", pWin->zName); - return; - } + if( pWin->zName && pWin->eFrmType==0 ){ + Window *p = windowFind(pParse, pList, pWin->zName); + if( p==0 ) return; pWin->pPartition = sqlite3ExprListDup(pParse->db, p->pPartition, 0); pWin->pOrderBy = sqlite3ExprListDup(pParse->db, p->pOrderBy, 0); pWin->pStart = sqlite3ExprDup(pParse->db, p->pStart, 0); pWin->pEnd = sqlite3ExprDup(pParse->db, p->pEnd, 0); pWin->eStart = p->eStart; pWin->eEnd = p->eEnd; - pWin->eType = p->eType; + pWin->eFrmType = p->eFrmType; + pWin->eExclude = p->eExclude; + }else{ + sqlite3WindowChain(pParse, pWin, pList); } + if( (pWin->eFrmType==TK_RANGE) + && (pWin->pStart || pWin->pEnd) + && (pWin->pOrderBy==0 || pWin->pOrderBy->nExpr!=1) + ){ + sqlite3ErrorMsg(pParse, + "RANGE with offset PRECEDING/FOLLOWING requires one ORDER BY expression" + ); + }else if( pFunc->funcFlags & SQLITE_FUNC_WINDOW ){ sqlite3 *db = pParse->db; if( pWin->pFilter ){ sqlite3ErrorMsg(pParse, "FILTER clause may only be used with aggregate window functions" ); - }else - if( pFunc->zName==row_numberName || pFunc->zName==ntileName ){ - sqlite3ExprDelete(db, pWin->pStart); - sqlite3ExprDelete(db, pWin->pEnd); - pWin->pStart = pWin->pEnd = 0; - pWin->eType = TK_ROWS; - pWin->eStart = TK_UNBOUNDED; - pWin->eEnd = TK_CURRENT; - }else - - if( pFunc->zName==dense_rankName || pFunc->zName==rankName - || pFunc->zName==percent_rankName || pFunc->zName==cume_distName - ){ - sqlite3ExprDelete(db, pWin->pStart); - sqlite3ExprDelete(db, pWin->pEnd); - pWin->pStart = pWin->pEnd = 0; - pWin->eType = TK_RANGE; - pWin->eStart = TK_UNBOUNDED; - pWin->eEnd = TK_CURRENT; + }else{ + struct WindowUpdate { + const char *zFunc; + int eFrmType; + int eStart; + int eEnd; + } aUp[] = { + { row_numberName, TK_ROWS, TK_UNBOUNDED, TK_CURRENT }, + { dense_rankName, TK_RANGE, TK_UNBOUNDED, TK_CURRENT }, + { rankName, TK_RANGE, TK_UNBOUNDED, TK_CURRENT }, + { percent_rankName, TK_GROUPS, TK_CURRENT, TK_UNBOUNDED }, + { cume_distName, TK_GROUPS, TK_FOLLOWING, TK_UNBOUNDED }, + { ntileName, TK_ROWS, TK_CURRENT, TK_UNBOUNDED }, + { leadName, TK_ROWS, TK_UNBOUNDED, TK_UNBOUNDED }, + { lagName, TK_ROWS, TK_UNBOUNDED, TK_CURRENT }, + }; + int i; + for(i=0; izName==aUp[i].zFunc ){ + sqlite3ExprDelete(db, pWin->pStart); + sqlite3ExprDelete(db, pWin->pEnd); + pWin->pEnd = pWin->pStart = 0; + pWin->eFrmType = aUp[i].eFrmType; + pWin->eStart = aUp[i].eStart; + pWin->eEnd = aUp[i].eEnd; + pWin->eExclude = 0; + if( pWin->eStart==TK_FOLLOWING ){ + pWin->pStart = sqlite3Expr(db, TK_INTEGER, "1"); + } + break; + } + } } } pWin->pFunc = pFunc; @@ -144243,6 +150039,7 @@ struct WindowRewrite { Window *pWin; SrcList *pSrc; ExprList *pSub; + Table *pTab; Select *pSubSelect; /* Current sub-select, if any */ }; @@ -144254,6 +150051,8 @@ struct WindowRewrite { static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){ struct WindowRewrite *p = pWalker->u.pRewrite; Parse *pParse = pWalker->pParse; + assert( p!=0 ); + assert( p->pWin!=0 ); /* If this function is being called from within a scalar sub-select ** that used by the SELECT statement being processed, only process @@ -144276,12 +150075,12 @@ static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){ switch( pExpr->op ){ case TK_FUNCTION: - if( pExpr->pWin==0 ){ + if( !ExprHasProperty(pExpr, EP_WinFunc) ){ break; }else{ Window *pWin; for(pWin=p->pWin; pWin; pWin=pWin->pNextWin){ - if( pExpr->pWin==pWin ){ + if( pExpr->y.pWin==pWin ){ assert( pWin->pOwner==pExpr ); return WRC_Prune; } @@ -144291,8 +150090,21 @@ static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){ case TK_AGG_FUNCTION: case TK_COLUMN: { - Expr *pDup = sqlite3ExprDup(pParse->db, pExpr, 0); - p->pSub = sqlite3ExprListAppend(pParse, p->pSub, pDup); + int iCol = -1; + if( p->pSub ){ + int i; + for(i=0; ipSub->nExpr; i++){ + if( 0==sqlite3ExprCompare(0, p->pSub->a[i].pExpr, pExpr, -1) ){ + iCol = i; + break; + } + } + } + if( iCol<0 ){ + Expr *pDup = sqlite3ExprDup(pParse->db, pExpr, 0); + if( pDup && pDup->op==TK_AGG_FUNCTION ) pDup->op = TK_FUNCTION; + p->pSub = sqlite3ExprListAppend(pParse, p->pSub, pDup); + } if( p->pSub ){ assert( ExprHasProperty(pExpr, EP_Static)==0 ); ExprSetProperty(pExpr, EP_Static); @@ -144301,10 +150113,11 @@ static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){ memset(pExpr, 0, sizeof(Expr)); pExpr->op = TK_COLUMN; - pExpr->iColumn = p->pSub->nExpr-1; + pExpr->iColumn = (iCol<0 ? p->pSub->nExpr-1: iCol); pExpr->iTable = p->pWin->iEphCsr; + pExpr->y.pTab = p->pTab; } - + if( pParse->db->mallocFailed ) return WRC_Abort; break; } @@ -144346,17 +150159,20 @@ static void selectWindowRewriteEList( Window *pWin, SrcList *pSrc, ExprList *pEList, /* Rewrite expressions in this list */ + Table *pTab, ExprList **ppSub /* IN/OUT: Sub-select expression-list */ ){ Walker sWalker; WindowRewrite sRewrite; + assert( pWin!=0 ); memset(&sWalker, 0, sizeof(Walker)); memset(&sRewrite, 0, sizeof(WindowRewrite)); sRewrite.pSub = *ppSub; sRewrite.pWin = pWin; sRewrite.pSrc = pSrc; + sRewrite.pTab = pTab; sWalker.pParse = pParse; sWalker.xExprCallback = selectWindowRewriteExprCb; @@ -144375,15 +150191,23 @@ static void selectWindowRewriteEList( static ExprList *exprListAppendList( Parse *pParse, /* Parsing context */ ExprList *pList, /* List to which to append. Might be NULL */ - ExprList *pAppend /* List of values to append. Might be NULL */ + ExprList *pAppend, /* List of values to append. Might be NULL */ + int bIntToNull ){ if( pAppend ){ int i; int nInit = pList ? pList->nExpr : 0; for(i=0; inExpr; i++){ + int iDummy; Expr *pDup = sqlite3ExprDup(pParse->db, pAppend->a[i].pExpr, 0); + assert( pDup==0 || !ExprHasProperty(pDup, EP_MemToken) ); + if( bIntToNull && pDup && sqlite3ExprIsInteger(pDup, &iDummy) ){ + pDup->op = TK_NULL; + pDup->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse); + pDup->u.zToken = 0; + } pList = sqlite3ExprListAppend(pParse, pList, pDup); - if( pList ) pList->a[nInit+i].sortOrder = pAppend->a[i].sortOrder; + if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags; } } return pList; @@ -144398,7 +150222,7 @@ static ExprList *exprListAppendList( */ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ int rc = SQLITE_OK; - if( p->pWin ){ + if( p->pWin && p->pPrior==0 && (p->selFlags & SF_WinRewrite)==0 ){ Vdbe *v = sqlite3GetVdbe(pParse); sqlite3 *db = pParse->db; Select *pSub = 0; /* The subquery */ @@ -144411,46 +150235,65 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ ExprList *pSublist = 0; /* Expression list for sub-query */ Window *pMWin = p->pWin; /* Master window object */ Window *pWin; /* Window object iterator */ + Table *pTab; + + pTab = sqlite3DbMallocZero(db, sizeof(Table)); + if( pTab==0 ){ + return sqlite3ErrorToParser(db, SQLITE_NOMEM); + } p->pSrc = 0; p->pWhere = 0; p->pGroupBy = 0; p->pHaving = 0; + p->selFlags &= ~SF_Aggregate; + p->selFlags |= SF_WinRewrite; /* Create the ORDER BY clause for the sub-select. This is the concatenation ** of the window PARTITION and ORDER BY clauses. Then, if this makes it ** redundant, remove the ORDER BY from the parent SELECT. */ - pSort = sqlite3ExprListDup(db, pMWin->pPartition, 0); - pSort = exprListAppendList(pParse, pSort, pMWin->pOrderBy); - if( pSort && p->pOrderBy ){ + pSort = exprListAppendList(pParse, 0, pMWin->pPartition, 1); + pSort = exprListAppendList(pParse, pSort, pMWin->pOrderBy, 1); + if( pSort && p->pOrderBy && p->pOrderBy->nExpr<=pSort->nExpr ){ + int nSave = pSort->nExpr; + pSort->nExpr = p->pOrderBy->nExpr; if( sqlite3ExprListCompare(pSort, p->pOrderBy, -1)==0 ){ sqlite3ExprListDelete(db, p->pOrderBy); p->pOrderBy = 0; } + pSort->nExpr = nSave; } /* Assign a cursor number for the ephemeral table used to buffer rows. ** The OpenEphemeral instruction is coded later, after it is known how ** many columns the table will have. */ pMWin->iEphCsr = pParse->nTab++; + pParse->nTab += 3; - selectWindowRewriteEList(pParse, pMWin, pSrc, p->pEList, &pSublist); - selectWindowRewriteEList(pParse, pMWin, pSrc, p->pOrderBy, &pSublist); + selectWindowRewriteEList(pParse, pMWin, pSrc, p->pEList, pTab, &pSublist); + selectWindowRewriteEList(pParse, pMWin, pSrc, p->pOrderBy, pTab, &pSublist); pMWin->nBufferCol = (pSublist ? pSublist->nExpr : 0); /* Append the PARTITION BY and ORDER BY expressions to the to the ** sub-select expression list. They are required to figure out where ** boundaries for partitions and sets of peer rows lie. */ - pSublist = exprListAppendList(pParse, pSublist, pMWin->pPartition); - pSublist = exprListAppendList(pParse, pSublist, pMWin->pOrderBy); + pSublist = exprListAppendList(pParse, pSublist, pMWin->pPartition, 0); + pSublist = exprListAppendList(pParse, pSublist, pMWin->pOrderBy, 0); /* Append the arguments passed to each window function to the ** sub-select expression list. Also allocate two registers for each ** window function - one for the accumulator, another for interim ** results. */ for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); - pSublist = exprListAppendList(pParse, pSublist, pWin->pOwner->x.pList); + ExprList *pArgs = pWin->pOwner->x.pList; + if( pWin->pFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){ + selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist); + pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); + pWin->bExprArgs = 1; + }else{ + pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); + pSublist = exprListAppendList(pParse, pSublist, pArgs, 0); + } if( pWin->pFilter ){ Expr *pFilter = sqlite3ExprDup(db, pWin->pFilter, 0); pSublist = sqlite3ExprListAppend(pParse, pSublist, pFilter); @@ -144468,47 +150311,73 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ */ if( pSublist==0 ){ pSublist = sqlite3ExprListAppend(pParse, 0, - sqlite3ExprAlloc(db, TK_INTEGER, &sqlite3IntTokens[0], 0) + sqlite3Expr(db, TK_INTEGER, "0") ); } pSub = sqlite3SelectNew( pParse, pSublist, pSrc, pWhere, pGroupBy, pHaving, pSort, 0, 0 ); - p->pSrc = sqlite3SrcListAppend(db, 0, 0, 0); - assert( p->pSrc || db->mallocFailed ); + p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( p->pSrc ){ + Table *pTab2; p->pSrc->a[0].pSelect = pSub; sqlite3SrcListAssignCursors(pParse, p->pSrc); - if( sqlite3ExpandSubquery(pParse, &p->pSrc->a[0]) ){ + pSub->selFlags |= SF_Expanded; + pTab2 = sqlite3ResultSetOfSelect(pParse, pSub, SQLITE_AFF_NONE); + if( pTab2==0 ){ + /* Might actually be some other kind of error, but in that case + ** pParse->nErr will be set, so if SQLITE_NOMEM is set, we will get + ** the correct error message regardless. */ rc = SQLITE_NOMEM; }else{ - pSub->selFlags |= SF_Expanded; - p->selFlags &= ~SF_Aggregate; - sqlite3SelectPrep(pParse, pSub, 0); + memcpy(pTab, pTab2, sizeof(Table)); + pTab->tabFlags |= TF_Ephemeral; + p->pSrc->a[0].pTab = pTab; + pTab = pTab2; } - - sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pMWin->iEphCsr, pSublist->nExpr); }else{ sqlite3SelectDelete(db, pSub); } if( db->mallocFailed ) rc = SQLITE_NOMEM; + sqlite3DbFree(db, pTab); } + if( rc ){ + if( pParse->nErr==0 ){ + assert( pParse->db->mallocFailed ); + sqlite3ErrorToParser(pParse->db, SQLITE_NOMEM); + } + sqlite3SelectReset(pParse, p); + } return rc; } +/* +** Unlink the Window object from the Select to which it is attached, +** if it is attached. +*/ +SQLITE_PRIVATE void sqlite3WindowUnlinkFromSelect(Window *p){ + if( p->ppThis ){ + *p->ppThis = p->pNextWin; + if( p->pNextWin ) p->pNextWin->ppThis = p->ppThis; + p->ppThis = 0; + } +} + /* ** Free the Window object passed as the second argument. */ SQLITE_PRIVATE void sqlite3WindowDelete(sqlite3 *db, Window *p){ if( p ){ + sqlite3WindowUnlinkFromSelect(p); sqlite3ExprDelete(db, p->pFilter); sqlite3ExprListDelete(db, p->pPartition); sqlite3ExprListDelete(db, p->pOrderBy); sqlite3ExprDelete(db, p->pEnd); sqlite3ExprDelete(db, p->pStart); sqlite3DbFree(db, p->zName); + sqlite3DbFree(db, p->zBase); sqlite3DbFree(db, p); } } @@ -144533,6 +150402,7 @@ SQLITE_PRIVATE void sqlite3WindowListDelete(sqlite3 *db, Window *p){ */ static Expr *sqlite3WindowOffsetExpr(Parse *pParse, Expr *pExpr){ if( 0==sqlite3ExprIsConstant(pExpr) ){ + if( IN_RENAME_OBJECT ) sqlite3RenameExprUnmap(pParse, pExpr); sqlite3ExprDelete(pParse->db, pExpr); pExpr = sqlite3ExprAlloc(pParse->db, TK_NULL, 0, 0); } @@ -144544,16 +150414,18 @@ static Expr *sqlite3WindowOffsetExpr(Parse *pParse, Expr *pExpr){ */ SQLITE_PRIVATE Window *sqlite3WindowAlloc( Parse *pParse, /* Parsing context */ - int eType, /* Frame type. TK_RANGE or TK_ROWS */ + int eType, /* Frame type. TK_RANGE, TK_ROWS, TK_GROUPS, or 0 */ int eStart, /* Start type: CURRENT, PRECEDING, FOLLOWING, UNBOUNDED */ Expr *pStart, /* Start window size if TK_PRECEDING or FOLLOWING */ int eEnd, /* End type: CURRENT, FOLLOWING, TK_UNBOUNDED, PRECEDING */ - Expr *pEnd /* End window size if TK_FOLLOWING or PRECEDING */ + Expr *pEnd, /* End window size if TK_FOLLOWING or PRECEDING */ + u8 eExclude /* EXCLUDE clause */ ){ Window *pWin = 0; + int bImplicitFrame = 0; /* Parser assures the following: */ - assert( eType==TK_RANGE || eType==TK_ROWS ); + assert( eType==0 || eType==TK_RANGE || eType==TK_ROWS || eType==TK_GROUPS ); assert( eStart==TK_CURRENT || eStart==TK_PRECEDING || eStart==TK_UNBOUNDED || eStart==TK_FOLLOWING ); assert( eEnd==TK_CURRENT || eEnd==TK_FOLLOWING @@ -144561,13 +150433,9 @@ SQLITE_PRIVATE Window *sqlite3WindowAlloc( assert( (eStart==TK_PRECEDING || eStart==TK_FOLLOWING)==(pStart!=0) ); assert( (eEnd==TK_FOLLOWING || eEnd==TK_PRECEDING)==(pEnd!=0) ); - - /* If a frame is declared "RANGE" (not "ROWS"), then it may not use - ** either " PRECEDING" or " FOLLOWING". - */ - if( eType==TK_RANGE && (pStart!=0 || pEnd!=0) ){ - sqlite3ErrorMsg(pParse, "RANGE must use only UNBOUNDED or CURRENT ROW"); - goto windowAllocErr; + if( eType==0 ){ + bImplicitFrame = 1; + eType = TK_RANGE; } /* Additionally, the @@ -144587,15 +150455,20 @@ SQLITE_PRIVATE Window *sqlite3WindowAlloc( if( (eStart==TK_CURRENT && eEnd==TK_PRECEDING) || (eStart==TK_FOLLOWING && (eEnd==TK_PRECEDING || eEnd==TK_CURRENT)) ){ - sqlite3ErrorMsg(pParse, "unsupported frame delimiter for ROWS"); + sqlite3ErrorMsg(pParse, "unsupported frame specification"); goto windowAllocErr; } pWin = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); if( pWin==0 ) goto windowAllocErr; - pWin->eType = eType; + pWin->eFrmType = eType; pWin->eStart = eStart; pWin->eEnd = eEnd; + if( eExclude==0 && OptimizationDisabled(pParse->db, SQLITE_WindowFunc) ){ + eExclude = TK_NO; + } + pWin->eExclude = eExclude; + pWin->bImplicitFrame = bImplicitFrame; pWin->pEnd = sqlite3WindowOffsetExpr(pParse, pEnd); pWin->pStart = sqlite3WindowOffsetExpr(pParse, pStart); return pWin; @@ -144606,21 +150479,83 @@ SQLITE_PRIVATE Window *sqlite3WindowAlloc( return 0; } +/* +** Attach PARTITION and ORDER BY clauses pPartition and pOrderBy to window +** pWin. Also, if parameter pBase is not NULL, set pWin->zBase to the +** equivalent nul-terminated string. +*/ +SQLITE_PRIVATE Window *sqlite3WindowAssemble( + Parse *pParse, + Window *pWin, + ExprList *pPartition, + ExprList *pOrderBy, + Token *pBase +){ + if( pWin ){ + pWin->pPartition = pPartition; + pWin->pOrderBy = pOrderBy; + if( pBase ){ + pWin->zBase = sqlite3DbStrNDup(pParse->db, pBase->z, pBase->n); + } + }else{ + sqlite3ExprListDelete(pParse->db, pPartition); + sqlite3ExprListDelete(pParse->db, pOrderBy); + } + return pWin; +} + +/* +** Window *pWin has just been created from a WINDOW clause. Tokne pBase +** is the base window. Earlier windows from the same WINDOW clause are +** stored in the linked list starting at pWin->pNextWin. This function +** either updates *pWin according to the base specification, or else +** leaves an error in pParse. +*/ +SQLITE_PRIVATE void sqlite3WindowChain(Parse *pParse, Window *pWin, Window *pList){ + if( pWin->zBase ){ + sqlite3 *db = pParse->db; + Window *pExist = windowFind(pParse, pList, pWin->zBase); + if( pExist ){ + const char *zErr = 0; + /* Check for errors */ + if( pWin->pPartition ){ + zErr = "PARTITION clause"; + }else if( pExist->pOrderBy && pWin->pOrderBy ){ + zErr = "ORDER BY clause"; + }else if( pExist->bImplicitFrame==0 ){ + zErr = "frame specification"; + } + if( zErr ){ + sqlite3ErrorMsg(pParse, + "cannot override %s of window: %s", zErr, pWin->zBase + ); + }else{ + pWin->pPartition = sqlite3ExprListDup(db, pExist->pPartition, 0); + if( pExist->pOrderBy ){ + assert( pWin->pOrderBy==0 ); + pWin->pOrderBy = sqlite3ExprListDup(db, pExist->pOrderBy, 0); + } + sqlite3DbFree(db, pWin->zBase); + pWin->zBase = 0; + } + } + } +} + /* ** Attach window object pWin to expression p. */ SQLITE_PRIVATE void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){ if( p ){ - /* This routine is only called for the parser. If pWin was not - ** allocated due to an OOM, then the parser would fail before ever - ** invoking this routine */ - if( ALWAYS(pWin) ){ - p->pWin = pWin; - pWin->pOwner = p; - if( p->flags & EP_Distinct ){ - sqlite3ErrorMsg(pParse, - "DISTINCT is not supported for window functions"); - } + assert( p->op==TK_FUNCTION ); + assert( pWin ); + p->y.pWin = pWin; + ExprSetProperty(p, EP_WinFunc); + pWin->pOwner = p; + if( (p->flags & EP_Distinct) && pWin->eFrmType!=TK_FILTER ){ + sqlite3ErrorMsg(pParse, + "DISTINCT is not supported for window functions" + ); } }else{ sqlite3WindowDelete(pParse->db, pWin); @@ -144628,17 +150563,49 @@ SQLITE_PRIVATE void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){ } /* -** Return 0 if the two window objects are identical, or non-zero otherwise. -** Identical window objects can be processed in a single scan. +** Possibly link window pWin into the list at pSel->pWin (window functions +** to be processed as part of SELECT statement pSel). The window is linked +** in if either (a) there are no other windows already linked to this +** SELECT, or (b) the windows already linked use a compatible window frame. */ -SQLITE_PRIVATE int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2){ - if( p1->eType!=p2->eType ) return 1; +SQLITE_PRIVATE void sqlite3WindowLink(Select *pSel, Window *pWin){ + if( pSel!=0 + && (0==pSel->pWin || 0==sqlite3WindowCompare(0, pSel->pWin, pWin, 0)) + ){ + pWin->pNextWin = pSel->pWin; + if( pSel->pWin ){ + pSel->pWin->ppThis = &pWin->pNextWin; + } + pSel->pWin = pWin; + pWin->ppThis = &pSel->pWin; + } +} + +/* +** Return 0 if the two window objects are identical, 1 if they are +** different, or 2 if it cannot be determined if the objects are identical +** or not. Identical window objects can be processed in a single scan. +*/ +SQLITE_PRIVATE int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2, int bFilter){ + int res; + if( NEVER(p1==0) || NEVER(p2==0) ) return 1; + if( p1->eFrmType!=p2->eFrmType ) return 1; if( p1->eStart!=p2->eStart ) return 1; if( p1->eEnd!=p2->eEnd ) return 1; + if( p1->eExclude!=p2->eExclude ) return 1; if( sqlite3ExprCompare(pParse, p1->pStart, p2->pStart, -1) ) return 1; if( sqlite3ExprCompare(pParse, p1->pEnd, p2->pEnd, -1) ) return 1; - if( sqlite3ExprListCompare(p1->pPartition, p2->pPartition, -1) ) return 1; - if( sqlite3ExprListCompare(p1->pOrderBy, p2->pOrderBy, -1) ) return 1; + if( (res = sqlite3ExprListCompare(p1->pPartition, p2->pPartition, -1)) ){ + return res; + } + if( (res = sqlite3ExprListCompare(p1->pOrderBy, p2->pOrderBy, -1)) ){ + return res; + } + if( bFilter ){ + if( (res = sqlite3ExprCompare(pParse, p1->pFilter, p2->pFilter, -1)) ){ + return res; + } + } return 0; } @@ -144648,15 +150615,37 @@ SQLITE_PRIVATE int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2){ ** to begin iterating through the sub-query results. It is used to allocate ** and initialize registers and cursors used by sqlite3WindowCodeStep(). */ -SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Window *pMWin){ +SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Select *pSelect){ + int nEphExpr = pSelect->pSrc->a[0].pSelect->pEList->nExpr; + Window *pMWin = pSelect->pWin; Window *pWin; Vdbe *v = sqlite3GetVdbe(pParse); - int nPart = (pMWin->pPartition ? pMWin->pPartition->nExpr : 0); - nPart += (pMWin->pOrderBy ? pMWin->pOrderBy->nExpr : 0); - if( nPart ){ + + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pMWin->iEphCsr, nEphExpr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+1, pMWin->iEphCsr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+2, pMWin->iEphCsr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+3, pMWin->iEphCsr); + + /* Allocate registers to use for PARTITION BY values, if any. Initialize + ** said registers to NULL. */ + if( pMWin->pPartition ){ + int nExpr = pMWin->pPartition->nExpr; pMWin->regPart = pParse->nMem+1; - pParse->nMem += nPart; - sqlite3VdbeAddOp3(v, OP_Null, 0, pMWin->regPart, pMWin->regPart+nPart-1); + pParse->nMem += nExpr; + sqlite3VdbeAddOp3(v, OP_Null, 0, pMWin->regPart, pMWin->regPart+nExpr-1); + } + + pMWin->regOne = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 1, pMWin->regOne); + + if( pMWin->eExclude ){ + pMWin->regStartRowid = ++pParse->nMem; + pMWin->regEndRowid = ++pParse->nMem; + pMWin->csrApp = pParse->nTab++; + sqlite3VdbeAddOp2(v, OP_Integer, 1, pMWin->regStartRowid); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pMWin->regEndRowid); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->csrApp, pMWin->iEphCsr); + return; } for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ @@ -144675,8 +150664,8 @@ SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Window *pMWin){ pWin->regApp = pParse->nMem+1; pParse->nMem += 3; if( pKeyInfo && pWin->pFunc->zName[1]=='i' ){ - assert( pKeyInfo->aSortOrder[0]==0 ); - pKeyInfo->aSortOrder[0] = 1; + assert( pKeyInfo->aSortFlags[0]==0 ); + pKeyInfo->aSortFlags[0] = KEYINFO_ORDER_DESC; } sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pWin->csrApp, 2); sqlite3VdbeAppendP4(v, pKeyInfo, P4_KEYINFO); @@ -144685,20 +150674,24 @@ SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Window *pMWin){ else if( p->zName==nth_valueName || p->zName==first_valueName ){ /* Allocate two registers at pWin->regApp. These will be used to ** store the start and end index of the current frame. */ - assert( pMWin->iEphCsr ); pWin->regApp = pParse->nMem+1; pWin->csrApp = pParse->nTab++; pParse->nMem += 2; sqlite3VdbeAddOp2(v, OP_OpenDup, pWin->csrApp, pMWin->iEphCsr); } else if( p->zName==leadName || p->zName==lagName ){ - assert( pMWin->iEphCsr ); pWin->csrApp = pParse->nTab++; sqlite3VdbeAddOp2(v, OP_OpenDup, pWin->csrApp, pMWin->iEphCsr); } } } +#define WINDOW_STARTING_INT 0 +#define WINDOW_ENDING_INT 1 +#define WINDOW_NTH_VALUE_INT 2 +#define WINDOW_STARTING_NUM 3 +#define WINDOW_ENDING_NUM 4 + /* ** A "PRECEDING " (eCond==0) or "FOLLOWING " (eCond==1) or the ** value of the second argument to nth_value() (eCond==2) has just been @@ -144706,25 +150699,43 @@ SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Window *pMWin){ ** code to check that the value is a non-negative integer and throws an ** exception if it is not. */ -static void windowCheckIntValue(Parse *pParse, int reg, int eCond){ +static void windowCheckValue(Parse *pParse, int reg, int eCond){ static const char *azErr[] = { "frame starting offset must be a non-negative integer", "frame ending offset must be a non-negative integer", - "second argument to nth_value must be a positive integer" + "second argument to nth_value must be a positive integer", + "frame starting offset must be a non-negative number", + "frame ending offset must be a non-negative number", }; - static int aOp[] = { OP_Ge, OP_Ge, OP_Gt }; + static int aOp[] = { OP_Ge, OP_Ge, OP_Gt, OP_Ge, OP_Ge }; Vdbe *v = sqlite3GetVdbe(pParse); int regZero = sqlite3GetTempReg(pParse); - assert( eCond==0 || eCond==1 || eCond==2 ); + assert( eCond>=0 && eCond=WINDOW_STARTING_NUM ){ + int regString = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp4(v, OP_String8, 0, regString, 0, "", P4_STATIC); + sqlite3VdbeAddOp3(v, OP_Ge, regString, sqlite3VdbeCurrentAddr(v)+2, reg); + sqlite3VdbeChangeP5(v, SQLITE_AFF_NUMERIC|SQLITE_JUMPIFNULL); + VdbeCoverage(v); + assert( eCond==3 || eCond==4 ); + VdbeCoverageIf(v, eCond==3); + VdbeCoverageIf(v, eCond==4); + }else{ + sqlite3VdbeAddOp2(v, OP_MustBeInt, reg, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + assert( eCond==0 || eCond==1 || eCond==2 ); + VdbeCoverageIf(v, eCond==0); + VdbeCoverageIf(v, eCond==1); + VdbeCoverageIf(v, eCond==2); + } sqlite3VdbeAddOp3(v, aOp[eCond], regZero, sqlite3VdbeCurrentAddr(v)+2, reg); - VdbeCoverageNeverNullIf(v, eCond==0); - VdbeCoverageNeverNullIf(v, eCond==1); + VdbeCoverageNeverNullIf(v, eCond==0); /* NULL case captured by */ + VdbeCoverageNeverNullIf(v, eCond==1); /* the OP_MustBeInt */ VdbeCoverageNeverNullIf(v, eCond==2); + VdbeCoverageNeverNullIf(v, eCond==3); /* NULL case caught by */ + VdbeCoverageNeverNullIf(v, eCond==4); /* the OP_Ge */ + sqlite3MayAbort(pParse); sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_ERROR, OE_Abort); sqlite3VdbeAppendP4(v, (void*)azErr[eCond], P4_STATIC); sqlite3ReleaseTempReg(pParse, regZero); @@ -144739,6 +150750,108 @@ static int windowArgCount(Window *pWin){ return (pList ? pList->nExpr : 0); } +typedef struct WindowCodeArg WindowCodeArg; +typedef struct WindowCsrAndReg WindowCsrAndReg; + +/* +** See comments above struct WindowCodeArg. +*/ +struct WindowCsrAndReg { + int csr; /* Cursor number */ + int reg; /* First in array of peer values */ +}; + +/* +** A single instance of this structure is allocated on the stack by +** sqlite3WindowCodeStep() and a pointer to it passed to the various helper +** routines. This is to reduce the number of arguments required by each +** helper function. +** +** regArg: +** Each window function requires an accumulator register (just as an +** ordinary aggregate function does). This variable is set to the first +** in an array of accumulator registers - one for each window function +** in the WindowCodeArg.pMWin list. +** +** eDelete: +** The window functions implementation sometimes caches the input rows +** that it processes in a temporary table. If it is not zero, this +** variable indicates when rows may be removed from the temp table (in +** order to reduce memory requirements - it would always be safe just +** to leave them there). Possible values for eDelete are: +** +** WINDOW_RETURN_ROW: +** An input row can be discarded after it is returned to the caller. +** +** WINDOW_AGGINVERSE: +** An input row can be discarded after the window functions xInverse() +** callbacks have been invoked in it. +** +** WINDOW_AGGSTEP: +** An input row can be discarded after the window functions xStep() +** callbacks have been invoked in it. +** +** start,current,end +** Consider a window-frame similar to the following: +** +** (ORDER BY a, b GROUPS BETWEEN 2 PRECEDING AND 2 FOLLOWING) +** +** The windows functions implmentation caches the input rows in a temp +** table, sorted by "a, b" (it actually populates the cache lazily, and +** aggressively removes rows once they are no longer required, but that's +** a mere detail). It keeps three cursors open on the temp table. One +** (current) that points to the next row to return to the query engine +** once its window function values have been calculated. Another (end) +** points to the next row to call the xStep() method of each window function +** on (so that it is 2 groups ahead of current). And a third (start) that +** points to the next row to call the xInverse() method of each window +** function on. +** +** Each cursor (start, current and end) consists of a VDBE cursor +** (WindowCsrAndReg.csr) and an array of registers (starting at +** WindowCodeArg.reg) that always contains a copy of the peer values +** read from the corresponding cursor. +** +** Depending on the window-frame in question, all three cursors may not +** be required. In this case both WindowCodeArg.csr and reg are set to +** 0. +*/ +struct WindowCodeArg { + Parse *pParse; /* Parse context */ + Window *pMWin; /* First in list of functions being processed */ + Vdbe *pVdbe; /* VDBE object */ + int addrGosub; /* OP_Gosub to this address to return one row */ + int regGosub; /* Register used with OP_Gosub(addrGosub) */ + int regArg; /* First in array of accumulator registers */ + int eDelete; /* See above */ + + WindowCsrAndReg start; + WindowCsrAndReg current; + WindowCsrAndReg end; +}; + +/* +** Generate VM code to read the window frames peer values from cursor csr into +** an array of registers starting at reg. +*/ +static void windowReadPeerValues( + WindowCodeArg *p, + int csr, + int reg +){ + Window *pMWin = p->pMWin; + ExprList *pOrderBy = pMWin->pOrderBy; + if( pOrderBy ){ + Vdbe *v = sqlite3GetVdbe(p->pParse); + ExprList *pPart = pMWin->pPartition; + int iColOff = pMWin->nBufferCol + (pPart ? pPart->nExpr : 0); + int i; + for(i=0; inExpr; i++){ + sqlite3VdbeAddOp3(v, OP_Column, csr, iColOff+i, reg+i); + } + } +} + /* ** Generate VM code to invoke either xStep() (if bInverse is 0) or ** xInverse (if bInverse is non-zero) for each window function in the @@ -144759,41 +150872,39 @@ static int windowArgCount(Window *pWin){ ** number of rows in the current partition. */ static void windowAggStep( - Parse *pParse, + WindowCodeArg *p, Window *pMWin, /* Linked list of window functions */ int csr, /* Read arguments from this cursor */ int bInverse, /* True to invoke xInverse instead of xStep */ - int reg, /* Array of registers */ - int regPartSize /* Register containing size of partition */ + int reg /* Array of registers */ ){ + Parse *pParse = p->pParse; Vdbe *v = sqlite3GetVdbe(pParse); Window *pWin; for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - int flags = pWin->pFunc->funcFlags; + FuncDef *pFunc = pWin->pFunc; int regArg; - int nArg = windowArgCount(pWin); + int nArg = pWin->bExprArgs ? 0 : windowArgCount(pWin); + int i; - if( csr>=0 ){ - int i; - for(i=0; ieStart!=TK_UNBOUNDED ); + + /* All OVER clauses in the same window function aggregate step must + ** be the same. */ + assert( pWin==pMWin || sqlite3WindowCompare(pParse,pWin,pMWin,0)!=1 ); + + for(i=0; izName!=nth_valueName ){ sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol+i, reg+i); + }else{ + sqlite3VdbeAddOp3(v, OP_Column, pMWin->iEphCsr, pWin->iArgCol+i, reg+i); } - regArg = reg; - if( flags & SQLITE_FUNC_WINDOW_SIZE ){ - if( nArg==0 ){ - regArg = regPartSize; - }else{ - sqlite3VdbeAddOp2(v, OP_SCopy, regPartSize, reg+nArg); - } - nArg++; - } - }else{ - assert( !(flags & SQLITE_FUNC_WINDOW_SIZE) ); - regArg = reg + pWin->iArgCol; } + regArg = reg; - if( (pWin->pFunc->funcFlags & SQLITE_FUNC_MINMAX) - && pWin->eStart!=TK_UNBOUNDED + if( pMWin->regStartRowid==0 + && (pFunc->funcFlags & SQLITE_FUNC_MINMAX) + && (pWin->eStart!=TK_UNBOUNDED) ){ int addrIsNull = sqlite3VdbeAddOp1(v, OP_IsNull, regArg); VdbeCoverage(v); @@ -144810,34 +150921,40 @@ static void windowAggStep( } sqlite3VdbeJumpHere(v, addrIsNull); }else if( pWin->regApp ){ - assert( pWin->pFunc->zName==nth_valueName - || pWin->pFunc->zName==first_valueName + assert( pFunc->zName==nth_valueName + || pFunc->zName==first_valueName ); assert( bInverse==0 || bInverse==1 ); sqlite3VdbeAddOp2(v, OP_AddImm, pWin->regApp+1-bInverse, 1); - }else if( pWin->pFunc->zName==leadName - || pWin->pFunc->zName==lagName - ){ - /* no-op */ - }else{ + }else if( pFunc->xSFunc!=noopStepFunc ){ int addrIf = 0; if( pWin->pFilter ){ int regTmp; - assert( nArg==0 || nArg==pWin->pOwner->x.pList->nExpr ); - assert( nArg || pWin->pOwner->x.pList==0 ); - if( csr>0 ){ - regTmp = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol+nArg,regTmp); - }else{ - regTmp = regArg + nArg; - } + assert( pWin->bExprArgs || !nArg ||nArg==pWin->pOwner->x.pList->nExpr ); + assert( pWin->bExprArgs || nArg ||pWin->pOwner->x.pList==0 ); + regTmp = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol+nArg,regTmp); addrIf = sqlite3VdbeAddOp3(v, OP_IfNot, regTmp, 0, 1); VdbeCoverage(v); - if( csr>0 ){ - sqlite3ReleaseTempReg(pParse, regTmp); + sqlite3ReleaseTempReg(pParse, regTmp); + } + + if( pWin->bExprArgs ){ + int iStart = sqlite3VdbeCurrentAddr(v); + VdbeOp *pOp, *pEnd; + + nArg = pWin->pOwner->x.pList->nExpr; + regArg = sqlite3GetTempRange(pParse, nArg); + sqlite3ExprCodeExprList(pParse, pWin->pOwner->x.pList, regArg, 0, 0); + + pEnd = sqlite3VdbeGetOp(v, -1); + for(pOp=sqlite3VdbeGetOp(v, iStart); pOp<=pEnd; pOp++){ + if( pOp->opcode==OP_Column && pOp->p1==pWin->iEphCsr ){ + pOp->p1 = csr; + } } } - if( pWin->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ + if( pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ CollSeq *pColl; assert( nArg>0 ); pColl = sqlite3ExprNNCollSeq(pParse, pWin->pOwner->x.pList->a[0].pExpr); @@ -144845,45 +150962,56 @@ static void windowAggStep( } sqlite3VdbeAddOp3(v, bInverse? OP_AggInverse : OP_AggStep, bInverse, regArg, pWin->regAccum); - sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF); + sqlite3VdbeAppendP4(v, pFunc, P4_FUNCDEF); sqlite3VdbeChangeP5(v, (u8)nArg); + if( pWin->bExprArgs ){ + sqlite3ReleaseTempRange(pParse, regArg, nArg); + } if( addrIf ) sqlite3VdbeJumpHere(v, addrIf); } } } /* -** Generate VM code to invoke either xValue() (bFinal==0) or xFinalize() -** (bFinal==1) for each window function in the linked list starting at +** Values that may be passed as the second argument to windowCodeOp(). +*/ +#define WINDOW_RETURN_ROW 1 +#define WINDOW_AGGINVERSE 2 +#define WINDOW_AGGSTEP 3 + +/* +** Generate VM code to invoke either xValue() (bFin==0) or xFinalize() +** (bFin==1) for each window function in the linked list starting at ** pMWin. Or, for built-in window-functions that do not use the standard ** API, generate the equivalent VM code. */ -static void windowAggFinal(Parse *pParse, Window *pMWin, int bFinal){ +static void windowAggFinal(WindowCodeArg *p, int bFin){ + Parse *pParse = p->pParse; + Window *pMWin = p->pMWin; Vdbe *v = sqlite3GetVdbe(pParse); Window *pWin; for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - if( (pWin->pFunc->funcFlags & SQLITE_FUNC_MINMAX) - && pWin->eStart!=TK_UNBOUNDED + if( pMWin->regStartRowid==0 + && (pWin->pFunc->funcFlags & SQLITE_FUNC_MINMAX) + && (pWin->eStart!=TK_UNBOUNDED) ){ sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); sqlite3VdbeAddOp1(v, OP_Last, pWin->csrApp); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_Column, pWin->csrApp, 0, pWin->regResult); sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); - if( bFinal ){ - sqlite3VdbeAddOp1(v, OP_ResetSorter, pWin->csrApp); - } }else if( pWin->regApp ){ + assert( pMWin->regStartRowid==0 ); }else{ - if( bFinal ){ - sqlite3VdbeAddOp2(v, OP_AggFinal, pWin->regAccum, windowArgCount(pWin)); + int nArg = windowArgCount(pWin); + if( bFin ){ + sqlite3VdbeAddOp2(v, OP_AggFinal, pWin->regAccum, nArg); sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF); sqlite3VdbeAddOp2(v, OP_Copy, pWin->regAccum, pWin->regResult); sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); }else{ - sqlite3VdbeAddOp3(v, OP_AggValue, pWin->regAccum, windowArgCount(pWin), - pWin->regResult); + sqlite3VdbeAddOp3(v, OP_AggValue,pWin->regAccum,nArg,pWin->regResult); sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF); } } @@ -144891,66 +151019,102 @@ static void windowAggFinal(Parse *pParse, Window *pMWin, int bFinal){ } /* -** This function generates VM code to invoke the sub-routine at address -** lblFlushPart once for each partition with the entire partition cached in -** the Window.iEphCsr temp table. +** Generate code to calculate the current values of all window functions in the +** p->pMWin list by doing a full scan of the current window frame. Store the +** results in the Window.regResult registers, ready to return the upper +** layer. */ -static void windowPartitionCache( - Parse *pParse, - Select *p, /* The rewritten SELECT statement */ - WhereInfo *pWInfo, /* WhereInfo to call WhereEnd() on */ - int regFlushPart, /* Register to use with Gosub lblFlushPart */ - int lblFlushPart, /* Subroutine to Gosub to */ - int *pRegSize /* OUT: Register containing partition size */ -){ - Window *pMWin = p->pWin; - Vdbe *v = sqlite3GetVdbe(pParse); - int iSubCsr = p->pSrc->a[0].iCursor; - int nSub = p->pSrc->a[0].pTab->nCol; - int k; +static void windowFullScan(WindowCodeArg *p){ + Window *pWin; + Parse *pParse = p->pParse; + Window *pMWin = p->pMWin; + Vdbe *v = p->pVdbe; - int reg = pParse->nMem+1; - int regRecord = reg+nSub; - int regRowid = regRecord+1; + int regCRowid = 0; /* Current rowid value */ + int regCPeer = 0; /* Current peer values */ + int regRowid = 0; /* AggStep rowid value */ + int regPeer = 0; /* AggStep peer values */ - *pRegSize = regRowid; - pParse->nMem += nSub + 2; + int nPeer; + int lblNext; + int lblBrk; + int addrNext; + int csr; - /* Load the column values for the row returned by the sub-select - ** into an array of registers starting at reg. */ - for(k=0; kcsrApp; + nPeer = (pMWin->pOrderBy ? pMWin->pOrderBy->nExpr : 0); + + lblNext = sqlite3VdbeMakeLabel(pParse); + lblBrk = sqlite3VdbeMakeLabel(pParse); + + regCRowid = sqlite3GetTempReg(pParse); + regRowid = sqlite3GetTempReg(pParse); + if( nPeer ){ + regCPeer = sqlite3GetTempRange(pParse, nPeer); + regPeer = sqlite3GetTempRange(pParse, nPeer); } - sqlite3VdbeAddOp3(v, OP_MakeRecord, reg, nSub, regRecord); - /* Check if this is the start of a new partition. If so, call the - ** flush_partition sub-routine. */ - if( pMWin->pPartition ){ + sqlite3VdbeAddOp2(v, OP_Rowid, pMWin->iEphCsr, regCRowid); + windowReadPeerValues(p, pMWin->iEphCsr, regCPeer); + + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); + } + + sqlite3VdbeAddOp3(v, OP_SeekGE, csr, lblBrk, pMWin->regStartRowid); + VdbeCoverage(v); + addrNext = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_Rowid, csr, regRowid); + sqlite3VdbeAddOp3(v, OP_Gt, pMWin->regEndRowid, lblBrk, regRowid); + VdbeCoverageNeverNull(v); + + if( pMWin->eExclude==TK_CURRENT ){ + sqlite3VdbeAddOp3(v, OP_Eq, regCRowid, lblNext, regRowid); + VdbeCoverageNeverNull(v); + }else if( pMWin->eExclude!=TK_NO ){ int addr; - ExprList *pPart = pMWin->pPartition; - int nPart = pPart->nExpr; - int regNewPart = reg + pMWin->nBufferCol; - KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pPart, 0, 0); + int addrEq = 0; + KeyInfo *pKeyInfo = 0; - addr = sqlite3VdbeAddOp3(v, OP_Compare, regNewPart, pMWin->regPart,nPart); - sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); - sqlite3VdbeAddOp3(v, OP_Jump, addr+2, addr+4, addr+2); - VdbeCoverageEqNe(v); - sqlite3VdbeAddOp3(v, OP_Copy, regNewPart, pMWin->regPart, nPart-1); - sqlite3VdbeAddOp2(v, OP_Gosub, regFlushPart, lblFlushPart); - VdbeComment((v, "call flush_partition")); + if( pMWin->pOrderBy ){ + pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pMWin->pOrderBy, 0, 0); + } + if( pMWin->eExclude==TK_TIES ){ + addrEq = sqlite3VdbeAddOp3(v, OP_Eq, regCRowid, 0, regRowid); + VdbeCoverageNeverNull(v); + } + if( pKeyInfo ){ + windowReadPeerValues(p, csr, regPeer); + sqlite3VdbeAddOp3(v, OP_Compare, regPeer, regCPeer, nPeer); + sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); + addr = sqlite3VdbeCurrentAddr(v)+1; + sqlite3VdbeAddOp3(v, OP_Jump, addr, lblNext, addr); + VdbeCoverageEqNe(v); + }else{ + sqlite3VdbeAddOp2(v, OP_Goto, 0, lblNext); + } + if( addrEq ) sqlite3VdbeJumpHere(v, addrEq); } - /* Buffer the current row in the ephemeral table. */ - sqlite3VdbeAddOp2(v, OP_NewRowid, pMWin->iEphCsr, regRowid); - sqlite3VdbeAddOp3(v, OP_Insert, pMWin->iEphCsr, regRecord, regRowid); + windowAggStep(p, pMWin, csr, 0, p->regArg); - /* End of the input loop */ - sqlite3WhereEnd(pWInfo); + sqlite3VdbeResolveLabel(v, lblNext); + sqlite3VdbeAddOp2(v, OP_Next, csr, addrNext); + VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addrNext-1); + sqlite3VdbeJumpHere(v, addrNext+1); + sqlite3ReleaseTempReg(pParse, regRowid); + sqlite3ReleaseTempReg(pParse, regCRowid); + if( nPeer ){ + sqlite3ReleaseTempRange(pParse, regPeer, nPeer); + sqlite3ReleaseTempRange(pParse, regCPeer, nPeer); + } - /* Invoke "flush_partition" to deal with the final (or only) partition */ - sqlite3VdbeAddOp2(v, OP_Gosub, regFlushPart, lblFlushPart); - VdbeComment((v, "call flush_partition")); + windowAggFinal(p, 1); + VdbeModuleComment((v, "windowFullScan end")); } /* @@ -144966,110 +151130,74 @@ static void windowPartitionCache( ** lag() ** lead() */ -static void windowReturnOneRow( - Parse *pParse, - Window *pMWin, - int regGosub, - int addrGosub -){ - Vdbe *v = sqlite3GetVdbe(pParse); - Window *pWin; - for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - FuncDef *pFunc = pWin->pFunc; - if( pFunc->zName==nth_valueName - || pFunc->zName==first_valueName - ){ - int csr = pWin->csrApp; - int lbl = sqlite3VdbeMakeLabel(v); - int tmpReg = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); +static void windowReturnOneRow(WindowCodeArg *p){ + Window *pMWin = p->pMWin; + Vdbe *v = p->pVdbe; - if( pFunc->zName==nth_valueName ){ - sqlite3VdbeAddOp3(v, OP_Column, pMWin->iEphCsr, pWin->iArgCol+1,tmpReg); - windowCheckIntValue(pParse, tmpReg, 2); - }else{ - sqlite3VdbeAddOp2(v, OP_Integer, 1, tmpReg); - } - sqlite3VdbeAddOp3(v, OP_Add, tmpReg, pWin->regApp, tmpReg); - sqlite3VdbeAddOp3(v, OP_Gt, pWin->regApp+1, lbl, tmpReg); - VdbeCoverageNeverNull(v); - sqlite3VdbeAddOp3(v, OP_SeekRowid, csr, 0, tmpReg); - VdbeCoverageNeverTaken(v); - sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol, pWin->regResult); - sqlite3VdbeResolveLabel(v, lbl); - sqlite3ReleaseTempReg(pParse, tmpReg); - } - else if( pFunc->zName==leadName || pFunc->zName==lagName ){ - int nArg = pWin->pOwner->x.pList->nExpr; - int iEph = pMWin->iEphCsr; - int csr = pWin->csrApp; - int lbl = sqlite3VdbeMakeLabel(v); - int tmpReg = sqlite3GetTempReg(pParse); - - if( nArg<3 ){ + if( pMWin->regStartRowid ){ + windowFullScan(p); + }else{ + Parse *pParse = p->pParse; + Window *pWin; + + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + FuncDef *pFunc = pWin->pFunc; + if( pFunc->zName==nth_valueName + || pFunc->zName==first_valueName + ){ + int csr = pWin->csrApp; + int lbl = sqlite3VdbeMakeLabel(pParse); + int tmpReg = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); - }else{ - sqlite3VdbeAddOp3(v, OP_Column, iEph, pWin->iArgCol+2, pWin->regResult); - } - sqlite3VdbeAddOp2(v, OP_Rowid, iEph, tmpReg); - if( nArg<2 ){ - int val = (pFunc->zName==leadName ? 1 : -1); - sqlite3VdbeAddOp2(v, OP_AddImm, tmpReg, val); - }else{ - int op = (pFunc->zName==leadName ? OP_Add : OP_Subtract); - int tmpReg2 = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp3(v, OP_Column, iEph, pWin->iArgCol+1, tmpReg2); - sqlite3VdbeAddOp3(v, op, tmpReg2, tmpReg, tmpReg); - sqlite3ReleaseTempReg(pParse, tmpReg2); + + if( pFunc->zName==nth_valueName ){ + sqlite3VdbeAddOp3(v, OP_Column,pMWin->iEphCsr,pWin->iArgCol+1,tmpReg); + windowCheckValue(pParse, tmpReg, 2); + }else{ + sqlite3VdbeAddOp2(v, OP_Integer, 1, tmpReg); + } + sqlite3VdbeAddOp3(v, OP_Add, tmpReg, pWin->regApp, tmpReg); + sqlite3VdbeAddOp3(v, OP_Gt, pWin->regApp+1, lbl, tmpReg); + VdbeCoverageNeverNull(v); + sqlite3VdbeAddOp3(v, OP_SeekRowid, csr, 0, tmpReg); + VdbeCoverageNeverTaken(v); + sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol, pWin->regResult); + sqlite3VdbeResolveLabel(v, lbl); + sqlite3ReleaseTempReg(pParse, tmpReg); + } + else if( pFunc->zName==leadName || pFunc->zName==lagName ){ + int nArg = pWin->pOwner->x.pList->nExpr; + int csr = pWin->csrApp; + int lbl = sqlite3VdbeMakeLabel(pParse); + int tmpReg = sqlite3GetTempReg(pParse); + int iEph = pMWin->iEphCsr; + + if( nArg<3 ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); + }else{ + sqlite3VdbeAddOp3(v, OP_Column, iEph,pWin->iArgCol+2,pWin->regResult); + } + sqlite3VdbeAddOp2(v, OP_Rowid, iEph, tmpReg); + if( nArg<2 ){ + int val = (pFunc->zName==leadName ? 1 : -1); + sqlite3VdbeAddOp2(v, OP_AddImm, tmpReg, val); + }else{ + int op = (pFunc->zName==leadName ? OP_Add : OP_Subtract); + int tmpReg2 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_Column, iEph, pWin->iArgCol+1, tmpReg2); + sqlite3VdbeAddOp3(v, op, tmpReg2, tmpReg, tmpReg); + sqlite3ReleaseTempReg(pParse, tmpReg2); + } + + sqlite3VdbeAddOp3(v, OP_SeekRowid, csr, lbl, tmpReg); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol, pWin->regResult); + sqlite3VdbeResolveLabel(v, lbl); + sqlite3ReleaseTempReg(pParse, tmpReg); } - - sqlite3VdbeAddOp3(v, OP_SeekRowid, csr, lbl, tmpReg); - VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol, pWin->regResult); - sqlite3VdbeResolveLabel(v, lbl); - sqlite3ReleaseTempReg(pParse, tmpReg); } } - sqlite3VdbeAddOp2(v, OP_Gosub, regGosub, addrGosub); -} - -/* -** Invoke the code generated by windowReturnOneRow() and, optionally, the -** xInverse() function for each window function, for one or more rows -** from the Window.iEphCsr temp table. This routine generates VM code -** similar to: -** -** while( regCtr>0 ){ -** regCtr--; -** windowReturnOneRow() -** if( bInverse ){ -** AggInverse -** } -** Next (Window.iEphCsr) -** } -*/ -static void windowReturnRows( - Parse *pParse, - Window *pMWin, /* List of window functions */ - int regCtr, /* Register containing number of rows */ - int regGosub, /* Register for Gosub addrGosub */ - int addrGosub, /* Address of sub-routine for ReturnOneRow */ - int regInvArg, /* Array of registers for xInverse args */ - int regInvSize /* Register containing size of partition */ -){ - int addr; - Vdbe *v = sqlite3GetVdbe(pParse); - windowAggFinal(pParse, pMWin, 0); - addr = sqlite3VdbeAddOp3(v, OP_IfPos, regCtr, sqlite3VdbeCurrentAddr(v)+2 ,1); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, 0); - windowReturnOneRow(pParse, pMWin, regGosub, addrGosub); - if( regInvArg ){ - windowAggStep(pParse, pMWin, pMWin->iEphCsr, 1, regInvArg, regInvSize); - } - sqlite3VdbeAddOp2(v, OP_Next, pMWin->iEphCsr, addr); - VdbeCoverage(v); - sqlite3VdbeJumpHere(v, addr+1); /* The OP_Goto */ + sqlite3VdbeAddOp2(v, OP_Gosub, p->regGosub, p->addrGosub); } /* @@ -145087,17 +151215,17 @@ static int windowInitAccum(Parse *pParse, Window *pMWin){ FuncDef *pFunc = pWin->pFunc; sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); nArg = MAX(nArg, windowArgCount(pWin)); - if( pFunc->zName==nth_valueName - || pFunc->zName==first_valueName - ){ - sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp); - sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); - } + if( pMWin->regStartRowid==0 ){ + if( pFunc->zName==nth_valueName || pFunc->zName==first_valueName ){ + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); + } - if( (pFunc->funcFlags & SQLITE_FUNC_MINMAX) && pWin->csrApp ){ - assert( pWin->eStart!=TK_UNBOUNDED ); - sqlite3VdbeAddOp1(v, OP_ResetSorter, pWin->csrApp); - sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); + if( (pFunc->funcFlags & SQLITE_FUNC_MINMAX) && pWin->csrApp ){ + assert( pWin->eStart!=TK_UNBOUNDED ); + sqlite3VdbeAddOp1(v, OP_ResetSorter, pWin->csrApp); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); + } } } regArg = pParse->nMem+1; @@ -145105,672 +151233,343 @@ static int windowInitAccum(Parse *pParse, Window *pMWin){ return regArg; } +/* +** Return true if the current frame should be cached in the ephemeral table, +** even if there are no xInverse() calls required. +*/ +static int windowCacheFrame(Window *pMWin){ + Window *pWin; + if( pMWin->regStartRowid ) return 1; + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + FuncDef *pFunc = pWin->pFunc; + if( (pFunc->zName==nth_valueName) + || (pFunc->zName==first_valueName) + || (pFunc->zName==leadName) + || (pFunc->zName==lagName) + ){ + return 1; + } + } + return 0; +} /* -** This function does the work of sqlite3WindowCodeStep() for all "ROWS" -** window frame types except for "BETWEEN UNBOUNDED PRECEDING AND CURRENT -** ROW". Pseudo-code for each follows. -** -** ROWS BETWEEN PRECEDING AND FOLLOWING -** -** ... -** if( new partition ){ -** Gosub flush_partition -** } -** Insert (record in eph-table) -** sqlite3WhereEnd() -** Gosub flush_partition -** -** flush_partition: -** Once { -** OpenDup (iEphCsr -> csrStart) -** OpenDup (iEphCsr -> csrEnd) -** } -** regStart = // PRECEDING expression -** regEnd = // FOLLOWING expression -** if( regStart<0 || regEnd<0 ){ error! } -** Rewind (csr,csrStart,csrEnd) // if EOF goto flush_partition_done -** Next(csrEnd) // if EOF skip Aggstep -** Aggstep (csrEnd) -** if( (regEnd--)<=0 ){ -** AggFinal (xValue) -** Gosub addrGosub -** Next(csr) // if EOF goto flush_partition_done -** if( (regStart--)<=0 ){ -** AggInverse (csrStart) -** Next(csrStart) -** } -** } -** flush_partition_done: -** ResetSorter (csr) -** Return -** -** ROWS BETWEEN PRECEDING AND CURRENT ROW -** ROWS BETWEEN CURRENT ROW AND FOLLOWING -** ROWS BETWEEN UNBOUNDED PRECEDING AND FOLLOWING -** -** These are similar to the above. For "CURRENT ROW", intialize the -** register to 0. For "UNBOUNDED PRECEDING" to infinity. -** -** ROWS BETWEEN PRECEDING AND UNBOUNDED FOLLOWING -** ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING -** -** Rewind (csr,csrStart,csrEnd) // if EOF goto flush_partition_done -** while( 1 ){ -** Next(csrEnd) // Exit while(1) at EOF -** Aggstep (csrEnd) -** } -** while( 1 ){ -** AggFinal (xValue) -** Gosub addrGosub -** Next(csr) // if EOF goto flush_partition_done -** if( (regStart--)<=0 ){ -** AggInverse (csrStart) -** Next(csrStart) -** } -** } -** -** For the "CURRENT ROW AND UNBOUNDED FOLLOWING" case, the final if() -** condition is always true (as if regStart were initialized to 0). -** -** RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING -** -** This is the only RANGE case handled by this routine. It modifies the -** second while( 1 ) loop in "ROWS BETWEEN CURRENT ... UNBOUNDED..." to -** be: -** -** while( 1 ){ -** AggFinal (xValue) -** while( 1 ){ -** regPeer++ -** Gosub addrGosub -** Next(csr) // if EOF goto flush_partition_done -** if( new peer ) break; -** } -** while( (regPeer--)>0 ){ -** AggInverse (csrStart) -** Next(csrStart) -** } -** } -** -** ROWS BETWEEN FOLLOWING AND FOLLOWING -** -** regEnd = regEnd - regStart -** Rewind (csr,csrStart,csrEnd) // if EOF goto flush_partition_done -** Aggstep (csrEnd) -** Next(csrEnd) // if EOF fall-through -** if( (regEnd--)<=0 ){ -** if( (regStart--)<=0 ){ -** AggFinal (xValue) -** Gosub addrGosub -** Next(csr) // if EOF goto flush_partition_done -** } -** AggInverse (csrStart) -** Next (csrStart) -** } -** -** ROWS BETWEEN PRECEDING AND PRECEDING -** -** Replace the bit after "Rewind" in the above with: -** -** if( (regEnd--)<=0 ){ -** AggStep (csrEnd) -** Next (csrEnd) -** } -** AggFinal (xValue) -** Gosub addrGosub -** Next(csr) // if EOF goto flush_partition_done -** if( (regStart--)<=0 ){ -** AggInverse (csr2) -** Next (csr2) -** } +** regOld and regNew are each the first register in an array of size +** pOrderBy->nExpr. This function generates code to compare the two +** arrays of registers using the collation sequences and other comparison +** parameters specified by pOrderBy. ** +** If the two arrays are not equal, the contents of regNew is copied to +** regOld and control falls through. Otherwise, if the contents of the arrays +** are equal, an OP_Goto is executed. The address of the OP_Goto is returned. */ -static void windowCodeRowExprStep( - Parse *pParse, - Select *p, - WhereInfo *pWInfo, - int regGosub, - int addrGosub +static void windowIfNewPeer( + Parse *pParse, + ExprList *pOrderBy, + int regNew, /* First in array of new values */ + int regOld, /* First in array of old values */ + int addr /* Jump here */ ){ - Window *pMWin = p->pWin; Vdbe *v = sqlite3GetVdbe(pParse); - int regFlushPart; /* Register for "Gosub flush_partition" */ - int lblFlushPart; /* Label for "Gosub flush_partition" */ - int lblFlushDone; /* Label for "Gosub flush_partition_done" */ - - int regArg; - int addr; - int csrStart = pParse->nTab++; - int csrEnd = pParse->nTab++; - int regStart; /* Value of PRECEDING */ - int regEnd; /* Value of FOLLOWING */ - int addrGoto; - int addrTop; - int addrIfPos1 = 0; - int addrIfPos2 = 0; - int regSize = 0; - - assert( pMWin->eStart==TK_PRECEDING - || pMWin->eStart==TK_CURRENT - || pMWin->eStart==TK_FOLLOWING - || pMWin->eStart==TK_UNBOUNDED - ); - assert( pMWin->eEnd==TK_FOLLOWING - || pMWin->eEnd==TK_CURRENT - || pMWin->eEnd==TK_UNBOUNDED - || pMWin->eEnd==TK_PRECEDING - ); - - /* Allocate register and label for the "flush_partition" sub-routine. */ - regFlushPart = ++pParse->nMem; - lblFlushPart = sqlite3VdbeMakeLabel(v); - lblFlushDone = sqlite3VdbeMakeLabel(v); - - regStart = ++pParse->nMem; - regEnd = ++pParse->nMem; - - windowPartitionCache(pParse, p, pWInfo, regFlushPart, lblFlushPart, ®Size); - - addrGoto = sqlite3VdbeAddOp0(v, OP_Goto); - - /* Start of "flush_partition" */ - sqlite3VdbeResolveLabel(v, lblFlushPart); - sqlite3VdbeAddOp2(v, OP_Once, 0, sqlite3VdbeCurrentAddr(v)+3); - VdbeCoverage(v); - VdbeComment((v, "Flush_partition subroutine")); - sqlite3VdbeAddOp2(v, OP_OpenDup, csrStart, pMWin->iEphCsr); - sqlite3VdbeAddOp2(v, OP_OpenDup, csrEnd, pMWin->iEphCsr); - - /* If either regStart or regEnd are not non-negative integers, throw - ** an exception. */ - if( pMWin->pStart ){ - sqlite3ExprCode(pParse, pMWin->pStart, regStart); - windowCheckIntValue(pParse, regStart, 0); - } - if( pMWin->pEnd ){ - sqlite3ExprCode(pParse, pMWin->pEnd, regEnd); - windowCheckIntValue(pParse, regEnd, 1); - } - - /* If this is "ROWS FOLLOWING AND ROWS FOLLOWING", do: - ** - ** if( regEndpEnd && pMWin->eStart==TK_FOLLOWING ){ - assert( pMWin->pStart!=0 ); - assert( pMWin->eEnd==TK_FOLLOWING ); - sqlite3VdbeAddOp3(v, OP_Ge, regStart, sqlite3VdbeCurrentAddr(v)+2, regEnd); - VdbeCoverageNeverNull(v); - sqlite3VdbeAddOp2(v, OP_Copy, regSize, regStart); - sqlite3VdbeAddOp3(v, OP_Subtract, regStart, regEnd, regEnd); - } - - if( pMWin->pStart && pMWin->eEnd==TK_PRECEDING ){ - assert( pMWin->pEnd!=0 ); - assert( pMWin->eStart==TK_PRECEDING ); - sqlite3VdbeAddOp3(v, OP_Le, regStart, sqlite3VdbeCurrentAddr(v)+3, regEnd); - VdbeCoverageNeverNull(v); - sqlite3VdbeAddOp2(v, OP_Copy, regSize, regStart); - sqlite3VdbeAddOp2(v, OP_Copy, regSize, regEnd); - } - - /* Initialize the accumulator register for each window function to NULL */ - regArg = windowInitAccum(pParse, pMWin); - - sqlite3VdbeAddOp2(v, OP_Rewind, pMWin->iEphCsr, lblFlushDone); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Rewind, csrStart, lblFlushDone); - VdbeCoverageNeverTaken(v); - sqlite3VdbeChangeP5(v, 1); - sqlite3VdbeAddOp2(v, OP_Rewind, csrEnd, lblFlushDone); - VdbeCoverageNeverTaken(v); - sqlite3VdbeChangeP5(v, 1); - - /* Invoke AggStep function for each window function using the row that - ** csrEnd currently points to. Or, if csrEnd is already at EOF, - ** do nothing. */ - addrTop = sqlite3VdbeCurrentAddr(v); - if( pMWin->eEnd==TK_PRECEDING ){ - addrIfPos1 = sqlite3VdbeAddOp3(v, OP_IfPos, regEnd, 0 , 1); - VdbeCoverage(v); - } - sqlite3VdbeAddOp2(v, OP_Next, csrEnd, sqlite3VdbeCurrentAddr(v)+2); - VdbeCoverage(v); - addr = sqlite3VdbeAddOp0(v, OP_Goto); - windowAggStep(pParse, pMWin, csrEnd, 0, regArg, regSize); - if( pMWin->eEnd==TK_UNBOUNDED ){ - sqlite3VdbeAddOp2(v, OP_Goto, 0, addrTop); - sqlite3VdbeJumpHere(v, addr); - addrTop = sqlite3VdbeCurrentAddr(v); + if( pOrderBy ){ + int nVal = pOrderBy->nExpr; + KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pOrderBy, 0, 0); + sqlite3VdbeAddOp3(v, OP_Compare, regOld, regNew, nVal); + sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); + sqlite3VdbeAddOp3(v, OP_Jump, + sqlite3VdbeCurrentAddr(v)+1, addr, sqlite3VdbeCurrentAddr(v)+1 + ); + VdbeCoverageEqNe(v); + sqlite3VdbeAddOp3(v, OP_Copy, regNew, regOld, nVal-1); }else{ - sqlite3VdbeJumpHere(v, addr); - if( pMWin->eEnd==TK_PRECEDING ){ - sqlite3VdbeJumpHere(v, addrIfPos1); - } - } - - if( pMWin->eEnd==TK_FOLLOWING ){ - addrIfPos1 = sqlite3VdbeAddOp3(v, OP_IfPos, regEnd, 0 , 1); - VdbeCoverage(v); - } - if( pMWin->eStart==TK_FOLLOWING ){ - addrIfPos2 = sqlite3VdbeAddOp3(v, OP_IfPos, regStart, 0 , 1); - VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Goto, 0, addr); } - windowAggFinal(pParse, pMWin, 0); - windowReturnOneRow(pParse, pMWin, regGosub, addrGosub); - sqlite3VdbeAddOp2(v, OP_Next, pMWin->iEphCsr, sqlite3VdbeCurrentAddr(v)+2); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, lblFlushDone); - if( pMWin->eStart==TK_FOLLOWING ){ - sqlite3VdbeJumpHere(v, addrIfPos2); - } - - if( pMWin->eStart==TK_CURRENT - || pMWin->eStart==TK_PRECEDING - || pMWin->eStart==TK_FOLLOWING - ){ - int lblSkipInverse = sqlite3VdbeMakeLabel(v);; - if( pMWin->eStart==TK_PRECEDING ){ - sqlite3VdbeAddOp3(v, OP_IfPos, regStart, lblSkipInverse, 1); - VdbeCoverage(v); - } - if( pMWin->eStart==TK_FOLLOWING ){ - sqlite3VdbeAddOp2(v, OP_Next, csrStart, sqlite3VdbeCurrentAddr(v)+2); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, lblSkipInverse); - }else{ - sqlite3VdbeAddOp2(v, OP_Next, csrStart, sqlite3VdbeCurrentAddr(v)+1); - VdbeCoverageAlwaysTaken(v); - } - windowAggStep(pParse, pMWin, csrStart, 1, regArg, regSize); - sqlite3VdbeResolveLabel(v, lblSkipInverse); - } - if( pMWin->eEnd==TK_FOLLOWING ){ - sqlite3VdbeJumpHere(v, addrIfPos1); - } - sqlite3VdbeAddOp2(v, OP_Goto, 0, addrTop); - - /* flush_partition_done: */ - sqlite3VdbeResolveLabel(v, lblFlushDone); - sqlite3VdbeAddOp1(v, OP_ResetSorter, pMWin->iEphCsr); - sqlite3VdbeAddOp1(v, OP_Return, regFlushPart); - VdbeComment((v, "end flush_partition subroutine")); - - /* Jump to here to skip over flush_partition */ - sqlite3VdbeJumpHere(v, addrGoto); } /* -** This function does the work of sqlite3WindowCodeStep() for cases that -** would normally be handled by windowCodeDefaultStep() when there are -** one or more built-in window-functions that require the entire partition -** to be cached in a temp table before any rows can be returned. Additionally. -** "RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING" is always handled by -** this function. -** -** Pseudo-code corresponding to the VM code generated by this function -** for each type of window follows. -** -** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW -** -** flush_partition: -** Once { -** OpenDup (iEphCsr -> csrLead) -** } -** Integer ctr 0 -** foreach row (csrLead){ -** if( new peer ){ -** AggFinal (xValue) -** for(i=0; i= csr2.peerVal ) goto lbl; ** -** As above, except that each of the for() loops becomes: +** The value of parameter op may also be OP_Gt or OP_Le. In these cases the +** operator in the above pseudo-code is replaced with ">" or "<=", respectively. ** -** for(i=0; i=" becomes "<=", +** ">" becomes "<", and so on. So, with DESC sort order, if the argument op +** is OP_Ge, the generated code is equivalent to: ** -** RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING +** if( csr1.peerVal - regVal <= csr2.peerVal ) goto lbl; ** -** flush_partition: -** Once { -** OpenDup (iEphCsr -> csrLead) -** } -** foreach row (csrLead) { -** AggStep (csrLead) -** } -** foreach row (iEphCsr) { -** Gosub addrGosub -** } -** -** RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING -** -** flush_partition: -** Once { -** OpenDup (iEphCsr -> csrLead) -** } -** foreach row (csrLead){ -** AggStep (csrLead) -** } -** Rewind (csrLead) -** Integer ctr 0 -** foreach row (csrLead){ -** if( new peer ){ -** AggFinal (xValue) -** for(i=0; ipWin; + Parse *pParse = p->pParse; Vdbe *v = sqlite3GetVdbe(pParse); - int k; - int addr; - ExprList *pPart = pMWin->pPartition; - ExprList *pOrderBy = pMWin->pOrderBy; - int nPeer = pOrderBy ? pOrderBy->nExpr : 0; - int regNewPeer; - - int addrGoto; /* Address of Goto used to jump flush_par.. */ - int addrNext; /* Jump here for next iteration of loop */ - int regFlushPart; - int lblFlushPart; - int csrLead; - int regCtr; - int regArg; /* Register array to martial function args */ - int regSize; - int lblEmpty; - int bReverse = pMWin->pOrderBy && pMWin->eStart==TK_CURRENT - && pMWin->eEnd==TK_UNBOUNDED; - - assert( (pMWin->eStart==TK_UNBOUNDED && pMWin->eEnd==TK_CURRENT) - || (pMWin->eStart==TK_UNBOUNDED && pMWin->eEnd==TK_UNBOUNDED) - || (pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_CURRENT) - || (pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_UNBOUNDED) - ); - - lblEmpty = sqlite3VdbeMakeLabel(v); - regNewPeer = pParse->nMem+1; - pParse->nMem += nPeer; - - /* Allocate register and label for the "flush_partition" sub-routine. */ - regFlushPart = ++pParse->nMem; - lblFlushPart = sqlite3VdbeMakeLabel(v); - - csrLead = pParse->nTab++; - regCtr = ++pParse->nMem; - - windowPartitionCache(pParse, p, pWInfo, regFlushPart, lblFlushPart, ®Size); - addrGoto = sqlite3VdbeAddOp0(v, OP_Goto); + ExprList *pOrderBy = p->pMWin->pOrderBy; /* ORDER BY clause for window */ + int reg1 = sqlite3GetTempReg(pParse); /* Reg. for csr1.peerVal+regVal */ + int reg2 = sqlite3GetTempReg(pParse); /* Reg. for csr2.peerVal */ + int regString = ++pParse->nMem; /* Reg. for constant value '' */ + int arith = OP_Add; /* OP_Add or OP_Subtract */ + int addrGe; /* Jump destination */ + + assert( op==OP_Ge || op==OP_Gt || op==OP_Le ); + assert( pOrderBy && pOrderBy->nExpr==1 ); + if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_DESC ){ + switch( op ){ + case OP_Ge: op = OP_Le; break; + case OP_Gt: op = OP_Lt; break; + default: assert( op==OP_Le ); op = OP_Ge; break; + } + arith = OP_Subtract; + } - /* Start of "flush_partition" */ - sqlite3VdbeResolveLabel(v, lblFlushPart); - sqlite3VdbeAddOp2(v, OP_Once, 0, sqlite3VdbeCurrentAddr(v)+2); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_OpenDup, csrLead, pMWin->iEphCsr); + /* Read the peer-value from each cursor into a register */ + windowReadPeerValues(p, csr1, reg1); + windowReadPeerValues(p, csr2, reg2); - /* Initialize the accumulator register for each window function to NULL */ - regArg = windowInitAccum(pParse, pMWin); + VdbeModuleComment((v, "CodeRangeTest: if( R%d %s R%d %s R%d ) goto lbl", + reg1, (arith==OP_Add ? "+" : "-"), regVal, + ((op==OP_Ge) ? ">=" : (op==OP_Le) ? "<=" : (op==OP_Gt) ? ">" : "<"), reg2 + )); - sqlite3VdbeAddOp2(v, OP_Integer, 0, regCtr); - sqlite3VdbeAddOp2(v, OP_Rewind, csrLead, lblEmpty); + /* Register reg1 currently contains csr1.peerVal (the peer-value from csr1). + ** This block adds (or subtracts for DESC) the numeric value in regVal + ** from it. Or, if reg1 is not numeric (it is a NULL, a text value or a blob), + ** then leave reg1 as it is. In pseudo-code, this is implemented as: + ** + ** if( reg1>='' ) goto addrGe; + ** reg1 = reg1 +/- regVal + ** addrGe: + ** + ** Since all strings and blobs are greater-than-or-equal-to an empty string, + ** the add/subtract is skipped for these, as required. If reg1 is a NULL, + ** then the arithmetic is performed, but since adding or subtracting from + ** NULL is always NULL anyway, this case is handled as required too. */ + sqlite3VdbeAddOp4(v, OP_String8, 0, regString, 0, "", P4_STATIC); + addrGe = sqlite3VdbeAddOp3(v, OP_Ge, regString, 0, reg1); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Rewind, pMWin->iEphCsr, lblEmpty); - VdbeCoverageNeverTaken(v); - - if( bReverse ){ - int addr2 = sqlite3VdbeCurrentAddr(v); - windowAggStep(pParse, pMWin, csrLead, 0, regArg, regSize); - sqlite3VdbeAddOp2(v, OP_Next, csrLead, addr2); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Rewind, csrLead, lblEmpty); - VdbeCoverageNeverTaken(v); - } - addrNext = sqlite3VdbeCurrentAddr(v); - - if( pOrderBy && (pMWin->eEnd==TK_CURRENT || pMWin->eStart==TK_CURRENT) ){ - int bCurrent = (pMWin->eStart==TK_CURRENT); - int addrJump = 0; /* Address of OP_Jump below */ - if( pMWin->eType==TK_RANGE ){ - int iOff = pMWin->nBufferCol + (pPart ? pPart->nExpr : 0); - int regPeer = pMWin->regPart + (pPart ? pPart->nExpr : 0); - KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pOrderBy, 0, 0); - for(k=0; ka[0].sortFlags & KEYINFO_ORDER_BIGNULL ){ + /* This block runs if reg1 contains a NULL. */ + int addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); VdbeCoverage(v); + switch( op ){ + case OP_Ge: + sqlite3VdbeAddOp2(v, OP_Goto, 0, lbl); + break; + case OP_Gt: + sqlite3VdbeAddOp2(v, OP_NotNull, reg2, lbl); + VdbeCoverage(v); + break; + case OP_Le: + sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); + VdbeCoverage(v); + break; + default: assert( op==OP_Lt ); /* no-op */ break; } + sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+3); - windowReturnRows(pParse, pMWin, regCtr, regGosub, addrGosub, - (bCurrent ? regArg : 0), (bCurrent ? regSize : 0) - ); - if( addrJump ) sqlite3VdbeJumpHere(v, addrJump); - } - - if( bReverse==0 ){ - windowAggStep(pParse, pMWin, csrLead, 0, regArg, regSize); + /* This block runs if reg1 is not NULL, but reg2 is. */ + sqlite3VdbeJumpHere(v, addr); + sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); VdbeCoverage(v); + if( op==OP_Gt || op==OP_Ge ){ + sqlite3VdbeChangeP2(v, -1, sqlite3VdbeCurrentAddr(v)+1); + } } - sqlite3VdbeAddOp2(v, OP_AddImm, regCtr, 1); - sqlite3VdbeAddOp2(v, OP_Next, csrLead, addrNext); - VdbeCoverage(v); - windowReturnRows(pParse, pMWin, regCtr, regGosub, addrGosub, 0, 0); + /* Compare registers reg2 and reg1, taking the jump if required. Note that + ** control skips over this test if the BIGNULL flag is set and either + ** reg1 or reg2 contain a NULL value. */ + sqlite3VdbeAddOp3(v, op, reg2, lbl, reg1); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); - sqlite3VdbeResolveLabel(v, lblEmpty); - sqlite3VdbeAddOp1(v, OP_ResetSorter, pMWin->iEphCsr); - sqlite3VdbeAddOp1(v, OP_Return, regFlushPart); + assert( op==OP_Ge || op==OP_Gt || op==OP_Lt || op==OP_Le ); + testcase(op==OP_Ge); VdbeCoverageIf(v, op==OP_Ge); + testcase(op==OP_Lt); VdbeCoverageIf(v, op==OP_Lt); + testcase(op==OP_Le); VdbeCoverageIf(v, op==OP_Le); + testcase(op==OP_Gt); VdbeCoverageIf(v, op==OP_Gt); + sqlite3ReleaseTempReg(pParse, reg1); + sqlite3ReleaseTempReg(pParse, reg2); - /* Jump to here to skip over flush_partition */ - sqlite3VdbeJumpHere(v, addrGoto); + VdbeModuleComment((v, "CodeRangeTest: end")); } - /* -** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW -** -** ... -** if( new partition ){ -** AggFinal (xFinalize) -** Gosub addrGosub -** ResetSorter eph-table -** } -** else if( new peer ){ -** AggFinal (xValue) -** Gosub addrGosub -** ResetSorter eph-table -** } -** AggStep -** Insert (record into eph-table) -** sqlite3WhereEnd() -** AggFinal (xFinalize) -** Gosub addrGosub -** -** RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING -** -** As above, except take no action for a "new peer". Invoke -** the sub-routine once only for each partition. -** -** RANGE BETWEEN CURRENT ROW AND CURRENT ROW -** -** As above, except that the "new peer" condition is handled in the -** same way as "new partition" (so there is no "else if" block). -** -** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW -** -** As above, except assume every row is a "new peer". +** Helper function for sqlite3WindowCodeStep(). Each call to this function +** generates VM code for a single RETURN_ROW, AGGSTEP or AGGINVERSE +** operation. Refer to the header comment for sqlite3WindowCodeStep() for +** details. */ -static void windowCodeDefaultStep( - Parse *pParse, - Select *p, - WhereInfo *pWInfo, - int regGosub, - int addrGosub +static int windowCodeOp( + WindowCodeArg *p, /* Context object */ + int op, /* WINDOW_RETURN_ROW, AGGSTEP or AGGINVERSE */ + int regCountdown, /* Register for OP_IfPos countdown */ + int jumpOnEof /* Jump here if stepped cursor reaches EOF */ ){ - Window *pMWin = p->pWin; - Vdbe *v = sqlite3GetVdbe(pParse); - int k; - int iSubCsr = p->pSrc->a[0].iCursor; - int nSub = p->pSrc->a[0].pTab->nCol; - int reg = pParse->nMem+1; - int regRecord = reg+nSub; - int regRowid = regRecord+1; - int addr; - ExprList *pPart = pMWin->pPartition; - ExprList *pOrderBy = pMWin->pOrderBy; + int csr, reg; + Parse *pParse = p->pParse; + Window *pMWin = p->pMWin; + int ret = 0; + Vdbe *v = p->pVdbe; + int addrContinue = 0; + int bPeer = (pMWin->eFrmType!=TK_ROWS); - assert( pMWin->eType==TK_RANGE - || (pMWin->eStart==TK_UNBOUNDED && pMWin->eEnd==TK_CURRENT) - ); + int lblDone = sqlite3VdbeMakeLabel(pParse); + int addrNextRange = 0; - assert( (pMWin->eStart==TK_UNBOUNDED && pMWin->eEnd==TK_CURRENT) - || (pMWin->eStart==TK_UNBOUNDED && pMWin->eEnd==TK_UNBOUNDED) - || (pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_CURRENT) - || (pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_UNBOUNDED && !pOrderBy) - ); + /* Special case - WINDOW_AGGINVERSE is always a no-op if the frame + ** starts with UNBOUNDED PRECEDING. */ + if( op==WINDOW_AGGINVERSE && pMWin->eStart==TK_UNBOUNDED ){ + assert( regCountdown==0 && jumpOnEof==0 ); + return 0; + } - if( pMWin->eEnd==TK_UNBOUNDED ){ - pOrderBy = 0; + if( regCountdown>0 ){ + if( pMWin->eFrmType==TK_RANGE ){ + addrNextRange = sqlite3VdbeCurrentAddr(v); + assert( op==WINDOW_AGGINVERSE || op==WINDOW_AGGSTEP ); + if( op==WINDOW_AGGINVERSE ){ + if( pMWin->eStart==TK_FOLLOWING ){ + windowCodeRangeTest( + p, OP_Le, p->current.csr, regCountdown, p->start.csr, lblDone + ); + }else{ + windowCodeRangeTest( + p, OP_Ge, p->start.csr, regCountdown, p->current.csr, lblDone + ); + } + }else{ + windowCodeRangeTest( + p, OP_Gt, p->end.csr, regCountdown, p->current.csr, lblDone + ); + } + }else{ + sqlite3VdbeAddOp3(v, OP_IfPos, regCountdown, lblDone, 1); + VdbeCoverage(v); + } } - pParse->nMem += nSub + 2; + if( op==WINDOW_RETURN_ROW && pMWin->regStartRowid==0 ){ + windowAggFinal(p, 0); + } + addrContinue = sqlite3VdbeCurrentAddr(v); - /* Load the individual column values of the row returned by - ** the sub-select into an array of registers. */ - for(k=0; kb). */ + if( pMWin->eStart==pMWin->eEnd && regCountdown + && pMWin->eFrmType==TK_RANGE && op==WINDOW_AGGINVERSE + ){ + int regRowid1 = sqlite3GetTempReg(pParse); + int regRowid2 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_Rowid, p->start.csr, regRowid1); + sqlite3VdbeAddOp2(v, OP_Rowid, p->end.csr, regRowid2); + sqlite3VdbeAddOp3(v, OP_Ge, regRowid2, lblDone, regRowid1); + VdbeCoverage(v); + sqlite3ReleaseTempReg(pParse, regRowid1); + sqlite3ReleaseTempReg(pParse, regRowid2); + assert( pMWin->eStart==TK_PRECEDING || pMWin->eStart==TK_FOLLOWING ); } - /* Check if this is the start of a new partition or peer group. */ - if( pPart || pOrderBy ){ - int nPart = (pPart ? pPart->nExpr : 0); - int addrGoto = 0; - int addrJump = 0; - int nPeer = (pOrderBy ? pOrderBy->nExpr : 0); + switch( op ){ + case WINDOW_RETURN_ROW: + csr = p->current.csr; + reg = p->current.reg; + windowReturnOneRow(p); + break; - if( pPart ){ - int regNewPart = reg + pMWin->nBufferCol; - KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pPart, 0, 0); - addr = sqlite3VdbeAddOp3(v, OP_Compare, regNewPart, pMWin->regPart,nPart); - sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); - addrJump = sqlite3VdbeAddOp3(v, OP_Jump, addr+2, 0, addr+2); - VdbeCoverageEqNe(v); - windowAggFinal(pParse, pMWin, 1); - if( pOrderBy ){ - addrGoto = sqlite3VdbeAddOp0(v, OP_Goto); + case WINDOW_AGGINVERSE: + csr = p->start.csr; + reg = p->start.reg; + if( pMWin->regStartRowid ){ + assert( pMWin->regEndRowid ); + sqlite3VdbeAddOp2(v, OP_AddImm, pMWin->regStartRowid, 1); + }else{ + windowAggStep(p, pMWin, csr, 1, p->regArg); } - } - - if( pOrderBy ){ - int regNewPeer = reg + pMWin->nBufferCol + nPart; - int regPeer = pMWin->regPart + nPart; + break; - if( addrJump ) sqlite3VdbeJumpHere(v, addrJump); - if( pMWin->eType==TK_RANGE ){ - KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pOrderBy, 0, 0); - addr = sqlite3VdbeAddOp3(v, OP_Compare, regNewPeer, regPeer, nPeer); - sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); - addrJump = sqlite3VdbeAddOp3(v, OP_Jump, addr+2, 0, addr+2); - VdbeCoverage(v); + default: + assert( op==WINDOW_AGGSTEP ); + csr = p->end.csr; + reg = p->end.reg; + if( pMWin->regStartRowid ){ + assert( pMWin->regEndRowid ); + sqlite3VdbeAddOp2(v, OP_AddImm, pMWin->regEndRowid, 1); }else{ - addrJump = 0; + windowAggStep(p, pMWin, csr, 0, p->regArg); } - windowAggFinal(pParse, pMWin, pMWin->eStart==TK_CURRENT); - if( addrGoto ) sqlite3VdbeJumpHere(v, addrGoto); - } - - sqlite3VdbeAddOp2(v, OP_Rewind, pMWin->iEphCsr,sqlite3VdbeCurrentAddr(v)+3); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Gosub, regGosub, addrGosub); - sqlite3VdbeAddOp2(v, OP_Next, pMWin->iEphCsr, sqlite3VdbeCurrentAddr(v)-1); - VdbeCoverage(v); - - sqlite3VdbeAddOp1(v, OP_ResetSorter, pMWin->iEphCsr); - sqlite3VdbeAddOp3( - v, OP_Copy, reg+pMWin->nBufferCol, pMWin->regPart, nPart+nPeer-1 - ); - - if( addrJump ) sqlite3VdbeJumpHere(v, addrJump); + break; } - /* Invoke step function for window functions */ - windowAggStep(pParse, pMWin, -1, 0, reg, 0); + if( op==p->eDelete ){ + sqlite3VdbeAddOp1(v, OP_Delete, csr); + sqlite3VdbeChangeP5(v, OPFLAG_SAVEPOSITION); + } - /* Buffer the current row in the ephemeral table. */ - if( pMWin->nBufferCol>0 ){ - sqlite3VdbeAddOp3(v, OP_MakeRecord, reg, pMWin->nBufferCol, regRecord); + if( jumpOnEof ){ + sqlite3VdbeAddOp2(v, OP_Next, csr, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + ret = sqlite3VdbeAddOp0(v, OP_Goto); }else{ - sqlite3VdbeAddOp2(v, OP_Blob, 0, regRecord); - sqlite3VdbeAppendP4(v, (void*)"", 0); + sqlite3VdbeAddOp2(v, OP_Next, csr, sqlite3VdbeCurrentAddr(v)+1+bPeer); + VdbeCoverage(v); + if( bPeer ){ + sqlite3VdbeAddOp2(v, OP_Goto, 0, lblDone); + } } - sqlite3VdbeAddOp2(v, OP_NewRowid, pMWin->iEphCsr, regRowid); - sqlite3VdbeAddOp3(v, OP_Insert, pMWin->iEphCsr, regRecord, regRowid); - /* End the database scan loop. */ - sqlite3WhereEnd(pWInfo); + if( bPeer ){ + int nReg = (pMWin->pOrderBy ? pMWin->pOrderBy->nExpr : 0); + int regTmp = (nReg ? sqlite3GetTempRange(pParse, nReg) : 0); + windowReadPeerValues(p, csr, regTmp); + windowIfNewPeer(pParse, pMWin->pOrderBy, regTmp, reg, addrContinue); + sqlite3ReleaseTempRange(pParse, regTmp, nReg); + } - windowAggFinal(pParse, pMWin, 1); - sqlite3VdbeAddOp2(v, OP_Rewind, pMWin->iEphCsr,sqlite3VdbeCurrentAddr(v)+3); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Gosub, regGosub, addrGosub); - sqlite3VdbeAddOp2(v, OP_Next, pMWin->iEphCsr, sqlite3VdbeCurrentAddr(v)-1); - VdbeCoverage(v); + if( addrNextRange ){ + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrNextRange); + } + sqlite3VdbeResolveLabel(v, lblDone); + return ret; } + /* ** Allocate and return a duplicate of the Window object indicated by the ** third argument. Set the Window.pOwner field of the new object to @@ -145778,19 +151577,24 @@ static void windowCodeDefaultStep( */ SQLITE_PRIVATE Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ Window *pNew = 0; - if( p ){ + if( ALWAYS(p) ){ pNew = sqlite3DbMallocZero(db, sizeof(Window)); if( pNew ){ pNew->zName = sqlite3DbStrDup(db, p->zName); + pNew->zBase = sqlite3DbStrDup(db, p->zBase); pNew->pFilter = sqlite3ExprDup(db, p->pFilter, 0); + pNew->pFunc = p->pFunc; pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0); pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0); - pNew->eType = p->eType; + pNew->eFrmType = p->eFrmType; pNew->eEnd = p->eEnd; pNew->eStart = p->eStart; + pNew->eExclude = p->eExclude; + pNew->regResult = p->regResult; pNew->pStart = sqlite3ExprDup(db, p->pStart, 0); pNew->pEnd = sqlite3ExprDup(db, p->pEnd, 0); pNew->pOwner = pOwner; + pNew->bImplicitFrame = p->bImplicitFrame; } } return pNew; @@ -145814,12 +151618,360 @@ SQLITE_PRIVATE Window *sqlite3WindowListDup(sqlite3 *db, Window *p){ return pRet; } +/* +** Return true if it can be determined at compile time that expression +** pExpr evaluates to a value that, when cast to an integer, is greater +** than zero. False otherwise. +** +** If an OOM error occurs, this function sets the Parse.db.mallocFailed +** flag and returns zero. +*/ +static int windowExprGtZero(Parse *pParse, Expr *pExpr){ + int ret = 0; + sqlite3 *db = pParse->db; + sqlite3_value *pVal = 0; + sqlite3ValueFromExpr(db, pExpr, db->enc, SQLITE_AFF_NUMERIC, &pVal); + if( pVal && sqlite3_value_int(pVal)>0 ){ + ret = 1; + } + sqlite3ValueFree(pVal); + return ret; +} + /* ** sqlite3WhereBegin() has already been called for the SELECT statement ** passed as the second argument when this function is invoked. It generates -** code to populate the Window.regResult register for each window function and -** invoke the sub-routine at instruction addrGosub once for each row. -** This function calls sqlite3WhereEnd() before returning. +** code to populate the Window.regResult register for each window function +** and invoke the sub-routine at instruction addrGosub once for each row. +** sqlite3WhereEnd() is always called before returning. +** +** This function handles several different types of window frames, which +** require slightly different processing. The following pseudo code is +** used to implement window frames of the form: +** +** ROWS BETWEEN PRECEDING AND FOLLOWING +** +** Other window frame types use variants of the following: +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** +** if( first row of partition ){ +** // Rewind three cursors, all open on the eph table. +** Rewind(csrEnd); +** Rewind(csrStart); +** Rewind(csrCurrent); +** +** regEnd = // FOLLOWING expression +** regStart = // PRECEDING expression +** }else{ +** // First time this branch is taken, the eph table contains two +** // rows. The first row in the partition, which all three cursors +** // currently point to, and the following row. +** AGGSTEP +** if( (regEnd--)<=0 ){ +** RETURN_ROW +** if( (regStart--)<=0 ){ +** AGGINVERSE +** } +** } +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** RETURN ROW +** if( csrCurrent is EOF ) break; +** if( (regStart--)<=0 ){ +** AggInverse(csrStart) +** Next(csrStart) +** } +** } +** +** The pseudo-code above uses the following shorthand: +** +** AGGSTEP: invoke the aggregate xStep() function for each window function +** with arguments read from the current row of cursor csrEnd, then +** step cursor csrEnd forward one row (i.e. sqlite3BtreeNext()). +** +** RETURN_ROW: return a row to the caller based on the contents of the +** current row of csrCurrent and the current state of all +** aggregates. Then step cursor csrCurrent forward one row. +** +** AGGINVERSE: invoke the aggregate xInverse() function for each window +** functions with arguments read from the current row of cursor +** csrStart. Then step csrStart forward one row. +** +** There are two other ROWS window frames that are handled significantly +** differently from the above - "BETWEEN PRECEDING AND PRECEDING" +** and "BETWEEN FOLLOWING AND FOLLOWING". These are special +** cases because they change the order in which the three cursors (csrStart, +** csrCurrent and csrEnd) iterate through the ephemeral table. Cases that +** use UNBOUNDED or CURRENT ROW are much simpler variations on one of these +** three. +** +** ROWS BETWEEN PRECEDING AND PRECEDING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else{ +** if( (regEnd--)<=0 ){ +** AGGSTEP +** } +** RETURN_ROW +** if( (regStart--)<=0 ){ +** AGGINVERSE +** } +** } +** } +** flush: +** if( (regEnd--)<=0 ){ +** AGGSTEP +** } +** RETURN_ROW +** +** +** ROWS BETWEEN FOLLOWING AND FOLLOWING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = regEnd - +** }else{ +** AGGSTEP +** if( (regEnd--)<=0 ){ +** RETURN_ROW +** } +** if( (regStart--)<=0 ){ +** AGGINVERSE +** } +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** if( (regEnd--)<=0 ){ +** RETURN_ROW +** if( eof ) break; +** } +** if( (regStart--)<=0 ){ +** AGGINVERSE +** if( eof ) break +** } +** } +** while( !eof csrCurrent ){ +** RETURN_ROW +** } +** +** For the most part, the patterns above are adapted to support UNBOUNDED by +** assuming that it is equivalent to "infinity PRECEDING/FOLLOWING" and +** CURRENT ROW by assuming that it is equivilent to "0 PRECEDING/FOLLOWING". +** This is optimized of course - branches that will never be taken and +** conditions that are always true are omitted from the VM code. The only +** exceptional case is: +** +** ROWS BETWEEN FOLLOWING AND UNBOUNDED FOLLOWING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regStart = +** }else{ +** AGGSTEP +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** if( (regStart--)<=0 ){ +** AGGINVERSE +** if( eof ) break +** } +** RETURN_ROW +** } +** while( !eof csrCurrent ){ +** RETURN_ROW +** } +** +** Also requiring special handling are the cases: +** +** ROWS BETWEEN PRECEDING AND PRECEDING +** ROWS BETWEEN FOLLOWING AND FOLLOWING +** +** when (expr1 < expr2). This is detected at runtime, not by this function. +** To handle this case, the pseudo-code programs depicted above are modified +** slightly to be: +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** if( regEnd < regStart ){ +** RETURN_ROW +** delete eph table contents +** continue +** } +** ... +** +** The new "continue" statement in the above jumps to the next iteration +** of the outer loop - the one started by sqlite3WhereBegin(). +** +** The various GROUPS cases are implemented using the same patterns as +** ROWS. The VM code is modified slightly so that: +** +** 1. The else branch in the main loop is only taken if the row just +** added to the ephemeral table is the start of a new group. In +** other words, it becomes: +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else if( new group ){ +** ... +** } +** } +** +** 2. Instead of processing a single row, each RETURN_ROW, AGGSTEP or +** AGGINVERSE step processes the current row of the relevant cursor and +** all subsequent rows belonging to the same group. +** +** RANGE window frames are a little different again. As for GROUPS, the +** main loop runs once per group only. And RETURN_ROW, AGGSTEP and AGGINVERSE +** deal in groups instead of rows. As for ROWS and GROUPS, there are three +** basic cases: +** +** RANGE BETWEEN PRECEDING AND FOLLOWING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else{ +** AGGSTEP +** while( (csrCurrent.key + regEnd) < csrEnd.key ){ +** RETURN_ROW +** while( csrStart.key + regStart) < csrCurrent.key ){ +** AGGINVERSE +** } +** } +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** RETURN ROW +** if( csrCurrent is EOF ) break; +** while( csrStart.key + regStart) < csrCurrent.key ){ +** AGGINVERSE +** } +** } +** } +** +** In the above notation, "csr.key" means the current value of the ORDER BY +** expression (there is only ever 1 for a RANGE that uses an FOLLOWING +** or PRECEDING AND PRECEDING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else{ +** while( (csrEnd.key + regEnd) <= csrCurrent.key ){ +** AGGSTEP +** } +** while( (csrStart.key + regStart) < csrCurrent.key ){ +** AGGINVERSE +** } +** RETURN_ROW +** } +** } +** flush: +** while( (csrEnd.key + regEnd) <= csrCurrent.key ){ +** AGGSTEP +** } +** while( (csrStart.key + regStart) < csrCurrent.key ){ +** AGGINVERSE +** } +** RETURN_ROW +** +** RANGE BETWEEN FOLLOWING AND FOLLOWING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else{ +** AGGSTEP +** while( (csrCurrent.key + regEnd) < csrEnd.key ){ +** while( (csrCurrent.key + regStart) > csrStart.key ){ +** AGGINVERSE +** } +** RETURN_ROW +** } +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** while( (csrCurrent.key + regStart) > csrStart.key ){ +** AGGINVERSE +** if( eof ) break "while( 1 )" loop. +** } +** RETURN_ROW +** } +** while( !eof csrCurrent ){ +** RETURN_ROW +** } +** +** The text above leaves out many details. Refer to the code and comments +** below for a more complete picture. */ SQLITE_PRIVATE void sqlite3WindowCodeStep( Parse *pParse, /* Parse context */ @@ -145829,75 +151981,321 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( int addrGosub /* OP_Gosub here to return each row */ ){ Window *pMWin = p->pWin; + ExprList *pOrderBy = pMWin->pOrderBy; + Vdbe *v = sqlite3GetVdbe(pParse); + int csrWrite; /* Cursor used to write to eph. table */ + int csrInput = p->pSrc->a[0].iCursor; /* Cursor of sub-select */ + int nInput = p->pSrc->a[0].pTab->nCol; /* Number of cols returned by sub */ + int iInput; /* To iterate through sub cols */ + int addrNe; /* Address of OP_Ne */ + int addrGosubFlush = 0; /* Address of OP_Gosub to flush: */ + int addrInteger = 0; /* Address of OP_Integer */ + int addrEmpty; /* Address of OP_Rewind in flush: */ + int regNew; /* Array of registers holding new input row */ + int regRecord; /* regNew array in record form */ + int regRowid; /* Rowid for regRecord in eph table */ + int regNewPeer = 0; /* Peer values for new row (part of regNew) */ + int regPeer = 0; /* Peer values for current row */ + int regFlushPart = 0; /* Register for "Gosub flush_partition" */ + WindowCodeArg s; /* Context object for sub-routines */ + int lblWhereEnd; /* Label just before sqlite3WhereEnd() code */ + int regStart = 0; /* Value of PRECEDING */ + int regEnd = 0; /* Value of FOLLOWING */ + + assert( pMWin->eStart==TK_PRECEDING || pMWin->eStart==TK_CURRENT + || pMWin->eStart==TK_FOLLOWING || pMWin->eStart==TK_UNBOUNDED + ); + assert( pMWin->eEnd==TK_FOLLOWING || pMWin->eEnd==TK_CURRENT + || pMWin->eEnd==TK_UNBOUNDED || pMWin->eEnd==TK_PRECEDING + ); + assert( pMWin->eExclude==0 || pMWin->eExclude==TK_CURRENT + || pMWin->eExclude==TK_GROUP || pMWin->eExclude==TK_TIES + || pMWin->eExclude==TK_NO + ); - /* There are three different functions that may be used to do the work - ** of this one, depending on the window frame and the specific built-in - ** window functions used (if any). - ** - ** windowCodeRowExprStep() handles all "ROWS" window frames, except for: - ** - ** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - ** - ** The exception is because windowCodeRowExprStep() implements all window - ** frame types by caching the entire partition in a temp table, and - ** "ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW" is easy enough to - ** implement without such a cache. - ** - ** windowCodeCacheStep() is used for: - ** - ** RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING - ** - ** It is also used for anything not handled by windowCodeRowExprStep() - ** that invokes a built-in window function that requires the entire - ** partition to be cached in a temp table before any rows are returned - ** (e.g. nth_value() or percent_rank()). - ** - ** Finally, assuming there is no built-in window function that requires - ** the partition to be cached, windowCodeDefaultStep() is used for: - ** - ** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - ** RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ** RANGE BETWEEN CURRENT ROW AND CURRENT ROW - ** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - ** - ** windowCodeDefaultStep() is the only one of the three functions that - ** does not cache each partition in a temp table before beginning to - ** return rows. - */ - if( pMWin->eType==TK_ROWS - && (pMWin->eStart!=TK_UNBOUNDED||pMWin->eEnd!=TK_CURRENT||!pMWin->pOrderBy) - ){ - VdbeModuleComment((pParse->pVdbe, "Begin RowExprStep()")); - windowCodeRowExprStep(pParse, p, pWInfo, regGosub, addrGosub); - }else{ - Window *pWin; - int bCache = 0; /* True to use CacheStep() */ - - if( pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_UNBOUNDED ){ - bCache = 1; - }else{ - for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - FuncDef *pFunc = pWin->pFunc; - if( (pFunc->funcFlags & SQLITE_FUNC_WINDOW_SIZE) - || (pFunc->zName==nth_valueName) - || (pFunc->zName==first_valueName) - || (pFunc->zName==leadName) - || (pFunc->zName==lagName) - ){ - bCache = 1; - break; + lblWhereEnd = sqlite3VdbeMakeLabel(pParse); + + /* Fill in the context object */ + memset(&s, 0, sizeof(WindowCodeArg)); + s.pParse = pParse; + s.pMWin = pMWin; + s.pVdbe = v; + s.regGosub = regGosub; + s.addrGosub = addrGosub; + s.current.csr = pMWin->iEphCsr; + csrWrite = s.current.csr+1; + s.start.csr = s.current.csr+2; + s.end.csr = s.current.csr+3; + + /* Figure out when rows may be deleted from the ephemeral table. There + ** are four options - they may never be deleted (eDelete==0), they may + ** be deleted as soon as they are no longer part of the window frame + ** (eDelete==WINDOW_AGGINVERSE), they may be deleted as after the row + ** has been returned to the caller (WINDOW_RETURN_ROW), or they may + ** be deleted after they enter the frame (WINDOW_AGGSTEP). */ + switch( pMWin->eStart ){ + case TK_FOLLOWING: + if( pMWin->eFrmType!=TK_RANGE + && windowExprGtZero(pParse, pMWin->pStart) + ){ + s.eDelete = WINDOW_RETURN_ROW; + } + break; + case TK_UNBOUNDED: + if( windowCacheFrame(pMWin)==0 ){ + if( pMWin->eEnd==TK_PRECEDING ){ + if( pMWin->eFrmType!=TK_RANGE + && windowExprGtZero(pParse, pMWin->pEnd) + ){ + s.eDelete = WINDOW_AGGSTEP; + } + }else{ + s.eDelete = WINDOW_RETURN_ROW; } } + break; + default: + s.eDelete = WINDOW_AGGINVERSE; + break; + } + + /* Allocate registers for the array of values from the sub-query, the + ** samve values in record form, and the rowid used to insert said record + ** into the ephemeral table. */ + regNew = pParse->nMem+1; + pParse->nMem += nInput; + regRecord = ++pParse->nMem; + regRowid = ++pParse->nMem; + + /* If the window frame contains an " PRECEDING" or " FOLLOWING" + ** clause, allocate registers to store the results of evaluating each + ** . */ + if( pMWin->eStart==TK_PRECEDING || pMWin->eStart==TK_FOLLOWING ){ + regStart = ++pParse->nMem; + } + if( pMWin->eEnd==TK_PRECEDING || pMWin->eEnd==TK_FOLLOWING ){ + regEnd = ++pParse->nMem; + } + + /* If this is not a "ROWS BETWEEN ..." frame, then allocate arrays of + ** registers to store copies of the ORDER BY expressions (peer values) + ** for the main loop, and for each cursor (start, current and end). */ + if( pMWin->eFrmType!=TK_ROWS ){ + int nPeer = (pOrderBy ? pOrderBy->nExpr : 0); + regNewPeer = regNew + pMWin->nBufferCol; + if( pMWin->pPartition ) regNewPeer += pMWin->pPartition->nExpr; + regPeer = pParse->nMem+1; pParse->nMem += nPeer; + s.start.reg = pParse->nMem+1; pParse->nMem += nPeer; + s.current.reg = pParse->nMem+1; pParse->nMem += nPeer; + s.end.reg = pParse->nMem+1; pParse->nMem += nPeer; + } + + /* Load the column values for the row returned by the sub-select + ** into an array of registers starting at regNew. Assemble them into + ** a record in register regRecord. */ + for(iInput=0; iInputpPartition ){ + int addr; + ExprList *pPart = pMWin->pPartition; + int nPart = pPart->nExpr; + int regNewPart = regNew + pMWin->nBufferCol; + KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pPart, 0, 0); + + regFlushPart = ++pParse->nMem; + addr = sqlite3VdbeAddOp3(v, OP_Compare, regNewPart, pMWin->regPart, nPart); + sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); + sqlite3VdbeAddOp3(v, OP_Jump, addr+2, addr+4, addr+2); + VdbeCoverageEqNe(v); + addrGosubFlush = sqlite3VdbeAddOp1(v, OP_Gosub, regFlushPart); + VdbeComment((v, "call flush_partition")); + sqlite3VdbeAddOp3(v, OP_Copy, regNewPart, pMWin->regPart, nPart-1); + } + + /* Insert the new row into the ephemeral table */ + sqlite3VdbeAddOp2(v, OP_NewRowid, csrWrite, regRowid); + sqlite3VdbeAddOp3(v, OP_Insert, csrWrite, regRecord, regRowid); + addrNe = sqlite3VdbeAddOp3(v, OP_Ne, pMWin->regOne, 0, regRowid); + VdbeCoverageNeverNull(v); + + /* This block is run for the first row of each partition */ + s.regArg = windowInitAccum(pParse, pMWin); + + if( regStart ){ + sqlite3ExprCode(pParse, pMWin->pStart, regStart); + windowCheckValue(pParse, regStart, 0 + (pMWin->eFrmType==TK_RANGE?3:0)); + } + if( regEnd ){ + sqlite3ExprCode(pParse, pMWin->pEnd, regEnd); + windowCheckValue(pParse, regEnd, 1 + (pMWin->eFrmType==TK_RANGE?3:0)); + } + + if( pMWin->eFrmType!=TK_RANGE && pMWin->eStart==pMWin->eEnd && regStart ){ + int op = ((pMWin->eStart==TK_FOLLOWING) ? OP_Ge : OP_Le); + int addrGe = sqlite3VdbeAddOp3(v, op, regStart, 0, regEnd); + VdbeCoverageNeverNullIf(v, op==OP_Ge); /* NeverNull because bound */ + VdbeCoverageNeverNullIf(v, op==OP_Le); /* values previously checked */ + windowAggFinal(&s, 0); + sqlite3VdbeAddOp2(v, OP_Rewind, s.current.csr, 1); + VdbeCoverageNeverTaken(v); + windowReturnOneRow(&s); + sqlite3VdbeAddOp1(v, OP_ResetSorter, s.current.csr); + sqlite3VdbeAddOp2(v, OP_Goto, 0, lblWhereEnd); + sqlite3VdbeJumpHere(v, addrGe); + } + if( pMWin->eStart==TK_FOLLOWING && pMWin->eFrmType!=TK_RANGE && regEnd ){ + assert( pMWin->eEnd==TK_FOLLOWING ); + sqlite3VdbeAddOp3(v, OP_Subtract, regStart, regEnd, regStart); + } + + if( pMWin->eStart!=TK_UNBOUNDED ){ + sqlite3VdbeAddOp2(v, OP_Rewind, s.start.csr, 1); + VdbeCoverageNeverTaken(v); + } + sqlite3VdbeAddOp2(v, OP_Rewind, s.current.csr, 1); + VdbeCoverageNeverTaken(v); + sqlite3VdbeAddOp2(v, OP_Rewind, s.end.csr, 1); + VdbeCoverageNeverTaken(v); + if( regPeer && pOrderBy ){ + sqlite3VdbeAddOp3(v, OP_Copy, regNewPeer, regPeer, pOrderBy->nExpr-1); + sqlite3VdbeAddOp3(v, OP_Copy, regPeer, s.start.reg, pOrderBy->nExpr-1); + sqlite3VdbeAddOp3(v, OP_Copy, regPeer, s.current.reg, pOrderBy->nExpr-1); + sqlite3VdbeAddOp3(v, OP_Copy, regPeer, s.end.reg, pOrderBy->nExpr-1); + } + + sqlite3VdbeAddOp2(v, OP_Goto, 0, lblWhereEnd); + + sqlite3VdbeJumpHere(v, addrNe); + + /* Beginning of the block executed for the second and subsequent rows. */ + if( regPeer ){ + windowIfNewPeer(pParse, pOrderBy, regNewPeer, regPeer, lblWhereEnd); + } + if( pMWin->eStart==TK_FOLLOWING ){ + windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); + if( pMWin->eEnd!=TK_UNBOUNDED ){ + if( pMWin->eFrmType==TK_RANGE ){ + int lbl = sqlite3VdbeMakeLabel(pParse); + int addrNext = sqlite3VdbeCurrentAddr(v); + windowCodeRangeTest(&s, OP_Ge, s.current.csr, regEnd, s.end.csr, lbl); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrNext); + sqlite3VdbeResolveLabel(v, lbl); + }else{ + windowCodeOp(&s, WINDOW_RETURN_ROW, regEnd, 0); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + } } + }else + if( pMWin->eEnd==TK_PRECEDING ){ + int bRPS = (pMWin->eStart==TK_PRECEDING && pMWin->eFrmType==TK_RANGE); + windowCodeOp(&s, WINDOW_AGGSTEP, regEnd, 0); + if( bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + if( !bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + }else{ + int addr = 0; + windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); + if( pMWin->eEnd!=TK_UNBOUNDED ){ + if( pMWin->eFrmType==TK_RANGE ){ + int lbl = 0; + addr = sqlite3VdbeCurrentAddr(v); + if( regEnd ){ + lbl = sqlite3VdbeMakeLabel(pParse); + windowCodeRangeTest(&s, OP_Ge, s.current.csr, regEnd, s.end.csr, lbl); + } + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + if( regEnd ){ + sqlite3VdbeAddOp2(v, OP_Goto, 0, addr); + sqlite3VdbeResolveLabel(v, lbl); + } + }else{ + if( regEnd ){ + addr = sqlite3VdbeAddOp3(v, OP_IfPos, regEnd, 0, 1); + VdbeCoverage(v); + } + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + if( regEnd ) sqlite3VdbeJumpHere(v, addr); + } + } + } - /* Otherwise, call windowCodeDefaultStep(). */ - if( bCache ){ - VdbeModuleComment((pParse->pVdbe, "Begin CacheStep()")); - windowCodeCacheStep(pParse, p, pWInfo, regGosub, addrGosub); - }else{ - VdbeModuleComment((pParse->pVdbe, "Begin DefaultStep()")); - windowCodeDefaultStep(pParse, p, pWInfo, regGosub, addrGosub); + /* End of the main input loop */ + sqlite3VdbeResolveLabel(v, lblWhereEnd); + sqlite3WhereEnd(pWInfo); + + /* Fall through */ + if( pMWin->pPartition ){ + addrInteger = sqlite3VdbeAddOp2(v, OP_Integer, 0, regFlushPart); + sqlite3VdbeJumpHere(v, addrGosubFlush); + } + + addrEmpty = sqlite3VdbeAddOp1(v, OP_Rewind, csrWrite); + VdbeCoverage(v); + if( pMWin->eEnd==TK_PRECEDING ){ + int bRPS = (pMWin->eStart==TK_PRECEDING && pMWin->eFrmType==TK_RANGE); + windowCodeOp(&s, WINDOW_AGGSTEP, regEnd, 0); + if( bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + }else if( pMWin->eStart==TK_FOLLOWING ){ + int addrStart; + int addrBreak1; + int addrBreak2; + int addrBreak3; + windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); + if( pMWin->eFrmType==TK_RANGE ){ + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak2 = windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 1); + addrBreak1 = windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 1); + }else + if( pMWin->eEnd==TK_UNBOUNDED ){ + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak1 = windowCodeOp(&s, WINDOW_RETURN_ROW, regStart, 1); + addrBreak2 = windowCodeOp(&s, WINDOW_AGGINVERSE, 0, 1); + }else{ + assert( pMWin->eEnd==TK_FOLLOWING ); + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak1 = windowCodeOp(&s, WINDOW_RETURN_ROW, regEnd, 1); + addrBreak2 = windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 1); + } + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrStart); + sqlite3VdbeJumpHere(v, addrBreak2); + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak3 = windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 1); + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrStart); + sqlite3VdbeJumpHere(v, addrBreak1); + sqlite3VdbeJumpHere(v, addrBreak3); + }else{ + int addrBreak; + int addrStart; + windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak = windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 1); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrStart); + sqlite3VdbeJumpHere(v, addrBreak); + } + sqlite3VdbeJumpHere(v, addrEmpty); + + sqlite3VdbeAddOp1(v, OP_ResetSorter, s.current.csr); + if( pMWin->pPartition ){ + if( pMWin->regStartRowid ){ + sqlite3VdbeAddOp2(v, OP_Integer, 1, pMWin->regStartRowid); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pMWin->regEndRowid); } + sqlite3VdbeChangeP1(v, addrInteger, sqlite3VdbeCurrentAddr(v)); + sqlite3VdbeAddOp1(v, OP_Return, regFlushPart); } } @@ -145930,6 +152328,7 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( ** input grammar file: */ /* #include */ +/* #include */ /************ Begin %include sections from the grammar ************************/ /* #include "sqliteInt.h" */ @@ -145988,8 +152387,9 @@ struct FrameBound { int eType; Expr *pExpr; }; ** shared across database connections. */ static void disableLookaside(Parse *pParse){ + sqlite3 *db = pParse->db; pParse->disableLookaside++; - pParse->db->lookaside.bDisable++; + DisableLookaside; } @@ -145999,6 +152399,7 @@ static void disableLookaside(Parse *pParse){ ** SQLITE_LIMIT_COMPOUND_SELECT. */ static void parserDoubleLinkSelect(Parse *pParse, Select *p){ + assert( p!=0 ); if( p->pPrior ){ Select *pNext = 0, *pLoop; int mxSelect, cnt = 0; @@ -146025,25 +152426,21 @@ static void disableLookaside(Parse *pParse){ if( p ){ /* memset(p, 0, sizeof(Expr)); */ p->op = (u8)op; - p->affinity = 0; + p->affExpr = 0; p->flags = EP_Leaf; p->iAgg = -1; p->pLeft = p->pRight = 0; p->x.pList = 0; p->pAggInfo = 0; - p->pTab = 0; + p->y.pTab = 0; p->op2 = 0; p->iTable = 0; p->iColumn = 0; -#ifndef SQLITE_OMIT_WINDOWFUNC - p->pWin = 0; -#endif p->u.zToken = (char*)&p[1]; memcpy(p->u.zToken, t.z, t.n); p->u.zToken[t.n] = 0; if( sqlite3Isquote(p->u.zToken[0]) ){ - if( p->u.zToken[0]=='"' ) p->flags |= EP_DblQuoted; - sqlite3Dequote(p->u.zToken); + sqlite3DequoteExpr(p); } #if SQLITE_MAX_EXPR_DEPTH>0 p->nHeight = 1; @@ -146089,6 +152486,10 @@ static void disableLookaside(Parse *pParse){ sqlite3ExprListSetName(pParse, p, pIdToken, 1); return p; } + +#if TK_SPAN>255 +# error too many tokens in the grammar +#endif /**************** End of %include directives **********************************/ /* These constants specify the various numeric values for terminal symbols ** in a format understandable to "makeheaders". This section is blank unless @@ -146152,27 +152553,28 @@ static void disableLookaside(Parse *pParse){ #endif /************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned short int -#define YYNOCODE 277 +#define YYNOCODE 310 #define YYACTIONTYPE unsigned short int -#define YYWILDCARD 91 +#define YYWILDCARD 100 #define sqlite3ParserTOKENTYPE Token typedef union { int yyinit; sqlite3ParserTOKENTYPE yy0; - Expr* yy18; - struct TrigEvent yy34; - IdList* yy48; - int yy70; - struct {int value; int mask;} yy111; - struct FrameBound yy119; - SrcList* yy135; - TriggerStep* yy207; - Window* yy327; - Upsert* yy340; - const char* yy392; - ExprList* yy420; - With* yy449; - Select* yy489; + SrcList* yy47; + u8 yy58; + struct FrameBound yy77; + With* yy131; + int yy192; + Expr* yy202; + struct {int value; int mask;} yy207; + struct TrigEvent yy230; + ExprList* yy242; + Window* yy303; + Upsert* yy318; + const char* yy436; + TriggerStep* yy447; + Select* yy539; + IdList* yy600; } YYMINORTYPE; #ifndef YYSTACKDEPTH #define YYSTACKDEPTH 100 @@ -146188,17 +152590,18 @@ typedef union { #define sqlite3ParserCTX_FETCH Parse *pParse=yypParser->pParse; #define sqlite3ParserCTX_STORE yypParser->pParse=pParse; #define YYFALLBACK 1 -#define YYNSTATE 521 -#define YYNRULE 367 -#define YYNTOKEN 155 -#define YY_MAX_SHIFT 520 -#define YY_MIN_SHIFTREDUCE 756 -#define YY_MAX_SHIFTREDUCE 1122 -#define YY_ERROR_ACTION 1123 -#define YY_ACCEPT_ACTION 1124 -#define YY_NO_ACTION 1125 -#define YY_MIN_REDUCE 1126 -#define YY_MAX_REDUCE 1492 +#define YYNSTATE 551 +#define YYNRULE 385 +#define YYNRULE_WITH_ACTION 325 +#define YYNTOKEN 181 +#define YY_MAX_SHIFT 550 +#define YY_MIN_SHIFTREDUCE 801 +#define YY_MAX_SHIFTREDUCE 1185 +#define YY_ERROR_ACTION 1186 +#define YY_ACCEPT_ACTION 1187 +#define YY_NO_ACTION 1188 +#define YY_MIN_REDUCE 1189 +#define YY_MAX_REDUCE 1573 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -146265,568 +152668,583 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (2009) +#define YY_ACTTAB_COUNT (1958) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 368, 105, 102, 197, 105, 102, 197, 515, 1124, 1, - /* 10 */ 1, 520, 2, 1128, 515, 1192, 1171, 1456, 275, 370, - /* 20 */ 127, 1389, 1197, 1197, 1192, 1166, 178, 1205, 64, 64, - /* 30 */ 477, 887, 322, 428, 348, 37, 37, 808, 362, 888, - /* 40 */ 509, 509, 509, 112, 113, 103, 1100, 1100, 953, 956, - /* 50 */ 946, 946, 110, 110, 111, 111, 111, 111, 365, 252, - /* 60 */ 252, 515, 252, 252, 497, 515, 309, 515, 459, 515, - /* 70 */ 1079, 491, 512, 478, 6, 512, 809, 134, 498, 228, - /* 80 */ 194, 428, 37, 37, 515, 208, 64, 64, 64, 64, - /* 90 */ 13, 13, 109, 109, 109, 109, 108, 108, 107, 107, - /* 100 */ 107, 106, 401, 258, 381, 13, 13, 398, 397, 428, - /* 110 */ 252, 252, 370, 476, 405, 1104, 1079, 1080, 1081, 386, - /* 120 */ 1106, 390, 497, 512, 497, 1423, 1419, 304, 1105, 307, - /* 130 */ 1256, 496, 370, 499, 16, 16, 112, 113, 103, 1100, - /* 140 */ 1100, 953, 956, 946, 946, 110, 110, 111, 111, 111, - /* 150 */ 111, 262, 1107, 495, 1107, 401, 112, 113, 103, 1100, - /* 160 */ 1100, 953, 956, 946, 946, 110, 110, 111, 111, 111, - /* 170 */ 111, 129, 1425, 343, 1420, 339, 1059, 492, 1057, 263, - /* 180 */ 73, 105, 102, 197, 994, 109, 109, 109, 109, 108, - /* 190 */ 108, 107, 107, 107, 106, 401, 370, 111, 111, 111, - /* 200 */ 111, 104, 492, 89, 1432, 109, 109, 109, 109, 108, - /* 210 */ 108, 107, 107, 107, 106, 401, 111, 111, 111, 111, - /* 220 */ 112, 113, 103, 1100, 1100, 953, 956, 946, 946, 110, - /* 230 */ 110, 111, 111, 111, 111, 109, 109, 109, 109, 108, - /* 240 */ 108, 107, 107, 107, 106, 401, 114, 108, 108, 107, - /* 250 */ 107, 107, 106, 401, 109, 109, 109, 109, 108, 108, - /* 260 */ 107, 107, 107, 106, 401, 152, 399, 399, 399, 109, - /* 270 */ 109, 109, 109, 108, 108, 107, 107, 107, 106, 401, - /* 280 */ 178, 493, 1412, 434, 1037, 1486, 1079, 515, 1486, 370, - /* 290 */ 421, 297, 357, 412, 74, 1079, 109, 109, 109, 109, - /* 300 */ 108, 108, 107, 107, 107, 106, 401, 1413, 37, 37, - /* 310 */ 1431, 274, 506, 112, 113, 103, 1100, 1100, 953, 956, - /* 320 */ 946, 946, 110, 110, 111, 111, 111, 111, 1436, 520, - /* 330 */ 2, 1128, 1079, 1080, 1081, 430, 275, 1079, 127, 366, - /* 340 */ 933, 1079, 1080, 1081, 220, 1205, 913, 458, 455, 454, - /* 350 */ 392, 167, 515, 1035, 152, 445, 924, 453, 152, 874, - /* 360 */ 923, 289, 109, 109, 109, 109, 108, 108, 107, 107, - /* 370 */ 107, 106, 401, 13, 13, 261, 853, 252, 252, 227, - /* 380 */ 106, 401, 370, 1079, 1080, 1081, 311, 388, 1079, 296, - /* 390 */ 512, 923, 923, 925, 231, 323, 1255, 1388, 1423, 490, - /* 400 */ 274, 506, 12, 208, 274, 506, 112, 113, 103, 1100, - /* 410 */ 1100, 953, 956, 946, 946, 110, 110, 111, 111, 111, - /* 420 */ 111, 1440, 286, 1128, 288, 1079, 1097, 247, 275, 1098, - /* 430 */ 127, 387, 405, 389, 1079, 1080, 1081, 1205, 159, 238, - /* 440 */ 255, 321, 461, 316, 460, 225, 790, 105, 102, 197, - /* 450 */ 513, 314, 842, 842, 445, 109, 109, 109, 109, 108, - /* 460 */ 108, 107, 107, 107, 106, 401, 515, 514, 515, 252, - /* 470 */ 252, 1079, 1080, 1081, 435, 370, 1098, 933, 1460, 794, - /* 480 */ 274, 506, 512, 105, 102, 197, 336, 63, 63, 64, - /* 490 */ 64, 27, 790, 924, 287, 208, 1354, 923, 515, 112, - /* 500 */ 113, 103, 1100, 1100, 953, 956, 946, 946, 110, 110, - /* 510 */ 111, 111, 111, 111, 107, 107, 107, 106, 401, 49, - /* 520 */ 49, 515, 28, 1079, 405, 497, 421, 297, 923, 923, - /* 530 */ 925, 186, 468, 1079, 467, 999, 999, 442, 515, 1079, - /* 540 */ 334, 515, 45, 45, 1083, 342, 173, 168, 109, 109, - /* 550 */ 109, 109, 108, 108, 107, 107, 107, 106, 401, 13, - /* 560 */ 13, 205, 13, 13, 252, 252, 1195, 1195, 370, 1079, - /* 570 */ 1080, 1081, 787, 265, 5, 359, 494, 512, 469, 1079, - /* 580 */ 1080, 1081, 398, 397, 1079, 1079, 1080, 1081, 3, 282, - /* 590 */ 1079, 1083, 112, 113, 103, 1100, 1100, 953, 956, 946, - /* 600 */ 946, 110, 110, 111, 111, 111, 111, 252, 252, 1015, - /* 610 */ 220, 1079, 873, 458, 455, 454, 943, 943, 954, 957, - /* 620 */ 512, 252, 252, 453, 1016, 1079, 445, 1107, 1209, 1107, - /* 630 */ 1079, 1080, 1081, 515, 512, 426, 1079, 1080, 1081, 1017, - /* 640 */ 512, 109, 109, 109, 109, 108, 108, 107, 107, 107, - /* 650 */ 106, 401, 1052, 515, 50, 50, 515, 1079, 1080, 1081, - /* 660 */ 828, 370, 1051, 379, 411, 1064, 1358, 207, 408, 773, - /* 670 */ 829, 1079, 1080, 1081, 64, 64, 322, 64, 64, 1302, - /* 680 */ 947, 411, 410, 1358, 1360, 112, 113, 103, 1100, 1100, - /* 690 */ 953, 956, 946, 946, 110, 110, 111, 111, 111, 111, - /* 700 */ 294, 482, 515, 1037, 1487, 515, 434, 1487, 354, 1120, - /* 710 */ 483, 996, 913, 485, 466, 996, 132, 178, 33, 450, - /* 720 */ 1203, 136, 406, 64, 64, 479, 64, 64, 419, 369, - /* 730 */ 283, 1146, 252, 252, 109, 109, 109, 109, 108, 108, - /* 740 */ 107, 107, 107, 106, 401, 512, 224, 440, 411, 266, - /* 750 */ 1358, 266, 252, 252, 370, 296, 416, 284, 934, 396, - /* 760 */ 976, 470, 400, 252, 252, 512, 9, 473, 231, 500, - /* 770 */ 354, 1036, 1035, 1488, 355, 374, 512, 1121, 112, 113, - /* 780 */ 103, 1100, 1100, 953, 956, 946, 946, 110, 110, 111, - /* 790 */ 111, 111, 111, 252, 252, 1015, 515, 1347, 295, 252, - /* 800 */ 252, 252, 252, 1098, 375, 249, 512, 445, 872, 322, - /* 810 */ 1016, 480, 512, 195, 512, 434, 273, 15, 15, 515, - /* 820 */ 314, 515, 95, 515, 93, 1017, 367, 109, 109, 109, - /* 830 */ 109, 108, 108, 107, 107, 107, 106, 401, 515, 1121, - /* 840 */ 39, 39, 51, 51, 52, 52, 503, 370, 515, 1204, - /* 850 */ 1098, 918, 439, 341, 133, 436, 223, 222, 221, 53, - /* 860 */ 53, 322, 1400, 761, 762, 763, 515, 370, 88, 54, - /* 870 */ 54, 112, 113, 103, 1100, 1100, 953, 956, 946, 946, - /* 880 */ 110, 110, 111, 111, 111, 111, 407, 55, 55, 196, - /* 890 */ 515, 112, 113, 103, 1100, 1100, 953, 956, 946, 946, - /* 900 */ 110, 110, 111, 111, 111, 111, 135, 264, 1149, 376, - /* 910 */ 515, 40, 40, 515, 872, 515, 993, 515, 993, 116, - /* 920 */ 109, 109, 109, 109, 108, 108, 107, 107, 107, 106, - /* 930 */ 401, 41, 41, 515, 43, 43, 44, 44, 56, 56, - /* 940 */ 109, 109, 109, 109, 108, 108, 107, 107, 107, 106, - /* 950 */ 401, 515, 379, 515, 57, 57, 515, 799, 515, 379, - /* 960 */ 515, 445, 200, 515, 323, 515, 1397, 515, 1459, 515, - /* 970 */ 1287, 817, 58, 58, 14, 14, 515, 59, 59, 118, - /* 980 */ 118, 60, 60, 515, 46, 46, 61, 61, 62, 62, - /* 990 */ 47, 47, 515, 190, 189, 91, 515, 140, 140, 515, - /* 1000 */ 394, 515, 277, 1200, 141, 141, 515, 1115, 515, 992, - /* 1010 */ 515, 992, 515, 69, 69, 370, 278, 48, 48, 259, - /* 1020 */ 65, 65, 119, 119, 246, 246, 260, 66, 66, 120, - /* 1030 */ 120, 121, 121, 117, 117, 370, 515, 512, 383, 112, - /* 1040 */ 113, 103, 1100, 1100, 953, 956, 946, 946, 110, 110, - /* 1050 */ 111, 111, 111, 111, 515, 872, 515, 139, 139, 112, - /* 1060 */ 113, 103, 1100, 1100, 953, 956, 946, 946, 110, 110, - /* 1070 */ 111, 111, 111, 111, 1287, 138, 138, 125, 125, 515, - /* 1080 */ 12, 515, 281, 1287, 515, 445, 131, 1287, 109, 109, - /* 1090 */ 109, 109, 108, 108, 107, 107, 107, 106, 401, 515, - /* 1100 */ 124, 124, 122, 122, 515, 123, 123, 515, 109, 109, - /* 1110 */ 109, 109, 108, 108, 107, 107, 107, 106, 401, 515, - /* 1120 */ 68, 68, 463, 783, 515, 70, 70, 302, 67, 67, - /* 1130 */ 1032, 253, 253, 356, 1287, 191, 196, 1433, 465, 1301, - /* 1140 */ 38, 38, 384, 94, 512, 42, 42, 177, 848, 274, - /* 1150 */ 506, 385, 420, 847, 1356, 441, 508, 376, 377, 153, - /* 1160 */ 423, 872, 432, 370, 224, 251, 194, 887, 182, 293, - /* 1170 */ 783, 848, 88, 254, 466, 888, 847, 915, 807, 806, - /* 1180 */ 230, 1241, 910, 370, 17, 413, 797, 112, 113, 103, - /* 1190 */ 1100, 1100, 953, 956, 946, 946, 110, 110, 111, 111, - /* 1200 */ 111, 111, 395, 814, 815, 1175, 983, 112, 101, 103, - /* 1210 */ 1100, 1100, 953, 956, 946, 946, 110, 110, 111, 111, - /* 1220 */ 111, 111, 375, 422, 427, 429, 298, 230, 230, 88, - /* 1230 */ 1240, 451, 312, 797, 226, 88, 109, 109, 109, 109, - /* 1240 */ 108, 108, 107, 107, 107, 106, 401, 86, 433, 979, - /* 1250 */ 927, 881, 226, 983, 230, 415, 109, 109, 109, 109, - /* 1260 */ 108, 108, 107, 107, 107, 106, 401, 320, 845, 781, - /* 1270 */ 846, 100, 130, 100, 1403, 290, 370, 319, 1377, 1376, - /* 1280 */ 437, 1449, 299, 1237, 303, 306, 308, 310, 1188, 1174, - /* 1290 */ 1173, 1172, 315, 324, 325, 1228, 370, 927, 1249, 271, - /* 1300 */ 1286, 113, 103, 1100, 1100, 953, 956, 946, 946, 110, - /* 1310 */ 110, 111, 111, 111, 111, 1224, 1235, 502, 501, 1292, - /* 1320 */ 1221, 1155, 103, 1100, 1100, 953, 956, 946, 946, 110, - /* 1330 */ 110, 111, 111, 111, 111, 1148, 1137, 1136, 1138, 1443, - /* 1340 */ 446, 244, 184, 98, 507, 188, 4, 353, 327, 109, - /* 1350 */ 109, 109, 109, 108, 108, 107, 107, 107, 106, 401, - /* 1360 */ 510, 329, 331, 199, 414, 456, 292, 285, 318, 109, - /* 1370 */ 109, 109, 109, 108, 108, 107, 107, 107, 106, 401, - /* 1380 */ 11, 1271, 1279, 402, 361, 192, 1171, 1351, 431, 505, - /* 1390 */ 346, 1350, 333, 98, 507, 504, 4, 187, 1446, 1115, - /* 1400 */ 233, 1396, 155, 1394, 1112, 152, 72, 75, 378, 425, - /* 1410 */ 510, 165, 149, 157, 933, 1276, 86, 30, 1268, 417, - /* 1420 */ 96, 96, 8, 160, 161, 162, 163, 97, 418, 402, - /* 1430 */ 517, 516, 449, 402, 923, 210, 358, 424, 1282, 438, - /* 1440 */ 169, 214, 360, 1345, 80, 504, 31, 444, 1365, 301, - /* 1450 */ 245, 274, 506, 216, 174, 305, 488, 447, 217, 462, - /* 1460 */ 1139, 487, 218, 363, 933, 923, 923, 925, 926, 24, - /* 1470 */ 96, 96, 1191, 1190, 1189, 391, 1182, 97, 1163, 402, - /* 1480 */ 517, 516, 799, 364, 923, 1162, 317, 1161, 98, 507, - /* 1490 */ 1181, 4, 1458, 472, 393, 269, 270, 475, 481, 1232, - /* 1500 */ 85, 1233, 326, 328, 232, 510, 495, 1231, 330, 98, - /* 1510 */ 507, 1230, 4, 486, 335, 923, 923, 925, 926, 24, - /* 1520 */ 1435, 1068, 404, 181, 336, 256, 510, 115, 402, 332, - /* 1530 */ 352, 352, 351, 241, 349, 1214, 1414, 770, 338, 10, - /* 1540 */ 504, 340, 272, 92, 1331, 1213, 87, 183, 484, 402, - /* 1550 */ 201, 488, 280, 239, 344, 345, 489, 1145, 29, 933, - /* 1560 */ 279, 504, 1074, 518, 240, 96, 96, 242, 243, 519, - /* 1570 */ 1134, 1129, 97, 154, 402, 517, 516, 372, 373, 923, - /* 1580 */ 933, 142, 143, 128, 1381, 267, 96, 96, 852, 757, - /* 1590 */ 203, 144, 403, 97, 1382, 402, 517, 516, 204, 1380, - /* 1600 */ 923, 146, 1379, 1159, 1158, 71, 1156, 276, 202, 185, - /* 1610 */ 923, 923, 925, 926, 24, 198, 257, 126, 991, 989, - /* 1620 */ 907, 98, 507, 156, 4, 145, 158, 206, 831, 209, - /* 1630 */ 291, 923, 923, 925, 926, 24, 1005, 911, 510, 164, - /* 1640 */ 147, 380, 371, 382, 166, 76, 77, 274, 506, 148, - /* 1650 */ 78, 79, 1008, 211, 212, 1004, 137, 213, 18, 300, - /* 1660 */ 230, 402, 997, 1109, 443, 215, 32, 170, 171, 772, - /* 1670 */ 409, 448, 319, 504, 219, 172, 452, 81, 19, 457, - /* 1680 */ 313, 20, 82, 268, 488, 150, 810, 179, 83, 487, - /* 1690 */ 464, 151, 933, 180, 959, 84, 1040, 34, 96, 96, - /* 1700 */ 471, 1041, 35, 474, 193, 97, 248, 402, 517, 516, - /* 1710 */ 1068, 404, 923, 250, 256, 880, 229, 175, 875, 352, - /* 1720 */ 352, 351, 241, 349, 100, 21, 770, 22, 1054, 1056, - /* 1730 */ 7, 98, 507, 1045, 4, 337, 1058, 23, 974, 201, - /* 1740 */ 176, 280, 88, 923, 923, 925, 926, 24, 510, 279, - /* 1750 */ 960, 958, 962, 1014, 963, 1013, 235, 234, 25, 36, - /* 1760 */ 99, 90, 507, 928, 4, 511, 350, 782, 26, 841, - /* 1770 */ 236, 402, 347, 1069, 237, 1125, 1125, 1451, 510, 203, - /* 1780 */ 1450, 1125, 1125, 504, 1125, 1125, 1125, 204, 1125, 1125, - /* 1790 */ 146, 1125, 1125, 1125, 1125, 1125, 1125, 202, 1125, 1125, - /* 1800 */ 1125, 402, 933, 1125, 1125, 1125, 1125, 1125, 96, 96, - /* 1810 */ 1125, 1125, 1125, 504, 1125, 97, 1125, 402, 517, 516, - /* 1820 */ 1125, 1125, 923, 1125, 1125, 1125, 1125, 1125, 1125, 1125, - /* 1830 */ 1125, 371, 933, 1125, 1125, 1125, 274, 506, 96, 96, - /* 1840 */ 1125, 1125, 1125, 1125, 1125, 97, 1125, 402, 517, 516, - /* 1850 */ 1125, 1125, 923, 923, 923, 925, 926, 24, 1125, 409, - /* 1860 */ 1125, 1125, 1125, 256, 1125, 1125, 1125, 1125, 352, 352, - /* 1870 */ 351, 241, 349, 1125, 1125, 770, 1125, 1125, 1125, 1125, - /* 1880 */ 1125, 1125, 1125, 923, 923, 925, 926, 24, 201, 1125, - /* 1890 */ 280, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 279, 1125, - /* 1900 */ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, - /* 1910 */ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, - /* 1920 */ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 203, 1125, - /* 1930 */ 1125, 1125, 1125, 1125, 1125, 1125, 204, 1125, 1125, 146, - /* 1940 */ 1125, 1125, 1125, 1125, 1125, 1125, 202, 1125, 1125, 1125, - /* 1950 */ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, - /* 1960 */ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, - /* 1970 */ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, - /* 1980 */ 371, 1125, 1125, 1125, 1125, 274, 506, 1125, 1125, 1125, - /* 1990 */ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, - /* 2000 */ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 409, + /* 0 */ 544, 1220, 544, 449, 1258, 544, 1237, 544, 114, 111, + /* 10 */ 211, 544, 1535, 544, 1258, 521, 114, 111, 211, 390, + /* 20 */ 1230, 342, 42, 42, 42, 42, 1223, 42, 42, 71, + /* 30 */ 71, 935, 1222, 71, 71, 71, 71, 1460, 1491, 936, + /* 40 */ 818, 451, 6, 121, 122, 112, 1163, 1163, 1004, 1007, + /* 50 */ 997, 997, 119, 119, 120, 120, 120, 120, 1541, 390, + /* 60 */ 1356, 1515, 550, 2, 1191, 194, 526, 434, 143, 291, + /* 70 */ 526, 136, 526, 369, 261, 502, 272, 383, 1271, 525, + /* 80 */ 501, 491, 164, 121, 122, 112, 1163, 1163, 1004, 1007, + /* 90 */ 997, 997, 119, 119, 120, 120, 120, 120, 1356, 440, + /* 100 */ 1512, 118, 118, 118, 118, 117, 117, 116, 116, 116, + /* 110 */ 115, 422, 266, 266, 266, 266, 1496, 356, 1498, 433, + /* 120 */ 355, 1496, 515, 522, 1483, 541, 1112, 541, 1112, 390, + /* 130 */ 403, 241, 208, 114, 111, 211, 98, 290, 535, 221, + /* 140 */ 1027, 118, 118, 118, 118, 117, 117, 116, 116, 116, + /* 150 */ 115, 422, 1140, 121, 122, 112, 1163, 1163, 1004, 1007, + /* 160 */ 997, 997, 119, 119, 120, 120, 120, 120, 404, 426, + /* 170 */ 117, 117, 116, 116, 116, 115, 422, 1416, 466, 123, + /* 180 */ 118, 118, 118, 118, 117, 117, 116, 116, 116, 115, + /* 190 */ 422, 116, 116, 116, 115, 422, 538, 538, 538, 390, + /* 200 */ 503, 120, 120, 120, 120, 113, 1049, 1140, 1141, 1142, + /* 210 */ 1049, 118, 118, 118, 118, 117, 117, 116, 116, 116, + /* 220 */ 115, 422, 1459, 121, 122, 112, 1163, 1163, 1004, 1007, + /* 230 */ 997, 997, 119, 119, 120, 120, 120, 120, 390, 442, + /* 240 */ 314, 83, 461, 81, 357, 380, 1140, 80, 118, 118, + /* 250 */ 118, 118, 117, 117, 116, 116, 116, 115, 422, 179, + /* 260 */ 432, 422, 121, 122, 112, 1163, 1163, 1004, 1007, 997, + /* 270 */ 997, 119, 119, 120, 120, 120, 120, 432, 431, 266, + /* 280 */ 266, 118, 118, 118, 118, 117, 117, 116, 116, 116, + /* 290 */ 115, 422, 541, 1107, 901, 504, 1140, 114, 111, 211, + /* 300 */ 1429, 1140, 1141, 1142, 206, 489, 1107, 390, 447, 1107, + /* 310 */ 543, 328, 120, 120, 120, 120, 298, 1429, 1431, 17, + /* 320 */ 118, 118, 118, 118, 117, 117, 116, 116, 116, 115, + /* 330 */ 422, 121, 122, 112, 1163, 1163, 1004, 1007, 997, 997, + /* 340 */ 119, 119, 120, 120, 120, 120, 390, 1356, 432, 1140, + /* 350 */ 480, 1140, 1141, 1142, 994, 994, 1005, 1008, 443, 118, + /* 360 */ 118, 118, 118, 117, 117, 116, 116, 116, 115, 422, + /* 370 */ 121, 122, 112, 1163, 1163, 1004, 1007, 997, 997, 119, + /* 380 */ 119, 120, 120, 120, 120, 1052, 1052, 463, 1429, 118, + /* 390 */ 118, 118, 118, 117, 117, 116, 116, 116, 115, 422, + /* 400 */ 1140, 449, 544, 1424, 1140, 1141, 1142, 233, 964, 1140, + /* 410 */ 479, 476, 475, 171, 358, 390, 164, 405, 412, 840, + /* 420 */ 474, 164, 185, 332, 71, 71, 1241, 998, 118, 118, + /* 430 */ 118, 118, 117, 117, 116, 116, 116, 115, 422, 121, + /* 440 */ 122, 112, 1163, 1163, 1004, 1007, 997, 997, 119, 119, + /* 450 */ 120, 120, 120, 120, 390, 1140, 1141, 1142, 833, 12, + /* 460 */ 313, 507, 163, 354, 1140, 1141, 1142, 114, 111, 211, + /* 470 */ 506, 290, 535, 544, 276, 180, 290, 535, 121, 122, + /* 480 */ 112, 1163, 1163, 1004, 1007, 997, 997, 119, 119, 120, + /* 490 */ 120, 120, 120, 343, 482, 71, 71, 118, 118, 118, + /* 500 */ 118, 117, 117, 116, 116, 116, 115, 422, 1140, 209, + /* 510 */ 409, 521, 1140, 1107, 1569, 376, 252, 269, 340, 485, + /* 520 */ 335, 484, 238, 390, 511, 362, 1107, 1125, 331, 1107, + /* 530 */ 191, 407, 286, 32, 455, 441, 118, 118, 118, 118, + /* 540 */ 117, 117, 116, 116, 116, 115, 422, 121, 122, 112, + /* 550 */ 1163, 1163, 1004, 1007, 997, 997, 119, 119, 120, 120, + /* 560 */ 120, 120, 390, 1140, 1141, 1142, 985, 1140, 1141, 1142, + /* 570 */ 1140, 233, 490, 1490, 479, 476, 475, 6, 163, 544, + /* 580 */ 510, 544, 115, 422, 474, 5, 121, 122, 112, 1163, + /* 590 */ 1163, 1004, 1007, 997, 997, 119, 119, 120, 120, 120, + /* 600 */ 120, 13, 13, 13, 13, 118, 118, 118, 118, 117, + /* 610 */ 117, 116, 116, 116, 115, 422, 401, 500, 406, 544, + /* 620 */ 1484, 542, 1140, 890, 890, 1140, 1141, 1142, 1471, 1140, + /* 630 */ 275, 390, 806, 807, 808, 969, 420, 420, 420, 16, + /* 640 */ 16, 55, 55, 1240, 118, 118, 118, 118, 117, 117, + /* 650 */ 116, 116, 116, 115, 422, 121, 122, 112, 1163, 1163, + /* 660 */ 1004, 1007, 997, 997, 119, 119, 120, 120, 120, 120, + /* 670 */ 390, 1187, 1, 1, 550, 2, 1191, 1140, 1141, 1142, + /* 680 */ 194, 291, 896, 136, 1140, 1141, 1142, 895, 519, 1490, + /* 690 */ 1271, 3, 378, 6, 121, 122, 112, 1163, 1163, 1004, + /* 700 */ 1007, 997, 997, 119, 119, 120, 120, 120, 120, 856, + /* 710 */ 544, 922, 544, 118, 118, 118, 118, 117, 117, 116, + /* 720 */ 116, 116, 115, 422, 266, 266, 1090, 1567, 1140, 549, + /* 730 */ 1567, 1191, 13, 13, 13, 13, 291, 541, 136, 390, + /* 740 */ 483, 419, 418, 964, 342, 1271, 466, 408, 857, 279, + /* 750 */ 140, 221, 118, 118, 118, 118, 117, 117, 116, 116, + /* 760 */ 116, 115, 422, 121, 122, 112, 1163, 1163, 1004, 1007, + /* 770 */ 997, 997, 119, 119, 120, 120, 120, 120, 544, 266, + /* 780 */ 266, 426, 390, 1140, 1141, 1142, 1170, 828, 1170, 466, + /* 790 */ 429, 145, 541, 1144, 399, 313, 437, 301, 836, 1488, + /* 800 */ 71, 71, 410, 6, 1088, 471, 221, 100, 112, 1163, + /* 810 */ 1163, 1004, 1007, 997, 997, 119, 119, 120, 120, 120, + /* 820 */ 120, 118, 118, 118, 118, 117, 117, 116, 116, 116, + /* 830 */ 115, 422, 237, 1423, 544, 449, 426, 287, 984, 544, + /* 840 */ 236, 235, 234, 828, 97, 527, 427, 1263, 1263, 1144, + /* 850 */ 492, 306, 428, 836, 975, 544, 71, 71, 974, 1239, + /* 860 */ 544, 51, 51, 300, 118, 118, 118, 118, 117, 117, + /* 870 */ 116, 116, 116, 115, 422, 194, 103, 70, 70, 266, + /* 880 */ 266, 544, 71, 71, 266, 266, 30, 389, 342, 974, + /* 890 */ 974, 976, 541, 526, 1107, 326, 390, 541, 493, 395, + /* 900 */ 1468, 195, 528, 13, 13, 1356, 240, 1107, 277, 280, + /* 910 */ 1107, 280, 303, 455, 305, 331, 390, 31, 188, 417, + /* 920 */ 121, 122, 112, 1163, 1163, 1004, 1007, 997, 997, 119, + /* 930 */ 119, 120, 120, 120, 120, 142, 390, 363, 455, 984, + /* 940 */ 121, 122, 112, 1163, 1163, 1004, 1007, 997, 997, 119, + /* 950 */ 119, 120, 120, 120, 120, 975, 321, 1140, 324, 974, + /* 960 */ 121, 110, 112, 1163, 1163, 1004, 1007, 997, 997, 119, + /* 970 */ 119, 120, 120, 120, 120, 462, 375, 1183, 118, 118, + /* 980 */ 118, 118, 117, 117, 116, 116, 116, 115, 422, 1140, + /* 990 */ 974, 974, 976, 304, 9, 364, 244, 360, 118, 118, + /* 1000 */ 118, 118, 117, 117, 116, 116, 116, 115, 422, 312, + /* 1010 */ 544, 342, 1140, 1141, 1142, 299, 290, 535, 118, 118, + /* 1020 */ 118, 118, 117, 117, 116, 116, 116, 115, 422, 1261, + /* 1030 */ 1261, 1161, 13, 13, 278, 419, 418, 466, 390, 921, + /* 1040 */ 260, 260, 289, 1167, 1140, 1141, 1142, 189, 1169, 266, + /* 1050 */ 266, 466, 388, 541, 1184, 544, 1168, 263, 144, 487, + /* 1060 */ 920, 544, 541, 122, 112, 1163, 1163, 1004, 1007, 997, + /* 1070 */ 997, 119, 119, 120, 120, 120, 120, 71, 71, 1140, + /* 1080 */ 1170, 1270, 1170, 13, 13, 896, 1068, 1161, 544, 466, + /* 1090 */ 895, 107, 536, 1489, 4, 1266, 1107, 6, 523, 1047, + /* 1100 */ 12, 1069, 1090, 1568, 311, 453, 1568, 518, 539, 1107, + /* 1110 */ 56, 56, 1107, 1487, 421, 1356, 1070, 6, 343, 285, + /* 1120 */ 118, 118, 118, 118, 117, 117, 116, 116, 116, 115, + /* 1130 */ 422, 423, 1269, 319, 1140, 1141, 1142, 876, 266, 266, + /* 1140 */ 1275, 107, 536, 533, 4, 1486, 293, 877, 1209, 6, + /* 1150 */ 210, 541, 541, 164, 1540, 494, 414, 865, 539, 267, + /* 1160 */ 267, 1212, 396, 509, 497, 204, 266, 266, 394, 529, + /* 1170 */ 8, 984, 541, 517, 544, 920, 456, 105, 105, 541, + /* 1180 */ 1088, 423, 266, 266, 106, 415, 423, 546, 545, 266, + /* 1190 */ 266, 974, 516, 533, 1371, 541, 15, 15, 266, 266, + /* 1200 */ 454, 1118, 541, 266, 266, 1068, 1370, 513, 290, 535, + /* 1210 */ 544, 541, 512, 97, 442, 314, 541, 544, 920, 125, + /* 1220 */ 1069, 984, 974, 974, 976, 977, 27, 105, 105, 399, + /* 1230 */ 341, 1509, 44, 44, 106, 1070, 423, 546, 545, 57, + /* 1240 */ 57, 974, 341, 1509, 107, 536, 544, 4, 460, 399, + /* 1250 */ 214, 1118, 457, 294, 375, 1089, 532, 297, 544, 537, + /* 1260 */ 396, 539, 290, 535, 104, 244, 102, 524, 58, 58, + /* 1270 */ 544, 109, 974, 974, 976, 977, 27, 1514, 1129, 425, + /* 1280 */ 59, 59, 270, 237, 423, 138, 95, 373, 373, 372, + /* 1290 */ 255, 370, 60, 60, 815, 1178, 533, 544, 273, 544, + /* 1300 */ 1161, 843, 387, 386, 544, 1307, 544, 215, 210, 296, + /* 1310 */ 513, 847, 544, 265, 208, 514, 1306, 295, 274, 61, + /* 1320 */ 61, 62, 62, 436, 984, 1160, 45, 45, 46, 46, + /* 1330 */ 105, 105, 1184, 920, 47, 47, 1474, 106, 544, 423, + /* 1340 */ 546, 545, 218, 544, 974, 935, 1085, 217, 544, 377, + /* 1350 */ 395, 107, 536, 936, 4, 156, 1161, 843, 158, 544, + /* 1360 */ 49, 49, 141, 544, 38, 50, 50, 544, 539, 307, + /* 1370 */ 63, 63, 544, 1448, 216, 974, 974, 976, 977, 27, + /* 1380 */ 444, 64, 64, 544, 1447, 65, 65, 544, 524, 14, + /* 1390 */ 14, 423, 458, 544, 66, 66, 310, 544, 316, 97, + /* 1400 */ 1034, 544, 961, 533, 268, 127, 127, 544, 391, 67, + /* 1410 */ 67, 544, 978, 290, 535, 52, 52, 513, 544, 68, + /* 1420 */ 68, 1294, 512, 69, 69, 397, 165, 855, 854, 53, + /* 1430 */ 53, 984, 966, 151, 151, 243, 430, 105, 105, 199, + /* 1440 */ 152, 152, 448, 1303, 106, 243, 423, 546, 545, 1129, + /* 1450 */ 425, 974, 320, 270, 862, 863, 1034, 220, 373, 373, + /* 1460 */ 372, 255, 370, 450, 323, 815, 243, 544, 978, 544, + /* 1470 */ 107, 536, 544, 4, 544, 938, 939, 325, 215, 1046, + /* 1480 */ 296, 1046, 974, 974, 976, 977, 27, 539, 295, 76, + /* 1490 */ 76, 54, 54, 327, 72, 72, 128, 128, 1503, 1254, + /* 1500 */ 107, 536, 544, 4, 1045, 544, 1045, 531, 1238, 544, + /* 1510 */ 423, 544, 315, 334, 544, 97, 544, 539, 217, 544, + /* 1520 */ 472, 1528, 533, 239, 73, 73, 156, 129, 129, 158, + /* 1530 */ 467, 130, 130, 126, 126, 344, 150, 150, 149, 149, + /* 1540 */ 423, 134, 134, 329, 1030, 216, 97, 239, 929, 345, + /* 1550 */ 984, 243, 533, 1315, 339, 544, 105, 105, 900, 1355, + /* 1560 */ 544, 1290, 258, 106, 338, 423, 546, 545, 544, 1301, + /* 1570 */ 974, 893, 99, 536, 109, 4, 544, 133, 133, 391, + /* 1580 */ 984, 197, 131, 131, 290, 535, 105, 105, 530, 539, + /* 1590 */ 132, 132, 1361, 106, 1219, 423, 546, 545, 75, 75, + /* 1600 */ 974, 974, 974, 976, 977, 27, 544, 430, 826, 1211, + /* 1610 */ 894, 139, 423, 109, 544, 1200, 1199, 1201, 1522, 544, + /* 1620 */ 201, 544, 11, 374, 533, 1287, 347, 349, 77, 77, + /* 1630 */ 1340, 974, 974, 976, 977, 27, 74, 74, 351, 213, + /* 1640 */ 435, 43, 43, 48, 48, 302, 477, 309, 1348, 382, + /* 1650 */ 353, 452, 984, 337, 1237, 1420, 1419, 205, 105, 105, + /* 1660 */ 192, 367, 193, 534, 1525, 106, 1178, 423, 546, 545, + /* 1670 */ 247, 167, 974, 270, 1467, 200, 1465, 1175, 373, 373, + /* 1680 */ 372, 255, 370, 398, 79, 815, 83, 82, 1425, 446, + /* 1690 */ 161, 177, 169, 95, 1337, 438, 172, 173, 215, 174, + /* 1700 */ 296, 175, 35, 974, 974, 976, 977, 27, 295, 1345, + /* 1710 */ 439, 470, 223, 36, 379, 445, 1414, 381, 459, 1351, + /* 1720 */ 181, 227, 88, 465, 259, 229, 1436, 318, 186, 468, + /* 1730 */ 322, 230, 384, 1202, 231, 486, 1257, 1256, 217, 411, + /* 1740 */ 1255, 1248, 90, 847, 206, 413, 156, 505, 1539, 158, + /* 1750 */ 1226, 1538, 283, 1508, 1227, 336, 385, 284, 1225, 496, + /* 1760 */ 1537, 1298, 94, 346, 348, 216, 1247, 499, 1299, 245, + /* 1770 */ 246, 1297, 416, 350, 1494, 124, 1493, 10, 524, 361, + /* 1780 */ 1400, 101, 96, 288, 508, 253, 1135, 1208, 34, 1296, + /* 1790 */ 547, 254, 256, 257, 392, 548, 1197, 1192, 359, 391, + /* 1800 */ 1280, 1279, 196, 365, 290, 535, 366, 352, 1452, 1322, + /* 1810 */ 1321, 1453, 153, 137, 281, 154, 802, 424, 155, 1451, + /* 1820 */ 1450, 198, 292, 202, 203, 78, 212, 430, 271, 135, + /* 1830 */ 1044, 1042, 958, 168, 219, 157, 170, 879, 308, 222, + /* 1840 */ 1058, 176, 159, 962, 400, 84, 402, 178, 85, 86, + /* 1850 */ 87, 166, 160, 393, 1061, 224, 225, 1057, 146, 18, + /* 1860 */ 226, 317, 1050, 1172, 243, 464, 182, 228, 37, 183, + /* 1870 */ 817, 469, 338, 232, 330, 481, 184, 89, 845, 19, + /* 1880 */ 20, 92, 473, 478, 333, 91, 162, 858, 147, 488, + /* 1890 */ 282, 1123, 148, 1010, 928, 1093, 39, 93, 40, 495, + /* 1900 */ 1094, 187, 498, 207, 262, 264, 923, 242, 1109, 109, + /* 1910 */ 1113, 1111, 1097, 33, 21, 1117, 520, 1025, 22, 23, + /* 1920 */ 24, 1116, 25, 190, 97, 1011, 1009, 26, 1013, 1067, + /* 1930 */ 248, 7, 1066, 249, 1014, 28, 41, 889, 979, 827, + /* 1940 */ 108, 29, 250, 540, 251, 1530, 371, 368, 1131, 1130, + /* 1950 */ 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1529, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 184, 238, 239, 240, 238, 239, 240, 163, 155, 156, - /* 10 */ 157, 158, 159, 160, 163, 191, 192, 183, 165, 19, - /* 20 */ 167, 258, 202, 203, 200, 191, 163, 174, 184, 185, - /* 30 */ 174, 31, 163, 163, 171, 184, 185, 35, 175, 39, - /* 40 */ 179, 180, 181, 43, 44, 45, 46, 47, 48, 49, - /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 184, 206, - /* 60 */ 207, 163, 206, 207, 220, 163, 16, 163, 66, 163, - /* 70 */ 59, 270, 219, 229, 273, 219, 74, 208, 174, 223, - /* 80 */ 224, 163, 184, 185, 163, 232, 184, 185, 184, 185, - /* 90 */ 184, 185, 92, 93, 94, 95, 96, 97, 98, 99, - /* 100 */ 100, 101, 102, 233, 198, 184, 185, 96, 97, 163, - /* 110 */ 206, 207, 19, 163, 261, 104, 105, 106, 107, 198, - /* 120 */ 109, 119, 220, 219, 220, 274, 275, 77, 117, 79, - /* 130 */ 187, 229, 19, 229, 184, 185, 43, 44, 45, 46, - /* 140 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 150 */ 57, 233, 141, 134, 143, 102, 43, 44, 45, 46, - /* 160 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 170 */ 57, 152, 274, 216, 276, 218, 83, 163, 85, 233, - /* 180 */ 67, 238, 239, 240, 11, 92, 93, 94, 95, 96, - /* 190 */ 97, 98, 99, 100, 101, 102, 19, 54, 55, 56, - /* 200 */ 57, 58, 163, 26, 163, 92, 93, 94, 95, 96, - /* 210 */ 97, 98, 99, 100, 101, 102, 54, 55, 56, 57, - /* 220 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - /* 230 */ 53, 54, 55, 56, 57, 92, 93, 94, 95, 96, - /* 240 */ 97, 98, 99, 100, 101, 102, 69, 96, 97, 98, - /* 250 */ 99, 100, 101, 102, 92, 93, 94, 95, 96, 97, - /* 260 */ 98, 99, 100, 101, 102, 81, 179, 180, 181, 92, - /* 270 */ 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - /* 280 */ 163, 267, 268, 163, 22, 23, 59, 163, 26, 19, - /* 290 */ 117, 118, 175, 109, 24, 59, 92, 93, 94, 95, - /* 300 */ 96, 97, 98, 99, 100, 101, 102, 268, 184, 185, - /* 310 */ 269, 127, 128, 43, 44, 45, 46, 47, 48, 49, - /* 320 */ 50, 51, 52, 53, 54, 55, 56, 57, 157, 158, - /* 330 */ 159, 160, 105, 106, 107, 163, 165, 59, 167, 184, - /* 340 */ 90, 105, 106, 107, 108, 174, 73, 111, 112, 113, - /* 350 */ 19, 22, 163, 91, 81, 163, 106, 121, 81, 132, - /* 360 */ 110, 16, 92, 93, 94, 95, 96, 97, 98, 99, - /* 370 */ 100, 101, 102, 184, 185, 255, 98, 206, 207, 26, - /* 380 */ 101, 102, 19, 105, 106, 107, 23, 198, 59, 116, - /* 390 */ 219, 141, 142, 143, 24, 163, 187, 205, 274, 275, - /* 400 */ 127, 128, 182, 232, 127, 128, 43, 44, 45, 46, - /* 410 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 420 */ 57, 158, 77, 160, 79, 59, 26, 182, 165, 59, - /* 430 */ 167, 199, 261, 102, 105, 106, 107, 174, 72, 108, - /* 440 */ 109, 110, 111, 112, 113, 114, 59, 238, 239, 240, - /* 450 */ 123, 120, 125, 126, 163, 92, 93, 94, 95, 96, - /* 460 */ 97, 98, 99, 100, 101, 102, 163, 163, 163, 206, - /* 470 */ 207, 105, 106, 107, 254, 19, 106, 90, 197, 23, - /* 480 */ 127, 128, 219, 238, 239, 240, 22, 184, 185, 184, - /* 490 */ 185, 22, 105, 106, 149, 232, 205, 110, 163, 43, - /* 500 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - /* 510 */ 54, 55, 56, 57, 98, 99, 100, 101, 102, 184, - /* 520 */ 185, 163, 53, 59, 261, 220, 117, 118, 141, 142, - /* 530 */ 143, 131, 174, 59, 229, 116, 117, 118, 163, 59, - /* 540 */ 163, 163, 184, 185, 59, 242, 72, 22, 92, 93, - /* 550 */ 94, 95, 96, 97, 98, 99, 100, 101, 102, 184, - /* 560 */ 185, 24, 184, 185, 206, 207, 202, 203, 19, 105, - /* 570 */ 106, 107, 23, 198, 22, 174, 198, 219, 220, 105, - /* 580 */ 106, 107, 96, 97, 59, 105, 106, 107, 22, 174, - /* 590 */ 59, 106, 43, 44, 45, 46, 47, 48, 49, 50, - /* 600 */ 51, 52, 53, 54, 55, 56, 57, 206, 207, 12, - /* 610 */ 108, 59, 132, 111, 112, 113, 46, 47, 48, 49, - /* 620 */ 219, 206, 207, 121, 27, 59, 163, 141, 207, 143, - /* 630 */ 105, 106, 107, 163, 219, 234, 105, 106, 107, 42, - /* 640 */ 219, 92, 93, 94, 95, 96, 97, 98, 99, 100, - /* 650 */ 101, 102, 76, 163, 184, 185, 163, 105, 106, 107, - /* 660 */ 63, 19, 86, 163, 163, 23, 163, 130, 205, 21, - /* 670 */ 73, 105, 106, 107, 184, 185, 163, 184, 185, 237, - /* 680 */ 110, 180, 181, 180, 181, 43, 44, 45, 46, 47, - /* 690 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - /* 700 */ 174, 163, 163, 22, 23, 163, 163, 26, 22, 23, - /* 710 */ 220, 29, 73, 220, 272, 33, 22, 163, 24, 19, - /* 720 */ 174, 208, 259, 184, 185, 19, 184, 185, 80, 175, - /* 730 */ 230, 174, 206, 207, 92, 93, 94, 95, 96, 97, - /* 740 */ 98, 99, 100, 101, 102, 219, 46, 65, 247, 195, - /* 750 */ 247, 197, 206, 207, 19, 116, 117, 118, 23, 220, - /* 760 */ 112, 174, 220, 206, 207, 219, 22, 174, 24, 174, - /* 770 */ 22, 23, 91, 264, 265, 168, 219, 91, 43, 44, - /* 780 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - /* 790 */ 55, 56, 57, 206, 207, 12, 163, 149, 255, 206, - /* 800 */ 207, 206, 207, 59, 104, 23, 219, 163, 26, 163, - /* 810 */ 27, 105, 219, 163, 219, 163, 211, 184, 185, 163, - /* 820 */ 120, 163, 146, 163, 148, 42, 221, 92, 93, 94, - /* 830 */ 95, 96, 97, 98, 99, 100, 101, 102, 163, 91, - /* 840 */ 184, 185, 184, 185, 184, 185, 63, 19, 163, 205, - /* 850 */ 106, 23, 245, 163, 208, 248, 116, 117, 118, 184, - /* 860 */ 185, 163, 163, 7, 8, 9, 163, 19, 26, 184, - /* 870 */ 185, 43, 44, 45, 46, 47, 48, 49, 50, 51, - /* 880 */ 52, 53, 54, 55, 56, 57, 163, 184, 185, 107, - /* 890 */ 163, 43, 44, 45, 46, 47, 48, 49, 50, 51, - /* 900 */ 52, 53, 54, 55, 56, 57, 208, 255, 177, 178, - /* 910 */ 163, 184, 185, 163, 132, 163, 141, 163, 143, 22, - /* 920 */ 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - /* 930 */ 102, 184, 185, 163, 184, 185, 184, 185, 184, 185, - /* 940 */ 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - /* 950 */ 102, 163, 163, 163, 184, 185, 163, 115, 163, 163, - /* 960 */ 163, 163, 15, 163, 163, 163, 163, 163, 23, 163, - /* 970 */ 163, 26, 184, 185, 184, 185, 163, 184, 185, 184, - /* 980 */ 185, 184, 185, 163, 184, 185, 184, 185, 184, 185, - /* 990 */ 184, 185, 163, 96, 97, 147, 163, 184, 185, 163, - /* 1000 */ 199, 163, 163, 205, 184, 185, 163, 60, 163, 141, - /* 1010 */ 163, 143, 163, 184, 185, 19, 163, 184, 185, 230, - /* 1020 */ 184, 185, 184, 185, 206, 207, 230, 184, 185, 184, - /* 1030 */ 185, 184, 185, 184, 185, 19, 163, 219, 231, 43, - /* 1040 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - /* 1050 */ 54, 55, 56, 57, 163, 26, 163, 184, 185, 43, - /* 1060 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - /* 1070 */ 54, 55, 56, 57, 163, 184, 185, 184, 185, 163, - /* 1080 */ 182, 163, 163, 163, 163, 163, 22, 163, 92, 93, - /* 1090 */ 94, 95, 96, 97, 98, 99, 100, 101, 102, 163, - /* 1100 */ 184, 185, 184, 185, 163, 184, 185, 163, 92, 93, - /* 1110 */ 94, 95, 96, 97, 98, 99, 100, 101, 102, 163, - /* 1120 */ 184, 185, 98, 59, 163, 184, 185, 205, 184, 185, - /* 1130 */ 23, 206, 207, 26, 163, 26, 107, 153, 154, 237, - /* 1140 */ 184, 185, 231, 147, 219, 184, 185, 249, 124, 127, - /* 1150 */ 128, 231, 254, 129, 163, 231, 177, 178, 262, 263, - /* 1160 */ 118, 132, 19, 19, 46, 223, 224, 31, 24, 23, - /* 1170 */ 106, 124, 26, 22, 272, 39, 129, 23, 109, 110, - /* 1180 */ 26, 163, 140, 19, 22, 234, 59, 43, 44, 45, - /* 1190 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - /* 1200 */ 56, 57, 231, 7, 8, 193, 59, 43, 44, 45, - /* 1210 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - /* 1220 */ 56, 57, 104, 61, 23, 23, 23, 26, 26, 26, - /* 1230 */ 163, 23, 23, 106, 26, 26, 92, 93, 94, 95, - /* 1240 */ 96, 97, 98, 99, 100, 101, 102, 138, 105, 23, - /* 1250 */ 59, 23, 26, 106, 26, 163, 92, 93, 94, 95, - /* 1260 */ 96, 97, 98, 99, 100, 101, 102, 110, 23, 23, - /* 1270 */ 23, 26, 26, 26, 163, 163, 19, 120, 163, 163, - /* 1280 */ 163, 130, 163, 163, 163, 163, 163, 163, 163, 193, - /* 1290 */ 193, 163, 163, 163, 163, 225, 19, 106, 163, 222, - /* 1300 */ 163, 44, 45, 46, 47, 48, 49, 50, 51, 52, - /* 1310 */ 53, 54, 55, 56, 57, 163, 163, 203, 163, 163, - /* 1320 */ 222, 163, 45, 46, 47, 48, 49, 50, 51, 52, - /* 1330 */ 53, 54, 55, 56, 57, 163, 163, 163, 163, 163, - /* 1340 */ 251, 250, 209, 19, 20, 182, 22, 161, 222, 92, - /* 1350 */ 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - /* 1360 */ 36, 222, 222, 260, 226, 188, 256, 226, 187, 92, - /* 1370 */ 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - /* 1380 */ 210, 213, 213, 59, 213, 196, 192, 187, 256, 244, - /* 1390 */ 212, 187, 226, 19, 20, 71, 22, 210, 166, 60, - /* 1400 */ 130, 170, 260, 170, 38, 81, 257, 257, 170, 104, - /* 1410 */ 36, 22, 43, 201, 90, 236, 138, 235, 213, 18, - /* 1420 */ 96, 97, 48, 204, 204, 204, 204, 103, 170, 105, - /* 1430 */ 106, 107, 18, 59, 110, 169, 213, 213, 201, 170, - /* 1440 */ 201, 169, 236, 213, 146, 71, 235, 62, 253, 252, - /* 1450 */ 170, 127, 128, 169, 22, 170, 82, 189, 169, 104, - /* 1460 */ 170, 87, 169, 189, 90, 141, 142, 143, 144, 145, - /* 1470 */ 96, 97, 186, 186, 186, 64, 194, 103, 186, 105, - /* 1480 */ 106, 107, 115, 189, 110, 188, 186, 186, 19, 20, - /* 1490 */ 194, 22, 186, 189, 102, 246, 246, 189, 133, 228, - /* 1500 */ 104, 228, 227, 227, 170, 36, 134, 228, 227, 19, - /* 1510 */ 20, 228, 22, 84, 271, 141, 142, 143, 144, 145, - /* 1520 */ 0, 1, 2, 216, 22, 5, 36, 137, 59, 227, - /* 1530 */ 10, 11, 12, 13, 14, 217, 269, 17, 216, 22, - /* 1540 */ 71, 170, 243, 146, 241, 217, 136, 215, 135, 59, - /* 1550 */ 30, 82, 32, 25, 214, 213, 87, 173, 26, 90, - /* 1560 */ 40, 71, 13, 172, 164, 96, 97, 164, 6, 162, - /* 1570 */ 162, 162, 103, 263, 105, 106, 107, 266, 266, 110, - /* 1580 */ 90, 176, 176, 190, 182, 190, 96, 97, 98, 4, - /* 1590 */ 70, 176, 3, 103, 182, 105, 106, 107, 78, 182, - /* 1600 */ 110, 81, 182, 182, 182, 182, 182, 151, 88, 22, - /* 1610 */ 141, 142, 143, 144, 145, 15, 89, 16, 23, 23, - /* 1620 */ 128, 19, 20, 139, 22, 119, 131, 24, 20, 133, - /* 1630 */ 16, 141, 142, 143, 144, 145, 1, 140, 36, 131, - /* 1640 */ 119, 61, 122, 37, 139, 53, 53, 127, 128, 119, - /* 1650 */ 53, 53, 105, 34, 130, 1, 5, 104, 22, 149, - /* 1660 */ 26, 59, 68, 75, 41, 130, 24, 68, 104, 20, - /* 1670 */ 150, 19, 120, 71, 114, 22, 67, 22, 22, 67, - /* 1680 */ 23, 22, 22, 67, 82, 37, 28, 23, 138, 87, - /* 1690 */ 22, 153, 90, 23, 23, 26, 23, 22, 96, 97, - /* 1700 */ 24, 23, 22, 24, 130, 103, 23, 105, 106, 107, - /* 1710 */ 1, 2, 110, 23, 5, 105, 34, 22, 132, 10, - /* 1720 */ 11, 12, 13, 14, 26, 34, 17, 34, 85, 83, - /* 1730 */ 44, 19, 20, 23, 22, 24, 75, 34, 23, 30, - /* 1740 */ 26, 32, 26, 141, 142, 143, 144, 145, 36, 40, - /* 1750 */ 23, 23, 23, 23, 11, 23, 22, 26, 22, 22, - /* 1760 */ 22, 19, 20, 23, 22, 26, 15, 23, 22, 124, - /* 1770 */ 130, 59, 23, 1, 130, 277, 277, 130, 36, 70, - /* 1780 */ 130, 277, 277, 71, 277, 277, 277, 78, 277, 277, - /* 1790 */ 81, 277, 277, 277, 277, 277, 277, 88, 277, 277, - /* 1800 */ 277, 59, 90, 277, 277, 277, 277, 277, 96, 97, - /* 1810 */ 277, 277, 277, 71, 277, 103, 277, 105, 106, 107, - /* 1820 */ 277, 277, 110, 277, 277, 277, 277, 277, 277, 277, - /* 1830 */ 277, 122, 90, 277, 277, 277, 127, 128, 96, 97, - /* 1840 */ 277, 277, 277, 277, 277, 103, 277, 105, 106, 107, - /* 1850 */ 277, 277, 110, 141, 142, 143, 144, 145, 277, 150, - /* 1860 */ 277, 277, 277, 5, 277, 277, 277, 277, 10, 11, - /* 1870 */ 12, 13, 14, 277, 277, 17, 277, 277, 277, 277, - /* 1880 */ 277, 277, 277, 141, 142, 143, 144, 145, 30, 277, - /* 1890 */ 32, 277, 277, 277, 277, 277, 277, 277, 40, 277, - /* 1900 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - /* 1910 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - /* 1920 */ 277, 277, 277, 277, 277, 277, 277, 277, 70, 277, - /* 1930 */ 277, 277, 277, 277, 277, 277, 78, 277, 277, 81, - /* 1940 */ 277, 277, 277, 277, 277, 277, 88, 277, 277, 277, - /* 1950 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - /* 1960 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - /* 1970 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - /* 1980 */ 122, 277, 277, 277, 277, 127, 128, 277, 277, 277, - /* 1990 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - /* 2000 */ 277, 277, 277, 277, 277, 277, 277, 277, 150, 277, - /* 2010 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, + /* 0 */ 189, 211, 189, 189, 218, 189, 220, 189, 267, 268, + /* 10 */ 269, 189, 210, 189, 228, 189, 267, 268, 269, 19, + /* 20 */ 218, 189, 211, 212, 211, 212, 211, 211, 212, 211, + /* 30 */ 212, 31, 211, 211, 212, 211, 212, 288, 300, 39, + /* 40 */ 21, 189, 304, 43, 44, 45, 46, 47, 48, 49, + /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 225, 19, + /* 60 */ 189, 183, 184, 185, 186, 189, 248, 263, 236, 191, + /* 70 */ 248, 193, 248, 197, 208, 257, 262, 201, 200, 257, + /* 80 */ 200, 257, 81, 43, 44, 45, 46, 47, 48, 49, + /* 90 */ 50, 51, 52, 53, 54, 55, 56, 57, 189, 80, + /* 100 */ 189, 101, 102, 103, 104, 105, 106, 107, 108, 109, + /* 110 */ 110, 111, 234, 235, 234, 235, 305, 306, 305, 118, + /* 120 */ 307, 305, 306, 297, 298, 247, 86, 247, 88, 19, + /* 130 */ 259, 251, 252, 267, 268, 269, 26, 136, 137, 261, + /* 140 */ 121, 101, 102, 103, 104, 105, 106, 107, 108, 109, + /* 150 */ 110, 111, 59, 43, 44, 45, 46, 47, 48, 49, + /* 160 */ 50, 51, 52, 53, 54, 55, 56, 57, 259, 291, + /* 170 */ 105, 106, 107, 108, 109, 110, 111, 158, 189, 69, + /* 180 */ 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + /* 190 */ 111, 107, 108, 109, 110, 111, 205, 206, 207, 19, + /* 200 */ 19, 54, 55, 56, 57, 58, 29, 114, 115, 116, + /* 210 */ 33, 101, 102, 103, 104, 105, 106, 107, 108, 109, + /* 220 */ 110, 111, 233, 43, 44, 45, 46, 47, 48, 49, + /* 230 */ 50, 51, 52, 53, 54, 55, 56, 57, 19, 126, + /* 240 */ 127, 148, 65, 24, 214, 200, 59, 67, 101, 102, + /* 250 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 22, + /* 260 */ 189, 111, 43, 44, 45, 46, 47, 48, 49, 50, + /* 270 */ 51, 52, 53, 54, 55, 56, 57, 206, 207, 234, + /* 280 */ 235, 101, 102, 103, 104, 105, 106, 107, 108, 109, + /* 290 */ 110, 111, 247, 76, 107, 114, 59, 267, 268, 269, + /* 300 */ 189, 114, 115, 116, 162, 163, 89, 19, 263, 92, + /* 310 */ 189, 23, 54, 55, 56, 57, 189, 206, 207, 22, + /* 320 */ 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + /* 330 */ 111, 43, 44, 45, 46, 47, 48, 49, 50, 51, + /* 340 */ 52, 53, 54, 55, 56, 57, 19, 189, 277, 59, + /* 350 */ 23, 114, 115, 116, 46, 47, 48, 49, 61, 101, + /* 360 */ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + /* 370 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 380 */ 53, 54, 55, 56, 57, 125, 126, 127, 277, 101, + /* 390 */ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + /* 400 */ 59, 189, 189, 276, 114, 115, 116, 117, 73, 59, + /* 410 */ 120, 121, 122, 72, 214, 19, 81, 259, 19, 23, + /* 420 */ 130, 81, 72, 24, 211, 212, 221, 119, 101, 102, + /* 430 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 43, + /* 440 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + /* 450 */ 54, 55, 56, 57, 19, 114, 115, 116, 23, 208, + /* 460 */ 125, 248, 189, 189, 114, 115, 116, 267, 268, 269, + /* 470 */ 189, 136, 137, 189, 262, 22, 136, 137, 43, 44, + /* 480 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + /* 490 */ 55, 56, 57, 189, 95, 211, 212, 101, 102, 103, + /* 500 */ 104, 105, 106, 107, 108, 109, 110, 111, 59, 189, + /* 510 */ 111, 189, 59, 76, 294, 295, 117, 118, 119, 120, + /* 520 */ 121, 122, 123, 19, 87, 189, 89, 23, 129, 92, + /* 530 */ 279, 227, 248, 22, 189, 284, 101, 102, 103, 104, + /* 540 */ 105, 106, 107, 108, 109, 110, 111, 43, 44, 45, + /* 550 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + /* 560 */ 56, 57, 19, 114, 115, 116, 23, 114, 115, 116, + /* 570 */ 59, 117, 299, 300, 120, 121, 122, 304, 189, 189, + /* 580 */ 143, 189, 110, 111, 130, 22, 43, 44, 45, 46, + /* 590 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 600 */ 57, 211, 212, 211, 212, 101, 102, 103, 104, 105, + /* 610 */ 106, 107, 108, 109, 110, 111, 226, 189, 226, 189, + /* 620 */ 298, 132, 59, 134, 135, 114, 115, 116, 189, 59, + /* 630 */ 285, 19, 7, 8, 9, 23, 205, 206, 207, 211, + /* 640 */ 212, 211, 212, 221, 101, 102, 103, 104, 105, 106, + /* 650 */ 107, 108, 109, 110, 111, 43, 44, 45, 46, 47, + /* 660 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + /* 670 */ 19, 181, 182, 183, 184, 185, 186, 114, 115, 116, + /* 680 */ 189, 191, 133, 193, 114, 115, 116, 138, 299, 300, + /* 690 */ 200, 22, 201, 304, 43, 44, 45, 46, 47, 48, + /* 700 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 35, + /* 710 */ 189, 141, 189, 101, 102, 103, 104, 105, 106, 107, + /* 720 */ 108, 109, 110, 111, 234, 235, 22, 23, 59, 184, + /* 730 */ 26, 186, 211, 212, 211, 212, 191, 247, 193, 19, + /* 740 */ 66, 105, 106, 73, 189, 200, 189, 226, 74, 226, + /* 750 */ 22, 261, 101, 102, 103, 104, 105, 106, 107, 108, + /* 760 */ 109, 110, 111, 43, 44, 45, 46, 47, 48, 49, + /* 770 */ 50, 51, 52, 53, 54, 55, 56, 57, 189, 234, + /* 780 */ 235, 291, 19, 114, 115, 116, 150, 59, 152, 189, + /* 790 */ 233, 236, 247, 59, 189, 125, 126, 127, 59, 300, + /* 800 */ 211, 212, 128, 304, 100, 19, 261, 156, 45, 46, + /* 810 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 820 */ 57, 101, 102, 103, 104, 105, 106, 107, 108, 109, + /* 830 */ 110, 111, 46, 233, 189, 189, 291, 248, 99, 189, + /* 840 */ 125, 126, 127, 115, 26, 200, 289, 230, 231, 115, + /* 850 */ 200, 16, 189, 114, 115, 189, 211, 212, 119, 221, + /* 860 */ 189, 211, 212, 258, 101, 102, 103, 104, 105, 106, + /* 870 */ 107, 108, 109, 110, 111, 189, 156, 211, 212, 234, + /* 880 */ 235, 189, 211, 212, 234, 235, 22, 201, 189, 150, + /* 890 */ 151, 152, 247, 248, 76, 16, 19, 247, 248, 113, + /* 900 */ 189, 24, 257, 211, 212, 189, 26, 89, 262, 223, + /* 910 */ 92, 225, 77, 189, 79, 129, 19, 53, 226, 248, + /* 920 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 930 */ 53, 54, 55, 56, 57, 236, 19, 271, 189, 99, + /* 940 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 950 */ 53, 54, 55, 56, 57, 115, 77, 59, 79, 119, + /* 960 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 970 */ 53, 54, 55, 56, 57, 259, 22, 23, 101, 102, + /* 980 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 59, + /* 990 */ 150, 151, 152, 158, 22, 244, 24, 246, 101, 102, + /* 1000 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 285, + /* 1010 */ 189, 189, 114, 115, 116, 200, 136, 137, 101, 102, + /* 1020 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 230, + /* 1030 */ 231, 59, 211, 212, 285, 105, 106, 189, 19, 141, + /* 1040 */ 234, 235, 239, 113, 114, 115, 116, 226, 118, 234, + /* 1050 */ 235, 189, 249, 247, 100, 189, 126, 23, 236, 107, + /* 1060 */ 26, 189, 247, 44, 45, 46, 47, 48, 49, 50, + /* 1070 */ 51, 52, 53, 54, 55, 56, 57, 211, 212, 59, + /* 1080 */ 150, 233, 152, 211, 212, 133, 12, 115, 189, 189, + /* 1090 */ 138, 19, 20, 300, 22, 233, 76, 304, 226, 11, + /* 1100 */ 208, 27, 22, 23, 200, 19, 26, 87, 36, 89, + /* 1110 */ 211, 212, 92, 300, 248, 189, 42, 304, 189, 250, + /* 1120 */ 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + /* 1130 */ 111, 59, 200, 233, 114, 115, 116, 63, 234, 235, + /* 1140 */ 235, 19, 20, 71, 22, 300, 189, 73, 200, 304, + /* 1150 */ 116, 247, 247, 81, 23, 200, 227, 26, 36, 234, + /* 1160 */ 235, 203, 204, 143, 200, 26, 234, 235, 194, 200, + /* 1170 */ 48, 99, 247, 66, 189, 141, 284, 105, 106, 247, + /* 1180 */ 100, 59, 234, 235, 112, 259, 114, 115, 116, 234, + /* 1190 */ 235, 119, 85, 71, 266, 247, 211, 212, 234, 235, + /* 1200 */ 114, 94, 247, 234, 235, 12, 266, 85, 136, 137, + /* 1210 */ 189, 247, 90, 26, 126, 127, 247, 189, 26, 22, + /* 1220 */ 27, 99, 150, 151, 152, 153, 154, 105, 106, 189, + /* 1230 */ 302, 303, 211, 212, 112, 42, 114, 115, 116, 211, + /* 1240 */ 212, 119, 302, 303, 19, 20, 189, 22, 274, 189, + /* 1250 */ 15, 144, 278, 189, 22, 23, 63, 189, 189, 203, + /* 1260 */ 204, 36, 136, 137, 155, 24, 157, 143, 211, 212, + /* 1270 */ 189, 26, 150, 151, 152, 153, 154, 0, 1, 2, + /* 1280 */ 211, 212, 5, 46, 59, 161, 147, 10, 11, 12, + /* 1290 */ 13, 14, 211, 212, 17, 60, 71, 189, 258, 189, + /* 1300 */ 59, 59, 105, 106, 189, 189, 189, 30, 116, 32, + /* 1310 */ 85, 124, 189, 251, 252, 90, 189, 40, 258, 211, + /* 1320 */ 212, 211, 212, 189, 99, 26, 211, 212, 211, 212, + /* 1330 */ 105, 106, 100, 141, 211, 212, 189, 112, 189, 114, + /* 1340 */ 115, 116, 24, 189, 119, 31, 23, 70, 189, 26, + /* 1350 */ 113, 19, 20, 39, 22, 78, 115, 115, 81, 189, + /* 1360 */ 211, 212, 22, 189, 24, 211, 212, 189, 36, 189, + /* 1370 */ 211, 212, 189, 189, 97, 150, 151, 152, 153, 154, + /* 1380 */ 127, 211, 212, 189, 189, 211, 212, 189, 143, 211, + /* 1390 */ 212, 59, 189, 189, 211, 212, 23, 189, 189, 26, + /* 1400 */ 59, 189, 149, 71, 22, 211, 212, 189, 131, 211, + /* 1410 */ 212, 189, 59, 136, 137, 211, 212, 85, 189, 211, + /* 1420 */ 212, 253, 90, 211, 212, 292, 293, 118, 119, 211, + /* 1430 */ 212, 99, 23, 211, 212, 26, 159, 105, 106, 140, + /* 1440 */ 211, 212, 23, 189, 112, 26, 114, 115, 116, 1, + /* 1450 */ 2, 119, 189, 5, 7, 8, 115, 139, 10, 11, + /* 1460 */ 12, 13, 14, 23, 189, 17, 26, 189, 115, 189, + /* 1470 */ 19, 20, 189, 22, 189, 83, 84, 189, 30, 150, + /* 1480 */ 32, 152, 150, 151, 152, 153, 154, 36, 40, 211, + /* 1490 */ 212, 211, 212, 189, 211, 212, 211, 212, 309, 189, + /* 1500 */ 19, 20, 189, 22, 150, 189, 152, 231, 189, 189, + /* 1510 */ 59, 189, 23, 189, 189, 26, 189, 36, 70, 189, + /* 1520 */ 23, 139, 71, 26, 211, 212, 78, 211, 212, 81, + /* 1530 */ 281, 211, 212, 211, 212, 189, 211, 212, 211, 212, + /* 1540 */ 59, 211, 212, 23, 23, 97, 26, 26, 23, 189, + /* 1550 */ 99, 26, 71, 189, 119, 189, 105, 106, 107, 189, + /* 1560 */ 189, 189, 280, 112, 129, 114, 115, 116, 189, 189, + /* 1570 */ 119, 23, 19, 20, 26, 22, 189, 211, 212, 131, + /* 1580 */ 99, 237, 211, 212, 136, 137, 105, 106, 189, 36, + /* 1590 */ 211, 212, 189, 112, 189, 114, 115, 116, 211, 212, + /* 1600 */ 119, 150, 151, 152, 153, 154, 189, 159, 23, 189, + /* 1610 */ 23, 26, 59, 26, 189, 189, 189, 189, 189, 189, + /* 1620 */ 209, 189, 238, 187, 71, 250, 250, 250, 211, 212, + /* 1630 */ 241, 150, 151, 152, 153, 154, 211, 212, 250, 290, + /* 1640 */ 254, 211, 212, 211, 212, 254, 215, 286, 241, 241, + /* 1650 */ 254, 286, 99, 214, 220, 214, 214, 224, 105, 106, + /* 1660 */ 244, 240, 244, 273, 192, 112, 60, 114, 115, 116, + /* 1670 */ 139, 290, 119, 5, 196, 238, 196, 38, 10, 11, + /* 1680 */ 12, 13, 14, 196, 287, 17, 148, 287, 276, 113, + /* 1690 */ 43, 22, 229, 147, 241, 18, 232, 232, 30, 232, + /* 1700 */ 32, 232, 264, 150, 151, 152, 153, 154, 40, 265, + /* 1710 */ 196, 18, 195, 264, 241, 241, 241, 265, 196, 229, + /* 1720 */ 229, 195, 155, 62, 196, 195, 283, 282, 22, 216, + /* 1730 */ 196, 195, 216, 196, 195, 113, 213, 213, 70, 64, + /* 1740 */ 213, 222, 22, 124, 162, 111, 78, 142, 219, 81, + /* 1750 */ 215, 219, 275, 303, 213, 213, 216, 275, 213, 216, + /* 1760 */ 213, 256, 113, 255, 255, 97, 222, 216, 256, 196, + /* 1770 */ 91, 256, 82, 255, 308, 146, 308, 22, 143, 196, + /* 1780 */ 270, 155, 145, 272, 144, 25, 13, 199, 26, 256, + /* 1790 */ 198, 190, 190, 6, 296, 188, 188, 188, 244, 131, + /* 1800 */ 245, 245, 243, 242, 136, 137, 241, 255, 208, 260, + /* 1810 */ 260, 208, 202, 217, 217, 202, 4, 3, 202, 208, + /* 1820 */ 208, 22, 160, 209, 209, 208, 15, 159, 98, 16, + /* 1830 */ 23, 23, 137, 148, 24, 128, 140, 20, 16, 142, + /* 1840 */ 1, 140, 128, 149, 61, 53, 37, 148, 53, 53, + /* 1850 */ 53, 293, 128, 296, 114, 34, 139, 1, 5, 22, + /* 1860 */ 113, 158, 68, 75, 26, 41, 68, 139, 24, 113, + /* 1870 */ 20, 19, 129, 123, 23, 96, 22, 22, 59, 22, + /* 1880 */ 22, 147, 67, 67, 24, 22, 37, 28, 23, 22, + /* 1890 */ 67, 23, 23, 23, 114, 23, 22, 26, 22, 24, + /* 1900 */ 23, 22, 24, 139, 23, 23, 141, 34, 88, 26, + /* 1910 */ 75, 86, 23, 22, 34, 75, 24, 23, 34, 34, + /* 1920 */ 34, 93, 34, 26, 26, 23, 23, 34, 23, 23, + /* 1930 */ 26, 44, 23, 22, 11, 22, 22, 133, 23, 23, + /* 1940 */ 22, 22, 139, 26, 139, 139, 15, 23, 1, 1, + /* 1950 */ 310, 310, 310, 310, 310, 310, 310, 139, 310, 310, + /* 1960 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 1970 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 1980 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 1990 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2000 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2010 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2020 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2030 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2040 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2050 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2060 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2070 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2080 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2090 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2100 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2110 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2120 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2130 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, }; -#define YY_SHIFT_COUNT (520) +#define YY_SHIFT_COUNT (550) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (1858) +#define YY_SHIFT_MAX (1948) static const unsigned short int yy_shift_ofst[] = { - /* 0 */ 1709, 1520, 1858, 1324, 1324, 277, 1374, 1469, 1602, 1712, - /* 10 */ 1712, 1712, 273, 0, 0, 113, 1016, 1712, 1712, 1712, - /* 20 */ 1712, 1712, 1712, 1712, 1712, 1712, 1712, 11, 11, 236, - /* 30 */ 184, 277, 277, 277, 277, 277, 277, 93, 177, 270, - /* 40 */ 363, 456, 549, 642, 735, 828, 848, 996, 1144, 1016, - /* 50 */ 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, - /* 60 */ 1016, 1016, 1016, 1016, 1016, 1016, 1164, 1016, 1257, 1277, - /* 70 */ 1277, 1490, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, - /* 80 */ 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, - /* 90 */ 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, - /* 100 */ 1712, 1712, 1712, 1742, 1712, 1712, 1712, 1712, 1712, 1712, - /* 110 */ 1712, 1712, 1712, 1712, 1712, 1712, 1712, 143, 162, 162, - /* 120 */ 162, 162, 162, 204, 151, 416, 531, 648, 700, 531, - /* 130 */ 486, 486, 531, 353, 353, 353, 353, 409, 279, 53, - /* 140 */ 2009, 2009, 331, 331, 331, 329, 366, 329, 329, 597, - /* 150 */ 597, 464, 474, 262, 681, 531, 531, 531, 531, 531, - /* 160 */ 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, - /* 170 */ 531, 531, 531, 531, 531, 531, 531, 173, 485, 984, - /* 180 */ 984, 576, 485, 19, 1022, 2009, 2009, 2009, 387, 250, - /* 190 */ 250, 525, 502, 278, 552, 227, 480, 566, 531, 531, - /* 200 */ 531, 531, 531, 531, 531, 531, 531, 531, 639, 531, - /* 210 */ 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, - /* 220 */ 531, 2, 2, 2, 531, 531, 531, 531, 782, 531, - /* 230 */ 531, 531, 744, 531, 531, 783, 531, 531, 531, 531, - /* 240 */ 531, 531, 531, 531, 419, 682, 327, 370, 370, 370, - /* 250 */ 370, 1029, 327, 327, 1024, 897, 856, 947, 1109, 706, - /* 260 */ 706, 1143, 1109, 1109, 1143, 842, 945, 1118, 1136, 1136, - /* 270 */ 1136, 706, 676, 400, 1047, 694, 1339, 1270, 1270, 1366, - /* 280 */ 1366, 1270, 1305, 1389, 1369, 1278, 1401, 1401, 1401, 1401, - /* 290 */ 1270, 1414, 1278, 1278, 1305, 1389, 1369, 1369, 1278, 1270, - /* 300 */ 1414, 1298, 1385, 1270, 1414, 1432, 1270, 1414, 1270, 1414, - /* 310 */ 1432, 1355, 1355, 1355, 1411, 1432, 1355, 1367, 1355, 1411, - /* 320 */ 1355, 1355, 1432, 1392, 1392, 1432, 1365, 1396, 1365, 1396, - /* 330 */ 1365, 1396, 1365, 1396, 1270, 1372, 1429, 1502, 1390, 1372, - /* 340 */ 1517, 1270, 1397, 1390, 1410, 1413, 1278, 1528, 1532, 1549, - /* 350 */ 1549, 1562, 1562, 1562, 2009, 2009, 2009, 2009, 2009, 2009, - /* 360 */ 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, - /* 370 */ 570, 345, 686, 748, 50, 740, 1064, 1107, 469, 537, - /* 380 */ 1042, 1146, 1162, 1154, 1201, 1202, 1203, 1208, 1209, 1127, - /* 390 */ 1069, 1196, 1157, 1147, 1226, 1228, 1245, 775, 868, 1246, - /* 400 */ 1247, 1191, 1151, 1585, 1589, 1587, 1456, 1600, 1527, 1601, - /* 410 */ 1595, 1596, 1492, 1484, 1506, 1603, 1495, 1608, 1496, 1614, - /* 420 */ 1635, 1508, 1497, 1521, 1580, 1606, 1505, 1592, 1593, 1597, - /* 430 */ 1598, 1530, 1547, 1619, 1524, 1654, 1651, 1636, 1553, 1510, - /* 440 */ 1594, 1634, 1599, 1588, 1623, 1535, 1564, 1642, 1649, 1652, - /* 450 */ 1552, 1560, 1653, 1609, 1655, 1656, 1657, 1659, 1612, 1658, - /* 460 */ 1660, 1616, 1648, 1664, 1550, 1668, 1538, 1670, 1671, 1669, - /* 470 */ 1673, 1675, 1676, 1678, 1680, 1679, 1574, 1683, 1690, 1610, - /* 480 */ 1682, 1695, 1586, 1698, 1691, 1698, 1693, 1643, 1661, 1646, - /* 490 */ 1686, 1710, 1711, 1714, 1716, 1703, 1715, 1698, 1727, 1728, - /* 500 */ 1729, 1730, 1731, 1732, 1734, 1743, 1736, 1737, 1740, 1744, - /* 510 */ 1738, 1746, 1739, 1645, 1640, 1644, 1647, 1650, 1749, 1751, - /* 520 */ 1772, + /* 0 */ 1448, 1277, 1668, 1072, 1072, 340, 1122, 1225, 1332, 1481, + /* 10 */ 1481, 1481, 335, 0, 0, 180, 897, 1481, 1481, 1481, + /* 20 */ 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, + /* 30 */ 930, 930, 1020, 1020, 290, 1, 340, 340, 340, 340, + /* 40 */ 340, 340, 40, 110, 219, 288, 327, 396, 435, 504, + /* 50 */ 543, 612, 651, 720, 877, 897, 897, 897, 897, 897, + /* 60 */ 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, + /* 70 */ 897, 897, 897, 917, 897, 1019, 763, 763, 1451, 1481, + /* 80 */ 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, + /* 90 */ 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, + /* 100 */ 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, + /* 110 */ 1481, 1481, 1553, 1481, 1481, 1481, 1481, 1481, 1481, 1481, + /* 120 */ 1481, 1481, 1481, 1481, 1481, 1481, 147, 258, 258, 258, + /* 130 */ 258, 258, 79, 65, 84, 449, 19, 786, 449, 636, + /* 140 */ 636, 449, 880, 880, 880, 880, 113, 142, 142, 472, + /* 150 */ 150, 1958, 1958, 399, 399, 399, 93, 237, 341, 237, + /* 160 */ 237, 1074, 1074, 437, 350, 704, 1080, 449, 449, 449, + /* 170 */ 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + /* 180 */ 449, 449, 449, 449, 449, 449, 449, 449, 818, 818, + /* 190 */ 449, 1088, 217, 217, 734, 734, 1124, 1126, 1958, 1958, + /* 200 */ 1958, 739, 840, 840, 453, 454, 511, 187, 563, 570, + /* 210 */ 898, 669, 449, 449, 449, 449, 449, 449, 449, 449, + /* 220 */ 449, 670, 449, 449, 449, 449, 449, 449, 449, 449, + /* 230 */ 449, 449, 449, 449, 674, 674, 674, 449, 449, 449, + /* 240 */ 449, 1034, 449, 449, 449, 972, 1107, 449, 449, 1193, + /* 250 */ 449, 449, 449, 449, 449, 449, 449, 449, 260, 177, + /* 260 */ 489, 1241, 1241, 1241, 1241, 1192, 489, 489, 952, 1197, + /* 270 */ 625, 1235, 1139, 181, 181, 1086, 1139, 1139, 1086, 1187, + /* 280 */ 1131, 1237, 1314, 1314, 1314, 181, 1245, 1245, 1109, 1299, + /* 290 */ 549, 1340, 1606, 1531, 1531, 1639, 1639, 1531, 1538, 1576, + /* 300 */ 1669, 1647, 1546, 1677, 1677, 1677, 1677, 1531, 1693, 1546, + /* 310 */ 1546, 1576, 1669, 1647, 1647, 1546, 1531, 1693, 1567, 1661, + /* 320 */ 1531, 1693, 1706, 1531, 1693, 1531, 1693, 1706, 1622, 1622, + /* 330 */ 1622, 1675, 1720, 1720, 1706, 1622, 1619, 1622, 1675, 1622, + /* 340 */ 1622, 1582, 1706, 1634, 1634, 1706, 1605, 1649, 1605, 1649, + /* 350 */ 1605, 1649, 1605, 1649, 1531, 1679, 1679, 1690, 1690, 1629, + /* 360 */ 1635, 1755, 1531, 1626, 1629, 1637, 1640, 1546, 1760, 1762, + /* 370 */ 1773, 1773, 1787, 1787, 1787, 1958, 1958, 1958, 1958, 1958, + /* 380 */ 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, + /* 390 */ 308, 835, 954, 1232, 879, 715, 728, 1323, 864, 1318, + /* 400 */ 1253, 1373, 297, 1409, 1419, 1440, 1489, 1497, 1520, 1242, + /* 410 */ 1309, 1447, 1435, 1341, 1521, 1525, 1392, 1548, 1329, 1354, + /* 420 */ 1585, 1587, 1353, 1382, 1812, 1814, 1799, 1662, 1811, 1730, + /* 430 */ 1813, 1807, 1808, 1695, 1685, 1707, 1810, 1696, 1817, 1697, + /* 440 */ 1822, 1839, 1701, 1694, 1714, 1783, 1809, 1699, 1792, 1795, + /* 450 */ 1796, 1797, 1724, 1740, 1821, 1717, 1856, 1853, 1837, 1747, + /* 460 */ 1703, 1794, 1838, 1798, 1788, 1824, 1728, 1756, 1844, 1850, + /* 470 */ 1852, 1743, 1750, 1854, 1815, 1855, 1857, 1851, 1858, 1816, + /* 480 */ 1819, 1860, 1779, 1859, 1863, 1823, 1849, 1865, 1734, 1867, + /* 490 */ 1868, 1869, 1870, 1871, 1872, 1874, 1875, 1877, 1876, 1878, + /* 500 */ 1764, 1881, 1882, 1780, 1873, 1879, 1765, 1883, 1880, 1884, + /* 510 */ 1885, 1886, 1820, 1835, 1825, 1887, 1840, 1828, 1888, 1889, + /* 520 */ 1891, 1892, 1897, 1898, 1893, 1894, 1883, 1902, 1903, 1905, + /* 530 */ 1906, 1904, 1909, 1911, 1923, 1913, 1914, 1915, 1916, 1918, + /* 540 */ 1919, 1917, 1804, 1803, 1805, 1806, 1818, 1924, 1931, 1947, + /* 550 */ 1948, }; -#define YY_REDUCE_COUNT (369) -#define YY_REDUCE_MIN (-237) -#define YY_REDUCE_MAX (1424) +#define YY_REDUCE_COUNT (389) +#define YY_REDUCE_MIN (-262) +#define YY_REDUCE_MAX (1617) static const short yy_reduce_ofst[] = { - /* 0 */ -147, 171, 263, -96, 358, -144, -149, -102, 124, -156, - /* 10 */ -98, 305, 401, -57, 209, -237, 245, -94, -79, 189, - /* 20 */ 375, 490, 493, 378, 303, 539, 542, 501, 503, 554, - /* 30 */ 415, 526, 546, 557, 587, 593, 595, -234, -234, -234, - /* 40 */ -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, - /* 50 */ -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, - /* 60 */ -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, - /* 70 */ -234, -50, 335, 470, 633, 656, 658, 660, 675, 685, - /* 80 */ 703, 727, 747, 750, 752, 754, 770, 788, 790, 793, - /* 90 */ 795, 797, 800, 802, 804, 806, 813, 820, 829, 833, - /* 100 */ 836, 838, 843, 845, 847, 849, 873, 891, 893, 916, - /* 110 */ 918, 921, 936, 941, 944, 956, 961, -234, -234, -234, - /* 120 */ -234, -234, -234, -234, -234, -234, 463, 607, -176, 14, - /* 130 */ -139, 87, -137, 818, 925, 818, 925, 898, -234, -234, - /* 140 */ -234, -234, -166, -166, -166, -130, -131, -82, -54, -180, - /* 150 */ 364, 41, 513, 509, 509, 117, 500, 789, 796, 646, - /* 160 */ 192, 291, 644, 798, 120, 807, 543, 911, 920, 652, - /* 170 */ 924, 922, 232, 698, 801, 971, 39, 220, 731, 442, - /* 180 */ 902, -199, 979, -43, 421, 896, 942, 605, -184, -126, - /* 190 */ 155, 172, 281, 304, 377, 538, 650, 690, 699, 723, - /* 200 */ 803, 839, 853, 919, 991, 1018, 1067, 1092, 951, 1111, - /* 210 */ 1112, 1115, 1116, 1117, 1119, 1120, 1121, 1122, 1123, 1124, - /* 220 */ 1125, 1012, 1096, 1097, 1128, 1129, 1130, 1131, 1070, 1135, - /* 230 */ 1137, 1152, 1077, 1153, 1155, 1114, 1156, 304, 1158, 1172, - /* 240 */ 1173, 1174, 1175, 1176, 1089, 1091, 1133, 1098, 1126, 1139, - /* 250 */ 1140, 1070, 1133, 1133, 1170, 1163, 1186, 1103, 1168, 1138, - /* 260 */ 1141, 1110, 1169, 1171, 1132, 1177, 1189, 1194, 1181, 1200, - /* 270 */ 1204, 1166, 1145, 1178, 1187, 1232, 1142, 1231, 1233, 1149, - /* 280 */ 1150, 1238, 1179, 1182, 1212, 1205, 1219, 1220, 1221, 1222, - /* 290 */ 1258, 1266, 1223, 1224, 1206, 1211, 1237, 1239, 1230, 1269, - /* 300 */ 1272, 1195, 1197, 1280, 1284, 1268, 1285, 1289, 1290, 1293, - /* 310 */ 1274, 1286, 1287, 1288, 1282, 1294, 1292, 1297, 1300, 1296, - /* 320 */ 1301, 1306, 1304, 1249, 1250, 1308, 1271, 1275, 1273, 1276, - /* 330 */ 1279, 1281, 1283, 1302, 1334, 1307, 1243, 1267, 1318, 1322, - /* 340 */ 1303, 1371, 1299, 1328, 1332, 1340, 1342, 1384, 1391, 1400, - /* 350 */ 1403, 1407, 1408, 1409, 1311, 1312, 1310, 1405, 1402, 1412, - /* 360 */ 1417, 1420, 1406, 1393, 1395, 1421, 1422, 1423, 1424, 1415, + /* 0 */ 490, -122, 545, 645, 650, -120, -189, -187, -184, -182, + /* 10 */ -178, -176, 45, 30, 200, -251, -134, 390, 392, 521, + /* 20 */ 523, 213, 692, 821, 284, 589, 872, 666, 671, 866, + /* 30 */ 71, 111, 273, 389, 686, 815, 904, 932, 948, 955, + /* 40 */ 964, 969, -259, -259, -259, -259, -259, -259, -259, -259, + /* 50 */ -259, -259, -259, -259, -259, -259, -259, -259, -259, -259, + /* 60 */ -259, -259, -259, -259, -259, -259, -259, -259, -259, -259, + /* 70 */ -259, -259, -259, -259, -259, -259, -259, -259, 428, 430, + /* 80 */ 899, 985, 1021, 1028, 1057, 1069, 1081, 1108, 1110, 1115, + /* 90 */ 1117, 1123, 1149, 1154, 1159, 1170, 1174, 1178, 1183, 1194, + /* 100 */ 1198, 1204, 1208, 1212, 1218, 1222, 1229, 1278, 1280, 1283, + /* 110 */ 1285, 1313, 1316, 1320, 1322, 1325, 1327, 1330, 1366, 1371, + /* 120 */ 1379, 1387, 1417, 1425, 1430, 1432, -259, -259, -259, -259, + /* 130 */ -259, -259, -259, -259, -259, 557, 974, -214, -174, -9, + /* 140 */ 431, -124, 806, 925, 806, 925, 251, 928, 940, -259, + /* 150 */ -259, -259, -259, -198, -198, -198, 127, -186, -168, 212, + /* 160 */ 646, 617, 799, -262, 555, 220, 220, 491, 605, 1040, + /* 170 */ 1060, 699, -11, 600, 848, 862, 345, -129, 724, -91, + /* 180 */ 158, 749, 716, 900, 304, 822, 929, 926, 499, 793, + /* 190 */ 322, 892, 813, 845, 958, 1056, 751, 905, 1133, 1062, + /* 200 */ 803, -210, -185, -179, -148, -167, -89, 121, 274, 281, + /* 210 */ 320, 336, 439, 663, 711, 957, 1064, 1068, 1116, 1127, + /* 220 */ 1134, -196, 1147, 1180, 1184, 1195, 1203, 1209, 1254, 1263, + /* 230 */ 1275, 1288, 1304, 1310, 205, 422, 638, 1319, 1324, 1346, + /* 240 */ 1360, 1168, 1364, 1370, 1372, 869, 1189, 1380, 1399, 1276, + /* 250 */ 1403, 121, 1405, 1420, 1426, 1427, 1428, 1429, 1249, 1282, + /* 260 */ 1344, 1375, 1376, 1377, 1388, 1168, 1344, 1344, 1384, 1411, + /* 270 */ 1436, 1349, 1389, 1386, 1391, 1361, 1407, 1408, 1365, 1431, + /* 280 */ 1433, 1434, 1439, 1441, 1442, 1396, 1416, 1418, 1390, 1421, + /* 290 */ 1437, 1472, 1381, 1478, 1480, 1397, 1400, 1487, 1412, 1444, + /* 300 */ 1438, 1463, 1453, 1464, 1465, 1467, 1469, 1514, 1517, 1473, + /* 310 */ 1474, 1452, 1449, 1490, 1491, 1475, 1522, 1526, 1443, 1445, + /* 320 */ 1528, 1530, 1513, 1534, 1536, 1537, 1539, 1516, 1523, 1524, + /* 330 */ 1527, 1519, 1529, 1532, 1540, 1541, 1535, 1542, 1544, 1545, + /* 340 */ 1547, 1450, 1543, 1477, 1482, 1551, 1505, 1508, 1512, 1509, + /* 350 */ 1515, 1518, 1533, 1552, 1573, 1466, 1468, 1549, 1550, 1555, + /* 360 */ 1554, 1510, 1583, 1511, 1556, 1559, 1561, 1565, 1588, 1592, + /* 370 */ 1601, 1602, 1607, 1608, 1609, 1498, 1557, 1558, 1610, 1600, + /* 380 */ 1603, 1611, 1612, 1613, 1596, 1597, 1614, 1615, 1617, 1616, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 1492, 1492, 1492, 1340, 1123, 1229, 1123, 1123, 1123, 1340, - /* 10 */ 1340, 1340, 1123, 1259, 1259, 1391, 1154, 1123, 1123, 1123, - /* 20 */ 1123, 1123, 1123, 1123, 1339, 1123, 1123, 1123, 1123, 1123, - /* 30 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1265, 1123, - /* 40 */ 1123, 1123, 1123, 1123, 1341, 1342, 1123, 1123, 1123, 1390, - /* 50 */ 1392, 1275, 1274, 1273, 1272, 1373, 1246, 1270, 1263, 1267, - /* 60 */ 1335, 1336, 1334, 1338, 1342, 1341, 1123, 1266, 1306, 1320, - /* 70 */ 1305, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 80 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 90 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 100 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 110 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1314, 1319, 1325, - /* 120 */ 1318, 1315, 1308, 1307, 1309, 1310, 1123, 1144, 1193, 1123, - /* 130 */ 1123, 1123, 1123, 1409, 1408, 1123, 1123, 1154, 1311, 1312, - /* 140 */ 1322, 1321, 1398, 1448, 1447, 1123, 1123, 1123, 1123, 1123, - /* 150 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 160 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 170 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1154, 1150, 1300, - /* 180 */ 1299, 1418, 1150, 1253, 1123, 1404, 1229, 1220, 1123, 1123, - /* 190 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 200 */ 1123, 1395, 1393, 1123, 1355, 1123, 1123, 1123, 1123, 1123, - /* 210 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 220 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 230 */ 1123, 1123, 1225, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 240 */ 1123, 1123, 1123, 1442, 1123, 1368, 1207, 1225, 1225, 1225, - /* 250 */ 1225, 1227, 1208, 1206, 1219, 1154, 1130, 1484, 1269, 1248, - /* 260 */ 1248, 1481, 1269, 1269, 1481, 1168, 1462, 1165, 1259, 1259, - /* 270 */ 1259, 1248, 1337, 1226, 1219, 1123, 1484, 1234, 1234, 1483, - /* 280 */ 1483, 1234, 1278, 1284, 1196, 1269, 1202, 1202, 1202, 1202, - /* 290 */ 1234, 1141, 1269, 1269, 1278, 1284, 1196, 1196, 1269, 1234, - /* 300 */ 1141, 1372, 1478, 1234, 1141, 1348, 1234, 1141, 1234, 1141, - /* 310 */ 1348, 1194, 1194, 1194, 1183, 1348, 1194, 1168, 1194, 1183, - /* 320 */ 1194, 1194, 1348, 1352, 1352, 1348, 1252, 1247, 1252, 1247, - /* 330 */ 1252, 1247, 1252, 1247, 1234, 1253, 1417, 1123, 1264, 1253, - /* 340 */ 1343, 1234, 1123, 1264, 1262, 1260, 1269, 1147, 1186, 1445, - /* 350 */ 1445, 1441, 1441, 1441, 1489, 1489, 1404, 1457, 1154, 1154, - /* 360 */ 1154, 1154, 1457, 1170, 1170, 1154, 1154, 1154, 1154, 1457, - /* 370 */ 1123, 1123, 1123, 1123, 1123, 1123, 1452, 1123, 1357, 1238, - /* 380 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 390 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 400 */ 1123, 1123, 1289, 1123, 1126, 1401, 1123, 1123, 1399, 1123, - /* 410 */ 1123, 1123, 1123, 1123, 1123, 1239, 1123, 1123, 1123, 1123, - /* 420 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 430 */ 1123, 1123, 1123, 1123, 1480, 1123, 1123, 1123, 1123, 1123, - /* 440 */ 1123, 1371, 1370, 1123, 1123, 1236, 1123, 1123, 1123, 1123, - /* 450 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 460 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 470 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 480 */ 1123, 1123, 1123, 1261, 1123, 1416, 1123, 1123, 1123, 1123, - /* 490 */ 1123, 1123, 1123, 1430, 1254, 1123, 1123, 1471, 1123, 1123, - /* 500 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 510 */ 1123, 1123, 1466, 1210, 1291, 1123, 1290, 1294, 1123, 1135, - /* 520 */ 1123, + /* 0 */ 1573, 1573, 1573, 1409, 1186, 1295, 1186, 1186, 1186, 1409, + /* 10 */ 1409, 1409, 1186, 1325, 1325, 1462, 1217, 1186, 1186, 1186, + /* 20 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1408, 1186, 1186, + /* 30 */ 1186, 1186, 1492, 1492, 1186, 1186, 1186, 1186, 1186, 1186, + /* 40 */ 1186, 1186, 1186, 1334, 1186, 1186, 1186, 1186, 1186, 1186, + /* 50 */ 1410, 1411, 1186, 1186, 1186, 1461, 1463, 1426, 1344, 1343, + /* 60 */ 1342, 1341, 1444, 1312, 1339, 1332, 1336, 1404, 1405, 1403, + /* 70 */ 1407, 1411, 1410, 1186, 1335, 1375, 1389, 1374, 1186, 1186, + /* 80 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 90 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 100 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 110 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 120 */ 1186, 1186, 1186, 1186, 1186, 1186, 1383, 1388, 1394, 1387, + /* 130 */ 1384, 1377, 1376, 1378, 1379, 1186, 1207, 1259, 1186, 1186, + /* 140 */ 1186, 1186, 1480, 1479, 1186, 1186, 1217, 1369, 1368, 1380, + /* 150 */ 1381, 1391, 1390, 1469, 1527, 1526, 1427, 1186, 1186, 1186, + /* 160 */ 1186, 1186, 1186, 1492, 1186, 1186, 1186, 1186, 1186, 1186, + /* 170 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 180 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1492, 1492, + /* 190 */ 1186, 1217, 1492, 1492, 1213, 1213, 1319, 1186, 1475, 1295, + /* 200 */ 1286, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 210 */ 1186, 1186, 1186, 1186, 1186, 1466, 1464, 1186, 1186, 1186, + /* 220 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 230 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 240 */ 1186, 1186, 1186, 1186, 1186, 1291, 1186, 1186, 1186, 1186, + /* 250 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1521, 1186, 1439, + /* 260 */ 1273, 1291, 1291, 1291, 1291, 1293, 1274, 1272, 1285, 1218, + /* 270 */ 1193, 1565, 1338, 1314, 1314, 1562, 1338, 1338, 1562, 1234, + /* 280 */ 1543, 1229, 1325, 1325, 1325, 1314, 1319, 1319, 1406, 1292, + /* 290 */ 1285, 1186, 1565, 1300, 1300, 1564, 1564, 1300, 1427, 1347, + /* 300 */ 1353, 1262, 1338, 1268, 1268, 1268, 1268, 1300, 1204, 1338, + /* 310 */ 1338, 1347, 1353, 1262, 1262, 1338, 1300, 1204, 1443, 1559, + /* 320 */ 1300, 1204, 1417, 1300, 1204, 1300, 1204, 1417, 1260, 1260, + /* 330 */ 1260, 1249, 1186, 1186, 1417, 1260, 1234, 1260, 1249, 1260, + /* 340 */ 1260, 1510, 1417, 1421, 1421, 1417, 1318, 1313, 1318, 1313, + /* 350 */ 1318, 1313, 1318, 1313, 1300, 1502, 1502, 1328, 1328, 1333, + /* 360 */ 1319, 1412, 1300, 1186, 1333, 1331, 1329, 1338, 1210, 1252, + /* 370 */ 1524, 1524, 1520, 1520, 1520, 1570, 1570, 1475, 1536, 1217, + /* 380 */ 1217, 1217, 1217, 1536, 1236, 1236, 1218, 1218, 1217, 1536, + /* 390 */ 1186, 1186, 1186, 1186, 1186, 1186, 1531, 1186, 1428, 1304, + /* 400 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 410 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 420 */ 1186, 1186, 1186, 1358, 1186, 1189, 1472, 1186, 1186, 1470, + /* 430 */ 1186, 1186, 1186, 1186, 1186, 1186, 1305, 1186, 1186, 1186, + /* 440 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 450 */ 1186, 1186, 1186, 1186, 1186, 1561, 1186, 1186, 1186, 1186, + /* 460 */ 1186, 1186, 1442, 1441, 1186, 1186, 1302, 1186, 1186, 1186, + /* 470 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 480 */ 1232, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 490 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 500 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1330, 1186, 1186, + /* 510 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 520 */ 1186, 1186, 1507, 1320, 1186, 1186, 1552, 1186, 1186, 1186, + /* 530 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 540 */ 1186, 1547, 1276, 1360, 1186, 1359, 1363, 1186, 1198, 1186, + /* 550 */ 1186, }; /********** End of lemon-generated parsing tables *****************************/ @@ -146928,15 +153346,105 @@ static const YYCODETYPE yyFallback[] = { 59, /* VIEW => ID */ 59, /* VIRTUAL => ID */ 59, /* WITH => ID */ + 59, /* NULLS => ID */ + 59, /* FIRST => ID */ + 59, /* LAST => ID */ 59, /* CURRENT => ID */ 59, /* FOLLOWING => ID */ 59, /* PARTITION => ID */ 59, /* PRECEDING => ID */ 59, /* RANGE => ID */ 59, /* UNBOUNDED => ID */ + 59, /* EXCLUDE => ID */ + 59, /* GROUPS => ID */ + 59, /* OTHERS => ID */ + 59, /* TIES => ID */ + 59, /* GENERATED => ID */ + 59, /* ALWAYS => ID */ 59, /* REINDEX => ID */ 59, /* RENAME => ID */ 59, /* CTIME_KW => ID */ + 0, /* ANY => nothing */ + 0, /* BITAND => nothing */ + 0, /* BITOR => nothing */ + 0, /* LSHIFT => nothing */ + 0, /* RSHIFT => nothing */ + 0, /* PLUS => nothing */ + 0, /* MINUS => nothing */ + 0, /* STAR => nothing */ + 0, /* SLASH => nothing */ + 0, /* REM => nothing */ + 0, /* CONCAT => nothing */ + 0, /* COLLATE => nothing */ + 0, /* BITNOT => nothing */ + 0, /* ON => nothing */ + 0, /* INDEXED => nothing */ + 0, /* STRING => nothing */ + 0, /* JOIN_KW => nothing */ + 0, /* CONSTRAINT => nothing */ + 0, /* DEFAULT => nothing */ + 0, /* NULL => nothing */ + 0, /* PRIMARY => nothing */ + 0, /* UNIQUE => nothing */ + 0, /* CHECK => nothing */ + 0, /* REFERENCES => nothing */ + 0, /* AUTOINCR => nothing */ + 0, /* INSERT => nothing */ + 0, /* DELETE => nothing */ + 0, /* UPDATE => nothing */ + 0, /* SET => nothing */ + 0, /* DEFERRABLE => nothing */ + 0, /* FOREIGN => nothing */ + 0, /* DROP => nothing */ + 0, /* UNION => nothing */ + 0, /* ALL => nothing */ + 0, /* EXCEPT => nothing */ + 0, /* INTERSECT => nothing */ + 0, /* SELECT => nothing */ + 0, /* VALUES => nothing */ + 0, /* DISTINCT => nothing */ + 0, /* DOT => nothing */ + 0, /* FROM => nothing */ + 0, /* JOIN => nothing */ + 0, /* USING => nothing */ + 0, /* ORDER => nothing */ + 0, /* GROUP => nothing */ + 0, /* HAVING => nothing */ + 0, /* LIMIT => nothing */ + 0, /* WHERE => nothing */ + 0, /* INTO => nothing */ + 0, /* NOTHING => nothing */ + 0, /* FLOAT => nothing */ + 0, /* BLOB => nothing */ + 0, /* INTEGER => nothing */ + 0, /* VARIABLE => nothing */ + 0, /* CASE => nothing */ + 0, /* WHEN => nothing */ + 0, /* THEN => nothing */ + 0, /* ELSE => nothing */ + 0, /* INDEX => nothing */ + 0, /* ALTER => nothing */ + 0, /* ADD => nothing */ + 0, /* WINDOW => nothing */ + 0, /* OVER => nothing */ + 0, /* FILTER => nothing */ + 0, /* COLUMN => nothing */ + 0, /* AGG_FUNCTION => nothing */ + 0, /* AGG_COLUMN => nothing */ + 0, /* TRUEFALSE => nothing */ + 0, /* ISNOT => nothing */ + 0, /* FUNCTION => nothing */ + 0, /* UMINUS => nothing */ + 0, /* UPLUS => nothing */ + 0, /* TRUTH => nothing */ + 0, /* REGISTER => nothing */ + 0, /* VECTOR => nothing */ + 0, /* SELECT_COLUMN => nothing */ + 0, /* IF_NULL_ROW => nothing */ + 0, /* ASTERISK => nothing */ + 0, /* SPAN => nothing */ + 0, /* SPACE => nothing */ + 0, /* ILLEGAL => nothing */ }; #endif /* YYFALLBACK */ @@ -147106,201 +153614,234 @@ static const char *const yyTokenName[] = { /* 79 */ "VIEW", /* 80 */ "VIRTUAL", /* 81 */ "WITH", - /* 82 */ "CURRENT", - /* 83 */ "FOLLOWING", - /* 84 */ "PARTITION", - /* 85 */ "PRECEDING", - /* 86 */ "RANGE", - /* 87 */ "UNBOUNDED", - /* 88 */ "REINDEX", - /* 89 */ "RENAME", - /* 90 */ "CTIME_KW", - /* 91 */ "ANY", - /* 92 */ "BITAND", - /* 93 */ "BITOR", - /* 94 */ "LSHIFT", - /* 95 */ "RSHIFT", - /* 96 */ "PLUS", - /* 97 */ "MINUS", - /* 98 */ "STAR", - /* 99 */ "SLASH", - /* 100 */ "REM", - /* 101 */ "CONCAT", - /* 102 */ "COLLATE", - /* 103 */ "BITNOT", - /* 104 */ "ON", - /* 105 */ "INDEXED", - /* 106 */ "STRING", - /* 107 */ "JOIN_KW", - /* 108 */ "CONSTRAINT", - /* 109 */ "DEFAULT", - /* 110 */ "NULL", - /* 111 */ "PRIMARY", - /* 112 */ "UNIQUE", - /* 113 */ "CHECK", - /* 114 */ "REFERENCES", - /* 115 */ "AUTOINCR", - /* 116 */ "INSERT", - /* 117 */ "DELETE", - /* 118 */ "UPDATE", - /* 119 */ "SET", - /* 120 */ "DEFERRABLE", - /* 121 */ "FOREIGN", - /* 122 */ "DROP", - /* 123 */ "UNION", - /* 124 */ "ALL", - /* 125 */ "EXCEPT", - /* 126 */ "INTERSECT", - /* 127 */ "SELECT", - /* 128 */ "VALUES", - /* 129 */ "DISTINCT", - /* 130 */ "DOT", - /* 131 */ "FROM", - /* 132 */ "JOIN", - /* 133 */ "USING", - /* 134 */ "ORDER", - /* 135 */ "GROUP", - /* 136 */ "HAVING", - /* 137 */ "LIMIT", - /* 138 */ "WHERE", - /* 139 */ "INTO", - /* 140 */ "NOTHING", - /* 141 */ "FLOAT", - /* 142 */ "BLOB", - /* 143 */ "INTEGER", - /* 144 */ "VARIABLE", - /* 145 */ "CASE", - /* 146 */ "WHEN", - /* 147 */ "THEN", - /* 148 */ "ELSE", - /* 149 */ "INDEX", - /* 150 */ "ALTER", - /* 151 */ "ADD", - /* 152 */ "WINDOW", - /* 153 */ "OVER", - /* 154 */ "FILTER", - /* 155 */ "input", - /* 156 */ "cmdlist", - /* 157 */ "ecmd", - /* 158 */ "cmdx", - /* 159 */ "explain", - /* 160 */ "cmd", - /* 161 */ "transtype", - /* 162 */ "trans_opt", - /* 163 */ "nm", - /* 164 */ "savepoint_opt", - /* 165 */ "create_table", - /* 166 */ "create_table_args", - /* 167 */ "createkw", - /* 168 */ "temp", - /* 169 */ "ifnotexists", - /* 170 */ "dbnm", - /* 171 */ "columnlist", - /* 172 */ "conslist_opt", - /* 173 */ "table_options", - /* 174 */ "select", - /* 175 */ "columnname", - /* 176 */ "carglist", - /* 177 */ "typetoken", - /* 178 */ "typename", - /* 179 */ "signed", - /* 180 */ "plus_num", - /* 181 */ "minus_num", - /* 182 */ "scanpt", - /* 183 */ "ccons", - /* 184 */ "term", - /* 185 */ "expr", - /* 186 */ "onconf", - /* 187 */ "sortorder", - /* 188 */ "autoinc", - /* 189 */ "eidlist_opt", - /* 190 */ "refargs", - /* 191 */ "defer_subclause", - /* 192 */ "refarg", - /* 193 */ "refact", - /* 194 */ "init_deferred_pred_opt", - /* 195 */ "conslist", - /* 196 */ "tconscomma", - /* 197 */ "tcons", - /* 198 */ "sortlist", - /* 199 */ "eidlist", - /* 200 */ "defer_subclause_opt", - /* 201 */ "orconf", - /* 202 */ "resolvetype", - /* 203 */ "raisetype", - /* 204 */ "ifexists", - /* 205 */ "fullname", - /* 206 */ "selectnowith", - /* 207 */ "oneselect", - /* 208 */ "wqlist", - /* 209 */ "multiselect_op", - /* 210 */ "distinct", - /* 211 */ "selcollist", - /* 212 */ "from", - /* 213 */ "where_opt", - /* 214 */ "groupby_opt", - /* 215 */ "having_opt", - /* 216 */ "orderby_opt", - /* 217 */ "limit_opt", - /* 218 */ "window_clause", - /* 219 */ "values", - /* 220 */ "nexprlist", - /* 221 */ "sclp", - /* 222 */ "as", - /* 223 */ "seltablist", - /* 224 */ "stl_prefix", - /* 225 */ "joinop", - /* 226 */ "indexed_opt", - /* 227 */ "on_opt", - /* 228 */ "using_opt", - /* 229 */ "exprlist", - /* 230 */ "xfullname", - /* 231 */ "idlist", - /* 232 */ "with", - /* 233 */ "setlist", - /* 234 */ "insert_cmd", - /* 235 */ "idlist_opt", - /* 236 */ "upsert", - /* 237 */ "over_clause", - /* 238 */ "likeop", - /* 239 */ "between_op", - /* 240 */ "in_op", - /* 241 */ "paren_exprlist", - /* 242 */ "case_operand", - /* 243 */ "case_exprlist", - /* 244 */ "case_else", - /* 245 */ "uniqueflag", - /* 246 */ "collate", - /* 247 */ "nmnum", - /* 248 */ "trigger_decl", - /* 249 */ "trigger_cmd_list", - /* 250 */ "trigger_time", - /* 251 */ "trigger_event", - /* 252 */ "foreach_clause", - /* 253 */ "when_clause", - /* 254 */ "trigger_cmd", - /* 255 */ "trnm", - /* 256 */ "tridxby", - /* 257 */ "database_kw_opt", - /* 258 */ "key_opt", - /* 259 */ "add_column_fullname", - /* 260 */ "kwcolumn_opt", - /* 261 */ "create_vtab", - /* 262 */ "vtabarglist", - /* 263 */ "vtabarg", - /* 264 */ "vtabargtoken", - /* 265 */ "lp", - /* 266 */ "anylist", - /* 267 */ "windowdefn_list", - /* 268 */ "windowdefn", - /* 269 */ "window", - /* 270 */ "frame_opt", - /* 271 */ "part_opt", - /* 272 */ "filter_opt", - /* 273 */ "range_or_rows", - /* 274 */ "frame_bound", - /* 275 */ "frame_bound_s", - /* 276 */ "frame_bound_e", + /* 82 */ "NULLS", + /* 83 */ "FIRST", + /* 84 */ "LAST", + /* 85 */ "CURRENT", + /* 86 */ "FOLLOWING", + /* 87 */ "PARTITION", + /* 88 */ "PRECEDING", + /* 89 */ "RANGE", + /* 90 */ "UNBOUNDED", + /* 91 */ "EXCLUDE", + /* 92 */ "GROUPS", + /* 93 */ "OTHERS", + /* 94 */ "TIES", + /* 95 */ "GENERATED", + /* 96 */ "ALWAYS", + /* 97 */ "REINDEX", + /* 98 */ "RENAME", + /* 99 */ "CTIME_KW", + /* 100 */ "ANY", + /* 101 */ "BITAND", + /* 102 */ "BITOR", + /* 103 */ "LSHIFT", + /* 104 */ "RSHIFT", + /* 105 */ "PLUS", + /* 106 */ "MINUS", + /* 107 */ "STAR", + /* 108 */ "SLASH", + /* 109 */ "REM", + /* 110 */ "CONCAT", + /* 111 */ "COLLATE", + /* 112 */ "BITNOT", + /* 113 */ "ON", + /* 114 */ "INDEXED", + /* 115 */ "STRING", + /* 116 */ "JOIN_KW", + /* 117 */ "CONSTRAINT", + /* 118 */ "DEFAULT", + /* 119 */ "NULL", + /* 120 */ "PRIMARY", + /* 121 */ "UNIQUE", + /* 122 */ "CHECK", + /* 123 */ "REFERENCES", + /* 124 */ "AUTOINCR", + /* 125 */ "INSERT", + /* 126 */ "DELETE", + /* 127 */ "UPDATE", + /* 128 */ "SET", + /* 129 */ "DEFERRABLE", + /* 130 */ "FOREIGN", + /* 131 */ "DROP", + /* 132 */ "UNION", + /* 133 */ "ALL", + /* 134 */ "EXCEPT", + /* 135 */ "INTERSECT", + /* 136 */ "SELECT", + /* 137 */ "VALUES", + /* 138 */ "DISTINCT", + /* 139 */ "DOT", + /* 140 */ "FROM", + /* 141 */ "JOIN", + /* 142 */ "USING", + /* 143 */ "ORDER", + /* 144 */ "GROUP", + /* 145 */ "HAVING", + /* 146 */ "LIMIT", + /* 147 */ "WHERE", + /* 148 */ "INTO", + /* 149 */ "NOTHING", + /* 150 */ "FLOAT", + /* 151 */ "BLOB", + /* 152 */ "INTEGER", + /* 153 */ "VARIABLE", + /* 154 */ "CASE", + /* 155 */ "WHEN", + /* 156 */ "THEN", + /* 157 */ "ELSE", + /* 158 */ "INDEX", + /* 159 */ "ALTER", + /* 160 */ "ADD", + /* 161 */ "WINDOW", + /* 162 */ "OVER", + /* 163 */ "FILTER", + /* 164 */ "COLUMN", + /* 165 */ "AGG_FUNCTION", + /* 166 */ "AGG_COLUMN", + /* 167 */ "TRUEFALSE", + /* 168 */ "ISNOT", + /* 169 */ "FUNCTION", + /* 170 */ "UMINUS", + /* 171 */ "UPLUS", + /* 172 */ "TRUTH", + /* 173 */ "REGISTER", + /* 174 */ "VECTOR", + /* 175 */ "SELECT_COLUMN", + /* 176 */ "IF_NULL_ROW", + /* 177 */ "ASTERISK", + /* 178 */ "SPAN", + /* 179 */ "SPACE", + /* 180 */ "ILLEGAL", + /* 181 */ "input", + /* 182 */ "cmdlist", + /* 183 */ "ecmd", + /* 184 */ "cmdx", + /* 185 */ "explain", + /* 186 */ "cmd", + /* 187 */ "transtype", + /* 188 */ "trans_opt", + /* 189 */ "nm", + /* 190 */ "savepoint_opt", + /* 191 */ "create_table", + /* 192 */ "create_table_args", + /* 193 */ "createkw", + /* 194 */ "temp", + /* 195 */ "ifnotexists", + /* 196 */ "dbnm", + /* 197 */ "columnlist", + /* 198 */ "conslist_opt", + /* 199 */ "table_options", + /* 200 */ "select", + /* 201 */ "columnname", + /* 202 */ "carglist", + /* 203 */ "typetoken", + /* 204 */ "typename", + /* 205 */ "signed", + /* 206 */ "plus_num", + /* 207 */ "minus_num", + /* 208 */ "scanpt", + /* 209 */ "scantok", + /* 210 */ "ccons", + /* 211 */ "term", + /* 212 */ "expr", + /* 213 */ "onconf", + /* 214 */ "sortorder", + /* 215 */ "autoinc", + /* 216 */ "eidlist_opt", + /* 217 */ "refargs", + /* 218 */ "defer_subclause", + /* 219 */ "generated", + /* 220 */ "refarg", + /* 221 */ "refact", + /* 222 */ "init_deferred_pred_opt", + /* 223 */ "conslist", + /* 224 */ "tconscomma", + /* 225 */ "tcons", + /* 226 */ "sortlist", + /* 227 */ "eidlist", + /* 228 */ "defer_subclause_opt", + /* 229 */ "orconf", + /* 230 */ "resolvetype", + /* 231 */ "raisetype", + /* 232 */ "ifexists", + /* 233 */ "fullname", + /* 234 */ "selectnowith", + /* 235 */ "oneselect", + /* 236 */ "wqlist", + /* 237 */ "multiselect_op", + /* 238 */ "distinct", + /* 239 */ "selcollist", + /* 240 */ "from", + /* 241 */ "where_opt", + /* 242 */ "groupby_opt", + /* 243 */ "having_opt", + /* 244 */ "orderby_opt", + /* 245 */ "limit_opt", + /* 246 */ "window_clause", + /* 247 */ "values", + /* 248 */ "nexprlist", + /* 249 */ "sclp", + /* 250 */ "as", + /* 251 */ "seltablist", + /* 252 */ "stl_prefix", + /* 253 */ "joinop", + /* 254 */ "indexed_opt", + /* 255 */ "on_opt", + /* 256 */ "using_opt", + /* 257 */ "exprlist", + /* 258 */ "xfullname", + /* 259 */ "idlist", + /* 260 */ "nulls", + /* 261 */ "with", + /* 262 */ "setlist", + /* 263 */ "insert_cmd", + /* 264 */ "idlist_opt", + /* 265 */ "upsert", + /* 266 */ "filter_over", + /* 267 */ "likeop", + /* 268 */ "between_op", + /* 269 */ "in_op", + /* 270 */ "paren_exprlist", + /* 271 */ "case_operand", + /* 272 */ "case_exprlist", + /* 273 */ "case_else", + /* 274 */ "uniqueflag", + /* 275 */ "collate", + /* 276 */ "vinto", + /* 277 */ "nmnum", + /* 278 */ "trigger_decl", + /* 279 */ "trigger_cmd_list", + /* 280 */ "trigger_time", + /* 281 */ "trigger_event", + /* 282 */ "foreach_clause", + /* 283 */ "when_clause", + /* 284 */ "trigger_cmd", + /* 285 */ "trnm", + /* 286 */ "tridxby", + /* 287 */ "database_kw_opt", + /* 288 */ "key_opt", + /* 289 */ "add_column_fullname", + /* 290 */ "kwcolumn_opt", + /* 291 */ "create_vtab", + /* 292 */ "vtabarglist", + /* 293 */ "vtabarg", + /* 294 */ "vtabargtoken", + /* 295 */ "lp", + /* 296 */ "anylist", + /* 297 */ "windowdefn_list", + /* 298 */ "windowdefn", + /* 299 */ "window", + /* 300 */ "frame_opt", + /* 301 */ "part_opt", + /* 302 */ "filter_clause", + /* 303 */ "over_clause", + /* 304 */ "range_or_rows", + /* 305 */ "frame_bound", + /* 306 */ "frame_bound_s", + /* 307 */ "frame_bound_e", + /* 308 */ "frame_exclude_opt", + /* 309 */ "frame_exclude", }; #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ @@ -147337,344 +153878,362 @@ static const char *const yyRuleName[] = { /* 26 */ "typetoken ::= typename LP signed COMMA signed RP", /* 27 */ "typename ::= typename ID|STRING", /* 28 */ "scanpt ::=", - /* 29 */ "ccons ::= CONSTRAINT nm", - /* 30 */ "ccons ::= DEFAULT scanpt term scanpt", - /* 31 */ "ccons ::= DEFAULT LP expr RP", - /* 32 */ "ccons ::= DEFAULT PLUS term scanpt", - /* 33 */ "ccons ::= DEFAULT MINUS term scanpt", - /* 34 */ "ccons ::= DEFAULT scanpt ID|INDEXED", - /* 35 */ "ccons ::= NOT NULL onconf", - /* 36 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc", - /* 37 */ "ccons ::= UNIQUE onconf", - /* 38 */ "ccons ::= CHECK LP expr RP", - /* 39 */ "ccons ::= REFERENCES nm eidlist_opt refargs", - /* 40 */ "ccons ::= defer_subclause", - /* 41 */ "ccons ::= COLLATE ID|STRING", - /* 42 */ "autoinc ::=", - /* 43 */ "autoinc ::= AUTOINCR", - /* 44 */ "refargs ::=", - /* 45 */ "refargs ::= refargs refarg", - /* 46 */ "refarg ::= MATCH nm", - /* 47 */ "refarg ::= ON INSERT refact", - /* 48 */ "refarg ::= ON DELETE refact", - /* 49 */ "refarg ::= ON UPDATE refact", - /* 50 */ "refact ::= SET NULL", - /* 51 */ "refact ::= SET DEFAULT", - /* 52 */ "refact ::= CASCADE", - /* 53 */ "refact ::= RESTRICT", - /* 54 */ "refact ::= NO ACTION", - /* 55 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt", - /* 56 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt", - /* 57 */ "init_deferred_pred_opt ::=", - /* 58 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED", - /* 59 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE", - /* 60 */ "conslist_opt ::=", - /* 61 */ "tconscomma ::= COMMA", - /* 62 */ "tcons ::= CONSTRAINT nm", - /* 63 */ "tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf", - /* 64 */ "tcons ::= UNIQUE LP sortlist RP onconf", - /* 65 */ "tcons ::= CHECK LP expr RP onconf", - /* 66 */ "tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt", - /* 67 */ "defer_subclause_opt ::=", - /* 68 */ "onconf ::=", - /* 69 */ "onconf ::= ON CONFLICT resolvetype", - /* 70 */ "orconf ::=", - /* 71 */ "orconf ::= OR resolvetype", - /* 72 */ "resolvetype ::= IGNORE", - /* 73 */ "resolvetype ::= REPLACE", - /* 74 */ "cmd ::= DROP TABLE ifexists fullname", - /* 75 */ "ifexists ::= IF EXISTS", - /* 76 */ "ifexists ::=", - /* 77 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select", - /* 78 */ "cmd ::= DROP VIEW ifexists fullname", - /* 79 */ "cmd ::= select", - /* 80 */ "select ::= WITH wqlist selectnowith", - /* 81 */ "select ::= WITH RECURSIVE wqlist selectnowith", - /* 82 */ "select ::= selectnowith", - /* 83 */ "selectnowith ::= selectnowith multiselect_op oneselect", - /* 84 */ "multiselect_op ::= UNION", - /* 85 */ "multiselect_op ::= UNION ALL", - /* 86 */ "multiselect_op ::= EXCEPT|INTERSECT", - /* 87 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt", - /* 88 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt", - /* 89 */ "values ::= VALUES LP nexprlist RP", - /* 90 */ "values ::= values COMMA LP nexprlist RP", - /* 91 */ "distinct ::= DISTINCT", - /* 92 */ "distinct ::= ALL", - /* 93 */ "distinct ::=", - /* 94 */ "sclp ::=", - /* 95 */ "selcollist ::= sclp scanpt expr scanpt as", - /* 96 */ "selcollist ::= sclp scanpt STAR", - /* 97 */ "selcollist ::= sclp scanpt nm DOT STAR", - /* 98 */ "as ::= AS nm", - /* 99 */ "as ::=", - /* 100 */ "from ::=", - /* 101 */ "from ::= FROM seltablist", - /* 102 */ "stl_prefix ::= seltablist joinop", - /* 103 */ "stl_prefix ::=", - /* 104 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt", - /* 105 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt", - /* 106 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt", - /* 107 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt", - /* 108 */ "dbnm ::=", - /* 109 */ "dbnm ::= DOT nm", - /* 110 */ "fullname ::= nm", - /* 111 */ "fullname ::= nm DOT nm", - /* 112 */ "xfullname ::= nm", - /* 113 */ "xfullname ::= nm DOT nm", - /* 114 */ "xfullname ::= nm DOT nm AS nm", - /* 115 */ "xfullname ::= nm AS nm", - /* 116 */ "joinop ::= COMMA|JOIN", - /* 117 */ "joinop ::= JOIN_KW JOIN", - /* 118 */ "joinop ::= JOIN_KW nm JOIN", - /* 119 */ "joinop ::= JOIN_KW nm nm JOIN", - /* 120 */ "on_opt ::= ON expr", - /* 121 */ "on_opt ::=", - /* 122 */ "indexed_opt ::=", - /* 123 */ "indexed_opt ::= INDEXED BY nm", - /* 124 */ "indexed_opt ::= NOT INDEXED", - /* 125 */ "using_opt ::= USING LP idlist RP", - /* 126 */ "using_opt ::=", - /* 127 */ "orderby_opt ::=", - /* 128 */ "orderby_opt ::= ORDER BY sortlist", - /* 129 */ "sortlist ::= sortlist COMMA expr sortorder", - /* 130 */ "sortlist ::= expr sortorder", - /* 131 */ "sortorder ::= ASC", - /* 132 */ "sortorder ::= DESC", - /* 133 */ "sortorder ::=", - /* 134 */ "groupby_opt ::=", - /* 135 */ "groupby_opt ::= GROUP BY nexprlist", - /* 136 */ "having_opt ::=", - /* 137 */ "having_opt ::= HAVING expr", - /* 138 */ "limit_opt ::=", - /* 139 */ "limit_opt ::= LIMIT expr", - /* 140 */ "limit_opt ::= LIMIT expr OFFSET expr", - /* 141 */ "limit_opt ::= LIMIT expr COMMA expr", - /* 142 */ "cmd ::= with DELETE FROM xfullname indexed_opt where_opt", - /* 143 */ "where_opt ::=", - /* 144 */ "where_opt ::= WHERE expr", - /* 145 */ "cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt", - /* 146 */ "setlist ::= setlist COMMA nm EQ expr", - /* 147 */ "setlist ::= setlist COMMA LP idlist RP EQ expr", - /* 148 */ "setlist ::= nm EQ expr", - /* 149 */ "setlist ::= LP idlist RP EQ expr", - /* 150 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert", - /* 151 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES", - /* 152 */ "upsert ::=", - /* 153 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt", - /* 154 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING", - /* 155 */ "upsert ::= ON CONFLICT DO NOTHING", - /* 156 */ "insert_cmd ::= INSERT orconf", - /* 157 */ "insert_cmd ::= REPLACE", - /* 158 */ "idlist_opt ::=", - /* 159 */ "idlist_opt ::= LP idlist RP", - /* 160 */ "idlist ::= idlist COMMA nm", - /* 161 */ "idlist ::= nm", - /* 162 */ "expr ::= LP expr RP", - /* 163 */ "expr ::= ID|INDEXED", - /* 164 */ "expr ::= JOIN_KW", - /* 165 */ "expr ::= nm DOT nm", - /* 166 */ "expr ::= nm DOT nm DOT nm", - /* 167 */ "term ::= NULL|FLOAT|BLOB", - /* 168 */ "term ::= STRING", - /* 169 */ "term ::= INTEGER", - /* 170 */ "expr ::= VARIABLE", - /* 171 */ "expr ::= expr COLLATE ID|STRING", - /* 172 */ "expr ::= CAST LP expr AS typetoken RP", - /* 173 */ "expr ::= ID|INDEXED LP distinct exprlist RP", - /* 174 */ "expr ::= ID|INDEXED LP STAR RP", - /* 175 */ "expr ::= ID|INDEXED LP distinct exprlist RP over_clause", - /* 176 */ "expr ::= ID|INDEXED LP STAR RP over_clause", - /* 177 */ "term ::= CTIME_KW", - /* 178 */ "expr ::= LP nexprlist COMMA expr RP", - /* 179 */ "expr ::= expr AND expr", - /* 180 */ "expr ::= expr OR expr", - /* 181 */ "expr ::= expr LT|GT|GE|LE expr", - /* 182 */ "expr ::= expr EQ|NE expr", - /* 183 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr", - /* 184 */ "expr ::= expr PLUS|MINUS expr", - /* 185 */ "expr ::= expr STAR|SLASH|REM expr", - /* 186 */ "expr ::= expr CONCAT expr", - /* 187 */ "likeop ::= NOT LIKE_KW|MATCH", - /* 188 */ "expr ::= expr likeop expr", - /* 189 */ "expr ::= expr likeop expr ESCAPE expr", - /* 190 */ "expr ::= expr ISNULL|NOTNULL", - /* 191 */ "expr ::= expr NOT NULL", - /* 192 */ "expr ::= expr IS expr", - /* 193 */ "expr ::= expr IS NOT expr", - /* 194 */ "expr ::= NOT expr", - /* 195 */ "expr ::= BITNOT expr", - /* 196 */ "expr ::= PLUS|MINUS expr", - /* 197 */ "between_op ::= BETWEEN", - /* 198 */ "between_op ::= NOT BETWEEN", - /* 199 */ "expr ::= expr between_op expr AND expr", - /* 200 */ "in_op ::= IN", - /* 201 */ "in_op ::= NOT IN", - /* 202 */ "expr ::= expr in_op LP exprlist RP", - /* 203 */ "expr ::= LP select RP", - /* 204 */ "expr ::= expr in_op LP select RP", - /* 205 */ "expr ::= expr in_op nm dbnm paren_exprlist", - /* 206 */ "expr ::= EXISTS LP select RP", - /* 207 */ "expr ::= CASE case_operand case_exprlist case_else END", - /* 208 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", - /* 209 */ "case_exprlist ::= WHEN expr THEN expr", - /* 210 */ "case_else ::= ELSE expr", - /* 211 */ "case_else ::=", - /* 212 */ "case_operand ::= expr", - /* 213 */ "case_operand ::=", - /* 214 */ "exprlist ::=", - /* 215 */ "nexprlist ::= nexprlist COMMA expr", - /* 216 */ "nexprlist ::= expr", - /* 217 */ "paren_exprlist ::=", - /* 218 */ "paren_exprlist ::= LP exprlist RP", - /* 219 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", - /* 220 */ "uniqueflag ::= UNIQUE", - /* 221 */ "uniqueflag ::=", - /* 222 */ "eidlist_opt ::=", - /* 223 */ "eidlist_opt ::= LP eidlist RP", - /* 224 */ "eidlist ::= eidlist COMMA nm collate sortorder", - /* 225 */ "eidlist ::= nm collate sortorder", - /* 226 */ "collate ::=", - /* 227 */ "collate ::= COLLATE ID|STRING", - /* 228 */ "cmd ::= DROP INDEX ifexists fullname", - /* 229 */ "cmd ::= VACUUM", - /* 230 */ "cmd ::= VACUUM nm", - /* 231 */ "cmd ::= PRAGMA nm dbnm", - /* 232 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", - /* 233 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", - /* 234 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", - /* 235 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", - /* 236 */ "plus_num ::= PLUS INTEGER|FLOAT", - /* 237 */ "minus_num ::= MINUS INTEGER|FLOAT", - /* 238 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", - /* 239 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", - /* 240 */ "trigger_time ::= BEFORE|AFTER", - /* 241 */ "trigger_time ::= INSTEAD OF", - /* 242 */ "trigger_time ::=", - /* 243 */ "trigger_event ::= DELETE|INSERT", - /* 244 */ "trigger_event ::= UPDATE", - /* 245 */ "trigger_event ::= UPDATE OF idlist", - /* 246 */ "when_clause ::=", - /* 247 */ "when_clause ::= WHEN expr", - /* 248 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", - /* 249 */ "trigger_cmd_list ::= trigger_cmd SEMI", - /* 250 */ "trnm ::= nm DOT nm", - /* 251 */ "tridxby ::= INDEXED BY nm", - /* 252 */ "tridxby ::= NOT INDEXED", - /* 253 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt", - /* 254 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt", - /* 255 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt", - /* 256 */ "trigger_cmd ::= scanpt select scanpt", - /* 257 */ "expr ::= RAISE LP IGNORE RP", - /* 258 */ "expr ::= RAISE LP raisetype COMMA nm RP", - /* 259 */ "raisetype ::= ROLLBACK", - /* 260 */ "raisetype ::= ABORT", - /* 261 */ "raisetype ::= FAIL", - /* 262 */ "cmd ::= DROP TRIGGER ifexists fullname", - /* 263 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", - /* 264 */ "cmd ::= DETACH database_kw_opt expr", - /* 265 */ "key_opt ::=", - /* 266 */ "key_opt ::= KEY expr", - /* 267 */ "cmd ::= REINDEX", - /* 268 */ "cmd ::= REINDEX nm dbnm", - /* 269 */ "cmd ::= ANALYZE", - /* 270 */ "cmd ::= ANALYZE nm dbnm", - /* 271 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", - /* 272 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", - /* 273 */ "add_column_fullname ::= fullname", - /* 274 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm", - /* 275 */ "cmd ::= create_vtab", - /* 276 */ "cmd ::= create_vtab LP vtabarglist RP", - /* 277 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", - /* 278 */ "vtabarg ::=", - /* 279 */ "vtabargtoken ::= ANY", - /* 280 */ "vtabargtoken ::= lp anylist RP", - /* 281 */ "lp ::= LP", - /* 282 */ "with ::= WITH wqlist", - /* 283 */ "with ::= WITH RECURSIVE wqlist", - /* 284 */ "wqlist ::= nm eidlist_opt AS LP select RP", - /* 285 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP", - /* 286 */ "windowdefn_list ::= windowdefn", - /* 287 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn", - /* 288 */ "windowdefn ::= nm AS window", - /* 289 */ "window ::= LP part_opt orderby_opt frame_opt RP", - /* 290 */ "part_opt ::= PARTITION BY nexprlist", - /* 291 */ "part_opt ::=", - /* 292 */ "frame_opt ::=", - /* 293 */ "frame_opt ::= range_or_rows frame_bound_s", - /* 294 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e", - /* 295 */ "range_or_rows ::= RANGE", - /* 296 */ "range_or_rows ::= ROWS", - /* 297 */ "frame_bound_s ::= frame_bound", - /* 298 */ "frame_bound_s ::= UNBOUNDED PRECEDING", - /* 299 */ "frame_bound_e ::= frame_bound", - /* 300 */ "frame_bound_e ::= UNBOUNDED FOLLOWING", - /* 301 */ "frame_bound ::= expr PRECEDING", - /* 302 */ "frame_bound ::= CURRENT ROW", - /* 303 */ "frame_bound ::= expr FOLLOWING", - /* 304 */ "window_clause ::= WINDOW windowdefn_list", - /* 305 */ "over_clause ::= filter_opt OVER window", - /* 306 */ "over_clause ::= filter_opt OVER nm", - /* 307 */ "filter_opt ::=", - /* 308 */ "filter_opt ::= FILTER LP WHERE expr RP", - /* 309 */ "input ::= cmdlist", - /* 310 */ "cmdlist ::= cmdlist ecmd", - /* 311 */ "cmdlist ::= ecmd", - /* 312 */ "ecmd ::= SEMI", - /* 313 */ "ecmd ::= cmdx SEMI", - /* 314 */ "ecmd ::= explain cmdx", - /* 315 */ "trans_opt ::=", - /* 316 */ "trans_opt ::= TRANSACTION", - /* 317 */ "trans_opt ::= TRANSACTION nm", - /* 318 */ "savepoint_opt ::= SAVEPOINT", - /* 319 */ "savepoint_opt ::=", - /* 320 */ "cmd ::= create_table create_table_args", - /* 321 */ "columnlist ::= columnlist COMMA columnname carglist", - /* 322 */ "columnlist ::= columnname carglist", - /* 323 */ "nm ::= ID|INDEXED", - /* 324 */ "nm ::= STRING", - /* 325 */ "nm ::= JOIN_KW", - /* 326 */ "typetoken ::= typename", - /* 327 */ "typename ::= ID|STRING", - /* 328 */ "signed ::= plus_num", - /* 329 */ "signed ::= minus_num", - /* 330 */ "carglist ::= carglist ccons", - /* 331 */ "carglist ::=", - /* 332 */ "ccons ::= NULL onconf", - /* 333 */ "conslist_opt ::= COMMA conslist", - /* 334 */ "conslist ::= conslist tconscomma tcons", - /* 335 */ "conslist ::= tcons", - /* 336 */ "tconscomma ::=", - /* 337 */ "defer_subclause_opt ::= defer_subclause", - /* 338 */ "resolvetype ::= raisetype", - /* 339 */ "selectnowith ::= oneselect", - /* 340 */ "oneselect ::= values", - /* 341 */ "sclp ::= selcollist COMMA", - /* 342 */ "as ::= ID|STRING", - /* 343 */ "expr ::= term", - /* 344 */ "likeop ::= LIKE_KW|MATCH", - /* 345 */ "exprlist ::= nexprlist", - /* 346 */ "nmnum ::= plus_num", - /* 347 */ "nmnum ::= nm", - /* 348 */ "nmnum ::= ON", - /* 349 */ "nmnum ::= DELETE", - /* 350 */ "nmnum ::= DEFAULT", - /* 351 */ "plus_num ::= INTEGER|FLOAT", - /* 352 */ "foreach_clause ::=", - /* 353 */ "foreach_clause ::= FOR EACH ROW", - /* 354 */ "trnm ::= nm", - /* 355 */ "tridxby ::=", - /* 356 */ "database_kw_opt ::= DATABASE", - /* 357 */ "database_kw_opt ::=", - /* 358 */ "kwcolumn_opt ::=", - /* 359 */ "kwcolumn_opt ::= COLUMNKW", - /* 360 */ "vtabarglist ::= vtabarg", - /* 361 */ "vtabarglist ::= vtabarglist COMMA vtabarg", - /* 362 */ "vtabarg ::= vtabarg vtabargtoken", - /* 363 */ "anylist ::=", - /* 364 */ "anylist ::= anylist LP anylist RP", - /* 365 */ "anylist ::= anylist ANY", - /* 366 */ "with ::=", + /* 29 */ "scantok ::=", + /* 30 */ "ccons ::= CONSTRAINT nm", + /* 31 */ "ccons ::= DEFAULT scantok term", + /* 32 */ "ccons ::= DEFAULT LP expr RP", + /* 33 */ "ccons ::= DEFAULT PLUS scantok term", + /* 34 */ "ccons ::= DEFAULT MINUS scantok term", + /* 35 */ "ccons ::= DEFAULT scantok ID|INDEXED", + /* 36 */ "ccons ::= NOT NULL onconf", + /* 37 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc", + /* 38 */ "ccons ::= UNIQUE onconf", + /* 39 */ "ccons ::= CHECK LP expr RP", + /* 40 */ "ccons ::= REFERENCES nm eidlist_opt refargs", + /* 41 */ "ccons ::= defer_subclause", + /* 42 */ "ccons ::= COLLATE ID|STRING", + /* 43 */ "generated ::= LP expr RP", + /* 44 */ "generated ::= LP expr RP ID", + /* 45 */ "autoinc ::=", + /* 46 */ "autoinc ::= AUTOINCR", + /* 47 */ "refargs ::=", + /* 48 */ "refargs ::= refargs refarg", + /* 49 */ "refarg ::= MATCH nm", + /* 50 */ "refarg ::= ON INSERT refact", + /* 51 */ "refarg ::= ON DELETE refact", + /* 52 */ "refarg ::= ON UPDATE refact", + /* 53 */ "refact ::= SET NULL", + /* 54 */ "refact ::= SET DEFAULT", + /* 55 */ "refact ::= CASCADE", + /* 56 */ "refact ::= RESTRICT", + /* 57 */ "refact ::= NO ACTION", + /* 58 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt", + /* 59 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt", + /* 60 */ "init_deferred_pred_opt ::=", + /* 61 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED", + /* 62 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE", + /* 63 */ "conslist_opt ::=", + /* 64 */ "tconscomma ::= COMMA", + /* 65 */ "tcons ::= CONSTRAINT nm", + /* 66 */ "tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf", + /* 67 */ "tcons ::= UNIQUE LP sortlist RP onconf", + /* 68 */ "tcons ::= CHECK LP expr RP onconf", + /* 69 */ "tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt", + /* 70 */ "defer_subclause_opt ::=", + /* 71 */ "onconf ::=", + /* 72 */ "onconf ::= ON CONFLICT resolvetype", + /* 73 */ "orconf ::=", + /* 74 */ "orconf ::= OR resolvetype", + /* 75 */ "resolvetype ::= IGNORE", + /* 76 */ "resolvetype ::= REPLACE", + /* 77 */ "cmd ::= DROP TABLE ifexists fullname", + /* 78 */ "ifexists ::= IF EXISTS", + /* 79 */ "ifexists ::=", + /* 80 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select", + /* 81 */ "cmd ::= DROP VIEW ifexists fullname", + /* 82 */ "cmd ::= select", + /* 83 */ "select ::= WITH wqlist selectnowith", + /* 84 */ "select ::= WITH RECURSIVE wqlist selectnowith", + /* 85 */ "select ::= selectnowith", + /* 86 */ "selectnowith ::= selectnowith multiselect_op oneselect", + /* 87 */ "multiselect_op ::= UNION", + /* 88 */ "multiselect_op ::= UNION ALL", + /* 89 */ "multiselect_op ::= EXCEPT|INTERSECT", + /* 90 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt", + /* 91 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt", + /* 92 */ "values ::= VALUES LP nexprlist RP", + /* 93 */ "values ::= values COMMA LP nexprlist RP", + /* 94 */ "distinct ::= DISTINCT", + /* 95 */ "distinct ::= ALL", + /* 96 */ "distinct ::=", + /* 97 */ "sclp ::=", + /* 98 */ "selcollist ::= sclp scanpt expr scanpt as", + /* 99 */ "selcollist ::= sclp scanpt STAR", + /* 100 */ "selcollist ::= sclp scanpt nm DOT STAR", + /* 101 */ "as ::= AS nm", + /* 102 */ "as ::=", + /* 103 */ "from ::=", + /* 104 */ "from ::= FROM seltablist", + /* 105 */ "stl_prefix ::= seltablist joinop", + /* 106 */ "stl_prefix ::=", + /* 107 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt", + /* 108 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt", + /* 109 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt", + /* 110 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt", + /* 111 */ "dbnm ::=", + /* 112 */ "dbnm ::= DOT nm", + /* 113 */ "fullname ::= nm", + /* 114 */ "fullname ::= nm DOT nm", + /* 115 */ "xfullname ::= nm", + /* 116 */ "xfullname ::= nm DOT nm", + /* 117 */ "xfullname ::= nm DOT nm AS nm", + /* 118 */ "xfullname ::= nm AS nm", + /* 119 */ "joinop ::= COMMA|JOIN", + /* 120 */ "joinop ::= JOIN_KW JOIN", + /* 121 */ "joinop ::= JOIN_KW nm JOIN", + /* 122 */ "joinop ::= JOIN_KW nm nm JOIN", + /* 123 */ "on_opt ::= ON expr", + /* 124 */ "on_opt ::=", + /* 125 */ "indexed_opt ::=", + /* 126 */ "indexed_opt ::= INDEXED BY nm", + /* 127 */ "indexed_opt ::= NOT INDEXED", + /* 128 */ "using_opt ::= USING LP idlist RP", + /* 129 */ "using_opt ::=", + /* 130 */ "orderby_opt ::=", + /* 131 */ "orderby_opt ::= ORDER BY sortlist", + /* 132 */ "sortlist ::= sortlist COMMA expr sortorder nulls", + /* 133 */ "sortlist ::= expr sortorder nulls", + /* 134 */ "sortorder ::= ASC", + /* 135 */ "sortorder ::= DESC", + /* 136 */ "sortorder ::=", + /* 137 */ "nulls ::= NULLS FIRST", + /* 138 */ "nulls ::= NULLS LAST", + /* 139 */ "nulls ::=", + /* 140 */ "groupby_opt ::=", + /* 141 */ "groupby_opt ::= GROUP BY nexprlist", + /* 142 */ "having_opt ::=", + /* 143 */ "having_opt ::= HAVING expr", + /* 144 */ "limit_opt ::=", + /* 145 */ "limit_opt ::= LIMIT expr", + /* 146 */ "limit_opt ::= LIMIT expr OFFSET expr", + /* 147 */ "limit_opt ::= LIMIT expr COMMA expr", + /* 148 */ "cmd ::= with DELETE FROM xfullname indexed_opt where_opt", + /* 149 */ "where_opt ::=", + /* 150 */ "where_opt ::= WHERE expr", + /* 151 */ "cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt", + /* 152 */ "setlist ::= setlist COMMA nm EQ expr", + /* 153 */ "setlist ::= setlist COMMA LP idlist RP EQ expr", + /* 154 */ "setlist ::= nm EQ expr", + /* 155 */ "setlist ::= LP idlist RP EQ expr", + /* 156 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert", + /* 157 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES", + /* 158 */ "upsert ::=", + /* 159 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt", + /* 160 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING", + /* 161 */ "upsert ::= ON CONFLICT DO NOTHING", + /* 162 */ "insert_cmd ::= INSERT orconf", + /* 163 */ "insert_cmd ::= REPLACE", + /* 164 */ "idlist_opt ::=", + /* 165 */ "idlist_opt ::= LP idlist RP", + /* 166 */ "idlist ::= idlist COMMA nm", + /* 167 */ "idlist ::= nm", + /* 168 */ "expr ::= LP expr RP", + /* 169 */ "expr ::= ID|INDEXED", + /* 170 */ "expr ::= JOIN_KW", + /* 171 */ "expr ::= nm DOT nm", + /* 172 */ "expr ::= nm DOT nm DOT nm", + /* 173 */ "term ::= NULL|FLOAT|BLOB", + /* 174 */ "term ::= STRING", + /* 175 */ "term ::= INTEGER", + /* 176 */ "expr ::= VARIABLE", + /* 177 */ "expr ::= expr COLLATE ID|STRING", + /* 178 */ "expr ::= CAST LP expr AS typetoken RP", + /* 179 */ "expr ::= ID|INDEXED LP distinct exprlist RP", + /* 180 */ "expr ::= ID|INDEXED LP STAR RP", + /* 181 */ "expr ::= ID|INDEXED LP distinct exprlist RP filter_over", + /* 182 */ "expr ::= ID|INDEXED LP STAR RP filter_over", + /* 183 */ "term ::= CTIME_KW", + /* 184 */ "expr ::= LP nexprlist COMMA expr RP", + /* 185 */ "expr ::= expr AND expr", + /* 186 */ "expr ::= expr OR expr", + /* 187 */ "expr ::= expr LT|GT|GE|LE expr", + /* 188 */ "expr ::= expr EQ|NE expr", + /* 189 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr", + /* 190 */ "expr ::= expr PLUS|MINUS expr", + /* 191 */ "expr ::= expr STAR|SLASH|REM expr", + /* 192 */ "expr ::= expr CONCAT expr", + /* 193 */ "likeop ::= NOT LIKE_KW|MATCH", + /* 194 */ "expr ::= expr likeop expr", + /* 195 */ "expr ::= expr likeop expr ESCAPE expr", + /* 196 */ "expr ::= expr ISNULL|NOTNULL", + /* 197 */ "expr ::= expr NOT NULL", + /* 198 */ "expr ::= expr IS expr", + /* 199 */ "expr ::= expr IS NOT expr", + /* 200 */ "expr ::= NOT expr", + /* 201 */ "expr ::= BITNOT expr", + /* 202 */ "expr ::= PLUS|MINUS expr", + /* 203 */ "between_op ::= BETWEEN", + /* 204 */ "between_op ::= NOT BETWEEN", + /* 205 */ "expr ::= expr between_op expr AND expr", + /* 206 */ "in_op ::= IN", + /* 207 */ "in_op ::= NOT IN", + /* 208 */ "expr ::= expr in_op LP exprlist RP", + /* 209 */ "expr ::= LP select RP", + /* 210 */ "expr ::= expr in_op LP select RP", + /* 211 */ "expr ::= expr in_op nm dbnm paren_exprlist", + /* 212 */ "expr ::= EXISTS LP select RP", + /* 213 */ "expr ::= CASE case_operand case_exprlist case_else END", + /* 214 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", + /* 215 */ "case_exprlist ::= WHEN expr THEN expr", + /* 216 */ "case_else ::= ELSE expr", + /* 217 */ "case_else ::=", + /* 218 */ "case_operand ::= expr", + /* 219 */ "case_operand ::=", + /* 220 */ "exprlist ::=", + /* 221 */ "nexprlist ::= nexprlist COMMA expr", + /* 222 */ "nexprlist ::= expr", + /* 223 */ "paren_exprlist ::=", + /* 224 */ "paren_exprlist ::= LP exprlist RP", + /* 225 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", + /* 226 */ "uniqueflag ::= UNIQUE", + /* 227 */ "uniqueflag ::=", + /* 228 */ "eidlist_opt ::=", + /* 229 */ "eidlist_opt ::= LP eidlist RP", + /* 230 */ "eidlist ::= eidlist COMMA nm collate sortorder", + /* 231 */ "eidlist ::= nm collate sortorder", + /* 232 */ "collate ::=", + /* 233 */ "collate ::= COLLATE ID|STRING", + /* 234 */ "cmd ::= DROP INDEX ifexists fullname", + /* 235 */ "cmd ::= VACUUM vinto", + /* 236 */ "cmd ::= VACUUM nm vinto", + /* 237 */ "vinto ::= INTO expr", + /* 238 */ "vinto ::=", + /* 239 */ "cmd ::= PRAGMA nm dbnm", + /* 240 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", + /* 241 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", + /* 242 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", + /* 243 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", + /* 244 */ "plus_num ::= PLUS INTEGER|FLOAT", + /* 245 */ "minus_num ::= MINUS INTEGER|FLOAT", + /* 246 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", + /* 247 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", + /* 248 */ "trigger_time ::= BEFORE|AFTER", + /* 249 */ "trigger_time ::= INSTEAD OF", + /* 250 */ "trigger_time ::=", + /* 251 */ "trigger_event ::= DELETE|INSERT", + /* 252 */ "trigger_event ::= UPDATE", + /* 253 */ "trigger_event ::= UPDATE OF idlist", + /* 254 */ "when_clause ::=", + /* 255 */ "when_clause ::= WHEN expr", + /* 256 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", + /* 257 */ "trigger_cmd_list ::= trigger_cmd SEMI", + /* 258 */ "trnm ::= nm DOT nm", + /* 259 */ "tridxby ::= INDEXED BY nm", + /* 260 */ "tridxby ::= NOT INDEXED", + /* 261 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt", + /* 262 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt", + /* 263 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt", + /* 264 */ "trigger_cmd ::= scanpt select scanpt", + /* 265 */ "expr ::= RAISE LP IGNORE RP", + /* 266 */ "expr ::= RAISE LP raisetype COMMA nm RP", + /* 267 */ "raisetype ::= ROLLBACK", + /* 268 */ "raisetype ::= ABORT", + /* 269 */ "raisetype ::= FAIL", + /* 270 */ "cmd ::= DROP TRIGGER ifexists fullname", + /* 271 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", + /* 272 */ "cmd ::= DETACH database_kw_opt expr", + /* 273 */ "key_opt ::=", + /* 274 */ "key_opt ::= KEY expr", + /* 275 */ "cmd ::= REINDEX", + /* 276 */ "cmd ::= REINDEX nm dbnm", + /* 277 */ "cmd ::= ANALYZE", + /* 278 */ "cmd ::= ANALYZE nm dbnm", + /* 279 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", + /* 280 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", + /* 281 */ "add_column_fullname ::= fullname", + /* 282 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm", + /* 283 */ "cmd ::= create_vtab", + /* 284 */ "cmd ::= create_vtab LP vtabarglist RP", + /* 285 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", + /* 286 */ "vtabarg ::=", + /* 287 */ "vtabargtoken ::= ANY", + /* 288 */ "vtabargtoken ::= lp anylist RP", + /* 289 */ "lp ::= LP", + /* 290 */ "with ::= WITH wqlist", + /* 291 */ "with ::= WITH RECURSIVE wqlist", + /* 292 */ "wqlist ::= nm eidlist_opt AS LP select RP", + /* 293 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP", + /* 294 */ "windowdefn_list ::= windowdefn", + /* 295 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn", + /* 296 */ "windowdefn ::= nm AS LP window RP", + /* 297 */ "window ::= PARTITION BY nexprlist orderby_opt frame_opt", + /* 298 */ "window ::= nm PARTITION BY nexprlist orderby_opt frame_opt", + /* 299 */ "window ::= ORDER BY sortlist frame_opt", + /* 300 */ "window ::= nm ORDER BY sortlist frame_opt", + /* 301 */ "window ::= frame_opt", + /* 302 */ "window ::= nm frame_opt", + /* 303 */ "frame_opt ::=", + /* 304 */ "frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt", + /* 305 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt", + /* 306 */ "range_or_rows ::= RANGE|ROWS|GROUPS", + /* 307 */ "frame_bound_s ::= frame_bound", + /* 308 */ "frame_bound_s ::= UNBOUNDED PRECEDING", + /* 309 */ "frame_bound_e ::= frame_bound", + /* 310 */ "frame_bound_e ::= UNBOUNDED FOLLOWING", + /* 311 */ "frame_bound ::= expr PRECEDING|FOLLOWING", + /* 312 */ "frame_bound ::= CURRENT ROW", + /* 313 */ "frame_exclude_opt ::=", + /* 314 */ "frame_exclude_opt ::= EXCLUDE frame_exclude", + /* 315 */ "frame_exclude ::= NO OTHERS", + /* 316 */ "frame_exclude ::= CURRENT ROW", + /* 317 */ "frame_exclude ::= GROUP|TIES", + /* 318 */ "window_clause ::= WINDOW windowdefn_list", + /* 319 */ "filter_over ::= filter_clause over_clause", + /* 320 */ "filter_over ::= over_clause", + /* 321 */ "filter_over ::= filter_clause", + /* 322 */ "over_clause ::= OVER LP window RP", + /* 323 */ "over_clause ::= OVER nm", + /* 324 */ "filter_clause ::= FILTER LP WHERE expr RP", + /* 325 */ "input ::= cmdlist", + /* 326 */ "cmdlist ::= cmdlist ecmd", + /* 327 */ "cmdlist ::= ecmd", + /* 328 */ "ecmd ::= SEMI", + /* 329 */ "ecmd ::= cmdx SEMI", + /* 330 */ "ecmd ::= explain cmdx SEMI", + /* 331 */ "trans_opt ::=", + /* 332 */ "trans_opt ::= TRANSACTION", + /* 333 */ "trans_opt ::= TRANSACTION nm", + /* 334 */ "savepoint_opt ::= SAVEPOINT", + /* 335 */ "savepoint_opt ::=", + /* 336 */ "cmd ::= create_table create_table_args", + /* 337 */ "columnlist ::= columnlist COMMA columnname carglist", + /* 338 */ "columnlist ::= columnname carglist", + /* 339 */ "nm ::= ID|INDEXED", + /* 340 */ "nm ::= STRING", + /* 341 */ "nm ::= JOIN_KW", + /* 342 */ "typetoken ::= typename", + /* 343 */ "typename ::= ID|STRING", + /* 344 */ "signed ::= plus_num", + /* 345 */ "signed ::= minus_num", + /* 346 */ "carglist ::= carglist ccons", + /* 347 */ "carglist ::=", + /* 348 */ "ccons ::= NULL onconf", + /* 349 */ "ccons ::= GENERATED ALWAYS AS generated", + /* 350 */ "ccons ::= AS generated", + /* 351 */ "conslist_opt ::= COMMA conslist", + /* 352 */ "conslist ::= conslist tconscomma tcons", + /* 353 */ "conslist ::= tcons", + /* 354 */ "tconscomma ::=", + /* 355 */ "defer_subclause_opt ::= defer_subclause", + /* 356 */ "resolvetype ::= raisetype", + /* 357 */ "selectnowith ::= oneselect", + /* 358 */ "oneselect ::= values", + /* 359 */ "sclp ::= selcollist COMMA", + /* 360 */ "as ::= ID|STRING", + /* 361 */ "expr ::= term", + /* 362 */ "likeop ::= LIKE_KW|MATCH", + /* 363 */ "exprlist ::= nexprlist", + /* 364 */ "nmnum ::= plus_num", + /* 365 */ "nmnum ::= nm", + /* 366 */ "nmnum ::= ON", + /* 367 */ "nmnum ::= DELETE", + /* 368 */ "nmnum ::= DEFAULT", + /* 369 */ "plus_num ::= INTEGER|FLOAT", + /* 370 */ "foreach_clause ::=", + /* 371 */ "foreach_clause ::= FOR EACH ROW", + /* 372 */ "trnm ::= nm", + /* 373 */ "tridxby ::=", + /* 374 */ "database_kw_opt ::= DATABASE", + /* 375 */ "database_kw_opt ::=", + /* 376 */ "kwcolumn_opt ::=", + /* 377 */ "kwcolumn_opt ::= COLUMNKW", + /* 378 */ "vtabarglist ::= vtabarg", + /* 379 */ "vtabarglist ::= vtabarglist COMMA vtabarg", + /* 380 */ "vtabarg ::= vtabarg vtabargtoken", + /* 381 */ "anylist ::=", + /* 382 */ "anylist ::= anylist LP anylist RP", + /* 383 */ "anylist ::= anylist ANY", + /* 384 */ "with ::=", }; #endif /* NDEBUG */ @@ -147800,96 +154359,98 @@ static void yy_destructor( ** inside the C code. */ /********* Begin destructor definitions ***************************************/ - case 174: /* select */ - case 206: /* selectnowith */ - case 207: /* oneselect */ - case 219: /* values */ + case 200: /* select */ + case 234: /* selectnowith */ + case 235: /* oneselect */ + case 247: /* values */ { -sqlite3SelectDelete(pParse->db, (yypminor->yy489)); +sqlite3SelectDelete(pParse->db, (yypminor->yy539)); } break; - case 184: /* term */ - case 185: /* expr */ - case 213: /* where_opt */ - case 215: /* having_opt */ - case 227: /* on_opt */ - case 242: /* case_operand */ - case 244: /* case_else */ - case 253: /* when_clause */ - case 258: /* key_opt */ - case 272: /* filter_opt */ + case 211: /* term */ + case 212: /* expr */ + case 241: /* where_opt */ + case 243: /* having_opt */ + case 255: /* on_opt */ + case 271: /* case_operand */ + case 273: /* case_else */ + case 276: /* vinto */ + case 283: /* when_clause */ + case 288: /* key_opt */ + case 302: /* filter_clause */ { -sqlite3ExprDelete(pParse->db, (yypminor->yy18)); +sqlite3ExprDelete(pParse->db, (yypminor->yy202)); } break; - case 189: /* eidlist_opt */ - case 198: /* sortlist */ - case 199: /* eidlist */ - case 211: /* selcollist */ - case 214: /* groupby_opt */ - case 216: /* orderby_opt */ - case 220: /* nexprlist */ - case 221: /* sclp */ - case 229: /* exprlist */ - case 233: /* setlist */ - case 241: /* paren_exprlist */ - case 243: /* case_exprlist */ - case 271: /* part_opt */ + case 216: /* eidlist_opt */ + case 226: /* sortlist */ + case 227: /* eidlist */ + case 239: /* selcollist */ + case 242: /* groupby_opt */ + case 244: /* orderby_opt */ + case 248: /* nexprlist */ + case 249: /* sclp */ + case 257: /* exprlist */ + case 262: /* setlist */ + case 270: /* paren_exprlist */ + case 272: /* case_exprlist */ + case 301: /* part_opt */ { -sqlite3ExprListDelete(pParse->db, (yypminor->yy420)); +sqlite3ExprListDelete(pParse->db, (yypminor->yy242)); } break; - case 205: /* fullname */ - case 212: /* from */ - case 223: /* seltablist */ - case 224: /* stl_prefix */ - case 230: /* xfullname */ + case 233: /* fullname */ + case 240: /* from */ + case 251: /* seltablist */ + case 252: /* stl_prefix */ + case 258: /* xfullname */ { -sqlite3SrcListDelete(pParse->db, (yypminor->yy135)); +sqlite3SrcListDelete(pParse->db, (yypminor->yy47)); } break; - case 208: /* wqlist */ + case 236: /* wqlist */ { -sqlite3WithDelete(pParse->db, (yypminor->yy449)); +sqlite3WithDelete(pParse->db, (yypminor->yy131)); } break; - case 218: /* window_clause */ - case 267: /* windowdefn_list */ + case 246: /* window_clause */ + case 297: /* windowdefn_list */ { -sqlite3WindowListDelete(pParse->db, (yypminor->yy327)); +sqlite3WindowListDelete(pParse->db, (yypminor->yy303)); } break; - case 228: /* using_opt */ - case 231: /* idlist */ - case 235: /* idlist_opt */ + case 256: /* using_opt */ + case 259: /* idlist */ + case 264: /* idlist_opt */ { -sqlite3IdListDelete(pParse->db, (yypminor->yy48)); +sqlite3IdListDelete(pParse->db, (yypminor->yy600)); } break; - case 237: /* over_clause */ - case 268: /* windowdefn */ - case 269: /* window */ - case 270: /* frame_opt */ + case 266: /* filter_over */ + case 298: /* windowdefn */ + case 299: /* window */ + case 300: /* frame_opt */ + case 303: /* over_clause */ { -sqlite3WindowDelete(pParse->db, (yypminor->yy327)); +sqlite3WindowDelete(pParse->db, (yypminor->yy303)); } break; - case 249: /* trigger_cmd_list */ - case 254: /* trigger_cmd */ + case 279: /* trigger_cmd_list */ + case 284: /* trigger_cmd */ { -sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy207)); +sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy447)); } break; - case 251: /* trigger_event */ + case 281: /* trigger_event */ { -sqlite3IdListDelete(pParse->db, (yypminor->yy34).b); +sqlite3IdListDelete(pParse->db, (yypminor->yy230).b); } break; - case 274: /* frame_bound */ - case 275: /* frame_bound_s */ - case 276: /* frame_bound_e */ + case 305: /* frame_bound */ + case 306: /* frame_bound_s */ + case 307: /* frame_bound_e */ { -sqlite3ExprDelete(pParse->db, (yypminor->yy119).pExpr); +sqlite3ExprDelete(pParse->db, (yypminor->yy77).pExpr); } break; /********* End destructor definitions *****************************************/ @@ -148015,15 +154576,18 @@ static YYACTIONTYPE yy_find_shift_action( do{ i = yy_shift_ofst[stateno]; assert( i>=0 ); - /* assert( i+YYNTOKEN<=(int)YY_NLOOKAHEAD ); */ + assert( i<=YY_ACTTAB_COUNT ); + assert( i+YYNTOKEN<=(int)YY_NLOOKAHEAD ); assert( iLookAhead!=YYNOCODE ); assert( iLookAhead < YYNTOKEN ); i += iLookAhead; - if( i>=YY_NLOOKAHEAD || yy_lookahead[i]!=iLookAhead ){ + assert( i<(int)YY_NLOOKAHEAD ); + if( yy_lookahead[i]!=iLookAhead ){ #ifdef YYFALLBACK YYCODETYPE iFallback; /* Fallback token */ - if( iLookAhead %s\n", @@ -148038,16 +154602,8 @@ static YYACTIONTYPE yy_find_shift_action( #ifdef YYWILDCARD { int j = i - iLookAhead + YYWILDCARD; - if( -#if YY_SHIFT_MIN+YYWILDCARD<0 - j>=0 && -#endif -#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT - j0 - ){ + assert( j<(int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])) ); + if( yy_lookahead[j]==YYWILDCARD && iLookAhead>0 ){ #ifndef NDEBUG if( yyTraceFILE ){ fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", @@ -148061,6 +154617,7 @@ static YYACTIONTYPE yy_find_shift_action( #endif /* YYWILDCARD */ return yy_default[stateno]; }else{ + assert( i>=0 && iyytos; #ifndef NDEBUG if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ - yysize = yyRuleInfo[yyruleno].nrhs; + yysize = yyRuleInfoNRhs[yyruleno]; if( yysize ){ - fprintf(yyTraceFILE, "%sReduce %d [%s], go to state %d.\n", + fprintf(yyTraceFILE, "%sReduce %d [%s]%s, pop back to state %d.\n", yyTracePrompt, - yyruleno, yyRuleName[yyruleno], yymsp[yysize].stateno); + yyruleno, yyRuleName[yyruleno], + yyrulenoyytos - yypParser->yystack)>yypParser->yyhwm ){ yypParser->yyhwm++; @@ -148651,15 +155615,16 @@ static YYACTIONTYPE yy_reduce( { sqlite3FinishCoding(pParse); } break; case 3: /* cmd ::= BEGIN transtype trans_opt */ -{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy70);} +{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy192);} break; case 4: /* transtype ::= */ -{yymsp[1].minor.yy70 = TK_DEFERRED;} +{yymsp[1].minor.yy192 = TK_DEFERRED;} break; case 5: /* transtype ::= DEFERRED */ case 6: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==6); case 7: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==7); -{yymsp[0].minor.yy70 = yymsp[0].major; /*A-overwrites-X*/} + case 306: /* range_or_rows ::= RANGE|ROWS|GROUPS */ yytestcase(yyruleno==306); +{yymsp[0].minor.yy192 = yymsp[0].major; /*A-overwrites-X*/} break; case 8: /* cmd ::= COMMIT|END trans_opt */ case 9: /* cmd ::= ROLLBACK trans_opt */ yytestcase(yyruleno==9); @@ -148682,7 +155647,7 @@ static YYACTIONTYPE yy_reduce( break; case 13: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */ { - sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy70,0,0,yymsp[-2].minor.yy70); + sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy192,0,0,yymsp[-2].minor.yy192); } break; case 14: /* createkw ::= CREATE */ @@ -148691,38 +155656,38 @@ static YYACTIONTYPE yy_reduce( case 15: /* ifnotexists ::= */ case 18: /* temp ::= */ yytestcase(yyruleno==18); case 21: /* table_options ::= */ yytestcase(yyruleno==21); - case 42: /* autoinc ::= */ yytestcase(yyruleno==42); - case 57: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==57); - case 67: /* defer_subclause_opt ::= */ yytestcase(yyruleno==67); - case 76: /* ifexists ::= */ yytestcase(yyruleno==76); - case 93: /* distinct ::= */ yytestcase(yyruleno==93); - case 226: /* collate ::= */ yytestcase(yyruleno==226); -{yymsp[1].minor.yy70 = 0;} + case 45: /* autoinc ::= */ yytestcase(yyruleno==45); + case 60: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==60); + case 70: /* defer_subclause_opt ::= */ yytestcase(yyruleno==70); + case 79: /* ifexists ::= */ yytestcase(yyruleno==79); + case 96: /* distinct ::= */ yytestcase(yyruleno==96); + case 232: /* collate ::= */ yytestcase(yyruleno==232); +{yymsp[1].minor.yy192 = 0;} break; case 16: /* ifnotexists ::= IF NOT EXISTS */ -{yymsp[-2].minor.yy70 = 1;} +{yymsp[-2].minor.yy192 = 1;} break; case 17: /* temp ::= TEMP */ - case 43: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==43); -{yymsp[0].minor.yy70 = 1;} + case 46: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==46); +{yymsp[0].minor.yy192 = 1;} break; case 19: /* create_table_args ::= LP columnlist conslist_opt RP table_options */ { - sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy70,0); + sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy192,0); } break; case 20: /* create_table_args ::= AS select */ { - sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy489); - sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy489); + sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy539); + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy539); } break; case 22: /* table_options ::= WITHOUT nm */ { if( yymsp[0].minor.yy0.n==5 && sqlite3_strnicmp(yymsp[0].minor.yy0.z,"rowid",5)==0 ){ - yymsp[-1].minor.yy70 = TF_WithoutRowid | TF_NoVisibleRowid; + yymsp[-1].minor.yy192 = TF_WithoutRowid | TF_NoVisibleRowid; }else{ - yymsp[-1].minor.yy70 = 0; + yymsp[-1].minor.yy192 = 0; sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z); } } @@ -148731,8 +155696,8 @@ static YYACTIONTYPE yy_reduce( {sqlite3AddColumn(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);} break; case 24: /* typetoken ::= */ - case 60: /* conslist_opt ::= */ yytestcase(yyruleno==60); - case 99: /* as ::= */ yytestcase(yyruleno==99); + case 63: /* conslist_opt ::= */ yytestcase(yyruleno==63); + case 102: /* as ::= */ yytestcase(yyruleno==102); {yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = 0;} break; case 25: /* typetoken ::= typename LP signed RP */ @@ -148751,29 +155716,35 @@ static YYACTIONTYPE yy_reduce( case 28: /* scanpt ::= */ { assert( yyLookahead!=YYNOCODE ); - yymsp[1].minor.yy392 = yyLookaheadToken.z; + yymsp[1].minor.yy436 = yyLookaheadToken.z; +} + break; + case 29: /* scantok ::= */ +{ + assert( yyLookahead!=YYNOCODE ); + yymsp[1].minor.yy0 = yyLookaheadToken; } break; - case 29: /* ccons ::= CONSTRAINT nm */ - case 62: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==62); + case 30: /* ccons ::= CONSTRAINT nm */ + case 65: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==65); {pParse->constraintName = yymsp[0].minor.yy0;} break; - case 30: /* ccons ::= DEFAULT scanpt term scanpt */ -{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy18,yymsp[-2].minor.yy392,yymsp[0].minor.yy392);} + case 31: /* ccons ::= DEFAULT scantok term */ +{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy202,yymsp[-1].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} break; - case 31: /* ccons ::= DEFAULT LP expr RP */ -{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy18,yymsp[-2].minor.yy0.z+1,yymsp[0].minor.yy0.z);} + case 32: /* ccons ::= DEFAULT LP expr RP */ +{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy202,yymsp[-2].minor.yy0.z+1,yymsp[0].minor.yy0.z);} break; - case 32: /* ccons ::= DEFAULT PLUS term scanpt */ -{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy18,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy392);} + case 33: /* ccons ::= DEFAULT PLUS scantok term */ +{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy202,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} break; - case 33: /* ccons ::= DEFAULT MINUS term scanpt */ + case 34: /* ccons ::= DEFAULT MINUS scantok term */ { - Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[-1].minor.yy18, 0); - sqlite3AddDefaultValue(pParse,p,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy392); + Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy202, 0); + sqlite3AddDefaultValue(pParse,p,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]); } break; - case 34: /* ccons ::= DEFAULT scanpt ID|INDEXED */ + case 35: /* ccons ::= DEFAULT scantok ID|INDEXED */ { Expr *p = tokenExpr(pParse, TK_STRING, yymsp[0].minor.yy0); if( p ){ @@ -148783,171 +155754,177 @@ static YYACTIONTYPE yy_reduce( sqlite3AddDefaultValue(pParse,p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.z+yymsp[0].minor.yy0.n); } break; - case 35: /* ccons ::= NOT NULL onconf */ -{sqlite3AddNotNull(pParse, yymsp[0].minor.yy70);} + case 36: /* ccons ::= NOT NULL onconf */ +{sqlite3AddNotNull(pParse, yymsp[0].minor.yy192);} break; - case 36: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */ -{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy70,yymsp[0].minor.yy70,yymsp[-2].minor.yy70);} + case 37: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */ +{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy192,yymsp[0].minor.yy192,yymsp[-2].minor.yy192);} break; - case 37: /* ccons ::= UNIQUE onconf */ -{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy70,0,0,0,0, + case 38: /* ccons ::= UNIQUE onconf */ +{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy192,0,0,0,0, SQLITE_IDXTYPE_UNIQUE);} break; - case 38: /* ccons ::= CHECK LP expr RP */ -{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy18);} + case 39: /* ccons ::= CHECK LP expr RP */ +{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy202);} break; - case 39: /* ccons ::= REFERENCES nm eidlist_opt refargs */ -{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy420,yymsp[0].minor.yy70);} + case 40: /* ccons ::= REFERENCES nm eidlist_opt refargs */ +{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy242,yymsp[0].minor.yy192);} break; - case 40: /* ccons ::= defer_subclause */ -{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy70);} + case 41: /* ccons ::= defer_subclause */ +{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy192);} break; - case 41: /* ccons ::= COLLATE ID|STRING */ + case 42: /* ccons ::= COLLATE ID|STRING */ {sqlite3AddCollateType(pParse, &yymsp[0].minor.yy0);} break; - case 44: /* refargs ::= */ -{ yymsp[1].minor.yy70 = OE_None*0x0101; /* EV: R-19803-45884 */} + case 43: /* generated ::= LP expr RP */ +{sqlite3AddGenerated(pParse,yymsp[-1].minor.yy202,0);} + break; + case 44: /* generated ::= LP expr RP ID */ +{sqlite3AddGenerated(pParse,yymsp[-2].minor.yy202,&yymsp[0].minor.yy0);} break; - case 45: /* refargs ::= refargs refarg */ -{ yymsp[-1].minor.yy70 = (yymsp[-1].minor.yy70 & ~yymsp[0].minor.yy111.mask) | yymsp[0].minor.yy111.value; } + case 47: /* refargs ::= */ +{ yymsp[1].minor.yy192 = OE_None*0x0101; /* EV: R-19803-45884 */} break; - case 46: /* refarg ::= MATCH nm */ -{ yymsp[-1].minor.yy111.value = 0; yymsp[-1].minor.yy111.mask = 0x000000; } + case 48: /* refargs ::= refargs refarg */ +{ yymsp[-1].minor.yy192 = (yymsp[-1].minor.yy192 & ~yymsp[0].minor.yy207.mask) | yymsp[0].minor.yy207.value; } break; - case 47: /* refarg ::= ON INSERT refact */ -{ yymsp[-2].minor.yy111.value = 0; yymsp[-2].minor.yy111.mask = 0x000000; } + case 49: /* refarg ::= MATCH nm */ +{ yymsp[-1].minor.yy207.value = 0; yymsp[-1].minor.yy207.mask = 0x000000; } break; - case 48: /* refarg ::= ON DELETE refact */ -{ yymsp[-2].minor.yy111.value = yymsp[0].minor.yy70; yymsp[-2].minor.yy111.mask = 0x0000ff; } + case 50: /* refarg ::= ON INSERT refact */ +{ yymsp[-2].minor.yy207.value = 0; yymsp[-2].minor.yy207.mask = 0x000000; } break; - case 49: /* refarg ::= ON UPDATE refact */ -{ yymsp[-2].minor.yy111.value = yymsp[0].minor.yy70<<8; yymsp[-2].minor.yy111.mask = 0x00ff00; } + case 51: /* refarg ::= ON DELETE refact */ +{ yymsp[-2].minor.yy207.value = yymsp[0].minor.yy192; yymsp[-2].minor.yy207.mask = 0x0000ff; } break; - case 50: /* refact ::= SET NULL */ -{ yymsp[-1].minor.yy70 = OE_SetNull; /* EV: R-33326-45252 */} + case 52: /* refarg ::= ON UPDATE refact */ +{ yymsp[-2].minor.yy207.value = yymsp[0].minor.yy192<<8; yymsp[-2].minor.yy207.mask = 0x00ff00; } break; - case 51: /* refact ::= SET DEFAULT */ -{ yymsp[-1].minor.yy70 = OE_SetDflt; /* EV: R-33326-45252 */} + case 53: /* refact ::= SET NULL */ +{ yymsp[-1].minor.yy192 = OE_SetNull; /* EV: R-33326-45252 */} break; - case 52: /* refact ::= CASCADE */ -{ yymsp[0].minor.yy70 = OE_Cascade; /* EV: R-33326-45252 */} + case 54: /* refact ::= SET DEFAULT */ +{ yymsp[-1].minor.yy192 = OE_SetDflt; /* EV: R-33326-45252 */} break; - case 53: /* refact ::= RESTRICT */ -{ yymsp[0].minor.yy70 = OE_Restrict; /* EV: R-33326-45252 */} + case 55: /* refact ::= CASCADE */ +{ yymsp[0].minor.yy192 = OE_Cascade; /* EV: R-33326-45252 */} break; - case 54: /* refact ::= NO ACTION */ -{ yymsp[-1].minor.yy70 = OE_None; /* EV: R-33326-45252 */} + case 56: /* refact ::= RESTRICT */ +{ yymsp[0].minor.yy192 = OE_Restrict; /* EV: R-33326-45252 */} break; - case 55: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ -{yymsp[-2].minor.yy70 = 0;} + case 57: /* refact ::= NO ACTION */ +{ yymsp[-1].minor.yy192 = OE_None; /* EV: R-33326-45252 */} break; - case 56: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ - case 71: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==71); - case 156: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==156); -{yymsp[-1].minor.yy70 = yymsp[0].minor.yy70;} + case 58: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ +{yymsp[-2].minor.yy192 = 0;} break; - case 58: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ - case 75: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==75); - case 198: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==198); - case 201: /* in_op ::= NOT IN */ yytestcase(yyruleno==201); - case 227: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==227); -{yymsp[-1].minor.yy70 = 1;} + case 59: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ + case 74: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==74); + case 162: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==162); +{yymsp[-1].minor.yy192 = yymsp[0].minor.yy192;} break; - case 59: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ -{yymsp[-1].minor.yy70 = 0;} + case 61: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ + case 78: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==78); + case 204: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==204); + case 207: /* in_op ::= NOT IN */ yytestcase(yyruleno==207); + case 233: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==233); +{yymsp[-1].minor.yy192 = 1;} break; - case 61: /* tconscomma ::= COMMA */ + case 62: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ +{yymsp[-1].minor.yy192 = 0;} + break; + case 64: /* tconscomma ::= COMMA */ {pParse->constraintName.n = 0;} break; - case 63: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ -{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy420,yymsp[0].minor.yy70,yymsp[-2].minor.yy70,0);} + case 66: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ +{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy242,yymsp[0].minor.yy192,yymsp[-2].minor.yy192,0);} break; - case 64: /* tcons ::= UNIQUE LP sortlist RP onconf */ -{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy420,yymsp[0].minor.yy70,0,0,0,0, + case 67: /* tcons ::= UNIQUE LP sortlist RP onconf */ +{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy242,yymsp[0].minor.yy192,0,0,0,0, SQLITE_IDXTYPE_UNIQUE);} break; - case 65: /* tcons ::= CHECK LP expr RP onconf */ -{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy18);} + case 68: /* tcons ::= CHECK LP expr RP onconf */ +{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy202);} break; - case 66: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ + case 69: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ { - sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy420, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy420, yymsp[-1].minor.yy70); - sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy70); + sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy242, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy242, yymsp[-1].minor.yy192); + sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy192); } break; - case 68: /* onconf ::= */ - case 70: /* orconf ::= */ yytestcase(yyruleno==70); -{yymsp[1].minor.yy70 = OE_Default;} + case 71: /* onconf ::= */ + case 73: /* orconf ::= */ yytestcase(yyruleno==73); +{yymsp[1].minor.yy192 = OE_Default;} break; - case 69: /* onconf ::= ON CONFLICT resolvetype */ -{yymsp[-2].minor.yy70 = yymsp[0].minor.yy70;} + case 72: /* onconf ::= ON CONFLICT resolvetype */ +{yymsp[-2].minor.yy192 = yymsp[0].minor.yy192;} break; - case 72: /* resolvetype ::= IGNORE */ -{yymsp[0].minor.yy70 = OE_Ignore;} + case 75: /* resolvetype ::= IGNORE */ +{yymsp[0].minor.yy192 = OE_Ignore;} break; - case 73: /* resolvetype ::= REPLACE */ - case 157: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==157); -{yymsp[0].minor.yy70 = OE_Replace;} + case 76: /* resolvetype ::= REPLACE */ + case 163: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==163); +{yymsp[0].minor.yy192 = OE_Replace;} break; - case 74: /* cmd ::= DROP TABLE ifexists fullname */ + case 77: /* cmd ::= DROP TABLE ifexists fullname */ { - sqlite3DropTable(pParse, yymsp[0].minor.yy135, 0, yymsp[-1].minor.yy70); + sqlite3DropTable(pParse, yymsp[0].minor.yy47, 0, yymsp[-1].minor.yy192); } break; - case 77: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ + case 80: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ { - sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy420, yymsp[0].minor.yy489, yymsp[-7].minor.yy70, yymsp[-5].minor.yy70); + sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy242, yymsp[0].minor.yy539, yymsp[-7].minor.yy192, yymsp[-5].minor.yy192); } break; - case 78: /* cmd ::= DROP VIEW ifexists fullname */ + case 81: /* cmd ::= DROP VIEW ifexists fullname */ { - sqlite3DropTable(pParse, yymsp[0].minor.yy135, 1, yymsp[-1].minor.yy70); + sqlite3DropTable(pParse, yymsp[0].minor.yy47, 1, yymsp[-1].minor.yy192); } break; - case 79: /* cmd ::= select */ + case 82: /* cmd ::= select */ { SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0}; - sqlite3Select(pParse, yymsp[0].minor.yy489, &dest); - sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy489); + sqlite3Select(pParse, yymsp[0].minor.yy539, &dest); + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy539); } break; - case 80: /* select ::= WITH wqlist selectnowith */ + case 83: /* select ::= WITH wqlist selectnowith */ { - Select *p = yymsp[0].minor.yy489; + Select *p = yymsp[0].minor.yy539; if( p ){ - p->pWith = yymsp[-1].minor.yy449; + p->pWith = yymsp[-1].minor.yy131; parserDoubleLinkSelect(pParse, p); }else{ - sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy449); + sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy131); } - yymsp[-2].minor.yy489 = p; + yymsp[-2].minor.yy539 = p; } break; - case 81: /* select ::= WITH RECURSIVE wqlist selectnowith */ + case 84: /* select ::= WITH RECURSIVE wqlist selectnowith */ { - Select *p = yymsp[0].minor.yy489; + Select *p = yymsp[0].minor.yy539; if( p ){ - p->pWith = yymsp[-1].minor.yy449; + p->pWith = yymsp[-1].minor.yy131; parserDoubleLinkSelect(pParse, p); }else{ - sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy449); + sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy131); } - yymsp[-3].minor.yy489 = p; + yymsp[-3].minor.yy539 = p; } break; - case 82: /* select ::= selectnowith */ + case 85: /* select ::= selectnowith */ { - Select *p = yymsp[0].minor.yy489; + Select *p = yymsp[0].minor.yy539; if( p ){ parserDoubleLinkSelect(pParse, p); } - yymsp[0].minor.yy489 = p; /*A-overwrites-X*/ + yymsp[0].minor.yy539 = p; /*A-overwrites-X*/ } break; - case 83: /* selectnowith ::= selectnowith multiselect_op oneselect */ + case 86: /* selectnowith ::= selectnowith multiselect_op oneselect */ { - Select *pRhs = yymsp[0].minor.yy489; - Select *pLhs = yymsp[-2].minor.yy489; + Select *pRhs = yymsp[0].minor.yy539; + Select *pLhs = yymsp[-2].minor.yy539; if( pRhs && pRhs->pPrior ){ SrcList *pFrom; Token x; @@ -148957,341 +155934,356 @@ static YYACTIONTYPE yy_reduce( pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0); } if( pRhs ){ - pRhs->op = (u8)yymsp[-1].minor.yy70; + pRhs->op = (u8)yymsp[-1].minor.yy192; pRhs->pPrior = pLhs; if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue; pRhs->selFlags &= ~SF_MultiValue; - if( yymsp[-1].minor.yy70!=TK_ALL ) pParse->hasCompound = 1; + if( yymsp[-1].minor.yy192!=TK_ALL ) pParse->hasCompound = 1; }else{ sqlite3SelectDelete(pParse->db, pLhs); } - yymsp[-2].minor.yy489 = pRhs; + yymsp[-2].minor.yy539 = pRhs; } break; - case 84: /* multiselect_op ::= UNION */ - case 86: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==86); -{yymsp[0].minor.yy70 = yymsp[0].major; /*A-overwrites-OP*/} + case 87: /* multiselect_op ::= UNION */ + case 89: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==89); +{yymsp[0].minor.yy192 = yymsp[0].major; /*A-overwrites-OP*/} break; - case 85: /* multiselect_op ::= UNION ALL */ -{yymsp[-1].minor.yy70 = TK_ALL;} + case 88: /* multiselect_op ::= UNION ALL */ +{yymsp[-1].minor.yy192 = TK_ALL;} break; - case 87: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ + case 90: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ { - yymsp[-8].minor.yy489 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy420,yymsp[-5].minor.yy135,yymsp[-4].minor.yy18,yymsp[-3].minor.yy420,yymsp[-2].minor.yy18,yymsp[-1].minor.yy420,yymsp[-7].minor.yy70,yymsp[0].minor.yy18); + yymsp[-8].minor.yy539 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy242,yymsp[-5].minor.yy47,yymsp[-4].minor.yy202,yymsp[-3].minor.yy242,yymsp[-2].minor.yy202,yymsp[-1].minor.yy242,yymsp[-7].minor.yy192,yymsp[0].minor.yy202); } break; - case 88: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ + case 91: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ { - yymsp[-9].minor.yy489 = sqlite3SelectNew(pParse,yymsp[-7].minor.yy420,yymsp[-6].minor.yy135,yymsp[-5].minor.yy18,yymsp[-4].minor.yy420,yymsp[-3].minor.yy18,yymsp[-1].minor.yy420,yymsp[-8].minor.yy70,yymsp[0].minor.yy18); - if( yymsp[-9].minor.yy489 ){ - yymsp[-9].minor.yy489->pWinDefn = yymsp[-2].minor.yy327; + yymsp[-9].minor.yy539 = sqlite3SelectNew(pParse,yymsp[-7].minor.yy242,yymsp[-6].minor.yy47,yymsp[-5].minor.yy202,yymsp[-4].minor.yy242,yymsp[-3].minor.yy202,yymsp[-1].minor.yy242,yymsp[-8].minor.yy192,yymsp[0].minor.yy202); + if( yymsp[-9].minor.yy539 ){ + yymsp[-9].minor.yy539->pWinDefn = yymsp[-2].minor.yy303; }else{ - sqlite3WindowListDelete(pParse->db, yymsp[-2].minor.yy327); + sqlite3WindowListDelete(pParse->db, yymsp[-2].minor.yy303); } } break; - case 89: /* values ::= VALUES LP nexprlist RP */ + case 92: /* values ::= VALUES LP nexprlist RP */ { - yymsp[-3].minor.yy489 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy420,0,0,0,0,0,SF_Values,0); + yymsp[-3].minor.yy539 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy242,0,0,0,0,0,SF_Values,0); } break; - case 90: /* values ::= values COMMA LP nexprlist RP */ + case 93: /* values ::= values COMMA LP nexprlist RP */ { - Select *pRight, *pLeft = yymsp[-4].minor.yy489; - pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy420,0,0,0,0,0,SF_Values|SF_MultiValue,0); + Select *pRight, *pLeft = yymsp[-4].minor.yy539; + pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy242,0,0,0,0,0,SF_Values|SF_MultiValue,0); if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue; if( pRight ){ pRight->op = TK_ALL; pRight->pPrior = pLeft; - yymsp[-4].minor.yy489 = pRight; + yymsp[-4].minor.yy539 = pRight; }else{ - yymsp[-4].minor.yy489 = pLeft; + yymsp[-4].minor.yy539 = pLeft; } } break; - case 91: /* distinct ::= DISTINCT */ -{yymsp[0].minor.yy70 = SF_Distinct;} + case 94: /* distinct ::= DISTINCT */ +{yymsp[0].minor.yy192 = SF_Distinct;} break; - case 92: /* distinct ::= ALL */ -{yymsp[0].minor.yy70 = SF_All;} + case 95: /* distinct ::= ALL */ +{yymsp[0].minor.yy192 = SF_All;} break; - case 94: /* sclp ::= */ - case 127: /* orderby_opt ::= */ yytestcase(yyruleno==127); - case 134: /* groupby_opt ::= */ yytestcase(yyruleno==134); - case 214: /* exprlist ::= */ yytestcase(yyruleno==214); - case 217: /* paren_exprlist ::= */ yytestcase(yyruleno==217); - case 222: /* eidlist_opt ::= */ yytestcase(yyruleno==222); -{yymsp[1].minor.yy420 = 0;} + case 97: /* sclp ::= */ + case 130: /* orderby_opt ::= */ yytestcase(yyruleno==130); + case 140: /* groupby_opt ::= */ yytestcase(yyruleno==140); + case 220: /* exprlist ::= */ yytestcase(yyruleno==220); + case 223: /* paren_exprlist ::= */ yytestcase(yyruleno==223); + case 228: /* eidlist_opt ::= */ yytestcase(yyruleno==228); +{yymsp[1].minor.yy242 = 0;} break; - case 95: /* selcollist ::= sclp scanpt expr scanpt as */ + case 98: /* selcollist ::= sclp scanpt expr scanpt as */ { - yymsp[-4].minor.yy420 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy420, yymsp[-2].minor.yy18); - if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy420, &yymsp[0].minor.yy0, 1); - sqlite3ExprListSetSpan(pParse,yymsp[-4].minor.yy420,yymsp[-3].minor.yy392,yymsp[-1].minor.yy392); + yymsp[-4].minor.yy242 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy242, yymsp[-2].minor.yy202); + if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy242, &yymsp[0].minor.yy0, 1); + sqlite3ExprListSetSpan(pParse,yymsp[-4].minor.yy242,yymsp[-3].minor.yy436,yymsp[-1].minor.yy436); } break; - case 96: /* selcollist ::= sclp scanpt STAR */ + case 99: /* selcollist ::= sclp scanpt STAR */ { Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0); - yymsp[-2].minor.yy420 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy420, p); + yymsp[-2].minor.yy242 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy242, p); } break; - case 97: /* selcollist ::= sclp scanpt nm DOT STAR */ + case 100: /* selcollist ::= sclp scanpt nm DOT STAR */ { Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0); Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); - yymsp[-4].minor.yy420 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy420, pDot); + yymsp[-4].minor.yy242 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy242, pDot); } break; - case 98: /* as ::= AS nm */ - case 109: /* dbnm ::= DOT nm */ yytestcase(yyruleno==109); - case 236: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==236); - case 237: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==237); + case 101: /* as ::= AS nm */ + case 112: /* dbnm ::= DOT nm */ yytestcase(yyruleno==112); + case 244: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==244); + case 245: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==245); {yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;} break; - case 100: /* from ::= */ -{yymsp[1].minor.yy135 = sqlite3DbMallocZero(pParse->db, sizeof(*yymsp[1].minor.yy135));} + case 103: /* from ::= */ +{yymsp[1].minor.yy47 = sqlite3DbMallocZero(pParse->db, sizeof(*yymsp[1].minor.yy47));} break; - case 101: /* from ::= FROM seltablist */ + case 104: /* from ::= FROM seltablist */ { - yymsp[-1].minor.yy135 = yymsp[0].minor.yy135; - sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy135); + yymsp[-1].minor.yy47 = yymsp[0].minor.yy47; + sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy47); } break; - case 102: /* stl_prefix ::= seltablist joinop */ + case 105: /* stl_prefix ::= seltablist joinop */ { - if( ALWAYS(yymsp[-1].minor.yy135 && yymsp[-1].minor.yy135->nSrc>0) ) yymsp[-1].minor.yy135->a[yymsp[-1].minor.yy135->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy70; + if( ALWAYS(yymsp[-1].minor.yy47 && yymsp[-1].minor.yy47->nSrc>0) ) yymsp[-1].minor.yy47->a[yymsp[-1].minor.yy47->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy192; } break; - case 103: /* stl_prefix ::= */ -{yymsp[1].minor.yy135 = 0;} + case 106: /* stl_prefix ::= */ +{yymsp[1].minor.yy47 = 0;} break; - case 104: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ + case 107: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ { - yymsp[-6].minor.yy135 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy135,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy18,yymsp[0].minor.yy48); - sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy135, &yymsp[-2].minor.yy0); + yymsp[-6].minor.yy47 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy47,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy202,yymsp[0].minor.yy600); + sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy47, &yymsp[-2].minor.yy0); } break; - case 105: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ + case 108: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ { - yymsp[-8].minor.yy135 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy135,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy18,yymsp[0].minor.yy48); - sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy135, yymsp[-4].minor.yy420); + yymsp[-8].minor.yy47 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy47,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy202,yymsp[0].minor.yy600); + sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy47, yymsp[-4].minor.yy242); } break; - case 106: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */ + case 109: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */ { - yymsp[-6].minor.yy135 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy135,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy489,yymsp[-1].minor.yy18,yymsp[0].minor.yy48); + yymsp[-6].minor.yy47 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy47,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy539,yymsp[-1].minor.yy202,yymsp[0].minor.yy600); } break; - case 107: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ + case 110: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ { - if( yymsp[-6].minor.yy135==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy18==0 && yymsp[0].minor.yy48==0 ){ - yymsp[-6].minor.yy135 = yymsp[-4].minor.yy135; - }else if( yymsp[-4].minor.yy135->nSrc==1 ){ - yymsp[-6].minor.yy135 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy135,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy18,yymsp[0].minor.yy48); - if( yymsp[-6].minor.yy135 ){ - struct SrcList_item *pNew = &yymsp[-6].minor.yy135->a[yymsp[-6].minor.yy135->nSrc-1]; - struct SrcList_item *pOld = yymsp[-4].minor.yy135->a; + if( yymsp[-6].minor.yy47==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy202==0 && yymsp[0].minor.yy600==0 ){ + yymsp[-6].minor.yy47 = yymsp[-4].minor.yy47; + }else if( yymsp[-4].minor.yy47->nSrc==1 ){ + yymsp[-6].minor.yy47 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy47,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy202,yymsp[0].minor.yy600); + if( yymsp[-6].minor.yy47 ){ + struct SrcList_item *pNew = &yymsp[-6].minor.yy47->a[yymsp[-6].minor.yy47->nSrc-1]; + struct SrcList_item *pOld = yymsp[-4].minor.yy47->a; pNew->zName = pOld->zName; pNew->zDatabase = pOld->zDatabase; pNew->pSelect = pOld->pSelect; + if( pOld->fg.isTabFunc ){ + pNew->u1.pFuncArg = pOld->u1.pFuncArg; + pOld->u1.pFuncArg = 0; + pOld->fg.isTabFunc = 0; + pNew->fg.isTabFunc = 1; + } pOld->zName = pOld->zDatabase = 0; pOld->pSelect = 0; } - sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy135); + sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy47); }else{ Select *pSubquery; - sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy135); - pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy135,0,0,0,0,SF_NestedFrom,0); - yymsp[-6].minor.yy135 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy135,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy18,yymsp[0].minor.yy48); + sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy47); + pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy47,0,0,0,0,SF_NestedFrom,0); + yymsp[-6].minor.yy47 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy47,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy202,yymsp[0].minor.yy600); } } break; - case 108: /* dbnm ::= */ - case 122: /* indexed_opt ::= */ yytestcase(yyruleno==122); + case 111: /* dbnm ::= */ + case 125: /* indexed_opt ::= */ yytestcase(yyruleno==125); {yymsp[1].minor.yy0.z=0; yymsp[1].minor.yy0.n=0;} break; - case 110: /* fullname ::= nm */ + case 113: /* fullname ::= nm */ { - yylhsminor.yy135 = sqlite3SrcListAppend(pParse->db,0,&yymsp[0].minor.yy0,0); - if( IN_RENAME_OBJECT && yylhsminor.yy135 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy135->a[0].zName, &yymsp[0].minor.yy0); + yylhsminor.yy47 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); + if( IN_RENAME_OBJECT && yylhsminor.yy47 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy47->a[0].zName, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy135 = yylhsminor.yy135; + yymsp[0].minor.yy47 = yylhsminor.yy47; break; - case 111: /* fullname ::= nm DOT nm */ + case 114: /* fullname ::= nm DOT nm */ { - yylhsminor.yy135 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); - if( IN_RENAME_OBJECT && yylhsminor.yy135 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy135->a[0].zName, &yymsp[0].minor.yy0); + yylhsminor.yy47 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); + if( IN_RENAME_OBJECT && yylhsminor.yy47 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy47->a[0].zName, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy135 = yylhsminor.yy135; + yymsp[-2].minor.yy47 = yylhsminor.yy47; break; - case 112: /* xfullname ::= nm */ -{yymsp[0].minor.yy135 = sqlite3SrcListAppend(pParse->db,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/} + case 115: /* xfullname ::= nm */ +{yymsp[0].minor.yy47 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/} break; - case 113: /* xfullname ::= nm DOT nm */ -{yymsp[-2].minor.yy135 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/} + case 116: /* xfullname ::= nm DOT nm */ +{yymsp[-2].minor.yy47 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/} break; - case 114: /* xfullname ::= nm DOT nm AS nm */ + case 117: /* xfullname ::= nm DOT nm AS nm */ { - yymsp[-4].minor.yy135 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/ - if( yymsp[-4].minor.yy135 ) yymsp[-4].minor.yy135->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); + yymsp[-4].minor.yy47 = sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/ + if( yymsp[-4].minor.yy47 ) yymsp[-4].minor.yy47->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); } break; - case 115: /* xfullname ::= nm AS nm */ + case 118: /* xfullname ::= nm AS nm */ { - yymsp[-2].minor.yy135 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/ - if( yymsp[-2].minor.yy135 ) yymsp[-2].minor.yy135->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); + yymsp[-2].minor.yy47 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/ + if( yymsp[-2].minor.yy47 ) yymsp[-2].minor.yy47->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); } break; - case 116: /* joinop ::= COMMA|JOIN */ -{ yymsp[0].minor.yy70 = JT_INNER; } + case 119: /* joinop ::= COMMA|JOIN */ +{ yymsp[0].minor.yy192 = JT_INNER; } break; - case 117: /* joinop ::= JOIN_KW JOIN */ -{yymsp[-1].minor.yy70 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/} + case 120: /* joinop ::= JOIN_KW JOIN */ +{yymsp[-1].minor.yy192 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/} break; - case 118: /* joinop ::= JOIN_KW nm JOIN */ -{yymsp[-2].minor.yy70 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/} + case 121: /* joinop ::= JOIN_KW nm JOIN */ +{yymsp[-2].minor.yy192 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/} break; - case 119: /* joinop ::= JOIN_KW nm nm JOIN */ -{yymsp[-3].minor.yy70 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/} + case 122: /* joinop ::= JOIN_KW nm nm JOIN */ +{yymsp[-3].minor.yy192 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/} break; - case 120: /* on_opt ::= ON expr */ - case 137: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==137); - case 144: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==144); - case 210: /* case_else ::= ELSE expr */ yytestcase(yyruleno==210); -{yymsp[-1].minor.yy18 = yymsp[0].minor.yy18;} + case 123: /* on_opt ::= ON expr */ + case 143: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==143); + case 150: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==150); + case 216: /* case_else ::= ELSE expr */ yytestcase(yyruleno==216); + case 237: /* vinto ::= INTO expr */ yytestcase(yyruleno==237); +{yymsp[-1].minor.yy202 = yymsp[0].minor.yy202;} break; - case 121: /* on_opt ::= */ - case 136: /* having_opt ::= */ yytestcase(yyruleno==136); - case 138: /* limit_opt ::= */ yytestcase(yyruleno==138); - case 143: /* where_opt ::= */ yytestcase(yyruleno==143); - case 211: /* case_else ::= */ yytestcase(yyruleno==211); - case 213: /* case_operand ::= */ yytestcase(yyruleno==213); -{yymsp[1].minor.yy18 = 0;} + case 124: /* on_opt ::= */ + case 142: /* having_opt ::= */ yytestcase(yyruleno==142); + case 144: /* limit_opt ::= */ yytestcase(yyruleno==144); + case 149: /* where_opt ::= */ yytestcase(yyruleno==149); + case 217: /* case_else ::= */ yytestcase(yyruleno==217); + case 219: /* case_operand ::= */ yytestcase(yyruleno==219); + case 238: /* vinto ::= */ yytestcase(yyruleno==238); +{yymsp[1].minor.yy202 = 0;} break; - case 123: /* indexed_opt ::= INDEXED BY nm */ + case 126: /* indexed_opt ::= INDEXED BY nm */ {yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;} break; - case 124: /* indexed_opt ::= NOT INDEXED */ + case 127: /* indexed_opt ::= NOT INDEXED */ {yymsp[-1].minor.yy0.z=0; yymsp[-1].minor.yy0.n=1;} break; - case 125: /* using_opt ::= USING LP idlist RP */ -{yymsp[-3].minor.yy48 = yymsp[-1].minor.yy48;} + case 128: /* using_opt ::= USING LP idlist RP */ +{yymsp[-3].minor.yy600 = yymsp[-1].minor.yy600;} break; - case 126: /* using_opt ::= */ - case 158: /* idlist_opt ::= */ yytestcase(yyruleno==158); -{yymsp[1].minor.yy48 = 0;} + case 129: /* using_opt ::= */ + case 164: /* idlist_opt ::= */ yytestcase(yyruleno==164); +{yymsp[1].minor.yy600 = 0;} break; - case 128: /* orderby_opt ::= ORDER BY sortlist */ - case 135: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==135); -{yymsp[-2].minor.yy420 = yymsp[0].minor.yy420;} + case 131: /* orderby_opt ::= ORDER BY sortlist */ + case 141: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==141); +{yymsp[-2].minor.yy242 = yymsp[0].minor.yy242;} break; - case 129: /* sortlist ::= sortlist COMMA expr sortorder */ + case 132: /* sortlist ::= sortlist COMMA expr sortorder nulls */ { - yymsp[-3].minor.yy420 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy420,yymsp[-1].minor.yy18); - sqlite3ExprListSetSortOrder(yymsp[-3].minor.yy420,yymsp[0].minor.yy70); + yymsp[-4].minor.yy242 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy242,yymsp[-2].minor.yy202); + sqlite3ExprListSetSortOrder(yymsp[-4].minor.yy242,yymsp[-1].minor.yy192,yymsp[0].minor.yy192); } break; - case 130: /* sortlist ::= expr sortorder */ + case 133: /* sortlist ::= expr sortorder nulls */ { - yymsp[-1].minor.yy420 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy18); /*A-overwrites-Y*/ - sqlite3ExprListSetSortOrder(yymsp[-1].minor.yy420,yymsp[0].minor.yy70); + yymsp[-2].minor.yy242 = sqlite3ExprListAppend(pParse,0,yymsp[-2].minor.yy202); /*A-overwrites-Y*/ + sqlite3ExprListSetSortOrder(yymsp[-2].minor.yy242,yymsp[-1].minor.yy192,yymsp[0].minor.yy192); } break; - case 131: /* sortorder ::= ASC */ -{yymsp[0].minor.yy70 = SQLITE_SO_ASC;} + case 134: /* sortorder ::= ASC */ +{yymsp[0].minor.yy192 = SQLITE_SO_ASC;} + break; + case 135: /* sortorder ::= DESC */ +{yymsp[0].minor.yy192 = SQLITE_SO_DESC;} break; - case 132: /* sortorder ::= DESC */ -{yymsp[0].minor.yy70 = SQLITE_SO_DESC;} + case 136: /* sortorder ::= */ + case 139: /* nulls ::= */ yytestcase(yyruleno==139); +{yymsp[1].minor.yy192 = SQLITE_SO_UNDEFINED;} break; - case 133: /* sortorder ::= */ -{yymsp[1].minor.yy70 = SQLITE_SO_UNDEFINED;} + case 137: /* nulls ::= NULLS FIRST */ +{yymsp[-1].minor.yy192 = SQLITE_SO_ASC;} break; - case 139: /* limit_opt ::= LIMIT expr */ -{yymsp[-1].minor.yy18 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy18,0);} + case 138: /* nulls ::= NULLS LAST */ +{yymsp[-1].minor.yy192 = SQLITE_SO_DESC;} break; - case 140: /* limit_opt ::= LIMIT expr OFFSET expr */ -{yymsp[-3].minor.yy18 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy18,yymsp[0].minor.yy18);} + case 145: /* limit_opt ::= LIMIT expr */ +{yymsp[-1].minor.yy202 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy202,0);} break; - case 141: /* limit_opt ::= LIMIT expr COMMA expr */ -{yymsp[-3].minor.yy18 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy18,yymsp[-2].minor.yy18);} + case 146: /* limit_opt ::= LIMIT expr OFFSET expr */ +{yymsp[-3].minor.yy202 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy202,yymsp[0].minor.yy202);} break; - case 142: /* cmd ::= with DELETE FROM xfullname indexed_opt where_opt */ + case 147: /* limit_opt ::= LIMIT expr COMMA expr */ +{yymsp[-3].minor.yy202 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy202,yymsp[-2].minor.yy202);} + break; + case 148: /* cmd ::= with DELETE FROM xfullname indexed_opt where_opt */ { - sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy135, &yymsp[-1].minor.yy0); - sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy135,yymsp[0].minor.yy18,0,0); + sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy47, &yymsp[-1].minor.yy0); + sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy47,yymsp[0].minor.yy202,0,0); } break; - case 145: /* cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ + case 151: /* cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ { - sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy135, &yymsp[-3].minor.yy0); - sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy420,"set list"); - sqlite3Update(pParse,yymsp[-4].minor.yy135,yymsp[-1].minor.yy420,yymsp[0].minor.yy18,yymsp[-5].minor.yy70,0,0,0); + sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy47, &yymsp[-3].minor.yy0); + sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy242,"set list"); + sqlite3Update(pParse,yymsp[-4].minor.yy47,yymsp[-1].minor.yy242,yymsp[0].minor.yy202,yymsp[-5].minor.yy192,0,0,0); } break; - case 146: /* setlist ::= setlist COMMA nm EQ expr */ + case 152: /* setlist ::= setlist COMMA nm EQ expr */ { - yymsp[-4].minor.yy420 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy420, yymsp[0].minor.yy18); - sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy420, &yymsp[-2].minor.yy0, 1); + yymsp[-4].minor.yy242 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy242, yymsp[0].minor.yy202); + sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy242, &yymsp[-2].minor.yy0, 1); } break; - case 147: /* setlist ::= setlist COMMA LP idlist RP EQ expr */ + case 153: /* setlist ::= setlist COMMA LP idlist RP EQ expr */ { - yymsp[-6].minor.yy420 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy420, yymsp[-3].minor.yy48, yymsp[0].minor.yy18); + yymsp[-6].minor.yy242 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy242, yymsp[-3].minor.yy600, yymsp[0].minor.yy202); } break; - case 148: /* setlist ::= nm EQ expr */ + case 154: /* setlist ::= nm EQ expr */ { - yylhsminor.yy420 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy18); - sqlite3ExprListSetName(pParse, yylhsminor.yy420, &yymsp[-2].minor.yy0, 1); + yylhsminor.yy242 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy202); + sqlite3ExprListSetName(pParse, yylhsminor.yy242, &yymsp[-2].minor.yy0, 1); } - yymsp[-2].minor.yy420 = yylhsminor.yy420; + yymsp[-2].minor.yy242 = yylhsminor.yy242; break; - case 149: /* setlist ::= LP idlist RP EQ expr */ + case 155: /* setlist ::= LP idlist RP EQ expr */ { - yymsp[-4].minor.yy420 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy48, yymsp[0].minor.yy18); + yymsp[-4].minor.yy242 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy600, yymsp[0].minor.yy202); } break; - case 150: /* cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ + case 156: /* cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ { - sqlite3Insert(pParse, yymsp[-3].minor.yy135, yymsp[-1].minor.yy489, yymsp[-2].minor.yy48, yymsp[-5].minor.yy70, yymsp[0].minor.yy340); + sqlite3Insert(pParse, yymsp[-3].minor.yy47, yymsp[-1].minor.yy539, yymsp[-2].minor.yy600, yymsp[-5].minor.yy192, yymsp[0].minor.yy318); } break; - case 151: /* cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */ + case 157: /* cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */ { - sqlite3Insert(pParse, yymsp[-3].minor.yy135, 0, yymsp[-2].minor.yy48, yymsp[-5].minor.yy70, 0); + sqlite3Insert(pParse, yymsp[-3].minor.yy47, 0, yymsp[-2].minor.yy600, yymsp[-5].minor.yy192, 0); } break; - case 152: /* upsert ::= */ -{ yymsp[1].minor.yy340 = 0; } + case 158: /* upsert ::= */ +{ yymsp[1].minor.yy318 = 0; } break; - case 153: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */ -{ yymsp[-10].minor.yy340 = sqlite3UpsertNew(pParse->db,yymsp[-7].minor.yy420,yymsp[-5].minor.yy18,yymsp[-1].minor.yy420,yymsp[0].minor.yy18);} + case 159: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */ +{ yymsp[-10].minor.yy318 = sqlite3UpsertNew(pParse->db,yymsp[-7].minor.yy242,yymsp[-5].minor.yy202,yymsp[-1].minor.yy242,yymsp[0].minor.yy202);} break; - case 154: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */ -{ yymsp[-7].minor.yy340 = sqlite3UpsertNew(pParse->db,yymsp[-4].minor.yy420,yymsp[-2].minor.yy18,0,0); } + case 160: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */ +{ yymsp[-7].minor.yy318 = sqlite3UpsertNew(pParse->db,yymsp[-4].minor.yy242,yymsp[-2].minor.yy202,0,0); } break; - case 155: /* upsert ::= ON CONFLICT DO NOTHING */ -{ yymsp[-3].minor.yy340 = sqlite3UpsertNew(pParse->db,0,0,0,0); } + case 161: /* upsert ::= ON CONFLICT DO NOTHING */ +{ yymsp[-3].minor.yy318 = sqlite3UpsertNew(pParse->db,0,0,0,0); } break; - case 159: /* idlist_opt ::= LP idlist RP */ -{yymsp[-2].minor.yy48 = yymsp[-1].minor.yy48;} + case 165: /* idlist_opt ::= LP idlist RP */ +{yymsp[-2].minor.yy600 = yymsp[-1].minor.yy600;} break; - case 160: /* idlist ::= idlist COMMA nm */ -{yymsp[-2].minor.yy48 = sqlite3IdListAppend(pParse,yymsp[-2].minor.yy48,&yymsp[0].minor.yy0);} + case 166: /* idlist ::= idlist COMMA nm */ +{yymsp[-2].minor.yy600 = sqlite3IdListAppend(pParse,yymsp[-2].minor.yy600,&yymsp[0].minor.yy0);} break; - case 161: /* idlist ::= nm */ -{yymsp[0].minor.yy48 = sqlite3IdListAppend(pParse,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/} + case 167: /* idlist ::= nm */ +{yymsp[0].minor.yy600 = sqlite3IdListAppend(pParse,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/} break; - case 162: /* expr ::= LP expr RP */ -{yymsp[-2].minor.yy18 = yymsp[-1].minor.yy18;} + case 168: /* expr ::= LP expr RP */ +{yymsp[-2].minor.yy202 = yymsp[-1].minor.yy202;} break; - case 163: /* expr ::= ID|INDEXED */ - case 164: /* expr ::= JOIN_KW */ yytestcase(yyruleno==164); -{yymsp[0].minor.yy18=tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/} + case 169: /* expr ::= ID|INDEXED */ + case 170: /* expr ::= JOIN_KW */ yytestcase(yyruleno==170); +{yymsp[0].minor.yy202=tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/} break; - case 165: /* expr ::= nm DOT nm */ + case 171: /* expr ::= nm DOT nm */ { Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1); @@ -149299,11 +156291,11 @@ static YYACTIONTYPE yy_reduce( sqlite3RenameTokenMap(pParse, (void*)temp2, &yymsp[0].minor.yy0); sqlite3RenameTokenMap(pParse, (void*)temp1, &yymsp[-2].minor.yy0); } - yylhsminor.yy18 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); + yylhsminor.yy202 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); } - yymsp[-2].minor.yy18 = yylhsminor.yy18; + yymsp[-2].minor.yy202 = yylhsminor.yy202; break; - case 166: /* expr ::= nm DOT nm DOT nm */ + case 172: /* expr ::= nm DOT nm DOT nm */ { Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-4].minor.yy0, 1); Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); @@ -149313,26 +156305,26 @@ static YYACTIONTYPE yy_reduce( sqlite3RenameTokenMap(pParse, (void*)temp3, &yymsp[0].minor.yy0); sqlite3RenameTokenMap(pParse, (void*)temp2, &yymsp[-2].minor.yy0); } - yylhsminor.yy18 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); + yylhsminor.yy202 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); } - yymsp[-4].minor.yy18 = yylhsminor.yy18; + yymsp[-4].minor.yy202 = yylhsminor.yy202; break; - case 167: /* term ::= NULL|FLOAT|BLOB */ - case 168: /* term ::= STRING */ yytestcase(yyruleno==168); -{yymsp[0].minor.yy18=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/} + case 173: /* term ::= NULL|FLOAT|BLOB */ + case 174: /* term ::= STRING */ yytestcase(yyruleno==174); +{yymsp[0].minor.yy202=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/} break; - case 169: /* term ::= INTEGER */ + case 175: /* term ::= INTEGER */ { - yylhsminor.yy18 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1); + yylhsminor.yy202 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1); } - yymsp[0].minor.yy18 = yylhsminor.yy18; + yymsp[0].minor.yy202 = yylhsminor.yy202; break; - case 170: /* expr ::= VARIABLE */ + case 176: /* expr ::= VARIABLE */ { if( !(yymsp[0].minor.yy0.z[0]=='#' && sqlite3Isdigit(yymsp[0].minor.yy0.z[1])) ){ u32 n = yymsp[0].minor.yy0.n; - yymsp[0].minor.yy18 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0); - sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy18, n); + yymsp[0].minor.yy202 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0); + sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy202, n); }else{ /* When doing a nested parse, one can include terms in an expression ** that look like this: #1 #2 ... These terms refer to registers @@ -149341,154 +156333,159 @@ static YYACTIONTYPE yy_reduce( assert( t.n>=2 ); if( pParse->nested==0 ){ sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t); - yymsp[0].minor.yy18 = 0; + yymsp[0].minor.yy202 = 0; }else{ - yymsp[0].minor.yy18 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0); - if( yymsp[0].minor.yy18 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy18->iTable); + yymsp[0].minor.yy202 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0); + if( yymsp[0].minor.yy202 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy202->iTable); } } } break; - case 171: /* expr ::= expr COLLATE ID|STRING */ + case 177: /* expr ::= expr COLLATE ID|STRING */ { - yymsp[-2].minor.yy18 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy18, &yymsp[0].minor.yy0, 1); + yymsp[-2].minor.yy202 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy202, &yymsp[0].minor.yy0, 1); } break; - case 172: /* expr ::= CAST LP expr AS typetoken RP */ + case 178: /* expr ::= CAST LP expr AS typetoken RP */ { - yymsp[-5].minor.yy18 = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1); - sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy18, yymsp[-3].minor.yy18, 0); + yymsp[-5].minor.yy202 = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1); + sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy202, yymsp[-3].minor.yy202, 0); } break; - case 173: /* expr ::= ID|INDEXED LP distinct exprlist RP */ + case 179: /* expr ::= ID|INDEXED LP distinct exprlist RP */ { - yylhsminor.yy18 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy420, &yymsp[-4].minor.yy0, yymsp[-2].minor.yy70); + yylhsminor.yy202 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy242, &yymsp[-4].minor.yy0, yymsp[-2].minor.yy192); } - yymsp[-4].minor.yy18 = yylhsminor.yy18; + yymsp[-4].minor.yy202 = yylhsminor.yy202; break; - case 174: /* expr ::= ID|INDEXED LP STAR RP */ + case 180: /* expr ::= ID|INDEXED LP STAR RP */ { - yylhsminor.yy18 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0, 0); + yylhsminor.yy202 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0, 0); } - yymsp[-3].minor.yy18 = yylhsminor.yy18; + yymsp[-3].minor.yy202 = yylhsminor.yy202; break; - case 175: /* expr ::= ID|INDEXED LP distinct exprlist RP over_clause */ + case 181: /* expr ::= ID|INDEXED LP distinct exprlist RP filter_over */ { - yylhsminor.yy18 = sqlite3ExprFunction(pParse, yymsp[-2].minor.yy420, &yymsp[-5].minor.yy0, yymsp[-3].minor.yy70); - sqlite3WindowAttach(pParse, yylhsminor.yy18, yymsp[0].minor.yy327); + yylhsminor.yy202 = sqlite3ExprFunction(pParse, yymsp[-2].minor.yy242, &yymsp[-5].minor.yy0, yymsp[-3].minor.yy192); + sqlite3WindowAttach(pParse, yylhsminor.yy202, yymsp[0].minor.yy303); } - yymsp[-5].minor.yy18 = yylhsminor.yy18; + yymsp[-5].minor.yy202 = yylhsminor.yy202; break; - case 176: /* expr ::= ID|INDEXED LP STAR RP over_clause */ + case 182: /* expr ::= ID|INDEXED LP STAR RP filter_over */ { - yylhsminor.yy18 = sqlite3ExprFunction(pParse, 0, &yymsp[-4].minor.yy0, 0); - sqlite3WindowAttach(pParse, yylhsminor.yy18, yymsp[0].minor.yy327); + yylhsminor.yy202 = sqlite3ExprFunction(pParse, 0, &yymsp[-4].minor.yy0, 0); + sqlite3WindowAttach(pParse, yylhsminor.yy202, yymsp[0].minor.yy303); } - yymsp[-4].minor.yy18 = yylhsminor.yy18; + yymsp[-4].minor.yy202 = yylhsminor.yy202; break; - case 177: /* term ::= CTIME_KW */ + case 183: /* term ::= CTIME_KW */ { - yylhsminor.yy18 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0, 0); + yylhsminor.yy202 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0, 0); } - yymsp[0].minor.yy18 = yylhsminor.yy18; + yymsp[0].minor.yy202 = yylhsminor.yy202; break; - case 178: /* expr ::= LP nexprlist COMMA expr RP */ + case 184: /* expr ::= LP nexprlist COMMA expr RP */ { - ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy420, yymsp[-1].minor.yy18); - yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); - if( yymsp[-4].minor.yy18 ){ - yymsp[-4].minor.yy18->x.pList = pList; + ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy242, yymsp[-1].minor.yy202); + yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); + if( yymsp[-4].minor.yy202 ){ + yymsp[-4].minor.yy202->x.pList = pList; + if( ALWAYS(pList->nExpr) ){ + yymsp[-4].minor.yy202->flags |= pList->a[0].pExpr->flags & EP_Propagate; + } }else{ sqlite3ExprListDelete(pParse->db, pList); } } break; - case 179: /* expr ::= expr AND expr */ - case 180: /* expr ::= expr OR expr */ yytestcase(yyruleno==180); - case 181: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==181); - case 182: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==182); - case 183: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==183); - case 184: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==184); - case 185: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==185); - case 186: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==186); -{yymsp[-2].minor.yy18=sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy18,yymsp[0].minor.yy18);} + case 185: /* expr ::= expr AND expr */ +{yymsp[-2].minor.yy202=sqlite3ExprAnd(pParse,yymsp[-2].minor.yy202,yymsp[0].minor.yy202);} + break; + case 186: /* expr ::= expr OR expr */ + case 187: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==187); + case 188: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==188); + case 189: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==189); + case 190: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==190); + case 191: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==191); + case 192: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==192); +{yymsp[-2].minor.yy202=sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy202,yymsp[0].minor.yy202);} break; - case 187: /* likeop ::= NOT LIKE_KW|MATCH */ + case 193: /* likeop ::= NOT LIKE_KW|MATCH */ {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.n|=0x80000000; /*yymsp[-1].minor.yy0-overwrite-yymsp[0].minor.yy0*/} break; - case 188: /* expr ::= expr likeop expr */ + case 194: /* expr ::= expr likeop expr */ { ExprList *pList; int bNot = yymsp[-1].minor.yy0.n & 0x80000000; yymsp[-1].minor.yy0.n &= 0x7fffffff; - pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy18); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy18); - yymsp[-2].minor.yy18 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0); - if( bNot ) yymsp[-2].minor.yy18 = sqlite3PExpr(pParse, TK_NOT, yymsp[-2].minor.yy18, 0); - if( yymsp[-2].minor.yy18 ) yymsp[-2].minor.yy18->flags |= EP_InfixFunc; + pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy202); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy202); + yymsp[-2].minor.yy202 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0); + if( bNot ) yymsp[-2].minor.yy202 = sqlite3PExpr(pParse, TK_NOT, yymsp[-2].minor.yy202, 0); + if( yymsp[-2].minor.yy202 ) yymsp[-2].minor.yy202->flags |= EP_InfixFunc; } break; - case 189: /* expr ::= expr likeop expr ESCAPE expr */ + case 195: /* expr ::= expr likeop expr ESCAPE expr */ { ExprList *pList; int bNot = yymsp[-3].minor.yy0.n & 0x80000000; yymsp[-3].minor.yy0.n &= 0x7fffffff; - pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy18); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy18); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy18); - yymsp[-4].minor.yy18 = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0, 0); - if( bNot ) yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy18, 0); - if( yymsp[-4].minor.yy18 ) yymsp[-4].minor.yy18->flags |= EP_InfixFunc; + pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy202); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy202); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy202); + yymsp[-4].minor.yy202 = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0, 0); + if( bNot ) yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy202, 0); + if( yymsp[-4].minor.yy202 ) yymsp[-4].minor.yy202->flags |= EP_InfixFunc; } break; - case 190: /* expr ::= expr ISNULL|NOTNULL */ -{yymsp[-1].minor.yy18 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy18,0);} + case 196: /* expr ::= expr ISNULL|NOTNULL */ +{yymsp[-1].minor.yy202 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy202,0);} break; - case 191: /* expr ::= expr NOT NULL */ -{yymsp[-2].minor.yy18 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy18,0);} + case 197: /* expr ::= expr NOT NULL */ +{yymsp[-2].minor.yy202 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy202,0);} break; - case 192: /* expr ::= expr IS expr */ + case 198: /* expr ::= expr IS expr */ { - yymsp[-2].minor.yy18 = sqlite3PExpr(pParse,TK_IS,yymsp[-2].minor.yy18,yymsp[0].minor.yy18); - binaryToUnaryIfNull(pParse, yymsp[0].minor.yy18, yymsp[-2].minor.yy18, TK_ISNULL); + yymsp[-2].minor.yy202 = sqlite3PExpr(pParse,TK_IS,yymsp[-2].minor.yy202,yymsp[0].minor.yy202); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy202, yymsp[-2].minor.yy202, TK_ISNULL); } break; - case 193: /* expr ::= expr IS NOT expr */ + case 199: /* expr ::= expr IS NOT expr */ { - yymsp[-3].minor.yy18 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-3].minor.yy18,yymsp[0].minor.yy18); - binaryToUnaryIfNull(pParse, yymsp[0].minor.yy18, yymsp[-3].minor.yy18, TK_NOTNULL); + yymsp[-3].minor.yy202 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-3].minor.yy202,yymsp[0].minor.yy202); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy202, yymsp[-3].minor.yy202, TK_NOTNULL); } break; - case 194: /* expr ::= NOT expr */ - case 195: /* expr ::= BITNOT expr */ yytestcase(yyruleno==195); -{yymsp[-1].minor.yy18 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy18, 0);/*A-overwrites-B*/} + case 200: /* expr ::= NOT expr */ + case 201: /* expr ::= BITNOT expr */ yytestcase(yyruleno==201); +{yymsp[-1].minor.yy202 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy202, 0);/*A-overwrites-B*/} break; - case 196: /* expr ::= PLUS|MINUS expr */ + case 202: /* expr ::= PLUS|MINUS expr */ { - yymsp[-1].minor.yy18 = sqlite3PExpr(pParse, yymsp[-1].major==TK_PLUS ? TK_UPLUS : TK_UMINUS, yymsp[0].minor.yy18, 0); + yymsp[-1].minor.yy202 = sqlite3PExpr(pParse, yymsp[-1].major==TK_PLUS ? TK_UPLUS : TK_UMINUS, yymsp[0].minor.yy202, 0); /*A-overwrites-B*/ } break; - case 197: /* between_op ::= BETWEEN */ - case 200: /* in_op ::= IN */ yytestcase(yyruleno==200); -{yymsp[0].minor.yy70 = 0;} + case 203: /* between_op ::= BETWEEN */ + case 206: /* in_op ::= IN */ yytestcase(yyruleno==206); +{yymsp[0].minor.yy192 = 0;} break; - case 199: /* expr ::= expr between_op expr AND expr */ + case 205: /* expr ::= expr between_op expr AND expr */ { - ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy18); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy18); - yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy18, 0); - if( yymsp[-4].minor.yy18 ){ - yymsp[-4].minor.yy18->x.pList = pList; + ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy202); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy202); + yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy202, 0); + if( yymsp[-4].minor.yy202 ){ + yymsp[-4].minor.yy202->x.pList = pList; }else{ sqlite3ExprListDelete(pParse->db, pList); } - if( yymsp[-3].minor.yy70 ) yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy18, 0); + if( yymsp[-3].minor.yy192 ) yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy202, 0); } break; - case 202: /* expr ::= expr in_op LP exprlist RP */ + case 208: /* expr ::= expr in_op LP exprlist RP */ { - if( yymsp[-1].minor.yy420==0 ){ + if( yymsp[-1].minor.yy242==0 ){ /* Expressions of the form ** ** expr1 IN () @@ -149497,218 +156494,190 @@ static YYACTIONTYPE yy_reduce( ** simplify to constants 0 (false) and 1 (true), respectively, ** regardless of the value of expr1. */ - sqlite3ExprDelete(pParse->db, yymsp[-4].minor.yy18); - yymsp[-4].minor.yy18 = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[yymsp[-3].minor.yy70],1); - }else if( yymsp[-1].minor.yy420->nExpr==1 ){ - /* Expressions of the form: - ** - ** expr1 IN (?1) - ** expr1 NOT IN (?2) - ** - ** with exactly one value on the RHS can be simplified to something - ** like this: - ** - ** expr1 == ?1 - ** expr1 <> ?2 - ** - ** But, the RHS of the == or <> is marked with the EP_Generic flag - ** so that it may not contribute to the computation of comparison - ** affinity or the collating sequence to use for comparison. Otherwise, - ** the semantics would be subtly different from IN or NOT IN. - */ - Expr *pRHS = yymsp[-1].minor.yy420->a[0].pExpr; - yymsp[-1].minor.yy420->a[0].pExpr = 0; - sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy420); - /* pRHS cannot be NULL because a malloc error would have been detected - ** before now and control would have never reached this point */ - if( ALWAYS(pRHS) ){ - pRHS->flags &= ~EP_Collate; - pRHS->flags |= EP_Generic; - } - yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, yymsp[-3].minor.yy70 ? TK_NE : TK_EQ, yymsp[-4].minor.yy18, pRHS); - }else{ - yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy18, 0); - if( yymsp[-4].minor.yy18 ){ - yymsp[-4].minor.yy18->x.pList = yymsp[-1].minor.yy420; - sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy18); + sqlite3ExprUnmapAndDelete(pParse, yymsp[-4].minor.yy202); + yymsp[-4].minor.yy202 = sqlite3Expr(pParse->db, TK_INTEGER, yymsp[-3].minor.yy192 ? "1" : "0"); + }else{ + yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy202, 0); + if( yymsp[-4].minor.yy202 ){ + yymsp[-4].minor.yy202->x.pList = yymsp[-1].minor.yy242; + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy202); }else{ - sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy420); + sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy242); } - if( yymsp[-3].minor.yy70 ) yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy18, 0); + if( yymsp[-3].minor.yy192 ) yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy202, 0); } } break; - case 203: /* expr ::= LP select RP */ + case 209: /* expr ::= LP select RP */ { - yymsp[-2].minor.yy18 = sqlite3PExpr(pParse, TK_SELECT, 0, 0); - sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy18, yymsp[-1].minor.yy489); + yymsp[-2].minor.yy202 = sqlite3PExpr(pParse, TK_SELECT, 0, 0); + sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy202, yymsp[-1].minor.yy539); } break; - case 204: /* expr ::= expr in_op LP select RP */ + case 210: /* expr ::= expr in_op LP select RP */ { - yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy18, 0); - sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy18, yymsp[-1].minor.yy489); - if( yymsp[-3].minor.yy70 ) yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy18, 0); + yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy202, 0); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy202, yymsp[-1].minor.yy539); + if( yymsp[-3].minor.yy192 ) yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy202, 0); } break; - case 205: /* expr ::= expr in_op nm dbnm paren_exprlist */ + case 211: /* expr ::= expr in_op nm dbnm paren_exprlist */ { - SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); + SrcList *pSrc = sqlite3SrcListAppend(pParse, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0); - if( yymsp[0].minor.yy420 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy420); - yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy18, 0); - sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy18, pSelect); - if( yymsp[-3].minor.yy70 ) yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy18, 0); + if( yymsp[0].minor.yy242 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy242); + yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy202, 0); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy202, pSelect); + if( yymsp[-3].minor.yy192 ) yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy202, 0); } break; - case 206: /* expr ::= EXISTS LP select RP */ + case 212: /* expr ::= EXISTS LP select RP */ { Expr *p; - p = yymsp[-3].minor.yy18 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); - sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy489); + p = yymsp[-3].minor.yy202 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); + sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy539); } break; - case 207: /* expr ::= CASE case_operand case_exprlist case_else END */ + case 213: /* expr ::= CASE case_operand case_exprlist case_else END */ { - yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy18, 0); - if( yymsp[-4].minor.yy18 ){ - yymsp[-4].minor.yy18->x.pList = yymsp[-1].minor.yy18 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy420,yymsp[-1].minor.yy18) : yymsp[-2].minor.yy420; - sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy18); + yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy202, 0); + if( yymsp[-4].minor.yy202 ){ + yymsp[-4].minor.yy202->x.pList = yymsp[-1].minor.yy202 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy242,yymsp[-1].minor.yy202) : yymsp[-2].minor.yy242; + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy202); }else{ - sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy420); - sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy18); + sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy242); + sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy202); } } break; - case 208: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ + case 214: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ { - yymsp[-4].minor.yy420 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy420, yymsp[-2].minor.yy18); - yymsp[-4].minor.yy420 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy420, yymsp[0].minor.yy18); + yymsp[-4].minor.yy242 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy242, yymsp[-2].minor.yy202); + yymsp[-4].minor.yy242 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy242, yymsp[0].minor.yy202); } break; - case 209: /* case_exprlist ::= WHEN expr THEN expr */ + case 215: /* case_exprlist ::= WHEN expr THEN expr */ { - yymsp[-3].minor.yy420 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy18); - yymsp[-3].minor.yy420 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy420, yymsp[0].minor.yy18); + yymsp[-3].minor.yy242 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy202); + yymsp[-3].minor.yy242 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy242, yymsp[0].minor.yy202); } break; - case 212: /* case_operand ::= expr */ -{yymsp[0].minor.yy18 = yymsp[0].minor.yy18; /*A-overwrites-X*/} + case 218: /* case_operand ::= expr */ +{yymsp[0].minor.yy202 = yymsp[0].minor.yy202; /*A-overwrites-X*/} break; - case 215: /* nexprlist ::= nexprlist COMMA expr */ -{yymsp[-2].minor.yy420 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy420,yymsp[0].minor.yy18);} + case 221: /* nexprlist ::= nexprlist COMMA expr */ +{yymsp[-2].minor.yy242 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy242,yymsp[0].minor.yy202);} break; - case 216: /* nexprlist ::= expr */ -{yymsp[0].minor.yy420 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy18); /*A-overwrites-Y*/} + case 222: /* nexprlist ::= expr */ +{yymsp[0].minor.yy242 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy202); /*A-overwrites-Y*/} break; - case 218: /* paren_exprlist ::= LP exprlist RP */ - case 223: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==223); -{yymsp[-2].minor.yy420 = yymsp[-1].minor.yy420;} + case 224: /* paren_exprlist ::= LP exprlist RP */ + case 229: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==229); +{yymsp[-2].minor.yy242 = yymsp[-1].minor.yy242;} break; - case 219: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + case 225: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ { sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, - sqlite3SrcListAppend(pParse->db,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy420, yymsp[-10].minor.yy70, - &yymsp[-11].minor.yy0, yymsp[0].minor.yy18, SQLITE_SO_ASC, yymsp[-8].minor.yy70, SQLITE_IDXTYPE_APPDEF); + sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy242, yymsp[-10].minor.yy192, + &yymsp[-11].minor.yy0, yymsp[0].minor.yy202, SQLITE_SO_ASC, yymsp[-8].minor.yy192, SQLITE_IDXTYPE_APPDEF); if( IN_RENAME_OBJECT && pParse->pNewIndex ){ sqlite3RenameTokenMap(pParse, pParse->pNewIndex->zName, &yymsp[-4].minor.yy0); } } break; - case 220: /* uniqueflag ::= UNIQUE */ - case 260: /* raisetype ::= ABORT */ yytestcase(yyruleno==260); -{yymsp[0].minor.yy70 = OE_Abort;} + case 226: /* uniqueflag ::= UNIQUE */ + case 268: /* raisetype ::= ABORT */ yytestcase(yyruleno==268); +{yymsp[0].minor.yy192 = OE_Abort;} break; - case 221: /* uniqueflag ::= */ -{yymsp[1].minor.yy70 = OE_None;} + case 227: /* uniqueflag ::= */ +{yymsp[1].minor.yy192 = OE_None;} break; - case 224: /* eidlist ::= eidlist COMMA nm collate sortorder */ + case 230: /* eidlist ::= eidlist COMMA nm collate sortorder */ { - yymsp[-4].minor.yy420 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy420, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy70, yymsp[0].minor.yy70); + yymsp[-4].minor.yy242 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy242, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy192, yymsp[0].minor.yy192); } break; - case 225: /* eidlist ::= nm collate sortorder */ + case 231: /* eidlist ::= nm collate sortorder */ { - yymsp[-2].minor.yy420 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy70, yymsp[0].minor.yy70); /*A-overwrites-Y*/ + yymsp[-2].minor.yy242 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy192, yymsp[0].minor.yy192); /*A-overwrites-Y*/ } break; - case 228: /* cmd ::= DROP INDEX ifexists fullname */ -{sqlite3DropIndex(pParse, yymsp[0].minor.yy135, yymsp[-1].minor.yy70);} + case 234: /* cmd ::= DROP INDEX ifexists fullname */ +{sqlite3DropIndex(pParse, yymsp[0].minor.yy47, yymsp[-1].minor.yy192);} break; - case 229: /* cmd ::= VACUUM */ -{sqlite3Vacuum(pParse,0);} + case 235: /* cmd ::= VACUUM vinto */ +{sqlite3Vacuum(pParse,0,yymsp[0].minor.yy202);} break; - case 230: /* cmd ::= VACUUM nm */ -{sqlite3Vacuum(pParse,&yymsp[0].minor.yy0);} + case 236: /* cmd ::= VACUUM nm vinto */ +{sqlite3Vacuum(pParse,&yymsp[-1].minor.yy0,yymsp[0].minor.yy202);} break; - case 231: /* cmd ::= PRAGMA nm dbnm */ + case 239: /* cmd ::= PRAGMA nm dbnm */ {sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);} break; - case 232: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ + case 240: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);} break; - case 233: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ + case 241: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);} break; - case 234: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ + case 242: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);} break; - case 235: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ + case 243: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);} break; - case 238: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + case 246: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ { Token all; all.z = yymsp[-3].minor.yy0.z; all.n = (int)(yymsp[0].minor.yy0.z - yymsp[-3].minor.yy0.z) + yymsp[0].minor.yy0.n; - sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy207, &all); + sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy447, &all); } break; - case 239: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + case 247: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ { - sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy70, yymsp[-4].minor.yy34.a, yymsp[-4].minor.yy34.b, yymsp[-2].minor.yy135, yymsp[0].minor.yy18, yymsp[-10].minor.yy70, yymsp[-8].minor.yy70); + sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy192, yymsp[-4].minor.yy230.a, yymsp[-4].minor.yy230.b, yymsp[-2].minor.yy47, yymsp[0].minor.yy202, yymsp[-10].minor.yy192, yymsp[-8].minor.yy192); yymsp[-10].minor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); /*A-overwrites-T*/ } break; - case 240: /* trigger_time ::= BEFORE|AFTER */ -{ yymsp[0].minor.yy70 = yymsp[0].major; /*A-overwrites-X*/ } + case 248: /* trigger_time ::= BEFORE|AFTER */ +{ yymsp[0].minor.yy192 = yymsp[0].major; /*A-overwrites-X*/ } break; - case 241: /* trigger_time ::= INSTEAD OF */ -{ yymsp[-1].minor.yy70 = TK_INSTEAD;} + case 249: /* trigger_time ::= INSTEAD OF */ +{ yymsp[-1].minor.yy192 = TK_INSTEAD;} break; - case 242: /* trigger_time ::= */ -{ yymsp[1].minor.yy70 = TK_BEFORE; } + case 250: /* trigger_time ::= */ +{ yymsp[1].minor.yy192 = TK_BEFORE; } break; - case 243: /* trigger_event ::= DELETE|INSERT */ - case 244: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==244); -{yymsp[0].minor.yy34.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy34.b = 0;} + case 251: /* trigger_event ::= DELETE|INSERT */ + case 252: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==252); +{yymsp[0].minor.yy230.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy230.b = 0;} break; - case 245: /* trigger_event ::= UPDATE OF idlist */ -{yymsp[-2].minor.yy34.a = TK_UPDATE; yymsp[-2].minor.yy34.b = yymsp[0].minor.yy48;} + case 253: /* trigger_event ::= UPDATE OF idlist */ +{yymsp[-2].minor.yy230.a = TK_UPDATE; yymsp[-2].minor.yy230.b = yymsp[0].minor.yy600;} break; - case 246: /* when_clause ::= */ - case 265: /* key_opt ::= */ yytestcase(yyruleno==265); - case 307: /* filter_opt ::= */ yytestcase(yyruleno==307); -{ yymsp[1].minor.yy18 = 0; } + case 254: /* when_clause ::= */ + case 273: /* key_opt ::= */ yytestcase(yyruleno==273); +{ yymsp[1].minor.yy202 = 0; } break; - case 247: /* when_clause ::= WHEN expr */ - case 266: /* key_opt ::= KEY expr */ yytestcase(yyruleno==266); -{ yymsp[-1].minor.yy18 = yymsp[0].minor.yy18; } + case 255: /* when_clause ::= WHEN expr */ + case 274: /* key_opt ::= KEY expr */ yytestcase(yyruleno==274); +{ yymsp[-1].minor.yy202 = yymsp[0].minor.yy202; } break; - case 248: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + case 256: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ { - assert( yymsp[-2].minor.yy207!=0 ); - yymsp[-2].minor.yy207->pLast->pNext = yymsp[-1].minor.yy207; - yymsp[-2].minor.yy207->pLast = yymsp[-1].minor.yy207; + assert( yymsp[-2].minor.yy447!=0 ); + yymsp[-2].minor.yy447->pLast->pNext = yymsp[-1].minor.yy447; + yymsp[-2].minor.yy447->pLast = yymsp[-1].minor.yy447; } break; - case 249: /* trigger_cmd_list ::= trigger_cmd SEMI */ + case 257: /* trigger_cmd_list ::= trigger_cmd SEMI */ { - assert( yymsp[-1].minor.yy207!=0 ); - yymsp[-1].minor.yy207->pLast = yymsp[-1].minor.yy207; + assert( yymsp[-1].minor.yy447!=0 ); + yymsp[-1].minor.yy447->pLast = yymsp[-1].minor.yy447; } break; - case 250: /* trnm ::= nm DOT nm */ + case 258: /* trnm ::= nm DOT nm */ { yymsp[-2].minor.yy0 = yymsp[0].minor.yy0; sqlite3ErrorMsg(pParse, @@ -149716,312 +156685,350 @@ static YYACTIONTYPE yy_reduce( "statements within triggers"); } break; - case 251: /* tridxby ::= INDEXED BY nm */ + case 259: /* tridxby ::= INDEXED BY nm */ { sqlite3ErrorMsg(pParse, "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " "within triggers"); } break; - case 252: /* tridxby ::= NOT INDEXED */ + case 260: /* tridxby ::= NOT INDEXED */ { sqlite3ErrorMsg(pParse, "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " "within triggers"); } break; - case 253: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ -{yylhsminor.yy207 = sqlite3TriggerUpdateStep(pParse, &yymsp[-5].minor.yy0, yymsp[-2].minor.yy420, yymsp[-1].minor.yy18, yymsp[-6].minor.yy70, yymsp[-7].minor.yy0.z, yymsp[0].minor.yy392);} - yymsp[-7].minor.yy207 = yylhsminor.yy207; + case 261: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ +{yylhsminor.yy447 = sqlite3TriggerUpdateStep(pParse, &yymsp[-5].minor.yy0, yymsp[-2].minor.yy242, yymsp[-1].minor.yy202, yymsp[-6].minor.yy192, yymsp[-7].minor.yy0.z, yymsp[0].minor.yy436);} + yymsp[-7].minor.yy447 = yylhsminor.yy447; break; - case 254: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + case 262: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ { - yylhsminor.yy207 = sqlite3TriggerInsertStep(pParse,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy48,yymsp[-2].minor.yy489,yymsp[-6].minor.yy70,yymsp[-1].minor.yy340,yymsp[-7].minor.yy392,yymsp[0].minor.yy392);/*yylhsminor.yy207-overwrites-yymsp[-6].minor.yy70*/ + yylhsminor.yy447 = sqlite3TriggerInsertStep(pParse,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy600,yymsp[-2].minor.yy539,yymsp[-6].minor.yy192,yymsp[-1].minor.yy318,yymsp[-7].minor.yy436,yymsp[0].minor.yy436);/*yylhsminor.yy447-overwrites-yymsp[-6].minor.yy192*/ } - yymsp[-7].minor.yy207 = yylhsminor.yy207; + yymsp[-7].minor.yy447 = yylhsminor.yy447; break; - case 255: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ -{yylhsminor.yy207 = sqlite3TriggerDeleteStep(pParse, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy18, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy392);} - yymsp[-5].minor.yy207 = yylhsminor.yy207; + case 263: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ +{yylhsminor.yy447 = sqlite3TriggerDeleteStep(pParse, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy202, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy436);} + yymsp[-5].minor.yy447 = yylhsminor.yy447; break; - case 256: /* trigger_cmd ::= scanpt select scanpt */ -{yylhsminor.yy207 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy489, yymsp[-2].minor.yy392, yymsp[0].minor.yy392); /*yylhsminor.yy207-overwrites-yymsp[-1].minor.yy489*/} - yymsp[-2].minor.yy207 = yylhsminor.yy207; + case 264: /* trigger_cmd ::= scanpt select scanpt */ +{yylhsminor.yy447 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy539, yymsp[-2].minor.yy436, yymsp[0].minor.yy436); /*yylhsminor.yy447-overwrites-yymsp[-1].minor.yy539*/} + yymsp[-2].minor.yy447 = yylhsminor.yy447; break; - case 257: /* expr ::= RAISE LP IGNORE RP */ + case 265: /* expr ::= RAISE LP IGNORE RP */ { - yymsp[-3].minor.yy18 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); - if( yymsp[-3].minor.yy18 ){ - yymsp[-3].minor.yy18->affinity = OE_Ignore; + yymsp[-3].minor.yy202 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); + if( yymsp[-3].minor.yy202 ){ + yymsp[-3].minor.yy202->affExpr = OE_Ignore; } } break; - case 258: /* expr ::= RAISE LP raisetype COMMA nm RP */ + case 266: /* expr ::= RAISE LP raisetype COMMA nm RP */ { - yymsp[-5].minor.yy18 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); - if( yymsp[-5].minor.yy18 ) { - yymsp[-5].minor.yy18->affinity = (char)yymsp[-3].minor.yy70; + yymsp[-5].minor.yy202 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); + if( yymsp[-5].minor.yy202 ) { + yymsp[-5].minor.yy202->affExpr = (char)yymsp[-3].minor.yy192; } } break; - case 259: /* raisetype ::= ROLLBACK */ -{yymsp[0].minor.yy70 = OE_Rollback;} + case 267: /* raisetype ::= ROLLBACK */ +{yymsp[0].minor.yy192 = OE_Rollback;} break; - case 261: /* raisetype ::= FAIL */ -{yymsp[0].minor.yy70 = OE_Fail;} + case 269: /* raisetype ::= FAIL */ +{yymsp[0].minor.yy192 = OE_Fail;} break; - case 262: /* cmd ::= DROP TRIGGER ifexists fullname */ + case 270: /* cmd ::= DROP TRIGGER ifexists fullname */ { - sqlite3DropTrigger(pParse,yymsp[0].minor.yy135,yymsp[-1].minor.yy70); + sqlite3DropTrigger(pParse,yymsp[0].minor.yy47,yymsp[-1].minor.yy192); } break; - case 263: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + case 271: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ { - sqlite3Attach(pParse, yymsp[-3].minor.yy18, yymsp[-1].minor.yy18, yymsp[0].minor.yy18); + sqlite3Attach(pParse, yymsp[-3].minor.yy202, yymsp[-1].minor.yy202, yymsp[0].minor.yy202); } break; - case 264: /* cmd ::= DETACH database_kw_opt expr */ + case 272: /* cmd ::= DETACH database_kw_opt expr */ { - sqlite3Detach(pParse, yymsp[0].minor.yy18); + sqlite3Detach(pParse, yymsp[0].minor.yy202); } break; - case 267: /* cmd ::= REINDEX */ + case 275: /* cmd ::= REINDEX */ {sqlite3Reindex(pParse, 0, 0);} break; - case 268: /* cmd ::= REINDEX nm dbnm */ + case 276: /* cmd ::= REINDEX nm dbnm */ {sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 269: /* cmd ::= ANALYZE */ + case 277: /* cmd ::= ANALYZE */ {sqlite3Analyze(pParse, 0, 0);} break; - case 270: /* cmd ::= ANALYZE nm dbnm */ + case 278: /* cmd ::= ANALYZE nm dbnm */ {sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 271: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ + case 279: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ { - sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy135,&yymsp[0].minor.yy0); + sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy47,&yymsp[0].minor.yy0); } break; - case 272: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + case 280: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ { yymsp[-1].minor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-1].minor.yy0.z) + pParse->sLastToken.n; sqlite3AlterFinishAddColumn(pParse, &yymsp[-1].minor.yy0); } break; - case 273: /* add_column_fullname ::= fullname */ + case 281: /* add_column_fullname ::= fullname */ { disableLookaside(pParse); - sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy135); + sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy47); } break; - case 274: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + case 282: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ { - sqlite3AlterRenameColumn(pParse, yymsp[-5].minor.yy135, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); + sqlite3AlterRenameColumn(pParse, yymsp[-5].minor.yy47, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 275: /* cmd ::= create_vtab */ + case 283: /* cmd ::= create_vtab */ {sqlite3VtabFinishParse(pParse,0);} break; - case 276: /* cmd ::= create_vtab LP vtabarglist RP */ + case 284: /* cmd ::= create_vtab LP vtabarglist RP */ {sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);} break; - case 277: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + case 285: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ { - sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy70); + sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy192); } break; - case 278: /* vtabarg ::= */ + case 286: /* vtabarg ::= */ {sqlite3VtabArgInit(pParse);} break; - case 279: /* vtabargtoken ::= ANY */ - case 280: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==280); - case 281: /* lp ::= LP */ yytestcase(yyruleno==281); + case 287: /* vtabargtoken ::= ANY */ + case 288: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==288); + case 289: /* lp ::= LP */ yytestcase(yyruleno==289); {sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);} break; - case 282: /* with ::= WITH wqlist */ - case 283: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==283); -{ sqlite3WithPush(pParse, yymsp[0].minor.yy449, 1); } + case 290: /* with ::= WITH wqlist */ + case 291: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==291); +{ sqlite3WithPush(pParse, yymsp[0].minor.yy131, 1); } break; - case 284: /* wqlist ::= nm eidlist_opt AS LP select RP */ + case 292: /* wqlist ::= nm eidlist_opt AS LP select RP */ { - yymsp[-5].minor.yy449 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy420, yymsp[-1].minor.yy489); /*A-overwrites-X*/ + yymsp[-5].minor.yy131 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy242, yymsp[-1].minor.yy539); /*A-overwrites-X*/ } break; - case 285: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ + case 293: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ { - yymsp[-7].minor.yy449 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy449, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy420, yymsp[-1].minor.yy489); + yymsp[-7].minor.yy131 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy131, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy242, yymsp[-1].minor.yy539); } break; - case 286: /* windowdefn_list ::= windowdefn */ -{ yylhsminor.yy327 = yymsp[0].minor.yy327; } - yymsp[0].minor.yy327 = yylhsminor.yy327; + case 294: /* windowdefn_list ::= windowdefn */ +{ yylhsminor.yy303 = yymsp[0].minor.yy303; } + yymsp[0].minor.yy303 = yylhsminor.yy303; break; - case 287: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */ + case 295: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */ { - assert( yymsp[0].minor.yy327!=0 ); - yymsp[0].minor.yy327->pNextWin = yymsp[-2].minor.yy327; - yylhsminor.yy327 = yymsp[0].minor.yy327; + assert( yymsp[0].minor.yy303!=0 ); + sqlite3WindowChain(pParse, yymsp[0].minor.yy303, yymsp[-2].minor.yy303); + yymsp[0].minor.yy303->pNextWin = yymsp[-2].minor.yy303; + yylhsminor.yy303 = yymsp[0].minor.yy303; } - yymsp[-2].minor.yy327 = yylhsminor.yy327; + yymsp[-2].minor.yy303 = yylhsminor.yy303; break; - case 288: /* windowdefn ::= nm AS window */ + case 296: /* windowdefn ::= nm AS LP window RP */ { - if( ALWAYS(yymsp[0].minor.yy327) ){ - yymsp[0].minor.yy327->zName = sqlite3DbStrNDup(pParse->db, yymsp[-2].minor.yy0.z, yymsp[-2].minor.yy0.n); + if( ALWAYS(yymsp[-1].minor.yy303) ){ + yymsp[-1].minor.yy303->zName = sqlite3DbStrNDup(pParse->db, yymsp[-4].minor.yy0.z, yymsp[-4].minor.yy0.n); } - yylhsminor.yy327 = yymsp[0].minor.yy327; + yylhsminor.yy303 = yymsp[-1].minor.yy303; } - yymsp[-2].minor.yy327 = yylhsminor.yy327; + yymsp[-4].minor.yy303 = yylhsminor.yy303; break; - case 289: /* window ::= LP part_opt orderby_opt frame_opt RP */ + case 297: /* window ::= PARTITION BY nexprlist orderby_opt frame_opt */ { - yymsp[-4].minor.yy327 = yymsp[-1].minor.yy327; - if( ALWAYS(yymsp[-4].minor.yy327) ){ - yymsp[-4].minor.yy327->pPartition = yymsp[-3].minor.yy420; - yymsp[-4].minor.yy327->pOrderBy = yymsp[-2].minor.yy420; - } + yymsp[-4].minor.yy303 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy303, yymsp[-2].minor.yy242, yymsp[-1].minor.yy242, 0); } break; - case 290: /* part_opt ::= PARTITION BY nexprlist */ -{ yymsp[-2].minor.yy420 = yymsp[0].minor.yy420; } + case 298: /* window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ +{ + yylhsminor.yy303 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy303, yymsp[-2].minor.yy242, yymsp[-1].minor.yy242, &yymsp[-5].minor.yy0); +} + yymsp[-5].minor.yy303 = yylhsminor.yy303; break; - case 291: /* part_opt ::= */ -{ yymsp[1].minor.yy420 = 0; } + case 299: /* window ::= ORDER BY sortlist frame_opt */ +{ + yymsp[-3].minor.yy303 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy303, 0, yymsp[-1].minor.yy242, 0); +} break; - case 292: /* frame_opt ::= */ + case 300: /* window ::= nm ORDER BY sortlist frame_opt */ +{ + yylhsminor.yy303 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy303, 0, yymsp[-1].minor.yy242, &yymsp[-4].minor.yy0); +} + yymsp[-4].minor.yy303 = yylhsminor.yy303; + break; + case 301: /* window ::= frame_opt */ + case 320: /* filter_over ::= over_clause */ yytestcase(yyruleno==320); +{ + yylhsminor.yy303 = yymsp[0].minor.yy303; +} + yymsp[0].minor.yy303 = yylhsminor.yy303; + break; + case 302: /* window ::= nm frame_opt */ +{ + yylhsminor.yy303 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy303, 0, 0, &yymsp[-1].minor.yy0); +} + yymsp[-1].minor.yy303 = yylhsminor.yy303; + break; + case 303: /* frame_opt ::= */ { - yymsp[1].minor.yy327 = sqlite3WindowAlloc(pParse, TK_RANGE, TK_UNBOUNDED, 0, TK_CURRENT, 0); + yymsp[1].minor.yy303 = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0); } break; - case 293: /* frame_opt ::= range_or_rows frame_bound_s */ + case 304: /* frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ { - yylhsminor.yy327 = sqlite3WindowAlloc(pParse, yymsp[-1].minor.yy70, yymsp[0].minor.yy119.eType, yymsp[0].minor.yy119.pExpr, TK_CURRENT, 0); + yylhsminor.yy303 = sqlite3WindowAlloc(pParse, yymsp[-2].minor.yy192, yymsp[-1].minor.yy77.eType, yymsp[-1].minor.yy77.pExpr, TK_CURRENT, 0, yymsp[0].minor.yy58); } - yymsp[-1].minor.yy327 = yylhsminor.yy327; + yymsp[-2].minor.yy303 = yylhsminor.yy303; break; - case 294: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e */ + case 305: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ { - yylhsminor.yy327 = sqlite3WindowAlloc(pParse, yymsp[-4].minor.yy70, yymsp[-2].minor.yy119.eType, yymsp[-2].minor.yy119.pExpr, yymsp[0].minor.yy119.eType, yymsp[0].minor.yy119.pExpr); + yylhsminor.yy303 = sqlite3WindowAlloc(pParse, yymsp[-5].minor.yy192, yymsp[-3].minor.yy77.eType, yymsp[-3].minor.yy77.pExpr, yymsp[-1].minor.yy77.eType, yymsp[-1].minor.yy77.pExpr, yymsp[0].minor.yy58); } - yymsp[-4].minor.yy327 = yylhsminor.yy327; + yymsp[-5].minor.yy303 = yylhsminor.yy303; break; - case 295: /* range_or_rows ::= RANGE */ -{ yymsp[0].minor.yy70 = TK_RANGE; } + case 307: /* frame_bound_s ::= frame_bound */ + case 309: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==309); +{yylhsminor.yy77 = yymsp[0].minor.yy77;} + yymsp[0].minor.yy77 = yylhsminor.yy77; break; - case 296: /* range_or_rows ::= ROWS */ -{ yymsp[0].minor.yy70 = TK_ROWS; } + case 308: /* frame_bound_s ::= UNBOUNDED PRECEDING */ + case 310: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==310); + case 312: /* frame_bound ::= CURRENT ROW */ yytestcase(yyruleno==312); +{yylhsminor.yy77.eType = yymsp[-1].major; yylhsminor.yy77.pExpr = 0;} + yymsp[-1].minor.yy77 = yylhsminor.yy77; break; - case 297: /* frame_bound_s ::= frame_bound */ - case 299: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==299); -{ yylhsminor.yy119 = yymsp[0].minor.yy119; } - yymsp[0].minor.yy119 = yylhsminor.yy119; + case 311: /* frame_bound ::= expr PRECEDING|FOLLOWING */ +{yylhsminor.yy77.eType = yymsp[0].major; yylhsminor.yy77.pExpr = yymsp[-1].minor.yy202;} + yymsp[-1].minor.yy77 = yylhsminor.yy77; break; - case 298: /* frame_bound_s ::= UNBOUNDED PRECEDING */ - case 300: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==300); -{yymsp[-1].minor.yy119.eType = TK_UNBOUNDED; yymsp[-1].minor.yy119.pExpr = 0;} + case 313: /* frame_exclude_opt ::= */ +{yymsp[1].minor.yy58 = 0;} break; - case 301: /* frame_bound ::= expr PRECEDING */ -{ yylhsminor.yy119.eType = TK_PRECEDING; yylhsminor.yy119.pExpr = yymsp[-1].minor.yy18; } - yymsp[-1].minor.yy119 = yylhsminor.yy119; + case 314: /* frame_exclude_opt ::= EXCLUDE frame_exclude */ +{yymsp[-1].minor.yy58 = yymsp[0].minor.yy58;} break; - case 302: /* frame_bound ::= CURRENT ROW */ -{ yymsp[-1].minor.yy119.eType = TK_CURRENT ; yymsp[-1].minor.yy119.pExpr = 0; } + case 315: /* frame_exclude ::= NO OTHERS */ + case 316: /* frame_exclude ::= CURRENT ROW */ yytestcase(yyruleno==316); +{yymsp[-1].minor.yy58 = yymsp[-1].major; /*A-overwrites-X*/} break; - case 303: /* frame_bound ::= expr FOLLOWING */ -{ yylhsminor.yy119.eType = TK_FOLLOWING; yylhsminor.yy119.pExpr = yymsp[-1].minor.yy18; } - yymsp[-1].minor.yy119 = yylhsminor.yy119; + case 317: /* frame_exclude ::= GROUP|TIES */ +{yymsp[0].minor.yy58 = yymsp[0].major; /*A-overwrites-X*/} break; - case 304: /* window_clause ::= WINDOW windowdefn_list */ -{ yymsp[-1].minor.yy327 = yymsp[0].minor.yy327; } + case 318: /* window_clause ::= WINDOW windowdefn_list */ +{ yymsp[-1].minor.yy303 = yymsp[0].minor.yy303; } break; - case 305: /* over_clause ::= filter_opt OVER window */ + case 319: /* filter_over ::= filter_clause over_clause */ { - yylhsminor.yy327 = yymsp[0].minor.yy327; - assert( yylhsminor.yy327!=0 ); - yylhsminor.yy327->pFilter = yymsp[-2].minor.yy18; + yymsp[0].minor.yy303->pFilter = yymsp[-1].minor.yy202; + yylhsminor.yy303 = yymsp[0].minor.yy303; } - yymsp[-2].minor.yy327 = yylhsminor.yy327; + yymsp[-1].minor.yy303 = yylhsminor.yy303; break; - case 306: /* over_clause ::= filter_opt OVER nm */ + case 321: /* filter_over ::= filter_clause */ { - yylhsminor.yy327 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); - if( yylhsminor.yy327 ){ - yylhsminor.yy327->zName = sqlite3DbStrNDup(pParse->db, yymsp[0].minor.yy0.z, yymsp[0].minor.yy0.n); - yylhsminor.yy327->pFilter = yymsp[-2].minor.yy18; + yylhsminor.yy303 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); + if( yylhsminor.yy303 ){ + yylhsminor.yy303->eFrmType = TK_FILTER; + yylhsminor.yy303->pFilter = yymsp[0].minor.yy202; }else{ - sqlite3ExprDelete(pParse->db, yymsp[-2].minor.yy18); + sqlite3ExprDelete(pParse->db, yymsp[0].minor.yy202); + } +} + yymsp[0].minor.yy303 = yylhsminor.yy303; + break; + case 322: /* over_clause ::= OVER LP window RP */ +{ + yymsp[-3].minor.yy303 = yymsp[-1].minor.yy303; + assert( yymsp[-3].minor.yy303!=0 ); +} + break; + case 323: /* over_clause ::= OVER nm */ +{ + yymsp[-1].minor.yy303 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); + if( yymsp[-1].minor.yy303 ){ + yymsp[-1].minor.yy303->zName = sqlite3DbStrNDup(pParse->db, yymsp[0].minor.yy0.z, yymsp[0].minor.yy0.n); } } - yymsp[-2].minor.yy327 = yylhsminor.yy327; break; - case 308: /* filter_opt ::= FILTER LP WHERE expr RP */ -{ yymsp[-4].minor.yy18 = yymsp[-1].minor.yy18; } + case 324: /* filter_clause ::= FILTER LP WHERE expr RP */ +{ yymsp[-4].minor.yy202 = yymsp[-1].minor.yy202; } break; default: - /* (309) input ::= cmdlist */ yytestcase(yyruleno==309); - /* (310) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==310); - /* (311) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=311); - /* (312) ecmd ::= SEMI */ yytestcase(yyruleno==312); - /* (313) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==313); - /* (314) ecmd ::= explain cmdx */ yytestcase(yyruleno==314); - /* (315) trans_opt ::= */ yytestcase(yyruleno==315); - /* (316) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==316); - /* (317) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==317); - /* (318) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==318); - /* (319) savepoint_opt ::= */ yytestcase(yyruleno==319); - /* (320) cmd ::= create_table create_table_args */ yytestcase(yyruleno==320); - /* (321) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==321); - /* (322) columnlist ::= columnname carglist */ yytestcase(yyruleno==322); - /* (323) nm ::= ID|INDEXED */ yytestcase(yyruleno==323); - /* (324) nm ::= STRING */ yytestcase(yyruleno==324); - /* (325) nm ::= JOIN_KW */ yytestcase(yyruleno==325); - /* (326) typetoken ::= typename */ yytestcase(yyruleno==326); - /* (327) typename ::= ID|STRING */ yytestcase(yyruleno==327); - /* (328) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=328); - /* (329) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=329); - /* (330) carglist ::= carglist ccons */ yytestcase(yyruleno==330); - /* (331) carglist ::= */ yytestcase(yyruleno==331); - /* (332) ccons ::= NULL onconf */ yytestcase(yyruleno==332); - /* (333) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==333); - /* (334) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==334); - /* (335) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=335); - /* (336) tconscomma ::= */ yytestcase(yyruleno==336); - /* (337) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=337); - /* (338) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=338); - /* (339) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=339); - /* (340) oneselect ::= values */ yytestcase(yyruleno==340); - /* (341) sclp ::= selcollist COMMA */ yytestcase(yyruleno==341); - /* (342) as ::= ID|STRING */ yytestcase(yyruleno==342); - /* (343) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=343); - /* (344) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==344); - /* (345) exprlist ::= nexprlist */ yytestcase(yyruleno==345); - /* (346) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=346); - /* (347) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=347); - /* (348) nmnum ::= ON */ yytestcase(yyruleno==348); - /* (349) nmnum ::= DELETE */ yytestcase(yyruleno==349); - /* (350) nmnum ::= DEFAULT */ yytestcase(yyruleno==350); - /* (351) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==351); - /* (352) foreach_clause ::= */ yytestcase(yyruleno==352); - /* (353) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==353); - /* (354) trnm ::= nm */ yytestcase(yyruleno==354); - /* (355) tridxby ::= */ yytestcase(yyruleno==355); - /* (356) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==356); - /* (357) database_kw_opt ::= */ yytestcase(yyruleno==357); - /* (358) kwcolumn_opt ::= */ yytestcase(yyruleno==358); - /* (359) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==359); - /* (360) vtabarglist ::= vtabarg */ yytestcase(yyruleno==360); - /* (361) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==361); - /* (362) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==362); - /* (363) anylist ::= */ yytestcase(yyruleno==363); - /* (364) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==364); - /* (365) anylist ::= anylist ANY */ yytestcase(yyruleno==365); - /* (366) with ::= */ yytestcase(yyruleno==366); + /* (325) input ::= cmdlist */ yytestcase(yyruleno==325); + /* (326) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==326); + /* (327) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=327); + /* (328) ecmd ::= SEMI */ yytestcase(yyruleno==328); + /* (329) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==329); + /* (330) ecmd ::= explain cmdx SEMI (NEVER REDUCES) */ assert(yyruleno!=330); + /* (331) trans_opt ::= */ yytestcase(yyruleno==331); + /* (332) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==332); + /* (333) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==333); + /* (334) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==334); + /* (335) savepoint_opt ::= */ yytestcase(yyruleno==335); + /* (336) cmd ::= create_table create_table_args */ yytestcase(yyruleno==336); + /* (337) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==337); + /* (338) columnlist ::= columnname carglist */ yytestcase(yyruleno==338); + /* (339) nm ::= ID|INDEXED */ yytestcase(yyruleno==339); + /* (340) nm ::= STRING */ yytestcase(yyruleno==340); + /* (341) nm ::= JOIN_KW */ yytestcase(yyruleno==341); + /* (342) typetoken ::= typename */ yytestcase(yyruleno==342); + /* (343) typename ::= ID|STRING */ yytestcase(yyruleno==343); + /* (344) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=344); + /* (345) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=345); + /* (346) carglist ::= carglist ccons */ yytestcase(yyruleno==346); + /* (347) carglist ::= */ yytestcase(yyruleno==347); + /* (348) ccons ::= NULL onconf */ yytestcase(yyruleno==348); + /* (349) ccons ::= GENERATED ALWAYS AS generated */ yytestcase(yyruleno==349); + /* (350) ccons ::= AS generated */ yytestcase(yyruleno==350); + /* (351) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==351); + /* (352) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==352); + /* (353) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=353); + /* (354) tconscomma ::= */ yytestcase(yyruleno==354); + /* (355) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=355); + /* (356) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=356); + /* (357) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=357); + /* (358) oneselect ::= values */ yytestcase(yyruleno==358); + /* (359) sclp ::= selcollist COMMA */ yytestcase(yyruleno==359); + /* (360) as ::= ID|STRING */ yytestcase(yyruleno==360); + /* (361) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=361); + /* (362) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==362); + /* (363) exprlist ::= nexprlist */ yytestcase(yyruleno==363); + /* (364) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=364); + /* (365) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=365); + /* (366) nmnum ::= ON */ yytestcase(yyruleno==366); + /* (367) nmnum ::= DELETE */ yytestcase(yyruleno==367); + /* (368) nmnum ::= DEFAULT */ yytestcase(yyruleno==368); + /* (369) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==369); + /* (370) foreach_clause ::= */ yytestcase(yyruleno==370); + /* (371) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==371); + /* (372) trnm ::= nm */ yytestcase(yyruleno==372); + /* (373) tridxby ::= */ yytestcase(yyruleno==373); + /* (374) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==374); + /* (375) database_kw_opt ::= */ yytestcase(yyruleno==375); + /* (376) kwcolumn_opt ::= */ yytestcase(yyruleno==376); + /* (377) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==377); + /* (378) vtabarglist ::= vtabarg */ yytestcase(yyruleno==378); + /* (379) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==379); + /* (380) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==380); + /* (381) anylist ::= */ yytestcase(yyruleno==381); + /* (382) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==382); + /* (383) anylist ::= anylist ANY */ yytestcase(yyruleno==383); + /* (384) with ::= */ yytestcase(yyruleno==384); break; /********** End reduce actions ************************************************/ }; - assert( yyrulenoyytos >= yypParser->yystack - && yymx != YYERRORSYMBOL && (yyact = yy_find_reduce_action( yypParser->yytos->stateno, - YYERRORSYMBOL)) >= YY_MIN_REDUCE + YYERRORSYMBOL)) > YY_MAX_SHIFTREDUCE ){ yy_pop_parser_stack(yypParser); } @@ -150308,13 +157314,12 @@ SQLITE_PRIVATE void sqlite3Parser( */ SQLITE_PRIVATE int sqlite3ParserFallback(int iToken){ #ifdef YYFALLBACK - if( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) ){ - return yyFallback[iToken]; - } + assert( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) ); + return yyFallback[iToken]; #else (void)iToken; -#endif return 0; +#endif } /************** End of parse.c ***********************************************/ @@ -150479,145 +157484,279 @@ const unsigned char ebcdicToAscii[] = { ** is substantially reduced. This is important for embedded applications ** on platforms with limited memory. */ -/* Hash score: 208 */ -/* zKWText[] encodes 923 bytes of keyword text in 614 bytes */ +/* Hash score: 227 */ +/* zKWText[] encodes 984 bytes of keyword text in 648 bytes */ /* REINDEXEDESCAPEACHECKEYBEFOREIGNOREGEXPLAINSTEADDATABASELECT */ -/* ABLEFTHENDEFERRABLELSEXCEPTRANSACTIONATURALTERAISEXCLUSIVE */ -/* XISTSAVEPOINTERSECTRIGGEREFERENCESCONSTRAINTOFFSETEMPORARY */ -/* UNIQUERYWITHOUTERELEASEATTACHAVINGROUPDATEBEGINNERANGEBETWEEN */ -/* OTHINGLOBYCASCADELETECASECOLLATECREATECURRENT_DATEDETACH */ -/* IMMEDIATEJOINSERTLIKEMATCHPLANALYZEPRAGMABORTVALUESVIRTUALIMIT */ -/* WHENOTNULLWHERECURSIVEAFTERENAMEANDEFAULTAUTOINCREMENTCAST */ -/* COLUMNCOMMITCONFLICTCROSSCURRENT_TIMESTAMPARTITIONDEFERRED */ -/* ISTINCTDROPRECEDINGFAILFILTEREPLACEFOLLOWINGFROMFULLIFISNULL */ -/* ORDERESTRICTOVERIGHTROLLBACKROWSUNBOUNDEDUNIONUSINGVACUUMVIEW */ -/* INDOWINITIALLYPRIMARY */ -static const char zKWText[613] = { +/* ABLEFTHENDEFERRABLELSEXCLUDELETEMPORARYISNULLSAVEPOINTERSECT */ +/* IESNOTNULLIKEXCEPTRANSACTIONATURALTERAISEXCLUSIVEXISTS */ +/* CONSTRAINTOFFSETRIGGERANGENERATEDETACHAVINGLOBEGINNEREFERENCES */ +/* UNIQUERYWITHOUTERELEASEATTACHBETWEENOTHINGROUPSCASCADEFAULT */ +/* CASECOLLATECREATECURRENT_DATEIMMEDIATEJOINSERTMATCHPLANALYZE */ +/* PRAGMABORTUPDATEVALUESVIRTUALWAYSWHENWHERECURSIVEAFTERENAMEAND */ +/* EFERREDISTINCTAUTOINCREMENTCASTCOLUMNCOMMITCONFLICTCROSS */ +/* CURRENT_TIMESTAMPARTITIONDROPRECEDINGFAILASTFILTEREPLACEFIRST */ +/* FOLLOWINGFROMFULLIMITIFORDERESTRICTOTHERSOVERIGHTROLLBACKROWS */ +/* UNBOUNDEDUNIONUSINGVACUUMVIEWINDOWBYINITIALLYPRIMARY */ +static const char zKWText[647] = { 'R','E','I','N','D','E','X','E','D','E','S','C','A','P','E','A','C','H', 'E','C','K','E','Y','B','E','F','O','R','E','I','G','N','O','R','E','G', 'E','X','P','L','A','I','N','S','T','E','A','D','D','A','T','A','B','A', 'S','E','L','E','C','T','A','B','L','E','F','T','H','E','N','D','E','F', - 'E','R','R','A','B','L','E','L','S','E','X','C','E','P','T','R','A','N', - 'S','A','C','T','I','O','N','A','T','U','R','A','L','T','E','R','A','I', - 'S','E','X','C','L','U','S','I','V','E','X','I','S','T','S','A','V','E', - 'P','O','I','N','T','E','R','S','E','C','T','R','I','G','G','E','R','E', - 'F','E','R','E','N','C','E','S','C','O','N','S','T','R','A','I','N','T', - 'O','F','F','S','E','T','E','M','P','O','R','A','R','Y','U','N','I','Q', - 'U','E','R','Y','W','I','T','H','O','U','T','E','R','E','L','E','A','S', - 'E','A','T','T','A','C','H','A','V','I','N','G','R','O','U','P','D','A', - 'T','E','B','E','G','I','N','N','E','R','A','N','G','E','B','E','T','W', - 'E','E','N','O','T','H','I','N','G','L','O','B','Y','C','A','S','C','A', - 'D','E','L','E','T','E','C','A','S','E','C','O','L','L','A','T','E','C', - 'R','E','A','T','E','C','U','R','R','E','N','T','_','D','A','T','E','D', - 'E','T','A','C','H','I','M','M','E','D','I','A','T','E','J','O','I','N', - 'S','E','R','T','L','I','K','E','M','A','T','C','H','P','L','A','N','A', - 'L','Y','Z','E','P','R','A','G','M','A','B','O','R','T','V','A','L','U', - 'E','S','V','I','R','T','U','A','L','I','M','I','T','W','H','E','N','O', - 'T','N','U','L','L','W','H','E','R','E','C','U','R','S','I','V','E','A', - 'F','T','E','R','E','N','A','M','E','A','N','D','E','F','A','U','L','T', - 'A','U','T','O','I','N','C','R','E','M','E','N','T','C','A','S','T','C', - 'O','L','U','M','N','C','O','M','M','I','T','C','O','N','F','L','I','C', - 'T','C','R','O','S','S','C','U','R','R','E','N','T','_','T','I','M','E', - 'S','T','A','M','P','A','R','T','I','T','I','O','N','D','E','F','E','R', - 'R','E','D','I','S','T','I','N','C','T','D','R','O','P','R','E','C','E', - 'D','I','N','G','F','A','I','L','F','I','L','T','E','R','E','P','L','A', - 'C','E','F','O','L','L','O','W','I','N','G','F','R','O','M','F','U','L', - 'L','I','F','I','S','N','U','L','L','O','R','D','E','R','E','S','T','R', - 'I','C','T','O','V','E','R','I','G','H','T','R','O','L','L','B','A','C', - 'K','R','O','W','S','U','N','B','O','U','N','D','E','D','U','N','I','O', - 'N','U','S','I','N','G','V','A','C','U','U','M','V','I','E','W','I','N', - 'D','O','W','I','N','I','T','I','A','L','L','Y','P','R','I','M','A','R', - 'Y', + 'E','R','R','A','B','L','E','L','S','E','X','C','L','U','D','E','L','E', + 'T','E','M','P','O','R','A','R','Y','I','S','N','U','L','L','S','A','V', + 'E','P','O','I','N','T','E','R','S','E','C','T','I','E','S','N','O','T', + 'N','U','L','L','I','K','E','X','C','E','P','T','R','A','N','S','A','C', + 'T','I','O','N','A','T','U','R','A','L','T','E','R','A','I','S','E','X', + 'C','L','U','S','I','V','E','X','I','S','T','S','C','O','N','S','T','R', + 'A','I','N','T','O','F','F','S','E','T','R','I','G','G','E','R','A','N', + 'G','E','N','E','R','A','T','E','D','E','T','A','C','H','A','V','I','N', + 'G','L','O','B','E','G','I','N','N','E','R','E','F','E','R','E','N','C', + 'E','S','U','N','I','Q','U','E','R','Y','W','I','T','H','O','U','T','E', + 'R','E','L','E','A','S','E','A','T','T','A','C','H','B','E','T','W','E', + 'E','N','O','T','H','I','N','G','R','O','U','P','S','C','A','S','C','A', + 'D','E','F','A','U','L','T','C','A','S','E','C','O','L','L','A','T','E', + 'C','R','E','A','T','E','C','U','R','R','E','N','T','_','D','A','T','E', + 'I','M','M','E','D','I','A','T','E','J','O','I','N','S','E','R','T','M', + 'A','T','C','H','P','L','A','N','A','L','Y','Z','E','P','R','A','G','M', + 'A','B','O','R','T','U','P','D','A','T','E','V','A','L','U','E','S','V', + 'I','R','T','U','A','L','W','A','Y','S','W','H','E','N','W','H','E','R', + 'E','C','U','R','S','I','V','E','A','F','T','E','R','E','N','A','M','E', + 'A','N','D','E','F','E','R','R','E','D','I','S','T','I','N','C','T','A', + 'U','T','O','I','N','C','R','E','M','E','N','T','C','A','S','T','C','O', + 'L','U','M','N','C','O','M','M','I','T','C','O','N','F','L','I','C','T', + 'C','R','O','S','S','C','U','R','R','E','N','T','_','T','I','M','E','S', + 'T','A','M','P','A','R','T','I','T','I','O','N','D','R','O','P','R','E', + 'C','E','D','I','N','G','F','A','I','L','A','S','T','F','I','L','T','E', + 'R','E','P','L','A','C','E','F','I','R','S','T','F','O','L','L','O','W', + 'I','N','G','F','R','O','M','F','U','L','L','I','M','I','T','I','F','O', + 'R','D','E','R','E','S','T','R','I','C','T','O','T','H','E','R','S','O', + 'V','E','R','I','G','H','T','R','O','L','L','B','A','C','K','R','O','W', + 'S','U','N','B','O','U','N','D','E','D','U','N','I','O','N','U','S','I', + 'N','G','V','A','C','U','U','M','V','I','E','W','I','N','D','O','W','B', + 'Y','I','N','I','T','I','A','L','L','Y','P','R','I','M','A','R','Y', }; /* aKWHash[i] is the hash value for the i-th keyword */ static const unsigned char aKWHash[127] = { - 74, 109, 124, 72, 106, 45, 0, 0, 81, 0, 76, 61, 0, - 42, 12, 77, 15, 0, 123, 84, 54, 118, 125, 19, 0, 0, - 130, 0, 128, 121, 0, 22, 96, 0, 9, 0, 0, 115, 69, - 0, 67, 6, 0, 48, 93, 136, 0, 126, 104, 0, 0, 44, - 0, 107, 24, 0, 17, 0, 131, 53, 23, 0, 5, 62, 132, - 99, 0, 0, 135, 110, 60, 134, 57, 113, 55, 0, 94, 0, - 103, 26, 0, 102, 0, 0, 0, 98, 95, 100, 105, 117, 14, - 39, 116, 0, 80, 0, 133, 114, 92, 59, 0, 129, 79, 119, - 86, 46, 83, 0, 0, 97, 40, 122, 120, 0, 127, 0, 0, - 29, 0, 89, 87, 88, 0, 20, 85, 111, 56, + 84, 102, 132, 82, 114, 29, 0, 0, 91, 0, 85, 72, 0, + 53, 35, 86, 15, 0, 42, 94, 54, 126, 133, 19, 0, 0, + 138, 0, 40, 128, 0, 22, 104, 0, 9, 0, 0, 122, 80, + 0, 78, 6, 0, 65, 99, 145, 0, 134, 112, 0, 0, 48, + 0, 100, 24, 0, 17, 0, 27, 70, 23, 26, 5, 60, 140, + 107, 121, 0, 73, 101, 71, 143, 61, 119, 74, 0, 49, 0, + 11, 41, 0, 110, 0, 0, 0, 106, 10, 108, 113, 124, 14, + 50, 123, 0, 89, 0, 18, 120, 142, 56, 129, 137, 88, 83, + 37, 30, 125, 0, 0, 105, 51, 130, 127, 0, 34, 0, 0, + 44, 0, 95, 38, 39, 0, 20, 45, 116, 90, }; /* aKWNext[] forms the hash collision chain. If aKWHash[i]==0 ** then the i-th keyword has no more hash collisions. Otherwise, ** the next keyword with the same hash is aKWHash[i]-1. */ -static const unsigned char aKWNext[136] = { - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 33, 0, 21, 0, 0, 0, 0, 0, 50, - 0, 43, 3, 47, 0, 0, 32, 0, 0, 0, 0, 0, 0, - 0, 1, 64, 0, 0, 65, 0, 41, 0, 38, 0, 0, 0, - 0, 0, 49, 75, 0, 0, 30, 0, 58, 0, 0, 0, 31, - 63, 16, 34, 10, 0, 0, 0, 0, 0, 0, 0, 11, 70, - 91, 0, 0, 8, 0, 108, 0, 101, 28, 52, 68, 0, 112, - 0, 73, 51, 0, 90, 27, 37, 0, 71, 36, 82, 0, 35, - 66, 25, 18, 0, 0, 78, +static const unsigned char aKWNext[145] = { + 0, 0, 0, 0, 4, 0, 43, 0, 0, 103, 111, 0, 0, + 0, 2, 0, 0, 141, 0, 0, 0, 13, 0, 0, 0, 0, + 139, 0, 0, 118, 52, 0, 0, 135, 12, 0, 0, 62, 0, + 136, 0, 131, 0, 0, 36, 0, 0, 28, 77, 0, 0, 0, + 0, 59, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 69, 0, 0, 0, 0, 0, 144, 3, 0, 58, 0, 1, + 75, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 64, 66, + 63, 0, 0, 0, 0, 46, 0, 16, 0, 115, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 81, 97, 0, 8, 0, 109, + 21, 7, 67, 0, 79, 93, 117, 0, 0, 68, 0, 0, 96, + 0, 55, 0, 76, 0, 92, 32, 33, 57, 25, 0, 98, 0, + 0, 87, }; /* aKWLen[i] is the length (in bytes) of the i-th keyword */ -static const unsigned char aKWLen[136] = { +static const unsigned char aKWLen[145] = { 7, 7, 5, 4, 6, 4, 5, 3, 6, 7, 3, 6, 6, - 7, 7, 3, 8, 2, 6, 5, 4, 4, 3, 10, 4, 6, - 11, 6, 2, 7, 5, 5, 9, 6, 9, 9, 7, 10, 10, - 4, 6, 2, 3, 9, 4, 2, 6, 5, 7, 4, 5, 7, - 6, 6, 5, 6, 5, 5, 5, 7, 7, 4, 2, 7, 3, - 6, 4, 7, 6, 12, 6, 9, 4, 6, 4, 5, 4, 7, - 6, 5, 6, 7, 5, 4, 7, 3, 2, 4, 5, 9, 5, - 6, 3, 7, 13, 2, 2, 4, 6, 6, 8, 5, 17, 12, - 7, 9, 8, 8, 2, 4, 9, 4, 6, 7, 9, 4, 4, - 2, 6, 5, 8, 4, 5, 8, 4, 3, 9, 5, 5, 6, - 4, 6, 2, 9, 3, 7, + 7, 7, 3, 8, 2, 6, 5, 4, 4, 3, 10, 4, 7, + 6, 9, 4, 2, 6, 5, 9, 9, 4, 7, 3, 2, 4, + 4, 6, 11, 6, 2, 7, 5, 5, 9, 6, 10, 4, 6, + 2, 3, 7, 5, 9, 6, 6, 4, 5, 5, 10, 6, 5, + 7, 4, 5, 7, 6, 7, 7, 6, 5, 7, 3, 7, 4, + 7, 6, 12, 9, 4, 6, 5, 4, 7, 6, 5, 6, 6, + 7, 6, 4, 5, 9, 5, 6, 3, 8, 8, 2, 13, 2, + 2, 4, 6, 6, 8, 5, 17, 12, 7, 9, 4, 9, 4, + 4, 6, 7, 5, 9, 4, 4, 5, 2, 5, 8, 6, 4, + 5, 8, 4, 3, 9, 5, 5, 6, 4, 6, 2, 2, 9, + 3, 7, }; /* aKWOffset[i] is the index into zKWText[] of the start of ** the text for the i-th keyword. */ -static const unsigned short int aKWOffset[136] = { +static const unsigned short int aKWOffset[145] = { 0, 2, 2, 8, 9, 14, 16, 20, 23, 25, 25, 29, 33, 36, 41, 46, 48, 53, 54, 59, 62, 65, 67, 69, 78, 81, - 86, 91, 95, 96, 101, 105, 109, 117, 122, 128, 136, 142, 152, - 159, 162, 162, 165, 167, 167, 171, 176, 179, 184, 184, 188, 192, - 199, 204, 209, 212, 218, 221, 225, 230, 236, 242, 245, 247, 248, - 252, 258, 262, 269, 275, 287, 293, 302, 304, 310, 314, 319, 321, - 328, 333, 338, 344, 350, 355, 358, 358, 358, 361, 365, 368, 377, - 381, 387, 389, 396, 398, 400, 409, 413, 419, 425, 433, 438, 438, - 438, 454, 463, 470, 471, 478, 481, 490, 494, 499, 506, 515, 519, - 523, 525, 531, 535, 543, 546, 551, 559, 559, 563, 572, 577, 582, - 588, 591, 594, 597, 602, 606, + 86, 90, 90, 94, 99, 101, 105, 111, 119, 123, 123, 123, 126, + 129, 132, 137, 142, 146, 147, 152, 156, 160, 168, 174, 181, 184, + 184, 187, 189, 195, 198, 206, 211, 216, 219, 222, 226, 236, 239, + 244, 244, 248, 252, 259, 265, 271, 277, 277, 283, 284, 288, 295, + 299, 306, 312, 324, 333, 335, 341, 346, 348, 355, 360, 365, 371, + 377, 382, 388, 392, 395, 404, 408, 414, 416, 423, 424, 431, 433, + 435, 444, 448, 454, 460, 468, 473, 473, 473, 489, 498, 501, 510, + 513, 517, 522, 529, 534, 543, 547, 550, 555, 557, 561, 569, 575, + 578, 583, 591, 591, 595, 604, 609, 614, 620, 623, 626, 629, 631, + 636, 640, }; /* aKWCode[i] is the parser symbol code for the i-th keyword */ -static const unsigned char aKWCode[136] = { +static const unsigned char aKWCode[145] = { TK_REINDEX, TK_INDEXED, TK_INDEX, TK_DESC, TK_ESCAPE, TK_EACH, TK_CHECK, TK_KEY, TK_BEFORE, TK_FOREIGN, TK_FOR, TK_IGNORE, TK_LIKE_KW, TK_EXPLAIN, TK_INSTEAD, TK_ADD, TK_DATABASE, TK_AS, TK_SELECT, TK_TABLE, TK_JOIN_KW, TK_THEN, TK_END, TK_DEFERRABLE, TK_ELSE, + TK_EXCLUDE, TK_DELETE, TK_TEMP, TK_TEMP, TK_OR, + TK_ISNULL, TK_NULLS, TK_SAVEPOINT, TK_INTERSECT, TK_TIES, + TK_NOTNULL, TK_NOT, TK_NO, TK_NULL, TK_LIKE_KW, TK_EXCEPT, TK_TRANSACTION,TK_ACTION, TK_ON, TK_JOIN_KW, - TK_ALTER, TK_RAISE, TK_EXCLUSIVE, TK_EXISTS, TK_SAVEPOINT, - TK_INTERSECT, TK_TRIGGER, TK_REFERENCES, TK_CONSTRAINT, TK_INTO, - TK_OFFSET, TK_OF, TK_SET, TK_TEMP, TK_TEMP, - TK_OR, TK_UNIQUE, TK_QUERY, TK_WITHOUT, TK_WITH, - TK_JOIN_KW, TK_RELEASE, TK_ATTACH, TK_HAVING, TK_GROUP, - TK_UPDATE, TK_BEGIN, TK_JOIN_KW, TK_RANGE, TK_BETWEEN, - TK_NOTHING, TK_LIKE_KW, TK_BY, TK_CASCADE, TK_ASC, - TK_DELETE, TK_CASE, TK_COLLATE, TK_CREATE, TK_CTIME_KW, - TK_DETACH, TK_IMMEDIATE, TK_JOIN, TK_INSERT, TK_LIKE_KW, - TK_MATCH, TK_PLAN, TK_ANALYZE, TK_PRAGMA, TK_ABORT, - TK_VALUES, TK_VIRTUAL, TK_LIMIT, TK_WHEN, TK_NOTNULL, - TK_NOT, TK_NO, TK_NULL, TK_WHERE, TK_RECURSIVE, - TK_AFTER, TK_RENAME, TK_AND, TK_DEFAULT, TK_AUTOINCR, - TK_TO, TK_IN, TK_CAST, TK_COLUMNKW, TK_COMMIT, - TK_CONFLICT, TK_JOIN_KW, TK_CTIME_KW, TK_CTIME_KW, TK_CURRENT, - TK_PARTITION, TK_DEFERRED, TK_DISTINCT, TK_IS, TK_DROP, - TK_PRECEDING, TK_FAIL, TK_FILTER, TK_REPLACE, TK_FOLLOWING, - TK_FROM, TK_JOIN_KW, TK_IF, TK_ISNULL, TK_ORDER, - TK_RESTRICT, TK_OVER, TK_JOIN_KW, TK_ROLLBACK, TK_ROWS, - TK_ROW, TK_UNBOUNDED, TK_UNION, TK_USING, TK_VACUUM, - TK_VIEW, TK_WINDOW, TK_DO, TK_INITIALLY, TK_ALL, - TK_PRIMARY, + TK_ALTER, TK_RAISE, TK_EXCLUSIVE, TK_EXISTS, TK_CONSTRAINT, + TK_INTO, TK_OFFSET, TK_OF, TK_SET, TK_TRIGGER, + TK_RANGE, TK_GENERATED, TK_DETACH, TK_HAVING, TK_LIKE_KW, + TK_BEGIN, TK_JOIN_KW, TK_REFERENCES, TK_UNIQUE, TK_QUERY, + TK_WITHOUT, TK_WITH, TK_JOIN_KW, TK_RELEASE, TK_ATTACH, + TK_BETWEEN, TK_NOTHING, TK_GROUPS, TK_GROUP, TK_CASCADE, + TK_ASC, TK_DEFAULT, TK_CASE, TK_COLLATE, TK_CREATE, + TK_CTIME_KW, TK_IMMEDIATE, TK_JOIN, TK_INSERT, TK_MATCH, + TK_PLAN, TK_ANALYZE, TK_PRAGMA, TK_ABORT, TK_UPDATE, + TK_VALUES, TK_VIRTUAL, TK_ALWAYS, TK_WHEN, TK_WHERE, + TK_RECURSIVE, TK_AFTER, TK_RENAME, TK_AND, TK_DEFERRED, + TK_DISTINCT, TK_IS, TK_AUTOINCR, TK_TO, TK_IN, + TK_CAST, TK_COLUMNKW, TK_COMMIT, TK_CONFLICT, TK_JOIN_KW, + TK_CTIME_KW, TK_CTIME_KW, TK_CURRENT, TK_PARTITION, TK_DROP, + TK_PRECEDING, TK_FAIL, TK_LAST, TK_FILTER, TK_REPLACE, + TK_FIRST, TK_FOLLOWING, TK_FROM, TK_JOIN_KW, TK_LIMIT, + TK_IF, TK_ORDER, TK_RESTRICT, TK_OTHERS, TK_OVER, + TK_JOIN_KW, TK_ROLLBACK, TK_ROWS, TK_ROW, TK_UNBOUNDED, + TK_UNION, TK_USING, TK_VACUUM, TK_VIEW, TK_WINDOW, + TK_DO, TK_BY, TK_INITIALLY, TK_ALL, TK_PRIMARY, }; +/* Hash table decoded: +** 0: INSERT +** 1: IS +** 2: ROLLBACK TRIGGER +** 3: IMMEDIATE +** 4: PARTITION +** 5: TEMP +** 6: +** 7: +** 8: VALUES WITHOUT +** 9: +** 10: MATCH +** 11: NOTHING +** 12: +** 13: OF +** 14: TIES IGNORE +** 15: PLAN +** 16: INSTEAD INDEXED +** 17: +** 18: TRANSACTION RIGHT +** 19: WHEN +** 20: SET HAVING +** 21: IF +** 22: ROWS +** 23: SELECT +** 24: +** 25: +** 26: VACUUM SAVEPOINT +** 27: +** 28: LIKE UNION VIRTUAL REFERENCES +** 29: RESTRICT +** 30: +** 31: THEN REGEXP +** 32: TO +** 33: +** 34: BEFORE +** 35: +** 36: +** 37: FOLLOWING COLLATE CASCADE +** 38: CREATE +** 39: +** 40: CASE REINDEX +** 41: EACH +** 42: +** 43: QUERY +** 44: AND ADD +** 45: PRIMARY ANALYZE +** 46: +** 47: ROW ASC DETACH +** 48: CURRENT_TIME CURRENT_DATE +** 49: +** 50: +** 51: EXCLUSIVE TEMPORARY +** 52: +** 53: DEFERRED +** 54: DEFERRABLE +** 55: +** 56: DATABASE +** 57: +** 58: DELETE VIEW GENERATED +** 59: ATTACH +** 60: END +** 61: EXCLUDE +** 62: ESCAPE DESC +** 63: GLOB +** 64: WINDOW ELSE +** 65: COLUMN +** 66: FIRST +** 67: +** 68: GROUPS ALL +** 69: DISTINCT DROP KEY +** 70: BETWEEN +** 71: INITIALLY +** 72: BEGIN +** 73: FILTER CHECK ACTION +** 74: GROUP INDEX +** 75: +** 76: EXISTS DEFAULT +** 77: +** 78: FOR CURRENT_TIMESTAMP +** 79: EXCEPT +** 80: +** 81: CROSS +** 82: +** 83: +** 84: +** 85: CAST +** 86: FOREIGN AUTOINCREMENT +** 87: COMMIT +** 88: CURRENT AFTER ALTER +** 89: FULL FAIL CONFLICT +** 90: EXPLAIN +** 91: CONSTRAINT +** 92: FROM ALWAYS +** 93: +** 94: ABORT +** 95: +** 96: AS DO +** 97: REPLACE WITH RELEASE +** 98: BY RENAME +** 99: RANGE RAISE +** 100: OTHERS +** 101: USING NULLS +** 102: PRAGMA +** 103: JOIN ISNULL OFFSET +** 104: NOT +** 105: OR LAST LEFT +** 106: LIMIT +** 107: +** 108: +** 109: IN +** 110: INTO +** 111: OVER RECURSIVE +** 112: ORDER OUTER +** 113: +** 114: INTERSECT UNBOUNDED +** 115: +** 116: +** 117: ON +** 118: +** 119: WHERE +** 120: NO INNER +** 121: NULL +** 122: +** 123: TABLE +** 124: NATURAL NOTNULL +** 125: PRECEDING +** 126: UPDATE UNIQUE +*/ /* Check to see if z[0..n-1] is a keyword. If it is, write the ** parser symbol code for that keyword into *pType. Always ** return the integer n (the length of the token). */ @@ -150662,117 +157801,126 @@ static int keywordCode(const char *z, int n, int *pType){ testcase( i==22 ); /* END */ testcase( i==23 ); /* DEFERRABLE */ testcase( i==24 ); /* ELSE */ - testcase( i==25 ); /* EXCEPT */ - testcase( i==26 ); /* TRANSACTION */ - testcase( i==27 ); /* ACTION */ - testcase( i==28 ); /* ON */ - testcase( i==29 ); /* NATURAL */ - testcase( i==30 ); /* ALTER */ - testcase( i==31 ); /* RAISE */ - testcase( i==32 ); /* EXCLUSIVE */ - testcase( i==33 ); /* EXISTS */ - testcase( i==34 ); /* SAVEPOINT */ - testcase( i==35 ); /* INTERSECT */ - testcase( i==36 ); /* TRIGGER */ - testcase( i==37 ); /* REFERENCES */ - testcase( i==38 ); /* CONSTRAINT */ - testcase( i==39 ); /* INTO */ - testcase( i==40 ); /* OFFSET */ - testcase( i==41 ); /* OF */ - testcase( i==42 ); /* SET */ - testcase( i==43 ); /* TEMPORARY */ - testcase( i==44 ); /* TEMP */ - testcase( i==45 ); /* OR */ - testcase( i==46 ); /* UNIQUE */ - testcase( i==47 ); /* QUERY */ - testcase( i==48 ); /* WITHOUT */ - testcase( i==49 ); /* WITH */ - testcase( i==50 ); /* OUTER */ - testcase( i==51 ); /* RELEASE */ - testcase( i==52 ); /* ATTACH */ - testcase( i==53 ); /* HAVING */ - testcase( i==54 ); /* GROUP */ - testcase( i==55 ); /* UPDATE */ - testcase( i==56 ); /* BEGIN */ - testcase( i==57 ); /* INNER */ - testcase( i==58 ); /* RANGE */ - testcase( i==59 ); /* BETWEEN */ - testcase( i==60 ); /* NOTHING */ - testcase( i==61 ); /* GLOB */ - testcase( i==62 ); /* BY */ - testcase( i==63 ); /* CASCADE */ - testcase( i==64 ); /* ASC */ - testcase( i==65 ); /* DELETE */ - testcase( i==66 ); /* CASE */ - testcase( i==67 ); /* COLLATE */ - testcase( i==68 ); /* CREATE */ - testcase( i==69 ); /* CURRENT_DATE */ - testcase( i==70 ); /* DETACH */ - testcase( i==71 ); /* IMMEDIATE */ - testcase( i==72 ); /* JOIN */ - testcase( i==73 ); /* INSERT */ - testcase( i==74 ); /* LIKE */ - testcase( i==75 ); /* MATCH */ - testcase( i==76 ); /* PLAN */ - testcase( i==77 ); /* ANALYZE */ - testcase( i==78 ); /* PRAGMA */ - testcase( i==79 ); /* ABORT */ - testcase( i==80 ); /* VALUES */ - testcase( i==81 ); /* VIRTUAL */ - testcase( i==82 ); /* LIMIT */ - testcase( i==83 ); /* WHEN */ - testcase( i==84 ); /* NOTNULL */ - testcase( i==85 ); /* NOT */ - testcase( i==86 ); /* NO */ - testcase( i==87 ); /* NULL */ - testcase( i==88 ); /* WHERE */ - testcase( i==89 ); /* RECURSIVE */ - testcase( i==90 ); /* AFTER */ - testcase( i==91 ); /* RENAME */ - testcase( i==92 ); /* AND */ - testcase( i==93 ); /* DEFAULT */ - testcase( i==94 ); /* AUTOINCREMENT */ - testcase( i==95 ); /* TO */ - testcase( i==96 ); /* IN */ - testcase( i==97 ); /* CAST */ - testcase( i==98 ); /* COLUMN */ - testcase( i==99 ); /* COMMIT */ - testcase( i==100 ); /* CONFLICT */ - testcase( i==101 ); /* CROSS */ - testcase( i==102 ); /* CURRENT_TIMESTAMP */ - testcase( i==103 ); /* CURRENT_TIME */ - testcase( i==104 ); /* CURRENT */ - testcase( i==105 ); /* PARTITION */ - testcase( i==106 ); /* DEFERRED */ - testcase( i==107 ); /* DISTINCT */ - testcase( i==108 ); /* IS */ - testcase( i==109 ); /* DROP */ - testcase( i==110 ); /* PRECEDING */ - testcase( i==111 ); /* FAIL */ - testcase( i==112 ); /* FILTER */ - testcase( i==113 ); /* REPLACE */ - testcase( i==114 ); /* FOLLOWING */ - testcase( i==115 ); /* FROM */ - testcase( i==116 ); /* FULL */ - testcase( i==117 ); /* IF */ - testcase( i==118 ); /* ISNULL */ - testcase( i==119 ); /* ORDER */ - testcase( i==120 ); /* RESTRICT */ - testcase( i==121 ); /* OVER */ - testcase( i==122 ); /* RIGHT */ - testcase( i==123 ); /* ROLLBACK */ - testcase( i==124 ); /* ROWS */ - testcase( i==125 ); /* ROW */ - testcase( i==126 ); /* UNBOUNDED */ - testcase( i==127 ); /* UNION */ - testcase( i==128 ); /* USING */ - testcase( i==129 ); /* VACUUM */ - testcase( i==130 ); /* VIEW */ - testcase( i==131 ); /* WINDOW */ - testcase( i==132 ); /* DO */ - testcase( i==133 ); /* INITIALLY */ - testcase( i==134 ); /* ALL */ - testcase( i==135 ); /* PRIMARY */ + testcase( i==25 ); /* EXCLUDE */ + testcase( i==26 ); /* DELETE */ + testcase( i==27 ); /* TEMPORARY */ + testcase( i==28 ); /* TEMP */ + testcase( i==29 ); /* OR */ + testcase( i==30 ); /* ISNULL */ + testcase( i==31 ); /* NULLS */ + testcase( i==32 ); /* SAVEPOINT */ + testcase( i==33 ); /* INTERSECT */ + testcase( i==34 ); /* TIES */ + testcase( i==35 ); /* NOTNULL */ + testcase( i==36 ); /* NOT */ + testcase( i==37 ); /* NO */ + testcase( i==38 ); /* NULL */ + testcase( i==39 ); /* LIKE */ + testcase( i==40 ); /* EXCEPT */ + testcase( i==41 ); /* TRANSACTION */ + testcase( i==42 ); /* ACTION */ + testcase( i==43 ); /* ON */ + testcase( i==44 ); /* NATURAL */ + testcase( i==45 ); /* ALTER */ + testcase( i==46 ); /* RAISE */ + testcase( i==47 ); /* EXCLUSIVE */ + testcase( i==48 ); /* EXISTS */ + testcase( i==49 ); /* CONSTRAINT */ + testcase( i==50 ); /* INTO */ + testcase( i==51 ); /* OFFSET */ + testcase( i==52 ); /* OF */ + testcase( i==53 ); /* SET */ + testcase( i==54 ); /* TRIGGER */ + testcase( i==55 ); /* RANGE */ + testcase( i==56 ); /* GENERATED */ + testcase( i==57 ); /* DETACH */ + testcase( i==58 ); /* HAVING */ + testcase( i==59 ); /* GLOB */ + testcase( i==60 ); /* BEGIN */ + testcase( i==61 ); /* INNER */ + testcase( i==62 ); /* REFERENCES */ + testcase( i==63 ); /* UNIQUE */ + testcase( i==64 ); /* QUERY */ + testcase( i==65 ); /* WITHOUT */ + testcase( i==66 ); /* WITH */ + testcase( i==67 ); /* OUTER */ + testcase( i==68 ); /* RELEASE */ + testcase( i==69 ); /* ATTACH */ + testcase( i==70 ); /* BETWEEN */ + testcase( i==71 ); /* NOTHING */ + testcase( i==72 ); /* GROUPS */ + testcase( i==73 ); /* GROUP */ + testcase( i==74 ); /* CASCADE */ + testcase( i==75 ); /* ASC */ + testcase( i==76 ); /* DEFAULT */ + testcase( i==77 ); /* CASE */ + testcase( i==78 ); /* COLLATE */ + testcase( i==79 ); /* CREATE */ + testcase( i==80 ); /* CURRENT_DATE */ + testcase( i==81 ); /* IMMEDIATE */ + testcase( i==82 ); /* JOIN */ + testcase( i==83 ); /* INSERT */ + testcase( i==84 ); /* MATCH */ + testcase( i==85 ); /* PLAN */ + testcase( i==86 ); /* ANALYZE */ + testcase( i==87 ); /* PRAGMA */ + testcase( i==88 ); /* ABORT */ + testcase( i==89 ); /* UPDATE */ + testcase( i==90 ); /* VALUES */ + testcase( i==91 ); /* VIRTUAL */ + testcase( i==92 ); /* ALWAYS */ + testcase( i==93 ); /* WHEN */ + testcase( i==94 ); /* WHERE */ + testcase( i==95 ); /* RECURSIVE */ + testcase( i==96 ); /* AFTER */ + testcase( i==97 ); /* RENAME */ + testcase( i==98 ); /* AND */ + testcase( i==99 ); /* DEFERRED */ + testcase( i==100 ); /* DISTINCT */ + testcase( i==101 ); /* IS */ + testcase( i==102 ); /* AUTOINCREMENT */ + testcase( i==103 ); /* TO */ + testcase( i==104 ); /* IN */ + testcase( i==105 ); /* CAST */ + testcase( i==106 ); /* COLUMN */ + testcase( i==107 ); /* COMMIT */ + testcase( i==108 ); /* CONFLICT */ + testcase( i==109 ); /* CROSS */ + testcase( i==110 ); /* CURRENT_TIMESTAMP */ + testcase( i==111 ); /* CURRENT_TIME */ + testcase( i==112 ); /* CURRENT */ + testcase( i==113 ); /* PARTITION */ + testcase( i==114 ); /* DROP */ + testcase( i==115 ); /* PRECEDING */ + testcase( i==116 ); /* FAIL */ + testcase( i==117 ); /* LAST */ + testcase( i==118 ); /* FILTER */ + testcase( i==119 ); /* REPLACE */ + testcase( i==120 ); /* FIRST */ + testcase( i==121 ); /* FOLLOWING */ + testcase( i==122 ); /* FROM */ + testcase( i==123 ); /* FULL */ + testcase( i==124 ); /* LIMIT */ + testcase( i==125 ); /* IF */ + testcase( i==126 ); /* ORDER */ + testcase( i==127 ); /* RESTRICT */ + testcase( i==128 ); /* OTHERS */ + testcase( i==129 ); /* OVER */ + testcase( i==130 ); /* RIGHT */ + testcase( i==131 ); /* ROLLBACK */ + testcase( i==132 ); /* ROWS */ + testcase( i==133 ); /* ROW */ + testcase( i==134 ); /* UNBOUNDED */ + testcase( i==135 ); /* UNION */ + testcase( i==136 ); /* USING */ + testcase( i==137 ); /* VACUUM */ + testcase( i==138 ); /* VIEW */ + testcase( i==139 ); /* WINDOW */ + testcase( i==140 ); /* DO */ + testcase( i==141 ); /* BY */ + testcase( i==142 ); /* INITIALLY */ + testcase( i==143 ); /* ALL */ + testcase( i==144 ); /* PRIMARY */ *pType = aKWCode[i]; break; } @@ -150784,7 +157932,7 @@ SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char *z, int n){ keywordCode((char*)z, n, &id); return id; } -#define SQLITE_N_KEYWORD 136 +#define SQLITE_N_KEYWORD 145 SQLITE_API int sqlite3_keyword_name(int i,const char **pzName,int *pnName){ if( i<0 || i>=SQLITE_N_KEYWORD ) return SQLITE_ERROR; *pzName = zKWText + aKWOffset[i]; @@ -151217,6 +158365,7 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr #ifdef sqlite3Parser_ENGINEALWAYSONSTACK yyParser sEngine; /* Space to hold the Lemon-generated Parser object */ #endif + VVA_ONLY( u8 startedWithOom = db->mallocFailed ); assert( zSql!=0 ); mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH]; @@ -151226,7 +158375,14 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr pParse->rc = SQLITE_OK; pParse->zTail = zSql; assert( pzErrMsg!=0 ); - /* sqlite3ParserTrace(stdout, "parser: "); */ +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_ParserTrace ){ + printf("parser: [[[%s]]]\n", zSql); + sqlite3ParserTrace(stdout, "parser: "); + }else{ + sqlite3ParserTrace(0, 0); + } +#endif #ifdef sqlite3Parser_ENGINEALWAYSONSTACK pEngine = &sEngine; sqlite3ParserInit(pEngine, pParse); @@ -151241,6 +158397,8 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr assert( pParse->pNewTrigger==0 ); assert( pParse->nVar==0 ); assert( pParse->pVList==0 ); + pParse->pParentParse = db->pParse; + db->pParse = pParse; while( 1 ){ n = sqlite3GetToken((u8*)zSql, &tokenType); mxSqlLen -= n; @@ -151297,7 +158455,8 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr sqlite3Parser(pEngine, tokenType, pParse->sLastToken); lastTokenParsed = tokenType; zSql += n; - if( pParse->rc!=SQLITE_OK || db->mallocFailed ) break; + assert( db->mallocFailed==0 || pParse->rc!=SQLITE_OK || startedWithOom ); + if( pParse->rc!=SQLITE_OK ) break; } assert( nErr==0 ); #ifdef YYTRACKMAXSTACKDEPTH @@ -151365,10 +158524,147 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr pParse->pZombieTab = p->pNextZombie; sqlite3DeleteTable(db, p); } + db->pParse = pParse->pParentParse; + pParse->pParentParse = 0; assert( nErr==0 || pParse->rc!=SQLITE_OK ); return nErr; } + +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** Insert a single space character into pStr if the current string +** ends with an identifier +*/ +static void addSpaceSeparator(sqlite3_str *pStr){ + if( pStr->nChar && sqlite3IsIdChar(pStr->zText[pStr->nChar-1]) ){ + sqlite3_str_append(pStr, " ", 1); + } +} + +/* +** Compute a normalization of the SQL given by zSql[0..nSql-1]. Return +** the normalization in space obtained from sqlite3DbMalloc(). Or return +** NULL if anything goes wrong or if zSql is NULL. +*/ +SQLITE_PRIVATE char *sqlite3Normalize( + Vdbe *pVdbe, /* VM being reprepared */ + const char *zSql /* The original SQL string */ +){ + sqlite3 *db; /* The database connection */ + int i; /* Next unread byte of zSql[] */ + int n; /* length of current token */ + int tokenType; /* type of current token */ + int prevType = 0; /* Previous non-whitespace token */ + int nParen; /* Number of nested levels of parentheses */ + int iStartIN; /* Start of RHS of IN operator in z[] */ + int nParenAtIN; /* Value of nParent at start of RHS of IN operator */ + u32 j; /* Bytes of normalized SQL generated so far */ + sqlite3_str *pStr; /* The normalized SQL string under construction */ + + db = sqlite3VdbeDb(pVdbe); + tokenType = -1; + nParen = iStartIN = nParenAtIN = 0; + pStr = sqlite3_str_new(db); + assert( pStr!=0 ); /* sqlite3_str_new() never returns NULL */ + for(i=0; zSql[i] && pStr->accError==0; i+=n){ + if( tokenType!=TK_SPACE ){ + prevType = tokenType; + } + n = sqlite3GetToken((unsigned char*)zSql+i, &tokenType); + if( NEVER(n<=0) ) break; + switch( tokenType ){ + case TK_SPACE: { + break; + } + case TK_NULL: { + if( prevType==TK_IS || prevType==TK_NOT ){ + sqlite3_str_append(pStr, " NULL", 5); + break; + } + /* Fall through */ + } + case TK_STRING: + case TK_INTEGER: + case TK_FLOAT: + case TK_VARIABLE: + case TK_BLOB: { + sqlite3_str_append(pStr, "?", 1); + break; + } + case TK_LP: { + nParen++; + if( prevType==TK_IN ){ + iStartIN = pStr->nChar; + nParenAtIN = nParen; + } + sqlite3_str_append(pStr, "(", 1); + break; + } + case TK_RP: { + if( iStartIN>0 && nParen==nParenAtIN ){ + assert( pStr->nChar>=(u32)iStartIN ); + pStr->nChar = iStartIN+1; + sqlite3_str_append(pStr, "?,?,?", 5); + iStartIN = 0; + } + nParen--; + sqlite3_str_append(pStr, ")", 1); + break; + } + case TK_ID: { + iStartIN = 0; + j = pStr->nChar; + if( sqlite3Isquote(zSql[i]) ){ + char *zId = sqlite3DbStrNDup(db, zSql+i, n); + int nId; + int eType = 0; + if( zId==0 ) break; + sqlite3Dequote(zId); + if( zSql[i]=='"' && sqlite3VdbeUsesDoubleQuotedString(pVdbe, zId) ){ + sqlite3_str_append(pStr, "?", 1); + sqlite3DbFree(db, zId); + break; + } + nId = sqlite3Strlen30(zId); + if( sqlite3GetToken((u8*)zId, &eType)==nId && eType==TK_ID ){ + addSpaceSeparator(pStr); + sqlite3_str_append(pStr, zId, nId); + }else{ + sqlite3_str_appendf(pStr, "\"%w\"", zId); + } + sqlite3DbFree(db, zId); + }else{ + addSpaceSeparator(pStr); + sqlite3_str_append(pStr, zSql+i, n); + } + while( jnChar ){ + pStr->zText[j] = sqlite3Tolower(pStr->zText[j]); + j++; + } + break; + } + case TK_SELECT: { + iStartIN = 0; + /* fall through */ + } + default: { + if( sqlite3IsIdChar(zSql[i]) ) addSpaceSeparator(pStr); + j = pStr->nChar; + sqlite3_str_append(pStr, zSql+i, n); + while( jnChar ){ + pStr->zText[j] = sqlite3Toupper(pStr->zText[j]); + j++; + } + break; + } + } + } + if( tokenType!=TK_SEMI ) sqlite3_str_append(pStr, ";", 1); + return sqlite3_str_finish(pStr); +} +#endif /* SQLITE_ENABLE_NORMALIZE */ + /************** End of tokenize.c ********************************************/ /************** Begin file complete.c ****************************************/ /* @@ -152414,6 +159710,13 @@ SQLITE_API int sqlite3_config(int op, ...){ } #endif /* SQLITE_ENABLE_SORTER_REFERENCES */ +#ifdef SQLITE_ENABLE_DESERIALIZE + case SQLITE_CONFIG_MEMDB_MAXSIZE: { + sqlite3GlobalConfig.mxMemdbSize = va_arg(ap, sqlite3_int64); + break; + } +#endif /* SQLITE_ENABLE_DESERIALIZE */ + default: { rc = SQLITE_ERROR; break; @@ -152437,6 +159740,9 @@ SQLITE_API int sqlite3_config(int op, ...){ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ #ifndef SQLITE_OMIT_LOOKASIDE void *pStart; + sqlite3_int64 szAlloc = sz*(sqlite3_int64)cnt; + int nBig; /* Number of full-size slots */ + int nSm; /* Number smaller LOOKASIDE_SMALL-byte slots */ if( sqlite3LookasideUsed(db,0)>0 ){ return SQLITE_BUSY; @@ -152459,37 +159765,71 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ pStart = 0; }else if( pBuf==0 ){ sqlite3BeginBenignMalloc(); - pStart = sqlite3Malloc( sz*cnt ); /* IMP: R-61949-35727 */ + pStart = sqlite3Malloc( szAlloc ); /* IMP: R-61949-35727 */ sqlite3EndBenignMalloc(); - if( pStart ) cnt = sqlite3MallocSize(pStart)/sz; + if( pStart ) szAlloc = sqlite3MallocSize(pStart); }else{ pStart = pBuf; } +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + if( sz>=LOOKASIDE_SMALL*3 ){ + nBig = szAlloc/(3*LOOKASIDE_SMALL+sz); + nSm = (szAlloc - sz*nBig)/LOOKASIDE_SMALL; + }else if( sz>=LOOKASIDE_SMALL*2 ){ + nBig = szAlloc/(LOOKASIDE_SMALL+sz); + nSm = (szAlloc - sz*nBig)/LOOKASIDE_SMALL; + }else +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ + if( sz>0 ){ + nBig = szAlloc/sz; + nSm = 0; + }else{ + nBig = nSm = 0; + } db->lookaside.pStart = pStart; db->lookaside.pInit = 0; db->lookaside.pFree = 0; db->lookaside.sz = (u16)sz; + db->lookaside.szTrue = (u16)sz; if( pStart ){ int i; LookasideSlot *p; assert( sz > (int)sizeof(LookasideSlot*) ); - db->lookaside.nSlot = cnt; p = (LookasideSlot*)pStart; - for(i=cnt-1; i>=0; i--){ + for(i=0; ipNext = db->lookaside.pInit; db->lookaside.pInit = p; p = (LookasideSlot*)&((u8*)p)[sz]; } +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + db->lookaside.pSmallInit = 0; + db->lookaside.pSmallFree = 0; + db->lookaside.pMiddle = p; + for(i=0; ipNext = db->lookaside.pSmallInit; + db->lookaside.pSmallInit = p; + p = (LookasideSlot*)&((u8*)p)[LOOKASIDE_SMALL]; + } +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ + assert( ((uptr)p)<=szAlloc + (uptr)pStart ); db->lookaside.pEnd = p; db->lookaside.bDisable = 0; db->lookaside.bMalloced = pBuf==0 ?1:0; + db->lookaside.nSlot = nBig+nSm; }else{ db->lookaside.pStart = db; +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + db->lookaside.pSmallInit = 0; + db->lookaside.pSmallFree = 0; + db->lookaside.pMiddle = db; +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ db->lookaside.pEnd = db; db->lookaside.bDisable = 1; + db->lookaside.sz = 0; db->lookaside.bMalloced = 0; db->lookaside.nSlot = 0; } + assert( sqlite3LookasideUsed(db,0)==0 ); #endif /* SQLITE_OMIT_LOOKASIDE */ return SQLITE_OK; } @@ -152590,12 +159930,21 @@ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){ } aFlagOp[] = { { SQLITE_DBCONFIG_ENABLE_FKEY, SQLITE_ForeignKeys }, { SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_EnableTrigger }, + { SQLITE_DBCONFIG_ENABLE_VIEW, SQLITE_EnableView }, { SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, SQLITE_Fts3Tokenizer }, { SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, SQLITE_LoadExtension }, { SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE, SQLITE_NoCkptOnClose }, { SQLITE_DBCONFIG_ENABLE_QPSG, SQLITE_EnableQPSG }, { SQLITE_DBCONFIG_TRIGGER_EQP, SQLITE_TriggerEQP }, { SQLITE_DBCONFIG_RESET_DATABASE, SQLITE_ResetDatabase }, + { SQLITE_DBCONFIG_DEFENSIVE, SQLITE_Defensive }, + { SQLITE_DBCONFIG_WRITABLE_SCHEMA, SQLITE_WriteSchema| + SQLITE_NoSchemaError }, + { SQLITE_DBCONFIG_LEGACY_ALTER_TABLE, SQLITE_LegacyAlter }, + { SQLITE_DBCONFIG_DQS_DDL, SQLITE_DqsDDL }, + { SQLITE_DBCONFIG_DQS_DML, SQLITE_DqsDML }, + { SQLITE_DBCONFIG_LEGACY_FILE_FORMAT, SQLITE_LegacyFileFmt }, + { SQLITE_DBCONFIG_TRUSTED_SCHEMA, SQLITE_TrustedSchema }, }; unsigned int i; rc = SQLITE_ERROR; /* IMP: R-42790-23372 */ @@ -152603,11 +159952,11 @@ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){ if( aFlagOp[i].op==op ){ int onoff = va_arg(ap, int); int *pRes = va_arg(ap, int*); - u32 oldFlags = db->flags; + u64 oldFlags = db->flags; if( onoff>0 ){ db->flags |= aFlagOp[i].mask; }else if( onoff==0 ){ - db->flags &= ~aFlagOp[i].mask; + db->flags &= ~(u64)aFlagOp[i].mask; } if( oldFlags!=db->flags ){ sqlite3ExpirePreparedStatements(db, 0); @@ -152626,28 +159975,17 @@ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){ return rc; } - -/* -** Return true if the buffer z[0..n-1] contains all spaces. -*/ -static int allSpaces(const char *z, int n){ - while( n>0 && z[n-1]==' ' ){ n--; } - return n==0; -} - /* ** This is the default collating function named "BINARY" which is always ** available. -** -** If the padFlag argument is not NULL then space padding at the end -** of strings is ignored. This implements the RTRIM collation. */ static int binCollFunc( - void *padFlag, + void *NotUsed, int nKey1, const void *pKey1, int nKey2, const void *pKey2 ){ int rc, n; + UNUSED_PARAMETER(NotUsed); n = nKey1xCmp!=binCollFunc || p->pUser!=0 - || strcmp(p->zName,"BINARY")==0 ); - return p==0 || (p->xCmp==binCollFunc && p->pUser==0); + assert( p==0 || p->xCmp!=binCollFunc || strcmp(p->zName,"BINARY")==0 ); + return p==0 || p->xCmp==binCollFunc; } /* @@ -152990,11 +160332,8 @@ SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){ #ifndef SQLITE_OMIT_VIRTUALTABLE for(i=sqliteHashFirst(&db->aModule); i; i=sqliteHashNext(i)){ Module *pMod = (Module *)sqliteHashData(i); - if( pMod->xDestroy ){ - pMod->xDestroy(pMod->pAux); - } sqlite3VtabEponymousTableClear(db, pMod); - sqlite3DbFree(db, pMod); + sqlite3VtabModuleUnref(db, pMod); } sqlite3HashClear(&db->aModule); #endif @@ -153070,7 +160409,7 @@ SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db, int tripCode){ /* Any deferred constraint violations have now been resolved. */ db->nDeferredCons = 0; db->nDeferredImmCons = 0; - db->flags &= ~SQLITE_DeferFKs; + db->flags &= ~(u64)SQLITE_DeferFKs; /* If one has been configured, invoke the rollback-hook callback */ if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){ @@ -153144,6 +160483,7 @@ SQLITE_PRIVATE const char *sqlite3ErrName(int rc){ case SQLITE_CANTOPEN_ISDIR: zName = "SQLITE_CANTOPEN_ISDIR"; break; case SQLITE_CANTOPEN_FULLPATH: zName = "SQLITE_CANTOPEN_FULLPATH"; break; case SQLITE_CANTOPEN_CONVPATH: zName = "SQLITE_CANTOPEN_CONVPATH"; break; + case SQLITE_CANTOPEN_SYMLINK: zName = "SQLITE_CANTOPEN_SYMLINK"; break; case SQLITE_PROTOCOL: zName = "SQLITE_PROTOCOL"; break; case SQLITE_EMPTY: zName = "SQLITE_EMPTY"; break; case SQLITE_SCHEMA: zName = "SQLITE_SCHEMA"; break; @@ -153475,8 +160815,16 @@ SQLITE_PRIVATE int sqlite3CreateFunc( } assert( SQLITE_FUNC_CONSTANT==SQLITE_DETERMINISTIC ); - extraFlags = enc & SQLITE_DETERMINISTIC; + assert( SQLITE_FUNC_DIRECT==SQLITE_DIRECTONLY ); + extraFlags = enc & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY| + SQLITE_SUBTYPE|SQLITE_INNOCUOUS); enc &= (SQLITE_FUNC_ENCMASK|SQLITE_ANY); + + /* The SQLITE_INNOCUOUS flag is the same bit as SQLITE_FUNC_UNSAFE. But + ** the meaning is inverted. So flip the bit. */ + assert( SQLITE_FUNC_UNSAFE==SQLITE_INNOCUOUS ); + extraFlags ^= SQLITE_FUNC_UNSAFE; + #ifndef SQLITE_OMIT_UTF16 /* If SQLITE_UTF16 is specified as the encoding type, transform this @@ -153490,11 +160838,13 @@ SQLITE_PRIVATE int sqlite3CreateFunc( enc = SQLITE_UTF16NATIVE; }else if( enc==SQLITE_ANY ){ int rc; - rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8|extraFlags, + rc = sqlite3CreateFunc(db, zFunctionName, nArg, + (SQLITE_UTF8|extraFlags)^SQLITE_FUNC_UNSAFE, pUserData, xSFunc, xStep, xFinal, xValue, xInverse, pDestructor); if( rc==SQLITE_OK ){ - rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE|extraFlags, - pUserData, xSFunc, xStep, xFinal, xValue, xInverse, pDestructor); + rc = sqlite3CreateFunc(db, zFunctionName, nArg, + (SQLITE_UTF16LE|extraFlags)^SQLITE_FUNC_UNSAFE, + pUserData, xSFunc, xStep, xFinal, xValue, xInverse, pDestructor); } if( rc!=SQLITE_OK ){ return rc; @@ -153538,6 +160888,7 @@ SQLITE_PRIVATE int sqlite3CreateFunc( p->u.pDestructor = pDestructor; p->funcFlags = (p->funcFlags & SQLITE_FUNC_ENCMASK) | extraFlags; testcase( p->funcFlags & SQLITE_DETERMINISTIC ); + testcase( p->funcFlags & SQLITE_DIRECTONLY ); p->xSFunc = xSFunc ? xSFunc : xStep; p->xFinalize = xFinal; p->xValue = xValue; @@ -153812,6 +161163,8 @@ SQLITE_API void *sqlite3_profile( pOld = db->pProfileArg; db->xProfile = xProfile; db->pProfileArg = pArg; + db->mTrace &= SQLITE_TRACE_NONLEGACY_MASK; + if( db->xProfile ) db->mTrace |= SQLITE_TRACE_XPROFILE; sqlite3_mutex_leave(db->mutex); return pOld; } @@ -154163,7 +161516,7 @@ SQLITE_API const char *sqlite3_errmsg(sqlite3 *db){ z = sqlite3ErrStr(SQLITE_NOMEM_BKPT); }else{ testcase( db->pErr==0 ); - z = (char*)sqlite3_value_text(db->pErr); + z = db->errCode ? (char*)sqlite3_value_text(db->pErr) : 0; assert( !db->mallocFailed ); if( z==0 ){ z = sqlite3ErrStr(db->errCode); @@ -154693,6 +162046,40 @@ SQLITE_PRIVATE int sqlite3ParseUri( return rc; } +#if defined(SQLITE_HAS_CODEC) +/* +** Process URI filename query parameters relevant to the SQLite Encryption +** Extension. Return true if any of the relevant query parameters are +** seen and return false if not. +*/ +SQLITE_PRIVATE int sqlite3CodecQueryParameters( + sqlite3 *db, /* Database connection */ + const char *zDb, /* Which schema is being created/attached */ + const char *zUri /* URI filename */ +){ + const char *zKey; + if( (zKey = sqlite3_uri_parameter(zUri, "hexkey"))!=0 && zKey[0] ){ + u8 iByte; + int i; + char zDecoded[40]; + for(i=0, iByte=0; imagic = SQLITE_MAGIC_BUSY; db->aDb = db->aDbStatic; db->lookaside.bDisable = 1; + db->lookaside.sz = 0; assert( sizeof(db->aLimit)==sizeof(aHardLimit) ); memcpy(db->aLimit, aHardLimit, sizeof(db->aLimit)); @@ -154792,7 +162180,38 @@ static int openDatabase( db->szMmap = sqlite3GlobalConfig.szMmap; db->nextPagesize = 0; db->nMaxSorterMmap = 0x7FFFFFFF; - db->flags |= SQLITE_ShortColNames | SQLITE_EnableTrigger | SQLITE_CacheSpill + db->flags |= SQLITE_ShortColNames + | SQLITE_EnableTrigger + | SQLITE_EnableView + | SQLITE_CacheSpill +#if !defined(SQLITE_TRUSTED_SCHEMA) || SQLITE_TRUSTED_SCHEMA+0!=0 + | SQLITE_TrustedSchema +#endif +/* The SQLITE_DQS compile-time option determines the default settings +** for SQLITE_DBCONFIG_DQS_DDL and SQLITE_DBCONFIG_DQS_DML. +** +** SQLITE_DQS SQLITE_DBCONFIG_DQS_DDL SQLITE_DBCONFIG_DQS_DML +** ---------- ----------------------- ----------------------- +** undefined on on +** 3 on on +** 2 on off +** 1 off on +** 0 off off +** +** Legacy behavior is 3 (double-quoted string literals are allowed anywhere) +** and so that is the default. But developers are encouranged to use +** -DSQLITE_DQS=0 (best) or -DSQLITE_DQS=1 (second choice) if possible. +*/ +#if !defined(SQLITE_DQS) +# define SQLITE_DQS 3 +#endif +#if (SQLITE_DQS&1)==1 + | SQLITE_DqsDML +#endif +#if (SQLITE_DQS&2)==2 + | SQLITE_DqsDDL +#endif + #if !defined(SQLITE_DEFAULT_AUTOMATIC_INDEX) || SQLITE_DEFAULT_AUTOMATIC_INDEX | SQLITE_AutoIndex #endif @@ -154822,6 +162241,9 @@ static int openDatabase( #endif #if defined(SQLITE_ENABLE_QPSG) | SQLITE_EnableQPSG +#endif +#if defined(SQLITE_DEFAULT_DEFENSIVE) + | SQLITE_Defensive #endif ; sqlite3HashInit(&db->aCollSeq); @@ -154840,7 +162262,7 @@ static int openDatabase( createCollation(db, sqlite3StrBINARY, SQLITE_UTF16BE, 0, binCollFunc, 0); createCollation(db, sqlite3StrBINARY, SQLITE_UTF16LE, 0, binCollFunc, 0); createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0); - createCollation(db, "RTRIM", SQLITE_UTF8, (void*)1, binCollFunc, 0); + createCollation(db, "RTRIM", SQLITE_UTF8, 0, rtrimCollFunc, 0); if( db->mallocFailed ){ goto opendb_out; } @@ -154994,6 +162416,13 @@ static int openDatabase( } #endif +#ifdef SQLITE_ENABLE_INTERNAL_FUNCTIONS + /* Testing use only!!! The -DSQLITE_ENABLE_INTERNAL_FUNCTIONS=1 compile-time + ** option gives access to internal functions by default. + ** Testing use only!!! */ + db->mDbFlags |= DBFLAG_InternalFunc; +#endif + /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking ** mode. -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking ** mode. Doing nothing at all also makes NORMAL the default. @@ -155035,26 +162464,13 @@ static int openDatabase( } #endif #if defined(SQLITE_HAS_CODEC) - if( rc==SQLITE_OK ){ - const char *zKey; - if( (zKey = sqlite3_uri_parameter(zOpen, "hexkey"))!=0 && zKey[0] ){ - u8 iByte; - int i; - char zDecoded[40]; - for(i=0, iByte=0; iaDb[0].pSchema!=0 ); + if( db && (y = db->aDb[0].pSchema->schema_cookie)!=0 ){ x = y; } + sqlite3Config.iPrngSeed = x; sqlite3_randomness(0,0); break; } +#endif /* ** sqlite3_test_control(BITVEC_TEST, size, program) @@ -155710,15 +163149,25 @@ SQLITE_API int sqlite3_test_control(int op, ...){ /* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, int onoff); ** - ** If parameter onoff is non-zero, configure the wrappers so that all - ** subsequent calls to localtime() and variants fail. If onoff is zero, - ** undo this setting. + ** If parameter onoff is non-zero, subsequent calls to localtime() + ** and its variants fail. If onoff is zero, undo this setting. */ case SQLITE_TESTCTRL_LOCALTIME_FAULT: { sqlite3GlobalConfig.bLocaltimeFault = va_arg(ap, int); break; } + /* sqlite3_test_control(SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, sqlite3*); + ** + ** Toggle the ability to use internal functions on or off for + ** the database connection given in the argument. + */ + case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: { + sqlite3 *db = va_arg(ap, sqlite3*); + db->mDbFlags ^= DBFLAG_InternalFunc; + break; + } + /* sqlite3_test_control(SQLITE_TESTCTRL_NEVER_CORRUPT, int); ** ** Set or clear a flag that indicates that the database file is always well- @@ -155732,6 +163181,17 @@ SQLITE_API int sqlite3_test_control(int op, ...){ break; } + /* sqlite3_test_control(SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS, int); + ** + ** Set or clear a flag that causes SQLite to verify that type, name, + ** and tbl_name fields of the sqlite_master table. This is normally + ** on, but it is sometimes useful to turn it off for testing. + */ + case SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS: { + sqlite3GlobalConfig.bExtraSchemaChecks = va_arg(ap, int); + break; + } + /* Set the threshold at which OP_Once counters reset back to zero. ** By default this is 0x7ffffffe (over 2 billion), but that value is ** too big to test in a reasonable amount of time, so this control is @@ -155818,12 +163278,43 @@ SQLITE_API int sqlite3_test_control(int op, ...){ break; } #endif /* defined(YYCOVERAGE) */ + + /* sqlite3_test_control(SQLITE_TESTCTRL_RESULT_INTREAL, sqlite3_context*); + ** + ** This test-control causes the most recent sqlite3_result_int64() value + ** to be interpreted as a MEM_IntReal instead of as an MEM_Int. Normally, + ** MEM_IntReal values only arise during an INSERT operation of integer + ** values into a REAL column, so they can be challenging to test. This + ** test-control enables us to write an intreal() SQL function that can + ** inject an intreal() value at arbitrary places in an SQL statement, + ** for testing purposes. + */ + case SQLITE_TESTCTRL_RESULT_INTREAL: { + sqlite3_context *pCtx = va_arg(ap, sqlite3_context*); + sqlite3ResultIntReal(pCtx); + break; + } } va_end(ap); #endif /* SQLITE_UNTESTABLE */ return rc; } +/* +** The Pager stores the Database filename, Journal filename, and WAL filename +** consecutively in memory, in that order. The database filename is prefixed +** by four zero bytes. Locate the start of the database filename by searching +** backwards for the first byte following four consecutive zero bytes. +** +** This only works if the filename passed in was obtained from the Pager. +*/ +static const char *databaseName(const char *zName){ + while( zName[-1]!=0 || zName[-2]!=0 || zName[-3]!=0 || zName[-4]!=0 ){ + zName--; + } + return zName; +} + /* ** This is a utility routine, useful to VFS implementations, that checks ** to see if a database file was a URI that contained a specific query @@ -155837,6 +163328,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ */ SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam){ if( zFilename==0 || zParam==0 ) return 0; + zFilename = databaseName(zFilename); zFilename += sqlite3Strlen30(zFilename) + 1; while( zFilename[0] ){ int x = strcmp(zFilename, zParam); @@ -155847,6 +163339,20 @@ SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char * return 0; } +/* +** Return a pointer to the name of Nth query parameter of the filename. +*/ +SQLITE_API const char *sqlite3_uri_key(const char *zFilename, int N){ + if( zFilename==0 || N<0 ) return 0; + zFilename = databaseName(zFilename); + zFilename += sqlite3Strlen30(zFilename) + 1; + while( zFilename[0] && (N--)>0 ){ + zFilename += sqlite3Strlen30(zFilename) + 1; + zFilename += sqlite3Strlen30(zFilename) + 1; + } + return zFilename[0] ? zFilename : 0; +} + /* ** Return a boolean value for a query parameter. */ @@ -155872,6 +163378,39 @@ SQLITE_API sqlite3_int64 sqlite3_uri_int64( return bDflt; } +/* +** Translate a filename that was handed to a VFS routine into the corresponding +** database, journal, or WAL file. +** +** It is an error to pass this routine a filename string that was not +** passed into the VFS from the SQLite core. Doing so is similar to +** passing free() a pointer that was not obtained from malloc() - it is +** an error that we cannot easily detect but that will likely cause memory +** corruption. +*/ +SQLITE_API const char *sqlite3_filename_database(const char *zFilename){ + return databaseName(zFilename); + return sqlite3_uri_parameter(zFilename - 3, "\003"); +} +SQLITE_API const char *sqlite3_filename_journal(const char *zFilename){ + zFilename = databaseName(zFilename); + zFilename += sqlite3Strlen30(zFilename) + 1; + while( zFilename[0] ){ + zFilename += sqlite3Strlen30(zFilename) + 1; + zFilename += sqlite3Strlen30(zFilename) + 1; + } + return zFilename + 1; +} +SQLITE_API const char *sqlite3_filename_wal(const char *zFilename){ +#ifdef SQLITE_OMIT_WAL + return 0; +#else + zFilename = sqlite3_filename_journal(zFilename); + zFilename += sqlite3Strlen30(zFilename) + 1; + return zFilename; +#endif +} + /* ** Return the Btree pointer identified by zDbName. Return NULL if not found. */ @@ -157104,6 +164643,8 @@ SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const voi */ #define FTS3_VARINT_MAX 10 +#define FTS3_BUFFER_PADDING 8 + /* ** FTS4 virtual tables may maintain multiple indexes - one index of all terms ** in the document set and zero or more prefix indexes. All indexes are stored @@ -157136,6 +164677,18 @@ SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const voi #define POS_COLUMN (1) /* Column-list terminator */ #define POS_END (0) /* Position-list terminator */ +/* +** The assert_fts3_nc() macro is similar to the assert() macro, except that it +** is used for assert() conditions that are true only if it can be +** guranteed that the database is not corrupt. +*/ +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_fts3_may_be_corrupt; +# define assert_fts3_nc(x) assert(sqlite3_fts3_may_be_corrupt || (x)) +#else +# define assert_fts3_nc(x) assert(x) +#endif + /* ** This section provides definitions to allow the ** FTS3 extension to be compiled outside of the @@ -157191,6 +164744,9 @@ typedef sqlite3_int64 i64; /* 8-byte signed integer */ # define TESTONLY(X) #endif +#define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) +#define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) + #endif /* SQLITE_AMALGAMATION */ #ifdef SQLITE_DEBUG @@ -157234,6 +164790,7 @@ struct Fts3Table { char *zLanguageid; /* languageid=xxx option, or NULL */ int nAutoincrmerge; /* Value configured by 'automerge' */ u32 nLeafAdd; /* Number of leaf blocks added this trans */ + int bLock; /* Used to prevent recursive content= tbls */ /* Precompiled statements used by the implementation. Each of these ** statements is run and reset within a single virtual table API call. @@ -157292,13 +164849,23 @@ struct Fts3Table { int mxSavepoint; /* Largest valid xSavepoint integer */ #endif -#ifdef SQLITE_TEST +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) /* True to disable the incremental doclist optimization. This is controled ** by special insert command 'test-no-incr-doclist'. */ int bNoIncrDoclist; + + /* Number of segments in a level */ + int nMergeCount; #endif }; +/* Macro to find the number of segments to merge */ +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) +# define MergeCount(P) ((P)->nMergeCount) +#else +# define MergeCount(P) FTS3_MERGE_COUNT +#endif + /* ** When the core wants to read from the virtual table, it creates a ** virtual table cursor (an instance of the following structure) using @@ -157562,6 +165129,8 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table*,int,int); SQLITE_PRIVATE void sqlite3Fts3ErrMsg(char**,const char*,...); SQLITE_PRIVATE int sqlite3Fts3PutVarint(char *, sqlite3_int64); SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *, sqlite_int64 *); +SQLITE_PRIVATE int sqlite3Fts3GetVarintU(const char *, sqlite_uint64 *); +SQLITE_PRIVATE int sqlite3Fts3GetVarintBounded(const char*,const char*,sqlite3_int64*); SQLITE_PRIVATE int sqlite3Fts3GetVarint32(const char *, int *); SQLITE_PRIVATE int sqlite3Fts3VarintLen(sqlite3_uint64); SQLITE_PRIVATE void sqlite3Fts3Dequote(char *); @@ -157660,6 +165229,14 @@ SQLITE_PRIVATE int sqlite3Fts3Never(int b) { assert( !b ); return b; } # endif #endif +/* +** This variable is set to false when running tests for which the on disk +** structures should not be corrupt. Otherwise, true. If it is false, extra +** assert() conditions in the fts3 code are activated - conditions that are +** only true if it is guaranteed that the fts3 database is not corrupt. +*/ +SQLITE_API int sqlite3_fts3_may_be_corrupt = 1; + /* ** Write a 64-bit variable-length integer to memory starting at p[0]. ** The length of data written will be between 1 and FTS3_VARINT_MAX bytes. @@ -157678,18 +165255,13 @@ SQLITE_PRIVATE int sqlite3Fts3PutVarint(char *p, sqlite_int64 v){ } #define GETVARINT_STEP(v, ptr, shift, mask1, mask2, var, ret) \ - v = (v & mask1) | ( (*ptr++) << shift ); \ + v = (v & mask1) | ( (*(const unsigned char*)(ptr++)) << shift ); \ if( (v & mask2)==0 ){ var = v; return ret; } #define GETVARINT_INIT(v, ptr, shift, mask1, mask2, var, ret) \ v = (*ptr++); \ if( (v & mask2)==0 ){ var = v; return ret; } -/* -** Read a 64-bit variable-length integer from memory starting at p[0]. -** Return the number of bytes read, or 0 on error. -** The value is stored in *v. -*/ -SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *pBuf, sqlite_int64 *v){ +SQLITE_PRIVATE int sqlite3Fts3GetVarintU(const char *pBuf, sqlite_uint64 *v){ const unsigned char *p = (const unsigned char*)pBuf; const unsigned char *pStart = p; u32 a; @@ -157711,25 +165283,61 @@ SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *pBuf, sqlite_int64 *v){ return (int)(p - pStart); } +/* +** Read a 64-bit variable-length integer from memory starting at p[0]. +** Return the number of bytes read, or 0 on error. +** The value is stored in *v. +*/ +SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *pBuf, sqlite_int64 *v){ + return sqlite3Fts3GetVarintU(pBuf, (sqlite3_uint64*)v); +} + +/* +** Read a 64-bit variable-length integer from memory starting at p[0] and +** not extending past pEnd[-1]. +** Return the number of bytes read, or 0 on error. +** The value is stored in *v. +*/ +SQLITE_PRIVATE int sqlite3Fts3GetVarintBounded( + const char *pBuf, + const char *pEnd, + sqlite_int64 *v +){ + const unsigned char *p = (const unsigned char*)pBuf; + const unsigned char *pStart = p; + const unsigned char *pX = (const unsigned char*)pEnd; + u64 b = 0; + int shift; + for(shift=0; shift<=63; shift+=7){ + u64 c = p=0 ); return 5; @@ -157900,13 +165508,18 @@ static int fts3DestroyMethod(sqlite3_vtab *pVtab){ sqlite3 *db = p->db; /* Database handle */ /* Drop the shadow tables */ - if( p->zContentTbl==0 ){ - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_content'", zDb, p->zName); - } - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_segments'", zDb,p->zName); - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_segdir'", zDb, p->zName); - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_docsize'", zDb, p->zName); - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_stat'", zDb, p->zName); + fts3DbExec(&rc, db, + "DROP TABLE IF EXISTS %Q.'%q_segments';" + "DROP TABLE IF EXISTS %Q.'%q_segdir';" + "DROP TABLE IF EXISTS %Q.'%q_docsize';" + "DROP TABLE IF EXISTS %Q.'%q_stat';" + "%s DROP TABLE IF EXISTS %Q.'%q_content';", + zDb, p->zName, + zDb, p->zName, + zDb, p->zName, + zDb, p->zName, + (p->zContentTbl ? "--" : ""), zDb,p->zName + ); /* If everything has worked, invoke fts3DisconnectMethod() to free the ** memory associated with the Fts3Table structure and return SQLITE_OK. @@ -158138,10 +165751,10 @@ static void fts3Appendf( ** memory. */ static char *fts3QuoteId(char const *zInput){ - int nRet; + sqlite3_int64 nRet; char *zRet; nRet = 2 + (int)strlen(zInput)*2 + 1; - zRet = sqlite3_malloc(nRet); + zRet = sqlite3_malloc64(nRet); if( zRet ){ int i; char *z = zRet; @@ -158322,7 +165935,7 @@ static int fts3PrefixParameter( } } - aIndex = sqlite3_malloc(sizeof(struct Fts3Index) * nIndex); + aIndex = sqlite3_malloc64(sizeof(struct Fts3Index) * nIndex); *apIndex = aIndex; if( !aIndex ){ return SQLITE_NOMEM; @@ -158401,7 +166014,7 @@ static int fts3ContentColumns( if( rc==SQLITE_OK ){ const char **azCol; /* Output array */ - int nStr = 0; /* Size of all column names (incl. 0x00) */ + sqlite3_int64 nStr = 0; /* Size of all column names (incl. 0x00) */ int nCol; /* Number of table columns */ int i; /* Used to iterate through columns */ @@ -158411,11 +166024,11 @@ static int fts3ContentColumns( nCol = sqlite3_column_count(pStmt); for(i=0; inNodeSize = p->nPgsz-35; +#if defined(SQLITE_DEBUG)||defined(SQLITE_TEST) + p->nMergeCount = FTS3_MERGE_COUNT; +#endif + /* Declare the table schema to SQLite. */ fts3DeclareVtab(&rc, p); @@ -158895,6 +166512,10 @@ static int fts3BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ int iDocidLe = -1; /* Index of docid<=x constraint, if present */ int iIdx; + if( p->bLock ){ + return SQLITE_ERROR; + } + /* By default use a full table scan. This is an expensive option, ** so search through the constraints to see if a more efficient ** strategy is possible. @@ -159093,7 +166714,11 @@ static int fts3CursorSeekStmt(Fts3Cursor *pCsr){ }else{ zSql = sqlite3_mprintf("SELECT %s WHERE rowid = ?", p->zReadExprlist); if( !zSql ) return SQLITE_NOMEM; - rc = sqlite3_prepare_v3(p->db, zSql,-1,SQLITE_PREPARE_PERSISTENT,&pCsr->pStmt,0); + p->bLock++; + rc = sqlite3_prepare_v3( + p->db, zSql,-1,SQLITE_PREPARE_PERSISTENT,&pCsr->pStmt,0 + ); + p->bLock--; sqlite3_free(zSql); } if( rc==SQLITE_OK ) pCsr->bSeekStmt = 1; @@ -159111,11 +166736,15 @@ static int fts3CursorSeek(sqlite3_context *pContext, Fts3Cursor *pCsr){ if( pCsr->isRequireSeek ){ rc = fts3CursorSeekStmt(pCsr); if( rc==SQLITE_OK ){ + Fts3Table *pTab = (Fts3Table*)pCsr->base.pVtab; + pTab->bLock++; sqlite3_bind_int64(pCsr->pStmt, 1, pCsr->iPrevId); pCsr->isRequireSeek = 0; if( SQLITE_ROW==sqlite3_step(pCsr->pStmt) ){ + pTab->bLock--; return SQLITE_OK; }else{ + pTab->bLock--; rc = sqlite3_reset(pCsr->pStmt); if( rc==SQLITE_OK && ((Fts3Table *)pCsr->base.pVtab)->zContentTbl==0 ){ /* If no row was found and no error has occurred, then the %_content @@ -159161,7 +166790,7 @@ static int fts3ScanInteriorNode( const char *zCsr = zNode; /* Cursor to iterate through node */ const char *zEnd = &zCsr[nNode];/* End of interior node buffer */ char *zBuffer = 0; /* Buffer to load terms into */ - int nAlloc = 0; /* Size of allocated buffer */ + i64 nAlloc = 0; /* Size of allocated buffer */ int isFirstTerm = 1; /* True when processing first term on page */ sqlite3_int64 iChild; /* Block id of child node to descend to */ @@ -159199,14 +166828,14 @@ static int fts3ScanInteriorNode( zCsr += fts3GetVarint32(zCsr, &nSuffix); assert( nPrefix>=0 && nSuffix>=0 ); - if( &zCsr[nSuffix]>zEnd ){ + if( nPrefix>zCsr-zNode || nSuffix>zEnd-zCsr || nSuffix==0 ){ rc = FTS_CORRUPT_VTAB; goto finish_scan; } - if( nPrefix+nSuffix>nAlloc ){ + if( (i64)nPrefix+nSuffix>nAlloc ){ char *zNew; - nAlloc = (nPrefix+nSuffix) * 2; - zNew = (char *)sqlite3_realloc(zBuffer, nAlloc); + nAlloc = ((i64)nPrefix+nSuffix) * 2; + zNew = (char *)sqlite3_realloc64(zBuffer, nAlloc); if( !zNew ){ rc = SQLITE_NOMEM; goto finish_scan; @@ -159287,7 +166916,7 @@ static int fts3SelectLeaf( fts3GetVarint32(zNode, &iHeight); rc = fts3ScanInteriorNode(zTerm, nTerm, zNode, nNode, piLeaf, piLeaf2); - assert( !piLeaf2 || !piLeaf || rc!=SQLITE_OK || (*piLeaf<=*piLeaf2) ); + assert_fts3_nc( !piLeaf2 || !piLeaf || rc!=SQLITE_OK || (*piLeaf<=*piLeaf2) ); if( rc==SQLITE_OK && iHeight>1 ){ char *zBlob = 0; /* Blob read from %_segments table */ @@ -159307,7 +166936,13 @@ static int fts3SelectLeaf( rc = sqlite3Fts3ReadBlock(p, piLeaf?*piLeaf:*piLeaf2, &zBlob, &nBlob, 0); } if( rc==SQLITE_OK ){ - rc = fts3SelectLeaf(p, zTerm, nTerm, zBlob, nBlob, piLeaf, piLeaf2); + int iNewHeight = 0; + fts3GetVarint32(zBlob, &iNewHeight); + if( iNewHeight>=iHeight ){ + rc = FTS_CORRUPT_VTAB; + }else{ + rc = fts3SelectLeaf(p, zTerm, nTerm, zBlob, nBlob, piLeaf, piLeaf2); + } } sqlite3_free(zBlob); } @@ -159412,10 +167047,11 @@ static void fts3ColumnlistCopy(char **pp, char **ppPoslist){ } /* -** Value used to signify the end of an position-list. This is safe because -** it is not possible to have a document with 2^31 terms. +** Value used to signify the end of an position-list. This must be +** as large or larger than any value that might appear on the +** position-list, even a position list that has been corrupted. */ -#define POSITION_LIST_END 0x7fffffff +#define POSITION_LIST_END LARGEST_INT64 /* ** This function is used to help parse position-lists. When this function is @@ -159474,7 +167110,7 @@ static int fts3PutColNumber(char **pp, int iCol){ ** updated appropriately. The caller is responsible for insuring ** that there is enough space in *pp to hold the complete output. */ -static void fts3PoslistMerge( +static int fts3PoslistMerge( char **pp, /* Output buffer */ char **pp1, /* Left input list */ char **pp2 /* Right input list */ @@ -159487,12 +167123,18 @@ static void fts3PoslistMerge( int iCol1; /* The current column index in pp1 */ int iCol2; /* The current column index in pp2 */ - if( *p1==POS_COLUMN ) fts3GetVarint32(&p1[1], &iCol1); - else if( *p1==POS_END ) iCol1 = POSITION_LIST_END; + if( *p1==POS_COLUMN ){ + fts3GetVarint32(&p1[1], &iCol1); + if( iCol1==0 ) return FTS_CORRUPT_VTAB; + } + else if( *p1==POS_END ) iCol1 = 0x7fffffff; else iCol1 = 0; - if( *p2==POS_COLUMN ) fts3GetVarint32(&p2[1], &iCol2); - else if( *p2==POS_END ) iCol2 = POSITION_LIST_END; + if( *p2==POS_COLUMN ){ + fts3GetVarint32(&p2[1], &iCol2); + if( iCol2==0 ) return FTS_CORRUPT_VTAB; + } + else if( *p2==POS_END ) iCol2 = 0x7fffffff; else iCol2 = 0; if( iCol1==iCol2 ){ @@ -159539,6 +167181,7 @@ static void fts3PoslistMerge( *pp = p; *pp1 = p1 + 1; *pp2 = p2 + 1; + return SQLITE_OK; } /* @@ -159603,10 +167246,9 @@ static int fts3PoslistPhraseMerge( p += sqlite3Fts3PutVarint(p, iCol1); } - assert( *p1!=POS_END && *p1!=POS_COLUMN ); - assert( *p2!=POS_END && *p2!=POS_COLUMN ); fts3GetDeltaVarint(&p1, &iPos1); iPos1 -= 2; fts3GetDeltaVarint(&p2, &iPos2); iPos2 -= 2; + if( iPos1<0 || iPos2<0 ) break; while( 1 ){ if( iPos2==iPos1+nToken @@ -159755,12 +167397,12 @@ static void fts3GetDeltaVarint3( if( *pp>=pEnd ){ *pp = 0; }else{ - sqlite3_int64 iVal; - *pp += sqlite3Fts3GetVarint(*pp, &iVal); + u64 iVal; + *pp += sqlite3Fts3GetVarintU(*pp, &iVal); if( bDescIdx ){ - *pVal -= iVal; + *pVal = (i64)((u64)*pVal - iVal); }else{ - *pVal += iVal; + *pVal = (i64)((u64)*pVal + iVal); } } } @@ -159787,14 +167429,16 @@ static void fts3PutDeltaVarint3( int *pbFirst, /* IN/OUT: True after first int written */ sqlite3_int64 iVal /* Write this value to the list */ ){ - sqlite3_int64 iWrite; + sqlite3_uint64 iWrite; if( bDescIdx==0 || *pbFirst==0 ){ - iWrite = iVal - *piPrev; + assert_fts3_nc( *pbFirst==0 || iVal>=*piPrev ); + iWrite = (u64)iVal - (u64)*piPrev; }else{ - iWrite = *piPrev - iVal; + assert_fts3_nc( *piPrev>=iVal ); + iWrite = (u64)*piPrev - (u64)iVal; } assert( *pbFirst || *piPrev==0 ); - assert( *pbFirst==0 || iWrite>0 ); + assert_fts3_nc( *pbFirst==0 || iWrite>0 ); *pp += sqlite3Fts3PutVarint(*pp, iWrite); *piPrev = iVal; *pbFirst = 1; @@ -159810,7 +167454,8 @@ static void fts3PutDeltaVarint3( ** Using this makes it easier to write code that can merge doclists that are ** sorted in either ascending or descending order. */ -#define DOCID_CMP(i1, i2) ((bDescDoclist?-1:1) * (i1-i2)) +/* #define DOCID_CMP(i1, i2) ((bDescDoclist?-1:1) * (i64)((u64)i1-i2)) */ +#define DOCID_CMP(i1, i2) ((bDescDoclist?-1:1) * (i1>i2?1:((i1==i2)?0:-1))) /* ** This function does an "OR" merge of two doclists (output contains all @@ -159832,6 +167477,7 @@ static int fts3DoclistOrMerge( char *a2, int n2, /* Second doclist */ char **paOut, int *pnOut /* OUT: Malloc'd doclist */ ){ + int rc = SQLITE_OK; sqlite3_int64 i1 = 0; sqlite3_int64 i2 = 0; sqlite3_int64 iPrev = 0; @@ -159875,7 +167521,7 @@ static int fts3DoclistOrMerge( ** A symetric argument may be made if the doclists are in descending ** order. */ - aOut = sqlite3_malloc(n1+n2+FTS3_VARINT_MAX-1); + aOut = sqlite3_malloc64((i64)n1+n2+FTS3_VARINT_MAX-1+FTS3_BUFFER_PADDING); if( !aOut ) return SQLITE_NOMEM; p = aOut; @@ -159886,7 +167532,8 @@ static int fts3DoclistOrMerge( if( p2 && p1 && iDiff==0 ){ fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1); - fts3PoslistMerge(&p, &p1, &p2); + rc = fts3PoslistMerge(&p, &p1, &p2); + if( rc ) break; fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); }else if( !p2 || (p1 && iDiff<0) ){ @@ -159898,12 +167545,20 @@ static int fts3DoclistOrMerge( fts3PoslistCopy(&p, &p2); fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); } + + assert( (p-aOut)<=((p1?(p1-a1):n1)+(p2?(p2-a2):n2)+FTS3_VARINT_MAX-1) ); } + if( rc!=SQLITE_OK ){ + sqlite3_free(aOut); + p = aOut = 0; + }else{ + assert( (p-aOut)<=n1+n2+FTS3_VARINT_MAX-1 ); + memset(&aOut[(p-aOut)], 0, FTS3_BUFFER_PADDING); + } *paOut = aOut; *pnOut = (int)(p-aOut); - assert( *pnOut<=n1+n2+FTS3_VARINT_MAX-1 ); - return SQLITE_OK; + return rc; } /* @@ -159938,7 +167593,7 @@ static int fts3DoclistPhraseMerge( assert( nDist>0 ); if( bDescDoclist ){ - aOut = sqlite3_malloc(*pnRight + FTS3_VARINT_MAX); + aOut = sqlite3_malloc64((sqlite3_int64)*pnRight + FTS3_VARINT_MAX); if( aOut==0 ) return SQLITE_NOMEM; }else{ aOut = aRight; @@ -160122,6 +167777,7 @@ static int fts3TermSelectMerge( pTS->anOutput[0] = nDoclist; if( pTS->aaOutput[0] ){ memcpy(pTS->aaOutput[0], aDoclist, nDoclist); + memset(&pTS->aaOutput[0][nDoclist], 0, FTS3_VARINT_MAX); }else{ return SQLITE_NOMEM; } @@ -160173,8 +167829,8 @@ static int fts3SegReaderCursorAppend( ){ if( (pCsr->nSegment%16)==0 ){ Fts3SegReader **apNew; - int nByte = (pCsr->nSegment + 16)*sizeof(Fts3SegReader*); - apNew = (Fts3SegReader **)sqlite3_realloc(pCsr->apSegment, nByte); + sqlite3_int64 nByte = (pCsr->nSegment + 16)*sizeof(Fts3SegReader*); + apNew = (Fts3SegReader **)sqlite3_realloc64(pCsr->apSegment, nByte); if( !apNew ){ sqlite3Fts3SegReaderFree(pNew); return SQLITE_NOMEM; @@ -160213,7 +167869,7 @@ static int fts3SegReaderCursor( ** Fts3SegReaderPending might segfault, as the data structures used by ** fts4aux are not completely populated. So it's easiest to filter these ** calls out here. */ - if( iLevel<0 && p->aIndex ){ + if( iLevel<0 && p->aIndex && p->iPrevLangid==iLangid ){ Fts3SegReader *pSeg = 0; rc = sqlite3Fts3SegReaderPending(p, iIndex, zTerm, nTerm, isPrefix||isScan, &pSeg); if( rc==SQLITE_OK && pSeg ){ @@ -160238,7 +167894,7 @@ static int fts3SegReaderCursor( /* If zTerm is not NULL, and this segment is not stored entirely on its ** root node, the range of leaves scanned can be reduced. Do this. */ - if( iStartBlock && zTerm ){ + if( iStartBlock && zTerm && zRoot ){ sqlite3_int64 *pi = (isPrefix ? &iLeavesEndBlock : 0); rc = fts3SelectLeaf(p, zTerm, nTerm, zRoot, nRoot, &iStartBlock, pi); if( rc!=SQLITE_OK ) goto finished; @@ -160476,6 +168132,8 @@ static int fts3NextMethod(sqlite3_vtab_cursor *pCursor){ int rc; Fts3Cursor *pCsr = (Fts3Cursor *)pCursor; if( pCsr->eSearch==FTS3_DOCID_SEARCH || pCsr->eSearch==FTS3_FULLSCAN_SEARCH ){ + Fts3Table *pTab = (Fts3Table*)pCursor->pVtab; + pTab->bLock++; if( SQLITE_ROW!=sqlite3_step(pCsr->pStmt) ){ pCsr->isEof = 1; rc = sqlite3_reset(pCsr->pStmt); @@ -160483,6 +168141,7 @@ static int fts3NextMethod(sqlite3_vtab_cursor *pCursor){ pCsr->iPrevId = sqlite3_column_int64(pCsr->pStmt, 0); rc = SQLITE_OK; } + pTab->bLock--; }else{ rc = fts3EvalNext((Fts3Cursor *)pCursor); } @@ -160490,18 +168149,6 @@ static int fts3NextMethod(sqlite3_vtab_cursor *pCursor){ return rc; } -/* -** The following are copied from sqliteInt.h. -** -** Constants for the largest and smallest possible 64-bit signed integers. -** These macros are designed to work correctly on both 32-bit and 64-bit -** compilers. -*/ -#ifndef SQLITE_AMALGAMATION -# define LARGEST_INT64 (0xffffffff|(((sqlite3_int64)0x7fffffff)<<32)) -# define SMALLEST_INT64 (((sqlite3_int64)-1) - LARGEST_INT64) -#endif - /* ** If the numeric type of argument pVal is "integer", then return it ** converted to a 64-bit signed integer. Otherwise, return a copy of @@ -160555,6 +168202,10 @@ static int fts3FilterMethod( UNUSED_PARAMETER(idxStr); UNUSED_PARAMETER(nVal); + if( p->bLock ){ + return SQLITE_ERROR; + } + eSearch = (idxNum & 0x0000FFFF); assert( eSearch>=0 && eSearch<=(FTS3_FULLTEXT_SEARCH+p->nColumn) ); assert( p->pSegments==0 ); @@ -160626,7 +168277,11 @@ static int fts3FilterMethod( ); } if( zSql ){ - rc = sqlite3_prepare_v3(p->db,zSql,-1,SQLITE_PREPARE_PERSISTENT,&pCsr->pStmt,0); + p->bLock++; + rc = sqlite3_prepare_v3( + p->db,zSql,-1,SQLITE_PREPARE_PERSISTENT,&pCsr->pStmt,0 + ); + p->bLock--; sqlite3_free(zSql); }else{ rc = SQLITE_NOMEM; @@ -161180,14 +168835,28 @@ static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ Fts3Table *p = (Fts3Table*)pVtab; UNUSED_PARAMETER(iSavepoint); assert( p->inTransaction ); - assert( p->mxSavepoint >= iSavepoint ); TESTONLY( p->mxSavepoint = iSavepoint ); sqlite3Fts3PendingTermsClear(p); return SQLITE_OK; } +/* +** Return true if zName is the extension on one of the shadow tables used +** by this module. +*/ +static int fts3ShadowName(const char *zName){ + static const char *azName[] = { + "content", "docsize", "segdir", "segments", "stat", + }; + unsigned int i; + for(i=0; ibDesc==pTab->bDescIdx && p->nToken<=MAX_INCR_PHRASE_TOKENS && p->nToken>0 -#ifdef SQLITE_TEST +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) && pTab->bNoIncrDoclist==0 #endif ); @@ -161768,15 +169440,16 @@ static void fts3EvalDlPhraseNext( u8 *pbEof ){ char *pIter; /* Used to iterate through aAll */ - char *pEnd = &pDL->aAll[pDL->nAll]; /* 1 byte past end of aAll */ + char *pEnd; /* 1 byte past end of aAll */ if( pDL->pNextDocid ){ pIter = pDL->pNextDocid; + assert( pDL->aAll!=0 || pIter==0 ); }else{ pIter = pDL->aAll; } - if( pIter>=pEnd ){ + if( pIter==0 || pIter>=(pEnd = pDL->aAll + pDL->nAll) ){ /* We have already reached the end of this doclist. EOF. */ *pbEof = 1; }else{ @@ -161937,9 +169610,10 @@ static int fts3EvalIncrPhraseNext( if( bEof==0 ){ int nList = 0; int nByte = a[p->nToken-1].nList; - char *aDoclist = sqlite3_malloc(nByte+1); + char *aDoclist = sqlite3_malloc(nByte+FTS3_BUFFER_PADDING); if( !aDoclist ) return SQLITE_NOMEM; memcpy(aDoclist, a[p->nToken-1].pList, nByte+1); + memset(&aDoclist[nByte], 0, FTS3_BUFFER_PADDING); for(i=0; i<(p->nToken-1); i++){ if( a[i].bIgnore==0 ){ @@ -162147,12 +169821,13 @@ static int fts3EvalAverageDocsize(Fts3Cursor *pCsr, int *pnPage){ rc = sqlite3Fts3SelectDoctotal(p, &pStmt); if( rc!=SQLITE_OK ) return rc; a = sqlite3_column_blob(pStmt, 0); - assert( a ); - - pEnd = &a[sqlite3_column_bytes(pStmt, 0)]; - a += sqlite3Fts3GetVarint(a, &nDoc); - while( a1 && pTab->bFts4 ){ Fts3TokenAndCost *aTC; Fts3Expr **apOr; - aTC = (Fts3TokenAndCost *)sqlite3_malloc( + aTC = (Fts3TokenAndCost *)sqlite3_malloc64( sizeof(Fts3TokenAndCost) * nToken + sizeof(Fts3Expr *) * nOr * 2 ); @@ -162641,7 +170316,7 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR) ){ Fts3Expr *p; - int nTmp = 0; /* Bytes of temp space */ + sqlite3_int64 nTmp = 0; /* Bytes of temp space */ char *aTmp; /* Temp space for PoslistNearMerge() */ /* Allocate temporary working space. */ @@ -162650,7 +170325,7 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ nTmp += p->pRight->pPhrase->doclist.nList; } nTmp += p->pPhrase->doclist.nList; - aTmp = sqlite3_malloc(nTmp*2); + aTmp = sqlite3_malloc64(nTmp*2); if( !aTmp ){ *pRc = SQLITE_NOMEM; res = 0; @@ -162920,15 +170595,14 @@ static void fts3EvalRestart( ** found in Fts3Expr.pPhrase->doclist.pList for each of the phrase ** expression nodes. */ -static void fts3EvalUpdateCounts(Fts3Expr *pExpr){ +static void fts3EvalUpdateCounts(Fts3Expr *pExpr, int nCol){ if( pExpr ){ Fts3Phrase *pPhrase = pExpr->pPhrase; if( pPhrase && pPhrase->doclist.pList ){ int iCol = 0; char *p = pPhrase->doclist.pList; - assert( *p ); - while( 1 ){ + do{ u8 c = 0; int iCnt = 0; while( 0xFE & (*p | c) ){ @@ -162944,11 +170618,11 @@ static void fts3EvalUpdateCounts(Fts3Expr *pExpr){ if( *p==0x00 ) break; p++; p += fts3GetVarint32(p, &iCol); - } + }while( iColpLeft); - fts3EvalUpdateCounts(pExpr->pRight); + fts3EvalUpdateCounts(pExpr->pLeft, nCol); + fts3EvalUpdateCounts(pExpr->pRight, nCol); } } @@ -162992,7 +170666,7 @@ static int fts3EvalGatherStats( for(p=pRoot; p; p=p->pLeft){ Fts3Expr *pE = (p->eType==FTSQUERY_PHRASE?p:p->pRight); assert( pE->aMI==0 ); - pE->aMI = (u32 *)sqlite3_malloc(pTab->nColumn * 3 * sizeof(u32)); + pE->aMI = (u32 *)sqlite3_malloc64(pTab->nColumn * 3 * sizeof(u32)); if( !pE->aMI ) return SQLITE_NOMEM; memset(pE->aMI, 0, pTab->nColumn * 3 * sizeof(u32)); } @@ -163018,7 +170692,7 @@ static int fts3EvalGatherStats( ); if( rc==SQLITE_OK && pCsr->isEof==0 ){ - fts3EvalUpdateCounts(pRoot); + fts3EvalUpdateCounts(pRoot, pTab->nColumn); } } @@ -163368,7 +171042,7 @@ static int fts3auxConnectMethod( char const *zFts3; /* Name of fts3 table */ int nDb; /* Result of strlen(zDb) */ int nFts3; /* Result of strlen(zFts3) */ - int nByte; /* Bytes of space to allocate here */ + sqlite3_int64 nByte; /* Bytes of space to allocate here */ int rc; /* value returned by declare_vtab() */ Fts3auxTable *p; /* Virtual table object to return */ @@ -163400,7 +171074,7 @@ static int fts3auxConnectMethod( if( rc!=SQLITE_OK ) return rc; nByte = sizeof(Fts3auxTable) + sizeof(Fts3Table) + nDb + nFts3 + 2; - p = (Fts3auxTable *)sqlite3_malloc(nByte); + p = (Fts3auxTable *)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; memset(p, 0, nByte); @@ -163550,7 +171224,7 @@ static int fts3auxCloseMethod(sqlite3_vtab_cursor *pCursor){ static int fts3auxGrowStatArray(Fts3auxCursor *pCsr, int nSize){ if( nSize>pCsr->nStat ){ struct Fts3auxColstats *aNew; - aNew = (struct Fts3auxColstats *)sqlite3_realloc(pCsr->aStat, + aNew = (struct Fts3auxColstats *)sqlite3_realloc64(pCsr->aStat, sizeof(struct Fts3auxColstats) * nSize ); if( aNew==0 ) return SQLITE_NOMEM; @@ -163718,15 +171392,15 @@ static int fts3auxFilterMethod( assert( (iEq==0 && iGe==-1) || (iEq==-1 && iGe==0) ); if( zStr ){ pCsr->filter.zTerm = sqlite3_mprintf("%s", zStr); - pCsr->filter.nTerm = sqlite3_value_bytes(apVal[0]); if( pCsr->filter.zTerm==0 ) return SQLITE_NOMEM; + pCsr->filter.nTerm = (int)strlen(pCsr->filter.zTerm); } } if( iLe>=0 ){ pCsr->zStop = sqlite3_mprintf("%s", sqlite3_value_text(apVal[iLe])); - pCsr->nStop = sqlite3_value_bytes(apVal[iLe]); if( pCsr->zStop==0 ) return SQLITE_NOMEM; + pCsr->nStop = (int)strlen(pCsr->zStop); } if( iLangid>=0 ){ @@ -163841,7 +171515,8 @@ SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db){ 0, /* xRename */ 0, /* xSavepoint */ 0, /* xRelease */ - 0 /* xRollbackTo */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ }; int rc; /* Return code */ @@ -163977,8 +171652,8 @@ static int fts3isspace(char c){ ** zero the memory before returning a pointer to it. If unsuccessful, ** return NULL. */ -static void *fts3MallocZero(int nByte){ - void *pRet = sqlite3_malloc(nByte); +static void *fts3MallocZero(sqlite3_int64 nByte){ + void *pRet = sqlite3_malloc64(nByte); if( pRet ) memset(pRet, 0, nByte); return pRet; } @@ -164053,7 +171728,7 @@ static int getNextToken( if( rc==SQLITE_OK ){ const char *zToken; int nToken = 0, iStart = 0, iEnd = 0, iPosition = 0; - int nByte; /* total space to allocate */ + sqlite3_int64 nByte; /* total space to allocate */ rc = pModule->xNext(pCursor, &zToken, &nToken, &iStart, &iEnd, &iPosition); if( rc==SQLITE_OK ){ @@ -164107,8 +171782,8 @@ static int getNextToken( ** Enlarge a memory allocation. If an out-of-memory allocation occurs, ** then free the old allocation. */ -static void *fts3ReallocOrFree(void *pOrig, int nNew){ - void *pRet = sqlite3_realloc(pOrig, nNew); +static void *fts3ReallocOrFree(void *pOrig, sqlite3_int64 nNew){ + void *pRet = sqlite3_realloc64(pOrig, nNew); if( !pRet ){ sqlite3_free(pOrig); } @@ -164352,7 +172027,6 @@ static int getNextNode( int nConsumed = 0; pParse->nNest++; rc = fts3ExprParse(pParse, zInput+1, nInput-1, ppExpr, &nConsumed); - if( rc==SQLITE_OK && !*ppExpr ){ rc = SQLITE_DONE; } *pnConsumed = (int)(zInput - z) + 1 + nConsumed; return rc; }else if( *zInput==')' ){ @@ -164651,7 +172325,7 @@ static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ if( rc==SQLITE_OK ){ if( (eType==FTSQUERY_AND || eType==FTSQUERY_OR) ){ Fts3Expr **apLeaf; - apLeaf = (Fts3Expr **)sqlite3_malloc(sizeof(Fts3Expr *) * nMaxDepth); + apLeaf = (Fts3Expr **)sqlite3_malloc64(sizeof(Fts3Expr *) * nMaxDepth); if( 0==apLeaf ){ rc = SQLITE_NOMEM; }else{ @@ -165071,7 +172745,7 @@ static void fts3ExprTestCommon( zExpr = (const char *)sqlite3_value_text(argv[1]); nExpr = sqlite3_value_bytes(argv[1]); nCol = argc-2; - azCol = (char **)sqlite3_malloc(nCol*sizeof(char *)); + azCol = (char **)sqlite3_malloc64(nCol*sizeof(char *)); if( !azCol ){ sqlite3_result_error_nomem(context); goto exprtest_out; @@ -165185,8 +172859,8 @@ SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash *pHash /* ** Malloc and Free functions */ -static void *fts3HashMalloc(int n){ - void *p = sqlite3_malloc(n); +static void *fts3HashMalloc(sqlite3_int64 n){ + void *p = sqlite3_malloc64(n); if( p ){ memset(p, 0, n); } @@ -166280,7 +173954,7 @@ static void fts3TokenizerFunc( nName = sqlite3_value_bytes(argv[0])+1; if( argc==2 ){ - if( fts3TokenizerEnabled(context) ){ + if( fts3TokenizerEnabled(context) || sqlite3_value_frombind(argv[1]) ){ void *pOld; int n = sqlite3_value_bytes(argv[1]); if( zName==0 || n!=sizeof(pPtr) ){ @@ -166307,7 +173981,9 @@ static void fts3TokenizerFunc( return; } } - sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); + if( fts3TokenizerEnabled(context) || sqlite3_value_frombind(argv[0]) ){ + sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); + } } SQLITE_PRIVATE int sqlite3Fts3IsIdChar(char c){ @@ -166395,8 +174071,8 @@ SQLITE_PRIVATE int sqlite3Fts3InitTokenizer( int iArg = 0; z = &z[n+1]; while( zzInput = sqlite3_malloc(nByte+1); + pCsr->zInput = sqlite3_malloc64(nByte+1); if( pCsr->zInput==0 ){ rc = SQLITE_NOMEM; }else{ @@ -167400,7 +175078,8 @@ SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash){ 0, /* xRename */ 0, /* xSavepoint */ 0, /* xRelease */ - 0 /* xRollbackTo */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ }; int rc; /* Return code */ @@ -167437,7 +175116,7 @@ SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash){ /* #include */ /* #include */ /* #include */ - +/* #include */ #define FTS_MAX_APPENDABLE_HEIGHT 16 @@ -167481,7 +175160,7 @@ int test_fts3_node_chunk_threshold = (4*1024)*4; #endif /* -** The two values that may be meaningfully bound to the :1 parameter in +** The values that may be meaningfully bound to the :1 parameter in ** statements SQL_REPLACE_STAT and SQL_SELECT_STAT. */ #define FTS_STAT_DOCTOTAL 0 @@ -167749,7 +175428,7 @@ static int fts3SqlStmt( ** returns zero rows. */ /* 28 */ "SELECT level, count(*) AS cnt FROM %Q.'%q_segdir' " " GROUP BY level HAVING cnt>=?" - " ORDER BY (level %% 1024) ASC LIMIT 1", + " ORDER BY (level %% 1024) ASC, 2 DESC LIMIT 1", /* Estimate the upper limit on the number of leaf nodes in a new segment ** created by merging the oldest :2 segments from absolute level :1. See @@ -167810,10 +175489,12 @@ static int fts3SqlStmt( pStmt = p->aStmt[eStmt]; if( !pStmt ){ + int f = SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_NO_VTAB; char *zSql; if( eStmt==SQL_CONTENT_INSERT ){ zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName, p->zWriteExprlist); }else if( eStmt==SQL_SELECT_CONTENT_BY_ROWID ){ + f &= ~SQLITE_PREPARE_NO_VTAB; zSql = sqlite3_mprintf(azSql[eStmt], p->zReadExprlist); }else{ zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName); @@ -167821,8 +175502,7 @@ static int fts3SqlStmt( if( !zSql ){ rc = SQLITE_NOMEM; }else{ - rc = sqlite3_prepare_v3(p->db, zSql, -1, SQLITE_PREPARE_PERSISTENT, - &pStmt, NULL); + rc = sqlite3_prepare_v3(p->db, zSql, -1, f, &pStmt, NULL); sqlite3_free(zSql); assert( rc==SQLITE_OK || pStmt==0 ); p->aStmt[eStmt] = pStmt; @@ -167980,7 +175660,7 @@ static sqlite3_int64 getAbsoluteLevel( int iLevel /* Level of segments */ ){ sqlite3_int64 iBase; /* First absolute level for iLangid/iIndex */ - assert( iLangid>=0 ); + assert_fts3_nc( iLangid>=0 ); assert( p->nIndex>0 ); assert( iIndex>=0 && iIndexnIndex ); @@ -168109,7 +175789,7 @@ static int fts3PendingListAppend( assert( !p || p->iLastDocid<=iDocid ); if( !p || p->iLastDocid!=iDocid ){ - sqlite3_int64 iDelta = iDocid - (p ? p->iLastDocid : 0); + u64 iDelta = (u64)iDocid - (u64)(p ? p->iLastDocid : 0); if( p ){ assert( p->nDatanSpace ); assert( p->aData[p->nData]==0 ); @@ -168566,7 +176246,7 @@ static int fts3AllocateSegdirIdx( ** segment and allocate (newly freed) index 0 at level iLevel. Otherwise, ** if iNext is less than FTS3_MERGE_COUNT, allocate index iNext. */ - if( iNext>=FTS3_MERGE_COUNT ){ + if( iNext>=MergeCount(p) ){ fts3LogMerge(16, getAbsoluteLevel(p, iLangid, iIndex, iLevel)); rc = fts3SegmentMerge(p, iLangid, iIndex, iLevel); *piIdx = 0; @@ -168650,6 +176330,8 @@ SQLITE_PRIVATE int sqlite3Fts3ReadBlock( } *paBlob = aByte; } + }else if( rc==SQLITE_ERROR ){ + rc = FTS_CORRUPT_VTAB; } return rc; @@ -168761,7 +176443,9 @@ static int fts3SegReaderNext( /* If iCurrentBlock>=iLeafEndBlock, this is an EOF condition. All leaf ** blocks have already been traversed. */ - assert( pReader->iCurrentBlock<=pReader->iLeafEndBlock ); +#ifdef CORRUPT_DB + assert( pReader->iCurrentBlock<=pReader->iLeafEndBlock || CORRUPT_DB ); +#endif if( pReader->iCurrentBlock>=pReader->iLeafEndBlock ){ return SQLITE_OK; } @@ -168788,15 +176472,19 @@ static int fts3SegReaderNext( ** safe (no risk of overread) even if the node data is corrupted. */ pNext += fts3GetVarint32(pNext, &nPrefix); pNext += fts3GetVarint32(pNext, &nSuffix); - if( nPrefix<0 || nSuffix<=0 - || &pNext[nSuffix]>&pReader->aNode[pReader->nNode] + if( nSuffix<=0 + || (&pReader->aNode[pReader->nNode] - pNext)pReader->nTerm ){ return FTS_CORRUPT_VTAB; } - if( nPrefix+nSuffix>pReader->nTermAlloc ){ - int nNew = (nPrefix+nSuffix)*2; - char *zNew = sqlite3_realloc(pReader->zTerm, nNew); + /* Both nPrefix and nSuffix were read by fts3GetVarint32() and so are + ** between 0 and 0x7FFFFFFF. But the sum of the two may cause integer + ** overflow - hence the (i64) casts. */ + if( (i64)nPrefix+nSuffix>(i64)pReader->nTermAlloc ){ + i64 nNew = ((i64)nPrefix+nSuffix)*2; + char *zNew = sqlite3_realloc64(pReader->zTerm, nNew); if( !zNew ){ return SQLITE_NOMEM; } @@ -168818,7 +176506,7 @@ static int fts3SegReaderNext( ** b-tree node. And that the final byte of the doclist is 0x00. If either ** of these statements is untrue, then the data structure is corrupt. */ - if( &pReader->aDoclist[pReader->nDoclist]>&pReader->aNode[pReader->nNode] + if( pReader->nDoclist > pReader->nNode-(pReader->aDoclist-pReader->aNode) || (pReader->nPopulate==0 && pReader->aDoclist[pReader->nDoclist-1]) ){ return FTS_CORRUPT_VTAB; @@ -168936,18 +176624,18 @@ static int fts3SegReaderNextDocid( }else{ rc = fts3SegReaderRequire(pReader, p, FTS3_VARINT_MAX); if( rc==SQLITE_OK ){ - sqlite3_int64 iDelta; - pReader->pOffsetList = p + sqlite3Fts3GetVarint(p, &iDelta); + u64 iDelta; + pReader->pOffsetList = p + sqlite3Fts3GetVarintU(p, &iDelta); if( pTab->bDescIdx ){ - pReader->iDocid -= iDelta; + pReader->iDocid = (i64)((u64)pReader->iDocid - iDelta); }else{ - pReader->iDocid += iDelta; + pReader->iDocid = (i64)((u64)pReader->iDocid + iDelta); } } } } - return SQLITE_OK; + return rc; } @@ -169018,8 +176706,13 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderNew( Fts3SegReader *pReader; /* Newly allocated SegReader object */ int nExtra = 0; /* Bytes to allocate segment root node */ - assert( iStartLeaf<=iEndLeaf ); + assert( zRoot!=0 || nRoot==0 ); +#ifdef CORRUPT_DB + assert( zRoot!=0 || CORRUPT_DB ); +#endif + if( iStartLeaf==0 ){ + if( iEndLeaf!=0 ) return FTS_CORRUPT_VTAB; nExtra = nRoot + FTS3_NODE_PADDING; } @@ -169039,7 +176732,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderNew( pReader->aNode = (char *)&pReader[1]; pReader->rootOnly = 1; pReader->nNode = nRoot; - memcpy(pReader->aNode, zRoot, nRoot); + if( nRoot ) memcpy(pReader->aNode, zRoot, nRoot); memset(&pReader->aNode[nRoot], 0, FTS3_NODE_PADDING); }else{ pReader->iCurrentBlock = iStartLeaf-1; @@ -169154,8 +176847,9 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderPending( } if( nElem>0 ){ - int nByte = sizeof(Fts3SegReader) + (nElem+1)*sizeof(Fts3HashElem *); - pReader = (Fts3SegReader *)sqlite3_malloc(nByte); + sqlite3_int64 nByte; + nByte = sizeof(Fts3SegReader) + (nElem+1)*sizeof(Fts3HashElem *); + pReader = (Fts3SegReader *)sqlite3_malloc64(nByte); if( !pReader ){ rc = SQLITE_NOMEM; }else{ @@ -169431,6 +177125,11 @@ static int fts3NodeAddTerm( nPrefix = fts3PrefixCompress(pTree->zTerm, pTree->nTerm, zTerm, nTerm); nSuffix = nTerm-nPrefix; + /* If nSuffix is zero or less, then zTerm/nTerm must be a prefix of + ** pWriter->zTerm/pWriter->nTerm. i.e. must be equal to or less than when + ** compared with BINARY collation. This indicates corruption. */ + if( nSuffix<=0 ) return FTS_CORRUPT_VTAB; + nReq += sqlite3Fts3VarintLen(nPrefix)+sqlite3Fts3VarintLen(nSuffix)+nSuffix; if( nReq<=p->nNodeSize || !pTree->zTerm ){ @@ -169659,6 +177358,11 @@ static int fts3SegWriterAdd( nPrefix = fts3PrefixCompress(pWriter->zTerm, pWriter->nTerm, zTerm, nTerm); nSuffix = nTerm-nPrefix; + /* If nSuffix is zero or less, then zTerm/nTerm must be a prefix of + ** pWriter->zTerm/pWriter->nTerm. i.e. must be equal to or less than when + ** compared with BINARY collation. This indicates corruption. */ + if( nSuffix<=0 ) return FTS_CORRUPT_VTAB; + /* Figure out how many bytes are required by this new entry */ nReq = sqlite3Fts3VarintLen(nPrefix) + /* varint containing prefix size */ sqlite3Fts3VarintLen(nSuffix) + /* varint containing suffix size */ @@ -169670,6 +177374,7 @@ static int fts3SegWriterAdd( int rc; /* The current leaf node is full. Write it out to the database. */ + if( pWriter->iFree==LARGEST_INT64 ) return FTS_CORRUPT_VTAB; rc = fts3WriteSegment(p, pWriter->iFree++, pWriter->aData, nData); if( rc!=SQLITE_OK ) return rc; p->nLeafAdd++; @@ -169719,9 +177424,11 @@ static int fts3SegWriterAdd( /* Append the prefix-compressed term and doclist to the buffer. */ nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nPrefix); nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nSuffix); + assert( nSuffix>0 ); memcpy(&pWriter->aData[nData], &zTerm[nPrefix], nSuffix); nData += nSuffix; nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nDoclist); + assert( nDoclist>0 ); memcpy(&pWriter->aData[nData], aDoclist, nDoclist); pWriter->nData = nData + nDoclist; @@ -169741,6 +177448,7 @@ static int fts3SegWriterAdd( pWriter->zTerm = zNew; } assert( pWriter->zTerm==pWriter->zMalloc ); + assert( nTerm>0 ); memcpy(pWriter->zTerm, zTerm, nTerm); }else{ pWriter->zTerm = (char *)zTerm; @@ -170015,14 +177723,14 @@ static void fts3ColumnFilter( nList -= (int)(p - pList); pList = p; - if( nList==0 ){ + if( nList<=0 ){ break; } p = &pList[1]; p += fts3GetVarint32(p, &iCurrent); } - if( bZero && &pList[nList]!=pEnd ){ + if( bZero && (pEnd - &pList[nList])>0){ memset(&pList[nList], 0, pEnd - &pList[nList]); } *ppList = pList; @@ -170049,6 +177757,7 @@ static int fts3MsrBufferData( pMsr->aBuffer = pNew; } + assert( nList>0 ); memcpy(pMsr->aBuffer, pList, nList); return SQLITE_OK; } @@ -170362,12 +178071,12 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( ** doclist. */ sqlite3_int64 iDelta; if( p->bDescIdx && nDoclist>0 ){ - iDelta = iPrev - iDocid; + if( iPrev<=iDocid ) return FTS_CORRUPT_VTAB; + iDelta = (i64)((u64)iPrev - (u64)iDocid); }else{ - iDelta = iDocid - iPrev; + if( nDoclist>0 && iPrev>=iDocid ) return FTS_CORRUPT_VTAB; + iDelta = (i64)((u64)iDocid - (u64)iPrev); } - assert( iDelta>0 || (nDoclist==0 && iDelta==iDocid) ); - assert( nDoclist>0 || iDelta==iDocid ); nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0); if( nDoclist+nByte>pCsr->nBuffer ){ @@ -170632,8 +178341,10 @@ static int fts3SegmentMerge( if( rc!=SQLITE_OK ) goto finished; assert( csr.nSegment>0 ); - assert( iNewLevel>=getAbsoluteLevel(p, iLangid, iIndex, 0) ); - assert( iNewLevel=getAbsoluteLevel(p, iLangid, iIndex, 0) ); + assert_fts3_nc( + iNewLevelnColumn ); + pBlob = sqlite3_malloc64( 10*(sqlite3_int64)p->nColumn ); if( pBlob==0 ){ *pRC = SQLITE_NOMEM; return; @@ -170808,7 +178521,7 @@ static void fts3UpdateDocTotals( const int nStat = p->nColumn+2; if( *pRC ) return; - a = sqlite3_malloc( (sizeof(u32)+10)*nStat ); + a = sqlite3_malloc64( (sizeof(u32)+10)*(sqlite3_int64)nStat ); if( a==0 ){ *pRC = SQLITE_NOMEM; return; @@ -170872,7 +178585,10 @@ static int fts3DoOptimize(Fts3Table *p, int bReturnDone){ int rc; sqlite3_stmt *pAllLangid = 0; - rc = fts3SqlStmt(p, SQL_SELECT_ALL_LANGID, &pAllLangid, 0); + rc = sqlite3Fts3PendingTermsFlush(p); + if( rc==SQLITE_OK ){ + rc = fts3SqlStmt(p, SQL_SELECT_ALL_LANGID, &pAllLangid, 0); + } if( rc==SQLITE_OK ){ int rc2; sqlite3_bind_int(pAllLangid, 1, p->iPrevLangid); @@ -170893,7 +178609,6 @@ static int fts3DoOptimize(Fts3Table *p, int bReturnDone){ } sqlite3Fts3SegmentsClose(p); - sqlite3Fts3PendingTermsClear(p); return (rc==SQLITE_OK && bReturnDone && bSeenDone) ? SQLITE_DONE : rc; } @@ -170929,8 +178644,8 @@ static int fts3DoRebuild(Fts3Table *p){ } if( rc==SQLITE_OK ){ - int nByte = sizeof(u32) * (p->nColumn+1)*3; - aSz = (u32 *)sqlite3_malloc(nByte); + sqlite3_int64 nByte = sizeof(u32) * ((sqlite3_int64)p->nColumn+1)*3; + aSz = (u32 *)sqlite3_malloc64(nByte); if( aSz==0 ){ rc = SQLITE_NOMEM; }else{ @@ -170996,12 +178711,12 @@ static int fts3IncrmergeCsr( ){ int rc; /* Return Code */ sqlite3_stmt *pStmt = 0; /* Statement used to read %_segdir entry */ - int nByte; /* Bytes allocated at pCsr->apSegment[] */ + sqlite3_int64 nByte; /* Bytes allocated at pCsr->apSegment[] */ /* Allocate space for the Fts3MultiSegReader.aCsr[] array */ memset(pCsr, 0, sizeof(*pCsr)); nByte = sizeof(Fts3SegReader *) * nSeg; - pCsr->apSegment = (Fts3SegReader **)sqlite3_malloc(nByte); + pCsr->apSegment = (Fts3SegReader **)sqlite3_malloc64(nByte); if( pCsr->apSegment==0 ){ rc = SQLITE_NOMEM; @@ -171144,6 +178859,9 @@ static int nodeReaderNext(NodeReader *p){ } p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &nSuffix); + if( nPrefix>p->term.n || nSuffix>p->nNode-p->iOff || nSuffix==0 ){ + return FTS_CORRUPT_VTAB; + } blobGrowBuffer(&p->term, nPrefix+nSuffix, &rc); if( rc==SQLITE_OK ){ memcpy(&p->term.a[nPrefix], &p->aNode[p->iOff], nSuffix); @@ -171151,14 +178869,16 @@ static int nodeReaderNext(NodeReader *p){ p->iOff += nSuffix; if( p->iChild==0 ){ p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &p->nDoclist); + if( (p->nNode-p->iOff)nDoclist ){ + return FTS_CORRUPT_VTAB; + } p->aDoclist = &p->aNode[p->iOff]; p->iOff += p->nDoclist; } } } - assert( p->iOff<=p->nNode ); - + assert_fts3_nc( p->iOff<=p->nNode ); return rc; } @@ -171182,14 +178902,14 @@ static int nodeReaderInit(NodeReader *p, const char *aNode, int nNode){ p->nNode = nNode; /* Figure out if this is a leaf or an internal node. */ - if( p->aNode[0] ){ + if( aNode && aNode[0] ){ /* An internal node. */ p->iOff = 1 + sqlite3Fts3GetVarint(&p->aNode[1], &p->iChild); }else{ p->iOff = 1; } - return nodeReaderNext(p); + return aNode ? nodeReaderNext(p) : SQLITE_OK; } /* @@ -171226,6 +178946,7 @@ static int fts3IncrmergePush( ** be added to. */ nPrefix = fts3PrefixCompress(pNode->key.a, pNode->key.n, zTerm, nTerm); nSuffix = nTerm - nPrefix; + if(nSuffix<=0 ) return FTS_CORRUPT_VTAB; nSpace = sqlite3Fts3VarintLen(nPrefix); nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix; @@ -171319,13 +179040,14 @@ static int fts3AppendToNode( /* Node must have already been started. There must be a doclist for a ** leaf node, and there must not be a doclist for an internal node. */ assert( pNode->n>0 ); - assert( (pNode->a[0]=='\0')==(aDoclist!=0) ); + assert_fts3_nc( (pNode->a[0]=='\0')==(aDoclist!=0) ); blobGrowBuffer(pPrev, nTerm, &rc); if( rc!=SQLITE_OK ) return rc; nPrefix = fts3PrefixCompress(pPrev->a, pPrev->n, zTerm, nTerm); nSuffix = nTerm - nPrefix; + if( nSuffix<=0 ) return FTS_CORRUPT_VTAB; memcpy(pPrev->a, zTerm, nTerm); pPrev->n = nTerm; @@ -171535,7 +179257,7 @@ static int fts3TermCmp( int nCmp = MIN(nLhs, nRhs); int res; - res = memcmp(zLhs, zRhs, nCmp); + res = (nCmp ? memcmp(zLhs, zRhs, nCmp) : 0); if( res==0 ) res = nLhs - nRhs; return res; @@ -171619,6 +179341,10 @@ static int fts3IncrmergeLoad( pWriter->bNoLeafData = (pWriter->nLeafData==0); nRoot = sqlite3_column_bytes(pSelect, 4); aRoot = sqlite3_column_blob(pSelect, 4); + if( aRoot==0 ){ + sqlite3_reset(pSelect); + return nRoot ? SQLITE_NOMEM : FTS_CORRUPT_VTAB; + } }else{ return sqlite3_reset(pSelect); } @@ -171654,6 +179380,10 @@ static int fts3IncrmergeLoad( int i; int nHeight = (int)aRoot[0]; NodeWriter *pNode; + if( nHeight<1 || nHeight>FTS_MAX_APPENDABLE_HEIGHT ){ + sqlite3_reset(pSelect); + return FTS_CORRUPT_VTAB; + } pWriter->nLeafEst = (int)((iEnd - iStart) + 1)/FTS_MAX_APPENDABLE_HEIGHT; pWriter->iStart = iStart; @@ -171667,34 +179397,42 @@ static int fts3IncrmergeLoad( pNode = &pWriter->aNodeWriter[nHeight]; pNode->iBlock = pWriter->iStart + pWriter->nLeafEst*nHeight; - blobGrowBuffer(&pNode->block, MAX(nRoot, p->nNodeSize), &rc); + blobGrowBuffer(&pNode->block, + MAX(nRoot, p->nNodeSize)+FTS3_NODE_PADDING, &rc + ); if( rc==SQLITE_OK ){ memcpy(pNode->block.a, aRoot, nRoot); pNode->block.n = nRoot; + memset(&pNode->block.a[nRoot], 0, FTS3_NODE_PADDING); } for(i=nHeight; i>=0 && rc==SQLITE_OK; i--){ NodeReader reader; pNode = &pWriter->aNodeWriter[i]; - rc = nodeReaderInit(&reader, pNode->block.a, pNode->block.n); - while( reader.aNode && rc==SQLITE_OK ) rc = nodeReaderNext(&reader); - blobGrowBuffer(&pNode->key, reader.term.n, &rc); - if( rc==SQLITE_OK ){ - memcpy(pNode->key.a, reader.term.a, reader.term.n); - pNode->key.n = reader.term.n; - if( i>0 ){ - char *aBlock = 0; - int nBlock = 0; - pNode = &pWriter->aNodeWriter[i-1]; - pNode->iBlock = reader.iChild; - rc = sqlite3Fts3ReadBlock(p, reader.iChild, &aBlock, &nBlock, 0); - blobGrowBuffer(&pNode->block, MAX(nBlock, p->nNodeSize), &rc); - if( rc==SQLITE_OK ){ - memcpy(pNode->block.a, aBlock, nBlock); - pNode->block.n = nBlock; + if( pNode->block.a){ + rc = nodeReaderInit(&reader, pNode->block.a, pNode->block.n); + while( reader.aNode && rc==SQLITE_OK ) rc = nodeReaderNext(&reader); + blobGrowBuffer(&pNode->key, reader.term.n, &rc); + if( rc==SQLITE_OK ){ + memcpy(pNode->key.a, reader.term.a, reader.term.n); + pNode->key.n = reader.term.n; + if( i>0 ){ + char *aBlock = 0; + int nBlock = 0; + pNode = &pWriter->aNodeWriter[i-1]; + pNode->iBlock = reader.iChild; + rc = sqlite3Fts3ReadBlock(p, reader.iChild, &aBlock, &nBlock, 0); + blobGrowBuffer(&pNode->block, + MAX(nBlock, p->nNodeSize)+FTS3_NODE_PADDING, &rc + ); + if( rc==SQLITE_OK ){ + memcpy(pNode->block.a, aBlock, nBlock); + pNode->block.n = nBlock; + memset(&pNode->block.a[nBlock], 0, FTS3_NODE_PADDING); + } + sqlite3_free(aBlock); } - sqlite3_free(aBlock); } } nodeReaderRelease(&reader); @@ -171937,7 +179675,10 @@ static int fts3TruncateNode( NodeReader reader; /* Reader object */ Blob prev = {0, 0, 0}; /* Previous term written to new node */ int rc = SQLITE_OK; /* Return code */ - int bLeaf = aNode[0]=='\0'; /* True for a leaf node */ + int bLeaf; /* True for a leaf node */ + + if( nNode<1 ) return FTS_CORRUPT_VTAB; + bLeaf = aNode[0]=='\0'; /* Allocate required output space */ blobGrowBuffer(pNew, nNode, &rc); @@ -172203,13 +179944,17 @@ static int fts3IncrmergeHintPop(Blob *pHint, i64 *piAbsLevel, int *pnInput){ const int nHint = pHint->n; int i; - i = pHint->n-2; + i = pHint->n-1; + if( (pHint->a[i] & 0x80) ) return FTS_CORRUPT_VTAB; while( i>0 && (pHint->a[i-1] & 0x80) ) i--; + if( i==0 ) return FTS_CORRUPT_VTAB; + i--; while( i>0 && (pHint->a[i-1] & 0x80) ) i--; pHint->n = i; i += sqlite3Fts3GetVarint(&pHint->a[i], piAbsLevel); i += fts3GetVarint32(&pHint->a[i], pnInput); + assert( i<=nHint ); if( i!=nHint ) return FTS_CORRUPT_VTAB; return SQLITE_OK; @@ -172279,8 +180024,14 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ rc = fts3IncrmergeHintPop(&hint, &iHintAbsLevel, &nHintSeg); if( nSeg<0 || (iAbsLevel % nMod) >= (iHintAbsLevel % nMod) ){ + /* Based on the scan in the block above, it is known that there + ** are no levels with a relative level smaller than that of + ** iAbsLevel with more than nSeg segments, or if nSeg is -1, + ** no levels with more than nMin segments. Use this to limit the + ** value of nHintSeg to avoid a large memory allocation in case the + ** merge-hint is corrupt*/ iAbsLevel = iHintAbsLevel; - nSeg = nHintSeg; + nSeg = MIN(MAX(nMin,nSeg), nHintSeg); bUseHint = 1; bDirtyHint = 1; }else{ @@ -172293,7 +180044,7 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ /* If nSeg is less that zero, then there is no level with at least ** nMin segments and no hint in the %_stat table. No work to do. ** Exit early in this case. */ - if( nSeg<0 ) break; + if( nSeg<=0 ) break; /* Open a cursor to iterate through the contents of the oldest nSeg ** indexes of absolute level iAbsLevel. If this cursor is opened using @@ -172321,8 +180072,15 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ } if( SQLITE_OK==rc && pCsr->nSegment==nSeg && SQLITE_OK==(rc = sqlite3Fts3SegReaderStart(p, pCsr, pFilter)) - && SQLITE_ROW==(rc = sqlite3Fts3SegReaderStep(p, pCsr)) ){ + int bEmpty = 0; + rc = sqlite3Fts3SegReaderStep(p, pCsr); + if( rc==SQLITE_OK ){ + bEmpty = 1; + }else if( rc!=SQLITE_ROW ){ + sqlite3Fts3SegReaderFinish(pCsr); + break; + } if( bUseHint && iIdx>0 ){ const char *zKey = pCsr->zTerm; int nKey = pCsr->nTerm; @@ -172333,11 +180091,13 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ if( rc==SQLITE_OK && pWriter->nLeafEst ){ fts3LogMerge(nSeg, iAbsLevel); - do { - rc = fts3IncrmergeAppend(p, pWriter, pCsr); - if( rc==SQLITE_OK ) rc = sqlite3Fts3SegReaderStep(p, pCsr); - if( pWriter->nWork>=nRem && rc==SQLITE_ROW ) rc = SQLITE_OK; - }while( rc==SQLITE_ROW ); + if( bEmpty==0 ){ + do { + rc = fts3IncrmergeAppend(p, pWriter, pCsr); + if( rc==SQLITE_OK ) rc = sqlite3Fts3SegReaderStep(p, pCsr); + if( pWriter->nWork>=nRem && rc==SQLITE_ROW ) rc = SQLITE_OK; + }while( rc==SQLITE_ROW ); + } /* Update or delete the input segments */ if( rc==SQLITE_OK ){ @@ -172402,7 +180162,7 @@ static int fts3DoIncrmerge( const char *zParam /* Nul-terminated string containing "A,B" */ ){ int rc; - int nMin = (FTS3_MERGE_COUNT / 2); + int nMin = (MergeCount(p) / 2); int nMerge = 0; const char *z = zParam; @@ -172447,7 +180207,7 @@ static int fts3DoAutoincrmerge( int rc = SQLITE_OK; sqlite3_stmt *pStmt = 0; p->nAutoincrmerge = fts3Getint(&zParam); - if( p->nAutoincrmerge==1 || p->nAutoincrmerge>FTS3_MERGE_COUNT ){ + if( p->nAutoincrmerge==1 || p->nAutoincrmerge>MergeCount(p) ){ p->nAutoincrmerge = 8; } if( !p->bHasStat ){ @@ -172530,12 +180290,12 @@ static u64 fts3ChecksumIndex( i64 iDocid = 0; i64 iCol = 0; - i64 iPos = 0; + u64 iPos = 0; pCsr += sqlite3Fts3GetVarint(pCsr, &iDocid); while( pCsrbDescIdx ){ + iDocid = (i64)((u64)iDocid - iVal); + }else{ + iDocid = (i64)((u64)iDocid + iVal); + } } }else{ iPos += (iVal - 2); @@ -172617,10 +180381,9 @@ static int fts3IntegrityCheck(Fts3Table *p, int *pbOk){ for(iCol=0; rc==SQLITE_OK && iColnColumn; iCol++){ if( p->abNotindexed[iCol]==0 ){ const char *zText = (const char *)sqlite3_column_text(pStmt, iCol+1); - int nText = sqlite3_column_bytes(pStmt, iCol+1); sqlite3_tokenizer_cursor *pT = 0; - rc = sqlite3Fts3OpenTokenizer(p->pTokenizer, iLang, zText, nText,&pT); + rc = sqlite3Fts3OpenTokenizer(p->pTokenizer, iLang, zText, -1, &pT); while( rc==SQLITE_OK ){ char const *zToken; /* Buffer containing token */ int nToken = 0; /* Number of bytes in token */ @@ -172705,7 +180468,7 @@ static int fts3DoIntegrityCheck( ** meaningful value to insert is the text 'optimize'. */ static int fts3SpecialInsert(Fts3Table *p, sqlite3_value *pVal){ - int rc; /* Return Code */ + int rc = SQLITE_ERROR; /* Return Code */ const char *zVal = (const char *)sqlite3_value_text(pVal); int nVal = sqlite3_value_bytes(pVal); @@ -172721,21 +180484,27 @@ static int fts3SpecialInsert(Fts3Table *p, sqlite3_value *pVal){ rc = fts3DoIncrmerge(p, &zVal[6]); }else if( nVal>10 && 0==sqlite3_strnicmp(zVal, "automerge=", 10) ){ rc = fts3DoAutoincrmerge(p, &zVal[10]); -#ifdef SQLITE_TEST - }else if( nVal>9 && 0==sqlite3_strnicmp(zVal, "nodesize=", 9) ){ - p->nNodeSize = atoi(&zVal[9]); - rc = SQLITE_OK; - }else if( nVal>11 && 0==sqlite3_strnicmp(zVal, "maxpending=", 9) ){ - p->nMaxPendingData = atoi(&zVal[11]); - rc = SQLITE_OK; - }else if( nVal>21 && 0==sqlite3_strnicmp(zVal, "test-no-incr-doclist=", 21) ){ - p->bNoIncrDoclist = atoi(&zVal[21]); - rc = SQLITE_OK; -#endif +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) }else{ - rc = SQLITE_ERROR; + int v; + if( nVal>9 && 0==sqlite3_strnicmp(zVal, "nodesize=", 9) ){ + v = atoi(&zVal[9]); + if( v>=24 && v<=p->nPgsz-35 ) p->nNodeSize = v; + rc = SQLITE_OK; + }else if( nVal>11 && 0==sqlite3_strnicmp(zVal, "maxpending=", 9) ){ + v = atoi(&zVal[11]); + if( v>=64 && v<=FTS3_MAX_PENDING_DATA ) p->nMaxPendingData = v; + rc = SQLITE_OK; + }else if( nVal>21 && 0==sqlite3_strnicmp(zVal,"test-no-incr-doclist=",21) ){ + p->bNoIncrDoclist = atoi(&zVal[21]); + rc = SQLITE_OK; + }else if( nVal>11 && 0==sqlite3_strnicmp(zVal,"mergecount=",11) ){ + v = atoi(&zVal[11]); + if( v>=4 && v<=FTS3_MERGE_COUNT && (v&1)==0 ) p->nMergeCount = v; + rc = SQLITE_OK; + } +#endif } - return rc; } @@ -172976,7 +180745,7 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod( } /* Allocate space to hold the change in document sizes */ - aSzDel = sqlite3_malloc( sizeof(aSzDel[0])*(p->nColumn+1)*2 ); + aSzDel = sqlite3_malloc64(sizeof(aSzDel[0])*((sqlite3_int64)p->nColumn+1)*2); if( aSzDel==0 ){ rc = SQLITE_NOMEM; goto update_out; @@ -173230,17 +180999,19 @@ struct StrBuffer { /* ** Allocate a two-slot MatchinfoBuffer object. */ -static MatchinfoBuffer *fts3MIBufferNew(int nElem, const char *zMatchinfo){ +static MatchinfoBuffer *fts3MIBufferNew(size_t nElem, const char *zMatchinfo){ MatchinfoBuffer *pRet; - int nByte = sizeof(u32) * (2*nElem + 1) + sizeof(MatchinfoBuffer); - int nStr = (int)strlen(zMatchinfo); + sqlite3_int64 nByte = sizeof(u32) * (2*(sqlite3_int64)nElem + 1) + + sizeof(MatchinfoBuffer); + sqlite3_int64 nStr = strlen(zMatchinfo); - pRet = sqlite3_malloc(nByte + nStr+1); + pRet = sqlite3_malloc64(nByte + nStr+1); if( pRet ){ memset(pRet, 0, nByte); pRet->aMatchinfo[0] = (u8*)(&pRet->aMatchinfo[1]) - (u8*)pRet; - pRet->aMatchinfo[1+nElem] = pRet->aMatchinfo[0] + sizeof(u32)*(nElem+1); - pRet->nElem = nElem; + pRet->aMatchinfo[1+nElem] = pRet->aMatchinfo[0] + + sizeof(u32)*((int)nElem+1); + pRet->nElem = (int)nElem; pRet->zMatchinfo = ((char*)pRet) + nByte; memcpy(pRet->zMatchinfo, zMatchinfo, nStr+1); pRet->aRef[0] = 1; @@ -173280,7 +181051,7 @@ static void (*fts3MIBufferAlloc(MatchinfoBuffer *p, u32 **paOut))(void*){ aOut = &p->aMatchinfo[p->nElem+2]; xRet = fts3MIBufferFree; }else{ - aOut = (u32*)sqlite3_malloc(p->nElem * sizeof(u32)); + aOut = (u32*)sqlite3_malloc64(p->nElem * sizeof(u32)); if( aOut ){ xRet = sqlite3_free; if( p->bGlobal ) memcpy(aOut, &p->aMatchinfo[1], p->nElem*sizeof(u32)); @@ -173531,11 +181302,12 @@ static void fts3SnippetDetails( char *pCsr = pPhrase->pTail; int iCsr = pPhrase->iTail; - while( iCsr<(iStart+pIter->nSnippet) ){ + while( iCsr<(iStart+pIter->nSnippet) && iCsr>=iStart ){ int j; - u64 mPhrase = (u64)1 << i; + u64 mPhrase = (u64)1 << (i%64); u64 mPos = (u64)1 << (iCsr - iStart); - assert( iCsr>=iStart ); + assert( iCsr>=iStart && (iCsr - iStart)<=64 ); + assert( i>=0 ); if( (mCover|mCovered)&mPhrase ){ iScore++; }else{ @@ -173577,11 +181349,14 @@ static int fts3SnippetFindPositions(Fts3Expr *pExpr, int iPhrase, void *ctx){ int iFirst = 0; pPhrase->pList = pCsr; fts3GetDeltaPosition(&pCsr, &iFirst); - assert( iFirst>=0 ); - pPhrase->pHead = pCsr; - pPhrase->pTail = pCsr; - pPhrase->iHead = iFirst; - pPhrase->iTail = iFirst; + if( iFirst<0 ){ + rc = FTS_CORRUPT_VTAB; + }else{ + pPhrase->pHead = pCsr; + pPhrase->pTail = pCsr; + pPhrase->iHead = iFirst; + pPhrase->iTail = iFirst; + } }else{ assert( rc!=SQLITE_OK || ( pPhrase->pList==0 && pPhrase->pHead==0 && pPhrase->pTail==0 @@ -173618,7 +181393,7 @@ static int fts3BestSnippet( int rc; /* Return Code */ int nList; /* Number of phrases in expression */ SnippetIter sIter; /* Iterates through snippet candidates */ - int nByte; /* Number of bytes of space to allocate */ + sqlite3_int64 nByte; /* Number of bytes of space to allocate */ int iBestScore = -1; /* Best snippet score found so far */ int i; /* Loop counter */ @@ -173636,7 +181411,7 @@ static int fts3BestSnippet( ** the required space using malloc(). */ nByte = sizeof(SnippetPhrase) * nList; - sIter.aPhrase = (SnippetPhrase *)sqlite3_malloc(nByte); + sIter.aPhrase = (SnippetPhrase *)sqlite3_malloc64(nByte); if( !sIter.aPhrase ){ return SQLITE_NOMEM; } @@ -173656,7 +181431,7 @@ static int fts3BestSnippet( /* Set the *pmSeen output variable. */ for(i=0; in+nAppend+1>=pStr->nAlloc ){ - int nAlloc = pStr->nAlloc+nAppend+100; - char *zNew = sqlite3_realloc(pStr->z, nAlloc); + sqlite3_int64 nAlloc = pStr->nAlloc+(sqlite3_int64)nAppend+100; + char *zNew = sqlite3_realloc64(pStr->z, nAlloc); if( !zNew ){ return SQLITE_NOMEM; } @@ -173762,6 +181537,7 @@ static int fts3SnippetShift( for(nLeft=0; !(hlmask & ((u64)1 << nLeft)); nLeft++); for(nRight=0; !(hlmask & ((u64)1 << (nSnippet-1-nRight))); nRight++); + assert( (nSnippet-1-nRight)<=63 && (nSnippet-1-nRight)>=0 ); nDesired = (nLeft-nRight)/2; /* Ideally, the start of the snippet should be pushed forward in the @@ -173954,7 +181730,7 @@ static int fts3ColumnlistCount(char **ppCollist){ /* ** This function gathers 'y' or 'b' data for a single phrase. */ -static void fts3ExprLHits( +static int fts3ExprLHits( Fts3Expr *pExpr, /* Phrase expression node */ MatchInfo *p /* Matchinfo context */ ){ @@ -173984,25 +181760,29 @@ static void fts3ExprLHits( if( *pIter!=0x01 ) break; pIter++; pIter += fts3GetVarint32(pIter, &iCol); + if( iCol>=p->nCol ) return FTS_CORRUPT_VTAB; } + return SQLITE_OK; } /* ** Gather the results for matchinfo directives 'y' and 'b'. */ -static void fts3ExprLHitGather( +static int fts3ExprLHitGather( Fts3Expr *pExpr, MatchInfo *p ){ + int rc = SQLITE_OK; assert( (pExpr->pLeft==0)==(pExpr->pRight==0) ); if( pExpr->bEof==0 && pExpr->iDocid==p->pCursor->iPrevId ){ if( pExpr->pLeft ){ - fts3ExprLHitGather(pExpr->pLeft, p); - fts3ExprLHitGather(pExpr->pRight, p); + rc = fts3ExprLHitGather(pExpr->pLeft, p); + if( rc==SQLITE_OK ) rc = fts3ExprLHitGather(pExpr->pRight, p); }else{ - fts3ExprLHits(pExpr, p); + rc = fts3ExprLHits(pExpr, p); } } + return rc; } /* @@ -174092,8 +181872,8 @@ static int fts3MatchinfoCheck( return SQLITE_ERROR; } -static int fts3MatchinfoSize(MatchInfo *pInfo, char cArg){ - int nVal; /* Number of integers output by cArg */ +static size_t fts3MatchinfoSize(MatchInfo *pInfo, char cArg){ + size_t nVal; /* Number of integers output by cArg */ switch( cArg ){ case FTS3_MATCHINFO_NDOC: @@ -174129,11 +181909,15 @@ static int fts3MatchinfoSelectDoctotal( Fts3Table *pTab, sqlite3_stmt **ppStmt, sqlite3_int64 *pnDoc, - const char **paLen + const char **paLen, + const char **ppEnd ){ sqlite3_stmt *pStmt; const char *a; + const char *pEnd; sqlite3_int64 nDoc; + int n; + if( !*ppStmt ){ int rc = sqlite3Fts3SelectDoctotal(pTab, ppStmt); @@ -174142,12 +181926,20 @@ static int fts3MatchinfoSelectDoctotal( pStmt = *ppStmt; assert( sqlite3_data_count(pStmt)==1 ); + n = sqlite3_column_bytes(pStmt, 0); a = sqlite3_column_blob(pStmt, 0); - a += sqlite3Fts3GetVarint(a, &nDoc); - if( nDoc==0 ) return FTS_CORRUPT_VTAB; - *pnDoc = (u32)nDoc; + if( a==0 ){ + return FTS_CORRUPT_VTAB; + } + pEnd = a + n; + a += sqlite3Fts3GetVarintBounded(a, pEnd, &nDoc); + if( nDoc<=0 || a>pEnd ){ + return FTS_CORRUPT_VTAB; + } + *pnDoc = nDoc; if( paLen ) *paLen = a; + if( ppEnd ) *ppEnd = pEnd; return SQLITE_OK; } @@ -174219,11 +182011,12 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ int i; int iCol; int nToken = 0; + int rc = SQLITE_OK; /* Allocate and populate the array of LcsIterator objects. The array ** contains one element for each matchable phrase in the query. **/ - aIter = sqlite3_malloc(sizeof(LcsIterator) * pCsr->nPhrase); + aIter = sqlite3_malloc64(sizeof(LcsIterator) * pCsr->nPhrase); if( !aIter ) return SQLITE_NOMEM; memset(aIter, 0, sizeof(LcsIterator) * pCsr->nPhrase); (void)fts3ExprIterate(pCsr->pExpr, fts3MatchinfoLcsCb, (void*)aIter); @@ -174239,13 +182032,16 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ int nLive = 0; /* Number of iterators in aIter not at EOF */ for(i=0; inPhrase; i++){ - int rc; LcsIterator *pIt = &aIter[i]; rc = sqlite3Fts3EvalPhrasePoslist(pCsr, pIt->pExpr, iCol, &pIt->pRead); - if( rc!=SQLITE_OK ) return rc; + if( rc!=SQLITE_OK ) goto matchinfo_lcs_out; if( pIt->pRead ){ pIt->iPos = pIt->iPosOffset; - fts3LcsIteratorAdvance(&aIter[i]); + fts3LcsIteratorAdvance(pIt); + if( pIt->pRead==0 ){ + rc = FTS_CORRUPT_VTAB; + goto matchinfo_lcs_out; + } nLive++; } } @@ -174277,8 +182073,9 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ pInfo->aMatchinfo[iCol] = nLcs; } + matchinfo_lcs_out: sqlite3_free(aIter); - return SQLITE_OK; + return rc; } /* @@ -174323,7 +182120,7 @@ static int fts3MatchinfoValues( case FTS3_MATCHINFO_NDOC: if( bGlobal ){ sqlite3_int64 nDoc = 0; - rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &nDoc, 0); + rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &nDoc, 0, 0); pInfo->aMatchinfo[0] = (u32)nDoc; } break; @@ -174332,14 +182129,19 @@ static int fts3MatchinfoValues( if( bGlobal ){ sqlite3_int64 nDoc; /* Number of rows in table */ const char *a; /* Aggregate column length array */ + const char *pEnd; /* First byte past end of length array */ - rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &nDoc, &a); + rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &nDoc, &a, &pEnd); if( rc==SQLITE_OK ){ int iCol; for(iCol=0; iColnCol; iCol++){ u32 iVal; sqlite3_int64 nToken; a += sqlite3Fts3GetVarint(a, &nToken); + if( a>pEnd ){ + rc = SQLITE_CORRUPT_VTAB; + break; + } iVal = (u32)(((u32)(nToken&0xffffffff)+nDoc/2)/nDoc); pInfo->aMatchinfo[iCol] = iVal; } @@ -174353,9 +182155,14 @@ static int fts3MatchinfoValues( if( rc==SQLITE_OK ){ int iCol; const char *a = sqlite3_column_blob(pSelectDocsize, 0); + const char *pEnd = a + sqlite3_column_bytes(pSelectDocsize, 0); for(iCol=0; iColnCol; iCol++){ sqlite3_int64 nToken; - a += sqlite3Fts3GetVarint(a, &nToken); + a += sqlite3Fts3GetVarintBounded(a, pEnd, &nToken); + if( a>pEnd ){ + rc = SQLITE_CORRUPT_VTAB; + break; + } pInfo->aMatchinfo[iCol] = (u32)nToken; } } @@ -174372,9 +182179,9 @@ static int fts3MatchinfoValues( case FTS3_MATCHINFO_LHITS_BM: case FTS3_MATCHINFO_LHITS: { - int nZero = fts3MatchinfoSize(pInfo, zArg[i]) * sizeof(u32); + size_t nZero = fts3MatchinfoSize(pInfo, zArg[i]) * sizeof(u32); memset(pInfo->aMatchinfo, 0, nZero); - fts3ExprLHitGather(pCsr->pExpr, pInfo); + rc = fts3ExprLHitGather(pCsr->pExpr, pInfo); break; } @@ -174386,7 +182193,7 @@ static int fts3MatchinfoValues( if( rc!=SQLITE_OK ) break; if( bGlobal ){ if( pCsr->pDeferred ){ - rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &pInfo->nDoc, 0); + rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &pInfo->nDoc,0,0); if( rc!=SQLITE_OK ) break; } rc = fts3ExprIterate(pExpr, fts3ExprGlobalHitsCb,(void*)pInfo); @@ -174441,7 +182248,7 @@ static void fts3GetMatchinfo( ** initialize those elements that are constant for every row. */ if( pCsr->pMIBuffer==0 ){ - int nMatchinfo = 0; /* Number of u32 elements in match-info */ + size_t nMatchinfo = 0; /* Number of u32 elements in match-info */ int i; /* Used to iterate through zArg */ /* Determine the number of phrases in the query */ @@ -174526,6 +182333,10 @@ SQLITE_PRIVATE void sqlite3Fts3Snippet( return; } + /* Limit the snippet length to 64 tokens. */ + if( nToken<-64 ) nToken = -64; + if( nToken>+64 ) nToken = +64; + for(nSnippet=1; 1; nSnippet++){ int iSnip; /* Loop counter 0..nSnippet-1 */ @@ -174627,7 +182438,7 @@ static int fts3ExprTermOffsetInit(Fts3Expr *pExpr, int iPhrase, void *ctx){ nTerm = pExpr->pPhrase->nToken; if( pList ){ fts3GetDeltaPosition(&pList, &iPos); - assert( iPos>=0 ); + assert_fts3_nc( iPos>=0 ); } for(iTerm=0; iTermpList) ){ pTerm->pList = 0; }else{ @@ -174893,7 +182704,7 @@ typedef struct unicode_cursor unicode_cursor; struct unicode_tokenizer { sqlite3_tokenizer base; - int bRemoveDiacritic; + int eRemoveDiacritic; int nException; int *aiException; }; @@ -174966,7 +182777,7 @@ static int unicodeAddExceptions( int *aNew; /* New aiException[] array */ int nNew; /* Number of valid entries in array aNew[] */ - aNew = sqlite3_realloc(p->aiException, (p->nException+nEntry)*sizeof(int)); + aNew = sqlite3_realloc64(p->aiException,(p->nException+nEntry)*sizeof(int)); if( aNew==0 ) return SQLITE_NOMEM; nNew = p->nException; @@ -175038,17 +182849,20 @@ static int unicodeCreate( pNew = (unicode_tokenizer *) sqlite3_malloc(sizeof(unicode_tokenizer)); if( pNew==NULL ) return SQLITE_NOMEM; memset(pNew, 0, sizeof(unicode_tokenizer)); - pNew->bRemoveDiacritic = 1; + pNew->eRemoveDiacritic = 1; for(i=0; rc==SQLITE_OK && ibRemoveDiacritic = 1; + pNew->eRemoveDiacritic = 1; } else if( n==19 && memcmp("remove_diacritics=0", z, 19)==0 ){ - pNew->bRemoveDiacritic = 0; + pNew->eRemoveDiacritic = 0; + } + else if( n==19 && memcmp("remove_diacritics=2", z, 19)==0 ){ + pNew->eRemoveDiacritic = 2; } else if( n>=11 && memcmp("tokenchars=", z, 11)==0 ){ rc = unicodeAddExceptions(pNew, 1, &z[11], n-11); @@ -175152,7 +182966,7 @@ static int unicodeNext( /* Grow the output buffer if required. */ if( (zOut-pCsr->zToken)>=(pCsr->nAlloc-4) ){ - char *zNew = sqlite3_realloc(pCsr->zToken, pCsr->nAlloc+64); + char *zNew = sqlite3_realloc64(pCsr->zToken, pCsr->nAlloc+64); if( !zNew ) return SQLITE_NOMEM; zOut = &zNew[zOut - pCsr->zToken]; pCsr->zToken = zNew; @@ -175161,7 +182975,7 @@ static int unicodeNext( /* Write the folded case of the last character read to the output */ zEnd = z; - iOut = sqlite3FtsUnicodeFold((int)iCode, p->bRemoveDiacritic); + iOut = sqlite3FtsUnicodeFold((int)iCode, p->eRemoveDiacritic); if( iOut ){ WRITE_UTF8(zOut, iOut); } @@ -175206,7 +183020,7 @@ SQLITE_PRIVATE void sqlite3Fts3UnicodeTokenizer(sqlite3_tokenizer_module const * /************** End of fts3_unicode.c ****************************************/ /************** Begin file fts3_unicode2.c ***********************************/ /* -** 2012 May 25 +** 2012-05-25 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: @@ -175366,32 +183180,48 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsalnum(int c){ ** E"). The resuls of passing a codepoint that corresponds to an ** uppercase letter are undefined. */ -static int remove_diacritic(int c){ +static int remove_diacritic(int c, int bComplex){ unsigned short aDia[] = { 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995, 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286, 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732, 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336, - 3456, 3696, 3712, 3728, 3744, 3896, 3912, 3928, - 3968, 4008, 4040, 4106, 4138, 4170, 4202, 4234, - 4266, 4296, 4312, 4344, 4408, 4424, 4472, 4504, - 6148, 6198, 6264, 6280, 6360, 6429, 6505, 6529, - 61448, 61468, 61534, 61592, 61642, 61688, 61704, 61726, - 61784, 61800, 61836, 61880, 61914, 61948, 61998, 62122, - 62154, 62200, 62218, 62302, 62364, 62442, 62478, 62536, - 62554, 62584, 62604, 62640, 62648, 62656, 62664, 62730, - 62924, 63050, 63082, 63274, 63390, + 3456, 3696, 3712, 3728, 3744, 3766, 3832, 3896, + 3912, 3928, 3944, 3968, 4008, 4040, 4056, 4106, + 4138, 4170, 4202, 4234, 4266, 4296, 4312, 4344, + 4408, 4424, 4442, 4472, 4488, 4504, 6148, 6198, + 6264, 6280, 6360, 6429, 6505, 6529, 61448, 61468, + 61512, 61534, 61592, 61610, 61642, 61672, 61688, 61704, + 61726, 61784, 61800, 61816, 61836, 61880, 61896, 61914, + 61948, 61998, 62062, 62122, 62154, 62184, 62200, 62218, + 62252, 62302, 62364, 62410, 62442, 62478, 62536, 62554, + 62584, 62604, 62640, 62648, 62656, 62664, 62730, 62766, + 62830, 62890, 62924, 62974, 63032, 63050, 63082, 63118, + 63182, 63242, 63274, 63310, 63368, 63390, }; - char aChar[] = { - '\0', 'a', 'c', 'e', 'i', 'n', 'o', 'u', 'y', 'y', 'a', 'c', - 'd', 'e', 'e', 'g', 'h', 'i', 'j', 'k', 'l', 'n', 'o', 'r', - 's', 't', 'u', 'u', 'w', 'y', 'z', 'o', 'u', 'a', 'i', 'o', - 'u', 'g', 'k', 'o', 'j', 'g', 'n', 'a', 'e', 'i', 'o', 'r', - 'u', 's', 't', 'h', 'a', 'e', 'o', 'y', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', 'a', 'b', 'd', 'd', 'e', 'f', 'g', 'h', - 'h', 'i', 'k', 'l', 'l', 'm', 'n', 'p', 'r', 'r', 's', 't', - 'u', 'v', 'w', 'w', 'x', 'y', 'z', 'h', 't', 'w', 'y', 'a', - 'e', 'i', 'o', 'u', 'y', +#define HIBIT ((unsigned char)0x80) + unsigned char aChar[] = { + '\0', 'a', 'c', 'e', 'i', 'n', + 'o', 'u', 'y', 'y', 'a', 'c', + 'd', 'e', 'e', 'g', 'h', 'i', + 'j', 'k', 'l', 'n', 'o', 'r', + 's', 't', 'u', 'u', 'w', 'y', + 'z', 'o', 'u', 'a', 'i', 'o', + 'u', 'u'|HIBIT, 'a'|HIBIT, 'g', 'k', 'o', + 'o'|HIBIT, 'j', 'g', 'n', 'a'|HIBIT, 'a', + 'e', 'i', 'o', 'r', 'u', 's', + 't', 'h', 'a', 'e', 'o'|HIBIT, 'o', + 'o'|HIBIT, 'y', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', 'a', 'b', + 'c'|HIBIT, 'd', 'd', 'e'|HIBIT, 'e', 'e'|HIBIT, + 'f', 'g', 'h', 'h', 'i', 'i'|HIBIT, + 'k', 'l', 'l'|HIBIT, 'l', 'm', 'n', + 'o'|HIBIT, 'p', 'r', 'r'|HIBIT, 'r', 's', + 's'|HIBIT, 't', 'u', 'u'|HIBIT, 'v', 'w', + 'w', 'x', 'y', 'z', 'h', 't', + 'w', 'y', 'a', 'a'|HIBIT, 'a'|HIBIT, 'a'|HIBIT, + 'e', 'e'|HIBIT, 'e'|HIBIT, 'i', 'o', 'o'|HIBIT, + 'o'|HIBIT, 'o'|HIBIT, 'u', 'u'|HIBIT, 'u'|HIBIT, 'y', }; unsigned int key = (((unsigned int)c)<<3) | 0x00000007; @@ -175408,7 +183238,8 @@ static int remove_diacritic(int c){ } } assert( key>=aDia[iRes] ); - return ((c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : (int)aChar[iRes]); + if( bComplex==0 && (aChar[iRes] & 0x80) ) return c; + return (c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : ((int)aChar[iRes] & 0x7F); } @@ -175421,8 +183252,8 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int c){ unsigned int mask1 = 0x000361F8; if( c<768 || c>817 ) return 0; return (c < 768+32) ? - (mask0 & (1 << (c-768))) : - (mask1 & (1 << (c-768-32))); + (mask0 & ((unsigned int)1 << (c-768))) : + (mask1 & ((unsigned int)1 << (c-768-32))); } @@ -175435,7 +183266,7 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int c){ ** The results are undefined if the value passed to this function ** is less than zero. */ -SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){ +SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){ /* Each entry in the following array defines a rule for folding a range ** of codepoints to lower case. The rule applies to a range of nRange ** codepoints starting at codepoint iCode. @@ -175558,7 +183389,9 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){ assert( ret>0 ); } - if( bRemoveDiacritic ) ret = remove_diacritic(ret); + if( eRemoveDiacritic ){ + ret = remove_diacritic(ret, eRemoveDiacritic==2); + } } else if( c>=66560 && c<66600 ){ @@ -176096,6 +183929,37 @@ static void jsonReturnJson( sqlite3_result_subtype(pCtx, JSON_SUBTYPE); } +/* +** Translate a single byte of Hex into an integer. +** This routine only works if h really is a valid hexadecimal +** character: 0..9a..fA..F +*/ +static u8 jsonHexToInt(int h){ + assert( (h>='0' && h<='9') || (h>='a' && h<='f') || (h>='A' && h<='F') ); +#ifdef SQLITE_EBCDIC + h += 9*(1&~(h>>4)); +#else + h += 9*(1&(h>>6)); +#endif + return (u8)(h & 0xf); +} + +/* +** Convert a 4-byte hex string into an integer +*/ +static u32 jsonHexToInt4(const char *z){ + u32 v; + assert( safe_isxdigit(z[0]) ); + assert( safe_isxdigit(z[1]) ); + assert( safe_isxdigit(z[2]) ); + assert( safe_isxdigit(z[3]) ); + v = (jsonHexToInt(z[0])<<12) + + (jsonHexToInt(z[1])<<8) + + (jsonHexToInt(z[2])<<4) + + jsonHexToInt(z[3]); + return v; +} + /* ** Make the JsonNode the return value of the function. */ @@ -176189,15 +184053,8 @@ static void jsonReturn( }else{ c = z[++i]; if( c=='u' ){ - u32 v = 0, k; - for(k=0; k<4; i++, k++){ - assert( i>6)); zOut[j++] = 0x80 | (v&0x3f); }else{ - zOut[j++] = (char)(0xe0 | (v>>12)); - zOut[j++] = 0x80 | ((v>>6)&0x3f); - zOut[j++] = 0x80 | (v&0x3f); + u32 vlo; + if( (v&0xfc00)==0xd800 + && i>18); + zOut[j++] = 0x80 | ((v>>12)&0x3f); + zOut[j++] = 0x80 | ((v>>6)&0x3f); + zOut[j++] = 0x80 | (v&0x3f); + }else{ + zOut[j++] = 0xe0 | (v>>12); + zOut[j++] = 0x80 | ((v>>6)&0x3f); + zOut[j++] = 0x80 | (v&0x3f); + } } }else{ if( c=='b' ){ @@ -176265,7 +184138,7 @@ static JSON_NOINLINE int jsonParseAddNodeExpand( assert( pParse->nNode>=pParse->nAlloc ); if( pParse->oom ) return -1; nNew = pParse->nAlloc*2 + 10; - pNew = sqlite3_realloc(pParse->aNode, sizeof(JsonNode)*nNew); + pNew = sqlite3_realloc64(pParse->aNode, sizeof(JsonNode)*nNew); if( pNew==0 ){ pParse->oom = 1; return -1; @@ -176539,7 +184412,7 @@ static void jsonParseFillInParentage(JsonParse *pParse, u32 i, u32 iParent){ static int jsonParseFindParents(JsonParse *pParse){ u32 *aUp; assert( pParse->aUp==0 ); - aUp = pParse->aUp = sqlite3_malloc( sizeof(u32)*pParse->nNode ); + aUp = pParse->aUp = sqlite3_malloc64( sizeof(u32)*pParse->nNode ); if( aUp==0 ){ pParse->oom = 1; return SQLITE_NOMEM; @@ -176601,7 +184474,7 @@ static JsonParse *jsonParseCached( pMatch->iHold = iMaxHold+1; return pMatch; } - p = sqlite3_malloc( sizeof(*p) + nJson + 1 ); + p = sqlite3_malloc64( sizeof(*p) + nJson + 1 ); if( p==0 ){ sqlite3_result_error_nomem(pCtx); return 0; @@ -176657,6 +184530,7 @@ static JsonNode *jsonLookupStep( const char *zKey; JsonNode *pRoot = &pParse->aNode[iRoot]; if( zPath[0]==0 ) return pRoot; + if( pRoot->jnFlags & JNODE_REPLACE ) return 0; if( zPath[0]=='.' ){ if( pRoot->eType!=JSON_OBJECT ) return 0; zPath++; @@ -176697,7 +184571,7 @@ static JsonNode *jsonLookupStep( u32 iStart, iLabel; JsonNode *pNode; iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0); - iLabel = jsonParseAddNode(pParse, JSON_STRING, i, zPath); + iLabel = jsonParseAddNode(pParse, JSON_STRING, nKey, zKey); zPath += i; pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr); if( pParse->oom ) return 0; @@ -176709,18 +184583,49 @@ static JsonNode *jsonLookupStep( } return pNode; } - }else if( zPath[0]=='[' && safe_isdigit(zPath[1]) ){ - if( pRoot->eType!=JSON_ARRAY ) return 0; + }else if( zPath[0]=='[' ){ i = 0; j = 1; while( safe_isdigit(zPath[j]) ){ i = i*10 + zPath[j] - '0'; j++; } - if( zPath[j]!=']' ){ - *pzErr = zPath; - return 0; + if( j<2 || zPath[j]!=']' ){ + if( zPath[1]=='#' ){ + JsonNode *pBase = pRoot; + int iBase = iRoot; + if( pRoot->eType!=JSON_ARRAY ) return 0; + for(;;){ + while( j<=pBase->n ){ + if( (pBase[j].jnFlags & JNODE_REMOVE)==0 ) i++; + j += jsonNodeSize(&pBase[j]); + } + if( (pBase->jnFlags & JNODE_APPEND)==0 ) break; + iBase += pBase->u.iAppend; + pBase = &pParse->aNode[iBase]; + j = 1; + } + j = 2; + if( zPath[2]=='-' && safe_isdigit(zPath[3]) ){ + unsigned int x = 0; + j = 3; + do{ + x = x*10 + zPath[j] - '0'; + j++; + }while( safe_isdigit(zPath[j]) ); + if( x>i ) return 0; + i -= x; + } + if( zPath[j]!=']' ){ + *pzErr = zPath; + return 0; + } + }else{ + *pzErr = zPath; + return 0; + } } + if( pRoot->eType!=JSON_ARRAY ) return 0; zPath += j + 1; j = 1; for(;;){ @@ -177393,7 +185298,7 @@ static void jsonArrayStep( if( pStr->zBuf==0 ){ jsonInit(pStr, ctx); jsonAppendChar(pStr, '['); - }else{ + }else if( pStr->nUsed>1 ){ jsonAppendChar(pStr, ','); pStr->pCtx = ctx; } @@ -177441,9 +185346,11 @@ static void jsonGroupInverse( int argc, sqlite3_value **argv ){ - int i; + unsigned int i; int inStr = 0; + int nNest = 0; char *z; + char c; JsonString *pStr; UNUSED_PARAM(argc); UNUSED_PARAM(argv); @@ -177454,12 +185361,18 @@ static void jsonGroupInverse( if( NEVER(!pStr) ) return; #endif z = pStr->zBuf; - for(i=1; z[i]!=',' || inStr; i++){ - assert( inUsed ); - if( z[i]=='"' ){ + for(i=1; (c = z[i])!=',' || inStr || nNest; i++){ + if( i>=pStr->nUsed ){ + pStr->nUsed = 1; + return; + } + if( c=='"' ){ inStr = !inStr; - }else if( z[i]=='\\' ){ + }else if( c=='\\' ){ i++; + }else if( !inStr ){ + if( c=='{' || c=='[' ) nNest++; + if( c=='}' || c==']' ) nNest--; } } pStr->nUsed -= i; @@ -177489,7 +185402,7 @@ static void jsonObjectStep( if( pStr->zBuf==0 ){ jsonInit(pStr, ctx); jsonAppendChar(pStr, '{'); - }else{ + }else if( pStr->nUsed>1 ){ jsonAppendChar(pStr, ','); pStr->pCtx = ctx; } @@ -177568,6 +185481,9 @@ static int jsonEachConnect( #define JEACH_PARENT 5 #define JEACH_FULLKEY 6 #define JEACH_PATH 7 +/* The xBestIndex method assumes that the JSON and ROOT columns are +** the last two columns in the table. Should this ever changes, be +** sure to update the xBestIndex method. */ #define JEACH_JSON 8 #define JEACH_ROOT 9 @@ -177582,6 +185498,7 @@ static int jsonEachConnect( pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) ); if( pNew==0 ) return SQLITE_NOMEM; memset(pNew, 0, sizeof(*pNew)); + sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS); } return rc; } @@ -177825,35 +185742,54 @@ static int jsonEachBestIndex( sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo ){ - int i; - int jsonIdx = -1; - int rootIdx = -1; + int i; /* Loop counter or computed array index */ + int aIdx[2]; /* Index of constraints for JSON and ROOT */ + int unusableMask = 0; /* Mask of unusable JSON and ROOT constraints */ + int idxMask = 0; /* Mask of usable == constraints JSON and ROOT */ const struct sqlite3_index_constraint *pConstraint; + /* This implementation assumes that JSON and ROOT are the last two + ** columns in the table */ + assert( JEACH_ROOT == JEACH_JSON+1 ); UNUSED_PARAM(tab); + aIdx[0] = aIdx[1] = -1; pConstraint = pIdxInfo->aConstraint; for(i=0; inConstraint; i++, pConstraint++){ - if( pConstraint->usable==0 ) continue; - if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; - switch( pConstraint->iColumn ){ - case JEACH_JSON: jsonIdx = i; break; - case JEACH_ROOT: rootIdx = i; break; - default: /* no-op */ break; - } - } - if( jsonIdx<0 ){ + int iCol; + int iMask; + if( pConstraint->iColumn < JEACH_JSON ) continue; + iCol = pConstraint->iColumn - JEACH_JSON; + assert( iCol==0 || iCol==1 ); + iMask = 1 << iCol; + if( pConstraint->usable==0 ){ + unusableMask |= iMask; + }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + aIdx[iCol] = i; + idxMask |= iMask; + } + } + if( (unusableMask & ~idxMask)!=0 ){ + /* If there are any unusable constraints on JSON or ROOT, then reject + ** this entire plan */ + return SQLITE_CONSTRAINT; + } + if( aIdx[0]<0 ){ + /* No JSON input. Leave estimatedCost at the huge value that it was + ** initialized to to discourage the query planner from selecting this + ** plan. */ pIdxInfo->idxNum = 0; - pIdxInfo->estimatedCost = 1e99; }else{ pIdxInfo->estimatedCost = 1.0; - pIdxInfo->aConstraintUsage[jsonIdx].argvIndex = 1; - pIdxInfo->aConstraintUsage[jsonIdx].omit = 1; - if( rootIdx<0 ){ - pIdxInfo->idxNum = 1; + i = aIdx[0]; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + pIdxInfo->aConstraintUsage[i].omit = 1; + if( aIdx[1]<0 ){ + pIdxInfo->idxNum = 1; /* Only JSON supplied. Plan 1 */ }else{ - pIdxInfo->aConstraintUsage[rootIdx].argvIndex = 2; - pIdxInfo->aConstraintUsage[rootIdx].omit = 1; - pIdxInfo->idxNum = 3; + i = aIdx[1]; + pIdxInfo->aConstraintUsage[i].argvIndex = 2; + pIdxInfo->aConstraintUsage[i].omit = 1; + pIdxInfo->idxNum = 3; /* Both JSON and ROOT are supplied. Plan 3 */ } } return SQLITE_OK; @@ -177962,7 +185898,8 @@ static sqlite3_module jsonEachModule = { 0, /* xRename */ 0, /* xSavepoint */ 0, /* xRelease */ - 0 /* xRollbackTo */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ }; /* The methods of the json_tree virtual table. */ @@ -177989,7 +185926,8 @@ static sqlite3_module jsonTreeModule = { 0, /* xRename */ 0, /* xSavepoint */ 0, /* xRelease */ - 0 /* xRollbackTo */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ }; #endif /* SQLITE_OMIT_VIRTUALTABLE */ @@ -178051,16 +185989,19 @@ SQLITE_PRIVATE int sqlite3Json1Init(sqlite3 *db){ { "json_tree", &jsonTreeModule }, }; #endif + static const int enc = + SQLITE_UTF8 | + SQLITE_DETERMINISTIC | + SQLITE_INNOCUOUS; for(i=0; i */ -/* #include */ -/* #include */ +SQLITE_PRIVATE int sqlite3GetToken(const unsigned char*,int*); /* In the SQLite core */ #ifndef SQLITE_AMALGAMATION #include "sqlite3rtree.h" @@ -178168,8 +186106,18 @@ typedef sqlite3_uint64 u64; typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +# define NDEBUG 1 +#endif +#if defined(NDEBUG) && defined(SQLITE_DEBUG) +# undef NDEBUG +#endif #endif +/* #include */ +/* #include */ +/* #include */ + /* The following macro is used to suppress compiler warnings. */ #ifndef UNUSED_PARAMETER @@ -178222,6 +186170,9 @@ struct Rtree { u8 inWrTrans; /* True if inside write transaction */ u8 nAux; /* # of auxiliary columns in %_rowid */ u8 nAuxNotNull; /* Number of initial not-null aux columns */ +#ifdef SQLITE_DEBUG + u8 bCorrupt; /* Shadow table corruption detected */ +#endif int iDepth; /* Current depth of the r-tree structure */ char *zDb; /* Name of database containing r-tree table */ char *zName; /* Name of r-tree table */ @@ -178281,6 +186232,15 @@ struct Rtree { # define RTREE_ZERO 0.0 #endif +/* +** Set the Rtree.bCorrupt flag +*/ +#ifdef SQLITE_DEBUG +# define RTREE_IS_CORRUPT(X) ((X)->bCorrupt = 1) +#else +# define RTREE_IS_CORRUPT(X) +#endif + /* ** When doing a search of an r-tree, instances of the following structure ** record intermediate results from the tree walk. @@ -178401,6 +186361,12 @@ struct RtreeConstraint { #define RTREE_MATCH 0x46 /* F: Old-style sqlite3_rtree_geometry_callback() */ #define RTREE_QUERY 0x47 /* G: New-style sqlite3_rtree_query_callback() */ +/* Special operators available only on cursors. Needs to be consecutive +** with the normal values above, but must be less than RTREE_MATCH. These +** are used in the cursor for contraints such as x=NULL (RTREE_FALSE) or +** x<'xyz' (RTREE_TRUE) */ +#define RTREE_TRUE 0x3f /* ? */ +#define RTREE_FALSE 0x40 /* @ */ /* ** An rtree structure node. @@ -178647,8 +186613,8 @@ static void nodeZero(Rtree *pRtree, RtreeNode *p){ ** Given a node number iNode, return the corresponding key to use ** in the Rtree.aHash table. */ -static int nodeHash(i64 iNode){ - return iNode % HASHSIZE; +static unsigned int nodeHash(i64 iNode){ + return ((unsigned)iNode) % HASHSIZE; } /* @@ -178693,7 +186659,7 @@ static void nodeHashDelete(Rtree *pRtree, RtreeNode *pNode){ */ static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent){ RtreeNode *pNode; - pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode) + pRtree->iNodeSize); + pNode = (RtreeNode *)sqlite3_malloc64(sizeof(RtreeNode) + pRtree->iNodeSize); if( pNode ){ memset(pNode, 0, sizeof(RtreeNode) + pRtree->iNodeSize); pNode->zData = (u8 *)&pNode[1]; @@ -178717,6 +186683,18 @@ static void nodeBlobReset(Rtree *pRtree){ } } +/* +** Check to see if pNode is the same as pParent or any of the parents +** of pParent. +*/ +static int nodeInParentChain(const RtreeNode *pNode, const RtreeNode *pParent){ + do{ + if( pNode==pParent ) return 1; + pParent = pParent->pParent; + }while( pParent ); + return 0; +} + /* ** Obtain a reference to an r-tree node. */ @@ -178733,10 +186711,16 @@ static int nodeAcquire( ** increase its reference count and return it. */ if( (pNode = nodeHashLookup(pRtree, iNode))!=0 ){ - assert( !pParent || !pNode->pParent || pNode->pParent==pParent ); if( pParent && !pNode->pParent ){ + if( nodeInParentChain(pNode, pParent) ){ + RTREE_IS_CORRUPT(pRtree); + return SQLITE_CORRUPT_VTAB; + } pParent->nRef++; pNode->pParent = pParent; + }else if( pParent && pNode->pParent && pParent!=pNode->pParent ){ + RTREE_IS_CORRUPT(pRtree); + return SQLITE_CORRUPT_VTAB; } pNode->nRef++; *ppNode = pNode; @@ -178765,9 +186749,12 @@ static int nodeAcquire( *ppNode = 0; /* If unable to open an sqlite3_blob on the desired row, that can only ** be because the shadow tables hold erroneous data. */ - if( rc==SQLITE_ERROR ) rc = SQLITE_CORRUPT_VTAB; + if( rc==SQLITE_ERROR ){ + rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); + } }else if( pRtree->iNodeSize==sqlite3_blob_bytes(pRtree->pNodeBlob) ){ - pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode)+pRtree->iNodeSize); + pNode = (RtreeNode *)sqlite3_malloc64(sizeof(RtreeNode)+pRtree->iNodeSize); if( !pNode ){ rc = SQLITE_NOMEM; }else{ @@ -178780,7 +186767,6 @@ static int nodeAcquire( pNode->pNext = 0; rc = sqlite3_blob_read(pRtree->pNodeBlob, pNode->zData, pRtree->iNodeSize, 0); - nodeReference(pParent); } } @@ -178794,6 +186780,7 @@ static int nodeAcquire( pRtree->iDepth = readInt16(pNode->zData); if( pRtree->iDepth>RTREE_MAX_DEPTH ){ rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); } } @@ -178804,14 +186791,17 @@ static int nodeAcquire( if( pNode && rc==SQLITE_OK ){ if( NCELL(pNode)>((pRtree->iNodeSize-4)/pRtree->nBytesPerCell) ){ rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); } } if( rc==SQLITE_OK ){ if( pNode!=0 ){ + nodeReference(pParent); nodeHashInsert(pRtree, pNode); }else{ rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); } *ppNode = pNode; }else{ @@ -179037,7 +187027,7 @@ static void rtreeRelease(Rtree *pRtree){ pRtree->inWrTrans = 0; assert( pRtree->nCursor==0 ); nodeBlobReset(pRtree); - assert( pRtree->nNodeRef==0 ); + assert( pRtree->nNodeRef==0 || pRtree->bCorrupt ); sqlite3_finalize(pRtree->pWriteNode); sqlite3_finalize(pRtree->pDeleteNode); sqlite3_finalize(pRtree->pReadRowid); @@ -179096,7 +187086,7 @@ static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ Rtree *pRtree = (Rtree *)pVTab; RtreeCursor *pCsr; - pCsr = (RtreeCursor *)sqlite3_malloc(sizeof(RtreeCursor)); + pCsr = (RtreeCursor *)sqlite3_malloc64(sizeof(RtreeCursor)); if( pCsr ){ memset(pCsr, 0, sizeof(RtreeCursor)); pCsr->base.pVtab = pVTab; @@ -179110,9 +187100,12 @@ static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ /* -** Free the RtreeCursor.aConstraint[] array and its contents. +** Reset a cursor back to its initial state. */ -static void freeCursorConstraints(RtreeCursor *pCsr){ +static void resetCursor(RtreeCursor *pCsr){ + Rtree *pRtree = (Rtree *)(pCsr->base.pVtab); + int ii; + sqlite3_stmt *pStmt; if( pCsr->aConstraint ){ int i; /* Used to iterate through constraint array */ for(i=0; inConstraint; i++){ @@ -179125,6 +187118,13 @@ static void freeCursorConstraints(RtreeCursor *pCsr){ sqlite3_free(pCsr->aConstraint); pCsr->aConstraint = 0; } + for(ii=0; iiaNode[ii]); + sqlite3_free(pCsr->aPoint); + pStmt = pCsr->pReadAux; + memset(pCsr, 0, sizeof(RtreeCursor)); + pCsr->base.pVtab = (sqlite3_vtab*)pRtree; + pCsr->pReadAux = pStmt; + } /* @@ -179132,13 +187132,10 @@ static void freeCursorConstraints(RtreeCursor *pCsr){ */ static int rtreeClose(sqlite3_vtab_cursor *cur){ Rtree *pRtree = (Rtree *)(cur->pVtab); - int ii; RtreeCursor *pCsr = (RtreeCursor *)cur; assert( pRtree->nCursor>0 ); - freeCursorConstraints(pCsr); + resetCursor(pCsr); sqlite3_finalize(pCsr->pReadAux); - sqlite3_free(pCsr->aPoint); - for(ii=0; iiaNode[ii]); sqlite3_free(pCsr); pRtree->nCursor--; nodeBlobReset(pRtree); @@ -179296,9 +187293,12 @@ static void rtreeNonleafConstraint( pCellData += 8 + 4*(p->iCoord&0xfe); assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE - || p->op==RTREE_GT || p->op==RTREE_EQ ); + || p->op==RTREE_GT || p->op==RTREE_EQ || p->op==RTREE_TRUE + || p->op==RTREE_FALSE ); assert( ((((char*)pCellData) - (char*)0)&3)==0 ); /* 4-byte aligned */ switch( p->op ){ + case RTREE_TRUE: return; /* Always satisfied */ + case RTREE_FALSE: break; /* Never satisfied */ case RTREE_LE: case RTREE_LT: case RTREE_EQ: @@ -179336,16 +187336,19 @@ static void rtreeLeafConstraint( RtreeDValue xN; /* Coordinate value converted to a double */ assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE - || p->op==RTREE_GT || p->op==RTREE_EQ ); + || p->op==RTREE_GT || p->op==RTREE_EQ || p->op==RTREE_TRUE + || p->op==RTREE_FALSE ); pCellData += 8 + p->iCoord*4; assert( ((((char*)pCellData) - (char*)0)&3)==0 ); /* 4-byte aligned */ RTREE_DECODE_COORD(eInt, pCellData, xN); switch( p->op ){ - case RTREE_LE: if( xN <= p->u.rValue ) return; break; - case RTREE_LT: if( xN < p->u.rValue ) return; break; - case RTREE_GE: if( xN >= p->u.rValue ) return; break; - case RTREE_GT: if( xN > p->u.rValue ) return; break; - default: if( xN == p->u.rValue ) return; break; + case RTREE_TRUE: return; /* Always satisfied */ + case RTREE_FALSE: break; /* Never satisfied */ + case RTREE_LE: if( xN <= p->u.rValue ) return; break; + case RTREE_LT: if( xN < p->u.rValue ) return; break; + case RTREE_GE: if( xN >= p->u.rValue ) return; break; + case RTREE_GT: if( xN > p->u.rValue ) return; break; + default: if( xN == p->u.rValue ) return; break; } *peWithin = NOT_WITHIN; } @@ -179369,6 +187372,7 @@ static int nodeRowidIndex( return SQLITE_OK; } } + RTREE_IS_CORRUPT(pRtree); return SQLITE_CORRUPT_VTAB; } @@ -179462,7 +187466,7 @@ static RtreeSearchPoint *rtreeEnqueue( RtreeSearchPoint *pNew; if( pCur->nPoint>=pCur->nPointAlloc ){ int nNew = pCur->nPointAlloc*2 + 8; - pNew = sqlite3_realloc(pCur->aPoint, nNew*sizeof(pCur->aPoint[0])); + pNew = sqlite3_realloc64(pCur->aPoint, nNew*sizeof(pCur->aPoint[0])); if( pNew==0 ) return 0; pCur->aPoint = pNew; pCur->nPointAlloc = nNew; @@ -179617,13 +187621,14 @@ static int rtreeStepToLeaf(RtreeCursor *pCur){ eInt = pRtree->eCoordType==RTREE_COORD_INT32; while( (p = rtreeSearchPointFirst(pCur))!=0 && p->iLevel>0 ){ + u8 *pCellData; pNode = rtreeNodeOfFirstSearchPoint(pCur, &rc); if( rc ) return rc; nCell = NCELL(pNode); assert( nCell<200 ); + pCellData = pNode->zData + (4+pRtree->nBytesPerCell*p->iCell); while( p->iCellzData + (4+pRtree->nBytesPerCell*p->iCell); eWithin = FULLY_WITHIN; for(ii=0; iiaConstraint + ii; @@ -179636,13 +187641,23 @@ static int rtreeStepToLeaf(RtreeCursor *pCur){ }else{ rtreeNonleafConstraint(pConstraint, eInt, pCellData, &eWithin); } - if( eWithin==NOT_WITHIN ) break; + if( eWithin==NOT_WITHIN ){ + p->iCell++; + pCellData += pRtree->nBytesPerCell; + break; + } } - p->iCell++; if( eWithin==NOT_WITHIN ) continue; + p->iCell++; x.iLevel = p->iLevel - 1; if( x.iLevel ){ x.id = readInt64(pCellData); + for(ii=0; iinPoint; ii++){ + if( pCur->aPoint[ii].id==x.id ){ + RTREE_IS_CORRUPT(pRtree); + return SQLITE_CORRUPT_VTAB; + } + } x.iCell = 0; }else{ x.id = p->id; @@ -179826,17 +187841,11 @@ static int rtreeFilter( int ii; int rc = SQLITE_OK; int iCell = 0; - sqlite3_stmt *pStmt; rtreeReference(pRtree); /* Reset the cursor to the same state as rtreeOpen() leaves it in. */ - freeCursorConstraints(pCsr); - sqlite3_free(pCsr->aPoint); - pStmt = pCsr->pReadAux; - memset(pCsr, 0, sizeof(RtreeCursor)); - pCsr->base.pVtab = (sqlite3_vtab*)pRtree; - pCsr->pReadAux = pStmt; + resetCursor(pCsr); pCsr->iStrategy = idxNum; if( idxNum==1 ){ @@ -179845,7 +187854,15 @@ static int rtreeFilter( RtreeSearchPoint *p; /* Search point for the leaf */ i64 iRowid = sqlite3_value_int64(argv[0]); i64 iNode = 0; - rc = findLeafNode(pRtree, iRowid, &pLeaf, &iNode); + int eType = sqlite3_value_numeric_type(argv[0]); + if( eType==SQLITE_INTEGER + || (eType==SQLITE_FLOAT && sqlite3_value_double(argv[0])==iRowid) + ){ + rc = findLeafNode(pRtree, iRowid, &pLeaf, &iNode); + }else{ + rc = SQLITE_OK; + pLeaf = 0; + } if( rc==SQLITE_OK && pLeaf!=0 ){ p = rtreeSearchPointNew(pCsr, RTREE_ZERO, 0); assert( p!=0 ); /* Always returns pCsr->sPoint */ @@ -179864,7 +187881,7 @@ static int rtreeFilter( */ rc = nodeAcquire(pRtree, 1, 0, &pRoot); if( rc==SQLITE_OK && argc>0 ){ - pCsr->aConstraint = sqlite3_malloc(sizeof(RtreeConstraint)*argc); + pCsr->aConstraint = sqlite3_malloc64(sizeof(RtreeConstraint)*argc); pCsr->nConstraint = argc; if( !pCsr->aConstraint ){ rc = SQLITE_NOMEM; @@ -179875,6 +187892,7 @@ static int rtreeFilter( || (idxStr && (int)strlen(idxStr)==argc*2) ); for(ii=0; iiaConstraint[ii]; + int eType = sqlite3_value_numeric_type(argv[ii]); p->op = idxStr[ii*2]; p->iCoord = idxStr[ii*2+1]-'0'; if( p->op>=RTREE_MATCH ){ @@ -179889,12 +187907,21 @@ static int rtreeFilter( p->pInfo->nCoord = pRtree->nDim2; p->pInfo->anQueue = pCsr->anQueue; p->pInfo->mxLevel = pRtree->iDepth + 1; - }else{ + }else if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){ #ifdef SQLITE_RTREE_INT_ONLY p->u.rValue = sqlite3_value_int64(argv[ii]); #else p->u.rValue = sqlite3_value_double(argv[ii]); #endif + }else{ + p->u.rValue = RTREE_ZERO; + if( eType==SQLITE_NULL ){ + p->op = RTREE_FALSE; + }else if( p->op==RTREE_LT || p->op==RTREE_LE ){ + p->op = RTREE_TRUE; + }else{ + p->op = RTREE_FALSE; + } } } } @@ -180009,20 +188036,20 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ ){ u8 op; switch( p->op ){ - case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break; - case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; break; - case SQLITE_INDEX_CONSTRAINT_LE: op = RTREE_LE; break; - case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; break; - case SQLITE_INDEX_CONSTRAINT_GE: op = RTREE_GE; break; - default: - assert( p->op==SQLITE_INDEX_CONSTRAINT_MATCH ); - op = RTREE_MATCH; - break; + case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break; + case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; break; + case SQLITE_INDEX_CONSTRAINT_LE: op = RTREE_LE; break; + case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; break; + case SQLITE_INDEX_CONSTRAINT_GE: op = RTREE_GE; break; + case SQLITE_INDEX_CONSTRAINT_MATCH: op = RTREE_MATCH; break; + default: op = 0; break; + } + if( op ){ + zIdxStr[iIdx++] = op; + zIdxStr[iIdx++] = (char)(p->iColumn - 1 + '0'); + pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2); + pIdxInfo->aConstraintUsage[ii].omit = 1; } - zIdxStr[iIdx++] = op; - zIdxStr[iIdx++] = (char)(p->iColumn - 1 + '0'); - pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2); - pIdxInfo->aConstraintUsage[ii].omit = 1; } } @@ -180058,11 +188085,11 @@ static RtreeDValue cellArea(Rtree *pRtree, RtreeCell *p){ #endif { switch( pRtree->nDim ){ - case 5: area = p->aCoord[9].i - p->aCoord[8].i; - case 4: area *= p->aCoord[7].i - p->aCoord[6].i; - case 3: area *= p->aCoord[5].i - p->aCoord[4].i; - case 2: area *= p->aCoord[3].i - p->aCoord[2].i; - default: area *= p->aCoord[1].i - p->aCoord[0].i; + case 5: area = (i64)p->aCoord[9].i - (i64)p->aCoord[8].i; + case 4: area *= (i64)p->aCoord[7].i - (i64)p->aCoord[6].i; + case 3: area *= (i64)p->aCoord[5].i - (i64)p->aCoord[4].i; + case 2: area *= (i64)p->aCoord[3].i - (i64)p->aCoord[2].i; + default: area *= (i64)p->aCoord[1].i - (i64)p->aCoord[0].i; } } return area; @@ -180231,12 +188258,14 @@ static int AdjustTree( RtreeCell *pCell /* This cell was just inserted */ ){ RtreeNode *p = pNode; + int cnt = 0; while( p->pParent ){ RtreeNode *pParent = p->pParent; RtreeCell cell; int iCell; - if( nodeParentIndex(pRtree, p, &iCell) ){ + if( (++cnt)>1000 || nodeParentIndex(pRtree, p, &iCell) ){ + RTREE_IS_CORRUPT(pRtree); return SQLITE_CORRUPT_VTAB; } @@ -180433,9 +188462,9 @@ static int splitNodeStartree( int iBestSplit = 0; RtreeDValue fBestMargin = RTREE_ZERO; - int nByte = (pRtree->nDim+1)*(sizeof(int*)+nCell*sizeof(int)); + sqlite3_int64 nByte = (pRtree->nDim+1)*(sizeof(int*)+nCell*sizeof(int)); - aaSorted = (int **)sqlite3_malloc(nByte); + aaSorted = (int **)sqlite3_malloc64(nByte); if( !aaSorted ){ return SQLITE_NOMEM; } @@ -180556,7 +188585,7 @@ static int SplitNode( /* Allocate an array and populate it with a copy of pCell and ** all cells from node pLeft. Then zero the original node. */ - aCell = sqlite3_malloc((sizeof(RtreeCell)+sizeof(int))*(nCell+1)); + aCell = sqlite3_malloc64((sizeof(RtreeCell)+sizeof(int))*(nCell+1)); if( !aCell ){ rc = SQLITE_NOMEM; goto splitnode_out; @@ -180704,7 +188733,10 @@ static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){ } rc = sqlite3_reset(pRtree->pReadParent); if( rc==SQLITE_OK ) rc = rc2; - if( rc==SQLITE_OK && !pChild->pParent ) rc = SQLITE_CORRUPT_VTAB; + if( rc==SQLITE_OK && !pChild->pParent ){ + RTREE_IS_CORRUPT(pRtree); + rc = SQLITE_CORRUPT_VTAB; + } pChild = pChild->pParent; } return rc; @@ -180844,7 +188876,7 @@ static int Reinsert( /* Allocate the buffers used by this operation. The allocation is ** relinquished before this function returns. */ - aCell = (RtreeCell *)sqlite3_malloc(n * ( + aCell = (RtreeCell *)sqlite3_malloc64(n * ( sizeof(RtreeCell) + /* aCell array */ sizeof(int) + /* aOrder array */ sizeof(int) + /* aSpare array */ @@ -181018,8 +189050,12 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ rc = findLeafNode(pRtree, iDelete, &pLeaf, 0); } +#ifdef CORRUPT_DB + assert( pLeaf!=0 || rc!=SQLITE_OK || CORRUPT_DB ); +#endif + /* Delete the cell in question from the leaf node. */ - if( rc==SQLITE_OK ){ + if( rc==SQLITE_OK && pLeaf ){ int rc2; rc = nodeRowidIndex(pRtree, pLeaf, iDelete, &iCell); if( rc==SQLITE_OK ){ @@ -181291,7 +189327,7 @@ static int rtreeUpdate( rc = rc2; } } - if( pRtree->nAux ){ + if( rc==SQLITE_OK && pRtree->nAux ){ sqlite3_stmt *pUp = pRtree->pWriteAux; int jj; sqlite3_bind_int64(pUp, 1, *pRowid); @@ -181419,8 +189455,24 @@ static int rtreeQueryStat1(sqlite3 *db, Rtree *pRtree){ return rc; } + +/* +** Return true if zName is the extension on one of the shadow tables used +** by this module. +*/ +static int rtreeShadowName(const char *zName){ + static const char *azName[] = { + "node", "parent", "rowid" + }; + unsigned int i; + for(i=0; idb = db; @@ -181528,8 +189582,7 @@ static int rtreeSqlInit( } zSql = sqlite3_mprintf(zFormat, zDb, zPrefix); if( zSql ){ - rc = sqlite3_prepare_v3(db, zSql, -1, SQLITE_PREPARE_PERSISTENT, - appStmt[i], 0); + rc = sqlite3_prepare_v3(db, zSql, -1, f, appStmt[i], 0); }else{ rc = SQLITE_NOMEM; } @@ -181559,8 +189612,7 @@ static int rtreeSqlInit( if( zSql==0 ){ rc = SQLITE_NOMEM; }else{ - rc = sqlite3_prepare_v3(db, zSql, -1, SQLITE_PREPARE_PERSISTENT, - &pRtree->pWriteAux, 0); + rc = sqlite3_prepare_v3(db, zSql, -1, f, &pRtree->pWriteAux, 0); sqlite3_free(zSql); } } @@ -181636,6 +189688,7 @@ static int getNodeSize( *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); }else if( pRtree->iNodeSize<(512-64) ){ rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); *pzErr = sqlite3_mprintf("undersize RTree blobs in \"%q_node\"", pRtree->zName); } @@ -181645,6 +189698,14 @@ static int getNodeSize( return rc; } +/* +** Return the length of a token +*/ +static int rtreeTokenLength(const char *z){ + int dummy = 0; + return sqlite3GetToken((const unsigned char*)z,&dummy); +} + /* ** This function is the implementation of both the xConnect and xCreate ** methods of the r-tree virtual table. @@ -181681,8 +189742,8 @@ static int rtreeInit( }; assert( RTREE_MAX_AUX_COLUMN<256 ); /* Aux columns counted by a u8 */ - if( argc>RTREE_MAX_AUX_COLUMN+3 ){ - *pzErr = sqlite3_mprintf("%s", aErrMsg[3]); + if( argc<6 || argc>RTREE_MAX_AUX_COLUMN+3 ){ + *pzErr = sqlite3_mprintf("%s", aErrMsg[2 + (argc>=6)]); return SQLITE_ERROR; } @@ -181691,7 +189752,7 @@ static int rtreeInit( /* Allocate the sqlite3_vtab structure */ nDb = (int)strlen(argv[1]); nName = (int)strlen(argv[2]); - pRtree = (Rtree *)sqlite3_malloc(sizeof(Rtree)+nDb+nName+2); + pRtree = (Rtree *)sqlite3_malloc64(sizeof(Rtree)+nDb+nName+2); if( !pRtree ){ return SQLITE_NOMEM; } @@ -181710,16 +189771,18 @@ static int rtreeInit( ** the r-tree table schema. */ pSql = sqlite3_str_new(db); - sqlite3_str_appendf(pSql, "CREATE TABLE x(%s", argv[3]); + sqlite3_str_appendf(pSql, "CREATE TABLE x(%.*s INT", + rtreeTokenLength(argv[3]), argv[3]); for(ii=4; iinAux++; - sqlite3_str_appendf(pSql, ",%s", argv[ii]+1); + sqlite3_str_appendf(pSql, ",%.*s", rtreeTokenLength(zArg+1), zArg+1); }else if( pRtree->nAux>0 ){ break; }else{ pRtree->nDim2++; - sqlite3_str_appendf(pSql, ",%s", argv[ii]); + sqlite3_str_appendf(pSql, ",%.*s NUM", rtreeTokenLength(zArg), zArg); } } sqlite3_str_appendf(pSql, ");"); @@ -181788,49 +189851,45 @@ static int rtreeInit( ** *2 coordinates. */ static void rtreenode(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){ - char *zText = 0; RtreeNode node; Rtree tree; int ii; + int nData; + int errCode; + sqlite3_str *pOut; UNUSED_PARAMETER(nArg); memset(&node, 0, sizeof(RtreeNode)); memset(&tree, 0, sizeof(Rtree)); tree.nDim = (u8)sqlite3_value_int(apArg[0]); + if( tree.nDim<1 || tree.nDim>5 ) return; tree.nDim2 = tree.nDim*2; tree.nBytesPerCell = 8 + 8 * tree.nDim; node.zData = (u8 *)sqlite3_value_blob(apArg[1]); + nData = sqlite3_value_bytes(apArg[1]); + if( nData<4 ) return; + if( nData0 ) sqlite3_str_append(pOut, " ", 1); + sqlite3_str_appendf(pOut, "{%lld", cell.iRowid); for(jj=0; jjrc==SQLITE_OK ); - if( pCheck->pGetNode==0 ){ + if( pCheck->rc==SQLITE_OK && pCheck->pGetNode==0 ){ pCheck->pGetNode = rtreeCheckPrepare(pCheck, "SELECT data FROM %Q.'%q_node' WHERE nodeno=?", pCheck->zDb, pCheck->zTab @@ -181972,7 +190030,7 @@ static u8 *rtreeCheckGetNode(RtreeCheck *pCheck, i64 iNode, int *pnNode){ if( sqlite3_step(pCheck->pGetNode)==SQLITE_ROW ){ int nNode = sqlite3_column_bytes(pCheck->pGetNode, 0); const u8 *pNode = (const u8*)sqlite3_column_blob(pCheck->pGetNode, 0); - pRet = sqlite3_malloc(nNode); + pRet = sqlite3_malloc64(nNode); if( pRet==0 ){ pCheck->rc = SQLITE_NOMEM; }else{ @@ -182433,14 +190491,32 @@ typedef float GeoCoord; ** ** encoding (1 byte) 0=big-endian, 1=little-endian ** nvertex (3 bytes) Number of vertexes as a big-endian integer +** +** Enough space is allocated for 4 coordinates, to work around over-zealous +** warnings coming from some compiler (notably, clang). In reality, the size +** of each GeoPoly memory allocate is adjusted as necessary so that the +** GeoPoly.a[] array at the end is the appropriate size. */ typedef struct GeoPoly GeoPoly; struct GeoPoly { int nVertex; /* Number of vertexes */ unsigned char hdr[4]; /* Header for on-disk representation */ - GeoCoord a[2]; /* 2*nVertex values. X (longitude) first, then Y */ + GeoCoord a[8]; /* 2*nVertex values. X (longitude) first, then Y */ }; +/* The size of a memory allocation needed for a GeoPoly object sufficient +** to hold N coordinate pairs. +*/ +#define GEOPOLY_SZ(N) (sizeof(GeoPoly) + sizeof(GeoCoord)*2*((N)-4)) + +/* Macros to access coordinates of a GeoPoly. +** We have to use these macros, rather than just say p->a[i] in order +** to silence (incorrect) UBSAN warnings if the array index is too large. +*/ +#define GeoX(P,I) (((GeoCoord*)(P)->a)[(I)*2]) +#define GeoY(P,I) (((GeoCoord*)(P)->a)[(I)*2+1]) + + /* ** State of a parse of a GeoJSON input. */ @@ -182465,7 +190541,7 @@ static void geopolySwab32(unsigned char *a){ /* Skip whitespace. Return the next non-whitespace character. */ static char geopolySkipSpace(GeoParse *p){ - while( p->z[0] && safe_isspace(p->z[0]) ) p->z++; + while( safe_isspace(p->z[0]) ) p->z++; return p->z[0]; } @@ -182485,7 +190561,7 @@ static int geopolyParseNumber(GeoParse *p, GeoCoord *pVal){ if( c=='0' && z[j+1]>='0' && z[j+1]<='9' ) return 0; for(;; j++){ c = z[j]; - if( c>='0' && c<='9' ) continue; + if( safe_isdigit(c) ) continue; if( c=='.' ){ if( z[j-1]=='-' ) return 0; if( seenDP ) return 0; @@ -182507,7 +190583,17 @@ static int geopolyParseNumber(GeoParse *p, GeoCoord *pVal){ break; } if( z[j-1]<'0' ) return 0; - if( pVal ) *pVal = (GeoCoord)atof((const char*)p->z); + if( pVal ){ +#ifdef SQLITE_AMALGAMATION + /* The sqlite3AtoF() routine is much much faster than atof(), if it + ** is available */ + double r; + (void)sqlite3AtoF((const char*)p->z, &r, j, SQLITE_UTF8); + *pVal = r; +#else + *pVal = (GeoCoord)atof((const char*)p->z); +#endif + } p->z += j; return 1; } @@ -182565,12 +190651,10 @@ static GeoPoly *geopolyParseJson(const unsigned char *z, int *pRc){ && s.a[1]==s.a[s.nVertex*2-1] && (s.z++, geopolySkipSpace(&s)==0) ){ - int nByte; GeoPoly *pOut; int x = 1; s.nVertex--; /* Remove the redundant vertex at the end */ - nByte = sizeof(GeoPoly) * s.nVertex*2*sizeof(GeoCoord); - pOut = sqlite3_malloc64( nByte ); + pOut = sqlite3_malloc64( GEOPOLY_SZ((sqlite3_int64)s.nVertex) ); x = 1; if( pOut==0 ) goto parse_json_err; pOut->nVertex = s.nVertex; @@ -182625,8 +190709,9 @@ static GeoPoly *geopolyFuncParam( memcpy(p->hdr, a, nByte); if( a[0] != *(unsigned char*)&x ){ int ii; - for(ii=0; iia[ii]); + for(ii=0; iihdr[0] ^= 1; } @@ -182685,9 +190770,9 @@ static void geopolyJsonFunc( int i; sqlite3_str_append(x, "[", 1); for(i=0; inVertex; i++){ - sqlite3_str_appendf(x, "[%!g,%!g],", p->a[i*2], p->a[i*2+1]); + sqlite3_str_appendf(x, "[%!g,%!g],", GeoX(p,i), GeoY(p,i)); } - sqlite3_str_appendf(x, "[%!g,%!g]]", p->a[0], p->a[1]); + sqlite3_str_appendf(x, "[%!g,%!g]]", GeoX(p,0), GeoY(p,0)); sqlite3_result_text(context, sqlite3_str_finish(x), -1, sqlite3_free); sqlite3_free(p); } @@ -182704,7 +190789,9 @@ static void geopolySvgFunc( int argc, sqlite3_value **argv ){ - GeoPoly *p = geopolyFuncParam(context, argv[0], 0); + GeoPoly *p; + if( argc<1 ) return; + p = geopolyFuncParam(context, argv[0], 0); if( p ){ sqlite3 *db = sqlite3_context_db_handle(context); sqlite3_str *x = sqlite3_str_new(db); @@ -182712,10 +190799,10 @@ static void geopolySvgFunc( char cSep = '\''; sqlite3_str_appendf(x, "a[i*2], p->a[i*2+1]); + sqlite3_str_appendf(x, "%c%g,%g", cSep, GeoX(p,i), GeoY(p,i)); cSep = ' '; } - sqlite3_str_appendf(x, " %g,%g'", p->a[0], p->a[1]); + sqlite3_str_appendf(x, " %g,%g'", GeoX(p,0), GeoY(p,0)); for(i=1; inVertex; ii++){ - x0 = p->a[ii*2]; - y0 = p->a[ii*2+1]; + x0 = GeoX(p,ii); + y0 = GeoY(p,ii); x1 = (GeoCoord)(A*x0 + B*y0 + E); y1 = (GeoCoord)(C*x0 + D*y0 + F); - p->a[ii*2] = x1; - p->a[ii*2+1] = y1; + GeoX(p,ii) = x1; + GeoY(p,ii) = y1; } sqlite3_result_blob(context, p->hdr, 4+8*p->nVertex, SQLITE_TRANSIENT); @@ -182773,6 +190860,27 @@ static void geopolyXformFunc( } } +/* +** Compute the area enclosed by the polygon. +** +** This routine can also be used to detect polygons that rotate in +** the wrong direction. Polygons are suppose to be counter-clockwise (CCW). +** This routine returns a negative value for clockwise (CW) polygons. +*/ +static double geopolyArea(GeoPoly *p){ + double rArea = 0.0; + int ii; + for(ii=0; iinVertex-1; ii++){ + rArea += (GeoX(p,ii) - GeoX(p,ii+1)) /* (x0 - x1) */ + * (GeoY(p,ii) + GeoY(p,ii+1)) /* (y0 + y1) */ + * 0.5; + } + rArea += (GeoX(p,ii) - GeoX(p,0)) /* (xN - x0) */ + * (GeoY(p,ii) + GeoY(p,0)) /* (yN + y0) */ + * 0.5; + return rArea; +} + /* ** Implementation of the geopoly_area(X) function. ** @@ -182788,21 +190896,106 @@ static void geopolyAreaFunc( ){ GeoPoly *p = geopolyFuncParam(context, argv[0], 0); if( p ){ - double rArea = 0.0; - int ii; - for(ii=0; iinVertex-1; ii++){ - rArea += (p->a[ii*2] - p->a[ii*2+2]) /* (x0 - x1) */ - * (p->a[ii*2+1] + p->a[ii*2+3]) /* (y0 + y1) */ - * 0.5; - } - rArea += (p->a[ii*2] - p->a[0]) /* (xN - x0) */ - * (p->a[ii*2+1] + p->a[1]) /* (yN + y0) */ - * 0.5; - sqlite3_result_double(context, rArea); + sqlite3_result_double(context, geopolyArea(p)); sqlite3_free(p); } } +/* +** Implementation of the geopoly_ccw(X) function. +** +** If the rotation of polygon X is clockwise (incorrect) instead of +** counter-clockwise (the correct winding order according to RFC7946) +** then reverse the order of the vertexes in polygon X. +** +** In other words, this routine returns a CCW polygon regardless of the +** winding order of its input. +** +** Use this routine to sanitize historical inputs that that sometimes +** contain polygons that wind in the wrong direction. +*/ +static void geopolyCcwFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p = geopolyFuncParam(context, argv[0], 0); + if( p ){ + if( geopolyArea(p)<0.0 ){ + int ii, jj; + for(ii=1, jj=p->nVertex-1; iihdr, + 4+8*p->nVertex, SQLITE_TRANSIENT); + sqlite3_free(p); + } +} + +#define GEOPOLY_PI 3.1415926535897932385 + +/* Fast approximation for sine(X) for X between -0.5*pi and 2*pi +*/ +static double geopolySine(double r){ + assert( r>=-0.5*GEOPOLY_PI && r<=2.0*GEOPOLY_PI ); + if( r>=1.5*GEOPOLY_PI ){ + r -= 2.0*GEOPOLY_PI; + } + if( r>=0.5*GEOPOLY_PI ){ + return -geopolySine(r-GEOPOLY_PI); + }else{ + double r2 = r*r; + double r3 = r2*r; + double r5 = r3*r2; + return 0.9996949*r - 0.1656700*r3 + 0.0075134*r5; + } +} + +/* +** Function: geopoly_regular(X,Y,R,N) +** +** Construct a simple, convex, regular polygon centered at X, Y +** with circumradius R and with N sides. +*/ +static void geopolyRegularFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + double x = sqlite3_value_double(argv[0]); + double y = sqlite3_value_double(argv[1]); + double r = sqlite3_value_double(argv[2]); + int n = sqlite3_value_int(argv[3]); + int i; + GeoPoly *p; + + if( n<3 || r<=0.0 ) return; + if( n>1000 ) n = 1000; + p = sqlite3_malloc64( sizeof(*p) + (n-1)*2*sizeof(GeoCoord) ); + if( p==0 ){ + sqlite3_result_error_nomem(context); + return; + } + i = 1; + p->hdr[0] = *(unsigned char*)&i; + p->hdr[1] = 0; + p->hdr[2] = (n>>8)&0xff; + p->hdr[3] = n&0xff; + for(i=0; ihdr, 4+8*n, SQLITE_TRANSIENT); + sqlite3_free(p); +} + /* ** If pPoly is a polygon, compute its bounding box. Then: ** @@ -182834,20 +191027,20 @@ static GeoPoly *geopolyBBox( } if( p ){ int ii; - mnX = mxX = p->a[0]; - mnY = mxY = p->a[1]; + mnX = mxX = GeoX(p,0); + mnY = mxY = GeoY(p,0); for(ii=1; iinVertex; ii++){ - double r = p->a[ii*2]; + double r = GeoX(p,ii); if( rmxX ) mxX = (float)r; - r = p->a[ii*2+1]; + r = GeoY(p,ii); if( rmxY ) mxY = (float)r; } if( pRc ) *pRc = SQLITE_OK; if( aCoord==0 ){ geopolyBboxFill: - pOut = sqlite3_realloc(p, sizeof(GeoPoly)+sizeof(GeoCoord)*6); + pOut = sqlite3_realloc64(p, GEOPOLY_SZ(4)); if( pOut==0 ){ sqlite3_free(p); if( context ) sqlite3_result_error_nomem(context); @@ -182860,14 +191053,14 @@ static GeoPoly *geopolyBBox( pOut->hdr[1] = 0; pOut->hdr[2] = 0; pOut->hdr[3] = 4; - pOut->a[0] = mnX; - pOut->a[1] = mnY; - pOut->a[2] = mxX; - pOut->a[3] = mnY; - pOut->a[4] = mxX; - pOut->a[5] = mxY; - pOut->a[6] = mnX; - pOut->a[7] = mxY; + GeoX(pOut,0) = mnX; + GeoY(pOut,0) = mnY; + GeoX(pOut,1) = mxX; + GeoY(pOut,1) = mnY; + GeoX(pOut,2) = mxX; + GeoY(pOut,2) = mxY; + GeoX(pOut,3) = mnX; + GeoY(pOut,3) = mxY; }else{ sqlite3_free(p); aCoord[0].f = mnX; @@ -183005,14 +191198,14 @@ static void geopolyContainsPointFunc( int ii; if( p1==0 ) return; for(ii=0; iinVertex-1; ii++){ - v = pointBeneathLine(x0,y0,p1->a[ii*2],p1->a[ii*2+1], - p1->a[ii*2+2],p1->a[ii*2+3]); + v = pointBeneathLine(x0,y0,GeoX(p1,ii), GeoY(p1,ii), + GeoX(p1,ii+1),GeoY(p1,ii+1)); if( v==2 ) break; cnt += v; } if( v!=2 ){ - v = pointBeneathLine(x0,y0,p1->a[ii*2],p1->a[ii*2+1], - p1->a[0],p1->a[1]); + v = pointBeneathLine(x0,y0,GeoX(p1,ii), GeoY(p1,ii), + GeoX(p1,0), GeoY(p1,0)); } if( v==2 ){ sqlite3_result_int(context, 1); @@ -183134,10 +191327,10 @@ static void geopolyAddSegments( unsigned int i; GeoCoord *x; for(i=0; i<(unsigned)pPoly->nVertex-1; i++){ - x = pPoly->a + (i*2); + x = &GeoX(pPoly,i); geopolyAddOneSegment(p, x[0], x[1], x[2], x[3], side, i); } - x = pPoly->a + (i*2); + x = &GeoX(pPoly,i); geopolyAddOneSegment(p, x[0], x[1], pPoly->a[0], pPoly->a[1], side, i); } @@ -183243,9 +191436,9 @@ static GeoSegment *geopolySortSegmentsByYAndC(GeoSegment *pList){ ** Determine the overlap between two polygons */ static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2){ - int nVertex = p1->nVertex + p2->nVertex + 2; + sqlite3_int64 nVertex = p1->nVertex + p2->nVertex + 2; GeoOverlap *p; - int nByte; + sqlite3_int64 nByte; GeoEvent *pThisEvent; double rX; int rc = 0; @@ -183257,7 +191450,7 @@ static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2){ nByte = sizeof(GeoEvent)*nVertex*2 + sizeof(GeoSegment)*nVertex + sizeof(GeoOverlap); - p = sqlite3_malloc( nByte ); + p = sqlite3_malloc64( nByte ); if( p==0 ) return -1; p->aEvent = (GeoEvent*)&p[1]; p->aSegment = (GeoSegment*)&p->aEvent[nVertex*2]; @@ -183416,8 +191609,8 @@ static int geopolyInit( ){ int rc = SQLITE_OK; Rtree *pRtree; - int nDb; /* Length of string argv[1] */ - int nName; /* Length of string argv[2] */ + sqlite3_int64 nDb; /* Length of string argv[1] */ + sqlite3_int64 nName; /* Length of string argv[2] */ sqlite3_str *pSql; char *zSql; int ii; @@ -183425,9 +191618,9 @@ static int geopolyInit( sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1); /* Allocate the sqlite3_vtab structure */ - nDb = (int)strlen(argv[1]); - nName = (int)strlen(argv[2]); - pRtree = (Rtree *)sqlite3_malloc(sizeof(Rtree)+nDb+nName+2); + nDb = strlen(argv[1]); + nName = strlen(argv[2]); + pRtree = (Rtree *)sqlite3_malloc64(sizeof(Rtree)+nDb+nName+2); if( !pRtree ){ return SQLITE_NOMEM; } @@ -183537,17 +191730,11 @@ static int geopolyFilter( RtreeNode *pRoot = 0; int rc = SQLITE_OK; int iCell = 0; - sqlite3_stmt *pStmt; rtreeReference(pRtree); /* Reset the cursor to the same state as rtreeOpen() leaves it in. */ - freeCursorConstraints(pCsr); - sqlite3_free(pCsr->aPoint); - pStmt = pCsr->pReadAux; - memset(pCsr, 0, sizeof(RtreeCursor)); - pCsr->base.pVtab = (sqlite3_vtab*)pRtree; - pCsr->pReadAux = pStmt; + resetCursor(pCsr); pCsr->iStrategy = idxNum; if( idxNum==1 ){ @@ -183875,7 +192062,16 @@ static int geopolyUpdate( if( sqlite3_value_nochange(aData[2]) ){ sqlite3_bind_null(pUp, 2); }else{ - sqlite3_bind_value(pUp, 2, aData[2]); + GeoPoly *p = 0; + if( sqlite3_value_type(aData[2])==SQLITE_TEXT + && (p = geopolyFuncParam(0, aData[2], &rc))!=0 + && rc==SQLITE_OK + ){ + sqlite3_bind_blob(pUp, 2, p->hdr, 4+8*p->nVertex, SQLITE_TRANSIENT); + }else{ + sqlite3_bind_value(pUp, 2, aData[2]); + } + sqlite3_free(p); nChange = 1; } for(jj=1; jjnAux; jj++){ @@ -183919,7 +192115,7 @@ static int geopolyFindFunction( static sqlite3_module geopolyModule = { - 2, /* iVersion */ + 3, /* iVersion */ geopolyCreate, /* xCreate - create a table */ geopolyConnect, /* xConnect - connect to an existing table */ geopolyBestIndex, /* xBestIndex - Determine search strategy */ @@ -183942,25 +192138,29 @@ static sqlite3_module geopolyModule = { rtreeSavepoint, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ + rtreeShadowName /* xShadowName */ }; static int sqlite3_geopoly_init(sqlite3 *db){ int rc = SQLITE_OK; static const struct { void (*xFunc)(sqlite3_context*,int,sqlite3_value**); - int nArg; + signed char nArg; + unsigned char bPure; const char *zName; } aFunc[] = { - { geopolyAreaFunc, 1, "geopoly_area" }, - { geopolyBlobFunc, 1, "geopoly_blob" }, - { geopolyJsonFunc, 1, "geopoly_json" }, - { geopolySvgFunc, -1, "geopoly_svg" }, - { geopolyWithinFunc, 2, "geopoly_within" }, - { geopolyContainsPointFunc, 3, "geopoly_contains_point" }, - { geopolyOverlapFunc, 2, "geopoly_overlap" }, - { geopolyDebugFunc, 1, "geopoly_debug" }, - { geopolyBBoxFunc, 1, "geopoly_bbox" }, - { geopolyXformFunc, 7, "geopoly_xform" }, + { geopolyAreaFunc, 1, 1, "geopoly_area" }, + { geopolyBlobFunc, 1, 1, "geopoly_blob" }, + { geopolyJsonFunc, 1, 1, "geopoly_json" }, + { geopolySvgFunc, -1, 1, "geopoly_svg" }, + { geopolyWithinFunc, 2, 1, "geopoly_within" }, + { geopolyContainsPointFunc, 3, 1, "geopoly_contains_point" }, + { geopolyOverlapFunc, 2, 1, "geopoly_overlap" }, + { geopolyDebugFunc, 1, 0, "geopoly_debug" }, + { geopolyBBoxFunc, 1, 1, "geopoly_bbox" }, + { geopolyXformFunc, 7, 1, "geopoly_xform" }, + { geopolyRegularFunc, 4, 1, "geopoly_regular" }, + { geopolyCcwFunc, 1, 1, "geopoly_ccw" }, }; static const struct { void (*xStep)(sqlite3_context*,int,sqlite3_value**); @@ -183971,13 +192171,20 @@ static int sqlite3_geopoly_init(sqlite3 *db){ }; int i; for(i=0; i0 ){ n = strlen(argv[0])+1; } - p = (IcuTokenizer *)sqlite3_malloc(sizeof(IcuTokenizer)+n); + p = (IcuTokenizer *)sqlite3_malloc64(sizeof(IcuTokenizer)+n); if( !p ){ return SQLITE_NOMEM; } @@ -184841,7 +193049,7 @@ static int icuOpen( nInput = strlen(zInput); } nChar = nInput+1; - pCsr = (IcuCursor *)sqlite3_malloc( + pCsr = (IcuCursor *)sqlite3_malloc64( sizeof(IcuCursor) + /* IcuCursor */ ((nChar+3)&~3) * sizeof(UChar) + /* IcuCursor.aChar[] */ (nChar+1) * sizeof(int) /* IcuCursor.aOffset[] */ @@ -185413,7 +193621,11 @@ SQLITE_API sqlite3rbu *sqlite3rbu_open( ** name of the state database is "-vacuum", where ** is the name of the target database file. In this case, on UNIX, if the ** state database is not already present in the file-system, it is created -** with the same permissions as the target db is made. +** with the same permissions as the target db is made. +** +** With an RBU vacuum, it is an SQLITE_MISUSE error if the name of the +** state database ends with "-vactmp". This name is reserved for internal +** use. ** ** This function does not delete the state database after an RBU vacuum ** is completed, even if it created it. However, if the call to @@ -185776,6 +193988,7 @@ SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName); typedef struct RbuFrame RbuFrame; typedef struct RbuObjIter RbuObjIter; typedef struct RbuState RbuState; +typedef struct RbuSpan RbuSpan; typedef struct rbu_vfs rbu_vfs; typedef struct rbu_file rbu_file; typedef struct RbuUpdateStmt RbuUpdateStmt; @@ -185820,6 +194033,11 @@ struct RbuUpdateStmt { RbuUpdateStmt *pNext; }; +struct RbuSpan { + const char *zSpan; + int nSpan; +}; + /* ** An iterator of this type is used to iterate through all objects in ** the target database that require updating. For each such table, the @@ -185834,6 +194052,11 @@ struct RbuUpdateStmt { ** it points to an array of flags nTblCol elements in size. The flag is ** set for each column that is either a part of the PK or a part of an ** index. Or clear otherwise. +** +** If there are one or more partial indexes on the table, all fields of +** this array set set to 1. This is because in that case, the module has +** no way to tell which fields will be required to add and remove entries +** from the partial indexes. ** */ struct RbuObjIter { @@ -185864,6 +194087,9 @@ struct RbuObjIter { sqlite3_stmt *pInsert; /* Statement for INSERT operations */ sqlite3_stmt *pDelete; /* Statement for DELETE ops */ sqlite3_stmt *pTmpInsert; /* Insert into rbu_tmp_$zDataTbl */ + int nIdxCol; + RbuSpan *aIdxCol; + char *zIdxSql; /* Last UPDATE used (for PK b-tree updates only), or NULL. */ RbuUpdateStmt *pRbuUpdate; @@ -185999,7 +194225,8 @@ struct rbu_vfs { sqlite3_vfs *pRealVfs; /* Underlying VFS */ sqlite3_mutex *mutex; /* Mutex to protect pMain */ sqlite3rbu *pRbu; /* Owner RBU object */ - rbu_file *pMain; /* Linked list of main db files */ + rbu_file *pMain; /* List of main db files */ + rbu_file *pMainRbu; /* List of main db files with pRbu!=0 */ }; /* @@ -186028,6 +194255,7 @@ struct rbu_file { const char *zWal; /* Wal filename for this main db file */ rbu_file *pWalFd; /* Wal file descriptor for this main db */ rbu_file *pMainNext; /* Next MAIN_DB file */ + rbu_file *pMainRbuNext; /* Next MAIN_DB file with pRbu!=0 */ }; /* @@ -186276,6 +194504,7 @@ static void rbuFossilDeltaFunc( }else{ nOut2 = rbuDeltaApply(aOrig, nOrig, aDelta, nDelta, aOut); if( nOut2!=nOut ){ + sqlite3_free(aOut); sqlite3_result_error(context, "corrupt fossil delta", -1); }else{ sqlite3_result_blob(context, aOut, nOut, sqlite3_free); @@ -186395,6 +194624,8 @@ static void rbuObjIterClearStatements(RbuObjIter *pIter){ sqlite3_free(pUp); pUp = pTmp; } + sqlite3_free(pIter->aIdxCol); + sqlite3_free(pIter->zIdxSql); pIter->pSelect = 0; pIter->pInsert = 0; @@ -186402,6 +194633,9 @@ static void rbuObjIterClearStatements(RbuObjIter *pIter){ pIter->pRbuUpdate = 0; pIter->pTmpInsert = 0; pIter->nCol = 0; + pIter->nIdxCol = 0; + pIter->aIdxCol = 0; + pIter->zIdxSql = 0; } /* @@ -186516,6 +194750,7 @@ static void rbuTargetNameFunc( zIn = (const char*)sqlite3_value_text(argv[0]); if( zIn ){ if( rbuIsVacuum(p) ){ + assert( argc==2 || argc==1 ); if( argc==1 || 0==sqlite3_value_int(argv[1]) ){ sqlite3_result_text(pCtx, zIn, -1, SQLITE_STATIC); } @@ -186626,7 +194861,7 @@ static int rbuMPrintfExec(sqlite3rbu *p, sqlite3 *db, const char *zFmt, ...){ ** immediately without attempting the allocation or modifying the stored ** error code. */ -static void *rbuMalloc(sqlite3rbu *p, int nByte){ +static void *rbuMalloc(sqlite3rbu *p, sqlite3_int64 nByte){ void *pRet = 0; if( p->rc==SQLITE_OK ){ assert( nByte>0 ); @@ -186647,7 +194882,7 @@ static void *rbuMalloc(sqlite3rbu *p, int nByte){ ** error code in the RBU handle passed as the first argument. */ static void rbuAllocateIterArrays(sqlite3rbu *p, RbuObjIter *pIter, int nCol){ - int nByte = (2*sizeof(char*) + sizeof(int) + 3*sizeof(u8)) * nCol; + sqlite3_int64 nByte = (2*sizeof(char*) + sizeof(int) + 3*sizeof(u8)) * nCol; char **azNew; azNew = (char**)rbuMalloc(p, nByte); @@ -186674,14 +194909,15 @@ static void rbuAllocateIterArrays(sqlite3rbu *p, RbuObjIter *pIter, int nCol){ static char *rbuStrndup(const char *zStr, int *pRc){ char *zRet = 0; - assert( *pRc==SQLITE_OK ); - if( zStr ){ - size_t nCopy = strlen(zStr) + 1; - zRet = (char*)sqlite3_malloc64(nCopy); - if( zRet ){ - memcpy(zRet, zStr, nCopy); - }else{ - *pRc = SQLITE_NOMEM; + if( *pRc==SQLITE_OK ){ + if( zStr ){ + size_t nCopy = strlen(zStr) + 1; + zRet = (char*)sqlite3_malloc64(nCopy); + if( zRet ){ + memcpy(zRet, zStr, nCopy); + }else{ + *pRc = SQLITE_NOMEM; + } } } @@ -186841,14 +195077,21 @@ static void rbuObjIterCacheIndexedCols(sqlite3rbu *p, RbuObjIter *pIter){ pIter->nIndex = 0; while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pList) ){ const char *zIdx = (const char*)sqlite3_column_text(pList, 1); + int bPartial = sqlite3_column_int(pList, 4); sqlite3_stmt *pXInfo = 0; if( zIdx==0 ) break; + if( bPartial ){ + memset(pIter->abIndexed, 0x01, sizeof(u8)*pIter->nTblCol); + } p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", zIdx) ); while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ int iCid = sqlite3_column_int(pXInfo, 1); if( iCid>=0 ) pIter->abIndexed[iCid] = 1; + if( iCid==-2 ){ + memset(pIter->abIndexed, 0x01, sizeof(u8)*pIter->nTblCol); + } } rbuFinalize(p, pXInfo); bIndex = 1; @@ -186963,7 +195206,8 @@ static int rbuObjIterCacheTableInfo(sqlite3rbu *p, RbuObjIter *pIter){ } pIter->azTblType[iOrder] = rbuStrndup(zType, &p->rc); - pIter->abTblPk[iOrder] = (iPk!=0); + assert( iPk>=0 ); + pIter->abTblPk[iOrder] = (u8)iPk; pIter->abNotNull[iOrder] = (u8)bNotNull || (iPk!=0); iOrder++; } @@ -186998,6 +195242,213 @@ static char *rbuObjIterGetCollist( return zList; } +/* +** Return a comma separated list of the quoted PRIMARY KEY column names, +** in order, for the current table. Before each column name, add the text +** zPre. After each column name, add the zPost text. Use zSeparator as +** the separator text (usually ", "). +*/ +static char *rbuObjIterGetPkList( + sqlite3rbu *p, /* RBU object */ + RbuObjIter *pIter, /* Object iterator for column names */ + const char *zPre, /* Before each quoted column name */ + const char *zSeparator, /* Separator to use between columns */ + const char *zPost /* After each quoted column name */ +){ + int iPk = 1; + char *zRet = 0; + const char *zSep = ""; + while( 1 ){ + int i; + for(i=0; inTblCol; i++){ + if( (int)pIter->abTblPk[i]==iPk ){ + const char *zCol = pIter->azTblCol[i]; + zRet = rbuMPrintf(p, "%z%s%s\"%w\"%s", zRet, zSep, zPre, zCol, zPost); + zSep = zSeparator; + break; + } + } + if( i==pIter->nTblCol ) break; + iPk++; + } + return zRet; +} + +/* +** This function is called as part of restarting an RBU vacuum within +** stage 1 of the process (while the *-oal file is being built) while +** updating a table (not an index). The table may be a rowid table or +** a WITHOUT ROWID table. It queries the target database to find the +** largest key that has already been written to the target table and +** constructs a WHERE clause that can be used to extract the remaining +** rows from the source table. For a rowid table, the WHERE clause +** is of the form: +** +** "WHERE _rowid_ > ?" +** +** and for WITHOUT ROWID tables: +** +** "WHERE (key1, key2) > (?, ?)" +** +** Instead of "?" placeholders, the actual WHERE clauses created by +** this function contain literal SQL values. +*/ +static char *rbuVacuumTableStart( + sqlite3rbu *p, /* RBU handle */ + RbuObjIter *pIter, /* RBU iterator object */ + int bRowid, /* True for a rowid table */ + const char *zWrite /* Target table name prefix */ +){ + sqlite3_stmt *pMax = 0; + char *zRet = 0; + if( bRowid ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pMax, &p->zErrmsg, + sqlite3_mprintf( + "SELECT max(_rowid_) FROM \"%s%w\"", zWrite, pIter->zTbl + ) + ); + if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){ + sqlite3_int64 iMax = sqlite3_column_int64(pMax, 0); + zRet = rbuMPrintf(p, " WHERE _rowid_ > %lld ", iMax); + } + rbuFinalize(p, pMax); + }else{ + char *zOrder = rbuObjIterGetPkList(p, pIter, "", ", ", " DESC"); + char *zSelect = rbuObjIterGetPkList(p, pIter, "quote(", "||','||", ")"); + char *zList = rbuObjIterGetPkList(p, pIter, "", ", ", ""); + + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pMax, &p->zErrmsg, + sqlite3_mprintf( + "SELECT %s FROM \"%s%w\" ORDER BY %s LIMIT 1", + zSelect, zWrite, pIter->zTbl, zOrder + ) + ); + if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){ + const char *zVal = (const char*)sqlite3_column_text(pMax, 0); + zRet = rbuMPrintf(p, " WHERE (%s) > (%s) ", zList, zVal); + } + rbuFinalize(p, pMax); + } + + sqlite3_free(zOrder); + sqlite3_free(zSelect); + sqlite3_free(zList); + } + return zRet; +} + +/* +** This function is called as part of restating an RBU vacuum when the +** current operation is writing content to an index. If possible, it +** queries the target index b-tree for the largest key already written to +** it, then composes and returns an expression that can be used in a WHERE +** clause to select the remaining required rows from the source table. +** It is only possible to return such an expression if: +** +** * The index contains no DESC columns, and +** * The last key written to the index before the operation was +** suspended does not contain any NULL values. +** +** The expression is of the form: +** +** (index-field1, index-field2, ...) > (?, ?, ...) +** +** except that the "?" placeholders are replaced with literal values. +** +** If the expression cannot be created, NULL is returned. In this case, +** the caller has to use an OFFSET clause to extract only the required +** rows from the sourct table, just as it does for an RBU update operation. +*/ +char *rbuVacuumIndexStart( + sqlite3rbu *p, /* RBU handle */ + RbuObjIter *pIter /* RBU iterator object */ +){ + char *zOrder = 0; + char *zLhs = 0; + char *zSelect = 0; + char *zVector = 0; + char *zRet = 0; + int bFailed = 0; + const char *zSep = ""; + int iCol = 0; + sqlite3_stmt *pXInfo = 0; + + p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", pIter->zIdx) + ); + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + int iCid = sqlite3_column_int(pXInfo, 1); + const char *zCollate = (const char*)sqlite3_column_text(pXInfo, 4); + const char *zCol; + if( sqlite3_column_int(pXInfo, 3) ){ + bFailed = 1; + break; + } + + if( iCid<0 ){ + if( pIter->eType==RBU_PK_IPK ){ + int i; + for(i=0; pIter->abTblPk[i]==0; i++); + assert( inTblCol ); + zCol = pIter->azTblCol[i]; + }else{ + zCol = "_rowid_"; + } + }else{ + zCol = pIter->azTblCol[iCid]; + } + + zLhs = rbuMPrintf(p, "%z%s \"%w\" COLLATE %Q", + zLhs, zSep, zCol, zCollate + ); + zOrder = rbuMPrintf(p, "%z%s \"rbu_imp_%d%w\" COLLATE %Q DESC", + zOrder, zSep, iCol, zCol, zCollate + ); + zSelect = rbuMPrintf(p, "%z%s quote(\"rbu_imp_%d%w\")", + zSelect, zSep, iCol, zCol + ); + zSep = ", "; + iCol++; + } + rbuFinalize(p, pXInfo); + if( bFailed ) goto index_start_out; + + if( p->rc==SQLITE_OK ){ + sqlite3_stmt *pSel = 0; + + p->rc = prepareFreeAndCollectError(p->dbMain, &pSel, &p->zErrmsg, + sqlite3_mprintf("SELECT %s FROM \"rbu_imp_%w\" ORDER BY %s LIMIT 1", + zSelect, pIter->zTbl, zOrder + ) + ); + if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSel) ){ + zSep = ""; + for(iCol=0; iColnCol; iCol++){ + const char *zQuoted = (const char*)sqlite3_column_text(pSel, iCol); + if( zQuoted[0]=='N' ){ + bFailed = 1; + break; + } + zVector = rbuMPrintf(p, "%z%s%s", zVector, zSep, zQuoted); + zSep = ", "; + } + + if( !bFailed ){ + zRet = rbuMPrintf(p, "(%s) > (%s)", zLhs, zVector); + } + } + rbuFinalize(p, pSel); + } + + index_start_out: + sqlite3_free(zOrder); + sqlite3_free(zSelect); + sqlite3_free(zVector); + sqlite3_free(zLhs); + return zRet; +} + /* ** This function is used to create a SELECT list (the list of SQL ** expressions that follows a SELECT keyword) for a SELECT statement @@ -187052,29 +195503,37 @@ static char *rbuObjIterGetIndexCols( int iCid = sqlite3_column_int(pXInfo, 1); int bDesc = sqlite3_column_int(pXInfo, 3); const char *zCollate = (const char*)sqlite3_column_text(pXInfo, 4); - const char *zCol; + const char *zCol = 0; const char *zType; - if( iCid<0 ){ - /* An integer primary key. If the table has an explicit IPK, use - ** its name. Otherwise, use "rbu_rowid". */ - if( pIter->eType==RBU_PK_IPK ){ - int i; - for(i=0; pIter->abTblPk[i]==0; i++); - assert( inTblCol ); - zCol = pIter->azTblCol[i]; - }else if( rbuIsVacuum(p) ){ - zCol = "_rowid_"; + if( iCid==-2 ){ + int iSeq = sqlite3_column_int(pXInfo, 0); + zRet = sqlite3_mprintf("%z%s(%.*s) COLLATE %Q", zRet, zCom, + pIter->aIdxCol[iSeq].nSpan, pIter->aIdxCol[iSeq].zSpan, zCollate + ); + zType = ""; + }else { + if( iCid<0 ){ + /* An integer primary key. If the table has an explicit IPK, use + ** its name. Otherwise, use "rbu_rowid". */ + if( pIter->eType==RBU_PK_IPK ){ + int i; + for(i=0; pIter->abTblPk[i]==0; i++); + assert( inTblCol ); + zCol = pIter->azTblCol[i]; + }else if( rbuIsVacuum(p) ){ + zCol = "_rowid_"; + }else{ + zCol = "rbu_rowid"; + } + zType = "INTEGER"; }else{ - zCol = "rbu_rowid"; + zCol = pIter->azTblCol[iCid]; + zType = pIter->azTblType[iCid]; } - zType = "INTEGER"; - }else{ - zCol = pIter->azTblCol[iCid]; - zType = pIter->azTblType[iCid]; + zRet = sqlite3_mprintf("%z%s\"%w\" COLLATE %Q", zRet, zCom,zCol,zCollate); } - zRet = sqlite3_mprintf("%z%s\"%w\" COLLATE %Q", zRet, zCom, zCol, zCollate); if( pIter->bUnique==0 || sqlite3_column_int(pXInfo, 5) ){ const char *zOrder = (bDesc ? " DESC" : ""); zImpPK = sqlite3_mprintf("%z%s\"rbu_imp_%d%w\"%s", @@ -187287,7 +195746,7 @@ static char *rbuObjIterGetSetlist( */ static char *rbuObjIterGetBindlist(sqlite3rbu *p, int nBind){ char *zRet = 0; - int nByte = nBind*2 + 1; + sqlite3_int64 nByte = 2*(sqlite3_int64)nBind + 1; zRet = (char*)rbuMalloc(p, nByte); if( zRet ){ @@ -187549,6 +196008,101 @@ static void rbuTmpInsertFunc( } } +static char *rbuObjIterGetIndexWhere(sqlite3rbu *p, RbuObjIter *pIter){ + sqlite3_stmt *pStmt = 0; + int rc = p->rc; + char *zRet = 0; + + assert( pIter->zIdxSql==0 && pIter->nIdxCol==0 && pIter->aIdxCol==0 ); + + if( rc==SQLITE_OK ){ + rc = prepareAndCollectError(p->dbMain, &pStmt, &p->zErrmsg, + "SELECT trim(sql) FROM sqlite_master WHERE type='index' AND name=?" + ); + } + if( rc==SQLITE_OK ){ + int rc2; + rc = sqlite3_bind_text(pStmt, 1, pIter->zIdx, -1, SQLITE_STATIC); + if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + char *zSql = (char*)sqlite3_column_text(pStmt, 0); + if( zSql ){ + pIter->zIdxSql = zSql = rbuStrndup(zSql, &rc); + } + if( zSql ){ + int nParen = 0; /* Number of open parenthesis */ + int i; + int iIdxCol = 0; + int nIdxAlloc = 0; + for(i=0; zSql[i]; i++){ + char c = zSql[i]; + + /* If necessary, grow the pIter->aIdxCol[] array */ + if( iIdxCol==nIdxAlloc ){ + RbuSpan *aIdxCol = (RbuSpan*)sqlite3_realloc( + pIter->aIdxCol, (nIdxAlloc+16)*sizeof(RbuSpan) + ); + if( aIdxCol==0 ){ + rc = SQLITE_NOMEM; + break; + } + pIter->aIdxCol = aIdxCol; + nIdxAlloc += 16; + } + + if( c=='(' ){ + if( nParen==0 ){ + assert( iIdxCol==0 ); + pIter->aIdxCol[0].zSpan = &zSql[i+1]; + } + nParen++; + } + else if( c==')' ){ + nParen--; + if( nParen==0 ){ + int nSpan = &zSql[i] - pIter->aIdxCol[iIdxCol].zSpan; + pIter->aIdxCol[iIdxCol++].nSpan = nSpan; + i++; + break; + } + }else if( c==',' && nParen==1 ){ + int nSpan = &zSql[i] - pIter->aIdxCol[iIdxCol].zSpan; + pIter->aIdxCol[iIdxCol++].nSpan = nSpan; + pIter->aIdxCol[iIdxCol].zSpan = &zSql[i+1]; + }else if( c=='"' || c=='\'' || c=='`' ){ + for(i++; 1; i++){ + if( zSql[i]==c ){ + if( zSql[i+1]!=c ) break; + i++; + } + } + }else if( c=='[' ){ + for(i++; 1; i++){ + if( zSql[i]==']' ) break; + } + }else if( c=='-' && zSql[i+1]=='-' ){ + for(i=i+2; zSql[i] && zSql[i]!='\n'; i++); + if( zSql[i]=='\0' ) break; + }else if( c=='/' && zSql[i+1]=='*' ){ + for(i=i+2; zSql[i] && (zSql[i]!='*' || zSql[i+1]!='/'); i++); + if( zSql[i]=='\0' ) break; + i++; + } + } + if( zSql[i] ){ + zRet = rbuStrndup(&zSql[i], &rc); + } + pIter->nIdxCol = iIdxCol; + } + } + + rc2 = sqlite3_finalize(pStmt); + if( rc==SQLITE_OK ) rc = rc2; + } + + p->rc = rc; + return zRet; +} + /* ** Ensure that the SQLite statement handles required to update the ** target database object currently indicated by the iterator passed @@ -187578,9 +196132,11 @@ static int rbuObjIterPrepareAll( char *zImposterPK = 0; /* Primary key declaration for imposter */ char *zWhere = 0; /* WHERE clause on PK columns */ char *zBind = 0; + char *zPart = 0; int nBind = 0; assert( pIter->eType!=RBU_PK_VTAB ); + zPart = rbuObjIterGetIndexWhere(p, pIter); zCollist = rbuObjIterGetIndexCols( p, pIter, &zImposterCols, &zImposterPK, &zWhere, &nBind ); @@ -187616,39 +196172,58 @@ static int rbuObjIterPrepareAll( if( p->rc==SQLITE_OK ){ char *zSql; if( rbuIsVacuum(p) ){ + char *zStart = 0; + if( nOffset ){ + zStart = rbuVacuumIndexStart(p, pIter); + if( zStart ){ + sqlite3_free(zLimit); + zLimit = 0; + } + } + zSql = sqlite3_mprintf( - "SELECT %s, 0 AS rbu_control FROM '%q' ORDER BY %s%s", + "SELECT %s, 0 AS rbu_control FROM '%q' %s %s %s ORDER BY %s%s", zCollist, pIter->zDataTbl, + zPart, + (zStart ? (zPart ? "AND" : "WHERE") : ""), zStart, zCollist, zLimit ); + sqlite3_free(zStart); }else if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ zSql = sqlite3_mprintf( - "SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' ORDER BY %s%s", + "SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' %s ORDER BY %s%s", zCollist, p->zStateDb, pIter->zDataTbl, - zCollist, zLimit + zPart, zCollist, zLimit ); }else{ zSql = sqlite3_mprintf( - "SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' " + "SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' %s " "UNION ALL " "SELECT %s, rbu_control FROM '%q' " - "WHERE typeof(rbu_control)='integer' AND rbu_control!=1 " + "%s %s typeof(rbu_control)='integer' AND rbu_control!=1 " "ORDER BY %s%s", - zCollist, p->zStateDb, pIter->zDataTbl, + zCollist, p->zStateDb, pIter->zDataTbl, zPart, zCollist, pIter->zDataTbl, + zPart, + (zPart ? "AND" : "WHERE"), zCollist, zLimit ); } - p->rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pSelect, pz, zSql); + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbRbu,&pIter->pSelect,pz,zSql); + }else{ + sqlite3_free(zSql); + } } sqlite3_free(zImposterCols); sqlite3_free(zImposterPK); sqlite3_free(zWhere); sqlite3_free(zBind); + sqlite3_free(zPart); }else{ int bRbuRowid = (pIter->eType==RBU_PK_VTAB) ||(pIter->eType==RBU_PK_NONE) @@ -187741,18 +196316,42 @@ static int rbuObjIterPrepareAll( /* Create the SELECT statement to read keys from data_xxx */ if( p->rc==SQLITE_OK ){ const char *zRbuRowid = ""; + char *zStart = 0; + char *zOrder = 0; if( bRbuRowid ){ zRbuRowid = rbuIsVacuum(p) ? ",_rowid_ " : ",rbu_rowid"; } - p->rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pSelect, pz, - sqlite3_mprintf( - "SELECT %s,%s rbu_control%s FROM '%q'%s", - zCollist, - (rbuIsVacuum(p) ? "0 AS " : ""), - zRbuRowid, - pIter->zDataTbl, zLimit - ) - ); + + if( rbuIsVacuum(p) ){ + if( nOffset ){ + zStart = rbuVacuumTableStart(p, pIter, bRbuRowid, zWrite); + if( zStart ){ + sqlite3_free(zLimit); + zLimit = 0; + } + } + if( bRbuRowid ){ + zOrder = rbuMPrintf(p, "_rowid_"); + }else{ + zOrder = rbuObjIterGetPkList(p, pIter, "", ", ", ""); + } + } + + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pSelect, pz, + sqlite3_mprintf( + "SELECT %s,%s rbu_control%s FROM '%q'%s %s %s %s", + zCollist, + (rbuIsVacuum(p) ? "0 AS " : ""), + zRbuRowid, + pIter->zDataTbl, (zStart ? zStart : ""), + (zOrder ? "ORDER BY" : ""), zOrder, + zLimit + ) + ); + } + sqlite3_free(zStart); + sqlite3_free(zOrder); } sqlite3_free(zWhere); @@ -188069,7 +196668,7 @@ static void rbuOpenDatabase(sqlite3rbu *p, int *pbRetry){ if( *zExtra=='\0' ) zExtra = 0; } - zTarget = sqlite3_mprintf("file:%s-vacuum?rbu_memory=1%s%s", + zTarget = sqlite3_mprintf("file:%s-vactmp?rbu_memory=1%s%s", sqlite3_db_filename(p->dbRbu, "main"), (zExtra==0 ? "" : "&"), (zExtra==0 ? "" : zExtra) ); @@ -189067,10 +197666,11 @@ static void rbuIndexCntFunc( sqlite3_stmt *pStmt = 0; char *zErrmsg = 0; int rc; + sqlite3 *db = (rbuIsVacuum(p) ? p->dbRbu : p->dbMain); assert( nVal==1 ); - rc = prepareFreeAndCollectError(p->dbMain, &pStmt, &zErrmsg, + rc = prepareFreeAndCollectError(db, &pStmt, &zErrmsg, sqlite3_mprintf("SELECT count(*) FROM sqlite_master " "WHERE type='index' AND tbl_name = %Q", sqlite3_value_text(apVal[0])) ); @@ -189085,7 +197685,7 @@ static void rbuIndexCntFunc( if( rc==SQLITE_OK ){ sqlite3_result_int(pCtx, nIndex); }else{ - sqlite3_result_error(pCtx, sqlite3_errmsg(p->dbMain), -1); + sqlite3_result_error(pCtx, sqlite3_errmsg(db), -1); } } @@ -189335,6 +197935,12 @@ SQLITE_API sqlite3rbu *sqlite3rbu_vacuum( const char *zState ){ if( zTarget==0 ){ return rbuMisuseError(); } + if( zState ){ + int n = strlen(zState); + if( n>=7 && 0==memcmp("-vactmp", &zState[n-7], 7) ){ + return rbuMisuseError(); + } + } /* TODO: Check that both arguments are non-NULL */ return openRbuHandle(0, zTarget, zState); } @@ -189531,7 +198137,10 @@ SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *p){ if( p->eStage==RBU_STAGE_OAL ){ assert( rc!=SQLITE_DONE ); if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, 0); - if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbRbu, "BEGIN IMMEDIATE", 0, 0, 0); + if( rc==SQLITE_OK ){ + const char *zBegin = rbuIsVacuum(p) ? "BEGIN" : "BEGIN IMMEDIATE"; + rc = sqlite3_exec(p->dbRbu, zBegin, 0, 0, 0); + } if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbMain, "BEGIN IMMEDIATE", 0, 0,0); } @@ -189624,6 +198233,69 @@ static int rbuUpdateTempSize(rbu_file *pFd, sqlite3_int64 nNew){ return SQLITE_OK; } +/* +** Add an item to the main-db lists, if it is not already present. +** +** There are two main-db lists. One for all file descriptors, and one +** for all file descriptors with rbu_file.pDb!=0. If the argument has +** rbu_file.pDb!=0, then it is assumed to already be present on the +** main list and is only added to the pDb!=0 list. +*/ +static void rbuMainlistAdd(rbu_file *p){ + rbu_vfs *pRbuVfs = p->pRbuVfs; + rbu_file *pIter; + assert( (p->openFlags & SQLITE_OPEN_MAIN_DB) ); + sqlite3_mutex_enter(pRbuVfs->mutex); + if( p->pRbu==0 ){ + for(pIter=pRbuVfs->pMain; pIter; pIter=pIter->pMainNext); + p->pMainNext = pRbuVfs->pMain; + pRbuVfs->pMain = p; + }else{ + for(pIter=pRbuVfs->pMainRbu; pIter && pIter!=p; pIter=pIter->pMainRbuNext){} + if( pIter==0 ){ + p->pMainRbuNext = pRbuVfs->pMainRbu; + pRbuVfs->pMainRbu = p; + } + } + sqlite3_mutex_leave(pRbuVfs->mutex); +} + +/* +** Remove an item from the main-db lists. +*/ +static void rbuMainlistRemove(rbu_file *p){ + rbu_file **pp; + sqlite3_mutex_enter(p->pRbuVfs->mutex); + for(pp=&p->pRbuVfs->pMain; *pp && *pp!=p; pp=&((*pp)->pMainNext)){} + if( *pp ) *pp = p->pMainNext; + p->pMainNext = 0; + for(pp=&p->pRbuVfs->pMainRbu; *pp && *pp!=p; pp=&((*pp)->pMainRbuNext)){} + if( *pp ) *pp = p->pMainRbuNext; + p->pMainRbuNext = 0; + sqlite3_mutex_leave(p->pRbuVfs->mutex); +} + +/* +** Given that zWal points to a buffer containing a wal file name passed to +** either the xOpen() or xAccess() VFS method, search the main-db list for +** a file-handle opened by the same database connection on the corresponding +** database file. +** +** If parameter bRbu is true, only search for file-descriptors with +** rbu_file.pDb!=0. +*/ +static rbu_file *rbuFindMaindb(rbu_vfs *pRbuVfs, const char *zWal, int bRbu){ + rbu_file *pDb; + sqlite3_mutex_enter(pRbuVfs->mutex); + if( bRbu ){ + for(pDb=pRbuVfs->pMainRbu; pDb && pDb->zWal!=zWal; pDb=pDb->pMainRbuNext){} + }else{ + for(pDb=pRbuVfs->pMain; pDb && pDb->zWal!=zWal; pDb=pDb->pMainNext){} + } + sqlite3_mutex_leave(pRbuVfs->mutex); + return pDb; +} + /* ** Close an rbu file. */ @@ -189641,17 +198313,14 @@ static int rbuVfsClose(sqlite3_file *pFile){ sqlite3_free(p->zDel); if( p->openFlags & SQLITE_OPEN_MAIN_DB ){ - rbu_file **pp; - sqlite3_mutex_enter(p->pRbuVfs->mutex); - for(pp=&p->pRbuVfs->pMain; *pp!=p; pp=&((*pp)->pMainNext)); - *pp = p->pMainNext; - sqlite3_mutex_leave(p->pRbuVfs->mutex); + rbuMainlistRemove(p); rbuUnlockShm(p); p->pReal->pMethods->xShmUnmap(p->pReal, 0); } else if( (p->openFlags & SQLITE_OPEN_DELETEONCLOSE) && p->pRbu ){ rbuUpdateTempSize(p, 0); } + assert( p->pMainNext==0 && p->pRbuVfs->pMain!=p ); /* Close the underlying file handle */ rc = p->pReal->pMethods->xClose(p->pReal); @@ -189910,6 +198579,7 @@ static int rbuVfsFileControl(sqlite3_file *pFile, int op, void *pArg){ }else if( rc==SQLITE_NOTFOUND ){ pRbu->pTargetFd = p; p->pRbu = pRbu; + rbuMainlistAdd(p); if( p->pWalFd ) p->pWalFd->pRbu = pRbu; rc = SQLITE_OK; } @@ -189972,10 +198642,7 @@ static int rbuVfsShmLock(sqlite3_file *pFile, int ofst, int n, int flags){ if( ofst==WAL_LOCK_CKPT && n==1 ) rc = SQLITE_BUSY; }else{ int bCapture = 0; - if( n==1 && (flags & SQLITE_SHM_EXCLUSIVE) - && pRbu && pRbu->eStage==RBU_STAGE_CAPTURE - && (ofst==WAL_LOCK_WRITE || ofst==WAL_LOCK_CKPT || ofst==WAL_LOCK_READ0) - ){ + if( pRbu && pRbu->eStage==RBU_STAGE_CAPTURE ){ bCapture = 1; } @@ -190008,20 +198675,24 @@ static int rbuVfsShmMap( ** rbu is in the RBU_STAGE_OAL state, use heap memory for *-shm space ** instead of a file on disk. */ assert( p->openFlags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_TEMP_DB) ); - if( eStage==RBU_STAGE_OAL || eStage==RBU_STAGE_MOVE ){ - if( iRegion<=p->nShm ){ - int nByte = (iRegion+1) * sizeof(char*); - char **apNew = (char**)sqlite3_realloc64(p->apShm, nByte); - if( apNew==0 ){ - rc = SQLITE_NOMEM; - }else{ - memset(&apNew[p->nShm], 0, sizeof(char*) * (1 + iRegion - p->nShm)); - p->apShm = apNew; - p->nShm = iRegion+1; - } + if( eStage==RBU_STAGE_OAL ){ + sqlite3_int64 nByte = (iRegion+1) * sizeof(char*); + char **apNew = (char**)sqlite3_realloc64(p->apShm, nByte); + + /* This is an RBU connection that uses its own heap memory for the + ** pages of the *-shm file. Since no other process can have run + ** recovery, the connection must request *-shm pages in order + ** from start to finish. */ + assert( iRegion==p->nShm ); + if( apNew==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(&apNew[p->nShm], 0, sizeof(char*) * (1 + iRegion - p->nShm)); + p->apShm = apNew; + p->nShm = iRegion+1; } - if( rc==SQLITE_OK && p->apShm[iRegion]==0 ){ + if( rc==SQLITE_OK ){ char *pNew = (char*)sqlite3_malloc64(szRegion); if( pNew==0 ){ rc = SQLITE_NOMEM; @@ -190071,47 +198742,6 @@ static int rbuVfsShmUnmap(sqlite3_file *pFile, int delFlag){ return rc; } -/* -** Given that zWal points to a buffer containing a wal file name passed to -** either the xOpen() or xAccess() VFS method, return a pointer to the -** file-handle opened by the same database connection on the corresponding -** database file. -*/ -static rbu_file *rbuFindMaindb(rbu_vfs *pRbuVfs, const char *zWal){ - rbu_file *pDb; - sqlite3_mutex_enter(pRbuVfs->mutex); - for(pDb=pRbuVfs->pMain; pDb && pDb->zWal!=zWal; pDb=pDb->pMainNext){} - sqlite3_mutex_leave(pRbuVfs->mutex); - return pDb; -} - -/* -** A main database named zName has just been opened. The following -** function returns a pointer to a buffer owned by SQLite that contains -** the name of the *-wal file this db connection will use. SQLite -** happens to pass a pointer to this buffer when using xAccess() -** or xOpen() to operate on the *-wal file. -*/ -static const char *rbuMainToWal(const char *zName, int flags){ - int n = (int)strlen(zName); - const char *z = &zName[n]; - if( flags & SQLITE_OPEN_URI ){ - int odd = 0; - while( 1 ){ - if( z[0]==0 ){ - odd = 1 - odd; - if( odd && z[1]==0 ) break; - } - z++; - } - z += 2; - }else{ - while( *z==0 ) z++; - } - z += (n + 8 + 1); - return z; -} - /* ** Open an rbu file handle. */ @@ -190160,10 +198790,10 @@ static int rbuVfsOpen( ** the name of the *-wal file this db connection will use. SQLite ** happens to pass a pointer to this buffer when using xAccess() ** or xOpen() to operate on the *-wal file. */ - pFd->zWal = rbuMainToWal(zName, flags); + pFd->zWal = sqlite3_filename_wal(zName); } else if( flags & SQLITE_OPEN_WAL ){ - rbu_file *pDb = rbuFindMaindb(pRbuVfs, zName); + rbu_file *pDb = rbuFindMaindb(pRbuVfs, zName, 0); if( pDb ){ if( pDb->pRbu && pDb->pRbu->eStage==RBU_STAGE_OAL ){ /* This call is to open a *-wal file. Intead, open the *-oal. This @@ -190175,7 +198805,7 @@ static int rbuVfsOpen( char *zCopy; if( rbuIsVacuum(pDb->pRbu) ){ zBase = sqlite3_db_filename(pDb->pRbu->dbRbu, "main"); - zBase = rbuMainToWal(zBase, SQLITE_OPEN_URI); + zBase = sqlite3_filename_wal(zBase); } nCopy = strlen(zBase); zCopy = sqlite3_malloc64(nCopy+2); @@ -190215,10 +198845,7 @@ static int rbuVfsOpen( ** mutex protected linked list of all such files. */ pFile->pMethods = &rbuvfs_io_methods; if( flags & SQLITE_OPEN_MAIN_DB ){ - sqlite3_mutex_enter(pRbuVfs->mutex); - pFd->pMainNext = pRbuVfs->pMain; - pRbuVfs->pMain = pFd; - sqlite3_mutex_leave(pRbuVfs->mutex); + rbuMainlistAdd(pFd); } }else{ sqlite3_free(pFd->zDel); @@ -190266,8 +198893,9 @@ static int rbuVfsAccess( ** file opened instead. */ if( rc==SQLITE_OK && flags==SQLITE_ACCESS_EXISTS ){ - rbu_file *pDb = rbuFindMaindb(pRbuVfs, zPath); - if( pDb && pDb->pRbu && pDb->pRbu->eStage==RBU_STAGE_OAL ){ + rbu_file *pDb = rbuFindMaindb(pRbuVfs, zPath, 1); + if( pDb && pDb->pRbu->eStage==RBU_STAGE_OAL ){ + assert( pDb->pRbu ); if( *pResOut ){ rc = SQLITE_CANTOPEN; }else{ @@ -190497,7 +199125,7 @@ SQLITE_API sqlite3_int64 sqlite3rbu_temp_size(sqlite3rbu *pRbu){ ** ** This file contains an implementation of the "dbstat" virtual table. ** -** The dbstat virtual table is used to extract low-level formatting +** The dbstat virtual table is used to extract low-level storage ** information from an SQLite database in order to implement the ** "sqlite3_analyzer" utility. See the ../tool/spaceanal.tcl script ** for an example implementation. @@ -190541,27 +199169,30 @@ SQLITE_API sqlite3_int64 sqlite3rbu_temp_size(sqlite3rbu *pRbu){ ** ** '/1c2/000/' // Left-most child of 451st child of root */ -#define VTAB_SCHEMA \ - "CREATE TABLE xx( " \ - " name TEXT, /* Name of table or index */" \ - " path TEXT, /* Path to page from root */" \ - " pageno INTEGER, /* Page number */" \ - " pagetype TEXT, /* 'internal', 'leaf' or 'overflow' */" \ - " ncell INTEGER, /* Cells on page (0 for overflow) */" \ - " payload INTEGER, /* Bytes of payload on this page */" \ - " unused INTEGER, /* Bytes of unused space on this page */" \ - " mx_payload INTEGER, /* Largest payload size of all cells */" \ - " pgoffset INTEGER, /* Offset of page in file */" \ - " pgsize INTEGER, /* Size of the page */" \ - " schema TEXT HIDDEN /* Database schema being analyzed */" \ - ");" - - +static const char zDbstatSchema[] = + "CREATE TABLE x(" + " name TEXT," /* 0 Name of table or index */ + " path TEXT," /* 1 Path to page from root (NULL for agg) */ + " pageno INTEGER," /* 2 Page number (page count for aggregates) */ + " pagetype TEXT," /* 3 'internal', 'leaf', 'overflow', or NULL */ + " ncell INTEGER," /* 4 Cells on page (0 for overflow) */ + " payload INTEGER," /* 5 Bytes of payload on this page */ + " unused INTEGER," /* 6 Bytes of unused space on this page */ + " mx_payload INTEGER," /* 7 Largest payload size of all cells */ + " pgoffset INTEGER," /* 8 Offset of page in file (NULL for agg) */ + " pgsize INTEGER," /* 9 Size of the page (sum for aggregate) */ + " schema TEXT HIDDEN," /* 10 Database schema being analyzed */ + " aggregate BOOLEAN HIDDEN" /* 11 aggregate info for each table */ + ")" +; + +/* Forward reference to data structured used in this module */ typedef struct StatTable StatTable; typedef struct StatCursor StatCursor; typedef struct StatPage StatPage; typedef struct StatCell StatCell; +/* Size information for a single cell within a btree page */ struct StatCell { int nLocal; /* Bytes of local payload */ u32 iChildPg; /* Child node (or 0 if this is a leaf) */ @@ -190571,10 +199202,11 @@ struct StatCell { int iOvfl; /* Iterates through aOvfl[] */ }; +/* Size information for a single btree page */ struct StatPage { - u32 iPgno; - DbPage *pPg; - int iCell; + u32 iPgno; /* Page number */ + DbPage *pPg; /* Page content */ + int iCell; /* Current cell */ char *zPath; /* Path to this page */ @@ -190584,34 +199216,38 @@ struct StatPage { int nUnused; /* Number of unused bytes on page */ StatCell *aCell; /* Array of parsed cells */ u32 iRightChildPg; /* Right-child page number (or 0) */ - int nMxPayload; /* Largest payload of any cell on this page */ + int nMxPayload; /* Largest payload of any cell on the page */ }; +/* The cursor for scanning the dbstat virtual table */ struct StatCursor { - sqlite3_vtab_cursor base; + sqlite3_vtab_cursor base; /* base class. MUST BE FIRST! */ sqlite3_stmt *pStmt; /* Iterates through set of root pages */ - int isEof; /* After pStmt has returned SQLITE_DONE */ + u8 isEof; /* After pStmt has returned SQLITE_DONE */ + u8 isAgg; /* Aggregate results for each table */ int iDb; /* Schema used for this query */ - StatPage aPage[32]; + StatPage aPage[32]; /* Pages in path to current page */ int iPage; /* Current entry in aPage[] */ /* Values to return. */ + u32 iPageno; /* Value of 'pageno' column */ char *zName; /* Value of 'name' column */ char *zPath; /* Value of 'path' column */ - u32 iPageno; /* Value of 'pageno' column */ char *zPagetype; /* Value of 'pagetype' column */ + int nPage; /* Number of pages in current btree */ int nCell; /* Value of 'ncell' column */ - int nPayload; /* Value of 'payload' column */ - int nUnused; /* Value of 'unused' column */ int nMxPayload; /* Value of 'mx_payload' column */ + i64 nUnused; /* Value of 'unused' column */ + i64 nPayload; /* Value of 'payload' column */ i64 iOffset; /* Value of 'pgOffset' column */ - int szPage; /* Value of 'pgSize' column */ + i64 szPage; /* Value of 'pgSize' column */ }; +/* An instance of the DBSTAT virtual table */ struct StatTable { - sqlite3_vtab base; - sqlite3 *db; + sqlite3_vtab base; /* base class. MUST BE FIRST! */ + sqlite3 *db; /* Database connection that owns this vtab */ int iDb; /* Index of database to analyze */ }; @@ -190620,7 +199256,7 @@ struct StatTable { #endif /* -** Connect to or create a statvfs virtual table. +** Connect to or create a new DBSTAT virtual table. */ static int statConnect( sqlite3 *db, @@ -190644,7 +199280,8 @@ static int statConnect( }else{ iDb = 0; } - rc = sqlite3_declare_vtab(db, VTAB_SCHEMA); + sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY); + rc = sqlite3_declare_vtab(db, zDbstatSchema); if( rc==SQLITE_OK ){ pTab = (StatTable *)sqlite3_malloc64(sizeof(StatTable)); if( pTab==0 ) rc = SQLITE_NOMEM_BKPT; @@ -190662,7 +199299,7 @@ static int statConnect( } /* -** Disconnect from or destroy a statvfs virtual table. +** Disconnect from or destroy the DBSTAT virtual table. */ static int statDisconnect(sqlite3_vtab *pVtab){ sqlite3_free(pVtab); @@ -190670,16 +199307,20 @@ static int statDisconnect(sqlite3_vtab *pVtab){ } /* -** There is no "best-index". This virtual table always does a linear -** scan. However, a schema=? constraint should cause this table to -** operate on a different database schema, so check for it. +** Compute the best query strategy and return the result in idxNum. ** -** idxNum is normally 0, but will be 1 if a schema=? constraint exists. +** idxNum-Bit Meaning +** ---------- ---------------------------------------------- +** 0x01 There is a schema=? term in the WHERE clause +** 0x02 There is a name=? term in the WHERE clause +** 0x04 There is an aggregate=? term in the WHERE clause +** 0x08 Output should be ordered by name and path */ static int statBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ int i; - - pIdxInfo->estimatedCost = 1.0e6; /* Initial cost estimate */ + int iSchema = -1; + int iName = -1; + int iAgg = -1; /* Look for a valid schema=? constraint. If found, change the idxNum to ** 1 and request the value of that constraint be sent to xFilter. And @@ -190687,16 +199328,40 @@ static int statBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ ** used. */ for(i=0; inConstraint; i++){ - if( pIdxInfo->aConstraint[i].usable==0 ) continue; if( pIdxInfo->aConstraint[i].op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; - if( pIdxInfo->aConstraint[i].iColumn!=10 ) continue; - pIdxInfo->idxNum = 1; - pIdxInfo->estimatedCost = 1.0; - pIdxInfo->aConstraintUsage[i].argvIndex = 1; - pIdxInfo->aConstraintUsage[i].omit = 1; - break; + if( pIdxInfo->aConstraint[i].usable==0 ){ + /* Force DBSTAT table should always be the right-most table in a join */ + return SQLITE_CONSTRAINT; + } + switch( pIdxInfo->aConstraint[i].iColumn ){ + case 0: { /* name */ + iName = i; + break; + } + case 10: { /* schema */ + iSchema = i; + break; + } + case 11: { /* aggregate */ + iAgg = i; + break; + } + } } - + i = 0; + if( iSchema>=0 ){ + pIdxInfo->aConstraintUsage[iSchema].argvIndex = ++i; + pIdxInfo->idxNum |= 0x01; + } + if( iName>=0 ){ + pIdxInfo->aConstraintUsage[iName].argvIndex = ++i; + pIdxInfo->idxNum |= 0x02; + } + if( iAgg>=0 ){ + pIdxInfo->aConstraintUsage[iAgg].argvIndex = ++i; + pIdxInfo->idxNum |= 0x04; + } + pIdxInfo->estimatedCost = 1.0; /* Records are always returned in ascending order of (name, path). ** If this will satisfy the client, set the orderByConsumed flag so that @@ -190714,13 +199379,14 @@ static int statBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ ) ){ pIdxInfo->orderByConsumed = 1; + pIdxInfo->idxNum |= 0x08; } return SQLITE_OK; } /* -** Open a new statvfs cursor. +** Open a new DBSTAT cursor. */ static int statOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ StatTable *pTab = (StatTable *)pVTab; @@ -190739,7 +199405,7 @@ static int statOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ return SQLITE_OK; } -static void statClearPage(StatPage *p){ +static void statClearCells(StatPage *p){ int i; if( p->aCell ){ for(i=0; inCell; i++){ @@ -190747,6 +199413,12 @@ static void statClearPage(StatPage *p){ } sqlite3_free(p->aCell); } + p->nCell = 0; + p->aCell = 0; +} + +static void statClearPage(StatPage *p){ + statClearCells(p); sqlite3PagerUnref(p->pPg); sqlite3_free(p->zPath); memset(p, 0, sizeof(StatPage)); @@ -190764,8 +199436,18 @@ static void statResetCsr(StatCursor *pCsr){ pCsr->isEof = 0; } +/* Resize the space-used counters inside of the cursor */ +static void statResetCounts(StatCursor *pCsr){ + pCsr->nCell = 0; + pCsr->nMxPayload = 0; + pCsr->nUnused = 0; + pCsr->nPayload = 0; + pCsr->szPage = 0; + pCsr->nPage = 0; +} + /* -** Close a statvfs cursor. +** Close a DBSTAT cursor. */ static int statClose(sqlite3_vtab_cursor *pCursor){ StatCursor *pCsr = (StatCursor *)pCursor; @@ -190775,11 +199457,15 @@ static int statClose(sqlite3_vtab_cursor *pCursor){ return SQLITE_OK; } -static void getLocalPayload( +/* +** For a single cell on a btree page, compute the number of bytes of +** content (payload) stored on that page. That is to say, compute the +** number of bytes of content not found on overflow pages. +*/ +static int getLocalPayload( int nUsable, /* Usable bytes per page */ u8 flags, /* Page flags */ - int nTotal, /* Total record (payload) size */ - int *pnLocal /* OUT: Bytes stored locally */ + int nTotal /* Total record (payload) size */ ){ int nLocal; int nMinLocal; @@ -190795,9 +199481,12 @@ static void getLocalPayload( nLocal = nMinLocal + (nTotal - nMinLocal) % (nUsable - 4); if( nLocal>nMaxLocal ) nLocal = nMinLocal; - *pnLocal = nLocal; + return nLocal; } +/* Populate the StatPage object with information about the all +** cells found on the page currently under analysis. +*/ static int statDecodePage(Btree *pBt, StatPage *p){ int nUnused; int iOff; @@ -190809,22 +199498,33 @@ static int statDecodePage(Btree *pBt, StatPage *p){ u8 *aHdr = &aData[p->iPgno==1 ? 100 : 0]; p->flags = aHdr[0]; + if( p->flags==0x0A || p->flags==0x0D ){ + isLeaf = 1; + nHdr = 8; + }else if( p->flags==0x05 || p->flags==0x02 ){ + isLeaf = 0; + nHdr = 12; + }else{ + goto statPageIsCorrupt; + } + if( p->iPgno==1 ) nHdr += 100; p->nCell = get2byte(&aHdr[3]); p->nMxPayload = 0; - - isLeaf = (p->flags==0x0A || p->flags==0x0D); - nHdr = 12 - isLeaf*4 + (p->iPgno==1)*100; + szPage = sqlite3BtreeGetPageSize(pBt); nUnused = get2byte(&aHdr[5]) - nHdr - 2*p->nCell; nUnused += (int)aHdr[7]; iOff = get2byte(&aHdr[1]); while( iOff ){ + int iNext; + if( iOff>=szPage ) goto statPageIsCorrupt; nUnused += get2byte(&aData[iOff+2]); - iOff = get2byte(&aData[iOff]); + iNext = get2byte(&aData[iOff]); + if( iNext0 ) goto statPageIsCorrupt; + iOff = iNext; } p->nUnused = nUnused; p->iRightChildPg = isLeaf ? 0 : sqlite3Get4byte(&aHdr[8]); - szPage = sqlite3BtreeGetPageSize(pBt); if( p->nCell ){ int i; /* Used to iterate through cells */ @@ -190841,6 +199541,7 @@ static int statDecodePage(Btree *pBt, StatPage *p){ StatCell *pCell = &p->aCell[i]; iOff = get2byte(&aData[nHdr+i*2]); + if( iOff=szPage ) goto statPageIsCorrupt; if( !isLeaf ){ pCell->iChildPg = sqlite3Get4byte(&aData[iOff]); iOff += 4; @@ -190856,14 +199557,15 @@ static int statDecodePage(Btree *pBt, StatPage *p){ iOff += sqlite3GetVarint(&aData[iOff], &dummy); } if( nPayload>(u32)p->nMxPayload ) p->nMxPayload = nPayload; - getLocalPayload(nUsable, p->flags, nPayload, &nLocal); + nLocal = getLocalPayload(nUsable, p->flags, nPayload); + if( nLocal<0 ) goto statPageIsCorrupt; pCell->nLocal = nLocal; - assert( nLocal>=0 ); assert( nPayload>=(u32)nLocal ); assert( nLocal<=(nUsable-35) ); if( nPayload>(u32)nLocal ){ int j; int nOvfl = ((nPayload - nLocal) + nUsable-4 - 1) / (nUsable - 4); + if( iOff+nLocal>nUsable ) goto statPageIsCorrupt; pCell->nLastOvfl = (nPayload-nLocal) - (nOvfl-1) * (nUsable-4); pCell->nOvfl = nOvfl; pCell->aOvfl = sqlite3_malloc64(sizeof(u32)*nOvfl); @@ -190887,6 +199589,11 @@ static int statDecodePage(Btree *pBt, StatPage *p){ } return SQLITE_OK; + +statPageIsCorrupt: + p->flags = 0; + statClearCells(p); + return SQLITE_OK; } /* @@ -190900,23 +199607,25 @@ static void statSizeAndOffset(StatCursor *pCsr){ sqlite3_file *fd; sqlite3_int64 x[2]; - /* The default page size and offset */ - pCsr->szPage = sqlite3BtreeGetPageSize(pBt); - pCsr->iOffset = (i64)pCsr->szPage * (pCsr->iPageno - 1); - - /* If connected to a ZIPVFS backend, override the page size and - ** offset with actual values obtained from ZIPVFS. + /* If connected to a ZIPVFS backend, find the page size and + ** offset from ZIPVFS. */ fd = sqlite3PagerFile(pPager); x[0] = pCsr->iPageno; if( sqlite3OsFileControl(fd, 230440, &x)==SQLITE_OK ){ pCsr->iOffset = x[0]; - pCsr->szPage = (int)x[1]; + pCsr->szPage += x[1]; + }else{ + /* Not ZIPVFS: The default page size and offset */ + pCsr->szPage += sqlite3BtreeGetPageSize(pBt); + pCsr->iOffset = (i64)pCsr->szPage * (pCsr->iPageno - 1); } } /* -** Move a statvfs cursor to the next entry in the file. +** Move a DBSTAT cursor to the next entry. Normally, the next +** entry will be the next page, but in aggregated mode (pCsr->isAgg!=0), +** the next entry is the next btree. */ static int statNext(sqlite3_vtab_cursor *pCursor){ int rc; @@ -190932,6 +199641,8 @@ static int statNext(sqlite3_vtab_cursor *pCursor){ statNextRestart: if( pCsr->aPage[0].pPg==0 ){ + /* Start measuring space on the next btree */ + statResetCounts(pCsr); rc = sqlite3_step(pCsr->pStmt); if( rc==SQLITE_ROW ){ int nPage; @@ -190944,44 +199655,47 @@ static int statNext(sqlite3_vtab_cursor *pCursor){ rc = sqlite3PagerGet(pPager, iRoot, &pCsr->aPage[0].pPg, 0); pCsr->aPage[0].iPgno = iRoot; pCsr->aPage[0].iCell = 0; - pCsr->aPage[0].zPath = z = sqlite3_mprintf("/"); + if( !pCsr->isAgg ){ + pCsr->aPage[0].zPath = z = sqlite3_mprintf("/"); + if( z==0 ) rc = SQLITE_NOMEM_BKPT; + } pCsr->iPage = 0; - if( z==0 ) rc = SQLITE_NOMEM_BKPT; + pCsr->nPage = 1; }else{ pCsr->isEof = 1; return sqlite3_reset(pCsr->pStmt); } }else{ - - /* Page p itself has already been visited. */ + /* Continue analyzing the btree previously started */ StatPage *p = &pCsr->aPage[pCsr->iPage]; - + if( !pCsr->isAgg ) statResetCounts(pCsr); while( p->iCellnCell ){ StatCell *pCell = &p->aCell[p->iCell]; - if( pCell->iOvflnOvfl ){ - int nUsable; + while( pCell->iOvflnOvfl ){ + int nUsable, iOvfl; sqlite3BtreeEnter(pBt); nUsable = sqlite3BtreeGetPageSize(pBt) - sqlite3BtreeGetReserveNoMutex(pBt); sqlite3BtreeLeave(pBt); - pCsr->zName = (char *)sqlite3_column_text(pCsr->pStmt, 0); - pCsr->iPageno = pCell->aOvfl[pCell->iOvfl]; - pCsr->zPagetype = "overflow"; - pCsr->nCell = 0; - pCsr->nMxPayload = 0; - pCsr->zPath = z = sqlite3_mprintf( - "%s%.3x+%.6x", p->zPath, p->iCell, pCell->iOvfl - ); + pCsr->nPage++; + statSizeAndOffset(pCsr); if( pCell->iOvflnOvfl-1 ){ - pCsr->nUnused = 0; - pCsr->nPayload = nUsable - 4; + pCsr->nPayload += nUsable - 4; }else{ - pCsr->nPayload = pCell->nLastOvfl; - pCsr->nUnused = nUsable - 4 - pCsr->nPayload; + pCsr->nPayload += pCell->nLastOvfl; + pCsr->nUnused += nUsable - 4 - pCell->nLastOvfl; } + iOvfl = pCell->iOvfl; pCell->iOvfl++; - statSizeAndOffset(pCsr); - return z==0 ? SQLITE_NOMEM_BKPT : SQLITE_OK; + if( !pCsr->isAgg ){ + pCsr->zName = (char *)sqlite3_column_text(pCsr->pStmt, 0); + pCsr->iPageno = pCell->aOvfl[iOvfl]; + pCsr->zPagetype = "overflow"; + pCsr->zPath = z = sqlite3_mprintf( + "%s%.3x+%.6x", p->zPath, p->iCell, iOvfl + ); + return z==0 ? SQLITE_NOMEM_BKPT : SQLITE_OK; + } } if( p->iRightChildPg ) break; p->iCell++; @@ -190989,11 +199703,20 @@ static int statNext(sqlite3_vtab_cursor *pCursor){ if( !p->iRightChildPg || p->iCell>p->nCell ){ statClearPage(p); - if( pCsr->iPage==0 ) return statNext(pCursor); - pCsr->iPage--; + if( pCsr->iPage>0 ){ + pCsr->iPage--; + }else if( pCsr->isAgg ){ + /* label-statNext-done: When computing aggregate space usage over + ** an entire btree, this is the exit point from this function */ + return SQLITE_OK; + } goto statNextRestart; /* Tail recursion */ } pCsr->iPage++; + if( pCsr->iPage>=ArraySize(pCsr->aPage) ){ + statResetCsr(pCsr); + return SQLITE_CORRUPT_BKPT; + } assert( p==&pCsr->aPage[pCsr->iPage-1] ); if( p->iCell==p->nCell ){ @@ -191002,10 +199725,13 @@ static int statNext(sqlite3_vtab_cursor *pCursor){ p[1].iPgno = p->aCell[p->iCell].iChildPg; } rc = sqlite3PagerGet(pPager, p[1].iPgno, &p[1].pPg, 0); + pCsr->nPage++; p[1].iCell = 0; - p[1].zPath = z = sqlite3_mprintf("%s%.3x/", p->zPath, p->iCell); + if( !pCsr->isAgg ){ + p[1].zPath = z = sqlite3_mprintf("%s%.3x/", p->zPath, p->iCell); + if( z==0 ) rc = SQLITE_NOMEM_BKPT; + } p->iCell++; - if( z==0 ) rc = SQLITE_NOMEM_BKPT; } @@ -191035,16 +199761,23 @@ static int statNext(sqlite3_vtab_cursor *pCursor){ pCsr->zPagetype = "corrupted"; break; } - pCsr->nCell = p->nCell; - pCsr->nUnused = p->nUnused; - pCsr->nMxPayload = p->nMxPayload; - pCsr->zPath = z = sqlite3_mprintf("%s", p->zPath); - if( z==0 ) rc = SQLITE_NOMEM_BKPT; + pCsr->nCell += p->nCell; + pCsr->nUnused += p->nUnused; + if( p->nMxPayload>pCsr->nMxPayload ) pCsr->nMxPayload = p->nMxPayload; + if( !pCsr->isAgg ){ + pCsr->zPath = z = sqlite3_mprintf("%s", p->zPath); + if( z==0 ) rc = SQLITE_NOMEM_BKPT; + } nPayload = 0; for(i=0; inCell; i++){ nPayload += p->aCell[i].nLocal; } - pCsr->nPayload = nPayload; + pCsr->nPayload += nPayload; + + /* If computing aggregate space usage by btree, continue with the + ** next page. The loop will exit via the return at label-statNext-done + */ + if( pCsr->isAgg ) goto statNextRestart; } } @@ -191056,6 +199789,10 @@ static int statEof(sqlite3_vtab_cursor *pCursor){ return pCsr->isEof; } +/* Initialize a cursor according to the query plan idxNum using the +** arguments in argv[0]. See statBestIndex() for a description of the +** meaning of the bits in idxNum. +*/ static int statFilter( sqlite3_vtab_cursor *pCursor, int idxNum, const char *idxStr, @@ -191063,31 +199800,52 @@ static int statFilter( ){ StatCursor *pCsr = (StatCursor *)pCursor; StatTable *pTab = (StatTable*)(pCursor->pVtab); - char *zSql; - int rc = SQLITE_OK; - char *zMaster; + sqlite3_str *pSql; /* Query of btrees to analyze */ + char *zSql; /* String value of pSql */ + int iArg = 0; /* Count of argv[] parameters used so far */ + int rc = SQLITE_OK; /* Result of this operation */ + const char *zName = 0; /* Only provide analysis of this table */ - if( idxNum==1 ){ - const char *zDbase = (const char*)sqlite3_value_text(argv[0]); + statResetCsr(pCsr); + sqlite3_finalize(pCsr->pStmt); + pCsr->pStmt = 0; + if( idxNum & 0x01 ){ + /* schema=? constraint is present. Get its value */ + const char *zDbase = (const char*)sqlite3_value_text(argv[iArg++]); pCsr->iDb = sqlite3FindDbName(pTab->db, zDbase); if( pCsr->iDb<0 ){ - sqlite3_free(pCursor->pVtab->zErrMsg); - pCursor->pVtab->zErrMsg = sqlite3_mprintf("no such schema: %s", zDbase); - return pCursor->pVtab->zErrMsg ? SQLITE_ERROR : SQLITE_NOMEM_BKPT; + pCsr->iDb = 0; + pCsr->isEof = 1; + return SQLITE_OK; } }else{ pCsr->iDb = pTab->iDb; } - statResetCsr(pCsr); - sqlite3_finalize(pCsr->pStmt); - pCsr->pStmt = 0; - zMaster = pCsr->iDb==1 ? "sqlite_temp_master" : "sqlite_master"; - zSql = sqlite3_mprintf( - "SELECT 'sqlite_master' AS name, 1 AS rootpage, 'table' AS type" - " UNION ALL " - "SELECT name, rootpage, type" - " FROM \"%w\".%s WHERE rootpage!=0" - " ORDER BY name", pTab->db->aDb[pCsr->iDb].zDbSName, zMaster); + if( idxNum & 0x02 ){ + /* name=? constraint is present */ + zName = (const char*)sqlite3_value_text(argv[iArg++]); + } + if( idxNum & 0x04 ){ + /* aggregate=? constraint is present */ + pCsr->isAgg = sqlite3_value_double(argv[iArg++])!=0.0; + }else{ + pCsr->isAgg = 0; + } + pSql = sqlite3_str_new(pTab->db); + sqlite3_str_appendf(pSql, + "SELECT * FROM (" + "SELECT 'sqlite_master' AS name,1 AS rootpage,'table' AS type" + " UNION ALL " + "SELECT name,rootpage,type" + " FROM \"%w\".sqlite_master WHERE rootpage!=0)", + pTab->db->aDb[pCsr->iDb].zDbSName); + if( zName ){ + sqlite3_str_appendf(pSql, "WHERE name=%Q", zName); + } + if( idxNum & 0x08 ){ + sqlite3_str_appendf(pSql, " ORDER BY name"); + } + zSql = sqlite3_str_finish(pSql); if( zSql==0 ){ return SQLITE_NOMEM_BKPT; }else{ @@ -191112,13 +199870,21 @@ static int statColumn( sqlite3_result_text(ctx, pCsr->zName, -1, SQLITE_TRANSIENT); break; case 1: /* path */ - sqlite3_result_text(ctx, pCsr->zPath, -1, SQLITE_TRANSIENT); + if( !pCsr->isAgg ){ + sqlite3_result_text(ctx, pCsr->zPath, -1, SQLITE_TRANSIENT); + } break; case 2: /* pageno */ - sqlite3_result_int64(ctx, pCsr->iPageno); + if( pCsr->isAgg ){ + sqlite3_result_int64(ctx, pCsr->nPage); + }else{ + sqlite3_result_int64(ctx, pCsr->iPageno); + } break; case 3: /* pagetype */ - sqlite3_result_text(ctx, pCsr->zPagetype, -1, SQLITE_STATIC); + if( !pCsr->isAgg ){ + sqlite3_result_text(ctx, pCsr->zPagetype, -1, SQLITE_STATIC); + } break; case 4: /* ncell */ sqlite3_result_int(ctx, pCsr->nCell); @@ -191133,17 +199899,23 @@ static int statColumn( sqlite3_result_int(ctx, pCsr->nMxPayload); break; case 8: /* pgoffset */ - sqlite3_result_int64(ctx, pCsr->iOffset); + if( !pCsr->isAgg ){ + sqlite3_result_int64(ctx, pCsr->iOffset); + } break; case 9: /* pgsize */ sqlite3_result_int(ctx, pCsr->szPage); break; - default: { /* schema */ + case 10: { /* schema */ sqlite3 *db = sqlite3_context_db_handle(ctx); int iDb = pCsr->iDb; sqlite3_result_text(ctx, db->aDb[iDb].zDbSName, -1, SQLITE_STATIC); break; } + default: { /* aggregate */ + sqlite3_result_int(ctx, pCsr->isAgg); + break; + } } return SQLITE_OK; } @@ -191182,6 +199954,7 @@ SQLITE_PRIVATE int sqlite3DbstatRegister(sqlite3 *db){ 0, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ + 0 /* xShadowName */ }; return sqlite3_create_module(db, "dbstat", &dbstat_module, 0); } @@ -191266,6 +200039,7 @@ static int dbpageConnect( DbpageTable *pTab = 0; int rc = SQLITE_OK; + sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY); rc = sqlite3_declare_vtab(db, "CREATE TABLE x(pgno INTEGER PRIMARY KEY, data BLOB, schema HIDDEN)"); if( rc==SQLITE_OK ){ @@ -191312,9 +200086,8 @@ static int dbpageBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ if( p->iColumn!=DBPAGE_COLUMN_SCHEMA ) continue; if( p->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; if( !p->usable ){ - /* No solution. Use the default SQLITE_BIG_DBL cost */ - pIdxInfo->estimatedRows = 0x7fffffff; - return SQLITE_OK; + /* No solution. */ + return SQLITE_CONSTRAINT; } iPlan = 2; pIdxInfo->aConstraintUsage[i].argvIndex = 1; @@ -191506,6 +200279,10 @@ static int dbpageUpdate( Pager *pPager; int szPage; + if( pTab->db->flags & SQLITE_Defensive ){ + zErr = "read-only"; + goto update_fail; + } if( argc==1 ){ zErr = "cannot delete"; goto update_fail; @@ -191596,6 +200373,7 @@ SQLITE_PRIVATE int sqlite3DbpageRegister(sqlite3 *db){ 0, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ + 0 /* xShadowName */ }; return sqlite3_create_module(db, "sqlite_dbpage", &dbpage_module, 0); } @@ -191632,6 +200410,8 @@ typedef struct SessionInput SessionInput; # endif #endif +static int sessions_strm_chunk_size = SESSIONS_STRM_CHUNK_SIZE; + typedef struct SessionHook SessionHook; struct SessionHook { void *pCtx; @@ -191694,6 +200474,7 @@ struct sqlite3_changeset_iter { SessionInput in; /* Input buffer or stream */ SessionBuffer tblhdr; /* Buffer to hold apValue/zTab/abPK/ */ int bPatchset; /* True if this is a patchset */ + int bInvert; /* True to invert changeset */ int rc; /* Iterator error code */ sqlite3_stmt *pConflict; /* Points to conflicting row, if any */ char *zTab; /* Current table */ @@ -191850,6 +200631,42 @@ struct SessionTable { ** The records associated with INSERT changes are in the same format as for ** changesets. It is not possible for a record associated with an INSERT ** change to contain a field set to "undefined". +** +** REBASE BLOB FORMAT: +** +** A rebase blob may be output by sqlite3changeset_apply_v2() and its +** streaming equivalent for use with the sqlite3_rebaser APIs to rebase +** existing changesets. A rebase blob contains one entry for each conflict +** resolved using either the OMIT or REPLACE strategies within the apply_v2() +** call. +** +** The format used for a rebase blob is very similar to that used for +** changesets. All entries related to a single table are grouped together. +** +** Each group of entries begins with a table header in changeset format: +** +** 1 byte: Constant 0x54 (capital 'T') +** Varint: Number of columns in the table. +** nCol bytes: 0x01 for PK columns, 0x00 otherwise. +** N bytes: Unqualified table name (encoded using UTF-8). Nul-terminated. +** +** Followed by one or more entries associated with the table. +** +** 1 byte: Either SQLITE_INSERT (0x12), DELETE (0x09). +** 1 byte: Flag. 0x01 for REPLACE, 0x00 for OMIT. +** record: (in the record format defined above). +** +** In a rebase blob, the first field is set to SQLITE_INSERT if the change +** that caused the conflict was an INSERT or UPDATE, or to SQLITE_DELETE if +** it was a DELETE. The second field is set to 0x01 if the conflict +** resolution strategy was REPLACE, or 0x00 if it was OMIT. +** +** If the change that caused the conflict was a DELETE, then the single +** record is a copy of the old.* record from the original changeset. If it +** was an INSERT, then the single record is a copy of the new.* record. If +** the conflicting change was an UPDATE, then the single record is a copy +** of the new.* record with the PK fields filled in based on the original +** old.* record. */ /* @@ -191931,7 +200748,7 @@ static void sessionPutI64(u8 *aBuf, sqlite3_int64 i){ static int sessionSerializeValue( u8 *aBuf, /* If non-NULL, write serialized value here */ sqlite3_value *pValue, /* Value to serialize */ - int *pnWrite /* IN/OUT: Increment by bytes written */ + sqlite3_int64 *pnWrite /* IN/OUT: Increment by bytes written */ ){ int nByte; /* Size of serialized value in bytes */ @@ -192470,9 +201287,9 @@ static int sessionGrowHash(int bPatchset, SessionTable *pTab){ if( pTab->nChange==0 || pTab->nEntry>=(pTab->nChange/2) ){ int i; SessionChange **apNew; - int nNew = (pTab->nChange ? pTab->nChange : 128) * 2; + sqlite3_int64 nNew = 2*(sqlite3_int64)(pTab->nChange ? pTab->nChange : 128); - apNew = (SessionChange **)sqlite3_malloc(sizeof(SessionChange *) * nNew); + apNew = (SessionChange **)sqlite3_malloc64(sizeof(SessionChange *) * nNew); if( apNew==0 ){ if( pTab->nChange==0 ){ return SQLITE_ERROR; @@ -192538,7 +201355,7 @@ static int sessionTableInfo( char *zPragma; sqlite3_stmt *pStmt; int rc; - int nByte; + sqlite3_int64 nByte; int nDbCol = 0; int nThis; int i; @@ -192581,7 +201398,7 @@ static int sessionTableInfo( if( rc==SQLITE_OK ){ nByte += nDbCol * (sizeof(const char *) + sizeof(u8) + 1); - pAlloc = sqlite3_malloc(nByte); + pAlloc = sqlite3_malloc64(nByte); if( pAlloc==0 ){ rc = SQLITE_NOMEM; } @@ -192722,7 +201539,7 @@ static void sessionPreupdateOneChange( int iHash; int bNull = 0; int rc = SQLITE_OK; - SessionStat1Ctx stat1 = {0}; + SessionStat1Ctx stat1 = {{0,0,0,0,0},0}; if( pSession->rc ) return; @@ -192779,7 +201596,7 @@ static void sessionPreupdateOneChange( ** this is an SQLITE_UPDATE or SQLITE_DELETE), or just the PK ** values (if this is an INSERT). */ SessionChange *pChange; /* New change object */ - int nByte; /* Number of bytes to allocate */ + sqlite3_int64 nByte; /* Number of bytes to allocate */ int i; /* Used to iterate through columns */ assert( rc==SQLITE_OK ); @@ -192804,7 +201621,7 @@ static void sessionPreupdateOneChange( } /* Allocate the change object */ - pChange = (SessionChange *)sqlite3_malloc(nByte); + pChange = (SessionChange *)sqlite3_malloc64(nByte); if( !pChange ){ rc = SQLITE_NOMEM; goto error_out; @@ -193192,7 +202009,9 @@ SQLITE_API int sqlite3session_diff( } sqlite3_free((char*)azCol); if( bMismatch ){ - *pzErrMsg = sqlite3_mprintf("table schemas do not match"); + if( pzErrMsg ){ + *pzErrMsg = sqlite3_mprintf("table schemas do not match"); + } rc = SQLITE_SCHEMA; } if( bHasPk==0 ){ @@ -193248,7 +202067,7 @@ SQLITE_API int sqlite3session_create( *ppSession = 0; /* Allocate and populate the new session object. */ - pNew = (sqlite3_session *)sqlite3_malloc(sizeof(sqlite3_session) + nDb + 1); + pNew = (sqlite3_session *)sqlite3_malloc64(sizeof(sqlite3_session) + nDb + 1); if( !pNew ) return SQLITE_NOMEM; memset(pNew, 0, sizeof(sqlite3_session)); pNew->db = db; @@ -193367,7 +202186,7 @@ SQLITE_API int sqlite3session_attach( if( !pTab ){ /* Allocate new SessionTable object. */ - pTab = (SessionTable *)sqlite3_malloc(sizeof(SessionTable) + nName + 1); + pTab = (SessionTable *)sqlite3_malloc64(sizeof(SessionTable) + nName + 1); if( !pTab ){ rc = SQLITE_NOMEM; }else{ @@ -193397,15 +202216,15 @@ SQLITE_API int sqlite3session_attach( ** If successful, return zero. Otherwise, if an OOM condition is encountered, ** set *pRc to SQLITE_NOMEM and return non-zero. */ -static int sessionBufferGrow(SessionBuffer *p, int nByte, int *pRc){ - if( *pRc==SQLITE_OK && p->nAlloc-p->nBufnAlloc-p->nBuf)nAlloc ? p->nAlloc : 128; + i64 nNew = p->nAlloc ? p->nAlloc : 128; do { nNew = nNew*2; - }while( nNew<(p->nBuf+nByte) ); + }while( (size_t)(nNew-p->nBuf)aBuf, nNew); + aNew = (u8 *)sqlite3_realloc64(p->aBuf, nNew); if( 0==aNew ){ *pRc = SQLITE_NOMEM; }else{ @@ -193427,7 +202246,7 @@ static int sessionBufferGrow(SessionBuffer *p, int nByte, int *pRc){ static void sessionAppendValue(SessionBuffer *p, sqlite3_value *pVal, int *pRc){ int rc = *pRc; if( rc==SQLITE_OK ){ - int nByte = 0; + sqlite3_int64 nByte = 0; rc = sessionSerializeValue(0, pVal, &nByte); sessionBufferGrow(p, nByte, &rc); if( rc==SQLITE_OK ){ @@ -194003,12 +202822,12 @@ static int sessionGenerateChangeset( rc = sqlite3_reset(pSel); } - /* If the buffer is now larger than SESSIONS_STRM_CHUNK_SIZE, pass + /* If the buffer is now larger than sessions_strm_chunk_size, pass ** its contents to the xOutput() callback. */ if( xOutput && rc==SQLITE_OK && buf.nBuf>nNoop - && buf.nBuf>SESSIONS_STRM_CHUNK_SIZE + && buf.nBuf>sessions_strm_chunk_size ){ rc = xOutput(pOut, (void*)buf.aBuf, buf.nBuf); nNoop = -1; @@ -194147,7 +202966,8 @@ static int sessionChangesetStart( int (*xInput)(void *pIn, void *pData, int *pnData), void *pIn, int nChangeset, /* Size of buffer pChangeset in bytes */ - void *pChangeset /* Pointer to buffer containing changeset */ + void *pChangeset, /* Pointer to buffer containing changeset */ + int bInvert /* True to invert changeset */ ){ sqlite3_changeset_iter *pRet; /* Iterator to return */ int nByte; /* Number of bytes to allocate for iterator */ @@ -194167,6 +202987,7 @@ static int sessionChangesetStart( pRet->in.xInput = xInput; pRet->in.pIn = pIn; pRet->in.bEof = (xInput ? 0 : 1); + pRet->bInvert = bInvert; /* Populate the output variable and return success. */ *pp = pRet; @@ -194181,7 +203002,16 @@ SQLITE_API int sqlite3changeset_start( int nChangeset, /* Size of buffer pChangeset in bytes */ void *pChangeset /* Pointer to buffer containing changeset */ ){ - return sessionChangesetStart(pp, 0, 0, nChangeset, pChangeset); + return sessionChangesetStart(pp, 0, 0, nChangeset, pChangeset, 0); +} +SQLITE_API int sqlite3changeset_start_v2( + sqlite3_changeset_iter **pp, /* OUT: Changeset iterator handle */ + int nChangeset, /* Size of buffer pChangeset in bytes */ + void *pChangeset, /* Pointer to buffer containing changeset */ + int flags +){ + int bInvert = !!(flags & SQLITE_CHANGESETSTART_INVERT); + return sessionChangesetStart(pp, 0, 0, nChangeset, pChangeset, bInvert); } /* @@ -194192,7 +203022,16 @@ SQLITE_API int sqlite3changeset_start_strm( int (*xInput)(void *pIn, void *pData, int *pnData), void *pIn ){ - return sessionChangesetStart(pp, xInput, pIn, 0, 0); + return sessionChangesetStart(pp, xInput, pIn, 0, 0, 0); +} +SQLITE_API int sqlite3changeset_start_v2_strm( + sqlite3_changeset_iter **pp, /* OUT: Changeset iterator handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int flags +){ + int bInvert = !!(flags & SQLITE_CHANGESETSTART_INVERT); + return sessionChangesetStart(pp, xInput, pIn, 0, 0, bInvert); } /* @@ -194200,7 +203039,7 @@ SQLITE_API int sqlite3changeset_start_strm( ** object and the buffer is full, discard some data to free up space. */ static void sessionDiscardData(SessionInput *pIn){ - if( pIn->xInput && pIn->iNext>=SESSIONS_STRM_CHUNK_SIZE ){ + if( pIn->xInput && pIn->iNext>=sessions_strm_chunk_size ){ int nMove = pIn->buf.nBuf - pIn->iNext; assert( nMove>=0 ); if( nMove>0 ){ @@ -194223,7 +203062,7 @@ static int sessionInputBuffer(SessionInput *pIn, int nByte){ int rc = SQLITE_OK; if( pIn->xInput ){ while( !pIn->bEof && (pIn->iNext+nByte)>=pIn->nData && rc==SQLITE_OK ){ - int nNew = SESSIONS_STRM_CHUNK_SIZE; + int nNew = sessions_strm_chunk_size; if( pIn->bNoDiscard==0 ) sessionDiscardData(pIn); if( SQLITE_OK==sessionBufferGrow(&pIn->buf, nNew, &rc) ){ @@ -194283,7 +203122,7 @@ static int sessionValueSetStr( ** argument to sqlite3ValueSetStr() and have the copy created ** automatically. But doing so makes it difficult to detect any OOM ** error. Hence the code to create the copy externally. */ - u8 *aCopy = sqlite3_malloc(nData+1); + u8 *aCopy = sqlite3_malloc64((sqlite3_int64)nData+1); if( aCopy==0 ) return SQLITE_NOMEM; memcpy(aCopy, aData, nData); sqlite3ValueSetStr(pVal, nData, (char*)aCopy, enc, sqlite3_free); @@ -194495,7 +203334,7 @@ static int sessionChangesetReadTblhdr(sqlite3_changeset_iter *p){ } if( rc==SQLITE_OK ){ - int iPK = sizeof(sqlite3_value*)*p->nCol*2; + size_t iPK = sizeof(sqlite3_value*)*p->nCol*2; memset(p->tblhdr.aBuf, 0, iPK); memcpy(&p->tblhdr.aBuf[iPK], &p->in.aData[p->in.iNext], nCopy); p->in.iNext += nCopy; @@ -194571,10 +203410,10 @@ static int sessionChangesetNext( op = p->in.aData[p->in.iNext++]; } - if( p->zTab==0 ){ + if( p->zTab==0 || (p->bPatchset && p->bInvert) ){ /* The first record in the changeset is not a table header. Must be a ** corrupt changeset. */ - assert( p->in.iNext==1 ); + assert( p->in.iNext==1 || p->zTab ); return (p->rc = SQLITE_CORRUPT_BKPT); } @@ -194599,33 +203438,39 @@ static int sessionChangesetNext( *paRec = &p->in.aData[p->in.iNext]; p->in.iNext += *pnRec; }else{ + sqlite3_value **apOld = (p->bInvert ? &p->apValue[p->nCol] : p->apValue); + sqlite3_value **apNew = (p->bInvert ? p->apValue : &p->apValue[p->nCol]); /* If this is an UPDATE or DELETE, read the old.* record. */ if( p->op!=SQLITE_INSERT && (p->bPatchset==0 || p->op==SQLITE_DELETE) ){ u8 *abPK = p->bPatchset ? p->abPK : 0; - p->rc = sessionReadRecord(&p->in, p->nCol, abPK, p->apValue); + p->rc = sessionReadRecord(&p->in, p->nCol, abPK, apOld); if( p->rc!=SQLITE_OK ) return p->rc; } /* If this is an INSERT or UPDATE, read the new.* record. */ if( p->op!=SQLITE_DELETE ){ - p->rc = sessionReadRecord(&p->in, p->nCol, 0, &p->apValue[p->nCol]); + p->rc = sessionReadRecord(&p->in, p->nCol, 0, apNew); if( p->rc!=SQLITE_OK ) return p->rc; } - if( p->bPatchset && p->op==SQLITE_UPDATE ){ + if( (p->bPatchset || p->bInvert) && p->op==SQLITE_UPDATE ){ /* If this is an UPDATE that is part of a patchset, then all PK and ** modified fields are present in the new.* record. The old.* record ** is currently completely empty. This block shifts the PK fields from ** new.* to old.*, to accommodate the code that reads these arrays. */ for(i=0; inCol; i++){ - assert( p->apValue[i]==0 ); + assert( p->bPatchset==0 || p->apValue[i]==0 ); if( p->abPK[i] ){ + assert( p->apValue[i]==0 ); p->apValue[i] = p->apValue[i+p->nCol]; if( p->apValue[i]==0 ) return (p->rc = SQLITE_CORRUPT_BKPT); p->apValue[i+p->nCol] = 0; } } + }else if( p->bInvert ){ + if( p->op==SQLITE_INSERT ) p->op = SQLITE_DELETE; + else if( p->op==SQLITE_DELETE ) p->op = SQLITE_INSERT; } } @@ -194890,7 +203735,7 @@ static int sessionChangesetInvert( int iCol; if( 0==apVal ){ - apVal = (sqlite3_value **)sqlite3_malloc(sizeof(apVal[0])*nCol*2); + apVal = (sqlite3_value **)sqlite3_malloc64(sizeof(apVal[0])*nCol*2); if( 0==apVal ){ rc = SQLITE_NOMEM; goto finished_invert; @@ -194942,7 +203787,7 @@ static int sessionChangesetInvert( } assert( rc==SQLITE_OK ); - if( xOutput && sOut.nBuf>=SESSIONS_STRM_CHUNK_SIZE ){ + if( xOutput && sOut.nBuf>=sessions_strm_chunk_size ){ rc = xOutput(pOut, sOut.aBuf, sOut.nBuf); sOut.nBuf = 0; if( rc!=SQLITE_OK ) goto finished_invert; @@ -195021,7 +203866,8 @@ struct SessionApplyCtx { int bDeferConstraints; /* True to defer constraints */ SessionBuffer constraints; /* Deferred constraints are stored here */ SessionBuffer rebase; /* Rebase information (if any) here */ - int bRebaseStarted; /* If table header is already in rebase */ + u8 bRebaseStarted; /* If table header is already in rebase */ + u8 bRebase; /* True to collect rebase information */ }; /* @@ -195403,7 +204249,7 @@ static int sessionSeekToRow( } /* -** This function is called from within sqlite3changset_apply_v2() when +** This function is called from within sqlite3changeset_apply_v2() when ** a conflict is encountered and resolved using conflict resolution ** mode eType (either SQLITE_CHANGESET_OMIT or SQLITE_CHANGESET_REPLACE).. ** It adds a conflict resolution record to the buffer in @@ -195418,35 +204264,36 @@ static int sessionRebaseAdd( sqlite3_changeset_iter *pIter /* Iterator pointing at current change */ ){ int rc = SQLITE_OK; - int i; - int eOp = pIter->op; - if( p->bRebaseStarted==0 ){ - /* Append a table-header to the rebase buffer */ - const char *zTab = pIter->zTab; - sessionAppendByte(&p->rebase, 'T', &rc); - sessionAppendVarint(&p->rebase, p->nCol, &rc); - sessionAppendBlob(&p->rebase, p->abPK, p->nCol, &rc); - sessionAppendBlob(&p->rebase, (u8*)zTab, (int)strlen(zTab)+1, &rc); - p->bRebaseStarted = 1; - } - - assert( eType==SQLITE_CHANGESET_REPLACE||eType==SQLITE_CHANGESET_OMIT ); - assert( eOp==SQLITE_DELETE || eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE ); - - sessionAppendByte(&p->rebase, - (eOp==SQLITE_DELETE ? SQLITE_DELETE : SQLITE_INSERT), &rc - ); - sessionAppendByte(&p->rebase, (eType==SQLITE_CHANGESET_REPLACE), &rc); - for(i=0; inCol; i++){ - sqlite3_value *pVal = 0; - if( eOp==SQLITE_DELETE || (eOp==SQLITE_UPDATE && p->abPK[i]) ){ - sqlite3changeset_old(pIter, i, &pVal); - }else{ - sqlite3changeset_new(pIter, i, &pVal); + if( p->bRebase ){ + int i; + int eOp = pIter->op; + if( p->bRebaseStarted==0 ){ + /* Append a table-header to the rebase buffer */ + const char *zTab = pIter->zTab; + sessionAppendByte(&p->rebase, 'T', &rc); + sessionAppendVarint(&p->rebase, p->nCol, &rc); + sessionAppendBlob(&p->rebase, p->abPK, p->nCol, &rc); + sessionAppendBlob(&p->rebase, (u8*)zTab, (int)strlen(zTab)+1, &rc); + p->bRebaseStarted = 1; } - sessionAppendValue(&p->rebase, pVal, &rc); - } + assert( eType==SQLITE_CHANGESET_REPLACE||eType==SQLITE_CHANGESET_OMIT ); + assert( eOp==SQLITE_DELETE || eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE ); + + sessionAppendByte(&p->rebase, + (eOp==SQLITE_DELETE ? SQLITE_DELETE : SQLITE_INSERT), &rc + ); + sessionAppendByte(&p->rebase, (eType==SQLITE_CHANGESET_REPLACE), &rc); + for(i=0; inCol; i++){ + sqlite3_value *pVal = 0; + if( eOp==SQLITE_DELETE || (eOp==SQLITE_UPDATE && p->abPK[i]) ){ + sqlite3changeset_old(pIter, i, &pVal); + }else{ + sqlite3changeset_new(pIter, i, &pVal); + } + sessionAppendValue(&p->rebase, pVal, &rc); + } + } return rc; } @@ -195789,9 +204636,9 @@ static int sessionRetryConstraints( SessionBuffer cons = pApply->constraints; memset(&pApply->constraints, 0, sizeof(SessionBuffer)); - rc = sessionChangesetStart(&pIter2, 0, 0, cons.nBuf, cons.aBuf); + rc = sessionChangesetStart(&pIter2, 0, 0, cons.nBuf, cons.aBuf, 0); if( rc==SQLITE_OK ){ - int nByte = 2*pApply->nCol*sizeof(sqlite3_value*); + size_t nByte = 2*pApply->nCol*sizeof(sqlite3_value*); int rc2; pIter2->bPatchset = bPatchset; pIter2->zTab = (char*)zTab; @@ -195855,6 +204702,7 @@ static int sessionChangesetApply( pIter->in.bNoDiscard = 1; memset(&sApply, 0, sizeof(sApply)); + sApply.bRebase = (ppRebase && pnRebase); sqlite3_mutex_enter(sqlite3_db_mutex(db)); if( (flags & SQLITE_CHANGESETAPPLY_NOSAVEPOINT)==0 ){ rc = sqlite3_exec(db, "SAVEPOINT changeset_apply", 0, 0, 0); @@ -196005,7 +204853,8 @@ static int sessionChangesetApply( } } - if( rc==SQLITE_OK && bPatchset==0 && ppRebase && pnRebase ){ + assert( sApply.bRebase || sApply.rebase.nBuf==0 ); + if( rc==SQLITE_OK && bPatchset==0 && sApply.bRebase ){ *ppRebase = (void*)sApply.rebase.aBuf; *pnRebase = sApply.rebase.nBuf; sApply.rebase.aBuf = 0; @@ -196043,7 +204892,8 @@ SQLITE_API int sqlite3changeset_apply_v2( int flags ){ sqlite3_changeset_iter *pIter; /* Iterator to skip through changeset */ - int rc = sqlite3changeset_start(&pIter, nChangeset, pChangeset); + int bInverse = !!(flags & SQLITE_CHANGESETAPPLY_INVERT); + int rc = sessionChangesetStart(&pIter, 0, 0, nChangeset, pChangeset,bInverse); if( rc==SQLITE_OK ){ rc = sessionChangesetApply( db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase, flags @@ -196100,7 +204950,8 @@ SQLITE_API int sqlite3changeset_apply_v2_strm( int flags ){ sqlite3_changeset_iter *pIter; /* Iterator to skip through changeset */ - int rc = sqlite3changeset_start_strm(&pIter, xInput, pIn); + int bInverse = !!(flags & SQLITE_CHANGESETAPPLY_INVERT); + int rc = sessionChangesetStart(&pIter, xInput, pIn, 0, 0, bInverse); if( rc==SQLITE_OK ){ rc = sessionChangesetApply( db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase, flags @@ -196157,7 +205008,7 @@ static int sessionChangeMerge( int rc = SQLITE_OK; if( !pExist ){ - pNew = (SessionChange *)sqlite3_malloc(sizeof(SessionChange) + nRec); + pNew = (SessionChange *)sqlite3_malloc64(sizeof(SessionChange) + nRec); if( !pNew ){ return SQLITE_NOMEM; } @@ -196190,8 +205041,8 @@ static int sessionChangeMerge( if( pExist->op==SQLITE_DELETE && pExist->bIndirect ){ *ppNew = pExist; }else{ - int nByte = nRec + pExist->nRecord + sizeof(SessionChange); - pNew = (SessionChange*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = nRec + pExist->nRecord + sizeof(SessionChange); + pNew = (SessionChange*)sqlite3_malloc64(nByte); if( pNew==0 ){ rc = SQLITE_NOMEM; }else{ @@ -196251,14 +205102,14 @@ static int sessionChangeMerge( assert( pNew==0 ); }else{ u8 *aExist = pExist->aRecord; - int nByte; + sqlite3_int64 nByte; u8 *aCsr; /* Allocate a new SessionChange object. Ensure that the aRecord[] ** buffer of the new object is large enough to hold any record that ** may be generated by combining the input records. */ nByte = sizeof(SessionChange) + pExist->nRecord + nRec; - pNew = (SessionChange *)sqlite3_malloc(nByte); + pNew = (SessionChange *)sqlite3_malloc64(nByte); if( !pNew ){ sqlite3_free(pExist); return SQLITE_NOMEM; @@ -196364,7 +205215,7 @@ static int sessionChangesetToHash( if( !pTab ){ SessionTable **ppTab; - pTab = sqlite3_malloc(sizeof(SessionTable) + nCol + nNew+1); + pTab = sqlite3_malloc64(sizeof(SessionTable) + nCol + nNew+1); if( !pTab ){ rc = SQLITE_NOMEM; break; @@ -196473,13 +205324,12 @@ static int sessionChangegroupOutput( sessionAppendByte(&buf, p->op, &rc); sessionAppendByte(&buf, p->bIndirect, &rc); sessionAppendBlob(&buf, p->aRecord, p->nRecord, &rc); + if( rc==SQLITE_OK && xOutput && buf.nBuf>=sessions_strm_chunk_size ){ + rc = xOutput(pOut, buf.aBuf, buf.nBuf); + buf.nBuf = 0; + } } } - - if( rc==SQLITE_OK && xOutput && buf.nBuf>=SESSIONS_STRM_CHUNK_SIZE ){ - rc = xOutput(pOut, buf.aBuf, buf.nBuf); - buf.nBuf = 0; - } } if( rc==SQLITE_OK ){ @@ -196870,7 +205720,7 @@ static int sessionRebase( sessionAppendByte(&sOut, pIter->bIndirect, &rc); sessionAppendBlob(&sOut, aRec, nRec, &rc); } - if( rc==SQLITE_OK && xOutput && sOut.nBuf>SESSIONS_STRM_CHUNK_SIZE ){ + if( rc==SQLITE_OK && xOutput && sOut.nBuf>sessions_strm_chunk_size ){ rc = xOutput(pOut, sOut.aBuf, sOut.nBuf); sOut.nBuf = 0; } @@ -196981,6 +205831,27 @@ SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p){ } } +/* +** Global configuration +*/ +SQLITE_API int sqlite3session_config(int op, void *pArg){ + int rc = SQLITE_OK; + switch( op ){ + case SQLITE_SESSION_CONFIG_STRMSIZE: { + int *pInt = (int*)pArg; + if( *pInt>0 ){ + sessions_strm_chunk_size = *pInt; + } + *pInt = sessions_strm_chunk_size; + break; + } + default: + rc = SQLITE_MISUSE; + break; + } + return rc; +} + #endif /* SQLITE_ENABLE_SESSION && SQLITE_ENABLE_PREUPDATE_HOOK */ /************** End of sqlite3session.c **************************************/ @@ -197118,12 +205989,8 @@ struct Fts5PhraseIter { ** ** Usually, output parameter *piPhrase is set to the phrase number, *piCol ** to the column in which it occurs and *piOff the token offset of the -** first token of the phrase. The exception is if the table was created -** with the offsets=0 option specified. In this case *piOff is always -** set to -1. -** -** Returns SQLITE_OK if successful, or an error code (i.e. SQLITE_NOMEM) -** if an error occurs. +** first token of the phrase. Returns SQLITE_OK if successful, or an error +** code (i.e. SQLITE_NOMEM) if an error occurs. ** ** This API can be quite slow if used with an FTS5 table created with the ** "detail=none" or "detail=column" option. @@ -197161,10 +206028,10 @@ struct Fts5PhraseIter { ** ** xSetAuxdata(pFts5, pAux, xDelete) ** -** Save the pointer passed as the second argument as the extension functions +** Save the pointer passed as the second argument as the extension function's ** "auxiliary data". The pointer may then be retrieved by the current or any ** future invocation of the same fts5 extension function made as part of -** of the same MATCH query using the xGetAuxdata() API. +** the same MATCH query using the xGetAuxdata() API. ** ** Each extension function is allocated a single auxiliary data slot for ** each FTS query (MATCH expression). If the extension function is invoked @@ -197179,7 +206046,7 @@ struct Fts5PhraseIter { ** The xDelete callback, if one is specified, is also invoked on the ** auxiliary data pointer after the FTS5 query has finished. ** -** If an error (e.g. an OOM condition) occurs within this function, an +** If an error (e.g. an OOM condition) occurs within this function, ** the auxiliary data is set to NULL and an error code returned. If the ** xDelete parameter was not NULL, it is invoked on the auxiliary data ** pointer before returning. @@ -197403,8 +206270,8 @@ struct Fts5ExtensionApi { ** ** There are several ways to approach this in FTS5: ** -**
        1. By mapping all synonyms to a single token. In this case, the -** In the above example, this means that the tokenizer returns the +**
          1. By mapping all synonyms to a single token. In this case, using +** the above example, this means that the tokenizer returns the ** same token for inputs "first" and "1st". Say that token is in ** fact "first", so that when the user inserts the document "I won ** 1st place" entries are added to the index for tokens "i", "won", @@ -197412,11 +206279,11 @@ struct Fts5ExtensionApi { ** the tokenizer substitutes "first" for "1st" and the query works ** as expected. ** -**
          2. By adding multiple synonyms for a single term to the FTS index. -** In this case, when tokenizing query text, the tokenizer may -** provide multiple synonyms for a single term within the document. -** FTS5 then queries the index for each synonym individually. For -** example, faced with the query: +**
          3. By querying the index for all synonyms of each query term +** separately. In this case, when tokenizing query text, the +** tokenizer may provide multiple synonyms for a single term +** within the document. FTS5 then queries the index for each +** synonym individually. For example, faced with the query: ** ** ** ... MATCH 'first place' @@ -197440,7 +206307,7 @@ struct Fts5ExtensionApi { ** "place". ** ** This way, even if the tokenizer does not provide synonyms -** when tokenizing query text (it should not - to do would be +** when tokenizing query text (it should not - to do so would be ** inefficient), it doesn't matter if the user queries for ** 'first + place' or '1st + place', as there are entries in the ** FTS index corresponding to both forms of the first token. @@ -197639,6 +206506,11 @@ typedef sqlite3_uint64 u64; */ #define FTS5_MAX_PREFIX_INDEXES 31 +/* +** Maximum segments permitted in a single index +*/ +#define FTS5_MAX_SEGMENT 2000 + #define FTS5_DEFAULT_NEARDIST 10 #define FTS5_DEFAULT_RANK "bm25" @@ -197665,6 +206537,12 @@ SQLITE_API extern int sqlite3_fts5_may_be_corrupt; # define assert_nc(x) assert(x) #endif +/* +** A version of memcmp() that does not cause asan errors if one of the pointer +** parameters is NULL and the number of bytes to compare is zero. +*/ +#define fts5Memcmp(s1, s2, n) ((n)==0 ? 0 : memcmp((s1), (s2), (n))) + /* Mark a function parameter as unused, to suppress nuisance compiler ** warnings. */ #ifndef UNUSED_PARAM @@ -197750,6 +206628,7 @@ struct Fts5Config { char *zContentExprlist; Fts5Tokenizer *pTok; fts5_tokenizer *pTokApi; + int bLock; /* True when table is preparing statement */ /* Values loaded from the %_config table */ int iCookie; /* Incremented when %_config is modified */ @@ -197852,7 +206731,7 @@ static void sqlite3Fts5Put32(u8*, int); static int sqlite3Fts5Get32(const u8*); #define FTS5_POS2COLUMN(iPos) (int)(iPos >> 32) -#define FTS5_POS2OFFSET(iPos) (int)(iPos & 0xFFFFFFFF) +#define FTS5_POS2OFFSET(iPos) (int)(iPos & 0x7FFFFFFF) typedef struct Fts5PoslistReader Fts5PoslistReader; struct Fts5PoslistReader { @@ -197887,7 +206766,7 @@ static int sqlite3Fts5PoslistNext64( ); /* Malloc utility */ -static void *sqlite3Fts5MallocZero(int *pRc, int nByte); +static void *sqlite3Fts5MallocZero(int *pRc, sqlite3_int64 nByte); static char *sqlite3Fts5Strndup(int *pRc, const char *pIn, int nIn); /* Character set tests (like isspace(), isalpha() etc.) */ @@ -197988,6 +206867,11 @@ static int sqlite3Fts5IterNextFrom(Fts5IndexIter*, i64 iMatch); */ static void sqlite3Fts5IterClose(Fts5IndexIter*); +/* +** Close the reader blob handle, if it is open. +*/ +static void sqlite3Fts5IndexCloseReader(Fts5Index*); + /* ** This interface is used by the fts5vocab module. */ @@ -198098,9 +206982,19 @@ static int sqlite3Fts5PutVarint(unsigned char *p, u64 v); /************************************************************************** -** Interface to code in fts5.c. +** Interface to code in fts5_main.c. */ +/* +** Virtual-table object. +*/ +typedef struct Fts5Table Fts5Table; +struct Fts5Table { + sqlite3_vtab base; /* Base class used by SQLite core */ + Fts5Config *pConfig; /* Virtual table configuration */ + Fts5Index *pIndex; /* Full-text index */ +}; + static int sqlite3Fts5GetTokenizer( Fts5Global*, const char **azArg, @@ -198110,7 +207004,9 @@ static int sqlite3Fts5GetTokenizer( char **pzErr ); -static Fts5Index *sqlite3Fts5IndexFromCsrid(Fts5Global*, i64, Fts5Config **); +static Fts5Table *sqlite3Fts5TableFromCsrid(Fts5Global*, i64); + +static int sqlite3Fts5FlushToDisk(Fts5Table*); /* ** End of interface to code in fts5.c. @@ -198143,8 +207039,9 @@ static void sqlite3Fts5HashClear(Fts5Hash*); static int sqlite3Fts5HashQuery( Fts5Hash*, /* Hash table to query */ + int nPre, const char *pTerm, int nTerm, /* Query term */ - const u8 **ppDoclist, /* OUT: Pointer to doclist for pTerm */ + void **ppObj, /* OUT: Pointer to doclist for pTerm */ int *pnDoclist /* OUT: Size of doclist in bytes */ ); @@ -198253,6 +207150,7 @@ static int sqlite3Fts5ExprEof(Fts5Expr*); static i64 sqlite3Fts5ExprRowid(Fts5Expr*); static void sqlite3Fts5ExprFree(Fts5Expr*); +static int sqlite3Fts5ExprAnd(Fts5Expr **pp1, Fts5Expr *p2); /* Called during startup to register a UDF with SQLite */ static int sqlite3Fts5ExprInit(Fts5Global*, sqlite3*); @@ -198366,7 +207264,7 @@ static int sqlite3Fts5UnicodeIsdiacritic(int c); static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic); static int sqlite3Fts5UnicodeCatParse(const char*, u8*); -static int sqlite3Fts5UnicodeCategory(int iCode); +static int sqlite3Fts5UnicodeCategory(u32 iCode); static void sqlite3Fts5UnicodeAscii(u8*, u8*); /* ** End of interface to code in fts5_unicode2.c. @@ -198415,6 +207313,7 @@ static void sqlite3Fts5UnicodeAscii(u8*, u8*); ** input grammar file: */ /* #include */ +/* #include */ /************ Begin %include sections from the grammar ************************/ /* #include "fts5Int.h" */ @@ -198533,6 +207432,7 @@ typedef union { #define sqlite3Fts5ParserCTX_STORE #define fts5YYNSTATE 35 #define fts5YYNRULE 28 +#define fts5YYNRULE_WITH_ACTION 28 #define fts5YYNFTS5TOKEN 16 #define fts5YY_MAX_SHIFT 34 #define fts5YY_MIN_SHIFTREDUCE 52 @@ -199103,15 +208003,18 @@ static fts5YYACTIONTYPE fts5yy_find_shift_action( do{ i = fts5yy_shift_ofst[stateno]; assert( i>=0 ); - /* assert( i+fts5YYNFTS5TOKEN<=(int)fts5YY_NLOOKAHEAD ); */ + assert( i<=fts5YY_ACTTAB_COUNT ); + assert( i+fts5YYNFTS5TOKEN<=(int)fts5YY_NLOOKAHEAD ); assert( iLookAhead!=fts5YYNOCODE ); assert( iLookAhead < fts5YYNFTS5TOKEN ); i += iLookAhead; - if( i>=fts5YY_NLOOKAHEAD || fts5yy_lookahead[i]!=iLookAhead ){ + assert( i<(int)fts5YY_NLOOKAHEAD ); + if( fts5yy_lookahead[i]!=iLookAhead ){ #ifdef fts5YYFALLBACK fts5YYCODETYPE iFallback; /* Fallback token */ - if( iLookAhead %s\n", @@ -199126,16 +208029,8 @@ static fts5YYACTIONTYPE fts5yy_find_shift_action( #ifdef fts5YYWILDCARD { int j = i - iLookAhead + fts5YYWILDCARD; - if( -#if fts5YY_SHIFT_MIN+fts5YYWILDCARD<0 - j>=0 && -#endif -#if fts5YY_SHIFT_MAX+fts5YYWILDCARD>=fts5YY_ACTTAB_COUNT - j0 - ){ + assert( j<(int)(sizeof(fts5yy_lookahead)/sizeof(fts5yy_lookahead[0])) ); + if( fts5yy_lookahead[j]==fts5YYWILDCARD && iLookAhead>0 ){ #ifndef NDEBUG if( fts5yyTraceFILE ){ fprintf(fts5yyTraceFILE, "%sWILDCARD %s => %s\n", @@ -199149,6 +208044,7 @@ static fts5YYACTIONTYPE fts5yy_find_shift_action( #endif /* fts5YYWILDCARD */ return fts5yy_default[stateno]; }else{ + assert( i>=0 && ifts5yytos; #ifndef NDEBUG if( fts5yyTraceFILE && fts5yyruleno<(int)(sizeof(fts5yyRuleName)/sizeof(fts5yyRuleName[0])) ){ - fts5yysize = fts5yyRuleInfo[fts5yyruleno].nrhs; + fts5yysize = fts5yyRuleInfoNRhs[fts5yyruleno]; if( fts5yysize ){ - fprintf(fts5yyTraceFILE, "%sReduce %d [%s], go to state %d.\n", + fprintf(fts5yyTraceFILE, "%sReduce %d [%s]%s, pop back to state %d.\n", fts5yyTracePrompt, - fts5yyruleno, fts5yyRuleName[fts5yyruleno], fts5yymsp[fts5yysize].stateno); + fts5yyruleno, fts5yyRuleName[fts5yyruleno], + fts5yyrulenofts5yytos - fts5yypParser->fts5yystack)>fts5yypParser->fts5yyhwm ){ fts5yypParser->fts5yyhwm++; @@ -199534,9 +208462,9 @@ static fts5YYACTIONTYPE fts5yy_reduce( break; /********** End reduce actions ************************************************/ }; - assert( fts5yyrulenofts5yytos >= fts5yypParser->fts5yystack - && fts5yymx != fts5YYERRORSYMBOL && (fts5yyact = fts5yy_find_reduce_action( fts5yypParser->fts5yytos->stateno, - fts5YYERRORSYMBOL)) >= fts5YY_MIN_REDUCE + fts5YYERRORSYMBOL)) > fts5YY_MAX_SHIFTREDUCE ){ fts5yy_pop_parser_stack(fts5yypParser); } @@ -199821,13 +208748,12 @@ static void sqlite3Fts5Parser( */ static int sqlite3Fts5ParserFallback(int iToken){ #ifdef fts5YYFALLBACK - if( iToken<(int)(sizeof(fts5yyFallback)/sizeof(fts5yyFallback[0])) ){ - return fts5yyFallback[iToken]; - } + assert( iToken<(int)(sizeof(fts5yyFallback)/sizeof(fts5yyFallback[0])) ); + return fts5yyFallback[iToken]; #else (void)iToken; -#endif return 0; +#endif } /* @@ -199968,7 +208894,7 @@ static void fts5HighlightAppend( HighlightContext *p, const char *z, int n ){ - if( *pRc==SQLITE_OK ){ + if( *pRc==SQLITE_OK && z ){ if( n<0 ) n = (int)strlen(z); p->zOut = sqlite3_mprintf("%z%.*s", p->zOut, n, z); if( p->zOut==0 ) *pRc = SQLITE_NOMEM; @@ -200100,7 +209026,7 @@ static int fts5SentenceFinderAdd(Fts5SFinder *p, int iAdd){ int nNew = p->nFirstAlloc ? p->nFirstAlloc*2 : 64; int *aNew; - aNew = (int*)sqlite3_realloc(p->aFirst, nNew*sizeof(int)); + aNew = (int*)sqlite3_realloc64(p->aFirst, nNew*sizeof(int)); if( aNew==0 ) return SQLITE_NOMEM; p->aFirst = aNew; p->nFirstAlloc = nNew; @@ -200167,11 +209093,12 @@ static int fts5SnippetScore( int nInst; int nScore = 0; int iLast = 0; + sqlite3_int64 iEnd = (sqlite3_int64)iPos + nToken; rc = pApi->xInstCount(pFts, &nInst); for(i=0; ixInst(pFts, i, &ip, &ic, &iOff); - if( rc==SQLITE_OK && ic==iCol && iOff>=iPos && iOff<(iPos+nToken) ){ + if( rc==SQLITE_OK && ic==iCol && iOff>=iPos && iOffnDocsize ) iAdj = nDocsize - nToken; if( iAdj<0 ) iAdj = 0; - *piPos = iAdj; + *piPos = (int)iAdj; } return rc; @@ -200274,7 +209201,9 @@ static void fts5SnippetFunction( int jj; rc = pApi->xInst(pFts, ii, &ip, &ic, &io); - if( ic!=i || rc!=SQLITE_OK ) continue; + if( ic!=i ) continue; + if( io>nDocsize ) rc = FTS5_CORRUPT; + if( rc!=SQLITE_OK ) continue; memset(aSeen, 0, nPhrase); rc = fts5SnippetScore(pApi, pFts, nDocsize, aSeen, i, io, nToken, &nScore, &iAdj @@ -200400,17 +209329,17 @@ static int fts5Bm25GetData( int nPhrase; /* Number of phrases in query */ sqlite3_int64 nRow = 0; /* Number of rows in table */ sqlite3_int64 nToken = 0; /* Number of tokens in table */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ int i; /* Allocate the Fts5Bm25Data object */ nPhrase = pApi->xPhraseCount(pFts); nByte = sizeof(Fts5Bm25Data) + nPhrase*2*sizeof(double); - p = (Fts5Bm25Data*)sqlite3_malloc(nByte); + p = (Fts5Bm25Data*)sqlite3_malloc64(nByte); if( p==0 ){ rc = SQLITE_NOMEM; }else{ - memset(p, 0, nByte); + memset(p, 0, (size_t)nByte); p->nPhrase = nPhrase; p->aIDF = (double*)&p[1]; p->aFreq = &p->aIDF[nPhrase]; @@ -200418,6 +209347,7 @@ static int fts5Bm25GetData( /* Calculate the average document length for this FTS5 table */ if( rc==SQLITE_OK ) rc = pApi->xRowCount(pFts, &nRow); + assert( rc!=SQLITE_OK || nRow>0 ); if( rc==SQLITE_OK ) rc = pApi->xColumnTotalSize(pFts, -1, &nToken); if( rc==SQLITE_OK ) p->avgdl = (double)nToken / (double)nRow; @@ -200543,8 +209473,6 @@ static int sqlite3Fts5AuxInit(fts5_api *pApi){ return rc; } - - /* ** 2014 May 31 ** @@ -200564,17 +209492,17 @@ static int sqlite3Fts5AuxInit(fts5_api *pApi){ static int sqlite3Fts5BufferSize(int *pRc, Fts5Buffer *pBuf, u32 nByte){ if( (u32)pBuf->nSpacenSpace ? pBuf->nSpace : 64; + u64 nNew = pBuf->nSpace ? pBuf->nSpace : 64; u8 *pNew; while( nNewp, nNew); + pNew = sqlite3_realloc64(pBuf->p, nNew); if( pNew==0 ){ *pRc = SQLITE_NOMEM; return 1; }else{ - pBuf->nSpace = nNew; + pBuf->nSpace = (int)nNew; pBuf->p = pNew; } } @@ -200599,7 +209527,7 @@ static void sqlite3Fts5Put32(u8 *aBuf, int iVal){ } static int sqlite3Fts5Get32(const u8 *aBuf){ - return (aBuf[0] << 24) + (aBuf[1] << 16) + (aBuf[2] << 8) + aBuf[3]; + return (int)((((u32)aBuf[0])<<24) + (aBuf[1]<<16) + (aBuf[2]<<8) + aBuf[3]); } /* @@ -200725,12 +209653,21 @@ static int sqlite3Fts5PoslistNext64( i64 iOff = *piOff; int iVal; fts5FastGetVarint32(a, i, iVal); - if( iVal==1 ){ + if( iVal<=1 ){ + if( iVal==0 ){ + *pi = i; + return 0; + } fts5FastGetVarint32(a, i, iVal); iOff = ((i64)iVal) << 32; fts5FastGetVarint32(a, i, iVal); + if( iVal<2 ){ + /* This is a corrupt record. So stop parsing it here. */ + *piOff = -1; + return 1; + } } - *piOff = iOff + (iVal-2); + *piOff = iOff + ((iVal-2) & 0x7FFFFFFF); *pi = i; return 0; } @@ -200791,14 +209728,14 @@ static int sqlite3Fts5PoslistWriterAppend( return SQLITE_OK; } -static void *sqlite3Fts5MallocZero(int *pRc, int nByte){ +static void *sqlite3Fts5MallocZero(int *pRc, sqlite3_int64 nByte){ void *pRet = 0; if( *pRc==SQLITE_OK ){ - pRet = sqlite3_malloc(nByte); + pRet = sqlite3_malloc64(nByte); if( pRet==0 ){ if( nByte>0 ) *pRc = SQLITE_NOMEM; }else{ - memset(pRet, 0, nByte); + memset(pRet, 0, (size_t)nByte); } } return pRet; @@ -200965,7 +209902,7 @@ static void sqlite3Fts5TermsetFree(Fts5Termset *p){ #define FTS5_DEFAULT_HASHSIZE (1024*1024) /* Maximum allowed page size */ -#define FTS5_MAX_PAGE_SIZE (128*1024) +#define FTS5_MAX_PAGE_SIZE (64*1024) static int fts5_iswhitespace(char x){ return (x==' '); @@ -201092,7 +210029,7 @@ static int fts5Dequote(char *z){ assert( q=='[' || q=='\'' || q=='"' || q=='`' ); if( q=='[' ) q = ']'; - while( ALWAYS(z[iIn]) ){ + while( z[iIn] ){ if( z[iIn]==q ){ if( z[iIn+1]!=q ){ /* Character iIn was the close quote. */ @@ -201237,7 +210174,7 @@ static int fts5ConfigParseSpecial( if( sqlite3_strnicmp("tokenize", zCmd, nCmd)==0 ){ const char *p = (const char*)zArg; - int nArg = (int)strlen(zArg) + 1; + sqlite3_int64 nArg = strlen(zArg) + 1; char **azArg = sqlite3Fts5MallocZero(&rc, sizeof(char*) * nArg); char *pDel = sqlite3Fts5MallocZero(&rc, nArg * 2); char *pSpace = pDel; @@ -201267,7 +210204,7 @@ static int fts5ConfigParseSpecial( rc = SQLITE_ERROR; }else{ rc = sqlite3Fts5GetTokenizer(pGlobal, - (const char**)azArg, nArg, &pConfig->pTok, &pConfig->pTokApi, + (const char**)azArg, (int)nArg, &pConfig->pTok, &pConfig->pTokApi, pzErr ); } @@ -201367,8 +210304,8 @@ static const char *fts5ConfigGobbleWord( ){ const char *zRet = 0; - int nIn = (int)strlen(zIn); - char *zOut = sqlite3_malloc(nIn+1); + sqlite3_int64 nIn = strlen(zIn); + char *zOut = sqlite3_malloc64(nIn+1); assert( *pRc==SQLITE_OK ); *pbQuoted = 0; @@ -201377,7 +210314,7 @@ static const char *fts5ConfigGobbleWord( if( zOut==0 ){ *pRc = SQLITE_NOMEM; }else{ - memcpy(zOut, zIn, nIn+1); + memcpy(zOut, zIn, (size_t)(nIn+1)); if( fts5_isopenquote(zOut[0]) ){ int ii = fts5Dequote(zOut); zRet = &zIn[ii]; @@ -201471,7 +210408,7 @@ static int sqlite3Fts5ConfigParse( int rc = SQLITE_OK; /* Return code */ Fts5Config *pRet; /* New object to return */ int i; - int nByte; + sqlite3_int64 nByte; *ppOut = pRet = (Fts5Config*)sqlite3_malloc(sizeof(Fts5Config)); if( pRet==0 ) return SQLITE_NOMEM; @@ -201625,7 +210562,7 @@ static int sqlite3Fts5ConfigDeclareVtab(Fts5Config *pConfig){ rc = sqlite3_declare_vtab(pConfig->db, zSql); sqlite3_free(zSql); } - + return rc; } @@ -201770,7 +210707,7 @@ static int sqlite3Fts5ConfigSetValue( if( SQLITE_INTEGER==sqlite3_value_numeric_type(pVal) ){ pgsz = sqlite3_value_int(pVal); } - if( pgsz<=0 || pgsz>FTS5_MAX_PAGE_SIZE ){ + if( pgsz<32 || pgsz>FTS5_MAX_PAGE_SIZE ){ *pbBadkey = 1; }else{ pConfig->pgsz = pgsz; @@ -201823,6 +210760,7 @@ static int sqlite3Fts5ConfigSetValue( *pbBadkey = 1; }else{ if( nCrisisMerge<=1 ) nCrisisMerge = FTS5_DEFAULT_CRISISMERGE; + if( nCrisisMerge>=FTS5_MAX_SEGMENT ) nCrisisMerge = FTS5_MAX_SEGMENT-1; pConfig->nCrisisMerge = nCrisisMerge; } } @@ -202115,7 +211053,7 @@ static int fts5ExprGetToken( return tok; } -static void *fts5ParseAlloc(u64 t){ return sqlite3_malloc((int)t); } +static void *fts5ParseAlloc(u64 t){ return sqlite3_malloc64((sqlite3_int64)t);} static void fts5ParseFree(void *p){ sqlite3_free(p); } static int sqlite3Fts5ExprNew( @@ -202213,6 +211151,42 @@ static void sqlite3Fts5ExprFree(Fts5Expr *p){ } } +static int sqlite3Fts5ExprAnd(Fts5Expr **pp1, Fts5Expr *p2){ + Fts5Parse sParse; + memset(&sParse, 0, sizeof(sParse)); + + if( *pp1 ){ + Fts5Expr *p1 = *pp1; + int nPhrase = p1->nPhrase + p2->nPhrase; + + p1->pRoot = sqlite3Fts5ParseNode(&sParse, FTS5_AND, p1->pRoot, p2->pRoot,0); + p2->pRoot = 0; + + if( sParse.rc==SQLITE_OK ){ + Fts5ExprPhrase **ap = (Fts5ExprPhrase**)sqlite3_realloc( + p1->apExprPhrase, nPhrase * sizeof(Fts5ExprPhrase*) + ); + if( ap==0 ){ + sParse.rc = SQLITE_NOMEM; + }else{ + int i; + memmove(&ap[p2->nPhrase], ap, p1->nPhrase*sizeof(Fts5ExprPhrase*)); + for(i=0; inPhrase; i++){ + ap[i] = p2->apExprPhrase[i]; + } + p1->nPhrase = nPhrase; + p1->apExprPhrase = ap; + } + } + sqlite3_free(p2->apExprPhrase); + sqlite3_free(p2); + }else{ + *pp1 = p2; + } + + return sParse.rc; +} + /* ** Argument pTerm must be a synonym iterator. Return the current rowid ** that it points to. @@ -202260,8 +211234,8 @@ static int fts5ExprSynonymList( if( sqlite3Fts5IterEof(pIter)==0 && pIter->iRowid==iRowid ){ if( pIter->nData==0 ) continue; if( nIter==nAlloc ){ - int nByte = sizeof(Fts5PoslistReader) * nAlloc * 2; - Fts5PoslistReader *aNew = (Fts5PoslistReader*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = sizeof(Fts5PoslistReader) * nAlloc * 2; + Fts5PoslistReader *aNew = (Fts5PoslistReader*)sqlite3_malloc64(nByte); if( aNew==0 ){ rc = SQLITE_NOMEM; goto synonym_poslist_out; @@ -202341,8 +211315,8 @@ static int fts5ExprPhraseIsMatch( /* If the aStatic[] array is not large enough, allocate a large array ** using sqlite3_malloc(). This approach could be improved upon. */ if( pPhrase->nTerm>ArraySize(aStatic) ){ - int nByte = sizeof(Fts5PoslistReader) * pPhrase->nTerm; - aIter = (Fts5PoslistReader*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = sizeof(Fts5PoslistReader) * pPhrase->nTerm; + aIter = (Fts5PoslistReader*)sqlite3_malloc64(nByte); if( !aIter ) return SQLITE_NOMEM; } memset(aIter, 0, sizeof(Fts5PoslistReader) * pPhrase->nTerm); @@ -202476,7 +211450,7 @@ static int fts5ExprNearIsMatch(int *pRc, Fts5ExprNearset *pNear){ /* If the aStatic[] array is not large enough, allocate a large array ** using sqlite3_malloc(). This approach could be improved upon. */ if( pNear->nPhrase>ArraySize(aStatic) ){ - int nByte = sizeof(Fts5NearTrimmer) * pNear->nPhrase; + sqlite3_int64 nByte = sizeof(Fts5NearTrimmer) * pNear->nPhrase; a = (Fts5NearTrimmer*)sqlite3Fts5MallocZero(&rc, nByte); }else{ memset(aStatic, 0, sizeof(aStatic)); @@ -203385,18 +212359,20 @@ static Fts5ExprNearset *sqlite3Fts5ParseNearset( return pNear; } if( pNear==0 ){ - int nByte = sizeof(Fts5ExprNearset) + SZALLOC * sizeof(Fts5ExprPhrase*); - pRet = sqlite3_malloc(nByte); + sqlite3_int64 nByte; + nByte = sizeof(Fts5ExprNearset) + SZALLOC * sizeof(Fts5ExprPhrase*); + pRet = sqlite3_malloc64(nByte); if( pRet==0 ){ pParse->rc = SQLITE_NOMEM; }else{ - memset(pRet, 0, nByte); + memset(pRet, 0, (size_t)nByte); } }else if( (pNear->nPhrase % SZALLOC)==0 ){ int nNew = pNear->nPhrase + SZALLOC; - int nByte = sizeof(Fts5ExprNearset) + nNew * sizeof(Fts5ExprPhrase*); + sqlite3_int64 nByte; - pRet = (Fts5ExprNearset*)sqlite3_realloc(pNear, nByte); + nByte = sizeof(Fts5ExprNearset) + nNew * sizeof(Fts5ExprPhrase*); + pRet = (Fts5ExprNearset*)sqlite3_realloc64(pNear, nByte); if( pRet==0 ){ pParse->rc = SQLITE_NOMEM; } @@ -203460,12 +212436,12 @@ static int fts5ParseTokenize( if( pPhrase && pPhrase->nTerm>0 && (tflags & FTS5_TOKEN_COLOCATED) ){ Fts5ExprTerm *pSyn; - int nByte = sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer) + nToken+1; - pSyn = (Fts5ExprTerm*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer) + nToken+1; + pSyn = (Fts5ExprTerm*)sqlite3_malloc64(nByte); if( pSyn==0 ){ rc = SQLITE_NOMEM; }else{ - memset(pSyn, 0, nByte); + memset(pSyn, 0, (size_t)nByte); pSyn->zTerm = ((char*)pSyn) + sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer); memcpy(pSyn->zTerm, pToken, nToken); pSyn->pSynonym = pPhrase->aTerm[pPhrase->nTerm-1].pSynonym; @@ -203477,7 +212453,7 @@ static int fts5ParseTokenize( Fts5ExprPhrase *pNew; int nNew = SZALLOC + (pPhrase ? pPhrase->nTerm : 0); - pNew = (Fts5ExprPhrase*)sqlite3_realloc(pPhrase, + pNew = (Fts5ExprPhrase*)sqlite3_realloc64(pPhrase, sizeof(Fts5ExprPhrase) + sizeof(Fts5ExprTerm) * nNew ); if( pNew==0 ){ @@ -203563,9 +212539,9 @@ static Fts5ExprPhrase *sqlite3Fts5ParseTerm( if( pAppend==0 ){ if( (pParse->nPhrase % 8)==0 ){ - int nByte = sizeof(Fts5ExprPhrase*) * (pParse->nPhrase + 8); + sqlite3_int64 nByte = sizeof(Fts5ExprPhrase*) * (pParse->nPhrase + 8); Fts5ExprPhrase **apNew; - apNew = (Fts5ExprPhrase**)sqlite3_realloc(pParse->apPhrase, nByte); + apNew = (Fts5ExprPhrase**)sqlite3_realloc64(pParse->apPhrase, nByte); if( apNew==0 ){ pParse->rc = SQLITE_NOMEM; fts5ExprPhraseFree(sCtx.pPhrase); @@ -203620,10 +212596,12 @@ static int sqlite3Fts5ExprClonePhrase( if( rc==SQLITE_OK ){ Fts5Colset *pColsetOrig = pOrig->pNode->pNear->pColset; if( pColsetOrig ){ - int nByte = sizeof(Fts5Colset) + (pColsetOrig->nCol-1) * sizeof(int); - Fts5Colset *pColset = (Fts5Colset*)sqlite3Fts5MallocZero(&rc, nByte); + sqlite3_int64 nByte; + Fts5Colset *pColset; + nByte = sizeof(Fts5Colset) + (pColsetOrig->nCol-1) * sizeof(int); + pColset = (Fts5Colset*)sqlite3Fts5MallocZero(&rc, nByte); if( pColset ){ - memcpy(pColset, pColsetOrig, nByte); + memcpy(pColset, pColsetOrig, (size_t)nByte); } pNew->pRoot->pNear->pColset = pColset; } @@ -203741,7 +212719,7 @@ static Fts5Colset *fts5ParseColset( assert( pParse->rc==SQLITE_OK ); assert( iCol>=0 && iColpConfig->nCol ); - pNew = sqlite3_realloc(p, sizeof(Fts5Colset) + sizeof(int)*nCol); + pNew = sqlite3_realloc64(p, sizeof(Fts5Colset) + sizeof(int)*nCol); if( pNew==0 ){ pParse->rc = SQLITE_NOMEM; }else{ @@ -203837,10 +212815,10 @@ static Fts5Colset *sqlite3Fts5ParseColset( static Fts5Colset *fts5CloneColset(int *pRc, Fts5Colset *pOrig){ Fts5Colset *pRet; if( pOrig ){ - int nByte = sizeof(Fts5Colset) + (pOrig->nCol-1) * sizeof(int); + sqlite3_int64 nByte = sizeof(Fts5Colset) + (pOrig->nCol-1) * sizeof(int); pRet = (Fts5Colset*)sqlite3Fts5MallocZero(pRc, nByte); if( pRet ){ - memcpy(pRet, pOrig, nByte); + memcpy(pRet, pOrig, (size_t)nByte); } }else{ pRet = 0; @@ -203991,7 +212969,7 @@ static Fts5ExprNode *sqlite3Fts5ParseNode( if( pParse->rc==SQLITE_OK ){ int nChild = 0; /* Number of children of returned node */ - int nByte; /* Bytes of space to allocate for this node */ + sqlite3_int64 nByte; /* Bytes of space to allocate for this node */ assert( (eType!=FTS5_STRING && !pNear) || (eType==FTS5_STRING && !pLeft && !pRight) @@ -204123,7 +213101,7 @@ static Fts5ExprNode *sqlite3Fts5ParseImplicitAnd( } static char *fts5ExprTermPrint(Fts5ExprTerm *pTerm){ - int nByte = 0; + sqlite3_int64 nByte = 0; Fts5ExprTerm *p; char *zQuoted; @@ -204131,7 +213109,7 @@ static char *fts5ExprTermPrint(Fts5ExprTerm *pTerm){ for(p=pTerm; p; p=p->pSynonym){ nByte += (int)strlen(pTerm->zTerm) * 2 + 3 + 2; } - zQuoted = sqlite3_malloc(nByte); + zQuoted = sqlite3_malloc64(nByte); if( zQuoted ){ int i = 0; @@ -204371,7 +213349,7 @@ static void fts5ExprFunction( } nConfig = 3 + (nArg-iArg); - azConfig = (const char**)sqlite3_malloc(sizeof(char*) * nConfig); + azConfig = (const char**)sqlite3_malloc64(sizeof(char*) * nConfig); if( azConfig==0 ){ sqlite3_result_error_nomem(pCtx); return; @@ -204380,10 +213358,12 @@ static void fts5ExprFunction( azConfig[1] = "main"; azConfig[2] = "tbl"; for(i=3; iArgnPhrase); + pRet = sqlite3_malloc64(sizeof(Fts5PoslistPopulator)*pExpr->nPhrase); if( pRet ){ int i; memset(pRet, 0, sizeof(Fts5PoslistPopulator)*pExpr->nPhrase); @@ -204752,7 +213732,6 @@ static int sqlite3Fts5ExprPhraseCollist( return rc; } - /* ** 2014 August 11 ** @@ -204845,20 +213824,20 @@ static int sqlite3Fts5HashNew(Fts5Config *pConfig, Fts5Hash **ppNew, int *pnByte if( pNew==0 ){ rc = SQLITE_NOMEM; }else{ - int nByte; + sqlite3_int64 nByte; memset(pNew, 0, sizeof(Fts5Hash)); pNew->pnByte = pnByte; pNew->eDetail = pConfig->eDetail; pNew->nSlot = 1024; nByte = sizeof(Fts5HashEntry*) * pNew->nSlot; - pNew->aSlot = (Fts5HashEntry**)sqlite3_malloc(nByte); + pNew->aSlot = (Fts5HashEntry**)sqlite3_malloc64(nByte); if( pNew->aSlot==0 ){ sqlite3_free(pNew); *ppNew = 0; rc = SQLITE_NOMEM; }else{ - memset(pNew->aSlot, 0, nByte); + memset(pNew->aSlot, 0, (size_t)nByte); } } return rc; @@ -204920,7 +213899,7 @@ static int fts5HashResize(Fts5Hash *pHash){ Fts5HashEntry **apNew; Fts5HashEntry **apOld = pHash->aSlot; - apNew = (Fts5HashEntry**)sqlite3_malloc(nNew*sizeof(Fts5HashEntry*)); + apNew = (Fts5HashEntry**)sqlite3_malloc64(nNew*sizeof(Fts5HashEntry*)); if( !apNew ) return SQLITE_NOMEM; memset(apNew, 0, nNew*sizeof(Fts5HashEntry*)); @@ -204942,19 +213921,25 @@ static int fts5HashResize(Fts5Hash *pHash){ return SQLITE_OK; } -static void fts5HashAddPoslistSize(Fts5Hash *pHash, Fts5HashEntry *p){ +static int fts5HashAddPoslistSize( + Fts5Hash *pHash, + Fts5HashEntry *p, + Fts5HashEntry *p2 +){ + int nRet = 0; if( p->iSzPoslist ){ - u8 *pPtr = (u8*)p; + u8 *pPtr = p2 ? (u8*)p2 : (u8*)p; + int nData = p->nData; if( pHash->eDetail==FTS5_DETAIL_NONE ){ - assert( p->nData==p->iSzPoslist ); + assert( nData==p->iSzPoslist ); if( p->bDel ){ - pPtr[p->nData++] = 0x00; + pPtr[nData++] = 0x00; if( p->bContent ){ - pPtr[p->nData++] = 0x00; + pPtr[nData++] = 0x00; } } }else{ - int nSz = (p->nData - p->iSzPoslist - 1); /* Size in bytes */ + int nSz = (nData - p->iSzPoslist - 1); /* Size in bytes */ int nPos = nSz*2 + p->bDel; /* Value of nPos field */ assert( p->bDel==0 || p->bDel==1 ); @@ -204964,14 +213949,19 @@ static void fts5HashAddPoslistSize(Fts5Hash *pHash, Fts5HashEntry *p){ int nByte = sqlite3Fts5GetVarintLen((u32)nPos); memmove(&pPtr[p->iSzPoslist + nByte], &pPtr[p->iSzPoslist + 1], nSz); sqlite3Fts5PutVarint(&pPtr[p->iSzPoslist], nPos); - p->nData += (nByte-1); + nData += (nByte-1); } } - p->iSzPoslist = 0; - p->bDel = 0; - p->bContent = 0; + nRet = nData - p->nData; + if( p2==0 ){ + p->iSzPoslist = 0; + p->bDel = 0; + p->bContent = 0; + p->nData = nData; + } } + return nRet; } /* @@ -205014,7 +214004,7 @@ static int sqlite3Fts5HashWrite( if( p==0 ){ /* Figure out how much space to allocate */ char *zKey; - int nByte = sizeof(Fts5HashEntry) + (nToken+1) + 1 + 64; + sqlite3_int64 nByte = sizeof(Fts5HashEntry) + (nToken+1) + 1 + 64; if( nByte<128 ) nByte = 128; /* Grow the Fts5Hash.aSlot[] array if necessary. */ @@ -205025,10 +214015,10 @@ static int sqlite3Fts5HashWrite( } /* Allocate new Fts5HashEntry and add it to the hash table. */ - p = (Fts5HashEntry*)sqlite3_malloc(nByte); + p = (Fts5HashEntry*)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; memset(p, 0, sizeof(Fts5HashEntry)); - p->nAlloc = nByte; + p->nAlloc = (int)nByte; zKey = fts5EntryKey(p); zKey[0] = bByte; memcpy(&zKey[1], pToken, nToken); @@ -205064,12 +214054,12 @@ static int sqlite3Fts5HashWrite( ** + 5 bytes for the new position offset (32-bit max). */ if( (p->nAlloc - p->nData) < (9 + 4 + 1 + 3 + 5) ){ - int nNew = p->nAlloc * 2; + sqlite3_int64 nNew = p->nAlloc * 2; Fts5HashEntry *pNew; Fts5HashEntry **pp; - pNew = (Fts5HashEntry*)sqlite3_realloc(p, nNew); + pNew = (Fts5HashEntry*)sqlite3_realloc64(p, nNew); if( pNew==0 ) return SQLITE_NOMEM; - pNew->nAlloc = nNew; + pNew->nAlloc = (int)nNew; for(pp=&pHash->aSlot[iHash]; *pp!=p; pp=&(*pp)->pHashNext); *pp = pNew; p = pNew; @@ -205083,7 +214073,7 @@ static int sqlite3Fts5HashWrite( /* If this is a new rowid, append the 4-byte size field for the previous ** entry, and the new rowid for this entry. */ if( iRowid!=p->iRowid ){ - fts5HashAddPoslistSize(pHash, p); + fts5HashAddPoslistSize(pHash, p, 0); p->nData += sqlite3Fts5PutVarint(&pPtr[p->nData], iRowid - p->iRowid); p->iRowid = iRowid; bNew = 1; @@ -205193,14 +214183,16 @@ static int fts5HashEntrySort( int i; *ppSorted = 0; - ap = sqlite3_malloc(sizeof(Fts5HashEntry*) * nMergeSlot); + ap = sqlite3_malloc64(sizeof(Fts5HashEntry*) * nMergeSlot); if( !ap ) return SQLITE_NOMEM; memset(ap, 0, sizeof(Fts5HashEntry*) * nMergeSlot); for(iSlot=0; iSlotnSlot; iSlot++){ Fts5HashEntry *pIter; for(pIter=pHash->aSlot[iSlot]; pIter; pIter=pIter->pHashNext){ - if( pTerm==0 || 0==memcmp(fts5EntryKey(pIter), pTerm, nTerm) ){ + if( pTerm==0 + || (pIter->nKey+1>=nTerm && 0==memcmp(fts5EntryKey(pIter), pTerm, nTerm)) + ){ Fts5HashEntry *pEntry = pIter; pEntry->pScanNext = 0; for(i=0; ap[i]; i++){ @@ -205228,8 +214220,9 @@ static int fts5HashEntrySort( */ static int sqlite3Fts5HashQuery( Fts5Hash *pHash, /* Hash table to query */ + int nPre, const char *pTerm, int nTerm, /* Query term */ - const u8 **ppDoclist, /* OUT: Pointer to doclist for pTerm */ + void **ppOut, /* OUT: Pointer to new object */ int *pnDoclist /* OUT: Size of doclist in bytes */ ){ unsigned int iHash = fts5HashKey(pHash->nSlot, (const u8*)pTerm, nTerm); @@ -205238,15 +214231,25 @@ static int sqlite3Fts5HashQuery( for(p=pHash->aSlot[iHash]; p; p=p->pHashNext){ zKey = fts5EntryKey(p); - if( memcmp(zKey, pTerm, nTerm)==0 && zKey[nTerm]==0 ) break; + assert( p->nKey+1==(int)strlen(zKey) ); + if( nTerm==p->nKey+1 && memcmp(zKey, pTerm, nTerm)==0 ) break; } if( p ){ - fts5HashAddPoslistSize(pHash, p); - *ppDoclist = (const u8*)&zKey[nTerm+1]; - *pnDoclist = p->nData - (sizeof(Fts5HashEntry) + nTerm + 1); + int nHashPre = sizeof(Fts5HashEntry) + nTerm + 1; + int nList = p->nData - nHashPre; + u8 *pRet = (u8*)(*ppOut = sqlite3_malloc64(nPre + nList + 10)); + if( pRet ){ + Fts5HashEntry *pFaux = (Fts5HashEntry*)&pRet[nPre-nHashPre]; + memcpy(&pRet[nPre], &((u8*)p)[nHashPre], nList); + nList += fts5HashAddPoslistSize(pHash, p, pFaux); + *pnDoclist = nList; + }else{ + *pnDoclist = 0; + return SQLITE_NOMEM; + } }else{ - *ppDoclist = 0; + *ppOut = 0; *pnDoclist = 0; } @@ -205279,7 +214282,7 @@ static void sqlite3Fts5HashScanEntry( if( (p = pHash->pScan) ){ char *zKey = fts5EntryKey(p); int nTerm = (int)strlen(zKey); - fts5HashAddPoslistSize(pHash, p); + fts5HashAddPoslistSize(pHash, p, 0); *pzTerm = zKey; *ppDoclist = (const u8*)&zKey[nTerm+1]; *pnDoclist = p->nData - (sizeof(Fts5HashEntry) + nTerm + 1); @@ -205290,7 +214293,6 @@ static void sqlite3Fts5HashScanEntry( } } - /* ** 2014 May 31 ** @@ -205532,11 +214534,6 @@ static void sqlite3Fts5HashScanEntry( #define FTS5_SEGMENT_ROWID(segid, pgno) fts5_dri(segid, 0, 0, pgno) #define FTS5_DLIDX_ROWID(segid, height, pgno) fts5_dri(segid, 1, height, pgno) -/* -** Maximum segments permitted in a single index -*/ -#define FTS5_MAX_SEGMENT 2000 - #ifdef SQLITE_DEBUG static int sqlite3Fts5Corrupt() { return SQLITE_CORRUPT_VTAB; } #endif @@ -205805,7 +214802,6 @@ struct Fts5Iter { Fts5IndexIter base; /* Base class containing output vars */ Fts5Index *pIndex; /* Index that owns this iterator */ - Fts5Structure *pStruct; /* Database structure for this iterator */ Fts5Buffer poslist; /* Buffer containing current poslist */ Fts5Colset *pColset; /* Restrict matches to these columns */ @@ -205866,7 +214862,7 @@ static u16 fts5GetU16(const u8 *aIn){ ** If an OOM error is encountered, return NULL and set the error code in ** the Fts5Index handle passed as the first argument. */ -static void *fts5IdxMalloc(Fts5Index *p, int nByte){ +static void *fts5IdxMalloc(Fts5Index *p, sqlite3_int64 nByte){ return sqlite3Fts5MallocZero(&p->rc, nByte); } @@ -205900,7 +214896,7 @@ static int fts5BufferCompareBlob( */ static int fts5BufferCompare(Fts5Buffer *pLeft, Fts5Buffer *pRight){ int nCmp = MIN(pLeft->n, pRight->n); - int res = memcmp(pLeft->p, pRight->p, nCmp); + int res = fts5Memcmp(pLeft->p, pRight->p, nCmp); return (res==0 ? (pLeft->n - pRight->n) : res); } @@ -205913,7 +214909,7 @@ static int fts5LeafFirstTermOff(Fts5Data *pLeaf){ /* ** Close the read-only blob handle, if it is open. */ -static void fts5CloseReader(Fts5Index *p){ +static void sqlite3Fts5IndexCloseReader(Fts5Index *p){ if( p->pReader ){ sqlite3_blob *pReader = p->pReader; p->pReader = 0; @@ -205942,7 +214938,7 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ assert( p->pReader==0 ); p->pReader = pBlob; if( rc!=SQLITE_OK ){ - fts5CloseReader(p); + sqlite3Fts5IndexCloseReader(p); } if( rc==SQLITE_ABORT ) rc = SQLITE_OK; } @@ -205966,8 +214962,8 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ if( rc==SQLITE_OK ){ u8 *aOut = 0; /* Read blob data into this buffer */ int nByte = sqlite3_blob_bytes(p->pReader); - int nAlloc = sizeof(Fts5Data) + nByte + FTS5_DATA_PADDING; - pRet = (Fts5Data*)sqlite3_malloc(nAlloc); + sqlite3_int64 nAlloc = sizeof(Fts5Data) + nByte + FTS5_DATA_PADDING; + pRet = (Fts5Data*)sqlite3_malloc64(nAlloc); if( pRet ){ pRet->nn = nByte; aOut = pRet->p = (u8*)&pRet[1]; @@ -205983,6 +214979,8 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ pRet = 0; }else{ /* TODO1: Fix this */ + pRet->p[nByte] = 0x00; + pRet->p[nByte+1] = 0x00; pRet->szLeaf = fts5GetU16(&pRet->p[2]); } } @@ -206005,7 +215003,7 @@ static void fts5DataRelease(Fts5Data *pData){ static Fts5Data *fts5LeafRead(Fts5Index *p, i64 iRowid){ Fts5Data *pRet = fts5DataRead(p, iRowid); if( pRet ){ - if( pRet->szLeaf>pRet->nn ){ + if( pRet->nn<4 || pRet->szLeaf>pRet->nn ){ p->rc = FTS5_CORRUPT; fts5DataRelease(pRet); pRet = 0; @@ -206022,7 +215020,8 @@ static int fts5IndexPrepareStmt( if( p->rc==SQLITE_OK ){ if( zSql ){ p->rc = sqlite3_prepare_v3(p->pConfig->db, zSql, -1, - SQLITE_PREPARE_PERSISTENT, ppStmt, 0); + SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_NO_VTAB, + ppStmt, 0); }else{ p->rc = SQLITE_NOMEM; } @@ -206063,23 +215062,12 @@ static void fts5DataDelete(Fts5Index *p, i64 iFirst, i64 iLast){ if( p->rc!=SQLITE_OK ) return; if( p->pDeleter==0 ){ - int rc; Fts5Config *pConfig = p->pConfig; char *zSql = sqlite3_mprintf( "DELETE FROM '%q'.'%q_data' WHERE id>=? AND id<=?", pConfig->zDb, pConfig->zName ); - if( zSql==0 ){ - rc = SQLITE_NOMEM; - }else{ - rc = sqlite3_prepare_v3(pConfig->db, zSql, -1, - SQLITE_PREPARE_PERSISTENT, &p->pDeleter, 0); - sqlite3_free(zSql); - } - if( rc!=SQLITE_OK ){ - p->rc = rc; - return; - } + if( fts5IndexPrepareStmt(p, &p->pDeleter, zSql) ) return; } sqlite3_bind_int64(p->pDeleter, 1, iFirst); @@ -206151,7 +215139,7 @@ static int fts5StructureDecode( int iLvl; int nLevel = 0; int nSegment = 0; - int nByte; /* Bytes of space to allocate at pRet */ + sqlite3_int64 nByte; /* Bytes of space to allocate at pRet */ Fts5Structure *pRet = 0; /* Structure object to return */ /* Grab the cookie value */ @@ -206162,6 +215150,11 @@ static int fts5StructureDecode( ** structure record. */ i += fts5GetVarint32(&pData[i], nLevel); i += fts5GetVarint32(&pData[i], nSegment); + if( nLevel>FTS5_MAX_SEGMENT || nLevel<0 + || nSegment>FTS5_MAX_SEGMENT || nSegment<0 + ){ + return FTS5_CORRUPT; + } nByte = ( sizeof(Fts5Structure) + /* Main structure */ sizeof(Fts5StructureLevel) * (nLevel-1) /* aLevel[] array */ @@ -206184,25 +215177,35 @@ static int fts5StructureDecode( }else{ i += fts5GetVarint32(&pData[i], pLvl->nMerge); i += fts5GetVarint32(&pData[i], nTotal); - assert( nTotal>=pLvl->nMerge ); + if( nTotalnMerge ) rc = FTS5_CORRUPT; pLvl->aSeg = (Fts5StructureSegment*)sqlite3Fts5MallocZero(&rc, nTotal * sizeof(Fts5StructureSegment) ); + nSegment -= nTotal; } if( rc==SQLITE_OK ){ pLvl->nSeg = nTotal; for(iSeg=0; iSegaSeg[iSeg]; if( i>=nData ){ rc = FTS5_CORRUPT; break; } - i += fts5GetVarint32(&pData[i], pLvl->aSeg[iSeg].iSegid); - i += fts5GetVarint32(&pData[i], pLvl->aSeg[iSeg].pgnoFirst); - i += fts5GetVarint32(&pData[i], pLvl->aSeg[iSeg].pgnoLast); + i += fts5GetVarint32(&pData[i], pSeg->iSegid); + i += fts5GetVarint32(&pData[i], pSeg->pgnoFirst); + i += fts5GetVarint32(&pData[i], pSeg->pgnoLast); + if( pSeg->pgnoLastpgnoFirst ){ + rc = FTS5_CORRUPT; + break; + } } + if( iLvl>0 && pLvl[-1].nMerge && nTotal==0 ) rc = FTS5_CORRUPT; + if( iLvl==nLevel-1 && pLvl->nMerge ) rc = FTS5_CORRUPT; } } + if( nSegment!=0 && rc==SQLITE_OK ) rc = FTS5_CORRUPT; + if( rc!=SQLITE_OK ){ fts5StructureRelease(pRet); pRet = 0; @@ -206220,12 +215223,12 @@ static void fts5StructureAddLevel(int *pRc, Fts5Structure **ppStruct){ if( *pRc==SQLITE_OK ){ Fts5Structure *pStruct = *ppStruct; int nLevel = pStruct->nLevel; - int nByte = ( + sqlite3_int64 nByte = ( sizeof(Fts5Structure) + /* Main structure */ sizeof(Fts5StructureLevel) * (nLevel+1) /* aLevel[] array */ ); - pStruct = sqlite3_realloc(pStruct, nByte); + pStruct = sqlite3_realloc64(pStruct, nByte); if( pStruct ){ memset(&pStruct->aLevel[nLevel], 0, sizeof(Fts5StructureLevel)); pStruct->nLevel++; @@ -206250,10 +215253,10 @@ static void fts5StructureExtendLevel( if( *pRc==SQLITE_OK ){ Fts5StructureLevel *pLvl = &pStruct->aLevel[iLvl]; Fts5StructureSegment *aNew; - int nByte; + sqlite3_int64 nByte; nByte = (pLvl->nSeg + nExtra) * sizeof(Fts5StructureSegment); - aNew = sqlite3_realloc(pLvl->aSeg, nByte); + aNew = sqlite3_realloc64(pLvl->aSeg, nByte); if( aNew ){ if( bInsert==0 ){ memset(&aNew[pLvl->nSeg], 0, sizeof(Fts5StructureSegment) * nExtra); @@ -206280,7 +215283,7 @@ static Fts5Structure *fts5StructureReadUncached(Fts5Index *p){ /* TODO: Do we need this if the leaf-index is appended? Probably... */ memset(&pData->p[pData->nn], 0, FTS5_DATA_PADDING); p->rc = fts5StructureDecode(pData->p, pData->nn, &iCookie, &pRet); - if( p->rc==SQLITE_OK && pConfig->iCookie!=iCookie ){ + if( p->rc==SQLITE_OK && (pConfig->pgsz==0 || pConfig->iCookie!=iCookie) ){ p->rc = sqlite3Fts5ConfigLoad(pConfig, iCookie); } fts5DataRelease(pData); @@ -206767,10 +215770,10 @@ static Fts5DlidxIter *fts5DlidxIterInit( int bDone = 0; for(i=0; p->rc==SQLITE_OK && bDone==0; i++){ - int nByte = sizeof(Fts5DlidxIter) + i * sizeof(Fts5DlidxLvl); + sqlite3_int64 nByte = sizeof(Fts5DlidxIter) + i * sizeof(Fts5DlidxLvl); Fts5DlidxIter *pNew; - pNew = (Fts5DlidxIter*)sqlite3_realloc(pIter, nByte); + pNew = (Fts5DlidxIter*)sqlite3_realloc64(pIter, nByte); if( pNew==0 ){ p->rc = SQLITE_NOMEM; }else{ @@ -206940,12 +215943,13 @@ static void fts5SegIterLoadTerm(Fts5Index *p, Fts5SegIter *pIter, int nKeep){ int nNew; /* Bytes of new data */ iOff += fts5GetVarint32(&a[iOff], nNew); - if( iOff+nNew>pIter->pLeaf->nn ){ + if( iOff+nNew>pIter->pLeaf->szLeaf || nKeep>pIter->term.n || nNew==0 ){ p->rc = FTS5_CORRUPT; return; } pIter->term.n = nKeep; fts5BufferAppendBlob(&p->rc, &pIter->term, nNew, &a[iOff]); + assert( pIter->term.n<=pIter->term.nSpace ); iOff += nNew; pIter->iTermLeafOffset = iOff; pIter->iTermLeafPgno = pIter->iLeafPgno; @@ -207010,7 +216014,7 @@ static void fts5SegIterInit( if( p->rc==SQLITE_OK ){ pIter->iLeafOffset = 4; assert_nc( pIter->pLeaf->nn>4 ); - assert( fts5LeafFirstTermOff(pIter->pLeaf)==4 ); + assert_nc( fts5LeafFirstTermOff(pIter->pLeaf)==4 ); pIter->iPgidxOff = pIter->pLeaf->szLeaf+1; fts5SegIterLoadTerm(p, pIter, 0); fts5SegIterLoadNPos(p, pIter); @@ -207066,7 +216070,7 @@ static void fts5SegIterReverseInitPage(Fts5Index *p, Fts5SegIter *pIter){ /* If necessary, grow the pIter->aRowidOffset[] array. */ if( iRowidOffset>=pIter->nRowidOffset ){ int nNew = pIter->nRowidOffset + 8; - int *aNew = (int*)sqlite3_realloc(pIter->aRowidOffset, nNew*sizeof(int)); + int *aNew = (int*)sqlite3_realloc64(pIter->aRowidOffset,nNew*sizeof(int)); if( aNew==0 ){ p->rc = SQLITE_NOMEM; break; @@ -207520,10 +216524,10 @@ static void fts5LeafSeek( int szLeaf = pIter->pLeaf->szLeaf; int n = pIter->pLeaf->nn; - int nMatch = 0; - int nKeep = 0; - int nNew = 0; - int iTermOff; + u32 nMatch = 0; + u32 nKeep = 0; + u32 nNew = 0; + u32 iTermOff; int iPgidx; /* Current offset in pgidx */ int bEndOfPage = 0; @@ -207547,15 +216551,15 @@ static void fts5LeafSeek( assert( nKeep>=nMatch ); if( nKeep==nMatch ){ - int nCmp; - int i; - nCmp = MIN(nNew, nTerm-nMatch); + u32 nCmp; + u32 i; + nCmp = (u32)MIN(nNew, nTerm-nMatch); for(i=0; ipLeaf->p[iPgidx], iOff); if( iOff<4 || iOff>=pIter->pLeaf->szLeaf ){ p->rc = FTS5_CORRUPT; + return; }else{ nKeep = 0; iTermOff = iOff; @@ -207611,8 +216616,11 @@ static void fts5LeafSeek( } search_success: - pIter->iLeafOffset = iOff + nNew; + if( pIter->iLeafOffset>n || nNew<1 ){ + p->rc = FTS5_CORRUPT; + return; + } pIter->iTermLeafOffset = pIter->iLeafOffset; pIter->iTermLeafPgno = pIter->iLeafPgno; @@ -207719,7 +216727,7 @@ static void fts5SegIterSeekInit( ** 4) the FTS5INDEX_QUERY_SCAN flag was set and the iterator points ** to an entry with a term greater than or equal to (pTerm/nTerm). */ - assert( p->rc!=SQLITE_OK /* 1 */ + assert_nc( p->rc!=SQLITE_OK /* 1 */ || pIter->pLeaf==0 /* 2 */ || fts5BufferCompareBlob(&pIter->term, pTerm, nTerm)==0 /* 3 */ || (bGe && fts5BufferCompareBlob(&pIter->term, pTerm, nTerm)>0) /* 4 */ @@ -207740,31 +216748,40 @@ static void fts5SegIterHashInit( int flags, /* Mask of FTS5INDEX_XXX flags */ Fts5SegIter *pIter /* Object to populate */ ){ - const u8 *pList = 0; int nList = 0; const u8 *z = 0; int n = 0; + Fts5Data *pLeaf = 0; assert( p->pHash ); assert( p->rc==SQLITE_OK ); if( pTerm==0 || (flags & FTS5INDEX_QUERY_SCAN) ){ + const u8 *pList = 0; + p->rc = sqlite3Fts5HashScanInit(p->pHash, (const char*)pTerm, nTerm); sqlite3Fts5HashScanEntry(p->pHash, (const char**)&z, &pList, &nList); n = (z ? (int)strlen((const char*)z) : 0); + if( pList ){ + pLeaf = fts5IdxMalloc(p, sizeof(Fts5Data)); + if( pLeaf ){ + pLeaf->p = (u8*)pList; + } + } }else{ - pIter->flags |= FTS5_SEGITER_ONETERM; - sqlite3Fts5HashQuery(p->pHash, (const char*)pTerm, nTerm, &pList, &nList); + p->rc = sqlite3Fts5HashQuery(p->pHash, sizeof(Fts5Data), + (const char*)pTerm, nTerm, (void**)&pLeaf, &nList + ); + if( pLeaf ){ + pLeaf->p = (u8*)&pLeaf[1]; + } z = pTerm; n = nTerm; + pIter->flags |= FTS5_SEGITER_ONETERM; } - if( pList ){ - Fts5Data *pLeaf; + if( pLeaf ){ sqlite3Fts5BufferSet(&p->rc, &pIter->term, n, z); - pLeaf = fts5IdxMalloc(p, sizeof(Fts5Data)); - if( pLeaf==0 ) return; - pLeaf->p = (u8*)pList; pLeaf->nn = pLeaf->szLeaf = nList; pIter->pLeaf = pLeaf; pIter->iLeafOffset = fts5GetVarint(pLeaf->p, (u64*)&pIter->iRowid); @@ -207817,7 +216834,7 @@ static void fts5AssertComparisonResult( assert( pRes->iFirst==i1 ); }else{ int nMin = MIN(p1->term.n, p2->term.n); - int res = memcmp(p1->term.p, p2->term.p, nMin); + int res = fts5Memcmp(p1->term.p, p2->term.p, nMin); if( res==0 ) res = p1->term.n - p2->term.n; if( res==0 ){ @@ -207917,8 +216934,8 @@ static int fts5MultiIterDoCompare(Fts5Iter *pIter, int iOut){ }else{ int res = fts5BufferCompare(&p1->term, &p2->term); if( res==0 ){ - assert( i2>i1 ); - assert( i2!=0 ); + assert_nc( i2>i1 ); + assert_nc( i2!=0 ); pRes->bTermEq = 1; if( p1->iRowid==p2->iRowid ){ p1->bDel = p2->bDel; @@ -208040,7 +217057,6 @@ static void fts5MultiIterFree(Fts5Iter *pIter){ for(i=0; inSeg; i++){ fts5SegIterClear(&pIter->aSeg[i]); } - fts5StructureRelease(pIter->pStruct); fts5BufferFree(&pIter->poslist); sqlite3_free(pIter); } @@ -208388,7 +217404,8 @@ static void fts5SegiterPoslist( Fts5Colset *pColset, Fts5Buffer *pBuf ){ - if( 0==fts5BufferGrow(&p->rc, pBuf, pSeg->nPos) ){ + if( 0==fts5BufferGrow(&p->rc, pBuf, pSeg->nPos+FTS5_DATA_ZERO_PADDING) ){ + memset(&pBuf->p[pBuf->n+pSeg->nPos], 0, FTS5_DATA_ZERO_PADDING); if( pColset==0 ){ fts5ChunkIterate(p, pSeg, (void*)pBuf, fts5PoslistCallback); }else{ @@ -208686,9 +217703,7 @@ static void fts5MultiIterNew( if( pNew==0 ) return; pNew->bRev = (0!=(flags & FTS5INDEX_QUERY_DESC)); pNew->bSkipEmpty = (0!=(flags & FTS5INDEX_QUERY_SKIPEMPTY)); - pNew->pStruct = pStruct; pNew->pColset = pColset; - fts5StructureRef(pStruct); if( (flags & FTS5INDEX_QUERY_NOOUTPUT)==0 ){ fts5IterSetOutputCb(&p->rc, pNew); } @@ -208866,24 +217881,24 @@ static int fts5AllocateSegid(Fts5Index *p, Fts5Structure *pStruct){ for(iLvl=0; iLvlnLevel; iLvl++){ for(iSeg=0; iSegaLevel[iLvl].nSeg; iSeg++){ int iId = pStruct->aLevel[iLvl].aSeg[iSeg].iSegid; - if( iId<=FTS5_MAX_SEGMENT ){ - aUsed[(iId-1) / 32] |= 1 << ((iId-1) % 32); + if( iId<=FTS5_MAX_SEGMENT && iId>0 ){ + aUsed[(iId-1) / 32] |= (u32)1 << ((iId-1) % 32); } } } for(i=0; aUsed[i]==0xFFFFFFFF; i++); mask = aUsed[i]; - for(iSegid=0; mask & (1 << iSegid); iSegid++); + for(iSegid=0; mask & ((u32)1 << iSegid); iSegid++); iSegid += 1 + i*32; #ifdef SQLITE_DEBUG for(iLvl=0; iLvlnLevel; iLvl++){ for(iSeg=0; iSegaLevel[iLvl].nSeg; iSeg++){ - assert( iSegid!=pStruct->aLevel[iLvl].aSeg[iSeg].iSegid ); + assert_nc( iSegid!=pStruct->aLevel[iLvl].aSeg[iSeg].iSegid ); } } - assert( iSegid>0 && iSegid<=FTS5_MAX_SEGMENT ); + assert_nc( iSegid>0 && iSegid<=FTS5_MAX_SEGMENT ); { sqlite3_stmt *pIdxSelect = fts5IdxSelectStmt(p); @@ -208891,7 +217906,7 @@ static int fts5AllocateSegid(Fts5Index *p, Fts5Structure *pStruct){ u8 aBlob[2] = {0xff, 0xff}; sqlite3_bind_int(pIdxSelect, 1, iSegid); sqlite3_bind_blob(pIdxSelect, 2, aBlob, 2, SQLITE_STATIC); - assert( sqlite3_step(pIdxSelect)!=SQLITE_ROW ); + assert_nc( sqlite3_step(pIdxSelect)!=SQLITE_ROW ); p->rc = sqlite3_reset(pIdxSelect); sqlite3_bind_null(pIdxSelect, 2); } @@ -208961,13 +217976,13 @@ static int fts5WriteDlidxGrow( int nLvl ){ if( p->rc==SQLITE_OK && nLvl>=pWriter->nDlidx ){ - Fts5DlidxWriter *aDlidx = (Fts5DlidxWriter*)sqlite3_realloc( + Fts5DlidxWriter *aDlidx = (Fts5DlidxWriter*)sqlite3_realloc64( pWriter->aDlidx, sizeof(Fts5DlidxWriter) * nLvl ); if( aDlidx==0 ){ p->rc = SQLITE_NOMEM; }else{ - int nByte = sizeof(Fts5DlidxWriter) * (nLvl - pWriter->nDlidx); + size_t nByte = sizeof(Fts5DlidxWriter) * (nLvl - pWriter->nDlidx); memset(&aDlidx[pWriter->nDlidx], 0, nByte); pWriter->aDlidx = aDlidx; pWriter->nDlidx = nLvl; @@ -209040,8 +218055,10 @@ static void fts5WriteBtreeTerm( int nTerm, const u8 *pTerm /* First term on new page */ ){ fts5WriteFlushBtree(p, pWriter); - fts5BufferSet(&p->rc, &pWriter->btterm, nTerm, pTerm); - pWriter->iBtPage = pWriter->writer.pgno; + if( p->rc==SQLITE_OK ){ + fts5BufferSet(&p->rc, &pWriter->btterm, nTerm, pTerm); + pWriter->iBtPage = pWriter->writer.pgno; + } } /* @@ -209192,6 +218209,7 @@ static void fts5WriteAppendTerm( int nPrefix; /* Bytes of prefix compression for term */ Fts5PageWriter *pPage = &pWriter->writer; Fts5Buffer *pPgidx = &pWriter->writer.pgidx; + int nMin = MIN(pPage->term.n, nTerm); assert( p->rc==SQLITE_OK ); assert( pPage->buf.n>=4 ); @@ -209201,6 +218219,7 @@ static void fts5WriteAppendTerm( if( (pPage->buf.n + pPgidx->n + nTerm + 2)>=p->pConfig->pgsz ){ if( pPage->buf.n>4 ){ fts5WriteFlushLeaf(p, pWriter); + if( p->rc!=SQLITE_OK ) return; } fts5BufferGrow(&p->rc, &pPage->buf, nTerm+FTS5_DATA_PADDING); } @@ -209233,13 +218252,14 @@ static void fts5WriteAppendTerm( ** inefficient, but still correct. */ int n = nTerm; if( pPage->term.n ){ - n = 1 + fts5PrefixCompress(pPage->term.n, pPage->term.p, pTerm); + n = 1 + fts5PrefixCompress(nMin, pPage->term.p, pTerm); } fts5WriteBtreeTerm(p, pWriter, n, pTerm); + if( p->rc!=SQLITE_OK ) return; pPage = &pWriter->writer; } }else{ - nPrefix = fts5PrefixCompress(pPage->term.n, pPage->term.p, pTerm); + nPrefix = fts5PrefixCompress(nMin, pPage->term.p, pTerm); fts5BufferAppendVarint(&p->rc, &pPage->buf, nPrefix); } @@ -209286,7 +218306,7 @@ static void fts5WriteAppendRowid( if( pWriter->bFirstRowidInDoclist || pWriter->bFirstRowidInPage ){ fts5BufferAppendVarint(&p->rc, &pPage->buf, iRowid); }else{ - assert( p->rc || iRowid>pWriter->iPrevRowid ); + assert_nc( p->rc || iRowid>pWriter->iPrevRowid ); fts5BufferAppendVarint(&p->rc, &pPage->buf, iRowid - pWriter->iPrevRowid); } pWriter->iPrevRowid = iRowid; @@ -209408,7 +218428,7 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){ int i; Fts5Buffer buf; memset(&buf, 0, sizeof(Fts5Buffer)); - for(i=0; inSeg; i++){ + for(i=0; inSeg && p->rc==SQLITE_OK; i++){ Fts5SegIter *pSeg = &pIter->aSeg[i]; if( pSeg->pSeg==0 ){ /* no-op */ @@ -209426,35 +218446,44 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){ u8 aHdr[4] = {0x00, 0x00, 0x00, 0x00}; iLeafRowid = FTS5_SEGMENT_ROWID(iId, pSeg->iTermLeafPgno); - pData = fts5DataRead(p, iLeafRowid); + pData = fts5LeafRead(p, iLeafRowid); if( pData ){ - fts5BufferZero(&buf); - fts5BufferGrow(&p->rc, &buf, pData->nn); - fts5BufferAppendBlob(&p->rc, &buf, sizeof(aHdr), aHdr); - fts5BufferAppendVarint(&p->rc, &buf, pSeg->term.n); - fts5BufferAppendBlob(&p->rc, &buf, pSeg->term.n, pSeg->term.p); - fts5BufferAppendBlob(&p->rc, &buf, pData->szLeaf-iOff, &pData->p[iOff]); - if( p->rc==SQLITE_OK ){ - /* Set the szLeaf field */ - fts5PutU16(&buf.p[2], (u16)buf.n); - } + if( iOff>pData->szLeaf ){ + /* This can occur if the pages that the segments occupy overlap - if + ** a single page has been assigned to more than one segment. In + ** this case a prior iteration of this loop may have corrupted the + ** segment currently being trimmed. */ + p->rc = FTS5_CORRUPT; + }else{ + fts5BufferZero(&buf); + fts5BufferGrow(&p->rc, &buf, pData->nn); + fts5BufferAppendBlob(&p->rc, &buf, sizeof(aHdr), aHdr); + fts5BufferAppendVarint(&p->rc, &buf, pSeg->term.n); + fts5BufferAppendBlob(&p->rc, &buf, pSeg->term.n, pSeg->term.p); + fts5BufferAppendBlob(&p->rc, &buf, pData->szLeaf-iOff,&pData->p[iOff]); + if( p->rc==SQLITE_OK ){ + /* Set the szLeaf field */ + fts5PutU16(&buf.p[2], (u16)buf.n); + } - /* Set up the new page-index array */ - fts5BufferAppendVarint(&p->rc, &buf, 4); - if( pSeg->iLeafPgno==pSeg->iTermLeafPgno - && pSeg->iEndofDoclistszLeaf - ){ - int nDiff = pData->szLeaf - pSeg->iEndofDoclist; - fts5BufferAppendVarint(&p->rc, &buf, buf.n - 1 - nDiff - 4); - fts5BufferAppendBlob(&p->rc, &buf, - pData->nn - pSeg->iPgidxOff, &pData->p[pSeg->iPgidxOff] - ); - } + /* Set up the new page-index array */ + fts5BufferAppendVarint(&p->rc, &buf, 4); + if( pSeg->iLeafPgno==pSeg->iTermLeafPgno + && pSeg->iEndofDoclistszLeaf + && pSeg->iPgidxOff<=pData->nn + ){ + int nDiff = pData->szLeaf - pSeg->iEndofDoclist; + fts5BufferAppendVarint(&p->rc, &buf, buf.n - 1 - nDiff - 4); + fts5BufferAppendBlob(&p->rc, &buf, + pData->nn - pSeg->iPgidxOff, &pData->p[pSeg->iPgidxOff] + ); + } + pSeg->pSeg->pgnoFirst = pSeg->iTermLeafPgno; + fts5DataDelete(p, FTS5_SEGMENT_ROWID(iId, 1), iLeafRowid); + fts5DataWrite(p, iLeafRowid, buf.p, buf.n); + } fts5DataRelease(pData); - pSeg->pSeg->pgnoFirst = pSeg->iTermLeafPgno; - fts5DataDelete(p, FTS5_SEGMENT_ROWID(iId, 1), iLeafRowid); - fts5DataWrite(p, iLeafRowid, buf.p, buf.n); } } } @@ -209546,7 +218575,7 @@ static void fts5IndexMergeLevel( const u8 *pTerm; pTerm = fts5MultiIterTerm(pIter, &nTerm); - if( nTerm!=term.n || memcmp(pTerm, term.p, nTerm) ){ + if( nTerm!=term.n || fts5Memcmp(pTerm, term.p, nTerm) ){ if( pnRem && writer.nLeafWritten>nRem ){ break; } @@ -209801,6 +218830,7 @@ static void fts5FlushOneHash(Fts5Index *p){ /* Write the term for this entry to disk. */ sqlite3Fts5HashScanEntry(pHash, &zTerm, &pDoclist, &nDoclist); fts5WriteAppendTerm(p, &writer, (int)strlen(zTerm), (const u8*)zTerm); + if( p->rc!=SQLITE_OK ) break; assert( writer.bFirstRowidInPage==0 ); if( pgsz>=(pBuf->n + pPgidx->n + nDoclist + 1) ){ @@ -209823,6 +218853,7 @@ static void fts5FlushOneHash(Fts5Index *p){ pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iRowid); writer.bFirstRowidInPage = 0; fts5WriteDlidxAppend(p, &writer, iRowid); + if( p->rc!=SQLITE_OK ) break; }else{ pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iDelta); } @@ -209880,7 +218911,7 @@ static void fts5FlushOneHash(Fts5Index *p){ /* TODO2: Doclist terminator written here. */ /* pBuf->p[pBuf->n++] = '\0'; */ assert( pBuf->n<=pBuf->nSpace ); - sqlite3Fts5HashScanNext(pHash); + if( p->rc==SQLITE_OK ) sqlite3Fts5HashScanNext(pHash); } sqlite3Fts5HashClear(pHash); fts5WriteFinish(p, &writer, &pgnoLast); @@ -209924,7 +218955,7 @@ static Fts5Structure *fts5IndexOptimizeStruct( Fts5Structure *pStruct ){ Fts5Structure *pNew = 0; - int nByte = sizeof(Fts5Structure); + sqlite3_int64 nByte = sizeof(Fts5Structure); int nSeg = pStruct->nSegment; int i; @@ -210054,11 +219085,13 @@ static void fts5AppendPoslist( Fts5Buffer *pBuf ){ int nData = pMulti->base.nData; + int nByte = nData + 9 + 9 + FTS5_DATA_ZERO_PADDING; assert( nData>0 ); - if( p->rc==SQLITE_OK && 0==fts5BufferGrow(&p->rc, pBuf, nData+9+9) ){ + if( p->rc==SQLITE_OK && 0==fts5BufferGrow(&p->rc, pBuf, nByte) ){ fts5BufferSafeAppendVarint(pBuf, iDelta); fts5BufferSafeAppendVarint(pBuf, nData*2); fts5BufferSafeAppendBlob(pBuf, pMulti->base.pData, nData); + memset(&pBuf->p[pBuf->n], 0, FTS5_DATA_ZERO_PADDING); } } @@ -210211,8 +219244,14 @@ static void fts5MergePrefixLists( ** first rowid in one input is a large negative number, and the first in ** the other a non-negative number, the delta for the non-negative ** number will be larger on disk than the literal integer value - ** was. */ - if( sqlite3Fts5BufferSize(&p->rc, &out, p1->n + p2->n + 9) ) return; + ** was. + ** + ** Or, if the input position-lists are corrupt, then the output might + ** include up to 2 extra 10-byte positions created by interpreting -1 + ** (the value PoslistNext64() uses for EOF) as a position and appending + ** it to the output. This can happen at most once for each input + ** position-list, hence two 10 byte paddings. */ + if( sqlite3Fts5BufferSize(&p->rc, &out, p1->n + p2->n + 9+10+10) ) return; fts5DoclistIterInit(p1, &i1); fts5DoclistIterInit(p2, &i2); @@ -210223,6 +219262,7 @@ static void fts5MergePrefixLists( fts5BufferSafeAppendBlob(&out, i1.aPoslist, i1.nPoslist+i1.nSize); fts5DoclistIterNext(&i1); if( i1.aPoslist==0 ) break; + assert( out.n<=((i1.aPoslist-p1->p) + (i2.aPoslist-p2->p)+9+10+10) ); } else if( i2.iRowid!=i1.iRowid ){ /* Copy entry from i2 */ @@ -210230,6 +219270,7 @@ static void fts5MergePrefixLists( fts5BufferSafeAppendBlob(&out, i2.aPoslist, i2.nPoslist+i2.nSize); fts5DoclistIterNext(&i2); if( i2.aPoslist==0 ) break; + assert( out.n<=((i1.aPoslist-p1->p) + (i2.aPoslist-p2->p)+9+10+10) ); } else{ /* Merge the two position lists. */ @@ -210239,19 +219280,24 @@ static void fts5MergePrefixLists( int iOff2 = 0; u8 *a1 = &i1.aPoslist[i1.nSize]; u8 *a2 = &i2.aPoslist[i2.nSize]; + int nCopy; + u8 *aCopy; i64 iPrev = 0; Fts5PoslistWriter writer; memset(&writer, 0, sizeof(writer)); + /* See the earlier comment in this function for an explanation of why + ** corrupt input position lists might cause the output to consume + ** at most 20 bytes of unexpected space. */ fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid); fts5BufferZero(&tmp); - sqlite3Fts5BufferSize(&p->rc, &tmp, i1.nPoslist + i2.nPoslist); + sqlite3Fts5BufferSize(&p->rc, &tmp, i1.nPoslist + i2.nPoslist + 10 + 10); if( p->rc ) break; sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1); sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2); - assert( iPos1>=0 && iPos2>=0 ); + assert_nc( iPos1>=0 && iPos2>=0 ); if( iPos1=0 && iPos2>=0 ){ while( 1 ){ if( iPos1=0 && iPos2!=iPrev ); + assert_nc( iPos2>=0 && iPos2!=iPrev ); sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos2); - fts5BufferSafeAppendBlob(&tmp, &a2[iOff2], i2.nPoslist-iOff2); + aCopy = &a2[iOff2]; + nCopy = i2.nPoslist - iOff2; + } + if( nCopy>0 ){ + fts5BufferSafeAppendBlob(&tmp, aCopy, nCopy); } /* WRITEPOSLISTSIZE */ + assert_nc( tmp.n<=i1.nPoslist+i2.nPoslist ); + assert( tmp.n<=i1.nPoslist+i2.nPoslist+10+10 ); + if( tmp.n>i1.nPoslist+i2.nPoslist ){ + if( p->rc==SQLITE_OK ) p->rc = FTS5_CORRUPT; + break; + } fts5BufferSafeAppendVarint(&out, tmp.n * 2); fts5BufferSafeAppendBlob(&out, tmp.p, tmp.n); fts5DoclistIterNext(&i1); fts5DoclistIterNext(&i2); + assert_nc( out.n<=(p1->n+p2->n+9) ); if( i1.aPoslist==0 || i2.aPoslist==0 ) break; + assert( out.n<=((i1.aPoslist-p1->p) + (i2.aPoslist-p2->p)+9+10+10) ); } } @@ -210306,7 +219364,7 @@ static void fts5MergePrefixLists( fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid); fts5BufferSafeAppendBlob(&out, i2.aPoslist, i2.aEof - i2.aPoslist); } - assert( out.n<=(p1->n+p2->n+9) ); + assert_nc( out.n<=(p1->n+p2->n+9) ); fts5BufferSet(&p->rc, p1, out.n, out.p); fts5BufferFree(&tmp); @@ -210395,7 +219453,7 @@ static void fts5SetupPrefixIter( } fts5MultiIterFree(p1); - pData = fts5IdxMalloc(p, sizeof(Fts5Data) + doclist.n); + pData = fts5IdxMalloc(p, sizeof(Fts5Data)+doclist.n+FTS5_DATA_ZERO_PADDING); if( pData ){ pData->p = (u8*)&pData[1]; pData->nn = pData->szLeaf = doclist.n; @@ -210441,7 +219499,7 @@ static int sqlite3Fts5IndexBeginWrite(Fts5Index *p, int bDelete, i64 iRowid){ static int sqlite3Fts5IndexSync(Fts5Index *p){ assert( p->rc==SQLITE_OK ); fts5IndexFlush(p); - fts5CloseReader(p); + sqlite3Fts5IndexCloseReader(p); return fts5IndexReturn(p); } @@ -210452,7 +219510,7 @@ static int sqlite3Fts5IndexSync(Fts5Index *p){ ** records must be invalidated. */ static int sqlite3Fts5IndexRollback(Fts5Index *p){ - fts5CloseReader(p); + sqlite3Fts5IndexCloseReader(p); fts5IndexDiscardData(p); fts5StructureInvalidate(p); /* assert( p->rc==SQLITE_OK ); */ @@ -210467,6 +219525,7 @@ static int sqlite3Fts5IndexRollback(Fts5Index *p){ static int sqlite3Fts5IndexReinit(Fts5Index *p){ Fts5Structure s; fts5StructureInvalidate(p); + fts5IndexDiscardData(p); memset(&s, 0, sizeof(Fts5Structure)); fts5DataWrite(p, FTS5_AVERAGES_ROWID, (const u8*)"", 0); fts5StructureWrite(p, &s); @@ -210554,9 +219613,13 @@ static int sqlite3Fts5IndexCharlenToBytelen( for(i=0; i=nByte ) return 0; /* Input contains fewer than nChar chars */ if( (unsigned char)p[n++]>=0xc0 ){ + if( n>=nByte ) return 0; while( (p[n] & 0xc0)==0x80 ){ n++; - if( n>=nByte ) break; + if( n>=nByte ){ + if( i+1==nChar ) break; + return 0; + } } } } @@ -210692,10 +219755,10 @@ static int sqlite3Fts5IndexQuery( if( p->rc ){ sqlite3Fts5IterClose((Fts5IndexIter*)pRet); pRet = 0; - fts5CloseReader(p); + sqlite3Fts5IndexCloseReader(p); } - *ppIter = &pRet->base; + *ppIter = (Fts5IndexIter*)pRet; sqlite3Fts5BufferFree(&buf); } return fts5IndexReturn(p); @@ -210765,7 +219828,7 @@ static void sqlite3Fts5IterClose(Fts5IndexIter *pIndexIter){ Fts5Iter *pIter = (Fts5Iter*)pIndexIter; Fts5Index *pIndex = pIter->pIndex; fts5MultiIterFree(pIter); - fts5CloseReader(pIndex); + sqlite3Fts5IndexCloseReader(pIndex); } } @@ -210958,6 +220021,37 @@ static int fts5QueryCksum( return rc; } +/* +** Check if buffer z[], size n bytes, contains as series of valid utf-8 +** encoded codepoints. If so, return 0. Otherwise, if the buffer does not +** contain valid utf-8, return non-zero. +*/ +static int fts5TestUtf8(const char *z, int n){ + int i = 0; + assert_nc( n>0 ); + while( i=n || (z[i+1] & 0xC0)!=0x80 ) return 1; + i += 2; + }else + if( (z[i] & 0xF0)==0xE0 ){ + if( i+2>=n || (z[i+1] & 0xC0)!=0x80 || (z[i+2] & 0xC0)!=0x80 ) return 1; + i += 3; + }else + if( (z[i] & 0xF8)==0xF0 ){ + if( i+3>=n || (z[i+1] & 0xC0)!=0x80 || (z[i+2] & 0xC0)!=0x80 ) return 1; + if( (z[i+2] & 0xC0)!=0x80 ) return 1; + i += 3; + }else{ + return 1; + } + } + + return 0; +} /* ** This function is also purely an internal test. It does not contribute to @@ -210998,8 +220092,14 @@ static void fts5TestTerm( ** This check may only be performed if the hash table is empty. This ** is because the hash table only supports a single scan query at ** a time, and the multi-iter loop from which this function is called - ** is already performing such a scan. */ - if( p->nPendingData==0 ){ + ** is already performing such a scan. + ** + ** Also only do this if buffer zTerm contains nTerm bytes of valid + ** utf-8. Otherwise, the last part of the buffer contents might contain + ** a non-utf-8 sequence that happens to be a prefix of a valid utf-8 + ** character stored in the main fts index, which will cause the + ** test to fail. */ + if( p->nPendingData==0 && 0==fts5TestUtf8(zTerm, nTerm) ){ if( iIdx>0 && rc==SQLITE_OK ){ int f = flags|FTS5INDEX_QUERY_TEST_NOIDX; ck2 = 0; @@ -211122,7 +220222,8 @@ static void fts5IndexIntegrityCheckSegment( if( pSeg->pgnoFirst==0 ) return; fts5IndexPrepareStmt(p, &pStmt, sqlite3_mprintf( - "SELECT segid, term, (pgno>>1), (pgno&1) FROM %Q.'%q_idx' WHERE segid=%d", + "SELECT segid, term, (pgno>>1), (pgno&1) FROM %Q.'%q_idx' WHERE segid=%d " + "ORDER BY 1, 2", pConfig->zDb, pConfig->zName, pSeg->iSegid )); @@ -211131,8 +220232,8 @@ static void fts5IndexIntegrityCheckSegment( i64 iRow; /* Rowid for this leaf */ Fts5Data *pLeaf; /* Data for this leaf */ + const char *zIdxTerm = (const char*)sqlite3_column_blob(pStmt, 1); int nIdxTerm = sqlite3_column_bytes(pStmt, 1); - const char *zIdxTerm = (const char*)sqlite3_column_text(pStmt, 1); int iIdxLeaf = sqlite3_column_int(pStmt, 2); int bIdxDlidx = sqlite3_column_int(pStmt, 3); @@ -211157,11 +220258,11 @@ static void fts5IndexIntegrityCheckSegment( iOff = fts5LeafFirstTermOff(pLeaf); iRowidOff = fts5LeafFirstRowidOff(pLeaf); - if( iRowidOff>=iOff ){ + if( iRowidOff>=iOff || iOff>=pLeaf->szLeaf ){ p->rc = FTS5_CORRUPT; }else{ iOff += fts5GetVarint32(&pLeaf->p[iOff], nTerm); - res = memcmp(&pLeaf->p[iOff], zIdxTerm, MIN(nTerm, nIdxTerm)); + res = fts5Memcmp(&pLeaf->p[iOff], zIdxTerm, MIN(nTerm, nIdxTerm)); if( res==0 ) res = nTerm - nIdxTerm; if( res<0 ) p->rc = FTS5_CORRUPT; } @@ -211556,7 +220657,7 @@ static void fts5DecodeFunction( u8 *a = 0; Fts5Buffer s; /* Build up text to return here */ int rc = SQLITE_OK; /* Return code */ - int nSpace = 0; + sqlite3_int64 nSpace = 0; int eDetailNone = (sqlite3_user_data(pCtx)!=0); assert( nArg==2 ); @@ -211572,8 +220673,7 @@ static void fts5DecodeFunction( nSpace = n + FTS5_DATA_ZERO_PADDING; a = (u8*)sqlite3Fts5MallocZero(&rc, nSpace); if( a==0 ) goto decode_out; - memcpy(a, aBlob, n); - + if( n>0 ) memcpy(a, aBlob, n); fts5DecodeRowid(iRowid, &iSegid, &bDlidx, &iHeight, &iPgno); @@ -211668,6 +220768,9 @@ static void fts5DecodeFunction( iPgidxOff = szLeaf = fts5GetU16(&a[2]); if( iPgidxOffn ){ + rc = FTS5_CORRUPT; + goto decode_out; } } @@ -211679,14 +220782,22 @@ static void fts5DecodeFunction( }else{ iOff = szLeaf; } + if( iOff>n ){ + rc = FTS5_CORRUPT; + goto decode_out; + } fts5DecodePoslist(&rc, &s, &a[4], iOff-4); /* Decode any more doclist data that appears on the page before the ** first term. */ nDoclist = (iTermOff ? iTermOff : szLeaf) - iOff; + if( nDoclist+iOff>n ){ + rc = FTS5_CORRUPT; + goto decode_out; + } fts5DecodeDoclist(&rc, &s, &a[iOff], nDoclist); - while( iPgidxOffszLeaf ){ + rc = FTS5_CORRUPT; + break; + } if( bFirst==0 ){ iOff += fts5GetVarint32(&a[iOff], nByte); + if( nByte>term.n ){ + rc = FTS5_CORRUPT; + break; + } term.n = nByte; } iOff += fts5GetVarint32(&a[iOff], nByte); + if( iOff+nByte>n ){ + rc = FTS5_CORRUPT; + break; + } fts5BufferAppendBlob(&rc, &term, nByte, &a[iOff]); iOff += nByte; @@ -211830,8 +220953,8 @@ SQLITE_API int sqlite3_fts5_may_be_corrupt = 1; typedef struct Fts5Auxdata Fts5Auxdata; typedef struct Fts5Auxiliary Fts5Auxiliary; typedef struct Fts5Cursor Fts5Cursor; +typedef struct Fts5FullTable Fts5FullTable; typedef struct Fts5Sorter Fts5Sorter; -typedef struct Fts5Table Fts5Table; typedef struct Fts5TokenizerModule Fts5TokenizerModule; /* @@ -211912,13 +221035,8 @@ struct Fts5TokenizerModule { Fts5TokenizerModule *pNext; /* Next registered tokenizer module */ }; -/* -** Virtual-table object. -*/ -struct Fts5Table { - sqlite3_vtab base; /* Base class used by SQLite core */ - Fts5Config *pConfig; /* Virtual table configuration */ - Fts5Index *pIndex; /* Full-text index */ +struct Fts5FullTable { + Fts5Table p; /* Public class members from fts5Int.h */ Fts5Storage *pStorage; /* Document store */ Fts5Global *pGlobal; /* Global (connection wide) data */ Fts5Cursor *pSortCsr; /* Sort data from this cursor */ @@ -212056,7 +221174,7 @@ struct Fts5Auxdata { #define FTS5_SAVEPOINT 5 #define FTS5_RELEASE 6 #define FTS5_ROLLBACKTO 7 -static void fts5CheckTransactionState(Fts5Table *p, int op, int iSavepoint){ +static void fts5CheckTransactionState(Fts5FullTable *p, int op, int iSavepoint){ switch( op ){ case FTS5_BEGIN: assert( p->ts.eState==0 ); @@ -212095,8 +221213,11 @@ static void fts5CheckTransactionState(Fts5Table *p, int op, int iSavepoint){ case FTS5_ROLLBACKTO: assert( p->ts.eState==1 ); - assert( iSavepoint>=0 ); - assert( iSavepoint<=p->ts.iSavepoint ); + assert( iSavepoint>=-1 ); + /* The following assert() can fail if another vtab strikes an error + ** within an xSavepoint() call then SQLite calls xRollbackTo() - without + ** having called xSavepoint() on this vtab. */ + /* assert( iSavepoint<=p->ts.iSavepoint ); */ p->ts.iSavepoint = iSavepoint; break; } @@ -212108,18 +221229,18 @@ static void fts5CheckTransactionState(Fts5Table *p, int op, int iSavepoint){ /* ** Return true if pTab is a contentless table. */ -static int fts5IsContentless(Fts5Table *pTab){ - return pTab->pConfig->eContent==FTS5_CONTENT_NONE; +static int fts5IsContentless(Fts5FullTable *pTab){ + return pTab->p.pConfig->eContent==FTS5_CONTENT_NONE; } /* ** Delete a virtual table handle allocated by fts5InitVtab(). */ -static void fts5FreeVtab(Fts5Table *pTab){ +static void fts5FreeVtab(Fts5FullTable *pTab){ if( pTab ){ - sqlite3Fts5IndexClose(pTab->pIndex); + sqlite3Fts5IndexClose(pTab->p.pIndex); sqlite3Fts5StorageClose(pTab->pStorage); - sqlite3Fts5ConfigFree(pTab->pConfig); + sqlite3Fts5ConfigFree(pTab->p.pConfig); sqlite3_free(pTab); } } @@ -212128,7 +221249,7 @@ static void fts5FreeVtab(Fts5Table *pTab){ ** The xDisconnect() virtual table method. */ static int fts5DisconnectMethod(sqlite3_vtab *pVtab){ - fts5FreeVtab((Fts5Table*)pVtab); + fts5FreeVtab((Fts5FullTable*)pVtab); return SQLITE_OK; } @@ -212139,7 +221260,7 @@ static int fts5DestroyMethod(sqlite3_vtab *pVtab){ Fts5Table *pTab = (Fts5Table*)pVtab; int rc = sqlite3Fts5DropAll(pTab->pConfig); if( rc==SQLITE_OK ){ - fts5FreeVtab((Fts5Table*)pVtab); + fts5FreeVtab((Fts5FullTable*)pVtab); } return rc; } @@ -212168,28 +221289,28 @@ static int fts5InitVtab( const char **azConfig = (const char**)argv; int rc = SQLITE_OK; /* Return code */ Fts5Config *pConfig = 0; /* Results of parsing argc/argv */ - Fts5Table *pTab = 0; /* New virtual table object */ + Fts5FullTable *pTab = 0; /* New virtual table object */ /* Allocate the new vtab object and parse the configuration */ - pTab = (Fts5Table*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5Table)); + pTab = (Fts5FullTable*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5FullTable)); if( rc==SQLITE_OK ){ rc = sqlite3Fts5ConfigParse(pGlobal, db, argc, azConfig, &pConfig, pzErr); assert( (rc==SQLITE_OK && *pzErr==0) || pConfig==0 ); } if( rc==SQLITE_OK ){ - pTab->pConfig = pConfig; + pTab->p.pConfig = pConfig; pTab->pGlobal = pGlobal; } /* Open the index sub-system */ if( rc==SQLITE_OK ){ - rc = sqlite3Fts5IndexOpen(pConfig, bCreate, &pTab->pIndex, pzErr); + rc = sqlite3Fts5IndexOpen(pConfig, bCreate, &pTab->p.pIndex, pzErr); } /* Open the storage sub-system */ if( rc==SQLITE_OK ){ rc = sqlite3Fts5StorageOpen( - pConfig, pTab->pIndex, bCreate, &pTab->pStorage, pzErr + pConfig, pTab->p.pIndex, bCreate, &pTab->pStorage, pzErr ); } @@ -212202,8 +221323,8 @@ static int fts5InitVtab( if( rc==SQLITE_OK ){ assert( pConfig->pzErrmsg==0 ); pConfig->pzErrmsg = pzErr; - rc = sqlite3Fts5IndexLoadConfig(pTab->pIndex); - sqlite3Fts5IndexRollback(pTab->pIndex); + rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex); + sqlite3Fts5IndexRollback(pTab->p.pIndex); pConfig->pzErrmsg = 0; } @@ -212272,17 +221393,39 @@ static void fts5SetUniqueFlag(sqlite3_index_info *pIdxInfo){ ** Implementation of the xBestIndex method for FTS5 tables. Within the ** WHERE constraint, it searches for the following: ** -** 1. A MATCH constraint against the special column. +** 1. A MATCH constraint against the table column. ** 2. A MATCH constraint against the "rank" column. -** 3. An == constraint against the rowid column. -** 4. A < or <= constraint against the rowid column. -** 5. A > or >= constraint against the rowid column. +** 3. A MATCH constraint against some other column. +** 4. An == constraint against the rowid column. +** 5. A < or <= constraint against the rowid column. +** 6. A > or >= constraint against the rowid column. ** -** Within the ORDER BY, either: +** Within the ORDER BY, the following are supported: ** ** 5. ORDER BY rank [ASC|DESC] ** 6. ORDER BY rowid [ASC|DESC] ** +** Information for the xFilter call is passed via both the idxNum and +** idxStr variables. Specifically, idxNum is a bitmask of the following +** flags used to encode the ORDER BY clause: +** +** FTS5_BI_ORDER_RANK +** FTS5_BI_ORDER_ROWID +** FTS5_BI_ORDER_DESC +** +** idxStr is used to encode data from the WHERE clause. For each argument +** passed to the xFilter method, the following is appended to idxStr: +** +** Match against table column: "m" +** Match against rank column: "r" +** Match against other column: "" +** Equality constraint against the rowid: "=" +** A < or <= against the rowid: "<" +** A > or >= against the rowid: ">" +** +** This function ensures that there is at most one "r" or "=". And that if +** there exists an "=" then there is no "<" or ">". +** ** Costs are assigned as follows: ** ** a) If an unusable MATCH operator is present in the WHERE clause, the @@ -212310,32 +221453,18 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ Fts5Config *pConfig = pTab->pConfig; const int nCol = pConfig->nCol; int idxFlags = 0; /* Parameter passed through to xFilter() */ - int bHasMatch; - int iNext; int i; - struct Constraint { - int op; /* Mask against sqlite3_index_constraint.op */ - int fts5op; /* FTS5 mask for idxFlags */ - int iCol; /* 0==rowid, 1==tbl, 2==rank */ - int omit; /* True to omit this if found */ - int iConsIndex; /* Index in pInfo->aConstraint[] */ - } aConstraint[] = { - {SQLITE_INDEX_CONSTRAINT_MATCH|SQLITE_INDEX_CONSTRAINT_EQ, - FTS5_BI_MATCH, 1, 1, -1}, - {SQLITE_INDEX_CONSTRAINT_MATCH|SQLITE_INDEX_CONSTRAINT_EQ, - FTS5_BI_RANK, 2, 1, -1}, - {SQLITE_INDEX_CONSTRAINT_EQ, FTS5_BI_ROWID_EQ, 0, 0, -1}, - {SQLITE_INDEX_CONSTRAINT_LT|SQLITE_INDEX_CONSTRAINT_LE, - FTS5_BI_ROWID_LE, 0, 0, -1}, - {SQLITE_INDEX_CONSTRAINT_GT|SQLITE_INDEX_CONSTRAINT_GE, - FTS5_BI_ROWID_GE, 0, 0, -1}, - }; + char *idxStr; + int iIdxStr = 0; + int iCons = 0; + + int bSeenEq = 0; + int bSeenGt = 0; + int bSeenLt = 0; + int bSeenMatch = 0; + int bSeenRank = 0; - int aColMap[3]; - aColMap[0] = -1; - aColMap[1] = nCol; - aColMap[2] = nCol+1; assert( SQLITE_INDEX_CONSTRAINT_EQbLock ){ + pTab->base.zErrMsg = sqlite3_mprintf( + "recursively defined fts5 content table" + ); + return SQLITE_ERROR; + } + + idxStr = (char*)sqlite3_malloc(pInfo->nConstraint * 6 + 1); + if( idxStr==0 ) return SQLITE_NOMEM; + pInfo->idxStr = idxStr; + pInfo->needToFreeIdxStr = 1; + for(i=0; inConstraint; i++){ struct sqlite3_index_constraint *p = &pInfo->aConstraint[i]; int iCol = p->iColumn; - - if( (p->op==SQLITE_INDEX_CONSTRAINT_MATCH && iCol>=0 && iCol<=nCol) - || (p->op==SQLITE_INDEX_CONSTRAINT_EQ && iCol==nCol) + if( p->op==SQLITE_INDEX_CONSTRAINT_MATCH + || (p->op==SQLITE_INDEX_CONSTRAINT_EQ && iCol>=nCol) ){ /* A MATCH operator or equivalent */ - if( p->usable ){ - idxFlags = (idxFlags & 0xFFFF) | FTS5_BI_MATCH | (iCol << 16); - aConstraint[0].iConsIndex = i; - }else{ + if( p->usable==0 || iCol<0 ){ /* As there exists an unusable MATCH constraint this is an ** unusable plan. Set a prohibitively high cost. */ pInfo->estimatedCost = 1e50; + assert( iIdxStr < pInfo->nConstraint*6 + 1 ); + idxStr[iIdxStr] = 0; return SQLITE_OK; + }else{ + if( iCol==nCol+1 ){ + if( bSeenRank ) continue; + idxStr[iIdxStr++] = 'r'; + bSeenRank = 1; + }else{ + bSeenMatch = 1; + idxStr[iIdxStr++] = 'm'; + if( iColaConstraintUsage[i].argvIndex = ++iCons; + pInfo->aConstraintUsage[i].omit = 1; } - }else if( p->op<=SQLITE_INDEX_CONSTRAINT_MATCH ){ - int j; - for(j=1; jiCol] && (p->op & pC->op) && p->usable ){ - pC->iConsIndex = i; - idxFlags |= pC->fts5op; + } + else if( p->usable && bSeenEq==0 + && p->op==SQLITE_INDEX_CONSTRAINT_EQ && iCol<0 + ){ + idxStr[iIdxStr++] = '='; + bSeenEq = 1; + pInfo->aConstraintUsage[i].argvIndex = ++iCons; + } + } + + if( bSeenEq==0 ){ + for(i=0; inConstraint; i++){ + struct sqlite3_index_constraint *p = &pInfo->aConstraint[i]; + if( p->iColumn<0 && p->usable ){ + int op = p->op; + if( op==SQLITE_INDEX_CONSTRAINT_LT || op==SQLITE_INDEX_CONSTRAINT_LE ){ + if( bSeenLt ) continue; + idxStr[iIdxStr++] = '<'; + pInfo->aConstraintUsage[i].argvIndex = ++iCons; + bSeenLt = 1; + }else + if( op==SQLITE_INDEX_CONSTRAINT_GT || op==SQLITE_INDEX_CONSTRAINT_GE ){ + if( bSeenGt ) continue; + idxStr[iIdxStr++] = '>'; + pInfo->aConstraintUsage[i].argvIndex = ++iCons; + bSeenGt = 1; } } } } + idxStr[iIdxStr] = '\0'; /* Set idxFlags flags for the ORDER BY clause */ if( pInfo->nOrderBy==1 ){ int iSort = pInfo->aOrderBy[0].iColumn; - if( iSort==(pConfig->nCol+1) && BitFlagTest(idxFlags, FTS5_BI_MATCH) ){ + if( iSort==(pConfig->nCol+1) && bSeenMatch ){ idxFlags |= FTS5_BI_ORDER_RANK; }else if( iSort==-1 ){ idxFlags |= FTS5_BI_ORDER_ROWID; @@ -212390,33 +221564,22 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ } /* Calculate the estimated cost based on the flags set in idxFlags. */ - bHasMatch = BitFlagTest(idxFlags, FTS5_BI_MATCH); - if( BitFlagTest(idxFlags, FTS5_BI_ROWID_EQ) ){ - pInfo->estimatedCost = bHasMatch ? 100.0 : 10.0; - if( bHasMatch==0 ) fts5SetUniqueFlag(pInfo); - }else if( BitFlagAllTest(idxFlags, FTS5_BI_ROWID_LE|FTS5_BI_ROWID_GE) ){ - pInfo->estimatedCost = bHasMatch ? 500.0 : 250000.0; - }else if( BitFlagTest(idxFlags, FTS5_BI_ROWID_LE|FTS5_BI_ROWID_GE) ){ - pInfo->estimatedCost = bHasMatch ? 750.0 : 750000.0; + if( bSeenEq ){ + pInfo->estimatedCost = bSeenMatch ? 100.0 : 10.0; + if( bSeenMatch==0 ) fts5SetUniqueFlag(pInfo); + }else if( bSeenLt && bSeenGt ){ + pInfo->estimatedCost = bSeenMatch ? 500.0 : 250000.0; + }else if( bSeenLt || bSeenGt ){ + pInfo->estimatedCost = bSeenMatch ? 750.0 : 750000.0; }else{ - pInfo->estimatedCost = bHasMatch ? 1000.0 : 1000000.0; - } - - /* Assign argvIndex values to each constraint in use. */ - iNext = 1; - for(i=0; iiConsIndex>=0 ){ - pInfo->aConstraintUsage[pC->iConsIndex].argvIndex = iNext++; - pInfo->aConstraintUsage[pC->iConsIndex].omit = (unsigned char)pC->omit; - } + pInfo->estimatedCost = bSeenMatch ? 1000.0 : 1000000.0; } pInfo->idxNum = idxFlags; return SQLITE_OK; } -static int fts5NewTransaction(Fts5Table *pTab){ +static int fts5NewTransaction(Fts5FullTable *pTab){ Fts5Cursor *pCsr; for(pCsr=pTab->pGlobal->pCsr; pCsr; pCsr=pCsr->pNext){ if( pCsr->base.pVtab==(sqlite3_vtab*)pTab ) return SQLITE_OK; @@ -212428,19 +221591,19 @@ static int fts5NewTransaction(Fts5Table *pTab){ ** Implementation of xOpen method. */ static int fts5OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ - Fts5Table *pTab = (Fts5Table*)pVTab; - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)pVTab; + Fts5Config *pConfig = pTab->p.pConfig; Fts5Cursor *pCsr = 0; /* New cursor object */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ int rc; /* Return code */ rc = fts5NewTransaction(pTab); if( rc==SQLITE_OK ){ nByte = sizeof(Fts5Cursor) + pConfig->nCol * sizeof(int); - pCsr = (Fts5Cursor*)sqlite3_malloc(nByte); + pCsr = (Fts5Cursor*)sqlite3_malloc64(nByte); if( pCsr ){ Fts5Global *pGlobal = pTab->pGlobal; - memset(pCsr, 0, nByte); + memset(pCsr, 0, (size_t)nByte); pCsr->aColumnSize = (int*)&pCsr[1]; pCsr->pNext = pGlobal->pCsr; pGlobal->pCsr = pCsr; @@ -212475,7 +221638,7 @@ static void fts5CsrNewrow(Fts5Cursor *pCsr){ } static void fts5FreeCursorComponents(Fts5Cursor *pCsr){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); Fts5Auxdata *pData; Fts5Auxdata *pNext; @@ -212509,6 +221672,7 @@ static void fts5FreeCursorComponents(Fts5Cursor *pCsr){ sqlite3_free(pCsr->zRankArgs); } + sqlite3Fts5IndexCloseReader(pTab->p.pIndex); memset(&pCsr->ePlan, 0, sizeof(Fts5Cursor) - ((u8*)&pCsr->ePlan - (u8*)pCsr)); } @@ -212519,7 +221683,7 @@ static void fts5FreeCursorComponents(Fts5Cursor *pCsr){ */ static int fts5CloseMethod(sqlite3_vtab_cursor *pCursor){ if( pCursor ){ - Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCursor->pVtab); Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; Fts5Cursor **pp; @@ -212576,7 +221740,7 @@ static int fts5SorterNext(Fts5Cursor *pCsr){ ** Set the FTS5CSR_REQUIRE_RESEEK flag on all FTS5_PLAN_MATCH cursors ** open on table pTab. */ -static void fts5TripCursors(Fts5Table *pTab){ +static void fts5TripCursors(Fts5FullTable *pTab){ Fts5Cursor *pCsr; for(pCsr=pTab->pGlobal->pCsr; pCsr; pCsr=pCsr->pNext){ if( pCsr->ePlan==FTS5_PLAN_MATCH @@ -212603,11 +221767,11 @@ static int fts5CursorReseek(Fts5Cursor *pCsr, int *pbSkip){ int rc = SQLITE_OK; assert( *pbSkip==0 ); if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_RESEEK) ){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); int bDesc = pCsr->bDesc; i64 iRowid = sqlite3Fts5ExprRowid(pCsr->pExpr); - rc = sqlite3Fts5ExprFirst(pCsr->pExpr, pTab->pIndex, iRowid, bDesc); + rc = sqlite3Fts5ExprFirst(pCsr->pExpr, pTab->p.pIndex, iRowid, bDesc); if( rc==SQLITE_OK && iRowid!=sqlite3Fts5ExprRowid(pCsr->pExpr) ){ *pbSkip = 1; } @@ -212659,15 +221823,24 @@ static int fts5NextMethod(sqlite3_vtab_cursor *pCursor){ break; } - default: + default: { + Fts5Config *pConfig = ((Fts5Table*)pCursor->pVtab)->pConfig; + pConfig->bLock++; rc = sqlite3_step(pCsr->pStmt); + pConfig->bLock--; if( rc!=SQLITE_ROW ){ CsrFlagSet(pCsr, FTS5CSR_EOF); rc = sqlite3_reset(pCsr->pStmt); + if( rc!=SQLITE_OK ){ + pCursor->pVtab->zErrMsg = sqlite3_mprintf( + "%s", sqlite3_errmsg(pConfig->db) + ); + } }else{ rc = SQLITE_OK; } break; + } } } @@ -212704,20 +221877,24 @@ static int fts5PrepareStatement( return rc; } -static int fts5CursorFirstSorted(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ - Fts5Config *pConfig = pTab->pConfig; +static int fts5CursorFirstSorted( + Fts5FullTable *pTab, + Fts5Cursor *pCsr, + int bDesc +){ + Fts5Config *pConfig = pTab->p.pConfig; Fts5Sorter *pSorter; int nPhrase; - int nByte; + sqlite3_int64 nByte; int rc; const char *zRank = pCsr->zRank; const char *zRankArgs = pCsr->zRankArgs; nPhrase = sqlite3Fts5ExprPhraseCount(pCsr->pExpr); nByte = sizeof(Fts5Sorter) + sizeof(int) * (nPhrase-1); - pSorter = (Fts5Sorter*)sqlite3_malloc(nByte); + pSorter = (Fts5Sorter*)sqlite3_malloc64(nByte); if( pSorter==0 ) return SQLITE_NOMEM; - memset(pSorter, 0, nByte); + memset(pSorter, 0, (size_t)nByte); pSorter->nIdx = nPhrase; /* TODO: It would be better to have some system for reusing statement @@ -212728,7 +221905,7 @@ static int fts5CursorFirstSorted(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ ** ** If SQLite a built-in statement cache, this wouldn't be a problem. */ rc = fts5PrepareStatement(&pSorter->pStmt, pConfig, - "SELECT rowid, rank FROM %Q.%Q ORDER BY %s(%s%s%s) %s", + "SELECT rowid, rank FROM %Q.%Q ORDER BY %s(\"%w\"%s%s) %s", pConfig->zDb, pConfig->zName, zRank, pConfig->zName, (zRankArgs ? ", " : ""), (zRankArgs ? zRankArgs : ""), @@ -212752,10 +221929,10 @@ static int fts5CursorFirstSorted(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ return rc; } -static int fts5CursorFirst(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ +static int fts5CursorFirst(Fts5FullTable *pTab, Fts5Cursor *pCsr, int bDesc){ int rc; Fts5Expr *pExpr = pCsr->pExpr; - rc = sqlite3Fts5ExprFirst(pExpr, pTab->pIndex, pCsr->iFirstRowid, bDesc); + rc = sqlite3Fts5ExprFirst(pExpr, pTab->p.pIndex, pCsr->iFirstRowid, bDesc); if( sqlite3Fts5ExprEof(pExpr) ){ CsrFlagSet(pCsr, FTS5CSR_EOF); } @@ -212770,7 +221947,7 @@ static int fts5CursorFirst(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ ** parameters. */ static int fts5SpecialMatch( - Fts5Table *pTab, + Fts5FullTable *pTab, Fts5Cursor *pCsr, const char *zQuery ){ @@ -212781,18 +221958,18 @@ static int fts5SpecialMatch( while( z[0]==' ' ) z++; for(n=0; z[n] && z[n]!=' '; n++); - assert( pTab->base.zErrMsg==0 ); + assert( pTab->p.base.zErrMsg==0 ); pCsr->ePlan = FTS5_PLAN_SPECIAL; - if( 0==sqlite3_strnicmp("reads", z, n) ){ - pCsr->iSpecial = sqlite3Fts5IndexReads(pTab->pIndex); + if( n==5 && 0==sqlite3_strnicmp("reads", z, n) ){ + pCsr->iSpecial = sqlite3Fts5IndexReads(pTab->p.pIndex); } - else if( 0==sqlite3_strnicmp("id", z, n) ){ + else if( n==2 && 0==sqlite3_strnicmp("id", z, n) ){ pCsr->iSpecial = pCsr->iCsrId; } else{ /* An unrecognized directive. Return an error message. */ - pTab->base.zErrMsg = sqlite3_mprintf("unknown special query: %.*s", n, z); + pTab->p.base.zErrMsg = sqlite3_mprintf("unknown special query: %.*s", n, z); rc = SQLITE_ERROR; } @@ -212804,7 +221981,7 @@ static int fts5SpecialMatch( ** pTab. If one is found, return a pointer to the corresponding Fts5Auxiliary ** structure. Otherwise, if no such function exists, return NULL. */ -static Fts5Auxiliary *fts5FindAuxiliary(Fts5Table *pTab, const char *zName){ +static Fts5Auxiliary *fts5FindAuxiliary(Fts5FullTable *pTab, const char *zName){ Fts5Auxiliary *pAux; for(pAux=pTab->pGlobal->pAux; pAux; pAux=pAux->pNext){ @@ -212817,8 +221994,8 @@ static Fts5Auxiliary *fts5FindAuxiliary(Fts5Table *pTab, const char *zName){ static int fts5FindRankFunction(Fts5Cursor *pCsr){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); + Fts5Config *pConfig = pTab->p.pConfig; int rc = SQLITE_OK; Fts5Auxiliary *pAux = 0; const char *zRank = pCsr->zRank; @@ -212834,7 +222011,7 @@ static int fts5FindRankFunction(Fts5Cursor *pCsr){ assert( rc==SQLITE_OK || pCsr->pRankArgStmt==0 ); if( rc==SQLITE_OK ){ if( SQLITE_ROW==sqlite3_step(pStmt) ){ - int nByte; + sqlite3_int64 nByte; pCsr->nRankArg = sqlite3_column_count(pStmt); nByte = sizeof(sqlite3_value*)*pCsr->nRankArg; pCsr->apRankArg = (sqlite3_value**)sqlite3Fts5MallocZero(&rc, nByte); @@ -212856,8 +222033,8 @@ static int fts5FindRankFunction(Fts5Cursor *pCsr){ if( rc==SQLITE_OK ){ pAux = fts5FindAuxiliary(pTab, zRank); if( pAux==0 ){ - assert( pTab->base.zErrMsg==0 ); - pTab->base.zErrMsg = sqlite3_mprintf("no such function: %s", zRank); + assert( pTab->p.base.zErrMsg==0 ); + pTab->p.base.zErrMsg = sqlite3_mprintf("no such function: %s", zRank); rc = SQLITE_ERROR; } } @@ -212928,27 +222105,32 @@ static i64 fts5GetRowidLimit(sqlite3_value *pVal, i64 iDefault){ static int fts5FilterMethod( sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ int idxNum, /* Strategy index */ - const char *zUnused, /* Unused */ + const char *idxStr, /* Unused */ int nVal, /* Number of elements in apVal */ sqlite3_value **apVal /* Arguments for the indexing scheme */ ){ - Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCursor->pVtab); + Fts5Config *pConfig = pTab->p.pConfig; Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; int rc = SQLITE_OK; /* Error code */ - int iVal = 0; /* Counter for apVal[] */ int bDesc; /* True if ORDER BY [rank|rowid] DESC */ int bOrderByRank; /* True if ORDER BY rank */ - sqlite3_value *pMatch = 0; /* MATCH ? expression (or NULL) */ sqlite3_value *pRank = 0; /* rank MATCH ? expression (or NULL) */ sqlite3_value *pRowidEq = 0; /* rowid = ? expression (or NULL) */ sqlite3_value *pRowidLe = 0; /* rowid <= ? expression (or NULL) */ sqlite3_value *pRowidGe = 0; /* rowid >= ? expression (or NULL) */ int iCol; /* Column on LHS of MATCH operator */ char **pzErrmsg = pConfig->pzErrmsg; + int i; + int iIdxStr = 0; + Fts5Expr *pExpr = 0; - UNUSED_PARAM(zUnused); - UNUSED_PARAM(nVal); + if( pConfig->bLock ){ + pTab->p.base.zErrMsg = sqlite3_mprintf( + "recursively defined fts5 content table" + ); + return SQLITE_ERROR; + } if( pCsr->ePlan ){ fts5FreeCursorComponents(pCsr); @@ -212961,23 +222143,60 @@ static int fts5FilterMethod( assert( pCsr->pRank==0 ); assert( pCsr->zRank==0 ); assert( pCsr->zRankArgs==0 ); + assert( pTab->pSortCsr==0 || nVal==0 ); - assert( pzErrmsg==0 || pzErrmsg==&pTab->base.zErrMsg ); - pConfig->pzErrmsg = &pTab->base.zErrMsg; + assert( pzErrmsg==0 || pzErrmsg==&pTab->p.base.zErrMsg ); + pConfig->pzErrmsg = &pTab->p.base.zErrMsg; - /* Decode the arguments passed through to this function. - ** - ** Note: The following set of if(...) statements must be in the same - ** order as the corresponding entries in the struct at the top of - ** fts5BestIndexMethod(). */ - if( BitFlagTest(idxNum, FTS5_BI_MATCH) ) pMatch = apVal[iVal++]; - if( BitFlagTest(idxNum, FTS5_BI_RANK) ) pRank = apVal[iVal++]; - if( BitFlagTest(idxNum, FTS5_BI_ROWID_EQ) ) pRowidEq = apVal[iVal++]; - if( BitFlagTest(idxNum, FTS5_BI_ROWID_LE) ) pRowidLe = apVal[iVal++]; - if( BitFlagTest(idxNum, FTS5_BI_ROWID_GE) ) pRowidGe = apVal[iVal++]; - iCol = (idxNum>>16); - assert( iCol>=0 && iCol<=pConfig->nCol ); - assert( iVal==nVal ); + /* Decode the arguments passed through to this function. */ + for(i=0; i='0' && idxStr[iIdxStr]<='9' ){ + iCol = 0; + do{ + iCol = iCol*10 + (idxStr[iIdxStr]-'0'); + iIdxStr++; + }while( idxStr[iIdxStr]>='0' && idxStr[iIdxStr]<='9' ); + }else{ + iCol = pConfig->nCol; + } + + if( zText[0]=='*' ){ + /* The user has issued a query of the form "MATCH '*...'". This + ** indicates that the MATCH expression is not a full text query, + ** but a request for an internal parameter. */ + rc = fts5SpecialMatch(pTab, pCsr, &zText[1]); + goto filter_out; + }else{ + char **pzErr = &pTab->p.base.zErrMsg; + rc = sqlite3Fts5ExprNew(pConfig, iCol, zText, &pExpr, pzErr); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5ExprAnd(&pCsr->pExpr, pExpr); + pExpr = 0; + } + if( rc!=SQLITE_OK ) goto filter_out; + } + + break; + } + case '=': + pRowidEq = apVal[i]; + break; + case '<': + pRowidLe = apVal[i]; + break; + default: assert( idxStr[iIdxStr-1]=='>' ); + pRowidGe = apVal[i]; + break; + } + } bOrderByRank = ((idxNum & FTS5_BI_ORDER_RANK) ? 1 : 0); pCsr->bDesc = bDesc = ((idxNum & FTS5_BI_ORDER_DESC) ? 1 : 0); @@ -213004,7 +222223,7 @@ static int fts5FilterMethod( ** (pCursor) is used to execute the query issued by function ** fts5CursorFirstSorted() above. */ assert( pRowidEq==0 && pRowidLe==0 && pRowidGe==0 && pRank==0 ); - assert( nVal==0 && pMatch==0 && bOrderByRank==0 && bDesc==0 ); + assert( nVal==0 && bOrderByRank==0 && bDesc==0 ); assert( pCsr->iLastRowid==LARGEST_INT64 ); assert( pCsr->iFirstRowid==SMALLEST_INT64 ); if( pTab->pSortCsr->bDesc ){ @@ -213017,29 +222236,15 @@ static int fts5FilterMethod( pCsr->ePlan = FTS5_PLAN_SOURCE; pCsr->pExpr = pTab->pSortCsr->pExpr; rc = fts5CursorFirst(pTab, pCsr, bDesc); - }else if( pMatch ){ - const char *zExpr = (const char*)sqlite3_value_text(apVal[0]); - if( zExpr==0 ) zExpr = ""; - + }else if( pCsr->pExpr ){ rc = fts5CursorParseRank(pConfig, pCsr, pRank); if( rc==SQLITE_OK ){ - if( zExpr[0]=='*' ){ - /* The user has issued a query of the form "MATCH '*...'". This - ** indicates that the MATCH expression is not a full text query, - ** but a request for an internal parameter. */ - rc = fts5SpecialMatch(pTab, pCsr, &zExpr[1]); + if( bOrderByRank ){ + pCsr->ePlan = FTS5_PLAN_SORTED_MATCH; + rc = fts5CursorFirstSorted(pTab, pCsr, bDesc); }else{ - char **pzErr = &pTab->base.zErrMsg; - rc = sqlite3Fts5ExprNew(pConfig, iCol, zExpr, &pCsr->pExpr, pzErr); - if( rc==SQLITE_OK ){ - if( bOrderByRank ){ - pCsr->ePlan = FTS5_PLAN_SORTED_MATCH; - rc = fts5CursorFirstSorted(pTab, pCsr, bDesc); - }else{ - pCsr->ePlan = FTS5_PLAN_MATCH; - rc = fts5CursorFirst(pTab, pCsr, bDesc); - } - } + pCsr->ePlan = FTS5_PLAN_MATCH; + rc = fts5CursorFirst(pTab, pCsr, bDesc); } } }else if( pConfig->zContent==0 ){ @@ -213052,11 +222257,11 @@ static int fts5FilterMethod( ** by rowid (ePlan==FTS5_PLAN_ROWID). */ pCsr->ePlan = (pRowidEq ? FTS5_PLAN_ROWID : FTS5_PLAN_SCAN); rc = sqlite3Fts5StorageStmt( - pTab->pStorage, fts5StmtType(pCsr), &pCsr->pStmt, &pTab->base.zErrMsg + pTab->pStorage, fts5StmtType(pCsr), &pCsr->pStmt, &pTab->p.base.zErrMsg ); if( rc==SQLITE_OK ){ if( pCsr->ePlan==FTS5_PLAN_ROWID ){ - sqlite3_bind_value(pCsr->pStmt, 1, apVal[0]); + sqlite3_bind_value(pCsr->pStmt, 1, pRowidEq); }else{ sqlite3_bind_int64(pCsr->pStmt, 1, pCsr->iFirstRowid); sqlite3_bind_int64(pCsr->pStmt, 2, pCsr->iLastRowid); @@ -213065,6 +222270,8 @@ static int fts5FilterMethod( } } + filter_out: + sqlite3Fts5ExprFree(pExpr); pConfig->pzErrmsg = pzErrmsg; return rc; } @@ -213135,20 +222342,23 @@ static int fts5SeekCursor(Fts5Cursor *pCsr, int bErrormsg){ /* If the cursor does not yet have a statement handle, obtain one now. */ if( pCsr->pStmt==0 ){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); int eStmt = fts5StmtType(pCsr); rc = sqlite3Fts5StorageStmt( - pTab->pStorage, eStmt, &pCsr->pStmt, (bErrormsg?&pTab->base.zErrMsg:0) + pTab->pStorage, eStmt, &pCsr->pStmt, (bErrormsg?&pTab->p.base.zErrMsg:0) ); - assert( rc!=SQLITE_OK || pTab->base.zErrMsg==0 ); + assert( rc!=SQLITE_OK || pTab->p.base.zErrMsg==0 ); assert( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_CONTENT) ); } if( rc==SQLITE_OK && CsrFlagTest(pCsr, FTS5CSR_REQUIRE_CONTENT) ){ + Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); assert( pCsr->pExpr ); sqlite3_reset(pCsr->pStmt); sqlite3_bind_int64(pCsr->pStmt, 1, fts5CursorRowid(pCsr)); + pTab->pConfig->bLock++; rc = sqlite3_step(pCsr->pStmt); + pTab->pConfig->bLock--; if( rc==SQLITE_ROW ){ rc = SQLITE_OK; CsrFlagClear(pCsr, FTS5CSR_REQUIRE_CONTENT); @@ -213156,17 +222366,21 @@ static int fts5SeekCursor(Fts5Cursor *pCsr, int bErrormsg){ rc = sqlite3_reset(pCsr->pStmt); if( rc==SQLITE_OK ){ rc = FTS5_CORRUPT; + }else if( pTab->pConfig->pzErrmsg ){ + *pTab->pConfig->pzErrmsg = sqlite3_mprintf( + "%s", sqlite3_errmsg(pTab->pConfig->db) + ); } } } return rc; } -static void fts5SetVtabError(Fts5Table *p, const char *zFormat, ...){ +static void fts5SetVtabError(Fts5FullTable *p, const char *zFormat, ...){ va_list ap; /* ... printf arguments */ va_start(ap, zFormat); - assert( p->base.zErrMsg==0 ); - p->base.zErrMsg = sqlite3_vmprintf(zFormat, ap); + assert( p->p.base.zErrMsg==0 ); + p->p.base.zErrMsg = sqlite3_vmprintf(zFormat, ap); va_end(ap); } @@ -213186,11 +222400,11 @@ static void fts5SetVtabError(Fts5Table *p, const char *zFormat, ...){ ** more commands are added to this function. */ static int fts5SpecialInsert( - Fts5Table *pTab, /* Fts5 table object */ + Fts5FullTable *pTab, /* Fts5 table object */ const char *zCmd, /* Text inserted into table-name column */ sqlite3_value *pVal /* Value inserted into rank column */ ){ - Fts5Config *pConfig = pTab->pConfig; + Fts5Config *pConfig = pTab->p.pConfig; int rc = SQLITE_OK; int bError = 0; @@ -213225,9 +222439,9 @@ static int fts5SpecialInsert( pConfig->bPrefixIndex = sqlite3_value_int(pVal); #endif }else{ - rc = sqlite3Fts5IndexLoadConfig(pTab->pIndex); + rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex); if( rc==SQLITE_OK ){ - rc = sqlite3Fts5ConfigSetValue(pTab->pConfig, zCmd, pVal, &bError); + rc = sqlite3Fts5ConfigSetValue(pTab->p.pConfig, zCmd, pVal, &bError); } if( rc==SQLITE_OK ){ if( bError ){ @@ -213241,7 +222455,7 @@ static int fts5SpecialInsert( } static int fts5SpecialDelete( - Fts5Table *pTab, + Fts5FullTable *pTab, sqlite3_value **apVal ){ int rc = SQLITE_OK; @@ -213255,7 +222469,7 @@ static int fts5SpecialDelete( static void fts5StorageInsert( int *pRc, - Fts5Table *pTab, + Fts5FullTable *pTab, sqlite3_value **apVal, i64 *piRowid ){ @@ -213289,8 +222503,8 @@ static int fts5UpdateMethod( sqlite3_value **apVal, /* Array of arguments */ sqlite_int64 *pRowid /* OUT: The affected (or effected) rowid */ ){ - Fts5Table *pTab = (Fts5Table*)pVtab; - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; + Fts5Config *pConfig = pTab->p.pConfig; int eType0; /* value_type() of apVal[0] */ int rc = SQLITE_OK; /* Return code */ @@ -213299,12 +222513,11 @@ static int fts5UpdateMethod( assert( pVtab->zErrMsg==0 ); assert( nArg==1 || nArg==(2+pConfig->nCol+2) ); - assert( nArg==1 - || sqlite3_value_type(apVal[1])==SQLITE_INTEGER - || sqlite3_value_type(apVal[1])==SQLITE_NULL + assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER + || sqlite3_value_type(apVal[0])==SQLITE_NULL ); - assert( pTab->pConfig->pzErrmsg==0 ); - pTab->pConfig->pzErrmsg = &pTab->base.zErrMsg; + assert( pTab->p.pConfig->pzErrmsg==0 ); + pTab->p.pConfig->pzErrmsg = &pTab->p.base.zErrMsg; /* Put any active cursors into REQUIRE_SEEK state. */ fts5TripCursors(pTab); @@ -213345,7 +222558,7 @@ static int fts5UpdateMethod( /* Filter out attempts to run UPDATE or DELETE on contentless tables. ** This is not suported. */ if( eType0==SQLITE_INTEGER && fts5IsContentless(pTab) ){ - pTab->base.zErrMsg = sqlite3_mprintf( + pTab->p.base.zErrMsg = sqlite3_mprintf( "cannot %s contentless fts5 table: %s", (nArg>1 ? "UPDATE" : "DELETE from"), pConfig->zName ); @@ -213358,46 +222571,52 @@ static int fts5UpdateMethod( rc = sqlite3Fts5StorageDelete(pTab->pStorage, iDel, 0); } - /* INSERT */ - else if( eType0!=SQLITE_INTEGER ){ - /* If this is a REPLACE, first remove the current entry (if any) */ - if( eConflict==SQLITE_REPLACE - && sqlite3_value_type(apVal[1])==SQLITE_INTEGER - ){ - i64 iNew = sqlite3_value_int64(apVal[1]); /* Rowid to delete */ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); + /* INSERT or UPDATE */ + else{ + int eType1 = sqlite3_value_numeric_type(apVal[1]); + + if( eType1!=SQLITE_INTEGER && eType1!=SQLITE_NULL ){ + rc = SQLITE_MISMATCH; } - fts5StorageInsert(&rc, pTab, apVal, pRowid); - } - /* UPDATE */ - else{ - i64 iOld = sqlite3_value_int64(apVal[0]); /* Old rowid */ - i64 iNew = sqlite3_value_int64(apVal[1]); /* New rowid */ - if( iOld!=iNew ){ - if( eConflict==SQLITE_REPLACE ){ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); - if( rc==SQLITE_OK ){ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); - } - fts5StorageInsert(&rc, pTab, apVal, pRowid); - }else{ - rc = sqlite3Fts5StorageContentInsert(pTab->pStorage, apVal, pRowid); - if( rc==SQLITE_OK ){ + else if( eType0!=SQLITE_INTEGER ){ + /* If this is a REPLACE, first remove the current entry (if any) */ + if( eConflict==SQLITE_REPLACE && eType1==SQLITE_INTEGER ){ + i64 iNew = sqlite3_value_int64(apVal[1]); /* Rowid to delete */ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); + } + fts5StorageInsert(&rc, pTab, apVal, pRowid); + } + + /* UPDATE */ + else{ + i64 iOld = sqlite3_value_int64(apVal[0]); /* Old rowid */ + i64 iNew = sqlite3_value_int64(apVal[1]); /* New rowid */ + if( eType1==SQLITE_INTEGER && iOld!=iNew ){ + if( eConflict==SQLITE_REPLACE ){ rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); + } + fts5StorageInsert(&rc, pTab, apVal, pRowid); + }else{ + rc = sqlite3Fts5StorageContentInsert(pTab->pStorage, apVal, pRowid); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageIndexInsert(pTab->pStorage, apVal,*pRowid); + } } - if( rc==SQLITE_OK ){ - rc = sqlite3Fts5StorageIndexInsert(pTab->pStorage, apVal, *pRowid); - } + }else{ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + fts5StorageInsert(&rc, pTab, apVal, pRowid); } - }else{ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); - fts5StorageInsert(&rc, pTab, apVal, pRowid); } } } - pTab->pConfig->pzErrmsg = 0; + pTab->p.pConfig->pzErrmsg = 0; return rc; } @@ -213406,12 +222625,12 @@ static int fts5UpdateMethod( */ static int fts5SyncMethod(sqlite3_vtab *pVtab){ int rc; - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; fts5CheckTransactionState(pTab, FTS5_SYNC, 0); - pTab->pConfig->pzErrmsg = &pTab->base.zErrMsg; + pTab->p.pConfig->pzErrmsg = &pTab->p.base.zErrMsg; fts5TripCursors(pTab); rc = sqlite3Fts5StorageSync(pTab->pStorage); - pTab->pConfig->pzErrmsg = 0; + pTab->p.pConfig->pzErrmsg = 0; return rc; } @@ -213419,8 +222638,8 @@ static int fts5SyncMethod(sqlite3_vtab *pVtab){ ** Implementation of xBegin() method. */ static int fts5BeginMethod(sqlite3_vtab *pVtab){ - fts5CheckTransactionState((Fts5Table*)pVtab, FTS5_BEGIN, 0); - fts5NewTransaction((Fts5Table*)pVtab); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_BEGIN, 0); + fts5NewTransaction((Fts5FullTable*)pVtab); return SQLITE_OK; } @@ -213431,7 +222650,7 @@ static int fts5BeginMethod(sqlite3_vtab *pVtab){ */ static int fts5CommitMethod(sqlite3_vtab *pVtab){ UNUSED_PARAM(pVtab); /* Call below is a no-op for NDEBUG builds */ - fts5CheckTransactionState((Fts5Table*)pVtab, FTS5_COMMIT, 0); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_COMMIT, 0); return SQLITE_OK; } @@ -213441,7 +222660,7 @@ static int fts5CommitMethod(sqlite3_vtab *pVtab){ */ static int fts5RollbackMethod(sqlite3_vtab *pVtab){ int rc; - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; fts5CheckTransactionState(pTab, FTS5_ROLLBACK, 0); rc = sqlite3Fts5StorageRollback(pTab->pStorage); return rc; @@ -213465,13 +222684,13 @@ static int fts5ApiColumnTotalSize( sqlite3_int64 *pnToken ){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); return sqlite3Fts5StorageSize(pTab->pStorage, iCol, pnToken); } static int fts5ApiRowCount(Fts5Context *pCtx, i64 *pnRow){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); return sqlite3Fts5StorageRowCount(pTab->pStorage, pnRow); } @@ -213506,7 +222725,9 @@ static int fts5ApiColumnText( ){ int rc = SQLITE_OK; Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - if( fts5IsContentless((Fts5Table*)(pCsr->base.pVtab)) ){ + if( fts5IsContentless((Fts5FullTable*)(pCsr->base.pVtab)) + || pCsr->ePlan==FTS5_PLAN_SPECIAL + ){ *pz = 0; *pn = 0; }else{ @@ -213575,10 +222796,11 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ int rc = SQLITE_OK; Fts5PoslistReader *aIter; /* One iterator for each phrase */ int nIter; /* Number of iterators/phrases */ + int nCol = ((Fts5Table*)pCsr->base.pVtab)->pConfig->nCol; nIter = sqlite3Fts5ExprPhraseCount(pCsr->pExpr); if( pCsr->aInstIter==0 ){ - int nByte = sizeof(Fts5PoslistReader) * nIter; + sqlite3_int64 nByte = sizeof(Fts5PoslistReader) * nIter; pCsr->aInstIter = (Fts5PoslistReader*)sqlite3Fts5MallocZero(&rc, nByte); } aIter = pCsr->aInstIter; @@ -213613,7 +222835,7 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ nInst++; if( nInst>=pCsr->nInstAlloc ){ pCsr->nInstAlloc = pCsr->nInstAlloc ? pCsr->nInstAlloc*2 : 32; - aInst = (int*)sqlite3_realloc( + aInst = (int*)sqlite3_realloc64( pCsr->aInst, pCsr->nInstAlloc*sizeof(int)*3 ); if( aInst ){ @@ -213628,6 +222850,10 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ aInst[0] = iBest; aInst[1] = FTS5_POS2COLUMN(aIter[iBest].iPos); aInst[2] = FTS5_POS2OFFSET(aIter[iBest].iPos); + if( aInst[1]<0 || aInst[1]>=nCol ){ + rc = FTS5_CORRUPT; + break; + } sqlite3Fts5PoslistReaderNext(&aIter[iBest]); } } @@ -213700,8 +222926,8 @@ static int fts5ColumnSizeCb( static int fts5ApiColumnSize(Fts5Context *pCtx, int iCol, int *pnToken){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); + Fts5Config *pConfig = pTab->p.pConfig; int rc = SQLITE_OK; if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_DOCSIZE) ){ @@ -213957,7 +223183,7 @@ static int fts5ApiQueryPhrase( int(*xCallback)(const Fts5ExtensionApi*, Fts5Context*, void*) ){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); int rc; Fts5Cursor *pNew = 0; @@ -214023,7 +223249,7 @@ static void fts5ApiCallback( iCsrId = sqlite3_value_int64(argv[0]); pCsr = fts5CursorFromCsrid(pAux->pGlobal, iCsrId); - if( pCsr==0 ){ + if( pCsr==0 || pCsr->ePlan==0 ){ char *zErr = sqlite3_mprintf("no such cursor: %lld", iCsrId); sqlite3_result_error(context, zErr, -1); sqlite3_free(zErr); @@ -214034,25 +223260,19 @@ static void fts5ApiCallback( /* -** Given cursor id iId, return a pointer to the corresponding Fts5Index +** Given cursor id iId, return a pointer to the corresponding Fts5Table ** object. Or NULL If the cursor id does not exist. -** -** If successful, set *ppConfig to point to the associated config object -** before returning. */ -static Fts5Index *sqlite3Fts5IndexFromCsrid( +static Fts5Table *sqlite3Fts5TableFromCsrid( Fts5Global *pGlobal, /* FTS5 global context for db handle */ - i64 iCsrId, /* Id of cursor to find */ - Fts5Config **ppConfig /* OUT: Configuration object */ + i64 iCsrId /* Id of cursor to find */ ){ Fts5Cursor *pCsr; - Fts5Table *pTab; - pCsr = fts5CursorFromCsrid(pGlobal, iCsrId); - pTab = (Fts5Table*)pCsr->base.pVtab; - *ppConfig = pTab->pConfig; - - return pTab->pIndex; + if( pCsr ){ + return (Fts5Table*)pCsr->base.pVtab; + } + return 0; } /* @@ -214132,8 +223352,8 @@ static int fts5ColumnMethod( sqlite3_context *pCtx, /* Context for sqlite3_result_xxx() calls */ int iCol /* Index of column to read value from */ ){ - Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCursor->pVtab); + Fts5Config *pConfig = pTab->p.pConfig; Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; int rc = SQLITE_OK; @@ -214165,10 +223385,12 @@ static int fts5ColumnMethod( } } }else if( !fts5IsContentless(pTab) ){ + pConfig->pzErrmsg = &pTab->p.base.zErrMsg; rc = fts5SeekCursor(pCsr, 1); if( rc==SQLITE_OK ){ sqlite3_result_value(pCtx, sqlite3_column_value(pCsr->pStmt, iCol+1)); } + pConfig->pzErrmsg = 0; } return rc; } @@ -214185,7 +223407,7 @@ static int fts5FindFunctionMethod( void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */ void **ppArg /* OUT: User data for *pxFunc */ ){ - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; Fts5Auxiliary *pAux; UNUSED_PARAM(nUnused); @@ -214207,21 +223429,24 @@ static int fts5RenameMethod( sqlite3_vtab *pVtab, /* Virtual table handle */ const char *zName /* New name of table */ ){ - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; return sqlite3Fts5StorageRename(pTab->pStorage, zName); } +static int sqlite3Fts5FlushToDisk(Fts5Table *pTab){ + fts5TripCursors((Fts5FullTable*)pTab); + return sqlite3Fts5StorageSync(((Fts5FullTable*)pTab)->pStorage); +} + /* ** The xSavepoint() method. ** ** Flush the contents of the pending-terms table to disk. */ static int fts5SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ - Fts5Table *pTab = (Fts5Table*)pVtab; UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ - fts5CheckTransactionState(pTab, FTS5_SAVEPOINT, iSavepoint); - fts5TripCursors(pTab); - return sqlite3Fts5StorageSync(pTab->pStorage); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_SAVEPOINT, iSavepoint); + return sqlite3Fts5FlushToDisk((Fts5Table*)pVtab); } /* @@ -214230,11 +223455,9 @@ static int fts5SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ ** This is a no-op. */ static int fts5ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ - Fts5Table *pTab = (Fts5Table*)pVtab; UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ - fts5CheckTransactionState(pTab, FTS5_RELEASE, iSavepoint); - fts5TripCursors(pTab); - return sqlite3Fts5StorageSync(pTab->pStorage); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_RELEASE, iSavepoint); + return sqlite3Fts5FlushToDisk((Fts5Table*)pVtab); } /* @@ -214243,7 +223466,7 @@ static int fts5ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ ** Discard the contents of the pending terms table. */ static int fts5RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ fts5CheckTransactionState(pTab, FTS5_ROLLBACKTO, iSavepoint); fts5TripCursors(pTab); @@ -214264,14 +223487,14 @@ static int fts5CreateAux( int rc = sqlite3_overload_function(pGlobal->db, zName, -1); if( rc==SQLITE_OK ){ Fts5Auxiliary *pAux; - int nName; /* Size of zName in bytes, including \0 */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nName; /* Size of zName in bytes, including \0 */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ - nName = (int)strlen(zName) + 1; + nName = strlen(zName) + 1; nByte = sizeof(Fts5Auxiliary) + nName; - pAux = (Fts5Auxiliary*)sqlite3_malloc(nByte); + pAux = (Fts5Auxiliary*)sqlite3_malloc64(nByte); if( pAux ){ - memset(pAux, 0, nByte); + memset(pAux, 0, (size_t)nByte); pAux->zFunc = (char*)&pAux[1]; memcpy(pAux->zFunc, zName, nName); pAux->pGlobal = pGlobal; @@ -214301,15 +223524,15 @@ static int fts5CreateTokenizer( ){ Fts5Global *pGlobal = (Fts5Global*)pApi; Fts5TokenizerModule *pNew; - int nName; /* Size of zName and its \0 terminator */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nName; /* Size of zName and its \0 terminator */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ int rc = SQLITE_OK; - nName = (int)strlen(zName) + 1; + nName = strlen(zName) + 1; nByte = sizeof(Fts5TokenizerModule) + nName; - pNew = (Fts5TokenizerModule*)sqlite3_malloc(nByte); + pNew = (Fts5TokenizerModule*)sqlite3_malloc64(nByte); if( pNew ){ - memset(pNew, 0, nByte); + memset(pNew, 0, (size_t)nByte); pNew->zName = (char*)&pNew[1]; memcpy(pNew->zName, zName, nName); pNew->pUserData = pUserData; @@ -214444,12 +223667,27 @@ static void fts5SourceIdFunc( ){ assert( nArg==0 ); UNUSED_PARAM2(nArg, apUnused); - sqlite3_result_text(pCtx, "fts5: 2018-09-25 19:08:10 fb90e7189ae6d62e77ba3a308ca5d683f90bbe633cf681865365b8e92792d1c7", -1, SQLITE_TRANSIENT); + sqlite3_result_text(pCtx, "fts5: 2020-01-27 19:55:54 3bfa9cc97da10598521b342961df8f5f68c7388fa117345eeb516eaa837bb4d6", -1, SQLITE_TRANSIENT); +} + +/* +** Return true if zName is the extension on one of the shadow tables used +** by this module. +*/ +static int fts5ShadowName(const char *zName){ + static const char *azName[] = { + "config", "content", "data", "docsize", "idx" + }; + unsigned int i; + for(i=0; idb, zSql, -1, - SQLITE_PREPARE_PERSISTENT, &p->aStmt[eStmt], 0); + int f = SQLITE_PREPARE_PERSISTENT; + if( eStmt>FTS5_STMT_LOOKUP ) f |= SQLITE_PREPARE_NO_VTAB; + p->pConfig->bLock++; + rc = sqlite3_prepare_v3(pC->db, zSql, -1, f, &p->aStmt[eStmt], 0); + p->pConfig->bLock--; sqlite3_free(zSql); if( rc!=SQLITE_OK && pzErrMsg ){ *pzErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pC->db)); @@ -214843,14 +224085,14 @@ static int sqlite3Fts5StorageOpen( ){ int rc = SQLITE_OK; Fts5Storage *p; /* New object */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ nByte = sizeof(Fts5Storage) /* Fts5Storage object */ + pConfig->nCol * sizeof(i64); /* Fts5Storage.aTotalSize[] */ - *pp = p = (Fts5Storage*)sqlite3_malloc(nByte); + *pp = p = (Fts5Storage*)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; - memset(p, 0, nByte); + memset(p, 0, (size_t)nByte); p->aTotalSize = (i64*)&p[1]; p->pConfig = pConfig; p->pIndex = pIndex; @@ -214858,7 +224100,7 @@ static int sqlite3Fts5StorageOpen( if( bCreate ){ if( pConfig->eContent==FTS5_CONTENT_NORMAL ){ int nDefn = 32 + pConfig->nCol*10; - char *zDefn = sqlite3_malloc(32 + pConfig->nCol * 10); + char *zDefn = sqlite3_malloc64(32 + (sqlite3_int64)pConfig->nCol * 10); if( zDefn==0 ){ rc = SQLITE_NOMEM; }else{ @@ -215119,6 +224361,8 @@ static int sqlite3Fts5StorageDeleteAll(Fts5Storage *p){ Fts5Config *pConfig = p->pConfig; int rc; + p->bTotalsValid = 0; + /* Delete the contents of the %_data and %_docsize tables. */ rc = fts5ExecPrintf(pConfig->db, 0, "DELETE FROM %Q.'%q_data';" @@ -215149,7 +224393,7 @@ static int sqlite3Fts5StorageRebuild(Fts5Storage *p){ Fts5Config *pConfig = p->pConfig; sqlite3_stmt *pScan = 0; Fts5InsertCtx ctx; - int rc; + int rc, rc2; memset(&ctx, 0, sizeof(Fts5InsertCtx)); ctx.pStorage = p; @@ -215170,10 +224414,11 @@ static int sqlite3Fts5StorageRebuild(Fts5Storage *p){ for(ctx.iCol=0; rc==SQLITE_OK && ctx.iColnCol; ctx.iCol++){ ctx.szCol = 0; if( pConfig->abUnindexed[ctx.iCol]==0 ){ + const char *zText = (const char*)sqlite3_column_text(pScan, ctx.iCol+1); + int nText = sqlite3_column_bytes(pScan, ctx.iCol+1); rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT, - (const char*)sqlite3_column_text(pScan, ctx.iCol+1), - sqlite3_column_bytes(pScan, ctx.iCol+1), + zText, nText, (void*)&ctx, fts5StorageInsertCallback ); @@ -215188,6 +224433,8 @@ static int sqlite3Fts5StorageRebuild(Fts5Storage *p){ } } sqlite3_free(buf.p); + rc2 = sqlite3_reset(pScan); + if( rc==SQLITE_OK ) rc = rc2; /* Write the averages record */ if( rc==SQLITE_OK ){ @@ -215293,10 +224540,11 @@ static int sqlite3Fts5StorageIndexInsert( for(ctx.iCol=0; rc==SQLITE_OK && ctx.iColnCol; ctx.iCol++){ ctx.szCol = 0; if( pConfig->abUnindexed[ctx.iCol]==0 ){ + const char *zText = (const char*)sqlite3_value_text(apVal[ctx.iCol+2]); + int nText = sqlite3_value_bytes(apVal[ctx.iCol+2]); rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT, - (const char*)sqlite3_value_text(apVal[ctx.iCol+2]), - sqlite3_value_bytes(apVal[ctx.iCol+2]), + zText, nText, (void*)&ctx, fts5StorageInsertCallback ); @@ -215437,7 +224685,7 @@ static int sqlite3Fts5StorageIntegrity(Fts5Storage *p){ memset(&ctx, 0, sizeof(Fts5IntegrityCtx)); ctx.pConfig = p->pConfig; - aTotalSize = (i64*)sqlite3_malloc(pConfig->nCol * (sizeof(int)+sizeof(i64))); + aTotalSize = (i64*)sqlite3_malloc64(pConfig->nCol*(sizeof(int)+sizeof(i64))); if( !aTotalSize ) return SQLITE_NOMEM; aColSize = (int*)&aTotalSize[pConfig->nCol]; memset(aTotalSize, 0, sizeof(i64) * pConfig->nCol); @@ -215465,10 +224713,11 @@ static int sqlite3Fts5StorageIntegrity(Fts5Storage *p){ rc = sqlite3Fts5TermsetNew(&ctx.pTermset); } if( rc==SQLITE_OK ){ + const char *zText = (const char*)sqlite3_column_text(pScan, i+1); + int nText = sqlite3_column_bytes(pScan, i+1); rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT, - (const char*)sqlite3_column_text(pScan, i+1), - sqlite3_column_bytes(pScan, i+1), + zText, nText, (void*)&ctx, fts5StorageIntegrityCallback ); @@ -215637,7 +224886,13 @@ static int sqlite3Fts5StorageSize(Fts5Storage *p, int iCol, i64 *pnToken){ static int sqlite3Fts5StorageRowCount(Fts5Storage *p, i64 *pnRow){ int rc = fts5StorageLoadTotals(p, 0); if( rc==SQLITE_OK ){ + /* nTotalRow being zero does not necessarily indicate a corrupt + ** database - it might be that the FTS5 table really does contain zero + ** rows. However this function is only called from the xRowCount() API, + ** and there is no way for that API to be invoked if the table contains + ** no rows. Hence the FTS5_CORRUPT return. */ *pnRow = p->nTotalRow; + if( p->nTotalRow<=0 ) rc = FTS5_CORRUPT; } return rc; } @@ -215847,7 +225102,7 @@ static int fts5AsciiTokenize( nByte = ie-is; if( nByte>nFold ){ if( pFold!=aFold ) sqlite3_free(pFold); - pFold = sqlite3_malloc(nByte*2); + pFold = sqlite3_malloc64((sqlite3_int64)nByte*2); if( pFold==0 ){ rc = SQLITE_NOMEM; break; @@ -215929,13 +225184,18 @@ struct Unicode61Tokenizer { unsigned char aTokenChar[128]; /* ASCII range token characters */ char *aFold; /* Buffer to fold text into */ int nFold; /* Size of aFold[] in bytes */ - int bRemoveDiacritic; /* True if remove_diacritics=1 is set */ + int eRemoveDiacritic; /* True if remove_diacritics=1 is set */ int nException; int *aiException; unsigned char aCategory[32]; /* True for token char categories */ }; +/* Values for eRemoveDiacritic (must match internals of fts5_unicode2.c) */ +#define FTS5_REMOVE_DIACRITICS_NONE 0 +#define FTS5_REMOVE_DIACRITICS_SIMPLE 1 +#define FTS5_REMOVE_DIACRITICS_COMPLEX 2 + static int fts5UnicodeAddExceptions( Unicode61Tokenizer *p, /* Tokenizer object */ const char *z, /* Characters to treat as exceptions */ @@ -215946,13 +225206,14 @@ static int fts5UnicodeAddExceptions( int *aNew; if( n>0 ){ - aNew = (int*)sqlite3_realloc(p->aiException, (n+p->nException)*sizeof(int)); + aNew = (int*)sqlite3_realloc64(p->aiException, + (n+p->nException)*sizeof(int)); if( aNew ){ int nNew = p->nException; const unsigned char *zCsr = (const unsigned char*)z; const unsigned char *zTerm = (const unsigned char*)&z[n]; while( zCsriCode ) break; + if( (u32)aNew[i]>iCode ) break; } memmove(&aNew[i+1], &aNew[i], (nNew-i)*sizeof(int)); aNew[i] = iCode; @@ -216056,9 +225317,9 @@ static int fts5UnicodeCreate( int i; memset(p, 0, sizeof(Unicode61Tokenizer)); - p->bRemoveDiacritic = 1; + p->eRemoveDiacritic = FTS5_REMOVE_DIACRITICS_SIMPLE; p->nFold = 64; - p->aFold = sqlite3_malloc(p->nFold * sizeof(char)); + p->aFold = sqlite3_malloc64(p->nFold * sizeof(char)); if( p->aFold==0 ){ rc = SQLITE_NOMEM; } @@ -216077,10 +225338,15 @@ static int fts5UnicodeCreate( for(i=0; rc==SQLITE_OK && ieRemoveDiacritic = (zArg[0] - '0'); + assert( p->eRemoveDiacritic==FTS5_REMOVE_DIACRITICS_NONE + || p->eRemoveDiacritic==FTS5_REMOVE_DIACRITICS_SIMPLE + || p->eRemoveDiacritic==FTS5_REMOVE_DIACRITICS_COMPLEX + ); } - p->bRemoveDiacritic = (zArg[0]=='1'); }else if( 0==sqlite3_stricmp(azArg[i], "tokenchars") ){ rc = fts5UnicodeAddExceptions(p, zArg, 1); @@ -216114,7 +225380,7 @@ static int fts5UnicodeCreate( */ static int fts5UnicodeIsAlnum(Unicode61Tokenizer *p, int iCode){ return ( - p->aCategory[sqlite3Fts5UnicodeCategory(iCode)] + p->aCategory[sqlite3Fts5UnicodeCategory((u32)iCode)] ^ fts5UnicodeIsException(p, iCode) ); } @@ -216143,7 +225409,7 @@ static int fts5UnicodeTokenize( /* Each iteration of this loop gobbles up a contiguous run of separators, ** then the next token. */ while( rc==SQLITE_OK ){ - int iCode; /* non-ASCII codepoint read from input */ + u32 iCode; /* non-ASCII codepoint read from input */ char *zOut = aFold; int is; int ie; @@ -216175,7 +225441,7 @@ static int fts5UnicodeTokenize( /* Grow the output buffer so that there is sufficient space to fit the ** largest possible utf-8 character. */ if( zOut>pEnd ){ - aFold = sqlite3_malloc(nFold*2); + aFold = sqlite3_malloc64((sqlite3_int64)nFold*2); if( aFold==0 ){ rc = SQLITE_NOMEM; goto tokenize_done; @@ -216194,7 +225460,7 @@ static int fts5UnicodeTokenize( READ_UTF8(zCsr, zTerm, iCode); if( fts5UnicodeIsAlnum(p,iCode)||sqlite3Fts5UnicodeIsdiacritic(iCode) ){ non_ascii_tokenchar: - iCode = sqlite3Fts5UnicodeFold(iCode, p->bRemoveDiacritic); + iCode = sqlite3Fts5UnicodeFold(iCode, p->eRemoveDiacritic); if( iCode ) WRITE_UTF8(zOut, iCode); }else{ break; @@ -216970,10 +226236,8 @@ static int sqlite3Fts5TokenizerInit(fts5_api *pApi){ return rc; } - - /* -** 2012 May 25 +** 2012-05-25 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: @@ -217002,32 +226266,48 @@ static int sqlite3Fts5TokenizerInit(fts5_api *pApi){ ** E"). The resuls of passing a codepoint that corresponds to an ** uppercase letter are undefined. */ -static int fts5_remove_diacritic(int c){ +static int fts5_remove_diacritic(int c, int bComplex){ unsigned short aDia[] = { 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995, 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286, 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732, 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336, - 3456, 3696, 3712, 3728, 3744, 3896, 3912, 3928, - 3968, 4008, 4040, 4106, 4138, 4170, 4202, 4234, - 4266, 4296, 4312, 4344, 4408, 4424, 4472, 4504, - 6148, 6198, 6264, 6280, 6360, 6429, 6505, 6529, - 61448, 61468, 61534, 61592, 61642, 61688, 61704, 61726, - 61784, 61800, 61836, 61880, 61914, 61948, 61998, 62122, - 62154, 62200, 62218, 62302, 62364, 62442, 62478, 62536, - 62554, 62584, 62604, 62640, 62648, 62656, 62664, 62730, - 62924, 63050, 63082, 63274, 63390, + 3456, 3696, 3712, 3728, 3744, 3766, 3832, 3896, + 3912, 3928, 3944, 3968, 4008, 4040, 4056, 4106, + 4138, 4170, 4202, 4234, 4266, 4296, 4312, 4344, + 4408, 4424, 4442, 4472, 4488, 4504, 6148, 6198, + 6264, 6280, 6360, 6429, 6505, 6529, 61448, 61468, + 61512, 61534, 61592, 61610, 61642, 61672, 61688, 61704, + 61726, 61784, 61800, 61816, 61836, 61880, 61896, 61914, + 61948, 61998, 62062, 62122, 62154, 62184, 62200, 62218, + 62252, 62302, 62364, 62410, 62442, 62478, 62536, 62554, + 62584, 62604, 62640, 62648, 62656, 62664, 62730, 62766, + 62830, 62890, 62924, 62974, 63032, 63050, 63082, 63118, + 63182, 63242, 63274, 63310, 63368, 63390, }; - char aChar[] = { - '\0', 'a', 'c', 'e', 'i', 'n', 'o', 'u', 'y', 'y', 'a', 'c', - 'd', 'e', 'e', 'g', 'h', 'i', 'j', 'k', 'l', 'n', 'o', 'r', - 's', 't', 'u', 'u', 'w', 'y', 'z', 'o', 'u', 'a', 'i', 'o', - 'u', 'g', 'k', 'o', 'j', 'g', 'n', 'a', 'e', 'i', 'o', 'r', - 'u', 's', 't', 'h', 'a', 'e', 'o', 'y', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', 'a', 'b', 'd', 'd', 'e', 'f', 'g', 'h', - 'h', 'i', 'k', 'l', 'l', 'm', 'n', 'p', 'r', 'r', 's', 't', - 'u', 'v', 'w', 'w', 'x', 'y', 'z', 'h', 't', 'w', 'y', 'a', - 'e', 'i', 'o', 'u', 'y', +#define HIBIT ((unsigned char)0x80) + unsigned char aChar[] = { + '\0', 'a', 'c', 'e', 'i', 'n', + 'o', 'u', 'y', 'y', 'a', 'c', + 'd', 'e', 'e', 'g', 'h', 'i', + 'j', 'k', 'l', 'n', 'o', 'r', + 's', 't', 'u', 'u', 'w', 'y', + 'z', 'o', 'u', 'a', 'i', 'o', + 'u', 'u'|HIBIT, 'a'|HIBIT, 'g', 'k', 'o', + 'o'|HIBIT, 'j', 'g', 'n', 'a'|HIBIT, 'a', + 'e', 'i', 'o', 'r', 'u', 's', + 't', 'h', 'a', 'e', 'o'|HIBIT, 'o', + 'o'|HIBIT, 'y', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', 'a', 'b', + 'c'|HIBIT, 'd', 'd', 'e'|HIBIT, 'e', 'e'|HIBIT, + 'f', 'g', 'h', 'h', 'i', 'i'|HIBIT, + 'k', 'l', 'l'|HIBIT, 'l', 'm', 'n', + 'o'|HIBIT, 'p', 'r', 'r'|HIBIT, 'r', 's', + 's'|HIBIT, 't', 'u', 'u'|HIBIT, 'v', 'w', + 'w', 'x', 'y', 'z', 'h', 't', + 'w', 'y', 'a', 'a'|HIBIT, 'a'|HIBIT, 'a'|HIBIT, + 'e', 'e'|HIBIT, 'e'|HIBIT, 'i', 'o', 'o'|HIBIT, + 'o'|HIBIT, 'o'|HIBIT, 'u', 'u'|HIBIT, 'u'|HIBIT, 'y', }; unsigned int key = (((unsigned int)c)<<3) | 0x00000007; @@ -217044,7 +226324,8 @@ static int fts5_remove_diacritic(int c){ } } assert( key>=aDia[iRes] ); - return ((c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : (int)aChar[iRes]); + if( bComplex==0 && (aChar[iRes] & 0x80) ) return c; + return (c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : ((int)aChar[iRes] & 0x7F); } @@ -217057,8 +226338,8 @@ static int sqlite3Fts5UnicodeIsdiacritic(int c){ unsigned int mask1 = 0x000361F8; if( c<768 || c>817 ) return 0; return (c < 768+32) ? - (mask0 & (1 << (c-768))) : - (mask1 & (1 << (c-768-32))); + (mask0 & ((unsigned int)1 << (c-768))) : + (mask1 & ((unsigned int)1 << (c-768-32))); } @@ -217071,7 +226352,7 @@ static int sqlite3Fts5UnicodeIsdiacritic(int c){ ** The results are undefined if the value passed to this function ** is less than zero. */ -static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic){ +static int sqlite3Fts5UnicodeFold(int c, int eRemoveDiacritic){ /* Each entry in the following array defines a rule for folding a range ** of codepoints to lower case. The rule applies to a range of nRange ** codepoints starting at codepoint iCode. @@ -217194,7 +226475,9 @@ static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic){ assert( ret>0 ); } - if( bRemoveDiacritic ) ret = fts5_remove_diacritic(ret); + if( eRemoveDiacritic ){ + ret = fts5_remove_diacritic(ret, eRemoveDiacritic==2); + } } else if( c>=66560 && c<66600 ){ @@ -217205,12 +226488,6 @@ static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic){ } -#if 0 -static int sqlite3Fts5UnicodeNCat(void) { - return 32; -} -#endif - static int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ aArray[0] = 1; switch( zCat[0] ){ @@ -217692,7 +226969,7 @@ static u16 aFts5UnicodeData[] = { 34, 3074, 7692, 63, 63, }; -static int sqlite3Fts5UnicodeCategory(int iCode) { +static int sqlite3Fts5UnicodeCategory(u32 iCode) { int iRes = -1; int iHi; int iLo; @@ -217736,7 +227013,6 @@ static void sqlite3Fts5UnicodeAscii(u8 *aArray, u8 *aAscii){ } } - /* ** 2015 May 30 ** @@ -217815,7 +227091,7 @@ static int sqlite3Fts5GetVarint32(const unsigned char *p, u32 *v){ u8 n; p -= 2; n = sqlite3Fts5GetVarint(p, &v64); - *v = (u32)v64; + *v = ((u32)v64) & 0x7FFFFFFF; assert( n>3 && n<=9 ); return n; } @@ -218082,7 +227358,6 @@ static int sqlite3Fts5GetVarintLen(u32 iVal){ return 5; } - /* ** 2015 May 08 ** @@ -218140,7 +227415,7 @@ struct Fts5VocabTable { struct Fts5VocabCursor { sqlite3_vtab_cursor base; sqlite3_stmt *pStmt; /* Statement holding lock on pIndex */ - Fts5Index *pIndex; /* Associated FTS5 index */ + Fts5Table *pFts5; /* Associated FTS5 table */ int bEof; /* True if this cursor is at EOF */ Fts5IndexIter *pIter; /* Term/rowid iterator object */ @@ -218149,7 +227424,6 @@ struct Fts5VocabCursor { char *zLeTerm; /* (term <= $zLeTerm) paramater, or NULL */ /* These are used by 'col' tables only */ - Fts5Config *pConfig; /* Fts5 table configuration */ int iCol; i64 *aCnt; i64 *aDoc; @@ -218412,8 +227686,7 @@ static int fts5VocabOpenMethod( sqlite3_vtab_cursor **ppCsr ){ Fts5VocabTable *pTab = (Fts5VocabTable*)pVTab; - Fts5Index *pIndex = 0; - Fts5Config *pConfig = 0; + Fts5Table *pFts5 = 0; Fts5VocabCursor *pCsr = 0; int rc = SQLITE_OK; sqlite3_stmt *pStmt = 0; @@ -218432,31 +227705,34 @@ static int fts5VocabOpenMethod( if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ i64 iId = sqlite3_column_int64(pStmt, 0); - pIndex = sqlite3Fts5IndexFromCsrid(pTab->pGlobal, iId, &pConfig); + pFts5 = sqlite3Fts5TableFromCsrid(pTab->pGlobal, iId); } - if( rc==SQLITE_OK && pIndex==0 ){ - rc = sqlite3_finalize(pStmt); - pStmt = 0; - if( rc==SQLITE_OK ){ - pVTab->zErrMsg = sqlite3_mprintf( - "no such fts5 table: %s.%s", pTab->zFts5Db, pTab->zFts5Tbl - ); - rc = SQLITE_ERROR; + if( rc==SQLITE_OK ){ + if( pFts5==0 ){ + rc = sqlite3_finalize(pStmt); + pStmt = 0; + if( rc==SQLITE_OK ){ + pVTab->zErrMsg = sqlite3_mprintf( + "no such fts5 table: %s.%s", pTab->zFts5Db, pTab->zFts5Tbl + ); + rc = SQLITE_ERROR; + } + }else{ + rc = sqlite3Fts5FlushToDisk(pFts5); } } if( rc==SQLITE_OK ){ - int nByte = pConfig->nCol * sizeof(i64) * 2 + sizeof(Fts5VocabCursor); + int nByte = pFts5->pConfig->nCol * sizeof(i64)*2 + sizeof(Fts5VocabCursor); pCsr = (Fts5VocabCursor*)sqlite3Fts5MallocZero(&rc, nByte); } if( pCsr ){ - pCsr->pIndex = pIndex; + pCsr->pFts5 = pFts5; pCsr->pStmt = pStmt; - pCsr->pConfig = pConfig; pCsr->aCnt = (i64*)&pCsr[1]; - pCsr->aDoc = &pCsr->aCnt[pConfig->nCol]; + pCsr->aDoc = &pCsr->aCnt[pFts5->pConfig->nCol]; }else{ sqlite3_finalize(pStmt); } @@ -218472,6 +227748,7 @@ static void fts5VocabResetCursor(Fts5VocabCursor *pCsr){ sqlite3_free(pCsr->zLeTerm); pCsr->nLeTerm = -1; pCsr->zLeTerm = 0; + pCsr->bEof = 0; } /* @@ -218510,12 +227787,14 @@ static int fts5VocabInstanceNewTerm(Fts5VocabCursor *pCsr){ } static int fts5VocabInstanceNext(Fts5VocabCursor *pCsr){ - int eDetail = pCsr->pConfig->eDetail; + int eDetail = pCsr->pFts5->pConfig->eDetail; int rc = SQLITE_OK; Fts5IndexIter *pIter = pCsr->pIter; i64 *pp = &pCsr->iInstPos; int *po = &pCsr->iInstOff; + assert( sqlite3Fts5IterEof(pIter)==0 ); + assert( pCsr->bEof==0 ); while( eDetail==FTS5_DETAIL_NONE || sqlite3Fts5PoslistNext64(pIter->pData, pIter->nData, po, pp) ){ @@ -218525,7 +227804,7 @@ static int fts5VocabInstanceNext(Fts5VocabCursor *pCsr){ rc = sqlite3Fts5IterNextScan(pCsr->pIter); if( rc==SQLITE_OK ){ rc = fts5VocabInstanceNewTerm(pCsr); - if( eDetail==FTS5_DETAIL_NONE ) break; + if( pCsr->bEof || eDetail==FTS5_DETAIL_NONE ) break; } if( rc ){ pCsr->bEof = 1; @@ -218543,7 +227822,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; Fts5VocabTable *pTab = (Fts5VocabTable*)pCursor->pVtab; int rc = SQLITE_OK; - int nCol = pCsr->pConfig->nCol; + int nCol = pCsr->pFts5->pConfig->nCol; pCsr->rowid++; @@ -218565,6 +227844,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ int nTerm; zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm); + assert( nTerm>=0 ); if( pCsr->nLeTerm>=0 ){ int nCmp = MIN(nTerm, pCsr->nLeTerm); int bCmp = memcmp(pCsr->zLeTerm, zTerm, nCmp); @@ -218581,7 +227861,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ assert( pTab->eType==FTS5_VOCAB_COL || pTab->eType==FTS5_VOCAB_ROW ); while( rc==SQLITE_OK ){ - int eDetail = pCsr->pConfig->eDetail; + int eDetail = pCsr->pFts5->pConfig->eDetail; const u8 *pPos; int nPos; /* Position list */ i64 iPos = 0; /* 64-bit position read from poslist */ int iOff = 0; /* Current offset within position list */ @@ -218604,7 +227884,6 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ int iCol = -1; while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff, &iPos) ){ int ii = FTS5_POS2COLUMN(iPos); - pCsr->aCnt[ii]++; if( iCol!=ii ){ if( ii>=nCol ){ rc = FTS5_CORRUPT; @@ -218613,6 +227892,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ pCsr->aDoc[ii]++; iCol = ii; } + pCsr->aCnt[ii]++; } }else if( eDetail==FTS5_DETAIL_COLUMNS ){ while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff,&iPos) ){ @@ -218641,7 +227921,9 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ if( rc==SQLITE_OK ){ zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm); - if( nTerm!=pCsr->term.n || memcmp(zTerm, pCsr->term.p, nTerm) ){ + if( nTerm!=pCsr->term.n + || (nTerm>0 && memcmp(zTerm, pCsr->term.p, nTerm)) + ){ break; } if( sqlite3Fts5IterEof(pCsr->pIter) ) break; @@ -218651,8 +227933,10 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ } if( rc==SQLITE_OK && pCsr->bEof==0 && pTab->eType==FTS5_VOCAB_COL ){ - while( pCsr->aDoc[pCsr->iCol]==0 ) pCsr->iCol++; - assert( pCsr->iColpConfig->nCol ); + for(/* noop */; pCsr->iColaDoc[pCsr->iCol]==0; pCsr->iCol++); + if( pCsr->iCol==nCol ){ + rc = FTS5_CORRUPT; + } } return rc; } @@ -218699,6 +227983,7 @@ static int fts5VocabFilterMethod( } if( pLe ){ const char *zCopy = (const char *)sqlite3_value_text(pLe); + if( zCopy==0 ) zCopy = ""; pCsr->nLeTerm = sqlite3_value_bytes(pLe); pCsr->zLeTerm = sqlite3_malloc(pCsr->nLeTerm+1); if( pCsr->zLeTerm==0 ){ @@ -218710,14 +227995,15 @@ static int fts5VocabFilterMethod( } if( rc==SQLITE_OK ){ - rc = sqlite3Fts5IndexQuery(pCsr->pIndex, zTerm, nTerm, f, 0, &pCsr->pIter); + Fts5Index *pIndex = pCsr->pFts5->pIndex; + rc = sqlite3Fts5IndexQuery(pIndex, zTerm, nTerm, f, 0, &pCsr->pIter); } if( rc==SQLITE_OK && eType==FTS5_VOCAB_INSTANCE ){ rc = fts5VocabInstanceNewTerm(pCsr); } - if( rc==SQLITE_OK - && !pCsr->bEof - && (eType!=FTS5_VOCAB_INSTANCE || pCsr->pConfig->eDetail!=FTS5_DETAIL_NONE) + if( rc==SQLITE_OK && !pCsr->bEof + && (eType!=FTS5_VOCAB_INSTANCE + || pCsr->pFts5->pConfig->eDetail!=FTS5_DETAIL_NONE) ){ rc = fts5VocabNextMethod(pCursor); } @@ -218740,7 +228026,7 @@ static int fts5VocabColumnMethod( int iCol /* Index of column to read value from */ ){ Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; - int eDetail = pCsr->pConfig->eDetail; + int eDetail = pCsr->pFts5->pConfig->eDetail; int eType = ((Fts5VocabTable*)(pCursor->pVtab))->eType; i64 iVal = 0; @@ -218752,7 +228038,7 @@ static int fts5VocabColumnMethod( assert( iCol==1 || iCol==2 || iCol==3 ); if( iCol==1 ){ if( eDetail!=FTS5_DETAIL_NONE ){ - const char *z = pCsr->pConfig->azCol[pCsr->iCol]; + const char *z = pCsr->pFts5->pConfig->azCol[pCsr->iCol]; sqlite3_result_text(pCtx, z, -1, SQLITE_STATIC); } }else if( iCol==2 ){ @@ -218780,8 +228066,8 @@ static int fts5VocabColumnMethod( }else if( eDetail==FTS5_DETAIL_COLUMNS ){ ii = (int)pCsr->iInstPos; } - if( ii>=0 && iipConfig->nCol ){ - const char *z = pCsr->pConfig->azCol[ii]; + if( ii>=0 && iipFts5->pConfig->nCol ){ + const char *z = pCsr->pFts5->pConfig->azCol[ii]; sqlite3_result_text(pCtx, z, -1, SQLITE_STATIC); } break; @@ -218840,6 +228126,7 @@ static int sqlite3Fts5VocabInit(Fts5Global *pGlobal, sqlite3 *db){ /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ 0, + /* xShadowName */ 0 }; void *p = (void*)pGlobal; @@ -218847,8 +228134,6 @@ static int sqlite3Fts5VocabInit(Fts5Global *pGlobal, sqlite3 *db){ } - - #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5) */ @@ -219122,6 +228407,7 @@ static sqlite3_module stmtModule = { 0, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ + 0, /* xShadowName */ }; #endif /* SQLITE_OMIT_VIRTUALTABLE */ @@ -219154,9 +228440,9 @@ SQLITE_API int sqlite3_stmt_init( #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */ /************** End of stmt.c ************************************************/ -#if __LINE__!=219157 +#if __LINE__!=228443 #undef SQLITE_SOURCE_ID -#define SQLITE_SOURCE_ID "2018-09-25 19:08:10 fb90e7189ae6d62e77ba3a308ca5d683f90bbe633cf681865365b8e92792alt2" +#define SQLITE_SOURCE_ID "2020-01-27 19:55:54 3bfa9cc97da10598521b342961df8f5f68c7388fa117345eeb516eaa837balt2" #endif /* Return the source-id for this library */ SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; } diff --git a/Vendor/SQLite3/sqlite3.h b/Vendor/SQLite3/sqlite3.h index 4612ecda7f..cef6eea18c 100644 --- a/Vendor/SQLite3/sqlite3.h +++ b/Vendor/SQLite3/sqlite3.h @@ -123,9 +123,9 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.25.2" -#define SQLITE_VERSION_NUMBER 3025002 -#define SQLITE_SOURCE_ID "2018-09-25 19:08:10 fb90e7189ae6d62e77ba3a308ca5d683f90bbe633cf681865365b8e92792d1c7" +#define SQLITE_VERSION "3.31.1" +#define SQLITE_VERSION_NUMBER 3031001 +#define SQLITE_SOURCE_ID "2020-01-27 19:55:54 3bfa9cc97da10598521b342961df8f5f68c7388fa117345eeb516eaa837bb4d6" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -189,6 +189,9 @@ SQLITE_API int sqlite3_libversion_number(void); #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS SQLITE_API int sqlite3_compileoption_used(const char *zOptName); SQLITE_API const char *sqlite3_compileoption_get(int N); +#else +# define sqlite3_compileoption_used(X) 0 +# define sqlite3_compileoption_get(X) ((void*)0) #endif /* @@ -513,6 +516,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8)) #define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) #define SQLITE_CANTOPEN_DIRTYWAL (SQLITE_CANTOPEN | (5<<8)) /* Not Used */ +#define SQLITE_CANTOPEN_SYMLINK (SQLITE_CANTOPEN | (6<<8)) #define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) #define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8)) #define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) @@ -532,11 +536,13 @@ SQLITE_API int sqlite3_exec( #define SQLITE_CONSTRAINT_UNIQUE (SQLITE_CONSTRAINT | (8<<8)) #define SQLITE_CONSTRAINT_VTAB (SQLITE_CONSTRAINT | (9<<8)) #define SQLITE_CONSTRAINT_ROWID (SQLITE_CONSTRAINT |(10<<8)) +#define SQLITE_CONSTRAINT_PINNED (SQLITE_CONSTRAINT |(11<<8)) #define SQLITE_NOTICE_RECOVER_WAL (SQLITE_NOTICE | (1<<8)) #define SQLITE_NOTICE_RECOVER_ROLLBACK (SQLITE_NOTICE | (2<<8)) #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)) /* ** CAPI3REF: Flags For File Open Operations @@ -565,6 +571,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_WAL 0x00080000 /* VFS only */ +#define SQLITE_OPEN_NOFOLLOW 0x01000000 /* Ok for sqlite3_open_v2() */ /* Reserved: 0x00F00000 */ @@ -823,6 +830,15 @@ struct sqlite3_io_methods { ** file space based on this hint in order to help writes to the database ** file run faster. ** +**
          4. [[SQLITE_FCNTL_SIZE_LIMIT]] +** The [SQLITE_FCNTL_SIZE_LIMIT] opcode is used by in-memory VFS that +** implements [sqlite3_deserialize()] to set an upper bound on the size +** of the in-memory database. The argument is a pointer to a [sqlite3_int64]. +** If the integer pointed to is negative, then it is filled in with the +** current limit. Otherwise the limit is set to the larger of the value +** of the integer pointed to and the current database size. The integer +** pointed to is set to the new limit. +** **
          5. [[SQLITE_FCNTL_CHUNK_SIZE]] ** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS ** extends and truncates the database file in chunks of a size specified @@ -967,16 +983,16 @@ struct sqlite3_io_methods { ** ^The [SQLITE_FCNTL_BUSYHANDLER] ** file-control may be invoked by SQLite on the database file handle ** shortly after it is opened in order to provide a custom VFS with access -** to the connections busy-handler callback. The argument is of type (void **) +** to the connection's busy-handler callback. The argument is of type (void**) ** - an array of two (void *) values. The first (void *) actually points -** to a function of type (int (*)(void *)). In order to invoke the connections +** to a function of type (int (*)(void *)). In order to invoke the connection's ** busy-handler, this function should be invoked with the second (void *) in ** the array as the only argument. If it returns non-zero, then the operation ** should be retried. If it returns zero, the custom VFS should abandon the ** current operation. ** **
          6. [[SQLITE_FCNTL_TEMPFILENAME]] -** ^Application can invoke the [SQLITE_FCNTL_TEMPFILENAME] file-control +** ^Applications can invoke the [SQLITE_FCNTL_TEMPFILENAME] file-control ** to have SQLite generate a ** temporary filename using the same algorithm that is followed to generate ** temporary filenames for TEMP tables and other internal uses. The @@ -1089,12 +1105,18 @@ struct sqlite3_io_methods { ** not provide a mechanism to detect changes to MAIN only. Also, the ** [sqlite3_total_changes()] interface responds to internal changes only and ** omits changes made by other database connections. The -** [PRAGMA data_version] command provide a mechanism to detect changes to +** [PRAGMA data_version] command provides a mechanism to detect changes to ** a single attached database that occur due to other database connections, ** but omits changes implemented by the database connection on which it is ** called. This file control is the only mechanism to detect changes that ** happen either internally or externally and that are associated with ** a particular attached database. +** +**
          7. [[SQLITE_FCNTL_CKPT_DONE]] +** The [SQLITE_FCNTL_CKPT_DONE] opcode is invoked from within a checkpoint +** in wal mode after the client has finished copying pages from the wal +** file to the database file, but before the *-shm file is updated to +** record the fact that the pages have been checkpointed. ** */ #define SQLITE_FCNTL_LOCKSTATE 1 @@ -1131,6 +1153,8 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 #define SQLITE_FCNTL_LOCK_TIMEOUT 34 #define SQLITE_FCNTL_DATA_VERSION 35 +#define SQLITE_FCNTL_SIZE_LIMIT 36 +#define SQLITE_FCNTL_CKPT_DONE 37 /* deprecated names */ #define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE @@ -1176,10 +1200,10 @@ typedef struct sqlite3_api_routines sqlite3_api_routines; ** to 3 with SQLite [version 3.7.6] on [dateof:3.7.6]. Additional fields ** may be appended to the sqlite3_vfs object and the iVersion value ** may increase again in future versions of SQLite. -** Note that the structure -** of the sqlite3_vfs object changes in the transition from +** Note that due to an oversight, the structure +** of the sqlite3_vfs object changed in the transition from ** SQLite [version 3.5.9] to [version 3.6.0] on [dateof:3.6.0] -** and yet the iVersion field was not modified. +** and yet the iVersion field was not increased. ** ** The szOsFile field is the size of the subclassed [sqlite3_file] ** structure used by this VFS. mxPathname is the maximum length of @@ -1270,7 +1294,7 @@ typedef struct sqlite3_api_routines sqlite3_api_routines; ** for exclusive access. ** ** ^At least szOsFile bytes of memory are allocated by SQLite -** to hold the [sqlite3_file] structure passed as the third +** to hold the [sqlite3_file] structure passed as the third ** argument to xOpen. The xOpen method does not have to ** allocate the structure; it should just fill it in. Note that ** the xOpen method must set the sqlite3_file.pMethods to either @@ -1283,8 +1307,14 @@ typedef struct sqlite3_api_routines sqlite3_api_routines; ** ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] ** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to ** test whether a file is readable and writable, or [SQLITE_ACCESS_READ] -** to test whether a file is at least readable. The file can be a -** directory. +** to test whether a file is at least readable. The SQLITE_ACCESS_READ +** flag is never actually used and is not implemented in the built-in +** VFSes of SQLite. The file is named by the second argument and can be a +** directory. The xAccess method returns [SQLITE_OK] on success or some +** non-zero error code if there is an I/O error or if the name of +** the file given in the second argument is illegal. If SQLITE_OK +** is returned, then non-zero or zero is written into *pResOut to indicate +** whether or not the file is accessible. ** ** ^SQLite will always allocate at least mxPathname+1 bytes for the ** output buffer xFullPathname. The exact size of the output buffer @@ -1601,7 +1631,7 @@ SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...); ** that causes the corresponding memory allocation to fail. ** ** The xInit method initializes the memory allocator. For example, -** it might allocate any require mutexes or initialize internal data +** it might allocate any required mutexes or initialize internal data ** structures. The xShutdown method is invoked (indirectly) by ** [sqlite3_shutdown()] and should deallocate any resources acquired ** by xInit. The pAppData pointer is used as the only parameter to @@ -1723,6 +1753,7 @@ struct sqlite3_mem_methods { ** memory allocation statistics. ^(When memory allocation statistics are ** disabled, the following SQLite interfaces become non-operational: **
              +**
            • [sqlite3_hard_heap_limit64()] **
            • [sqlite3_memory_used()] **
            • [sqlite3_memory_highwater()] **
            • [sqlite3_soft_heap_limit64()] @@ -1741,7 +1772,7 @@ struct sqlite3_mem_methods { **
              ^The SQLITE_CONFIG_PAGECACHE option specifies a memory pool ** that SQLite can use for the database page cache with the default page ** cache implementation. -** This configuration option is a no-op if an application-define page +** This configuration option is a no-op if an application-defined page ** cache implementation is loaded using the [SQLITE_CONFIG_PCACHE2]. ** ^There are three arguments to SQLITE_CONFIG_PAGECACHE: A pointer to ** 8-byte aligned memory (pMem), the size of each page cache line (sz), @@ -1972,6 +2003,17 @@ struct sqlite3_mem_methods { ** negative value for this option restores the default behaviour. ** This option is only available if SQLite is compiled with the ** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option. +** +** [[SQLITE_CONFIG_MEMDB_MAXSIZE]] +**
              SQLITE_CONFIG_MEMDB_MAXSIZE +**
              The SQLITE_CONFIG_MEMDB_MAXSIZE option accepts a single parameter +** [sqlite3_int64] parameter which is the default maximum size for an in-memory +** database created using [sqlite3_deserialize()]. This default maximum +** size can be adjusted up or down for individual databases using the +** [SQLITE_FCNTL_SIZE_LIMIT] [sqlite3_file_control|file-control]. If this +** configuration setting is never used, then the default maximum is determined +** by the [SQLITE_MEMDB_DEFAULT_MAXSIZE] compile-time option. If that +** compile-time option is not set, then the default maximum is 1073741824. **
    */ #define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ @@ -2002,6 +2044,7 @@ struct sqlite3_mem_methods { #define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */ #define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */ #define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */ +#define SQLITE_CONFIG_MEMDB_MAXSIZE 29 /* sqlite3_int64 */ /* ** CAPI3REF: Database Connection Configuration Options @@ -2017,6 +2060,7 @@ struct sqlite3_mem_methods { ** is invoked. ** **
    +** [[SQLITE_DBCONFIG_LOOKASIDE]] **
    SQLITE_DBCONFIG_LOOKASIDE
    **
    ^This option takes three additional arguments that determine the ** [lookaside memory allocator] configuration for the [database connection]. @@ -2039,6 +2083,7 @@ struct sqlite3_mem_methods { ** memory is in use leaves the configuration unchanged and returns ** [SQLITE_BUSY].)^
    ** +** [[SQLITE_DBCONFIG_ENABLE_FKEY]] **
    SQLITE_DBCONFIG_ENABLE_FKEY
    **
    ^This option is used to enable or disable the enforcement of ** [foreign key constraints]. There should be two additional arguments. @@ -2049,6 +2094,7 @@ struct sqlite3_mem_methods { ** following this call. The second parameter may be a NULL pointer, in ** which case the FK enforcement setting is not reported back.
    ** +** [[SQLITE_DBCONFIG_ENABLE_TRIGGER]] **
    SQLITE_DBCONFIG_ENABLE_TRIGGER
    **
    ^This option is used to enable or disable [CREATE TRIGGER | triggers]. ** There should be two additional arguments. @@ -2059,9 +2105,21 @@ struct sqlite3_mem_methods { ** following this call. The second parameter may be a NULL pointer, in ** which case the trigger setting is not reported back.
    ** +** [[SQLITE_DBCONFIG_ENABLE_VIEW]] +**
    SQLITE_DBCONFIG_ENABLE_VIEW
    +**
    ^This option is used to enable or disable [CREATE VIEW | views]. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable views, +** positive to enable views or negative to leave the setting unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether views are disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the view setting is not reported back.
    +** +** [[SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER]] **
    SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
    -**
    ^This option is used to enable or disable the two-argument -** version of the [fts3_tokenizer()] function which is part of the +**
    ^This option is used to enable or disable the +** [fts3_tokenizer()] function which is part of the ** [FTS3] full-text search engine extension. ** There should be two additional arguments. ** The first argument is an integer which is 0 to disable fts3_tokenizer() or @@ -2072,6 +2130,7 @@ struct sqlite3_mem_methods { ** following this call. The second parameter may be a NULL pointer, in ** which case the new setting is not reported back.
    ** +** [[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION]] **
    SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
    **
    ^This option is used to enable or disable the [sqlite3_load_extension()] ** interface independently of the [load_extension()] SQL function. @@ -2089,7 +2148,7 @@ struct sqlite3_mem_methods { ** be a NULL pointer, in which case the new setting is not reported back. **
    ** -**
    SQLITE_DBCONFIG_MAINDBNAME
    +** [[SQLITE_DBCONFIG_MAINDBNAME]]
    SQLITE_DBCONFIG_MAINDBNAME
    **
    ^This option is used to change the name of the "main" database ** schema. ^The sole argument is a pointer to a constant UTF8 string ** which will become the new schema name in place of "main". ^SQLite @@ -2098,6 +2157,7 @@ struct sqlite3_mem_methods { ** until after the database connection closes. **
    ** +** [[SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE]] **
    SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE
    **
    Usually, when a database in wal mode is closed or detached from a ** database handle, SQLite checks if this will mean that there are now no @@ -2111,7 +2171,7 @@ struct sqlite3_mem_methods { ** have been disabled - 0 if they are not disabled, 1 if they are. **
    ** -**
    SQLITE_DBCONFIG_ENABLE_QPSG
    +** [[SQLITE_DBCONFIG_ENABLE_QPSG]]
    SQLITE_DBCONFIG_ENABLE_QPSG
    **
    ^(The SQLITE_DBCONFIG_ENABLE_QPSG option activates or deactivates ** the [query planner stability guarantee] (QPSG). When the QPSG is active, ** a single SQL query statement will always use the same algorithm regardless @@ -2127,7 +2187,7 @@ struct sqlite3_mem_methods { ** following this call. **
    ** -**
    SQLITE_DBCONFIG_TRIGGER_EQP
    +** [[SQLITE_DBCONFIG_TRIGGER_EQP]]
    SQLITE_DBCONFIG_TRIGGER_EQP
    **
    By default, the output of EXPLAIN QUERY PLAN commands does not ** include output for any operations performed by trigger programs. This ** option is used to set or clear (the default) a flag that governs this @@ -2139,7 +2199,7 @@ struct sqlite3_mem_methods { ** it is not disabled, 1 if it is. **
    ** -**
    SQLITE_DBCONFIG_RESET_DATABASE
    +** [[SQLITE_DBCONFIG_RESET_DATABASE]]
    SQLITE_DBCONFIG_RESET_DATABASE
    **
    Set the SQLITE_DBCONFIG_RESET_DATABASE flag and then run ** [VACUUM] in order to reset a database back to an empty database ** with no schema and no content. The following process works even for @@ -2158,6 +2218,101 @@ struct sqlite3_mem_methods { ** Because resetting a database is destructive and irreversible, the ** process requires the use of this obscure API and multiple steps to help ** ensure that it does not happen by accident. +** +** [[SQLITE_DBCONFIG_DEFENSIVE]]
    SQLITE_DBCONFIG_DEFENSIVE
    +**
    The SQLITE_DBCONFIG_DEFENSIVE option activates or deactivates the +** "defensive" flag for a database connection. When the defensive +** flag is enabled, language features that allow ordinary SQL to +** deliberately corrupt the database file are disabled. The disabled +** features include but are not limited to the following: +**
      +**
    • The [PRAGMA writable_schema=ON] statement. +**
    • The [PRAGMA journal_mode=OFF] statement. +**
    • Writes to the [sqlite_dbpage] virtual table. +**
    • Direct writes to [shadow tables]. +**
    +**
    +** +** [[SQLITE_DBCONFIG_WRITABLE_SCHEMA]]
    SQLITE_DBCONFIG_WRITABLE_SCHEMA
    +**
    The SQLITE_DBCONFIG_WRITABLE_SCHEMA option activates or deactivates the +** "writable_schema" flag. This has the same effect and is logically equivalent +** to setting [PRAGMA writable_schema=ON] or [PRAGMA writable_schema=OFF]. +** The first argument to this setting is an integer which is 0 to disable +** the writable_schema, positive to enable writable_schema, or negative to +** leave the setting unchanged. The second parameter is a pointer to an +** integer into which is written 0 or 1 to indicate whether the writable_schema +** is enabled or disabled following this call. +**
    +** +** [[SQLITE_DBCONFIG_LEGACY_ALTER_TABLE]] +**
    SQLITE_DBCONFIG_LEGACY_ALTER_TABLE
    +**
    The SQLITE_DBCONFIG_LEGACY_ALTER_TABLE option activates or deactivates +** the legacy behavior of the [ALTER TABLE RENAME] command such it +** behaves as it did prior to [version 3.24.0] (2018-06-04). See the +** "Compatibility Notice" on the [ALTER TABLE RENAME documentation] for +** additional information. This feature can also be turned on and off +** using the [PRAGMA legacy_alter_table] statement. +**
    +** +** [[SQLITE_DBCONFIG_DQS_DML]] +**
    SQLITE_DBCONFIG_DQS_DML +**
    The SQLITE_DBCONFIG_DQS_DML option activates or deactivates +** the legacy [double-quoted string literal] misfeature for DML statements +** only, that is DELETE, INSERT, SELECT, and UPDATE statements. The +** default value of this setting is determined by the [-DSQLITE_DQS] +** compile-time option. +**
    +** +** [[SQLITE_DBCONFIG_DQS_DDL]] +**
    SQLITE_DBCONFIG_DQS_DDL +**
    The SQLITE_DBCONFIG_DQS option activates or deactivates +** the legacy [double-quoted string literal] misfeature for DDL statements, +** such as CREATE TABLE and CREATE INDEX. The +** default value of this setting is determined by the [-DSQLITE_DQS] +** compile-time option. +**
    +** +** [[SQLITE_DBCONFIG_TRUSTED_SCHEMA]] +**
    SQLITE_DBCONFIG_TRUSTED_SCHEMA +**
    The SQLITE_DBCONFIG_TRUSTED_SCHEMA option tells SQLite to +** assume that database schemas (the contents of the [sqlite_master] tables) +** are untainted by malicious content. +** When the SQLITE_DBCONFIG_TRUSTED_SCHEMA option is disabled, SQLite +** takes additional defensive steps to protect the application from harm +** including: +**
      +**
    • Prohibit the use of SQL functions inside triggers, views, +** CHECK constraints, DEFAULT clauses, expression indexes, +** partial indexes, or generated columns +** unless those functions are tagged with [SQLITE_INNOCUOUS]. +**
    • Prohibit the use of virtual tables inside of triggers or views +** unless those virtual tables are tagged with [SQLITE_VTAB_INNOCUOUS]. +**
    +** This setting defaults to "on" for legacy compatibility, however +** all applications are advised to turn it off if possible. This setting +** can also be controlled using the [PRAGMA trusted_schema] statement. +**
    +** +** [[SQLITE_DBCONFIG_LEGACY_FILE_FORMAT]] +**
    SQLITE_DBCONFIG_LEGACY_FILE_FORMAT +**
    The SQLITE_DBCONFIG_LEGACY_FILE_FORMAT option activates or deactivates +** the legacy file format flag. When activated, this flag causes all newly +** created database file to have a schema format version number (the 4-byte +** integer found at offset 44 into the database header) of 1. This in turn +** means that the resulting database file will be readable and writable by +** any SQLite version back to 3.0.0 ([dateof:3.0.0]). Without this setting, +** newly created databases are generally not understandable by SQLite versions +** prior to 3.3.0 ([dateof:3.3.0]). As these words are written, there +** is now scarcely any need to generated database files that are compatible +** all the way back to version 3.0.0, and so this setting is of little +** practical use, but is provided so that SQLite can continue to claim the +** ability to generate new database files that are compatible with version +** 3.0.0. +**

    Note that when the SQLITE_DBCONFIG_LEGACY_FILE_FORMAT setting is on, +** the [VACUUM] command will fail with an obscure error when attempting to +** process a table with generated columns and a descending index. This is +** not considered a bug since SQLite versions 3.3.0 and earlier do not support +** either generated columns or decending indexes. **

    **
    */ @@ -2171,7 +2326,15 @@ struct sqlite3_mem_methods { #define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */ #define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */ #define SQLITE_DBCONFIG_RESET_DATABASE 1009 /* int int* */ -#define SQLITE_DBCONFIG_MAX 1009 /* Largest DBCONFIG */ +#define SQLITE_DBCONFIG_DEFENSIVE 1010 /* int int* */ +#define SQLITE_DBCONFIG_WRITABLE_SCHEMA 1011 /* int int* */ +#define SQLITE_DBCONFIG_LEGACY_ALTER_TABLE 1012 /* int int* */ +#define SQLITE_DBCONFIG_DQS_DML 1013 /* int int* */ +#define SQLITE_DBCONFIG_DQS_DDL 1014 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_VIEW 1015 /* int int* */ +#define SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 1016 /* int int* */ +#define SQLITE_DBCONFIG_TRUSTED_SCHEMA 1017 /* int int* */ +#define SQLITE_DBCONFIG_MAX 1017 /* Largest DBCONFIG */ /* ** CAPI3REF: Enable Or Disable Extended Result Codes @@ -2328,7 +2491,7 @@ SQLITE_API int sqlite3_changes(sqlite3*); ** not. ^Changes to a view that are intercepted by INSTEAD OF triggers ** are not counted. ** -** This the [sqlite3_total_changes(D)] interface only reports the number +** The [sqlite3_total_changes(D)] interface only reports the number ** of rows that changed due to SQL statement run against database ** connection D. Any changes by other database connections are ignored. ** To detect changes against a database file from other database @@ -2377,7 +2540,7 @@ SQLITE_API int sqlite3_total_changes(sqlite3*); ** ^The sqlite3_interrupt(D) call is in effect until all currently running ** SQL statements on [database connection] D complete. ^Any new SQL statements ** that are started after the sqlite3_interrupt() call and before the -** running statements reaches zero are interrupted as if they had been +** running statement count reaches zero are interrupted as if they had been ** running prior to the sqlite3_interrupt() call. ^New SQL statements ** that are started after the running statement count reaches zero are ** not effected by the sqlite3_interrupt(). @@ -2545,9 +2708,9 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); ** Cindy | 21 ** ** -** There are two column (M==2) and three rows (N==3). Thus the +** There are two columns (M==2) and three rows (N==3). Thus the ** result table has 8 entries. Suppose the result table is stored -** in an array names azResult. Then azResult holds this content: +** in an array named azResult. Then azResult holds this content: ** **
     **        azResult[0] = "Name";
    @@ -2640,7 +2803,7 @@ SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list);
     **
     ** The SQLite core uses these three routines for all of its own
     ** internal memory allocation needs. "Core" in the previous sentence
    -** does not include operating-system specific VFS implementation.  The
    +** does not include operating-system specific [VFS] implementation.  The
     ** Windows VFS uses native malloc() and free() for some operations.
     **
     ** ^The sqlite3_malloc() routine returns a pointer to a block
    @@ -2701,19 +2864,6 @@ SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list);
     ** 4 byte boundary if the [SQLITE_4_BYTE_ALIGNED_MALLOC] compile-time
     ** option is used.
     **
    -** In SQLite version 3.5.0 and 3.5.1, it was possible to define
    -** the SQLITE_OMIT_MEMORY_ALLOCATION which would cause the built-in
    -** implementation of these routines to be omitted.  That capability
    -** is no longer provided.  Only built-in memory allocators can be used.
    -**
    -** Prior to SQLite version 3.7.10, the Windows OS interface layer called
    -** the system malloc() and free() directly when converting
    -** filenames between the UTF-8 encoding used by SQLite
    -** and whatever filename encoding is used by the particular Windows
    -** installation.  Memory allocation errors were detected, but
    -** they were reported back as [SQLITE_CANTOPEN] or
    -** [SQLITE_IOERR] rather than [SQLITE_NOMEM].
    -**
     ** The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()]
     ** must be either NULL or else pointers obtained from a prior
     ** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that have
    @@ -2762,7 +2912,7 @@ SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag);
     ** SQLite contains a high-quality pseudo-random number generator (PRNG) used to
     ** select random [ROWID | ROWIDs] when inserting new records into a table that
     ** already uses the largest possible [ROWID].  The PRNG is also used for
    -** the build-in random() and randomblob() SQL functions.  This interface allows
    +** the built-in random() and randomblob() SQL functions.  This interface allows
     ** applications to access the same PRNG for other purposes.
     **
     ** ^A call to this routine stores N bytes of randomness into buffer P.
    @@ -2972,9 +3122,9 @@ SQLITE_API int sqlite3_set_authorizer(
     ** time is in units of nanoseconds, however the current implementation
     ** is only capable of millisecond resolution so the six least significant
     ** digits in the time are meaningless.  Future versions of SQLite
    -** might provide greater resolution on the profiler callback.  The
    -** sqlite3_profile() function is considered experimental and is
    -** subject to change in future versions of SQLite.
    +** might provide greater resolution on the profiler callback.  Invoking
    +** either [sqlite3_trace()] or [sqlite3_trace_v2()] will cancel the
    +** profile callback.
     */
     SQLITE_API SQLITE_DEPRECATED void *sqlite3_trace(sqlite3*,
        void(*xTrace)(void*,const char*), void*);
    @@ -3136,10 +3286,8 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
     ** The sqlite3_open_v2() interface works like sqlite3_open()
     ** except that it accepts two additional parameters for additional control
     ** over the new database connection.  ^(The flags parameter to
    -** sqlite3_open_v2() can take one of
    -** the following three values, optionally combined with the 
    -** [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], [SQLITE_OPEN_SHAREDCACHE],
    -** [SQLITE_OPEN_PRIVATECACHE], and/or [SQLITE_OPEN_URI] flags:)^
    +** sqlite3_open_v2() must include, at a minimum, one of the following
    +** three flag combinations:)^
     **
     ** 
    ** ^(
    [SQLITE_OPEN_READONLY]
    @@ -3157,23 +3305,51 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** sqlite3_open() and sqlite3_open16().)^ **
    ** +** In addition to the required flags, the following optional flags are +** also supported: +** +**
    +** ^(
    [SQLITE_OPEN_URI]
    +**
    The filename can be interpreted as a URI if this flag is set.
    )^ +** +** ^(
    [SQLITE_OPEN_MEMORY]
    +**
    The database will be opened as an in-memory database. The database +** is named by the "filename" argument for the purposes of cache-sharing, +** if shared cache mode is enabled, but the "filename" is otherwise ignored. +**
    )^ +** +** ^(
    [SQLITE_OPEN_NOMUTEX]
    +**
    The new database connection will use the "multi-thread" +** [threading mode].)^ This means that separate threads are allowed +** to use SQLite at the same time, as long as each thread is using +** a different [database connection]. +** +** ^(
    [SQLITE_OPEN_FULLMUTEX]
    +**
    The new database connection will use the "serialized" +** [threading mode].)^ This means the multiple threads can safely +** attempt to use the same database connection at the same time. +** (Mutexes will block any actual concurrency, but in this mode +** there is no harm in trying.) +** +** ^(
    [SQLITE_OPEN_SHAREDCACHE]
    +**
    The database is opened [shared cache] enabled, overriding +** the default shared cache setting provided by +** [sqlite3_enable_shared_cache()].)^ +** +** ^(
    [SQLITE_OPEN_PRIVATECACHE]
    +**
    The database is opened [shared cache] disabled, overriding +** the default shared cache setting provided by +** [sqlite3_enable_shared_cache()].)^ +** +** [[OPEN_NOFOLLOW]] ^(
    [SQLITE_OPEN_NOFOLLOW]
    +**
    The database filename is not allowed to be a symbolic link
    +**
    )^ +** ** If the 3rd parameter to sqlite3_open_v2() is not one of the -** combinations shown above optionally combined with other +** required combinations shown above optionally combined with other ** [SQLITE_OPEN_READONLY | SQLITE_OPEN_* bits] ** then the behavior is undefined. ** -** ^If the [SQLITE_OPEN_NOMUTEX] flag is set, then the database connection -** opens in the multi-thread [threading mode] as long as the single-thread -** mode has not been set at compile-time or start-time. ^If the -** [SQLITE_OPEN_FULLMUTEX] flag is set then the database connection opens -** in the serialized [threading mode] unless single-thread was -** previously selected at compile-time or start-time. -** ^The [SQLITE_OPEN_SHAREDCACHE] flag causes the database connection to be -** eligible to use [shared cache mode], regardless of whether or not shared -** cache is enabled using [sqlite3_enable_shared_cache()]. ^The -** [SQLITE_OPEN_PRIVATECACHE] flag causes the database connection to not -** participate in [shared cache mode] even if it is enabled. -** ** ^The fourth parameter to sqlite3_open_v2() is the name of the ** [sqlite3_vfs] object that defines the operating system interface that ** the new database connection should use. ^If the fourth parameter is @@ -3353,17 +3529,16 @@ SQLITE_API int sqlite3_open_v2( /* ** CAPI3REF: Obtain Values For URI Parameters ** -** These are utility routines, useful to VFS implementations, that check -** to see if a database file was a URI that contained a specific query +** These are utility routines, useful to [VFS|custom VFS implementations], +** that check if a database file was a URI that contained a specific query ** parameter, and if so obtains the value of that query parameter. ** ** If F is the database filename pointer passed into the xOpen() method of -** a VFS implementation when the flags parameter to xOpen() has one or -** more of the [SQLITE_OPEN_URI] or [SQLITE_OPEN_MAIN_DB] bits set and -** P is the name of the query parameter, then +** a VFS implementation or it is the return value of [sqlite3_db_filename()] +** and if P is the name of the query parameter, then ** sqlite3_uri_parameter(F,P) returns the value of the P ** parameter if it exists or a NULL pointer if P does not appear as a -** query parameter on F. If P is a query parameter of F +** query parameter on F. If P is a query parameter of F and it ** has no explicit value, then sqlite3_uri_parameter(F,P) returns ** a pointer to an empty string. ** @@ -3375,23 +3550,72 @@ SQLITE_API int sqlite3_open_v2( ** sqlite3_uri_boolean(F,P,B) routines returns false (0) if the value of ** query parameter P is one of "no", "false", or "off" in any case or ** if the value begins with a numeric zero. If P is not a query -** parameter on F or if the value of P is does not match any of the +** parameter on F or if the value of P does not match any of the ** above, then sqlite3_uri_boolean(F,P,B) returns (B!=0). ** ** The sqlite3_uri_int64(F,P,D) routine converts the value of P into a ** 64-bit signed integer and returns that integer, or D if P does not ** exist. If the value of P is something other than an integer, then ** zero is returned. +** +** The sqlite3_uri_key(F,N) returns a pointer to the name (not +** the value) of the N-th query parameter for filename F, or a NULL +** pointer if N is less than zero or greater than the number of query +** parameters minus 1. The N value is zero-based so N should be 0 to obtain +** the name of the first query parameter, 1 for the second parameter, and +** so forth. ** ** If F is a NULL pointer, then sqlite3_uri_parameter(F,P) returns NULL and ** sqlite3_uri_boolean(F,P,B) returns B. If F is not a NULL pointer and -** is not a database file pathname pointer that SQLite passed into the xOpen -** VFS method, then the behavior of this routine is undefined and probably -** undesirable. +** is not a database file pathname pointer that the SQLite core passed +** into the xOpen VFS method, then the behavior of this routine is undefined +** and probably undesirable. +** +** Beginning with SQLite [version 3.31.0] ([dateof:3.31.0]) the input F +** parameter can also be the name of a rollback journal file or WAL file +** in addition to the main database file. Prior to version 3.31.0, these +** routines would only work if F was the name of the main database file. +** When the F parameter is the name of the rollback journal or WAL file, +** it has access to all the same query parameters as were found on the +** main database file. +** +** See the [URI filename] documentation for additional information. */ SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); SQLITE_API int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64); +SQLITE_API const char *sqlite3_uri_key(const char *zFilename, int N); + +/* +** CAPI3REF: Translate filenames +** +** These routines are available to [VFS|custom VFS implementations] for +** translating filenames between the main database file, the journal file, +** and the WAL file. +** +** If F is the name of an sqlite database file, journal file, or WAL file +** passed by the SQLite core into the VFS, then sqlite3_filename_database(F) +** returns the name of the corresponding database file. +** +** If F is the name of an sqlite database file, journal file, or WAL file +** passed by the SQLite core into the VFS, or if F is a database filename +** obtained from [sqlite3_db_filename()], then sqlite3_filename_journal(F) +** returns the name of the corresponding rollback journal file. +** +** If F is the name of an sqlite database file, journal file, or WAL file +** that was passed by the SQLite core into the VFS, or if F is a database +** filename obtained from [sqlite3_db_filename()], then +** sqlite3_filename_wal(F) returns the name of the corresponding +** WAL file. +** +** In all of the above, if F is not the name of a database, journal or WAL +** filename passed into the VFS from the SQLite core and F is not the +** return value from [sqlite3_db_filename()], then the result is +** undefined and is likely a memory access violation. +*/ +SQLITE_API const char *sqlite3_filename_database(const char*); +SQLITE_API const char *sqlite3_filename_journal(const char*); +SQLITE_API const char *sqlite3_filename_wal(const char*); /* @@ -3609,9 +3833,24 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** on this hint by avoiding the use of [lookaside memory] so as not to ** deplete the limited store of lookaside memory. Future versions of ** SQLite may act on this hint differently. +** +** [[SQLITE_PREPARE_NORMALIZE]]
    SQLITE_PREPARE_NORMALIZE
    +**
    The SQLITE_PREPARE_NORMALIZE flag is a no-op. This flag used +** to be required for any prepared statement that wanted to use the +** [sqlite3_normalized_sql()] interface. However, the +** [sqlite3_normalized_sql()] interface is now available to all +** prepared statements, regardless of whether or not they use this +** flag. +** +** [[SQLITE_PREPARE_NO_VTAB]]
    SQLITE_PREPARE_NO_VTAB
    +**
    The SQLITE_PREPARE_NO_VTAB flag causes the SQL compiler +** to return an error (error code SQLITE_ERROR) if the statement uses +** any virtual tables. ** */ #define SQLITE_PREPARE_PERSISTENT 0x01 +#define SQLITE_PREPARE_NORMALIZE 0x02 +#define SQLITE_PREPARE_NO_VTAB 0x04 /* ** CAPI3REF: Compiling An SQL Statement @@ -3695,15 +3934,15 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); **
  • ** **
  • -** ^If the specific value bound to [parameter | host parameter] in the +** ^If the specific value bound to a [parameter | host parameter] in the ** WHERE clause might influence the choice of query plan for a statement, ** then the statement will be automatically recompiled, as if there had been -** a schema change, on the first [sqlite3_step()] call following any change +** a schema change, on the first [sqlite3_step()] call following any change ** to the [sqlite3_bind_text | bindings] of that [parameter]. -** ^The specific value of WHERE-clause [parameter] might influence the +** ^The specific value of a WHERE-clause [parameter] might influence the ** choice of query plan if the parameter is the left-hand side of a [LIKE] ** or [GLOB] operator or if the parameter is compared to an indexed column -** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled. +** and the [SQLITE_ENABLE_STAT4] compile-time option is enabled. **
  • ** ** @@ -3769,6 +4008,11 @@ SQLITE_API int sqlite3_prepare16_v3( ** ^The sqlite3_expanded_sql(P) interface returns a pointer to a UTF-8 ** string containing the SQL text of prepared statement P with ** [bound parameters] expanded. +** ^The sqlite3_normalized_sql(P) interface returns a pointer to a UTF-8 +** string containing the normalized SQL text of prepared statement P. The +** semantics used to normalize a SQL statement are unspecified and subject +** to change. At a minimum, literal values will be replaced with suitable +** placeholders. ** ** ^(For example, if a prepared statement is created using the SQL ** text "SELECT $abc,:xyz" and if parameter $abc is bound to integer 2345 @@ -3784,14 +4028,16 @@ SQLITE_API int sqlite3_prepare16_v3( ** bound parameter expansions. ^The [SQLITE_OMIT_TRACE] compile-time ** option causes sqlite3_expanded_sql() to always return NULL. ** -** ^The string returned by sqlite3_sql(P) is managed by SQLite and is -** automatically freed when the prepared statement is finalized. +** ^The strings returned by sqlite3_sql(P) and sqlite3_normalized_sql(P) +** are managed by SQLite and are automatically freed when the prepared +** statement is finalized. ** ^The string returned by sqlite3_expanded_sql(P), on the other hand, ** is obtained from [sqlite3_malloc()] and must be free by the application ** by passing it to [sqlite3_free()]. */ SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt); +SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt); /* ** CAPI3REF: Determine If An SQL Statement Writes The Database @@ -3829,6 +4075,18 @@ SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt); */ SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); +/* +** CAPI3REF: Query The EXPLAIN Setting For A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_isexplain(S) interface returns 1 if the +** prepared statement S is an EXPLAIN statement, or 2 if the +** statement S is an EXPLAIN QUERY PLAN. +** ^The sqlite3_stmt_isexplain(S) interface returns 0 if S is +** an ordinary statement or a NULL pointer. +*/ +SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt); + /* ** CAPI3REF: Determine If A Prepared Statement Has Been Reset ** METHOD: sqlite3_stmt @@ -3968,7 +4226,9 @@ typedef struct sqlite3_context sqlite3_context; ** ^The fifth argument to the BLOB and string binding interfaces ** is a destructor used to dispose of the BLOB or ** string after SQLite has finished with it. ^The destructor is called -** to dispose of the BLOB or string even if the call to bind API fails. +** to dispose of the BLOB or string even if the call to the bind API fails, +** except the destructor is not called if the third parameter is a NULL +** pointer or the fourth parameter is negative. ** ^If the fifth argument is ** the special value [SQLITE_STATIC], then SQLite assumes that the ** information is in static, unmanaged space and does not need to be freed. @@ -4188,7 +4448,7 @@ SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); ** ** ^If the Nth column returned by the statement is an expression or ** subquery and is not a column value, then all of these functions return -** NULL. ^These routine might also return NULL if a memory allocation error +** NULL. ^These routines might also return NULL if a memory allocation error ** occurs. ^Otherwise, they return the name of the attached database, table, ** or column that query result column was extracted from. ** @@ -4198,10 +4458,6 @@ SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); ** ^These APIs are only available if the library was compiled with the ** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol. ** -** If two or more threads call one or more of these routines against the same -** prepared statement and column at the same time then the results are -** undefined. -** ** If two or more threads call one or more ** [sqlite3_column_database_name | column metadata interfaces] ** for the same [prepared statement] and result column @@ -4338,7 +4594,7 @@ SQLITE_API int sqlite3_step(sqlite3_stmt*); ** ^The sqlite3_data_count(P) interface returns the number of columns in the ** current row of the result set of [prepared statement] P. ** ^If prepared statement P does not have results ready to return -** (via calls to the [sqlite3_column_int | sqlite3_column_*()] of +** (via calls to the [sqlite3_column_int | sqlite3_column()] family of ** interfaces) then sqlite3_data_count(P) returns 0. ** ^The sqlite3_data_count(P) routine also returns 0 if P is a NULL pointer. ** ^The sqlite3_data_count(P) routine returns 0 if the previous call to @@ -4662,8 +4918,6 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); /* ** CAPI3REF: Create Or Redefine SQL Functions ** KEYWORDS: {function creation routines} -** KEYWORDS: {application-defined SQL function} -** KEYWORDS: {application-defined SQL functions} ** METHOD: sqlite3 ** ** ^These functions (collectively known as "function creation routines") @@ -4717,6 +4971,23 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); ** perform additional optimizations on deterministic functions, so use ** of the [SQLITE_DETERMINISTIC] flag is recommended where possible. ** +** ^The fourth parameter may also optionally include the [SQLITE_DIRECTONLY] +** flag, which if present prevents the function from being invoked from +** within VIEWs, TRIGGERs, CHECK constraints, generated column expressions, +** index expressions, or the WHERE clause of partial indexes. +** +** +** For best security, the [SQLITE_DIRECTONLY] flag is recommended for +** all application-defined SQL functions that do not need to be +** used inside of triggers, view, CHECK constraints, or other elements of +** the database schema. This flags is especially recommended for SQL +** functions that have side effects or reveal internal application state. +** Without this flag, an attacker might be able to modify the schema of +** a database file to include invocations of the function with parameters +** chosen by the attacker, which the application will then execute when +** the database file is opened and read. +** +** ** ^(The fifth parameter is an arbitrary pointer. The implementation of the ** function can gain access to this pointer using [sqlite3_user_data()].)^ ** @@ -4833,8 +5104,68 @@ SQLITE_API int sqlite3_create_window_function( ** [SQLITE_UTF8 | preferred text encoding] as the fourth argument ** to [sqlite3_create_function()], [sqlite3_create_function16()], or ** [sqlite3_create_function_v2()]. +** +**
    +** [[SQLITE_DETERMINISTIC]]
    SQLITE_DETERMINISTIC
    +** The SQLITE_DETERMINISTIC flag means that the new function always gives +** the same output when the input parameters are the same. +** The [abs|abs() function] is deterministic, for example, but +** [randomblob|randomblob()] is not. Functions must +** be deterministic in order to be used in certain contexts such as +** with the WHERE clause of [partial indexes] or in [generated columns]. +** SQLite might also optimize deterministic functions by factoring them +** out of inner loops. +**
    +** +** [[SQLITE_DIRECTONLY]]
    SQLITE_DIRECTONLY
    +** The SQLITE_DIRECTONLY flag means that the function may only be invoked +** from top-level SQL, and cannot be used in VIEWs or TRIGGERs nor in +** schema structures such as [CHECK constraints], [DEFAULT clauses], +** [expression indexes], [partial indexes], or [generated columns]. +** The SQLITE_DIRECTONLY flags is a security feature which is recommended +** for all [application-defined SQL functions], and especially for functions +** that have side-effects or that could potentially leak sensitive +** information. +**
    +** +** [[SQLITE_INNOCUOUS]]
    SQLITE_INNOCUOUS
    +** The SQLITE_INNOCUOUS flag means that the function is unlikely +** to cause problems even if misused. An innocuous function should have +** no side effects and should not depend on any values other than its +** input parameters. The [abs|abs() function] is an example of an +** innocuous function. +** The [load_extension() SQL function] is not innocuous because of its +** side effects. +**

    SQLITE_INNOCUOUS is similar to SQLITE_DETERMINISTIC, but is not +** exactly the same. The [random|random() function] is an example of a +** function that is innocuous but not deterministic. +**

    Some heightened security settings +** ([SQLITE_DBCONFIG_TRUSTED_SCHEMA] and [PRAGMA trusted_schema=OFF]) +** disable the use of SQL functions inside views and triggers and in +** schema structures such as [CHECK constraints], [DEFAULT clauses], +** [expression indexes], [partial indexes], and [generated columns] unless +** the function is tagged with SQLITE_INNOCUOUS. Most built-in functions +** are innocuous. Developers are advised to avoid using the +** SQLITE_INNOCUOUS flag for application-defined functions unless the +** function has been carefully audited and found to be free of potentially +** security-adverse side-effects and information-leaks. +**

    +** +** [[SQLITE_SUBTYPE]]
    SQLITE_SUBTYPE
    +** The SQLITE_SUBTYPE flag indicates to SQLite that a function may call +** [sqlite3_value_subtype()] to inspect the sub-types of its arguments. +** Specifying this flag makes no difference for scalar or aggregate user +** functions. However, if it is not specified for a user-defined window +** function, then any sub-types belonging to arguments passed to the window +** function may be discarded before the window function is called (i.e. +** sqlite3_value_subtype() will always return 0). +**
    +**
    */ -#define SQLITE_DETERMINISTIC 0x800 +#define SQLITE_DETERMINISTIC 0x000000800 +#define SQLITE_DIRECTONLY 0x000080000 +#define SQLITE_SUBTYPE 0x000100000 +#define SQLITE_INNOCUOUS 0x000200000 /* ** CAPI3REF: Deprecated Functions @@ -4885,14 +5216,16 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** sqlite3_value_nochange   ** →  True if the column is unchanged in an UPDATE ** against a virtual table. +** sqlite3_value_frombind   +** →  True if value originated from a [bound parameter] ** ** ** Details: ** ** These routines extract type, size, and content information from ** [protected sqlite3_value] objects. Protected sqlite3_value objects -** are used to pass parameter information into implementation of -** [application-defined SQL functions] and [virtual tables]. +** are used to pass parameter information into the functions that +** implement [application-defined SQL functions] and [virtual tables]. ** ** These routines work only with [protected sqlite3_value] objects. ** Any attempt to use these routines on an [unprotected sqlite3_value] @@ -4946,6 +5279,11 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** than within an [xUpdate] method call for an UPDATE statement, then ** the return value is arbitrary and meaningless. ** +** ^The sqlite3_value_frombind(X) interface returns non-zero if the +** value X originated from one of the [sqlite3_bind_int|sqlite3_bind()] +** interfaces. ^If X comes from an SQL literal value, or a table column, +** or an expression, then sqlite3_value_frombind(X) returns zero. +** ** Please pay particular attention to the fact that the pointer returned ** from [sqlite3_value_blob()], [sqlite3_value_text()], or ** [sqlite3_value_text16()] can be invalidated by a subsequent call to @@ -4991,6 +5329,7 @@ SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); SQLITE_API int sqlite3_value_type(sqlite3_value*); SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); SQLITE_API int sqlite3_value_nochange(sqlite3_value*); +SQLITE_API int sqlite3_value_frombind(sqlite3_value*); /* ** CAPI3REF: Finding The Subtype Of SQL Values @@ -5029,8 +5368,8 @@ SQLITE_API void sqlite3_value_free(sqlite3_value*); ** routine to allocate memory for storing their state. ** ** ^The first time the sqlite3_aggregate_context(C,N) routine is called -** for a particular aggregate function, SQLite -** allocates N of memory, zeroes out that memory, and returns a pointer +** for a particular aggregate function, SQLite allocates +** N bytes of memory, zeroes out that memory, and returns a pointer ** to the new memory. ^On second and subsequent calls to ** sqlite3_aggregate_context() for the same aggregate function instance, ** the same buffer is returned. Sqlite3_aggregate_context() is normally @@ -5047,7 +5386,7 @@ SQLITE_API void sqlite3_value_free(sqlite3_value*); ** ** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is ** determined by the N parameter on first successful call. Changing the -** value of N in subsequent call to sqlite3_aggregate_context() within +** value of N in any subsequents call to sqlite3_aggregate_context() within ** the same aggregate function instance will not resize the memory ** allocation.)^ Within the xFinal callback, it is customary to set ** N=0 in calls to sqlite3_aggregate_context(C,N) so that no @@ -5358,7 +5697,7 @@ SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); **
  • [SQLITE_UTF16_ALIGNED]. ** )^ ** ^The eTextRep argument determines the encoding of strings passed -** to the collating function callback, xCallback. +** to the collating function callback, xCompare. ** ^The [SQLITE_UTF16] and [SQLITE_UTF16_ALIGNED] values for eTextRep ** force strings to be UTF16 with native byte order. ** ^The [SQLITE_UTF16_ALIGNED] value for eTextRep forces strings to begin @@ -5367,18 +5706,19 @@ SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); ** ^The fourth argument, pArg, is an application data pointer that is passed ** through as the first argument to the collating function callback. ** -** ^The fifth argument, xCallback, is a pointer to the collating function. +** ^The fifth argument, xCompare, is a pointer to the collating function. ** ^Multiple collating functions can be registered using the same name but ** with different eTextRep parameters and SQLite will use whichever ** function requires the least amount of data transformation. -** ^If the xCallback argument is NULL then the collating function is +** ^If the xCompare argument is NULL then the collating function is ** deleted. ^When all collating functions having the same name are deleted, ** that collation is no longer usable. ** ** ^The collating function callback is invoked with a copy of the pArg ** application data pointer and with two strings in the encoding specified -** by the eTextRep argument. The collating function must return an -** integer that is negative, zero, or positive +** by the eTextRep argument. The two integer parameters to the collating +** function callback are the length of the two strings, in bytes. The collating +** function must return an integer that is negative, zero, or positive ** if the first string is less than, equal to, or greater than the second, ** respectively. A collating function must always return the same answer ** given the same inputs. If two or more collating functions are registered @@ -5395,7 +5735,7 @@ SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); ** ** ** If a collating function fails any of the above constraints and that -** collating function is registered and used, then the behavior of SQLite +** collating function is registered and used, then the behavior of SQLite ** is undefined. ** ** ^The sqlite3_create_collation_v2() works like sqlite3_create_collation() @@ -5722,16 +6062,31 @@ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); ** CAPI3REF: Return The Filename For A Database Connection ** METHOD: sqlite3 ** -** ^The sqlite3_db_filename(D,N) interface returns a pointer to a filename -** associated with database N of connection D. ^The main database file -** has the name "main". If there is no attached database N on the database +** ^The sqlite3_db_filename(D,N) interface returns a pointer to the filename +** associated with database N of connection D. +** ^If there is no attached database N on the database ** connection D, or if database N is a temporary or in-memory database, then -** a NULL pointer is returned. +** this function will return either a NULL pointer or an empty string. +** +** ^The string value returned by this routine is owned and managed by +** the database connection. ^The value will be valid until the database N +** is [DETACH]-ed or until the database connection closes. ** ** ^The filename returned by this function is the output of the ** xFullPathname method of the [VFS]. ^In other words, the filename ** will be an absolute pathname, even if the filename used ** to open the database originally was a URI or relative pathname. +** +** If the filename pointer returned by this routine is not NULL, then it +** can be used as the filename input parameter to these routines: +** */ SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); @@ -5881,15 +6236,19 @@ SQLITE_API void *sqlite3_update_hook( ** ** ^(The cache sharing mode set by this interface effects all subsequent ** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()]. -** Existing database connections continue use the sharing mode +** Existing database connections continue to use the sharing mode ** that was in effect at the time they were opened.)^ ** ** ^(This routine returns [SQLITE_OK] if shared cache was enabled or disabled ** successfully. An [error code] is returned otherwise.)^ ** -** ^Shared cache is disabled by default. But this might change in -** future releases of SQLite. Applications that care about shared -** cache setting should set it explicitly. +** ^Shared cache is disabled by default. It is recommended that it stay +** that way. In other words, do not use this routine. This interface +** continues to be provided for historical compatibility, but its use is +** discouraged. Any use of shared cache is discouraged. If shared cache +** must be used, it is recommended that shared cache only be enabled for +** individual database connections using the [sqlite3_open_v2()] interface +** with the [SQLITE_OPEN_SHAREDCACHE] flag. ** ** Note: This method is disabled on MacOS X 10.7 and iOS version 5.0 ** and will always return SQLITE_MISUSE. On those systems, @@ -5936,6 +6295,9 @@ SQLITE_API int sqlite3_db_release_memory(sqlite3*); /* ** CAPI3REF: Impose A Limit On Heap Size ** +** These interfaces impose limits on the amount of heap memory that will be +** by all database connections within a single process. +** ** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the ** soft limit on the amount of heap memory that may be allocated by SQLite. ** ^SQLite strives to keep heap memory utilization below the soft heap @@ -5946,20 +6308,41 @@ SQLITE_API int sqlite3_db_release_memory(sqlite3*); ** an [SQLITE_NOMEM] error. In other words, the soft heap limit ** is advisory only. ** -** ^The return value from sqlite3_soft_heap_limit64() is the size of -** the soft heap limit prior to the call, or negative in the case of an -** error. ^If the argument N is negative -** then no change is made to the soft heap limit. Hence, the current -** size of the soft heap limit can be determined by invoking -** sqlite3_soft_heap_limit64() with a negative argument. -** -** ^If the argument N is zero then the soft heap limit is disabled. +** ^The sqlite3_hard_heap_limit64(N) interface sets a hard upper bound of +** N bytes on the amount of memory that will be allocated. ^The +** sqlite3_hard_heap_limit64(N) interface is similar to +** sqlite3_soft_heap_limit64(N) except that memory allocations will fail +** when the hard heap limit is reached. ** -** ^(The soft heap limit is not enforced in the current implementation +** ^The return value from both sqlite3_soft_heap_limit64() and +** sqlite3_hard_heap_limit64() is the size of +** the heap limit prior to the call, or negative in the case of an +** error. ^If the argument N is negative +** then no change is made to the heap limit. Hence, the current +** size of heap limits can be determined by invoking +** sqlite3_soft_heap_limit64(-1) or sqlite3_hard_heap_limit(-1). +** +** ^Setting the heap limits to zero disables the heap limiter mechanism. +** +** ^The soft heap limit may not be greater than the hard heap limit. +** ^If the hard heap limit is enabled and if sqlite3_soft_heap_limit(N) +** is invoked with a value of N that is greater than the hard heap limit, +** the the soft heap limit is set to the value of the hard heap limit. +** ^The soft heap limit is automatically enabled whenever the hard heap +** limit is enabled. ^When sqlite3_hard_heap_limit64(N) is invoked and +** the soft heap limit is outside the range of 1..N, then the soft heap +** limit is set to N. ^Invoking sqlite3_soft_heap_limit64(0) when the +** hard heap limit is enabled makes the soft heap limit equal to the +** hard heap limit. +** +** The memory allocation limits can also be adjusted using +** [PRAGMA soft_heap_limit] and [PRAGMA hard_heap_limit]. +** +** ^(The heap limits are not enforced in the current implementation ** if one or more of following conditions are true: ** ** )^ ** -** Beginning with SQLite [version 3.7.3] ([dateof:3.7.3]), -** the soft heap limit is enforced -** regardless of whether or not the [SQLITE_ENABLE_MEMORY_MANAGEMENT] -** compile-time option is invoked. With [SQLITE_ENABLE_MEMORY_MANAGEMENT], -** the soft heap limit is enforced on every memory allocation. Without -** [SQLITE_ENABLE_MEMORY_MANAGEMENT], the soft heap limit is only enforced -** when memory is allocated by the page cache. Testing suggests that because -** the page cache is the predominate memory user in SQLite, most -** applications will achieve adequate soft heap limit enforcement without -** the use of [SQLITE_ENABLE_MEMORY_MANAGEMENT]. -** -** The circumstances under which SQLite will enforce the soft heap limit may +** The circumstances under which SQLite will enforce the heap limits may ** changes in future releases of SQLite. */ SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N); +SQLITE_API sqlite3_int64 sqlite3_hard_heap_limit64(sqlite3_int64 N); /* ** CAPI3REF: Deprecated Soft Heap Limit Interface @@ -6008,7 +6381,7 @@ SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); ** interface returns SQLITE_OK and fills in the non-NULL pointers in ** the final five arguments with appropriate values if the specified ** column exists. ^The sqlite3_table_column_metadata() interface returns -** SQLITE_ERROR and if the specified column does not exist. +** SQLITE_ERROR if the specified column does not exist. ** ^If the column-name parameter to sqlite3_table_column_metadata() is a ** NULL pointer, then this routine simply checks for the existence of the ** table and returns SQLITE_OK if the table exists and SQLITE_ERROR if it @@ -6150,7 +6523,7 @@ SQLITE_API int sqlite3_load_extension( ** to enable or disable only the C-API.)^ ** ** Security warning: It is recommended that extension loading -** be disabled using the [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method +** be enabled using the [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method ** rather than this interface, so the [load_extension()] SQL function ** remains disabled. This will prevent SQL injections from giving attackers ** access to extension loading capabilities. @@ -6237,7 +6610,7 @@ typedef struct sqlite3_module sqlite3_module; ** KEYWORDS: sqlite3_module {virtual table module} ** ** This structure, sometimes called a "virtual table module", -** defines the implementation of a [virtual tables]. +** defines the implementation of a [virtual table]. ** This structure consists mostly of methods for the module. ** ** ^A virtual table module is created by filling in a persistent @@ -6281,6 +6654,9 @@ struct sqlite3_module { int (*xSavepoint)(sqlite3_vtab *pVTab, int); int (*xRelease)(sqlite3_vtab *pVTab, int); int (*xRollbackTo)(sqlite3_vtab *pVTab, int); + /* The methods above are in versions 1 and 2 of the sqlite_module object. + ** Those below are for version 3 and greater. */ + int (*xShadowName)(const char*); }; /* @@ -6331,7 +6707,13 @@ struct sqlite3_module { ** the right-hand side of the corresponding aConstraint[] is evaluated ** and becomes the argvIndex-th entry in argv. ^(If aConstraintUsage[].omit ** is true, then the constraint is assumed to be fully handled by the -** virtual table and is not checked again by SQLite.)^ +** virtual table and might not be checked again by the byte code.)^ ^(The +** aConstraintUsage[].omit flag is an optimization hint. When the omit flag +** is left in its default setting of false, the constraint will always be +** checked separately in byte code. If the omit flag is change to true, then +** the constraint may or may not be checked in byte code. In other words, +** when the omit flag is true there is no guarantee that the constraint will +** not be checked again using byte code.)^ ** ** ^The idxNum and idxPtr values are recorded and passed into the ** [xFilter] method. @@ -6371,7 +6753,7 @@ struct sqlite3_module { ** If a virtual table extension is ** used with an SQLite version earlier than 3.8.2, the results of attempting ** to read or write the estimatedRows field are undefined (but are likely -** to included crashing the application). The estimatedRows field should +** to include crashing the application). The estimatedRows field should ** therefore only be used if [sqlite3_libversion_number()] returns a ** value greater than or equal to 3008002. Similarly, the idxFlags field ** was added for [version 3.9.0] ([dateof:3.9.0]). @@ -6423,7 +6805,7 @@ struct sqlite3_index_info { /* ** CAPI3REF: Virtual Table Constraint Operator Codes ** -** These macros defined the allowed values for the +** 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 ** a query that uses a [virtual table]. @@ -6469,6 +6851,12 @@ struct sqlite3_index_info { ** ^The sqlite3_create_module() ** interface is equivalent to sqlite3_create_module_v2() with a NULL ** 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 +** same name are dropped. +** +** See also: [sqlite3_drop_modules()] */ SQLITE_API int sqlite3_create_module( sqlite3 *db, /* SQLite connection to register module with */ @@ -6484,6 +6872,23 @@ SQLITE_API int sqlite3_create_module_v2( void(*xDestroy)(void*) /* Module destructor function */ ); +/* +** CAPI3REF: Remove Unnecessary Virtual Table Implementations +** METHOD: sqlite3 +** +** ^The sqlite3_drop_modules(D,L) interface removes all virtual +** table modules from database connection D except those named on list L. +** The L parameter must be either NULL or a pointer to an array of pointers +** to strings where the array is terminated by a single NULL pointer. +** ^If the L parameter is NULL, then all virtual table modules are removed. +** +** See also: [sqlite3_create_module()] +*/ +SQLITE_API int sqlite3_drop_modules( + sqlite3 *db, /* Remove modules from this connection */ + const char **azKeep /* Except, do not remove the ones named here */ +); + /* ** CAPI3REF: Virtual Table Instance Object ** KEYWORDS: sqlite3_vtab @@ -7010,7 +7415,7 @@ SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); ** The only difference is that the public sqlite3_XXX functions enumerated ** above silently ignore any invocations that pass a NULL pointer instead ** of a valid mutex handle. The implementations of the methods defined -** by this structure are not required to handle this case, the results +** by this structure are not required to handle this case. The results ** of passing a NULL pointer instead of a valid mutex handle are undefined ** (i.e. it is acceptable to provide an implementation that segfaults if ** it is passed a NULL pointer). @@ -7192,7 +7597,7 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_FIRST 5 #define SQLITE_TESTCTRL_PRNG_SAVE 5 #define SQLITE_TESTCTRL_PRNG_RESTORE 6 -#define SQLITE_TESTCTRL_PRNG_RESET 7 +#define SQLITE_TESTCTRL_PRNG_RESET 7 /* NOT USED */ #define SQLITE_TESTCTRL_BITVEC_TEST 8 #define SQLITE_TESTCTRL_FAULT_INSTALL 9 #define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 @@ -7203,6 +7608,7 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_OPTIMIZATIONS 15 #define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */ #define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */ +#define SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 17 #define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 #define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */ #define SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD 19 @@ -7213,7 +7619,10 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_SORTER_MMAP 24 #define SQLITE_TESTCTRL_IMPOSTER 25 #define SQLITE_TESTCTRL_PARSER_COVERAGE 26 -#define SQLITE_TESTCTRL_LAST 26 /* Largest TESTCTRL */ +#define SQLITE_TESTCTRL_RESULT_INTREAL 27 +#define SQLITE_TESTCTRL_PRNG_SEED 28 +#define SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS 29 +#define SQLITE_TESTCTRL_LAST 29 /* Largest TESTCTRL */ /* ** CAPI3REF: SQL Keyword Checking @@ -7479,7 +7888,7 @@ SQLITE_API int sqlite3_status64( ** ** [[SQLITE_STATUS_PAGECACHE_SIZE]] ^(
    SQLITE_STATUS_PAGECACHE_SIZE
    **
    This parameter records the largest memory allocation request -** handed to [pagecache memory allocator]. Only the value returned in the +** handed to the [pagecache memory allocator]. Only the value returned in the ** *pHighwater parameter to [sqlite3_status()] is of interest. ** The value written into the *pCurrent parameter is undefined.
    )^ ** @@ -7555,7 +7964,7 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** checked out.)^ ** ** [[SQLITE_DBSTATUS_LOOKASIDE_HIT]] ^(
    SQLITE_DBSTATUS_LOOKASIDE_HIT
    -**
    This parameter returns the number malloc attempts that were +**
    This parameter returns the number of malloc attempts that were ** satisfied using lookaside memory. Only the high-water value is meaningful; ** the current value is always zero.)^ ** @@ -7637,7 +8046,7 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** cache overflowing. Transactions are more efficient if they are written ** to disk all at once. When pages spill mid-transaction, that introduces ** additional overhead. This parameter can be used help identify -** inefficiencies that can be resolve by increasing the cache size. +** inefficiencies that can be resolved by increasing the cache size. **
    ** ** [[SQLITE_DBSTATUS_DEFERRED_FKS]] ^(
    SQLITE_DBSTATUS_DEFERRED_FKS
    @@ -7726,7 +8135,7 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); ** ** [[SQLITE_STMTSTATUS_REPREPARE]]
    SQLITE_STMTSTATUS_REPREPARE
    **
    ^This is the number of times that the prepare statement has been -** automatically regenerated due to schema changes or change to +** automatically regenerated due to schema changes or changes to ** [bound parameters] that might affect the query plan. ** ** [[SQLITE_STMTSTATUS_RUN]]
    SQLITE_STMTSTATUS_RUN
    @@ -7897,7 +8306,7 @@ struct sqlite3_pcache_page { ** ** ^(SQLite will normally invoke xFetch() with a createFlag of 0 or 1. SQLite ** will only use a createFlag of 2 after a prior call with a createFlag of 1 -** failed.)^ In between the to xFetch() calls, SQLite may +** failed.)^ In between the xFetch() calls, SQLite may ** attempt to unpin one or more cache pages by spilling the content of ** pinned pages to disk and synching the operating system disk cache. ** @@ -8215,7 +8624,7 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** the first argument to register for a callback that will be invoked ** when the blocking connections current transaction is concluded. ^The ** callback is invoked from within the [sqlite3_step] or [sqlite3_close] -** call that concludes the blocking connections transaction. +** call that concludes the blocking connection's transaction. ** ** ^(If sqlite3_unlock_notify() is called in a multi-threaded application, ** there is a chance that the blocking connection will have already @@ -8253,7 +8662,7 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** an unlock-notify callback is a pointer to an array of void* pointers, ** and the second is the number of entries in the array. ** -** When a blocking connections transaction is concluded, there may be +** When a blocking connection's transaction is concluded, there may be ** more than one blocked connection that has registered for an unlock-notify ** callback. ^If two or more such blocked connections have specified the ** same callback function, then instead of invoking the callback function @@ -8601,21 +9010,28 @@ SQLITE_API int sqlite3_wal_checkpoint_v2( ** If this interface is invoked outside the context of an xConnect or ** xCreate virtual table method then the behavior is undefined. ** -** At present, there is only one option that may be configured using -** this function. (See [SQLITE_VTAB_CONSTRAINT_SUPPORT].) Further options -** may be added in the future. +** In the call sqlite3_vtab_config(D,C,...) the D parameter is the +** [database connection] in which the virtual table is being created and +** which is passed in as the first argument to the [xConnect] or [xCreate] +** method that is invoking sqlite3_vtab_config(). The C parameter is one +** of the [virtual table configuration options]. The presence and meaning +** of parameters after C depend on which [virtual table configuration option] +** is used. */ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); /* ** CAPI3REF: Virtual Table Configuration Options +** KEYWORDS: {virtual table configuration options} +** KEYWORDS: {virtual table configuration option} ** ** These macros define the various options to the ** [sqlite3_vtab_config()] interface that [virtual table] implementations ** can use to customize and optimize their behavior. ** **
    -**
    SQLITE_VTAB_CONSTRAINT_SUPPORT +** [[SQLITE_VTAB_CONSTRAINT_SUPPORT]] +**
    SQLITE_VTAB_CONSTRAINT_SUPPORT
    **
    Calls of the form ** [sqlite3_vtab_config](db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X) are supported, ** where X is an integer. If X is zero, then the [virtual table] whose @@ -8644,9 +9060,31 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); ** return SQLITE_OK. Or, if this is not possible, it may return ** SQLITE_CONSTRAINT, in which case SQLite falls back to OR ABORT ** constraint handling. +**
    +** +** [[SQLITE_VTAB_DIRECTONLY]]
    SQLITE_VTAB_DIRECTONLY
    +**
    Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_DIRECTONLY) from within the +** the [xConnect] or [xCreate] methods of a [virtual table] implmentation +** prohibits that virtual table from being used from within triggers and +** views. +**
    +** +** [[SQLITE_VTAB_INNOCUOUS]]
    SQLITE_VTAB_INNOCUOUS
    +**
    Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_INNOCUOUS) from within the +** the [xConnect] or [xCreate] methods of a [virtual table] implmentation +** identify that virtual table as being safe to use from within triggers +** and views. Conceptually, the SQLITE_VTAB_INNOCUOUS tag means that the +** virtual table can do no serious harm even if it is controlled by a +** malicious hacker. Developers should avoid setting the SQLITE_VTAB_INNOCUOUS +** flag unless absolutely necessary. +**
    **
    */ #define SQLITE_VTAB_CONSTRAINT_SUPPORT 1 +#define SQLITE_VTAB_INNOCUOUS 2 +#define SQLITE_VTAB_DIRECTONLY 3 /* ** CAPI3REF: Determine The Virtual Table Conflict Policy @@ -8726,15 +9164,15 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_ ** **
    ** [[SQLITE_SCANSTAT_NLOOP]]
    SQLITE_SCANSTAT_NLOOP
    -**
    ^The [sqlite3_int64] variable pointed to by the T parameter will be +**
    ^The [sqlite3_int64] variable pointed to by the V parameter will be ** set to the total number of times that the X-th loop has run.
    ** ** [[SQLITE_SCANSTAT_NVISIT]]
    SQLITE_SCANSTAT_NVISIT
    -**
    ^The [sqlite3_int64] variable pointed to by the T parameter will be set +**
    ^The [sqlite3_int64] variable pointed to by the V parameter will be set ** to the total number of rows examined by all iterations of the X-th loop.
    ** ** [[SQLITE_SCANSTAT_EST]]
    SQLITE_SCANSTAT_EST
    -**
    ^The "double" variable pointed to by the T parameter will be set to the +**
    ^The "double" variable pointed to by the V parameter will be set to the ** query planner's estimate for the average number of rows output from each ** iteration of the X-th loop. If the query planner's estimates was accurate, ** then this value will approximate the quotient NVISIT/NLOOP and the @@ -8742,17 +9180,17 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_ ** be the NLOOP value for the current loop. ** ** [[SQLITE_SCANSTAT_NAME]]
    SQLITE_SCANSTAT_NAME
    -**
    ^The "const char *" variable pointed to by the T parameter will be set +**
    ^The "const char *" variable pointed to by the V parameter will be set ** to a zero-terminated UTF-8 string containing the name of the index or table ** used for the X-th loop. ** ** [[SQLITE_SCANSTAT_EXPLAIN]]
    SQLITE_SCANSTAT_EXPLAIN
    -**
    ^The "const char *" variable pointed to by the T parameter will be set +**
    ^The "const char *" variable pointed to by the V parameter will be set ** to a zero-terminated UTF-8 string containing the [EXPLAIN QUERY PLAN] ** description for the X-th loop. ** ** [[SQLITE_SCANSTAT_SELECTID]]
    SQLITE_SCANSTAT_SELECT
    -**
    ^The "int" variable pointed to by the T parameter will be set to the +**
    ^The "int" variable pointed to by the V parameter will be set to the ** "select-id" for the X-th loop. The select-id identifies which query or ** subquery the loop is part of. The main query has a select-id of zero. ** The select-id is the same value as is output in the first column @@ -9384,7 +9822,7 @@ struct sqlite3_rtree_query_info { sqlite3_int64 iRowid; /* Rowid for current entry */ sqlite3_rtree_dbl rParentScore; /* Score of parent node */ int eParentWithin; /* Visibility of parent node */ - int eWithin; /* OUT: Visiblity */ + int eWithin; /* OUT: Visibility */ sqlite3_rtree_dbl rScore; /* OUT: Write the score here */ /* The following fields are only available in 3.8.11 and later */ sqlite3_value **apSqlParam; /* Original SQL values of parameters */ @@ -9607,7 +10045,7 @@ SQLITE_API int sqlite3session_attach( ** The second argument (xFilter) is the "filter callback". For changes to rows ** in tables that are not attached to the Session object, the filter is called ** to determine whether changes to the table's rows should be tracked or not. -** If xFilter returns 0, changes is not tracked. Note that once a table is +** If xFilter returns 0, changes are not tracked. Note that once a table is ** attached, xFilter will not be called again. */ SQLITE_API void sqlite3session_table_filter( @@ -9781,7 +10219,7 @@ SQLITE_API int sqlite3session_changeset( ** It an error if database zFrom does not exist or does not contain the ** required compatible table. ** -** If the operation successful, SQLITE_OK is returned. Otherwise, an SQLite +** If the operation is successful, SQLITE_OK is returned. Otherwise, an SQLite ** error code. In this case, if argument pzErrMsg is not NULL, *pzErrMsg ** may be set to point to a buffer containing an English language error ** message. It is the responsibility of the caller to free this buffer using @@ -9880,19 +10318,45 @@ SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession); ** consecutively. There is no chance that the iterator will visit a change ** the applies to table X, then one for table Y, and then later on visit ** another change for table X. +** +** The behavior of sqlite3changeset_start_v2() and its streaming equivalent +** may be modified by passing a combination of +** [SQLITE_CHANGESETSTART_INVERT | supported flags] as the 4th parameter. +** +** Note that the sqlite3changeset_start_v2() API is still experimental +** and therefore subject to change. */ SQLITE_API int sqlite3changeset_start( sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ int nChangeset, /* Size of changeset blob in bytes */ void *pChangeset /* Pointer to blob containing changeset */ ); +SQLITE_API int sqlite3changeset_start_v2( + sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ + int nChangeset, /* Size of changeset blob in bytes */ + void *pChangeset, /* Pointer to blob containing changeset */ + int flags /* SESSION_CHANGESETSTART_* flags */ +); + +/* +** CAPI3REF: Flags for sqlite3changeset_start_v2 +** +** The following flags may passed via the 4th parameter to +** [sqlite3changeset_start_v2] and [sqlite3changeset_start_v2_strm]: +** +**
    SQLITE_CHANGESETAPPLY_INVERT
    +** Invert the changeset while iterating through it. This is equivalent to +** inverting a changeset using sqlite3changeset_invert() before applying it. +** It is an error to specify this flag with a patchset. +*/ +#define SQLITE_CHANGESETSTART_INVERT 0x0002 /* ** CAPI3REF: Advance A Changeset Iterator ** METHOD: sqlite3_changeset_iter ** -** This function may only be used with iterators created by function +** This function may only be used with iterators created by the function ** [sqlite3changeset_start()]. If it is called on an iterator passed to ** a conflict-handler callback by [sqlite3changeset_apply()], SQLITE_MISUSE ** is returned and the call has no effect. @@ -9929,7 +10393,7 @@ SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter); ** sqlite3changeset_next() is called on the iterator or until the ** conflict-handler function returns. If pnCol is not NULL, then *pnCol is ** set to the number of columns in the table affected by the change. If -** pbIncorrect is not NULL, then *pbIndirect is set to true (1) if the change +** pbIndirect is not NULL, then *pbIndirect is set to true (1) if the change ** is an indirect change, or false (0) otherwise. See the documentation for ** [sqlite3session_indirect()] for a description of direct and indirect ** changes. Finally, if pOp is not NULL, then *pOp is set to one of @@ -10308,8 +10772,8 @@ SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); ** case, this function fails with SQLITE_SCHEMA. If the input changeset ** appears to be corrupt and the corruption is detected, SQLITE_CORRUPT is ** returned. Or, if an out-of-memory condition occurs during processing, this -** function returns SQLITE_NOMEM. In all cases, if an error occurs the -** final contents of the changegroup is undefined. +** function returns SQLITE_NOMEM. In all cases, if an error occurs the state +** of the final contents of the changegroup is undefined. ** ** If no error occurs, SQLITE_OK is returned. */ @@ -10484,7 +10948,7 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); ** ** It is safe to execute SQL statements, including those that write to the ** table that the callback related to, from within the xConflict callback. -** This can be used to further customize the applications conflict +** This can be used to further customize the application's conflict ** resolution strategy. ** ** All changes made by these functions are enclosed in a savepoint transaction. @@ -10540,7 +11004,7 @@ SQLITE_API int sqlite3changeset_apply_v2( ), void *pCtx, /* First argument passed to xConflict */ void **ppRebase, int *pnRebase, /* OUT: Rebase data */ - int flags /* Combination of SESSION_APPLY_* flags */ + int flags /* SESSION_CHANGESETAPPLY_* flags */ ); /* @@ -10558,8 +11022,14 @@ SQLITE_API int sqlite3changeset_apply_v2( ** causes the sessions module to omit this savepoint. In this case, if the ** caller has an open transaction or savepoint when apply_v2() is called, ** it may revert the partially applied changeset by rolling it back. +** +**
    SQLITE_CHANGESETAPPLY_INVERT
    +** Invert the changeset before applying it. This is equivalent to inverting +** a changeset using sqlite3changeset_invert() before applying it. It is +** an error to specify this flag with a patchset. */ #define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001 +#define SQLITE_CHANGESETAPPLY_INVERT 0x0002 /* ** CAPI3REF: Constants Passed To The Conflict Handler @@ -10788,9 +11258,9 @@ SQLITE_API int sqlite3rebaser_configure( ** ** Argument pIn must point to a buffer containing a changeset nIn bytes ** in size. This function allocates and populates a buffer with a copy -** of the changeset rebased rebased according to the configuration of the +** of the changeset rebased according to the configuration of the ** rebaser object passed as the first argument. If successful, (*ppOut) -** is set to point to the new buffer containing the rebased changset and +** is set to point to the new buffer containing the rebased changeset and ** (*pnOut) to its size in bytes and SQLITE_OK returned. It is the ** responsibility of the caller to eventually free the new buffer using ** sqlite3_free(). Otherwise, if an error occurs, (*ppOut) and (*pnOut) @@ -10953,6 +11423,12 @@ SQLITE_API int sqlite3changeset_start_strm( int (*xInput)(void *pIn, void *pData, int *pnData), void *pIn ); +SQLITE_API int sqlite3changeset_start_v2_strm( + sqlite3_changeset_iter **pp, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int flags +); SQLITE_API int sqlite3session_changeset_strm( sqlite3_session *pSession, int (*xOutput)(void *pOut, const void *pData, int nData), @@ -10979,6 +11455,45 @@ SQLITE_API int sqlite3rebaser_rebase_strm( void *pOut ); +/* +** CAPI3REF: Configure global parameters +** +** The sqlite3session_config() interface is used to make global configuration +** changes to the sessions module in order to tune it to the specific needs +** of the application. +** +** The sqlite3session_config() interface is not threadsafe. If it is invoked +** while any other thread is inside any other sessions method then the +** results are undefined. Furthermore, if it is invoked after any sessions +** related objects have been created, the results are also undefined. +** +** The first argument to the sqlite3session_config() function must be one +** of the SQLITE_SESSION_CONFIG_XXX constants defined below. The +** interpretation of the (void*) value passed as the second parameter and +** the effect of calling this function depends on the value of the first +** parameter. +** +**
    +**
    SQLITE_SESSION_CONFIG_STRMSIZE
    +** By default, the sessions module streaming interfaces attempt to input +** and output data in approximately 1 KiB chunks. This operand may be used +** to set and query the value of this configuration setting. The pointer +** passed as the second argument must point to a value of type (int). +** If this value is greater than 0, it is used as the new streaming data +** chunk size for both input and output. Before returning, the (int) value +** pointed to by pArg is set to the final value of the streaming interface +** chunk size. +**
    +** +** This function returns SQLITE_OK if successful, or an SQLite error code +** otherwise. +*/ +SQLITE_API int sqlite3session_config(int op, void *pArg); + +/* +** CAPI3REF: Values for sqlite3session_config(). +*/ +#define SQLITE_SESSION_CONFIG_STRMSIZE 1 /* ** Make sure we can call this stuff from C++. @@ -11112,12 +11627,8 @@ struct Fts5PhraseIter { ** ** Usually, output parameter *piPhrase is set to the phrase number, *piCol ** to the column in which it occurs and *piOff the token offset of the -** first token of the phrase. The exception is if the table was created -** with the offsets=0 option specified. In this case *piOff is always -** set to -1. -** -** Returns SQLITE_OK if successful, or an error code (i.e. SQLITE_NOMEM) -** if an error occurs. +** first token of the phrase. Returns SQLITE_OK if successful, or an error +** code (i.e. SQLITE_NOMEM) if an error occurs. ** ** This API can be quite slow if used with an FTS5 table created with the ** "detail=none" or "detail=column" option. @@ -11155,10 +11666,10 @@ struct Fts5PhraseIter { ** ** xSetAuxdata(pFts5, pAux, xDelete) ** -** Save the pointer passed as the second argument as the extension functions +** Save the pointer passed as the second argument as the extension function's ** "auxiliary data". The pointer may then be retrieved by the current or any ** future invocation of the same fts5 extension function made as part of -** of the same MATCH query using the xGetAuxdata() API. +** the same MATCH query using the xGetAuxdata() API. ** ** Each extension function is allocated a single auxiliary data slot for ** each FTS query (MATCH expression). If the extension function is invoked @@ -11173,7 +11684,7 @@ struct Fts5PhraseIter { ** The xDelete callback, if one is specified, is also invoked on the ** auxiliary data pointer after the FTS5 query has finished. ** -** If an error (e.g. an OOM condition) occurs within this function, an +** If an error (e.g. an OOM condition) occurs within this function, ** the auxiliary data is set to NULL and an error code returned. If the ** xDelete parameter was not NULL, it is invoked on the auxiliary data ** pointer before returning. @@ -11397,8 +11908,8 @@ struct Fts5ExtensionApi { ** ** There are several ways to approach this in FTS5: ** -**
    1. By mapping all synonyms to a single token. In this case, the -** In the above example, this means that the tokenizer returns the +**
      1. By mapping all synonyms to a single token. In this case, using +** the above example, this means that the tokenizer returns the ** same token for inputs "first" and "1st". Say that token is in ** fact "first", so that when the user inserts the document "I won ** 1st place" entries are added to the index for tokens "i", "won", @@ -11406,11 +11917,11 @@ struct Fts5ExtensionApi { ** the tokenizer substitutes "first" for "1st" and the query works ** as expected. ** -**
      2. By adding multiple synonyms for a single term to the FTS index. -** In this case, when tokenizing query text, the tokenizer may -** provide multiple synonyms for a single term within the document. -** FTS5 then queries the index for each synonym individually. For -** example, faced with the query: +**
      3. By querying the index for all synonyms of each query term +** separately. In this case, when tokenizing query text, the +** tokenizer may provide multiple synonyms for a single term +** within the document. FTS5 then queries the index for each +** synonym individually. For example, faced with the query: ** ** ** ... MATCH 'first place' @@ -11434,7 +11945,7 @@ struct Fts5ExtensionApi { ** "place". ** ** This way, even if the tokenizer does not provide synonyms -** when tokenizing query text (it should not - to do would be +** when tokenizing query text (it should not - to do so would be ** inefficient), it doesn't matter if the user queries for ** 'first + place' or '1st + place', as there are entries in the ** FTS index corresponding to both forms of the first token. From e84f464ca6742bdbb6a25e6bbf043b0563dc4a00 Mon Sep 17 00:00:00 2001 From: Anastasia Kubova Date: Fri, 15 May 2020 15:23:26 +0300 Subject: [PATCH 002/115] In source code for sqlite was added the fix which excludes uikit for macOS from the gethostuuid() conditional --- Vendor/SQLite3/sqlite3.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Vendor/SQLite3/sqlite3.c b/Vendor/SQLite3/sqlite3.c index 55dc686ee0..c4f2436d4e 100644 --- a/Vendor/SQLite3/sqlite3.c +++ b/Vendor/SQLite3/sqlite3.c @@ -33212,7 +33212,8 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ # if defined(__APPLE__) && ((__MAC_OS_X_VERSION_MIN_REQUIRED > 1050) || \ (__IPHONE_OS_VERSION_MIN_REQUIRED > 2000)) # if (!defined(TARGET_OS_EMBEDDED) || (TARGET_OS_EMBEDDED==0)) \ - && (!defined(TARGET_IPHONE_SIMULATOR) || (TARGET_IPHONE_SIMULATOR==0)) + && (!defined(TARGET_IPHONE_SIMULATOR) || (TARGET_IPHONE_SIMULATOR==0)) \ + && (!defined(TARGET_OS_UIKITFORMAC) || (TARGET_OS_UIKITFORMAC==0)) # undef HAVE_GETHOSTUUID # define HAVE_GETHOSTUUID 1 # else From 8d2038ad178a3f701d51dbd705dd132a01425774 Mon Sep 17 00:00:00 2001 From: Anastasia Kubova Date: Mon, 18 May 2020 07:31:16 +0300 Subject: [PATCH 003/115] updated cgmanifest.json --- cgmanifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cgmanifest.json b/cgmanifest.json index 13c48df01f..c580d9d4b5 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -46,7 +46,7 @@ "git": { "name": "Official Git mirror of the SQLite source tree", "repositoryUrl": "https://github.com/sqlite/sqlite.git", - "commitHash": "653b4f6078ecc34055f2ce47fbd80f74501ca4b8" + "commitHash": "562fd18b9dc27216191c0a6477bba9b175f7f0d2" } } }, From 02e684c4ef7219f05c72a47a88d0507105afc5d7 Mon Sep 17 00:00:00 2001 From: Ruslan Urmeev Date: Mon, 18 May 2020 15:22:58 +0400 Subject: [PATCH 004/115] add OCHamcrest as a submodule --- .gitmodules | 3 +++ Vendor/OCHamcrest | 1 + 2 files changed, 4 insertions(+) create mode 160000 Vendor/OCHamcrest diff --git a/.gitmodules b/.gitmodules index f7fbce08b0..8c9bc13918 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "Vendor/OCMock"] path = Vendor/OCMock url = https://github.com/erikdoe/ocmock.git +[submodule "Vendor/OCHamcrest"] + path = Vendor/OCHamcrest + url = https://github.com/hamcrest/OCHamcrest.git diff --git a/Vendor/OCHamcrest b/Vendor/OCHamcrest new file mode 160000 index 0000000000..5f77cf3373 --- /dev/null +++ b/Vendor/OCHamcrest @@ -0,0 +1 @@ +Subproject commit 5f77cf33732dfa02e0b9f15e43d05a9110cc2ff0 From f85a32ddb00c3896566b04e7f610deb1cf6327fb Mon Sep 17 00:00:00 2001 From: Ruslan Urmeev Date: Mon, 18 May 2020 15:33:33 +0400 Subject: [PATCH 005/115] remove OCHamcrest binaries --- AppCenter/AppCenter.xcodeproj/project.pbxproj | 44 --- .../project.pbxproj | 44 --- .../project.pbxproj | 44 --- .../project.pbxproj | 21 -- .../AppCenterPush.xcodeproj/project.pbxproj | 32 -- .../OCHamcrestIOS.framework/Headers | 1 - .../OCHamcrestIOS.framework/OCHamcrestIOS | 1 - .../OCHamcrestIOS.framework/Resources | 1 - .../Versions/A/Headers/HCAllOf.h | 59 --- .../Versions/A/Headers/HCAnyOf.h | 57 --- .../Versions/A/Headers/HCArgumentCaptor.h | 40 --- .../Versions/A/Headers/HCAssertThat.h | 92 ----- .../Versions/A/Headers/HCBaseDescription.h | 25 -- .../Versions/A/Headers/HCBaseMatcher.h | 21 -- .../Versions/A/Headers/HCClassMatcher.h | 13 - .../Versions/A/Headers/HCCollect.h | 20 -- .../Versions/A/Headers/HCConformsToProtocol.h | 37 -- .../Versions/A/Headers/HCDescribedAs.h | 36 -- .../Versions/A/Headers/HCDescription.h | 35 -- .../Versions/A/Headers/HCDiagnosingMatcher.h | 15 - .../Versions/A/Headers/HCEvery.h | 40 --- .../Versions/A/Headers/HCHasCount.h | 58 --- .../Versions/A/Headers/HCHasDescription.h | 40 --- .../Versions/A/Headers/HCHasProperty.h | 42 --- .../Versions/A/Headers/HCInvocationMatcher.h | 40 --- .../Versions/A/Headers/HCIs.h | 50 --- .../Versions/A/Headers/HCIsAnything.h | 51 --- .../Versions/A/Headers/HCIsCloseTo.h | 38 -- .../A/Headers/HCIsCollectionContaining.h | 90 ----- .../HCIsCollectionContainingInAnyOrder.h | 74 ---- .../Headers/HCIsCollectionContainingInOrder.h | 66 ---- .../HCIsCollectionContainingInRelativeOrder.h | 43 --- .../A/Headers/HCIsCollectionOnlyContaining.h | 58 --- .../A/Headers/HCIsDictionaryContaining.h | 42 --- .../Headers/HCIsDictionaryContainingEntries.h | 63 ---- .../A/Headers/HCIsDictionaryContainingKey.h | 39 -- .../A/Headers/HCIsDictionaryContainingValue.h | 41 --- .../Versions/A/Headers/HCIsEmptyCollection.h | 35 -- .../Versions/A/Headers/HCIsEqual.h | 36 -- .../Headers/HCIsEqualCompressingWhiteSpace.h | 41 --- .../A/Headers/HCIsEqualIgnoringCase.h | 36 -- .../Versions/A/Headers/HCIsEqualToNumber.h | 285 --------------- .../Versions/A/Headers/HCIsIn.h | 38 -- .../Versions/A/Headers/HCIsInstanceOf.h | 33 -- .../Versions/A/Headers/HCIsNil.h | 51 --- .../Versions/A/Headers/HCIsNot.h | 39 -- .../Versions/A/Headers/HCIsSame.h | 36 -- .../Versions/A/Headers/HCIsTrueFalse.h | 51 --- .../Versions/A/Headers/HCIsTypeOf.h | 33 -- .../Versions/A/Headers/HCMatcher.h | 43 --- .../Versions/A/Headers/HCNumberAssert.h | 336 ----------------- .../Versions/A/Headers/HCOrderingComparison.h | 109 ------ .../A/Headers/HCRequireNonNilObject.h | 10 - .../Versions/A/Headers/HCSelfDescribing.h | 22 -- .../Versions/A/Headers/HCStringContains.h | 35 -- .../A/Headers/HCStringContainsInOrder.h | 57 --- .../Versions/A/Headers/HCStringDescription.h | 34 -- .../Versions/A/Headers/HCStringEndsWith.h | 36 -- .../Versions/A/Headers/HCStringStartsWith.h | 36 -- .../Versions/A/Headers/HCSubstringMatcher.h | 13 - .../Versions/A/Headers/HCTestFailure.h | 38 -- .../A/Headers/HCTestFailureReporter.h | 21 -- .../A/Headers/HCTestFailureReporterChain.h | 32 -- .../Versions/A/Headers/HCThrowsException.h | 36 -- .../Versions/A/Headers/HCWrapInMatcher.h | 13 - .../Versions/A/Headers/OCHamcrestIOS.h | 54 --- .../Versions/A/OCHamcrestIOS | Bin 2231248 -> 0 bytes .../Versions/A/Resources/Info.plist | 46 --- .../OCHamcrestIOS.framework/Versions/Current | 1 - .../OCHamcrest/OCHamcrest.framework/Headers | 1 - .../OCHamcrest.framework/OCHamcrest | 1 - .../OCHamcrest/OCHamcrest.framework/Resources | 1 - .../Versions/A/Headers/HCAllOf.h | 64 ---- .../Versions/A/Headers/HCAnyOf.h | 62 ---- .../Versions/A/Headers/HCArgumentCaptor.h | 44 --- .../Versions/A/Headers/HCAssertThat.h | 96 ----- .../Versions/A/Headers/HCBaseDescription.h | 29 -- .../Versions/A/Headers/HCBaseMatcher.h | 25 -- .../Versions/A/Headers/HCClassMatcher.h | 18 - .../Versions/A/Headers/HCCollect.h | 26 -- .../Versions/A/Headers/HCConformsToProtocol.h | 42 --- .../Versions/A/Headers/HCDescribedAs.h | 41 --- .../Versions/A/Headers/HCDescription.h | 39 -- .../Versions/A/Headers/HCDiagnosingMatcher.h | 19 - .../Versions/A/Headers/HCEvery.h | 45 --- .../Versions/A/Headers/HCHasCount.h | 63 ---- .../Versions/A/Headers/HCHasDescription.h | 45 --- .../Versions/A/Headers/HCHasProperty.h | 47 --- .../Versions/A/Headers/HCInvocationMatcher.h | 45 --- .../Versions/A/Headers/HCIs.h | 55 --- .../Versions/A/Headers/HCIsAnything.h | 55 --- .../Versions/A/Headers/HCIsCloseTo.h | 43 --- .../A/Headers/HCIsCollectionContaining.h | 95 ----- .../HCIsCollectionContainingInAnyOrder.h | 79 ---- .../Headers/HCIsCollectionContainingInOrder.h | 71 ---- .../HCIsCollectionContainingInRelativeOrder.h | 48 --- .../A/Headers/HCIsCollectionOnlyContaining.h | 62 ---- .../A/Headers/HCIsDictionaryContaining.h | 47 --- .../Headers/HCIsDictionaryContainingEntries.h | 68 ---- .../A/Headers/HCIsDictionaryContainingKey.h | 44 --- .../A/Headers/HCIsDictionaryContainingValue.h | 46 --- .../Versions/A/Headers/HCIsEmptyCollection.h | 39 -- .../Versions/A/Headers/HCIsEqual.h | 41 --- .../Headers/HCIsEqualCompressingWhiteSpace.h | 46 --- .../A/Headers/HCIsEqualIgnoringCase.h | 41 --- .../Versions/A/Headers/HCIsEqualToNumber.h | 289 --------------- .../Versions/A/Headers/HCIsIn.h | 43 --- .../Versions/A/Headers/HCIsInstanceOf.h | 37 -- .../Versions/A/Headers/HCIsNil.h | 55 --- .../Versions/A/Headers/HCIsNot.h | 44 --- .../Versions/A/Headers/HCIsSame.h | 41 --- .../Versions/A/Headers/HCIsTrueFalse.h | 55 --- .../Versions/A/Headers/HCIsTypeOf.h | 37 -- .../Versions/A/Headers/HCMatcher.h | 47 --- .../Versions/A/Headers/HCNumberAssert.h | 340 ------------------ .../Versions/A/Headers/HCOrderingComparison.h | 114 ------ .../A/Headers/HCRequireNonNilObject.h | 14 - .../Versions/A/Headers/HCSelfDescribing.h | 26 -- .../Versions/A/Headers/HCStringContains.h | 39 -- .../A/Headers/HCStringContainsInOrder.h | 62 ---- .../Versions/A/Headers/HCStringDescription.h | 38 -- .../Versions/A/Headers/HCStringEndsWith.h | 40 --- .../Versions/A/Headers/HCStringStartsWith.h | 40 --- .../Versions/A/Headers/HCSubstringMatcher.h | 18 - .../Versions/A/Headers/HCTestFailure.h | 42 --- .../A/Headers/HCTestFailureReporter.h | 25 -- .../A/Headers/HCTestFailureReporterChain.h | 36 -- .../Versions/A/Headers/HCThrowsException.h | 41 --- .../Versions/A/Headers/HCWrapInMatcher.h | 17 - .../Versions/A/Headers/OCHamcrest.h | 54 --- .../Versions/A/OCHamcrest | Bin 245104 -> 0 bytes .../Versions/A/Resources/Info.plist | 46 --- .../OCHamcrest.framework/Versions/Current | 1 - .../OCHamcrest.framework/Headers/HCAllOf.h | 64 ---- .../OCHamcrest.framework/Headers/HCAnyOf.h | 62 ---- .../Headers/HCArgumentCaptor.h | 44 --- .../Headers/HCAssertThat.h | 96 ----- .../Headers/HCBaseDescription.h | 29 -- .../Headers/HCBaseMatcher.h | 25 -- .../Headers/HCClassMatcher.h | 18 - .../OCHamcrest.framework/Headers/HCCollect.h | 26 -- .../Headers/HCConformsToProtocol.h | 42 --- .../Headers/HCDescribedAs.h | 41 --- .../Headers/HCDescription.h | 39 -- .../Headers/HCDiagnosingMatcher.h | 19 - .../OCHamcrest.framework/Headers/HCEvery.h | 45 --- .../OCHamcrest.framework/Headers/HCHasCount.h | 63 ---- .../Headers/HCHasDescription.h | 45 --- .../Headers/HCHasProperty.h | 47 --- .../Headers/HCInvocationMatcher.h | 45 --- .../OCHamcrest.framework/Headers/HCIs.h | 55 --- .../Headers/HCIsAnything.h | 55 --- .../Headers/HCIsCloseTo.h | 43 --- .../Headers/HCIsCollectionContaining.h | 95 ----- .../HCIsCollectionContainingInAnyOrder.h | 79 ---- .../Headers/HCIsCollectionContainingInOrder.h | 71 ---- .../HCIsCollectionContainingInRelativeOrder.h | 48 --- .../Headers/HCIsCollectionOnlyContaining.h | 62 ---- .../Headers/HCIsDictionaryContaining.h | 47 --- .../Headers/HCIsDictionaryContainingEntries.h | 68 ---- .../Headers/HCIsDictionaryContainingKey.h | 44 --- .../Headers/HCIsDictionaryContainingValue.h | 46 --- .../Headers/HCIsEmptyCollection.h | 39 -- .../OCHamcrest.framework/Headers/HCIsEqual.h | 41 --- .../Headers/HCIsEqualCompressingWhiteSpace.h | 46 --- .../Headers/HCIsEqualIgnoringCase.h | 41 --- .../Headers/HCIsEqualToNumber.h | 289 --------------- .../OCHamcrest.framework/Headers/HCIsIn.h | 43 --- .../Headers/HCIsInstanceOf.h | 37 -- .../OCHamcrest.framework/Headers/HCIsNil.h | 55 --- .../OCHamcrest.framework/Headers/HCIsNot.h | 44 --- .../OCHamcrest.framework/Headers/HCIsSame.h | 41 --- .../Headers/HCIsTrueFalse.h | 55 --- .../OCHamcrest.framework/Headers/HCIsTypeOf.h | 37 -- .../OCHamcrest.framework/Headers/HCMatcher.h | 47 --- .../Headers/HCNumberAssert.h | 340 ------------------ .../Headers/HCOrderingComparison.h | 114 ------ .../Headers/HCRequireNonNilObject.h | 14 - .../Headers/HCSelfDescribing.h | 26 -- .../Headers/HCStringContains.h | 39 -- .../Headers/HCStringContainsInOrder.h | 62 ---- .../Headers/HCStringDescription.h | 38 -- .../Headers/HCStringEndsWith.h | 40 --- .../Headers/HCStringStartsWith.h | 40 --- .../Headers/HCSubstringMatcher.h | 18 - .../Headers/HCTestFailure.h | 42 --- .../Headers/HCTestFailureReporter.h | 25 -- .../Headers/HCTestFailureReporterChain.h | 36 -- .../Headers/HCThrowsException.h | 41 --- .../Headers/HCWrapInMatcher.h | 17 - .../OCHamcrest.framework/Headers/OCHamcrest.h | 54 --- .../OCHamcrest.framework/Info.plist | Bin 864 -> 0 bytes .../Modules/module.modulemap | 6 - .../OCHamcrest.framework/OCHamcrest | Bin 388540 -> 0 bytes 194 files changed, 9703 deletions(-) delete mode 120000 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Headers delete mode 120000 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/OCHamcrestIOS delete mode 120000 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Resources delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCAllOf.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCAnyOf.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCArgumentCaptor.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCAssertThat.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCBaseDescription.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCBaseMatcher.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCClassMatcher.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCCollect.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCConformsToProtocol.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCDescribedAs.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCDescription.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCDiagnosingMatcher.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCEvery.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCHasCount.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCHasDescription.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCHasProperty.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCInvocationMatcher.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIs.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsAnything.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCloseTo.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionContaining.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionContainingInAnyOrder.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionContainingInOrder.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionContainingInRelativeOrder.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionOnlyContaining.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsDictionaryContaining.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsDictionaryContainingEntries.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsDictionaryContainingKey.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsDictionaryContainingValue.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEmptyCollection.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEqual.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEqualCompressingWhiteSpace.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEqualIgnoringCase.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEqualToNumber.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsIn.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsInstanceOf.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsNil.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsNot.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsSame.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsTrueFalse.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsTypeOf.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCMatcher.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCNumberAssert.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCOrderingComparison.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCRequireNonNilObject.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCSelfDescribing.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringContains.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringContainsInOrder.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringDescription.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringEndsWith.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringStartsWith.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCSubstringMatcher.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCTestFailure.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCTestFailureReporter.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCTestFailureReporterChain.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCThrowsException.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCWrapInMatcher.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/OCHamcrestIOS.h delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/OCHamcrestIOS delete mode 100644 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Resources/Info.plist delete mode 120000 Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/Current delete mode 120000 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Headers delete mode 120000 Vendor/macOS/OCHamcrest/OCHamcrest.framework/OCHamcrest delete mode 120000 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Resources delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCAllOf.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCAnyOf.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCArgumentCaptor.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCAssertThat.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCBaseDescription.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCBaseMatcher.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCClassMatcher.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCCollect.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCConformsToProtocol.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCDescribedAs.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCDescription.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCDiagnosingMatcher.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCEvery.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCHasCount.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCHasDescription.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCHasProperty.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCInvocationMatcher.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIs.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsAnything.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCloseTo.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionContaining.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionContainingInAnyOrder.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionContainingInOrder.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionContainingInRelativeOrder.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionOnlyContaining.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsDictionaryContaining.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsDictionaryContainingEntries.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsDictionaryContainingKey.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsDictionaryContainingValue.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEmptyCollection.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEqual.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEqualCompressingWhiteSpace.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEqualIgnoringCase.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEqualToNumber.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsIn.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsInstanceOf.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsNil.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsNot.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsSame.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsTrueFalse.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsTypeOf.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCMatcher.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCNumberAssert.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCOrderingComparison.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCRequireNonNilObject.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCSelfDescribing.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringContains.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringContainsInOrder.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringDescription.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringEndsWith.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringStartsWith.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCSubstringMatcher.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCTestFailure.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCTestFailureReporter.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCTestFailureReporterChain.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCThrowsException.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCWrapInMatcher.h delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/OCHamcrest.h delete mode 100755 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/OCHamcrest delete mode 100644 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Resources/Info.plist delete mode 120000 Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/Current delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCAllOf.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCAnyOf.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCArgumentCaptor.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCAssertThat.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCBaseDescription.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCBaseMatcher.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCClassMatcher.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCCollect.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCConformsToProtocol.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCDescribedAs.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCDescription.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCDiagnosingMatcher.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCEvery.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCHasCount.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCHasDescription.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCHasProperty.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCInvocationMatcher.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIs.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsAnything.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCloseTo.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionContaining.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionContainingInAnyOrder.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionContainingInOrder.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionContainingInRelativeOrder.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionOnlyContaining.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsDictionaryContaining.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsDictionaryContainingEntries.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsDictionaryContainingKey.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsDictionaryContainingValue.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEmptyCollection.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEqual.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEqualCompressingWhiteSpace.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEqualIgnoringCase.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEqualToNumber.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsIn.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsInstanceOf.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsNil.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsNot.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsSame.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsTrueFalse.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsTypeOf.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCMatcher.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCNumberAssert.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCOrderingComparison.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCRequireNonNilObject.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCSelfDescribing.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringContains.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringContainsInOrder.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringDescription.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringEndsWith.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringStartsWith.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCSubstringMatcher.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCTestFailure.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCTestFailureReporter.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCTestFailureReporterChain.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCThrowsException.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCWrapInMatcher.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/OCHamcrest.h delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Info.plist delete mode 100644 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Modules/module.modulemap delete mode 100755 Vendor/tvOS/OCHamcrest/OCHamcrest.framework/OCHamcrest diff --git a/AppCenter/AppCenter.xcodeproj/project.pbxproj b/AppCenter/AppCenter.xcodeproj/project.pbxproj index f76f882ac7..37266ebe53 100644 --- a/AppCenter/AppCenter.xcodeproj/project.pbxproj +++ b/AppCenter/AppCenter.xcodeproj/project.pbxproj @@ -120,7 +120,6 @@ 0446DF311F3B86FE00C8E338 /* MSStoragePerformanceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D36136821E7BB338004AE043 /* MSStoragePerformanceTests.m */; }; 0446DF321F3B870700C8E338 /* MSDBStorageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3849BA7D1EF3489D0072E3E0 /* MSDBStorageTests.m */; }; 0446DF331F3B870A00C8E338 /* MSLogDBStorageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C7877911EA0CFF3002263CC /* MSLogDBStorageTests.m */; }; - 0446DF341F3B871B00C8E338 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0484DD121F3908840092B777 /* OCHamcrest.framework */; }; 045660FB1D99EEEB002F7055 /* MSLogWithPropertiesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 045660FA1D99EEEB002F7055 /* MSLogWithPropertiesTests.m */; }; 046AEAD31ECA562A00CBE511 /* MSCustomPropertiesLogTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F803BC391E8E6963004B1E7A /* MSCustomPropertiesLogTests.m */; }; 046AEAD41ECA562A00CBE511 /* MSMockUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = D377A30C1E83A05900B2C97A /* MSMockUserDefaults.m */; }; @@ -165,7 +164,6 @@ 04B59A4522050381008DA079 /* MSHttpIngestionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 04B59A4022050370008DA079 /* MSHttpIngestionTests.m */; }; 04B59A4622050383008DA079 /* MSHttpIngestionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 04B59A4022050370008DA079 /* MSHttpIngestionTests.m */; }; 04B7BBEF1E5FAD4D001A0CE1 /* MSHttpUtilTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 04B7BBEE1E5FAD4D001A0CE1 /* MSHttpUtilTests.m */; }; - 04BED7101ECB63A800E20975 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04BED70E1ECB63A100E20975 /* OCHamcrest.framework */; }; 04FD126B1E4103CC007ABFE7 /* MSKeychainUtilTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 04FD126A1E4103CC007ABFE7 /* MSKeychainUtilTests.m */; }; 2434213223A456C900EDFA83 /* MSDependencyConfigurationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2434213123A456C900EDFA83 /* MSDependencyConfigurationTests.m */; }; 2434213323A456C900EDFA83 /* MSDependencyConfigurationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2434213123A456C900EDFA83 /* MSDependencyConfigurationTests.m */; }; @@ -228,7 +226,6 @@ 58603633B718B7A2702C23CB /* MSAbstractLogTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 58603EA088552D6FBB8EBE6C /* MSAbstractLogTests.m */; }; 58603867BA3B4B1CB87D0E5D /* MSAbstractLogTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 58603EA088552D6FBB8EBE6C /* MSAbstractLogTests.m */; }; 5C7877921EA0CFF3002263CC /* MSLogDBStorageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C7877911EA0CFF3002263CC /* MSLogDBStorageTests.m */; }; - 6E171ADC1D22F6ED000DC480 /* OCHamcrestIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6E171ADB1D22F6ED000DC480 /* OCHamcrestIOS.framework */; }; 6E3E2CC11D3596AE00B1EE50 /* MSDeviceLogTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E3E2CC01D3596AE00B1EE50 /* MSDeviceLogTests.m */; }; 6E48A5A41D3831FE006E8B5F /* MSChannelUnitConfigurationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E48A5A31D3831FE006E8B5F /* MSChannelUnitConfigurationTests.m */; }; 6E48A5A71D383893006E8B5F /* MSChannelGroupDefaultTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E48A5A61D383893006E8B5F /* MSChannelGroupDefaultTests.m */; }; @@ -1051,7 +1048,6 @@ 047FEE1321A48CC200ED77CD /* MSUserIdHistoryInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSUserIdHistoryInfo.m; sourceTree = ""; }; 047FEE2521A4968A00ED77CD /* MSUserIdContextPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSUserIdContextPrivate.h; sourceTree = ""; }; 04840CD71ECCF6560020B0FC /* Tests iOS.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = "Tests iOS.xcconfig"; path = "../../Config/Tests iOS.xcconfig"; sourceTree = ""; }; - 0484DD121F3908840092B777 /* OCHamcrest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCHamcrest.framework; path = ../../Vendor/tvOS/OCHamcrest/OCHamcrest.framework; sourceTree = ""; }; 0484DD5E1F3910DF0092B777 /* Tests tvOS.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = "Tests tvOS.xcconfig"; path = "../../Config/Tests tvOS.xcconfig"; sourceTree = ""; }; 0485AFEC1EAAAC3B00C10CAF /* macOS.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = macOS.modulemap; sourceTree = ""; }; 0485AFEE1EAAAD0000C10CAF /* iOS.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = iOS.modulemap; sourceTree = ""; }; @@ -1065,7 +1061,6 @@ 04B525B82194D44E00FA37FD /* MSConstants+Flags.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MSConstants+Flags.h"; sourceTree = ""; }; 04B59A4022050370008DA079 /* MSHttpIngestionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSHttpIngestionTests.m; sourceTree = ""; }; 04B7BBEE1E5FAD4D001A0CE1 /* MSHttpUtilTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSHttpUtilTests.m; sourceTree = ""; }; - 04BED70E1ECB63A100E20975 /* OCHamcrest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCHamcrest.framework; path = ../../Vendor/macOS/OCHamcrest/OCHamcrest.framework; sourceTree = ""; }; 04F3613C1FE1A92000A5A6D2 /* MSNoAutoAssignSessionIdLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSNoAutoAssignSessionIdLog.h; sourceTree = ""; }; 04FD126A1E4103CC007ABFE7 /* MSKeychainUtilTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSKeychainUtilTests.m; sourceTree = ""; }; 2434213123A456C900EDFA83 /* MSDependencyConfigurationTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSDependencyConfigurationTests.m; sourceTree = ""; }; @@ -1180,7 +1175,6 @@ 6E0401581D1C9CFB0051BCFA /* AppCenter+Internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AppCenter+Internal.h"; sourceTree = ""; }; 6E0401841D1CAD810051BCFA /* AppCenter Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "AppCenter Debug.xcconfig"; sourceTree = ""; }; 6E0684621D36BC8D00A8CC6C /* MSChannelUnitDefault.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = MSChannelUnitDefault.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - 6E171ADB1D22F6ED000DC480 /* OCHamcrestIOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCHamcrestIOS.framework; path = ../../Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework; sourceTree = ""; }; 6E171B581D234717000DC480 /* MSLogContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSLogContainer.h; sourceTree = ""; }; 6E171B591D234717000DC480 /* MSLogContainer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSLogContainer.m; sourceTree = ""; }; 6E2395781D22EF4F00E543C8 /* AppCenter.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AppCenter.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1341,7 +1335,6 @@ buildActionMask = 2147483647; files = ( C2CB275F230EDE380076A4E0 /* AppCenter.framework in Frameworks */, - 0446DF341F3B871B00C8E338 /* OCHamcrest.framework in Frameworks */, C2392EF8246429E200425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1351,7 +1344,6 @@ buildActionMask = 2147483647; files = ( C2CB275C230EDCD30076A4E0 /* AppCenter.framework in Frameworks */, - 04BED7101ECB63A800E20975 /* OCHamcrest.framework in Frameworks */, C2392EF7246429CE00425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1361,7 +1353,6 @@ buildActionMask = 2147483647; files = ( C28A8A4C230EDBEF00C4CE43 /* AppCenter.framework in Frameworks */, - 6E171ADC1D22F6ED000DC480 /* OCHamcrestIOS.framework in Frameworks */, C2392EF6246429B300425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1424,14 +1415,6 @@ path = UserId; sourceTree = ""; }; - 0484DD0F1F3908430092B777 /* tvOS */ = { - isa = PBXGroup; - children = ( - 0484DD121F3908840092B777 /* OCHamcrest.framework */, - ); - name = tvOS; - sourceTree = ""; - }; 04A140AB1ECE7F6F001CEE94 /* Support */ = { isa = PBXGroup; children = ( @@ -1442,32 +1425,6 @@ name = Support; sourceTree = ""; }; - 04BED70B1ECB636900E20975 /* OCHamcrest */ = { - isa = PBXGroup; - children = ( - 04BED70D1ECB637E00E20975 /* iOS */, - 04BED70C1ECB637800E20975 /* macOS */, - 0484DD0F1F3908430092B777 /* tvOS */, - ); - name = OCHamcrest; - sourceTree = ""; - }; - 04BED70C1ECB637800E20975 /* macOS */ = { - isa = PBXGroup; - children = ( - 04BED70E1ECB63A100E20975 /* OCHamcrest.framework */, - ); - name = macOS; - sourceTree = ""; - }; - 04BED70D1ECB637E00E20975 /* iOS */ = { - isa = PBXGroup; - children = ( - 6E171ADB1D22F6ED000DC480 /* OCHamcrestIOS.framework */, - ); - name = iOS; - sourceTree = ""; - }; 2DA0385B8A682DEEC59324CE /* HttpClient */ = { isa = PBXGroup; children = ( @@ -1758,7 +1715,6 @@ 6E2395831D22EF5F00E543C8 /* Frameworks */ = { isa = PBXGroup; children = ( - 04BED70B1ECB636900E20975 /* OCHamcrest */, C2392EDA2464279400425640 /* OCMock.xcodeproj */, DFE9551F244D96170061E3FA /* OHHTTPStubs */, F82E4C6C217F159A00EDAB34 /* sqlite3.c */, diff --git a/AppCenterAnalytics/AppCenterAnalytics.xcodeproj/project.pbxproj b/AppCenterAnalytics/AppCenterAnalytics.xcodeproj/project.pbxproj index df196aea18..f263d903a6 100644 --- a/AppCenterAnalytics/AppCenterAnalytics.xcodeproj/project.pbxproj +++ b/AppCenterAnalytics/AppCenterAnalytics.xcodeproj/project.pbxproj @@ -98,7 +98,6 @@ 0446DF451F3B8E6300C8E338 /* MSPageLogTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E3E2CD11D359F3300B1EE50 /* MSPageLogTests.m */; }; 0446DF461F3B8E6300C8E338 /* MSSessionTrackerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E815912B1D526A09003D5F3C /* MSSessionTrackerTests.m */; }; 0446DF471F3B8E6300C8E338 /* MSStartSessionLogTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E81591291D526956003D5F3C /* MSStartSessionLogTests.m */; }; - 0446DF561F3B8EAC00C8E338 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0484DD201F39096E0092B777 /* OCHamcrest.framework */; }; 046AEAB61ECA51AF00CBE511 /* MSAnalyticsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 042A17A71DEFA950003BA80A /* MSAnalyticsTests.m */; }; 046AEAB71ECA51AF00CBE511 /* MSMockAnalyticsDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 35BF19E41DF9D59E00193027 /* MSMockAnalyticsDelegate.m */; }; 046AEAB81ECA51AF00CBE511 /* MSSessionTrackerUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = E81591311D526C3B003D5F3C /* MSSessionTrackerUtil.m */; }; @@ -107,7 +106,6 @@ 046AEABB1ECA51AF00CBE511 /* MSSessionTrackerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E815912B1D526A09003D5F3C /* MSSessionTrackerTests.m */; }; 046AEABC1ECA51AF00CBE511 /* MSStartSessionLogTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E81591291D526956003D5F3C /* MSStartSessionLogTests.m */; }; 04B45C5721E9100700FE6746 /* MSPropertyConfiguratorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = B25E21CC214044A400CAA156 /* MSPropertyConfiguratorTests.m */; }; - 04BED7181ECB64FB00E20975 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04BED7161ECB64CE00E20975 /* OCHamcrest.framework */; }; 351343372058900800E6DC7D /* MSAnalyticsTransmissionTargetTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 351343362058900800E6DC7D /* MSAnalyticsTransmissionTargetTests.m */; }; 351343382058900800E6DC7D /* MSAnalyticsTransmissionTargetTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 351343362058900800E6DC7D /* MSAnalyticsTransmissionTargetTests.m */; }; 351343392058900800E6DC7D /* MSAnalyticsTransmissionTargetTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 351343362058900800E6DC7D /* MSAnalyticsTransmissionTargetTests.m */; }; @@ -118,7 +116,6 @@ 38C215E120E692C700191F3C /* MSMockUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 38C215DF20E692C700191F3C /* MSMockUserDefaults.m */; }; 38C215E220E692C700191F3C /* MSMockUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 38C215DF20E692C700191F3C /* MSMockUserDefaults.m */; }; 38C215E320E692C700191F3C /* MSMockUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 38C215DF20E692C700191F3C /* MSMockUserDefaults.m */; }; - 6E0684381D35A3B900A8CC6C /* OCHamcrestIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6E0684371D35A3B900A8CC6C /* OCHamcrestIOS.framework */; }; 6E3E2CD31D359F3300B1EE50 /* MSEventLogTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E3E2CD01D359F3300B1EE50 /* MSEventLogTests.m */; }; 6E3E2CD41D359F3300B1EE50 /* MSPageLogTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E3E2CD11D359F3300B1EE50 /* MSPageLogTests.m */; }; B25E21CD214044A400CAA156 /* MSPropertyConfiguratorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = B25E21CC214044A400CAA156 /* MSPropertyConfiguratorTests.m */; }; @@ -408,7 +405,6 @@ 04545DC9227B604700A49E06 /* AppCenterAnalytics.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppCenterAnalytics.xcconfig; sourceTree = ""; }; 0469D1B21F4DFE4C00A43A8E /* AppCenterAnalytics Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "AppCenterAnalytics Release.xcconfig"; sourceTree = ""; }; 046AEAC61ECA51AF00CBE511 /* AppCenterAnalytics.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AppCenterAnalytics.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 0484DD201F39096E0092B777 /* OCHamcrest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCHamcrest.framework; path = ../../Vendor/tvOS/OCHamcrest/OCHamcrest.framework; sourceTree = ""; }; 0484DD601F3910FF0092B777 /* Tests tvOS.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = "Tests tvOS.xcconfig"; path = "../../Config/Tests tvOS.xcconfig"; sourceTree = ""; }; 0485AF8D1EAA852A00C10CAF /* MSAnalyticsCategory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSAnalyticsCategory.h; sourceTree = ""; }; 0485AF8E1EAA852A00C10CAF /* MSAnalyticsCategory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSAnalyticsCategory.m; sourceTree = ""; }; @@ -417,7 +413,6 @@ 049BC82C1ECE3CF000FB6719 /* Tests macOS.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = "Tests macOS.xcconfig"; path = "../../Config/Tests macOS.xcconfig"; sourceTree = ""; }; 04A082051F74BB8600DC776D /* MSService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MSService.h; path = ../AppCenter/AppCenter/MSService.h; sourceTree = ""; }; 04B525BC2194D49C00FA37FD /* MSConstants+Flags.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "MSConstants+Flags.h"; path = "../AppCenter/AppCenter/MSConstants+Flags.h"; sourceTree = ""; }; - 04BED7161ECB64CE00E20975 /* OCHamcrest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCHamcrest.framework; path = ../../Vendor/macOS/OCHamcrest/OCHamcrest.framework; sourceTree = ""; }; 04ED31E91EAAD32B0033BAAE /* macOS.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = macOS.modulemap; sourceTree = ""; }; 04ED31EB1EAAD3390033BAAE /* iOS.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = iOS.modulemap; sourceTree = ""; }; 266ED07D29C2A2CC67AD1F60 /* MSEventPropertiesInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSEventPropertiesInternal.h; sourceTree = ""; }; @@ -440,7 +435,6 @@ 387C77041D6CC39400D68CC1 /* MSServiceAbstract.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MSServiceAbstract.h; path = ../AppCenter/AppCenter/MSServiceAbstract.h; sourceTree = ""; }; 38C215DF20E692C700191F3C /* MSMockUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MSMockUserDefaults.m; path = ../../../AppCenter/AppCenterTests/Util/MSMockUserDefaults.m; sourceTree = ""; }; 38C215E020E692C700191F3C /* MSMockUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MSMockUserDefaults.h; path = ../../../AppCenter/AppCenterTests/Util/MSMockUserDefaults.h; sourceTree = ""; }; - 6E0684371D35A3B900A8CC6C /* OCHamcrestIOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCHamcrestIOS.framework; path = ../../Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework; sourceTree = ""; }; 6E3E2CC51D359D5E00B1EE50 /* MSEventLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSEventLog.h; sourceTree = ""; }; 6E3E2CC61D359D5E00B1EE50 /* MSEventLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSEventLog.m; sourceTree = ""; }; 6E3E2CC71D359D5E00B1EE50 /* MSPageLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSPageLog.h; sourceTree = ""; }; @@ -498,7 +492,6 @@ files = ( C2D73CE2230FC7DC00390198 /* AppCenter.framework in Frameworks */, C2D73CE0230FC7D400390198 /* AppCenterAnalytics.framework in Frameworks */, - 0446DF561F3B8EAC00C8E338 /* OCHamcrest.framework in Frameworks */, C2392F6724642D6C00425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -509,7 +502,6 @@ files = ( C2D73CE5230FC7EF00390198 /* AppCenter.framework in Frameworks */, C2D73CE3230FC7E900390198 /* AppCenterAnalytics.framework in Frameworks */, - 04BED7181ECB64FB00E20975 /* OCHamcrest.framework in Frameworks */, C2392F6424642D5100425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -544,7 +536,6 @@ files = ( C2D73CE8230FC7FC00390198 /* AppCenter.framework in Frameworks */, C2D73CE6230FC7F900390198 /* AppCenterAnalytics.framework in Frameworks */, - 6E0684381D35A3B900A8CC6C /* OCHamcrestIOS.framework in Frameworks */, C2392F6124642D3F00425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -552,14 +543,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0484DD1F1F3909580092B777 /* tvOS */ = { - isa = PBXGroup; - children = ( - 0484DD201F39096E0092B777 /* OCHamcrest.framework */, - ); - name = tvOS; - sourceTree = ""; - }; 04A1409C1ECE7245001CEE94 /* Util */ = { isa = PBXGroup; children = ( @@ -601,32 +584,6 @@ path = Util; sourceTree = ""; }; - 04BED7131ECB64B100E20975 /* OCHamcrest */ = { - isa = PBXGroup; - children = ( - 04BED7151ECB64C000E20975 /* iOS */, - 04BED7141ECB64BB00E20975 /* macOS */, - 0484DD1F1F3909580092B777 /* tvOS */, - ); - name = OCHamcrest; - sourceTree = ""; - }; - 04BED7141ECB64BB00E20975 /* macOS */ = { - isa = PBXGroup; - children = ( - 04BED7161ECB64CE00E20975 /* OCHamcrest.framework */, - ); - name = macOS; - sourceTree = ""; - }; - 04BED7151ECB64C000E20975 /* iOS */ = { - isa = PBXGroup; - children = ( - 6E0684371D35A3B900A8CC6C /* OCHamcrestIOS.framework */, - ); - name = iOS; - sourceTree = ""; - }; 242A6C5D22D3F57500CB02C7 /* Model */ = { isa = PBXGroup; children = ( @@ -658,7 +615,6 @@ 6E0684361D35A39300A8CC6C /* Frameworks */ = { isa = PBXGroup; children = ( - 04BED7131ECB64B100E20975 /* OCHamcrest */, C2392EFF24642C8700425640 /* OCMock.xcodeproj */, F82E4C70217F1FA600EDAB34 /* sqlite3.c */, ); diff --git a/AppCenterCrashes/AppCenterCrashes.xcodeproj/project.pbxproj b/AppCenterCrashes/AppCenterCrashes.xcodeproj/project.pbxproj index 52cb526e1f..ce17cf53b1 100644 --- a/AppCenterCrashes/AppCenterCrashes.xcodeproj/project.pbxproj +++ b/AppCenterCrashes/AppCenterCrashes.xcodeproj/project.pbxproj @@ -133,7 +133,6 @@ 0446DF941F3B977100C8E338 /* live_report_signal_marketing.plcrash in Resources */ = {isa = PBXBuildFile; fileRef = 6EC99A341D416CCF0016C325 /* live_report_signal_marketing.plcrash */; }; 0446DF951F3B977100C8E338 /* live_report_empty.plcrash in Resources */ = {isa = PBXBuildFile; fileRef = 6EC99A301D416CCF0016C325 /* live_report_empty.plcrash */; }; 0446DF961F3B977100C8E338 /* live_report_exception.plcrash in Resources */ = {isa = PBXBuildFile; fileRef = 6EC99A311D416CCF0016C325 /* live_report_exception.plcrash */; }; - 0446DF9F1F3B981000C8E338 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0484DD1A1F39091D0092B777 /* OCHamcrest.framework */; }; 049327651ECA170D00D0187A /* MSAppleErrorLogTests.m in Sources */ = {isa = PBXBuildFile; fileRef = B2FF130B1DD12F61003DC677 /* MSAppleErrorLogTests.m */; }; 049327661ECA170D00D0187A /* MSCrashesTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6EC99A2D1D4166C50016C325 /* MSCrashesTests.mm */; }; 049327671ECA170D00D0187A /* MSExceptionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E7D5C891D3EC504009EC9AC /* MSExceptionTests.m */; }; @@ -172,14 +171,12 @@ 0493278F1ECA170D00D0187A /* live_report_signal_marketing.plcrash in Resources */ = {isa = PBXBuildFile; fileRef = 6EC99A341D416CCF0016C325 /* live_report_signal_marketing.plcrash */; }; 049327901ECA170D00D0187A /* live_report_empty.plcrash in Resources */ = {isa = PBXBuildFile; fileRef = 6EC99A301D416CCF0016C325 /* live_report_empty.plcrash */; }; 049327911ECA170D00D0187A /* live_report_exception.plcrash in Resources */ = {isa = PBXBuildFile; fileRef = 6EC99A311D416CCF0016C325 /* live_report_exception.plcrash */; }; - 04BED7231ECB65E100E20975 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04BED7211ECB65DD00E20975 /* OCHamcrest.framework */; }; 04CC3B891F3528DA00F7D92A /* MSWrapperExceptionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 350B29F31F1E6F1D009B91CF /* MSWrapperExceptionTests.m */; }; 04CC3B8A1F3528E200F7D92A /* MSWrapperCrashesHelperTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 352B1D6E1F27C36300684A7F /* MSWrapperCrashesHelperTests.mm */; }; 350B29F41F1E6F1D009B91CF /* MSWrapperExceptionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 350B29F31F1E6F1D009B91CF /* MSWrapperExceptionTests.m */; }; 352B1D6F1F27C36300684A7F /* MSWrapperCrashesHelperTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 352B1D6E1F27C36300684A7F /* MSWrapperCrashesHelperTests.mm */; }; 35EF18E01DDBCF6C00731CA8 /* MSWrapperExceptionManagerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 35EF18DF1DDBCF6C00731CA8 /* MSWrapperExceptionManagerTests.m */; }; 5949328B0C188C5B6624AAC2 /* MSCrashesUtilTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 59493B275715F01438B2E6FD /* MSCrashesUtilTests.m */; }; - 6E171AEE1D22F7BE000DC480 /* OCHamcrestIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6E171AED1D22F7BE000DC480 /* OCHamcrestIOS.framework */; }; 6E7D5C801D3EAEB5009EC9AC /* MSBinaryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E7D5C7F1D3EAEB5009EC9AC /* MSBinaryTests.m */; }; 6E7D5C841D3EC0F7009EC9AC /* MSThreadTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E7D5C831D3EC0F7009EC9AC /* MSThreadTests.m */; }; 6E7D5C871D3EC332009EC9AC /* MSStackFrameTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E7D5C861D3EC332009EC9AC /* MSStackFrameTests.m */; }; @@ -557,7 +554,6 @@ 0446DF9D1F3B977100C8E338 /* AppCenterCrashes.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AppCenterCrashes.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 04545DCA227B605200A49E06 /* AppCenterCrashes.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppCenterCrashes.xcconfig; sourceTree = ""; }; 0469D1B31F4E013C00A43A8E /* AppCenterCrashes Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "AppCenterCrashes Release.xcconfig"; sourceTree = ""; }; - 0484DD1A1F39091D0092B777 /* OCHamcrest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCHamcrest.framework; path = ../../Vendor/tvOS/OCHamcrest/OCHamcrest.framework; sourceTree = ""; }; 0484DD5F1F3910EF0092B777 /* Tests tvOS.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = "Tests tvOS.xcconfig"; path = "../../Config/Tests tvOS.xcconfig"; sourceTree = ""; }; 049327961ECA170D00D0187A /* AppCenterCrashes.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AppCenterCrashes.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 049327B11ECA19FD00D0187A /* libCrashReporter-MacOSX-Static.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libCrashReporter-MacOSX-Static.a"; sourceTree = ""; }; @@ -565,7 +561,6 @@ 049BC8251ECE36D400FB6719 /* iOS.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = iOS.xcconfig; sourceTree = ""; }; 049BC8261ECE370100FB6719 /* macOS.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = macOS.xcconfig; sourceTree = ""; }; 04A082011F74BB6100DC776D /* MSService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MSService.h; path = ../AppCenter/AppCenter/MSService.h; sourceTree = ""; }; - 04BED7211ECB65DD00E20975 /* OCHamcrest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCHamcrest.framework; path = ../../Vendor/macOS/OCHamcrest/OCHamcrest.framework; sourceTree = ""; }; 04EBBEEE1F01C1420006B8AE /* tvOS.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = tvOS.modulemap; sourceTree = ""; }; 04EBBEEF1F01C1420006B8AE /* tvOS.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = tvOS.xcconfig; sourceTree = ""; }; 04ED31F21EAAD6070033BAAE /* iOS.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = iOS.modulemap; sourceTree = ""; }; @@ -600,7 +595,6 @@ 6E0401591D1C9D7F0051BCFA /* AppCenter+Internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "AppCenter+Internal.h"; path = "../../../AppCenter/AppCenter/Internals/AppCenter+Internal.h"; sourceTree = ""; }; 6E171AE11D22F781000DC480 /* AppCenterCrashes.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AppCenterCrashes.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 6E171AE51D22F781000DC480 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 6E171AED1D22F7BE000DC480 /* OCHamcrestIOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCHamcrestIOS.framework; path = ../../Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework; sourceTree = ""; }; 6E37297F1D1DE93800F1E4AE /* AppCenterCrashes Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "AppCenterCrashes Debug.xcconfig"; sourceTree = ""; }; 6E73FE681D402F79008CDC15 /* MSCrashesCXXExceptionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSCrashesCXXExceptionHandler.h; sourceTree = ""; }; 6E73FE691D402F79008CDC15 /* MSCrashesCXXExceptionHandler.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MSCrashesCXXExceptionHandler.mm; sourceTree = ""; }; @@ -787,7 +781,6 @@ files = ( C2B25A2C230F079800511D49 /* AppCenter.framework in Frameworks */, C2B25A2D230F079800511D49 /* AppCenterCrashes.framework in Frameworks */, - 0446DF9F1F3B981000C8E338 /* OCHamcrest.framework in Frameworks */, C2392F7024642DAD00425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -798,7 +791,6 @@ files = ( C2B25A32230F07B500511D49 /* AppCenter.framework in Frameworks */, C2B25A30230F07B000511D49 /* AppCenterCrashes.framework in Frameworks */, - 04BED7231ECB65E100E20975 /* OCHamcrest.framework in Frameworks */, C2392F6D24642D9B00425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -809,7 +801,6 @@ files = ( C2B25A27230F040400511D49 /* AppCenter.framework in Frameworks */, C2B25A28230F040400511D49 /* AppCenterCrashes.framework in Frameworks */, - 6E171AEE1D22F7BE000DC480 /* OCHamcrestIOS.framework in Frameworks */, C2392F6A24642D8900425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -844,14 +835,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0484DD181F3909030092B777 /* tvOS */ = { - isa = PBXGroup; - children = ( - 0484DD1A1F39091D0092B777 /* OCHamcrest.framework */, - ); - name = tvOS; - sourceTree = ""; - }; 049327981ECA19FD00D0187A /* PLCrashReporter */ = { isa = PBXGroup; children = ( @@ -911,32 +894,6 @@ path = Util; sourceTree = ""; }; - 04BED71E1ECB65BF00E20975 /* OCHamcrest */ = { - isa = PBXGroup; - children = ( - 04BED7201ECB65C900E20975 /* iOS */, - 04BED71F1ECB65C500E20975 /* macOS */, - 0484DD181F3909030092B777 /* tvOS */, - ); - name = OCHamcrest; - sourceTree = ""; - }; - 04BED71F1ECB65C500E20975 /* macOS */ = { - isa = PBXGroup; - children = ( - 04BED7211ECB65DD00E20975 /* OCHamcrest.framework */, - ); - name = macOS; - sourceTree = ""; - }; - 04BED7201ECB65C900E20975 /* iOS */ = { - isa = PBXGroup; - children = ( - 6E171AED1D22F7BE000DC480 /* OCHamcrestIOS.framework */, - ); - name = iOS; - sourceTree = ""; - }; 04EBBEAB1F01C0980006B8AE /* tvOS */ = { isa = PBXGroup; children = ( @@ -1075,7 +1032,6 @@ 6E171AEC1D22F7AB000DC480 /* Frameworks */ = { isa = PBXGroup; children = ( - 04BED71E1ECB65BF00E20975 /* OCHamcrest */, C2392F4724642CEA00425640 /* OCMock.xcodeproj */, F82E4C74217F1FD600EDAB34 /* sqlite3.c */, ); diff --git a/AppCenterDistribute/AppCenterDistribute.xcodeproj/project.pbxproj b/AppCenterDistribute/AppCenterDistribute.xcodeproj/project.pbxproj index 25bf18a073..23aba116c2 100644 --- a/AppCenterDistribute/AppCenterDistribute.xcodeproj/project.pbxproj +++ b/AppCenterDistribute/AppCenterDistribute.xcodeproj/project.pbxproj @@ -59,7 +59,6 @@ 389638A41E79F59D007C3809 /* MSDistributeTestUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 389638A31E79F59D007C3809 /* MSDistributeTestUtil.m */; }; 38A683641E774DCE00A63BC8 /* MSSemVerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 38A683621E774DCE00A63BC8 /* MSSemVerTests.m */; }; 38A683651E774DCE00A63BC8 /* MSSemVerPreReleaseIdTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 38A683631E774DCE00A63BC8 /* MSSemVerPreReleaseIdTest.m */; }; - 38D25E391E7B0AAC00033FC4 /* OCHamcrestIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 380304421E7B007E006A55FB /* OCHamcrestIOS.framework */; }; 58603D3986EEE50CBFAFD4BC /* MSDistributeInfoTrackerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 586030B2AAEEE6A568D37CE9 /* MSDistributeInfoTrackerTests.m */; }; 78B7D8B723D581B900E08D9B /* MSAlertControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 78B7D8B623D581B900E08D9B /* MSAlertControllerTests.m */; }; 78B7D8BA23D5849600E08D9B /* MSAlertController.m in Sources */ = {isa = PBXBuildFile; fileRef = 78B7D8B823D5849600E08D9B /* MSAlertController.m */; }; @@ -263,7 +262,6 @@ 24E6AC9423A18AC900B8D33A /* MSTestUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MSTestUtil.m; path = ../../../AppCenter/AppCenterTests/Util/MSTestUtil.m; sourceTree = ""; }; 24E6AC9623A18BA800B8D33A /* MSMockLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MSMockLog.m; path = ../../../AppCenter/AppCenterTests/Util/MSMockLog.m; sourceTree = ""; }; 24E6AC9723A18BA800B8D33A /* MSMockLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MSMockLog.h; path = ../../../AppCenter/AppCenterTests/Util/MSMockLog.h; sourceTree = ""; }; - 380304421E7B007E006A55FB /* OCHamcrestIOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = OCHamcrestIOS.framework; sourceTree = ""; }; 383A2FE31EBA308700817742 /* MSDistributeAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSDistributeAppDelegate.h; sourceTree = ""; }; 383A2FE51EBA30B300817742 /* MSDistributeAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSDistributeAppDelegate.m; sourceTree = ""; }; 387CC62F210A9D9C002BA068 /* MSMockKeychainUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MSMockKeychainUtil.h; path = ../../../AppCenter/AppCenterTests/Util/MSMockKeychainUtil.h; sourceTree = ""; }; @@ -339,7 +337,6 @@ files = ( C2200613230FDF7000848D5B /* AppCenter.framework in Frameworks */, C2200611230FDF6D00848D5B /* AppCenterDistribute.framework in Frameworks */, - 38D25E391E7B0AAC00033FC4 /* OCHamcrestIOS.framework in Frameworks */, C2392F7324642DC600425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -442,14 +439,6 @@ name = Support; sourceTree = ""; }; - 04BED71D1ECB659700E20975 /* iOS */ = { - isa = PBXGroup; - children = ( - 380304421E7B007E006A55FB /* OCHamcrestIOS.framework */, - ); - name = iOS; - sourceTree = ""; - }; 04FD4A131E451E12009B4468 = { isa = PBXGroup; children = ( @@ -515,7 +504,6 @@ 04FD4A491E453930009B4468 /* Frameworks */ = { isa = PBXGroup; children = ( - 380304401E7B007E006A55FB /* OCHamcrest */, C2392F2F24642CB500425640 /* OCMock.xcodeproj */, DFE954F1244D8B410061E3FA /* OHHTTPStubs */, F82E4C82217F217F00EDAB34 /* sqlite3.c */, @@ -532,15 +520,6 @@ path = Model; sourceTree = ""; }; - 380304401E7B007E006A55FB /* OCHamcrest */ = { - isa = PBXGroup; - children = ( - 04BED71D1ECB659700E20975 /* iOS */, - ); - name = OCHamcrest; - path = ../../Vendor/iOS/OCHamcrest; - sourceTree = ""; - }; 389638A21E79F557007C3809 /* Util */ = { isa = PBXGroup; children = ( diff --git a/AppCenterPush/AppCenterPush.xcodeproj/project.pbxproj b/AppCenterPush/AppCenterPush.xcodeproj/project.pbxproj index 29b84927a6..906e34643d 100644 --- a/AppCenterPush/AppCenterPush.xcodeproj/project.pbxproj +++ b/AppCenterPush/AppCenterPush.xcodeproj/project.pbxproj @@ -56,7 +56,6 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0469643D1F2A570500F9D31F /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0469643B1F2A570000F9D31F /* OCHamcrest.framework */; }; 0469644F1F2A5D4A00F9D31F /* MSPushTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D3AD5EC21E5C4F6A001627AB /* MSPushTests.m */; }; 046964501F2A5D4F00F9D31F /* MSPushLogTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 04849D781E9E913A0093ECA6 /* MSPushLogTests.m */; }; 046964511F2A5D8D00F9D31F /* MSPushTestUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = D39B04E31E66FBD50048E397 /* MSPushTestUtil.m */; }; @@ -119,7 +118,6 @@ C9EBAB39230D73B300A20F0F /* AppCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9EBAB38230D73B300A20F0F /* AppCenter.framework */; }; C9EBAB3B230D73B700A20F0F /* AppCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9EBAB3A230D73B700A20F0F /* AppCenter.framework */; }; D39B04E41E66FBD50048E397 /* MSPushTestUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = D39B04E31E66FBD50048E397 /* MSPushTestUtil.m */; }; - D3D0CFE91E640ABD003015AF /* OCHamcrestIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3D0CFE81E640ABD003015AF /* OCHamcrestIOS.framework */; }; F82E4C85217F218D00EDAB34 /* sqlite3.c in Sources */ = {isa = PBXBuildFile; fileRef = F82E4C84217F218D00EDAB34 /* sqlite3.c */; settings = {COMPILER_FLAGS = "-w"; }; }; F82E4C86217F218D00EDAB34 /* sqlite3.c in Sources */ = {isa = PBXBuildFile; fileRef = F82E4C84217F218D00EDAB34 /* sqlite3.c */; settings = {COMPILER_FLAGS = "-w"; }; }; /* End PBXBuildFile section */ @@ -227,7 +225,6 @@ 0469642E1F2A55CF00F9D31F /* macOS.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = macOS.modulemap; sourceTree = ""; }; 0469642F1F2A55CF00F9D31F /* macOS.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = macOS.xcconfig; sourceTree = ""; }; 046964301F2A561900F9D31F /* Tests macOS.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = "Tests macOS.xcconfig"; path = "../../Config/Tests macOS.xcconfig"; sourceTree = ""; }; - 0469643B1F2A570000F9D31F /* OCHamcrest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCHamcrest.framework; path = ../Vendor/macOS/OCHamcrest/OCHamcrest.framework; sourceTree = ""; }; 047919B21EBA3AC5004834A6 /* MSPushNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSPushNotification.h; sourceTree = ""; }; 047919B41EBA3B1B004834A6 /* MSPushDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSPushDelegate.h; sourceTree = ""; }; 047919B61EBA42F0004834A6 /* MSPushNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSPushNotification.m; sourceTree = ""; }; @@ -271,7 +268,6 @@ D3AD5F3E1E5D69B0001627AB /* iOS.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = iOS.modulemap; sourceTree = ""; }; D3AD5F6A1E5D7464001627AB /* MSPushLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MSPushLog.h; path = Model/MSPushLog.h; sourceTree = ""; }; D3AD5F6B1E5D7464001627AB /* MSPushLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MSPushLog.m; path = Model/MSPushLog.m; sourceTree = ""; }; - D3D0CFE81E640ABD003015AF /* OCHamcrestIOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCHamcrestIOS.framework; path = ../Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework; sourceTree = ""; }; F82E4C84217F218D00EDAB34 /* sqlite3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sqlite3.c; path = ../Vendor/SQLite3/sqlite3.c; sourceTree = ""; }; F8DD7526230D7EA400B095B6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ @@ -283,7 +279,6 @@ files = ( C220061D230FDF9600848D5B /* AppCenter.framework in Frameworks */, C220061B230FDF9200848D5B /* AppCenterPush.framework in Frameworks */, - 0469643D1F2A570500F9D31F /* OCHamcrest.framework in Frameworks */, C2392F7924642DFB00425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -312,7 +307,6 @@ C220061A230FDF8500848D5B /* AppCenter.framework in Frameworks */, C2200618230FDF8200848D5B /* AppCenterPush.framework in Frameworks */, C203273D2350B51A00EA65A5 /* UserNotifications.framework in Frameworks */, - D3D0CFE91E640ABD003015AF /* OCHamcrestIOS.framework in Frameworks */, C2392F7624642DE500425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -320,14 +314,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 046964351F2A56C500F9D31F /* macOS */ = { - isa = PBXGroup; - children = ( - 0469643B1F2A570000F9D31F /* OCHamcrest.framework */, - ); - name = macOS; - sourceTree = ""; - }; 04A140C21ECE8769001CEE94 /* Model */ = { isa = PBXGroup; children = ( @@ -347,23 +333,6 @@ name = Support; sourceTree = ""; }; - 04BED71B1ECB653800E20975 /* OCHamcrest */ = { - isa = PBXGroup; - children = ( - 04BED71C1ECB654000E20975 /* iOS */, - 046964351F2A56C500F9D31F /* macOS */, - ); - name = OCHamcrest; - sourceTree = ""; - }; - 04BED71C1ECB654000E20975 /* iOS */ = { - isa = PBXGroup; - children = ( - D3D0CFE81E640ABD003015AF /* OCHamcrestIOS.framework */, - ); - name = iOS; - sourceTree = ""; - }; 242A6C5C22D3F30F00CB02C7 /* Model */ = { isa = PBXGroup; children = ( @@ -506,7 +475,6 @@ D3AD5F661E5D73F2001627AB /* Frameworks */ = { isa = PBXGroup; children = ( - 04BED71B1ECB653800E20975 /* OCHamcrest */, C2392F1724642CA300425640 /* OCMock.xcodeproj */, F82E4C84217F218D00EDAB34 /* sqlite3.c */, ); diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Headers b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Headers deleted file mode 120000 index a177d2a6b9..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Headers +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Headers \ No newline at end of file diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/OCHamcrestIOS b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/OCHamcrestIOS deleted file mode 120000 index d03098854b..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/OCHamcrestIOS +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/OCHamcrestIOS \ No newline at end of file diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Resources b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Resources deleted file mode 120000 index 953ee36f3b..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Resources +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Resources \ No newline at end of file diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCAllOf.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCAllOf.h deleted file mode 100644 index 9cefcbeb0d..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCAllOf.h +++ /dev/null @@ -1,59 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Calculates the logical conjunction of multiple matchers. - * @discussion Evaluation is shortcut, so subsequent matchers are not called if an earlier matcher - * returns NO. - */ -@interface HCAllOf : HCDiagnosingMatcher - -- (instancetype)initWithMatchers:(NSArray *)matchers; - -@end - - -FOUNDATION_EXPORT id HC_allOfIn(NSArray *matchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object matches all of the - * specified matchers. - * @param matchers An array of matchers. Any element that is not a matcher is implicitly wrapped in - * an equalTo matcher to check for equality. - * @discussion - * Example
        - *
        assertThat(\@"myValue", allOfIn(\@[startsWith(\@"my"), containsSubstring(\@"Val")]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_allOfIn instead. - */ -static inline id allOfIn(NSArray *matchers) -{ - return HC_allOfIn(matchers); -} -#endif - - -FOUNDATION_EXPORT id HC_allOf(id matchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object matches all of the - * specified matchers. - * @param matchers... A comma-separated list of matchers ending with nil. Any argument - * that is not a matcher is implicitly wrapped in an equalTo matcher to check for equality. - * @discussion - * Example
        - *
        assertThat(\@"myValue", allOf(startsWith(\@"my"), containsSubstring(\@"Val"), nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_allOf instead. - */ -#define allOf(matchers...) HC_allOf(matchers) -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCAnyOf.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCAnyOf.h deleted file mode 100644 index b6e8ece1aa..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCAnyOf.h +++ /dev/null @@ -1,57 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Calculates the logical disjunction of multiple matchers. - * @discussion Evaluation is shortcut, so subsequent matchers are not called if an earlier matcher - * returns NO. - */ -@interface HCAnyOf : HCBaseMatcher - -- (instancetype)initWithMatchers:(NSArray *)matchers; - -@end - -FOUNDATION_EXPORT id HC_anyOfIn(NSArray *matchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object matches any of the - * specified matchers. - * @param matchers An array of matchers. Any element that is not a matcher is implicitly wrapped in - * an equalTo matcher to check for equality. - * @discussion - * Example
        - *
        assertThat(\@"myValue", allOf(\@[startsWith(\@"foo"), containsSubstring(\@"Val")]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_anyOf instead. - */ -static inline id anyOfIn(NSArray *matchers) -{ - return HC_anyOfIn(matchers); -} -#endif - -FOUNDATION_EXPORT id HC_anyOf(id matchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object matches any of the - * specified matchers. - * @param matchers... A comma-separated list of matchers ending with nil. Any argument - * that is not a matcher is implicitly wrapped in an equalTo matcher to check for equality. - * @discussion - * Example
        - *
        assertThat(\@"myValue", allOf(startsWith(\@"foo"), containsSubstring(\@"Val"), nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_anyOf instead. - */ -#define anyOf(matchers...) HC_anyOf(matchers) -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCArgumentCaptor.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCArgumentCaptor.h deleted file mode 100644 index 3e0fdc5478..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCArgumentCaptor.h +++ /dev/null @@ -1,40 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches anything, capturing all values. - * @discussion This matcher captures all values it was given to match, and always evaluates to - * YES. Use it to capture argument values for further assertions. - * - * Unlike other matchers, this matcher is not idempotent. It should be created outside of any - * expression so that it can be queried for the items it captured. - */ -@interface HCArgumentCaptor : HCIsAnything - -/*! - * @abstract Returns the captured value. - * @discussion If -matches: was called more than once then this property returns the - * last captured value. - * - * If -matches: was never invoked and so no value was captured, this property returns - * nil. But if nil was captured, this property returns NSNull. - */ -@property (nonatomic, readonly) id value; - -/*! - * @abstract Returns all captured values. - * @discussion Returns an array containing all captured values, in the order in which they were - * captured. nil values are converted to NSNull. - */ -@property (nonatomic, readonly) NSArray *allValues; - -/*! - * @abstract Determines whether subsequent matched values are captured. - * @discussion YES by default. - */ -@property (nonatomic, assign) BOOL captureEnabled; - -@end diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCAssertThat.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCAssertThat.h deleted file mode 100644 index 40f913927b..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCAssertThat.h +++ /dev/null @@ -1,92 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - -@protocol HCMatcher; - -/*! - * @header - * Assertion macros for using matchers in testing frameworks. - * Unmet assertions are reported to the HCTestFailureReporterChain. - */ - - -FOUNDATION_EXPORT void HC_assertThatWithLocation(id testCase, id actual, id matcher, - const char *fileName, int lineNumber); - -#define HC_assertThat(actual, matcher) \ - HC_assertThatWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThat(actual, matcher) - - * Asserts that actual value satisfies matcher. - * @param actual The object to evaluate as the actual value. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion assertThat passes the actual value to the matcher for evaluation. If the matcher is - * not satisfied, it is reported to the HCTestFailureReporterChain. - * - * Use assertThat in test case methods. It's designed to integrate with XCTest and other testing - * frameworks where individual tests are executed as methods. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThat instead. - */ -#define assertThat(actual, matcher) HC_assertThat(actual, matcher) -#endif - - -typedef id (^HCFutureValue)(); - -FOUNDATION_EXPORT void HC_assertWithTimeoutAndLocation(id testCase, NSTimeInterval timeout, - HCFutureValue actualBlock, id matcher, - const char *fileName, int lineNumber); - -#define HC_assertWithTimeout(timeout, actualBlock, matcher) \ - HC_assertWithTimeoutAndLocation(self, timeout, actualBlock, matcher, __FILE__, __LINE__) - -#define HC_thatEventually(actual) ^{ return actual; } - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertWithTimeout(timeout, actualBlock, matcher) - - * Asserts that a value provided by a block will satisfy matcher within the specified time. - * @param timeout Maximum time to wait for passing behavior, specified in seconds. - * @param actualBlock A block providing the object to repeatedly evaluate as the actual value. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion assertWithTimeout polls a value provided by a block to asynchronously - * satisfy the matcher. The block is evaluated repeatedly for an actual value, which is passed to - * the matcher for evaluation. If the matcher is not satisfied within the timeout, it is reported to - * the HCTestFailureReporterChain. - * - * An easy way of providing the actualBlock is to use the macro thatEventually. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertWithTimeout instead. -*/ -#define assertWithTimeout(timeout, actualBlock, matcher) HC_assertWithTimeout(timeout, actualBlock, matcher) - - -/*! - * @abstract thatEventually(actual) - - * Evaluates actual value at future time. - * @param actual The object to evaluate as the actual value. - * @discussion Wraps actual in a block so that it can be repeatedly evaluated by - * assertWithTimeout. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_thatEventually instead. - */ -#define thatEventually(actual) HC_thatEventually(actual) -#endif - - -/*! - * @abstract "Expected , but " - * @discussion Helper function to let you describe mismatches the way assertThat does. - */ -FOUNDATION_EXPORT NSString *HCDescribeMismatch(id matcher, id actual); diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCBaseDescription.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCBaseDescription.h deleted file mode 100644 index d9ed7247f4..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCBaseDescription.h +++ /dev/null @@ -1,25 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import -#import - - -/*! - * @abstract Base class for all HCDescription implementations. - */ -@interface HCBaseDescription : NSObject -@end - - -/*! - * @abstract Methods that must be provided by subclasses of HCBaseDescription. - */ -@interface HCBaseDescription (SubclassResponsibility) - -/*! - * @abstract Appends the specified string to the description. - */ -- (void)append:(NSString *)str; - -@end diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCBaseMatcher.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCBaseMatcher.h deleted file mode 100644 index c02c8b34c9..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCBaseMatcher.h +++ /dev/null @@ -1,21 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import -#import - -#define HC_ABSTRACT_METHOD [self subclassResponsibility:_cmd] - - -/*! - * @abstract Base class for all HCMatcher implementations. - * @discussion Simple matchers can just subclass HCBaseMatcher and implement -matches: - * and -describeTo:. But if the matching algorithm has several "no match" paths, - * consider subclassing HCDiagnosingMatcher instead. - */ -@interface HCBaseMatcher : NSObject - -/*! @abstract Raises exception that command (a pseudo-abstract method) is not implemented. */ -- (void)subclassResponsibility:(SEL)command; - -@end diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCClassMatcher.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCClassMatcher.h deleted file mode 100644 index fbee57f7a1..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCClassMatcher.h +++ /dev/null @@ -1,13 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -@interface HCClassMatcher : HCBaseMatcher - -@property (nonatomic, strong, readonly) Class theClass; - -- (instancetype)initWithClass:(Class)aClass; - -@end diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCCollect.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCCollect.h deleted file mode 100644 index 06786524aa..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCCollect.h +++ /dev/null @@ -1,20 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - -#import - - -/*! - * @abstract Returns an array of values from a variable-length comma-separated list terminated - * by nil. - */ -FOUNDATION_EXPORT NSArray * HCCollectItems(id item, va_list args); - -/*! - * @abstract Returns an array of matchers from a mixed array of items and matchers. - * @discussion Each item is wrapped in HCWrapInMatcher to transform non-matcher items into equality - * matchers. - */ -FOUNDATION_EXPORT NSArray * HCWrapIntoMatchers(NSArray *items); diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCConformsToProtocol.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCConformsToProtocol.h deleted file mode 100644 index c04b51eafc..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCConformsToProtocol.h +++ /dev/null @@ -1,37 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt -// Contribution by Todd Farrell - -#import - - -/*! - * @abstract Matches objects that conform to specified protocol. - */ -@interface HCConformsToProtocol : HCBaseMatcher - -- (instancetype)initWithProtocol:(Protocol *)protocol; - -@end - - -FOUNDATION_EXPORT id HC_conformsTo(Protocol *aProtocol); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object conforms to the specified - * protocol. - * @param aProtocol The protocol to compare against as the expected protocol. - * @discussion - * Example
        - *
        assertThat(myObject, conformsTo(\@protocol(NSCoding))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_conformsTo instead. - */ -static inline id conformsTo(Protocol *aProtocol) -{ - return HC_conformsTo(aProtocol); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCDescribedAs.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCDescribedAs.h deleted file mode 100644 index 7004ae253d..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCDescribedAs.h +++ /dev/null @@ -1,36 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Provides a custom description to another matcher. - */ -@interface HCDescribedAs : HCBaseMatcher - -- (instancetype)initWithDescription:(NSString *)description - forMatcher:(id )matcher - overValues:(NSArray *)templateValues; - -@end - - -FOUNDATION_EXPORT id HC_describedAs(NSString *description, id matcher, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Wraps an existing matcher, overriding its description with that specified. All other - * functions are delegated to the decorated matcher, including its mismatch description. - * @param description The new description for the wrapped matcher. - * @param matcher The matcher to wrap, followed by a comma-separated list of substitution - * values ending with nil. - * @discussion The description may contain substitution placeholders %0, %1, etc. These will be - * replaced by any values that follow the matcher. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_describedAs instead. - */ -#define describedAs(description, matcher, ...) HC_describedAs(description, matcher, ##__VA_ARGS__) -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCDescription.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCDescription.h deleted file mode 100644 index e2a4775a0e..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCDescription.h +++ /dev/null @@ -1,35 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract A description of an HCMatcher. - * @discussion An HCMatcher will describe itself to a description which can later be used for reporting. - */ -@protocol HCDescription - -/*! - * @abstract Appends some plain text to the description. - * @return self, for chaining. - */ -- (id )appendText:(NSString *)text; - -/*! - * @abstract Appends description of specified value to description. - * @discussion If the value implements the HCSelfDescribing protocol, then it will be used. - * @return self, for chaining. - */ -- (id )appendDescriptionOf:(id)value; - -/*! - * @abstract Appends a list of objects to the description. - * @return self, for chaining. - */ -- (id )appendList:(NSArray *)values - start:(NSString *)start - separator:(NSString *)separator - end:(NSString *)end; - -@end diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCDiagnosingMatcher.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCDiagnosingMatcher.h deleted file mode 100644 index cf1793fc7d..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCDiagnosingMatcher.h +++ /dev/null @@ -1,15 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Base class for matchers that generate mismatch descriptions during the matching. - * @discussion Some matching algorithms have several "no match" paths. It helps to make the mismatch - * description as precise as possible, but we don't want to have to repeat the matching logic to do - * so. For such matchers, subclass HCDiagnosingMatcher and implement HCMatcher's - * -matches:describingMismatchTo:. -*/ -@interface HCDiagnosingMatcher : HCBaseMatcher -@end diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCEvery.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCEvery.h deleted file mode 100644 index e98a6ceb82..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCEvery.h +++ /dev/null @@ -1,40 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches if every item in a collection satisfies a nested matcher. - */ -@interface HCEvery : HCDiagnosingMatcher - -@property (nonatomic, strong, readonly) id matcher; - -- (instancetype)initWithMatcher:(id )matcher; - -@end - - -FOUNDATION_EXPORT id HC_everyItem(id itemMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when the examined collection's items are - * all matched by the specified matcher. - * @param itemMatcher The matcher to apply to every item provided by the examined collection. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. - * - * Example
        - *
        assertThat(\@[\@"bar", \@"baz"], everyItem(startsWith(\@"ba")))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_everyItem instead. - */ -static inline id everyItem(id itemMatcher) -{ - return HC_everyItem(itemMatcher); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCHasCount.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCHasCount.h deleted file mode 100644 index 531545c3e2..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCHasCount.h +++ /dev/null @@ -1,58 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches if collection size satisfies a nested matcher. - */ -@interface HCHasCount : HCBaseMatcher - -- (instancetype)initWithMatcher:(id )countMatcher; - -@end - - -FOUNDATION_EXPORT id HC_hasCount(id countMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object's -count method - * returns a value that satisfies the specified matcher. - * @param countMatcher A matcher for the count of an examined collection. - * @discussion - * Example
        - *
        assertThat(\@[\@"foo", \@"bar"], hasCount(equalTo(@2)))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasCount instead. - */ -static inline id hasCount(id countMatcher) -{ - return HC_hasCount(countMatcher); -} -#endif - - -FOUNDATION_EXPORT id HC_hasCountOf(NSUInteger count); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object's -count method - * returns a value that equals the specified value. - * @param value Value to compare against as the expected count. - * @discussion - * Example
        - *
        assertThat(\@[\@"foo", \@"bar"], hasCountOf(2))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasCountOf instead. - */ -static inline id hasCountOf(NSUInteger value) -{ - return HC_hasCountOf(value); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCHasDescription.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCHasDescription.h deleted file mode 100644 index d58a48b9b3..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCHasDescription.h +++ /dev/null @@ -1,40 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches objects whose description satisfies a nested matcher. - */ -@interface HCHasDescription : HCInvocationMatcher - -- (instancetype)initWithDescription:(id )descriptionMatcher; - -@end - - -FOUNDATION_EXPORT id HC_hasDescription(id descriptionMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object's -description - * satisfies the specified matcher. - * @param descriptionMatcher The matcher used to verify the description result, or an expected value - * for equalTo matching. - * @discussion If descriptionMatcher is not a matcher, it is implicitly wrapped in - * an equalTo matcher to check for equality. - * - * Examples
        - *
        assertThat(myObject, hasDescription(equalTo(\@"foo"))
        - *
        assertThat(myObject, hasDescription(\@"foo"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasDescription instead. - */ -static inline id hasDescription(id descriptionMatcher) -{ - return HC_hasDescription(descriptionMatcher); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCHasProperty.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCHasProperty.h deleted file mode 100644 index 158ed47a18..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCHasProperty.h +++ /dev/null @@ -1,42 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt -// Contribution by Justin Shacklette - -#import - - -/*! - * @abstract Matches objects whose "property" (or simple method) satisfies a nested matcher. - */ -@interface HCHasProperty : HCDiagnosingMatcher - -- (instancetype)initWithProperty:(NSString *)propertyName value:(id )valueMatcher; - -@end - - -FOUNDATION_EXPORT id HC_hasProperty(NSString *propertyName, id valueMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object has an instance method with the - * specified name whose return value satisfies the specified matcher. - * @param propertyName The name of an instance method without arguments that returns an object. - * @param valueMatcher The matcher to satisfy for the return value, or an expected value for - * equalTo matching. - * @discussion Note: While this matcher factory is called "hasProperty", it applies to the return - * values of any instance methods without arguments, not just properties. - * - * Examples
        - *
        assertThat(person, hasProperty(\@"firstName", equalTo(\@"Joe")))
        - *
        assertThat(person, hasProperty(\@"firstName", \@"Joe"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasProperty instead. - */ -static inline id hasProperty(NSString *propertyName, id valueMatcher) -{ - return HC_hasProperty(propertyName, valueMatcher); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCInvocationMatcher.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCInvocationMatcher.h deleted file mode 100644 index ea5cbfcbac..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCInvocationMatcher.h +++ /dev/null @@ -1,40 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Supporting class for matching a feature of an object. - * @discussion Tests whether the result of passing the specified invocation to the value satisfies - * the specified matcher. - */ -@interface HCInvocationMatcher : HCBaseMatcher -{ - NSInvocation *_invocation; - id _subMatcher; -} - -/*! - * @abstract Determines whether a mismatch will be described in short form. - * @discussion Default is long form, which describes the object, the name of the invocation, and the - * sub-matcher's mismatch diagnosis. Short form only has the sub-matcher's mismatch diagnosis. - */ -@property (nonatomic, assign) BOOL shortMismatchDescription; - -/*! - * @abstract Initializes a newly allocated HCInvocationMatcher with an invocation and a matcher. - */ -- (instancetype)initWithInvocation:(NSInvocation *)anInvocation matching:(id )aMatcher; - -/*! - * @abstract Invokes stored invocation on the specified item and returns the result. - */ -- (id)invokeOn:(id)item; - -/*! - * @abstract Returns string representation of the invocation's selector. - */ -- (NSString *)stringFromSelector; - -@end diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIs.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIs.h deleted file mode 100644 index 73071180fe..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIs.h +++ /dev/null @@ -1,50 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Decorates another matcher. - */ -@interface HCIs : HCBaseMatcher - -- (instancetype)initWithMatcher:(id )matcher; - -@end - - -FOUNDATION_EXPORT id HC_is(id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Wraps an existing matcher, or provides a shortcut to the frequently - * used is(equalTo(x)). - * @param value The matcher to satisfy, or an expected value for equalTo matching. - * @discussion - * If valueis a matcher, its behavior is retained, but the test may be slightly more - * expressive. For example: - *
          - *
        • assertThat(\@(value), equalTo(\@5))
        • - *
        • assertThat(\@(value), is(equalTo(\@5)))
        • - *
        - * - * If valueis not a matcher, it is wrapped in an equalTo matcher. This makes the - * following statements equivalent: - *
          - *
        • assertThat(cheese, equalTo(smelly))
        • - *
        • assertThat(cheese, is(equalTo(smelly)))
        • - *
        • assertThat(cheese, is(smelly))
        • - *
        - * - * Choose the style that makes your expression most readable. This will vary depending on context. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_is instead. - */ -static inline id is(id value) -{ - return HC_is(value); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsAnything.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsAnything.h deleted file mode 100644 index 3c1d8985f0..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsAnything.h +++ /dev/null @@ -1,51 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches anything. - */ -@interface HCIsAnything : HCBaseMatcher - -- (instancetype)init; -- (instancetype)initWithDescription:(NSString *)description; - -@end - - -FOUNDATION_EXPORT id HC_anything(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that always matches, regardless of the examined object. - * @discussion - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_anything instead. - */ -static inline id anything(void) -{ - return HC_anything(); -} -#endif - - -FOUNDATION_EXPORT id HC_anythingWithDescription(NSString *description); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches anything, regardless of the examined object, but - * describes itself with the specified NSString. - * @param description A meaningful string used to describe this matcher. - * @discussion - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_anything instead. - */ -static inline id anythingWithDescription(NSString *description) -{ - return HC_anythingWithDescription(description); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCloseTo.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCloseTo.h deleted file mode 100644 index e3c8d4951e..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCloseTo.h +++ /dev/null @@ -1,38 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matchers numbers close to a value, within a delta range. - */ -@interface HCIsCloseTo : HCBaseMatcher - -- (instancetype)initWithValue:(double)value delta:(double)delta; - -@end - - -FOUNDATION_EXPORT id HC_closeTo(double value, double delta); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSNumbers that matches when the examined number is close to the - * specified value, within the specified delta. - * @param value The expected value of matching numbers. - * @param delta The delta within which matches will be allowed. - * @discussion Invokes -doubleValue on the examined number to get its value. - * - * Example
        - *
        assertThat(\@1.03, closeTo(1.0, 0.03)
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_closeTo instead. - */ -static inline id closeTo(double value, double delta) -{ - return HC_closeTo(value, delta); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionContaining.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionContaining.h deleted file mode 100644 index 7f55bd1c2f..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionContaining.h +++ /dev/null @@ -1,90 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches if any item in a collection satisfies a nested matcher. - */ -@interface HCIsCollectionContaining : HCDiagnosingMatcher - -- (instancetype)initWithMatcher:(id )elementMatcher; - -@end - - -FOUNDATION_EXPORT id HC_hasItem(id itemMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract hasItem(itemMatcher) - - * Creates a matcher for collections that matches when at least one item in the examined collection - * satisfies the specified matcher. - * @param itemMatcher The matcher to apply to collection elements, or an expected value - * for equalTo matching. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. - * - * If itemMatcher is not a matcher, it is implicitly wrapped in an equalTo matcher - * to check for equality. - * - * Example
        - *
        assertThat(\@[\@1, \@2, \@3], hasItem(equalTo(\@2)))
        - * - *
        assertThat(\@[\@1, \@2, \@3], hasItem(\@2))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasItem instead. - */ -#define hasItem HC_hasItem -#endif - - -FOUNDATION_EXPORT id HC_hasItemsIn(NSArray *itemMatchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when all specified matchers are - * satisfied by any item in the examined collection. - * @param itemMatchers An array of matchers. Any element that is not a matcher is implicitly wrapped - * in an equalTo matcher to check for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing one pass for each matcher. - * - * Example
        - *
        assertThat(\@[\@"foo", \@"bar", \@"baz"], hasItems(\@[endsWith(\@"z"), endsWith(\@"o")]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasItemsIn instead. - */ -static inline id hasItemsIn(NSArray *itemMatchers) -{ - return HC_hasItemsIn(itemMatchers); -} -#endif - - -FOUNDATION_EXPORT id HC_hasItems(id itemMatchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when all specified matchers are - * satisfied by any item in the examined collection. - * @param itemMatchers... A comma-separated list of matchers ending with nil. - * Any argument that is not a matcher is implicitly wrapped in an equalTo matcher to check - * for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing one pass for each matcher. - * - * Example
        - *
        assertThat(\@[\@"foo", \@"bar", \@"baz"], hasItems(endsWith(\@"z"), endsWith(\@"o"), nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasItems instead. - */ -#define hasItems(itemMatchers...) HC_hasItems(itemMatchers) -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionContainingInAnyOrder.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionContainingInAnyOrder.h deleted file mode 100644 index e52487c915..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionContainingInAnyOrder.h +++ /dev/null @@ -1,74 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches if every item in a collection, in any order, satisfy a list of nested matchers. - */ -@interface HCIsCollectionContainingInAnyOrder : HCDiagnosingMatcher - -- (instancetype)initWithMatchers:(NSArray *)itemMatchers; - -@end - - -FOUNDATION_EXPORT id HC_containsInAnyOrderIn(NSArray *itemMatchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates an order-agnostic matcher for collections that matches when each item in the - * examined collection satisfies one matcher anywhere in the specified list of matchers. - * @param itemMatchers An array of matchers. Any element that is not a matcher is implicitly wrapped - * in an equalTo matcher to check for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. For a positive match, the examined collection must be of the same - * length as the specified list of matchers. - * - * Note: Each matcher in the specified list will only be used once during a given examination, so - * be careful when specifying matchers that may be satisfied by more than one entry in an examined - * collection. - * - * Examples
        - *
        assertThat(\@[\@"foo", \@"bar"], containsInAnyOrderIn(\@[equalTo(\@"bar"), equalTo(\@"foo")]))
        - *
        assertThat(\@[\@"foo", \@"bar"], containsInAnyOrderIn(@[\@"bar", \@"foo"]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_containsInAnyOrderIn instead. - */ -static inline id containsInAnyOrderIn(NSArray *itemMatchers) -{ - return HC_containsInAnyOrderIn(itemMatchers); -} -#endif - - -FOUNDATION_EXPORT id HC_containsInAnyOrder(id itemMatchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates an order-agnostic matcher for collections that matches when each item in the - * examined collection satisfies one matcher anywhere in the specified list of matchers. - * @param itemMatchers... A comma-separated list of matchers ending with nil. - * Any argument that is not a matcher is implicitly wrapped in an equalTo matcher to check - * for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. For a positive match, the examined collection must be of the same - * length as the specified list of matchers. - * - * Note: Each matcher in the specified list will only be used once during a given examination, so - * be careful when specifying matchers that may be satisfied by more than one entry in an examined - * collection. - * - * Examples
        - *
        assertThat(\@[\@"foo", \@"bar"], containsInAnyOrder(equalTo(\@"bar"), equalTo(\@"foo"), nil))
        - *
        assertThat(\@[\@"foo", \@"bar"], containsInAnyOrder(\@"bar", \@"foo", nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_containsInAnyOrder instead. - */ -#define containsInAnyOrder(itemMatchers...) HC_containsInAnyOrder(itemMatchers) -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionContainingInOrder.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionContainingInOrder.h deleted file mode 100644 index be22dcf7ed..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionContainingInOrder.h +++ /dev/null @@ -1,66 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches if every item in a collection satisfies a list of nested matchers, in order. - */ -@interface HCIsCollectionContainingInOrder : HCDiagnosingMatcher - -- (instancetype)initWithMatchers:(NSArray *)itemMatchers; - -@end - - -FOUNDATION_EXPORT id HC_containsIn(NSArray *itemMatchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when each item in the examined - * collection satisfies the corresponding matcher in the specified list of matchers. - * @param itemMatchers An array of matchers. Any element that is not a matcher is implicitly wrapped - * in an equalTo matcher to check for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. For a positive match, the examined collection must be of the same - * length as the specified list of matchers. - * - * Examples
        - *
        assertThat(\@[\@"foo", \@"bar"], containsIn(\@[equalTo(\@"foo"), equalTo(\@"bar")]))
        - *
        assertThat(\@[\@"foo", \@"bar"], containsIn(\@[\@"foo", \@"bar"]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_containsIn instead.) - */ -static inline id containsIn(NSArray *itemMatchers) -{ - return HC_containsIn(itemMatchers); -} -#endif - - -FOUNDATION_EXPORT id HC_contains(id itemMatchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when each item in the examined - * collection satisfies the corresponding matcher in the specified list of matchers. - * @param itemMatchers... A comma-separated list of matchers ending with nil. - * Any argument that is not a matcher is implicitly wrapped in an equalTo matcher to check - * for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. For a positive match, the examined collection must be of the same - * length as the specified list of matchers. - * - * Examples
        - *
        assertThat(\@[\@"foo", \@"bar"], contains(equalTo(\@"foo"), equalTo(\@"bar"), nil))
        - *
        assertThat(\@[\@"foo", \@"bar"], contains(\@"foo", \@"bar", nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_contains instead.) - */ -#define contains(itemMatchers...) HC_contains(itemMatchers) -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionContainingInRelativeOrder.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionContainingInRelativeOrder.h deleted file mode 100644 index dae89fdd13..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionContainingInRelativeOrder.h +++ /dev/null @@ -1,43 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches if every item in a collection satisfies a list of nested matchers, in order. - */ -@interface HCIsCollectionContainingInRelativeOrder : HCDiagnosingMatcher - -- (instancetype)initWithMatchers:(NSArray *)itemMatchers; - -@end - - -FOUNDATION_EXPORT id HC_containsInRelativeOrder(NSArray *itemMatchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when the examined collection contains - * items satisfying the specified list of matchers, in the same relative order. - * @param itemMatchers Array of matchers that must be satisfied by the items provided by the - * examined collection in the same relative order. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. - * - * Any element of itemMatchers that is not a matcher is implicitly wrapped in an - * equalTo matcher to check for equality. - * - * Examples
        - *
        assertThat(\@[\@1, \@2, \@3, \@4, \@5], containsInRelativeOrder(equalTo(\@2), equalTo(\@4)))
        - *
        assertThat(\@[\@1, \@2, \@3, \@4, \@5], containsInRelativeOrder(\@2, \@4))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_containsInRelativeOrder instead. - */ -static inline id containsInRelativeOrder(NSArray *itemMatchers) -{ - return HC_containsInRelativeOrder(itemMatchers); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionOnlyContaining.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionOnlyContaining.h deleted file mode 100644 index 6c28e09344..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsCollectionOnlyContaining.h +++ /dev/null @@ -1,58 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches if every item in a collection satisfies any of the nested matchers. - */ -@interface HCIsCollectionOnlyContaining : HCEvery -@end - -FOUNDATION_EXPORT id HC_onlyContainsIn(NSArray *itemMatchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when each item of the examined - * collection satisfies any of the specified matchers. - * @param itemMatchers An array of matchers. Any element that is not a matcher is implicitly wrapped - * in an equalTo matcher to check for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. Any matcher may match multiple elements. - * - * Example
        - *
        assertThat(\@[\@"Jon", \@"John", \@"Bob"], onlyContainsIn(\@[startsWith(\@"Jo"), startsWith(\@("Bo")]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_onlyContainsIn instead. - */ -static inline id onlyContainsIn(NSArray *itemMatchers) -{ - return HC_onlyContainsIn(itemMatchers); -} -#endif - - -FOUNDATION_EXPORT id HC_onlyContains(id itemMatchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when each item of the examined - * collection satisfies any of the specified matchers. - * @param itemMatchers... A comma-separated list of matchers ending with nil. - * Any argument that is not a matcher is implicitly wrapped in an equalTo matcher to check for - * equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. Any matcher may match multiple elements. - * - * Example
        - *
        assertThat(\@[\@"Jon", \@"John", \@"Bob"], onlyContains(startsWith(\@"Jo"), startsWith(\@("Bo"), nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_onlyContains instead. - */ -#define onlyContains(itemMatchers...) HC_onlyContains(itemMatchers) -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsDictionaryContaining.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsDictionaryContaining.h deleted file mode 100644 index 4064e44572..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsDictionaryContaining.h +++ /dev/null @@ -1,42 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches if any entry in a dictionary satisfies the nested pair of matchers. - */ -@interface HCIsDictionaryContaining : HCBaseMatcher - -- (instancetype)initWithKeyMatcher:(id )keyMatcher - valueMatcher:(id )valueMatcher; - -@end - - -FOUNDATION_EXPORT id HC_hasEntry(id keyMatcher, id valueMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSDictionaries that matches when the examined dictionary contains - * at least one entry whose key satisfies the specified keyMatcher and whose - * value satisfies the specified valueMatcher. - * @param keyMatcher The matcher to satisfy for the key, or an expected value for equalTo matching. - * @param valueMatcher The matcher to satisfy for the value, or an expected value for equalTo matching. - * @discussion Any argument that is not a matcher is implicitly wrapped in an equalTo - * matcher to check for equality. - * - * Examples
        - *
        assertThat(myDictionary, hasEntry(equalTo(\@"foo"), equalTo(\@"bar")))
        - *
        assertThat(myDictionary, hasEntry(\@"foo", \@"bar"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasEntry instead. - */ -static inline id hasEntry(id keyMatcher, id valueMatcher) -{ - return HC_hasEntry(keyMatcher, valueMatcher); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsDictionaryContainingEntries.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsDictionaryContainingEntries.h deleted file mode 100644 index 34d4335c98..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsDictionaryContainingEntries.h +++ /dev/null @@ -1,63 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches if dictionary contains entries that satisfy the list of keys and value - * matchers. - */ -@interface HCIsDictionaryContainingEntries : HCDiagnosingMatcher - -- (instancetype)initWithKeys:(NSArray *)keys - valueMatchers:(NSArray *)valueMatchers; - -@end - -FOUNDATION_EXPORT id HC_hasEntriesIn(NSDictionary *valueMatchersForKeys); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSDictionaries that matches when the examined dictionary contains - * entries satisfying a dictionary of keys and their value matchers. - * @param valueMatchersForKeys A dictionary of keys (not matchers) and their value matchers. Any - * value argument that is not a matcher is implicitly wrapped in an equalTo matcher to - * check for equality. - * @discussion - * Examples
        - *
        assertThat(personDict, hasEntriesIn(\@{\@"firstName": equalTo(\@"Jon"), \@"lastName": equalTo(\@"Reid")}))
        - *
        assertThat(personDict, hasEntriesIn(\@{\@"firstName": \@"Jon", \@"lastName": \@"Reid"}))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasEntryIn instead. - */ -static inline id hasEntriesIn(NSDictionary *valueMatchersForKeys) -{ - return HC_hasEntriesIn(valueMatchersForKeys); -} -#endif - -FOUNDATION_EXPORT id HC_hasEntries(id keysAndValueMatchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSDictionaries that matches when the examined dictionary contains - * entries satisfying a list of alternating keys and their value matchers. - * @param keysAndValueMatchers... A key (not a matcher) to look up, followed by a value matcher or - * an expected value for equalTo matching, in a comma-separated list ending - * with nil - * @discussion Note that the keys must be actual keys, not matchers. Any value argument that is not - * a matcher is implicitly wrapped in an equalTo matcher to check for equality. - * - * Examples
        - *
        assertThat(personDict, hasEntries(\@"firstName", equalTo(\@"Jon"), \@"lastName", equalTo(\@"Reid"), nil))
        - *
        assertThat(personDict, hasEntries(\@"firstName", \@"Jon", \@"lastName", \@"Reid", nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasEntry instead. - */ -#define hasEntries(keysAndValueMatchers...) HC_hasEntries(keysAndValueMatchers) -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsDictionaryContainingKey.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsDictionaryContainingKey.h deleted file mode 100644 index ed6311d706..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsDictionaryContainingKey.h +++ /dev/null @@ -1,39 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches if any entry in a dictionary has a key satisfying the nested matcher. - */ -@interface HCIsDictionaryContainingKey : HCBaseMatcher - -- (instancetype)initWithKeyMatcher:(id )keyMatcher; - -@end - - -FOUNDATION_EXPORT id HC_hasKey(id keyMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSDictionaries that matches when the examined dictionary contains - * at least key that satisfies the specified matcher. - * @param keyMatcher The matcher to satisfy for the key, or an expected value for equalTo matching. - * @discussion Any argument that is not a matcher is implicitly wrapped in an equalTo - * matcher to check for equality. - * - * Examples
        - *
        assertThat(myDictionary, hasEntry(equalTo(\@"foo")))
        - *
        assertThat(myDictionary, hasEntry(\@"foo"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasKey instead. - */ -static inline id hasKey(id keyMatcher) -{ - return HC_hasKey(keyMatcher); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsDictionaryContainingValue.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsDictionaryContainingValue.h deleted file mode 100644 index cbf4e2b4e5..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsDictionaryContainingValue.h +++ /dev/null @@ -1,41 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches if any entry in a dictionary has a value satisfying the nested matcher. - */ -@interface HCIsDictionaryContainingValue : HCBaseMatcher - -- (instancetype)initWithValueMatcher:(id )valueMatcher; - -@end - - -FOUNDATION_EXPORT id HC_hasValue(id valueMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSDictionaries that matches when the examined dictionary contains - * at least value that satisfies the specified matcher. - * @param valueMatcher The matcher to satisfy for the value, or an expected value for equalTo matching. - * @discussion This matcher works on any collection that has an -allValues method. - * - * Any argument that is not a matcher is implicitly wrapped in an equalTo matcher to check - * for equality. - * - * Examples
        - *
        assertThat(myDictionary, hasValue(equalTo(\@"bar")))
        - *
        assertThat(myDictionary, hasValue(\@"bar"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasValue instead. - */ -static inline id hasValue(id valueMatcher) -{ - return HC_hasValue(valueMatcher); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEmptyCollection.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEmptyCollection.h deleted file mode 100644 index 8922faec24..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEmptyCollection.h +++ /dev/null @@ -1,35 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches empty collections. - */ -@interface HCIsEmptyCollection : HCHasCount - -- (instancetype)init; - -@end - - -FOUNDATION_EXPORT id HC_isEmpty(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches any examined object whose -count method - * returns zero. - * - * Example
        - *
        assertThat(\@[], isEmpty())
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isEmpty instead. - */ -static inline id isEmpty(void) -{ - return HC_isEmpty(); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEqual.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEqual.h deleted file mode 100644 index 5c1f15b3ae..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEqual.h +++ /dev/null @@ -1,36 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Is the value equal to another value, as tested by the -isEqual: method? - */ -@interface HCIsEqual : HCBaseMatcher - -- (instancetype)initEqualTo:(id)expectedValue; - -@end - - -FOUNDATION_EXPORT id HC_equalTo(id operand); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to the specified - * object, as determined by calling the -isEqual: method on the examined object. - * @param operand The object to compare against as the expected value. - * @discussion If the specified operand is nil, then the created matcher will match if - * the examined object itself is nil, or if the examined object's -isEqual: - * method returns YES when passed a nil. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalTo instead. - */ -static inline id equalTo(id operand) -{ - return HC_equalTo(operand); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEqualCompressingWhiteSpace.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEqualCompressingWhiteSpace.h deleted file mode 100644 index 948c7a8800..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEqualCompressingWhiteSpace.h +++ /dev/null @@ -1,41 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Tests if a string is equal to another string, when whitespace differences are (mostly) ignored. - */ -@interface HCIsEqualCompressingWhiteSpace : HCBaseMatcher - -- (instancetype)initWithString:(NSString *)string; - -@end - - -FOUNDATION_EXPORT id HC_equalToCompressingWhiteSpace(NSString *expectedString); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSStrings that matches when the examined string is equal to the - * specified expected string, when whitespace differences are (mostly) ignored. - * @param expectedString The expected value of matched strings. (Must not be nil.) - * @discussion To be exact, the following whitespace rules are applied: - *
          - *
        • all leading and trailing whitespace of both the expectedString and the examined string are ignored
        • - *
        • any remaining whitespace, appearing within either string, is collapsed to a single space before comparison
        • - *
        - * - * Example
        - *
        assertThat(\@"   my\tfoo  bar ", equalToCompressingWhiteSpace(\@" my  foo bar"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToCompressingWhiteSpace instead. - */ -static inline id equalToCompressingWhiteSpace(NSString *expectedString) -{ - return HC_equalToCompressingWhiteSpace(expectedString); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEqualIgnoringCase.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEqualIgnoringCase.h deleted file mode 100644 index a2932784f7..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEqualIgnoringCase.h +++ /dev/null @@ -1,36 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Tests if a string is equal to another string, regardless of the case. - */ -@interface HCIsEqualIgnoringCase : HCBaseMatcher - -- (instancetype)initWithString:(NSString *)string; - -@end - - -FOUNDATION_EXPORT id HC_equalToIgnoringCase(NSString *expectedString); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSStrings that matches when the examined string is equal to the - * specified expected string, ignoring case differences. - * @param expectedString The expected value of matched strings. (Must not be nil.) - * @discussion - * Example
        - *
        assertThat(\@"Foo", equalToIgnoringCase(\@"FOO"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToIgnoringCase instead. - */ -static inline id equalToIgnoringCase(NSString *expectedString) -{ - return HC_equalToIgnoringCase(expectedString); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEqualToNumber.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEqualToNumber.h deleted file mode 100644 index 9659d05471..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsEqualToNumber.h +++ /dev/null @@ -1,285 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -FOUNDATION_EXPORT id HC_equalToChar(char value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified char value. - * @param value The char value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToChar instead. - */ -static inline id equalToChar(char value) -{ - return HC_equalToChar(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToDouble(double value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified double value. - * @param value The double value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToDouble instead. - */ -static inline id equalToDouble(double value) -{ - return HC_equalToDouble(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToFloat(float value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified float value. - * @param value The float value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToFloat instead. - */ -static inline id equalToFloat(float value) -{ - return HC_equalToFloat(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToInt(int value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified int value. - * @param value The int value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToInt instead. - */ -static inline id equalToInt(int value) -{ - return HC_equalToInt(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToLong(long value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified long value. - * @param value The long value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToLong instead. - */ -static inline id equalToLong(long value) -{ - return HC_equalToLong(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToLongLong(long long value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified long long value. - * @param value The long long value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToLongLong instead. - */ -static inline id equalToLongLong(long long value) -{ - return HC_equalToLongLong(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToShort(short value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified short value. - * @param value The short value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToShort instead. - */ -static inline id equalToShort(short value) -{ - return HC_equalToShort(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedChar(unsigned char value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract equalToUnsignedChar(value) - - * Creates a matcher that matches when the examined object is equal to an NSNumber created from the - * specified unsigned char value. - * @param value The unsigned char value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedChar instead. - */ -static inline id equalToUnsignedChar(unsigned char value) -{ - return HC_equalToUnsignedChar(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedInt(unsigned int value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified unsigned int value. - * @param value The unsigned int value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedInt instead. - */ -static inline id equalToUnsignedInt(unsigned int value) -{ - return HC_equalToUnsignedInt(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedLong(unsigned long value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified unsigned long value. - * @param value The unsigned long value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedLong instead. - */ -static inline id equalToUnsignedLong(unsigned long value) -{ - return HC_equalToUnsignedLong(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedLongLong(unsigned long long value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified unsigned long long value. - * @param value The unsigned long long value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedLongLong instead. - */ -static inline id equalToUnsignedLongLong(unsigned long long value) -{ - return HC_equalToUnsignedLongLong(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedShort(unsigned short value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified unsigned short value. - * @param value The unsigned short value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedShort instead. - */ -static inline id equalToUnsignedShort(unsigned short value) -{ - return HC_equalToUnsignedShort(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToInteger(NSInteger value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified NSInteger value. - * @param value The NSInteger value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToInteger instead. - */ -static inline id equalToInteger(NSInteger value) -{ - return HC_equalToInteger(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedInteger(NSUInteger value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified NSUInteger value. - * @param value The NSUInteger value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedInteger instead. - */ -static inline id equalToUnsignedInteger(NSUInteger value) -{ - return HC_equalToUnsignedInteger(value); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsIn.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsIn.h deleted file mode 100644 index 8c6cef9d90..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsIn.h +++ /dev/null @@ -1,38 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches if examined object is contained within the nested collection. - */ -@interface HCIsIn : HCBaseMatcher - -- (instancetype)initWithCollection:(id)collection; - -@end - - -FOUNDATION_EXPORT id HC_isIn(id aCollection); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is found within the specified - * collection. - * @param aCollection The collection to search. - * @discussion Invokes -containsObject: on aCollection to determine if the - * examined object is an element of the collection. - * - * Example
        - *
        assertThat(\@"foo", isIn(\@@[\@"bar", \@"foo"]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isIn instead. - */ -static inline id isIn(id aCollection) -{ - return HC_isIn(aCollection); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsInstanceOf.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsInstanceOf.h deleted file mode 100644 index 837d0c31bd..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsInstanceOf.h +++ /dev/null @@ -1,33 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches objects that are of a given class or any subclass. - */ -@interface HCIsInstanceOf : HCClassMatcher -@end - - -FOUNDATION_EXPORT id HC_instanceOf(Class expectedClass); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is an instance of, or inherits - * from, the specified class. - * @param expectedClass The class to compare against as the expected class. - * @discussion - * Example
        - *
        assertThat(canoe, instanceOf([Canoe class]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_instanceOf instead. - */ -static inline id instanceOf(Class expectedClass) -{ - return HC_instanceOf(expectedClass); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsNil.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsNil.h deleted file mode 100644 index fc24279265..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsNil.h +++ /dev/null @@ -1,51 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Is the value nil? - */ -@interface HCIsNil : HCBaseMatcher -@end - - -FOUNDATION_EXPORT id HC_nilValue(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is nil. - * @discussion - * Example
        - *
        assertThat(myObject, nilValue())
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_nilValue instead. - */ -static inline id nilValue(void) -{ - return HC_nilValue(); -} -#endif - - -FOUNDATION_EXPORT id HC_notNilValue(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is not nil. - * @discussion - * Example
        - *
        assertThat(myObject, notNilValue())
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_notNilValue instead. - */ -static inline id notNilValue(void) -{ - return HC_notNilValue(); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsNot.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsNot.h deleted file mode 100644 index f7e900187d..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsNot.h +++ /dev/null @@ -1,39 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Calculates the logical negation of a matcher. - */ -@interface HCIsNot : HCBaseMatcher - -- (instancetype)initWithMatcher:(id )matcher; - -@end - - -FOUNDATION_EXPORT id HC_isNot(id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that wraps an existing matcher, but inverts the logic by which it - * will match. - * @param value The matcher to negate, or an expected value to match for inequality. - * @discussion If value is not a matcher, it is implicitly wrapped in an equalTo - * matcher to check for equality, and thus matches for inequality. - * - * Examples
        - *
        assertThat(cheese, isNot(equalTo(smelly)))
        - *
        assertThat(cheese, isNot(smelly))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isNot instead. - */ -static inline id isNot(id value) -{ - return HC_isNot(value); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsSame.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsSame.h deleted file mode 100644 index a2ea2d7334..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsSame.h +++ /dev/null @@ -1,36 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Is the value the same object as another value? - */ -@interface HCIsSame : HCBaseMatcher - -- (instancetype)initSameAs:(id)object; - -@end - - -FOUNDATION_EXPORT id HC_sameInstance(id expectedInstance); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches only when the examined object is the same instance as - * the specified target object. - * @param expectedInstance The expected instance. - * @discussion - * Example
        - *
        assertThat(delegate, sameInstance(expectedDelegate))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_sameInstance instead. - */ -static inline id sameInstance(id expectedInstance) -{ - return HC_sameInstance(expectedInstance); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsTrueFalse.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsTrueFalse.h deleted file mode 100644 index 8e3bd9dfae..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsTrueFalse.h +++ /dev/null @@ -1,51 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches true values. - */ -@interface HCIsTrue : HCBaseMatcher -@end - -/*! - * @abstract Matches false values. - */ -@interface HCIsFalse : HCBaseMatcher -@end - - -FOUNDATION_EXPORT id HC_isTrue(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is an non-zero NSNumber. - * @discussion - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isTrue instead. - */ -static inline id isTrue(void) -{ - return HC_isTrue(); -} -#endif - - -FOUNDATION_EXPORT id HC_isFalse(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is NSNumber zero. - * @discussion - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isFalse instead. -*/ -static inline id isFalse(void) -{ - return HC_isFalse(); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsTypeOf.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsTypeOf.h deleted file mode 100644 index 5fedfc1208..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCIsTypeOf.h +++ /dev/null @@ -1,33 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches objects that are of a given class. - */ -@interface HCIsTypeOf : HCClassMatcher -@end - - -FOUNDATION_EXPORT id HC_isA(Class expectedClass); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is an instance of the specified - * class, but not of any subclass. - * @param expectedClass The class to compare against as the expected class. - * @discussion - * Example
        - *
        assertThat(canoe, isA([Canoe class]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isA instead. - */ -static inline id isA(Class expectedClass) -{ - return HC_isA(expectedClass); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCMatcher.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCMatcher.h deleted file mode 100644 index 74d2609665..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCMatcher.h +++ /dev/null @@ -1,43 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import "HCSelfDescribing.h" - - -/*! - * @abstract A matcher over acceptable values. - * @discussion A matcher is able to describe itself to give feedback when it fails. - * - * HCMatcher implementations should not directly implement this protocol. Instead, extend the - * HCBaseMatcher class, which will ensure that the HCMatcher API can grow to support new features - * and remain compatible with all HCMatcher implementations. - */ -@protocol HCMatcher - -/*! - * @abstract Evaluates the matcher for argument item. - * @param item The object against which the matcher is evaluated. - * @return YES if item matches, otherwise NO. - */ -- (BOOL)matches:(id)item; - -/*! - * @abstract Evaluates the matcher for argument item. - * @param item The object against which the matcher is evaluated. - * @param mismatchDescription The description to be built or appended to if item does not match. - * @return YES if item matches, otherwise NO. - */ -- (BOOL)matches:(id)item describingMismatchTo:(id )mismatchDescription; - -/*! - * @abstract Generates a description of why the matcher has not accepted the item. - * @param item The item that the HCMatcher has rejected. - * @param mismatchDescription The description to be built or appended to. - * @discussion The description will be part of a larger description of why a matching failed, so it - * should be concise. - * - * This method assumes that matches:item is false, but will not check this. - */ -- (void)describeMismatchOf:(id)item to:(id )mismatchDescription; - -@end diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCNumberAssert.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCNumberAssert.h deleted file mode 100644 index 4fa5fcb95a..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCNumberAssert.h +++ /dev/null @@ -1,336 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - -@protocol HCMatcher; - - -FOUNDATION_EXPORT void HC_assertThatBoolWithLocation(id testCase, BOOL actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatBool(actual, matcher) \ - HC_assertThatBoolWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatBool(actual, matcher) - - * Asserts that BOOL actual value, converted to an NSNumber, satisfies matcher. - * @param actual The BOOL value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatBool instead. - */ -#define assertThatBool(actual, matcher) HC_assertThatBool(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatCharWithLocation(id testCase, char actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatChar(actual, matcher) \ - HC_assertThatCharWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatChar(actual, matcher) - - * Asserts that char actual value, converted to an NSNumber, satisfies matcher. - * @param actual The char value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatChar instead. - */ -#define assertThatChar(actual, matcher) HC_assertThatChar(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatDoubleWithLocation(id testCase, double actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatDouble(actual, matcher) \ - HC_assertThatDoubleWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract HC_assertThatDouble(actual, matcher) - - * Asserts that double actual value, converted to an NSNumber, satisfies matcher. - * @param actual The double value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatDouble instead. - */ -#define assertThatDouble(actual, matcher) HC_assertThatDouble(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatFloatWithLocation(id testCase, float actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatFloat(actual, matcher) \ - HC_assertThatFloatWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatFloat(actual, matcher) - - * Asserts that float actual value, converted to an NSNumber, satisfies matcher. - * @param actual The float value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatFloat instead. - */ -#define assertThatFloat(actual, matcher) HC_assertThatFloat(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatIntWithLocation(id testCase, int actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatInt(actual, matcher) \ - HC_assertThatIntWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatInt(actual, matcher) - - * Asserts that int actual value, converted to an NSNumber, satisfies matcher. - * @param actual The int value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatInt instead. - */ -#define assertThatInt(actual, matcher) HC_assertThatInt(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatLongWithLocation(id testCase, long actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatLong(actual, matcher) \ - HC_assertThatLongWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatLong(actual, matcher) - - * Asserts that long actual value, converted to an NSNumber, satisfies matcher. - * @param actual The long value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatLong instead. - */ -#define assertThatLong(actual, matcher) HC_assertThatLong(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatLongLongWithLocation(id testCase, long long actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatLongLong(actual, matcher) \ - HC_assertThatLongLongWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatLongLong(actual, matcher) - - * Asserts that long long actual value, converted to an NSNumber, satisfies matcher. - * @param actual The long long value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatLongLong instead. - */ -#define assertThatLongLong(actual, matcher) HC_assertThatLongLong(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatShortWithLocation(id testCase, short actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatShort(actual, matcher) \ - HC_assertThatShortWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatShort(actual, matcher) - - * Asserts that short actual value, converted to an NSNumber, satisfies matcher. - * @param actual The short value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatShort instead. - */ -#define assertThatShort(actual, matcher) HC_assertThatShort(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedCharWithLocation(id testCase, unsigned char actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedChar(actual, matcher) \ - HC_assertThatUnsignedCharWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedChar(actual, matcher) - - * Asserts that unsigned char actual value, converted to an NSNumber, satisfies matcher. - * @param actual The unsigned char value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedChar instead. - */ -#define assertThatUnsignedChar(actual, matcher) HC_assertThatUnsignedChar(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedIntWithLocation(id testCase, unsigned int actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedInt(actual, matcher) \ - HC_assertThatUnsignedIntWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedInt(actual, matcher) - - * Asserts that unsigned int actual value, converted to an NSNumber, satisfies matcher. - * @param actual The unsigned int value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedInt instead. - */ -#define assertThatUnsignedInt(actual, matcher) HC_assertThatUnsignedInt(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedLongWithLocation(id testCase, unsigned long actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedLong(actual, matcher) \ - HC_assertThatUnsignedLongWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedLong(actual, matcher) - - * Asserts that unsigned long actual value, converted to an NSNumber, satisfies matcher. - * @param actual The unsigned long value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedLong instead. - */ -#define assertThatUnsignedLong(actual, matcher) HC_assertThatUnsignedLong(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedLongLongWithLocation(id testCase, unsigned long long actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedLongLong(actual, matcher) \ - HC_assertThatUnsignedLongLongWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedLongLong(actual, matcher) - - * Asserts that unsigned long long actual value, converted to an NSNumber, satisfies matcher. - * @param actual The unsigned long long value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedLongLong instead. - */ -#define assertThatUnsignedLongLong(actual, matcher) HC_assertThatUnsignedLongLong(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedShortWithLocation(id testCase, unsigned short actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedShort(actual, matcher) \ - HC_assertThatUnsignedShortWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedShort(actual, matcher) - - * Asserts that unsigned short actual value, converted to an NSNumber, satisfies matcher. - * @param actual The unsigned short value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedShort instead. - */ -#define assertThatUnsignedShort(actual, matcher) HC_assertThatUnsignedShort(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatIntegerWithLocation(id testCase, NSInteger actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatInteger(actual, matcher) \ - HC_assertThatIntegerWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatInteger(actual, matcher) - - * Asserts that NSInteger actual value, converted to an NSNumber, satisfies matcher. - * @param actual The NSInteger value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatInteger instead. - */ -#define assertThatInteger(actual, matcher) HC_assertThatInteger(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedIntegerWithLocation(id testCase, NSUInteger actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedInteger(actual, matcher) \ - HC_assertThatUnsignedIntegerWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedInteger(actual, matcher) - - * Asserts that NSUInteger actual value, converted to an NSNumber, satisfies matcher. - * @param actual The NSUInteger value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedInteger instead. - */ -#define assertThatUnsignedInteger(actual, matcher) HC_assertThatUnsignedInteger(actual, matcher) -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCOrderingComparison.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCOrderingComparison.h deleted file mode 100644 index 572b18a184..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCOrderingComparison.h +++ /dev/null @@ -1,109 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Matches values with -compare:. - */ -@interface HCOrderingComparison : HCBaseMatcher - -- (instancetype)initComparing:(id)expectedValue - minCompare:(NSComparisonResult)min - maxCompare:(NSComparisonResult)max - comparisonDescription:(NSString *)comparisonDescription; - -@end - - -FOUNDATION_EXPORT id HC_greaterThan(id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is greater than the specified - * value, as reported by the -compare: method of the examined object. - * @param value The value which, when passed to the -compare: method of the examined - * object, should return NSOrderedAscending. - * @discussion - * Example
        - *
        assertThat(\@2, greaterThan(\@1))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_greaterThan instead. - */ -static inline id greaterThan(id value) -{ - return HC_greaterThan(value); -} -#endif - - -FOUNDATION_EXPORT id HC_greaterThanOrEqualTo(id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is greater than or equal to the - * specified value, as reported by the -compare: method of the examined object. - * @param value The value which, when passed to the -compare: method of the examined - * object, should return NSOrderedAscending or NSOrderedSame. - * @discussion - * Example
        - *
        assertThat(\@1, greaterThanOrEqualTo(\@1))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_greaterThanOrEqualTo instead. - */ -static inline id greaterThanOrEqualTo(id value) -{ - return HC_greaterThanOrEqualTo(value); -} -#endif - - -FOUNDATION_EXPORT id HC_lessThan(id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is less than the specified - * value, as reported by the -compare: method of the examined object. - * @param value The value which, when passed to the -compare: method of the examined - * object, should return NSOrderedDescending. - * @discussion - * Example
        - *
        assertThat(\@1, lessThan(\@2))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_lessThan instead. - */ -static inline id lessThan(id value) -{ - return HC_lessThan(value); -} -#endif - - -FOUNDATION_EXPORT id HC_lessThanOrEqualTo(id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is less than or equal to the - * specified value, as reported by the -compare: method of the examined object. - * @param value The value which, when passed to the -compare: method of the examined - * object, should return NSOrderedDescending or NSOrderedSame. - * @discussion - * Example
        - *
        assertThat(\@1, lessThanOrEqualTo(\@1))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_lessThanOrEqualTo instead. - */ -static inline id lessThanOrEqualTo(id value) -{ - return HC_lessThanOrEqualTo(value); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCRequireNonNilObject.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCRequireNonNilObject.h deleted file mode 100644 index c638538683..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCRequireNonNilObject.h +++ /dev/null @@ -1,10 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Throws an NSException if obj is nil. -*/ -FOUNDATION_EXPORT void HCRequireNonNilObject(id obj); diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCSelfDescribing.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCSelfDescribing.h deleted file mode 100644 index 9a18ed9adc..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCSelfDescribing.h +++ /dev/null @@ -1,22 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - -#import "HCDescription.h" // Convenience header - - -/*! - * @abstract The ability of an object to describe itself. - */ -@protocol HCSelfDescribing - -/*! - * @abstract Generates a description of the object. - * @param description The description to be built or appended to. - * @discussion The description may be part of a description of a larger object of which this is just - * a component, so it should be worded appropriately. - */ -- (void)describeTo:(id )description; - -@end diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringContains.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringContains.h deleted file mode 100644 index 3ee9f45ae0..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringContains.h +++ /dev/null @@ -1,35 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Tests if string that contains a substring. - */ -@interface HCStringContains : HCSubstringMatcher -@end - - -FOUNDATION_EXPORT id HC_containsSubstring(NSString *substring); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is a string containing the - * specified substring anywhere. - * @param substring The string to search for. (Must not be nil.) - * @discussion The matcher invokes -rangeOfString: on the examined object, passing the - * specified substring and matching if it is found. - * - * Example
        - *
        assertThat(\@"myStringOfNote", containsSubstring(\@"ring"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_containsSubstring instead. - */ -static inline id containsSubstring(NSString *substring) -{ - return HC_containsSubstring(substring); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringContainsInOrder.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringContainsInOrder.h deleted file mode 100644 index e1bcf475fa..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringContainsInOrder.h +++ /dev/null @@ -1,57 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Tests if string that contains a list of substrings in relative order. - */ -@interface HCStringContainsInOrder : HCBaseMatcher - -- (instancetype)initWithSubstrings:(NSArray *)substrings; - -@end - - -FOUNDATION_EXPORT id HC_stringContainsInOrderIn(NSArray *substrings); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates matcher for NSStrings that matches when the examined string contains all of the - * specified substrings, considering the order of their appearance. - * @param substrings An array of strings. - * @discussion - * Example
        - *
        assertThat(\@"myfoobarbaz", stringContainsInOrderIn(\@[\@"bar", \@"foo"]))
        - * fails as "foo" occurs before "bar" in the string "myfoobarbaz" - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_stringContainsInOrderIn instead. - */ -static inline id stringContainsInOrderIn(NSArray *substrings) -{ - return HC_stringContainsInOrderIn(substrings); -} -#endif - - -FOUNDATION_EXPORT id HC_stringContainsInOrder(NSString *substrings, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates matcher for NSStrings that matches when the examined string contains all of the - * specified substrings, considering the order of their appearance. - * @param substrings... A comma-separated list of strings, ending with nil. - * @discussion - * Example
        - *
        assertThat(\@"myfoobarbaz", stringContainsInOrder(\@"bar", \@"foo", nil))
        - * fails as "foo" occurs before "bar" in the string "myfoobarbaz" - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_stringContainsInOrder instead. - */ -#define stringContainsInOrder(substrings...) HC_stringContainsInOrder(substrings) -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringDescription.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringDescription.h deleted file mode 100644 index 79a7cf529d..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringDescription.h +++ /dev/null @@ -1,34 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - -@protocol HCSelfDescribing; - - -/*! - * @abstract An HCDescription that is stored as a string. - */ -@interface HCStringDescription : HCBaseDescription -{ - NSMutableString *accumulator; -} - -/*! - * @abstract Returns the description of an HCSelfDescribing object as a string. - * @param selfDescribing The object to be described. - * @return The description of the object. - */ -+ (NSString *)stringFrom:(id )selfDescribing; - -/*! - * @abstract Creates and returns an empty description. - */ -+ (instancetype)stringDescription; - -/*! - * @abstract Initializes a newly allocated HCStringDescription that is initially empty. - */ -- (instancetype)init; - -@end diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringEndsWith.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringEndsWith.h deleted file mode 100644 index c58211d7e1..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringEndsWith.h +++ /dev/null @@ -1,36 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Tests if string ends with a substring. - */ -@interface HCStringEndsWith : HCSubstringMatcher -@end - - -FOUNDATION_EXPORT id HC_endsWith(NSString *suffix); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is a string that ends with the - * specified string. - * @param suffix The substring that the returned matcher will expect at the end of any examined - * string. (Must not be nil.) - * @discussion The matcher invokes -hasSuffix: on the examined object, passing the - * specified suffix. - * - * Example
        - *
        assertThat(\@"myStringOfNote", endsWith(\@"Note"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_endsWith instead. - */ -static inline id endsWith(NSString *suffix) -{ - return HC_endsWith(suffix); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringStartsWith.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringStartsWith.h deleted file mode 100644 index 3491b88767..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCStringStartsWith.h +++ /dev/null @@ -1,36 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Tests string starts with a substring. - */ -@interface HCStringStartsWith : HCSubstringMatcher -@end - - -FOUNDATION_EXPORT id HC_startsWith(NSString *prefix); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is a string that starts with - * the specified string. - * @param prefix The substring that the returned matcher will expect at the start of any examined - * string. (Must not be nil.) - * @discussion The matcher invokes -hasPrefix: on the examined object, passing the - * specified prefix. - * - * Example
        - *
        assertThat(\@"myStringOfNote", startsWith(\@"my"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_startsWith instead. - */ -static inline id startsWith(NSString *prefix) -{ - return HC_startsWith(prefix); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCSubstringMatcher.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCSubstringMatcher.h deleted file mode 100644 index 3a2f5d1eea..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCSubstringMatcher.h +++ /dev/null @@ -1,13 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -@interface HCSubstringMatcher : HCBaseMatcher - -@property (nonatomic, copy, readonly) NSString *substring; - -- (instancetype)initWithSubstring:(NSString *)substring; - -@end diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCTestFailure.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCTestFailure.h deleted file mode 100644 index 3a371edd48..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCTestFailure.h +++ /dev/null @@ -1,38 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - @abstract Test failure location and reason. - */ -@interface HCTestFailure : NSObject - -/*! - * @abstract Test case used to run test method. - * @discussion Can be nil. - * - * For unmet OCHamcrest assertions, if the assertion was assertThat or - * assertWithTimeout, testCase will be the test case instance. - */ -@property (nonatomic, strong, readonly) id testCase; - -/*! @abstract File name to report. */ -@property (nonatomic, copy, readonly) NSString *fileName; - -/*! @abstract Line number to report. */ -@property (nonatomic, assign, readonly) NSUInteger lineNumber; - -/*! @abstract Failure reason to report. */ -@property (nonatomic, strong, readonly) NSString *reason; - -/*! - * @abstract Initializes a newly allocated instance of a test failure. - */ -- (instancetype)initWithTestCase:(id)testCase - fileName:(NSString *)fileName - lineNumber:(NSUInteger)lineNumber - reason:(NSString *)reason; - -@end diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCTestFailureReporter.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCTestFailureReporter.h deleted file mode 100644 index 5498e5b081..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCTestFailureReporter.h +++ /dev/null @@ -1,21 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - -@class HCTestFailure; - - -/*! - Chain-of-responsibility for handling test failures. - */ -@interface HCTestFailureReporter : NSObject - -@property (nonatomic, strong) HCTestFailureReporter *successor; - -/*! - Handle test failure at specific location, or pass to successor. - */ -- (void)handleFailure:(HCTestFailure *)failure; - -@end diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCTestFailureReporterChain.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCTestFailureReporterChain.h deleted file mode 100644 index 6a8a39e190..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCTestFailureReporterChain.h +++ /dev/null @@ -1,32 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - -@class HCTestFailureReporter; - - -/*! - * @abstract Manage chain-of-responsibility for reporting test failures. - * @discussion This provides a generic way of reporting test failures without knowing about the - * underlying test framework. By default, we try XCTest first, then SenTestingKit. If we run out of - * options, the final catch-all is to throw an NSException describing the test failure. - */ -@interface HCTestFailureReporterChain : NSObject - -/*! - * @abstract Returns current chain of test failure reporters. - */ -+ (HCTestFailureReporter *)reporterChain; - -/*! - * @abstract Adds specified test failure reporter to head of chain-of-responsibility. - */ -+ (void)addReporter:(HCTestFailureReporter *)reporter; - -/*! - * @abstract Resets chain-of-responsibility to default. - */ -+ (void)reset; - -@end diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCThrowsException.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCThrowsException.h deleted file mode 100644 index 9bbe7360d1..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCThrowsException.h +++ /dev/null @@ -1,36 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - - -/*! - * @abstract Does executing a block throw an exception which satisfies a nested matcher? - */ -@interface HCThrowsException : HCDiagnosingMatcher - -- (id)initWithExceptionMatcher:(id)exceptionMatcher; - -@end - - -FOUNDATION_EXPORT id HC_throwsException(id exceptionMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is a block which, when - * executed, throws an exception satisfying the specified matcher. - * @param exceptionMatcher The matcher to satisfy when passed the exception. - * @discussion - * Example
        - *
        assertThat(^{ [obj somethingBad]; }, throwsException(hasProperty(@"reason", @"EXPECTED REASON")))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_throwsException instead. - */ -static inline id throwsException(id exceptionMatcher) -{ - return HC_throwsException(exceptionMatcher); -} -#endif diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCWrapInMatcher.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCWrapInMatcher.h deleted file mode 100644 index 18854bb06e..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/HCWrapInMatcher.h +++ /dev/null @@ -1,13 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import - -@protocol HCMatcher; - - -/*! - * @abstract Wraps argument in a matcher, if necessary. - * @return The argument as-is if it is already a matcher, otherwise wrapped in an equalTo matcher. - */ -FOUNDATION_EXPORT id HCWrapInMatcher(id matcherOrValue); diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/OCHamcrestIOS.h b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/OCHamcrestIOS.h deleted file mode 100644 index 73814a0e1b..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Headers/OCHamcrestIOS.h +++ /dev/null @@ -1,54 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2016 hamcrest.org. See LICENSE.txt - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -// Carthage workaround: Include transitive public headers -#import -#import -#import -#import -#import diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/OCHamcrestIOS b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/OCHamcrestIOS deleted file mode 100644 index 7bbfef8558a14f6c2e7f266825dc230a266f5788..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2231248 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

        6{H-KIHj3nCX+wML6wQ1AVhVPe-_EU((qK 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

        73ZyT7CU1bj32VFs4s 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

        ASiM z+Ox_oY|olpu>QVTeJ8*7li?=61>;BW^wwYfmmxS8cSqmBADwLa$)&`Z->v`iy7j(p z?*3By%--zDlrpt=XbpE-Uz+v&@P9iID*WZ~`wM^B^TJ>J+t^U{^M79U>``y{iD&yx zPwBqAeR!;fUXYiUH#Bef@KLx=c_X@pcZD~PZ~sjD5Cg}xXB()LUecXq{QB(zlY)G6 zd-dgQy76jA_X0YNV>H<5>+$B@p|T+xBd4}SNUixA!(}n~~BT>dFro2#hJW2wyrZ6hh2{l}yG`}ZCX zm0du(_Z-jV?YEvdL|vX5p{`u-rzCfM!J|VqD<@lz7d)z8e*Ab|TQ+h+KNR(`3wij?a*u74S7IN|OX8wb|%uQRNj2N?{xX`3&~sA z@nQU*b$lrQBggajKLcq?ij^vHx0DWfJh!H}>?&dvANS)=q-6R|7ajK|%|4Xl_Q*V=N%v3mS;*Nn-I?l`S93?wxQ#Pw~yFV zuwJFrdn{g#$By-#e*f4AQhM~*aQ+`Tme2opj@!iAsrMr|J5enI<{U4nV-6AT^_R$O`G{a$JA zvB;?>3Ovc@Yl`+%v!FeaKzsIRTcq#w)cxtd%Z540TK>=kgivboVv@C%*d%d-vH7#6;9B3l=$htrsy5!L|3n^p%2S@)Vspd z8nzGeyYkv|V>Rufi!RE^@rG_5);{FNqq-xA{U0b?X z?xvg{(I2&W@SS>pNSn%}_x(uk8%r-xd3)KLBxy){9F&@gk?jX1AC(rxfOx_%FU6Psagd-By_+-mFkt_NIGEL+zx4U)keu zJ^4Q0|N9!zZGYb@%mHqDU$-!BeP1={@%Pi!q`daLSbYeEE(nE&Uv!b)ctMx`OJ3{y z!;D|~UGsj(_?3(1_w_4H=2z;K5?dQ;-hT?kZ&t>>bK~wD%Kt$#28^7_pRBxTyfvmQ zwbo=e~v{q>weaYcF$)B^J(y-%(L4yFI@-L%~FRynzwLhWa{%X28B_PmWhI}GY8#?h`q<71*kXo+nA@rkb7ze87IO6cU{T}cCJ@fY8Q%S!5p33&M_w;rS zy_at69g4l1?A*KyAiK9+qOTtFVb5! zQ@K~$omc9O?>qg+`!e52s#bfcX|<=!(c9uM@3!LdVe9ptF8o1D>CeuT9Li_35^B?J zp;hl`q_NDDLG+}dC6v=9^R6SO&StB$vKb59Q(91yJ%JGcU&zgHY@8ge>!zlEe`pQ; z|9hb_)#VvR;xsVHF99nE>`g=MIZnCddbyj2w1>L%UsA@J@(Gz1X!Lv2sizN8KK{B} z;HFmaEHB&3!Ge*?DKHnH{SW2jmkY5Z5WXQO9Qwm99lRh}3N*|JQOWop^!b~y$GL8u zjABVnwxP{Qe6j&1yH|)SJL5wVykii+@}%rl!!V0G2PyO*t6-n6oj z-K|l^Rnxsy)y;D&S4Cx1SIudzt~0cG33B0IxynQ-t&U2-g6vf`HexMzD7UPbZi$PC zKHcL~Hdk~8lUFBW7yrre0sv6ti-OHQ3 zidbGN0>pR~NhMQ}oEYqSD;k>WRxN6nFRR#cT|Zk{TidYQW??R7vgxauE1URV-B`(c zXlR;Fe&Z9_v24Ujlf+TJ%Xnd5v*op@VY+9j)$&)jEU#{q{atT#US(bN^rq^{RSosi z?_O2iG=~&T_hj#VmgfbY<2+}1axsWp$a4kHwLG(UzQMDS=U$$Nc|K1K{u0k7{0Dem z<(Uay$@60#+4p1@lYI@;;Nfpqt_s&TG>2DE<*K}JJk zjhQYASE?*1Jlso6YRI0=>oHFFm%ugGAt(Ho;4}rs2_HT>Y6BBN_?6%^X~qdJ0{3lN z!mmyWzXqJY7=HwWY1|n8RdAWs%V(R)xv=_McURXhuTGlc@v=vG^A?uzb;g<)KIZ|> z51I7-Clak@&u{uFtLo+t@m~+3I{Ih$|DA&_{{jC_{I`&A)%i~R z?=enQJ(vIg;@9`E7ypIu=o@$*|7Y;4{)^{o{Q5p5|4aClKGl28UHmKbzk#mu6>S`} ze}i_|p@pFh;p6yMhgJyf5@_!^G<`>sF`KZtJS%y=%k!5!&+r`L>Ed~SJc>{0_#9=V za$0B0${dyry^27UlgdWl{0IDwoM3V}Ps>ow%;lJGeJHltN6Gst(tHvAYtR?h<5!t{ z5o4=g&i@}j>X-BX#IH0e4Mn6oxvZ35h57mQ^CkLH(xh~qlmOf`oBl<>$mFS!;^`%k zX)K)aR!^Q1MZD$H@q8Gt2Iyb< z`uYkA@`sx;4#T+Qy}mxJeF@!gx=;5Y>!+siw7lQf_YxH}^!Ye_KJ=pFeSOD7|3aKz z1AY66zP@(Jap=zD)*&&mH(l>XLmZ|kCH!`5*L zHsUvUNMGG6z%t-Q;1_}GfDzz>mVPg=6ufD;x37SDv@yr)Y=Krg+}j}>*CD*d^4$vG z66)yLJg;*Jv<2`97oYHXgrBAEZbHr-;5QR4T;amYc*^;`>A=ar65tKM5yaEH$I_u* z=NM?ih$md}guhFDXRS-!oB7^8)%UWH*ZDTI*Ymv{!o?^2HJ;hnT4}}%HLF=%C(4e9Hx!m zGQ{gFhBkq82v>TAUuOA7TmCZ_di%B!z6t&z(0VWQb_f^0@MDDU0e_P4Z1AIm3s<=C zBZMCWKR~z|sV>5WD_r-1@tL1NpeFpZ@^as zZ5({U#V1_%07-6v%>%JrL9e{5!@A;8@uk%G{oNv8DxcG$cC0y+Td%`<)=JX!I{q{omP9DjT4OR7~ z9)8u6Umy7Xgglk@#cA;|(_%gzU>-U7;LHHSd?|y!-3H&y~g)3b6tvp}h zcjj4GIMmx(XzQ8oP`V7d>e*(7p`#Oj}yL>{OlR-b#4dWM7VH;3xAC8F}%0C zsBcezZy;Q_!iBHqQN3>jD*f;oxP*9WM-LKjDYV7J^V?P73wV_NS@0dCyw<>125km> z!X;mL3C~UNjf3w1^mh0Pp;7;L2p6C50>bxDu4?Bl0naB~xWa|!@hE-2qRjQXr+|9@ zjIqu8-#WtU)VbORFNnW?;Rgsmtlyy@(fQx|2{$-$h41D03Uc;X*an;fPJP&?G3O)1 zdl1@M;t5xJgtu6}diXRBeFDBFXf^N&7oYGd%eNRljYD66?+$2-;1e!B;Wt~p8!aE- zOy?|U(;YtH*V^!I!l!^wbi##SM!3en9}+$R{8GY&>vx2Yu;Ig~Pou$yIpM;8H6)s! zO9;;f=lhT4NBF5B(f*Y0+>{UPN@p*$qwx9VBfM*fw>96sznYNey$Ma<$*aIJy*CSA zuXYsQPs)ct075L<4GyXD~12^X$#;Zu1eZz53g z#=@_D>1FsYgGPTJ>!*Z|u>9GU|5S*xr{RAS{trXU%Z506+R7LHK9A(S1=Q~xviJ)Y zf5zfFk#m%IjDI?xgtiqq!j(?pkMXE{9wUvPq@D0 zM&vF9pG&y^T?;SQgPd8wQs7kh)gNtue>$`&@caFf@JW_04Bsp8ZG*26+Bo=xE4{)` z=6G9=G5!?(7~}90=)J1fM}W%5+ZMiNA>&?e2K1&J&fX?J*%#4IL95U4b_kao;Wa#} z=gWYSv&6!=z*6uci%+ol7z^_(Jc+I#zITBp9YE#(HA_Ee;nSAB)8g$w@wZw0ejBd4 z-zBfc!Ue#Y;H*# z{vL$)X3^gf{x0DkQoh}U3s*S_XP>lr@6Ql^3H+Q57JKi)nOEJ{1^*Gk&%pmS;ldSP z_?v{k1^y1;aF}1L2c6|3GVB6@LZ)ilC`}jRWdEU1DK@ zgU6ixom(>{rg1t9)q?HKH<0y;SccK1m9Yq%8xo|%CGPe+A(Oe;P<~{;WrYlalmTi zk$&YhHZBleLb%r8HuApsj-$D!L0vXzeNULP$M}XG@#XA*3zbfVE1iPKHc;smuJj5jy@G`nhAmXOMOV57m2N?$TTlrVRQd&#P(gr!?Lfjp zZNTZ|>miG`TD-;LjTW!5_)?26w)lLDms>ny@o5$>ws?`n!xkTF@dAtISsY-}qjMR| z`>}A0g#|#=l8|gBg0w3pANuBz5jp}S@1ZWB^7|H$;Y{cdkiXC?{8PBTe}x~k^aGZ@ z-_q4C@E6)+>ANj`m!)sF^lg^D#nLxhdb_2oT~IpJF6eicSh(1R&jp%#Y~c(GrvVjD zwkN?tpz;^CaGZr>EgWN^+6(dJTbO6zNy=5fe*&m{9|Njfx-9)IOMk=CU$OL;Ed8LR z@3r(jmcHB4w*mR7&=#P6XERX0({AY-Expas*ID{Qmi~aHw_5sIOK-9CW=n6h^jb@= zvGgiSUux+~EPb)1FS7LcmOj_g%Pqas(j%5W!_uc&dWoeMTY3Rd@1+Q+_eY)$3|TtB z`+_NoD9i)D4qV}GyOE4POB3wd^S=Bk^gZxn5>7i<0{-XVzWwS7aLRe>G!mfjao~Rf z?%PL(gFgU12_048A@IAweZBS?-#xguKMZT+qje88V-f=7xg&Hs~;kj zE?atr!QY@DbHUNi4StlDkOz)k$lwo9Rv~cgdyFA8!+*LQbHJkXWjpYyw-t1SN3(p643TRM7?cenMUOG%G3{ODcYFe?)s&HGEs zgFfdq+ccp2dGGQ_{ygCCS$@5jQkyotvt5?1_bI!U(x!L)3rkl$_&+vnsw2{;CG#L< z@n5Zc>?7Vz%cFW$Nd+81Jk5=7uzt;nzf3+29si$NzdFa;tzUB?|HAK!NAu-%eC+be zPCvu?WtYF)^1p)rI?J#5haSpT{F;MM8!Nx&A=>eeB+aVxI)8N}@iph3L)zq*J^u&1 zzst#w>=aj1*78foe%;bFp80>_7hPi@vS9qukN?uj)SQ2@mD!B{IC4h9sJ#FM#2bkY zro9DQ$;;&@N!?Yqo0A9`)dVga)&BQ{rG(OlEi z@NFw`_S~5Z7a}rtk7;zvWqfO9N>D5f1KWQWpJ0zljz!O$g*t!f2bul-rpiW6du=c= zv>c?O;v4nfURhsNvGA_Bcj0fUzLVt*Om-&*EQpcKb)|k*nb2QZd1rmYDlKe?{!GBZ zPk~(Jvn%YZ`>NzgXuI*Xuwwp#Tjp2HowIO}4jdlH7DX=>bdMP;gt{k)$+MvcFg zj1iOH#sHY(<@)s?t)lUtutlCR(%?S$fCV*)g)nd7P5yEt+dx+POUfGR zzjin4$+V0s_A&7tF1ls*EpscPC0?=U59aedr7jdnjS%|`{dbi%(%hM|ZknqvKKe^) zE0fouSn-46S#VR?O$%;PLl7h}y1Scw*=%?oT)&XK#Hga8f+bSiHH*rLOrBvQ6QZ0+Ss+~RfHZYo$nQ@k?R31k_ES3@HRn*q5uDf=5T~+PM zdhKR+oAw3Ot5`H>Sq5^)RYk?@ve^ywQCey1HRIjLR($XR1J6XQ-?#iYr zo18jlw|u5r9Zp=&b-USKKcKcUoUr0A8ZqN91@I5-hw5zSIe_073~TBaI)EQYs&fN~ z5nm%Y0A?0^&P!a}8I3fsg7OcpHLpQSI0x{H2@5(0^JCGXUNt>%S><2^IV&&+klvI$ z1}t*52-YW%lff=)kg~xpG-;_2lalKc|IvGkl$r!j?*5K~;*ZRLW$1zh*Rx zSk{?V)~@8xi`B&`oT-$_7$pXK@A;JLr$vvO2xAMHve_qnwS$=}}N_#P7sl4bsL_yHxbeR46I^d$BBJsYiGw`FLd((*Ix_~l8 zl~~m*p5!u>eXH&22t13S6&a|Y-hlz6LtSLh*#qm4q2iQIuXK!y z>$gsMWIlVK4H^7-hmz6(Ddze+d%(Xx=5I5~Fzv$1y2?ANSF-XvxlA{Z2)*0aQf0*Q zas}a0L|D}f<_bz(tTT1`1jJ;-M zm%?+nNBhMN^8tKuu8jgLq1Zdh&x=***d`c`-I1huJz56)l}GPIkDTOa&LG*vm)1t}?S`)ap-rw^0;F!#sg1!DR#(Pc z+)4b~SgJi27-23>IIcrD^JwO*_Com7&XVug+2+D=9h3M+9`~I9zDD?^Kz?I~a9oFQ z^0;p!u!ZokK$?Ob!f_qKk*_*u=IG$f7me@U%+XO#%^aP=RWB8;vY?*gO|`L8j}@%? z98!K2Z!wT+Z{`pwx=;k1_#tfChHn~B^b$)iwsi7g;sJ~;|8baPXO;UK>sMWPlxGBF z)x-VPulhI6`t`oPieGlkT425Pw*vowu#x0M?St-{8cBxL-ux?J0ON+@@%@6n|GN%d z^GQD4Z?6>jtV92T;}0+w#q4J>buvYZ46N;mDsBdrxauwKK6NbOE4~RjeR{UIIIGDA zuqLO?`R1eJpMY{GpB=zuT4q`Vqp%vpQ3oCVWL?l`h67Rij7(R9OU(^iV^%hsjc2h& zDmr)$U?r((8n56p&jvfLy#9Lkeki8^5{H$6=asSc$@9X|`nunIt*WVsZa+Lrc?9`( z&7=NHZXn~z-SlyaZ~A<`DYXH#46Ook6%}_bU+#?ilgB`cPrIgdj7Elul=QE^ai!Mi z6cI=3A(f8k+*G2F{>GKZh^Qi(Yh{e1;kMtonkVC&aa7=WWhaoa1J3!#aGlcRJ3k%i z&MVtY+og8-tWAgJsc6U5ekP|Q?RjN;kf9`uq49Np+fRd_O-I_X>3(D|72}OVhU;8; zzKnEZ)5FL(O5_ro4$Y5EaE0M_$~16ns(L#IKGt0)xWsfUcaKd&X5u(Im%>{_?COj% zOv7NxBWQfP1R1Iy`;npFu44aGYW>JOzSVc4I0ur_0V(GC8{bx18GoHohRI9X@$E8X zsD8YVD#NK`na|eJ`b(9^E4DoR45+U9uD`Rj8j&#<=0jFSEoG`C(TvpiGOoZAO_W-v z=>2oT_rn_o>Rsr2=>k{XYN7GcTsJae<8JB6dXzTJUBa5yy+xpXuL(RE&+#Z5Tb9GF z@a~>S@6*~{&!~LKl;|lk+}N}*dZN}4bD~ygV{Y43taJ~YYiE1Xy*IxbIJ(Yj3^y_(y<9GE4-)>IJdLqMVSy{22=UE=7 zWfA8Q=X|V(dKOWz&6I#nL5cJ}HhzrJHnazy(-nHM%Cu*Gb&ogRE6RI5YkXc=+q0SW z-!^9g==6&m%QeQ~ z8bPX_85NqKRB>v?k2p(1=T~gV;fyKI;roy?tyEs8x^+In$!?Xz31~VY;TYHe&Pd44 z&NZi2#LlQVWMsW+PIk&OJN{ql_MV?lMSPKW5b2#XN~u!mo6~A~!%28S43D0Wu>Cpq z?cd)@Tz4=38~Rurw^1K(l2e!OAM{%<jW-{b$WP19TWb*G=wbOisO;MaHu;O&8S zAI}HSg#*03;E(WhJ2d4%;p)dm@qC_VGS372p5iEdhlr!}pXHI8s{q_upxukwG|_BE zT|U`t4h8eKp(;T8P$N;$G?87W0cAEJp*}2XnrQd8yDujGUf2&GB*Vsu^N~i?w`8X_ zT`todXtf{Oy_*+t85+DQ*J(U0|F^GCI$|g%O5cV2FnahF)=;Z_3%L7h8??==u@;W& z5Z-3P!-Q`HU+07iZzWvsY!cxQfOFsD4&jO~ygA$3x)&&1>l5qoGlr^L2K+2=iG_tg zmX6hp1EROrY5ldr3oOh7UJfpu@-slK-QLabJj3tyLOa6RXW{xC;axo9KWzD5gkN@K z)^K;e4DAK@tzEf8IC2cX?p2q3^zD7yB`=$DfrgEFhrv}Y;L>x&_aG2^W!)0^)&CD+ zPv|mel=TkbN{{eGgl|LMbmXl7pGUZGg$uu#=Q8As295^~14@22@wUMC81aTcJIiod zxZ(*v!SbQql#TGk{5!^@^6dhu{GI};Tz6Ug2@5v^^?U2EkLZ1~7oc+kv)W8N8@r95#zP8MJE3rW`iyhb zEO`8!X$b`NeejwFyr%gG{F3{Yg@-LX1mw3uuUNPr$apKX*TOv(?zV6hwk zpzK5sS^5K(-fHR1KwfvK5vX{zK*g)E^eRhVYUxWXU3EhIi!6PK)LAuN;`5B!1x)E%~DbK$DQ9Qo?4)}flT8I9> zknPj|v%~Xu4v+Hb^ZdEPKgOYJ?WE7c5H#lhYsbIK@msr=zhEq8+lv~+;-<6oYvWRF zI?m`OW+HT#ilxNx4SIzYF-xMmENmeB{`!@GK07Ik={elo265TUB$yr3rY$baS{+k4 z6BmFCU~L~(g5`CMu|*}0k?|8)#$wmN*wTxwWlYJ&wH59F>SJBvV$1-ptuy7vgBF^k zGQ~z~Q8Q>NgOh`FENMph>DZg%cGY0DAzj31Qd~VH*btk%gkTD0qXDiL7>2`+d!4=b zFf2E@`k1f}qlM^&uZH5k0z3n+r_pD<&%aI{S- zr2PtV+h~tpB5VuLx97?hA~z6wuHx#UN%U&y^!~FV4#J+Rxavo>A6znmTt&sQRjZtU znoj>DT8GgI00N?hg`RJf^0urEf=qxG8*v)8&E=Nw?xp9u|G0>hn4H=B5Oy?hs z5&iF`$;wE(PJsQl8asIG<2UID)7L3JU7wSV%yz>i$WY#8-%jWHvm4%SWn7U_MrOO= z9X2mlrpj>glG$#kJ?;E?#kM^B{0#9u!2axpwFuA{O=l#iEQ={q#UF^>a4Eb>tm0{m z(G0G+(_K`K0_v`7Hx!Q^$a-I9tp*^_H6q8YpFUH1yWwW$;%jI9)0xc|VcW@$^iGM$ zinXTHoG;3m>=(EFbNMCa%*sz0J6P4BvF3E`*L%E4krUJJi}b!zjE$>Au_C?e%z2fH ztCLB+N3SX?;Pl=D*tA}r>=~PutVdbvMSU9TQp2CkiLrS#S>p@V>wM~+J=x>4IWanm zGeNh(6EQqFh9?Ie4|;n~Xnc<4*#J-2@PrIcuH|{KXUO=FQV1%~HB%QL?xfBXfO=Vo}e7@j=CGu-mr z*fU~$p5>VaPpjb>YIsIko=H6gTFP;rX=Xd9C}>@jBsK@9PzKCKkdIT3b54CcIR(;1{}eqV{v$I^}zRw@&%q+pV*> zpYGOK+)s7uEbiUiI}Jj+p<` z&Hobf|623E$o!9$`K&xt0VR~jp9^wjZicN-tS^d#)4G&$)`TOCf{GLm*>6lWA(gl>K@c8O2X zzL?&_ZwdwlqX%;OgQkVCiD(H?zjUJ-(Ilt#OfHkntP$Io`smOXIGGLJ1Dwks9M_>X zbwBQdkS-z#w8!8Vj_cUMzYRR%$JVlMF?9Bg8e3#5 ze8O=Z5A$y=kNEC_&x6kQ*Vzbd1$@GB9m1Cpz6czfQD;5)ZG;QQbqJr&gFUKl5_~n# zIp4+DB8%V?jx)B%Lc+Iz*AiX~aU9{o6)s$D2Se<9`5BAlBTr){b3O#-qkQ6P4mLjw zWQ>(heA()ZEt8>_v1Ky#YHXRKfymN2N{+KK<2CaN@QWk|DPTIUP67IyB$B@OpJcO@jvSDTAmXsy=DakIYZK%xrBYt8~*PAk?reB6x4Gpy!CHOz3>o}9Igp4Zs!`U?7YdL6*xD;<0csD&M)m)r2Ql@0^Wf4tI>@ zqwX3@u%8XsJmgvX&=k8NWI*!wcQ)>1j`A4&NvVy2-WyU;+^`R(OUdT*BOM~RX|$bRsp&G*7+&ETF^E+2gwL>*f27#GP6ytzZ{2&>6glDwg8{ z@{)ER%SmK35|{HGO zEe}5rZnf>tUiSbpG(J3HW$4UY#UF^ht{h$^77^0pyd~h$svjcq0f>OuIzP$OqxT0} z#&v#+VX*HN&bagU*OZUC$nLLs>eEkqhWsz5Af6{n8`XWqG4m{J+{-WvPR3wKZbfWBp&o-^!!9 zr$3eShML!IbedHw|`LEl9o~J(HGVB}AK--O;Cmh!yd>7$wfR7_w`pkC1 zh2uJeZ{v}ib|8A4(NEQeV7usShPDEJ;kXXr%aC`N_}BwFo51fNTsW>n_-#DWbEg1h zCn|(r;{eXNitUjSj_a7jKYn|k`bF#*u{~146@DrIc!&Gcf0q+ZzSUmr5RU5*j(oF* zMEdDy*hM3b(NCqnsx6}FFl%iTu6GR%i+S%t_5MvbvW;plD7p`6v+|dKOU_~-{anJH zDZ)cDEdMkh$uoPVL@%~N!_EwTQv* zRccj!2lUiN8hef9T{l=gbvH6-!sOI_80Y9zfomXYh#))hN6}L?K2Qfa&5r-Mt76c4 z>Jen9vn#bSbT3Alyrk7rj}n1(#$LH9mE)*tF=xvot)417X(QZKHXUz}4*n9HQ>KA> zs`@;-&=mbJC>`naRQ2U5k1m^zFalG{BeR|=y-abWm!)(4>8bz8%J`RzGBWF_4GSTdFb2)yfMd^E9UysQ#TT^1n!eohVFM!e8ychzK|>ML=zQF>{S+* zJ}J6>TVuvraOtVsvkq~#Odg?PDtDd^T>ZxP3c4W|c>IIITT4?pu zD`R@#YqRzuu}og8AT> z-YOgy(_6d13kjFrvK_roxWa{RL;0>kLj(#CGS6q-ul;+Z=s{NYOX?ht6%Pa0Uo5cvL+*@w|>X^rMGGf>Fce30WQ5& z-}+(e*EjC#t*Y-|hwkgGYph>wh0#^fTh-TH#3Q{`eP=FV(O1MCKga)h$FFdohq@B; z|H|=y&GEm9T%Z3c$1j_cPnYiP`}a8hcO0ILj{iBwf3A9K+Eyr8P3(s;u6XKflC;c0 z%4~nkanV+%O&cLO&Cc9m!t8Qfq7oax^&efeO;^HcHQcljJ~2g?@9$jJ>tA<6iF2Nx zpX{VX261)wob}yC+HZKt?nMvDE{pT2vamGRFRWn|WO??;B}_B*LEoV;Y#ch}kSIA+Vk&x2cS`_p$d zu9Cj%>&)DhIbeO4`&AS4UFoUPce$t5JBHkI)pxn))qk&kmJIau-O|{+?9)m5Zs;S; z%PzC}?ij1@PD+`Vy(;azY}U@`tn8D_%1*G_ZedK@&Ds>7lilph$v$T1WH*>O*)}^T zyKYc(vdzw%Y<?ukIjFI_gu*VRjJ* zc}ADzy(j3hI|-LA%3A2or-}1~qnirfYUQ*8QESW`t=f|@j;<>l7t?j6i!O6?UEvB( zr|W7=5Q2XaOksXsIIcrDc`$RnyqB1+t3FfVzOK6zyp(X2Gi}-q;R+Xyj%emirMr!$ zs}+s+{#!9e>%aeJDPQsto1>K;CtcSs_df$4L7p{7%X_B3$TH)?n+!cVGSWP%=4++v zN_Up7EBV{NrR(ZjSKX0c{kX5|s=m*MBwbf^yT$tF;{Sk0bF}K`Bu~1o`b~abf5x>q ze(G3^u5h2H(xLy-@s~UPzeBFiU+DNZJ3Kcyba%b-&mEpWb^QAr|3}qzlUt!=wK0uW z5b(3pwuErJ`XSr*J2fOZA za}3Ih=3=QDp5{^0CoI`YI$VVZ#8yM9O;DVTz~ql&Zm=%;~8aS)^8s{ zhU#{Astl)|X4Y@pZF!ur<>BXNF#7FgWJtd~Yh@HurizblTI0)0H=nx{UL_V0W}pLgeIg0whz9-XClk*Bv*)VBag8ap&u|@pZ?~CF!>xZQb!*R=*9O!+h>tWpVv> zqSbFFUCg|2ZcFKROF1sCrl=4wUc)`NRmX`MuJ=5;kEiy_*Ksvxqd6Ma zEz(O%a{A6^z<2ICuHQEfUeT@LcUyVdY&tXdx2d|W+PNU7HdtBRMY!4^v1#q1{6V^| z)shWuPZ%4x~}%+N~b-FJif2GE}+&UzX=rmH6XuN z_ae~Ob5;~DIFWc8QK!Nqi4;kcNttA4$laFsLd$nV^GmP%^$ITee1ritNQ*8=>EL!{noEGBSe^V zUG;fd`z&2oedwnN8dDb{|?c?|9t`2<4p?}%&|I~>)-=S-~?8`aj z@N9SduQ~nzr89OGoz)wi)8Wwg?1i71M*dc2T!9<_bD}PpF+wKQ*Kcg2DyyB8?N9#= zjFhajpI3tGu05xFGBUl(el_8sSMy1#!@9q1koxfTY4l;Y3dSdV&s87RJg@XwK@E@f z3`QTG#5eEj!{_IFqhsy^bea^WxzC;Ak#qEn{^xt^iSWBJ->db_=jVG>1sHSNKD0|8 zSsK@$K74+@H~KMUn(sYHIiH{J^>^X^`sRD*Qpe}o2GFnWngdF4&@}J!(RAU#>%r1< z*7B^gX-w3E-F`Mz2evw0N>+RwcpEYs?f3rQtUpKxmK@E0B|BFKR@o%Gf#|^J=X=l3 z_hLJi8BqVsnN%9D;X2NBzPG=%&658Y{D42-d)WFlAo6u!)pyy+{Q2HB)~~kW1dl)8 z>#uEAzxf|=ZL^e=gjOh7cXU;t0LJvXZvu0FdT$VOTy)af=6=&0mFAqH6ksVhzqUEU zq;GNw4@lQ_-{EhVo*T4}H)Z2-Owm18J@+Nr5b3Fc=c4Dzw&&})=lAhOI~D1u6sLEt z`*<6O`%&h7-{75Sy!D%~k5_%$`F*?;0`37S1+V7(K3-EAtU;zcH1GRy@8dm#+;i1) ze>?Z_y5~)$?&E#-%&+gfsfD~>&EdFit{TTAr#T+YX`Z{TYx>4PE4wxPW-CvdO=Dcw zP3ddB`$#i$o#s*U?fj;^3C`DbcObKwd`a|v>kra(C1+AVnYg;H$|l(jMAtpPk2kLC zT6;lkZL|8x^ZR(?Yn%5{2Q}Z@7OjgN>Gtv7LbyNQYt|pzwawpA3i}}-(@+8aRa$`tChHlPcz_c zW{`QmVh&=Rv*H&KsSNV25(1(+ORXoaGfj9%1FES^(;DnF_Gu8CP(ph zvFJ0C*WbR?Lolmf4_g_#`1R4?pf$db zEAT`UrLQr%Z$S7A7F$GsdKVh!wt{QV*qoSGv3#UG z8Mu^_feYHQxW!(#&cE8D^|@0x+4m*0zcg?C@9Fj@WUe+cb@NtsICm4b*|%l4=lrPe z^d5&#yH@9aJ?C@!b=|)e+GOs%=LF%cJ-Xrk@gCg-wYf)kLvj0;x#xZ(yHwNNbDtAC zIXF8v&(l5k!^}PRq1bKrtBu?yBe&7)V2$2+e^-z9{4_q6jg(;ea%WP$1E}K~P zIV4RmWfVO>d7Ry=JJ#&gy~OU-9i3sXZdR-mvb^Z|$sd|~r9$TX#k1xr`1&Y9e~D$lI;>{z+JBFXl2?iY`H&mW^a z@8@Bi{DUf6-CTzMe)*GVd~sQxI?{%!gdk%B(RkE=RTIq?2vYCo!G_g2tslUbCEMrB-*%&uavIlwI=lKQC zrx^rY&T}KrS9uojEaPe7(LLbtA*mOc7Ac-y;zcG;6^u-qK6#3de9j<#zx3zC(^%&k z`Yy?n|91Qe*Pg81&~AjLzUlAqe--~1L6k1h$MfxJyd|gcPK)&m-{$y*%MHXfl>f`V zKG{S<-(yn%ab(+?#xv=|zP_Wt(6{4swSi}$=ZpW&I9(li_-tQaq3GX?(py5_)-9wP z*P;9An())@)~x_)@4&S{y79Uzf&6A&*wV)W*}GGx!@6~b_=h>%nMU5Yi>)&o+Q}U5 zOpE5VL-+|~i~lH)e!uQ*pya;}RQy+g1;8!H(Rk)E?$**hd7F_VT>O&Zs%5@A-`PQ9SCjW$~d|w5s zd^NWxy6(YJx}W0ix-rOIOnJ!Wvx~d#giEgQ?L5k-_GO75d(gfD!dJup7_^7s7cPF` zIv3QG2Tui2? zf87}9%5NS}`FRtX@~QRp%I7OU(GLQZ{=Gn@YZp-I;!JUqu1K!e`4BYr1H{rLd^O=7 z=~zv=9|UhAT)5IDoICQ2+!~0ZAn0Wqs6h4V?>5==9I|ICkaN)QP z;e|YUkMOCD3lVOh=)%Jmj{49Yvj5B1X)p-@!{FcTYd~XK-6;R={HwM3z0@t1&+I53V zxBe77z74ntKJD{S8rm&g>Fbl9M`^#+(!;>xmaaTA95!+$Aw%D-WU6fb(ekL=?&SAI zkWck{k7tq{F9c zKb-G>+VM9y{vIdp?>qGC9KUDHtc4Y`XD+(wE4M88g9_K&RZ&>sj4o1nqkDX?x|(f4 zgNd1P$3gnY6(8}q#5u9SV$y8@0qd9CyW&2EdjfRpfOD5X?Ds#`8|JS0rdxJJ@fUVg zSYu9S9DBRh4{vm=e7kpbW|5gkx`T`!Qy$_k?L9#Hl z$>(xk-(<(Gtm^lzyH_?<&ugfkx3V^>4_K>mvOSq*$J4mV3rD|ujfH~Tn-GiP6QqeU zkAE(~KZuV|D;SH5#DAIdv4$$0r7U_*-8ygPyo<(}+8M-WEKRe^K^__mh*aTni={tRx z=QVYtxY#%9eeLd5&EaL$;rfR9YwB0lhAB6!8Bs3Q%8~Ud5dXUquDxRVma1EpS2t=R zNp_2Qm37tAo2n~UHPlbPdsTJQoca|F)6sW)K^EQyWav71$arjra9oG*62kR8LhoN zp9EyQxkEUvL--h;JkmiLmFGHu-lI8R4H!~=2!X>RI^HNQNPa?$$vyv`Y*u_u*E|E}Pw8tY^&&o10eF-#J?i z^n&UY)lJnH)U3?9Rd+6|uCF57+UGi`duFdMnG%~1E&u3~BmcBrM6 zQO4SqTE?+0b!dlaQ@NJ0NUdZ3pYPi5K4+g>f;0c;nOV=-=eyo_z3W}qz4qGcwx@iy zxw2_`!_3N7&b?~xa~@QMtV*QvP@g@O*+S(Rj+~GpcbDpo%$Yp5-bPOT^^Dj<?x1vK;cZum(j}F!66gtxO1?HQMyG+Ms(?JqL z@#wuTP=yYK+m4QOrmwz0wdwduuR40~3oJs1s@J{AIznmbeNMN@@?*8-N01)aQPbC) zZY#p$k?u4dS~np7kTrpl3$gf-@^7k3j6Q&@_^J~cLpcGhbHS<@6x&J#QPRq|WMtQ+ zs?3;_Lm;I&V&$6X*xQ_4&pRiWfxNbI?Dh0Ym`5x0=N{K8 znAw#%BJya@JKqh>Qtq%>%583za;wc!Zs}!~GBl%PUwK{Q=3^snmU1=ovAaq9gIvLR zOZDzq(K5jcELGJl3!7^f@Ti(u+v1qz^nHw59q?u^n$Q|zOQg1?^b2j3brU>)CWyOj zk=In+yr{9cer|M9DUtC-dRwzyCv8HKaL6rWC7iP6#wAO^8)_S>W-oG2R0Tg%kKg7f zgJmEJyQRDl`PRmTjYN&*K~0SfRq$d_^1A^z`Oo$66W@25(%425xU8|E+N-H-sqx%- z^?oA#Y;pZYvS>lu9VIUJe8$4D>OxDIpKnj>L6wSTshY77g?- zwvdvfio6SK;whMaa$Y7B1(Qz`iWH^dafOPhBbcJ{7W&ebfD4L-T;}`iyB)tc#-0_fk*%Oi-QkqKh7>qk1-I3~?$A ztDe6yv#}pA`;FND-Rz99dvBRt>p9;x`vcfB^iaWk3%kbZWHdH6%Jo->+cN}U+I)C<$=aufG1MUMwBNMS^53^ zB1G>ndYjQ3z#%jfUB>S;Ty5@mfwUjFt;TOMtTWX7oWiRzoNsum;XK1~!!pAehSLm7 z42umX8ftDs`o|j<8jdy`Wmo{x1B&Du4mTWTIMguDFxN20@HF|Va8x&xPlt>?X!ILK z?>G8YqxTxU+vr_J?=X6s(OZn(Z1j4gyNvEMdbQCjjBYo2iP5b_*BPyjpyE5<=v$30 zH=26p+@~2`V)R6#i;ONbdbH66M&}zn%;=#;=Ng@3^h%Iw8d1E2ikGko?$X($GBcSvsJi4&CqE&AJS3iZ~3zZ+5r+Zrj_svEWke*FG>22(S zrcQ4P?yCo&_v5H}wGY2Mbrfk%O?sGD^adfPwvqeZ+0{N$eSALlnP%UOeF**} zulDitW>-6@=au+s7d1C6yV^wEN3yGJ{IuEC7M_hg7(cp(u(dx!?>L&b8%%2T&h#~8 z&L7b3=IowCzwG7kHxeJ&%dqSGkMncdy?pF1O9uN1^uH(>?7Ol5TrvaOJ+)hZ#?H@~ zQ~U?^>j*cn|2o8P5ApT<3}l)^{L4aiJ^url{vm#B&aQ0E?6Qg()904c6Y{&aacSh8{N}RKxgSVxVjN~nnp`@gf;jr|NdD4!DyI)T*_SXHl_CS? zlun(?ci4iyV00EU8hl)edlO8`$|T{WG$%uUJ~z~aKBxkNoK+&HTZoaW1n9sh~K zE3YmbS6Gyve^uc)IR3cm*uuiA$B)m?zw)XgTx4{<{*=Z#Et3q5uqMt6(j<8`v<+Uq z-&P!?%}8Y?(%!B>PN-23T^h@fIg|0#a{S7_)bGY~g*<+M@m2ZPbL$P-%`{OA#^Bs5 zZ>ll4CUg*ePish|VbhM3~6xCl?kgOw=mfpwlx=lx& zCA@rn@2$4zCSKG=L{l}}l& z=hogpM#u3aqf7Nj@f*aI&dkH3WD`yLalEzL`Z2b4f;q!ujOINyR%3a^CogiV#fwjF zx)Qn{>$*F?R5EGWvXWfJ^*&Pb;hM;k+NE)Anq3-uqq{WrxG_6_m&Oan`+Xy;a}+Do zcQRg=`wzt@#}!7d(pcb<60atcakzf0Eq~^C=7{Xhtgh^JIge&OuALd$jj;j0H=d51 z#oB!Qiu2fUZ}flsO#3y~9M4)WeAw-^c<{LPiL7KKFx{?=&`4k;wr4{+>s(l$cX}4N zJsVZ-f4&(X5@dUbI6vVtOP-_|HEcSp4Uo4je?fJY;vD)6cEb&tt#CfSQa)^SVB? zCU4~V-}KgKwf>1?kdfit_qbQHa&lx}WCVUm z(d);N^$qGbBM>TV_97pQzKm& zW3wLp%H)6fd4H!VZ$$Pp-lOM#GlSCJYVr7|pXDLH`I!DU9UIL5lk7qmLdmW>c12h5 z$sz8Hf2D+-KIdh8KY!}kf7~4@`18?w3;ulk#fL1;u5{dNB$r&)%8@m3(U4sv1AIv%^o8nh@EW_Cq>LM3v)iLGYe7A?=LvEz_mSfM- z2+raP#)-j)+o=y)|JRSZG|SzkjPcafH7<0gF?b6#PC9vMX+v9mbu*hX8}86t`rOva z*6Il~c04azCODZ1US(C4-z~=4++4X-f&qiJhPuZZY46KiT6g_zu2e>CicDw>v1wAvrNzm3uobQ+P!#Xf%qYo_&Hg4w7&-5L|qocTnM zce8qpoe8yuN2oQA!uQZYb5{QvYn6|{V~y_i*WvwywaTKUPqfxn({9%925H;szYEI$ z4#THF+R*wHM&Dz!#>#l#t6u=pF4oThnZ~FeLwNhqzn<{M!()u`Y0(N#^vAiRFB`di z@OLAZ3y(BEEn0G--y^NOi`E|kCI3sUea5{T`GfHGYwfeii{58)dqJL0_3Myt!X0}1 zW_XVwFIxIVufbi<-^_*fY_x4TDD{vPrchT)!ieD>o%Fia` zmcVO5F34ZejLB>&H-FdTc^W)dexUOCYQsXqV2yQw(Z}$k^63UuKEDO!Ph)GseTI8M z#pea1cY?~dEyiER7?{d|HTl~${v(aEB%}BKN;TD z_z&_!^f-;N;eHYBQ=!LbjLp(5`cmBAfPM`3YoRZ~T{LE+=#gBC|Hlmh^*OZ_R?l8H zW+5alj@I*7G~lq5s0H`QRd5*-*;Gy*Vm6M3zFf40_c7=KXy=OiP-u-^1nKDqeJ*}A zcA+sfja}s8x4&pmwE75Vb5U>Hc!qRWn_clBKcZs{N|VML6rZ!Wv_?gJu`#l9^Bln5 zj0~hR!odEyko_Yt1HSS+uzxYce@v)wV$+)gNKuJq%!vYmiC+B@1bK99ygedDsE`CLtzuV1GX`foa$Xv-#n&S@%EaI z&FD~4FlyqQ>FZr|6gsqz=T&rsO*maaJkq_3ZlmE+Kck$7hx~0N9u!T&yQu#TxVTcS zQt}#`ZgkMM@K&1+CzSBl*IJ*q(QyNQy3i3e@oDLO&2BM~$j9>`i^p&lV#GtFOGH zx|RhIiEFSfLWl0LSCVyv?w8)j844{w_FH}g3E+_%HGPdUj7P^Fq~9={9S5WgymVO&KcJ?{#zu7Lh3Z5p>gbeutJT6L*?RDU7iwty2ecHG(vh~aE%&GZONx!v`&N0(Q zPuH9AM;U!sT5|SR2R%BN_u`U$!MPB6FMjcOzbzxs`2ynutTQ@QUg(c3WYy?ohaJZ& zZ=U~|9Nakr;?xA^mg(Mb^GkTobnpGa84wyjSl`R|K}PgVl66k(P49VUg&Q%rH#ACc z7wd^8(`Mg82KAOF+2lxsQ!%QD)dGK~{;30#l@D2+6Wn^Ltk9_#pGY&_QgXbIQ!y?j zb;WM|RK`B9;L?M|r)K55QxLr3Q$t5AQJ!XS)I8SmEu{4J43%2(sTG;3 z6WN@Ep|O~yB|~cZttmeBoI5K*V{(5tFZ)Ta=IqXkr(NXk6x}C@cS+AXh3-TLot`op z-9w!2NLN43$QV%5J}+}*&YG-edfxfCE1&a7z3TS4I}x!GW`3(odHqk zm+{G?SJUV<^pSSm55uQsa7X;|sGn!AA1yvP?F)V`yf{R;kkvWc-5KHYVs1!tXY4#0 z+!@av)yl$i8Q*FyLksH=@Fz?&v2D7N0ydU(%6v zOG>hy$f)VZIW#&8V>PilF+XA}8K0{RG-cLgxVy_+6LELf5_bxQKmOT_pUss@iSDkf z{H!PZ`^!UL)lud3{G+-vZa=Eg%v+8szvmrIm)lvLvO+`-A)$Y6u zzZ42NFJm6<{=r_$q0805;jR{*do;_{-62P5H#6?A@yj>e+Rg0FDoWx@tl$jBEzfy$ z$X7o^+g!eHXlF)#Zs%EU%<}Cc{z)Pyj;IW3e^z|*sWSg=%OYPhYO=d>X^DP&L??#i zy79vUM~Y9bu#lrz`i-evCCf6LQ;(|JFI#YJoEcb`I=fq}$1Kg=E$o>3OH~$UwBNJ~Dv+ z2an|NfB%vG{I58o@@qe$^1J8AS(MzeBg3|)Y9n&HvO^`8Js@}R+3N>&oqJIKdG3Fp z`;Yi`^xfn_o8v+&bD_;}pIWOj-V%2KW?CPUh zi=k7qYI15azIJx!ylJ1kUgfEkxr5fkKWTg38AMLacTcEgCH{Fk*)EU#I_}}Rf2_)( zALWqA-7eib>%#&G2h>X+zuWtK6zwZ#Fax9vjEFVe3|_r znV%rjG&W239y1lUyP1lm#8v%;b80fz4VjnSr6=2WLw);#Ov*_6 zzlu+8QCdmIvXOorUsiG!sn|V_7T~bIBkab1EI#?LlTtffd{fhP#V7BH(v!=Zt_w~R zTHu}s9?yEOM*W&1a_ahgPqJ=~CBMW!QE2o(GG={mJ8b}XztGOiq3fOz9@l;_aMQRp zvb<%)M!BKm-1B%h44ZZhP9+$t%`#G^Orl@S|N-YEX`zN;{l?r&rNFog0#_DLvJo_rtsCA6u^hkwR? zAqiK0$o_XcM@!N3I`&n>QTcKZ`{mT{&tU&O_Ag>r-W|jKS?m??|AhSx?20R@J&k2( ze@zd3rA2vr1bQWx&hQO*C!p7IeH@;Q;;u3fW|Oe<+RsA7xu4>C4dwPZ{ZPzhrg{<r7o*uVm^b;|D8T_69Y3DCp7US2z zU-@=V&wF6xqcMIvblsnNdR9vRSuwueM-H6o={X>NzZicT{0*mjdNzyy7k~ZnX3BF6 za|e$NV2*+^x}Le1b?`a|Fh>E6*(iFo$+aV=GG^{-`~C3lLQb^gM1LN4l{a%;+Z&)4 z;VxS4qHi(xhjG6h`lgV(=s8@x!`ELAUIJc={BHa&LtgKtMaYYmKGEZGS3EhlX!}Iy zLfnIRi!K=8Z8`!<{wLJ+eC!vXcPMxnILI)^Fw<}+6|?~NXFE$H2>x zdl0+?Y|ZhWKR~>0XU=9ByrvxQY0-*@=sMh$Z_M*-Ujn@d_aGldFW{0sy#-;XK1RhB=_hE7R!rcxRLUQ-&uD-!eR8 z_@?16L8bpEpwhoP+t2S-*2nLK_ucGRev5w2f2MukArs+ z@2Amf-1+ivY2B;{!QdhQ4YV$VvZ47VbiNtu1!1`w6{g&s(mh(fvXMgH=G5k{H7T_*>Ixa)u7Tfl6dSRUYn_Jqu_m< zc!*X!MW4r|d>CZ%??$}mcj8WYZGWG5ydCkL7A<+vCvew&NB!7-8k%zeqxYfc-*GA2 z{mAV{j{3Cym+Ct7+$zruAXa@&woe1`RBZXDh-$OZ8e{S@w+&uAu}zXiPschS-# zT6pK=BFIw`Vn{ikAo;{29AG!|rAibh%a98?T@z44PuL}1d zy`txHDLqA;gQssvN$*WOx3vyL=@|uH297k;zBZ-n5GekehOdK4-yYUl>>|8lg!c-( z-K@0`Exn?5ap}I$B+;18_`+=qWfkR?yMKl_d=uhjp%#06fSE# zTz;|N&*jH~T%KR>CL+#<98m5Nkg2v@z~j~s>2N$q z(-|o=R5+qX87e%{`GyKlw89fAJfXr9DgdFv6)GSh;86Z>bMhAwAIXW9yJ+>174HJW z;fC5rMfOD0w-!b~=g;s6{s}wM4Jy1tAYFsV8^+&n{C&pXWBlF5-(~!5ASxqULFwCK z?wgIj!T9Tq-(~!@#_u%#YU8go{tDx_8~-ljFEM_r@tcfaXZ#xDR~di4@ozQ$JmZ%e zzs&eEj6cozCB`o{{zT&!8GpR-3yq%#DxU#YPrk>aE9h7Mk$S!ZdLz(6>Pc?fj$A zq<2#>ZK2#(LYG1Z?dDQw(zi)AwJBJH!I2NE}}dCCXno=sXr^SpI5{YdIzrdy98_c7#EHZ=WT=l*7n@6P** zqc0-7llTqJS^OUU2N9OqzUK);e5Gft@s-wHCSQ!)y~bA_Jz;$1AN^6MM}2^Ejjw#a z-uNn$UzmQCSCR2mmL(>ya=ys;ssj}!KN|Zgv-4i(-C^>)1A02cR&id8{R-keh?`pD zY&V)+<7>~8X7M**UuAZ^`!6uN-v57(eK5M-L(c`IQ|rOh4tJyHeC#K%|08zs)t(QK z9eIuM@r?HdGZ>>e_TR`3YR-N*IuUc`%UA;Y6Ct~J0sn@O{Z;e?{Ba?^>O;V%4<5C@ z6OwNX*++-u8$$BiLNa9`yZSbP{@X(K-o81+1~Y%le%y%O2VGMZ-q&Os;!+K6Ma81K zm~NUhXZobcGuY^MX7a&Fm#L%^KPVI%y9ox@d2hLYh zkr;ITKeQ~+MXkENiTz;*7lYZyP!L0y-BE=5Jlj~m9;k)El9lE=x@N~S54bn^9f zluJ5y|4@Ym)xFLD^yN928}R1~`jTdFKb?p^1&}6zY5l0Kxyh1rN@JBV)nrS0U$w32 z<|&eoE4?~tL*Z3Poa7@-uZ&-M%0y6gbMi5#$(#?cB=x^_?&+0duesVSOLhAiOKL0c zXlQKF;Xesy$fa7Bx`b!8m+wDYPVh`hWq9}X)*>h5G3zcKqt2Yky3`X$%0J${JQQ$V zg?g6l0-3(fkCT78OCDokPKW#?n$ViTlzS6Teu!8`$#KMI?xtOejx#Ux%qax%}9< z=gxEDUtjAmuQ44zPDo2wkL5>gx^}wt7 zG<4{F?ttmoK&0fK?r}|^??Nnoq;yBSu^UJ4LsooLxOJF^pta^#{eF#8p(DBuQ$BSm zzT)djXAYvr$~8{JUt4hPIi6c3p>+d2@0>c`{yp&rvg+Vcw}Q^+zjfTpZ~vb6{q$=_ zI^BApF4lqVXD8vC8UBieeQq^YX6MJs>oo&k#K5?SZb=I&@SUlj81Y+nWEn2 zX7{pRa2IlsFTL;PX1jUkKjHh^sPZ|)#p`1I8z6b)&SK(TsDH}n4ItwL?pqr?|LPa< z3ak5dAN%H-a9hBbo@mTQ(YNESXU3bH?b`r-3+|#Z8%67R^kMW|3QF%t)2Yrt&8sz4q)kungqkr^PjWn>yi zc}Gf&Uu=BFP#nL=_-a!mUugV1Q2Gi$>DPNTadcymv;}S~lJ>!k^~oK-&Yk$`dF38i zyy82Q+~uM2Xd@rdyGdbUHZq>>#%O~4{T%dbIB1Nf8`Kz!)`9DLyuldCImpPay7BME zmp+}(rm>Y1*yVQ+kyCwCe#ox+`=Z%ZCzoN@_=4))db6wU)^ZIdp?Y?#mYsspvxxnp z%3o)64+VB%VAs79*u#6$l!pO-9=Za%_E84*Z-?wU6F1;%+&r-NIxg@5caQz0hR7{z@swYb(#w+<%Jf=i3igR~wn|8{izo+hhe(s6w z%?rQ6x?qBxZF=`iN=AP0;P79BlHF538PZ7y+EPA-lHZ%g=`Gtul2@Pb`7FJ^x1`xm zS5$a4E;2fgWm5AUY&vgfol@DvfJ1aM9rr`3_m)@Hf6n*odx`8R%x?ND-M9(WPtisD z>CBnDw`{|&{Bs+6TX-=1qkMjV_ZInATiHb$AswkqUwgj}qGL54_a=0%!urtB>-QS! zXw%eIm($Y9Upo(-uz$s?ulEJLCyYX_%5-$1L+yFkm=1TgYN~yGdQVW>uk)@I{yubA zd!^_(V>;5FF{3lgzk_5aI>IKLo**9S_VvxDBB)%Z@$iwqH;9MSk=2RuaJ{fpY3W3V z(!a!X6wyhxI3((*O}96&%XDa5JRE=2MvbKkD+GJCA$^IyBF= z-r_Nhv|JHZhCNg+Dc=S4-f$gqn#&2BRPji+CvO<{sp^M1Ve+?|OFZrkb2Mv_ z9%?%FlBX2!8NCZGq2pABtja=ts8{*B4BU5~zivfMlH6rf2X!fKdPh)SHJ#au9xK;4 zk@W9%YdNQ8Nu~cbcWHC5|E{~=GVK-X7jb*3vN}0jknb@U^|=G@Ro)FxxqTtaN+NDA z-iz!STg^E?``jKH&i-D2-c0Q)$X?60jBB*xsNY(>3-()Ad~%12N%k6cp261}>!#!V z))$}riQ_LV8CbJ%-i9*m;d_jbzB@l-1lruX_7UY;!N2+p_oHR9f?qoUT0{Hw8rZL= zIlXPc4UW{Fz zS)zPrk6u6aBSqF^b!O)KJA@*nPTyr#tcSV1cjxw!*6*IvF``(KBiqi z#rq;%!?wFUImbTCzN&qe>bE8<_xw}f{TjiJ48_-Wi)XDa8I8Z_^sO=Oi_PrGJNcsH7oV(h z_fb~oRjy8j_kfN|Q>St*w{zI3ryVYlW4Zr8E{@Mx%ML$w*}Qi&XRW^3e41Toi^lrr zMrC(q^UY@eUON)nsrEa*(5!s>?NRTbSD^iWZ^BW&{gQ7sr^~rey~|R*Wp!n`{V~$? zLTC@#PWGU2_Kvr**E-lq+q6@6IQN6vg7rrg`*pK=Z5*?PoXbbe=N=T z)3T%fKD5R5J?dunJ?bX=9(7$W-=ofm){0;ps@$c>-=jF|=v$Izywh zcIp(Lbh~j}nu_O%J`o*>%PH|j^t?0bdujIM@YwVB-r&w1?Dpy0+fJAh)wOTa7j*LZ zD7EYCU+XQdtZS=o@!SdF;qy^Oa!$CmV3@lDq~Ml}o~0wJZVGvHC#uMY+!ne}s!JPm z)=HIUTR9TAM8|zgO8x7h*gL}yRp>2xcqbV3lhhB^o*>ONmBc<2z!_MfL$v$|gof)9 z0&i%ms|ykyI!4PKtmV-=YMt$W^J-yZ(^6k9l;F4-N^P|9b2UgW+iMa+3$oCC|L1$e z|A$;!)BH28Uvm9{>loLcxb%{g&2MQE` zukimB`&bCY=Qr3t!u@tGIwaFZ8#UbQ-yi}PVLuH28;_VMulj9usJD;@Hy zGxk-k>btDR{W`9GiU3AotMC0;t}J+xQTp)a@K5-Ck83!(Msi)obrsijTsLv8K!N0y zrtRoZnh$Wvlt~Gu9kdUI$A&b6Z#)!v>Gq{8bURbx?gPKh`C4QD>W|6vHr~07Jt2jP z>u33BH?qo)BCfsf*q)OcVtn=Ey4WjntK>f!xUT2tlz+zZRPI?ohJrwJ!`f_V>XKJGNuqcp-ES$k=N= z>%5;=AH0~o42RJ3I%};(ORwnHa9>Tlo+2K!3)@wa~7w$We z-wkgk@}ea#nmN)<`v_a~OVoX>30J)D1uq7#2lK(nU;$WU{6bLS6o3kcbzaYF%@*sV zw|^X79^nLQ^+anisN^Fi|2APsKYLA_f9=gx`dQcQ(ocSF-wp3s)?f$e7p*nnD+q@* z;@e+<)|zn9iofWmxD?I?Q1N;Ud8L;%=iAr8TZ4R%e$n(vHtn(Wmvd8Uoww4@T5%UY zog1cjvKHLo5K#G%Yjn1uXZS8U6z*HBy>2Jm)s*82c!yYfEn4vueUMA>+;8%GkXO7| zpTAw}#djkg#8dPxliz0Y8<1a%Jauh5b-`PYylCkc-G%!S=zX|vhF*)iXt|4KZe)l(;>+4{m;W>Hr~H16JqUB)F|QZRf6*nlx1xtV5ZiBpz7}`U(koi?k*9(XbM8oYe)RZ#RE@FH+4YqYg52fy35!Q)KDr$tM@XvUM)nw89fThfC?9 zE!wor(xY~3Bz&bu^IjK&zk`<#{*rl;_4xlT`S&Kg{mhey#%vU=woCFaBB%E0C&;}7 z?*-&UV>XK3$)$8WgIo>#9ms8i_Y`uXF&jm1;F8>G4%803O{ z6-}G`{CxCZO1_VSF2G$hW~1nQ+*NK%h!6Rz^^wtX6rIDxEk$eLuPw*Fo_%h<=K`#H z7U9Ru_k0Y@Gk5uuyF4-`pvR?0u{k}$(a=Q0tu+@)uQ1;bosO1%@%8)?O21GFg$hR~ z#X=xTv)06g%aBE`){sL)@(gnfwU(T*jEHA=0{=?y5yNi7Lxu+p4;a2-Nd0pDc7qJ1 zMRtLT&rWb4xYhVujKA6VT_8b6)|$KOfc&jC{z~JoFn+u7?=t=pj6cKp(~MtY{9@xzG=7os#~Z)U_<5kqS5W2s5KTt#Tz;PVN_sY} zkKjl>)OzMN=-~Oc5t{gKYNa6L-UY2S;KB1@6*TePG>kS(?(NW}&_O%*1!&^8sgR77 zdkysE&_TO#Gjsv8bH%+3n(?bm!F}^-=t20^ns4=eG{5*Rs5RcSr;aXCC4ttvwA`CX zi`=!=NwoI3=}m~|r=v#_*!%bm<|mgUr+G-l>F?1YzT$g}@s*ZWjjwcSPnYDC2hGM; z{){xf@=ni4=~2G&+;{TI^VP~~?;H$5azAI$r!z%TZX5syK+{(Dfd*>_MW zw~+?%4`5$zcJ+BH%-)XuSJ(%mL+?uai0}DSezm*Tz?WTZ>$@hS_bxr_2UA%z?)pX9 z8LQMd?vDtUpEJV1zB$DIUC2&b7?o)c@fV;o@Owvyzahl0Bd-FPheG`DcS2qa@yCbc zr-t}n59uEn;y)ka_i-+$Tj?8~i;RBz!=J*8uH;RaF$>=FqSLi}{UN$wJ6<;SA&-=+ zwfht%cGG5;XkmAPXyPPmO6PFek~E~6_D#@YA~7{K=bIq*K^M9Q^Sb`$gyEN#{47%3*;pI?eq3RpaeATsMC|r>&u`v9SqgID_w2ujKjQ0bmM~1tGnB1An z-yfp=m4Cq7!E>ilej{GHK&G#C$MT<#+)AEl(viy8ylC2Wwh^AGqwuKlMCsT?#}I3r zF&$~=%}1ky$Bi4;l8*P#!Q(_mT`Xrp^Rp?}KNq57CX)LT0uQGvh)244^LBK|yY{Tf zUxc|{p^6A_rmyu3E736mNzF@!O?*6}OP`%c;(4dr&@l{`a&#zPh7u20amLb;cJ5vK z+vT^;(h}#{2-A^v?p=K|CA_KEw7BLqnxMqA=sfc-bg2KTJQz({qL~>V53PwvIrrX5 zLe%#jMja2E_&oLFk#6pN3p$h^I!j3Ywi1uzI@bH#`&JalPgz1d!g1xgD;MMdv(?~Kj47sp#IKY}#SU5%Q)=HB<9L+?;Jr%HLcgFID~ zcqgg}lw63#kCa+CHxA`!tzXE8mOs_?Lg-Oo9%Jsq&>Nn6r#aC3rtU*G@2>g%bfy43 ziT8?R)6WC0xARQ()t%Eeqcu4=&-7&Llx1!X{%kh~f7aUE&S}%8hGyVD{MBE-KW#hgb6tT~&xx~Gm0Wac@qGi!^7Oa6$Ak=_OR?hbQRHkUP!+37)#uPp0_l)k$& z=<(u{uZ)w%$P>#-{&`;Hf+00|Ume1%UHfsJmw4B4>0New@RmXAnR{jKdU(pS5%ao2 zv#(iMS?8=D($)W<{-x!X{-9>%brEI@ zi;wHf*5TjxPrbXw@T%`muN_+0e?elQ+&nLn{Lu-8Czzeic)WOCzY#gi z0>8!l?-7r1ylnDw;t*F}nGwDNGH{E>f{Wk}=Tz~SI#&_0|xA@FE zXR6|N-qa-}3_;a+l<>nZFdxa|%jPDZ==7pghTqZ+OSmy+aGxa_wby#4yK@1ns$;W$ znh>1YR=23Ou1>2MC-X_2JNa07Tf>bFt+jRLQe8E>xxBW%y0MMZ_IR6Uscv3e-K;S5 ze7=fHQ$(LGs{OMDRk+Xf;tzcFJpfi;a3$WMnd zbqiBi1>*nS=N}|7ER}NK1lmoU4>6bZ2E11pV;7CtD0&ZL>nD_O=>7QLjs0T$JqKz` z`WdhQe2lUB739MqrVN=M@YbM5wET&_A9wZh*5R)CfO~NlEqBqkaOI;%VmLLu$NIZK>8oL^|B&K?znl1D4#DLsa|6zQnc?+@L%@9e4KzAp_&$Ca->WA-o>w|w zVGfE0LhJvd=@k82E`_@fIi-)X-M$~*tH=fE6}^{>Wux`af)|05+wkX#2N62E7t@(U^^*SKzKb$0+7fRztVrE*i5@bSqZ@;nac3U&c0F{&Jsg zFM)S8@ywGk1nAMYi^gmeJqmZ#uhXQj5E|Xl`X)M`OX-5|#&9Vkopa;H z`ZcCb9%&zE+&MFHkH9|<1k{#@bSMk`6Gsd4py~0rF?_PYjo}NGR*f02Fl-0uGr7Gh zD2>dAmj7Epb^psi`I`aCeVVzK7{A!~!wl5eu;%(i?*T{>@2=v*4&KN;d5 z4TbyfA(>MlyUtGu^k`l-u;+yAlS6hd_H4h7s`)UBp70Q(fPLhRElBe*hq4`Wa2<_ zD%WtPB=&hy4I{_vNH>ZcFBQwYAcLkfSMxPQb@!%KHdNKoeT&J=ZEbAQ7MTU={pmF1 zh0V3v%~H`?4?o(Y`)uW%)i=U$ud%_dq6*h#6pybgR#djM)ZW2Yx;VpSN@K%9ggAnO zFLXH}^VwS6TwmKjWTKktsyTne1;qK&&idc}Dsx4}`0*O5jmr)^URXcspt#LULI^R#XS73Fx2x~bQ3tO+<$Kpe%EL{ zS4IE3q555-)&2{wGgSXd^bXp$o%ed)QE1`KMxSf=i1D?rQ|_AE6LuL*|JBjoH2zPa z=RHMVhqhJtN28ZQ?AT65R@s`%;y2zv}4G52c20fxVz6I3%P!}|@i@G_&P z8~&|f5zl?O|Ch;WJXtj7{5rhFaD`#J`O|tx$-N7|Xhnv1APQ#<-{t=_Mf&0Fk z>HUY{cMM-K96}#v*w-^Xoed`(WvH=u(b+~n1Qvcf)BB>~orXGdPJE543dhnv%G;Oe z4KzFsU-ZunUow0a_k(mi?l64Ju*~qwhPN92E0{;8{>O$#4bRH+`8R-FdHuW#4aXXG z7~W}kH{*Fg$GdBg3Z+x10Re41Y9)cQF?By#g&P zq5~})VtClxw;HZ8yu)z1;U$JShJP@9J50|*h6@be97;XsK-vS)!Xt)R#?R#?Py8W9 zZ!=tBc!S|6!^Oz&eX^f-rD2)j*TI#11o=;fPZ|ER;Ve3@I~gds!f?3Z7r=dV$iHED z-0&sCuNZ!km*%dFi1$$jErh=@Y%~12;mwAF4YkKk@>d$>o1XtN`uET^7e&1L48LdC zXjo}@7BBCT`+r7PL%+dG#Wcff4F4avgat0o8-CUBe#2XNd2FhQcz;2gY=WQP74aT6oMw2l;dXG#vk~tV!>0{r@!~sbH{n4Gdkily z{@201Z$!MshI)|`J<)KF@#~?tyvqV#!{vtm1|H-E^Dl-Yc)1rn$MBzwzY4l(be4CQ z;TFRmfg3)Ff5TrI<}>(okV78p3?~`x0yk7-@fmX;hvXyog)Hx|+`)UG%UBHbDZ`_N zdkz1_@Mgn`5y)@I^3FCKYxn^8#@}ao+YI}S^gQneS>CUqg_lF;@5}OL8LkDpf1TyE z7#;w(9cH1oVZRG_p8h$@yU_4XaDM-6?*_w1!2Azqdpit&4dz{t?Y(a}@gm|=nC&ex zJj-xXfzSVq;m0rZ=}#M7ZuHj-+l>D+qc1S}LDRPr^qR80Um0dz%oxkEY_Gs@j^RCq zo54;x2M59YjoID{hF6T@UHx0xUbf*1Fz0*O-mQke28aD9+uLUNiA(4w{UX~NWLO0@ z{XW}!*l-uPVL*THkxS`6<@NW<4C@RJ;V%9aM*rOCY@?qs+y_p(u)lZE@NICzxc=U` zm-#rw@E*f&8vYE-xw*ghpN6YP6Tj;I-Xg<~7#1164Yq%!zxVfsKQCh1b(IV?q^zw;KHU9MQ`s`5 zu}woy+#vxmdr`tj)U+wnqH?Y@qw5a?{utiYQ4{2pAKUoBnLsoMN*~S&+uf(n6$kg- z^XUwHB;1qJiE5p`sl~U;84%GLz1SkVXpB-zjj3QXM3Zv8#W1zkpxBe{>sfQBvQMux z_F?rvGOmRCk_q2e$r@EGEF4iLn@5vDXx&^br@v z|9YV}Hq`SF4>itY2Yr-y- zNo`*09Eo}fCo}MSCh3eu&@Zzas?W5Cn8iFax?M&k4g7D*YlQ!s|VOz7Z@WJbd1w;&MTS|5GT8aodeyqD;5{ao#l5#pz*0Lxwl(gv$>NW*knlxd^BWkPc zZKrBdP)%aJMSE$ej=4nx2|104PDasxDrZ`TzG6@|spadf-@#OF^) z&LyEXIp)&?Rx|?BTcVGTG#TP_vFJ*@R5HfdqPZK(lu5os{0;1w(Ex(L9ies5QJuDudozq*wUJ~8>P+Wi<^`0V~F>WY{Fr)dKCS}eadKcC; zwp5olrqDbk&LyPX9F%``t(E38mAk9^X~K_cCl2(rD(lJ{r_@yXJ$Iu^8rwLX#AUZ} zrq(r9`mbWfm~L-oF|zs&>;4-{UjYcK5S_?#2lR)9ZfwxZa&=W=i~@c_upxG0@PSie zkYRp0w^+1dqc)Qp8|zg0V*@kfU(8t%?#0>9(Ov{x2KVAl!h3gB`g@TGa=#CeUYuQ~ z^x__5Y#%uhi1nVJkW?QD3nb4Vfnm`zNJ#1g-{DqRG&7LrKmJ1W?B-JcesVRsuDYcq zDishRk%WfIy~ogTozhs}RM}k1`K5{Xcd~>Y(t&hxqa1A*QhBUi(!_WLClDn(LQ~1s zS1$2mmGn?fDP7ALh+-8;$G5D>UMvc+HhYTpfyDQoqG<`cjj3p@sdkK%Ojl?cNX ziyE8jTT(Q-yw{jhS#x7+BYmI5j7gRlQ_&PJ8=uf*4=xf6BPADAEbWX%B|FC}P86XX zLMicPIZBEyBjO2e(aa1vxx_dHvnuO@l1nY<9xn04lN7;Nh_RXNkIBP-$tmqyCY+vRY1g@HXlbov@F&GM?{r2P6C4xkLRf%I zYN+*(VRN@#Lu2c#D4mdJ(_3(|JWJH+Tu|0p)7<#QmeM5)t5f%T%Tu~XZ=eKc)os%h zRGn1sDG9#PjsV3fN4f$`Hyw~-1Tjrz)T!e^T$2kwo&Nt>HE*FQ3JNtv>oGS)OEtYk zTrDuwO2ssV>U*SAYg;Cz&|AK=DOLj$D@5R^yU>5yPv?t9niQGh)-)#7E!W1Skcrj} zYsA7Ld|l1Wv!scC3YD?w=;7N;--8%^wx*VqnN5|^(bU*;#sck4I5C1LWy$I0+B;b2 zS?5pVSd7omuTt66R9zM4H!;UuYEuRtJk{MK#N4(8ahVoNtFN8sv6D-gr->qDr>`vV z6&L zZOzqls+$^{S+AT@U!USJ&2y_6y*e|ky^6*(hSXW)qV*=^G^T=$ebuS@ZE-?%wGGv? z+UgfX6Pj8V?>8x4KH@aBlFCqP7hmEb$)q|Ma!bhcRB;JJROAa6(xj!CKu)hUWljca zc~PwmUb50AA(e1U>%1xH!;V+kn`BI%1{vm5a|~?*doR+}$TUJREqVj*Q%f45m==G? zqE9_(#bTP=*hZg<(n-biFl5lDmeeva9l$hhS5BBK|z58-)WiUCJS~z;crJI(F3nBXQ5Il~e-g^sbOoh%1_8ac1 z(Cf+>damznwmwbji0B8LyG_WRF%|!Vsoc0cOZhnIExXe8?~`Aal6&BN%k=U3l~D2g z*MRtX>qO$)wX|Zfo5a`QUgG0gwP-C!5*WjPhTFZQ&UWI1FNJjPkB1}=>L(>J!%u@) z+}#+UFB=#4_)JJA71I+8J*H`O>Uw99Ol2%_NnbTHiFiHfq+)vF&t6N6dAutF{qf%oNXXAbX*Wb0luLZX z;zg5E7q=fVF;a1k;Z3|L9t?4^EIUuTZ*XjW{#AwAA?R-_99vj;wN7sP#MrS{!^F7n zuSHi+2j5=Pch~x(w;xvqSA?rTfB8PWRSqdkcP@JikrT?lF1ATIb0+7uJ%R`MS5Twa zzw@MgM!a@`Okd}=>8xda19#t9{+T4culWDI&P#h^fam=MFT>b}6*j1in!e6U+dt4h zmn-=8(lGYwC?B%enh+=npD~u|J7d~E$JQcm8vD2ub~`%oFB8(S&>zU~`Q%S|>AZ3y zfZ^z1JCCP5Vqp`X7P`wVtx@O1bIOX*!PXwH9UUr{EyN?S_}R7F>v!npp(7u^U6z*J z=#Z|kvHVDTw$~DLM>S5!=&SvGr4G)LOe!L|u+cY+S| zu8_R)x1yq{v9^Kt!xnLpb!@SCbSLP@Mpp5Y(Jp3Y>DbNP*6_vJhN_B+8701p|Gy0# zRaj40ejFq}OkK2S`Z{B5DEHWYbd-~Nd74K-3sGGIICCNYe&*;-^xajKoyfAi$U6eD z7f<+!e$R`l>&_}u8LQ4lGZ%ZJsX>qA6U~jQ{$uWEZ(4q2c(+{Uttvgyaa&%;-MJm5 zIjbTC-CrWSRWGfYSkV0i*iGW1jmtsUt2@yF4 z5~8A{J9g2S!RNbb;05s?z3N|G3U2SXEoW73LHCRDSb9V{zT>P;?N(WT*l~X`*zs_V zD8&!0E1l4xj?&zYhfC!8n0Cv$6qF-@#zmr$)Tez{y{yRiiC%SEclUD<-%TgtN&jf! ztp!6nX66w<9$A#zG4lvkms1_3hotDk62eMy^;KF$wLjQ#|1|wSTqvH!?k!q6dHJL8 z<&OKuOX9Xe1mS1>#Db2t?(RKuMavI_Xw~`M%DnBMW!_WHdPKUOz`A_TXg}9)>t6NJ z;VWE8AHD#<_m|{*V!`2|xD52`fDY)k$lvCy-BL8iSzXy&=d4csM63#2o0%6Sm)EU9 zecRd5Hmu{ep;q6{lCRQj3SURZtoq@q+jdCHf962E{Br3*)zXJb50Y;$mr6zc%cVz# zf*n(G@zk?V5&DsYU+O5`+0lNJtgX>pT6OoX?k8cb{GpUSF57Jn87z|hrH!wERWM zmF{zqJkU|POEDVncw1JL?pOI-+0%hZII6VFEMQ{fCoRQ9#i}+tTtBZK9@31nom^x2Vri%{rD0?I<3G&z`be`TvGIQLew^ zkrJvZ-HWAnX3nagcFZ2$F+H+!Ql65dvjIA;8{SbI8T>+V-ts-Ueu`aEr%MyTj{`&P zlbYAOj<(#6yK^4G=d9sYqsZADm$Rn{xnt^3MdmELE`NDg$JAl2xF;(6bI2L5`{xKP z-;;NH#ce-a6n{UVerQKqPRCRgZ?w3!#FTD#RwcPxM+gxLD zg{-BAI==d*bj>{BD!y7+ltkpFOc1{G(DGY^s`;kokOId2u;DL+#P4TP<+rIX$-4Zv z`X{{Bgl5;ZQBOLN-|-*ZQLAM~?^lI?MwfT#l<2_GY((htb)yevkk!1{5r-&x5 zsj|rQJhA30?Os0}+d*ese=@~flAkJe0~gN<-z)*xa_`NQ%Y$6e4#PT#QC#jz_Ag># zN3?I=1n9na3+3l6uBe}PA?OTwI<4Q!LW$~_KK2E3 zv5nt1>c6qa-a9Opm0Xu{IrA+4>fP%IDQ`Ddw1YSlj{N*tF5~%A%Kl4)5*}611fiSk z{7n9qKt$ue5<)$!3*@o^;-5ihqGh0LbVe3=TqNpRt_iZp#FfD(d>$u!VNtG4N3A!7 zD;nxt2<4j2;__;_^zd@#ZvK@cu5>!F40LS%R66qW8Tr}9bqSX)KW=@(vWW5D*; zjQCm=n;Xlg7WtE{6QUpN(@c^k)g}a!c@tt2b`$(bIgaeKsY-ve(jO(YSxibs?}fkN z`aM?$x%e@zE4V(%rE`yUE=mj6Dz4|a_Hd;#3&(TJr&nsrukyXo`3u@w^OGgTnorH% z&87FaJk==7UK;L^&_u%-(W9YhH)$)n^d7w%`fn)wfVT@? z6LF~J3V7w*1P5to)CL5+p^6xhQ3De2is1z}e{e=;PX8zF>*?vq%gfD*=&s4fTLIUe z|Lo~eTp~AcVCSSkIV&s9uibt~MNFc!A+C zLv>dq7co4Y?QMSBuSXjPk*6oQshU@WHL-}HyzO}|* zZMYQoBO$#UXW;y+f1+@2#9i<5f&bai-68qwOzzW$SK@vso0<_YKEu5lZsTmGg?4`B!NIB1Py1oWlmk2AM6zY)^QnU0$^4i(6~ zhc4+qY4~rMvHVpy`;Gs%hU*L;F|0Jy8DY{h%W#UJ&H@wva>Mfs_5CIBj~nV?FZzJt ze#2J{=_728SiJWU`EMEjDZ_QRyFm}~NA7E(hlS)HHo5x^zhubSvzy-|V2txO%lPUX z@XH!!^reR9A%8j~PxoT;&`>yfxGEj*@wtj1-xZ%z(0L)bWAG&R?}l#}sv{%*-x~h4 z;nxjU7~W;rYN+;6@ttKfosZ~!G6>$4#=pdnBVt@Qg&(dt79RW*e`R1Vo($uSI^D>=r;bo;2|Cbq_=+!?eq9Z6@&DqQgu9(^3= zU$p#*o)1#B+*z_@bKF_7;_DeB{zQ;`iWHgrc;hSG;ujb{-}p+W_zG8g6jA8`9G{-p zW<6gq8!yIDy-W4Z)a6v1Im$?9=<0l3_q>!ohS2*2Ztx#atn*y;jDFDUdN%(P z?vl}cuJRfLPi?>wlhLz!k=gZ(zEF1L)yLpCHD5n=oii={dSHi?- zk|v(g-Vt=%fs@WR44e3P^ga()&NHVI&rRr%Kb;AeppJ5J zRW9u}hYq1*F?kvrXz^nc9}lNvq4t_7QxoSUZ=pOi*s(aM48DrEGO~C?Cnpo)YsHS6UWDLTpyeN)Mf^Hc-KfW%!O#Kpj!^}G-EI`ucLhfp@e6j&LRP;PWW>K zOf)3SHH7AhKPL^Pc^V=A4V7`#%lGxPezIfvW7s=77D%gx?ln)q*!H*KuGrl=v19on zxx{AVx}U)158H_mb743=)RE0C8jjF133N)Jyuq z4xMD|f+lhk;3z7=j4k39`{KhomM@lIFoDg${@J)3zNlmQvIPF0s0T{vdxmcb(ezs( zxn+~rZl?Sv;-TwVFlGMvb1fB?d7C9(dZgo#YbmoJ()Wo;c&nY`iH=7mha79fWPUSe zRcZHqrv|V1wle3hua|_I(bKGg=8a%`-Je8w@OO4EKRvPSQ?p#gM`gOt58SS88`1H= z$59Z>$S~<=^FV*$ZSD`hR0!XZz(WuGPT{C%Tca{M(Adx3F!u*=A9}#e;Kz$^k;(_0 z%3Fv*#{=Vhl?3VLMpojk#Mc=7KVFoF7vtvIzH(%%%7u&R$hP4f%l}cb_swU7wL>#*9d|Ps?ry6GokJZC zQgxT8msfqSMuMeoHm}wR+$90R{G2EzGCxYeuexuExK^_*?S&Hfb`=hTKf8PIC8b?l zD?9FU0g$+lI{&M_-KqeV-{7<~VSk9p;TdH2%$1?Mrhes7c3$_dc)QoVKX`>EBRWbu zm53D`%V*1fY5UmMVsrmve-+=JNOCM6ci$(4Cp$`4cZ}~^@mlNo z9rw8e>JIi36|0*S5~VHaC~enVo+VSqh^w&546g;JJezUNUz#6&h@}N3B&BqvYZ2~K z@|;hXXfiRHtcX0n{A>mZyRSr2WbmKVGQHE`a?k~v7@wa?0Kr#5i#G9i!BHwU#cG>m zD9$a8>zDc`OHZ^l6Z^01*-9STjB+$jy6=|gH&jd(HbK-n?=ELh`Z-4hLCl0wwJa49 z)Ft5IZ?SH~={UUGFXF@NyFZLW{9JOVeXoeM?-^1=&3xdVELplAdSnrgr&Ti#g(^h% zYc!c14{VZzD+_nSd{6D@5AXX`Ye~l=&&X-!k+G*bzW*H7MV)@p9SMm)j5v*z3P+Q^ zR-jr>Huah}n}4cFUe$xrZr@LiGV~UO>))Q`Sfg#RTcU&er(r4=E&vbzp_k{`;O~^O z@+oK0s?w9oPv?Gl*z(f@S}$9EdSKg}j^z*2PkN~1F`|8V-15_Bw~knTdSu&#fPcUE z=LM7!cbKIcz8}rFN3)4&e3Lfo@a&G|uc$HWctv_|Jh`ge9+j@)&Q*u9`(8C}#9y;i zx~-)yXv~zJ1>#c^D!^Ex#hED=B*uc#xy&oj>5MGv_41=TFUnGbIosu>D#t)nS)52wpI~f0xTj{=NV@)APiA zZqE2#xy0CVmj?}5yUyU1pflg$pZ=M*QZ9_%dY=JDi?|bl9=>m+uMq29a(Nbl?u~Eu zK#aiZRR0IWw!o$5i64>=lSEz;@MMvm--^-1HJah zn1c3`8ye8lM08zs!yRn@^sre%U3mB4d&@_YtwsS_C4YUaP1vto2O z@B}8-hsxHRXtkgI{C99-U(Pai!e zoWbQ6K!l0`_Di0@x|#p4R21P5Yso3 z`^cS|6AJ@fH!b$%r~ANHGiS}cg}VQ#yDijM{u?72z2c|F7E>+-n5w zp6{a7)@aO7<`|eLqx-v^_-#RljM|&Pz8d>U<39`jD_0gT6k#1-!Ou{;Q_q|3yj@}om;_ak2jJu$>fl-D@GnVNQF zHD(w#`J$~ql#lfcmm;at7d2zCWqBFVVlIZ(9G}(`X-rPz`YIx4?~?8gz7^i1^hGXaaZ{jYdTeb} zCo-KUdwP_%$Ri<{P*^)~yOlLoPUatyWloSc6k%4k;p>J!F?^waY!3V5@SZdNw+z3E zdpGw9W~1C660JI6^nE7R27ixkO5-;s=)D74-}nmLD-+!Lq{!yYA@{in?vtSPZLq-q zCllP?r(P(XrwsKSHqoye?ljzF_@LG@S-Qr+`!e(!A-cuns^Dw?nZlLa?Z&?W{#uKV z_>-ZxhUBg>xpNG)ep~T5Vc2c>OT$+UcN#uqc%R`H4QmZ64T}x=q>$79PQ=IKhQBw| z`e%jzlwo~@HAEKQN4d{#H2&rA4}|#V8($5c{QsUcL_s>`@87t@|C!+nhWfUx_+LkU zhTnc{l)Sz%F2259E4Q| z7efd6Cp}l09BYr`_~#g3Yb2!SP1YI(^;7=zt}Xs9_(A;?{~wJ1O~b#&{nb!99y5NU zp;l%~&s@VB45t`=((p3$>@_{JxEU@m{)gc23GoLQpEXZT?^|>kf_#*}L(oA!iq@#H z!hZ$+u8^J|K<^CE&zam)@XIYf<$nWoke{NpE=2n7gTEu>|4YWd6aKakzgpja#sg-f z{A*o|{9kDJ;gEg>t2IPaJ-3EPINs<&!_kJL3=0hN4fTwXKRt(pdQJ)Tm=-Dwq5302 zZaas7!2 zHOw(QP5t`+*n1Z^EsOI1{{bEpb(O8CP)Q$kRaC@XT@{IR5zr+$C8(GjWjQG)*+ub` zODv}z7D%xyDZ#eB9?&SUEYU~^tjMVN7ADzhq^n?2nNphkKJU4&xu1DXyV&>p{r|tO z|Nl3yo&C&QbImn}d!D)Hp8LAyru;XBv|ICri#J<*r^R^7B9DW z4~v&sJZ15&7Vl#55{q}T_+laBlzM^G3#<`}CppsMlnb45!AeW-Zt-r0ltVh@fJq^8 zL!*H6&RcUo4s z_Gri?#~FQ;5IX$~eUQg(Ln-T@TOCcdtFq zrhtbxHJ;~f)zkA}IO)T)g760dIfDYaKM1Rgj};CZJ80nW5!yP8cDu9Eq7NAk95Q@F zU%vmRlTNCK_8&fW=&)A#Bet<4t{ygE`1_I@*C9H7#h>MpLk`bdiIa*Q%$v(l=)hdn zG1~XPWcJMI?j1!|Cs+sNZ#Y_+Wn=R?D4#dGMa9y?rseZkc~Q6ch75OKWz5mr^!1Ne zFCW?(Po~V)`P^WM282#J8!lzraJx0`3tulAEH(<-VlL2w1*GSl;#5#44LTHJ7_%HtlG6>t2^4jk{dM zZI`U?5=pgr!uSbOoGy1;y4m4HnmlLxY<+3LiSg>%XI_){14?Dyr;Sb&N)L=s3p2z5 z>^)&&u1L&K_ku4Ne|mY?8vns_7Ja!lI!`V9+&oHU9_7EJhhF^Lsq(_-PF+xbo>Fj} zI~9B`)^yDa>6vfPdL)sG?tT3U7jV0^>f5O_P)iu+dBKl67(MeJ>wZdp-6j(ov~IYF zjLAejfNSgAscp)?L3~YGV<}kBg?h7v^miBQey!|@aa!LXW4#uVCQB=v$eE0yy6P(= zV}lk69H|nzuudkUwwSIuwv;JlF4LX|`8KN_)Jx=`9?>onhP!CnpdlG<3|`h+g*(?WXYZ%PL1ciYd3vu4*LnmVNaU*}H5%sE3#pAJv(4BN>) zS;QjzwQ&Sr4}XwWu8#N=4a!|Av`X)nD7#E;xg{gYWVEiU-e2#bHj1;Gt^zXN)B_P0 zBx)?|GoHH3kb;PSAgL1n{Mve<)w5}swEg2^%GtUj7liUX48b0ce)^)_M zw|ex;k)dJZ<{{*?r6XP^8FR%q$ogZK`oo4B-Q!$aI^ugJW4|~zn~XlkM13pr6cdp+ zS%Ii?m?fih4Wq;?@m30(yGc)76<3~EM;u#3yoR64ugAQiZjj{UOg)ZQI^y&9c5NX% zQm5afSKO|NDqY`K{Tpksbt!A

        pSM?mBu?F8>uJ>G}`Dj7FRE069zLfGSk6(Xp=( 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 ?%KIY#pqh_G- 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 N=_ve66knau{{t7pk+T2* diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Resources/Info.plist b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Resources/Info.plist deleted file mode 100644 index 510cd7094d..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/A/Resources/Info.plist +++ /dev/null @@ -1,46 +0,0 @@ - - - - - BuildMachineOSBuild - 15G31 - CFBundleDevelopmentRegion - English - CFBundleExecutable - OCHamcrestIOS - CFBundleIdentifier - org.hamcrest.OCHamcrestIOS - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - OCHamcrestIOS - CFBundlePackageType - FMWK - CFBundleShortVersionString - 6.0.0 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - MacOSX - - CFBundleVersion - 6.0.0 - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 7D1014 - DTPlatformVersion - GM - DTSDKBuild - 15E60 - DTSDKName - macosx10.11 - DTXcode - 0731 - DTXcodeBuild - 7D1014 - NSHumanReadableCopyright - Copyright © 2016 hamcrest.org - - diff --git a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/Current b/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/Current deleted file mode 120000 index 8c7e5a667f..0000000000 --- a/Vendor/iOS/OCHamcrest/OCHamcrestIOS.framework/Versions/Current +++ /dev/null @@ -1 +0,0 @@ -A \ No newline at end of file diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Headers b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Headers deleted file mode 120000 index a177d2a6b9..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Headers +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Headers \ No newline at end of file diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/OCHamcrest b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/OCHamcrest deleted file mode 120000 index 7d4d801eb5..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/OCHamcrest +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/OCHamcrest \ No newline at end of file diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Resources b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Resources deleted file mode 120000 index 953ee36f3b..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Resources +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Resources \ No newline at end of file diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCAllOf.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCAllOf.h deleted file mode 100644 index 99dfb3ab31..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCAllOf.h +++ /dev/null @@ -1,64 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Calculates the logical conjunction of multiple matchers. - * @discussion Evaluation is shortcut, so subsequent matchers are not called if an earlier matcher - * returns NO. - */ -@interface HCAllOf : HCDiagnosingMatcher - -- (instancetype)initWithMatchers:(NSArray> *)matchers NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_allOfIn(NSArray> *matchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object matches all of the - * specified matchers. - * @param matchers An array of matchers. Any element that is not a matcher is implicitly wrapped in - * an equalTo matcher to check for equality. - * @discussion - * Example
        - *

        assertThat(\@"myValue", allOfIn(\@[startsWith(\@"my"), containsSubstring(\@"Val")]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_allOfIn instead. - */ -static inline id allOfIn(NSArray *matchers) -{ - return HC_allOfIn(matchers); -} -#endif - - -FOUNDATION_EXPORT id HC_allOf(id matchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object matches all of the - * specified matchers. - * @param matchers... A comma-separated list of matchers ending with nil. Any argument - * that is not a matcher is implicitly wrapped in an equalTo matcher to check for equality. - * @discussion - * Example
        - *
        assertThat(\@"myValue", allOf(startsWith(\@"my"), containsSubstring(\@"Val"), nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_allOf instead. - */ -#define allOf(matchers...) HC_allOf(matchers) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCAnyOf.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCAnyOf.h deleted file mode 100644 index cef32eaec5..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCAnyOf.h +++ /dev/null @@ -1,62 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Calculates the logical disjunction of multiple matchers. - * @discussion Evaluation is shortcut, so subsequent matchers are not called if an earlier matcher - * returns NO. - */ -@interface HCAnyOf : HCBaseMatcher - -- (instancetype)initWithMatchers:(NSArray> *)matchers NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - -FOUNDATION_EXPORT id HC_anyOfIn(NSArray *matchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object matches any of the - * specified matchers. - * @param matchers An array of matchers. Any element that is not a matcher is implicitly wrapped in - * an equalTo matcher to check for equality. - * @discussion - * Example
        - *
        assertThat(\@"myValue", allOf(\@[startsWith(\@"foo"), containsSubstring(\@"Val")]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_anyOf instead. - */ -static inline id anyOfIn(NSArray *matchers) -{ - return HC_anyOfIn(matchers); -} -#endif - -FOUNDATION_EXPORT id HC_anyOf(id matchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object matches any of the - * specified matchers. - * @param matchers... A comma-separated list of matchers ending with nil. Any argument - * that is not a matcher is implicitly wrapped in an equalTo matcher to check for equality. - * @discussion - * Example
        - *
        assertThat(\@"myValue", allOf(startsWith(\@"foo"), containsSubstring(\@"Val"), nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_anyOf instead. - */ -#define anyOf(matchers...) HC_anyOf(matchers) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCArgumentCaptor.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCArgumentCaptor.h deleted file mode 100644 index 80c6d00f44..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCArgumentCaptor.h +++ /dev/null @@ -1,44 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches anything, capturing all values. - * @discussion This matcher captures all values it was given to match, and always evaluates to - * YES. Use it to capture argument values for further assertions. - * - * Unlike other matchers, this matcher is not idempotent. It should be created outside of any - * expression so that it can be queried for the items it captured. - */ -@interface HCArgumentCaptor : HCIsAnything - -/*! - * @abstract Returns the captured value. - * @discussion If -matches: was called more than once then this property returns the - * last captured value. - * - * If -matches: was never invoked and so no value was captured, this property returns - * nil. But if nil was captured, this property returns NSNull. - */ -@property (nullable, nonatomic, readonly) id value; - -/*! - * @abstract Returns all captured values. - * @discussion Returns an array containing all captured values, in the order in which they were - * captured. nil values are converted to NSNull. - */ -@property (nonatomic, readonly) NSArray *allValues; - -/*! - * @abstract Determines whether subsequent matched values are captured. - * @discussion YES by default. - */ -@property (nonatomic, assign) BOOL captureEnabled; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCAssertThat.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCAssertThat.h deleted file mode 100644 index aa157a08ae..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCAssertThat.h +++ /dev/null @@ -1,96 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - -@protocol HCMatcher; - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @header - * Assertion macros for using matchers in testing frameworks. - * Unmet assertions are reported to the HCTestFailureReporterChain. - */ - - -FOUNDATION_EXPORT void HC_assertThatWithLocation(id testCase, _Nullable id actual, id matcher, - const char *fileName, int lineNumber); - -#define HC_assertThat(actual, matcher) \ - HC_assertThatWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThat(actual, matcher) - - * Asserts that actual value satisfies matcher. - * @param actual The object to evaluate as the actual value. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion assertThat passes the actual value to the matcher for evaluation. If the matcher is - * not satisfied, it is reported to the HCTestFailureReporterChain. - * - * Use assertThat in test case methods. It's designed to integrate with XCTest and other testing - * frameworks where individual tests are executed as methods. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThat instead. - */ -#define assertThat(actual, matcher) HC_assertThat(actual, matcher) -#endif - - -typedef _Nonnull id (^HCFutureValue)(); - -FOUNDATION_EXPORT void HC_assertWithTimeoutAndLocation(id testCase, NSTimeInterval timeout, - HCFutureValue actualBlock, id matcher, - const char *fileName, int lineNumber); - -#define HC_assertWithTimeout(timeout, actualBlock, matcher) \ - HC_assertWithTimeoutAndLocation(self, timeout, actualBlock, matcher, __FILE__, __LINE__) - -#define HC_thatEventually(actual) ^{ return actual; } - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertWithTimeout(timeout, actualBlock, matcher) - - * Asserts that a value provided by a block will satisfy matcher within the specified time. - * @param timeout Maximum time to wait for passing behavior, specified in seconds. - * @param actualBlock A block providing the object to repeatedly evaluate as the actual value. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion assertWithTimeout polls a value provided by a block to asynchronously - * satisfy the matcher. The block is evaluated repeatedly for an actual value, which is passed to - * the matcher for evaluation. If the matcher is not satisfied within the timeout, it is reported to - * the HCTestFailureReporterChain. - * - * An easy way of providing the actualBlock is to use the macro thatEventually. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertWithTimeout instead. -*/ -#define assertWithTimeout(timeout, actualBlock, matcher) HC_assertWithTimeout(timeout, actualBlock, matcher) - - -/*! - * @abstract thatEventually(actual) - - * Evaluates actual value at future time. - * @param actual The object to evaluate as the actual value. - * @discussion Wraps actual in a block so that it can be repeatedly evaluated by - * assertWithTimeout. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_thatEventually instead. - */ -#define thatEventually(actual) HC_thatEventually(actual) -#endif - - -/*! - * @abstract "Expected , but " - * @discussion Helper function to let you describe mismatches the way assertThat does. - */ -FOUNDATION_EXPORT NSString *HCDescribeMismatch(id matcher, id actual); - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCBaseDescription.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCBaseDescription.h deleted file mode 100644 index 40e9ff1269..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCBaseDescription.h +++ /dev/null @@ -1,29 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Base class for all HCDescription implementations. - */ -@interface HCBaseDescription : NSObject -@end - - -/*! - * @abstract Methods that must be provided by subclasses of HCBaseDescription. - */ -@interface HCBaseDescription (SubclassResponsibility) - -/*! - * @abstract Appends the specified string to the description. - */ -- (void)append:(NSString *)str; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCBaseMatcher.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCBaseMatcher.h deleted file mode 100644 index 61c4c0f27c..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCBaseMatcher.h +++ /dev/null @@ -1,25 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import -#import - -#define HC_ABSTRACT_METHOD [self subclassResponsibility:_cmd] - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Base class for all HCMatcher implementations. - * @discussion Simple matchers can just subclass HCBaseMatcher and implement -matches: - * and -describeTo:. But if the matching algorithm has several "no match" paths, - * consider subclassing HCDiagnosingMatcher instead. - */ -@interface HCBaseMatcher : NSObject - -/*! @abstract Raises exception that command (a pseudo-abstract method) is not implemented. */ -- (void)subclassResponsibility:(SEL)command; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCClassMatcher.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCClassMatcher.h deleted file mode 100644 index bb0b98b253..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCClassMatcher.h +++ /dev/null @@ -1,18 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -@interface HCClassMatcher : HCBaseMatcher - -@property (nonatomic, strong, readonly) Class theClass; - -- (instancetype)initWithClass:(Class)aClass NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCCollect.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCCollect.h deleted file mode 100644 index 8b828f3a46..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCCollect.h +++ /dev/null @@ -1,26 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - -#import - -@protocol HCMatcher; - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Returns an array of values from a variable-length comma-separated list terminated - * by nil. - */ -FOUNDATION_EXPORT NSArray * HCCollectItems(id item, va_list args); - -/*! - * @abstract Returns an array of matchers from a mixed array of items and matchers. - * @discussion Each item is wrapped in HCWrapInMatcher to transform non-matcher items into equality - * matchers. - */ -FOUNDATION_EXPORT NSArray> * HCWrapIntoMatchers(NSArray *items); - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCConformsToProtocol.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCConformsToProtocol.h deleted file mode 100644 index de76b60092..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCConformsToProtocol.h +++ /dev/null @@ -1,42 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt -// Contribution by Todd Farrell - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches objects that conform to specified protocol. - */ -@interface HCConformsToProtocol : HCBaseMatcher - -- (instancetype)initWithProtocol:(Protocol *)protocol NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_conformsTo(Protocol *aProtocol); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object conforms to the specified - * protocol. - * @param aProtocol The protocol to compare against as the expected protocol. - * @discussion - * Example
        - *
        assertThat(myObject, conformsTo(\@protocol(NSCoding))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_conformsTo instead. - */ -static inline id conformsTo(Protocol *aProtocol) -{ - return HC_conformsTo(aProtocol); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCDescribedAs.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCDescribedAs.h deleted file mode 100644 index 0597e1de78..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCDescribedAs.h +++ /dev/null @@ -1,41 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Provides a custom description to another matcher. - */ -@interface HCDescribedAs : HCBaseMatcher - -- (instancetype)initWithDescription:(NSString *)description - forMatcher:(id )matcher - overValues:(NSArray *)templateValues NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_describedAs(NSString *description, id matcher, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Wraps an existing matcher, overriding its description with that specified. All other - * functions are delegated to the decorated matcher, including its mismatch description. - * @param description The new description for the wrapped matcher. - * @param matcher The matcher to wrap, followed by a comma-separated list of substitution - * values ending with nil. - * @discussion The description may contain substitution placeholders %0, %1, etc. These will be - * replaced by any values that follow the matcher. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_describedAs instead. - */ -#define describedAs(description, matcher, ...) HC_describedAs(description, matcher, ##__VA_ARGS__) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCDescription.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCDescription.h deleted file mode 100644 index fde2c66edc..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCDescription.h +++ /dev/null @@ -1,39 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract A description of an HCMatcher. - * @discussion An HCMatcher will describe itself to a description which can later be used for reporting. - */ -@protocol HCDescription - -/*! - * @abstract Appends some plain text to the description. - * @return self, for chaining. - */ -- (id )appendText:(NSString *)text; - -/*! - * @abstract Appends description of specified value to description. - * @discussion If the value implements the HCSelfDescribing protocol, then it will be used. - * @return self, for chaining. - */ -- (id )appendDescriptionOf:(nullable id)value; - -/*! - * @abstract Appends a list of objects to the description. - * @return self, for chaining. - */ -- (id )appendList:(NSArray *)values - start:(NSString *)start - separator:(NSString *)separator - end:(NSString *)end; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCDiagnosingMatcher.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCDiagnosingMatcher.h deleted file mode 100644 index 2d659221c5..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCDiagnosingMatcher.h +++ /dev/null @@ -1,19 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Base class for matchers that generate mismatch descriptions during the matching. - * @discussion Some matching algorithms have several "no match" paths. It helps to make the mismatch - * description as precise as possible, but we don't want to have to repeat the matching logic to do - * so. For such matchers, subclass HCDiagnosingMatcher and implement HCMatcher's - * -matches:describingMismatchTo:. -*/ -@interface HCDiagnosingMatcher : HCBaseMatcher -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCEvery.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCEvery.h deleted file mode 100644 index 992f73afd5..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCEvery.h +++ /dev/null @@ -1,45 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if every item in a collection satisfies a nested matcher. - */ -@interface HCEvery : HCDiagnosingMatcher - -@property (nonatomic, strong, readonly) id matcher; - -- (instancetype)initWithMatcher:(id )matcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_everyItem(id itemMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when the examined collection's items are - * all matched by the specified matcher. - * @param itemMatcher The matcher to apply to every item provided by the examined collection. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. - * - * Example
        - *
        assertThat(\@[\@"bar", \@"baz"], everyItem(startsWith(\@"ba")))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_everyItem instead. - */ -static inline id everyItem(id itemMatcher) -{ - return HC_everyItem(itemMatcher); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCHasCount.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCHasCount.h deleted file mode 100644 index ba77ebe130..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCHasCount.h +++ /dev/null @@ -1,63 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if collection size satisfies a nested matcher. - */ -@interface HCHasCount : HCBaseMatcher - -- (instancetype)initWithMatcher:(id )countMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_hasCount(id countMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object's -count method - * returns a value that satisfies the specified matcher. - * @param countMatcher A matcher for the count of an examined collection. - * @discussion - * Example
        - *
        assertThat(\@[\@"foo", \@"bar"], hasCount(equalTo(@2)))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasCount instead. - */ -static inline id hasCount(id countMatcher) -{ - return HC_hasCount(countMatcher); -} -#endif - - -FOUNDATION_EXPORT id HC_hasCountOf(NSUInteger count); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object's -count method - * returns a value that equals the specified value. - * @param value Value to compare against as the expected count. - * @discussion - * Example
        - *
        assertThat(\@[\@"foo", \@"bar"], hasCountOf(2))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasCountOf instead. - */ -static inline id hasCountOf(NSUInteger value) -{ - return HC_hasCountOf(value); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCHasDescription.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCHasDescription.h deleted file mode 100644 index 31d0fdc3dc..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCHasDescription.h +++ /dev/null @@ -1,45 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches objects whose description satisfies a nested matcher. - */ -@interface HCHasDescription : HCInvocationMatcher - -- (instancetype)initWithDescription:(id )descriptionMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithInvocation:(NSInvocation *)anInvocation matching:(id )aMatcher NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_hasDescription(id descriptionMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object's -description - * satisfies the specified matcher. - * @param descriptionMatcher The matcher used to verify the description result, or an expected value - * for equalTo matching. - * @discussion If descriptionMatcher is not a matcher, it is implicitly wrapped in - * an equalTo matcher to check for equality. - * - * Examples
        - *
        assertThat(myObject, hasDescription(equalTo(\@"foo"))
        - *
        assertThat(myObject, hasDescription(\@"foo"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasDescription instead. - */ -static inline id hasDescription(id descriptionMatcher) -{ - return HC_hasDescription(descriptionMatcher); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCHasProperty.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCHasProperty.h deleted file mode 100644 index a805913ca5..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCHasProperty.h +++ /dev/null @@ -1,47 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt -// Contribution by Justin Shacklette - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches objects whose "property" (or simple method) satisfies a nested matcher. - */ -@interface HCHasProperty : HCDiagnosingMatcher - -- (instancetype)initWithProperty:(NSString *)propertyName value:(id )valueMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_hasProperty(NSString *propertyName, _Nullable id valueMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object has an instance method with the - * specified name whose return value satisfies the specified matcher. - * @param propertyName The name of an instance method without arguments that returns an object. - * @param valueMatcher The matcher to satisfy for the return value, or an expected value for - * equalTo matching. - * @discussion Note: While this matcher factory is called "hasProperty", it applies to the return - * values of any instance methods without arguments, not just properties. - * - * Examples
        - *
        assertThat(person, hasProperty(\@"firstName", equalTo(\@"Joe")))
        - *
        assertThat(person, hasProperty(\@"firstName", \@"Joe"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasProperty instead. - */ -static inline id hasProperty(NSString *propertyName, _Nullable id valueMatcher) -{ - return HC_hasProperty(propertyName, valueMatcher); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCInvocationMatcher.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCInvocationMatcher.h deleted file mode 100644 index ea4f89abd6..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCInvocationMatcher.h +++ /dev/null @@ -1,45 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Supporting class for matching a feature of an object. - * @discussion Tests whether the result of passing the specified invocation to the value satisfies - * the specified matcher. - */ -@interface HCInvocationMatcher : HCBaseMatcher -{ - NSInvocation *_invocation; - id _subMatcher; -} - -/*! - * @abstract Determines whether a mismatch will be described in short form. - * @discussion Default is long form, which describes the object, the name of the invocation, and the - * sub-matcher's mismatch diagnosis. Short form only has the sub-matcher's mismatch diagnosis. - */ -@property (nonatomic, assign) BOOL shortMismatchDescription; - -/*! - * @abstract Initializes a newly allocated HCInvocationMatcher with an invocation and a matcher. - */ -- (instancetype)initWithInvocation:(NSInvocation *)anInvocation matching:(id )aMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -/*! - * @abstract Invokes stored invocation on the specified item and returns the result. - */ -- (id)invokeOn:(id)item; - -/*! - * @abstract Returns string representation of the invocation's selector. - */ -- (NSString *)stringFromSelector; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIs.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIs.h deleted file mode 100644 index fc7fc2be6e..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIs.h +++ /dev/null @@ -1,55 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Decorates another matcher. - */ -@interface HCIs : HCBaseMatcher - -- (instancetype)initWithMatcher:(id )matcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_is(_Nullable id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Wraps an existing matcher, or provides a shortcut to the frequently - * used is(equalTo(x)). - * @param value The matcher to satisfy, or an expected value for equalTo matching. - * @discussion - * If valueis a matcher, its behavior is retained, but the test may be slightly more - * expressive. For example: - *
          - *
        • assertThat(\@(value), equalTo(\@5))
        • - *
        • assertThat(\@(value), is(equalTo(\@5)))
        • - *
        - * - * If valueis not a matcher, it is wrapped in an equalTo matcher. This makes the - * following statements equivalent: - *
          - *
        • assertThat(cheese, equalTo(smelly))
        • - *
        • assertThat(cheese, is(equalTo(smelly)))
        • - *
        • assertThat(cheese, is(smelly))
        • - *
        - * - * Choose the style that makes your expression most readable. This will vary depending on context. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_is instead. - */ -static inline id is(_Nullable id value) -{ - return HC_is(value); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsAnything.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsAnything.h deleted file mode 100644 index be7d1a7aea..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsAnything.h +++ /dev/null @@ -1,55 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches anything. - */ -@interface HCIsAnything : HCBaseMatcher - -- (instancetype)init; -- (instancetype)initWithDescription:(NSString *)description NS_DESIGNATED_INITIALIZER; - -@end - - -FOUNDATION_EXPORT id HC_anything(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that always matches, regardless of the examined object. - * @discussion - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_anything instead. - */ -static inline id anything(void) -{ - return HC_anything(); -} -#endif - - -FOUNDATION_EXPORT id HC_anythingWithDescription(NSString *description); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches anything, regardless of the examined object, but - * describes itself with the specified NSString. - * @param description A meaningful string used to describe this matcher. - * @discussion - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_anything instead. - */ -static inline id anythingWithDescription(NSString *description) -{ - return HC_anythingWithDescription(description); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCloseTo.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCloseTo.h deleted file mode 100644 index b2e7db7bda..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCloseTo.h +++ /dev/null @@ -1,43 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matchers numbers close to a value, within a delta range. - */ -@interface HCIsCloseTo : HCBaseMatcher - -- (instancetype)initWithValue:(double)value delta:(double)delta NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_closeTo(double value, double delta); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSNumbers that matches when the examined number is close to the - * specified value, within the specified delta. - * @param value The expected value of matching numbers. - * @param delta The delta within which matches will be allowed. - * @discussion Invokes -doubleValue on the examined number to get its value. - * - * Example
        - *
        assertThat(\@1.03, closeTo(1.0, 0.03)
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_closeTo instead. - */ -static inline id closeTo(double value, double delta) -{ - return HC_closeTo(value, delta); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionContaining.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionContaining.h deleted file mode 100644 index 5b08c7821b..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionContaining.h +++ /dev/null @@ -1,95 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if any item in a collection satisfies a nested matcher. - */ -@interface HCIsCollectionContaining : HCDiagnosingMatcher - -- (instancetype)initWithMatcher:(id )elementMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_hasItem(id itemMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract hasItem(itemMatcher) - - * Creates a matcher for collections that matches when at least one item in the examined collection - * satisfies the specified matcher. - * @param itemMatcher The matcher to apply to collection elements, or an expected value - * for equalTo matching. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. - * - * If itemMatcher is not a matcher, it is implicitly wrapped in an equalTo matcher - * to check for equality. - * - * Example
        - *
        assertThat(\@[\@1, \@2, \@3], hasItem(equalTo(\@2)))
        - * - *
        assertThat(\@[\@1, \@2, \@3], hasItem(\@2))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasItem instead. - */ -#define hasItem HC_hasItem -#endif - - -FOUNDATION_EXPORT id HC_hasItemsIn(NSArray *itemMatchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when all specified matchers are - * satisfied by any item in the examined collection. - * @param itemMatchers An array of matchers. Any element that is not a matcher is implicitly wrapped - * in an equalTo matcher to check for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing one pass for each matcher. - * - * Example
        - *
        assertThat(\@[\@"foo", \@"bar", \@"baz"], hasItems(\@[endsWith(\@"z"), endsWith(\@"o")]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasItemsIn instead. - */ -static inline id hasItemsIn(NSArray *itemMatchers) -{ - return HC_hasItemsIn(itemMatchers); -} -#endif - - -FOUNDATION_EXPORT id HC_hasItems(id itemMatchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when all specified matchers are - * satisfied by any item in the examined collection. - * @param itemMatchers... A comma-separated list of matchers ending with nil. - * Any argument that is not a matcher is implicitly wrapped in an equalTo matcher to check - * for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing one pass for each matcher. - * - * Example
        - *
        assertThat(\@[\@"foo", \@"bar", \@"baz"], hasItems(endsWith(\@"z"), endsWith(\@"o"), nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasItems instead. - */ -#define hasItems(itemMatchers...) HC_hasItems(itemMatchers) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionContainingInAnyOrder.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionContainingInAnyOrder.h deleted file mode 100644 index fe23a666c0..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionContainingInAnyOrder.h +++ /dev/null @@ -1,79 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if every item in a collection, in any order, satisfy a list of nested matchers. - */ -@interface HCIsCollectionContainingInAnyOrder : HCDiagnosingMatcher - -- (instancetype)initWithMatchers:(NSArray> *)itemMatchers NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_containsInAnyOrderIn(NSArray *itemMatchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates an order-agnostic matcher for collections that matches when each item in the - * examined collection satisfies one matcher anywhere in the specified list of matchers. - * @param itemMatchers An array of matchers. Any element that is not a matcher is implicitly wrapped - * in an equalTo matcher to check for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. For a positive match, the examined collection must be of the same - * length as the specified list of matchers. - * - * Note: Each matcher in the specified list will only be used once during a given examination, so - * be careful when specifying matchers that may be satisfied by more than one entry in an examined - * collection. - * - * Examples
        - *
        assertThat(\@[\@"foo", \@"bar"], containsInAnyOrderIn(\@[equalTo(\@"bar"), equalTo(\@"foo")]))
        - *
        assertThat(\@[\@"foo", \@"bar"], containsInAnyOrderIn(@[\@"bar", \@"foo"]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_containsInAnyOrderIn instead. - */ -static inline id containsInAnyOrderIn(NSArray *itemMatchers) -{ - return HC_containsInAnyOrderIn(itemMatchers); -} -#endif - - -FOUNDATION_EXPORT id HC_containsInAnyOrder(id itemMatchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates an order-agnostic matcher for collections that matches when each item in the - * examined collection satisfies one matcher anywhere in the specified list of matchers. - * @param itemMatchers... A comma-separated list of matchers ending with nil. - * Any argument that is not a matcher is implicitly wrapped in an equalTo matcher to check - * for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. For a positive match, the examined collection must be of the same - * length as the specified list of matchers. - * - * Note: Each matcher in the specified list will only be used once during a given examination, so - * be careful when specifying matchers that may be satisfied by more than one entry in an examined - * collection. - * - * Examples
        - *
        assertThat(\@[\@"foo", \@"bar"], containsInAnyOrder(equalTo(\@"bar"), equalTo(\@"foo"), nil))
        - *
        assertThat(\@[\@"foo", \@"bar"], containsInAnyOrder(\@"bar", \@"foo", nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_containsInAnyOrder instead. - */ -#define containsInAnyOrder(itemMatchers...) HC_containsInAnyOrder(itemMatchers) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionContainingInOrder.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionContainingInOrder.h deleted file mode 100644 index 825cc68b96..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionContainingInOrder.h +++ /dev/null @@ -1,71 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if every item in a collection satisfies a list of nested matchers, in order. - */ -@interface HCIsCollectionContainingInOrder : HCDiagnosingMatcher - -- (instancetype)initWithMatchers:(NSArray> *)itemMatchers NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_containsIn(NSArray *itemMatchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when each item in the examined - * collection satisfies the corresponding matcher in the specified list of matchers. - * @param itemMatchers An array of matchers. Any element that is not a matcher is implicitly wrapped - * in an equalTo matcher to check for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. For a positive match, the examined collection must be of the same - * length as the specified list of matchers. - * - * Examples
        - *
        assertThat(\@[\@"foo", \@"bar"], containsIn(\@[equalTo(\@"foo"), equalTo(\@"bar")]))
        - *
        assertThat(\@[\@"foo", \@"bar"], containsIn(\@[\@"foo", \@"bar"]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_containsIn instead.) - */ -static inline id containsIn(NSArray *itemMatchers) -{ - return HC_containsIn(itemMatchers); -} -#endif - - -FOUNDATION_EXPORT id HC_contains(id itemMatchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when each item in the examined - * collection satisfies the corresponding matcher in the specified list of matchers. - * @param itemMatchers... A comma-separated list of matchers ending with nil. - * Any argument that is not a matcher is implicitly wrapped in an equalTo matcher to check - * for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. For a positive match, the examined collection must be of the same - * length as the specified list of matchers. - * - * Examples
        - *
        assertThat(\@[\@"foo", \@"bar"], contains(equalTo(\@"foo"), equalTo(\@"bar"), nil))
        - *
        assertThat(\@[\@"foo", \@"bar"], contains(\@"foo", \@"bar", nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_contains instead.) - */ -#define contains(itemMatchers...) HC_contains(itemMatchers) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionContainingInRelativeOrder.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionContainingInRelativeOrder.h deleted file mode 100644 index 530cd74b63..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionContainingInRelativeOrder.h +++ /dev/null @@ -1,48 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if every item in a collection satisfies a list of nested matchers, in order. - */ -@interface HCIsCollectionContainingInRelativeOrder : HCDiagnosingMatcher - -- (instancetype)initWithMatchers:(NSArray> *)itemMatchers NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_containsInRelativeOrder(NSArray *itemMatchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when the examined collection contains - * items satisfying the specified list of matchers, in the same relative order. - * @param itemMatchers Array of matchers that must be satisfied by the items provided by the - * examined collection in the same relative order. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. - * - * Any element of itemMatchers that is not a matcher is implicitly wrapped in an - * equalTo matcher to check for equality. - * - * Examples
        - *
        assertThat(\@[\@1, \@2, \@3, \@4, \@5], containsInRelativeOrder(equalTo(\@2), equalTo(\@4)))
        - *
        assertThat(\@[\@1, \@2, \@3, \@4, \@5], containsInRelativeOrder(\@2, \@4))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_containsInRelativeOrder instead. - */ -static inline id containsInRelativeOrder(NSArray *itemMatchers) -{ - return HC_containsInRelativeOrder(itemMatchers); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionOnlyContaining.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionOnlyContaining.h deleted file mode 100644 index 9261fde0ce..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsCollectionOnlyContaining.h +++ /dev/null @@ -1,62 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if every item in a collection satisfies any of the nested matchers. - */ -@interface HCIsCollectionOnlyContaining : HCEvery -@end - -FOUNDATION_EXPORT id HC_onlyContainsIn(NSArray *itemMatchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when each item of the examined - * collection satisfies any of the specified matchers. - * @param itemMatchers An array of matchers. Any element that is not a matcher is implicitly wrapped - * in an equalTo matcher to check for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. Any matcher may match multiple elements. - * - * Example
        - *
        assertThat(\@[\@"Jon", \@"John", \@"Bob"], onlyContainsIn(\@[startsWith(\@"Jo"), startsWith(\@("Bo")]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_onlyContainsIn instead. - */ -static inline id onlyContainsIn(NSArray *itemMatchers) -{ - return HC_onlyContainsIn(itemMatchers); -} -#endif - - -FOUNDATION_EXPORT id HC_onlyContains(id itemMatchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when each item of the examined - * collection satisfies any of the specified matchers. - * @param itemMatchers... A comma-separated list of matchers ending with nil. - * Any argument that is not a matcher is implicitly wrapped in an equalTo matcher to check for - * equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. Any matcher may match multiple elements. - * - * Example
        - *
        assertThat(\@[\@"Jon", \@"John", \@"Bob"], onlyContains(startsWith(\@"Jo"), startsWith(\@("Bo"), nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_onlyContains instead. - */ -#define onlyContains(itemMatchers...) HC_onlyContains(itemMatchers) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsDictionaryContaining.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsDictionaryContaining.h deleted file mode 100644 index a29908490d..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsDictionaryContaining.h +++ /dev/null @@ -1,47 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if any entry in a dictionary satisfies the nested pair of matchers. - */ -@interface HCIsDictionaryContaining : HCBaseMatcher - -- (instancetype)initWithKeyMatcher:(id )keyMatcher - valueMatcher:(id )valueMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_hasEntry(id keyMatcher, id valueMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSDictionaries that matches when the examined dictionary contains - * at least one entry whose key satisfies the specified keyMatcher and whose - * value satisfies the specified valueMatcher. - * @param keyMatcher The matcher to satisfy for the key, or an expected value for equalTo matching. - * @param valueMatcher The matcher to satisfy for the value, or an expected value for equalTo matching. - * @discussion Any argument that is not a matcher is implicitly wrapped in an equalTo - * matcher to check for equality. - * - * Examples
        - *
        assertThat(myDictionary, hasEntry(equalTo(\@"foo"), equalTo(\@"bar")))
        - *
        assertThat(myDictionary, hasEntry(\@"foo", \@"bar"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasEntry instead. - */ -static inline id hasEntry(id keyMatcher, id valueMatcher) -{ - return HC_hasEntry(keyMatcher, valueMatcher); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsDictionaryContainingEntries.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsDictionaryContainingEntries.h deleted file mode 100644 index 1274355e9b..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsDictionaryContainingEntries.h +++ /dev/null @@ -1,68 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if dictionary contains entries that satisfy the list of keys and value - * matchers. - */ -@interface HCIsDictionaryContainingEntries : HCDiagnosingMatcher - -- (instancetype)initWithKeys:(NSArray *)keys - valueMatchers:(NSArray> *)valueMatchers NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - -FOUNDATION_EXPORT id HC_hasEntriesIn(NSDictionary *valueMatchersForKeys); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSDictionaries that matches when the examined dictionary contains - * entries satisfying a dictionary of keys and their value matchers. - * @param valueMatchersForKeys A dictionary of keys (not matchers) and their value matchers. Any - * value argument that is not a matcher is implicitly wrapped in an equalTo matcher to - * check for equality. - * @discussion - * Examples
        - *
        assertThat(personDict, hasEntriesIn(\@{\@"firstName": equalTo(\@"Jon"), \@"lastName": equalTo(\@"Reid")}))
        - *
        assertThat(personDict, hasEntriesIn(\@{\@"firstName": \@"Jon", \@"lastName": \@"Reid"}))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasEntryIn instead. - */ -static inline id hasEntriesIn(NSDictionary *valueMatchersForKeys) -{ - return HC_hasEntriesIn(valueMatchersForKeys); -} -#endif - -FOUNDATION_EXPORT id HC_hasEntries(id keysAndValueMatchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSDictionaries that matches when the examined dictionary contains - * entries satisfying a list of alternating keys and their value matchers. - * @param keysAndValueMatchers... A key (not a matcher) to look up, followed by a value matcher or - * an expected value for equalTo matching, in a comma-separated list ending - * with nil - * @discussion Note that the keys must be actual keys, not matchers. Any value argument that is not - * a matcher is implicitly wrapped in an equalTo matcher to check for equality. - * - * Examples
        - *
        assertThat(personDict, hasEntries(\@"firstName", equalTo(\@"Jon"), \@"lastName", equalTo(\@"Reid"), nil))
        - *
        assertThat(personDict, hasEntries(\@"firstName", \@"Jon", \@"lastName", \@"Reid", nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasEntry instead. - */ -#define hasEntries(keysAndValueMatchers...) HC_hasEntries(keysAndValueMatchers) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsDictionaryContainingKey.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsDictionaryContainingKey.h deleted file mode 100644 index eef1b5f41a..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsDictionaryContainingKey.h +++ /dev/null @@ -1,44 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if any entry in a dictionary has a key satisfying the nested matcher. - */ -@interface HCIsDictionaryContainingKey : HCBaseMatcher - -- (instancetype)initWithKeyMatcher:(id )keyMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_hasKey(id keyMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSDictionaries that matches when the examined dictionary contains - * at least key that satisfies the specified matcher. - * @param keyMatcher The matcher to satisfy for the key, or an expected value for equalTo matching. - * @discussion Any argument that is not a matcher is implicitly wrapped in an equalTo - * matcher to check for equality. - * - * Examples
        - *
        assertThat(myDictionary, hasEntry(equalTo(\@"foo")))
        - *
        assertThat(myDictionary, hasEntry(\@"foo"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasKey instead. - */ -static inline id hasKey(id keyMatcher) -{ - return HC_hasKey(keyMatcher); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsDictionaryContainingValue.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsDictionaryContainingValue.h deleted file mode 100644 index 9dfc68c727..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsDictionaryContainingValue.h +++ /dev/null @@ -1,46 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if any entry in a dictionary has a value satisfying the nested matcher. - */ -@interface HCIsDictionaryContainingValue : HCBaseMatcher - -- (instancetype)initWithValueMatcher:(id )valueMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_hasValue(id valueMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSDictionaries that matches when the examined dictionary contains - * at least value that satisfies the specified matcher. - * @param valueMatcher The matcher to satisfy for the value, or an expected value for equalTo matching. - * @discussion This matcher works on any collection that has an -allValues method. - * - * Any argument that is not a matcher is implicitly wrapped in an equalTo matcher to check - * for equality. - * - * Examples
        - *
        assertThat(myDictionary, hasValue(equalTo(\@"bar")))
        - *
        assertThat(myDictionary, hasValue(\@"bar"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasValue instead. - */ -static inline id hasValue(id valueMatcher) -{ - return HC_hasValue(valueMatcher); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEmptyCollection.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEmptyCollection.h deleted file mode 100644 index ed495ff2ae..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEmptyCollection.h +++ /dev/null @@ -1,39 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches empty collections. - */ -@interface HCIsEmptyCollection : HCHasCount - -- (instancetype)init; - -@end - - -FOUNDATION_EXPORT id HC_isEmpty(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches any examined object whose -count method - * returns zero. - * - * Example
        - *
        assertThat(\@[], isEmpty())
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isEmpty instead. - */ -static inline id isEmpty(void) -{ - return HC_isEmpty(); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEqual.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEqual.h deleted file mode 100644 index 27bf90be48..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEqual.h +++ /dev/null @@ -1,41 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Is the value equal to another value, as tested by the -isEqual: method? - */ -@interface HCIsEqual : HCBaseMatcher - -- (instancetype)initEqualTo:(nullable id)expectedValue NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_equalTo(_Nullable id operand); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to the specified - * object, as determined by calling the -isEqual: method on the examined object. - * @param operand The object to compare against as the expected value. - * @discussion If the specified operand is nil, then the created matcher will match if - * the examined object itself is nil, or if the examined object's -isEqual: - * method returns YES when passed a nil. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalTo instead. - */ -static inline id equalTo(_Nullable id operand) -{ - return HC_equalTo(operand); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEqualCompressingWhiteSpace.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEqualCompressingWhiteSpace.h deleted file mode 100644 index 1354feb36d..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEqualCompressingWhiteSpace.h +++ /dev/null @@ -1,46 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Tests if a string is equal to another string, when whitespace differences are (mostly) ignored. - */ -@interface HCIsEqualCompressingWhiteSpace : HCBaseMatcher - -- (instancetype)initWithString:(NSString *)string NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_equalToCompressingWhiteSpace(NSString *expectedString); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSStrings that matches when the examined string is equal to the - * specified expected string, when whitespace differences are (mostly) ignored. - * @param expectedString The expected value of matched strings. (Must not be nil.) - * @discussion To be exact, the following whitespace rules are applied: - *
          - *
        • all leading and trailing whitespace of both the expectedString and the examined string are ignored
        • - *
        • any remaining whitespace, appearing within either string, is collapsed to a single space before comparison
        • - *
        - * - * Example
        - *
        assertThat(\@"   my\tfoo  bar ", equalToCompressingWhiteSpace(\@" my  foo bar"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToCompressingWhiteSpace instead. - */ -static inline id equalToCompressingWhiteSpace(NSString *expectedString) -{ - return HC_equalToCompressingWhiteSpace(expectedString); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEqualIgnoringCase.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEqualIgnoringCase.h deleted file mode 100644 index 06ed44a8fb..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEqualIgnoringCase.h +++ /dev/null @@ -1,41 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Tests if a string is equal to another string, regardless of the case. - */ -@interface HCIsEqualIgnoringCase : HCBaseMatcher - -- (instancetype)initWithString:(NSString *)string NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_equalToIgnoringCase(NSString *expectedString); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSStrings that matches when the examined string is equal to the - * specified expected string, ignoring case differences. - * @param expectedString The expected value of matched strings. (Must not be nil.) - * @discussion - * Example
        - *
        assertThat(\@"Foo", equalToIgnoringCase(\@"FOO"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToIgnoringCase instead. - */ -static inline id equalToIgnoringCase(NSString *expectedString) -{ - return HC_equalToIgnoringCase(expectedString); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEqualToNumber.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEqualToNumber.h deleted file mode 100644 index aae8f4b8e3..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsEqualToNumber.h +++ /dev/null @@ -1,289 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -FOUNDATION_EXPORT id HC_equalToChar(char value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified char value. - * @param value The char value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToChar instead. - */ -static inline id equalToChar(char value) -{ - return HC_equalToChar(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToDouble(double value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified double value. - * @param value The double value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToDouble instead. - */ -static inline id equalToDouble(double value) -{ - return HC_equalToDouble(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToFloat(float value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified float value. - * @param value The float value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToFloat instead. - */ -static inline id equalToFloat(float value) -{ - return HC_equalToFloat(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToInt(int value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified int value. - * @param value The int value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToInt instead. - */ -static inline id equalToInt(int value) -{ - return HC_equalToInt(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToLong(long value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified long value. - * @param value The long value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToLong instead. - */ -static inline id equalToLong(long value) -{ - return HC_equalToLong(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToLongLong(long long value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified long long value. - * @param value The long long value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToLongLong instead. - */ -static inline id equalToLongLong(long long value) -{ - return HC_equalToLongLong(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToShort(short value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified short value. - * @param value The short value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToShort instead. - */ -static inline id equalToShort(short value) -{ - return HC_equalToShort(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedChar(unsigned char value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract equalToUnsignedChar(value) - - * Creates a matcher that matches when the examined object is equal to an NSNumber created from the - * specified unsigned char value. - * @param value The unsigned char value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedChar instead. - */ -static inline id equalToUnsignedChar(unsigned char value) -{ - return HC_equalToUnsignedChar(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedInt(unsigned int value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified unsigned int value. - * @param value The unsigned int value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedInt instead. - */ -static inline id equalToUnsignedInt(unsigned int value) -{ - return HC_equalToUnsignedInt(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedLong(unsigned long value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified unsigned long value. - * @param value The unsigned long value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedLong instead. - */ -static inline id equalToUnsignedLong(unsigned long value) -{ - return HC_equalToUnsignedLong(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedLongLong(unsigned long long value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified unsigned long long value. - * @param value The unsigned long long value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedLongLong instead. - */ -static inline id equalToUnsignedLongLong(unsigned long long value) -{ - return HC_equalToUnsignedLongLong(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedShort(unsigned short value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified unsigned short value. - * @param value The unsigned short value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedShort instead. - */ -static inline id equalToUnsignedShort(unsigned short value) -{ - return HC_equalToUnsignedShort(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToInteger(NSInteger value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified NSInteger value. - * @param value The NSInteger value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToInteger instead. - */ -static inline id equalToInteger(NSInteger value) -{ - return HC_equalToInteger(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedInteger(NSUInteger value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified NSUInteger value. - * @param value The NSUInteger value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedInteger instead. - */ -static inline id equalToUnsignedInteger(NSUInteger value) -{ - return HC_equalToUnsignedInteger(value); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsIn.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsIn.h deleted file mode 100644 index 4c8ed30bae..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsIn.h +++ /dev/null @@ -1,43 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if examined object is contained within the nested collection. - */ -@interface HCIsIn : HCBaseMatcher - -- (instancetype)initWithCollection:(id)collection NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_isIn(id aCollection); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is found within the specified - * collection. - * @param aCollection The collection to search. - * @discussion Invokes -containsObject: on aCollection to determine if the - * examined object is an element of the collection. - * - * Example
        - *
        assertThat(\@"foo", isIn(\@@[\@"bar", \@"foo"]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isIn instead. - */ -static inline id isIn(id aCollection) -{ - return HC_isIn(aCollection); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsInstanceOf.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsInstanceOf.h deleted file mode 100644 index faae9aeab5..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsInstanceOf.h +++ /dev/null @@ -1,37 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches objects that are of a given class or any subclass. - */ -@interface HCIsInstanceOf : HCClassMatcher -@end - - -FOUNDATION_EXPORT id HC_instanceOf(Class expectedClass); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is an instance of, or inherits - * from, the specified class. - * @param expectedClass The class to compare against as the expected class. - * @discussion - * Example
        - *
        assertThat(canoe, instanceOf([Canoe class]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_instanceOf instead. - */ -static inline id instanceOf(Class expectedClass) -{ - return HC_instanceOf(expectedClass); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsNil.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsNil.h deleted file mode 100644 index 661f83e427..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsNil.h +++ /dev/null @@ -1,55 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Is the value nil? - */ -@interface HCIsNil : HCBaseMatcher -@end - - -FOUNDATION_EXPORT id HC_nilValue(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is nil. - * @discussion - * Example
        - *
        assertThat(myObject, nilValue())
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_nilValue instead. - */ -static inline id nilValue(void) -{ - return HC_nilValue(); -} -#endif - - -FOUNDATION_EXPORT id HC_notNilValue(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is not nil. - * @discussion - * Example
        - *
        assertThat(myObject, notNilValue())
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_notNilValue instead. - */ -static inline id notNilValue(void) -{ - return HC_notNilValue(); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsNot.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsNot.h deleted file mode 100644 index 7c0a28de74..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsNot.h +++ /dev/null @@ -1,44 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Calculates the logical negation of a matcher. - */ -@interface HCIsNot : HCBaseMatcher - -- (instancetype)initWithMatcher:(id )matcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_isNot(_Nullable id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that wraps an existing matcher, but inverts the logic by which it - * will match. - * @param value The matcher to negate, or an expected value to match for inequality. - * @discussion If value is not a matcher, it is implicitly wrapped in an equalTo - * matcher to check for equality, and thus matches for inequality. - * - * Examples
        - *
        assertThat(cheese, isNot(equalTo(smelly)))
        - *
        assertThat(cheese, isNot(smelly))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isNot instead. - */ -static inline id isNot(_Nullable id value) -{ - return HC_isNot(value); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsSame.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsSame.h deleted file mode 100644 index d0ee4106f7..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsSame.h +++ /dev/null @@ -1,41 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Is the value the same object as another value? - */ -@interface HCIsSame : HCBaseMatcher - -- (instancetype)initSameAs:(nullable id)object NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_sameInstance(_Nullable id expectedInstance); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches only when the examined object is the same instance as - * the specified target object. - * @param expectedInstance The expected instance. - * @discussion - * Example
        - *
        assertThat(delegate, sameInstance(expectedDelegate))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_sameInstance instead. - */ -static inline id sameInstance(_Nullable id expectedInstance) -{ - return HC_sameInstance(expectedInstance); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsTrueFalse.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsTrueFalse.h deleted file mode 100644 index 9cc6364072..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsTrueFalse.h +++ /dev/null @@ -1,55 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches true values. - */ -@interface HCIsTrue : HCBaseMatcher -@end - -/*! - * @abstract Matches false values. - */ -@interface HCIsFalse : HCBaseMatcher -@end - - -FOUNDATION_EXPORT id HC_isTrue(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is an non-zero NSNumber. - * @discussion - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isTrue instead. - */ -static inline id isTrue(void) -{ - return HC_isTrue(); -} -#endif - - -FOUNDATION_EXPORT id HC_isFalse(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is NSNumber zero. - * @discussion - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isFalse instead. -*/ -static inline id isFalse(void) -{ - return HC_isFalse(); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsTypeOf.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsTypeOf.h deleted file mode 100644 index 00612f0ad2..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCIsTypeOf.h +++ /dev/null @@ -1,37 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches objects that are of a given class. - */ -@interface HCIsTypeOf : HCClassMatcher -@end - - -FOUNDATION_EXPORT id HC_isA(Class expectedClass); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is an instance of the specified - * class, but not of any subclass. - * @param expectedClass The class to compare against as the expected class. - * @discussion - * Example
        - *
        assertThat(canoe, isA([Canoe class]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isA instead. - */ -static inline id isA(Class expectedClass) -{ - return HC_isA(expectedClass); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCMatcher.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCMatcher.h deleted file mode 100644 index 1bc8405af5..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCMatcher.h +++ /dev/null @@ -1,47 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import "HCSelfDescribing.h" - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract A matcher over acceptable values. - * @discussion A matcher is able to describe itself to give feedback when it fails. - * - * HCMatcher implementations should not directly implement this protocol. Instead, extend the - * HCBaseMatcher class, which will ensure that the HCMatcher API can grow to support new features - * and remain compatible with all HCMatcher implementations. - */ -@protocol HCMatcher - -/*! - * @abstract Evaluates the matcher for argument item. - * @param item The object against which the matcher is evaluated. - * @return YES if item matches, otherwise NO. - */ -- (BOOL)matches:(nullable id)item; - -/*! - * @abstract Evaluates the matcher for argument item. - * @param item The object against which the matcher is evaluated. - * @param mismatchDescription The description to be built or appended to if item does not match. - * @return YES if item matches, otherwise NO. - */ -- (BOOL)matches:(nullable id)item describingMismatchTo:(nullable id )mismatchDescription; - -/*! - * @abstract Generates a description of why the matcher has not accepted the item. - * @param item The item that the HCMatcher has rejected. - * @param mismatchDescription The description to be built or appended to. - * @discussion The description will be part of a larger description of why a matching failed, so it - * should be concise. - * - * This method assumes that matches:item is false, but will not check this. - */ -- (void)describeMismatchOf:(nullable id)item to:(nullable id )mismatchDescription; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCNumberAssert.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCNumberAssert.h deleted file mode 100644 index 8bb5c86306..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCNumberAssert.h +++ /dev/null @@ -1,340 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - -@protocol HCMatcher; - - -NS_ASSUME_NONNULL_BEGIN - -FOUNDATION_EXPORT void HC_assertThatBoolWithLocation(id testCase, BOOL actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatBool(actual, matcher) \ - HC_assertThatBoolWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatBool(actual, matcher) - - * Asserts that BOOL actual value, converted to an NSNumber, satisfies matcher. - * @param actual The BOOL value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatBool instead. - */ -#define assertThatBool(actual, matcher) HC_assertThatBool(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatCharWithLocation(id testCase, char actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatChar(actual, matcher) \ - HC_assertThatCharWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatChar(actual, matcher) - - * Asserts that char actual value, converted to an NSNumber, satisfies matcher. - * @param actual The char value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatChar instead. - */ -#define assertThatChar(actual, matcher) HC_assertThatChar(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatDoubleWithLocation(id testCase, double actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatDouble(actual, matcher) \ - HC_assertThatDoubleWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract HC_assertThatDouble(actual, matcher) - - * Asserts that double actual value, converted to an NSNumber, satisfies matcher. - * @param actual The double value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatDouble instead. - */ -#define assertThatDouble(actual, matcher) HC_assertThatDouble(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatFloatWithLocation(id testCase, float actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatFloat(actual, matcher) \ - HC_assertThatFloatWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatFloat(actual, matcher) - - * Asserts that float actual value, converted to an NSNumber, satisfies matcher. - * @param actual The float value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatFloat instead. - */ -#define assertThatFloat(actual, matcher) HC_assertThatFloat(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatIntWithLocation(id testCase, int actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatInt(actual, matcher) \ - HC_assertThatIntWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatInt(actual, matcher) - - * Asserts that int actual value, converted to an NSNumber, satisfies matcher. - * @param actual The int value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatInt instead. - */ -#define assertThatInt(actual, matcher) HC_assertThatInt(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatLongWithLocation(id testCase, long actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatLong(actual, matcher) \ - HC_assertThatLongWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatLong(actual, matcher) - - * Asserts that long actual value, converted to an NSNumber, satisfies matcher. - * @param actual The long value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatLong instead. - */ -#define assertThatLong(actual, matcher) HC_assertThatLong(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatLongLongWithLocation(id testCase, long long actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatLongLong(actual, matcher) \ - HC_assertThatLongLongWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatLongLong(actual, matcher) - - * Asserts that long long actual value, converted to an NSNumber, satisfies matcher. - * @param actual The long long value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatLongLong instead. - */ -#define assertThatLongLong(actual, matcher) HC_assertThatLongLong(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatShortWithLocation(id testCase, short actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatShort(actual, matcher) \ - HC_assertThatShortWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatShort(actual, matcher) - - * Asserts that short actual value, converted to an NSNumber, satisfies matcher. - * @param actual The short value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatShort instead. - */ -#define assertThatShort(actual, matcher) HC_assertThatShort(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedCharWithLocation(id testCase, unsigned char actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedChar(actual, matcher) \ - HC_assertThatUnsignedCharWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedChar(actual, matcher) - - * Asserts that unsigned char actual value, converted to an NSNumber, satisfies matcher. - * @param actual The unsigned char value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedChar instead. - */ -#define assertThatUnsignedChar(actual, matcher) HC_assertThatUnsignedChar(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedIntWithLocation(id testCase, unsigned int actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedInt(actual, matcher) \ - HC_assertThatUnsignedIntWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedInt(actual, matcher) - - * Asserts that unsigned int actual value, converted to an NSNumber, satisfies matcher. - * @param actual The unsigned int value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedInt instead. - */ -#define assertThatUnsignedInt(actual, matcher) HC_assertThatUnsignedInt(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedLongWithLocation(id testCase, unsigned long actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedLong(actual, matcher) \ - HC_assertThatUnsignedLongWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedLong(actual, matcher) - - * Asserts that unsigned long actual value, converted to an NSNumber, satisfies matcher. - * @param actual The unsigned long value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedLong instead. - */ -#define assertThatUnsignedLong(actual, matcher) HC_assertThatUnsignedLong(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedLongLongWithLocation(id testCase, unsigned long long actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedLongLong(actual, matcher) \ - HC_assertThatUnsignedLongLongWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedLongLong(actual, matcher) - - * Asserts that unsigned long long actual value, converted to an NSNumber, satisfies matcher. - * @param actual The unsigned long long value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedLongLong instead. - */ -#define assertThatUnsignedLongLong(actual, matcher) HC_assertThatUnsignedLongLong(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedShortWithLocation(id testCase, unsigned short actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedShort(actual, matcher) \ - HC_assertThatUnsignedShortWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedShort(actual, matcher) - - * Asserts that unsigned short actual value, converted to an NSNumber, satisfies matcher. - * @param actual The unsigned short value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedShort instead. - */ -#define assertThatUnsignedShort(actual, matcher) HC_assertThatUnsignedShort(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatIntegerWithLocation(id testCase, NSInteger actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatInteger(actual, matcher) \ - HC_assertThatIntegerWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatInteger(actual, matcher) - - * Asserts that NSInteger actual value, converted to an NSNumber, satisfies matcher. - * @param actual The NSInteger value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatInteger instead. - */ -#define assertThatInteger(actual, matcher) HC_assertThatInteger(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedIntegerWithLocation(id testCase, NSUInteger actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedInteger(actual, matcher) \ - HC_assertThatUnsignedIntegerWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedInteger(actual, matcher) - - * Asserts that NSUInteger actual value, converted to an NSNumber, satisfies matcher. - * @param actual The NSUInteger value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedInteger instead. - */ -#define assertThatUnsignedInteger(actual, matcher) HC_assertThatUnsignedInteger(actual, matcher) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCOrderingComparison.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCOrderingComparison.h deleted file mode 100644 index da489c9ecc..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCOrderingComparison.h +++ /dev/null @@ -1,114 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches values with -compare:. - */ -@interface HCOrderingComparison : HCBaseMatcher - -- (instancetype)initComparing:(id)expectedValue - minCompare:(NSComparisonResult)min - maxCompare:(NSComparisonResult)max - comparisonDescription:(NSString *)comparisonDescription NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_greaterThan(id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is greater than the specified - * value, as reported by the -compare: method of the examined object. - * @param value The value which, when passed to the -compare: method of the examined - * object, should return NSOrderedAscending. - * @discussion - * Example
        - *
        assertThat(\@2, greaterThan(\@1))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_greaterThan instead. - */ -static inline id greaterThan(id value) -{ - return HC_greaterThan(value); -} -#endif - - -FOUNDATION_EXPORT id HC_greaterThanOrEqualTo(id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is greater than or equal to the - * specified value, as reported by the -compare: method of the examined object. - * @param value The value which, when passed to the -compare: method of the examined - * object, should return NSOrderedAscending or NSOrderedSame. - * @discussion - * Example
        - *
        assertThat(\@1, greaterThanOrEqualTo(\@1))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_greaterThanOrEqualTo instead. - */ -static inline id greaterThanOrEqualTo(id value) -{ - return HC_greaterThanOrEqualTo(value); -} -#endif - - -FOUNDATION_EXPORT id HC_lessThan(id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is less than the specified - * value, as reported by the -compare: method of the examined object. - * @param value The value which, when passed to the -compare: method of the examined - * object, should return NSOrderedDescending. - * @discussion - * Example
        - *
        assertThat(\@1, lessThan(\@2))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_lessThan instead. - */ -static inline id lessThan(id value) -{ - return HC_lessThan(value); -} -#endif - - -FOUNDATION_EXPORT id HC_lessThanOrEqualTo(id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is less than or equal to the - * specified value, as reported by the -compare: method of the examined object. - * @param value The value which, when passed to the -compare: method of the examined - * object, should return NSOrderedDescending or NSOrderedSame. - * @discussion - * Example
        - *
        assertThat(\@1, lessThanOrEqualTo(\@1))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_lessThanOrEqualTo instead. - */ -static inline id lessThanOrEqualTo(id value) -{ - return HC_lessThanOrEqualTo(value); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCRequireNonNilObject.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCRequireNonNilObject.h deleted file mode 100644 index 606cf74714..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCRequireNonNilObject.h +++ /dev/null @@ -1,14 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Throws an NSException if obj is nil. -*/ -FOUNDATION_EXPORT void HCRequireNonNilObject(id obj); - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCSelfDescribing.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCSelfDescribing.h deleted file mode 100644 index f40edce9dd..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCSelfDescribing.h +++ /dev/null @@ -1,26 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - -#import "HCDescription.h" // Convenience header - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract The ability of an object to describe itself. - */ -@protocol HCSelfDescribing - -/*! - * @abstract Generates a description of the object. - * @param description The description to be built or appended to. - * @discussion The description may be part of a description of a larger object of which this is just - * a component, so it should be worded appropriately. - */ -- (void)describeTo:(id )description; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringContains.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringContains.h deleted file mode 100644 index 029509f7e8..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringContains.h +++ /dev/null @@ -1,39 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Tests if string that contains a substring. - */ -@interface HCStringContains : HCSubstringMatcher -@end - - -FOUNDATION_EXPORT id HC_containsSubstring(NSString *substring); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is a string containing the - * specified substring anywhere. - * @param substring The string to search for. (Must not be nil.) - * @discussion The matcher invokes -rangeOfString: on the examined object, passing the - * specified substring and matching if it is found. - * - * Example
        - *
        assertThat(\@"myStringOfNote", containsSubstring(\@"ring"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_containsSubstring instead. - */ -static inline id containsSubstring(NSString *substring) -{ - return HC_containsSubstring(substring); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringContainsInOrder.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringContainsInOrder.h deleted file mode 100644 index 6a7d0c68a1..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringContainsInOrder.h +++ /dev/null @@ -1,62 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Tests if string that contains a list of substrings in relative order. - */ -@interface HCStringContainsInOrder : HCBaseMatcher - -- (instancetype)initWithSubstrings:(NSArray *)substrings NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_stringContainsInOrderIn(NSArray *substrings); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates matcher for NSStrings that matches when the examined string contains all of the - * specified substrings, considering the order of their appearance. - * @param substrings An array of strings. - * @discussion - * Example
        - *
        assertThat(\@"myfoobarbaz", stringContainsInOrderIn(\@[\@"bar", \@"foo"]))
        - * fails as "foo" occurs before "bar" in the string "myfoobarbaz" - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_stringContainsInOrderIn instead. - */ -static inline id stringContainsInOrderIn(NSArray *substrings) -{ - return HC_stringContainsInOrderIn(substrings); -} -#endif - - -FOUNDATION_EXPORT id HC_stringContainsInOrder(NSString *substrings, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates matcher for NSStrings that matches when the examined string contains all of the - * specified substrings, considering the order of their appearance. - * @param substrings... A comma-separated list of strings, ending with nil. - * @discussion - * Example
        - *
        assertThat(\@"myfoobarbaz", stringContainsInOrder(\@"bar", \@"foo", nil))
        - * fails as "foo" occurs before "bar" in the string "myfoobarbaz" - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_stringContainsInOrder instead. - */ -#define stringContainsInOrder(substrings...) HC_stringContainsInOrder(substrings) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringDescription.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringDescription.h deleted file mode 100644 index 07825d2c03..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringDescription.h +++ /dev/null @@ -1,38 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - -@protocol HCSelfDescribing; - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract An HCDescription that is stored as a string. - */ -@interface HCStringDescription : HCBaseDescription -{ - NSMutableString *accumulator; -} - -/*! - * @abstract Returns the description of an HCSelfDescribing object as a string. - * @param selfDescribing The object to be described. - * @return The description of the object. - */ -+ (NSString *)stringFrom:(id )selfDescribing; - -/*! - * @abstract Creates and returns an empty description. - */ -+ (instancetype)stringDescription; - -/*! - * @abstract Initializes a newly allocated HCStringDescription that is initially empty. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringEndsWith.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringEndsWith.h deleted file mode 100644 index 8ace606540..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringEndsWith.h +++ /dev/null @@ -1,40 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Tests if string ends with a substring. - */ -@interface HCStringEndsWith : HCSubstringMatcher -@end - - -FOUNDATION_EXPORT id HC_endsWith(NSString *suffix); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is a string that ends with the - * specified string. - * @param suffix The substring that the returned matcher will expect at the end of any examined - * string. (Must not be nil.) - * @discussion The matcher invokes -hasSuffix: on the examined object, passing the - * specified suffix. - * - * Example
        - *
        assertThat(\@"myStringOfNote", endsWith(\@"Note"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_endsWith instead. - */ -static inline id endsWith(NSString *suffix) -{ - return HC_endsWith(suffix); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringStartsWith.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringStartsWith.h deleted file mode 100644 index 6caa4d22eb..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCStringStartsWith.h +++ /dev/null @@ -1,40 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Tests string starts with a substring. - */ -@interface HCStringStartsWith : HCSubstringMatcher -@end - - -FOUNDATION_EXPORT id HC_startsWith(NSString *prefix); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is a string that starts with - * the specified string. - * @param prefix The substring that the returned matcher will expect at the start of any examined - * string. (Must not be nil.) - * @discussion The matcher invokes -hasPrefix: on the examined object, passing the - * specified prefix. - * - * Example
        - *
        assertThat(\@"myStringOfNote", startsWith(\@"my"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_startsWith instead. - */ -static inline id startsWith(NSString *prefix) -{ - return HC_startsWith(prefix); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCSubstringMatcher.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCSubstringMatcher.h deleted file mode 100644 index 94bb6da37b..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCSubstringMatcher.h +++ /dev/null @@ -1,18 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -@interface HCSubstringMatcher : HCBaseMatcher - -@property (nonatomic, copy, readonly) NSString *substring; - -- (instancetype)initWithSubstring:(NSString *)substring NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCTestFailure.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCTestFailure.h deleted file mode 100644 index e40e54bc57..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCTestFailure.h +++ /dev/null @@ -1,42 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - @abstract Test failure location and reason. - */ -@interface HCTestFailure : NSObject - -/*! - * @abstract Test case used to run test method. - * @discussion Can be nil. - * - * For unmet OCHamcrest assertions, if the assertion was assertThat or - * assertWithTimeout, testCase will be the test case instance. - */ -@property (nonatomic, strong, readonly) id testCase; - -/*! @abstract File name to report. */ -@property (nonatomic, copy, readonly) NSString *fileName; - -/*! @abstract Line number to report. */ -@property (nonatomic, assign, readonly) NSUInteger lineNumber; - -/*! @abstract Failure reason to report. */ -@property (nonatomic, strong, readonly) NSString *reason; - -/*! - * @abstract Initializes a newly allocated instance of a test failure. - */ -- (instancetype)initWithTestCase:(id)testCase - fileName:(NSString *)fileName - lineNumber:(NSUInteger)lineNumber - reason:(NSString *)reason; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCTestFailureReporter.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCTestFailureReporter.h deleted file mode 100644 index b54a4afdbf..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCTestFailureReporter.h +++ /dev/null @@ -1,25 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - -@class HCTestFailure; - - -NS_ASSUME_NONNULL_BEGIN - -/*! - Chain-of-responsibility for handling test failures. - */ -@interface HCTestFailureReporter : NSObject - -@property (nullable, nonatomic, strong) HCTestFailureReporter *successor; - -/*! - Handle test failure at specific location, or pass to successor. - */ -- (void)handleFailure:(HCTestFailure *)failure; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCTestFailureReporterChain.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCTestFailureReporterChain.h deleted file mode 100644 index 37e5651150..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCTestFailureReporterChain.h +++ /dev/null @@ -1,36 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - -@class HCTestFailureReporter; - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Manage chain-of-responsibility for reporting test failures. - * @discussion This provides a generic way of reporting test failures without knowing about the - * underlying test framework. By default, we try XCTest first, then SenTestingKit. If we run out of - * options, the final catch-all is to throw an NSException describing the test failure. - */ -@interface HCTestFailureReporterChain : NSObject - -/*! - * @abstract Returns current chain of test failure reporters. - */ -+ (HCTestFailureReporter *)reporterChain; - -/*! - * @abstract Adds specified test failure reporter to head of chain-of-responsibility. - */ -+ (void)addReporter:(HCTestFailureReporter *)reporter; - -/*! - * @abstract Resets chain-of-responsibility to default. - */ -+ (void)reset; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCThrowsException.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCThrowsException.h deleted file mode 100644 index 6c9d360464..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCThrowsException.h +++ /dev/null @@ -1,41 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Does executing a block throw an exception which satisfies a nested matcher? - */ -@interface HCThrowsException : HCDiagnosingMatcher - -- (id)initWithExceptionMatcher:(id)exceptionMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_throwsException(id exceptionMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is a block which, when - * executed, throws an exception satisfying the specified matcher. - * @param exceptionMatcher The matcher to satisfy when passed the exception. - * @discussion - * Example
        - *
        assertThat(^{ [obj somethingBad]; }, throwsException(hasProperty(@"reason", @"EXPECTED REASON")))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_throwsException instead. - */ -static inline id throwsException(id exceptionMatcher) -{ - return HC_throwsException(exceptionMatcher); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCWrapInMatcher.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCWrapInMatcher.h deleted file mode 100644 index 2b58f9b975..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/HCWrapInMatcher.h +++ /dev/null @@ -1,17 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - -@protocol HCMatcher; - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Wraps argument in a matcher, if necessary. - * @return The argument as-is if it is already a matcher, otherwise wrapped in an equalTo matcher. - */ -FOUNDATION_EXPORT _Nullable id HCWrapInMatcher(_Nullable id matcherOrValue); - -NS_ASSUME_NONNULL_END diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/OCHamcrest.h b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/OCHamcrest.h deleted file mode 100644 index ffe215234d..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Headers/OCHamcrest.h +++ /dev/null @@ -1,54 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -// Carthage workaround: Include transitive public headers -#import -#import -#import -#import -#import diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/OCHamcrest b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/OCHamcrest deleted file mode 100755 index 9bd88cf952c7e14c6f8a92a28c9036fee9dfb583..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245104 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
        *6b#~BOme|o`OEEaK0ENGbr)fz|( zIa4SP7n`$e~1u?|FJ z$4OcXOE)g4xO0I>VVr+AjCAzD^RA7<#LpkZ`n5Uf5b@&oa|{mxzh`}{T*zVRzA9R< zKK3G93ge67GV9GPuRke1mA@^gXiN6Pcj3px4y^NH@lLEmEwaIbmTmDx**NP=(KpY< z75xbm>*JiGy4)j%ooh(76ki-l*#bj44rFKlmdHkn!0=vH_Qb)dPT!Sm)Gy)>eJVA2 zC0%T!M%Yxv8u^nCNY;*C866<0YU)O9$56Nj{^+}s4i!r&)V3WNyZ8)IA!E$!PVw*A zx?k(<5XX~m5Aa$@Jn*5_!aB)4tp&YQG+AXT>zElpBH;g}cYZH#Oorn}gYoOw(Q~ z%k0vR8lO1t^pd07kFSsjJNH9n_<-+@hJP1|SQLN&&X}{ozX3oXIs*Y3&f7ZwJ_nfd z?wDcFV^<>_c3H~n)N0sONXf8t$9CwHV|?9VY-aC!Cy3-AEDR% z!h+2qAX=|${43)d(cJ6?m`7-DTu1Gq%`%MQBpcSXqm#JgU5az^0yKVeJlX+v^;3ys z038Pi5sbj={lz66Z3P^2ssr59N(OgZh|F&CLmuUaXUyj5#)p4o)gS+UgCJvt#C`sj zg#t$TLbEBvN*XNybjdp^!0&R<9Q{4QJ)#x(_h5uwSey+-_7) z+D(5t>d$6Xsh@a?NYKhi!fMS?lFfeq!cwKncr*~C!J@N~qA)&HdmQ0fq7!1{!XGD` zq(QW{s4pyT6fHFODIe&WJ1pHtUYz~o_e?FU{~5PLig&ZXlYNP)R)U}*@#fn?T~?*v z=G4^)`+JP*Jk8qRM3@=|KX}l|L(elP>xrdvalnw-Cg!;INMl7-N3uBYVDIT@e=EVq zVQeNRjyI-Xao*8GI{}5*+wL{j1hK+p&^i{wc?^Zn1Sav>ne0+Y&Y+$t*B^d`-DVnF ziyrUW>rcQRYmO0+m(qhXEx|~1vL!H9HAWrsPv?KEF}OXnTogP&#Zh_Qo zAJadD-z`hZ9fgT!DJ6rr5;8J~w?V|WP}gYdU8IS0^decN2daOTp}7#dPhS2}Eile`O(%C&yP>ke#Y<5j^AV|X#5WM{O*K^*Xq|hxf))ZM|Yn*ejDcHck=umC9e@b zWA~sO59e;ZK0oQ_YS*)Y+hv~H)_GK4H8fYd$&WYa^9h$9^#QkuK8@c#j^EpFx%T^; z=Qk4~zIGdWevjtS{c9e-9(nl(dVcfCYo6b{cddSBdVZ}uzaty?-La$7=Kgtfzp9cN zT>a`85#xUOj?0fuZjPU8zhfQ4HLr^TJ^p$tl8%-@#@BE+&++v<$`|HwJS;E&WY2Lq zd5zl7@iTwKeE@HIe%p9{=Qi+rp|h*uiFtI}{PqQ4Lu#TYT$O5=e9hL>TQmyV!HbC^760p+&WOaN&C6_t?L-pz2WP3faiEUWV}8< z-oe%H(mcvt@;I)2w4r_-JjXl0ZC0PRsH2C8BVP0T-a15ybhJ$azjHjl4f6O+H#BE4 z*X8k>?DC^-;Kqw0x%r>P4}DV=OqKY-!*|Pxx5BRHQ-T{ws2dh&3C^CD6*;kHzTT>+ zucCl`yjbIMyttajj-GtdH>`Lsiq5p}dA4=z^Y;YZZE*!7w4$QiDe~o&Qb6f49zM>p zL7w;rR?Wmejpcuuf=%V`BYzeq9!ISv|Apd$TIbnECyM?Hg?n~GrnJPPHX0;}I4|0-t0P36A=$AkQTishdUmgH~O zg8V~=nEvlFv_B;Oa1{wl&)`ugf99dzkl*>wy(rjJ{yO>dFmYts+s~T5PW~iB8yUaZ z&x5C#{GS-wACmu36$wip;87_5uD?(I^C{R={vs#;t#f1hH^H#~2b-5a;&K&c;oBP8 zACiChK_>q)9)X||4|je{&^J2zw2+w@8cf| zHkH4~$^SU|ckz!2hW+2yy!_G0&i)PU56Qp0kIBD`N1^;@!|Hd~&(joaDt{jw5BmS% zWv~AW#YOgiZ}akZaq^#HXn#olZYqNP^C*;m3aoyI{HqRVPW~%!Jjmax&dWa?EVKU> zpTQ2xw4K7=lapIP|sQk8nGN>>zd@e-k&{kl@u?pB@ywnWmp zN`Zu1y9{b(T2~N=Z`438 zYeYOgJX?!r&=;rc0b~_wwK)n2QdO+?74Chye^2Z!Vz$s&4PVyWKLDXJytF-(`?hBp zWw>RRo?(x?@5~xqPRLq!*+P0VjdGL87gSeD%=Xvuu#Z>+QNYB8+$|GJN8jG%p6z*O zF_K8Jjpu=G(1iVEo165q=rWKB=11;)c6{03+hw-?Z}+>{9 zYKu=wO8DH8?o0dWmGz%o?FN{nEGFOULI0U7sU!;Pz&2W3;~^gzME8Gpfoi;FdyYXl zB@Ef=VBn8Yz?Uxy1G4>m;Yn7Q$zbC7=OqKwS)lFip_c#HC|cKHoLc z5%^0R^VyZIy3{xCjc*KRcK{yN*4+ZxqU}VNniqA3ye%gd&iCml)6B)>mT#NDC;bMz=GWoDFyMCoRBy}UQ0GF zi5aM;w*6rT^Ol~egItyAIz4E2>l&vC&mXcFYH7Egu>T!q6K45Gxcq1_c?JDb{Cfk` zx@}2PopM@@E)vw+(o?rz`OzojHOId< za9@9UoG@{g@!vqjsQ>d;|8DT_`AQ-4ul8xE{c=k?=Cl9VQ2P&Desmhl(%ir4H`iaX&`>0#ey=hbJBRyz2|zw)k>YG{YcGZr!0v9qz?g z1V-NZ7Tb^a`%(NBGFzhE3{jqB_H*i&xXm_}m5%yTR<1PceC9I}3{Uc<`KeF$)~oYG z-3&?Y=GwUYECZ*b^4qQ5qV)}hT@3vor2tMW{5bq>R|0SneSmPrG zebjx%(*SCN3(aNmYpRPm|FoBI)6s6On%sX*21DJb;V9!y@J*VhJ=UJLIc2QnX_AVF z?VH}@F+Mj)8ZPfxP)~=4%lRHUSLMUf3*4(zWnYNtqscJw_B5-q>9)cbnBWQ=+)%*O z$^u%Gtv77W|6r^6Yy3V+YfnLQ(``i|Ed3?n)an{Z>Wr>{MPdKOh!fVQTk_9s$^zgz zKhcW91sx>U9`XGyC;$Vkg)hAoWk&xx-MR{U(#0P#>>;-QPUZ&cPgj{Ajk{G^wr~En zra2$CkO7-WLgbKezut$W+VEqlfv)OKH1ZImc-T1 zi1HG?{~$|NvW}N5Oq}+VnTCD2F%hWy9_Uf6!P8#cbv@`<1K9;SSKQ((x36Vs=hyBHC8+pl z4_CKcfM6jD-D_^w*S@4}&fY9O%SPo!u<>u3Pk@Tq-L;mWmBv^i8*K!BBmH9uZ^#l_ z{NA=r*(1PZZ#Phl=JqGE!LHDEt-`MYnAt1el!?<&D(c;J|q6U-YJwY{-v86|FSKd7$-a-F{(u`Y`^w#ljZ=EW{K?? zonV~O(G<9wOVRH;6whJ&qG#yf#ugxJENM8qG1LjFp=2}8PJpxasa8d>ll)j~J4j+S z8|e{$cF3+k?j&8jUC)V^yu0f^?J3zx7xIt_V&AkP8U(xM&V%tgxZpaSC!V#6eK}Q? z9cS5!-lNjN&g|Z>?=dt$^?y?I@d})e8srhf&O=C9_}a|(D7#V?V{6#8*au{5rS6u< zMl-VvgGy`51ZE>pnksX&gR!wG8!EcbX)#JQrD!Aq* zGYsk5|BCuafXuun^-#UrZ%Vk+aL#z5GHI7KW$P#mO09}Mf&u~iqA4ZM(2{1QspvL{So_90oOyM#+e zy?v!PTyfk#%=FB5J{FjBJCEt1$-}3tf03t)`L4jih&Ox5D~5^NAj(w)pzu?`6Fk)~ zAmyesV+58pUTmO&%-FgABnKWl)kMk$C-{<6ybxjH)<*?ehJ_?k1M9LuFEIF-Ez@@y zY3{oysreXV#|GpKLm_qaWKJ^<75uJ5*+tNy4oqB}!~C|JBqE}5C=W75Z)lMMmdY1) z?|ATbIYIj51Yy48p=}MSA1Bz|q6kUA`7aOs@aVaPpT;RcJz%=iL?lsrN ztg~4RF#16|S;J3JfOe$Nw0fY!Hq*23)^i>WE9!dJBjncx-!Ztk>hVL|f#)zp9L%?w zTx+|6LzNFRxfBcW@ryaZ&kZuLPS74sYG|IcuNf#v-1qFuZfsB;J?#NwHH_8i9uNNh z2CLJ(?lot!7S~WQR{>oT!u_AZ(Txqtov&X|e{l{|(|sBa5XmFezfUz4ugQ4&QKWvh zIktgy0>$Le8xS+Qfu#}|eo`sV%l*8Y)i4`;ZwUsbuSl4b z!BSG0zY2YC{o$K}g3?*;!-xw_vji&^54+O*9?#t_HI;MkE`?QI=TiLY!&pm|j&>P2 z6%gV^+40T!*9QNk^@&HOAY^UvVhidC0o;+ZZA6U*JQoVC*ZuOSs>ejVtp^2+SL`>*C1M-7)LKaiBRSDUJdGI1)Jr_e(`j(*WS_@?Jhc&xcYF<kG3y^+xef!~D+up4kz|i!;|q zYhGRL8J4}O;fddCe@H`a0E$Hq+2~&r>fty+7wMqu~zPEV^~So#6yoYQP zbu0-!RdI@qMfKM?W1K@`yc3PilISbw#P{Dd*n=V&O{ew;3v*ynznjUVIe9kdU}e+M z$&x`WADoUmK=5ZCP*teY@||p^V(ITlb9r3JSp2&h^AI7`2A9xHkl3cJFM%Qzlt9p; zCCBGMpS>oGoxrA)MHjY6d5wpDWKj8+q>*GmXC{1(hrR$5ro-H8ZrF$y4KfvOp@DTS zUm#QgGv|ly_Yx98mU`$gpbYt2yH|^R6#u9qg(p-y|Fom(#8i2|OjmnqiF1BDWyYg_ z1cJHHw=F^A%p>6tOmWXzJ|o9e67ncf8Qk;MXYdb!1xGEAp1LHTS8b?`Av`73w8^HEnZc`T0z#rQLky`;=+S%&*wxNB@9dv;9-wr`Ua+ ztZ4D;wAAjS&JuvwC>yOlMjeimycsMeDzkh>^<67*aAu=zYg zovC}^YF=@_sLMSF3v?TEd?$X>oAVD9#Z=9FyREIb3^{qzT@5tGx%b$czEEcO%J%yz zQ*ZfCpt;-4uCnkysiQ00qBTTF{!8e?!W~v7L$5`DW&T^+iyr6S##zUv7v!$YXBzN0 zP`Ny!i>FDBtNWa|O3wM?3V2)t2Fcf;=k2`wkX+Q}*0{2SuJ0luf3F(xjd;#QMCQ^ zfDOOVv&c|rO?Z#Y>(K+v=0DH`6+LBx#oJQTi7NQ_Jb#uOf9QX-231x6^ETL4ZoZ&%O8Dpm48Ngs@h>u5Z7=kWlkP5>s2DBI&L&o9@?Zb;(t2Xs*~lxW+OfbtX%Gd$G<-d2CS4 zRCBH1GR=cTJxttt2anp|eOxI$SBxjqd?1uk0>8Y`qPL! z9`+`yzQso*rh&{Y(Vu`d8=vOB7kzS)DqP%_7>bT%ONL!wBuluE7M5ILV#hm`gLv&d zXrO^KX}^T>jOVtHv!c`$JOC)c*Gl)A3%&^Y7Q{Q{c9$zXEjq<0<$W*u9HlHkc-#`% zNYo0}2T^dT;**xaj7jBoZwAhazaJ8R?!k98oqRj2!bCY_WVB)8 z43mX;<|8v=zCY${eMbnn?~jr-@08qBSMqe7r$>p=kicq&TL*Af^WBz`itoQo0Q>%% z94}v3cKbb6%^g&b@4o?QfJywU_eS4;U*4#_-S| z=ydcvRAPml0Wu1+YL(^XAMWy_MdUSJ-;Lu{9RWh%-9XjAq7StEg_XfjIcmPgLL!Up zR&Jq~Z`29)@;xtA?q>upv=GaFMxec<)gDw^Cq`aCdlaFA&i-r(!tg(d-QShl<4 znlVbj2Dlau>U8E|2X)S|Lh0y*%go(IN&h^}p8mRnu=49-a;QSlK1fo8T6l z2hjdiyk3-B58lGCwI1wd?KUaW3jDV89a_RX!lKPhB}bsTs5@kdnk&P@JMc?ogzRsF zyyvZwKPa||6%OWM3MBom@tVXnGmmUABCq6&R#L)z zEG)%v1eiw{Mmm}d6#GBYz2^M3TSV-wTw6Z0=JsoddBXrPP5)^s;lB6HBu+Xi%?Y@^6OctuF5P_;FiX+qYM&s@QgrnY zYO$e^YJ--XZ8i1nnzT?IE9~p8VVd7sH2KWDZgr^Kan)v7z6=7iIzWA^otH$Mq zg3gmlXx%i}pH$S9BK6~KT(ruW+IIk=QOe1-sg)=#aRpgwHC?IlH&R&Znj2>Hu!_|G zIVQh^RP^R03|CW{wJ-M9S$voYmQ1R)>~c&jS_8f&TVdinYGA@#EsFBIe8w7fo_QPD zVb`O8o<82%TEBm7M09-RyE{~h1?MA`)obo3Ex*`$MjuBe!w1mX6)ERc z!+6=v;-GJ4S!7^UU|lfr&$Npxf(ZfQZ*B!9x8WigGj|s5fAbxD;dz&a{oydNJ-qO& z9SK0<@p$58M=Nlld7VC%)qS| zzKP8w-S1nSFoC4j3y*T-^E~#01mjvSJQ0X#DBDrRnw+#jcV8G}Ni-7Fru8paFMJtP zGswi6TSSglzQszXqh%MusMkt;^dFYp=rUap$lt=x|6@g*;~D=*(Sr33{eFiIv-CFv z=f-pEzZ~c+yN#s_e9jd5IL2+;Jtba_K@ih87;H#}4zmoPpIt*Yl>ND4Pi;$s*Krd7 z_Z@7aYNVr`trYDeV%Cpd@{khMi{C4CuQrgdvhpF+N}*;2_!*NMJoYCSm^I(%UR$>2 zh7H{_go^$1fS5|ymRL6W98zkIM)nwwcSpqQq1}v^di=fWdE7U3vq%xW|GcrQTosg@ zm-^~Pa%zKjnI%a9^hAEh`hAbq+0fKadkYPB%m8A8(~};fjbUhN0MaUqkNJ)VMdzDu zC4U_X8)?p0TSWiXy-5NNekN?Bod%#y!Y<>R+LL^cQme|ptpdeUKBSoV`h$fN%3RqBt z0HFvZn1Y}pXg~?aD0Z)?7xmg3dKHmt0YQS;uwAjBSlKc51~$(B`&+a3KIbGsulKpn z`#kUe^Umip`>ZuqRKfcnJVWOg8ZT?ZN&Z3_7ijgonY~vM*YR4xs1Q`QB>znH?H)@;%l6aS!`m%Mo z#q0>tV(nqTChuPX9fzDZ1U~t#9jBN%lh;QMq?iqgH)_V34dUtahyb z-mM^i9KYXSH@;V$9q+%_xNvV@@@w3G{rQxgH~9Kb{6PPY4)uSN^eem{cyA%ZJ z`ag;LPpI!pkWgQnHMTNV%%j^bvF;i4g64!1$KwRV8oD=JP-AM^lD*aj?$NfFCZvJ! zi-d-q!urrZ6t6)aQuFZ-a$K}SO>ZEA-O6e|A4q91_163wy`9Ljar?#hSDEwhKd{C? zN4z~`HThq>%T@4kbpG1)|w6%Wehz`5BAC`Dd8Ncz9~u(-iw}KK1)j>&BSB zTP=in0ds9T?PtU>gjKAj-yFmxtkUX+l28(;?)KKBqaNW2^ANaMZ|E z0Pg?7BD7Ch|FS-D+c!Ro~`QKu2-w9BAsI=5QU zsF+=?Y#3$!`OlVHy#H-dYq@q9v1weZjO$2{Ggoif++<0q1Wwekrf=v!GCwx8s8XEt zr&cDPM{?mMq5E6z!-!~_cA^24H_w2L-akvWR^Ee%;fBG#sgtM>DFmqygGuBjK4(`O zW3y+UZ0o35MwLD54;3Zb)25TmCsz0|b|gj~-+y)Jzhlp;NorLv%K+@zIRQsHgg zA$fj>J^KyKmpvOXxrzA(^iO>HF-_5f`xnd9eeC|lFrsn);!dUF>dgDr2*d08`l%b( zQ?rNfr1@2veYeKlXjZGaQla|@2I)k1qjt?6{zXB)J-o?aXAjFKS?9F2oa4g19m#QP z_At0fT0~sbf-V({T4wF$ssb4xnLKrah`#0`LmgDB*IkWytv8+w&7u+2-Syeh5(ba6 zM=duquh;7IYnXSTQa?a&11qDf2h#MwO3ddW+6eoM0h_!*JT*tk;5xInb8asvYzCX(v zlQAcKHoLJz^iQ1HKMWsh9XpMPz4iyESCmqllymHCHkvhwT4?&bisjoeu%;#~)3qA5 zg2N-pxmhMDn%Y$i;{PW`LF?uqP&E5helR`_`d7%J#?t$T!xF}OXM*M6{-3zp2F8O^ zY*67=*y2=`k=q~cCgq)=Iy`SdMesKY`pd98gR`CB@5OZXlUy+V|CDrodFBj8Bl)8+ zouJqlo;6B&L~oZURHqv=c%mF%&v7;E&U^U(4~v<#oa|{(2JQE)hXw=vZX#>;*iHcd zV30n?URy*dn>ug}j*+6-8(@e?)-wL}S+~qJDXG$@iD0s^Eg=eB+sm<9%Rb6=)gKTQ zD>_x{(VDiG^JC-nRB^@_uNp7S;Xmp9-x7Z7rco0%_xYuMfwx&9d=G;Ef}BN*Cy#HO zziuYXUV6=bCPl?R#+C}w=L0Mc|BvyqZ=9#HWUa4KC)-3+kYylw{^7Si=(B-fHRA)) z=V;b*adIqUrIJ*y_#>$2zekWn|17Qh7EEps zq9)VSV%xlGr=QWb{l%c#ju>qNxNR%-%IX@|Y1{7P$Z9h>?b!KdV*FFxBo&uFdYi{8 z6Z^yK6QVn9?*3d*9Z|ahQCRKeSHH#oA2*k2cvhc^S%N%rGxK{rTQMmfT^VxTPef{| zu-PXCUFtdMzIxGAh+&7Yo)CT1j=Ga-B9?Kc(o_059Z7(Kec8;~lsc(z%Z&~~ z-gO~lEH<%>qe$WYc-u83?M{gO`F0=f6s$tUr6LK3nd)#s>Md~d%Mi=>MhF&rrYeQ4 zgipQmfa+haf3e|s=+D>v$<=bwxyi;k(soTYt~FM*-lxUVPA%#VzX(!I+XJ=qtV!Jl zbIt3J#|ZQHK1cgW{!S9+7h@b6ZiX+-S{5~#;fNTekoC_SvLL?3{o>&CHKdF1qI{3!T$I^#_H8X zo#Vp29h=P0uipzlmyu_5@0Q+WP9Iu3y-Up?`?+SM{oFLgeu`(McbPmty-Vf7^e!_N z6;#*sB)Fh@&LRBJGdkPPHP(}=AC);rkFJhId~2~TuVzj=i^5w1?!Ver*XFJ~gsf|G zm!4C5ul07cQqWn~z`=AWdx?4=-#55G6|z9VdU9HmH&=S!!P*m_y^i5lTK z|DK`h?k1kmtRF5^YNvm@SvGE7)ZS%j`)S`5iL(n&b>ZGsaV$%?ItV5_jAuz{eAwc)!(DD;`R5Ig8X_~Z?NmXe;*kSf7XS2 zgUM}c_2=$SIvu=;_|j)IcIkoPentYgG&L8uxy|)4!+& zxc}=5$odBdpEgAM}}dKILtr*!K@){jF1R|JSH)<6#Lg%%WuN6|gPz z6W?TswJ!a~xe^KP`u>4Woe357Jj9_kRs8qfFPLo-NSc53`v*TuWJbJ408B~mH2?!~ zt4Ov{alM21{sHV8%)e!?7@xAx1dUHK&un^p$`GCL=@#gX^leGANYejL=(LReIy1*@ zls8Rw1_@o=wj$g_{^lo>UA7_C>3a}gK_!EFii)+KU@7fH!ou@`aDR&Z6(*X?{iN(q zsTW1F7MXouU4Oad!1phQi=(CiHwB~$OQZ(9G6*X2V?RV}C+fiI@TDpQm35Nw!z7gX1=-eppxYRPqZ*$$Pa z@9r!sc~7Qp=^3WeG;jT$*t7cf+CNe4JPj9xZev!CUhsegQ1aUihzfpU|_xm#o zRnI!sJKqG-v7R*WWEstvAyIWV^ALs{-xswo+#= zRXcOOcaF?ls$xdl9w9!AgRT$RhFAS2R})9VLspOPS6F64*FD}GwW6GMl(`ly-s55P)YMSr~kub!la+ul1^=X8j($}GL9FC_cx|02JN`< zN93IAG`?PN`ctdaE!d4SlRepFboA$;BZYBGJWtU1tlMmSh#0Qft_y4x8#PsgN{ZKp z1%2UhsMd_*ebN$0PVw&u5^@XX1ZBv%uSJThHz^zabtvZs39rR=P(rPHcQpX5OgA9r z-9$!Bt|!@VwkrGb2a|+s&!BfwRqNFgRaH+IrPgZ`7Gq67x&@Le_tQbpWfpt5{qgnN zr-`f{zZNnR1&&cUZ>B@XGRFE`7h4=YPLVZ+5bKrNDt62MTU;{sdlkDjR})6bc7<|7 zHEr&(r)Xw%4=|pZtXc9ItMy}BeTm!7@13fWNEwXD^+)ZQdec*h@itS+fI`6^KsDhT!q(IbB zLAAZ~ooSXj_!8Ac6)GmLA5S-t?YQsk{Ob2qrj+boZN&W4n*~wl6pGBdqIQ&#Mt+JI zZTp^?hG5U&Dai6p+&XVgeF3ked@6XoC9<^uh6zIlA)Opqp%P_Q%#C zV+ds)oq;~Tk`P=-aJ?qiD+60~Bq6dR(UbM7lZUs?MogJ$tW0~O(oZ`AP{(d0)B9zy zPTLb?b`?vIYUG%A6e}CYLtY;=IX_8#(#*hC>QnaCwp6cEES2#ASn*|!!}v1C zVQzkLH6g)$7SwezF*TogWoUy63+l`NeoHj_JYA}p6HA}-nDzGT(Xs;3PM1z0INJU| z*hRGO)Vhs`@5BcAmXP%QLaVi9fskcHZHmEa}^8U5p01WkJ9tZvN^t8^XnCfwU9 zb48f&o7cvRiLtWg^q~E zEpdGI&jZPCdt$hOs0aDbj{N`AmrjHud`8@JF7rvx`=mXLqsiBB9 zL*cabizn*W?L|ztFrC4%YULt({{-4_NAv0lGlSY#{#J4MACm>B$=EAF{sJ-k9r;_3 zf$KddSYluPH$FG{FLsK!sU(p9NrfYS+XNXOx3IYU(LwRD-Q;Lq*R9Kcl38}E|4lM# zH5nscgn?iGmx|f%$ls3)oc!}F@lem|KSTLOvsck3_HQLL?miTP`)~CUuGT9^5OTAH z#S5@zpyIg3dDqdrvxu(-Xk7m{U>kk?>EYzR^##)V^1mQnza#%__&fR6sJGV){oLdq zs%)d#+aSNbSpGTkpF3IdA7%2?dY2~1*we`vDp0Eg+MbT)-9uQ@@_#5D_4VIG$oTmA zxcqJYK>n4V1@gB_l>ZunrT^$ubf~0nGfC24pkQkMr2+bNHGHmx#cRJHfp(^&d7l$z z>fc2D9}t)SF`5|t*)KtUmALTNPKGm$sg{2xI4-GeS^NrwbY_&1&=(o zXaQhm#X2IIdX0=@_$8so#;cr6&U=}o(u@CS? zP02ora3((9d^j*2%7S1k9sm6hH-;oEbab(VIZ9g>Pa}>SYy@reE`>|{{%5>=?)^@C zqb7CKMhRr4fYA%W7`^}1<87VmQoNdRDtY4Teg3hSZYPg4o_ZCyu=@M-*_rG=gvZll zHpfoPqN(}fQ9Wl79QFP{jXO_EZKX;LU&Fl5MRKQtsb@OOPI9BEp2OCfNU6QYTDsK^ zJ0CTHi@k=(|5Un|OQ3as$M(NMf$Rh_&p$6$>AZVSFnQepOSg5@D=$T+ak9eyAAV|D z>VhN_|9@ve%-ZkYOyWXDWz=#pENCbf&mAfDC!T2|3;BUc(~A!b{*qp`gh@rAj^L?Q z|8?z5$OTd3CuS1@W{TnD*z$=@IKZv&I`pk4NU@K!*iu~fLoC`RqN!GF%Da*v)+fDO zeySb|zTaZTGq_3IV#{1CRh#WGT|#Ife_E%RLDXWfZgD5Vy;c-ff1ZBP?L-X^NL8EU zy+}Vvx)RICR_bc^wsEJu4Q$Xy&@!s8bCwkS<-{abpx?hOS^dcPvxf9#zFUPsHCTugV3W?ukP zGZ5Ma*;ZlxmLvCH^Hege=N=j(71YFBeO7bYQ%JU`Sz)hF(yKUUq)b`si4#vdleD&N zK$B%X3`vuE+H{=bNkqawBb@R7BTN4Y2&}Dj>J((#9kpJTane+F@Mz_Leoc1w-B(yF z&i^ci=D}TvfwjKjJ2O48j9dH|-yE+BJn&YBvZFzr*^_;oH?(u&ez*+y29|3_x-A0Q zM#Tu9!-H^8UAUbQU9pL}DKxo$q+Fw^hg;MYwzTtRT6`T}W^_XuicZ9NqbRRde%?sP zuAMEHpFXrGUcSr4bTw-Xv2Atqj!*4s)LO}EVz@$RYl)!ldb^TgDcQhk0b*ZG<`ZL+ zxyZPxet#cOGJQWPxS&k`uOc7Qw{w-D?I%rf5U+ZTHR2}k`{N`zOIecF*{~9;*YH9{ z+<&%6vHDew*IyYK4CdM&IT!{_tj|(^(_p#P_i>}CpZo#+S<$O^YRR&|T!Zyr>ixf) zJ|(-x(*JXK-P&9eFe!bo|1w^YZ2#pRVlkW_9|rtI0V(YdA|P@9|L+|_gd&%XQ|9Ot@{!6`fencPU}AF zCuYIzdv@8f1_i7x7prL7yO=t~Z{N=|j%0M9sJ7ONpVrai>+>n;ZyJ=MS&QL>QeXEq zF>Bf`;>WHJ^{|w+-X)ebebWCum|q({;J&Zr-F{C$w_w2E=q)5t@_IeASA%Sq@>i_i z7w=0pCNqiOO+gPc_H=?(j__;iJ|gPQ(42^hn!R2FW;E-|Gi7V$Lvsu5y{Ifx_8G>P z^hzMA(5-!%U|thPKRL`PqAp+8ZkNsNSLB6$SgSP5UbOqKR<~H_2KPAo{jrYVtZ(2xoo(~le#_Sp-tF?GP8ZCm{O{Xj`eLs z))H4L_J4fRI3vlLKWbIdwnSA@lX}TV`f0mRKmPTbkJmeHhg*_oslMi4imE$)v5Zwd zb!Vs)q}HLT4cqCm9Sk;?8tq${)s1-v8q89@vU5deKk>q*=&H}bgS@lbxgwrO90WsKdoTi1IepHMwto1o%9eGnDqB+l zRO4j@X(d2^dd*<15_lC$8>)4;^|6XK>Z4GpO0Tc+wnL+yfK9HKZN6#i{g$qKfB7WY z`0Je;VcKxLW1B6txtr-?lJFL@Jp8k>|M`b5Cislav5X!jqyCVz-SD~=aPs%tRDQQs zVOqc;)yuJrHbk|7#J;z-oylb1Tib)mK$vyj4wA&#wJr>}_4Mq5>Z4N7N6nwDW7WQ6 z+r0h&YO;JX0A1xWC1GoxH)l=rOZ$li0Pm$fSei)9RRaq_BHdHF=s%Rl~T zn|Au}72*0z_fx{s98DSI=Pj5@SS}*??D`0&t^kPTn z``Fe2AQ+&!SWSx1Wt%7k)XX^~=H zrg0{Wx#k6g*_M0K_(yHeFf+TA{dVZZze}e-Kv#b_8v)$Lf&UEa&p)3!m2QwZi#pR5 z`?%)RNHn`Mb0I8Ym(vK2wqNs>3g@=iuf>dXf7QB2xXIpJu|;>mb_{VXY1}^h=Qb8{ zqEtmt5QD256^1eZWWO53C<F(nbdKPA4EAi9>qR7dXS653Ojp25NG$qIGob8 za&eXsXJ!!R$8~`)><%nr|JQKN;-cB3gE+4y#^H;d&$u{?h;w`p=YhmHeChLM7w0bG zbPeLnON?_D?|-^D3z=2SCtm9y-l)WQ3u754xp>#-RS%yAsf+x=n z@V4Npgv79~B8|gdX(H_JO@v+3IIRBM1{u_kXc*8h2tdU810{=qgd-egAP@f2w*z+o zSXE`*=pfqjN(Z3IS&V7 z6!KQ}cK5^G=KR_`x4++;_V)MJt{Vneld*=Qv|zmHMw*7>jTscAFvn({&;_%nEj6YW5~eCf6u8Z zyuUx5rF^5=pVB67e|h%F8awwgacaGi1QB<4A}SL*UirL7T>LGs34Y(Zl=yCd(D;yC z|2xFxKgC4InExoLeEE&r@5ui*a&Yp0MkOP^JD;dj#?kEkq*HEx_W7YIz;F|Y@4qDo zd72Y4EI`);TDGHk&l9$l`X6Q!I@6!)OoWWJkHqEgCT71Q|HrQe@*j{W|Dyy;|80o0 z{qdB+lK&=!OaG71udn|W7T2GN3A7oG=C$6s{I{x)IsJK)Mn?a4NRWS$nEj6Y9m&Ag ze@pE5-yblR$bW|#G@5nF5cK~s_22ahm;NWn_?Csm<-a#8UbZJ4&FfG6u>OPfb~PVr z`PHn*%|vrjoPiWr5F6pA_?az(A;uIzjx(y}TJ~k)fqsO)x*UmcpbFvNb?6S2X-aSX zXoo4>`i{@PBF4Gl8*0C;lMpTuIA0m;>!TAao z_t|T`&4&l2yg)H@!%1IQ_Ni|}4OHS{OB$E+)CAgDj%M7(hWB#^56Z88DY#)akSMOg z+77b%;JjC<`2GeNBZ{qFwl_w#UXf!CwWU#6_A(3p?q#bs-g^U}N>QRrwmxs4=?N}kJ ziYTlp##kCA^tIkYWUt?w>{ojP;~X2?5p{P}a*6I8@`Lu5YrR<}ujcAsN`UxWJ)KyJ zFv4-NDR*lNi&y>nLtUe>b;mVMfB*X>(+jVXbj~b>Pua&<#!E!d9#Jc}bGP9!q0#I- zRWIN9SDVyi?DHmpHEs8J-`}*kNRbfcRWj7?nf~v&{D$m<`w_8>i9|=9?(gV(ExlL* z-=j*1X8lsAA~FOYN(5FntqsWrsc#49J%6XGl!?aPS)g4kYs$>&`WM}my$g@MDENJ^ zCN4tK`T(8#A(ruh#j=U`Wln}&2C7*(Jb1uJwcZw(qLBHcb1_DnJD zX*t!o`VdvLFfFepCoR7^H!UyPi~mI@!elzveC=2s#sZHm(V}-K98-pF8tin#zz78Ln5UmF}?Ci=~O@V+Fl>Rae{pz{+qK!q|RZ5rF?T>D}SkkSork5+k`deD5k=iaGoPwa$k2 z60hj(N<`;3n{-neh?Ksca6Jn@hjiFR7rDBkC>W@d=uGR<|Jt~D*(-UH46HCUk=0Nd~$v-bo_K@b~BHrFm^?DIID;)vN zmh1u0^s7b0+Opb@^#g#Eq6)r^_80x}P0OJ-h-b2=)|)9b0XJa0c;7=Tc>mSpVS2wbft-o^XTL*Sb1KnZBb68Td z&{K$kddxv2mFt6Czusuhp_aJTyZrz$(VsSTS_+wIMg1!ZVTQ+6(80tiuGoB_}2yfF;BuI-706av7y@xQ`Xv8 z${6Gzc1DgfsQob(ha(7$+iKE{-ZNdS1Bc^Nl09WU!{OF}Q~IeUQ*W`F#QHH zboFs495fhm{}fAV#-!FK?E*;ywM-WKAn5n~MscsN{nXi2b4|wa%)HSc`-)}MPy3Eh z*?>!ZocUpXbf*^N@MT|Xa{lkbkM$_AsKc=iP271?rC2!|O-}S_W?dQaRw=Rn2_602 zk<~LhR0-dbY71jCMlB3rn()gCX= zs5uDL{WRDhmRBcXCD7}9L+kEy0(V?=^6eG+M@J}_g`CI1#b+0MGU6`2fEQE zuqIC#A;EOUI{kwn*SXmL1EzL8)k%VU;eOhT4OGpCGSAhyo;yY!V!D`-@ftbS%-G=F zxSz|K8(}BdI~&=%=d0?o7UZbfvn@9rGM67KHcSf-kWA6Gu4<9O zx7XDVZT}}6dYUT=L(hD2Om4qWUiUuJ2g_Xv`M-nXm8To8|4t}6rV_RDON3Nk^dSc2 zz`}U1baJCHefU};GYB`5;R0jwzSl-FB#nRm_s%uu7KQmgs4+uE_y~d+R;FnA;1)nf z5mLV=i?DZGbzMqSzISQ-YrQiO#Vwd$uxf+FcgrMyt=AWlYwHQru$7K}{RULb-g_2F zrkn0(&rQMEPOQ^%h)H(KM7vihHUGZV01E#X12%g5lT)~!ckegY`#@PekqNU@WbuBq z8z=n#W5+-)_dlNq!K*=T3_6~eS{Qy@kwsQaoc%QCkj54B8XHRx`3;qEgyUsmwI(fs z(i91wl&pJmU)RRrDwqO%@U+wBQc@?`1L;RJ>msU)X~4b2vIPsrNI6{hs}(fgaiqRIn0!>-SkwvWG&~c~}uyCs~ki ze6af=eS#g9FP`%21JfQ&?IE4gYni+ka5SKPs?j%=aX75Zuy-|{>h664Rb|P-=9=Ef?9>*jMr@mo z_^(-_qCdhC?eJz(sK)zW*yrfX%H0b{m@`nvnqQg#7JcuUK84qLbB6|0KDq2z<c!>C&rFezu*E`!NEqC%(d0*~rEYB0mkpau>4S|8$;%yse zc|!x1TfBuK%Nyb>7dVzZ#IkL`vQtJN<)_|aBKT4cY{2qUuP|hJcbsLOWBJX^uv{vb zS(7XAS#e&!Aartxn}xhegjOY!2U|nwCrVBBc7FxFQE6?1rJ`qEO;%gN;Ocd<;M7G$2*GY* zdo;6KZz*xcscn_Gt*TZL-)k>4`%_SFP@LB&(QW{jm5pYNbZO_hw4=lo`f)AhKCz9V*@xalu5U|%>eNnRT9Z9lg4DX8-CfW`1wG<|(p^xI zf^M-OyB^mYF=o4*OsJZ+U)tH^``)c>OvX}2JkN>omQS1`VomnJ;x;(W?R>a>YSuX8 zMweibpJ0gNR_BPXIN}1I*uxQ5I%3*(;@$RQpSZgte&vWm9Pw;N46JG0543K8B+Or{ zvfn?G=C9llSw}BG);ssKD%1JjywvY`c5GI83`4-F5UI*%2m$Md;($Hju#+8avBPp4 zZ4ub2)Q5OBLwV-$yR^Ac+$cW0j^(LuxU$bs%4pW@^lMD)c1r?6)&dvuD`QbO=J|I( z#^+TJ<+QkRb-(DicKxbvuV9BPch1M@vwM?GK}~69UiFM+`tzgQyK=R;UT^T+sv~!+ z%qyrVPeYNA>yaBM^L3ONP447^?o!Zf3#!~JFWPt4yp-Izd0qSRx$4}z_&`oHcNrM( zTIbG<_HB{ZY(-A&<;uGls_xQtl-d8FIxVY3NKNqyFu4ahAy<{lIZqTKew*f zqw448m6_2K)1qg$%WKBvxXOij%{V|Bx~RTY^u(SHUJ^Z#3|@(?u3S^!#+WX&=aRgt z8H*z6*DT|AA-~J{UBd4(Rsp?`Aai-Ca@+v~}mopefjgo0KR-Jo2tA)NbE%qa;CD9faK2EGze7><_cs5X< zijytRXyKyhp3Nx0+DJveyp-V!bDl(M_GV-G%Qv#z%w5gs*^|Fr^uFHRnrXXSy~h2l zz7|&YZvFNyM!%kE9st4&THDAty(!={baaZm$RONX6}2WX=cTvaXr-9>*f4v-p~ z^=j+XopiIHCY7B!VcR*(r=>Y;zN0mFSR0q_*I}0KC3+s|estJx*BSP;!;WuZ*k=y= z($PM4Shl0R=dh0*ZJooqI@+ra`=_J5;IIykw#s2IINCCY?c!)l9k$xh9&y-yj`o1V zo^!Oj9JZ&U-RiKlj&`HNd|9q_*g8j>?=WAMd0?wjqdaBxR&vt56zj}?ke6-2CVI0-Qp-$Ct>Fu z7(M(b{#bo2Zy!~BOh>q;hb>tjcu19@rD^}_J&BMtN8#G}@{$?EHUupe{4o)4L;M)D zTKa5WM|HqJ1;-9uF!vufuB9?W~@W>94W{xkS01LRR(LGVUz%ZdPJ_fAS@3X9lQf zpQcl@q#*uy7r)|}d9+o<6If1CaXiH05IAmeW1g)eYF@^ zY}$qgoi!X@cNV4cX@7ULl|GF&zT1U7?1yM|m^DWxI@o0`)C)Q>W?DNlj{ntp!rc9QM4UO>)@MG>bV_STyyN z2MpWnXpg&?CpqlkZH-poV%E5r|8%rFUCf>iJH^F3)WzJx#eBrkE_E^Ya@a*K=B_U0 zPxo66S2|jyi`l|q_q&)|hMJu3yO>iPZIp}onP@es>s-u_UCbw4%mFUu2`=VZ7c-@m z<+sMgta35CxtNE#n2TM^?k=Y8&rnOdxtOh7%w1f}8(qvjUCe7;%u*NAbF|o%mfuAV zYvp2|?_z#&pV3xY)5j; z?6waz%j>nS@^d~=_+0v8=7bCo{@wGFxwpbaoY%ZF{J4CM!3LSR;Pox3x!u!cxVEv~ z2j#{686E3uvpf}&3wj|4`gS`P5;iw??1yqkkMUk0R(@4&TI~7C zuluo`-NcAx7vjyR@_)@SZw)E56Jg)kvpWVbpw}-I?I`-&-6a$|p>_Alx^hFu z|9GVY^t%?~#5qoD#IZ**$GHK=>;6TK`!(YD#Yssr9uaWN{XLGnqoi?~zU{r0u$j{eGCKT32=_;?LOIxU^p7Aw9tWzPJLVfhF(9E@wnWaMN z%XcYLm1k{yz%7XGTM(U?$&1zF8Ts-%yrGp^WO|Fj=;XA*XhlaT-{f_8rK%TU8kzH= z=cO^IR&K{SDd)%BNb~gBFWBt6W+drt^1#Z>R zMKeS*%+?_J(aK#l&C?rlA9$s-jZIK~wT8X_RPlOTJFSsf`ffO%LVVH{{N?-(e0uCF zZ#pRowmpw;4SrR)E#=oK!c)QYB!Ay?GOLcZs+gL_%j05~AI&|)vfvOQ(l0uoMK0^S z=&3EFP8-PwJ{6FU!Boj4ki=P1(Ebo7RtGI+5S|^&jkZBmr zqUM1gjZ&@FiRN-;U#%0RQ2>bPw}iDzel=~BU)`c3dQi6v`6V7#SffKxuvaAV>{q94 z&)(eks8e3`$u#cCJ?nRbE~p*9^y8Cz&f0EPUiEQ@^lSE3H5HdKJgr~#ne31-1^d!_ zitS=rmABPRwOEj@1n^o?g z^W$;+P>rdX!G#=6ypwHPY=iaVPrc5_C1uon>r*R`JG`>l`e#z)I}nvFlv(vbv;1uf zGxMVZ99Te8+3*%FJ|vz7>|fjh?ntum{-)H7*x#dkoCI!TGNwbZv`l8JxET}e+cVn# zsJt%ES1oHD^eGttZ?V}?+xxX@y%RI#SL@OL65mfbwo?u89tx0Fv`nI|MOqj5CV`fdglIdVjcvZdsmc!N;QnDkDku4+{OVx4)nysBlLgVqfipe_Q( zg6Qa;xz(R)o3xQpu_Na|PAkFWCUB1h!=^xAQ^>TXEli&kuCLP^OYPM-D8{qj> zvDC_4S+g8@F=xR@hc)Mv27m@G$esQ1l0k$m?aL#bNl#7c0mQ@pk35H;bnb~&PwLpN z`V37r_UxF)h$dcX7H7s@YQFld z!sT!e9~@D_!2G`uva_x5L9l1@_HmP-n<{CEN;XI?d-NclM73>A4#; zf@#dsI57s8f}%UW)L~LckbM}F5btoyFME?taG9!Y-#zA~C`cwc`vXF|zpD1w;(bR) z_Gi9xV#asIy2K2Ws{1?ohmBQG^J_-5VB$@w-uFHtWns;jmTcW;ZJJFTW4mDWzPA zxKw=QVa7VDfG%H?HHO6A>0~6?Di5k}$zL4y+F02sI+P8$!nOUPxla^mXQ?J@gtDob zv8ekpuTIuAI(!k+{QUHO@3U@rlS?mF56l%kPvn~H@3{8l{cMI5z(1+V)UeG|%t#b@`D6(Y7bwL^Gv7)h>6=tJAs`j()rEkNy6V-J&8hU!VAC zK5<#A>Sj|8$fjn|PfUiL|!9GS}*lyft)$Q@x7P+_?NBk5d*6AKZh;_Qpo)6e_kv$)_ z=Ogx9Y|kb3Tx!oJ?D>>Em)Y|fd#<$SDtoTB=NfyyV9%HAxz?Vq+VgdL{?nf8?D@7m z-?is^_S|645AFG}JwLUlXV1^<`MEv6wCC6M{MMe|+w(_zZno#o_WaeJTkIJ@t74s+ z+p~o|x3OoMJzLqcjXk%sXFGfDV9%ZGxwAcYwdd~k+|!O`XL}xC z&u;cS$exGTQ^(w~PKVp`2z&OlXK#BRWzVB|%6_$P&&g)a;8>@&{LUY*z`9QvfyTEN z^sb;Df?gFgM9^wMXA62tP_>{(1l=a+9zjnES}16}plb#FBIr^nUixpo0XZV6*Ew3ffuF?t%^w)K1Xxg0>MUm1VCpl=0TBghlJ0_0)~=3F>yRwU&j)GZ-c^h|t)f|Z~(-rQ84 zLiQ3Rir)>NDdcbXJ@Dq9=1FNH-9&j7zXRT!rd#ZIMA$lvL_We-;mySsJZ`cq7A2yL z%n6`yk)IVj10S-w9E4+~$TnznpB+tq428k)1_hJdUur z9N9yN4u}un*W865%Je8v=7NM3a1}@o@HQbQi=Vyeu(tVtR!zSix}1PEoF0wRfC!$+p$LrN4R9ls7AVM-DiBS0>;;J#)l zcQ+Fl$|pem_Iw4OfDg+&3S|F)QVk&EYwlK_s`@!f^AtYJdo75#T`9^(cnMuQl*eG6hw8b;#=dL zEI=-7kG&j@T>?;P1}Z=-y9kg=(7{7o2$l~(I{26ZdgAvHAU6yzK7SQ56)z#og?VNL zAp*9h10P;Q2Yba=p@Mk`YoC`jneQSp>2Vzvf;AQJb3ts_L+#H7BmL zR7=X3sw8(P z&Gq=Om2LwOw+BUe5HB4w_bks${1c*lf|nwg`<|z4`Lm+5<`Ht!>`E28MwBCYyvDD& zu+3#E%n4ANR|`{<76_1wEm(CSy0t<~A}8q~C!i<(Th*TigRn+!1d$4~!b0d?XMFUR zq?vdvJ|kzqPx`P#3{*#5`Ry*sVvqy*HTMyS>dNx@4kXMcm4vFR45ir~B-GzwAgZ{- zM41AznqPCV1)r&(jF*8^3>(R1Z$qwqK-6k);f-TRQKfXizbDH1_^_TY0a4?AgttMi zRDfK5`gN%p*haxdP<=&-HJA{n*~+8;JQEr2MF^nwqysCQWo2uT1tP@E3gKOnlgTr-MlRFYu97_)`SPCH05SF3e4Z zlt;Pp=#CF1?F*vD*G0-mF+R*=7D$+;8YE1!07NxnYx8>n!n#@vqD-fYn^ZAO^EHUH z$Lvikk+MB;Rr6OUjTU~g|K^g~Fljy{xpr6lqw%3dS0%`z>>!HNG|c@n5VgnNqG+Pm z0dMXfJXIFs_B=qCMx&Jajp>TSAB#8lpR-S&)BT&aPc2fQG-;o<5hbus4~s!ypSp_D zqpN+bJp9KYsH0a3XR6y+?C)h=ARl{m-#tAf?oVU1}*td_Y4-*}F#Dt}Ov zsrZux$o=oIL5b!1PputRV9Ik;#C`OT6YxK8Th$M4lQ={1lLW{m?{S67AVB@ghOrR< zq0#>vNG5(isY%~vZpLJr7-xZm7C}?QuEen22~CAU%Do`FKv|25MV?8dya=*0fp3VS zA@(GG&1DfHZl>uYLDu?&1o>saq`!xe(8hyMKl>0M{p=%3K3>txoxxMq=>$j;&}v0j ze-TS_GSg{zEBs`DP^Ota@&>=Q^-(TBE}@^P%FQ651b2f- zJuejHi9|}RpXOpw-UR8%uQ}Or<+D(feL+ImvOtv2U83ZINKkVpf+(LwqUdBLl%Nzu zDrYB}x+7CWJ(x>agB;)o*#@s>IZsOo+0p5alF%NRb|kqP0`x>_p0J5Xq|z z?uhhH=D?iB7Ug5RMt=tg<$Vf7tglxZb+nN3u1~pHl&=ygKZB@0{!J83L_X)&T=G6{ z#~@gM1Z%DYhvP%lEC7*UMv-X^D}Nk_irG?W%JHGn&IeJn-|#kScH!3;yasThLgiu$ zUSo~FR>>nr=piRS`L(8HY!MSqgH9zt^`*o6ND2OUytzktX5!l^jcj&TerH-V5Op7O z=Yz<;{6&=6AYo1FSU~k9Rka18jIFulP^9piMfnOO6eo?40||_YA_JaK$5%H`xkACV z?{2>ll1l52l|H6}ge~96r<^Xz;UJ+@nzJj-NKrK9zKCCQsx#@t-&A0YB*R>|+oez% zqZA-R$Ss)v+^sa4|ES5#tq0i)=o?Xf0SU{v6Cr&9$`B9@0p?mG)9yf49$nRx_L$28 zQ7s!q@89+H3ADGr&dCZw1W1KS6_A5JR)Acxo`x(0NV)+?X&XkGD4V;1XC{7xDEm?+ z(g8bXQq6_6a2iMkluSh{@ex4wt^G6;MR@?^84Ko-JU{%8&!c48%n8^ZuhH&b-zWQz z)afzgc&ZA15k6GS>p?Q{6GRE>R7WwUjg9K`08yH((@IfPr!Vkp?tgckYTlfQoYLdV zByVSYSl+`xM7auY?bJblTrl5K#o2u8WC3ys^OP{Q0Ck&biqIV&npUZ~`o#=Tm<35=qLy1%)t$tjaOQ86?!hH@SSl8&E( zw;ktW1;{10uO#_Ttf_om52Y2bCw`##_r`0WF_%z|!9kdSj`(jCa1K5k934D^;?a$Z8ieTNOmNq9qd@c|s>BD+008zbG;cbpuC_pZ0?;y!6iqrAxXG$D$ zIuk@C(@>Ksa5p9I0@6Wg7D2frp!~UUFw~n4L3#nIp+DCjLq7jS{R{atlILs**vLMp#iojq zhwm>yE}>uT<3j%3eFWboB z9IwJzf7z#*>j-y=G8IJXYtiO|gc^G*h{}JzqG|kV&9Aw~L8OdH>P!X`VHfK2?uqP&aWA8)2)2SU1nsOBTO=wfCUII%uD2$vJ^|NnaZGvlcrH>rjW zrj|}pbq&II5g-@ZH+4gE0uIERg*XvFOH6ZN+<$3Juyxy0B5sZJUwyA!6xkkmbIEfP zb@Ha?CfA6fF*fYaLqWvz2E5I+P8J}S(5L=W_VvHmH=Am&qmWcR#Oy&RXV?ZwZMzrI zCMvGh27Ls`g>jSGR!g$eM9#(^B0w(TzFJZ*FNBuUjK^%ejG(#ecxtB7Uz9uX;VN_) zh$arliK0H;8gFhRPj&r4qG-3_GQ7Fq{=lwailGi~3;B@i@dOCbpdA^B4_mnmM3UIa z*hK(gel;KxSXXpx?h|r*oB$y`MR^q;rdbc7G$)DjHGTo!Tv(UVTXO=^@Fxj76yLa? z>?e|(0L2|3^@cozK zhIUhZ*_;54Z&wJDWeoLoFo++XLwRIkcfwzf zkDP^XN}fI<%Jsqj7x?_A%Ju*F{GZXE|5wldt@XT#J&Q_ps}uB)6L18+uST<3_#C{s zOQ#2uY9RwXO?>j zkV}{sc61?bUrzP%k^+=0tQU20)$*Hoo9u*jsnTzce@+ysX;}ZWK$KX$*(#>VX( zfQfi>TW_~ZMDLFuW)XQLjKdv*FafGRW2mkY)}QA5l5+~)_#7)huHn5riE1;+Fl`?K z#8tX!Z5)?2%GfZFsNA&23^@&=aVd{IjkLo?OMAMhBY?GM>aMG(AGw1ztozC;4O{T4WXp>gQ#U% zD3itbuvfg`Q|!d@4UjO+MiA+x9h3f?NNIznDpN}%bEatKv^o-Hl=9Jmq>5lp>oi3h zCyK5qg!xSIqfHV;hpu5sbxlEO&K5_&y%>QmPsz{Sy8c5iB zx;znby9H#Op9KB*!roc^jQkR|_6tCiAYYkCp`_vF9^sjZA1aDkRwDlZOM9CkY~jB^ zQ8DduiFWG4Vy*$v?9kGD0-`Qu?ne+=CZn{1Wymc9WOpcO%Jg86u%!z@4kGY)QO*Mi z%Y3yT&5EF7frp4;?!RZh^559|4QE9HR3ufqoq&h^A=GWDs5t?eDX4pzZ8}_lT*5rC zhYN9UQOPoVpnyL3eFeyk#!HXh6(VDFv;evL@w?zH%}M}ig1OguDsQ7GVK)or5nFKi zMUj-*RC9wD0hPs$G^}m>s?VD{nP*G9E?TFI0Z>kh>eNj5gpS|G=x0nfqU( zyIFxm0#u}?#xuW9WCn2ssBO%ebOGp#Hdxi_NMk%?0;DZ1 zQ3tzh63R8#r)Xx_^eCxog*HlF&9Awz@5?lp6Cgu6P*{WcyhA>Iy(P7oj$-T?^PP=M<97Lmm+Pk|+jn@}v z+`?Q)f-Wc3nToNET3Ia@mPu88F#b2Zz49Nn;PnJ-gKw=gH{-)Ji$IjOt(Bhun2k3V z*0a>toB&ntGGXd?VF}dGD%-PoTj+-TXAq!Xv__Om@d@?3wfB<#C)#mEFh@_S=S&2) zPLu}_mR8+eW%>&~G73LLfZU(co$!5knQwCf#Q8Ce1S9Z6@#Y@knTcO1ie5B0f?v&F z?9C^&jNMnzwc^7;%&h~FjvF@*#JZVCRV387Y}{@DQ8aV+fT$&nB9@9~F4Tw6(h8V} zA4fEMhbn1ImGYe}iVg==mSctJPLHa%T*!wYSMh5u!9H{d!UU*itGhHlLl!kE%5Z#t z0djw?4ct8mwXyQ)f-_u&S+j>@~RK?i}U$2 z^S!O>>3?6IP06=48~=a9o~>*1?P!2)@JFd3cEX1?Yd;Wa!|`}CsNDp}ZOtAlc0{_< z9Ut;h|B&u%##;{vDQ6R~2VTokvx;F3O9}5@BEBQu zTqVy;{Qja`gAa4Q6GWq8hA5xnC*jQn@6@VZRGt9}75i`xd5tc3N`2r+oTX8uH-vMtV_79f|vN4j86fK=NPHVMBg{tF>D;P=9R zD?~~+Qh;0npG*tjAwYF~Hr{rELwSxQK=Mo#MIELaSej)}!nS@DWM3$@gY*N4x`erH;jcN@*UCrV zjoHVAyA2>&n9eCY?tpSdKuOrklfIi1AU*pT=Eks_1@kx`FN=__9IElH@#e1PDXE%^ z@)$m}QZIsNLZ+Af?9(M-Nxt$ac5^ufasl4l402ZKPg0usAYne*gisIF{(9ujM9RZ{ zn$e;>3nC+EF2UX&7=#H>8NX4$5%~QD$Z7hewzlLK0_5P$J;PH&h^0~Y4Ck43AZYyM2T=J5(w_F0h}i zfK%}*v@H&H6Cfx1rEzYA5ZMoP8FQgs(ja0^fXa2TFtyKV0_4K+O-*P{fHd=AVN&g| zzo;B4p;5*Fgk_igPsgvq+cwld0dh(2ADryM-0Q{Cj0MuY3j7}UJB3_}SE+2(@;HDN z63>gW-bd`bsTpk}itT=P@{yM6t@%E(s}LCvMe8Eu8XxH`B`r2tL$|V?m@D>Y6r7 z4Jo4uP?{S>k=_p$AQ#qisL=ux*M{li0AvizCCpd$4Z;MdZKo;V7<`!Li6G)L18;^a zTYy{wpI$D+9T7|4uTg*sk|{uL6keseNyypwJ_6(t_=Gl1fcO+Ef^3G8np5_&gGR{( zINXAHB=G4Hgb5IzTq)$C_+fZ+m+}--oo(4V|3M4pk^H`9QqkH&-mN(gb;~30=EN!! zFU=3X*rhSF=`VJ@DT=PfY|pQ`<3Tib?j#0fAd6kNWbx-#YC&@X)E@TA-Y<$DxF?V~RZL{{PxbUoqwr%9aD|MmR=+Zo=GUvniq zh4dEXLj2BnbLwHzj=rKS#D}BIy&y_cAj(sTl;?cPiK4uVUxGIm*PC6zmB}XxZ*s)@ zT9kZznBx!-mG>vS&FzGkE8{6ynk&aScxj=zTX{-;+w+#l(nND%yCn5+vCI`+DiO{` z+&3>(cgNzd#G4WABS0?X)xqITt7Njw)~b!W1eAn%P*QA3`Jf_6bM_G+SAgFJZkx0KH8kvf*Su)Lv` z3lNt)(GSCS5g?b4XK056NWv|O&={&7H_VZJtr4cj2>TH-aAq>X;SIv$b^y!6{k$77=K*lq_GnwO`2R> zQgJNd6MIL>DocizR7{xUQ;Nq7EE_Uma&c*8Mej&?McIUsas7(RN0&{QQZb>lBvLeG zN^!}UA;r_6IyiwkaBT0$7>hirxNt(bi9lFIX%OsqIIfar=#b-j4z@gchY}7cF0bfY zR9@U0Ig1ArO)l;|X+lZyfXd0EipzSJ6&ID4mLPQTl+v<_;j2a)lgI zJgPFO@hVFD4xV08Q8X>6bJv2dhz;6tQgO++3fNienC2jE5fw3dd{J4^XzD(vBEMuz z@iamt!m-nHODZQ9mlai@F^WI9qNt*{cd1ohd2fr;I}%C|=$2yAh>l}!5u~jss~lYsDH=Vxa&qM)$rG7SQ9L=XsNCAY zuZsvZL1T;I(30{A<4TIh6qJ^X^Qnc_GfC)oNgwYW8DW(akQ?*JFR3UVM<QOTsK68>%xFXt@vW*GbB4=+(u%>AWm6_qy8dF)($po`8Y`)3Tf`}pFLv>m!Ih(& zaf)~Mpj`)!^(&~ing~59t{9NSD^c{whz9xig@{Znp6;`WOf8yJSsWlvj^j$p`WH`6 z5+i6K4>r5)P$VMdnYoY0+mU5B#C{wh64ET zTUJ(N>K>>`@wCy!W}DT5W^;W*TUlOQmXD=M$}A|B_?b}Up(uui^tcM6y3&4Z&xDfl zAXki@EU$)@peTLAAnOhxoj&d?k-EHZc1lN&A2F`DqF?do36qN^4R8a5Utw05A;puY z&_|2Ocru2S9#cNpnUUf#$4(D=b}*v3xHM?rAT|S6LT~8pS|(oBL>g8mC^cQH%+(4- zz+wbLXDCh3Km6A5no+GR5hdEmo8O@X~zofjFIYPyRsf^OTHU?E4n5YqceEl&09^=9pGW}u( z@k+}kjGItWG|8urXoxpRUsgPhIZRpZv?S)cLY<#Bf{LF*+Wkn_9ihG}ERso+X&XqBX_A%}MTWgB;>c#eA|oP31RPoX7El-# zu^{3Iid8^{MU9F$Le;pz|9S6u-pS0#T+(mh_xb%k{|~3ledl?Xv%F`$=Wfd|1NX#R zT4RN!UQ?{M5a+_~_T}gWOAA7Y6)gfQIK(x72~&`Tp3R0Vhl9r2v#dQ{s1sQV1i1{B zg!U&EJ0)?H=5n~H)KMXs9$8U0tz5FC9gAH2Z0wE&KZi6-E9S}GSfMpw_9&c%1j|pO zCoyK|BnG*clNfUj&chl?&s<`wW34NDV*wWqnZKkEn=MX}|L0=~+T9)NY>o94JS1Lk zq6?PTv!OYi$Ko{V@Rr`WIEf0XrKD@3-_Gb>igi2Y=N4VhOaE(%b;^kt(=Uz1cA}tt zU`5Z4WN<1NoIjyeb;nw}y4#p>$xv~D+e_S`yBM11(3z!3a|*OB8Qh&S z!*k$0M!}OWcpRq@L2Xj7WcX>&u!M)}OOG8o6V+IQ0!fw4#;%l{#|Mm=GTj8@7unoU zSORwi=L2Hi*>z55kh6B#m?%Wp)&`sI_E?Y9+pPBBjH9I+F-z}mZ|P`1H)ia{!~7*P z*I;lusRx7a?9SG%HqgUm{Ho`$iUr!-U}FT^5GvL&A~4k*j3F^j#B^r_Bbl6KTBn)T z>5*gV3})Y8<>{OK{lzPLebd?AVRv#Cp1A*l;_aM;djS`Xy=Gx#&v{KYV|(tuVE=ju zoeiHOr$i3-r^JuOmiy7zWIY4_JIxv0=8Rr*PD_t(4mf>E#P_E}KI3Eo(_)#>iB&OX6zr_7M^=fLGb*$O(E^P&Mo?BI?fPQfMRv`fk;XOi$gGSbqy z#>b?F?j6*5So&Iwpl)S78f%NSq291PCsjG6W2LRRpsc}3r0`H$XYT_oPwLF!mgKF- z{}Nk|bzM*$Eq+^}k0J5koL>Z=MOlvW%@O{2#hWVSYYUx*EvRHagx;j6;K^0R8#CIt ziZUVfYkb5RRBE8@W5@z8@YE4Lu4O{XN_M;(2#QlEuU4utuf2o4yrCX5at{X}$wLon zv(2}e(3aybU)j^^FOK=~miBJ+zAzU`5kiGFN)vRVqRwhCS z<)bf_Zq8u8BJ7`=T*vp>DYZ?X+lY3K~>7MYp%L?R^|C zyD~k!v6i+V&r?m{V_cL$ukp={d8aOHm^1GDU|M(*rV2T;lUbgvBBU0q zo?OCUiUy;bZcP-NU*HsN9V}eId=&ADb`yrgLpu!RHyFxRTzS={!O2gz--{)uDF)*8 zm|Si_%figs(_>W%ze?ojlXhL{4{c~H#8elwn8Hp*OQ+uzTuP9rdSzHa2gb02rYlS8 z;0lVgp+^4Jd8Z)ryHIgMvDirs(xIJ+vL!FkP{*GfY>*AB56g~W)W$#~(@8s~SR`2} zpiHMaJS~>1Z&JJ5H9)z#v3%hgpv!j!W>v6UXz{IKkbewo*gFZ%-g@@85y(J`B!{eV z?%ld9$Vq|6;WMPm4O5%f)u|RIaG26=IVJ9!9_(!l6%jMLFl}88jTgj0&ahWGq#vv> zaDIZV3glciM7YM5+?A|ug7(l8oZVthREwdl1>@{?l(lzsB)Xyvm9i#|&KW)XVMNqP z4IR~HNm`_AZU-|UiiajH({<5aLJ+w#w-kwGly0)6(=&2Rs`R%_qsQRdmn0yS4>#eu zSOFFCF_dJ82X&XkU~L%8{;W*j?(|?aXd3E|i*?GlSF{CSrc4<+*Do~v!kK*GM82#K z3(}&qd|BQGby~#ZiN6zvtVM=x2|%Zzz9@gX4Y23_d)tkWCWD?7-gBY|Gc6rL8Z-HWX>roGvaVp9Wo7PLuY=r zxw-z>1uHw}c6G()^OW|e^QND8@F&c?rWr#QzZKHWytI7jEN9Tm+YW*5Q(_ zxM^-)ID64Tkhyc_9Y1^4oP`o?P)qZgipvT1(1{|ze5q`lI%9vSpjeJqWW>GRW}FDm z;S6^&t^~*;K=*+I*{YWA0+!3r%sh5RV%rl43MHa*qPWGHkKHTPJn4b)C@C*@7$An4EEIL^B31Ii*JL>M@bS_Y#i= za$dCtuI~yw*2@7==K)Cc9KYuTT(?7Gg$6cYm##UuST~FQ$ViZ^lu8?91z*@j zOLMC@LedPbj})%U3~_?grD+6Fh*l5wHs&mcOU%dqzBd=K0Si2rayp73HW=cM^=H5d+E5$pwNh6cGHnI)Q4uRBU7;yS``imLYoCQL z3dx=rw1uL0Z24{DD8E8c-*oS5OT=Cv&;&f`RNea`!E$Q?wMLN-7kAh)B8!69hS0wP zM+{x7-4n|o`Ymz{r0n8wgbA5+gQ0~cQV&B73q{5f5gXu3?6%fojKdgy=LhF!kj%s? zzG%Y>oKhrmwj;>&myG)HH4+u#4i>`2Rvx%|mle`F7TdnMt16em8|vra4lLc1!1Tej zxWg^H z9v@p1DzoRIlAmC8I^>tYVos--4_7Y7rOTdPa9D@2wi!L9GSI*Q*T?5C5ek$@C)ZJ0j=-o>cJhC_#LYmwpk{u|@#rWWdTvDTU5ZxS} zRLb3_fkMEQ><8D!aa*HY$8M7A*bv(`%Bt)c#+cKo&B7|q#*Lk)$a$MuHp%&0fu(0< zLw*^43Z|zxMfIoGY2oJM+ob|ZuiF+ZN(LfRu{|`)oI920;<7vzq7C(nLQLdV8oLNQ zE;ws}s$9u;SoW49hZ)>LFM=eaf&MR^UDDv2!{X1h)y`R>$B}t+ay<^}*qK zb|iD+wy@~z3{Pvo-*P_XXzG1PWxSxG;e}L5NMVb`A<31?%FqNb)Ual?x1gcRC9WZ! zZaK(FAg)qj-dWj+WosM+8v!_9nz5jME*gI`7M1#&OJuq2!rtT7xwKe}5vu4~BT|FV z3Gdl(zS2OPza}Dgu*N{Xus1#LnRqSU3|eC!Tb{Jg-WM-e_-`!oOx^Z))bUi$r0^`kI?%fDc)!|do{8X5 zjkTcJosIGFP-GsDZ_EWv?}`uWf+q32#lkZ@6UAdK>p=4#10OW$TK{I&rBGL>x74J#`t;5p<8BlpPq9%%XL8pQG zc*J5|3+Tak-WD_qI(;!P9x!+bwC*rGV1(De)qVng1I`X}DdeDypgx{g7yymniHL?}hzFIiV>|Rd zji-)4bD$eR{dxE{-&x?#M?9ce(8$@4Hx>%l-H3y{waq}K#Lg8F!3BO&+{ z=;Lw2#Hpy^PL%sJ)E#KzbiDW!G#W*EanQx^+Y00Z4~0y`(@~M7@H=P*k8q6bMLZoS zCupV<4+;tGLV7FF9^!}(RG#j*3N+CJ{wmO3JlYRhw-V2nfXbuzHRmAyb5MRzd7>%} zngksLO|3zDSdDU>3lXS1;hF(Wg4V1-e$Im(Xc~{E41h*2M7-z1?qc}uvq%SzeMCSr zpld-;6q+N+`edBg)c3pA00 z|3Twl!WVr&Yp+4OIUo7C7Hu9hbsgFdXzlfAub}d%*CwHO?8#3c|Dbb0{XV1vngbmG z&EAOidI9K7C@*OAD@X@42bu+KT!*LJ1m6t#g@`YOdbtSs0Br!xf%bwnehnhf4CphU zb+^KwpefMF7b9O^hu=UGpq~THgZ6_)Z^JtaK(nCc5|rl~c-b9j8gvn;e>?gaXb$ul z(9}2K=SyMNkNynme+&5q&4IoNnz{pixeW4eBOOrxPP7xy9O&4!kl%%N2^zf{{sQ&C zgZ>Me1Ks~}$kQkfX!N`2H=x;j(BAOcy7av$A87u5)W?-5|M%c`&^+im!T$rl3kKaJ zcs=rY70UYn+B0bFL+GzxfPX+2f;N61cA$wLAYWI*4s^OuJb#t|O+JG7K;s$22io`q z%7G`>8=u4*5x#_c{|N0CG!6O^XmkVW@fygVM!MG`9nc79^v7ubpt)z^|LY)s4*9ZcF%*T_F;Ui&-xsXbvAcLCq%APYV77T?m@^JK8U34s_brklrBt4Vw5T=9ODfPoQ%_)Bi&G zLFG}*vO!UlEpk{Z^tOw12z9I5GP_{e4|Cncv z1kHl318ww?Pf&jn%v#Xoeuy)T@*LoqJ3(s?^vp)k4Co+eMrW(hE=HTG=x9@&sKM_s#`t*NF24=r+Zivh zovH9^O+}{GcsbD2_Qp$ZZz|&BOjUZEsczf>cn9e22;1?-i;qV?+u2mqPB32M1XG!r zU@DTkm}-Alw4aZ`&WFBlDx#Bs_cGO)$rx9rU{08dez7lP`r8d-VC4G{Q(1Q?Y^R}p9R}M^qClTQK0jruGM_^HheLLhsYo1cyv)%^=NMBR zkC=+O8Hi&B;+P3}J>ovrm}GCYN34~n_DI&~g&Kaad5kcWiv%muKyz*MI%L>VuH-9^y7$W+x`jP&v6UxG4RVycpt zpl&Y3?@RIfQvALQ@!~JO7J0kec+ty|{uQ8Cn94l$xhnUlsYpEr{$t=jjxs%NsJ~ zOg}ZFGe0#I@hoh9hO#_|c%OrRpF_KO9{3l?_Y26!3&!(*X{w^XG?m$3nu_E`QN&g=De=wDaKS1_JW0HS@|K3DC{*3nhXHy-0%Xo>m%;+>|7V}U3FQz(~H(olA z^#5v1-P^{Czm56_t$PPPddGNq(D)|kY%-N~e}nvQkb~C!9rC|J4jTW5F^!malK(a` zuXx#ak;nIt2Q=@j7tA4^U+Gn24)OdduR2rZRpqO^ifpy#)s4cKImYuE$9R=l(AurN z%H-Cbmj!Jc>v_qsUS;hzkZ%JyXzjL;Z|hY=xAQ7;+j-TAT5mMwl8X5Du-P6q<1o%* zF3Dp4z}!(0-5GW}d)3him>YKSj4$)YM9<4i^r|p-c#++auias{2lV#vD$Z^>R>O=2IfYOAT9H*Kmn>W+Oq@B90DTkWx*=lx@UZ>#wS zc%zQ4^Ssa3c~##6eF*e-po4W@O~b*Scj%#BRmY*;=vxl;ydNIwZRJh#YK}k58}-KF zUeza#@V0vGNYC5uD6gjLC~wp|M|oQveY7{~;iEn8iKD%mQ;zXQeIer296r2F8}NZ%&?59z2ywmh|@yOK^OJ&<%d=}gkOq$iU`NzWqf zCH*|GAxrlch&L$#P-sRUCYR<7PvbxDfkx%ESEML3vpHcTzqfB>sme$Eiw5 z(DwBd<=dA?huYtZlsn==`*?}+u=;zI^053b*kC1L{)tf@mj5K>W1S3Y`EI7%50O7i zIZo$Fg4(}D`93AmA^+_3l+FLHA@YMM59|MjjUd0C^04;ztr6_+qC9MT`5xtA<$siN zoc@*s_0Nwe4{N_qQyy0TyFP6tVf|+^p%J&G7Ur%{$i2QcS z!`k0{l!vvCmni3SQbMuw6&LQa!ju8Jo&)Av?8@~>x{9_^UpGJ9@ ze_AOItN-^X5A)C1pIFPV`C$s>Vg2tQ%5|Bh#nAROoAR*n<7~>q=GQwZ4{JZ)r97;C zjOTiATg@1$=5I3PVfNETu&<{)to)}^9yUJrP=0tw{(eV!nE(Dtd076vpW6Bjn_sFa z$F^fhQ2!iEd06?5qdd&NYetBF6Xjv~8>Bp}{FPZ-zOejHpggSo&ZRso{!=IqTVJlA zJZyYDkMgkb2IVwto(nbJZ%0=|IGR?to|OMJZyf-Qyw4Zxye;Mg|(z?qm zKSA10I!GE{Yvp~U1EkT*Eq^Vkxx(T`($%DS(#VxozKk?ST6dM@CrJBA2T2>`%aRCv zqywbWueSWPq#H@6e$nz*lWriLkhJ_|r0Yp**~7=7MkEYx~8f7c2!U2=|fy zp2L5T{L#NG)qjNi?HqoV{9PUXo8(V*_&eNZP z`EI$+BEQ4Y?+(%bJozgf{VT{n&*6VDME^SSUH|VF;(w`6@!T!6bIT#;4YGDQmHP;1 zlD3j|lJ=0EPnvYF`cw0z>1e%cJ!`#cJ!-uvol8GxJ!m}YXT|DA^_yZ%|BH-AskTb( zCn$0d3jU%0e&V$2jl}O~FKdH$?y(wQbL#QE5dLZRTm82j{X2=DBdyqI^)!9$*UUaH z|KWN(|CA?m{EKQ~x&5Pu`gyUQ{uV#T9+O*+G$%f{9CBZogh$z~wA^x^nFP0da^IPR zH1*Zbavz$6L+ForEU(;`CgH0o zAB~T;LFoEJ+lTZQ86Vei9MpM2<#)2*pUQr({2e(SU+VDHeku9akxDvJ6Hha~dmTH) zItse$B271JJUz@APxE6nCbcZ3k{>xIapz^+8xsWAA6fEUf5?5g5?p^I{eW$5aptYM zNtS;p{jh<4Xe8hDPwk#o|NrzjtNvTGjrCiY|7wB{@Y;2#Xr9Y*==|a{zpt`A>3SeX z{v~Jx<>tdvSbu$t-#CV?9b~)L`G3JqrWG) zH>OZOESKB9<$iGq)zsI1oW?z265RHkBj0V`8E#a&{!B@wBOJ{5wZ0PM`;bXaefoJm z_1<#)EdCX}8eaDqPa5Wb_1pAXTYoSO!hnNox3_W~r$)1$|EukRc8bI5>546=C)pc! z>q)SQRyO-x0B)I3w)>By!1OFXaB|8J7k@;c&VQtc1Y zo+YfOAJw0AJCxSL1_#&fXyqTYKRmbv^(Xz|aF$=kEqT5~g4-YDc@qh4e~{--B)IjL zhy-lo)?bu-A7W_<5vQK!m#GKQ(|YJ}{4Vt*LFWPWL!N%MQrr(XzO)|th{O8B%Uj@2 z*;{t|L*q=F1GhiOb2$^2}w|%(% z^eMKRjZXWKd`i%MtMwk)skFT`?p%u36MxWt`{ylaXXW~>JijHu?YHtgmjt)p%JW?k z-1bpB-}2q|k*B^7vGm922=yxc@_*BB)erp>O8q=F_#zh~V`wD409ckZT-K=AZ1a+& zy7@ut&-ITy=O!V6zZ(956oRHR=;W`U;QR<1XZGEK{K~vLe!VTH&b#vbodkEBk>~Lw zxaE`Q^CYWR`%!{?A7bgjYw6#x{-Wck+aI+3i(G=Pf7B0o`pZhO{t3Qcs0i2fh{ODO{ucUk z%ma2@Qh&;Gx)NM}%5%FCTz|@Qyb@f0Mtd#a9e*O^`w&aYN&55s#uw2G8&6z+svjaB zD;+;F4jv%B0CAU_mu}tye^w$cci%;xYnI^d6X2PtAh`a-b5ub{;8<=R(|jfU((+lW z;m5G{^4%>cpY*>^JMBfD)0Qx-y{xu;w|w#(w**j~=0 z-pXGI*REZ~U)ukE$NT&KN*dPx)DQ7VrT)x2cml6q>-yvKO#d9FUwdwl4YS_y>uTCr zY4|ZhQCNLF?!+4&la)w5x5D4wna_)uPkC-$!m#@KoaMXiRGzDs;MSu&XD{K0j9<@V zvO_1QW2YHWz1h?MnF0*{Merw71A(on3KSDie zzjpnues<>p^-tZDQon9+aGp5K&l|VE&oWNB`!w=i2?_4HQrT=m_aPR4X6R4dPb=51MbAAC5A&z`p>OX}e@@t^6i0}|{F(cZ{3-9>kl?mkc^`)a z*Prr!4hgP5@horCeR><91j()bdXMc&VS(JJ{yJm<#Y@ zD*u!x^lw|>H%Za;gS^j0g6oGQ`3cBm9+JP}py|i=EiFf}PVw)sa=iN?mBW5|yi7T6 zu(?Qplq-j(KYhQ=D@Ry6u6bEn#pVZD-;|rrqv0xN#3_3!JX&i{W}ue zcAUP^^4<9?Nxl!Ulw{+FJf9W(vwx|d`y8Ah4r?#9Ti|D@_ea@JQ(RxgZvqp+^|QRE zNWvA=znl8<-XaNW$k%;xd5@6<*Z=ZfBMEMO$$O3@e2eisp!vDQ^1tlxljQpli|2Bz zmlvq_sIy)ip#0?!xvVoJp8s;4SIOr<#*t1SO+ZKdChfF1sQ;H8P+E_52bSX1#9{qq z;uhB9dk@)u_PEx|cWv&5)#E*u@A_Zfvm{|yzqsG>pJx2JzON(ydGdeBbQ{V4jl++V z{|6_YB>6s)sls2L^>q06ZF$`Dz(LAqQT~ck&*pR1-;E*i8p_Y0+&!<5b|CqPvA#RC z-bt?{y@m7+(uYZZPO9_VRKz9WVAiYFZ{0zq?PAcui8?C}YbVpTpqp%NL%Xjx*^W^&wOHKJ~7w6L69p|P}{(k$j63?S-FVB*O z?bm9(==EFmXaBU)b`v?Q6t5)~`yKH2(Q_Vf0>Vf4G24Fi(S6LeJ^bIgk2!3-JZB5W zOId&1!0|}uOL?EB1b4oa_iIXU=Sz9trUZAq#Cy$xu+|wbYsvQ^l@?XUaqsKYbJv%; z{>XE@dv}ESQvI;;Q>EkDqQgsZf>_2m$;X!7Z+XEM_`Tfuw7jQOf;&&idrKwUL;vXh zzr4p(f?FT*UQ-Ff>f?FKch9G5$@d`^KTKzRe1hj??moWO$L8)2tA84gDE0q`~KS&wLik%KZ*2N8g83js)}T z)_-z@a%lRAqe|wH|$Jl83Zn=Z^ z@Mc{;P~f*KH~CeTb#qN7(MiJ}k(Xuy%hp-&gPmY1ny?`lsROQa|S$Tyu<- zf3)7Reh-|F!$<2a>yMAtTed~~zqa1GXA8%_DI8yP{FC>GOK|5Yd7rohcfUv8FD}6y z|Kxq+65R1G_Z!RKgX!w{mm%MWSXx>G$G?NA7q$-DmG3i|L>e~!sec;ko$=4XHM6Yz z0_36Gy#LS^_*r6f{VDHXm*CF(cn59}5;&Hd_ci@A^J%rik74uWlUq;@S)VU*+Dl!| zrtOw5N50!GQm(q;^Hzer(kot22{cfeWpZ&Pfdg><* z>#zUbf_jk@T>s1W4J532L|P%v&wgpC`9lDM{l{|sRnw0)l;+!74L^ppud%;jdc#f1 za>Sp~UmsP$agm+xaEkyWBCb?a^=wUBgb!EIl|g^!xof7uESmGv~T%dhy=GC z%lAVhxb3*{@0Q=?v}3&QJqSLI(vIV7$N!*S*t~N++wUzSv|}xA&D>JI#U0#799I9Q zZ-L+BzQ&_7QYw62DBHwqBusWoi8%Kyg5?F`d5A>ywcxg6_NIuK?Prg4R!S$bfk4A#)Klwh5 zgarP|`A_qem{;09#HL&b>sNPdLHT4|asuBAu=THP`;hPGNO1d4=D(I-^{Ca;c`-u% zUaU{$N6Fuxe0@$aLH;Kl{S^5=l9B$tn*H#TOwT4~I^NOgXjint`KXFX|sMdz2+`=EmpjaD93?+mA>_2tqUcr1gt$VFaO_d>u#fe#UxeSWucTD;<7JfF#t)@Vzeye{=Zq9WV(A{FN(*rayh* z2P?%JI1msT}_3^5u~45K0Iuho(QUndJyuSA1~`$}tA{a^JTh z-%FG*?J-Mrogm*&l;FN^L%ydd!Ci+$wzGWqIgZ4(mhZkNBSpUZo{S9nck_8PeNRS? z{K?Fxt`iK?t#$J6lkX$1RrpJBofGyvPCw;g@3%=)9`;_1^_0(KKHT-Nu2(DkaehxDnX{iFZ1Qe1bs#WD{|&1~uY4R>!r`;&bz_qizee(X*oa1Egm$3oUALa}Ji%S>svqjkDD`vN!5fJ$ zKpv#-wEplj2rq1bKP5$X9aX!d^@BT4G?JfyO}TkO(@%V+v>ZX^${fPRr9W*!IpjR| zX|DUG^ZY};$10(j{pmRJ>&9DtH~FeB-))uPwu{70mfuAECdLyX-#u@NlJ6rf@x%tU zm+NSMhI4+DrCiUSnjN{c7l~);b2cB-NcDW`)5O}oq+d#SkA75tHk?^nFF6NKZMO0Y zU|X(zc{!VY5cy^t!q(}DU2QyW`;zbEN=V?ZT>H}WbIhmczF!C{$M_Ga9Fg71mqWhu zDLBcUb=zp&W(uTR&JiF8+|p5!s`BeaLsNB_!}yu3c&R z8#c2XI?kN(0~@cd>+-(EM?YT5m+xpx5IfnUnnt@-9CzjW+Y+ASeS8;_pC$hX9LH6^ zk?FYajc91I^^hP9A}w=>kSF=s0e>Ie7jGT%(S2IB9e#A5mTeFJuidAW+JbRX-dFi& zjw|{cQDkph&+c{n+I=j)i{qDG-^-GJHTk;#8JTMJ-TS(-w zZwuOol-X?uar(n|I?Fc?SgQOS`EI*S9&Gg@j9=Srg#2dmwcSR^ci(3e zC*Mce#G`|3kKG~dF;BU^ugHB*vb5JK{OS9MUS)gL=heOEZNA5l?nt^f>0zW7Lrv;m z))f-;d{FBx@6>;`qqIFtSZ?tJur1fVf3*emFYWu=_t^Y@hy657|6NFb>Gim}L#^Hq zss9l5Gvxb-E6_O4=JN{LKk1Ag3FwI*bl(L(gP{4(vz*G0be8%-`LZ@E=Z8Pg50S3& zc51J5oc?gA#^bO~{?%2z$*YybWR>r>l-)~|k7LB9i}-~G|?O}~5a$$M?P(EA$ny02dE*6$$b z_qKF?)9-cZ_qOh1Jo;TA{hrWE_u2SgC;c0#?sMw*f{x;Q^z}Ot`rV7KlCR_3%f$Nq zfgQeQaz`;-4eto!2n-J`=;Pr6U9?|;{QQ+=QHY1GsG zb8RR3UTfVy*Zq5azUvLz>2t~2F7*Al`d(Ch530UzHO=>a>ib&P6F)_&?*-NITilO9gGfV7?T64I}dewXx7QhhInzK28KyP@yd(D#Dqedzjr z27Rx9zP~`vYjqu}>oa}+T+fH~d|ID-*XJ$u{8XRs)aM8FeG?nG-qYuz^t*BTe3m{h zpwBDl_ww|9@yNrreio7H{mthS>wVCV5dVpE>Lb?f7}6-I-Vdnv7wUbkw^6S5)xJvn zCaK;(srP&Bp0V-keNcMeliufaHs$L`A0yTKskY(%^e@TxiT5GZ`!e)C4Bc1O`){tN zp6+w&^(wudrPtqdpIZ05bstIhy9@jM+{e)UjMs_ZA|1!|{K2HUk1~(=Oj12R(esf$ z^1nu^=N)=}pyw63p4Ii8uEXYYK3Pbr>w+7JZzk3G>rvt?>0e1F{?OK!&QAvs&mh(P z1^u3)en0Uf%9oH{M0z9X?WFqM$qez2Nqi^&V&Z~akRr90t|J3(hHGZWdeg9Rz=c?a*)$hQ% z-)VKf?;7?!R{dV9e!tcI{;Pi9Rlg7Gen(cn2dnwl_T#pPk=nukse1pgzUS+Hzt{b4 zuYRvrzt5}v$Mu(6FX~s=2OEPg1-jJD^MH9XG^Qyi$- zyz|f6ZLHp+5#npy*6L-cr{52E)9>G|G~KX#W*MLVd8@DAA$Q}Ox_xPUVfoB6-8kdZ z?^nC=rN))U*KkcKR{cJvn_+y)cjRAmmcR7)()@(wub=5g8K0)( z(!BHC99OP*km;sJ$lo&Odn;l2i#p$t$??1Enx4`$4$OZ3TUgK|Ge1l9k$@m6C z`g_iaPy46VgVF}-Wx&6JoN@fh%e6f6Gtz8fB$XVzqCHW%DbNNrALS_b>Qa3=N~}5OWr?!8~DD@k^C~i zbQ?#AZ^9v)m%rMBtzK$`_?9{ER}AxClm51D_{OgF-LBdour z4=YV4tiMH>Zj$kZ%^!VyUzg@Lth`CS_e4Iua`W<6sj-mG|u>HF0=7Y zrN33KH1DJvR*vaM*?1N)zA(S6r(TwNVdeFY*}U?aqphC5*3z(a{aK~)g_Xn9m+FQ2 zZyDojV7g)c8=zihg#1lEwlv+a{MF62dbO8Z8dl!yahn%k!bvxEMX8;(g9#0mKb`67 z`LD{A_E9fALjDHkl%^9_-W=o8_`~v7_h}p7#u4(Drrt>L4N`9^{Sj8))yLa(HD6)% zk#?Tj4l8el@oE0nUs>uW{)8|>e35+K!zAW{UA?a!UHt_jV z#bI=U^W18fUhRoCe_{DA*exh6Z-MXp=%ZfERqwB#bK(n2e=46>T*Uao{MS#tEcJAs z$H|_FFD%Vh{)?qp_4AC+|ALi=#W&q~?kz07^-MQDLVU(~{wyrM1k=ro5Z{K)jIV)u zwO7A?d6Uj_WnuZNrCxM|_!c?OMTNz;k@2NRh|hPPhY5=>rRj#$zqW(be11l87+uD6 z8yR2N{F^_cw7rF`hX$B#it&ZDzxAIfjW4Xc)2SCG*K##Bm&T|3Vf0L^7fD(gmcI$n z()hyC?_;{j5#q~jW_(fV$C>#0c?CZ{583)-&Dg z2=SS=&5JL=bank7HvcBhDvd8}{_S73d3qZdpZ1Hebfah6_%b{{Y2f*&+fJj)OVic! zZ&$CM@zq{is_*J8>wJH?>i09<>5MNL5^tLEsh--qbkIq6?2Gn#sp{2MmF6o~U5d>p zi=#AXAXa;q{`=Q9{sGk+?ZoFA5JyS<5%l+A{-;teGJ?J)r|~C8(649w4P#kuQjI5! zYW(RD^iOd7zhMM@O;6(=7(suv6MuaB|DFGnBk2DvSK5A}UH`lI`$o{;@zv7!`$y1s z{gVsP|K_*vI7D?nq91wSBM*G!fsZ`!kq18Vz(*eV$OHf9Jh1(wtQS4LzNtPwVZqF% z`b5Wscullv=7JfU@o(mWnbCK7d6#wQ6N3quK%$v|m-PPMTVF>4mih({35Zl#%E-nDciMl9u~SKuS$)E=e$ z#c@oqxvdYXOd<^!0dtWp{fH@*bHoRz<$7eI*d46K(tL*%=>w))E|KEQuo6n@mwqkE zGPH{Ghvr%2aa8#1g)`&R<8`e1pg}qgFEXhK)X*S`quiX|(LHPfLh7u^@;!q253-^C z!YM)76M`MYsQ5=qiGge!c=L=O+{l-^iLkT`GOfI z&4_M4^Yod~oo7TpQJ1V*P#^af1j9|dRt6nC3g6uFHM0HJkLeuP_KPXMbFzp;qG-mrq^Zc2g zu5YfNJEN(od2;i-rutPr>LVLB(Q>}^@x5o_x0Ztq-b68-;u z&jxR}>b#Z97stBIaKVDu(v=-8-LqH6yJI~)?OmNFvA#@FnnvR1?=p>4@>^bV+^{^& zUwl@qwbvvDz0}}V52TV6sXi~&KjGmAQmN|HfS2kUrFod$u<+Ez+0E^3$oYfJdLid0 z%w9NS$Qc@G?#7Db`s5EXl?}=D4FR9hXzyLqysFM5`iiq)RbtEI5Vp3oE{mDO#v3a# zU-W#5Ah5T>RY3(nO3%ON-3N`33rBckTk zWoI`pUD?u&7Fm;ww5{oAgJ9+2=Ed#EC+cW@p_Y?7MiB9FvCdd`d+Y4gt+9A-&~;$u zcH~*@ts-mbUSkq#zgVVg6`7}o5*QZGoX%C!W`bnWcWLfZ*#lD9y@#jDp7;;iu#y4ujVW%a)z>tTqT z*VKfL(Te_YYA8#iN!kLWOv^sW&}qN3QMIH9#elAzIx<62`waVE>ko7&Hn(y!<%D?PcT zyIlr<(MXkQpf}BJS<|($S7iMqvZj^DZcr+brH5qgJw*eBS+Rad(jAL;v=rwyQ!ML= zcXhV)EbJj@a^8XRmGOP{@gb z9W;jqMzI_yCs+{cUD@4va!bd`z%luP&f?h8_D+oDy{#BcQHupZtF+_pm8}?yY_*6u zQK^YyoEx%QTf|xp!H2*EtetUqLuDPNVLMxg~YbUo0tZ zXlX~lp&YeVEO5qivm#TFws*Gowqxo$w`c-F1~(KGN=ALuT|vO1KWIjWNTD_sMBVUk z57sL|-?K9TYOhEv!~YDY4#UN6O@?c>IjVz>svYr>*F=@pYL85@7(cqOY=U5IL4f=( zZ|}s+EbJuNoU96iN?$2oW-n1s6|to$ligp10VB?FqFH9}8NC>&7O(7$&4t6nGA))+ z2`W-LjU5_h#d=!1+wIH(t@WbS6YCI#ldx(6D^n%&V^F{#X5nop;-TM2=CR0VUy7+0 zH91_^){Z{h6BKx3AU&z`9L#sk3t~NJ<6@Kx*hO>Xl9qNX9nb{>K`>8h?Kdx3+1c8> zq^r9bqh@ovU7lbx70s5OI2NkCOT=_g7>m!1b$1C$R0CmV$Gk0Yt-vMSFdSWfzwo9jkx4aNXe*k04TbIWr%Cy3GFjlV@7)RH{(xrJhs$z9>ux5Z} zX1Hi&rwTWS5aR`7%@TIR0`G1l?4&qXjb%dpu?y^KPO>pTj-BRaw6)D&+!O0wB`b3{ zsYG}j7IQ1RF`ouaWUxf0R`r2LPHFF5*3i<~)?uSbjIycPG#12`cdd%4LEzm|`O3~Y zot$V_Buhk1yNZ5-m*B>HlxS9Q5`e?8nra=PWQrPEuH4Rtvhgf z6a0K;>rS(FY%nbM46ShP8rx&;9cwCkP#?YKNw1@0{t|QfsLnO!mQkhxhP`IM6HhN} zUmnBUI-|2~uCB-aSz)#kQGv0kVkVaEC9LbVk~6vz)=gW@>RO2@yo8zB>e!C1mfjNH z?OV-3E4Xv3xiVh8uvOEtuI^HWOUInlDP26)X094jY4Sc^YL%LTLuP-x8@V2` z0`>GprTGK+*;e5%!>e9!`uJ{T2Zob{U1k&fW-I8LDhvqAu}Uy+Y#rFGt1=s_OvQ}O zHS@b=WqoIrc?=jaey_@WzpBclF7WXFq0EJHOn=q$(1kF`q8$h7cWhH-vbT6%)5^u@ zi*oM!%GkhqQIxuQpSFd?%)C}_zo4spCnHxtzy-(B=H{sTV3dDc+sNQ8#h9}@J#J_%&c^FFh zTSX~(n;dif6+zQ0uB4ZsllqoOGv5x5cgZn(uN>2lAnM8$D_c6?@|#9ucv%zF{eQN` zT1{G(`RX>Nrrta^+BQJ*kI_M+Gyfeu$6QnsG_!Bi1kKE>uPHRGhilB=QGaO0=C7l> zmfH=3&ZVa;YwwLU#j!>-zZ#2jWh4vv;Fx<<%816-SF^OUOKPefr?uvJsAV6k@M23* z_iML85gxDbf>iIRLGGWB2vR?UX_fRD^HPm8|JQ83{=$4+2(#pqqM7&+W4aowJU|fB ze-Kk{gUGW_$uaY^9MeCRW9k_>=6(|V{%P<#D;X{6blI&WdnK&?tzrAzFwK7j9kWC; zF$VEJAH@HQApRG$G$m?}jggXV7!&09?J>hU_N|iQ#$hSGIc8Yi?uKUWSHm=K*jnN) zNpzjW`C^c(mx3JrCiwkI@cUIc=KoaT&F`Mg2J|HK^KSikaJu4S$CR5vC1pen% zl6f4>_A|{7YMac@cWA&2``;bsn6K;o@L(Nb%wcZ;(YV3-RsTo_LwcBiMich zX#VJP|6^gSr}tPa30HQ<7R2J1n`9lb=c4*@{I~ZEMjE?hw=OpQdj;+P&dCc*dP-rm zxqEN41Pm6xti@DXqJQyTrlQCp=C8F{tPSI;%-Vn10$n{01sW#>`Z)@8`*>TRBntFB z6zJXE=9{NcpgUNg6bkgj`xWShkOB>sDbTI9Ko_Dwmkt%^cT;SE`p3BidUwy#0zEcP z3-l}sltzJ2Tfs5$ZxpV|&Us(iL8m{}zIe}AXE~?ex~HrdN__b1DWGP-#uqEzH>8+>V(LGL5i@>ze5bj4FH>D_el>n*%Z{0n>3P$H z+2-fFV1mAGS9AAnSn31|RN0QpkLQZ#;oVI|kwtQ+`9sT8iQ=sZRc6C~w(=0k3p-1q z-`J_sYzz{8cBit5UbD+=vq=*D#;)dtl0<*I6BB)+G|@|Tb`l*xqIsL>1ruaMSURV( zu<*KT=O%3X277jQLa*9IdJWQC8U6tHYu^*Aba31l921E#;PfZP1gl(G_oa7{h3@xv zv9r&HUC@S#q~8mqk5T$8q=P{WsS6~Y4Z$%V9Q!U5P6kI)A&Wttph*3{wTsM@=1H`s zfpYSzcMat4K%TrvVp)ID7|(7tVflBDj{+7m?(|J%(YefucN=cIZn*8g_JJ2+i&5s{G1aJByC8jG;zBbx(XM5$+kKw7Y4;|% zo{>a9Ok7f=_Y(A8qu$lfyVL63Fv(N~XHj3Bh;{xF^Yp~-rPxvE?5%H!%iMJ-a@>E3 zkxmGl=Hotv$Y-Bv_qehgoUO4N)$$0$ zP*OGjLc81;qJP^S!}SwW;LR%#f2Hg-Yi;KC=<4J-6NWXr!FTJ&uox~$>x#YL!C|)R zJ~rI8f0%6&wprN1ufZ{OrTpFy9P`1k?<(PBg5$tdV=CqpFX8(qi64SXh9zeJ_rcZ4 zFF49~hbTV?<@H~XRC2*_?bY%-9UM0X$HW)K^Rk0lbgKS_KeXU5{d>X(<+QGtRHXF) zw6f4bX@g@bDZe)a$9!%p+g(cb~( z3g}IswS7S@g5$>En7A>>MR3dp$HCy3x+%y-aLfnCzOMwiz!9t8lJ@o7UV6z%+vQsr zDF(`D{%4rxCTJ$tNu08{D~a~@$tCaw^qBSKHM6CfFF`X0O_cX$Ii`c-#^9Lvs&M*) zV>UPr2FKJbl82$o0$g+6F-11@y5hLtgll-_8jLa<%4`0-RI?A7d1zvsNy#yTqdiY8 zDOCU7II}C^{C)3Wm3!en!C793=r!?b`FQff;`xt_=guhjT7G^wAnX1TE=D?sV3zL+W#OpNWnDx@5(v=V;EAn1$ zt3*{AnvwLV#8yc!UuC05veiroHg%Cal9pJIhg3zNp`74ig}3X(v+s?$si znX1&^e%h;z_>p)5Q6+=Fq?dt}WGjlaym+!Qi7Yk7OF{-p;s5d|YXU~dd;(F}e<&VG zlSZEMlHEi_3Lh`ZjTXH~Hprrl-ps3j|q+u{Fn zsKP|GC_^1Cu9W(OVkG6^Yd>J-Mh`d2qR^0Myl4VxrK_^YDl(6RDl-*zK3wic)6hZW zUevFJw}qSZcDkwNa&MP$f3F(1c-**gQ~zDD=+_n3SB@JqZrpzO*Z8N(PaV3$4o5Cn zuwY^PcPd^Rb&I#)B!ordCqysyj!$@_uJyiGaaZLzqw0(e?URjZ<8L8%IQV|xC6%6; z`Oj-WlOi$Zc-ku#uGn8LLIlBL zUyQ|m&2*6%lc2p~;flR}pFptK7h|!%hW2;RUa{Ki`^MG27>oUFwEsEn6|4O!Y-~wT z`(iBiyB;AD>~-&L{ij&%i_??*7h|#CpY{uAuUPFD2eA*OUyQ~6YT7?cd&O#BoL;%~ zQ?&Q@vH4fLx%T(aeiiK%Z?63lw11QKiq(FqQ~qKs<$sg*Z4gNNRjl@(l^+N~r2NHL z?3W&86}~`w#ln^L7j%{)`(iBikI??dv{$V5r`hNW=@(9kj@_A*yW5IhfuVl3%DP5UcouUPFzO8+I=-%oqRn`{3T z?cboiVzu8d$o)|Mi*exp8KQ}L*q8n%R{N3izaRCRXs=l9i_;VT6=O;NWZGX#d&O!$ zQu@ni|8v?aR{KV${KZ((Ur+nd$e8pW#cKa2`GFur@?VU_{_FKtVH)if3s?Hjr|>61 zu-F%4v44s7N!lw``$GfkA^T!1_S?-8O=DiBy<)YO?^Z|i?O7?g7%NmUa{IQ2&{+fi?P^0PW$Z+u=!WKx%T5{ zi>5J6v{$^j_DgBsM|;I;ztG8lF_!#4MEloiuUPHd9s6P|_LGklO=Au^(3W4Z+VgWc z1^*Xgv2Qxg+FwO`#cID;KH7pHcpeVLSnTirv`CEkDeV;tSK7}lB18}@_QhE27alJX ztRD`t`ByAlu`jM~u`kAAe>?4uq`hLbKS?4-5G?k^SnU5z`_Ir`@#fk$&J|5#E~LHU z&9(mq?Y~WX#hYvYFWUc<_KMZMc)phM7h@^^f)hm3n0IKeSnbCL(jos9W3gXK`#rD_ zm+?cf+D~xoi?P_BPy0EvSFH9?$G#Yg{VTLTm-dR){$j_z7>j-DJkd1fyR=uV_QyN+ z#aQg`ru`pjuUPF9j(sr}`vd2TCVY3W^`Bz3mv0+O5G+X*W3it``%`GISnaP3tcUE2 zvDp8J_LtILvD$w^ejo^u^oz0B|F_X9e3SNyg)9B{E-NnB7h|!%V}Vt8g!YPG1J=4i zG=aUuca8uAv6B20V~KB4lZ~(S5bICH!WH{s|A~Du7W;i@e>v?Ht39eY2!h4F7>oTW zw3oL^NPkc)`jY-rf%Q=S6+aJspE4o81Kt~*P2cA-_E3xUy)6e4>vyM40xq`i5&3S$ z=zC(W5j@eDwKv!kx^D>H-IyHl+NPwW$~BF+(in|OdYOPnX(L_A2m z*I_n(gIjVWoIqSdyqvg}_zL0)#J3Rp#7`4XC4Q5*j(EFI*z~3oPbZELHxoAyUrpRd z{6k`Mqs{NT#5Kf|KS_TPf0}p#@ls-+crEc%;=73Jh<`#no%qkh5#lk^ZF&vF`w}-2 zpG3TfSlVBk92nXl-xj!Td&}rmJl^8lh||Om5}Tc@{CSn{Z1E=IEb$&#=t}(g306Lj zIK8XI7ZE4X1|@upIJ$?$PpSULEdCvFme?H5_=yi9PWo2=6ymx`7WWc265mW*yQh_Z zpV%jUg*ZoCbA(OL-^=PxCe9EaN1P*GLL78@m|Us$G6*2tL7XOjR5A8pB)m+VBd);0 zS^Sy7K7oXZ#0hQ)e3Cdt+(c|}UL+wwoFsmb*yjND8gY(zo1<)c2IH`VPZHOmUrAU= zT#J4n;RfO?+JS_JiF5Fygja|S$|Ygzqv=oLgNdWW?ZmanmxQ~B8;`O071fVeye;_R zp9Jwt;>MX){#oL>dW*kIoFcxT*q?3X&l5+EwRjV8ZG*-8L~MHTITqIwCyCD@P7_~6 zoF%@8I8XdMaowj)5Nc-F_;bW_i2Zq1zM42sd>e7?d@KKj+BaJ4!4Kk}#wLr8CdS=2 zL1}8nyTd#fvR|hd9}4@ouwh zd}-pj#JJ-%2Sw#Tu2 z#CsFho@?a`iF3qBV)HpGzk@hQ{2X!QJS+bTar%6V_eDRD@}@7acs_BKco}h?I6+){ zq1C^IICZhb>xt_wvG^(C4DkSQ{8B6b4{_~f7LP?glKj*W?@62|K8858*6J@Kj$di< z`NaNJ7GFyoA-zGQI?`myA%k$4iZf31~&f;d8aI&q%3 zm)Klq^^>Ykd^d6J^;Z5kagz8&wZFm2|EhB0F*vc2{FyIX`QF4y;=_skJ}WhLoqhGP|e-P)0cb-fCt+Vo@h;uhvyofk{i^a={lf)Mi zN55<3zaY-uWAWdK)Aw4u>j`X6_gj1faU=1W#Bt&ah?B(MAx;zjf;j&_Oi%6CTf8I2 zaq)lR0gI0!&OT`IBH}#pYU0|5to&Bu4DsW{jo-KO-xEiEU~vuR2}v(Xd?0b2_!Q#g zBUV2_9M4$%9pc6(EPjSK`$LQWNSr6G!8|1C)jnzE`w;s-vUmn@n)npr=msl~tNqg! zUrAg?d^>T5_%XHrvDN<*aqd}*C!T2Y)A*dlhZ5I5Z}G9jb;QlY8RBz^{hwR?KH>!N zoy1Av$BE;=u=;PS{tFgQSzz;%+h}n;arRdh_o$rsI^xu?t^7ga4DrjvjW1gH-_)LX zOcTrhl9eAo9Dmv3*~FROSiFchN8GLYuUPrz#98966W8Ue{28?;ev3Hus+I4s(B>!c zn#G3_r-)A@u6y0euOg1TVeyS>|67ZnAddge;2IAyq~!4ZHu2G&JYg}$KSE? ztxvJ(nN1c?BTf^aOkDSOD_=$2NPH7kTuM&HWsBhC}QNbFCt^3hA^ zzr8I!g1B}ci%%!c5`Rhcr&{?vDkshn=Ra=cyDzozC-<{BLY&>-;=Qpr zTu1y4ah!OEWsIM=fjCXPin#Vb8~+!HGsJfiM-H;`r-=PJi(e-{}bmRq^ruX8i8-hcBX zvEENp)oJzh{+MHk^?sMLi1q%J>xlJ!l*ftn{*t$d^?s4vyKMY=|HlI2U1nJSUq!6< zXFNl!_gicexAuDfM1)xHhrq-9!T6!~H#|kG_bcqQ!pimjgHwt1eu6uQ_5Of=6YKT< zhHh)G*YB?)*6Z;NUYa8?ydk{vhnNn z#m^Ay^}-~vUjKW9Sg+^hi1qs1AhBL=+wB}1zg{n!L9Exm78C3BtSbdq8S};>+rDll zu07S_?+~veew6qO-T?MI@mk{F68ooH`+pG6CEjYaO>YD7Zo~`Eu=)oOuOmK2^@&d; z-bCC=eB@`W{Yv7Ci7z95gZM_`sxz(rw~6bBe?Xih{wZ;!+3LSad>!#S#2Mo1HMV>; zQLDc*@igL(6R&Hr@*{}z#3v9>Uu@;g#4i!AAfC`_OVj{ zo%qMZRZFb=W#V4qJn{F5E6=s%8zdf2Jb9_L--o!7_*29K#K#jiEVKHbA>Ogw;x6Jl zi7zDHNPIobXfhW&szCH;+=>S#8ZhQ z%dP(5#HQ2Yxx`W8Gl~0&aKwED77Eai_9k0ZW{crx*XRaXBK#2v&9#P<=OMqG1_)$br~B>p^cnppOwCH+C- zTZ!kcw)XcCuO@zyI77UVxMq#j|08iD@qdU1h_^k@rgz`DR(}%lj-R#oP~r&jY~r=V zrx0g}+leQ9&f0&LI7<8l;;V>nA)b4l)&DN>b;OSozeM~C;t8L(`oAZhMf^|V+laUR zye;3G#JdwuJKx$LL>wocLA;K*iFgBXjCd3AImCE?z(}~9crNi*h_55Qi+F(e5#qWF zto_f3R};TZd>irKh_l3_&$s3K5AiO+h<{G}HnF+H##f!N<=dZl0`Vf^{fI9nK8pAm z;`zioUTWiOAwGk+hxj()ONiej{xb2j%dGvkh(AaC5b+blKOr8w*6P1PypZ^9;&sH; z7ufQ>K|FzY|I4lYe#E`RM-zXaxRH4J6;^*Saf-N?c-ECxekpOBxQ}=p@&DJ}*MP@$ zm1hn=4F&>;V1g4!5Fwj7gvc66j%778awOXlmZibtI401JM>AK};L*%^sKdI85?nAz2yT`I?`~kdOK4r%<}n0XKUtOQlRrFSwu2|Nh=!uNCf%D_v3Gj}onCBVaXGwui83;cHAM}glBd=j_<{DzOR z{JfF}z61EdKW6%V;M88mp9kIyd<1wN_z5Ks{6pYlz`s=T_prW>4{&;a2z(LnvX3#n z4|o`O9dHeJEAS!U_bB=Q!1BMZ3FM#&} zFJEAN4*_om7T<~G_yG9pzz~=)$2>e#y<)2{w-v-_d zoB=)xJPEvPKl3+%w*lV*ybpM<;{Q|TzaMxQ_z~b5@MB6I_&D$p;HQCq3jE>^a{4+y z$@_iT2SxcF1U?6NH}J*4od=o!3g8EU zM}Ut3Uk7{&xD0&ppRxRnzze{8fKLG52fXxQ=Kmbo=ZZ+zGr5xF2{PI0G!sffK)J!WX_el{)aE7fSqIL4R$u ze)e8qwSM-?z-s;MQ$qgyRI2m6EZ^~A#>;`%0e1t}f%}0!4Lk_^B=89E%Ra*TGQd{? zZv`#^Zv$Qco(BFpa1HpZTUp;6@M_?B;920^!1n|10e%vAFYt?QV|@$2y}$>6uLV8` zd;{;M}dC^d<=NmA94K0f%}0^0B;383H$-zQ@{@cr+%OF?>O)h z;Pdvd{tn=)fR_R90PY073wSy37lFHhp9Jm)e!=ame-O9_cm!Ci`w`_U1N>g#t-xOZ z-Uj>(@HFtncd&d7cmjA1xCuNDd=Kz$;KRUsfS&~33;gOkS^om?df)@VyMYe^KMH&Z z_yu>d{9)ih;3L2l;G@7F13m%#P2iKjKLLq>)~$(R_ozE2dvh^{{ygE4}bAJtY58%e>-po)}Pma)q40_fz^8Whk(_3_{V|O zdiZC6)q42Xe2n8$>*2eB)q400uv!oQUSPEzUX-F&QP*+!BJMxV0UkV8b|0xrfRDe4 z>2CvGIG6FYiXZaRz#SJeou-rc(=@fS;zz?ViMLTZE`C(~B<>J@&~G0-!k!w{d+|F! zkHFig9*Ez6rbplf;I9F9eo|0rojpB*ejHf*E%`qs$*FGOZ9*~qGQgdmW?TV2{#nL* zl>GgS|C6GF|Lefp9$@;@z?}~=K93wM?E$_Dc;O(^OTgP6VtkjPe}?gY1MY-9PXgCE znEp$}FEWmPZ+sEQckttkF9V+cBI5zzqZ5qR19t;&0Ulh#^cmoVLB_WL?|BU+lz#UC zcm9Cshk(UG(nEzZ&Rt01x{UcqQ=R?=t^J z;LN>@-wizYr;MwLAM~4myYFNAoxlsg`+++?!SqLf=YbywJ_!9k0zL`)Sv2+&`M+&H z%U=Y16!^D*GmkTU6!@el==6IhaP9Mq>%fPXGrkG9`%=cYDfurkz86@0rx(A2z#T=# z{{wjbos1s??o2a&Lg7Bf-v>Sl`m?}?t4x2vS)AU?pEG_n@O+c;g}{T~V0^ja{~+T& z;FEvP_)6fTI~k7vAEtgp{5AtG>|*>oil5p^@!PKWsUH)+I`B#O^CsZh7npvx;)i|r z0jIvn^oM~5H!=P)@WMM7|E=PO{oe=P^9<9URq~>tqF={L*k4C~%=oRq$Dd$4C@}Ts z2j2HW8L$QT6mS`M?;TA4FmN}<2M++N``-To_`pY){{-+U;Fm7p_?F+y^h`YT?_@t=bImjE9@{A+=iL0=yD1oZu( zlE0nxeFAtZ?EO5jy4U_|z`H-d{QscnH!?owWo*w0;344MH!=P9fS3Of<4*yn<{5uo z(Se@>o&)~Pm$UvO!0!NF_J=J02f)+7A6FRZ{{rxd-ONwto6GXD7kJ6pj60CNPT)h( zw-UJfgDk%Zcpi8fxF7O20-pl?Zs5c3XZZ(#Yl#0VO8z#cKLxxS_~ox)`}*O}OM#Dp zz6E$M{J#r$4*uS!_+j6F2R;J&cYsfzeEu`=;D_0sOJ2$GFWbX-1bExOXS^MFH}I{% z2T(pg3!FmveGE7Q{A1ub;Eq>ueA9^kt-!~DGr--bkGp^mz~A>MdD#0ufe!&c1-u01 z|8+D@5beiS;6dO6!0!Q`M|^t(KA+|<@xJjz;N!qg0WZV*=IdU~`j4W1rGYz99yS0U zhW{(TOW?mdfVToa415&!{2g#7>h~{zGiVPkpmC2#-vaP3a5wBJ0*@g64*}Pp@6Ujb zqdxr=@L|w@0(=Dd*ZCTbuM_3*ZNMiH|2E)3=$i-bKzZJ;p1?s z(7ytB1oScBZOETl;Df*)Q*`+25#SX3`G0^9BR`fdnmfm`(_k{r}H_`{BXKp9fw5{$Id*5dY7C z4*|cK+6GbImY{xSfR7?Sn!tNt@4djsf&T`$8|}|8f#-oQBi%y(QQ&t1Z$*6XCrra> z8fEkEHVf~!@PD!J|F-b67JeDcmFW7oE zT?_xh!mp#b9o_yu#-Tl%Ec$kfej{TpY?Oq%E&3NM{21fVz8_ff&slish0;EH%j4gh zEWFCX;})K@@C_Ee-NN@W4(2t7S1sa(;Ha0ZsD6O`CBdgCyc}V z`l5xu!8nZXTNeJFg@4F6^ygV`GShpZg}Wt={Qq`~zTLvREPT6#AF}Y5EPTwuKeF&Y zS-9gO)BcMr+-Knp77i?Yy@hYK@I4Yo{`ibV|B8hlxA1WbpR(}l-)yGmDht2E!UYRA zEKFB(i1zP=Dg5?X_(2OlB5{;Hx(vaP|3?eI^kPYWkcy$lbM*X-o}bh6dYW%}13eeeb0Ix%q^FafH_`KEdM>8t-_dgkJ#V4sGJ4YV^wP7E zo-62CMbBz_2IvvDfxp%jkJIJ!jL?LCr>BRWK6?7;Q9e-V7ik}&XDvPJ=^3FXL(etzoXL~qdD5ApTZW9g z^a%59DB9(F6o%VEjT??+u=hSBqVP?9>Rk9RK)d^h!g6#SBi+gn{zVs=$iL-%5aC}@ zDBn8)f&}8`D*g5rNt1WTlP${xIN6c`pP7GZr?K*+?)7JIvw%eLOoHPTe?hn zaUi^SS}18lc5e(bV^Fs#wef^vYn>pCt4+cbXMzOktS$VY*xDsHMuiCWT-+#}Rlq$u z^6&8G3|USK>V`?sru^L`s$D7w#3gch|+U<9VCi1|7*32-@^ z_P5AmX*S*HBX0ilU(lfm;PO8$gl_@V0*pI9^l-Yi&V-^w=s_auZET0h%+#4wF55{_ z;Z#0-?5Jrzk{zYeq)MhwMl&nCI#DE6zfaV{(QSExK=+jL6;(PwJ4iIUJ)fJgbb+e8jU48cSXrsDMv9gieDkH` zZ17b;{5PU0HN+j493(Hl6n}yB(ySJUNoMoF;51wHIuZJK?9 zoUL3`Amfq`he5w>$RUQ!V0ihE&BB)RZMzQ5xtz-3aIdAZS@@noJJh{A(B^1yC!x(c z5>`{oy+ml0GenN+lO;+`QA@u&*EObWt465?+DaSYom?(yNcCTiP;^C^b}5}lL3op0 z#HROZiS()~l9H;oI>8okSl8LP5qK}oOU4#9yH5N*rLsLu#EItB;gyYPlr5f&mY1%^ zg~#;hZZu*5V0PUO5884kTr`B9z^IdOh;${YM?`iD4zIjG&ehL7hr_*@uWz&YRo~sR zq6wy!46Bh_w8bt2bj z;l*sW1s)#idP{B{+HBonXDd?U(zYG9Vr zrkIjrF}cG&iy?04XR^7&KZ_nS1hlx~hJhxVJ`^-5al=8AtL>1`WVeQe4$&PNIxN=k z(4_louFa!rL922R4izn7d$?$m%^{;h^^6Bm7n86$L&s!7e8Z-%Vvf?ww7P3qAEEk& zknwSOhmkhBZ`2o)bRVlZoJ^uT8d4_V)`yigzkg`yaLJp9{a%(s&sIZBuQJat)8^BM znl>#QZn^|($Z0b~!%l}HW+dcDz@})!Pn)C-K^>Al3^j=@dRLdx(_flQ#-P)i1cSpr zEcK}L4NXn9*x{+g=H7wqb9CG=)l^1TuWC22`t-CMuA0i?1|$}jZ`j(3#T>f&INS9G z-XW|{ku!|7m}Vy%()v~%f;JrW79Wjn4Qb8DJbe1F)?)S!ZA~6EZcH>tQOrp?O2wPF zBI*KdE2LshR=Q$_yhH1#rwV8`FO{P|XDefL?eLmnabmI&)MT83UrD4x_WhnnPsRfpdxHYj5E!kXeyD!Lq??t#Z}F; zj%P(l$rqYIJsYUjJR(M&uOp|KX}k=MXQP)5M`+`0Ge21l*3|2HnliWKKvc=JsN=I` zd-`KMJ3c!zDKg07IW3e_4V7N9C`rq5BXm9|s-W@xe0s8vPz%?$@r`Pp)lid8UHE#%80 zjPj~lDb#~zu)bWK%$KEhBb=JH!VVRDP38JhrI_0kG-hXnIF)pg7oB~RlPSy2reG?d zicpXoWLzOv3+jz(C0{Nzcjb0=3qg_*$(Y`eo63thC_QBRY`#uj$Q5^$i@AERz0{zh zl$)BZ6mnD5dM;lq=1Md9?LxiO9?aB8Zy{fpwt{xbl93|M)aZjklRjoo-VoHQDdH`Y z8|hzB)P=&0L36rFafSiWTYw(atQM+dEC+25nxpstV~T5pZ0QEF$>HCUua`uj)k!<^ z^|Ab}DxD%2@sHDo5)Ec&$&pf-3M@4!>iiJbSdOM1)XMonV4749s1(pQ$j#NL(oWR_ zQa+t;Oy{TsQ2PYX2=ev9bShUOi*l3}HbS9^si}sj)jLGi*MoJ{*-9}lnwBk;$Mlb? zK14@*iE_s+*$g~C6U-FoK**f2Q$=;O06l*Vkt!?%9LjEC90n? z>+`eJkf|2h4$07~cV@OhNwF!~AP2-rDrOZb7fq3J$zBizyFOb8GdT>e?UH5)zckiW z>!Vy2r4W7RHIxJuswj1t644ZK6U>~dNzTddR!~mvMrKMTf?EEnpr~wWAt;(E1ZzTy zy0%iK)GSdYyuooJjpcS+Q`3288rx|EM>Rq!1d`>i2VqoXSi6=Tstk#w|mrb(twuWCb8heWNJ#kuwl5S}6u| zL2;C71@(>*qX-DGD8CZd>Q$<%qFJJrdQFr1%*okiFh)&TDn~S#TOt~+rp7>2Cv)Aa zQ4t|;=VnO7TuyWVq{Ijl!*LPX2+Bh1HKG@x(krVN{aX&GU!Z?0B0x5)jppoRZju^v z>graEl_u-?`mPm2q6uxRC{$;<@-?c3U2~I-71`=+y+EPVC{X(ysDCfNV&#g4B&|q+ z)HO4cTCs)%OH_}jDQK+NTA<-ee^*aeS}0s0W&o&SH&zS>JA<-t(2C7eM+;)s70hTX zy5?wv0?LZnMtw!OG$~>h|01^BOukTU%ys3LtLUqjQjc)mSbAkHw`SAO7#W)*XXT4K zWpHnI*m2~hsl4a3wxcFmiVf*BshrMDldFTe=##D+>+Q?sRD80mXhN!af%@JyoYh)} zIn%3aqM6B+^Ed3u)vDAnQOjw?o>|2_%^7J%Ur(fbJS&GfD1mFJd6MN)OqUnxrCKwy z3LKequQZv;gdFd&s+F3Z<5_+1BpTld3?*Ex={}R&)}BeHWo-06iVbF8p_?5I{9rq^ zoiv9M6eH8qJ>%Jkt#uUam{ocVavqBG1kiTY8EDIU7sh8UajCubF?_LUeF`ir!@dbh!tHM zc{3lC-!yaeZrEdh<9Mw{&Y1jR0qC)cXyf|QRC7z(TTIQy@|sGqx-nm&*M)kfUY*;O zD>XJyw>L4xV-zDh-1^cjJyhWFwdh-Vjp21BtuZ*#>#W4|<+44w8`fsBS8%cJ?T(5y zwHeY#np%(}5HVIW#clQ6{%JMCRw2jCV$Ol4w&}&IwKnDHUajnU6<#g+uGYFTq>TQ1 z50`GOppIuZY}lBkH@*h~mvaZKyBBe4hgqh=>B%zMgy4N>sXbca+@<-b^AurogSbB`5k08s%c- zBf5}==_0mQbF4H*jq0gSVg{{fDu(cNOEL9oE>%p%%avkunlQC~~^HE8WvY zlkh>Erro+4#U1i3s#GbIXN$p#LX$p=bL?y1roy;jrrDr)`2)X;FgnRgf~)e67($f7M)O$!s!a?UiG@!T{)Q>5Bk z9LKOqn_2a8^!7-Oi*r2NO!`J9hO?$3D<)4geOfdwIo+eOnkG@{jhoEx>7_TWXaYmL z7jpR#ROw(fW0~m1b1lF7v2WII`By5SDw$w>@5Fi9LR5~%v(8|PmUpREmtD2GS})N| zTfR(F&+dpv^7M7b@>oL}$=qzRG6RMlQ_JZ*W-S5>9KM&Ek$an6bxZw8s>Z&2V+g;eueNlAdrJ?i8m* z2~xWdrb2eTs?nDH7EdqA)Y%4Vnlo1~lDR-DMFjf7i&6wWzL>CI)Gu zd2=w=9Qd77JcBkxIx*Ffb3(pBCFd8DvIF!zs!sn8YV_rjCWr^fq?kyW)uHSz`Z|Hm zt{s;~$JhT(@{OFSqs}!-u_DTR2pS$SMPYH8yWOs`ZFAMb4z@rsk=L57_`FJJk)|w) z^u>?9A2mvoCGic<6PqY*qQG2Ntpr5Aj53;AOD!KdsYr<70lkN`VbO%xL#{3{REeW; z(&Y#5I2JB-NQkSwi$*(KhH13JI@Hp_P7$+6Dsl`uLbA#xTZ%S&DIQy-RaPk(l$yyP z%%_l2pl@(ZSYyTNNr!()UQDWDm{l5KxUVS2NUEfUsfgjDIcxC^&`4Dbt0#?8jI4^* zGur8E49uX-8;)ut^2H;q63p)PFq9hWs9ZFrgQ6%J?G)7;v5Guq#qxSm?)OnEKd|<; za>@gzo#k5G2{T`l;8>Nr+8XI`h|DXsRphiwK`5w_ujNHZi}K!2l_mtLKd}rFdoZ)J z^;&sWwfQE4@>$f3v%2~Kecux8sOU0Hkr~mI(>EnA%`NplwhDE}QmLF{@o~_2a@=6@ zn&QcjxJ;BEOWX|NxLXTxf*S*iD4QIsa&nti2`dUaO$WEOt&IoFrOj?5KiY_1RmA60 z`Y=H4TIeR4IhENI)CYFvX*xy$#t-QzF-lSR^ z3}gb8Dx0Qki#i;=D93SY#dow4IxyP&f!<-XK~&pM6r>_G)zD%)v2-DPPmrN}M(9E1GF7acTn_Wt=M_@KMr-dk6lT~+*ki&PajJuDg~~1_ zs*FMmzPA--bWG6Y)p&}-e3poe)Q(XxNcR;!8v5}G4xwSPwV;7$xtR}*Q#`hTDx8+e)1LofuZ$Sv%jk_J zEQ+^vN>mJrD{N>Y1+uoQViWO`{TwI<$W&#-<}zC0L(8~jS^+ED={>r_AQ+g*(Sa+;Y*Z!Pk}<>soAbZe!DM@@3W zURR07YMK$#N?T~L76zkasA zokRg~sh)(7Hsl6SnHKq%R?(TFjAwO<-?326H!iXw$X+RS1DH>mx0O}RXFso8jw>gVGbaiK8sQJU}*Ci#V6M| znTudgQIIuE-%B0lF@IPoB~x%P|A1ErcIHsp*W65|*5rpnJ6mpnhW`q0aMHPY)BkY?9tNx1y-lt94aDVD|L zn|dcvWz{0mqF~3Gu5Mql(0V=Mb&-LMu1 zSz6VD;|hs!Zpenm{dnayvPXk5d?Szjqe7|(sAr*16{G7JC80P%r@$vR-Q$kKZ6h!thc>o2%%(2Dzl|pYLo!it|sWC^ar6((BSVA~)PqzO=|f z?@r6j<5B)vi4FN0vjy6*)u>|l<5NYSZ?cNZO?aruGE98d_h_U2-la-sT`naF>Jsr1 zfLLBym8{~R*xRTjTiIpaP5QBA&d=SZ$ca;_dH=)uph>GI!vbV`%VDIACbRX5959O& z4pF^>d&w=vv7WJ-9maN=`7Gc>R(n|6X?MI1K-lm)g?FM5z&9YBY-6uCNIog(L`*qqDNc6GV7NSi*SbtI!eoByVie}6dLfvoaE~||dje6WCMH?AlRJ7hJDc`;))%}Z#~!-G|2PolN`+AveL==4U1#wemF8P(*+>r@9<(&sKZ z>qD#z4~q0gDZ0N{ts-A`1QY7@$&FTZ5Z);}Ct-?P6jLQJ9DPDE=KErWqp3fKg(p8m zvy?@)#kr#)PEz)m5X(=mR52p4&hs?9!}js3)>KJ69j>DypsWu4;0h@}D^}gHYmB3D zWy8;jwg_f{vWSIzP1X*tr2N9+rR2+H+25)U-=-;0y0#)tPr`>jD_$Ce4RO@qg7Yml zX@NfyPo~gOMzouwM*mc_%C~N|O!EL`u~1o?aqsIBL%5_8<^=pA_EVS<6$5f$wZN`5 zN%h&vHMA4F46B3UL><@akcY%RwlfE(@X;#vmQfrEqV3BK_mS~YEL7yUOUdQcrerY* z$;YvrIXFeUtnjHUtsNB|VItpeq==mt=7!Q1$F)R@D9;?6BF=5XAqR51md}Z24o+zV zJdT##kLe=WJf1l?<;=k;V(Ytks+Kx>(uO~JxT0tX8h{B>RR}G6^`f2<|GBt^=gtv zVYSnX!$t@&azZgKH1PRea~lITgo<5p0&_%BY+;%s*9aT~BC z7P?Z4ONCqR+{R#Wnq3Q%q-$|;{p#`}i8tIleZEqW#A8WfPr~DNZf?lp^te)P*>F9U zB*eAQm2!Fh--aZy(Dm5jJKH36!;LSAmA^VaCW+m(*=@^QJ#L7biX=R4>~5KM?Q!$M zt>LcbU!6U!=05(gzDnLhqAoeA(Dnmgc$1d!ad?`~7|nqbYXo@7Mvaaq%r(W`Nx3%R z;EMHk8Nd0B~g-380GnBTC(5vnEIZS2z6+M6U(9Z8t$r<2+*Kg!2js+F>dMKbInw0t9zHGCeKI)ANk*n_v`;Fc$Cgl*jublmbji=k?GiUy5rtlz zdSg3`*TGE&#WjsCaXO_sMRYR`d1=XyQr?nB`oiOcFxPEqc^FDabtL7nCGq6wG!Y{? zb|muri%^S8#i`%63S)Tx`KkX_=dO4iUSX1 M`C8m95h?lm7v*rp=l}o! diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Resources/Info.plist b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Resources/Info.plist deleted file mode 100644 index f097c15ce8..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/A/Resources/Info.plist +++ /dev/null @@ -1,46 +0,0 @@ - - - - - BuildMachineOSBuild - 15G1217 - CFBundleDevelopmentRegion - English - CFBundleExecutable - OCHamcrest - CFBundleIdentifier - org.hamcrest.OCHamcrest - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - OCHamcrest - CFBundlePackageType - FMWK - CFBundleShortVersionString - 6.1.1 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - MacOSX - - CFBundleVersion - 6.1.1 - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 8C1002 - DTPlatformVersion - GM - DTSDKBuild - 16C58 - DTSDKName - macosx10.12 - DTXcode - 0821 - DTXcodeBuild - 8C1002 - NSHumanReadableCopyright - Copyright © 2017 hamcrest.org - - diff --git a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/Current b/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/Current deleted file mode 120000 index 8c7e5a667f..0000000000 --- a/Vendor/macOS/OCHamcrest/OCHamcrest.framework/Versions/Current +++ /dev/null @@ -1 +0,0 @@ -A \ No newline at end of file diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCAllOf.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCAllOf.h deleted file mode 100644 index 99dfb3ab31..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCAllOf.h +++ /dev/null @@ -1,64 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Calculates the logical conjunction of multiple matchers. - * @discussion Evaluation is shortcut, so subsequent matchers are not called if an earlier matcher - * returns NO. - */ -@interface HCAllOf : HCDiagnosingMatcher - -- (instancetype)initWithMatchers:(NSArray> *)matchers NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_allOfIn(NSArray> *matchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object matches all of the - * specified matchers. - * @param matchers An array of matchers. Any element that is not a matcher is implicitly wrapped in - * an equalTo matcher to check for equality. - * @discussion - * Example
        - *
        assertThat(\@"myValue", allOfIn(\@[startsWith(\@"my"), containsSubstring(\@"Val")]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_allOfIn instead. - */ -static inline id allOfIn(NSArray *matchers) -{ - return HC_allOfIn(matchers); -} -#endif - - -FOUNDATION_EXPORT id HC_allOf(id matchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object matches all of the - * specified matchers. - * @param matchers... A comma-separated list of matchers ending with nil. Any argument - * that is not a matcher is implicitly wrapped in an equalTo matcher to check for equality. - * @discussion - * Example
        - *
        assertThat(\@"myValue", allOf(startsWith(\@"my"), containsSubstring(\@"Val"), nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_allOf instead. - */ -#define allOf(matchers...) HC_allOf(matchers) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCAnyOf.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCAnyOf.h deleted file mode 100644 index cef32eaec5..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCAnyOf.h +++ /dev/null @@ -1,62 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Calculates the logical disjunction of multiple matchers. - * @discussion Evaluation is shortcut, so subsequent matchers are not called if an earlier matcher - * returns NO. - */ -@interface HCAnyOf : HCBaseMatcher - -- (instancetype)initWithMatchers:(NSArray> *)matchers NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - -FOUNDATION_EXPORT id HC_anyOfIn(NSArray *matchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object matches any of the - * specified matchers. - * @param matchers An array of matchers. Any element that is not a matcher is implicitly wrapped in - * an equalTo matcher to check for equality. - * @discussion - * Example
        - *
        assertThat(\@"myValue", allOf(\@[startsWith(\@"foo"), containsSubstring(\@"Val")]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_anyOf instead. - */ -static inline id anyOfIn(NSArray *matchers) -{ - return HC_anyOfIn(matchers); -} -#endif - -FOUNDATION_EXPORT id HC_anyOf(id matchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object matches any of the - * specified matchers. - * @param matchers... A comma-separated list of matchers ending with nil. Any argument - * that is not a matcher is implicitly wrapped in an equalTo matcher to check for equality. - * @discussion - * Example
        - *
        assertThat(\@"myValue", allOf(startsWith(\@"foo"), containsSubstring(\@"Val"), nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_anyOf instead. - */ -#define anyOf(matchers...) HC_anyOf(matchers) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCArgumentCaptor.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCArgumentCaptor.h deleted file mode 100644 index 80c6d00f44..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCArgumentCaptor.h +++ /dev/null @@ -1,44 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches anything, capturing all values. - * @discussion This matcher captures all values it was given to match, and always evaluates to - * YES. Use it to capture argument values for further assertions. - * - * Unlike other matchers, this matcher is not idempotent. It should be created outside of any - * expression so that it can be queried for the items it captured. - */ -@interface HCArgumentCaptor : HCIsAnything - -/*! - * @abstract Returns the captured value. - * @discussion If -matches: was called more than once then this property returns the - * last captured value. - * - * If -matches: was never invoked and so no value was captured, this property returns - * nil. But if nil was captured, this property returns NSNull. - */ -@property (nullable, nonatomic, readonly) id value; - -/*! - * @abstract Returns all captured values. - * @discussion Returns an array containing all captured values, in the order in which they were - * captured. nil values are converted to NSNull. - */ -@property (nonatomic, readonly) NSArray *allValues; - -/*! - * @abstract Determines whether subsequent matched values are captured. - * @discussion YES by default. - */ -@property (nonatomic, assign) BOOL captureEnabled; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCAssertThat.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCAssertThat.h deleted file mode 100644 index aa157a08ae..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCAssertThat.h +++ /dev/null @@ -1,96 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - -@protocol HCMatcher; - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @header - * Assertion macros for using matchers in testing frameworks. - * Unmet assertions are reported to the HCTestFailureReporterChain. - */ - - -FOUNDATION_EXPORT void HC_assertThatWithLocation(id testCase, _Nullable id actual, id matcher, - const char *fileName, int lineNumber); - -#define HC_assertThat(actual, matcher) \ - HC_assertThatWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThat(actual, matcher) - - * Asserts that actual value satisfies matcher. - * @param actual The object to evaluate as the actual value. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion assertThat passes the actual value to the matcher for evaluation. If the matcher is - * not satisfied, it is reported to the HCTestFailureReporterChain. - * - * Use assertThat in test case methods. It's designed to integrate with XCTest and other testing - * frameworks where individual tests are executed as methods. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThat instead. - */ -#define assertThat(actual, matcher) HC_assertThat(actual, matcher) -#endif - - -typedef _Nonnull id (^HCFutureValue)(); - -FOUNDATION_EXPORT void HC_assertWithTimeoutAndLocation(id testCase, NSTimeInterval timeout, - HCFutureValue actualBlock, id matcher, - const char *fileName, int lineNumber); - -#define HC_assertWithTimeout(timeout, actualBlock, matcher) \ - HC_assertWithTimeoutAndLocation(self, timeout, actualBlock, matcher, __FILE__, __LINE__) - -#define HC_thatEventually(actual) ^{ return actual; } - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertWithTimeout(timeout, actualBlock, matcher) - - * Asserts that a value provided by a block will satisfy matcher within the specified time. - * @param timeout Maximum time to wait for passing behavior, specified in seconds. - * @param actualBlock A block providing the object to repeatedly evaluate as the actual value. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion assertWithTimeout polls a value provided by a block to asynchronously - * satisfy the matcher. The block is evaluated repeatedly for an actual value, which is passed to - * the matcher for evaluation. If the matcher is not satisfied within the timeout, it is reported to - * the HCTestFailureReporterChain. - * - * An easy way of providing the actualBlock is to use the macro thatEventually. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertWithTimeout instead. -*/ -#define assertWithTimeout(timeout, actualBlock, matcher) HC_assertWithTimeout(timeout, actualBlock, matcher) - - -/*! - * @abstract thatEventually(actual) - - * Evaluates actual value at future time. - * @param actual The object to evaluate as the actual value. - * @discussion Wraps actual in a block so that it can be repeatedly evaluated by - * assertWithTimeout. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_thatEventually instead. - */ -#define thatEventually(actual) HC_thatEventually(actual) -#endif - - -/*! - * @abstract "Expected , but " - * @discussion Helper function to let you describe mismatches the way assertThat does. - */ -FOUNDATION_EXPORT NSString *HCDescribeMismatch(id matcher, id actual); - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCBaseDescription.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCBaseDescription.h deleted file mode 100644 index 40e9ff1269..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCBaseDescription.h +++ /dev/null @@ -1,29 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Base class for all HCDescription implementations. - */ -@interface HCBaseDescription : NSObject -@end - - -/*! - * @abstract Methods that must be provided by subclasses of HCBaseDescription. - */ -@interface HCBaseDescription (SubclassResponsibility) - -/*! - * @abstract Appends the specified string to the description. - */ -- (void)append:(NSString *)str; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCBaseMatcher.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCBaseMatcher.h deleted file mode 100644 index 61c4c0f27c..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCBaseMatcher.h +++ /dev/null @@ -1,25 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import -#import - -#define HC_ABSTRACT_METHOD [self subclassResponsibility:_cmd] - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Base class for all HCMatcher implementations. - * @discussion Simple matchers can just subclass HCBaseMatcher and implement -matches: - * and -describeTo:. But if the matching algorithm has several "no match" paths, - * consider subclassing HCDiagnosingMatcher instead. - */ -@interface HCBaseMatcher : NSObject - -/*! @abstract Raises exception that command (a pseudo-abstract method) is not implemented. */ -- (void)subclassResponsibility:(SEL)command; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCClassMatcher.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCClassMatcher.h deleted file mode 100644 index bb0b98b253..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCClassMatcher.h +++ /dev/null @@ -1,18 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -@interface HCClassMatcher : HCBaseMatcher - -@property (nonatomic, strong, readonly) Class theClass; - -- (instancetype)initWithClass:(Class)aClass NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCCollect.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCCollect.h deleted file mode 100644 index 8b828f3a46..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCCollect.h +++ /dev/null @@ -1,26 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - -#import - -@protocol HCMatcher; - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Returns an array of values from a variable-length comma-separated list terminated - * by nil. - */ -FOUNDATION_EXPORT NSArray * HCCollectItems(id item, va_list args); - -/*! - * @abstract Returns an array of matchers from a mixed array of items and matchers. - * @discussion Each item is wrapped in HCWrapInMatcher to transform non-matcher items into equality - * matchers. - */ -FOUNDATION_EXPORT NSArray> * HCWrapIntoMatchers(NSArray *items); - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCConformsToProtocol.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCConformsToProtocol.h deleted file mode 100644 index de76b60092..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCConformsToProtocol.h +++ /dev/null @@ -1,42 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt -// Contribution by Todd Farrell - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches objects that conform to specified protocol. - */ -@interface HCConformsToProtocol : HCBaseMatcher - -- (instancetype)initWithProtocol:(Protocol *)protocol NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_conformsTo(Protocol *aProtocol); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object conforms to the specified - * protocol. - * @param aProtocol The protocol to compare against as the expected protocol. - * @discussion - * Example
        - *
        assertThat(myObject, conformsTo(\@protocol(NSCoding))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_conformsTo instead. - */ -static inline id conformsTo(Protocol *aProtocol) -{ - return HC_conformsTo(aProtocol); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCDescribedAs.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCDescribedAs.h deleted file mode 100644 index 0597e1de78..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCDescribedAs.h +++ /dev/null @@ -1,41 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Provides a custom description to another matcher. - */ -@interface HCDescribedAs : HCBaseMatcher - -- (instancetype)initWithDescription:(NSString *)description - forMatcher:(id )matcher - overValues:(NSArray *)templateValues NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_describedAs(NSString *description, id matcher, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Wraps an existing matcher, overriding its description with that specified. All other - * functions are delegated to the decorated matcher, including its mismatch description. - * @param description The new description for the wrapped matcher. - * @param matcher The matcher to wrap, followed by a comma-separated list of substitution - * values ending with nil. - * @discussion The description may contain substitution placeholders %0, %1, etc. These will be - * replaced by any values that follow the matcher. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_describedAs instead. - */ -#define describedAs(description, matcher, ...) HC_describedAs(description, matcher, ##__VA_ARGS__) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCDescription.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCDescription.h deleted file mode 100644 index fde2c66edc..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCDescription.h +++ /dev/null @@ -1,39 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract A description of an HCMatcher. - * @discussion An HCMatcher will describe itself to a description which can later be used for reporting. - */ -@protocol HCDescription - -/*! - * @abstract Appends some plain text to the description. - * @return self, for chaining. - */ -- (id )appendText:(NSString *)text; - -/*! - * @abstract Appends description of specified value to description. - * @discussion If the value implements the HCSelfDescribing protocol, then it will be used. - * @return self, for chaining. - */ -- (id )appendDescriptionOf:(nullable id)value; - -/*! - * @abstract Appends a list of objects to the description. - * @return self, for chaining. - */ -- (id )appendList:(NSArray *)values - start:(NSString *)start - separator:(NSString *)separator - end:(NSString *)end; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCDiagnosingMatcher.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCDiagnosingMatcher.h deleted file mode 100644 index 2d659221c5..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCDiagnosingMatcher.h +++ /dev/null @@ -1,19 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Base class for matchers that generate mismatch descriptions during the matching. - * @discussion Some matching algorithms have several "no match" paths. It helps to make the mismatch - * description as precise as possible, but we don't want to have to repeat the matching logic to do - * so. For such matchers, subclass HCDiagnosingMatcher and implement HCMatcher's - * -matches:describingMismatchTo:. -*/ -@interface HCDiagnosingMatcher : HCBaseMatcher -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCEvery.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCEvery.h deleted file mode 100644 index 992f73afd5..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCEvery.h +++ /dev/null @@ -1,45 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if every item in a collection satisfies a nested matcher. - */ -@interface HCEvery : HCDiagnosingMatcher - -@property (nonatomic, strong, readonly) id matcher; - -- (instancetype)initWithMatcher:(id )matcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_everyItem(id itemMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when the examined collection's items are - * all matched by the specified matcher. - * @param itemMatcher The matcher to apply to every item provided by the examined collection. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. - * - * Example
        - *
        assertThat(\@[\@"bar", \@"baz"], everyItem(startsWith(\@"ba")))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_everyItem instead. - */ -static inline id everyItem(id itemMatcher) -{ - return HC_everyItem(itemMatcher); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCHasCount.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCHasCount.h deleted file mode 100644 index ba77ebe130..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCHasCount.h +++ /dev/null @@ -1,63 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if collection size satisfies a nested matcher. - */ -@interface HCHasCount : HCBaseMatcher - -- (instancetype)initWithMatcher:(id )countMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_hasCount(id countMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object's -count method - * returns a value that satisfies the specified matcher. - * @param countMatcher A matcher for the count of an examined collection. - * @discussion - * Example
        - *
        assertThat(\@[\@"foo", \@"bar"], hasCount(equalTo(@2)))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasCount instead. - */ -static inline id hasCount(id countMatcher) -{ - return HC_hasCount(countMatcher); -} -#endif - - -FOUNDATION_EXPORT id HC_hasCountOf(NSUInteger count); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object's -count method - * returns a value that equals the specified value. - * @param value Value to compare against as the expected count. - * @discussion - * Example
        - *
        assertThat(\@[\@"foo", \@"bar"], hasCountOf(2))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasCountOf instead. - */ -static inline id hasCountOf(NSUInteger value) -{ - return HC_hasCountOf(value); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCHasDescription.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCHasDescription.h deleted file mode 100644 index 31d0fdc3dc..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCHasDescription.h +++ /dev/null @@ -1,45 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches objects whose description satisfies a nested matcher. - */ -@interface HCHasDescription : HCInvocationMatcher - -- (instancetype)initWithDescription:(id )descriptionMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithInvocation:(NSInvocation *)anInvocation matching:(id )aMatcher NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_hasDescription(id descriptionMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object's -description - * satisfies the specified matcher. - * @param descriptionMatcher The matcher used to verify the description result, or an expected value - * for equalTo matching. - * @discussion If descriptionMatcher is not a matcher, it is implicitly wrapped in - * an equalTo matcher to check for equality. - * - * Examples
        - *
        assertThat(myObject, hasDescription(equalTo(\@"foo"))
        - *
        assertThat(myObject, hasDescription(\@"foo"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasDescription instead. - */ -static inline id hasDescription(id descriptionMatcher) -{ - return HC_hasDescription(descriptionMatcher); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCHasProperty.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCHasProperty.h deleted file mode 100644 index a805913ca5..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCHasProperty.h +++ /dev/null @@ -1,47 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt -// Contribution by Justin Shacklette - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches objects whose "property" (or simple method) satisfies a nested matcher. - */ -@interface HCHasProperty : HCDiagnosingMatcher - -- (instancetype)initWithProperty:(NSString *)propertyName value:(id )valueMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_hasProperty(NSString *propertyName, _Nullable id valueMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object has an instance method with the - * specified name whose return value satisfies the specified matcher. - * @param propertyName The name of an instance method without arguments that returns an object. - * @param valueMatcher The matcher to satisfy for the return value, or an expected value for - * equalTo matching. - * @discussion Note: While this matcher factory is called "hasProperty", it applies to the return - * values of any instance methods without arguments, not just properties. - * - * Examples
        - *
        assertThat(person, hasProperty(\@"firstName", equalTo(\@"Joe")))
        - *
        assertThat(person, hasProperty(\@"firstName", \@"Joe"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasProperty instead. - */ -static inline id hasProperty(NSString *propertyName, _Nullable id valueMatcher) -{ - return HC_hasProperty(propertyName, valueMatcher); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCInvocationMatcher.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCInvocationMatcher.h deleted file mode 100644 index ea4f89abd6..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCInvocationMatcher.h +++ /dev/null @@ -1,45 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Supporting class for matching a feature of an object. - * @discussion Tests whether the result of passing the specified invocation to the value satisfies - * the specified matcher. - */ -@interface HCInvocationMatcher : HCBaseMatcher -{ - NSInvocation *_invocation; - id _subMatcher; -} - -/*! - * @abstract Determines whether a mismatch will be described in short form. - * @discussion Default is long form, which describes the object, the name of the invocation, and the - * sub-matcher's mismatch diagnosis. Short form only has the sub-matcher's mismatch diagnosis. - */ -@property (nonatomic, assign) BOOL shortMismatchDescription; - -/*! - * @abstract Initializes a newly allocated HCInvocationMatcher with an invocation and a matcher. - */ -- (instancetype)initWithInvocation:(NSInvocation *)anInvocation matching:(id )aMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -/*! - * @abstract Invokes stored invocation on the specified item and returns the result. - */ -- (id)invokeOn:(id)item; - -/*! - * @abstract Returns string representation of the invocation's selector. - */ -- (NSString *)stringFromSelector; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIs.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIs.h deleted file mode 100644 index fc7fc2be6e..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIs.h +++ /dev/null @@ -1,55 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Decorates another matcher. - */ -@interface HCIs : HCBaseMatcher - -- (instancetype)initWithMatcher:(id )matcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_is(_Nullable id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Wraps an existing matcher, or provides a shortcut to the frequently - * used is(equalTo(x)). - * @param value The matcher to satisfy, or an expected value for equalTo matching. - * @discussion - * If valueis a matcher, its behavior is retained, but the test may be slightly more - * expressive. For example: - *
          - *
        • assertThat(\@(value), equalTo(\@5))
        • - *
        • assertThat(\@(value), is(equalTo(\@5)))
        • - *
        - * - * If valueis not a matcher, it is wrapped in an equalTo matcher. This makes the - * following statements equivalent: - *
          - *
        • assertThat(cheese, equalTo(smelly))
        • - *
        • assertThat(cheese, is(equalTo(smelly)))
        • - *
        • assertThat(cheese, is(smelly))
        • - *
        - * - * Choose the style that makes your expression most readable. This will vary depending on context. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_is instead. - */ -static inline id is(_Nullable id value) -{ - return HC_is(value); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsAnything.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsAnything.h deleted file mode 100644 index be7d1a7aea..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsAnything.h +++ /dev/null @@ -1,55 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches anything. - */ -@interface HCIsAnything : HCBaseMatcher - -- (instancetype)init; -- (instancetype)initWithDescription:(NSString *)description NS_DESIGNATED_INITIALIZER; - -@end - - -FOUNDATION_EXPORT id HC_anything(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that always matches, regardless of the examined object. - * @discussion - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_anything instead. - */ -static inline id anything(void) -{ - return HC_anything(); -} -#endif - - -FOUNDATION_EXPORT id HC_anythingWithDescription(NSString *description); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches anything, regardless of the examined object, but - * describes itself with the specified NSString. - * @param description A meaningful string used to describe this matcher. - * @discussion - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_anything instead. - */ -static inline id anythingWithDescription(NSString *description) -{ - return HC_anythingWithDescription(description); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCloseTo.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCloseTo.h deleted file mode 100644 index b2e7db7bda..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCloseTo.h +++ /dev/null @@ -1,43 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matchers numbers close to a value, within a delta range. - */ -@interface HCIsCloseTo : HCBaseMatcher - -- (instancetype)initWithValue:(double)value delta:(double)delta NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_closeTo(double value, double delta); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSNumbers that matches when the examined number is close to the - * specified value, within the specified delta. - * @param value The expected value of matching numbers. - * @param delta The delta within which matches will be allowed. - * @discussion Invokes -doubleValue on the examined number to get its value. - * - * Example
        - *
        assertThat(\@1.03, closeTo(1.0, 0.03)
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_closeTo instead. - */ -static inline id closeTo(double value, double delta) -{ - return HC_closeTo(value, delta); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionContaining.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionContaining.h deleted file mode 100644 index 5b08c7821b..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionContaining.h +++ /dev/null @@ -1,95 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if any item in a collection satisfies a nested matcher. - */ -@interface HCIsCollectionContaining : HCDiagnosingMatcher - -- (instancetype)initWithMatcher:(id )elementMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_hasItem(id itemMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract hasItem(itemMatcher) - - * Creates a matcher for collections that matches when at least one item in the examined collection - * satisfies the specified matcher. - * @param itemMatcher The matcher to apply to collection elements, or an expected value - * for equalTo matching. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. - * - * If itemMatcher is not a matcher, it is implicitly wrapped in an equalTo matcher - * to check for equality. - * - * Example
        - *
        assertThat(\@[\@1, \@2, \@3], hasItem(equalTo(\@2)))
        - * - *
        assertThat(\@[\@1, \@2, \@3], hasItem(\@2))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasItem instead. - */ -#define hasItem HC_hasItem -#endif - - -FOUNDATION_EXPORT id HC_hasItemsIn(NSArray *itemMatchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when all specified matchers are - * satisfied by any item in the examined collection. - * @param itemMatchers An array of matchers. Any element that is not a matcher is implicitly wrapped - * in an equalTo matcher to check for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing one pass for each matcher. - * - * Example
        - *
        assertThat(\@[\@"foo", \@"bar", \@"baz"], hasItems(\@[endsWith(\@"z"), endsWith(\@"o")]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasItemsIn instead. - */ -static inline id hasItemsIn(NSArray *itemMatchers) -{ - return HC_hasItemsIn(itemMatchers); -} -#endif - - -FOUNDATION_EXPORT id HC_hasItems(id itemMatchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when all specified matchers are - * satisfied by any item in the examined collection. - * @param itemMatchers... A comma-separated list of matchers ending with nil. - * Any argument that is not a matcher is implicitly wrapped in an equalTo matcher to check - * for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing one pass for each matcher. - * - * Example
        - *
        assertThat(\@[\@"foo", \@"bar", \@"baz"], hasItems(endsWith(\@"z"), endsWith(\@"o"), nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasItems instead. - */ -#define hasItems(itemMatchers...) HC_hasItems(itemMatchers) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionContainingInAnyOrder.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionContainingInAnyOrder.h deleted file mode 100644 index fe23a666c0..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionContainingInAnyOrder.h +++ /dev/null @@ -1,79 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if every item in a collection, in any order, satisfy a list of nested matchers. - */ -@interface HCIsCollectionContainingInAnyOrder : HCDiagnosingMatcher - -- (instancetype)initWithMatchers:(NSArray> *)itemMatchers NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_containsInAnyOrderIn(NSArray *itemMatchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates an order-agnostic matcher for collections that matches when each item in the - * examined collection satisfies one matcher anywhere in the specified list of matchers. - * @param itemMatchers An array of matchers. Any element that is not a matcher is implicitly wrapped - * in an equalTo matcher to check for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. For a positive match, the examined collection must be of the same - * length as the specified list of matchers. - * - * Note: Each matcher in the specified list will only be used once during a given examination, so - * be careful when specifying matchers that may be satisfied by more than one entry in an examined - * collection. - * - * Examples
        - *
        assertThat(\@[\@"foo", \@"bar"], containsInAnyOrderIn(\@[equalTo(\@"bar"), equalTo(\@"foo")]))
        - *
        assertThat(\@[\@"foo", \@"bar"], containsInAnyOrderIn(@[\@"bar", \@"foo"]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_containsInAnyOrderIn instead. - */ -static inline id containsInAnyOrderIn(NSArray *itemMatchers) -{ - return HC_containsInAnyOrderIn(itemMatchers); -} -#endif - - -FOUNDATION_EXPORT id HC_containsInAnyOrder(id itemMatchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates an order-agnostic matcher for collections that matches when each item in the - * examined collection satisfies one matcher anywhere in the specified list of matchers. - * @param itemMatchers... A comma-separated list of matchers ending with nil. - * Any argument that is not a matcher is implicitly wrapped in an equalTo matcher to check - * for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. For a positive match, the examined collection must be of the same - * length as the specified list of matchers. - * - * Note: Each matcher in the specified list will only be used once during a given examination, so - * be careful when specifying matchers that may be satisfied by more than one entry in an examined - * collection. - * - * Examples
        - *
        assertThat(\@[\@"foo", \@"bar"], containsInAnyOrder(equalTo(\@"bar"), equalTo(\@"foo"), nil))
        - *
        assertThat(\@[\@"foo", \@"bar"], containsInAnyOrder(\@"bar", \@"foo", nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_containsInAnyOrder instead. - */ -#define containsInAnyOrder(itemMatchers...) HC_containsInAnyOrder(itemMatchers) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionContainingInOrder.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionContainingInOrder.h deleted file mode 100644 index 825cc68b96..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionContainingInOrder.h +++ /dev/null @@ -1,71 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if every item in a collection satisfies a list of nested matchers, in order. - */ -@interface HCIsCollectionContainingInOrder : HCDiagnosingMatcher - -- (instancetype)initWithMatchers:(NSArray> *)itemMatchers NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_containsIn(NSArray *itemMatchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when each item in the examined - * collection satisfies the corresponding matcher in the specified list of matchers. - * @param itemMatchers An array of matchers. Any element that is not a matcher is implicitly wrapped - * in an equalTo matcher to check for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. For a positive match, the examined collection must be of the same - * length as the specified list of matchers. - * - * Examples
        - *
        assertThat(\@[\@"foo", \@"bar"], containsIn(\@[equalTo(\@"foo"), equalTo(\@"bar")]))
        - *
        assertThat(\@[\@"foo", \@"bar"], containsIn(\@[\@"foo", \@"bar"]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_containsIn instead.) - */ -static inline id containsIn(NSArray *itemMatchers) -{ - return HC_containsIn(itemMatchers); -} -#endif - - -FOUNDATION_EXPORT id HC_contains(id itemMatchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when each item in the examined - * collection satisfies the corresponding matcher in the specified list of matchers. - * @param itemMatchers... A comma-separated list of matchers ending with nil. - * Any argument that is not a matcher is implicitly wrapped in an equalTo matcher to check - * for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. For a positive match, the examined collection must be of the same - * length as the specified list of matchers. - * - * Examples
        - *
        assertThat(\@[\@"foo", \@"bar"], contains(equalTo(\@"foo"), equalTo(\@"bar"), nil))
        - *
        assertThat(\@[\@"foo", \@"bar"], contains(\@"foo", \@"bar", nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_contains instead.) - */ -#define contains(itemMatchers...) HC_contains(itemMatchers) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionContainingInRelativeOrder.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionContainingInRelativeOrder.h deleted file mode 100644 index 530cd74b63..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionContainingInRelativeOrder.h +++ /dev/null @@ -1,48 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if every item in a collection satisfies a list of nested matchers, in order. - */ -@interface HCIsCollectionContainingInRelativeOrder : HCDiagnosingMatcher - -- (instancetype)initWithMatchers:(NSArray> *)itemMatchers NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_containsInRelativeOrder(NSArray *itemMatchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when the examined collection contains - * items satisfying the specified list of matchers, in the same relative order. - * @param itemMatchers Array of matchers that must be satisfied by the items provided by the - * examined collection in the same relative order. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. - * - * Any element of itemMatchers that is not a matcher is implicitly wrapped in an - * equalTo matcher to check for equality. - * - * Examples
        - *
        assertThat(\@[\@1, \@2, \@3, \@4, \@5], containsInRelativeOrder(equalTo(\@2), equalTo(\@4)))
        - *
        assertThat(\@[\@1, \@2, \@3, \@4, \@5], containsInRelativeOrder(\@2, \@4))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_containsInRelativeOrder instead. - */ -static inline id containsInRelativeOrder(NSArray *itemMatchers) -{ - return HC_containsInRelativeOrder(itemMatchers); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionOnlyContaining.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionOnlyContaining.h deleted file mode 100644 index 9261fde0ce..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsCollectionOnlyContaining.h +++ /dev/null @@ -1,62 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if every item in a collection satisfies any of the nested matchers. - */ -@interface HCIsCollectionOnlyContaining : HCEvery -@end - -FOUNDATION_EXPORT id HC_onlyContainsIn(NSArray *itemMatchers); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when each item of the examined - * collection satisfies any of the specified matchers. - * @param itemMatchers An array of matchers. Any element that is not a matcher is implicitly wrapped - * in an equalTo matcher to check for equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. Any matcher may match multiple elements. - * - * Example
        - *
        assertThat(\@[\@"Jon", \@"John", \@"Bob"], onlyContainsIn(\@[startsWith(\@"Jo"), startsWith(\@("Bo")]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_onlyContainsIn instead. - */ -static inline id onlyContainsIn(NSArray *itemMatchers) -{ - return HC_onlyContainsIn(itemMatchers); -} -#endif - - -FOUNDATION_EXPORT id HC_onlyContains(id itemMatchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for collections that matches when each item of the examined - * collection satisfies any of the specified matchers. - * @param itemMatchers... A comma-separated list of matchers ending with nil. - * Any argument that is not a matcher is implicitly wrapped in an equalTo matcher to check for - * equality. - * @discussion This matcher works on any collection that conforms to the NSFastEnumeration protocol, - * performing a single pass. Any matcher may match multiple elements. - * - * Example
        - *
        assertThat(\@[\@"Jon", \@"John", \@"Bob"], onlyContains(startsWith(\@"Jo"), startsWith(\@("Bo"), nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_onlyContains instead. - */ -#define onlyContains(itemMatchers...) HC_onlyContains(itemMatchers) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsDictionaryContaining.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsDictionaryContaining.h deleted file mode 100644 index a29908490d..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsDictionaryContaining.h +++ /dev/null @@ -1,47 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if any entry in a dictionary satisfies the nested pair of matchers. - */ -@interface HCIsDictionaryContaining : HCBaseMatcher - -- (instancetype)initWithKeyMatcher:(id )keyMatcher - valueMatcher:(id )valueMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_hasEntry(id keyMatcher, id valueMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSDictionaries that matches when the examined dictionary contains - * at least one entry whose key satisfies the specified keyMatcher and whose - * value satisfies the specified valueMatcher. - * @param keyMatcher The matcher to satisfy for the key, or an expected value for equalTo matching. - * @param valueMatcher The matcher to satisfy for the value, or an expected value for equalTo matching. - * @discussion Any argument that is not a matcher is implicitly wrapped in an equalTo - * matcher to check for equality. - * - * Examples
        - *
        assertThat(myDictionary, hasEntry(equalTo(\@"foo"), equalTo(\@"bar")))
        - *
        assertThat(myDictionary, hasEntry(\@"foo", \@"bar"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasEntry instead. - */ -static inline id hasEntry(id keyMatcher, id valueMatcher) -{ - return HC_hasEntry(keyMatcher, valueMatcher); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsDictionaryContainingEntries.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsDictionaryContainingEntries.h deleted file mode 100644 index 1274355e9b..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsDictionaryContainingEntries.h +++ /dev/null @@ -1,68 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if dictionary contains entries that satisfy the list of keys and value - * matchers. - */ -@interface HCIsDictionaryContainingEntries : HCDiagnosingMatcher - -- (instancetype)initWithKeys:(NSArray *)keys - valueMatchers:(NSArray> *)valueMatchers NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - -FOUNDATION_EXPORT id HC_hasEntriesIn(NSDictionary *valueMatchersForKeys); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSDictionaries that matches when the examined dictionary contains - * entries satisfying a dictionary of keys and their value matchers. - * @param valueMatchersForKeys A dictionary of keys (not matchers) and their value matchers. Any - * value argument that is not a matcher is implicitly wrapped in an equalTo matcher to - * check for equality. - * @discussion - * Examples
        - *
        assertThat(personDict, hasEntriesIn(\@{\@"firstName": equalTo(\@"Jon"), \@"lastName": equalTo(\@"Reid")}))
        - *
        assertThat(personDict, hasEntriesIn(\@{\@"firstName": \@"Jon", \@"lastName": \@"Reid"}))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasEntryIn instead. - */ -static inline id hasEntriesIn(NSDictionary *valueMatchersForKeys) -{ - return HC_hasEntriesIn(valueMatchersForKeys); -} -#endif - -FOUNDATION_EXPORT id HC_hasEntries(id keysAndValueMatchers, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSDictionaries that matches when the examined dictionary contains - * entries satisfying a list of alternating keys and their value matchers. - * @param keysAndValueMatchers... A key (not a matcher) to look up, followed by a value matcher or - * an expected value for equalTo matching, in a comma-separated list ending - * with nil - * @discussion Note that the keys must be actual keys, not matchers. Any value argument that is not - * a matcher is implicitly wrapped in an equalTo matcher to check for equality. - * - * Examples
        - *
        assertThat(personDict, hasEntries(\@"firstName", equalTo(\@"Jon"), \@"lastName", equalTo(\@"Reid"), nil))
        - *
        assertThat(personDict, hasEntries(\@"firstName", \@"Jon", \@"lastName", \@"Reid", nil))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasEntry instead. - */ -#define hasEntries(keysAndValueMatchers...) HC_hasEntries(keysAndValueMatchers) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsDictionaryContainingKey.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsDictionaryContainingKey.h deleted file mode 100644 index eef1b5f41a..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsDictionaryContainingKey.h +++ /dev/null @@ -1,44 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if any entry in a dictionary has a key satisfying the nested matcher. - */ -@interface HCIsDictionaryContainingKey : HCBaseMatcher - -- (instancetype)initWithKeyMatcher:(id )keyMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_hasKey(id keyMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSDictionaries that matches when the examined dictionary contains - * at least key that satisfies the specified matcher. - * @param keyMatcher The matcher to satisfy for the key, or an expected value for equalTo matching. - * @discussion Any argument that is not a matcher is implicitly wrapped in an equalTo - * matcher to check for equality. - * - * Examples
        - *
        assertThat(myDictionary, hasEntry(equalTo(\@"foo")))
        - *
        assertThat(myDictionary, hasEntry(\@"foo"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasKey instead. - */ -static inline id hasKey(id keyMatcher) -{ - return HC_hasKey(keyMatcher); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsDictionaryContainingValue.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsDictionaryContainingValue.h deleted file mode 100644 index 9dfc68c727..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsDictionaryContainingValue.h +++ /dev/null @@ -1,46 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if any entry in a dictionary has a value satisfying the nested matcher. - */ -@interface HCIsDictionaryContainingValue : HCBaseMatcher - -- (instancetype)initWithValueMatcher:(id )valueMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_hasValue(id valueMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSDictionaries that matches when the examined dictionary contains - * at least value that satisfies the specified matcher. - * @param valueMatcher The matcher to satisfy for the value, or an expected value for equalTo matching. - * @discussion This matcher works on any collection that has an -allValues method. - * - * Any argument that is not a matcher is implicitly wrapped in an equalTo matcher to check - * for equality. - * - * Examples
        - *
        assertThat(myDictionary, hasValue(equalTo(\@"bar")))
        - *
        assertThat(myDictionary, hasValue(\@"bar"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_hasValue instead. - */ -static inline id hasValue(id valueMatcher) -{ - return HC_hasValue(valueMatcher); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEmptyCollection.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEmptyCollection.h deleted file mode 100644 index ed495ff2ae..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEmptyCollection.h +++ /dev/null @@ -1,39 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches empty collections. - */ -@interface HCIsEmptyCollection : HCHasCount - -- (instancetype)init; - -@end - - -FOUNDATION_EXPORT id HC_isEmpty(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches any examined object whose -count method - * returns zero. - * - * Example
        - *
        assertThat(\@[], isEmpty())
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isEmpty instead. - */ -static inline id isEmpty(void) -{ - return HC_isEmpty(); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEqual.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEqual.h deleted file mode 100644 index 27bf90be48..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEqual.h +++ /dev/null @@ -1,41 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Is the value equal to another value, as tested by the -isEqual: method? - */ -@interface HCIsEqual : HCBaseMatcher - -- (instancetype)initEqualTo:(nullable id)expectedValue NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_equalTo(_Nullable id operand); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to the specified - * object, as determined by calling the -isEqual: method on the examined object. - * @param operand The object to compare against as the expected value. - * @discussion If the specified operand is nil, then the created matcher will match if - * the examined object itself is nil, or if the examined object's -isEqual: - * method returns YES when passed a nil. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalTo instead. - */ -static inline id equalTo(_Nullable id operand) -{ - return HC_equalTo(operand); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEqualCompressingWhiteSpace.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEqualCompressingWhiteSpace.h deleted file mode 100644 index 1354feb36d..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEqualCompressingWhiteSpace.h +++ /dev/null @@ -1,46 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Tests if a string is equal to another string, when whitespace differences are (mostly) ignored. - */ -@interface HCIsEqualCompressingWhiteSpace : HCBaseMatcher - -- (instancetype)initWithString:(NSString *)string NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_equalToCompressingWhiteSpace(NSString *expectedString); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSStrings that matches when the examined string is equal to the - * specified expected string, when whitespace differences are (mostly) ignored. - * @param expectedString The expected value of matched strings. (Must not be nil.) - * @discussion To be exact, the following whitespace rules are applied: - *
          - *
        • all leading and trailing whitespace of both the expectedString and the examined string are ignored
        • - *
        • any remaining whitespace, appearing within either string, is collapsed to a single space before comparison
        • - *
        - * - * Example
        - *
        assertThat(\@"   my\tfoo  bar ", equalToCompressingWhiteSpace(\@" my  foo bar"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToCompressingWhiteSpace instead. - */ -static inline id equalToCompressingWhiteSpace(NSString *expectedString) -{ - return HC_equalToCompressingWhiteSpace(expectedString); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEqualIgnoringCase.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEqualIgnoringCase.h deleted file mode 100644 index 06ed44a8fb..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEqualIgnoringCase.h +++ /dev/null @@ -1,41 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Tests if a string is equal to another string, regardless of the case. - */ -@interface HCIsEqualIgnoringCase : HCBaseMatcher - -- (instancetype)initWithString:(NSString *)string NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_equalToIgnoringCase(NSString *expectedString); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher for NSStrings that matches when the examined string is equal to the - * specified expected string, ignoring case differences. - * @param expectedString The expected value of matched strings. (Must not be nil.) - * @discussion - * Example
        - *
        assertThat(\@"Foo", equalToIgnoringCase(\@"FOO"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToIgnoringCase instead. - */ -static inline id equalToIgnoringCase(NSString *expectedString) -{ - return HC_equalToIgnoringCase(expectedString); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEqualToNumber.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEqualToNumber.h deleted file mode 100644 index aae8f4b8e3..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsEqualToNumber.h +++ /dev/null @@ -1,289 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -FOUNDATION_EXPORT id HC_equalToChar(char value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified char value. - * @param value The char value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToChar instead. - */ -static inline id equalToChar(char value) -{ - return HC_equalToChar(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToDouble(double value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified double value. - * @param value The double value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToDouble instead. - */ -static inline id equalToDouble(double value) -{ - return HC_equalToDouble(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToFloat(float value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified float value. - * @param value The float value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToFloat instead. - */ -static inline id equalToFloat(float value) -{ - return HC_equalToFloat(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToInt(int value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified int value. - * @param value The int value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToInt instead. - */ -static inline id equalToInt(int value) -{ - return HC_equalToInt(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToLong(long value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified long value. - * @param value The long value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToLong instead. - */ -static inline id equalToLong(long value) -{ - return HC_equalToLong(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToLongLong(long long value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified long long value. - * @param value The long long value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToLongLong instead. - */ -static inline id equalToLongLong(long long value) -{ - return HC_equalToLongLong(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToShort(short value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified short value. - * @param value The short value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToShort instead. - */ -static inline id equalToShort(short value) -{ - return HC_equalToShort(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedChar(unsigned char value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract equalToUnsignedChar(value) - - * Creates a matcher that matches when the examined object is equal to an NSNumber created from the - * specified unsigned char value. - * @param value The unsigned char value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedChar instead. - */ -static inline id equalToUnsignedChar(unsigned char value) -{ - return HC_equalToUnsignedChar(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedInt(unsigned int value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified unsigned int value. - * @param value The unsigned int value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedInt instead. - */ -static inline id equalToUnsignedInt(unsigned int value) -{ - return HC_equalToUnsignedInt(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedLong(unsigned long value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified unsigned long value. - * @param value The unsigned long value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedLong instead. - */ -static inline id equalToUnsignedLong(unsigned long value) -{ - return HC_equalToUnsignedLong(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedLongLong(unsigned long long value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified unsigned long long value. - * @param value The unsigned long long value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedLongLong instead. - */ -static inline id equalToUnsignedLongLong(unsigned long long value) -{ - return HC_equalToUnsignedLongLong(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedShort(unsigned short value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified unsigned short value. - * @param value The unsigned short value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedShort instead. - */ -static inline id equalToUnsignedShort(unsigned short value) -{ - return HC_equalToUnsignedShort(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToInteger(NSInteger value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified NSInteger value. - * @param value The NSInteger value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToInteger instead. - */ -static inline id equalToInteger(NSInteger value) -{ - return HC_equalToInteger(value); -} -#endif - - -FOUNDATION_EXPORT id HC_equalToUnsignedInteger(NSUInteger value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is equal to an NSNumber created - * from the specified NSUInteger value. - * @param value The NSUInteger value from which to create an NSNumber. - * @discussion Consider using equalTo(\@(value)) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_equalToUnsignedInteger instead. - */ -static inline id equalToUnsignedInteger(NSUInteger value) -{ - return HC_equalToUnsignedInteger(value); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsIn.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsIn.h deleted file mode 100644 index 4c8ed30bae..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsIn.h +++ /dev/null @@ -1,43 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches if examined object is contained within the nested collection. - */ -@interface HCIsIn : HCBaseMatcher - -- (instancetype)initWithCollection:(id)collection NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_isIn(id aCollection); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is found within the specified - * collection. - * @param aCollection The collection to search. - * @discussion Invokes -containsObject: on aCollection to determine if the - * examined object is an element of the collection. - * - * Example
        - *
        assertThat(\@"foo", isIn(\@@[\@"bar", \@"foo"]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isIn instead. - */ -static inline id isIn(id aCollection) -{ - return HC_isIn(aCollection); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsInstanceOf.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsInstanceOf.h deleted file mode 100644 index faae9aeab5..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsInstanceOf.h +++ /dev/null @@ -1,37 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches objects that are of a given class or any subclass. - */ -@interface HCIsInstanceOf : HCClassMatcher -@end - - -FOUNDATION_EXPORT id HC_instanceOf(Class expectedClass); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is an instance of, or inherits - * from, the specified class. - * @param expectedClass The class to compare against as the expected class. - * @discussion - * Example
        - *
        assertThat(canoe, instanceOf([Canoe class]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_instanceOf instead. - */ -static inline id instanceOf(Class expectedClass) -{ - return HC_instanceOf(expectedClass); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsNil.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsNil.h deleted file mode 100644 index 661f83e427..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsNil.h +++ /dev/null @@ -1,55 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Is the value nil? - */ -@interface HCIsNil : HCBaseMatcher -@end - - -FOUNDATION_EXPORT id HC_nilValue(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is nil. - * @discussion - * Example
        - *
        assertThat(myObject, nilValue())
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_nilValue instead. - */ -static inline id nilValue(void) -{ - return HC_nilValue(); -} -#endif - - -FOUNDATION_EXPORT id HC_notNilValue(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is not nil. - * @discussion - * Example
        - *
        assertThat(myObject, notNilValue())
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_notNilValue instead. - */ -static inline id notNilValue(void) -{ - return HC_notNilValue(); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsNot.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsNot.h deleted file mode 100644 index 7c0a28de74..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsNot.h +++ /dev/null @@ -1,44 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Calculates the logical negation of a matcher. - */ -@interface HCIsNot : HCBaseMatcher - -- (instancetype)initWithMatcher:(id )matcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_isNot(_Nullable id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that wraps an existing matcher, but inverts the logic by which it - * will match. - * @param value The matcher to negate, or an expected value to match for inequality. - * @discussion If value is not a matcher, it is implicitly wrapped in an equalTo - * matcher to check for equality, and thus matches for inequality. - * - * Examples
        - *
        assertThat(cheese, isNot(equalTo(smelly)))
        - *
        assertThat(cheese, isNot(smelly))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isNot instead. - */ -static inline id isNot(_Nullable id value) -{ - return HC_isNot(value); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsSame.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsSame.h deleted file mode 100644 index d0ee4106f7..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsSame.h +++ /dev/null @@ -1,41 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Is the value the same object as another value? - */ -@interface HCIsSame : HCBaseMatcher - -- (instancetype)initSameAs:(nullable id)object NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_sameInstance(_Nullable id expectedInstance); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches only when the examined object is the same instance as - * the specified target object. - * @param expectedInstance The expected instance. - * @discussion - * Example
        - *
        assertThat(delegate, sameInstance(expectedDelegate))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_sameInstance instead. - */ -static inline id sameInstance(_Nullable id expectedInstance) -{ - return HC_sameInstance(expectedInstance); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsTrueFalse.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsTrueFalse.h deleted file mode 100644 index 9cc6364072..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsTrueFalse.h +++ /dev/null @@ -1,55 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches true values. - */ -@interface HCIsTrue : HCBaseMatcher -@end - -/*! - * @abstract Matches false values. - */ -@interface HCIsFalse : HCBaseMatcher -@end - - -FOUNDATION_EXPORT id HC_isTrue(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is an non-zero NSNumber. - * @discussion - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isTrue instead. - */ -static inline id isTrue(void) -{ - return HC_isTrue(); -} -#endif - - -FOUNDATION_EXPORT id HC_isFalse(void); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is NSNumber zero. - * @discussion - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isFalse instead. -*/ -static inline id isFalse(void) -{ - return HC_isFalse(); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsTypeOf.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsTypeOf.h deleted file mode 100644 index 00612f0ad2..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCIsTypeOf.h +++ /dev/null @@ -1,37 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches objects that are of a given class. - */ -@interface HCIsTypeOf : HCClassMatcher -@end - - -FOUNDATION_EXPORT id HC_isA(Class expectedClass); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is an instance of the specified - * class, but not of any subclass. - * @param expectedClass The class to compare against as the expected class. - * @discussion - * Example
        - *
        assertThat(canoe, isA([Canoe class]))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_isA instead. - */ -static inline id isA(Class expectedClass) -{ - return HC_isA(expectedClass); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCMatcher.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCMatcher.h deleted file mode 100644 index 1bc8405af5..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCMatcher.h +++ /dev/null @@ -1,47 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import "HCSelfDescribing.h" - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract A matcher over acceptable values. - * @discussion A matcher is able to describe itself to give feedback when it fails. - * - * HCMatcher implementations should not directly implement this protocol. Instead, extend the - * HCBaseMatcher class, which will ensure that the HCMatcher API can grow to support new features - * and remain compatible with all HCMatcher implementations. - */ -@protocol HCMatcher - -/*! - * @abstract Evaluates the matcher for argument item. - * @param item The object against which the matcher is evaluated. - * @return YES if item matches, otherwise NO. - */ -- (BOOL)matches:(nullable id)item; - -/*! - * @abstract Evaluates the matcher for argument item. - * @param item The object against which the matcher is evaluated. - * @param mismatchDescription The description to be built or appended to if item does not match. - * @return YES if item matches, otherwise NO. - */ -- (BOOL)matches:(nullable id)item describingMismatchTo:(nullable id )mismatchDescription; - -/*! - * @abstract Generates a description of why the matcher has not accepted the item. - * @param item The item that the HCMatcher has rejected. - * @param mismatchDescription The description to be built or appended to. - * @discussion The description will be part of a larger description of why a matching failed, so it - * should be concise. - * - * This method assumes that matches:item is false, but will not check this. - */ -- (void)describeMismatchOf:(nullable id)item to:(nullable id )mismatchDescription; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCNumberAssert.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCNumberAssert.h deleted file mode 100644 index 8bb5c86306..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCNumberAssert.h +++ /dev/null @@ -1,340 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - -@protocol HCMatcher; - - -NS_ASSUME_NONNULL_BEGIN - -FOUNDATION_EXPORT void HC_assertThatBoolWithLocation(id testCase, BOOL actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatBool(actual, matcher) \ - HC_assertThatBoolWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatBool(actual, matcher) - - * Asserts that BOOL actual value, converted to an NSNumber, satisfies matcher. - * @param actual The BOOL value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatBool instead. - */ -#define assertThatBool(actual, matcher) HC_assertThatBool(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatCharWithLocation(id testCase, char actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatChar(actual, matcher) \ - HC_assertThatCharWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatChar(actual, matcher) - - * Asserts that char actual value, converted to an NSNumber, satisfies matcher. - * @param actual The char value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatChar instead. - */ -#define assertThatChar(actual, matcher) HC_assertThatChar(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatDoubleWithLocation(id testCase, double actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatDouble(actual, matcher) \ - HC_assertThatDoubleWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract HC_assertThatDouble(actual, matcher) - - * Asserts that double actual value, converted to an NSNumber, satisfies matcher. - * @param actual The double value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatDouble instead. - */ -#define assertThatDouble(actual, matcher) HC_assertThatDouble(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatFloatWithLocation(id testCase, float actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatFloat(actual, matcher) \ - HC_assertThatFloatWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatFloat(actual, matcher) - - * Asserts that float actual value, converted to an NSNumber, satisfies matcher. - * @param actual The float value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatFloat instead. - */ -#define assertThatFloat(actual, matcher) HC_assertThatFloat(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatIntWithLocation(id testCase, int actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatInt(actual, matcher) \ - HC_assertThatIntWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatInt(actual, matcher) - - * Asserts that int actual value, converted to an NSNumber, satisfies matcher. - * @param actual The int value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatInt instead. - */ -#define assertThatInt(actual, matcher) HC_assertThatInt(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatLongWithLocation(id testCase, long actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatLong(actual, matcher) \ - HC_assertThatLongWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatLong(actual, matcher) - - * Asserts that long actual value, converted to an NSNumber, satisfies matcher. - * @param actual The long value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatLong instead. - */ -#define assertThatLong(actual, matcher) HC_assertThatLong(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatLongLongWithLocation(id testCase, long long actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatLongLong(actual, matcher) \ - HC_assertThatLongLongWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatLongLong(actual, matcher) - - * Asserts that long long actual value, converted to an NSNumber, satisfies matcher. - * @param actual The long long value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatLongLong instead. - */ -#define assertThatLongLong(actual, matcher) HC_assertThatLongLong(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatShortWithLocation(id testCase, short actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatShort(actual, matcher) \ - HC_assertThatShortWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatShort(actual, matcher) - - * Asserts that short actual value, converted to an NSNumber, satisfies matcher. - * @param actual The short value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatShort instead. - */ -#define assertThatShort(actual, matcher) HC_assertThatShort(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedCharWithLocation(id testCase, unsigned char actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedChar(actual, matcher) \ - HC_assertThatUnsignedCharWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedChar(actual, matcher) - - * Asserts that unsigned char actual value, converted to an NSNumber, satisfies matcher. - * @param actual The unsigned char value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedChar instead. - */ -#define assertThatUnsignedChar(actual, matcher) HC_assertThatUnsignedChar(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedIntWithLocation(id testCase, unsigned int actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedInt(actual, matcher) \ - HC_assertThatUnsignedIntWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedInt(actual, matcher) - - * Asserts that unsigned int actual value, converted to an NSNumber, satisfies matcher. - * @param actual The unsigned int value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedInt instead. - */ -#define assertThatUnsignedInt(actual, matcher) HC_assertThatUnsignedInt(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedLongWithLocation(id testCase, unsigned long actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedLong(actual, matcher) \ - HC_assertThatUnsignedLongWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedLong(actual, matcher) - - * Asserts that unsigned long actual value, converted to an NSNumber, satisfies matcher. - * @param actual The unsigned long value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedLong instead. - */ -#define assertThatUnsignedLong(actual, matcher) HC_assertThatUnsignedLong(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedLongLongWithLocation(id testCase, unsigned long long actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedLongLong(actual, matcher) \ - HC_assertThatUnsignedLongLongWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedLongLong(actual, matcher) - - * Asserts that unsigned long long actual value, converted to an NSNumber, satisfies matcher. - * @param actual The unsigned long long value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedLongLong instead. - */ -#define assertThatUnsignedLongLong(actual, matcher) HC_assertThatUnsignedLongLong(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedShortWithLocation(id testCase, unsigned short actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedShort(actual, matcher) \ - HC_assertThatUnsignedShortWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedShort(actual, matcher) - - * Asserts that unsigned short actual value, converted to an NSNumber, satisfies matcher. - * @param actual The unsigned short value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedShort instead. - */ -#define assertThatUnsignedShort(actual, matcher) HC_assertThatUnsignedShort(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatIntegerWithLocation(id testCase, NSInteger actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatInteger(actual, matcher) \ - HC_assertThatIntegerWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatInteger(actual, matcher) - - * Asserts that NSInteger actual value, converted to an NSNumber, satisfies matcher. - * @param actual The NSInteger value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatInteger instead. - */ -#define assertThatInteger(actual, matcher) HC_assertThatInteger(actual, matcher) -#endif - - -FOUNDATION_EXPORT void HC_assertThatUnsignedIntegerWithLocation(id testCase, NSUInteger actual, - id matcher, char const *fileName, int lineNumber); - -#define HC_assertThatUnsignedInteger(actual, matcher) \ - HC_assertThatUnsignedIntegerWithLocation(self, actual, matcher, __FILE__, __LINE__) - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract assertThatUnsignedInteger(actual, matcher) - - * Asserts that NSUInteger actual value, converted to an NSNumber, satisfies matcher. - * @param actual The NSUInteger value to convert to an NSNumber for evaluation. - * @param matcher The matcher to satisfy as the expected condition. - * @discussion Consider using assertThat(\@(actual), matcher) instead. - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_assertThatUnsignedInteger instead. - */ -#define assertThatUnsignedInteger(actual, matcher) HC_assertThatUnsignedInteger(actual, matcher) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCOrderingComparison.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCOrderingComparison.h deleted file mode 100644 index da489c9ecc..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCOrderingComparison.h +++ /dev/null @@ -1,114 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Matches values with -compare:. - */ -@interface HCOrderingComparison : HCBaseMatcher - -- (instancetype)initComparing:(id)expectedValue - minCompare:(NSComparisonResult)min - maxCompare:(NSComparisonResult)max - comparisonDescription:(NSString *)comparisonDescription NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_greaterThan(id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is greater than the specified - * value, as reported by the -compare: method of the examined object. - * @param value The value which, when passed to the -compare: method of the examined - * object, should return NSOrderedAscending. - * @discussion - * Example
        - *
        assertThat(\@2, greaterThan(\@1))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_greaterThan instead. - */ -static inline id greaterThan(id value) -{ - return HC_greaterThan(value); -} -#endif - - -FOUNDATION_EXPORT id HC_greaterThanOrEqualTo(id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is greater than or equal to the - * specified value, as reported by the -compare: method of the examined object. - * @param value The value which, when passed to the -compare: method of the examined - * object, should return NSOrderedAscending or NSOrderedSame. - * @discussion - * Example
        - *
        assertThat(\@1, greaterThanOrEqualTo(\@1))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_greaterThanOrEqualTo instead. - */ -static inline id greaterThanOrEqualTo(id value) -{ - return HC_greaterThanOrEqualTo(value); -} -#endif - - -FOUNDATION_EXPORT id HC_lessThan(id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is less than the specified - * value, as reported by the -compare: method of the examined object. - * @param value The value which, when passed to the -compare: method of the examined - * object, should return NSOrderedDescending. - * @discussion - * Example
        - *
        assertThat(\@1, lessThan(\@2))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_lessThan instead. - */ -static inline id lessThan(id value) -{ - return HC_lessThan(value); -} -#endif - - -FOUNDATION_EXPORT id HC_lessThanOrEqualTo(id value); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is less than or equal to the - * specified value, as reported by the -compare: method of the examined object. - * @param value The value which, when passed to the -compare: method of the examined - * object, should return NSOrderedDescending or NSOrderedSame. - * @discussion - * Example
        - *
        assertThat(\@1, lessThanOrEqualTo(\@1))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_lessThanOrEqualTo instead. - */ -static inline id lessThanOrEqualTo(id value) -{ - return HC_lessThanOrEqualTo(value); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCRequireNonNilObject.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCRequireNonNilObject.h deleted file mode 100644 index 606cf74714..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCRequireNonNilObject.h +++ /dev/null @@ -1,14 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Throws an NSException if obj is nil. -*/ -FOUNDATION_EXPORT void HCRequireNonNilObject(id obj); - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCSelfDescribing.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCSelfDescribing.h deleted file mode 100644 index f40edce9dd..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCSelfDescribing.h +++ /dev/null @@ -1,26 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - -#import "HCDescription.h" // Convenience header - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract The ability of an object to describe itself. - */ -@protocol HCSelfDescribing - -/*! - * @abstract Generates a description of the object. - * @param description The description to be built or appended to. - * @discussion The description may be part of a description of a larger object of which this is just - * a component, so it should be worded appropriately. - */ -- (void)describeTo:(id )description; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringContains.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringContains.h deleted file mode 100644 index 029509f7e8..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringContains.h +++ /dev/null @@ -1,39 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Tests if string that contains a substring. - */ -@interface HCStringContains : HCSubstringMatcher -@end - - -FOUNDATION_EXPORT id HC_containsSubstring(NSString *substring); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is a string containing the - * specified substring anywhere. - * @param substring The string to search for. (Must not be nil.) - * @discussion The matcher invokes -rangeOfString: on the examined object, passing the - * specified substring and matching if it is found. - * - * Example
        - *
        assertThat(\@"myStringOfNote", containsSubstring(\@"ring"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_containsSubstring instead. - */ -static inline id containsSubstring(NSString *substring) -{ - return HC_containsSubstring(substring); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringContainsInOrder.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringContainsInOrder.h deleted file mode 100644 index 6a7d0c68a1..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringContainsInOrder.h +++ /dev/null @@ -1,62 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Tests if string that contains a list of substrings in relative order. - */ -@interface HCStringContainsInOrder : HCBaseMatcher - -- (instancetype)initWithSubstrings:(NSArray *)substrings NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_stringContainsInOrderIn(NSArray *substrings); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates matcher for NSStrings that matches when the examined string contains all of the - * specified substrings, considering the order of their appearance. - * @param substrings An array of strings. - * @discussion - * Example
        - *
        assertThat(\@"myfoobarbaz", stringContainsInOrderIn(\@[\@"bar", \@"foo"]))
        - * fails as "foo" occurs before "bar" in the string "myfoobarbaz" - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_stringContainsInOrderIn instead. - */ -static inline id stringContainsInOrderIn(NSArray *substrings) -{ - return HC_stringContainsInOrderIn(substrings); -} -#endif - - -FOUNDATION_EXPORT id HC_stringContainsInOrder(NSString *substrings, ...) NS_REQUIRES_NIL_TERMINATION; - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates matcher for NSStrings that matches when the examined string contains all of the - * specified substrings, considering the order of their appearance. - * @param substrings... A comma-separated list of strings, ending with nil. - * @discussion - * Example
        - *
        assertThat(\@"myfoobarbaz", stringContainsInOrder(\@"bar", \@"foo", nil))
        - * fails as "foo" occurs before "bar" in the string "myfoobarbaz" - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_stringContainsInOrder instead. - */ -#define stringContainsInOrder(substrings...) HC_stringContainsInOrder(substrings) -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringDescription.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringDescription.h deleted file mode 100644 index 07825d2c03..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringDescription.h +++ /dev/null @@ -1,38 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - -@protocol HCSelfDescribing; - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract An HCDescription that is stored as a string. - */ -@interface HCStringDescription : HCBaseDescription -{ - NSMutableString *accumulator; -} - -/*! - * @abstract Returns the description of an HCSelfDescribing object as a string. - * @param selfDescribing The object to be described. - * @return The description of the object. - */ -+ (NSString *)stringFrom:(id )selfDescribing; - -/*! - * @abstract Creates and returns an empty description. - */ -+ (instancetype)stringDescription; - -/*! - * @abstract Initializes a newly allocated HCStringDescription that is initially empty. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringEndsWith.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringEndsWith.h deleted file mode 100644 index 8ace606540..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringEndsWith.h +++ /dev/null @@ -1,40 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Tests if string ends with a substring. - */ -@interface HCStringEndsWith : HCSubstringMatcher -@end - - -FOUNDATION_EXPORT id HC_endsWith(NSString *suffix); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is a string that ends with the - * specified string. - * @param suffix The substring that the returned matcher will expect at the end of any examined - * string. (Must not be nil.) - * @discussion The matcher invokes -hasSuffix: on the examined object, passing the - * specified suffix. - * - * Example
        - *
        assertThat(\@"myStringOfNote", endsWith(\@"Note"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_endsWith instead. - */ -static inline id endsWith(NSString *suffix) -{ - return HC_endsWith(suffix); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringStartsWith.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringStartsWith.h deleted file mode 100644 index 6caa4d22eb..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCStringStartsWith.h +++ /dev/null @@ -1,40 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Tests string starts with a substring. - */ -@interface HCStringStartsWith : HCSubstringMatcher -@end - - -FOUNDATION_EXPORT id HC_startsWith(NSString *prefix); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is a string that starts with - * the specified string. - * @param prefix The substring that the returned matcher will expect at the start of any examined - * string. (Must not be nil.) - * @discussion The matcher invokes -hasPrefix: on the examined object, passing the - * specified prefix. - * - * Example
        - *
        assertThat(\@"myStringOfNote", startsWith(\@"my"))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_startsWith instead. - */ -static inline id startsWith(NSString *prefix) -{ - return HC_startsWith(prefix); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCSubstringMatcher.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCSubstringMatcher.h deleted file mode 100644 index 94bb6da37b..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCSubstringMatcher.h +++ /dev/null @@ -1,18 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -@interface HCSubstringMatcher : HCBaseMatcher - -@property (nonatomic, copy, readonly) NSString *substring; - -- (instancetype)initWithSubstring:(NSString *)substring NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCTestFailure.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCTestFailure.h deleted file mode 100644 index e40e54bc57..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCTestFailure.h +++ /dev/null @@ -1,42 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - @abstract Test failure location and reason. - */ -@interface HCTestFailure : NSObject - -/*! - * @abstract Test case used to run test method. - * @discussion Can be nil. - * - * For unmet OCHamcrest assertions, if the assertion was assertThat or - * assertWithTimeout, testCase will be the test case instance. - */ -@property (nonatomic, strong, readonly) id testCase; - -/*! @abstract File name to report. */ -@property (nonatomic, copy, readonly) NSString *fileName; - -/*! @abstract Line number to report. */ -@property (nonatomic, assign, readonly) NSUInteger lineNumber; - -/*! @abstract Failure reason to report. */ -@property (nonatomic, strong, readonly) NSString *reason; - -/*! - * @abstract Initializes a newly allocated instance of a test failure. - */ -- (instancetype)initWithTestCase:(id)testCase - fileName:(NSString *)fileName - lineNumber:(NSUInteger)lineNumber - reason:(NSString *)reason; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCTestFailureReporter.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCTestFailureReporter.h deleted file mode 100644 index b54a4afdbf..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCTestFailureReporter.h +++ /dev/null @@ -1,25 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - -@class HCTestFailure; - - -NS_ASSUME_NONNULL_BEGIN - -/*! - Chain-of-responsibility for handling test failures. - */ -@interface HCTestFailureReporter : NSObject - -@property (nullable, nonatomic, strong) HCTestFailureReporter *successor; - -/*! - Handle test failure at specific location, or pass to successor. - */ -- (void)handleFailure:(HCTestFailure *)failure; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCTestFailureReporterChain.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCTestFailureReporterChain.h deleted file mode 100644 index 37e5651150..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCTestFailureReporterChain.h +++ /dev/null @@ -1,36 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - -@class HCTestFailureReporter; - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Manage chain-of-responsibility for reporting test failures. - * @discussion This provides a generic way of reporting test failures without knowing about the - * underlying test framework. By default, we try XCTest first, then SenTestingKit. If we run out of - * options, the final catch-all is to throw an NSException describing the test failure. - */ -@interface HCTestFailureReporterChain : NSObject - -/*! - * @abstract Returns current chain of test failure reporters. - */ -+ (HCTestFailureReporter *)reporterChain; - -/*! - * @abstract Adds specified test failure reporter to head of chain-of-responsibility. - */ -+ (void)addReporter:(HCTestFailureReporter *)reporter; - -/*! - * @abstract Resets chain-of-responsibility to default. - */ -+ (void)reset; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCThrowsException.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCThrowsException.h deleted file mode 100644 index 6c9d360464..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCThrowsException.h +++ /dev/null @@ -1,41 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Does executing a block throw an exception which satisfies a nested matcher? - */ -@interface HCThrowsException : HCDiagnosingMatcher - -- (id)initWithExceptionMatcher:(id)exceptionMatcher NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; - -@end - - -FOUNDATION_EXPORT id HC_throwsException(id exceptionMatcher); - -#ifndef HC_DISABLE_SHORT_SYNTAX -/*! - * @abstract Creates a matcher that matches when the examined object is a block which, when - * executed, throws an exception satisfying the specified matcher. - * @param exceptionMatcher The matcher to satisfy when passed the exception. - * @discussion - * Example
        - *
        assertThat(^{ [obj somethingBad]; }, throwsException(hasProperty(@"reason", @"EXPECTED REASON")))
        - * - * Name Clash
        - * In the event of a name clash, #define HC_DISABLE_SHORT_SYNTAX and use the synonym - * HC_throwsException instead. - */ -static inline id throwsException(id exceptionMatcher) -{ - return HC_throwsException(exceptionMatcher); -} -#endif - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCWrapInMatcher.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCWrapInMatcher.h deleted file mode 100644 index 2b58f9b975..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/HCWrapInMatcher.h +++ /dev/null @@ -1,17 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import - -@protocol HCMatcher; - - -NS_ASSUME_NONNULL_BEGIN - -/*! - * @abstract Wraps argument in a matcher, if necessary. - * @return The argument as-is if it is already a matcher, otherwise wrapped in an equalTo matcher. - */ -FOUNDATION_EXPORT _Nullable id HCWrapInMatcher(_Nullable id matcherOrValue); - -NS_ASSUME_NONNULL_END diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/OCHamcrest.h b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/OCHamcrest.h deleted file mode 100644 index ffe215234d..0000000000 --- a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Headers/OCHamcrest.h +++ /dev/null @@ -1,54 +0,0 @@ -// OCHamcrest by Jon Reid, http://qualitycoding.org/about/ -// Copyright 2017 hamcrest.org. See LICENSE.txt - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -// Carthage workaround: Include transitive public headers -#import -#import -#import -#import -#import diff --git a/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Info.plist b/Vendor/tvOS/OCHamcrest/OCHamcrest.framework/Info.plist deleted file mode 100644 index bc59b9df6777dc140fa5dbb9366e345f1e4fc41f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 864 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

        B$CKd$O>SU#9S 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Ξ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

        GkCdnc7?-4!+Ht2E=;HrIJvKq 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•HQ+AHLVN-s{j9uEFKK6|^<=!+Eg*JZ7 zHFn)Rjg`;)f~oc+T}|WwuF)-OuYeo*%;zl(Z?{AXV2)YM)UlEwMY)y5U71tQ>vp(D$!z zxV7_(udcj))Bm-%ze@e-rhm?R8KHwOuX*yrFJ9|-^wx9l{N?KEpKMZ{zUi7YIsD_d z-~V*OlAFt4dOvCXjc?a(drZd-a7Zmh3#Uk0y;F&{xWQp3Vo|`j4#}t#y~B#Wt1XUO zm+1=qI8H;C*XnW&eo-ENa5?dxtCpRTEyFLGVmBJa@JwFnfZUI&758(T4k&low7wxv z5f+Qc9tHOd$`GfRklF|rG43~|B3HY&!Ljewe<%!cTxGen`k;3s?KvjRWGUzF`(^X{ z3LQ@%eVoINOTG?g1hN7u5*@s27*}rqf&XZu8;8tv zHSt$PQ-8Z{hTR>e_8!;TX!su(6YsKj*;f*^kTX&e<#%S1EP<2i@LjyiwfoYlt(C-P z{6Fly4O~=J{y%=_fnmS_21Fd>!3(0HB8`BEkIeuo8tSN6nwB#Nh6Rd3rq$PG7@jmV zG*T+J1v8`8T71Z~wGD&}6AOD&e)$ot)*2cvn{bT<0&Ie0l8*Xf}RwNkK96Mw^`Ayq?)sWi3m9H@m zKVA3zfhTWd6@7T|r$295@!b30Q$MpFS^l?qo;`{^rexEA|BNnHK+J_3!_h-4xfj z=$X2|{1BM7`l!Asq^f?=Uq0fC@Ho5bg@-o(;iD_joXS&kj=1@>3WLn1fsDK$_(j+3 zALpRv@3*e{eB3X4>lR-7dCY4^Kf3b$PxH4w{Ym;yFRY)q?vvKPo%LU`c~-@)`M+$k zPDxu^6iO)6Z@=9VIsFfR`Xc9rUkcv;Xvq_E*Z139_x=9p zvyrdq()ZsO=K6fY8$IXr_R-vHFI`r>b9As_ZsgNP^#h}(=6bbU-Z^&cB)fKeeA?#M zKKtt1{mC~EezADudl8d5C&PJ%-86%az(gy}f%UC{i+m;HiWB1U>q_GBIEEWy`7#wh zRmQA4S`{CR$pdcFi?lABm^GkLh6(4m64|)Ml_hx8dQ$0%`9n6Ixw2(+8)b|98@*{_ z+^Y3jqV@Vqn`fKBGg@6wPXx^&K?hC2i?nOTV6NDNS+{KL0qar9Y&xV9i<=p>$b#Y}0amBJRWp#HW(;InXPRYhp*Qq{ST$DWra}R57293_S znxfo_BLCyFysj`b#XX1FFQ(9}C#Lt&Y9 z7VDTsLzqwzW6|R)U00URNWNC;MJ*8g2>19F67+d(&}s=ie>H{#wV4zt1=hI6x-r!W zqovsiAa6a_MH+vOTv?e=YF? z=JACYrsWHA7C(VS&z3AmU-DQM7copuV3X5Vq-W}BMR1nB6R|6>7&tzb;nNx|4$jhh zmL(4l!-qC)J3>Mz?@NbJ2EX-ZGG;7J??4|Hyk;_s>vleHOx`ewEh7M&@ z;`RCk@k{X)Zb>dPKskG4o?+Dh<;MstwMwa>Zu_)`2O%+E1OIMp_=@Y|YcROq=+TO>>Ot8QeM=@b$v$$iDiP2qIH zOpcLHt9>iM9Q71~o9!V`Ish~yb00-e#`zc)Pginh0Rui1UwqrG<;9;*~0KTlTs zPFSbWxWOxL&}B*Q%U>B%9@S>*|jq^txcIugK7;Rmqk?*G{`z{LU14qp|POQ?ecvOXTRFZWhTn?+%a@owPg4s#dQSjN@53yNQE(_~h zvY{}k)$f5;xZCwp$ZK`J%O(3|WB18MwCxhqyUb4#)#pn5%8bqCIoDZoO3UTABE-+{ z0XU`gQOhw{yNot2a`TCj)o7L|vn8B+>gE$Bj~g}cwawS;NUJB@>gJ=|YL{%~jTWyP z6`t_)i>zyWSL;#IKq{%SXdZdipE9y94PZ4g7c)FEuQXOm;%Ck`oSCbDTlK1v*1{TZ z>s&>Gve2Wr)!%HAeQ8vf19fQl1_lkkHl%zYs~BP~WD70sLqqC~nyMBcx54F0>f0NFxHCAk0E~^cR)ivdrWTC}YrhK4Q%PP3K ztz}!3OOG1mpKc0q+dItalRd9+AS#)HitVWQG%8n5qXJ*I-(Ya-EuYWTjqH5o;cIsd zd2^RXc*RK%zM2)f%Ceg}iH~on{%^f}ztovL%P#7^^HOhDyBo|aM(8$GuGcYdjH~+5 zShbMNd&KLFahk6)0$({}eZ;G9bnwNhA1lsSE7vE*^CAN_ZsbME!(Sy4D#v$P*n}Vq zrMsG^RH?ux0v*5+nRbKh3~-d%QZ+Y*u{g^6IM)gVr$}2lB3*AZ*kx@HtQ;=}M z6c-G`wL@J#MOP44To{lS&ETY_Dp%wdH!*PY&0jPbmAxjae7MW=p%9%lMrX|uI)7~+ za&S+b-(`-r01oaA8Yr7l>XPcwZ1fl%EnfPiE-4pJivy9~PrPDW9xxOP5EE6qobzaD z@fe>j=&tnJC|+3eGF)i9@*8IxuUzJ57Yy_h3%Eq$Q9f6iRbNBn$$gc6ztjXQQGQMR zuq3qkMD1?b7;%VD7mdJB!`J1BkZQaPw8n@dQj3d87?EoGW|$!6%T>9?(tydNbwoJ^ zJQ-Kj?COFM4dU?Ul1+}pxxuJj(s#W${8<7^$G2I>8)ag3Oo6uQEN|wklhR(DoR)&~ zeZ}e=sr5v4zByU5Yk*>+6rRytub5qHU$vx95>CkHAzm1ssNHogIoSmxaMewr;jVN5 z4R^`4zM`gcCJ6GwUBL=va;tB02!=v_xNEizciFDXZNr_*N_M8c&rFk7A{v7m?j*sD zCa;;|a3=}2oxD}LBHPKUaNX8ter2B@b^gNeUS5@L*968#=7*1tyB7W z&t2r-FQZ~kb%}>M&mz@nr2~ydS^lbUXfP_7F)307G!&=`1BxGGalsz)UgRGfjv>~! zXrgbg`BFu!uEEvRY*v09!Yp#Du&iIZl675})OX0jeIXUDTFny8If=(2|Ei?&fu)Ke zKUTb$pHZ>(i9tUVqYP=OTjv%Y?su_o#6nrV5yNvylbgDksSI0-u~;Lm@qF2AZY?y2 zSX&kK!A&?vTk|bzk66nVSEPEy6qhgZA2L)M5}`B7W4PR3Vgi#fxQ$#OEvRz11cizD;8JIA-43FuG^7;GSVo zoWMQtd#&}fiWzl5%Um);D0-sjCJItCSH&&<5 zS))_!RSombou?=#aGLzHO(79bXz;7uo34GvEJJ44ma+VNoAWu}>t|)NvE1xc>K4A? z_h#Q}!JvzL$?u0O{NC=P_b@aMzYFtwnq(&maRWlyD5QEc(@PO-!w~u*OhAY?QOqaY z8yPyn%TZW@W1$Ei!yba2dovt{^(%n0h;PDX`cn&OguF7_5IX0xV8Vuv2)i>o$c&IcuxV`e@B1L&TKb0K_{M<9qn0cCLiQz z)|o3sJEnxQ!yVESmBKLtyY$Wu+tsk6qpEhVU5*+%nb0gqU9}*4ArITi!&|>NrsYaw zXIbN{=|BY$NHfH_an#VWuTRGmLcutbU^}~+9>s*Y@xR9H+pG>o)eAe($ZYK>_KQvu zb|==UtE&zg=+t+o!Rc|kzTx1-ti5w|QrboD;J7+)P|lk&ixy6uQakn!-aEQus*XLR zlagEVzt-dF=M9}YDeu&qgl@w7P7pjOz@doE9fo5@cC9M9rx5)v2%)``9cLGaASOCa z5&fo!PA=kTu*3H6^xZ%_a@_Z_Qo%zfoAlM;ST_LJL*SuP99t#D=U~UDrmQ3(9FGvo zg=NJd#QidB5Yk`84Y3~U+YbR2iu4qx^b`-qPU(FSQaVo|u0XnBkPAXO?t>E2QJm6I z{08m|r2lL1y6?da=3cD--v;a)c;6H!If}PnC;g`plKv)yl&%Kph&On?*+29LGB&o+e?P^Sb$YPj^d=B;^4`1`sw~i`b&g(KGIQne~a?dJ#{tG ziRGvG6WFO78AAE--E8L)V5xTHr}#tIsr+<*C;fE)r*z|m@?Su@L|}1t<)^q7JLUsf zVUT+YsQ2zc%=MIec@?!ZZ{&&nPYCI`h0?ntr1XEsqlF3iJ_x@646q;Z35McSFN$Bp4@!@Z z^jx}TA>M>^RF6lI?liC?NGH~d;)k%4{ymVRdRQR$F0i*CC)SJNZ(t|=6$q(ZFCwIL z#Yji>*n)KHf#o5cSTBk%!H#KnmJxD4;#}i-aOWam4?vFM*eWSL1v@U&EFI)_0ndQk zL|~&KM{#VG6vv|ocYPchhJJ-Op1o|>2gNbe(6dVx0{T9crABxhJFRCxdd>^KDeq`% zTe|je;f2v}BqmPQvyh>63jlNLSkQ0M3lZCT2K2#-;*?_c6euov~8XwP8vIlILsP53v@NV=`86;l<#JuL*&FxEcy=9e4fnR zX@bZ&od9+&OQ%xvvp11SFB0(tqJ1Z3y<^ckG$hT9JLhQEki39>4R4vj?wD~Gv*%yO z=hTAj$*dOJS<(K2+|c zR5v<5m@9R;nW4u%Z&5JbC^0f2=Ih~VhRvQ-{kHV?s)^uBwYgk}kF)nKJrZK9eoth- zy;5zS7=QJEn&+1h%QLi;VaqA)U|ri4bNtmU-pcQk3SuxdUuW1=iOtvLh7;GBYVV98 z6PZ%QJkyZO@xH<@r<+iA0O$MiOdyB17OCR753)PCTPoX}luQS*#Io(0KHB=*$r zZW5QQisLa7@9>qI$pT~Y1Fk&wvd@Dtx!arPiS-X9Zf6OXdW|i0J|uQJ$z>%c_n1vC z`zFuP!a6uCF%C0s5~DBuChDPf|4!nLS~933EBV>|dr1bvQXOypG#m9;bfUdpQ*UPP zWL8Q>FyX}~Ak9cZiqU4_{UmV>*CTLw7{Ir@%t)QE1GQXvhS|y!esi`^>pwAc7VK-? z4|RG^Vqa@-F14pEwHqY9g_)mY%71Viz`xr#fIkR4OR?79{NlofzM%i{;BustK9T5? z;gd0=pY;6!Hg4M4U&Nks^QViyP|q2>*yTGV^XOuXA7G6({=yoWaOL~11H&g)zgLRd zd+$`DC)E5gdr}u1v2Mst%hOG1%v4i$c6u6XVtHCPn@L^?m$SJUrX}psCFyK7NMa%E z%ycXZlTD1Q$jC@$B361qn%t#eY5`|WX=#gz|8B};bFxhf(>WpW%HTtL{*nP>3FbYw z#b1)(BEKd6l7{Cm)!X<>sh#*s-uC>Z;XHo{&rVFh=K_DpEYnE`=>{AELq^ZpT3Ldw zR(gqHHyc&x&F}s!4KPkzrj1<`PId z?KG!m@MlcHXBaZ%Iuru)dfw0+44*)ol{v>X(z>ov7Lh7*(c>WbRFI8(EWTbP6|G=k zPV{wUpt-gOrV}jqVKjEe90bd@MhQzc{VWX80=uIXJq8*N*jXq)R}s6C-=PHjI!b_= zIa;{apQo3E8Kp6)fuF+y4`<&J+#J&Xj4t@|%HXp^LI^x#4m?>Kd=kGaJuZXGsw^0$8JfffBM1ueZ_SZ>MFmzI<4GCuCZh~6V_n85 zQIS>Pq7W^lXgMq|tB9kxiaBitUoIGy7vR+4V#E*dNx%}UM@d>~NC9%WHn7Fy$!rZq zmC=C0nQ~fzYYenV;d6!YGB4#7YDALz}JFFqs+#y<4A57Sg+P5Qq|Vx3BuboP{o=Q z=W9GKHF+{*B3vfZ_CT=%5w32`zJvf+Sb`YFaMZYM)-mPXQR7-XTU)xL!_|)6RyPW4 zw9j!2_0+pd5VRVVij#g*E35shl>Cz@~zJEJP@N7OtEtq^$)1B+VcXKBF-q0iQ_SDp!7v1+P&`>RiZ8>N;mxJd4b-Q+bODTyR?_DV5AzNW)9H256Av?qzXNXf zD7;GjNybV(Qlz?>qnmYFir>SWRBZJ&W5Fikz|nlMcfPKiRn^NY*+KHU{F-uB^Pybg zJxG2yUq5%fTiz~W!sV4l^p?N+0_U!24a+|-M}-!1{I}l3f9oys-%7xLt4~(ns11~8 z)Y?hrw0vDcKV?c-v2M~yWm(!9T`#x0I2IcCUElSWYt`O(--fMx08{W6j;-~yjk~t` zkeg3@c@v&1+nAa_NlJcr=<7;Gm*V|$(GHo6BgRerac;h{bbbHQ>WSB7nW0-U*wC2d zk0&%QKIuE-;JJHj9GH7#$|5T&+|Lz{LF%ZJkt)Z$6l%|}Hg8uhR;6UZ457Y{^kS^} zKos+!u0^TyuYav_r&2d*;D~hQ-RBH>Q%+RDkL3gMov-XwZk_UNpx&UuQ#?Cpe?Og! z(Iw=DFcp%9NNJOLyju6EuTH8^;^V@90@o}ATr+QP;+kC={42O-$J#Xi*mCmx;-5Yl z@wr5zVwoC-G1J+*Y}TY|?73oTzIAp?vRzFrnr0R+0F;n52bK2M9B#5>k|ov7QH-=P z$%?nRn_48?>jn}Bi|c`+XnK=CFA~rfh{Y9USqFXo+CP$tZPw`69NW!I0Ok~_ES@&097oY9^Mz#B^HSTX3WbUyQ*)sPyv%-P=Rn-)K zf9PLzxtD+HK=3?%_f+qbnx_*P*}&1R$FzYD4YD4r81>-GD}JlLTzzByChNtE)dAO5 zY}U86?GKbrKKhL|kd8%ee#UR0Y+>B7$mjIeMkYP9q^Pw*`@)v(uYGYv8xT`e^kI7G z(eqU4JA9@8UcS<5oZlY!N}1)SIKGl)@7NOt@5z#XGH0pl7cF+SrDFljZRo32PqgCtM8nwEFm;_y;nvGT!X_BHnap!>@jVX-ak27^+>7W z6P2}J8DN7Vojt~8o?R!YSr+&q{cX_{OFmp<(G*)WbNu>MNa(Lg-mk_Qu+Kt&4N1nl zsMLkKAI(|(j@cD8^4%Fy?Z1p~h3{uJ4i$|b z@)BAKo?%`JaM#0RI4_ln9jQssr~=gb;Q&2T30%tTQWi_NQFmS;Yp@QhQ}3wVRHTl-|Et-|wu%zooWN?{!3XMq5&= zNg__!|1im*k)3d@@pXSGpvrBlPE+Th4=~q8B$Ucu3W&VdGn_eep-}aV^_a&4n`Tt6 zd()$K?+iwj>S6@BYchyFf!8e|fszqt)lV67$8CEhP)><=MUZ50__Y&#GG_=z+eI z1+LwrHN8yc^ZH@vnM;Yka>)Dg>Lly9W)RO7qNW<_vT`Dx@g?n>H?GAx4x}``Lb3-z zJmXtoWvd?%&p5G~zRG*9%kC+ajS~#}$Fvp9FO}T`ng{U)#x)z(MA~)h2Hc7`QUZR?G{jjcA zOK)?We7vP0U*ehwDi_%}&s!T}lzr*3S2d|xF;6iN*SoCuMO^Q0XN^a-irU~z@Vfw7 z`^lexak|wA$xQXW+D#JQym8G@8IucRNo)8Yk9ikM6h@sy8#^hy zSQF^WEUaf{#H&@OYdqFc<0%Jez#3pB)=P!a#yr(bH`_QCYQ{L`U0(}6*E!0aFQ5H5 z)^U7PgjCSwC~@W4PD`}zOVI(5)#oj$ytz_|ER}Rnnt5wkYCnp0w8>Yz=C-owC9~T} zw|&_M%pTv`+2pT*EbNqF2E$LYe~)nxp9h#kA#OlO8--Lx*xPX1+mQ3aucHVjA^e1I zYVH`x(dGl$P=sW25rUnbMDdixz_y389e)%UJ|Wuh`M}9u8tX@J>&B8i+0s7-oCWp< zcF~5PCehCWCtLT!*r_a{{0`uQ5&r^vxPVi>9|Na;;EFQSw@pqS_|L#Y5sv_FU(O)Z ziEPKG0uQv4A1&aE9q{{sdqJ)MxTl@`BH&cc=YZSFiG0Z)1briY9XPeQSRUAj(Nhbz z(X%>-%i$viILQ%)D2G!+Z3a${Dr)Sa9>RYMd!&atV~oj4Lx|T$S+E(US3v2B2r>3$!4`Bs*{>Xg@2x0cumydc;@B!F9*W%^a&-Tp zP>B%Zah4Pz+3H<`jpR4@{ViT&{2hv~z($hdl%C>WW2ba22r1neA$}6+UVz+tNY@Mu zHlnXnoYGOe0Xyk`7jn-5{}beDfbE4G#Yv9hJFt`ftq4i~7KD_p1nKf1cNyu(ezXwj zC{F1p4x3P}J!T@rc%K!8klKmvTci)ZthmqzA?Z~iB)z}DmT^Dy?1W9W9N2Z-awtxE zDSiz8O5a=bbMD!+qaYUy85APUjzwKU{rNAb%qSHlQK!1qv(~@)XBbN%0sQ zr+#n%$Kw#k6v5UnC{Fi5R5zXOt#qG8`*QZ0VfYr9r{{NeIL@U_XJ=bM z(OnJ=B~Fgok5gTUI2-VK&}4Tz>@4YMyJ>H{C^$LlFyeLA(8W!Hb8KXrg8W+hOR>S6 zn_hOvx=Z8B9tK!EL)^B1jJQ}WnNzmgQ}T;d&m#X&6PIHJ=E+MIEw$NHIMF z?<;NS)6TZ+NbpJ_MRiXG@^CZQ2`xP|1d!ZC*<%?D91utikm9qSeGj32u2$6^=ZF3sSA9g<>Zo#V_oPz z)&x9RD92gUg*ealn_ZjcuFCG*rsc>`j|73#sqD6n<>=mj$|n$}arVJ(bzsC=xPWVq z%*8pmj&&i<3!R4s=%Bp!jBwUJy7$2XjuKNn1irMPgLFCDdh)@-;2O(7!hBpOUF+cL z!mZuD7#Fx>T{579`p0GHaM)~pY#&&hG4>!t-DcWcGE`=-T9nC0o2>86}? zCM}(F!p9xEe{pWcWL$g8A6rP4o`$9PQjxxVG|vT~k$p7891k zQT}4br*gJor!AZkV4H(b7p2u{N5{;F(+!VhR>aY71`!H$LX6RcI<^W&9;T)Yb#^9F zW<<=4m=D2=lc#{@{T?V$}sj&d&l2~kAh5G#J6PQ`zw7Ej73`q zoEB_+%b9f=EGbPkdCMwXS2PsG!rHIOmDZ|fi(+B9TV0fk-&oqY*cBFmPS>%{BQwf_ z`aqaDo-qd>3<+w+64Y3n(h_u`-J}vmnOJF(vnE`QB^YVBXc-p5$Fld!ZMJ%xC2mdE z_LPze*Hu-pI8>0+fNt!7Gh|pQ5>5VIdClG2|o#6lfi4S zc?4Uu%Iq3DNA@@tWz41@!ivf$$x1k*AmmA`R$eYMqZ`0(8&;dn9Xou@+0I^Q4QjNI zJu4Q@L@qX4?O0779BsXA(eUO?FMBLY;LR>;B&?*jLDKJz!5kUPRV9qWqOIh3!Ak35 zHp)aRL*DPf6}9J;?))A!a*L#r#j0gI3@8tDXXpv{3u@0c#tWvUUv=^VQ9l;W3QFom z!*2sjJh5^rjACIOyT=lD%E~YJ3Pae@FaTv%+WRihVli5;8rW`*LGIh?;utw9G8V>~ zWH$*TRN1&wWcE6ic~l4I240!f3OGRcw#5@auo~_UO`cz(ByFDO421j$TTHDhGs6p2 zhUW(u!a8%&aEh~_#R{+GGP268t|Pw(Hg6BG^kwFlACZ{^8{dH90YvU3+c}yWk?ovX z)myPuJxF@_UIJdUv2_2IY4R!!Tuz1U~aO<{fY;^9)WG)J!VIHF_KRl34a zQtiIU+*0gcVCCb7i!Ws>V${lfdD51FQ@sZ!|8g_BJ~yuJefH$F=@~lKcMp4X6ld~w zbNaclH}mDv5J})jezo^|Hhh1hSLoE6`3m`$dUfcQFg|_a@pH=KSEpBnsQalDR&PBU zmam-ZV_yCuw+{RJy~7UP2&otJC%Giv%wOBfV%CK*7Y1=gcu#MWZhcz6 z?b2_X%(}FsoQ=GOYG&iLNyqOAak1#s%92Bc>X75(_#z&ZCY`*eQp%_UN6Q=XB$lg2 z-PS~ndhj?!+L7lZmAg#3H@0ZhL;EVuP07pmS1UCiY)sYd_SG1M`73gdu9uvj$t+aJ zQzsobrzyRAfkK`vDS}jpN3>b@!DY5-SqW2dE>IF);?2}YxacR(i9NhZC=+UR_Y5!Z z5Q~n@2vW|FPW~%eyLhzJp!nTJ-Jhc(o|hllRQY;X(+bvHmd+-+UHi=d<#r}xu41S~ zcP?tqEApsWz3CkPAKUU(r~bWQ0b5|GC@>gh+Uo@iR=O@T6fL{%LI&~5qCQz|z24Wk zSL%9I)+pX@>-8<``L)*beJ$*sz2H#xHYPRYzj5 zy1vAC4L#n{ceTZDillFb#bb4A-_P}dr%ZvX;q3=ba%zJP(hrYAreKg{$l@PM9f#2U z1snjl61uOc_U;?f!THi*`O<(J2Vo%<&(=~Fwq_b3-W5om~Aq0=Yr*>Z%Es{ zyEMwk==_G1OtDMr?uL;!th8(D)?PwkeB&*C@fMF76s$Fy7C#a%eW{t}OM(cv>1UwJ+KY_61u6PaWBYCv?T7fl+DOiq%`a z51z~I^U%ku=8k{*@L!iaK9~1A00#v7Q}@2u>&JKBKmXVJFOPV7>KBjwZQqT&sG_TF zfy0K?eX;!SWx>I}Uw1Y84_k6y`r@rvNy^xRW6ahe{g{xXqn^dSgS472L);YHOx_&S zG%PK@$@Q>~pP^qiw^VwmTRqH`G@qwc#onGUP+=V#R?9y*RLgwUtyAA%{c#wRc5{$n z=_yGlxHP`}lzt5B|9XS5x+qM;u#|pABCp_dPpeiTdaiUxVX|*tSNBWyiyTmmGs|O!7w znbvq#y&N%Ib1}qCEw;&&xl6Qd2|g^{#qjRZ*CZuhhzU=H9(;g#6E#il25} zFkZK-?7&4I*D^kn&0J+s{uPbyT0_Fx3--Ya&%0Wa#Ddidw_rm{tw=hJJNq-yT0 za&W@7ld6*~evFat37pLShjp%aP^{ww@UKQaIawCl?80blZ?VE+mA-{T@g7GiVfH}; z_Oq;=pM-drXvKT`PBE3~^ksUBuTeLuX}R329Ka+5r5P0NClyJs%POz+k4p+*v$Urq z3KPp_nfKHhiZms9%O1%|SZhI0$qQEK`z7&$m5N8TA)=t9fEUbcQuN^ki)%G=c)?c1 z((HD@LS8UO=h}}KJY@;Wxj@)Y3W3dF`mkgPMj+K(yR@d>cLW^c+aH72s!Khq)J{Lv0k_Ro8;JG`(eBP{K_pE zsdwoNe^eTkI|m2GzwW>7v&DZOF?G^ipXI!JU_1TY_5bLjr6aHXX2nNGmrLIWFj%%;@I4ZE zq%LRA9@W!FFL9n(?)vP)JH-RjN6kI`?N~wK)Og>9BN@eYjn9Pi8D6?|z=~NZv+o;o z|JZSf6O+b|z9(LnFk#YU{giu?r_P!Cz`Q&5)&Ir*AfCkd)uVkiUa&m()!UX22T%P{ zak#f+I%m4Pct!fK1ol4O>4QBqne#tNZ>)MaItvESc<0E!T8(fH#(DoRLbleMXZ^%TvkKX~NRXOkS1!(FFP|!5Wq?#n+nL#pyZ!Tu&A@qwSt7 zztO$}l*NH1EW1>jhe2K`{Suxlih}?=uFb1m8Z`!ZSvvhgo;L{Q5^$w?McV95k}oHZN6S(h*lXHMOle_Q1}4OZhG&?U8DC# z^^M+Jy?g%*^&7h)BR<-j!g;nh*>L3S#ffh8-T8GqH*)XT|H(cqhC#Pz`%HJ+wCXpv zH+}G9Z=Lbe!T8<|yWVPZLv8r{md~(~agxHUtZ!~I#knrq*Rl)tm|7KcOm4#Z!g4r_ zxI1tnOjU1?v9waJ8)4Br$*O8y{t^_+N;8;-LCU|d2iI#fF3LQ;#6{XFPrYm@mG@0r zffbjFCFKLviXqCOr5>!+tidM|tjAx6#e|$UI#R9_5;z!skpGKuv&RDa$ zIJLAj@4K1Rf&OGB&b^nhV)=85G|$`8NUzOo>YRoZ(=0<8dVj#JlYE!e zy(;u~=AozE8=^3WqK(!_{s+ng8@r2SQ$WR=h6I#8QHUE5(ncYj|6(*=7{V0Dk$uA> z2=7IBOw1I&NshL+aSWd_m<33agplkCY3g|cI6dIL2HZ!$X)R$d=hz)4Rc@My%Z0FSZ59|w-98?CX3w|VXPZWVAqoSh=+mm_TpaI&|=Yj36> zb`HmMaWFa;*$F3Nr}A<*`V=`vq3@ITV<-DjQGO5b@rY+*A1B~0(C-3WWRLkKcG4&6 z2?S2|o(Hj$K2gso;P`CDe1;vL(Kwv+EEV*Sy^Xz|LP5`6!0q+CBFM)($iFMd-|ry* zXW(=`mIKFg3zx4F`CbA}?P3Kk)|YUZ8!u1xL~21^j`kS`oX*P*;Np3aLq|UFyMea= z$EQWUzRU&s_|JFgiRlr?j9rOL0fCo6>-WV*X zoWmXP!N5lWp9Gxvtz!R41y1#`0H^P2V!d7fPUr7=;M7hczDvM&IN(PGyv_kX2V9Hv zXMkgiPrd|j z?@yyKWP1FRgarx7`dPCUgux29n~(PGlF5^2r7V~=+pu8fgo%`lJ2G`bO45S+^fMPs z(@&kiL$f9%Pe@3aK9l4o%$zVSVZto_z+{r^A-hN?U%j1V6giv&on;jn#T~k}%-TPY zJIf@x>r7&t$&ct-K9)CDOV7&AUA15#EG5%L1$yx`Oq<0&>u?8nkZV*)rmd+3*_qRO zYQ|2=Z}A*MZ--)ZJiU=4MZNqvPnl~F&bdvFgCgTP%5l|*9MuuzC5LM}qP*yE{`5L% z9Udh%Mc9JL(`KdU(X|$k%=E-rx6p}g+Jrp#vui_z@;E)Q!}&AoC>!gfJm}+-_3_E* z^F24YVdiuLf8pp;QfBgJ*#V0j&bN6dm~Y}v@Tm48amToew%d}33HTm&i(M;OA3q^k z96&gZ%fh8u*;s0BdE{d`>1mQ-^SaHGB^#!m?UWu|O2&6tISiNtW8O$+pM6-?nc}3wAyT-JDt}|N2NUvnhvec z*+x5R>0xHXi;EY8c$aqGN^qgkvGKT@TgUoQwLf3M_iB>yOr%a7vy6*7wZ;p@IpooH)z`_5XOqG8s8xq zW&zIiMGhCwOQ#g0Y(>AtiGUz~tMdS%KpkcR9fviW)x7hem8Vm7m^W}U33N=8jnu(C zz2Nx<(99t#D58!wO;%AA2hxk4mr#QCC8vLuqj%V(ymmx>*%dSCg8?YB4M{#VG z6yJp7O2kufd@JG`ah&4VDk;7mJKmvWg!u^ZxkH`&3zF8n52_yE$QLSMpr1{M9Lmk)UHi@wBo zA>M*$H1_^zAnHTQh2PXqR|+!MfZ->%BjDbHQk*v8-ip5`*!>Peej?5|ze@@*M)ywB z0O8QDomSme^7aW42!-4YI&8r$4$kcfY)`(ocq4L>lJ0UnJ~KNsWw$eMC+*w4{B7QA z#5%N}z@DdENW(vvW~F5=UXm_GJNeA$^kPQv)ge3}F+DxAbe?KI*khXZj?lBL__)=h z(p!9{?pQtksruLX<%o$L5k)joM;__S^oK!}OJ7d*0yY+@bH5xJG*Yqr_1hJXv<5FX z^C3qe#x`#EL`d7M@JKI1j?&W@kr>5)tH20pMwHv^9vg*tNA4x1567O3?~53An0gFi z82&nJf)3lmBtH>q7oqW!s#-4SkYnH$#w;4LxlPa^K2D-;9eJc0Bv=Va_$cbIQJKU| zEXS?#NL45Yl?y5z%keMgkp?2){|%3{9_`Tt9Z9&KP#Z*`F7!RrezR*+r##X!B-A1S zXINmDuw$Ec&m*me@JyslqRwfzb=1MVxU$WN9s7p{_b@sSTcCr|$wxTrAKmjvX>9@R z5b)ffgLFCDdg759aE)ak;VFFR>skj_7n@a&V_o(^2VEayajiLQwmvox2lxnoB~hI< z*j1>vFTxuLsZH>yg`1lq;B8zGQn@hK<7^!e+}1`s(y7+--Q&9-q#uS&tjRiINQRck(ItpA$LuC|IOEtB4&6FCoN3%`jAHb{J}| z%gsy+1K%Ig>IbjOpRs3^dJ3#krW32Q8d{A4tMr0XR_SjAR_XB${88Q2gSL1(%Tyd- z#0JW=?~npW*AR_wx56nEhxKXTg^z|M7dOV=XUcpmeKdHee3XvaBHS?sixt@&v&Hy> zG^Pb%55pdToz5-w2#48&m^DW~g&5aIsGrbQMSznHQ&CP|435)vPGXb?eb0Xqzvtk0 z6@Gt+-|6`Md;I=0ev@AO+BUTv@5SbezV46WG7Qev<%f zlt%3IRL;xTX$upMryvwKq`J5n!=pqFsYo6bsHCCOX3gT3w+dxu*qWDXYp_6V#{|-6 zhxQgDd~@5Vr5$0u4^X-6eZOchmQWkU-v%#q0d6FBc%jbxY~106g2qFxQSR_UK~R*B zf|CuNPD#AVgwfRr0VN4>)v_^-G8?wCD`0IN#tc}eTVvkkvdd!A#;AqPj2=kpR2$8#t6;yuO9|3!N8;TUiEAFn_*jQb6EJlj1V?T1HQv z*a;FQI9*89)`^PAdF{Bv3;mDag+7Kcx?5go*&SYJXI|(iMcR~&JTEjCyihlvMLKr= zwJC*?53ZVcUZ{%}(31RnOC^`Crs@v(W|vDWZ71%QDSaC~r5+zDnIY@FncOY#F)>qJ zB2U{`#`~bSIYu9P!{-OJw~tbudfL(yR=V3$F11t)VA4zbxy1~VolL5D#DC*N>4UD) zhB=D(=X9Tr$}_r~H>Q^&MWl7lWOjH6O%v|$LGSQE|2z1gF~5cn`tF{mrv2$s`l^#z ztN(CDuKP~;E#tX0gUM%yjbUe$*BFcK7>sY1ddJ(*HJ2AnQ7Kln(=}s!0z$6a=$d2L z-&V;ISIUg^0vp>3-ENa>vD&r9K(lqsh0Qa!g<5NaHyRl;#hWF6YnZ5fx|DpxYSk_4QB9(sJ^wuG>osxvL1jM57TZYynO4J&sr3`?fXoE^V&K4@ZP zna(8eK@H30x5x*T+%6yVk?PKT&{{=SXFe#1qXHka-V!MAL5I8MihR(ZW|0pHjRGI^ zVr{U<2d&oI_@Hh2{sJE~a(d?LL-wBTGcSVppnjW7FMVI_!tp^1I6mm)p7@}Co%o;@ z@IepOT)g;!3;3X6{WQb}y+C}>Zwx|U6zB>Qsf zaQ~fq*C(ktbWx(zv_Up@NKmEFaQ z{(6Jgb9c2t{&B3~Qla#Ley!QXtGvU0vpS`sVbpKP@zLD+jk~r){Pq5a#=rK}wOwcZ zmuz11n%{^c9l(Bz{(SUYf@Md^>bRN%nwe_Z;C`tiC(KTNJLiLs64LU|z4HA4c}z-f zneVne^{4Wme-&h$J3e&&dwuB8`>WgHcup^4rr+Us4(^HCY2$#ReY@d!mfi-(QwzU5 z;CPxPMDO&Vf2r($FvoKp&+(l9>0PjU0LOC&$MLLa=Xf@D!SRgj!10XHYrayisILi! zW019j)D45w3%%q6_UVWks#7r{$MdPj!SQ^fJC0`{sGW%tP3A3fJey-*j9=KH?4@0C zJQ?D6R)D+IDKCvjO>j#953px z0q=u2)q%>(;h6VfNiXi(;cQ?c=aGzto(4|bxh2>sohZKvIB_|x*zGx(yMe<-ihFW_XyBO``aQL~xQXpRp|kRLmG9fo z{GY|ov@dUuj2U}jq0Kwo)`iY3Sj5{b(f@bc z%zrm86WlY7=Xemj!q4%Ha~c#hvdP6(N%12%UV->=9LLTa!f}dYtEBiJvEw1S00Mb!Eq{oB96~Td?t>I^`ZDQA^k)gzYp;#cIhcT5j&M*Eab|d#{fAU zFuW77@ir+Qft~7&cVk?=uA*MS!0;}?RxgU=F57y9r18bGTN((XPZ>f(U0TF8?Fm6N zkm6U)3q|teLV-(p`)W9{g22f9-%~K{>%=Y>o>=(Dkj^wor@~YoC)~>pvf=|%4=P38 zrI^;)N;#9-?1zIok=JI z4Z4kjjuhw+#v~e&xy_CvxP<6Sj=alcB-jASCg`x=s7&G}mZK})WeaprhG`1EF7r_i zDi>5bmZMAFC2{XDj5E1{4l!^0P$-9O?Hb3r+<=aLNMMEz`^`yRy7b?vf$()C-XfIa zDb!_vy)yi^Yg4DZOEvBdbdM^dj%BxXEJyde%LM3n6lp)~R!8@|%WCML^ALlMMR}KD zaYQr`ZFc9Sd){RYbX4Geng|`F%h}cw@6w2CECUJ8;iF^MI=bgwHb4hmAIZ4Z95!2B z2I2r8AxXZ@8iZR=Z$E_FMq^Hj`rz}2%}#*&9PQNoy@e3LZEeK69CnHEAl_w-jdwZ7 zr)%EjgS&NCw}5x4=6IKXzOJfRnFtnUHP65NGnkTv0{^m*)1teY-<#uM%ASNzP`8W# zj*EFw114s5mFBWx!gXndJuCCQi;RaoD^n-1GNU@NGAohS3W1fW;qr9!^;s&gG8vmc zQS$03dIlx`qV23q-PJFha5ZCuPA4|%Mf(du0O`78A$KcW%~{;7fV&grVDXz=eOlV` z^qid0SVvF%DR}%O8OC0QX_sLHub-R@7VB?U#4NCrLiuQnoPnJR3DviF7t)30iiC6V|H?!&lyqLTcLgOYesOV!U^fq?r4YeWMh1GK{ZyA7dSzkNDf*g}#o#;|?$M4lneMzff>EzgK%*)j8)?-rzkG@`{b*B)PsSLv?nsn+tNicBz2&o*QxVqZb?kEg9W$ga zkQwD2e&`*4q5mcRLa+J$8h@dpFTHOb>0MJl;D#(NW2;1+x9751XOedCUwJHkqVlzN z`etzun3Rd3HeaHKq|AJ?`(Yjbv;y~?p`PkWPdi_thXUEWASQvHeTmR1-4LhCAIB7i za&e=p?_GWTRf9Iz{Bky=#KtETq_O-{#0p*O%nh~KKJ7%z%jpC1XC&dRycr728)V)R zOtvSuMvVm$)bzP-k+veyN5em+&kr`YD*sVB{)$)CN_i>cdav6MPOLO|c7}FaV!N-; z`(Hd|G^`2JG02uEtzV|Bsny!~^t|$Vs?{`bqmj!Ll-8YP0~NB#qEAnFI30S_qi|C@ z%QOG}O&Zlek>v^c>Dv*pnmJ;lF&q0f)#qN?)3rqpeT$Vfpfp zVQ23C+E~6OOd}TT-9?|(>UvK$Gde0LJhvWu(W)OL7ObMxvTj=S8qiX&ujdNPO3WnJ zEUEqc1J}B#?aoF=zt0y~bT)eK>COFBaT{#TMynLoXFL?Bktk4KSnJ}RFiq4@W6IxD zS>5~6fU(kEliG@|ZHU%y4R1?);L?liGT$fSs}sVSR5NS)bZ{j4Y6g2)%Dq0}3Izsg zkcZ|0Myg}@z5{k??smOD7Tr|Yo}UuJ?(=A3``WQfHK8XStx)`-gG18856faYIV4?# z2Q4@xJq+#6_^0qh3jV3LZ<47jzLs2)8gk?|3Tm$?*M>mOCF$6PKsHBvDnzlcG$hB| zSZnw&sHL{3Q4-~v5M)#(ZL7`a1wk0~wF##1f}o%pd5v&# zT3f&iE@@L}ctOxfGk8Icg34zd*rXS-e$40^%nLS3g3Krl6&GoWg`c3HmIy!LsI*l0 z3HPOC?Xu;KR0vd-FqL<%v(}2?EXXG^bY;B`m=&&pBb6=NcK+bGw-nZ z&22UJZ8Z)xRn#e&f!RqjPaf1~EbisHeNbfJmg0A_SB72|-yTYTS#(NV(RDKG>j8QRj0+afDa>{7Y&Q6<^@RB$4>4VB;hT8r6-TFQ8%tyW6 zNJuZ-epiMva>?Bd>&MPXOp4j|s z`nvZAi1gd=V{vf-6PEg{h1v9hcf+0+4sRdWS8{Tv&$GR!MjVnK4~;EI2!GJJXUx?1 zw_m!rn0%N1rgg>Kk*^h`KmWJ+lZO0{If`^kmYpb%7-IE) zw2#|D>BFNWg>wor6j_?k_>B#3m&8a;Z1YG+O!BF%Hq2Z2XwEAd&oN`y#e8~xGyI)y z>TOg$Xb$}St-Scxq>g2i8HvKT>Pw#xNbT2rz&rKitNEz?9bW8B2kF06C4vhV6 zZ^K;zxb%~$o*NHez53L&_`q`)E@l)bteZNh&+zM82NX)?ls7l4UpTShquynwd^Z|= zo}1ZwM#>4F+0TF6=f3-1_{1MCweRp<@9j<`*}t1=iaOjp6DX(N1^ z#=C+5+aJKw+Po(Bid*(+`X9}ArEg9SK26^he3~w%Zyw~+v_toich{6IQHUE5(ncZmCk>91 zEPZ39Z)jg4oP=qR%_dq-V zIK6WxdBQgUN5I?#e4v1np0|PDg?KXXa69}ga4KUi@F8}%3(83HFFVLb2sjRLJYC9{ zc%6%YlO5O~?DQR(!|_q%_rQsVsl!h7;Bb5d`73bZug=0wJVjA{G|~`XF%vtb6Xj-w92X249{wT<& zI>>)4;Ey}tmx0r_t`gvszgT`bt|!8`I^cl3AjB!_bCDY$^m~~z<+VT-xBaXIH&e{J{0f>2fPJ%1oBM)j;BalyQwgk z3`IN}I2{+;b0lyo_ZHyd_(Oc&mB6Wgyk(C=x44O89EBt&ZX%usobnep5w8b+mk1&h zaRu_E^DJ&6e!KD&(BrH;w~OCyzPBs?KCbg{v9buo`uhDp_TB}qiKBZM-c3RhLI??> z1i82YL_~yusDMy6fDsfmUh9QQf}r6MAp$Dc*5<-Zs}}FnS{tlYY_*MdT5X#EwW#QW zm!}U}+k*F7TSSYfDBqdQg^1erdB6Ynz5n<9{TH%3bN0-cGiT1soH@HQ3+)QkhxM?+ z(e-8JdR4xgfX>V0{3`f=O6R`{|5fGvucH5-miJZs#DVUMtd#;+YrXvMg1?H-SHZ_Z zdwyAad>7#GPaS9-aVGRXU;{;t0LXJ|T3-1wM>p1glU2ms@0o3)BLN?=>pV*bL||4HkOy9Hq_$*Wcy_rUDA@X4CoeueJ;?oY_RjHj?6)-|(s zuaCdtHSiuq?orKQJw6|6S=7|y^RbqX&JBB>7Yl9=0a zAz|jP^Y#RXn?KL{0@(b0-WR~;PcOd!wi7RP@1-B5wY|J-E$ORYg6~nj=axDBoz=_T z>21qy&7ePhVeUU(!)%w0^;Pm0S1{Wl<=I}^d&%l$dpx_&>CZ8{`=tM`mN<8_^^yh7 z-8cUuIX}0i`R^=qw#&yV=oeNl+u`JO%lS{y?8W?Nh;~x`({&-;Ec94t`hV*eYc0zV zd-jnQ@XK})`HK(C+WH9lA-#t%|7!VjcP#)ByDI*(H7)jOx@-I8#j`GKeQELjkN>Kz ztp<8X{qL=n?v~^84aK_X>*W%)e*4s>N7P7ZTdGUF760GtYql>hNZ61pbGiQ$GvgJc zUeF|~sqqT@VLjnibE7BRYH(z|!0O+yH!Q?@SOB)F`cJ=l8})K}A>raz-LQVWx(5d# z;o+}J(OoBh!#2sX*V~tVgV5GMEcrcWoLCx-{VJU-_>9v3yEWKo()R!NI&4_a{3Uun z{xUpvb%iSj$9ADO9F-{E0qcm-JM|CXekTCox(mh8eH6b5_tAPL@XzkO3zw^KpNhkM z6u$&N@J}u{0eE)-PY8I806PYFC=N#@ir2t>w8m>O-wkoS9X}|pg!_p9BDkLg@ie$^Ef0#%hWn`eC2&6* z;xpmCRURll%|ajDp9}FxcJxtvJp2%!F@Sd!=)hWZ>ifG9fQRC6P~YDTh5(Wa_)4jA z2LPUR9k;dI)^*&?kj@DAy&w&^fp(!d9F-{U4?i|6RX}0zCsE(m1-~EleO+`#zG!qG ze$;(%|54xBg$o9*SQMqMT)0An!b4Yd16|R5bcK4S=-jnjuUf9na0OQuqXDkK8>8NG zt+QN>mg`Z=wc2vs4p(rQG4yan^tZs33D0WF309Rnv|9H@?zq8!29r>MxxS zJp}ejx7=T^KYx+?zccZ+@(hgr$=dVhXg~Kg-oIUYl$5AdPyc1B$Gf>A>?Z&(Sq^T8 z*{uiaE+r1#>b~ z`I$M{lQVJ`XXJJ-F+ctI*Jsd`pni^O&(M!z1@Jr>BP{J3gGZG?4ua1UK!ETDcc z_E5*)`L1sf&zv6hAyv@1Jw^crrlttM$zo-_a(y{U9|(9tH}g8cg3qY2%9@AhI23*dNcA zWzJlCB4(qw8`}tSXolz%cwmmw@pqfwIq1f))h)HoJvU=+UQZgR3`i#<;3Wb?qZMet zaD$GX@_6N1`Q1PRy%RtJ4g2HyvY6MG=Va&QBb=UmGyn}Fz~vS`*n7;+gAuOvu+xv1 zu9aWehq6~O!poY%e0>=oS&FiB+wAU zo%28g(R$gDn)>H!jF$8+tD9FW`Za;GoBExcR~JA zxJK*+-GI)|3Boe?p#y!}82wP$(6e4-d%fyt0y;12UM=hG9o8CpOUd?!q@H8L+@V@Bk0KDB4p3n~O<1QC6`7AF8wX{6D{{Y zqi9K#H9)EBVQvuYqfe}1Ndls{4_+kMd;bIP;N5Z!-1lT-9hK4VsNJ*-C* z_|v3pdFl=8P7hUvENRYt8sihG7W6GwjO3iuHZ80G=^dUeW!`h6HFjX?q_$-0USUE( zf}7M?iTlCCLs`>N1|3CH2gc{i$Ha{d!*A1^0+o;kp9#E`Kch)q_e1?tDGL%%3Q5}q z%f1R-57p1kL;9q)2O^YLcRgan&U-@O2<`pA{ub5d{Ab5tX9?y#FU~>vu?~j%4<(_z zr9^v1nB+PG<~vJDTiYas8gylfFyF3+lb_KII_VK;8>x*6Z4Ar=rP7VUTEEd~3}pLd zxfOA@xZa^A440xsy6Co7#ObfeU93#{syqs(|Q5tBULiCJgkhHyy z(+I@9yKf=1ANOa7hMSFs3(z|gbgBX>$ls{4})xMOUKcxY+g$wOVx&0~P zy3$5t%Tv$*j8sBRfb>t@!f~>FnF>kRT3%GzCgZA5bMB74?w*Ta8zn(Oymr&Xg)cOtp;6PxSz3Dpwq>-U>Z8qiuZ z(OxbGI#EgY+Gy+s8b~fDD5+ZO)GU{+kRD-gwqbARwAbO)oj*xyQ7^*qzb;b#0B!f6 za*Pu6MI5N?n=mU5kEY$GJE7j9u+!RepguSk=wU%4A8y1Z*h}@{TX;qs|M(=aeV@$D z55X&EAW0=bUyH`Q(@$_|=3cU$GbvDtxJF#o0X3A$_yqH3H0x(1C{gUoCxo>1Yr{d> z7h2F5*}~okAMYzg{c_jCPoFTPaxYq7$T_ktg32G{5QivQ<_kE1tJI`8LiA_ zvfY0ol3roL#0~H98K#UXXNa;qvM?K*v)SMivUK{#(zmi?3GFTN~d?Q z$Kugs2V?A`GyPk!#Oiyvi}M+5u(7RL4JG@yO*vh~LwhggpT#?}v)CuM*&Qv2SkB@2x>i;o=s+m|@ z%E-s&njxr~>3S%B{7EyEih=0umR8@RyKoy(JyhSLxeQf`q(_vVjYvKtALM)y*gRAj zmid(u8|?QZrYwaV9g;~BuBZs=QX)(btYZdDAE`Bs&p=E<7UJye;@>O!r-g z#$pU7EP8zW5t7|gOHXf>-M5brjiWXihk?dIIjU_K&)ZZAxZ-46P#R?o(h8x+tNs?3 z>I}3s1S(OWRm(qkM5nmfWTUk95eK*`0WCJ$GAkZA_(SjCxaT@**{e|B+r|)^OXr}J z&mi|>_vAF#&|36A=Cfha==8{CZ!qwJOox0^jI#tP<i`-stu!^j~F z>v}l+kz&Rg7)h|eKN@kU^{$5@kK{8X%A~!C?b9r@&3%;7wdde{0B)k-0nfoX z07o+_CR|Z(OM`3I!>$gpZ8L>OwzWRDqZ!g2dR5oM-#VNPtzWAT=15l>65GBhL>2^; z#qm^!m+?^oO?j$AXuJTUDXq01jlS03x3PoWd=Bi6S!k9R;_vIU1{a;W<+u*>BQsBR zu#M?rb~(KYq}Blae+So~{<;GETJ}de_%V7O$UlPoaF#vIvN9BTXg9Ll%CcNuC{bGV=0? zagzAN)bSIhBuQt$C3W(s@d=|QO(uZjeC6ND8`ayNunCOyWVI)ARB;g3s91joKRYKs zb8g|EC9?@PgHYvD6`rcd2e(qU%;ta=yhONAYDzsqr-HEaLUR{oXJ_PEE_tEhAz{OY zhKNI#E#RkyPoR2O#n@au;M~o7>3(*f~)# zF9WGV8noegxjBnKvCVu(6aCXMb0e5yuBItT!IOf=cQ@wL{G3$OVL)DHA=~qe9KJwd zM0YW)=z#-?JY~+JtaKtRgIJ`3rx?&wUtl*gn^?Rc)!Hrt2Ld|kdWp9N6)sSEPvp-fO}`&_IN%FA4uLFCLO`e$V=vcHdd8tA4$yHr_)lz4N@%G6zZ z77`ZPsDG;mzbJa1;E5t|pm;FE`dxoTQ9a} zx6d_~$<)YzaFCxK`I*rV9q75l%MSFs1Nnl>pwCCo3{bi%2!90OMZgOh8+JfA6kO2< zA-osD>mZEAh;JeM2M|DcpmgY2&{=@P78;aq8;v1=O5MwbGQ0^tbXegijQDzB;Vlx< zp<@bM$#5|#j*gf;GII9fu<+Sr*f1=K+Wits3Ja(1kdYWbQ7|bI?uT2q!<_x5Dr-)z zB2SrW(-X@um}(hEW0T;RJ#zNqH&b&|3K%}XQ*Z8D7oZU@H9t0MR)l!Y8*jgG9|)vV zx5Fdgc2eBilpSK``uQ@0D5yFl;i`roB?RQ~hr&~Se?YL`9}|P;8>lYg{)7E7uYsQY zt^G0mN73TeI>q@5!rda-!m*t2wPlIrZbZDa>=Vo*JdTmXD_`SZCzDLntZdO;Tfs<@ zGA9b**(yBz^86v71FiSNE3j3<(k11r!obpnde-9l(qZMLOR88)h|*l5bQn>ZZz#=& zuu@l8#wyg84imEql)A-i)>4vX^s3Q#Ux!zSv|eWwJ~a}rrb@4iYM&aBcT=VFF_Bjj z+{MMEDtT#PAWJPT&8;XcRMHE|OLK*#`4vEuo~JGaQn^?IAS--M;KZdC?~6vSt0J$9 zKnnBuS>%05<8wmdb5ZZrB=Ww9>sf_WrMVb$Nde-dkX^bsuymNZbV(v>iM}+qymVL~ zYjI-fVkLb^0c(kp4tG^zmReQ1M5)VHvGOWj&VP;f&y~*SD}65FK8Sy+Aa9o4gt-y{=X|LtYO+>@gU7DVtRoS(*#= zB4ia*v6{V301pzMvkIsbD2UJLO0S!h&XB4`<8xc$b3);x9!iuJs#(LP)0YI6E>WSt zQnGZZlC=;xDPZLWBFLLi%N2Ars6hn?&{9*wl%*;?E5Ez4ZbOv;GcDc?8dTV(7H`PK zR?=ZYEvza%Xc9gHHG2oUh?NiH7h%DksvTyX@<+~=&x`}7OyR|ZX3B`jS;HAB>7gsi0nETFcq zij@Zy4J`=rY6L}X#R$;Dt1Vt9pmOD)$v*15K*U2~V(CJA#e-DP8&shVq!9Z-?R6dZ zX_7l%s`UEVQOmfZJPi}zKe-d;B~-ffl6&~R>>PrhS5Frih7 zP}fJbap2s`ruI|=|C6o>yD9OxUFoGZp?YtS_|#N-g9MseyrI6Ju|w-Vq47Rj3EiMK z2=JoX`-I4=!Q3$t-j_^X*I&;6|MXEWZxMgdN1f-kAq}Dvc&{+t?}SU6jCX}}xm)hC zfN=R;=JFfKyGHUBki1)Rms=42zkj>l>iEd&+L!~HC}X_mf%wQqdNgL;d6xfMD{q0= z<(7)~n~Zn0k@;B0Yis4*Z)9G_ToyF)T1c0hSVerKp*Chcovf}MaR864kB>CcW47x? zY`E7-iOWJqZ;Tj228;7I|D6ATfAO+}*VMUL^th+edL+E)KwMfA;LA}K<` z-sq_H8^;g$N1SXNdxv99`Z)fM`LwW!YlliIwma4ojS~hqeLy5%V9ePUzTirLaPr~> z9}ZVk5c6xq6Jg4OEho%-<%Ihta)|U|#ybD)MR2-OR9Wukn!I+UQ<48T{!z!m$nLF^ z-LV$p7#rh=N2?pv;e3KrbILVQG;wt|%Dl2$DrN-SB5>C&{l^LVCqL^NQkNfD`z>+y z!2~6#Ch@_9(~ZQ*36AT!My|Qv*~^v9PsCWmlWY(t-*H_~`%jGTm@ z8CiLmhSS)5f2`z#?E|+J9q(GhDSPIyX2&~mbQ;4Wu{PpQW@4uLO}M|Gg2`WX)Po#0DIII6UypD1 z+r;F*cR)zK)~3MlPAaw4kq{H}>0J^vW$F)O>0_a{4pbb3` z(4Q&$Ac}UgubKZ;P8Eoi?}p>}ipgvSgH7n8@)&wqSv2D|L5z54uC}hT12)c%kz)L< zUcz#metON0GS`5vu1_We$0i6!*jCmvlFhEK%q!(>iD5sutI_Fs_bOj23|Bw%KZbGE z_opjmZCrhvxys*Je5ap4+snDD2uM+NYs8}0ow2-i?0MK%6ZA9kUm9`%?dmQr zgHI5$<>AdSR6*alffFk_KDt%LmUnpk!}s%d;%Kyq5x48e&AwwQI)5p|%6y;Ai}s}n zmz8WTbE?>J^P_S#=CC1%PMfsj=6Tp#d>3cUaaY>Z1D`V7tELLV1^U+)L2lT0UyXl( zf+@2E$ZN@nL5|E6p;>|>T(F6CUCE;pu-eebQ&{rk2NM!W*}GXAaD30KqR-gu#5JGC z0l{Y4y&wlDHZY&+AW>sT1pE|2UJQBRG}n#(^v~B(!e8QpZ7b_~e{~sF($CDUTG)FK zjW#ELHBf{uw2);Lx=@np>U<{TZ=o;cJ zz`3X;p4_}<$kJ)>eq!LvfqZgEz$$FqAewgGls#NFA<)k+Cb8w}{wIb>vBpD_RJsIA z)BpA~Xutf%!}+9YEt@n#&Ey+vw~{HL)5CymFb-d+}PByCX?R)u@#Js*|V{Ow*-h)W}igaI8@Tu%6YwF_&f;76W31)$A zApxqB1JW^CT-4~+4Wh{dXb0MAEP9i=e4gpqN7anW@AG#)^264Yy%QJzO+34*KN`D& zEnW>n=?JAxrDhd?{|THxFm*Q4hpXXV=lm9!b&b5GVAWzSOU0~QJu8o3ffc!!WSOH7 zSRi-l5nV{I3MkB_d{(ZSwSdoCic$ED%-?`WBXd8T4QY>yQ;A}kzE~!wi#v)_3s?(f zr3*V8&|H~a+IvB()3+q2l60yxGQVwg`kmn27W2LpyZnK~*nA7U6PD#rwm^ zYav{+nt8vsI$f24m5tCI5H7bcmqDkS-IrZq9k-LpGf8)}G;Zj6tDc>_!%c9%h+5=CxGky{g# zRN>X2@PXMga%?C@AtL2*fsJv22B2IsqD&VJ8{n^`k0`2*Y0$;2*Ma%(Ssx#@B|g>w zvj@5-%t$(EVB<%Y*M>IGVQLa>tmQ;N)#!^S869TIb*UZ2OZcos!qQYBYcadDu!6M& z`4?Hkgr$Yxu>%)lWNE6rG@o)bBB$nb$x|B-xDfa`s*9|ujqI$6gb4>^u{#oII?N1o zNYOhC>(+r{pb6g7rS+_WKO=qyDaLj_=K!CR1=`ZeyR7G3X?3~+`XF|>Z{*zqH83(k zRc^>!?!p|%$b|XXw=hZN^RBi!!R!jAN3Di!3f5vn>0*@*WeToVq<*YVSVe3{-+1W? zwy3WtdHmFtsUL2-c7M~+-xhDW7FzhzuOTOIguXv$?q^@hzj!k1n`Ph4zW?tBZ)|$+ zWN2VspvyncoN5)mQTN_S)zZhmZrymTecz>j1&}LBv4Cdz3Z|OBJ%bg&=_TZ*t?k|f zzfX9aepNb{cj&RfV)AzttE{<~QO1B6EI)|A5)#l}`r*!6E;BrdMyEXK>JzwYK-~M= zb69nrz58lDvMMznJptW77wd3SWKFYV5a0AMMw}?fyo48@HL+@|{NVu&{Dbu3`k!=RPD;|^l=S4Rt7E-HP11099)ZY@ zAl{B96@eS9#S~7LDSVG6Jyy@^>&BdF6T*+o z-T`r2KnRSSjXqp`ciq-sjf^X^)otKX)n&w88*s;G0e6)j6?1Ao?dGm+iO-L5^*3jIU|K~B|1JML$tlWv{2GSWfj6pJfv3Cb zX~PZY<%V_L_0{5;TrIvd#x>Z=^JC}WH-xJGwl8Cpb69;sxnHh@-8{{bVXvg0bZ5>^ z(mGfqlm5LX!%4TNyLQs98EK`JudkKkY9xmye0iSyUX6ZGlEExG{zolylRGvX_)YzD zw1HGa+NsYc-qWv%)nl#fT*|JO^s4K>X9UsLC6Hpv+&a|W{LL))Q0@_1GkV8c{sSX7 zY0xj;vm=Z8CEelG-=OdDF3Ih#z@mpH+)1~)yX8E7qPFiS8gH|bMzYcBCIWFig1G3i z`W<0I|L)rRjaBNy-PT=uiJf#YdwEOBTBuu;1PZEGt*ldrbnD0@S>$r$k<)u~9XXfQG3>YgcjVW?{GtB1oe#al+Y&n&nOe^{f*V z78ax@&J9W~z!^w=2?Q|m2Tmv+6RM_S7G}Qul(+}XKunELuy}t}@2?I%$ISUJwAb99 zV`lEOR+4Vd%%n@44N43rfq;dX@Ha%!&IA>+FmrfN)~@H6Nm}MGZ`gCpXbh_Fm>8FZ z7(qw;cF#Ul=bmHcz%lJq&*zwln_uE9 zVSDQUYT@?~^5$~|zx9j5=-B59e(Ugyrc!Qi;w`J^nUm0x(P+;soE?mLtG0+78)LQy)hXPo85q zvv=vXkOV_<6vs9qA~trkrh!&~*d+Uz^7 z;0T^mo6M-`!CI^qS_{Rqx{j%-xe9G|1_31ILVJL3vG{uklFL^*28=$&i0><=$rwd) zhMpM7sbp|IVRN=+o!D7*Vz(E4#b-xX>?z`W8oA;V^_VcdcuXZmKT%1JtUApmMQ#ZS zx5P@fWD(O%MT%H%qh`2`muw&f>m>u-;-lPVw)B>hl`OYIBrebh)Rny0Ci-x4G3~x0^O=^T!SS@=)%S2ACimHs^Xo0ASGrY3{&cu=HgyzcJ?uI zsMbZ6SrB>G<#A@j=qeq@jCi-17h)-jE~egs=+Z8aHzUf}4q+BqP82#sSb~!y9fnzg zGpmYaDCjsVdETL>&a8tD%%-KixQ0D9gmNd$xG{PCg1$kshP{5MUrg4>^-asl_CDpy zKPzjPR-@ii#F*tMI^;S&tN-q%F$H@!i02HdJT|Rn)gA^BEvAu3rd6-jo3s z#WeW`B`YHJmv5chIqz)1v`Za#eS#qBXZcQj63V!l$|5pY z6H$Ml&TS%NP2-*!J2&0a!*^vSlwQbuyJG9IBa-W?&2I#(bMz0-jUK>RzH&?BsyJW2 zo%!3#>+6%=7zp5*^ANb{Lj+!21>oav1Oa&IP6Te=gTMv55%%ms0N#89fp328>-J_s zT^#1R_j?jMd6~UE?%S3h$BjRCE@yb)uW(T;p4o55&R??2qqfZ5bo}urKV?21I&QQ} zZPp=i%_#CB*+?6pr72GM)d_nX~S=K73h936hj@_QoGi=JGoS?*ule z%k_-t3$hX2MNSW|TG?+?%Yz3$I&a zrRP@VJUW2nD;Yjx=8k_~`|ZG!l=UZn$^CGf@GRmTIevGamw)I-=kk`$m>p1BR(2haz8kRr zBvOw}o7Vj{_x;t&)-B4}`&G=2I}MqOXM8{Y$jQ@7XQgbsQ-AHz^sT5O53gPsXjcOd zj|T75ZEgwc8xeZsI8pd`<&Iu!2dgs{G6v`O-^V*J3J-Rbj9H9V9bb+<5~ZyOJWw27 z+SckdcyR46xl7#>#vdAT;lNe!&n1(QN5>Ld9T#r?=kj2pFMGubtyRg>L(YA#cdT~*-y@0-1KbYLwSemR)?7<-xR;)_{BEaqK|8{!;d6) zH;4x@N4Y_3mRR-i;ihNL4%OZt8sxC~<6jmH^Y9PR-B#sR%nn%R_J{7%H)oe3_Mk?s zT3(lt-?Vkv$wh?ln<7@_W|OFGRvqtM*+1HDb@D!{yL{mF%{$9hY>aze6_m3VuRHhK zkh0ku51;!@j2g?uYmZ{y3PBAqGG_Ki*M9%%1MaquuU!+*U+PMCjf9R+FbHV|7pSF-8^^`X-i*6~C zwzvz|tq}%$y;dZg=)1~ z`@W^W&nW9$lY2Y?{?K>(Z}1?tPy#{L$Fo_Z|+vSpDM! z&Xas5eN_>&bi!8S+P>W2vwgkd3SGx880H(IDF~>`e0Kbi2RZ5Hdz&TC3$41YJ0xh=gyrJK(eH|#+wa}E@q0g``YdDo$J0(-9I9;Em-+6Y zJ)YGIFCBf`X~61~s64u3pNIm!BCgoUW75Zag&L9&V-Dq*fKM}#n1uE}-~X!pzxVrJ z;8eoWd=iQHGOkCIhkyAR@>qSn(pScI3*RdA5RI-cpSZgUHbJv}|LbHgjY%b#hWo?* z_0*c6%*7dl7Ov?UlJleX2kmcs6V5LQ7M&6P+N=0redZ8ZHA*5zxFIqrFWJ&Qv za>n9}EQv~$l|i7LQ3%+L2^ES66NkVb5ePflWX~HMCKiiB!ootR?|>a=+uf%SYJ5t(TPAOF*=dxBts`TI;qe}jZWq0q(>)1-yz&-s#D_Wv|+V! z=Q?iuH2Dzj#!3K;27u@Sw{~O75XK3vkt-QeYkYtYuQhbQsg?DP@sv1b8JrT}BqO&O zA4!JCiTs>V{x22XLjIQl^C;<4~eD(s)hu^sj{(H z>&}_W=gbqwCp^M$u>R4^n%~UIYG!@d?|`OXwWi-u6IXDJb7@c+9<0ZMw@ZSJlE6Ai zV7;c_N)uPt50!*)qG;}*xRN~rh}`Lr@xwqYjbNJpm1^c+{97>*zFg9$uU_M+$NS#Y z_~bXcQ{ z((9rPx)DZQOk(k>Q=gyeziM~Gs_gZo3$_b<{AkY{Cr&QB(yV4Jovx~ghj+Rn4e?Qp zwc6`m$10uSxlxVD`?|>crU<=PiJjq_zvIPfFh7KXPt3>a;js~VJcJw(3If(mK%f_6 zCR%1feFvvV&s|Zer*pOo>0^pRnwGJN$$r@O6YWL1UzgK=?B#T50FgBzv1zN`5UWtU zNvmxyD*4rs_tj7uDOfP_6Tx=^tVTKLjx&5$?h{Q%U0_4PQRd}dAB%gLdX-IBS(D7r z0?A(0x@poX}lv>QyRFXp+|%%Sb-=w0699 zh%lQyhQXcd!4wI@hyXrAcSzrh!(S=T&7n!e)88HOzK(EKio{ax3P*;idGK9-;V@!z z4yK&PUMZma0Z#Rr9L`+F@Z7-Fu?yML(qEHuS3-fY(BJ$CT}z36lu^F1lF$n1X@IMA zdaV*O3Bw{$Mh83A#j=~#ffSR%Gdh9J7f>3VUURJXwdEJrAMz6q6=LC@v^i$BvlE<; z$~O{z`y}GTk0aabMAd@69$}GzdBTFT{d7$$Y-_>87C@@i3sKwOcLST3(?t^is6K$|*E!gpBP%|#vW zJWFKau%HUQM4QEVzRg@JnP9`$*vwv`hR%{W%35dh#){lL2t z@mTf5n}jf*<@Wv7NJjo;CqE_&2pQeK3Ga*(U*b18!siZS#*5Qb$)I-g?+v<4G}1od zS@m%ESxzOt!Bw6g&1U{VF{asi$->xMX*`Ot?-^P-(f3Lk7c{mNvBZ~HS#tPlx6bI~ zKf=aR+2E=;U`cS75TGQs~tSq@gst8^)-0#y?e?f@}R9 z{Fo>cL!WzbF0`n|-}oR7DF9S{--?|~!T7K=8EP~;TSC5pBJJitk)})$r;(^g3o1ix zTpId3UF(8J^EfoMG)6mVISD0+-W$4Y5^F!>0_h?es|^B{|1@vOLC%5ONSgRyoW8=5i4j?CVC1b>p8RsXBy4>KiL=}iMKlhLbDj(f zahpS~avd|x6@0%ew=`10bnA%Q6}mo@{;z=~?khfT;_Okg>c_ryUHy=fvfL5 zCo^=SYk-Jn4&HMi&RC$8tT&r2!7x{U+=5WaoX@9%5~tCycdytyZhA6ju#0ohkl(mK zm@IOum!mMjqTmrt;`+Eiy{SafCr-qJv1S!ZK-kLOZ75bzadr9bvH-H8Lr1 zm5ed!(6P!fYuql-i(=F|r{Ldwh`acT6hd+Mm?%%+{(gTUGpPJ?8C|haO|VRaczWca zINx%CM~e=IIw4a&$iK+reSy$p7@H`0?bE1omRU+ej$pf3zh`V@(HOe?*LR9{{r8pB?Hk!h-CNLE|AqxH-AT*h!V^b5Jr zFRV=5%$O_dtXIX01E9YX3-MKBKMFHNdbBp zbl;<(b@N@`)-vG+>dAfH$qmTluM`GSITWqvdo}KZt2O=PR!sdq8|Joc0a<*mCw~F7 zJm~RLAg8-wLG#Zt7ld1Skb6O&HZ%7#Tr@Q`dwaWTw$wX@LZ{s5NeFA5<1naN$6i^* z35o%WX=qTY^-45eJ^67c=Q~^*c8Px#jV0o-V2<3#b(Nvbtt>xg66))GjDDGYfUPFUo7mObdY<1FKp;W+3A{Ff=WZ@kLwEZeU}f9+_lJ-jJ@d4XN>Rb zV|;zA88-EYd*%!;eK#!~OgS@a>P<69$JvtQh1I2IQ%LSoVA@bfE;m<58LMDdu|RhP z>=n67;hEmEpakow9By9gGo6+)eVfl(3ubAd$%^^j(pwu+*d@;FH_Dd74k(c!AcS^< zd+Henl}DJEfY^up_m?#l&(O}>sBYqvMiHAf>XFq)U~un#^QQO9mXc(d+fAQ7tM{nb zXGaADlHw9i?IJLgm;=F<+@awx4ijm<3o9ZH#nq_Xx2W8~uG&*hHfOxiTufuk8RX?w z*wUNB=SH)@C?riF#&lX3+mu8LT3!rRVuhT~ot}_NQ-B!VL5x*Zay@NEz@rt1;^NM_ zFLZ?bLaKTlSuGcUwN3EVy`RwVT4%{9(CT$=D=k)7!?^MFpbV~{0adJ1_4HY4?yTlI zi+0pDG=SPr+A;dn1E*MqA9D<)f5Rucc3t0424&R@?TAQ+^A*GcOVZqc7d2Gcr4e{UaVlv<+mjVH1)#ljA;hm~*>lmLI z-{+}#tZWtRcnr43tgFc$4X!cU9(UHxY6`ECsGVjp;VFasB*wx+vOF#$ zb3o^fhSqu=2FPzCWJPb0BP2Q?R=Q--G=GjsfiJ{HAT?82wDXjhEI zzk`mlsK9!m-41{S_G9l8> z7Kz6bFy5YY19LlI5|LlNcg9tj7xks_RVp&?sjM%LTV zf!|$TEAKZ)3_1pREfx7mczBq3P5UgS5sV}{Wf<{u6(`lgH^FE_Rvn2fxgAKT(~%K2 z*k&G4_R(-kmI;)7L^sPaal^06`#=yoAHqK7VOM4}oyqos@d!BAyLSlqM+o5*8RD*! znM2w9#AFy9Q}t{C<7*I584Jb{HjIUoXy)(rEpIN5LuNAR(`YH5Lm6W~gFcj+LEMn| zm}d~%M-R1>aH6j%*d&%|n#Rl79*jER3DuchSzFkk>uO}6%4k!Y!efvHNR@S}9$}jG zB?PWkePKd4-8k(B&m_ZBe*7gVR<(W4?%~my$QO_v#5gvPu^6U|aeQul5u34{_LI7$ zL_WMuzEQ-djbU@+dZTG9y3LWY*;CPsG=n1%i+hb?^Vl&)ovhd>3={7FLxtw5b*dhG z!AT2_0Hhe-;=cHhu>^NYYl)y7H{0{*?G|%cY87Dpio(D=Hc<6On*z6}LqT9z9%aMM zu(x5^5*#enTW-6^Imy?+IdcTv8jAbZ;1e_KAUABl2Nw(^B~=$GF%7$4VUB<23hmr(G@^ zU2;t>`HETtyp@d_zQvqvNFdDqna#v&VPNBe;R{Zi=M3N1`Aq^k9R|h5<-;DW(w`={ z;0_SGgjZznwetC1uFsm^v)p%#G=Y!7A5dlQ2^~-9N1l-P4GRRTKv$p^C@jN$y!62w z+rSEs=IMNi?o+PWAE1s^7LBY57g`eO1#>KkYNef5Y>8A11>IFaAH=hc_u2m7@Sw)s z`ZfHCV3Vh5bhe?mQ6QL+m~QFhYm$$tce(D;ebAryt&m>K#HXp5(UnwaH?H*2)w2w$?a(YIC}+@}?BGI*hmnZ{2|XG>5XZrmk5x^(MrSyQ_>f zHOy+dO)nn5TAhr8r6i{e%YqH*UhU~#(?#Cej5xM2oz=3&IsE)R9l-zyKg*X(o?_4jB-a%Rvcmz`SCUA z+`R6)sdDie37BC>@p1$q3#}6kL1=+5Of<|+m3wD-dEmct&L?U;;JKzY_ zIir4TR>`1pu#P+!M+_Nq$~wwH{*M+Oay(q6oF%bn{LynXgR?wlB4Yv*c2EY%?`=k$FIPs{m-qDUUw$?_%TPjg9oo)hso!b;8MKJV_s7? zRQq9$`jRddnrd?_Q+~s9+rt9n%dSUZ|BhyW6R$DVUda1Od!%%MS;B`ohMQMV0#c~{ zFsJ%<{A&n_ixP;RU?_11Q(h-u4vncjJ|X-uU-zW?J@{`a!A645SR({aHMCOI&G!U2 zco&SKcahJW9C=!9Zh;RjOKB%4kMZLx+(03kxA2jJ_cD8~<4O&uZxVMq;1daFfhC5Z zP$!_*(k0>!mp%d-$Lu9`Eu?dpE5S#NJmaQFEhI9r>rkRmcdeOhOQyw9*t9-L$fw*= zVno;?39Ze8f$Rrhe;Iw8R&z;xxuSm}Ge}t%#YhKVzsEu|x?T$Ciixx!PaFCbK);R9 zrz7+vMh3{tJIsNiu15ayN(C*g8@+bCR?~sdl?Z(XV=hn^C#^B}T5Q2kN46U!hI)UP zdZKAB89KXvf?_U#%#Fpk{&f=RL+|rflWk8qKD0gMnD6TJ zIe3>Nt*z*@v%Y%q*j70>Ed!}`WI_%+WSipQVB_c=Uua`7}!9NsDQks#^a$qx|cc_6GL;;#^faiE7@fJ)RI4Es`NCu5=AZm1x#mL6} zjK3Ww4!uzeHKO?ob0&Kl_z@`&WiFbM=t7aT$S+06x8;^k)|u_ZH>fr#q1q&vGtef> zPv~Lq%<-a${<9M1Q0)&re*$|&waQr+TtqwEqEFGh>k!6vNNEz^j0;qGGT*Sc@0u3~ z^F?k)opm8aafcO+#WG_t6$Yzlh+qNo+oh1U#xk>ry?AU~qw`P3RUq%CRd^G}F=P1R zIm2PD8&u`|(_mKZ@VDk1_Fw%=$Esgo*w8Al#bar>ORF5Uj~L`J)3>r+eujy9)8OS9 zF~@3$n;X$jYvuL2n3_4@ve}NqtsOCSAIF509bo*+v6fi`<9Buxc{9uhCekWrjRvGd}Qdt?Xd!RI_PLy>C8? z>1TvK)Ac5rhr;}>nQ_#Rq1HmRCTd`!XK03coGFI-4MA`JnvaEq*{%=g@qLTt-F2_p z`GscL?><5y(W%kmPx>Va4IJ%iT<=%rA)5|!F?3{rKRgE6dqEu5QBuz*DY!p|l>;0V^a8*UZ&vsw3;r)X@IM7O+DGpm zzmTA-wSbN9n9^AAlqNclbj>@$T;P&Op z1vtXn3vl~<%K(n@I|gu6JytrK0gm=V_&2~k?cj$14%^~kZ2*U$4gWicP!kcD4kEq~ z9aN7$0UYJ$4sbU+{5F6iyg>lB=id>CBe=vK4)sm|94^@F03U3jgXkv%9LcQ+;P!G$ z1vtugBf#zRMSH>~0{l~eC&AUq=TU&iK>R+yW9{G_7CK@Wys90Nkbz!2dr1J^PXsmwz(A z0fa4q6R>2XGacY4KP|xR+piqps6Lhh9JN<#zS#grbTZ=K6zG8qzh|MmU8=l^t`ob0pKUVH7e z_g;JLbhtALmFgxY12=pXl^zg41d@T1R>=%4qa&zI=m^rLr3^b~O8E6*bm z{c%6~8j1eze)LaE^t2zTulzeC`tSYd-v*w>%Yb!Vu9x)ZFTm6M9|b(=udIhWh^T+8 zz{~u}z$XBYgyjG)&kO1|EAYhUK0iMB5}&m`e2CrwJdH~^@Hq9>`v?FY@D||7K9M{m z=hMI&0l(^lCw*%Hp5%EScwc#r15fgF0`J?di@;O6)VK*Nw~OSt0zAnR20Tu^@(cr0 z;vWONFaJaU#6JUgU;eqk6aP7W{C^BQ@t^OqM4#(N zzg(hU;77j^cLBAN9jO4Lr4X1Mu;ZJVgIziT-6j`Zfu_#}EI3gm3Y~ zpOo-__QRhAp8DYk@V@<^1d{sg6!5z|;CM4tRN8ApNHeuZi9UJlR)ao&xtgj%2`h0iPn{G45Xgp9uId;AMY_)~S(T zO6_?Kcv&9ep9DOLuy=v?ZSQp8iLL{9m|kzak4p3x{OErz;X|+}`SN*H!t;Lk_auC} zAO155pX-PJmxN#7hra=xmJa#KfWJkS6a8>I@YJr~`_V6y@Ob;Rmz+NZJ_Gb00zck| z&nv)Fdxm0gVKTk_@DA`0iJ5?>ahAvBB=A21d@Jy98$>+h8HB}^#$`G1lrPW&e=G2$ zPrm^kMFl(wJ|B3}tKGok&x>CKJozzi0|^&Jz|%Oc03I$Zdlz^rC)~bPoPPnH`qv1& zuir8ZokRMU;)_Sa(}5og{8Zq{FC#v}fa9Eg@--)=R9^nc_%7gSe#k!=pNh(FmXSzh z{3_s61K>{rABcY>kYtzTpUh__@HFq`pNzlWdasxNf9S;?zgqwQ(Ealjl>6VIZ`Uj5 z|E+p|Xnnq3{{OCixZZkyX!`5bheu$`O|tPpD%+nAfG7Ja|71L+f$ZDW+I1fm#X$D+ zdg*^?K38k+^~!lQK35x;tKqN4=W6)Rv0etUCka>=$v>dqy;vtBv5w;&?#VL1Gcs?> z%FoKR&Yqngm*3y!8$E=%(`V1gpZ(*!{8>|NR7%LXW9poo{JX5P^6#|XF;zs(o|-!~ zYtD>WL^pNT)H}1L&K5JK6J7tcCHCIoDL+5UhMk$PEzYu1aSJTr4Y65^mn_CMSPK^? zVwbFZYz2fJ$BqEHO!tHjrqE$;2fwr7xevR3VC@6#Lddtffox1;Vrdgy}-g zEdg>egq-mKa`2)W)ti(QC{L6rDUeV}sbaZ6awLg@Bn6TLVGu%nfn-TG_Y5;e=+4=* zh5g2QkiyvejAxwK7s+C`_Ev(#$pdsR3n9>qq9aB%yp-asVw%OUYlp;DLqti;JA4Yw{Oj!>7e^mssWD zxO2An)@o1Zi}sIO>NP$R?W`FCSiC;G19yVB6OvDTG)sMi@EhVZKZTn!FHf@0{)D0q zda(jwVw&GvlCS}_DNWQSe-3_QB63JK%RLmAKmE?xbF5e#@~PyE?AZgaLf$HbwI(s$ zPw}KGk^@wMg=e}oGZzcdfW4bHYet?pnASOSW{Jb;hf7RP>8V4=6UqZc=AGF zAGqEdV9~CFcg&VUBc02gE0CG8? zYL*r+UnBSlLX4%n3tfQf#E?wdV6TT<+*2@L*dMY7EA0W9FYKpSh+Q191oq?>Enl@b zzi2V-=_w0Cdno4nN+%!?@40AkDGZpft)NURZm`&+SiO`&CKAd^jgxVL1k%Q0%bdMO z1l=!;$3WvORwix|c(0eSuuB=Xt9-CGX5})%4aD+VcQU6yGr9B=oXO}s#!E5P~{DqDOdz7W1WDQor z)y0MQGyybg>0)fnxNxzsXKQ|OL1D>aKTzZr5Sd@N2%k47EM3zhNinn)yR#0|5mF29 zoiW>5y1b}xVHW0mLGfa24m*2wfiopJv!J-R5L-h+vuH2GJ7?!Ezu#}BtS;!8DZ9 zKm7Z)2>t(PwDNn;kshlhIvBmo790)Qu+?jC#GU(SN@L0D-*QP7jBHmg#$H}t+vUZG z+@&$W#+(?)Ue+s6odT6;EPD$0+AkkIfee^WwvPq#isUt6y)nIQm^V)}Vtsc+l;)YN zN4{pvTULEB^!X}H5;-4_;_bbAUozW3O&>ADqfLf z$;2M=nlfp7R9{=x%b5A-j;}R?r6P0YGh~82>jR7C(c1>m>PbdZwrD;QNhWQ8E|D!- z{s1OT>>W%@IM*<0-cb~05ZSce7cx>)p+VewKy0;wQOknnAulCjH{)0(h|RHo1=HtBzI z?Bny`m zSh^%xyrjVLC7XTp+~3fIBJ3@kokMBd3l=L?NgzKYZdAxeh1l;24cO20z zVsUgtfc{HP^OxWMPFMdeNlZou$~O*tZoeibqdx_Fpvjk*EO%>i;BHO9um|FrB6mVS zt|_uIqy$!m6!bwruF#FE%bJodX7+CgX@!%xTxHM`Q{*o38^IKGMnBb~hXM(mDtA%9 zu1J+T%CD}}ezhf4)|OOx+N9F7xu%<9lAfi?6Dk$06*MnZ9_!Srv?Q(HmZYI20-rR9 z9zcU}ldR8OGH-|VxlQIfMB=>_uZiuMivib?rT$E>;nqnnvyYX#q|~2D|IZ*qYFY8* zyKI5=A+3*c3wNPEO-?x9Q}346`uB(lM^y+1|rVatg%@6`53?-s$r6P9LA&bI(rdi(Yr_ z0<3yV3rk7^yM3Z#-RmBoa19F$E)f08Yro|uJa+8$ZydREOBb`im+fpEKJr*P4hDgZ zTU1y=_Y}ub<>Q=Ks27*8ak%M+`zPZH78J4q=faY4_b*$?#uY7Dy1YO{mMmXV%Erwo z5$d$`s<{Vv2m#<@5K5P>XM5Nd#{O8%nx_DlsAoF~#;=iJ9!Co344~5@*v`YT=Apoa zfR13IBUp|67m;qoYZZE=3gi<^`2=6a16af)6?G%UI|W4^q=-!`I)ii^(oe$h1v}Im zU&ESD0(T+|;pUPY1h+|a2PL{GpgRoQJ|8-QcT03HNpyFC?q%Tcj*FKc!3{VpsP_q^ z6OdLQy%p&LC`WQ+~#F~??b-a4+PJ}f!MdAS)i*$uwXjg zq`V8bJ3&V<^#{Q=9Mu2AkRsN+2oI?D=)f0yCN-;oyQG7>QvVWs2G6Y#b5L|#N{=A5 z0zQb8NBRQ30Qd>wu12d_a}#jeQJ!F`kKhL6$AAI0_iTO%@HXTVO!)-YBR>l83gqtq zyczifQ$E2@-~d=ug_P=jSb|rf+|N+Yzk*ovL%=yvj$kTB@B=t_(9Z(hYT%>5|1RL} z1RcRdNAPVph`$9X@y|d?$L)9_1{+rJ|hN zPJ$D05dUGIqjt>$-3Z_YgHCQI!Fn9TUxk$TUqZkil{+0GwzCZ7I)OVG($h|YkK@P$ z-Rnr>k(MGgBE1XcRG25vJW2dxSo0*n$;g-cg}Cehq1}fe#}wdF ziB9Stg5zNDBO7%0Aftr2Pe=L7m@qBS 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 z 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

        h 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

        l{&s!P|OOyIo8q4yBiu|L% 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

        _YsKZ@^QH|WIo8ct6u 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⋙̸1Bp9U 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 l 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

        y#lP#?j?!nyf5Q0opx@`v9pt5X zG)SMo#664`x6SAl>NLL3!aYcAFLl20mfnr2-&<*?{UVokJBV$foo_#peiIXaEnfUO zyy}*lewR^KORUQ3xAbE2Tj*yj{dS}Ijrre`R==goFmdPL#mzH%y6N}ZaAy&lV)a{k z5~k&6n0~)YyDVZUR==f_G4T`d;>Y1tH^}t+1a+~*qO5*P_aT3ne(t2-k?08W((1Q# zC?>8yUfdhwy!z@m?|2W4;q?=-OXIr6Tlzev<)5UT#&-nm&Ja6BJKuOqAHl>wh!?*F zue#mT={TBBT@$e#)cKC9(i;tTHu){+dW$Q)4ik43UfdOUaVrgXF?BV>7F%5DGVAuD|K`8R}fb`dIyz?vAPM`dF{Oj92}6yy`o~I&WX6e-SR;zb1Bktn)o- zt(WvsEQEH4@Zz-KRlnEhoz!c6W-=~&h&590TR-V7n3hvdJ8j>2wA)B*E$yVW9O>1V z_$%<@FT<;DF?HI$mDE)dE2qx4y`|@3s+(^7B)sag@Twn2{m;MTIMu9QI9W%3_pyRzqMY{HiG4*>dUff-Hakm<7Hg!9QZL+x1_2m6>xjrAl zeVFKV!E>su14(an6CAbK8=Zgly(~bQM5Zjtetkg?IGQUiPwx*zxLo&x1Boe zuUXXXBDRG(-~KDT0aM*7<7@D$uf(f?BYs#&jh zsGC7-lC@sa6EX4A&3gTmb`yw=v(`&`G$wvLUi@Kr)w#@iouqCkvHsS2NnaW5`F$%z zM~vTT{9@x9M=@96yonFSuf})7*WkP3OYs5t$%$TH_?Y9|i@rJ1aeCpW;Dhj+611Z$KeGFnZhCAPr_G4V7uMFoLN4tZ= zz3l>D!|6FUD&;3-KDy9O@g{Uo#%%{WxON zsF&7umY#yCJ`1n945P*A_c0M0LOb97EA7I> z?~4~d0a@RhQWr{$Un+Ea|CK)Xu(#dGhn=^dW4T|ZA7_Xid)WD&wE7`^1QY)t zUi=oL_fV(){))P0Vmqnx^2oe#H&9y;+(e^vc9Dwd4Go3wK(T{(i$h}D{4T?erv)JdyO zx*Ze$0PQp`PsMY8E3qcp`Nm0l52pTY$BVxOueuG?XU`rQU1i!;&`#U+ z=k&u(tc-TP?JQk_iC=&hKgZ~)rvGQCn?Y=n)qm-UnEH`!`u|h-o=jZD;9YfF z<0pLx>j9?)ujTK>Yxz5<(|ApwZa1;5)cM9wdL!0@cB_qFfmi)9yz0xT*Y{VoeJhBS zQt$gdt8_8egLZj%)y*(^3UxXU|Cr@YCzef}@4PIXg^8bH*6ZiA%OEz|S}*BDtOxDl z@Zt}}t1i;4*IDXfi1oJCOFGbSdn9n*1p4N%uJMw-KFrI#j2HJjUfdJIyyG>9y3@pt zQs)~l=~nU@_b168LN{An>AhGFI6Ls-ZpDjRZ@4q4+emD!#g$%V+AX8qp&YI=5;-mq ztE8PYj|S=2F!9Uq;ujlTK%K_-E%Kbq9 z{A0hAC@1@%@aS!0dZNjU+I}JCJx;?}iEv|IE;m#w!5xv&pO0UMmU4a*O z8D8AQhFeKpC9!ggD?Jxe-7LK7rW-w(I&F`A)J-EckviY@k)D8wKhE^)J=&!cOS1YU zJrWat7+(A#c-8ec{W?RPi&!74U(%uE*Rmfidz|Y~bO?EA9u3lgn7G$tz1*vK>5H-E zI+Xc;h1l8Hu6|3O#a=e1rs+5FKz~2 z++@RTrfxj3M2jmu)Nnr_ABT2XTa@!7%y%sbsEn^>JAZWwz$&U4fjjrccHgfT=#!a zWPXtMjj!}+Ox$C5aS!9gZKcjLKd3uItl8p9Z#Ud8k>7>hVsWK6VdAdGi@OFd?n=Wg zp{|Ztjm4E-Xt>`d{~Ef~;z}1|;^yJSoq-p3vf*x~ZW^(P7FT+l;l4*c9i3!xrAK1o z4#SH(1TSuX!#zWti&!6vD;;RKJ(9SdLf;(HHNMiW4M0^-9}!TM}u@LrvC25i@VF{M(Q+w^Wp9!wwXHLe3ssbY58ku zr~P07?dpluS^bu-#l&BR7vGInUAgIZ4Rwo&m010j&N1A#$QPieSzPHUn7CPZaWnAZ zCL3-ub>oR8T3qR&hWi2eIJC>+N=ISh_Qs1FiWk@4aBonj-{X5@aMw6XUm5KEe(1Dh zuCoU7{x^Bw_d})6W8!w;#XWBHVd^xlX`^_*k60UZzHydr#kBlAw9`00N4sWXJ89>e zf707A@i*bc-+))$8tSw^6i~OG*ea{v(v^n$b@Dan#THk3Atr7yUfe>wxHAm5p1M3@ zQ!TFa1jGFa`D}E$#g$IM#7)GD8;=)vsNo)?E{>SX;!5{6+&_|!M2A{j=@3lZn}fXE zPQ19626@LJVl?+n5<54jYx_wbC$I5*jC=?B2zlT5O1ER;9>A-=O?Yv48g3?adx$k! zTIWZVX=BNW8dVhI^U1KEy&Su5{->@A%%&ap>ki z=F7mY@s+-WiF*bwF7GdTxJRhd{>%H1+l~`EM4j*WCf#JX&yYWW-feNEcVgmh!Hc^Q zul}wx+*#CZAhz1#O4k@}HTjk3N{cJ~8YXTTUfg25xOs-Vmby8_W>{S5Y{UIA`6=iL z7FRk06E_(zZX#aXIKw?mT>`P87FRmba6cg*gYIo{rNc0B1M%YCba}Z~UEcBS&T;EH zu}iM5@s;i%uX*qY`LpQbai>P{0oN}X?BNVk&Lc6yThA#}6FmEMb~zdP{aZpDlHrr}PbZZom< z7FW8~aKB1^HF~+lm0pI4yBIHSIbPhkhP#ToQep)bS9+@9{ww(z=t&k=dLkxnI$qpy zcyUJ>?m_BC6B}-ErCo;mA^D-`{uWodFD7oNp5ue?;@*hyj<5eX-mfKgEv9RHrO%Sr z_&!AbVhr&m2-eR~fk>8HqXmO=CVB)U9i@ORh zZjIrVQ@4^>rNxylHQfJBej$3U#g#6^#GQc`cPd`oiH6%q-DF~!7FRmSaDPdD96G_` zN)N}x9fB7(1}|?2e;e`QZpMpSZ@4q4+emD!#g$%exUZA1MORr| zX*VWrIbPfnytoC1yN0^C#BwaI^c3=QW^kR8%IgvIB=XWc8l)#;;-=%p9cOeRb-IrH zHQZ!k@znXQE2ZNwE#GDO{UPm!66eMKKJK%_(6Ep-H0;tBZc`v>{?XUI7^=+ zulevf@|U7`eMsInKcr7$;vT`P--qzxwiqt=A#FQIY_G+YZZzDP`d{~Ef~;z}1|;^yJSoq-p3vf*x~ZW^(P7FRmOaDPrd z13lW}N+)9C#^J>siWfJ^a8FY=NI8ou9ZLRNjPDZmiwJZGd1>tz(t((`*9UmHSMkyp z2YC03hp4+k?CgN9{X+UQrsW@{ownB~+MOWA{d>2!pL820UNc_(-h)@&cIrZ?o!HI(UE?5q zslRu82af0UNPp%FdEfkyK7)yS953z>ytoIc(|C@guANwm#g*P+xG$35joxZ;r8i^Z z*5k!pix;=naEqy1O>DWvm98+{Z;^MS%Pg*R2_|jF z`3&@Eiz}Uoi5rI(cPL)mD8oHX-5}*Gu5^&$c1z>)YqVo=rEm1}aG2@dC&g9ee~PPh!t8~>1l@hL-IN3$re{S8xuDJFK!B6+(g4| zr7oFRyv3Dv8SaPVhobviT&m2-eR~fk>8HqXmO=CVB+$<4-a=0UfdeP z<$EIARuZeUxYDJD``^hgM9;Oj(uJ6~d{4#0or)KCqTx1DHgE#5vAELNhWlgkQ_vGEu5<<_ZZclnM7+3hhI^R01Y$!i zu5@3+{XO|8bcDr~=6h@&uD{yCyTK1}uk`hfFW-aP)=BJQ->&hMK1qHa<6lkw4Eh*( zX`NT4k6`NWK|KG9T8!R9ov!;{pstzNPU?KufzsPCEq^2JG|y(!ZVRz`+WF?4^g2xZ zRe1gvt>B01Dowu^Q&&T5vDI(sQu51m{hG<^ada_xY4uxr4km66p8rMDjGkory&vvW zVp&$dr86-tKiTyA7qlBsEYa$>bOI)RES~>GgZQDkNYn4L)Ws0%ZS`9^guK2FJC=Tj zq65kMz8@`(atyC z(yf?yd=J*c--YLY(N^j-@A%&AwjBgEQRkb7(rXQO0r`4#oyC=|#l&5PXBCRvc>Wia z8!q4X-L{xOiN%%9Gu-c!pM#!ZaiynW;%4K;oq*?mQHtU2r7nZOXp1X7+;C5kABm2& zxY9!~ar@)N?StokQFp_=N?injK#MEg*~dG+_p|+O_Tl};K3(H0eF+oy3|`!mcyW(V zr|}#{-Em@vsPm1l^j^b#mV66(m&KLdfr+~rFYcRoan~Ad9(DD^>MXAGGV;+mj`Q^| z@cRqUZt~JR8l)Fv;+EpYoojR+b(+uH;Lag7gF4^*mY#-b`4dgQ_t9=Lu}rJq(&?D^ zqw(U8#H((Y>Gu)p;)xBh`YqkZaQ{HQKRV3fN_WS^b@1X|=VnfEFW>7O=dh>vyoA{K zd%MP2`Z#&bhsVfwppTIE%@65zOxy!_ahves?ljy?>h=(8w7Ak6$?N-?7a8Zx=ndq3 z-`|v8kBM7{7k8!6%c#@1egp0bVs7eu<1D=x)ACD9zyFbT<;3P#{gy7k#Gj5Ae+pi8 zS*G9HshdPB!|JzmGI@Pp^CSA5f=(ju`~If%NKD*ecyWgq9cB9cd$@y?v-&OF8`JWG zOuxHL;CM&OvHC52qqmoT1uy zrJFGIdnaDpM!dKi4R8a#(UhT;^&p=Ni?>o;*PsGGc$BR48=tSzYKl~bQGO>8-eEWxV9H!;FOus**-B4ov zt$s`Q#l#QQb9@k9bvJr>$Jw8L`4hX=t81L4&ym--evbSlZj?Sv-Z#$DCoyr4;KeR|3mUS(VNNp#zT4|Chj`CxT}p`NuAcenz}k-HPrdWL%Isn z@+(ZgzePJYu`;XQ(j}Pq1$gmu@T!|)`n`#|>BO?FeoLnt?oY{2K##My(xWkP_J|CDz~KN{5oy`oECH?@>bsk@t;w0yA#CPY3JLH(ruV{&3N^D4_23-55vTD;l=Hb7dOIiFHzT*Sa*vn?N46c*ZkZ>K5s$a4Db5> zru6l2FZVKD-1A1C4)<=qN1x_>0b(bp^X<>l$1p9wjdt2zX|y{`>;Ub2+fSO`ALr@! zF1+~L@v7TIowgUhe{S1WVjHOQZ9nO?6#LBFGOP63;exB*~_h~nW*bJ-R($g^U`F(vJ{sg@0QcS=3{eIgrh>f=TEuBFA z6UO@;`kja#PF`BqHPXW{&vwLnwxiL#O}_)!PLaeyt$s^~U|Rl-FzW)#T@f}LtNn(eo^NqLkLGoMZ=W+Ud2z`LOwE8XGjETDo@7az< zZ>CQB#h2kW5_^+6-+m%pk7@aJrr%$o-CANRt$s@{$HaHz#jn7tuEg|vC3WS*=2-of zo<&~Y*DTEDz8Ulk^1knHN>9VY&Blv6!RYa(-@kyHNi5mww{#Mw<;R(R|Aux6#D-e^ zmL7zOABh*gH(qrirr+173nS)l^;??X3+kCS0~qh?J-I&b*|i;|&tu|t;Ke9(W94pQgaj?&HKx063d{s4L}d1-A&>D`#Pjd*c48@+)#ZMXT3mG;>9n;tFF-Wdo^{%#AaFjmY#~Kj^7*W@#FBSPr|Ey zIQ9CzW;5G)B(YfPec#`d9)g9?E($MBZ@lV5jSe*H*Ngh@#BPRmt)KMuQ15asg?hKk zK-yg;c8+$wC8 ze$=y!E3q2trM2Cpt1#79;8j;<^jzw+oxaC%ONkX&>m{wf1uy;-vtDo0ZaT4SYrUki zF!9IZ#ZShoF2Sr<8+A#<;;i+Ob{X!6Cj+y=mT^1knHN}t8VJ;4ugj~ac5I*rGZaE}mcrOvk>OSfQJ{w~^S zyMB>&dx>qQoo_o!Z^igu^d>*VUyoN^o$2=+>hw3cS6cm+uEO|VRA&4fyz2Ats-H%^ zzOVT<>otSe6zYB7-;|z&@xLgOAF3N~^k}nQ|ITt#h>f(?OFAACe~4MH3$zHZl1iz4_Tes{d;2zvJ4o7CxVz+dm)wLPRSclXwH7=IM6`gXkP4|Ml_e{;bkuB(YP zQ}6r!ru1G6OwkU!>b4rakveUkdDLwoR!^O8dr7au#9u`_ZJ+-}yEVjC(9XBLq-!wo zU&D*P5U;vo>NF2)sVgH^XswrY0v1HOzQ%WU^XdY;KXLvJf)k9Ni06M%3O{ICGz=er zZ>Ly363Q*8O%n=?-j=Ux2gv5wFh~&3m-;giAl?8!R)7 zPIa(9KCkD2TpzK_=gEcpwK`c3v;Uaq=RVKa(Kg(#h6oF#y`DD?=XYtLWqP#p#P>Xp zHooWAthm^Duq)aqhRCCt1%2SfH6O2>-=DSot@Vb^TS!&vwQ82Y4Ox7kI(y&(FW~<(V%PetBj=?(DgL-Gcse ze`Wmc%XsuZ`pGnqfg?#%W6 zvE-ME^5)Ji&i@M>`;QF!D)WnG<>%$)=M68Km$zUp1bfTBydbwU?@x^1U-bvB|1bQ7 z^8ZYC|1bP4UJdwyyxHaRXFuwB%4YCAC7Rb2)l+Bih({9QU0sh6k0p(KY(!%GV+k(T zWAP(Mc+(@|;}b`Yl=3yt>F)ir?4D^od>+RoJq}&}EtjjF^MvOZ$6?G_tb?7)d&~>; z9ry^@k50}(YskrSuJIU$aL;4r%(DE2Wk%p;&Yb+jRGnDvc&Pr4huf!T&YU&7?4@~m z`6e)PW>yxj=RftRHGNQ@@AjBE(>E);**h7kFC-Pq3j8U?gXDES^SlD!Cx>>2k9M6} zYV>>)J{HgQfx~&#^H5x-htGS}U;p!D)BQr~yzi9JPi>>|X-y{|BcSn~6&gQe_3Dk^ z{p6Qlefk$WX8v;A`ak^snI6x&vl!EXG>*de@E_<|zTSckUNZQbsjY!e1w|x`TIE+2 z`rthw{bB;YHp?CIg#Y+eJ;tX;B=kuNiTpzMgh4f#wS8P^88zQ^`X!7Hd@8KA*T9zS z)MuBhIJNZs<$=92g5Gd>_ZOOmxbj{Pym#Q6Rs8r(RYPr`-dR;EdQ_!nMT7+S%@53R z?v1NRsjestexe9lcWeckpH3dBG=Ks>3i?hRu+QTX?hZQ;D74gBP z^}+L9!9_V?hef_d@ZjFWg-9%U@mEzWC;eIho@cUgi2K{<} z>Bp~54FAS2w~mM!zAd%>T&Cls^bKMBxZdJ^%r&9?dS%tF=r;7p1A%Fq1G_gwEhoN> z9YVYNqap67mQzs$ef-AOq$O4DUoqYtyl7$Y{57wHo^`^18xeNZ9rkGG_?YH>(T5tM z3gYkaG+R2LEnsYG+SnBVW7`(4C@Ts6N=Wdc%<7Vo;EIxf@`cqUuIhemy}~ZmhMkHJ zFOCoY&E>Gm*XMw`^4Q?=&U?VV>aLy{QvFI~b?KVwMQfJCUAi20sUz%nO<@<~ z17@{0M4f4fYV-U&ksEbzU{uSJ=!3aIM{CnYwWf_)NLw zjs%Qp+#mXHv#U#{R+pA6Ei2U4E{m)#tFP{N=(+GqPWYAVursw`zex!{UkQ>d(XVS*hAos8MNq5$? z`c?W95?m1*T)Jk-^xs5;U2F<_KRfK>_`&-Qr^cK)b^ozb(I@?MY3eL;@!AJJD<;#G zRukH9RKFp$-%L5s+FCd$JETv-`pA9*pKPstc8LCt>V&`F<@f4Kg}J3O=g+R-k9Zf) z%r9P04ceoY9=^aqlsDSVAuDO$LbhZ*a?(}LyR~>G(bjD%~>0KXRVi~#x zjb*&82HpX@`(IOkE`U>m%Z{c*BGk*M{@qYozt{4L+eq0=^CS!#<~}?5yl-DL-X{* zTzPv#cV1&StbZXXzB}<}7{zmE&RZr3RqV_myx8~v%rNb1$@&d22+2E5hK7?_cIZBlmA6+Y|D zSeX8HA*)>Is*TLpkQ?|>h<|?0txqo8a$>XFe_!Z4)O5w|t}hJyDAfPfCmlo=wl@?y zgE|VGp=teNGj4ry^cFhybfGJE!v#M-SB_tLZf?rue{rW=DeOHrgJt-;GAh#D18;q@ z@0N@9dvEz?_`3%3?Co1ASDx?f^0aXetVquueCw09h&|cM-$k8Y;Gjk6w?5hEsrske zRqJUnr?3JO~SN!i-%1TfBuib9HjP@VW2UTb(sVrqNu~UBbQs#TAN^VzunHH`7 z-ldFSDeL?{y)G|$+E2aR{yEyeVJ#(tr94IKE1z0Qil=Jq?W!bNxXn^r85*NUJT2mG zxA@$x?u^yfJK2+5euHj(^1!WohPu|IURymvBeW>JTVc1tkpBKZj?Wm_c=?@MpM>9f zF*_@*GWVkY*2m&!Oj&L86{ z<-C~hD#)EXcfM=hg0lIu^YYccBtOqplKXQ0{5$tY`?`55bN6q(ZXV4+>aV(Pj`UtP zx7@yNp7q)5=E2r=^N5U~XE_h&`a8~m<3l@d@$jp4cWbYCWnu85+UnBC;EJ5;#f1Tj z7FJi31ebDoQW#L08T^$@o>wQXsa{wcTu~S>-(8(pSY1*dT;{ZK^_LrS(9hL6kn^_Z z0*%x7z^KDZqL1f9H7|)K>&y=cE?-k!>V%ZX>e?rf3)0x?S2C;lnHV3u5R@ypNsZ4o zL^;jTCmVXUaUswUeXyZt$EoPU`=Zb38nEZVCDDf)qMeG`YOb4dN~&L_CtObI(lTJ- z!fGyBi7zT#TFT{KVRa%6N~#mN&<_co?}WU%usSg__|^F8MR)K2iBr+XQ=-o|M0a@l z@43>ndam*kE{FeIc}~pXQ&A@xqFNhzUZumQSe>42elf@Eqnnq+wEM+#<;yAuyFEQ; zE%Z8sE+u_-FwZWDY0iy0%Ic@aoLu6$z&sVr2(&cBwC#&Jm>P4OWu-oF(61@LU9W5E z`LS%5rLVZFD;zHB>BE_U(FgooY=|?bq7E*JIo_np=W`9ZK0WI9%Olj2S6$VmL>hzH%A=f`3Ral`G+SzEITx)dT^nmd44aJ3oZJVzXWJ6J z8aQ`*O>_3Qg=iQ1JLldJVIR75-OWY!#oF*9SNMn7;g?dv-cJcDN(uWQC;S7Rw+DS3 z5q>2loEKe}+k?EXRNSNVG9qo16FBP4{mE5Jb+x#|Z){cC=*F}GE7Fo0$p++vooWjE zm=8erg}omi{&9QIWmow7@nIjthr{%~=sDx8q4ECYx`32j`^W59!V8F`9YQ7VNgKT@ zU~JveF6)7jx?bHcP1EUTX7cKD^VrzN%SAH}8hj(tf@X=9!L$W|Y&@CwO^ zxEc|5rG(9-m3p7oj@jCXA3Iz8MzsYbH}31dD{U07`FO&*9N{GnJ=s5o*JnhIEgjXg zKgvnx8lMd}sxEE7ng9lQOcmGgU7PILa5fyB`7kH!Dl6L*_908Ty{3&zBAt}b#K;!y zM&T&~oWnsIBHa0DKa2G4SH0tV@k;cHXLDa|3j2L~5QFx+j<7SHG2}(wwOT!g|B)+P z{JRWhZQAHI?<>f(0Sv{P0b>{k_B!^KuC2pX{+KQ6dF}X{TJ3C}y_D?|c6%4~Y~nRb zldICku(D12$MBkk7k{m31L^|CyqPw}x#|l4U3OSghjx{-uJBXs+UGA{4r8~u%7C{A zz26k}L3>yc4LZV#nl#{Ny*mc`Ue2G}8J3Kx;zjD+N7%Dxeq0;&A03|Q#ztrM{kgrg zomB`(Zem{SAN85-H6ol{;x~<&5ezlmW=1o$i(Fy9%LzN{SqqlM-pdCofn%$dCa>e= z9aA+R`A7ge5`A!me-Iz$r1IiBoIOn&g&C9*{yS~N@TUH?`;(gj25ecv3;Hp;c;Yv< zK5gudrAhQ;PXK!|M+s)Sgm zrHg8U7u9>uUw0lAE29qQ@^(VhF^-MynC5}e#~OMb;6%v@?)I_K&54QkJUDadv|C-q z`O$M?;s9IPbyn3`sfmMm)NxQw%*lb#yg#Aif4$yxIqp{d{^2aV>65by-sItDY-_|Hf&Tx6=OfiPas$Ds=e8a4J9a8Cng)SQ1&iz%vx;HWwjW zjT8pFvMG3eyk{*~Ry(VC*|E-OIdm+>&54gb@J`h$PDn*a@S>#ZQf(BS^eZ-LBQA1| zx;f>=9Lwp+X^}T+c*44HqHm!mr=oe2iO9u$Q60Hqd>5NlZsrVo_Y?Of&lL-A-o$&Z zf_N*4rQF_F$8utQ2c;s{YQLnVJp(^hAi!1R>MvR4mGMQc^-hxKZR)4E7SrpZdnVg+qzcbjq+)3?oU+xQq!^Zz2dqIv%t@pk=?rRZ# zhd&DFeKh2&?x(Bn?U`N`^v3pcYrFM4utabDo!!^7V@dP@F4}Tq+Ec@?*56maPgm60 zfe-M;-PM%v)>C?Wt?ktPys5>-4Obyt-nH*b{%Lc3Wd8e8cLcw<`t_ZoD&4Ecm;Lng zdyo5PFKf)r+|tq<7y8ZDr}ixv_=AuhX@w81dHIFDlY;$w$2;|_W12TQH5!xu+wbjO zbw>;wnAe)wt5?e4s&^lX-Lv^)y|b$~cyB!T){lOb|N9#c&i~2W$L_zl;Hy9VFrw@!$4OE0qWjvuq@YLmj6DS9j?T`EeE0H$42?!7K7Dkz zSB{bLy?YQj=)1xF7N>aH3g(12q)zX-k9cY6Y9ZzgVQb3)uS zPf@@<@bIR{LMPD80$d6-MLhI;+z7`%M?#OBnya7BuMbM`d~o1dO6J^%*ib%wsl7*% zkJR-(b|33~>}eC~BMvr%Z0hG1TU8mm!vCSV%7&DNhwDbwRsTof?0z>_|Kdlk{yW;g z)jB%jzAw0XCcM}1t6$7r|LqUz|Mi`?$A9qaPex@%t^amvZo&&Q*8lv6FRlL7%cJ{W z-TCeJ3$FcPT<{zFKTe3v8v4_pemv^IIo<9mIe*2Fm{^LKtn@`K?Z@=qW*g1WDz<<5Z{$KC2 z|8IJq{cDd_HYN`a=`pghG5!Co_t|q@x)+9HZD3}c4oKX0r>4@x zxwk4~t!v~j0vj5JhCKaPYT=e{z!RIv$_2c1Lc_$l3dUG52udD}BCL zbhNza*s_Ly-`F$lUvmcpJ^lBIq0vtkMULKjJihE7ewcf1=a=`l7jevX9_>}snA8w| z?|VUCySKYnH2xstpM9^i| z`ITB9^6HZ4*nN$D+g7AHzEJ1B=(vjbSvf9Xv)Y3PJo<%_(8ufcMb__&3m6f2HSVRC z0|wOjMbiAqkji~u?C#$`@CTvy^txEyc&H;ZBQ!KHa9>JjmS1RPucd?iQsZ4qCxsm9 z7%(EXcSK;oNY_2NEgjh@5ut5OeQxH2WQ5kz+#Q;|BztLm?9yIKU!o#DU~`o5->SFBQ)%uzm(6m$!_vO4wW3Bw|0wKy-ZJ&ttT*O}9}H0R}|51d%?`OpCo zOX8i84=-)a>GxpZHou0D^28PX51eD5dW8g({M)K8c0U>BX|uoQQ&H}HaZ6tb{897? zr%y_5OH&G+Yw5WEiYszNl2$q4^6O5Y%Q-Fe>UDel{Z+k|rfDUY&TM*pVC0AtPn(e7 zS$(e7hi8PY^sHxd>it*U_h*DIXK;p-jVJ2GBzdEejHXLVIUZ|Pda^U&vYU*;K~rRAt4hZ(1eA37kU8=Z~U zLp}_vS0f(F@%p?@It9PbyC|M{+sSv3dkJ5SX`OUQ?hN5NnhOzqUhx5j^u+ah9}9`| zYYUv7)Ny(4jmPnOS%`Cu<><;vofk*#mlN0LjSmx7UwrWf;`%Hjjkwmu7vE&sKV`Rv z|6}4qX*ZL&`sHi?K5@^%kyxOKt78|4s~?K__=O>AFTg#_vv{SnBe*O zsORU%|NYB+`Z;p~n&~t zSKSr*pWB+BxhwT4#9 z{U6)a%|a85f7JMqnu~h;pSmwV%R0&Ni8)_%(9d~Wp9%B(p0*t#cEHd1o-~gJ>Ae^q zV-;;R{!Ki`&!Y8sjyFYh)ayQJH@7b79=uxWrByGj&-7JaiC3NO2b3ZIpj;^)xrW1hc3y8`?)+DWUO^b|}y-K!>k23~c^)ai5kb<~Z=CsHS^I_cr$ zZ{l0YC*X&XmsVbSC?>A%eG|8@(P5_Fr>N^gEX3-!wC-`#@~?C2x%&Ab?Hv47Zk_S< zTlz8!68|h-{0_Y8j#8(7`up)cQ)2DZ`T8wQf8QR>_%c4cn&*2W$#x0Toi>U`rZy&lu@>rB6&r`=j&E3JM@FUQ1p{RKVqJHS6I(Wdajct`=}ci?nea= zR?TC2{yFRUMC*C6^<3LZHF})Ee9sH4=bya+`ff+F&$hbjap$wm{@=Ju-giFxD{l(A z%N^aiPv}u|w=Dnm zUB!35ueeDY%;nu~nZAuj$bPKh9^Vt>7%9yOl6e?1y){dLw`7z9CHr{${*$0*0^eHcQX{(!I&?tbZZxLRp7D#dwf>gkV}A z5A{*k&1Fp7LHN)~+%rU~2hTN^^-vp`Zg6y&=eWP=(fC9Ew*oT)Kic8=4dj=@4DcI~ z|IqdKZn>NXt2#?U0zaDQ+!`1*sH!tF`_0Y`*|$FV5AH#EFsG5bNlyP*_X|DU8Tj?_ zSN=Zz>5zA?JT;`Yb3@a2{}4F&yCJ`IzI&nWp0*2Zfeja)xW~DW9vFDxp0JqCiU0Wa zN4LTsXzzC6jX>u@Rp61%Eh#I;_mHO5>w$HhJ8IS9(tCj)y&2N8gSek_VF@=vH+61` zXzF}3zNxd(HLT;A%T7pb=RalRyWM(tNc%k(UJu&!5nqYAuq*%1$R+{mn_Q?aYku8{y{XGnf6kWoCS-Gw^Gd z-*NwNUIuHH_00KayRmL@-}^)8I@;I1d*R(~&zxTu=3ICRe<*D0g>|6~7qUW6rGKY$ zVy&mgq0WUBp(i@GG_81|yVk6mgMH`rnmI1_JHGX5?|d_&Uru{xqZ5(iM_gmdQqv}A zJO^+1L%?8`>1w{v?7uF=xiH@UjPvG&zYl1*kk)NN`l`-}@wYzzc)K(7`1U%-|3anz z*Ispb1qbd@#|(gcRUi*o>11a1MTns(T=db9gtI6F0`;6(gU;7 zt2!sT7*QAFg5Tg`1mpc#MrOR3k@jHFZ*RDs#Hx0e>RycSro2EYqJg^t({$_ug-v9&Z#b$!WruJgF_A9t8~>aM&4m z&#=DjehF@L_Vvmu^ejR-Dg#nF2S+ece*Dh$3#sh4jLs+Dxal`AB*Xnq%9WKVBL{I` zl#_Dh+o`%gio3kh@Bs_c7o~rNd&w$pYOS1y!hh_z{6@i#@N<Ka8Q1ri zD!#)^`pJc#P?a7ynRs32L{C+>_d-pLT8G75{DtFcd`HZ%3oD&&7u-%e+q5Tpi@nb@ zzT=z2ZFiZ&HO%1xGlz4S!@HTo_uTZ&VQ25%=J4)X&Ea2mhBW!+G5h=-^SI!dTXE6t zth;9IJ^!P#g?+8Nv}W}^-|B2jxfS=}d-r^_CnU6ksAmp0bv89Mb?#vXx4L4@4E|B} zXJ>C4v-d~L-lnDlv_3%V1D!2q_O^X$_U^9DWG~F|%wB%FoDRqJ=VtHjKRbI1J~ew= z?wGx8=D76f*}JEen8g~|u36mnsaf3SnZ>(5 zHH!`p3EcVW^-L=nL_78jJe7C5S&QOjN-6Hlg zms4}xo}*!Hr}6=J&68{L8~n`q(0(bM-8c$_MtF|`-|XD&^1I;QEBE)`=$?YzUJ|pp zpJz7r@yzDkW;W+An|HhJ_1l+i&tyjElg&4LGr7g_&E%i?d1vzd_u4c0TQ^`>GkN#l zJd@l0>Y2Rzj+tEWSI^`Y&rIGE!Tyu|r5v3Dyn9dMJ0%O|7wQ|EW%<-t zEd9(qmfy7Ru^i>S$8t6oIRABz<)`iu{jYm0tN+*EV;L|o(EY>Qf@ON2_W}1C|8?_{ z?jQcIo0mRw*YRJtc_}5r-xW0A^4{+CUs^|9OCDB(Jdg@zo`*g@D#HPs~%!MZJtySy@k%ehOLyTQ2;`u2TOE^d=M z%bjM9ZVNgvP&a{l?mFYH>8MZNa`tELaC7+T*!c!Nc>4=?j~{Q+7xj+2qq!Zr&CjJH zl8Z0@Mg6&3wHIuvF6WMS`tMm0tLL8E^P=^YwY#sr?(|;D&1v&XJa-Rr4;wcV{<)j( z^aVJ-m=139I~DbrEx0DQg6~RB_1r(dkbB*$U#aI##p=X}YQCV#jd0xhz9=)8oAG!t zS*iQ2xD}l3a=6c);W<59b7MM|^gP-Weee|b z8TLHtj%ja*Ii9MXoLs_fRYFtJ0$h}(fZpr zjk|ktQ9Y}1UlQN_*xfVe%KyjSyMRSit^ebDF3b!t3DqmyA57W|sfYyJz+= z;HYTlod0=#&)LuHS$nJ-v8;a25H;YULM$dS^dZL{S3^w`E(a;Mam=80`(%}>jxuxl`dnAi&oXlK`8 zZlpDs8@V-@>#+vNeK6>Bh^8KWfRN;}fT?D`_2f&|`MX z3BkHA6i4-u<%{Jn{bbmaqp7L8^#zrCOuj8gho0E#hhDTsr`c`_aKS6>B*Dj6>$yM3 z8Q%fmYX+>*&SzY^l`?$I@K3#Ll~Mef(i#8wmiw13*>NMj>5yHN%g$+KA1Y<|BH=?N zt@6g=?lt&I!}?JIL*F-?Zx(5>8eQf3$hE1kf?Fs15MK`<(;C+*y{}9k^!WZ-(eY;b zYW$yFqMl~iajbh+x}HYj4yQNq4~A-x2k~@5=ZZDqr+S=^ucnoju-COts4k5vYn^~^sC^4E zSu)TlzDLMcijyL{4k{*ZB)-hw?l35nJbp+pf zl;V4IESrzSSLyiP0beNesHfr^jqR;b_?n|e;Ms_U_pMQS9(~PUFYw_mEbvQ)Yv`0r zscntA5*vl@XxihZDfk7E%#*p3zwrJ;g&I>DACuW+TU+A`G+U2KWkH`2bJc5!! zCVmjND5)(>zeXH3gx3|A;jj8YP*z*c{2~*l&3Rp_cLlg6?|3hN_i%f8=$5$KHt@*E5hwNothkR!AK-VEVWXet+jf#%^ z{JoFcR?o}#^Dez-Ro%kn>yGvelQT{xqj&~p9`S6Ab;c@#XT{VcJlE3Py;dCWlo;Bh z#=AB--Hr>oH@nn{*`{LHDScWcJawL@oN)EH4TSBR`XM~I@O+DiIiRqlXqKNzY&Qw? z*`UXg)K=}9utqLoxpbk#fvFPp3boq1Mi9cNCiV(` z`LNylZJWmcB9Z;`1CgBe9Y zuV_CnuMz(REcKS*-aVx;RbUA(wz+bC&F_$UY#)}~e_@8;jq|p6OQ}I$-Qq@#Gb0}X zmXMN)x=q7WKFIXyU6odQcyz7Gzc$Xz@fL8KHONw_t~Ky#{6sdW4X>M=t<^%L(;QS&C{PISM4|ThyB_XD8^Rz; zqFe_xETR{copny30w`LkBTmxr(SCY%%8JaKMcGA#_W264$;(V22kXXDiS_i^jF~oSs*R!lm1L zM2Dq8o$szwi8H!T!#c&rT(J9aOpeT`@Q!;=PE?6W<7%{O)W%UakCF_G(I1z~?k*4-&?) z-;g-qTIk7Z;6+z6wd#=CWvXQ!1%SONY}w-Rm|FS~R@N&7jiX8n%4m^&Ft2e`TS+x9 zELSDm$8_&)4r&Kf$!{E$@O+hF8$La_6JJSWIq?d+XZ)m;wqn7)I-GHInd|GVlnmL< zlP+NNQ$t3!du>S-1jt3&rc`aSc9XxnM32QPWSc!G@~k^HSurKO%8Oq)Yx=f;2s_A3;@Oxe+jE?((;QII4#vTcjU-;N9ORHjtv zWZ@9c{b8Q5%9*PDs?#)k!T6fCcpMILSZ2QMjoTjaO3gBbAgFuBfrswX%w{}WT}&d; zo6?Wv^}4G0{B+~74*u3ASNGL(s?{Gme#3sS&^XG$tN5E5ajPg^DH14Wc62+=7CpCl zzq>*(_&pWA5boZq6Qy>EJ(w0HR*`>VBjV&%6UDB%Ao)LwAgOx>PrSHBRN-y@grZecb^tjZX~g#;`@@1~ zDsxq326rZ2#4I!UXF1jl^YWdnEhTCq?IyifL*(34|Jtek-HdF3zmbuTt`mTCg@Va) ze8wRAbf`2%Tg=<5P>9(5xS+$P(s6Naou*A{#|zqhjKk{2%!ZPv&afih@LaDCjIM7> zGv&~*+J%5S)Ee=F6%i6(_K4I#IHBk&9oOnBENskdENzy(EnOi$V%n7IO2}8#S|DpA z-Ow!^sS1WsBjmn`V(YWHHphB-h~ah(D;aUTAbo3;pb%b_SbZOx-EPsh5&EtOH0yig z7s4fGg?iZ2_ht`=rRLk7ee}I^{=F(z-|B1h-MNu3jTqM%tgm*Kp@{WrB?J8%zH}=l zLO$|zxwLt#DYRqjVS_=;_{qJ5ZQzyOpGbB zLs{I()_)cuuH6ItSF64yq|S z(=gOEsy?Y~U6T^9n(CS;OmY^OA_EW(DjLz<_y}o@D;=o{^TXaCp_(m2>MV*pd3ch= zTIVontcs^vpsSkdU)|!2{=)oy4&8gOLV-FjaO-3rrp$D_0k==bgQF8tvrV!V&8$bH zy?cF|vP`M0Ml1<2`N>F8Xk=R#HQ@|KiKa#CcCGoGw)T%^&QlfUz3>K@U+{l8KM8e8 zfuT}=sWcs5-#y9e926h5UM-b{Mnd~=dMd5r-BdnWr^v}iWlnl2ZBcwm;|6`Rh~=7$ z&-Pi;ST(-$a-A4@NpP3+cNKR{`txYx^jC9SlKf7$P*`Fu2^^I&^LwEY4Z173#;w4KpylTXkhEnvYe&>A}8R zm4{|~wzxS>r$=b;5a}4pQ(;Vb0-cC3R+*+(`b$Ll9pc2T^5`Q96*_s9RP7>1?~tHi zhWe)6E%`pRls;M9&KL!X@iZ`P4stk%0b~}&Wrv8j3`%@$NW<H0n94w9N=K@~{M{617qEQ?CmfF?Bi?~D`|mr9)iZy*3dN=8#O{z05y2x3GGZ#KCV?>+p=k^ggzR;k*fIj(#}90gM>3# zy_?4ugL|-y45nDGnk=D_>rGppSMH%?$84dE>&K`xtK_5C(<-4rP#b^6TX|S<+ zYDh_i7hC|K4QNUj&wNRcvM$r}No{L|b4f6K4FuDus>P^UWmvnz>&2Bs|@ZC-UI zoybGA$3YCnjwn1~Xviid30ggZBdMQ~mGJ6DXhhKy=OtwrY8-+}^`6vzpd)2D#((I@ z-!Un5Un7m=TK+w#Z|aa-ukA*Ux25w{P7hX$BQwF1YNMjG8NfxPR+CE!ti9dpE{yY$ zl1tisO0fYW-uH^r_?U5+5EF8Aq$&n%$DSSBYsaqcwPRP?*sGO74Rl%NtDs;7C=N>$KI5y~6VrhM3{>UB(UV*aoW|yV`2U zzHiTtJv;b@cI?@~*Rf+4-oTFSd_Pv&G_DKvi;;@77uSZKj^w!_rb29!@$l3V>2BH6 zBUGZ%tJK(&tMh%6wAtv&+Sht1?ES4XN(RYxt}gekF?kBpR6H#@yF@wj-u;aRuUeDJ z32nYvBxqcn;8Sn#l5d0MB+OOfb`#ILUTqMWZv*PFM9H+eeBwzq!5c!D3!8<^W9$Gu zpP%((MTN^D>No39NwuQUvU}!9GA~M^b%OgOV8!Ve*&Y7WJhF^&UpT}K^<1C|lVBL) zY}k2JhglnTK`Lz6*I~o*=aOA92KE;-QbyDUa-0p@N5&e<(?zPn{H+a_rvUh@4a@hx zo(+4~kcoEt0Bl(B@vpaG-;vtcjZrVV?g*+tkLc~t)1{gOi*%i59$P~Ujt zV8iM$e$7`p!-l0QVzFV304^f6nq2tz_u8-vQ}-#vY8VBl6?!0BZP;bdIn8OZdvOT9 zlg`s0){C~d6gQsHOTLxW^<36FnOvJXe$z{TaqZMN8eHF!dmfM(+{@h}OW(HEy#L|RD?5)FdW{vG21C;W9dZSl!3+CsqI#rY6UmJaaW z1w0e+p@#3B;PkCBhra-D724Q2;8gxYQ2A}k-%)NZ z=eq#6E$2G`r*bX<+_s!+EbxQ<;70+c@(n;c&?02@5(K@Xt;8ZuhYBabslzD)94xXh z6sZ-y7I2VY+a%rR@NvoR|B?-4wBfLsh~IcC40|tsLzTVX3MDLOw{M|6WJ2w3;bMLYxYIS%)>_T11AxhuzbMCpN(DK~i+zIfooCtG}?vBcT8 zy9tXm1IR*i3wcb!b}`r^-$sUk^B38Nzx1UK=NH{d*+o#l4sd-a~MoZYA=FEcM)x02nW$NZNQ9yV}} z`m}%)Y$yajF{oih`2!{qrCX{qulKO8j2kQiz@iGYAhwEKyNJQO;^NxugWKyjf84~nqFZYI zMDM!I|MuwJO7qvO{MYS%cEeAR2iVJ)d)MXH?ki?CQ0x`1-CmgOeFltu8{N<1feUo| z{m-prVy6Qdxcv5epn<2i(*@lE?>Fd!a&DoRuhR()T#9~{ih0jFyQa#(Y4+`)`WPz% zCeo+7vX|;6=EaT8mD?bA-42Vje{P-Nt@K!Au-MDt+HSzyRWH8WheImAE3K9`>%z8m)`PWLI^ zg!{A)UK{T3NBj-kr#RiGcmqxa^0|U}M$B*KokK`*2|~*McfL9Qqe5n<2(Zii-ux+k z0rx3Cyt&^gL>%*^*8C}c7WXN?^|;SR{50-!`BVH`zBxad%fr-T9?fA={*aU1bCM>{ z-lA*FlhHnUw4TeASH)~cI1B0Nn)Z&~i1|mlrnyNa@aYuHwj?{OUm9*9>u9<;f}B;`Q+CcDp~_S4_E zQ@OQ1zsBb-wuL`nNr}%}?}-LXo(l5XCx}}qfxxP@Y2-~DqqM30IVCNV>6 z39olZL5J}AAGCMwxHF8)Yd;6&l{5+y6E3V(VINXvV`6dq+C)4)Wi#2+FZoL6!Jqw^ zt4#3pj(LDyy?FepDA6TRlgPvMH&-=@p}2qesy>nSul`d<-K7PLOD#5R=-H$1#NM{D zhN~ApxtfpvkFTmO^n@nvVD~(|@N*bK{>u1O@v6i?P-sF9OwTuZ)rD_Er&(}L^uu`( zII5n#`cKa|J-{2Ww@YVEEhc6Q0OCb@k$K7R%R)HMAd3uFwtX z%lWD>sQD-}PSsOW#%YAdYUKCdRTmcea~esf{iSU*^5gHMk;Bl)EPqZTbNb12}CGxdYZSPIR4X1 z5~J$E=k6rgYScAmljnzmL`9+= z@V3Yz2h%gbpt>OMC&@gP+Pzk4n%`CDek`nxdbn={VFwl3)=I3U44Z)6{BY@)rh9TJ&w z4|J%`X$p*Nt4Q9lDqinTTDbTd{h$Ah)5VX!sm{gNNI<$c`J3v(11KNx$205V2%GA# zHPsR+#kL{pd>*&IK={vRfJN znC+M?@#cM~NOVE}%Wr)DG~*)qum_$A!he(2qx~338{>YP__XZRIf)X~gkcTTLV|w# z=F(UrX)zaCte!KH)#9pn&n`uxbQ98Hhje!~)o7bkj=xcgk%>&tlPIxyb4VMj;*)on zHGlaEtN$yU=FeSGom0>0Evb#r{As|nskSBc4>r{iYpO4=O#HLz+@&<4%_z)uSMSe5 zPxT3l`LPwVx4D31_8>3Uz6Ve&1`q7r_p4?6?30ch%(BG?c3*+vfSvc z+^mLV_r&%}`$FKRF6T|)K(*_qtD(A|7)IaYP~yCW%9c1xXE_K&JrKHw;-9aPHAtW3 zfd>XWj0VP>D^xdMK}mlfX3pCok;W(Lb>i9F)z;jnAost8+2(%rVi;iO)wX3F!loK& zP331hGa5f+}gG4=m`rP^`&SFUy(|5bG^(1zpJP&*C-7Tbs84mQ=N z)>Q4k634MD$Gx?~+_SyQ;{Mf&`^K+*>&GjRxiDucVe-$NSX=%?}kZeIf-1-;k zHPwTxWZAJ)?|GY0?-hD~>bI|6OlC1>S}_y*$u$jfIoDmi82#%oXkqfN)Cwm4dg>%x z8ofd_{=r12TGVM?euK-?=>LDEGBDd&Oiu&ksdi6(jdCSTQQH{uEBy~*^9xDj2VK4B z0`6D12V3o*zd|AbV4M7HCAxf>(p|hv8V2^ROL75B(x zC#2~eH4j}L^Ib3hz1+87)+aJSWFwZNO&;VYzs_+^T72g+{lCppC3|uwIQWpS?8Em< zfPLF%^xVRx`m;6FCSbUP^`;twI?p6sy||XetF+>kfag#fo>yJw2StC!1buc2{T_2U z0Gu(ZbEhr4^DF!8&Yyui?vxuXIBgc3v8>I(`Qn&!`9aG9k~x{Wr3FO~DVXRH8PN)c zrjD}cnJp##;ex`Y1z3ienvr7OzvyB1365bO=@dDIio6`GPsBD&sfy*Pxj7k%85#w* z@N}%Aa7m6%M|abg=IK(?ixlS6ip>1{tf;)Hz|o2k8H{b_R^Ad*b8=B`MN7>EnHZmN!;)hO^`>F7SH#UoP^1(XfzXF-u-ilVS6BRV?&;k?X(ob;63oV=W(!YO&F>Df8? zne>!7Ejl_cwKzD0>CGn-b>v}qTu{LO)pfJ#MQ1%#vbgMqS8VZU;%wQ%!=kNk1qRR3 zG?x$?*Zl1y5A&Qrnp7FIY14}@T>SFUyS~_!^5wKGzy5N!^K3nR7Vi(_GCaQz$hU&R z>{~(T7UmHt@to-tR&tGR1-GC!je54B`e^CNwL-Pox58CEo_oI?^Hri(y!2s$cIWSG zZq2mZWCwBvyKS!u7Hes5a6w^Br7jzLWebXnD~oj4)0;N&F3?sMWmiT3L01`}tt^m; z3mM6Z;>w65@d{<-O8fl(&$q(A!M8%Gzr2~R@u@yaA3unVE=-OXq(* z_wS@;;oP=J>`mSt7ga5o+88%&mto58xT#Hos9HhPE?(63(y7~V9p|$@Zc4jg>Mlc6 zbDYmEYz8ifX0ZQzx6<__BR^3i`=?xXtXX!lLxk<%&os;Ol(M7EbXOl$CWzS|7sUu; zYO#%aoKJHp_5hFE-Z}*|>jYCksz!ia+?!?p)LugGlxC$Y>vVjqF^9 z=w!3(Ooxo2-OFnQ%BI#BaDv^-cg2B8FdU5?#j(%&E_GC6T=cFuA0RZv`838wm6b*@ zWih+se72Xy)U{5r&;QvTSzedyXqW7t$enS`>yTkT`O^$`K5qn{0u^Ov;p3>q?_Y z3glHftyZ8HGiukP3fJ#6vhy9HyOZN6wsEL$POWU)faH94L z8bv3Ru0747C0(+UJ+ia7fGir<9~8vNk1E+oK(ww9vyhSh43XusQyN*GR@T!Y`T<+{ z>t$Az#ZQIez|8K_s16bq#R$D~%4!y+xiO)gs_^|(nOs%ES^w6GWKq2eI^7RF^4J<1 z7fl>eorD&mdMhL;R7*Y#et>9<>yNA-f|Cl@JdLcoM)m{KQ99)i>SQTZj5=)39~Xn# z*xVX}N`hVPp^I8U%=S3cG1}RF7Y}zM>&(?a9oBY&bbV(6=z8~!>Lk1)$Yni@D_X&K*J!7W_T;Z_ji#b#CAQIi(U5l;A`g{D)v;0_FVt10 zn31DZp3})rs$9`9do-@isAe(9eS2#pBP7QKs8^(7v=_nDL)1d2FiTXje=@GQjiR#} z*^gZ^T%d0J+#x##PI_b~Gz7VTYNHf0v&r|vQ7yGud(Gz%+t~NF#?-NO6B^)mql zavtHoP7q-hv#8O~F6xr9K0Da`5PE%fNX1XilB{(sDVZf-n;F}T|Ev~GTliJ3fMc4>!i6M#N0431sHhOlOK}?qF(b z?qqh=xHE^aIPH9mGvl#A!c4@6#&b7}V2U=(Vrn-?nOz$knL`^UGUqppWjvmo!c2T} z0y8&kIwJ}%Z;5P#=Z4lPH}T@Y`KP$Tk3omqAsF5);CxuLPOvz8fb#-09_mLt8w|tY z1OlC14JwlxQx-PJYk+ z>QVJ}N5@fP+8~M3^cnZWJ8pE1-#_85=J+cg%l(g@2#Q&dEZrWmt!yv3^clPT7em!A zF9inZk8U2R4Jh&*rW}uB)Toa&F2^QL>xf);_w$NV)6AYTs(yJ{6e3T%WJRy(2`GGg zVnVI*7kE<%u8XqzPf-=7D(-R{G3)m?C2opgcPLWV_1rx@o@pgE6vs}qy>KdwCHdS7 zRZPXD7aZla0enxsLqyR%)f+bs@%8on#EYlUhjlmgXg>Ee(rHTsh9Pj%j$7Hr@;U!Lx0=PD@-@W zBb`j!O#R7sU1E50IR>vT8rg?(*$I{GoLvu@I#Yd5;F>q=yvp@~ z)FJq9N%cEt8n#F6dcMo|$X35cw)%GP;D^QU5jY?7hqp1`6TD&fGvmi&p_TByipIt< z?lBb>r#WkU9mao|#MU=>RryC!q<`-%ABW8Ft)_uBs(!9fN~RnVpgVU@-hZ%btjp-E zbLA^pM^Vd+;>mjPa!>I}N##nFcxp%KeRU4_*VR?7(N!+%5KL86u9k>bDl1bw#f6f} z6mr@{&-K$9#PIx86e(VTNeM=!LtQ@7R8-=aBP5(aaDxV|)GcWM%fL(8G@JZcpPe^iCaq+RF@eWK@TIn)v zCFEME6BKJJmtm%&PFw`Wvdib=AL6%*S9qcX1O-i%x*BoeB?rrF#w7<#jOY|_Hzr=t z_7IQhnEg;_a`&;_-{);gv5KMqzqUL5~do#UMZYkbN4!wDS{-tuvnG_a_i|U)| zn@}Q}g(1n^$;s!lf9!R-<2?*>SL1Ppe`A_L1_JD|(wlhwvD=^ax&n%eCJ#Vlc*Yp_ zeDo0($TZ{M_~VJPD{GgX8@gif@>qRBS+I<{cJ?=7z@f^Ob30{n=`x_j`Qf?)?anwj3;zn=Q~tw` zr23*ser6i>{n4SH@P>66{7#UADNKg>exmj}(k$y(=AbJ$cKUSE6Pfz5-P_uiG>DdY z56`aO^Oq$a_4R>le~2zT<%^`qr>Ai3^opNDZTQQ7q%oHIbn)DiM}N^=FmnEYD-l;; z%9klCb(heH$=_W;SLrHUCFhqopOSD2?z0WX_(a$Qo zd2-n*hQ;p?oduB&(VIl-yk71f3V%ZzFtj)8-&$t7yx*I3yYJ0Z)Py}4HgesJsf&g&D zlvRBX!*9klTO``5L*e%gXLt$#*h3lrj89mSgMz_kMQoA7$l0q%OX0@fT!HPa8|K-P{G6V&#~aaZ9IuyXvrAffu_A>h+%j&TpDG3^sCAmai5GD z?v-6+gnE!r01e!}{HZQ=c;Afbv-Ltb?TM!+6o`C}v|Sa{2j{i)X6GPYAE_snHYpwZ z@B0=beDKD*-emY#z?P6RM6+2+;eV zj{C0JGx^PZ8S>v;!e06&qh`ZA;q{7Vw`^{}Jyow8LhG|O?^Rs(5xVaCF0(^9Us!&| z_}9ZzCVZh@8g9+(?~{}jUv!6g#XnlwqKk}i_4Y0`M#1Y<>Heirl4zl+XGDb0Uj$FJ zPu#XzJ96`fIe-1-hmt2gEL=4&S^Sf#Fnaz=g`mxHQ%eUU=c}HcRQiqLupK zfz|92aer|&26i&alPYx>!*wve$vpMi??%%`u#obVuE%>Yfg%f+w+;K&A5SV|B4sHb zqj@4s!R!)XvJBoHWA^uWEZ2%xXNxD(OFKLX!0@fqY2n^jy!?^_$ga>=rocz9XJrBG z<~qYz%vhbpLln)K3exB~W-B?(#XpQJJlW9e##GVY@nDWQK6Y{^3VtUsEmehwkN<~# zYK1|sX?{tHxGJevlvhyA2GySS_Ur(S#3O8rr>S=9ka@g#VG|EB?vxniu&eV>Dk05@w$loS38MJKXy_O|v<8Yl_Q5=A8DQq`D)J znWUORegf)wG5ARzmd5Ku-S{aFElb_!)!2%kX1Z6Mp~wP-0|5*4;}(xa%`*JrhPf7T z$>ZG%EQq1A_j1WILpVgAFFC}bErk}u4LSQciek~{+@)uYn#B2($63kngwm37rh`g{_ z-La)D#die2wX^Mx)#I9(9rKzYZt=*#{G8b(k)C5-e{wx1VmC~5Z&6AD>gVL9QpXaX zE|bvYa!y;)C0eCa>q@8ADVli0XUUHkT}MjtyTm}dL}>aJpv9&FZ5yG@CbSSj^8lLG zX^@bSjg+W-0qG)$-f2)-cq1j;P6_8y!dH<{a32z?#{jK)FwlCCaI(G}Xl*SO&4-l} zS2gE(UeLNWxy0=fAE{7(CCG0L|C#rt_@Uv&f9m;}=XqZ3dEVfe>-oymt_bPh{d7Kl zuee5PPG4^RztRaF*e<@!==zDaRrdq$ul}W%_5WA;y6coXF8$6(FKeZj_0o8g^m3Q< zGUJly?{Y=u65-(*qI;xKzQP7J)|Y)Vl^Tkza6ekAl~Kdpp-a- zo)%0#T{^i_*$_K?jgRPFiG#9Jnc?7@Tm1IyE=;>88f39seae@*ey{cD*0#P_&L8Tu zFj#N$t1|hunf%(-!L{n(-Rj_KQ*fPO%n|kQF7@yeri!D3FEg$Y(!X?wS2m_<%BSf{ zT}nrvH-VF|$Y9j@aJLD|L%5*@l@T`uV zCw#R_6evo-4V{zLAKt)Zk`i@DRl*FZsfu@yaQO4(uQTFDm1(*u3W?|i)sRs~MXxB+ zG!qefNi}3omFXzZYD?yCZ*xO>7fFdJ*ys@8oWbGfhU~TA#6Hki<_^yR`^E{IxnvLQ zYU2;$Sj!1@+CP@(TkYw2H`o|$EH8A%Esqjyqf_<)=hZrsqxqI;ys>Yoc^5ZghEc#d?ND`pSi+b7~%c z#nc{srFR;}=eM{PrM4Nf5lc3VuXZbK1zNDfd+m<}dWNdJ zk$!fwbG+{3#qMc(Jfp2kM~VF>6vsNkOTkHBzSaU#Pgs@4d)!S>3L>XVch@;& zwKeO3d*9LVovDMf9J{oOTt17cZ~ZL5uSg|+(8y@vt|f~Hmn8Gu7WnpbR~bww-}9#I zj@ZUGs~#KH$r~2jYHZ^`4$ml-Th4#Jhyk#ZzL^v`VPwPkQeN zH{W4a8tTP03A&=@H@V_|<*2i5;vI<-Y!f$o@0M44dbmkS3^8Si!>TdBW|e3R1Jj8&vb^<=9izrFN$U|qgMtkWe* zYe7%z@krndN1f!978(s8jrO=?TGYpzl9&#SO7@JfYSe#9QfbsWi$(=K9hF&|jNYND zASC=#)4F*&#~6M2(Tc7S@SBl38;!4tKdZUTqDJ1T^KocO@zBomT0h>b{jF7MH-o~n zK6a%fP*jO_sB!vkt2c1;EKZGI+pI%^nP^z9)G)V;mmF%HW!8!*WP4?3nl2KgUTE}t zeHj!n1By^O{a`o}A5&HmmZl*RFE#sd?XP5YTLra0=ew=#uVr=no;f~Tg*a<)-#=EJ zpwmq<7qlv4Ae0r0=#t}|(vg@^N%*!bGRfcJ^(t=jS4zE4mwb)XjlA5ObU{Wh(zg=Z2AQmCg*y|GhB)xsa%SM z@zb7x-xA&B0EPo;Gp70e$}w8JVOMdMWAMQRqP;DDGczgJpxiL0b7g6gJ~2h33tRrJ z%6(hvP?WKo;A8Nke9Xh&@!ssp=Y!_91XsWZP_PS%v}T)jv&=u$`^8X8`|b)Xq&^o- z)D+y4r1j1TwdlMtu!ZY$pU}6X87o+vE0PV~OAZVT6n)HAv^xR;B6eAM@o!jXKWX41H63m>oRmg1!WmzLaA5|Y zCQdkJ)C*SOnr7&IR&&C2jO2uC`Ez@(aBYq|eg1S5;+Tb77904dov7Jn;g(s2+yB@) zUwEN(M?I^KeOB>d=+Ka@T!ZSE5oT#n+EG#4$UjZ29}mryZDYDo(Qlk@x3pu!v(2LL znJSmsdc&~0R(YH`P#S&E+>#rF&+M=?>c+OG>pmK5nxt7KTC=@IW@(V4H;n97&eZ>K zFm){6S#w?8m5d0kt8*~ty@IRP7X?eP3&^mf|TgIe= z>6WhU=-pgbSFZ8j7^s*R={2;ejg$H1;2-_HO=CEjYd*2cJUXWZGRMaa@0EG<;)A>P zax%ZHuM9U=u%NA@mRr;@dfBMU%9%Qsx%E6x&AS=v*b##_qkHc|``xvIVT%+Cw3?$& za!S>Ye&64n>uws(`2_afII8ZwQ8IEw?~RzW-WzWOj_SSf!A|!#g-ex3dIoj*WBB-L z2m91z2`uZev)aQCePd)1M{!iX;n)n!o*0}FPG=$cCIx^x2hS1K> z5@UQZgtqX>KzPv|X4_tBx2|u^@%czDhcWaxjmO_PyjP@MHza2RXK@r9cmk#f4S|WN z3rdCtM8RKQ#O~%FS~(xO#HKqH-uI9NV$- z9=h+Oh zQet(>ZsAmZ0N2#d1#taX$G+FdjAfg8$@_9`KtL4gI%~#iC%h97pyh^0?F7z@<$uuq ziCgWG-Bs&7gV-*!d*+;xzq*a(h+p2u5%1aem$7iLYigLmaG>+fP0Hh8mcF@pLd3!S z?mKvUP1Y{IW^-8Q%D6u@?rlPsKiX5abQrg{&Me-dfwSL_rs%ioXtpPhg8Xi zDJutAhg5yS2USVKsy_}52u@>%)E-CFy*jlQZ0GhTrk&Zy>EW5#8?DtPt7IB)BUfFX zwpN$yQww{mOO{0AHYkRxE{#vGaT}!J)Zgf3tuBi$oRlp8wkzO;fYBJ_oEN0EDcI_^ zb0$ zjZe=-A+K+~^Hp|SZ47)Pjj}Y4tBmv0hu!Y)dZKiCOB*|`HVj7XQk90IcF6~etUgK(4Pej<8qu$|aS5E|2yJC-Y z?02gv3>&X|%&n9)S`na*zYb1R5c^5e9EuixE4m|zhB5uIw z7Ts4rpFc^lyvh65tjNs;A)DO+|Um(=}1s#zd#pm@V9B$K5q|Hgd#k*KyfhR-yL1S1ydm*g}rS=78F)3`7jkCa4r^oGejmdmk*$&ZB1><|eC zFX~#N)h_(jG642L*DXJ75AUdw5W==oEu~v4!`{8K;wMdLAKrhz}(^Fy{L*EIU5WH0S8l9TH2d-#QO(3 zw7_3vgS@_F)6tBtZ`EKD#9usr$6v`Q)x>E<7 z1&(v!B5;fezTKJ=-~~$X4iSvp+%@=Z=^6KCh_kR{UT0X(%trVru5pB?D@7Oxdfhp) z3NEAe3g3V~!KcZ2Ueq8^-nxib-F+93D-IB4eY6R$p>ZrznD-@NeG7Sf4R0srgZ%zX z#;Z^G3~9uEjSRg7b#=VH-yclnG98%vreiShXtI3_LYfQz7_Za0gYf7m!o5I*J|G-` zkd}|q>(;Iy|32ft#$f7TWs`3}M>bISKkz-{x51bh_WUjjbThE59LA&CD5IL+m8 z^s4~JXLig8yaz|oTH#LtekbCz=i&?w4!=DA0G!rAtpa?U4crBr%TRf}1h_v32V)Ze z&qBN%@Jt){Q-I^u3^NYv3Fg_r$$wBQ;^lz1*uZy!Ig)p}u&=y-2b}!(ECC!_+_roY zP*bUV4gqdkK81jjTs$b*R;~!Sna@_hZTUP6IPqD8%45rCnVY$O;1&bXSb3>Ja(;FQ zhODh{@@++YKyAzz8~BHSQ@xyo(-!|@3p}PD{BsLj-4Fhy1wOqW{2vzhUH#zSS>X5d zga2rOQ=PEo=OW-}0!#`{6p>Xf25t9I#Itbz$p-!?;Dmo1r!9V!1^#_M_y!C7r+)Bf zEbvSH;Lls&SNp+tSl}YGFWY?IvcO&X!9TFTJ^H~xmU#$u`Yk9DecVe_el~uMQnDV# ztE80iH~$WtO%%rdhqM0^+5ZUke=_?Y$^J*N|Dj47?@P17BL?#A^bB^-I}S6mpa9>a z7cHKfqUrzYi+#hTnHh>#LG1V1^qq40687?*h!hQWhBNaJY7Wd?hnm?AHS--h$$Zbu zf2di2(8!yY1M6ZZHzzBzC?_uyH1L5m>t(0^CX7Yd?5FhX=gcYDsfFa=s4!nwfEROF z{c%?m

        G*!_!o5W`1A#nb<;2r_5pbN-sz)%*K|E^zyF{b&D6I{#4B`2y@}QDTTIE zBzEv2zJ09prFdV657zS+rKDzLkSC%Po6RHbZc!VtDF0!6F^|u`S<;yWGgh+ORnH8Y z)IX23l|`9L3)t6=*S<)!yOS*KgV~=7tM!z;R5%yHYf5-ZvddPa`fA`uhg5`-0RS-SF_fZ)DA)a4$shRenwp3K{!C za%h$|($6QCZGK$h+Y{fsQ{uIno|}@8u=pDNnBO0#q@@;ST5FM=EgB>l+xBSNDcr^XqMn8J z)+9d^1Fn@Eqvp1^_`jy@*^}Vfx({&&SoaqXtdd=)?xS38Si=Tf_le>Ec-{Y(J84Sn zzX>X~onc#;*;u*WPCI6oICe~nYg%WY(cfZQq;ST?HP~kB0-Xt&7yUBf?2Bs>^~u6w zU|fS_-@>>KnmrT4*2b_~rS0{zXu&tEZ3Ev?pY02->H28-R39_LE@%I8J7b`^+_Irz zkFfnQxNmRw-(zW9Q==?P)%uzm1DBICA#TCeut)sb4wuI6{}y9o;2i(Qd)({llQlQ& zF@BT!I&gc#9`V~VIP6lg=MabOW$a%i#i!xE5%D|Wk7^F$k+@HBx=-($3A`}CMgouG zgh%lJOFpNOj}mb|n|vtljr)ZNG2gm#JVFoLr#PjjxCAHWbn`CZkHWL~!~AvLX@r=+ z&il%VdFLm{77^9m(@8`2GN}H;|5#kK(W6 zB>LNdmj@m`1b?ppwgq?;C;AkB1}A=bHTWa?YY|d9J<`$s{0EV)0luX8Bg29L@oD3V57+6hDR&=y`ufNc1}pQo21zNAgr7-G0EDk&cs(;;-Yx ztAo5+gqXI^TaR!s!YYKAH_p=|B)U3Fn1zt&YY`HC4d}N(kJ<1ib{}A~K%e4NeiTo{ zN$IB`q;wIM_;{ovJ!Yf4CIS|0BR9o^a1woQi`+9%J_^7*Y~-f694FBiAtd??LP~c* zVwQUW(p|xeg&s+-+!Q~76WQmrA;kQCUIRj+Q)da+BP4oN2#MZu&?C8G9hjYK04o4J zPELyF;-vIx2r1nHOMEWUk({w8p9cU-MmnzkQv6PwL|+9w(q|ybBN4D@;Boq;cmz(O zKNca;ABm9C`C8dEVZGD*%hv00AukmD1;n#H|xQ2bq-lusi< z%I6hJd>hgc-{&Dm17P(?$H_tQI-JDMdf*Y?e*-_{SFQ?poE#J{!%6g4Atd@m2q|4Q z(owzq9_jJ{OG7%Yo>F`sPSRHdLXtyn$>$#MGXyXvn|vrPA{g+l0GaZ+fROU(hW|aH zn}u}e06PW$dt5#g{|YCS*Di$k<<;U3r1I7yr1nvTkmwd$!hD28KN}&@p9lI6pq^Y3 zF*_FmHW&0MPVIr>$v7!}JVHu0%@U75Ix0^s(oF#jKJ%>QOYyNdiGBd^s65rsUogRd z$CWR|J#i9!8A75jAsmG8W5>!p59vs-OAftqQ~Z0pf5iLWyiSCO=Cxb!tAW2CuofG9 zitoaS_r`hKEclxcdLxeanD3B}kl_2#P5>)HI*OD06wk$pS4nvp2&r5bAS8ZgSwgfg zmhUMDiEnJ#@y6^s?3}Q-JSlz_C(%EFkm!Glkkai(I;uAnNOushJxIsZBZ}|FiEU-` zUO`CdpRt7W$ve?mi;(E#gU(0bbGn4txeBnwphIzzkK(AO?+k;y&*T1b#M5w};&h+l z3vu5K@jv5!0pjy;pW<|%;&X9Q{&ymzeB&+gDM&}A3Qtco8RXcSMFR0*c_ze^gwYuH?ZlVEg_x{*z}_jQu+X---PswAy+WL zke=cs7sWksQob^Tl&{1R$3iGpt{kMJH3*mSNiioE#V>#W(eGx=a;*T~IlxWA`9qC98*zr3*1FQwF&Gv5mz z(YLtYfcPfd=js*3t8o$?J@BX={S3Scz}5hdt5*~+#(kLR);f+-+y`eM7^8lLe1p-r zM}4nq0oESj+7&yY&_U}|P~7aX3HQ0{dvL*BKW2jyjkFy60~>rA|2R16p7nYoj0Fz< zAleRht+b(e!G>moOkosFZ`~Zx+3p@{|f(`=GP+EzVBeJJMU@x%KSRq-p-ql0h7A< z`&E##d0AselKyW^u0=7whhi)*qKF{7Y$qi>dr3+boElt*+iRv&|BEKs2g>q)(WIz- zmIpEw{onIG==Np!@0m`&wtd)tn|dvty;rk0!Lqy~M%%NjKpUtF*K1ymTGsf`3m0g? zrUfs0IJF?d%*KtUuk9-@^k4lx^*Y(u?M?pUv;PBS?*Etd5cZk7Ne?mLH*of;+f)Co zzUa13**@R5{stH}4gBMVMJjra&`FUKCxu2RCxzShj~f=LoE*WTTm9o|3YMm0apes1 zud@^+*~6Y++#c9#jKXZ&6w|exBmM!*sln!<5T+7)!p>xmf%wJU0b7gGlP#rzp-FZd zj9EPebfl!9wWp`#Wfo=U!$lP0te+(FP5e{(qX?VKrm7VVGtzokXcT7V7G!1>63xE; zXlXtL&k;;LjAlyLo?(^)Y;mG+d}O2+rLuJU)7SwT!MM|8p+O%8^ka#mQTVV9YbL=- ze;S8C13#wALPG@_R4zDd_(;bh8ggc3KKhqOCkV_yq7$HDd)O(DoaL!_!obm=k099N zcy?guosDfe7TNM=Dbw`a)WSl0vP6Og$r5j&kz`jER<|q-Qf_})XwDMv5tt&o+__&J z^FU>w@=#!6fcTd{f!FFbEvE>s%0QkyQc`Bky6-Ma1c3rH8fRl37c_{Lz2j#7n>+9^ zLN*c}f$!z((_r<&+5+T-tABY!qODWij;9C1zK2acy|E8y6=+cYvp~aEpD1eUF#=a+ zf|Q#X5A)~D|Ht0Dz(rN9eZYH|VP?=_81E<-2Sh~$94;av)C?fP$;+fvm==SALV_Y7 zg572q5G?B;no(JS(aFpT&CJSb0FRP-49#O^H!wBzH6yaJjz_-#voABlFk^PU&inno z_t*ZhS!?~*v!3;=%iep)LLk4vcp!Cuz^mKlMn!zxM-Jg|*#zEFUyjTXTrb@IsHa`(CT$d*^GkJwJc- z0kKHWyefI@)gQ+^sO=8X)evW&2%L!t2;HXrbc|)sTb*=&QdyD@I8S|YUfeJ+2Yiig z60jY9fZ7-}6LNpMGGNTBTh@yL8rF+n`NxG9yk}qeX@z*bBmfM4OasfR`7+p_bK84< zezAwiaSNVzRNJl4N{RmvzDrBNj~blJ1RB9__(Tt}8FC!Z#AXN%=u!*|K+7%j&_%Ox%dx4960kg0evxvP0<8Tk&<;YaP#CeHp_j`=_?MS}S7hM0;`q z(%ip)L8=NMX2c0S?#X^{XuFRP^Dejvi`m{S1*5SjM+K{Vp!r~cgtdyPElY|>o{;PT z+zWV&jtM4fiF4MVUvN~`0V}kOtscF$yG1P}K1RMLHGEHYU8lOgWf_NwmGL|{jbB!m z^y*0s-;<}1w;_OImE?NzC|ml7we*LOcw0UD;(21gW!#9J`2r)S^4z$+&C2h#%I^Tb zF|jlXz4tQ8FJpU;7&%Lms7>1LtcWu772@Et^~g!O$`~K78;Ev(abb+8USIF6GrU+g zt$UUe*4;4=-g8y*C^7CnaGj0=;y~AS%lR5s58!Gb?H)Pmbc{dhuT_!lsC59-G9%B1jn_e(o+r7sj-Qk}9Jo1yb(&gGdog;t=o>b`w?4|B(|?9u{!_>!HaE-EX6pFTDF^@o~xJVzJVQ7>j? z({)T;kO3;re3nVEAU7+1^nD=REK=W*mK+)rAar7C5|fr2GACqK$elvx0OEU$?WQzs z;HGPcf5yPv+C!Uq}gxw#MWDs8!Z&!;V7bEXRe3j1thLf0X> zDpB|2maX+VG>VuD-pj1@dCu@J6HOqbrs@IAWn6=W2fiOw*y~`kgoZNGW5K80V4Fx zses|RHIwTg7X^%-Wj@KvQQy-#wG!By2x+6X5>9n3!M_#QE3nsKe;xY=*y-8yY3%fX zTE>@y3idl_1Z@9Y;c+~7WVgKt>G%;gdk)Y#tjDPD5`G5DzJp)h>=^Mkr|0Flqd>{z(DHEewIP+c!U2bkw4kbHpI?ymTz>G zoLER)7e5!^2jYi=Cf`%qkudnnOn)?_qrvl3fbV&cpN$BWEJrKkvQi^>ORI|dbml^T zkf`p@^h5K{bo!ld@ZE3n{}Mf*^}X24xj^nK(uchLp0HszQv5x2$xlti$&p zY|!~1%k*W+(GY+5bw1zV3CGDTCjX0|gvsvmwBeQW=O} zf!vQ?suLSA4eHQ={7Cg7e!ZCK56ahboqmT+)Yy}qeyGLT(rE8;CWLv@nU*I$UU0O6NS=*oddWk$+-~SnYy%#vr&m6J#l-Ap=DX;CRuW3dRy{t!_@sU5z zV??0*Clly@!~|OX%o%nr;Z0S{rG9_%Vypk;#jYw*5#2ehg$(9NO)@N3rZCk+fCOT3 zp26I4Ewsh|9F{Hy|1X=_E3b)I5zbpzK?ZY!#Nw9bQ|-<)c`k3|E{GP9S~RGB0EiU2 z!Ak{pIg9d_b~po6f|?2(RcG3z;FJBShT{1eukY1fAU}0RD_KMApDY1Fq7SGr8^s`L zjRE%pI9sjclB!F3;yeSZ5jg3-22Cw=64fd3(^)T_EHCE`Xh0ca!P6@(9lya&3l3Qj z+vQu7Alo{}sECBLMtRwABUV{c?D52@VAO^EER%zsJq+VPg^{IY@!Anl5_#uni$;=?| zg{l;T+!mJWy$4l@pV9<9qA{fmomQvSJodv3Vh0^OQ`MO3CYqKuNoV|R>_ZM9gmZraVGS)Rw9$bH2ztskh5U74LzT3W64I2|*crFZOEyZM{v zYc!e~X2@ht{jKYNxYj>#W>3YMDp~(`Vp0XM4+m^M`@B9}56nC^`1Y1FJt^)< zJ>@AM-`ddG*=g3!s%0gI4b|3OZ~J9zV_aOELNP;Mp)l06#d8H(+)|F++7K9!*_>H1 za3?s1NF8W{f!zOpC(HE4p|?KW5_w6|-vt7*aP3 zWUg$GsTP-($^#n~FzPLX8TAW!jJoj(qkb`@OVipa9yBRi%EZ4YWu|58Du?^~|E+qw zSlTvzsZ{=oQY;oX-cc?)Jz^Bo_KHfJA@-7#)LL6U@pi8P0htElzKa@7v^HxLQzWU^ zOW$}ylrZ5y;(=D}0gL$MC+f{7w|%ea>gv*HmsOUQdY7vA1jZ?977UR3SHGt45_@Ic zC4J*{QOktZ)=!uVj}2h<-L>ZZ*G1hE#FkGO(Q_;h-t`Jil6y!>X{ow7q0aLmPgSQ@ z8z7ZR{m*MW{DZ$A%F&Uw4cISd?%q3%hVFs-6(fQ)5zi$|s{Z&Y@tfuxF0bx=fhuT$P<%>G^us^E^k)*EBl96hr1a=mUF`! zzGcZeMtyibJNsS=3PcB`6g|$olg!SW>RQIEt*P&5wco@mpW{eQSIkU0er@&{d9bJN z=y4+%e}8|pgftCjm}RcG z^PimRmny2g^|$|8@btyikFhrNjDi8mqerRss-@g9IxZkkniLmT@U%ZiZuouD>&LN)QnA&U$KLr16Sp$pp;ix-K56wLp}e11)*6%Ta|%V`)~U>bU|W7tETe*1KO z`#Xo>76yL#V>ynutDN>MyKyXCck6sO^p`ZAIWt0yVf$XCLy>zA-Jh|;!Kt)4F&>o4ZDL}Mzvf1K>NT*6 zn4w}Vt&dz7_K<0Cf@x@i$z&0Ic95X%r$|dnFyQ6 zc#vvO0aa{;*+oON=8UWEcL%#KsCSRPTA5KQTcNL7akWyQR;?-kla#@{f+e)1J1L-% zN|Avt7K^izx~d^dy83^h?f;^&|1OL4gRcJHsg)Ns$`9I!^ZUHk>lelgyzgJLguWL* zzT4FwgjQET2&w|%l-Go3b1GqdNbS7QZh$hk^PE^q~)B5~=Sok^h}hmn_Pk z+Lg=LhG5YKLd;H11;Jw>^*!jTq+E2c?yz|=V*Wdjj`1?oF0^3GM=m-FTG;R9o+9T_10+-xT#9FKc}ki-TJsGzE;f`kplDN-&>>Q zE7mJ;-2S+9&YSSS)-q7d7fEqSJ!2;*4!|y zmJzglTQxwDvmO;uT^40<(mAc?nql~8kG(N$kR^?k`Y1HDR)Lh+<0pGBw&`zwrNFGQ z(|^L<)4$o**Z}LXb)3<KF56NwGtH6ydcJ5no-(sy({;N3+lkBwwQa z>0{|%RZ5GVjG>;{f8J8Dn8=jnowM8dO{|y3(|43rAd78L(8vb(~Me1 zWTZxP3QojW+w$!#qRMyieF_S3L#uc1^c7 zP#y0X66L+XPGGxq=r~1=&Ahe+;@gHuqiyExd);(an)sN_yxLDK5tX``f_dtT2{Y!F zl6i%b>$?qC*9YkZ^S_|n$@Fh0%v0O z{A5sVuxWVNcfso#OX|R2et^^k%Gct&EkPcGh5nD1Jvm;HUn}XyPuI2=&5tUj{;Bu| zjqBdD6U{^VCvFZhxv>YM_DkvDZJMzcg34OgrlhPdEEj4Z2 zcLG`}1jf`;GVfSCgr*d2nxuaJw&-PQdg8*G213-AM*3c2Bo+W_?2JYA;g8}2en$E_ zl5HQTS-*eC&@5Ilc$8rz5hgL{7cWH_<5rJ2`%;IYx}wLF;H70Bzwibp>6_YN44Z-+ z3|98bHuRSHRnLeYKo;`Z4GgZ2mV2KUGYbB(4{@SCJh;s=k}+rmA@9J)UNlO7Wf(I$ zgWW8u+)0%hd}rZ}FDJNdP0FQl)uL3!ViXYd4qd(GOE*S~PipbK2g-tzG{}yVbTv3h zD*}T};2}*IS2ZWN&TZUNZi@Oh1{i_35i{v#xABeTMm690%=PYk#kaij{kseR8}e#_iP{*U45gQZ5=GE9!{f+tt;gm-!tRjfi8T zRpT}%_;S(dYK9YBq29--scRmt=AcgL@(xZ)=CiB$N*C%$^sD@yQ#T#g$Kiag-*FQk z1=`F<511O8IgOV@Be(L=E2fd#`DnY&uZfSIG5PP}qt`^id-!Ng!Z-^btxp)=#z%eI zc*|uY8byA*0pm6%@X@OA+slQh&)#Msic$0D8|;7HBt$bW2}ea%DEijKN2iChwXo6hd~t35$=dwqp7{35C%zrI>DzlZ<=1b@@7$DM zZVH`M{cZcBug-luf5`g$wH5gvn!bHveW=bD+H4LLRfaaN32iop>P(?Jw;@}JkoA)& zKhGyVIB@otxYXmX2I+54ikdrOid#VH!nrZyZ~r)C+@TM5KGfO$^Pafp$F41IIy8v# z##&VGGRMy(?Mq+=HuTq@**xn)_pX111Xc}T$}Of7<8xvfw+-=>-Lbo|v*49~M)?-J zx@Aq`Yj^&$p#9B5Bb0kr-}8dU{LQM*8isB07S;C~yv{FCG%sTC#?VC5yvV_u<43I< zzMosrcSN3J)7mrJTjrZt^!HziITkhN2COg*R}cvoda zRd<(fXlUzKg{z0{YVTnN9G#JSMqUxL*6-!5BX;fn$GDACHdcL;v-Mhh*hk-_zV(ae zU*7%r%F?GFUvu!Que%?3F6iPr`?lQs&wKW_9$K{eDaF&@e6uLlCvDTAuL|{`34Y?- z#TUQG{dLmJ>HUAW(!Jn7*t;JU?|SW${|6uD{ygs`{~^JJvtBALJN4ku9gQJl5B*ws zh;&|7ymjcz&gn@Z67_)l6_Tcq$D0n^I?bq6NM6V{C|>$BJEHo!bp4^PC%>&IfB3+6 zB|cdX9ny70y?xi54Z6-LTmLd?cR@hyyn|UE*FMTzNEtO<9h92auPWy_bK0o!o9Q`K zDgXHB@szJA@mM$|PSgcz)zY2K7QZh#ROk9nKltgHwZ5jBpdFtjJ#EanZ@`*%iT4Ik zX6)S~rceD>oYp!srpG_3p5r5O3vd5x^8Ksdxo3CPr|%WN^H*_8aa6ySul@FxcAq=? z%JhVois6a1)p!2#eA@td>cDsJcqrFx%gfWe%hyF~qgC?Ur+TQe#z6-8oMX#o&wlIB zPnvhfZu#tkAG*^w4n6wqSHJF!8~WnEPTl_VmEw2vyxzF~LhQGI82VG&#i+e4}O znM<Y53{cshwyJ7Ti@6XfurY@d6|VF%a&*0g|;lbS5}x?U|-Sn%)*6K zRpRozJWiE;ZX&(bt;XA6cvHPNH@oPMWg3S2X%|$p6B8#)P^Ts6bl@WXXyQ6`-20kx zEGFbFANL<6_lgDZwWhp4c|p_KA^AvQ9;J;`9MK-ejl`(d4)0?Mb5T;HLOJjsni(HP zCe|Nj4y&Rf6^Ez)Lla`q{zFrt^VUZy42*Q+I?0&eQPI)wMnAcG^3K@Z5yK*PH@)%p z?W%1%!$LmZ-HXUL24nm(mZkKLasPgWc%{N9Tb*7|mlzK^>ZZgg?XBhKeD^na;@3N9 zw(;V|`2fE!oBf!hSfkQxzW|wvvEoJhEGY>pMO_2v?W%($&BkG;&D~iBkkh1s4K8(XqFVo)0<1Tq zzyxYg1+=NvsE}6X^QD&ayA|f6`NR9YKzeD*R5Q#4R6IyBi>;5ocK~nlXswrfuwFXt z4&TZL^*crG@;S+W_t!3|d{8S+^vkJ{9^{r(l9q06Id)%@^e_j3%{7W!w~1sc475md z8*p+{ir)O~odZ{%+~lkOO3s`;wJH4e*8zw=TQ*w6auC0PdIO1rIAYxtM45`6As?GVCBiAnUWMi+zkU(}mhr_N9v5&4gif1~n( zSPh9CCb9D*_9KbiPh#;THWFerB-T!1mq_d?iT#_z9wxC{Ni2x84TP9#EyULCgILN! zh>Z@1*ai|yC9%<@jl}dMww=V%Ni3Aao+Po`NNfyg8$`B|*kKaOA+bp$_6&*5B(bri zjl|kX>=KEUl2|;6Jx^k@Ni2l44JF$iCENZEu{ILR-jS&mYwDvFxC3>3O{cXDwSRI>oBy|OAXq5?-Pt-tLGaA#NQVC?n(5mF!>sreJezM6*|8Pli!|J zzdd6A3Y~w2$-ko6zd|&!LN{`cdE}nfkrnv8qYJjQ2JaP*+m|?QpLyKA)^Qc0@p}@- zSD41{X&ql7noyyeP+^)-(LBK@3Nh+JjHVFKp6wBb?nw-7Gl#adhVBuE<&~ad6v3;Q zN{ze{)S;TTN=qUdtE|qkzO8TDK>wT5<1C_J`j~^N7X_fSAwbvOus#SZPQ%S#Jq~{swg{FpJ zb6NdmonN%#s!CeelxeBbz@bp&fYV*qT7nNJHSYVN{|lNy;lps=YMHU`2Npd3_aFK< zXa?O5u%c!7TT}D2l7$*(U);LTX!W)ABZn1VY7z}lh_yQ+G$1f?mozgIH;)D%*m*bb zfjzB`S!|fDSVyqm!lYZupN)wM3=9Ob5ECeF8YEkiq|G{MljEuJc***EG^k*Ne3ZWduMX{C{RxYMtU0uh$}&ssh9bL&q}Jk z>NahSPx)YQl&wji(~bnE9lvE2xc+by7idmI%o{;MU)?OJ8B zq92;7^<_$RcyEYNucA@T?XrXqd5Cupsj2`mtznyKICs^-(s3ZeyOOiJvho2jLtYi8^lEJ~H-b1dKl#?Y3-M~axHK6_7xOJZDjXDhm zb*qYbLvrA`&@by}9Fz<`h|Zx7xYRJy&42hZ`4I_5vnHs1RhhSsR&VZb`^qm`T^{dk zoaa_~&0uK%kUfi2Bd=@aZTCv|SL;rLgzK97NV%zYkH;5>T2C_NzLH@onk_1^=5y_4 z8HOVGHVj34{h-+4;hLf7u445Q!#t7|1JQ{Vzl70yDr4WSyc1lc)ahl+5D=yk-*Ja7 z?P3;&b}%cJQrYevceL`Zno5xHvYj&L?G1OeA(ensjcg7$Qy&MjGUGpE^z6qwS~_P4 zCFhL(rSg_vD$}8g8#etkP{gsrrhnp=d0-4J52zx>P!>uba%<+V!kh`Xqonbv(dlhj z{`;k>f@U)qYaLM+0Bej&EogJ2*};=c%e4B1xJ&?EFbgWwq3pel9bQ$sAJt zN@YiUKxt}>Pph;-rLcsEBK6@ls?I@&s!co4Y4xqI?)4atA?%MKjQzY{Y-5WxH6-IT?}WCFlw5^?`wO2%Y)l~V4uIwfl7&s#)dU_c$MyHVW+>mIs&3vS z@^cFZCly_kzYIV{iE)x&nzCzTkUXA<+NJkvV(EHFTc#S7(hxv4!`vV2Q-+o;>}FTy-)+C6o_;6| z+n%-7GnlDRxGl7^E3sD{^u9La?dp(x=hu8&%cnR$R2Ucy3DYe^Y7+u>TcPGScv$YP zlyw95RE#&>xnXGO%B80CeM9Sp9geyI`HDMB; z)+3~iLbzNZ|ANe|2;rZQ<wD{yVlA|pTdF1D1BHm4(fRJABVASwE1DxLH zxEnaNlW^kVdI2~fW-E7o7;FK@a>jm5k=_3H?2C9Jj1E=ryJ_kP34xhy9?*?wKKMpudVy*&5 z)T(D1ug49QTlK)s1;EEZ&Kvk>JNa_pBaw~=uI6!yGyo4k`X1nPOp=|1w*Vi7^uxf> zy;l4z@Uck4*BTRShbu6KYNQVVCw+pR5a5))1l(T#OyKnGD{V9mBridSuLVwidk7mY z;3#_%IQ1J11(g%zzXJ}RM~n_Tm1A+pD=;}op5~Li{3zfgzXH3xycRgww+_2tzXa!@ zmB4B3{wnqn*aiLX11J3lu-ohZCvejLId*&f-N0#Ff5r~AtR9+RSAoM^=3m%_ac3tU zCix^_A`#AocJh;elYA6#d--_aWDohMvbQGX59V?DuI4r1 zG@mxu=^{k4L%?xX=$0;2FT_cz+hSaJwE!391KIfuaI)tU;P&>s z!QlzjI#FfU-S5I2mD_=KG6XmgifS-r#avgcznJCPS2f5euV=*pU0~l@FE_6 z)&YMMco_7&0em7tp+Dc|=0p2_3n7t~%)8IRXG;KYrmfjwJ+hugKc890^y6gYjaCd|*Pz-bHLX97T;0$oe7v{ql;M6buWw!MI$u9v2Rg9lKj&ruK32PS$NuRI@ zcq8yA0YoU^|8;rTNOlXGQ15!+blw#<0sn8?^9-&Z&g?l2{Ex85mHs~p|GoXQ8s~AE zcf$5t{rnN+oz0&BoKI<93Y(zE6~55LxVzHt3U}4s-z)D*k1PE5>USmYvVUA0r>^w; zQFi`OdR*D*s=c4!{2m}o9)x5EZU0wsSN-4$kHx{|?EJGDI8IIMM%=EWaec&Z-Ldn4 z%ue`AV#dsAX(<_Z>gHt3(#@Qf!9sJV&6t*$HhWISoN39^=1iNFIBhPM(OWhw+@*9_ zgcIFik*?*V*sR1Ey18>Rg5dhHub%^(z>L(nX&H0x(35#2?X0RvuB+l$T=AeSY_gSh z_U2tHuuQNq&Z?Z^y2@}3o0m%6?7VehyvqVsPUr@~nSu>un{GEM&KnM&^d5 z*!gr|n;Xsz+|86pP5SMYIylq#?E+Sh53H!;B;=-!vpE|UK8f>6mYrWvT$Zs2Zb!2P z6*^lda}QM63=Xs%366C|3&puZCT*U6T81c(n}I^ zsL5*RjSmWFnKjq0C05H>8^gjU3;OIV4-0oXk;A!}?4Tino5NO=?WC{>ZmKz=P7nVG zZW>u-Im;rr@w1}5UhV+4qP%Rh(1Af2sk7#$>2PXdPhhV4yLY2`)lR!2!f97TIPHo^ zr(F^0v@0SVx`Jy+q(fJ5mPI;r1ur|vNuzNlN!2CHz=_%Aw9wC)t>;eay0o-8+#Gel z!Xmi|-3R8ns1MBbQ6HG=Bu6-k>!m(0*G+w3uAlnATu1eRqilV`=CLP6XI&x4amVJ3 zkG2`QglRMQqd17=)`nM{g5139!Z3Jm$r4R)?trJS2cmnHv%V0EmdpibCI~U%Q%7|3 zml*rPbIAu`L~ovN_H@WHeRIBjGBP-7XRE{340uU)bjE5=8!n>POxQBL6$=EPwz7N$ zc#NNm2ld5^V=@+!HzqJ%mbz*X@0aNwSNZ(KB{k`{B*(%^wZ{(Gg*T|M~T**5$R`9>-{4F`>7J~%PwZ%L! zAkPyBcEJDO2LN9fOo`4q48)19s}I+3nKxWWbFRxAI*wexa%F|y7JeJ>_1U_!*RO-# z9cpy~`+GVx{D$);JmMyr#2>G8I0_VvkvCr~HR)z#dmqj>QNnuUIv+@)mAt`7PU2^@ z-7gDH94l7qid|Tc+m8{qBI|u#usYUtbz-nCgSmBLIOcKh$;Yk~dn=`r4SCw_qce{y zdow>*9A+Wwc$Y73Yp2UKmDNUThd4b&ur0AoYwkCU(+1*Kj0@bw(HJfqj@Az3e@B4U zw08&cKMjPrZk6Y87pKPv;rwWo=k*Jd$BOfMgtL5>=^d^YBK!0XFF&boFWmTd4&M(BzYeU&0e_k8a|Adqh95(& zGK7wGs3sw@*ftwIA6mm%oj8G49xNc^LDZ z((A{Olj{mO({_Gc;Z}&feoC>wJ8*`|wEAhM8oV;495L+F%-NbmWu2O>nvGSb%gI@+nREl%9co6gZ+{A-5IJaFgOl!MN>e_i$72tK9&psXT@QRUw2iSKU+7m#??pcK6Z&VzKBRXe zU+6bV??gWJ!!qQ*gY;|27y5QJTt88sBNN`lBIt0r<<1ivy;C9HmK) z(jnMMe;`8A?~9P^QlQ*P$hDx{KwwgoqcoMH^fhp)QGW-4vy@(L!}}%H{-^YLK0gNe zm+a_>NnH~@;F&jM^WVygENrV@?s50L8yb`C=?j5noEV<-J5 z5t9C62&r5P%F*~L&@XMk_M)6H-jv>no$T9&a16qS5RO8ag>rN}9h=AOxDS{C<%Hvl z(hHDJ$9E3&<{+JpeBpSfbQTBc}UMfKBciWQ2G|^G#(LBLH%E%*)ElAy4zf2zdoCM6L6N()6y0 z8(?}SOd*w{kn$)*c{ZdfD2;#(gAn4;p9J+YYIG~}58;{7K@I>wmf^?aDZhe-(W9+!mX6Q;E!gb#!HkmeQPG_NT17#48z+Gd$kG4;zbBd4Sy3MTO;}r3<{m@Hs^39EFEgL_KIGqCszk>J^e4PAJ z=ksy$O}!R|EAcQ^4O5B3REc-|i02~!dc0sa`L4bj`$)*rwJ?;A({+!oPlVI8A(W5P z_4IQ-PUl{lv!us@{XN9-$8Hn~aq3?oE<;%%PVX}d@hrRe&j1DdtX=#KyR!9m@#A*! z{dV!kV3VMSmI*@qpLROGu#4N1l-=M4BE$WTbNuJ_RW@0x@*9fxZn(2w)=oOXso2f^3=r(I z^{LBW4EAG}SyZ-cQHCR(BR8Tn0JsgaXem9g5NI8H-GlBkymL8Dr9A#OMSfOZ?lSN; zu)}x5+iKR^JvSq4cf$(JW`C??=P%68%F50P%U__kVh~hNrl*f0o1W zH}h}C0-nI&=ARlczj=e&m4sbm?{Ot#y$$Y4K)7S?D&Ka?-latEJ9w^5=|drM&&_nG z)qtB4?rjU>^qVN5@4znAANd`ft9l$tgx&s)m!qT=2pZ_xdp^1QXjVNrwiFon2W zusdBtX}cMox63#O3p{V1>%i|o1tpA;0^0a_FFeXXx;M`om46d*zv6mizu{6~-FO`? zdEOc!tcG+G8bIZOrg7g2pjkpw1Uszv54bxL)+!kK4N2F!c3wvoufrx`ZA+2xoWW7Y zCFsCqi~VMW>}Z4zG>jo;f9dI@lUxApE1?zG9@!R|B1E<(q>DErfI>u|{xmx6{gK}Q-EnN;^B^v7U3 zdnjt(7H3>>SD}OY1J1r!9qW>v&5s*%#WC*qZ8sUm94&4g>KBr~#T943v7Q6rJRGmC zb#P-#ek+`D#kD~Pb?0&DaM-N#V>B|j1lRG@Z{FB9qTTe3(8=i-SAbXsTY26nPCJH- z{eDb%7ZJ&u-i&W92e*}tXNq{rtguTEmXD>uC-n3cF261pDmceUMNtfg*GQLn`GjOgh3c~Xx%+7ZFB%1vbX_Aava zjYHdeejbDNb}?jwz!m2Qt~hnFd((U88P6`TjQzy6l~}?CBpv;h>AyC|WUwGCuwx4A z#SP|^7Hrn?#N`ELeaOLxVD_$@>}5&Imu1H?{QEh=WtPdxEL@eljCbn7Wb{rJEy`TB zEW411$GEj-EJIK#9@0Qha`ocu;zc>?-q~uroU<}pVD{?Wn6&%(_h^N- z^No&AO-&W(w0f5av!@PosEE5n5lL8nW-)lgv_gB@aBb^>-4l3#(o1o`qbt~r()maW z`2aJgt$V1DL(%L@Zj1M_p2v0-6$NiI3>2~2&E{mzzbx)rw4 zHH6}{(|KPw_tW)>t__YG-G87Vq%o$lQxKmG;CsYB21eyc7hNOo0X_&iNS?~k*^=@m zP&w?hQ5C|8mFleE>*VjzvcKVJF3@JrW2L2Q1+awQ!DF=*{r}(Ov04f{|KzdK+IYDB z9naGv+uEZ(3L~(l)WA}*T zH=5&i>88NT_^w3q_Pr+&9>=Ftn5Qr-4@jeVD%^FW6j(WSCC0RiV{K$2e^PR=H;ES13_M4itPRr z#H*s~s!D5Qt69ptK16J7@EsoDyU*kYIyR8U9W(izGQexN-^olH9h)3ncx524GqOy7 zDWK%z$n2^L)D9<*!*EsBK&m=A{f;#g1KpVh&x3GU-{8lruBn2Dbpy+Y2Txe!f*p*0 zrC_pSJ+J4O3k_ApIaSdRD5#1C0>|3`sYXf(ZE#)4!(LK zl54k;=5YLdWhqrf1uQ9HJ2Cy;kc^MKt%>|QSaA23Y}9} zCo_1qW%_rRJWp8s4t9dR(DQ`RzrDf#l+G8Hd};DMNLl`9<~c@vkzB$Nsh?A>!0OdR zl4vd~l@+nXizTI~#X49<&x!%ep*6dwaC0fh;1;#e7es+)8i+CQWWdN%TK_K_{6D7} zLCfe1-~7iA2Vq};KRnzztx;Zxi6Mu-HX2s+Qn3NVf*^2&Lw#$#Ot~Lu1Tj(_#3xA1 zkI+e@7U0{~d&tDDXNb%QJN*xeynlo65p-tg!v;?8o%R zC?)&ZhS*uo7XOnUtY2T%Xhg2t(`%m%Yz)8dp-~+LDULQ|Eu#$^C)R4liL?p-BD#SiFSf4NB)XJJWt%XvM-s?o{O6HN!oj-f#IoX zfN^}aXM4Iw?AGmau~+e(6;-0YygQ4f*x7X^P#c>t{po#wE4VkXR`rq&R6F8Vha{{E zU1~gaPF}vS+7r}Edk1{3WwM{htY2z8|2O8GT-%^nC>B@T^|%RJm5e#&Gm5ExT?Lw> z2hZFkH=0aJx5oG9z~Rjmk7MdTxn%zLxnwjTcd4(OV{yORUmso}?C#P*yOjQP!MfJ3BATs3i6+}q0 zOW$vgwtrq%{|~y9r|XqpclG~PPpil)HC|nMWu8X)gVw7Xba@5J53q#SdcoUdr$zZg zQ~9rz8R|-XeWl(YrmnN{;(+lOOPlngq`XnpZ zo{l@7ee&!NPwu^3^5ofxWnX+7cIcalPfb|-%G-w5|26;phyH%=51(AQ=gGewniyOZ z?Df&nwx2gYSNzOZul=Ny*Ohk;sZ}#ZoZZ0_GxJk*dxDKcCVJ~50V8d>l`YZo9W@I4 z*vHKbi?Vvywngn#L2^b-g-f*GH+d$62AOf&5lQWS#;dkzU`NA!#^i*UW4pwGo-K+s zo9OL1{4vHhks5E(Sd{X3#U$^013mh&H%XXxWGPJ*bt#`IPKuuO3X-+X4AOCg98KbPMuM?pvrXIagbjX*DeHMk4@T!Pr?6#K zg5UUx7DrP6&|Zg7~eSU=_${tbwiFPv?n(HsyJxu&2jRAXiSfih&Pw00s*MeYV0_)BX4+2JNrvyaADcumTM5re;GBo>IM zu@isEJ?0mDjqFnk2_fEr|6E$Xxfg#)sakB`3cA;6@iB}Shtk32PfWaT4cHj>&m0t_4XbIjJ82n0ka1AIzWbgRE%WiqS zG1Qp7LNdZzXnny z#W55Wea(DMpVi7fs~z-Nt@yKX!{?VX^UDX%FBi=(A2Ppu*!*(0 z`Q_62 z)}%DGpR8-2&|F@=Fkzy3#);djw|?(8E^w$@P4&v_qUw;wvb8A*o7bcjd#>w@dUuBO z=vV5Zr*26$pU8guvmc*3bm&rH>AliVTQ991o(A%j7vFwOXQh_7`^mG*KDj?^;v0uL z%Z5k2bm-&Dk!{yDz13Rmw^b4}G)Qi4Sy!W0j29=AYuXN1FZijNZK@$kdF*o3zn}iw z3zcQ7%Pv3Q^;Os2$L}e5{zA?@pTn)#5 z*TyJ@tgNlUkKBX42V0Axy5nCO`^7n~_RG(0^}F+fvs)UsK3hUT%DuZ^`sTu0^EX}^ zG(cLJRv{js3iiuXrKH68iq_WF{^f@iCvhozJvVmsU!HvFizR;H<03~^eUUo(y$8Y$ ztvs{KG+Te)KMrL6yfJL{yC1!?>zV7%9Xkt(j_Gr}HxC%HMs)Ynr$)?w=9%N44L&|( z)22^`dEfEG9cd?q-ZgB&=FffadG-sxKRF-%4|6`O#yR*;&WG%h>^xmTL0-0c#*8~> zs!KQ`3pMwtyE+(eX)Ie38m`f3!otJDq9%n+8h3M?4_?8bcz6+<57(OIEu;F4lFuFw zU>i6eyk4Py+v(q{zlZ%{25~+-O8*vVToXV1PfJAp*YETqe!zPR|1I7JdZ%6R?M$nX zz3p{DoaJ3_@I@anrj+X^v+~ml)$7?z(2mKUAK7n*wwVaVIxz z24lk=o-AX-v)_K=dG^zL|JnW=kRLzYy{r9sMBGo^`_GyVIWqtuo=a-DHQ61+h37W~=kJ(*Ci zMMa*8DaL*7e&i*;m1)nQCX3;Pyk2%d4yW|1891d6g1hlY#PCP%d-v%P%jB0u@T^_| z&+=-eN@6a|@#yEjzgn~ce!w@j-lp$@Q+*Qd@HGU&5jjMvR@AM1Tz-Bcb*%|f9j!0I z#kt-t~QdPfaIXCAWW2FYM{J_iw z?K{wL)lji^WjM@Kl9T_SBOUT}oog&gi(!)}z-`N;rtpQvV6|L2$|U`ZMVhPmTy;hS z$M5QCnuP@+z}3ytb?X(ACHFJ%NMAi*owpi}>zh-WOmi(dAK(uX-Ui&4yrHL9M2#V> zp3Nh{rXa4Bu#M=@D2tk9Cqr}*`iS!$^<&FJe0LhNR4OstdBPufE9Td14V;??dz(YW z*$>Q@9tQFZW?byopG6o=i0r31xL8#Ox9Ohck#KRYGeSOE^L}WeuQ$C#&-pXApYybc zzJd>(XfDyb^%=M=(7Y{B{0cr4+c(JT>uS>%OoICJ@TO5x4^_E=@w%dtf5&*aOZQoQ zjib&aos^VgTcPHjd$Yc|qfUC}h`%z%KLLk<*vJp}^Ek-ho2)AYX{x&!3vMc##HaNL zX`_(dSEuikLJ=N-9NGN^Lc-aX9x24erV;u=HVEO5I3PzOq&uYaqd*Is-btcwi0HXG z;c^Jh1U?+;F~ISih*f?ua5`4C!0A0ULB0$)y$dx5IKBh2;_HFqkI4m&KP&zuKsnOO z0OIky6@MN$UP)tC0;hYlg8r?*N$z3bq))(KMh)SJUaG& zfRi6x+Nd3bvwn`DoZjIgOpvFKElPk>duU9koFM-gaD3my=&(~c7Ki*cUVZ^Ed--Nw zeuablm%wTEt;6n*oz;UeQbCt5(%Y~L{ZIDH!%pqrhaF<9Jav2q@BpOSu&a4o4gn)@ z{4wXTQ#rx@mjTi{8<(*Q<4F3CV5j!d1hlvREO2V?5a9Ohb;DrM+@tS=1bM308#uLR z8gOcd&_9cSlm1LQdFubwz)63JgZ?Lh(;Qz9oW_9kke}&KfRo+yod=x*2&Z~40H^*s z0$dnJ!o`?OB>xR?6)#Wq#sjB$OW%1=J4g@VcL1mM(0few^JG2nVBl)t;{nS&_DkIPW_ATQ?184_1jPT(*LG|{(E`-dmZ$z1Wx^a6uA9yx*Isn%dhQm*lyj(c-j!sytHmSo`5jQ z3L?Ve|84nyqaL!`y7Bdfpf5wMAR;_o4V>nIb>s2(fYWhr-FW=>+8>R;Vt9Jd~djBXruEy6D?y9}6@IPvNUA5QM zapcPWKWg6oUj1uvzHm0rKLn0Hb|e3|WjNnr4Z3?O5GO8TSjd?NEhn=73;uD17iZbp z*>4OTU22g7*NlwBPozmcc_)mi1#4 z?yEZb2+`&rIE-@`>8uCBIH!@ePcgZw98Bxwp2}ILaXu!UR>1k0bo|Uu=!3A{Z*uqf zK2NBu&ljOK3+;R$J2ad3;A=%$k2QjCNtdpa1k(gTSKm$wa(ztf^MWdy(RNqB_?W#c6YLG>1iSt?A{+hyAv-munt-FQ-D+sU1F{=;hzk-qEMEKrX)0 z>?OsyqU_^Yl>4S&*4!D(m+&8B+nkdkFE4wUQ}w+*TDXVzCX~OZpp12k%KgiYjQGP{ zdJ669<E5!d_d9M@(hc{i#e+2jkyRM|86kosJ z_`1wHON6gM`oxFMioepuB;PcGc=)pn0?exex7@y02rOIovtv7m| zHLVr1v&Q;Cs&n69&W#e>syQ`kiu14ig>iFS25`jN!Z5OqH2W+KtSg;9YXkeH{voa# z1^;i>BaK~2SV!1;r2R*(8-+e_n7cRQx6xXZ9dTG^?TS8Y5XVU|o25#3K9W}Np}pIS zg-9N!=4RF*E>sKt?;KUz+~1|%#8QM;?y&H1j$%1tHTwpu5nkp-ixI~@NaV{4#v3wGRV%ijYz_!VTjK=-#7*e=LXn&c?m zgdI;$^0z{cd<0yCzSn>?LXOfTN9pIV<6dQc9YWl@%O}4@6s|)^}1a}KFosrcI4jz`TKy~3wcVDJf+ilIr7;?&Cy+$Zv1LY-hv(X?DL;SNb-+Ep8PdL!PneIV2?na z(%2d(y$1P>D6fQlwMdsEpVHVGC|!bG2|WdnBmWbnkShk32RTY(YoN3NJMP`)&w|_~ z;CN$vM;frdK#tPb8YrENe7YYG--tWrAf14GN@HuFbQE^7I~a1*{s$lz0xSq}LVr+N z&C8)qR$n#b=w9_;JAIT^@p8Du$+na1QUJrPUTZrkO|qztZfCP0^sph7C!Ay`gdR3T zc{W7AhOm#G`LVv_aBrOTC5L;MtS>nVNe|^ydCI5qz(_6GLP<76yXo1IM2!$OuzDy> z<0ZbzExY2?Grd{~DNw>>2l2&uf05AzV>@q;7>A+;|HA#T4) z(h<^Ok;doi`TQ9?p2FivJWh5~y+H`69D2u7m>mzI_MsD4v2iojWK_-?-!WV&nA9vzd?6chC3oaSP()3zPh#(L+-)#c`q{ zKNnKyAs=V^fNes2BpOb~<`^EQ@9gP&Z2Ym?VY@hC0-kIazhoyvb4ieigDxQ+Z-#iF)EOW7Z5PWnwbz~;2@N7aivplj% zb0*UoqL&M^8>n?H+uQy=D@-T7(N`wVUWxNtK7#SKZgnBYsk+HKi>wDZ+?imwpX2u4 z&UjCC_;E+heC!RRq2_))!6@#o3-7$_cR3il@ejt{j;icEZ3&~KW^Xw#c7DaIIga;u zoEGnWKcRPh+`S9Td)_ZrWVG70g-?o!niL+bnG~s3Ptt@VBSJ&Dc=;?k3J$R%qNhZ$ zfXy$~Oz?G0D_xXbPz?VK`sIbiVauVM-<C~p%^FJBUFimF;YOA^+!6FM7p2Rf*W_V79eXIRf&bQxebUWZFxUwP1h zwH>n;I_$UJZDD`Xy7cw69fs3&`x-82RL&Q6KrQW#cDVHQWq}U5mZ@-kAstE3LDw$( zjc)02)0*ZtwrKh`DaAfw}W9rpDLar<$hyJ?Q|;~I3(`z14=!+vwp zrvk%6pE))RlX^A^FZpd9F8yQWKnJbk_wa35hyI{zz5Qn27H9skEEojpQx&e`WdDpz zXLIbv{;}GjqaziEHFS_JXB&Gmr+n$h;d2MrRi+aYUrT)3!uY(JTc_fZ8Tz>LaL3E^G2AC zz8i}$WD(wF!oh*V#p+`VYe@Fp2+~8cSSq>P(rjbUOQ!2h@#|eplV2U4?Ed|B#;wNv z`(h@Uq0L?Cjda+hx&ncCAk6ZPyyqxApelwyO|w>u$H%b)VI)a`+X?yL~A6 z&Jt<6pJv-lzPtR;Hu5dTxaF`uwj{~N;gu_I&L>wDHDrUfd*NJ!Vqm;&3t9cElkQI{ zO)5(onB$Yf*Y-ncoF+m%jGjU0j##c&^DOYHoL1QQqcGF zby0FS^hI0sUB0gEu3$@RyIxZ@UEAHpTCVLbr=GH#kB^`oP2tkt zoR1}t+Zc|r{Cr$?z3nP`TwTy~&sE8z+{_f(xhY&|=bA{Az{u7_BSbrECjGx_XC&Xw z%>!-i9M`Lz9ct8sO5)42At|0l(c&H^^}ADRY;#3OnHtL-?!5;1D9d7svJ3Iq1DMhZiHzd9)}lN?u-=hL*%q z17g{ZiFG28Q<$BZ)k{XGe=gfWq>9THS{%!@FqSFIUIK2H>_VX;ScyJbSwuzVW)}-} z+KX|uxe&A;k>0(|_bKQlF*4jBWeDal8P*=Bb!Q>=4cMQ@-iZCU{Y4c0T*qBL`5xzj zYK#l56)6kD!QOzOYpwOSWuIRhj5b1})x<`n#-xTv+^Y?b1`uTha>Ju@BQ#72=aO!b zAPPB7HkHfB<$_e!mo6>I=-R&>Hq$yyg!mCY{uJVrru8uGw9$Hy)?$tu>7jOXqiitp z!%>j>VJhNZA?|~6^lsK|s4RhxN8&!oQpD4M`=A3>@$m_WKY;jr;8PK=iDA|F4 z=>oP6`$EW&{e;nax7Gn8|Mzv+v+U%qBE7`{6UN|EC_0P%2kcj|OVI`|>;cp+?6d*y z)gR;+m^N>Ij0+IbxY}>_KJyM^{Yd?l@H>3wh2rkm& zVm(6D%Szg+qTyF*t85jVA*idO)m6n!RmF(I1yQxEjCDa&3g>EY1)#O_21Fi!T6Dhf z&~wV@-xA<=vcYqIfbU6@-#ME%AOjpDRl)gFDcmo3R~3_6BQYF7K~HAtNOpKN?vX`B;Dtr>a%(EXBH3hz^#Oq*RsUz@LL`RgM_B1sWOWI|}Zpit0Fj zSC01o=`-)Y;xjJ+Z^gga>@6{fwt7mxr`aZMml}7Of+dDeHIe%X@UkSWYn|F=j@#G@ zuX0n*B>J?qPCag(T9Y`XCef!R5w1335#QAux6d5cp6F92hMT&n72^1Mu|Y|$F!V}B zNA4^-)yhkHWxm#{vqpKTUHY|3c?r2pU1CgAYurY$7T)X*!-JhDt}SuOy2RMS&}o7< zJE)q{+m)R`*{xE-3r9ZV^&LEKus%2P^~y^%%5Rx=bKLR7DU5mQURYv|t4N%>G114; zIu-8m+7sbX&u61}YGWe2>rLHjp1Mnf+?YDCmi+DMV)wv5iF5lqmEW~XFRPT7HC|3V z$*~^z4kyNLHc#CshS|5kSKr zKd8LA(MDL+r@JIm8e8Kk%rTfhyF~F7iLp(IKI<^4#8VI3W?-}OEZnNJOS{xwXEih% zxfa1A;2B$Ue#7me7^9~5I?E`?pW+QBA*M=~@^ZTrvmIT>u#*P^eeOn+XKP~oE*v

        f1zgFPD6y(fiq?*>5#|Gcta;9fijr`Wc8C8+>ogE!&k@`q2=U{C3!r0B78LHf0 z$423%XpLm$=20^TjGl45C+Wx!vr}SXQjGr(dtU+psgc3s6bcjl$4a%Dj7qmmGWq;VZ|{%-OH@=jUhRMCuEmD9kJ2Y zmT~(omaB^Q9jd?j3{%n%crLZy4o-i@H>v&UjnWO!y7-SK+)YNXL-3Vm)LB4euT~LkQk=yOSMF+ zcb!)Hb^&go0|pF~RCqJX0@uFi-ZVV|1y|DMn_0?Kz8AT+L{c*;!QIi(@d5!mbKDx~ zyFRArl+dW?tXg`gv|K(9phFw@~{;s_&Z7mE-;xw%2e=12d&R#T6gBzOv7KyQ1T&nXoZq z#`x?Wm9Mv}RN2_rl#8^=)qHw=~J^ ze4fWy&R1x&z9YO89#8W;_QR7XZe^3kU$x(*wX4$FSJje#t#9=m?z!$d0V8>?k$HV1 z^BiFL>j<~wNp3LP?CEwsiTrWGU1hV@V}GmLr9Aig2#@Ak_pe*~HNvH39@ISGtn{eF zW7_&U_%s{7R_fm*9cbck4A=d!l?9{ee#2^DX~P)Yhv1fDeZvU&>*a1d=q6`NrDdmQ zi*ZXVdOTYg%eiP(*etwe-Qlsd!iIdcUbBXa*=)8b5e~%Q+|*EX$FU9vYX%goespm` zcxl6kGB^N^3hU0t+Tv=PMev_0=J+2UYyWj0Ym-`U&&S%KHubFCD-UEZ`QwM>pPtKo z=p}}gNXX%tQjr{M^qLmym8UxDHGKOdPdsia_ExEiuUOA0KA2w81l40PUTmV6Su zP;s?PiSq!?Q?M|6Sg?AAx2=ME{x`Vm5;KZ)PWyEH?*^9**{@D6Xf;Xx-e(IHznUZ; zuMAb|y={5VYD~DDj+MO^Yd_xl{#fawh86py1MKQ1!fn`0IAEL8k&EinjG}ClT;?oy zU|RbbBq%pm$iEy0GWGt9l?x}=Sk1T-x2M^RoX#_NbHiqPR2HK+%P3aqt;EMv5k%VopT1Mk4uSw~C$^UFe;s4Sm6(bHRGz_Sj^ zn`5PdW3yM}fuoZ~9=$iMK)p&o;9_b^o!!J(hniKtaNg#cCCgs3F6_IoG! zH?dM{Zbd|IbA0JEUuBEv>8+MruRZ3v{3p@A-ezq<-h*~li#rOiq@ngwL6u1fpHJ4m zQP(nHqE@WJ!ho8{B*jV}9m7(c;AT%9pQUMxaZ&L<6OFE1queq@eXygabPvc;j58+1 z@VC0lbveo@RCAwg$UTy=M?bP^|GYM^AjxE?97)q}t1t7ISSjXyJh&Wn#N2-!xpPj^qLn@hG50{XnXhXqCb-DNx(7RM zovhw34rb);Yx9t=a#x2_y$j_9Z}yd6i_Pa(tqfO`{_zpxj^2BCdEZsp=;EA$!f6#N zgXez~k$+cHQDsr=5AKHgFgS{%#->dZ{pinFRAc$t5VAb>H4ptoMplb3iyg{ud|9y7 z-N60!hT({XDX)u9)P4-Fa*zxJFi}2hoVLtoq*{czO<%nG=RDt1c$JfgP?XO%PTS#m zP7i>~Ute5!vu-Hf{G++gZ&4fXcHQ^{H{L`Y*JtzBI%&BDE-5J~SM8nT`>RA@fMG2G zaFrKsH>b&o(TIzR(3v^e*Sd@`)R6*h`r_c1A_u#4veP^z%v|U7dNZAw59+K|Glo{) z3fU=qyIu|ESEaB>hq`Zk`HsT|A4VT0Dyh9nw(8_Q5~cxVF@Yw1AE z{O3v4@RaA}yB03=itByzB8R;y9r_-*&PpXFBJcCt^ zq;Xl*bCWgJ!3-bNsg{KpgVrPYpyRYO>ruwwGAxl(GRL5>0%@Z)+mG`==g8aF6@YP?nCEQ0H>O@KsW~L|f>S}+ zw>!4i6st>59<5K#*Ja&nZ~si>2g8Tk^_SE<|DmVz)Y_dpkDthxSM<*%llC1wGx@QP z_6(Z#^B@<$=$PPX1vSmhP4Nz%Ysl$i;qayMvbDo+d{#0za*`(YqhnVeTlbvf;h(Sk z6rACI?}6;aiyvNitl{d_lW%!HKg-8!bMb|z*QcGZt{gms+!HF2j|6CzAG;jbKlEvrszuj^3l|YY&J&qkn(M|V%`anebZ}AUjy>R;K_CJ-67JZhc zx<35%g0rdfr$4-K<$-WrNnGF)N?DEHb2XnO`f1NaN58vn-=;zRBuA5^^{unGXOWHf z2d`SOJfi>I{tXu|zCZ8}6lm}J>j%8@wn+i9U8Vc=+KT7OcMqB!I6^bW+ub!jA>F3v z?YA;6O$rv8KJZ+|=zK zyAA%nrTv|;e{KD|YVN3~W^DR?f6ng-TVK8Nc|+g;)uvYm&D&Su=l-25f?k2tVm?x>J4i54w-t=Jo=<}5y}k2`O@ zH)Fu0V}3&q?0aYFp48mtSC$^Qn6}CgX0V&*bx-8(U+xHavox<@*-$$h|F;&bJGy*b3g@=b{^^LNaV?I&)H+_) zSS90mjvn>6|EH4N_Va`sN%AksXknFKULCcwAq)${#a5%&{vY;%xETHVA0LSSE+2?Y zSSibVq{(N_)+?ly_TCEZC;;a*`Fh9iZpZWC!3l>netPX8O<@GNKh!hbyFc9gj=$fr z9i7}C(mmC`%l{$y!0023=KK@lCsszLlc!8;v^uM|FN*HJW034>h*X=g!&Z7c&Ay24 zdxM;PC58synb~j%Czs~yvmKwxlMP&@IvVMBG}+s+U`F+x7@y+zVxN7lxj4G6uQDMc zx<1W*N7}Q_1%u!}Ft(_vxH4Z|sNd;{zZqdP|--(D|ucQ|TsjEk+qrGh4 zdXc~Zv5MkoN4W9Z1~+~+h2AoURgHD(0F5gg3@&%cxBqluxn5m;%{o{iOWIwlMT*0o zAvL}Q1~uK4!zbfs7j`Jij%4=tc@=AV+?K@R_iu!HQD^1fRcD(||L5yGfvfX)uAk{i zL#DGz(I=eI+U&6HCrf|!OTKS^VW@9gcETNEtrFjl&HmECYDVE6Yq{VD@<})Nfh<5j zE-GmtKaelO52V~nQ9X{?>!DiSA}w$aW%JXS3!Gdk$d59IOG0dsbR?r|fr|T6KVydiY7r3T?Cfhw3cFH7Q(67Q?k9^?cD&VGj3I3}WRo9A`=z zS+>BSlm)5-6~z)-(}$l#^!c;s^YyH9hjJwX8!4~`fh`nx0fFrlNKnByqQ62I7)dPe zTTC1m=56HDxsA$}Fr`tB3!M~s*?D!78O`!h2DWio-8lISCj&W(^i;@y*YwLX^gWOr zRn}LpIiOM073WnM*s#l1v;6A)>at6|g+EG3Fms$Koi)-AuNd}IU#^ijE3LFw=D`W2 zQZB1w2YU>u#aO1YBrLB*y~b0Sy%hz+8&c?kjxCAB_cl28k@0;?Yc-g|!8)lo(`h2_ zp7T^4c@-1)emLV8}DRhJ1Hje z^{wW5a24USQ+ zM~$>Tx&o!ogaEr_RetMoZ7`f`Mkw-~3!*Tj(uz*7R#h(zVwVrxZ?M9+N>*GLtuFL7 zo(uw1()v{e0ld3SKZ!iD&G|VRk6hw|TE$j}z=h2QMWKWSN4R{3A|s+^nRs5P8hKo= zq(OrAp?7B!me-*@C!js$yAimT0(%j7fC7yOOrfUMXg(a?pjMwQuTqv~9WcoAa3{rY zN$me$?H>1ksNLzk=sq&Z^ES0RTlK#gREmCTKWoODPWuc^=L9*;m1vdtx)Al1kY?4t zkY>fdkfx-!Y38A9^l1g>FE#prV|C#*L);!G#W_XZq>oi$ul3J+@S1blgT8qWt#&E? zWhl3nLVi@MP*M1>x`sEm83Mn<#Had33$hMJ+UPhPdo?cZ<8b@|dic(f^A${UIISE1ouMYqnVg`;8YK?Pj+H}dqSp-#m?m`!#5_tsT~M|$l>%s?sLFt zxshy%?MWZfz6<;=V4>K>aw?GUYv42<^w_C>WS{hh;wNN$tIj-$o%)BvVLuf()qf>+ zvE4|2J8&8&)z~SWsDA)Bjk8a%i|t1G7XwF-W(3aaNxd>y?~4DjJ0uQ0dT74MBw81r1E?UoXS5NxM}(S37pEm2)Jqa+kp=U zz6Q7-j+8I?hYeKm_%1U%5qJRfz6Y)`(Juo&0`fpIKQsQinCAs^*KOl zhj{2y|BLPLC2%S~eHUviKNPP3r}M&m;NtwHaU#dZchv7Cz)kzz2RMzJ*MQUad1RmR z4TV7MwF9`=?}Y0F{m+3@dByTP1Dx{x2DoXy8-P>!egSSeuD%xZ>E6#&|5xAv(Dwiy zDB4H8Mx&4#$U5K@&*cmJG2ql6dBADBb2!TR0&uds1-RHgRQ|VsQ#tE^o94Smz`r!Z zPYd`DX811xZUvjBb{tSivftkfA0*%-%(ij%Wxz5xP0%nY9>;94_0Nx-L> z;fn=4!wg>qJQU^02R_oIoSy-wa(ncG`#BuwpfS)zPoiJ!f|4%dA zSHN8`8BOg(2>4Jle1?E)&G7jG{*W173Y^X}S-}0pa$=l+0G!78df*f<_RBfoRL_0D zF(i%nU^D`{k~wLL<60zc;yni)Jw*^l5#InDQ_;AI_;uivzqpC`IGo4nyen=ZZU7!E zf;fu!zgwU3xt)3?}@i3jCw zJneMp7SZc*N8viVx9O5V%-HB-s5e85bNtEscofrjs$ocHl=ElV#dETN@;QuIFlOD#M_TXw(?Pd+P`gAy$i&D4c=SKGb)4&8z~ajt^d_zXQU zb8bo^xjEt-WcQq(@D=^6p0!NBW~UG9Eq}{Ci@ylLWr2Bj^xk?;-^z=PN=^}OF9(y4 z>~B$1x?JBvMZ8MiLXE#T&-&ZFu6G$To!qZ?iS5PY;yth#Cqc*T;_oUfjN!x{=NEs| zAWSebe5i&<)J+W#ds0@2sMMX%VQz3m2}m07_v+uuxD z(D@dbzo#78ljrd;zTCZdX5`K=7F_jnS@t45&9Po*CQi3rC*Wrue?Qgn*eP@wyr^4z z^t9|A-RKa%yT{Ki&!2oL@i1U~Y7;%fn$Ebtg`B{$NByo7&muWNH}&oC#^2k=TC+ji z8}@=O7rm~H*8RDQ*X2vs@pRu!bwbQ>{(-BjXMO<}=ZD$DTvwm`g1+dJ-%Ovp@mrdH zfdS??Z|9cY`OWRaFMntIf}Jk)6`z4Kc>UXY1UAn@u+^oFguJ`qEePzUje@$g5pO4` zOB;!g!(Hppo2Ox+7G_VJmQg$rcNZbHxS1XQAhF52M2Or7T_VH=>=GfiV3&wd#;S8s zw|F=flza7TEL6AC)3Jq%|9_Rg;lG=+fflsymoXo3zO2X(K7Mb$N5;HCGPWv`$045l zUu{KvB;;_!lT7g>`y-zGXnlzIK*+-oPcp@m?16alskImJUXTYMo@9zAncfq?Z-<$9 z(dL8gz~Nhe8@)?%-3ojHf*#4&@J;~fow5Rd1n@@a5sxhVq`yHj*&~@a4@hq}^wO|S zzYhEa`+?O$k7Uv#8C(z_Y(csf*lC2k6Y(TdJjujqi{IcgH$pEK>DI$eHLzEpM>6S= zT#kJ(^d5#DwObkZ4N`zjgPz!qBu_>>wF|}1gnU2Z#dae39>i0-EJu7Y?~7cPcC;hO z7qD~f4LxeNe6-UUV9n4I+mYnsh^KZ#n{7i|GEImV+mYmY?9`4QLyy|65O!*T;awMF zJCcm?MekK*E`%Pn+aejW?MYx+&=cE{^;O1M$>uOA(&~c`D+?b|g6xyBEr#fgbr!-U_`?V1Cdenfje%U&Mb5xe)QekbMwO zGR2e3V#hlTnFF8~k9voqeLR5mg&xVIN3tXKJE6xwk9_I6PGYtxfc*g;5Ryrc7kXlTB!7yX@_Pq*WIqM@?F6>PBtMc3 zh^KZ=w&wX$oyd##Tjg6Ly*x`=LkkVj=7t2DTe|Bx9>0`D5&ZpjU@@pQzyaU5?6%yB#(bR<1G%7i27kxcn0adg8G@8EIv5$5<$=t%icJf)|2 zN{@FB0daowNn~sgKNWpVdU3)rS~z0-al9gaI8wQ3e9@7{5LYkZi1EeAG_DAD6^<(5 zcpdrR^;y|99I4zGXB^+j1pz-R;4K1vT)>+I{Gfo>3i!tYzEi-r;E1eb)k6G6A-+<; z*9&-sfUgzsG663Y@L~Zk6mWxpKPljg1Uy&3vjsduz|#agMZom}K2yNs1$?T2>jXR) zMXow~PG7kEbx+lOq4`e?rFz>1r`QzeZV! zH|8qBD}^wfkLh|(IGwwZEf>CwFpXDAdmQ0i(5E=s#z9{Uzm0$xK4}teHwiB_(SOV& z{Dg_kttNP-N%$DrR~)R=OMA&D6Fu6bBiAr&1hq~FEiF$&2+_u zAq%zXi0bYKL`GZ*xA5x+;<&dhEUdyClUZ6oXZSUu)O#a6{$ylIpVYNSjK9n4a5A;zoqg8rrtkVwpk?Bve}#7`C?Jd{V(Ni+ z2`3sO^^zstrH^rKVp#rq6HQ?YTVo3D>k&ssTuQlJeDAn7yh~r;9)Z%+HL&tge1ArH z$QT11Xfyf6Ly$XjuQVgQFJfwNgM>>XqsZaEU*VL6e}au}IfA&GDCjl|Hez8zxF*xB z6}JgCy5&rgp$@B&=oD<2Zd4|56U&jBK|hgE-8$E$0{0=YP|n6Z52e$g94e7gEm~Nfx(leJ8eJ7_yVlD33 zxOAv5piZ069^LXT(f5m#hTiEn&D+$7V1sK9OT0@pFrYz#V%RXl*@nn z$|(!~gt}zs%*~x^iMvTl4-U{(<9&IuQ3e|*7CkqZj1TUoSguVi*@zZwxCu5Y1RF48 zVxwpNCmn3iN26!nj zRZt5)5y3DLWnm=x$%1R99NCDqjB)$LY_N|WAY)cB3tkj z4NOZ~LtIA>NFS)a`P-?RvKTC9v~4ti^NHhwS`;l$^Nk4rW6$B6PQHe=Er?XPM{?T!l_V+_}+TTC7W7xiBDwZju zv>U;C#P~X_N^DY9FkbStw$C$Zc4gZ3^OG1KvbH!{k*0)vl;c@atX>4RB>S?y)y((# z3h>x)=%VPRYYe!Gss%}&rmC=ekx46#blYWHar3vFn@$x0F}iC$I?C~}n~LuX?WV`< z$Jf;)&%SB@;{IzgEy}?zkWo%zVB*nyIXeOH&ABgtQVD%1%p!v$KaGy5!0?V@(|gkDF#S(u`#dzq(&co za)EJB>}vaj_@A`x`?Zu_+pg%uz@=@s zd|zDyC(zOe$H5e@Z4XPvQL1f^na%Z#74^NWoOqVN%A|RqZ46_Z<{cv`Q}2q5VOHy6 zW}scZykYlUevLS)o~=|%k)X~PZ1Us3iT7@w{Pj8B)j*3!103FOOt z3anNLSrIqa6I@;8Wn|xG74uWB?C3SdaO@gW8PmQ)1ubxAS*K~+n>3SRc!}7xvTsbi z7WVOm$EIG(9^*;OUM>+_EmLmDU%dHS(hX_M>5De1o4?Jx;hQ!+hVddMt((6+C~#;6 z3M1?0Z*ezd!IE*GAJMi4a%Eivt|kS>m=^8rItlrqwfl0tMP;>KPds9JU8NeOm7Mju z`J3MjriB5gmwgTO{3jRMw9*=4WNKomtlD-*uEt{PXxmksOg-;(gL?k5ptqT0XzJ*B z2KkqJI(qXZh!f_zwp~AQ3ALQ9Y>jQ&Oz+>L(ck5gHPrLe*LR_}iHocCui@WyFpTMh zo?7C`wL0b?jV?C+=5L4o0zVnUmsH=W1ZYu?LG0tdh(S!-t`tU!<4|tI+5V1mjW+(P zYYf_W^CyP)=AtfbLfu@_oTI62Uir&_lwTNU3UO88w;HpH##vln%{L!lbbm+>Bh2i% z3$k(0`_ zXQYN_q-Ukx4^sKmobZ&?`LjVY&r>_)q~<22XYqMOE*_t?ATu=wtWQ~wP>xeT0F^43 znIF!TC%hAl757*wKB+OnQ}X;&j!h~mDLZL)dhTM-M|EPEnsO_ar=$hBb8}KNQj_MV zGD#^Z5Ad}B`4bNbk8?)WDm)W}8-?yEtSoa|p*C2$z+0DiNtp{Kb)$#tHEwEcu@fiI zAne5PnuUD<_Dbwquy4cuA@(}#N3nCy3Ah+KU{_;j>B4BXjd&1G&htm);B%wY9N{p3 zL?Av~2=Uj9czkZoV$j(n+lFH7V!w$+=z`c%|nlhgqA0L%SZzN1fjC$a~`=_$Lh#bm9(Rk~fY8L{u zl+<1kpn>>I>jnDZ)Lbut)vTlGyKDKWPh@AzraB96k&Aq7{JWs&w6PNt0)i*b691)B zD1FvbLI&NL<$9sf2ERpN7jKhEz8Aar{VvIiu@4jajO2~jLm<<1raPmam&NX%5|cDP z*Ep}{W-${3IU=uzpSXK$+{4<3;}SyRW<3=~R9zE^)hi&7SiQ7i;P(m&rQp9<{V|ae!c{5s`F-+_<=9b31xU+=UL@zou%=h9t#fw(m#ISg_;NYvPDzQ7yoVuHbM|qU~Twv$7Fnwpf0^!dPrabAMm7eo*fUgBkGNPC*z@7s3vVffhM#ZA|6Bsk(|Al@TdKUf9&7EKc=cDhY(J+@7AerAn-JEf+-7C6*7JUOTC!B z2FFnKa>h^lUeYMJp6Od@CrxfR$Wn^CnLhuajUtM(ol#*sd*T_>I9<$k1kKmkCix#a z$M!ZyP+(ai@*?Id$=JrIuv#mQw1I$Ds8iDAzQOSKA!h zo8)J7PUpc7#)5y$>0+hRIi^LT1@}l}!zeJKY_AKejT*~*r=v2ompOiG%2$R|D#xoj z;{N&>FU^cPXf>v$Zotl{QSkSR0CGPbHM$rjX&4RPyg-@@M%6aBG0|gD<-&qdU>>u? zH8;r#jB_Z=k9xt-jlz5z|bg$3zXzHL(1QTOL zQML+>h>Joii?U;F7N!-<1CfiqXmJO9A_y44Hgkd@!kN9E?&o2%)~%%qrrenMPzLED zqqqfkA_Fd(OI2=$I`^+p5>Ve%x$m!XXlZpnTIYU&JR3Xg2P;mM`w1}E)VZH9xWmiw zK?%p)$hx1Zb31Rj{9u?#vszGHw9vqnpR0&T$vNUjcX)X2A$bAZJI~MNcqyBTazInr z6P+V!Q7`dm;V6B&G$tr+;KMl{)RE+9dWmn*yh?Cj7KN&cmS}9|gT4lIm$5ca`P#rI zV?LNIJ>Yj5{jyi$aY+(Zl!G#WAxCXvKu44nL4OITEJ2=ASp?>soC+JgLt~OhOP<3Q zweI^{-A^H4@Mx;?I1%B7l6;-#wx6Or(97o;7Q^5?8c^sdhZCM|7bNb+&MIC)JedXL z4V&ZMB)`^`#tVnRLD7e?tzk~fU+r(Ot_eWeM+WDIv1_d~w_wS`NvUD<&ZvPkpd2h1#cF)x`=R_) z5tEX0$^Ubf>%ypci?dwbBK~^1$pNqT5XYT@m%7Xl{`6LDJq*$9G-KL2NO3GfFlHaE7lmAG5TXY{;`Z|@i z&+?*Y1}mCyZ(G7L%oniJBfnj#eDQi8j+yL7SxK9{AzL+D#*y6x>*P|YbQoJON~+n} zL236$@x^R;uu7%!(biArY3DdDyX*E|_uVX%%VgFw*k|W=(A3%5%4D`J*=vHwuhsm1 zv(Ko{cdE@Bm4VZ7a&CF}P&uRr$>U6i&7v}v`fJOdk{is)mjowtrlx2um& zJy`J0Dh{`gC=T|NROPDCs?5_v~k+GrXR0t<*^K z`;1L(V8*{z&)k>V$UK%^{K)yNFM9gATRc_)*Lh# z^f8aT5ui<99HM<}XbUVBhUVPsEzKY3&BSJvGVF(us)NqQSDiNFvy(}s^>125ct|e( zGtXc!T#I4OE3{S0rBBOb@v^(6F6+G&&$Ld^7!2CjWqaDZS*@1c*pRCY3o7H9VS1sW z?74qP3cnrVpSNi6?sRZsY)bSRJeBnsJb3WxWKYF;Mcr`;r( zj!HC|GGj^{JwJOV%gaQB^vEsTbXoIIHuMAI3Hi~AIlQiWxC2`I=z+V+Oot&HuH2v z^T0_5rfEgd9hq&NsP}$k9WQAdcWIn{VVrPxh?_j{pJsr4HJg|iT3M%z7RMjk?7=qM zswK6ntkXrt>8`^>(%1JMNxw8xl0Mwu;7+T~oo;mU9QN{Le4v_W?FW_!y5j*|M3Tp} zCgSEBS|}Y}Xv)o34|3trMD5TprbaS)qt#f@rz~6!^#>) zaI6*KwGGdNqMAaL!Q8j(ah1&iby1?)W}%{JaRvCeL4aWcGVYwPq9uCVXLLi-mqaaN z|C+&mJ5Nf;R~F2_weoL`;Wm5FV9@0jw8$E#yEY_Vv!1N5o}sX&GN>sdqWsG)njatV zSN({xNZ+PN-x`V9gn|%6%((5g3xvdOj9GxQe9{5bJ(+k~o%7K5i7l-yxOiTa{k zj+i?e_o?yoh&FM%&TgmHJ_E&Wb39Y&_-&g#*p|T&e6`F8{2UpY4pPNkxHG`R0B#yU zCoyHoASmO~AK!ZmA_M-CbIG zR5;sakB1OEMYPpyAOgo&PuDb0SE7b&b>AJ~zPGjCUhp<1d7Q_+FGfh71MaX7S9yTm z@ob(0ZeEw-uFlh~v9%x1BiWKPzQOUb-sy)HIn@sK@tmM?yvIr5ygF)msjG8jaAd{$ zt@Uq)k2vt%h{dOW@IR2){^7}4<)0@8K6G%}{JMvKd;iJ5p84eb+ZR9bzw?De-FcnI zE3dxP8t`H9oiDV4l*i$z0~e14p8n@x!!r}Aow9Y~tymd2>sHmvW>8_ths=rY|PYT&DjYqO8$4=(Uq&46?KDF=V4t8=KwZMyKDl()Sh4*4cQwX zvvD0L>#zKC6|TOtxK!&{9Xc#Xea+ie&aHA8+{>0^6t=nS)ACpN8XY4WgavTP^CeaC zsHc7Mc;39)2PL-UZFgRr{dR2;jBB$bPKGuZ-#Fs=0m>VzWLARl3#p-zhLRMNgI2#5 zY9F1wvrgkRQP03UGFVudKgbaK$3pFEv+L@#UK2Gue%Y|F$h)v2RxV`>P}AGw-VF-4 zL92~stCxjEmYJAMkG3ghoxo;FRzcIZWZ#AY&+)7ETyhltP@f5kp{wY1bKJeuI$n6q zZ?t-vkFmGKLTeZ(qXHbfqf7D(>yNPfES1VwO1^0ZI=#;9kQB!6aJq0S`v{)4Lv z>Y_W6|ImMeBD5pq@+%g)NM$eqSUxK@&V#u;xZt6QzuEfF6s)SgqvCu=U4jEbkA zUu)D~s2$lq{z*-(iNPIEXf#oHqksHDO^u1dH&AFYQTVfe{8G(s69u(HSY)$_Lgs)m z#oU`B7^mP`JaeptS(X&Dx|Z*kmYPWGdsVBh{$R)ssfkXiT;-$YMl8n3l>ym>wI)qE zH53ZfCJOq2*@ZR6QCjx6rx%NX@^j>JjK&(Pz;76@Wpy#DS&4xfxmohnT+NI12Ja3c z$H`$8u}M2ui7beX`*dqubA3K3ol`vBZuIJ}-OFNaQZ%-gB@S9LfHBj!#VVw-aFRhj zm;($=4kI6^n{f0%l+A$WG9lb*bCQ@f zVvd*#cgDY`DV%8RP`1fwOM-g0kFBdX6MwM5uphEoW+%+1;=io!>bE>#V!ni1jn>=v z=^(@jUyvs~=9jzcyR;N9>4ILww4m zD>uG$qK`|q=;XvYhszRXIoJ01XYgF@Xuo~kz~p^LV| zXQy)27c*4W<(;SwkAIzi7CQ8u1Pyi2A>K&v)k_ryyl}520F;R(_UUXNM#GXwn{w5O znfhffA&M(55Pk95A0s`^g6a@!_52p)^FhD;`XP)SEB^de*39afXG$2>UdH^0l;Ab= z>F*p@R%$zV!d_WaBzO(;L26j&0&YX!(lfqqZ5Z}m@VI6&WMPdOI6dkYVqj*J)qQH??#KnA^QBh&V z2b&7UYK0*3(F?(rf^peGu%=+NK?t@L++8N>E}OJd2x^v1X%m9Q*3-4tyj^e)#tK1@ z2xyCmk_^y-h4^J4xCTwC8e7#O?@=UPvJh{^9H=(3oLWw$|q}#?|`#L@od8A%4X~T@L;sL4lHj`h=a&Ax< z-f}6+jCT!bj&xpuuW;=)Pphike8>1wruoy%Rl9Yc4XcUtWv>`^THU9gUp!^hyw>_< zQLlft;=`y5#mO>*KgWOBmpYJD`e`b{e;Mr9*IW16l7^zt7$)P$mSU?rM$JF(HpBHf zw~wPP=;rl#{qw5v-!|?Uz4o~=HJY5138DV+Z7tip6P%^QOqgyfFLQPIDl)rz&IxIJ z-wCYCtYr@^co?^7+}+x)vkTt;$nPJ!QnpsSbw2--D|3JU;9eHrG^T^i@9J})Fb5oDEK6v`E-~PNJ z?|PQGT&< z@r*?ICx`v zg2kgQW|d#OFmn2DecwDV`@_TQ=e)4s^7fA|Z+U-DDrgyBS$Qr!Z0uhPzmJ`>qPT+D zINg-2(19hg!s3{J>aTD8=wkhoM`q1^;at*^6Hk4*>EeZ3;X8loJU`u{BF~ktD~Qs_VQHK=G|LgZ=BPwqUa>Xd+zW&C zUQ0_V6tUk|Uh@C8^<2Owaq{QSwZHEc?Z5KexrJZd_rOP=a~!U9-{geHJ{}G{oJNt$=(!@RLXZxdOknm#LJr!kLBiOzw-FX*OTT? zpRxSFfuG-b$zu~(Hr;0p^<`3n27(vzht|v6F!r84*&6Ui!d{*V{6_sZIe$F<@TT8Z zpHvV3>h#{UeOE$b?tT3IfEgd2{A|(}4;u3oQmBbv(F>pTv79B7z- z^?i4bS9b|)o>xYIi}UI4QkRVQV8xNur!z~-FK5l(p8NQ~S6}<+DK}(3=}SkKfFu0| zoZPwK=U*M%@>+F|JTTEE;j)d-7U%d%cG{T|MM>IVedPM(jjnFLX8#(GC!1YAw5k6Z z{_SU}H13{mojdBU(IbvMvEiqWu55aC^@fFuK7Hlc9RV}mxhsFyxvL+f4SaRbM_zm< zx0CeRM_xgrGoC*1-3FBA%CGyB){p;qL0L3v?&Qhq=1i?@9QAVfMX&O;=TfHcn!lvt z;Twk!#w8*|_*-<|$8y?JJNd24(7$Co!1fnM~b6FSY~&z;Jy{CU%$ zx~idPkG}WpLn9J*8Laz+md0-zzrHl!QQ1%zuZe4XAAINR1(!{6>q3WKx;oKy=#*-Y zLG7|($Ezp5KKYFqdp7?wAZ6d$;j_Ou_*GEak&XAgI_=PjkPNz-|A#Ac1b)l7oOOj7rRuFcuVRTK@SdfQauOD+3KPEzKDBWX+#haqXQ64N@`P$@Elc@4BNA9%r$z)aw4Vgs4ZD#VmM6aJ&Uq=96rWgjw_5dwHJ?z3+_taG$4e zx5)7C$)zt$9UjF_!y9GkbF)mLiJ3`{q_PvU=FGiC>=e8+h_w8x{C?sW50p9`i7mTH zGtFp1Qcf~u6*V^_gEwUw8Yenb{dA*NCXQ?qa7#Mnv4= zy|VPI-1C#ru-G*DhQH^NJEYMvFt-_Gb;w_*AGZpKOk-WfQh#;VkNY+>74Xl)m*_k)6F;<@+m^}O4$L6O$;r-_9yXFVXwjce{ zKBxOI+Qw&Kv%LxWaqIk+NgtwH&3ePtnO0XB>-1m*r(9swXxtb!%QarfJy^6PQ&euH+qg1K?{XeqDBC zbLPDTnFnN_AUtUcz(WY&StrQ(8amMTV05+2%js23pVmIbV@m7eWbtgf#%@CK6;K*x zTWKBZn->-QH1MN&b$h^iSf^oj50io8QxC?@y*p{-Q{lP)C3e{FABoA43^r|O>?W&-hFj8Cjc?Hv3wN`5sK7lNqVq>r z7F;j3%D*E&Ah|4>RmgKD$>UjhQnpQlL*CPdI=_ZU*~$5A!Ob=&JAb*gV)he`kFZ`h z0`Ao*r?Q!46{-MT-tLGqs@%I|1sTiqy0=uy4X|~u9??k#%^t0_i(KJw$L^U*JJsIo zs9IRG%8_}?$D?elOW11pyD~+9%WP*wM1+L+Q3t4GR_|UbFnsll%%d^3)CY8)tg^N^ zk6Nx`ysz@mG@q-67=23rP*$46#3)Na%~3P8! z?5?_J^vwpgAeotC+xMP+h2WALr-)Iy*vjf!e42d1tomPEH3P->~zd^q=FI24#O)MosDk>sLVmx=XiHe9%u~ z@qQpTU+&@N3w>i#i0D+E`8;Xf(QGWCXk^Y$fPxma9-b%S?puZ=(Qm^A|y^5iq zZ6Bw&FjcYFRyI1hDGWWEU1c3PP`h_Pw!@NxE=nJ{tl)B?zEtf-^JZ2?WSerN_Gby^ zp0%^?WsJx^`4RIYHL>?A_WI>Tyd4RWQW`gv*#+Kge1!T5ZF9c84-s${OW3I-x8P@m=#(;6Mw%7GhPC-07S0a%=O6vMb>kDJdIlawG;r9tglrHc2KPr!7j?3Y_J zUGlPBJxF9}8oW@sN;_}W6pYn}Wgw9)^X8|AO+~fy6xAGCRYAN=iq;%S4P38~4^!m$ zp0#OYSvmTjIF`UCixFnk2cxRa8RL(k@mE8`OHbo3oQBaHJw~U58*^JC%D^8Qs@bnU z&?aAoF?WfjG3PGJtVwMwsKfw$LbbiFywxc`6vnY7v7BEYoTnqWafkI~CO7F%XYD6D zo=Up<*he-fh;WWATgjG=R`8s&yC-WkY0)?v<{c?y)otUwWRG*_+F&cKJMoZJ`ZW|iZIW!nYh7a(fM(CkCxuCQ=X8QvGzl&acjPcN`TLVy$|{Xe~HYf z{?UT0!;v;RW?`?y+Tc_iPeYH+8$aWCFOCn1FTW#9dbEv$eR>D}GTvqO$B|yR$v-9DJ*RQ$8YYg~CKYeiL}4fK&OSfm8W^0B&0Thk#St-2_hK zjze%3^=vjaNuz!coXn2$curGGQkySW0+&!0Y1nC_XBS;bxY&TNBg8px2`m+Rm^0#BE{{-+5*cl2u7)Pp?HQKE~urmv| zX}%`~JH&lyYUg)BpL`IR>N}%xshq@pX{tX0II6+andwgu^uILIPZjikHq(Df(6_|{ ztf~E%1pPt4P0RDHpg-D7{|N9Xl;{ifK$Ij0XOXz;-I8@#RE5O z2S+GTJJ5G{ruq5-C;ey4^rHp+N;Car;21&-`47QVFqShHIE@G5#55fb&k6eHfm8j& zan%SMf6TAI(RD`rw1DHyflhdTR3;dDZoorCeT=Il;2Ox2fCrf1tAKk$&Ij%z;Lhla z?ZD~!v0l-vyk$7cB^|g-Jo>Xar94M#N_Wr*VJ66vsW9xQX|gbR<1-6Y=H1hl?PNBHjpm zhy~mZClwmM;`XoVZ-Sk_Bi~S*4Cp*AZen>J15W1^aTD?XseJ$4?OB7$TI%0_cfSAI z?044=|5M}S?;3Ca+uHed+w6>HKydPWp776*tjNclc@O z)A?H5Zl&Ly9ZGjQ^S8V5ch}C{>34_UuASS}@2(wg*Us(gcb9K>!*vQPy-O4dID3c=Ab0 z+WvtZxpKUsyl0gTuq$yCk>y&-glC$xm`QMNh=%k*FthJU}NZ_8e*hB$5Bj+uhu)=4Ee}|(Mi@ES5o|bd5*eC%# zw2C>Qjq(^vDQnIR!rm&AKYEhXECMJFV4?>l3cK11$_X|G>_)&-YKcZ$WNS zaz-lJzQ++~P97_;>F|80mTS(p8*J?3jpIV-T~^f2p#EVj5n7HhGjL41pw^-)j{ zV=c(ySPSZ5tObQ-THuimvNR=w%~*E%DhKya&eIV+AxJ0AVZfa@rrQOAIj)g?LuHeh4+XNsM;`1O*Ei-pK zqEVhDs5hGYm=!gN>b%E`o0tKL+B>h?;$-VcaElyFn!JNFOzbdIj^|*rfyt9n1@i-w zn$m;{JJ^i*S+yxHkC=wTU z3;ryWL`=Ys<6F3Z7farWM9TujbWe1lu)%hC*Uk;MK%YD}`O(>l7FnS?2yrd5MRO_X zwK2|Z-P|m?V$qEfr=6LaIUlzTL{{ye9uz2Iv$GfTm>AI`MY3t}BP@G|3!lZEzsb$j zZSX&nVbM4FEla?;)#{alzMiR(DbsH53vQhdjrrfesf;4}XWrI;vP2hbI;6~akUPed zS%gTCEL{G&jw)W?Y*-n=F5{}VmFRX@Ss*RAHR-YGxVlvdZev*8%2aow>Q?D!Q1zA^ z1632=OJ#)@Q~&+MvRz3>|F^RJc5X$uSd7fFp zpz&fY+;t1E#hYk62Pa0wM9s~@)XU1{%f-D3JUMkvYEEj_>{O9;*x1^CBU$wQQ_P>A zdu|hdk>1j*iXyqC#VUf}l7Ei=TS<5=w{?I>PHzz}3j0BRV*rmGD+LDTsu(7PAlPrX!3@wU$$fbhTzx zHL}%OPSwq@3=$j8a;h+M4jiEegDi7x2X`U<<=Y{+$94$rrX7NN9FTZQ@A8<=cPARA z%X7ME2mVV8-TdQ%P#y6MVC(|!0m*po=I_1WgxVrKcLra|+j{mlJ2{y$ahuqo;ye)D z-Ex4CFCLS+T@4UaZoL@L`Lb!`uJD^ZHz@<|wNq34vgRh@<~{{WmhiPL*uBlA10hvM zci#G8t?K~jeooWPl*P4!IHQ$LD*|0+5dTyhEY2X~U=Rk0cQKUSr7`;X>FnN#4-}PSiT?SpS)(z&CG_o^Bn&L z^HWoVXZ+kGBQeeY1V1-y5!S8F}9^Uo}u(i-5ne<356Y_(%nr#)3OHJ}4xe)tc*vWz3 zDWucG&LUu0&?A}bko+j(=_Tmp_{Cu67bOoLuC(!qc8wi&>5&?A}j zNRAWA1AN<5$gw8nAvqj7*%<)6V$@d;Js)7M&?A}bkgP&{8f4hpriN^Xc#}01IdTqc}=&w`2jzf=R(jyt1+8?w)cBFoXyc_W(Q#{GFh_8eU&h2dnA%Bc` zk}00#jo7`BPbu_h9P|ap?`mMh&=bc6$%TloM!YNH%OD#NPcqpd`AO_l-W;+6`++FW zLSR{BN63%l6zq6yfa5|Z&eK5HO9lph@;68(dn8ZBj(3|fqj4m=;leRkIJyZ(SL8=r zrA^2WyynynMhR_2>lTQPG^5$UeF_%^howVJk5(R#Dn*o8Gv|k zo{$U zO@-ci;9BU#1Jgl|WNcL=M`IrhJwNDCKRlDdYzqYD3q7%4NJblS^Wz};m)c@=u9D*M8ZK9E*y75KZ&H+0F1-HCac$#U6(yB}WEMw~DPNK)Ka$A~$vE&b#wLu( zFkZRib>Jjl6OLDLw1eD&Bc(ef9GivXap72tBR*@AeT*a3XD5z${a3a{z^es(qkvc7 zh%9Amh4?ZdzEr@A1-wwe4Fdk8fG-m8TmjD(@C*S@6YvxP*9-Ve0go5(sRBL*N2+%) zj#OVa9Pv6HH-4yIh~w%f9S&SNI?{Ne?>K0D4z|WMP(rEk{hbh= z3WaS*NVpcq6GFHYN4f_id<%|Kgz#P*UqPc0w>a@}^ucwK!j$nD*rG6TfIK4T5RVAX zs~qlw@G+>8P8`B73Sr_Ip|&FYAj1D7n;0y_bGVnnc!!tx3hiOX33)VA8E_FjTa`c^ugH1X$6F>I|1kU^e zPftJ7_m=4ykDDfMIf;zj+!BW_@z%fXb|f(VUf#=RNed}^^>Ezl7C_AeUD!1)PxZJu zA(rVjmrXh+yY-rhsNYepUZgQ!Iq7&)%B)2?=+4EL5{#Aai0bzoc&nh?6k)c=YR}P zWK1{jEdB>5*yL6VW@n}lJDw<}f+Q~`B{juAb8gCl4C2=1-!aI{&Rv{18}Dfmbcd1r<6GM5 z^ioK#wIjNF2cvTfPgwvDLv)Su4j2&>%64o4Az{HG0il|ZAeIf$1R#Q^9S_iGLW6@@ zHY_j<|7p|P32b{@mYpc~$d8i1L~hPQj>`lSk823S^4E(d<3$6Q$ySP+PA85bCIifLw3*vzfim4+(tV9-I($B0+!7Oe=2dP(LJe+oQ((iaC?+<< zNy6t$Q0ib0QbR2Bp0Y8>V#;`-E~Egq`Xu_>Seixg=SQ zn>{*GIyH7b$ha+HN^z{l5w|~_9|jya9nzy=fm;({DF6Wrn=jH^8a@J>t@Xy5zA+KM zW_i_uiB{sjB-#Zmt=_9AH-mYXwR#IEoWw4QCZ=D;%izuU-2Cm#P2vjv=B6}8$__>7 z1lW3iP>muERNSsE0HqxTa*Jtb{mHZ@$zb3A6TP+Fvj@rX9H^t1M0XB<-6ESO!%( zx%3^pyiLOBF4-{;wAnF=UG{8t%a$Y=E5m;UD`~M|w`bLy96jk8%S>yr=JXzJ(YF7}IQ*nkbhL<;YmuA3&G>)peGNdARrdEY%rG;+ zFbqnH3iR-yQ6dhA1d27oprWFpQmbV#1B^oP<$#Fh*6^W&MlOD=QEM%@)LQHAVwr1Y z#fKRg6{*{jSwWd;S&>?6`*-vGo#z9FVFs{&yZgTTcJ*@aJ@?#m&;5ArbLY9|o^w@) zUibyaryjAzXwe6Z#lA%nozNdi$a_s<-yhSt(s8||rvO83*B{oqeA>yJ@a;u#&JnMy87i3$4|Ew_d`x z(*qW5c{|KuWQo_EEHL-{AogB&$3{F})Q=y%1k1?&O5abPrZiWA*5$f*pdju-4$OfVGD8+0wP8wsnOH3seAROD)NY z`;rm2#n#$NYdC9Bu!5CMrkslVjCa8f7%V{@E+cbWXM+Qdl?9$O2DFp~!uUk5Jt!s2 ze?h+>*{y=ns$?7f#%dL%AjS4tgiVF7}4 z7Q*QD1l-~ zUEg5s4k9aU#-IT6c0ZeNngBchjX)t5;&(+E$ORe`*=&#UpWA;nfJl0dP zG`79^8v;nRzA$TX0p?G%>Pt=P?>pqM#rJKO8s<-6nh&}#zpJ4*%+`Iw`jFW=#wV`> zmQj4p_FAsf)flF=8{(>@(_y>|7WNvX(_vl@hD;h;6Z*{bL7V19txq1OV)GMN1_Mna zENhXGm0oLLoK3A-7(p=*sixNHFwX@YnQew~FqG0@n9jf!%eSfOCKzY|C$0^G6Oss>D+K1XMgNsjry}L^`|;@UY!rjihPZ>5dZQo zVVuM2(1Z@MBQCA+0}NzE`M{XRCyi?AiXJko0&SyT!%88m{?@2I! zZ=13il@$rQ4DlU?an;g<6VgKUr{DnwX|!ra?*m&kpQWm4P{>w|&$l#)K22k5S`(U} z`LPV9)utarL^7k!Fk^p395^{d2HcP}1NI5qCAt&T zyB;gahp@QV1S^Y3 zo5>^~)+^M7m5@nbl+5h>1_WJQ>)3as#ej99J`TcivNRv(2-k<3^l^NK2xAve6k&=i$c z5%cbjoj;G?rH=c=jW5k>{lG37fx!m+h=NkQgy93vU+utyCe?G&hpsE&2h{C=IDLb#24%2_#^p6yrtf~w;qTr4#SioSN2J6!=-+ z_kXXxZ<^>s==%;+E@POv+Yd^9T5Z|*Hm3BNQr;L7s(cVZ!W7j^W4qR`JgT)&)uxgJ zhn9I9ts*7RPki~%-YtJ@f3+k~urlIy=vwTz;(W=&7@_JVxO_7Qcb$8;6%C ze%7q9!v0!eEsV>yLZfVo|qF2|g%+GyNDB~WUs(KV(6 z#}cdC_|!71a;EN`)Y&Za;FyRN+7nTl<_!6RV^pjCHa6BGY6w(BN31|Jb@pxzp)lWI z5J>M)$n3V7MM27mh%yUzgtaCj97>CLZbAM^mj2-DGyfwQio;F$YuUmAM9db-8d<4$ zludX?*1dIt^6eOX=^l@kCG#~w_m=l8N7irHg!eW!y{C-{dd_tDmU~)z)}PoItZK2I z)Fxg3oT&y7?JrMk^c*X_NA+}6)N+$FLtnx8N5yGCY>VF&qsInc z>F*f5wr!RqbA?C5Jryg@&n~Q3RM$18HDO-B()J!rL2Asbu>skQs+(0~{d4arl*Sq> z&dFoqq^3@*rd(1x-WWTzschWAW@v-1Yhjk}YjWS3e@|^iTxo?#8lsUKcj``_&?zje z0&0w#Cs=`qaR!C@260f zH~-$NrK-6M8O4W;UIuMOoj=qW|7No00mk!zMtO-gqc9AB$0m2RjJ*UBtAM%wWm0Xd zRF>-%>K6*3JbSaG+}OBD8tvJj^~`O0h$lQ+{klN-lMb)B+FV`49t{&JSGbiMJGNF# zj_8I`Y(J2GFRn{6WnSH`XPZ{YS0`_y%7|W7ZsdElJu%{N3wrfX3llIlqEO%Po3XiNqp}F25*T&zn?}tl+tA%zIQ`CkLlS_2ja=+<_fYJT=9(`bt% z2>s6nVT77ao@nxVLF0qssXkKeJY(KHXE)qcW5WP;Z9r9xu~RR*O>S=mGaao=`-r8# z8GC>I=(EJhdK1)k@15`6)#ddqIzsk}mU&k8?von}FT3AIqxVaH>oT`{msG@ATW4T= z^>M1Eh_b02pVrLOjdEM2UC~|pYUZe#Woaw)kGz^SYTL3TQV-0qc<%3%hhILRO4C47 z@=oS6=W&k7pSWvVwt7 zF^LemHgo}@OHrXvPjEA;uC+xtKciCa&Tgmfy0$$xjI?`4IwsKR+7#FCBA zi3~%Z&?|_5;0TXg9`a}rEQh}dp0@HNXj2RL7^L^Y(|2xylRn>lfJ22EgRW!f+dl^f zeiPuNXYLq0)hWXN1~{F0oQ0=GiEzk@arj>W){77N-vTZ+UMAoZ1OEd!Z4wD4(jmAM zZJG)g#2Pp~heV&?bml?$GaT@B0^HyLPX>HCVA#y|>GP$A!*Tj<5R$$d{5)Z}+g~_w ziHu55U$HtrGd(?W_}^8z!qME{DMf2?iZin#In5i_LLz4P)p6&Zxj8G$#W{Iq)M~Qu zx1{k3%P+*4QSpj&oS{0>TVugtP(GTNYv%7)_filq&PHh?@vk_0bzVlv&67-pu(vTO zr=Tc~pp$Qd4x6IMmeu+BW{VIMO^%L?ik*tgH3gP?Cr3>#n!Kc7wI$O$dGM3BOz2z~ z?k8*hkhhmr`^NTb?EsQ|bLj#H+Ur0?Y%qTvNVpV)iwZwt=*2r>;?1Iz^dCI|Xj*da z-zoDRfM*2rKTihvQaVFh?+-ah!0_wtDN4iDQ<}~}v6ki0nn2+JgjfUe8WH08<>WUH z0#7Yr_B{#MqmZMdG?l0HPIxLuGMZFwqmaHI@|Psn^BR_+O2A4{j?z?)(#7yZKLdDk z0RI4Z*?>V8^iz~3JW4NxC;AHz68&U^R4xwXXx;b@Y~^k(495+O}; zn$%9LrTgfpI2+}}c2hbFp6D+I9<}pJ;4K9#1$bh+DV+>Y^lw2(^y3gxxd|vo?Znva z!xGG}C?~d?(i-H`_~wsg_KiYXg?w?mDSZlFj!AGDec*{uj`aQTB$H1stpbW;;?UVG zP#7OUMs5<~lqN^-I5AG|Dlz_RyZB7II5XfO<|J#(rI}{#04m-7C~E*N|G+cC6OY60 z0pcY6*GExeL_C`o&KL;}1t3f%YF%p2p~K0_Tufm+LcbF=@PM}d_&b63V6p=hal0Hq}o6Rf-vLBLNm~2#T z2PQRLr23A<$5Yh5OSeA{i6n#F0iVXi%3!#+>8h3TRNj zz&Y|k_pG@LM;g081J4x03N$z*hd)AFxNB0>sgCj)dqBehl}pn(8<)Z5RXT{k6qE%GiaK+Uy%B`U_*_SMm5!Tvd6hIgC$4F5a%VZB zu;n|_Jfxg|O!jq$YJb8L<=vkuh zTAlT|f?2u?DI`S!SqzWttAGCvk`X$)^jAp7^rl}rYt>!-`{`G77uaBiq*)|PC|~a6 zD@3cTQFlQeys$^&L3wXpW@`A{H?B$=tuHk`=l17vV7%*l-7L!2T~KinF>907B?Zj# zfJ_XeTHLZBh4JjwrhSlD8S%Hv${Jw0=`NfZiBJj{CpWS#>As}3Nh7kyL8@XyYEmk5 zSz5z%F|1o-<4b+AB_7$jrG>L~7a9dw6EWS;m%hDlwkbEaAd?{(H^#KOxWHo0HJgge z9N-r@#o0@8R_2>>1$~Zbc<`nbtzj7MoY* z6yfXBZTXp|)i8!PQ+x#qHBMu)%qvW*bBpsQ{z3ot`&(8fb0p6+iC(CdE5Yr=1qV z=%QjNoD(-EDw@$nYkL!!kcXSY<7D!|941qs33iwU{GoM|;^gT$B2SLiWLgg$9q~hZ zBx)O#jYpi?_Zs4~_n~&4K%DkX&m(>s@xLPeh7kW0@ovPw0Q_6TsXpokdXLcl`vN@v zbM3D~WSj%60qJP?OYr1Cit8t$L2GXa{0w-ylYl#<%p>sRDDdWDeB0Df1rfJ9nIX<6NM8YGkI8T+WLlg{d-I6x+eA;+`m@_=I|7)cH2gfxmZs3kbCv)=niZ~#7%p6QiF zu|gE6mgILzNzlnwTuX98MOGU`S}c8XOe6=?1o4@GlOV+eeHa`FtE(h&Qy0(~9C%WK zBk?^p3nM3iAT5r^ZIEe-wc6G|kf+XOsjFBBpcW!5jHx7X!h!JwMMqUf}NMxmQtAN&=4%Gr12dOs&+4C8!n;udqs7 z^W2-oMChI?!>0Fr9ZTPHZ)J|lLp-e5iR1e$HnsFlA6coZ)u^ym*B-rF~AjJ;vbk|dAqS8v@qCBFRGD7p5Du7 zCi*a^k20IbOc?3^>N67Evz1Khr14DgJTK`7gvvluHQ^}<*TYQ;@Nv+1|Z2pb% z_nWg4Kg>`asCZqb>)Ouu*ki2k{hQWRDLpDAo4(Nc`&2F8_e_7x$?u7~2-!mrnz$-12YZAjd62lvtCtqoq zUR5!zx^;59A-)ku=N0ko(s3|i&PiCtHMUOf6S!_dIP2@@(Mxv>`0%yBNNo6!UzPO-)|L;Nnoj7CFTn{?d4*6CN= z;<-co$?eh^ZH8%0t((t{zQ4>bv20XgnRk<2laDo%9roMn&=9vtJKQ2W+^D)k6>)o7 z&paXdB1UtV#W-XNW^gCsJix3_Mda(P2~-G;?Y?spg~(l2jV zqfxB(x1~df88Wzaw)Iw$zFk$TfP8Rqp{?k$dr2}U)~r;N)Y`5)fvRt;bemM^HqL6- zpVg4FY)$BB-K_0TypPTxH1m4AUeS5h>%8il`nXX04F20b+d^4yRPw-u(Y(^b_3L}xWr zX?FXzoZjzu_g~j8yXAq`zsO&+jF+Mqt)LZyiy)* zyU-IbX;SM)mUYW+S^wgj=brt;OH#Kdjd2^olnfR{hAGi4iB&e%kQNARCY#h%-cM&V z+WKnDMq`PlUklUOm-p-pzJ43aSdoG>*{erlm46VcX5Nz~rzWOYZ8dIVy-jnD ztCQ!SH;(v@@yCa8IBTHh;MwLdtDDx3exVSx$ChoFb5?2$rxhOG@o&*|1u`#9Cqtuh728}loVyE76OG;IA&7CE7N z{ITR?Zhkx1kzK(>diS~1aL>v2s^yO*mrJ=HQ$|H``t50Ft@0 z+GY9L&ZH3m{D+w7bqUX2FrMAi*Rg+I@nv(@$T=FWV<9eg^i4}e_k?X-eCKq%Tvol1 zc`)WH>&ds=HUvlXb=pIZkN2!t8rCef>*$OJ{p8Q|wd>OTJ8x8(x8mnA^*I=mN$2@( z+$VBw{f#naPIttygVJ@cT3@IryI~tEu~PqaN*>BA{9}uC)SMcTrAtu?#+no(t%RFzIAenHi z?KXFhr#nXFnEzZ}d0U}ZvwG{@Q>{`Zch*5X;M&r$SLCWlM#3V2X+vUwcf7}_N+tbp zPRjRoc`;gQAm>zDzq+|rQOHgM>@_v#B zrB+O>;;~x2KQ#X4g7IiYy?T-V1}zFAx<$wExu58&_yWd?*cu*`sXoi_1-49UtjOgl zf5rIh=MmeaGr9yspUZUu<(o^T1w5iI*slpS5I4#7eusr~qFDSMM7y>l`7^^>9B>DZMk%?Yf=1v01xYBbll3zWX%R zq}0T2_R9sw|C}>z-J`d>*qWQwIe*2&pPooKwD&ikz5nse(`TrUA20a(j!2*5Z+v!W z%cyl;IcpxhfBx}zj$e8&a7Acqe)NkGzdzG${vhF_QLnsrZdL8$_rLi2;c&E8VfA7SVwz;9qfukd$>z_G(yy&oBTw7^z)!Z#xI()Zx89(t2 zsc&pNSlV`Pvzyz;!GA7KyYG?QJ1o9z;KXm@-bqT@b=*eYG^mM4$+Q$p6N`&C9<&-vxYQpOnD<$%mt9zEfAkKUpiqf#D! zXWPN7l-MorojtI%(%-wWQa2?c=|qN){`o(KReS7m_qBSg8e6j2x=E`&`NuKIHp8UW zx&Bo#zFXf{GUkBoYdj8530^SL?afAw@3$SDpL}ugf23j8s}uB(%a)&eSo1r{PEGd4 z4OMrX4^BQr~-gF94SzP=-DNw3bF`*DXfZSK6k?wPZ5$ER7#Ub)zRNbh-i_WWlWB5ru&ACC=~ z2?;a4_1=@o7aMYzm-s1K5)Iov?vXakO;a6f+ib2oaOB-HM=pI=nRJ_Z!>^xk|8;}k zb752eTKwt$SO5Cyx9+3lqi?u*HqJSImf8L9mDyd5x55xIyIKAa9N7NZb7imHIR9h$ zLK(9#;~sNnaZZVOl7YP)k}&w(ZV#G6=R7RkD<2|v2~jD?=Z}LTgwwm;QzGYz674IR zZL(xgRfdAxT%MGDt|8Y{RK%uQ3UIPnoMSHfX(f(_lBEq*9uKN!Q|{N6Yd>vPwlpXJ z2nV1+Tb}CkgtoOq_Lj;J3PI&Jb?sW+t5aG#{NGU-igZ&{-fnMdlQ&H<)U`A18toL- zgEzmaUH?&-a}j30tlc+#(GorBy4ctkV;_!rCi>aDpnmf&Q@tcWzE*Wjk*rSFWXp_q%wF~2smeA2hxy*OV+)=A``ZSD^|S* z8rwjl2{g2xAr)49Z*fLr5~z)o8Mt;5e}2!*pHy?|z;cRD@%>o)Wpns)<|Bx8Cd;i= zuXlcIx@^1uAiE!OpIR03!K;vc^(Wcagn(JvQ<@V}|MqC5UbiZ0%s5un>|P%TdCqJm zJ90v%R2Iq?W4)QbzM7S5t&tH8cgS{XQ=?KP4=`MpaXZI5H@2eB9z>t*>UuvqLH-wW z4P-R6V@~a?_r$S0=S(br20BtE+4^eMDQ%~>#;v=&W3hG&Plx#D`#z}$TR+a3*xoV^ zT}v5~Nkl!H#4=@WI&Mt*>M-=yu?lt2?w6DQ)Nb|)4}HNpFqs zIyWLmGNJcjP#}-kMY5a3C&?esnNpIF7SDJor1K@{tmEwZg#eG{XdJ?s2=Bnzw&)0t z+%J(g8R0^d(IVtzDp|;a0#47)1Ar4R1XqUPj0*7Uk$wyRc#^$@-c^Scc2aRO|N2nX#Bz)7Z+>ZWoc{%3$g4F^{TmE+*RmtnvOe>uE8 z{y4x1e-*qvew=_`?SQ{fz^`|}&lT_wIp9|a`0qI2*8x5ru=DWfMxIX@e)j<$fV2h^ zhs5?o{(~VL0C5H8CcsG!gy8PLzZdZ7NE-p4W(R)~@D!vWzsHTUh<^ca8oy5g_Z9G! zphJq(sJ`z27yFsuL4Xs!59YK+z^8Fp3OM!W^?=*=X93`pjse_$9RC1#B;d0Fr}-r23C-jo1N`67HQCi9I*(|KsP2nRm~!08!j2VAU|_*@1!*kZZ?r+khM0ILM}-yPta z1h_XIczgVM0UqiAe_nvcJHX!&;0qn#=LERf0WN_s7d;R60Uj;#iTN1~IPw2S2mHAL zyww4oA;8~rfUgtaUpv6J32>S-_U(Nd@F}Qw9N;l_{Cog7;bF_fonedp=?9?{nje{f z)A)<SVx@A|2V88SmHTHcTldw zx`aL76Ul&xDhBQBHgF(k#!Z~yMh;>|)T!OZ!HkGHqd$n%RHt?r2eFyT+ov3$d9%MD z7smsK!|Bd+v@GqYBC&sADB^UKUgPKuS<0D!((pjl2Pl^8YrdUvR?^03 zXXw+JMNiR0WLP@izoG(17vgdvx+?{m{kwGlw=SsKG4IN(DQ`g|%EA1o0Cg}w${Qt# za+t;fu7mke0oSSJ-zcYMM5AKGP8iI(i1UuH9}U4Gb?+Dn{5cq775H-)Iv(n1g_@@j zZD%L6S1+d%)v!)Dk<9*N`N=YP z_BG9wpN`aUr%Jzu@@iRKGcjV12$zRi<;Fa9VSfc+ndNYSELFPPhF417`sw*okYw2LG`+>dUYW6wZcRD_Z!oEy2oz}kxBBR77v==Vy*akeD0v++`bi{Y@U`B~g zW-q=#CpMRF=kPb7jtvtS6(3{A3I^Ep6YvL21s*=oKr7E^bf0Ot;qOKTRvq?-z0=LL z!C-Dg9g0Opi(@e$LmZ3&8RBRR$PkBPKt|tqa9M-xT!oPvdgCf|L%*$S|244p`lE|A zaNtIlgW#psXEjgwz#s(wPJIG8)Oi`lNA&$2_o((=LHZJob0`g0PwBJBuS2>K`R9>7 zjeJVO)l<3?`E>7z?&P0B`ULVR4OdU;{X+RJMX}Eey$G{U_IPkIn$5{z? zw?7Pcl!mL1z#kT#@X!X1KOOJ_0Q0lskJ5B5LwHKyEl2qj;HdzU0guvf^^_(&BxMw* z5cpgOJT64Qh2Vp;9YnNo2Ef@c!dVMvi-$s@gU@(edCI5q;EBjmos{H45)CChl@LM* zl1noPar`Jd4?KKcmYo&C(?ZxKgr|hCQwR?u1kbW2gv9?Lgg8c&Vcu}?y#joX0N*9R zYX$fY0bYd=EXXQ_d@Dktw_bpk3h-h9UMRqG1$edq&l2E90lr*-FBRZv0z6fKrwH(5 z0iGnl!x2(Hg(0MVq5dWQR0x#_;W_>gaQzyKvmMcv5#2?kcpUP!3vjCEBO#uT_zEF@ z0`cDo_@@!4JBC#D65{QsPz@&N&L-V=q&VG=r1Lk!{9;8!9}dV(mA z9QCOfFBi%X{MUBz#i&Qbabbp~|Ia&oV|2Dd9AN#07ts;GcqtF~)HmGPhP9~_t*tn< zJJi1ceW=5Kk@uAu*50oVy|)V5mh`jR>%bJh3*xEUnPqZ{W#5}F_Jkq_L%*Cw%s!%n zZAynbXpTQePz(PKzjn(t1sV5brVAe(>`kup?;6(Wtn6n-#-RY+a~~{!cpnSyVy^Kc z%3w`!?6twz>orB=Sjfe#{GXE6@VaK&U9RohT$3J|Xf0W}A=j%%hO=*zl9PY0IV%NP z19(L;j&^OZv~g=G!}4n!y;GezCDznh-$kzkpY*OyyoS5zLFkuZ-9=aOchQr2@1lncxQp%^Y-bC@cb0q;%k3v{zp_fn z>F5r|{mPNSf{yM=+^^KP=B*TTdt9X zD$5Y4{_oP?yb5apt#Kr~Dz2d)d;9n43egizjXbxZOan z{y8X_b7mKBYE+b9Mz43@;7YlWpoxy}6=(a14&s~T$A77d7hxCVcg`b^LcB^jujENW zzu3_B@d%a5J2;euwgH-~J00<`1oPnch z#JQpNRdvAXz;Ehm&>&jQ+)(?fLX2fL3NA+*T+`rwqx9ZracoN`Xi)nPgNB3aZHueD zSs2=l*ELgvFoE_#h|~CxBYw!!_|RH|W?r-F{r%|b$pA&_cR#@oRe{LUP=(fKTw~!1#^8wGMI|8(5?D5*&MkhI)0m^QZ?RPIVMQ8(Lp*l z%DYhwBpd;gIrChcsJNS!$oXz2;3s-NjJpMqUn?B51#4GW*Ix_z4 zSJ-2h7G~>eY;4E^Q8mX(i)`ihH=NKUwQ5x(gR7E~V#YJ8AMMrqaW(0!)5^ClOs8C0Iw!WYwVd9hNm)#dD-S1Gk z$1--h9e8C3OW&a)LUE{E=uv-Mr~ahJ>k}wd(E40#QlEn^g(mrhRP|@6KG3~zp-B$2 zVXx@OgxKjGFVMeGqwZEB^4j@z4Kr=garMdiTY@UApVxU%fFoyeQn~ z?RRebd))F{e|K)?m4m9^|Nf(V{#x>%VkIGX_^rNU9w$8li=}7By&NVeU)WR8>T%~C zJGOsQsZQ7?PbVp_R>-WoeVLO; z7&hcQn*7Y4B3e=x?Hs>t@5BeS7aEmrbz>V@&${Td?`yU1?LQr&n|2D?7U zW7VVFHQw;U#@)W|oAA-!pI>vPD6Ij9y8~AENoG_T;woFK6RnE1rO?u~N(D1>ykWH| zszfpb0<(H6wC)^Q#W+s4$Bb&}jP}xMX!W`e#;uZJ98j^YP+C$-+Aqem`>LTi0|T3{ z^?`Z2o>cV|&0(^RhY5wbwnDpU`XSD=+=MrcE zDTSR9Te{M=%AeC>R$CT<+3{5u>Et-Cm1eY&y)EAAR=_C}8T&g-77XR@LV*hOoxs8x z{=&csG@X!{yw?BT-#05UzlQjIljiSlch?p8_BTrZf4%D(s#H!Xx5kAktD?)T5uwU9 zq;OGnUQ@d^B5_JH;Lc(wP3}fS#Q2XsTNl@oAt!;8WBQ@X{D`?Z z)M2x$IX%oTgaeljMzC8kMfecd|GVK7=id#ZVy52g)NTdYkMC7WPKr-lpF3vL#9{d{ zbY;K7h?f}IpP-QT9ON-oI5(W{g&zWw%F{eK9mVSqzy~2KM*x3>?r>>0q6;|m{?5Xg z9G(p(3zL-Qy}c7?xU?IgMCH`fYJo-rXbAI`wm6&w1xC7*gLyEb!r2{h=R1|J58G(JJ-KY2e)7GDr8}{FEx!*#_Bffm# z9i|Q-L%W{mq?|>GINwo%MTyVd$X*0llnCr+QR4HfvRUo0DG}s*FdG=KJ)s#PVtQr! zW`FE|CiOPs)xW9zI@ZC_bJGPFXTib(+2EXfMl@oPW$v?XLAQ@M`xTi5S>~c?4EF$W zaVDLAnD_*(OTO^GX(`zMQuaC%T9-v}VnQC;2{1D{g*fBRwCUcmE%0zktT&XZr;@MHAF6 z2cD@9_*sX%ZC$ov70gonv^wM+>=&#uT%oTtFjLA(My5)}MybDMeQ;p#i4JO-eezhJ zuTy=#!hwNKou^ZuGy0rEyhDCb;{#2nc}8_lhn)YUZG}$l>CnN=$l@DX6Dljn?Dc-h zj7r0_M#H#jLtGYzt^ ze;K|plk)5Rl7vHsX$Lu-*ZcMHQ1HE9iqnf!pHCSTK3ap53mWy8sp>q&=j$5vS2~|h zS)aUA`dGHeMak?|H|oy4CD3~X5b?_@y|8Hj&rW~ zR~q$KgB5Q#OxslfW8U%m%Wi>^?nA8!Xh@S`+CkD8^8tL?-(MDYqJsYbKMr-BMYoqSnoBs~Da1(m8<(SiI(<#j++x6j$W!8(BhAJy%$-BmLI{&XuIb0mqDx5>Ie*4)s;`sx| zg{Kp)R?6IhB>^{!<_9i{ho&FvH6gorn*qXU=fXX~nz1T*g|D6st5nV(VYN6v5M2~} zSfHQmo^-Wxvsal_7si~Kz@5N8(BQV4w~k=dWhEDF>oYwt`>k7p-OF?uW%ZGbn&7wk zor$_Jnt*AtwsJ|?1*2|vlE3CggFI{QW=Z`sCf(C9{+fv%BUb3x<(KA`NnW*>bkF)V z)k@0tY@HM+ubfvcIk&jUB$t)Xeo4i4OrEav3kYSh<7P9S&@eS-o}L}Cd3NICd`ro` z!n_lPq-0i;yiC!uP1in6qm)^;Fgql3!&3LFW`>kKX^tD=krt?AGsY5v#y6UZPX*NksCDJ`TxMtfG{|T&Gc3tcpC1dL6^zV+8<_4*9eA+nDi> z4e9KL)Vd9+Mk%SbFIB8cwXM4B&YgPNu5+Qe-sf9}mJ}?EST}~&T>lnS{FjZID;b?# zM#sZ~MFBbq4(b^4NVtQH0SFrT?Ti6nNt{l{ZZKmY>C^sy#jS5)gyn;OyX^tb&z&1K zIMN+>3TNJ?SI3|U9f>z~xlOXS)_^4)D`AJ>78p?&#IV8t)wTytT%+hLZ+l=$!YomX z_V)aX@Bejz?!nomio(X3QdXApp5(C>nY zmuqBFZjTO)__JdZFIQx-{C>VfSGss>bB)g&Ems_x`0p@>R?bMqojWUvThF@rO0Z46 z=pLN_NMKF7ZiV)&VT3=w+4l=P*sc7s=9U#chf8IpjN&?vn>e%%pWCvv=M5uNJlb@2 z+M_3oUA8ct$n)>hHZ|*f=2*o_OP_M92oBn2Xp!df6 zlglO4Cur1(B|H69-__s~D=je0O0SZ;-I5y$6sPYVHBR+IUt_Bd?~U_M4Drx#KVHE9 zmSq{*Q+ABSJ$uHe*(5TSo!gN)GCAaz)9beWuE|(s3riLmzIjb|bLxmb;{d0=%BZM^ zF$am2>hF~N`okv_6?4M$Jj1%Lq>nys9dRx+tVK1u&~|B+zy9MJ8j|i<_7LmqmzLOQ zXed(k;M~o~|G)HTy5+5u4?Cg?)${dBoff`B)zDa9Kbuj~Fb^ zY~m4L3+T|>dMRGdBX;S7tl);&ZPbse6ryLFgQ~b_=Y)m1Puz6i#C3O0d~g!eG-{{m zzKf0DKGb=?TW;C-1KT8bZYuj@So7`A=xn~s+^!z!>B@=)9V69=hSWICbu)c4WhkP5 z$d|Fy)$OlzTQYLyEGGAtp_R?$O=qiC$RCt8G>jg7vYP4qFrlhqvr3in)`HI3JGP9u zX;S3W_~{v$_r|Y0-Ru@pUiP5u!HshHpA>GBqD(&fWXIT%o8GOe^3aW)dOnU#nY|=* zv$Ul+W~!AEcYZQ@S6NNf{@FG#m5j_PJn1goK7U@MTSMmfpc@`d(Z%uNDP#BD z7?5~wN6GKc{VgVN{+q3DyztF$mOuVQ@)N357#J$vAFlR)*7sho<}u2g2Onq&Dqo&l zy!Mx6?|9k#N8h?RukKjNb#-m=-bX*}K2&v2c-<3Qy%n{i^({Guhj^XxPkh#GK6Y-V z`{rH8>y`(-_2AOQJGYzvx#gqN7j~6~*Zg{skL{7shJTpYnfmij?sDyE%gy{3%gx+}^<@aTncP}@_~_LU|N2PD&vG+UZ_F*o zU&+#+p_Ij=e<55GP|dOh+Hx$yO1F>Y00aWC2KwSXOSP?CvbR+gp^&J*ick?(LNhV%3@krBra^b^CO zbJ2f=9FB?QWiv#b>hy}wYW(Gs9j|^jQg_Gu6G(Puitp3bHt1Eie!%NhS03&>YKl{= zI@t9LuUGv|nF)H;Wzef0$>~+U;>PP$pIYXBAL&*9fY+a%aL!{- z`BT=3hdkT1?FA5y?!f#LJdqp~=|?B_5>SB3Ckg3Pgybm1F$q(J&I?1B2t1NiT8eN1 z!rzOPB2IYZoBPa-|)bhhRV_&&hF8i!Bte*!)c z>6ZYH5a6^23`d>eNS_1zMmu;a;FKPLawL-_*1Hz)NTkUTj|7*Y>D&&wFnZ;{NU&fF;5gFbbjFKvUGAWN0&u!(^aQ*p*G2ln zzW|){uD<|J^f>yUqlAw^`mgXrkKjZn0dS(D#6a28SpqoG2?X4pPN9Gw=YVe$@aZhU z9=`!_8V@>W@D=J+qTU05Q@^YQ++OajL%`n#IBk-}{_*tS^|S8=oW@^l7ul(&et8dY zJR&?C^fv-dbIB9GBgA%5y`*QF+Uuxa{aL^XF9!HDkHmVv7Vt^#Or%5oEXU$RbVwJ2 zJvb ze5?cfGXbu3fL{eX0rkxSob*G8{X889kJKJA%t7Z#V!JGW)A&6MIQ54Je^7w`$pPLV zz+ZKMzXUkV%Ts{UJQeHh0i4E{Y;=qBmY$0cJj}$00dSgMB7P>|G=8_)!|A~noVcb? zNO+ zE;AuK3MEzgknGcRB%`Abp?;bGvw^KC;{AC z;FIKN!|?p#-5(kcm~-Jm7YE^e$WE16L-^88lQ4(uObH{G;amaYfTQJx{x6IULrfGA-o%Bwo-7G5QK?{IMX^!nrRD)yYJ zjCRl%EocpN(4Q@+^mEXkE#O9r64XPh7#uL2`m-riOzF3*|nzX8mMWt@qp4>oc7DFYm+-fy64<^eTxdWIcDdHU(I z<`wsHB3**|py5yz1cjWaZyv}2$+Zj%ky|qURr;I<@D-UiK%?*g9H+hKMDKAw&@jk~ z-8T$WuJ?w4$9GRr&dWuaH8CqLiJ z#o2U2|6i?bneUWgzqzQ#9eRd@VVyQ;2%XK>STi?<&g&7CmpXg(M~Vte`*(JvsJ_%` znOI>M|FbtpTr7SL-OtGY^L=?O@813ogZT1w-oMTj;|`p!G&x+&*WT_I-qg-(8lX~F zd|Nw5AEC&EdVjyHMmBUhhIP`@P`%udltr;{OY6zyI!gM8_b4OW(V;;Ireq_#Fgs zsHZ3mS5N6f$R}CcI^;JYeGvJShO2MFpGJ86md?XX`sa;+BY$55V2=Wi(s1>Z-idtr zZkK`l-AHdkKBeL6DUJH++X$zpcRAqTi_^oq9(a_7`*xN2j<7ejcbcX}qAn9s8eOrEt(s1>Z4ui+%3+~<)zBzLDwm^fs zw?!d5mk%8JCduj9g)BYDa-tYAF(d#I^tp)(DTC6KPhmSks^_o}VqCfOL4^4HBWpm2 z&uOwcA>1W|wL(~l5T8M0R)j=vJwmiaR)~<`xdJ>}fKy+inX;uqKE{D7mny(h1bDIl zPZHod0iGbh;{KEc00f}G8PU4TK5BE<(oOs$G#HpQh@0f5f$C(l^r$&d6 zy!}%`oaF4^Lmt5oB2IlkagrC$7UC@MLy3+GcUchnQ5+u?=pKe2@O+T&0`3%e(rHU` zvkRW$G=B^N&L!j{%6SC+?#N984ay@o-!47^-z!A;kG?xM>`fK7wGl724WfT`z!to( zOs|&M;lE6r6sDJ(6BV-q>+QdL7-}m$*xf)En;en3Yj|sjMf!F@{V(LYs)=vQum_7a zIjHJiqlDrlRb0i@C7CQXE;BF)7ndqna~)YRPzB8J2%eJ9-~hdXoE`{~@dez@rdr z80WD(aBevFBjd0RPaq;TD{i zIPi*lXGO)9ocxtSF~_@&RX9jGgf;Ly9i-SfYQE?|LsZAcfgEWhh2Y!~1@?sTcX-5d z_Tf;v(2OXX`Y_rsL3kP17Z&0}-JxrIkze2a(3ji`#R-k^fYCdLdu!q^wbLKI_zk>E z5MJrP*)aM7pTfC41_EZT;K3SG2rrH?qQiE&3pYivA^aUQuUVR?%Q@|wm>aujuw2Wc zzP3;wQ;&!x_b+n7uS+hz8?+v+X)rFbO$&Rp9y}+KZ!~URvsjG!CK`3r$4W4UT)i3K z5aW8U4tc`3-b+1@VWP5b*=v(FCn{gL`u7iCwmw%dOMf9myOMf_(O;OujlBNCBm>e? zy1#f|($&8o{XutOLIxmi((H9f+qtq$LfIHyzEIX%DErM6`?7mc_VdO4%kCD+j?%3b z%Dxi}42k~2bN$M0`C;TN&smaLx(iRIBA+P*FO@H!#ZAsy2a0P2is!Xe0>uXeikbZ= zntv#qy_^=dA>8+0JsrLe&+Oaq@4-I>kL8406X|Rz4eJvvi$)=|C)eaaUraha<5b5z zSSU8Z?|`Q|!a)d2FH?vOw^g9M1K~vb3WT`7iv@}3J_ma5!JiZ8BH(y8Vi9T(=r$r; z=7jEg7j*4WsSY0;nBN2+1#jO!bk^M@)X|P`wS7Uv$@YUYM>H3JRx$ho0!`xE4c?0P z$tlpH_-TZ{bwVJVI?jnBx_dzH9r%wN=yrkb70{!xl!d}xxRdg9&wnUKb$H=N-30ha z@M3>ZQ+4MW{X=wVJgxZAS}f3A zkC0?y$-aAZ0Qj63CG@1edVZUH~gQ3 z`l$bjOq~Yz-i7+w5Zav7M>0>Y9MSFo%^vtG0&VIiYD*7(=IP>aXw7N8wmlQn<-S` zy+h>-o%B}-1R*JpynTPgpv+Py{WS&nVt--j;M`#Sbqnyt{v!J1X#G#Y?}_D3=+6T_ zwV9k)Zm|Bn4fxbX;$P&)30We?xx0Z+xa359nj@}U4)7h@i{-$jTLpaL+n%4n`lsR= z`KhwwN1T6y@w3y8AHt`;AFMxj3;5JPk^W%)^91ne6+!J4`Jnc?+HYKId-q;rd!GTm zIKJYmYcT$s1o||_#6NlB-_?HRHQdL(he45W9ed>D_-qpV5Jv;t~)Bk4# z{z0;LyoQ=@BLCw2A8bB+A@EOqiq|g3`(V#k5Aen3QJfDEDCcT_ey#K2A9n2(`4{U! zH3J-tFSS?ff9e|=FIVGB?*noE45$AkEKi&06TV0vQK#-&+pA!&ZT(RJUmRbN|H0;i zAMj~@Qk%tor1{`#-xmse!X+>EzxW&gG{9-uKK{k$QLJYGG62(oPyE}{AB_KG;EVi= z{0#OyE(bo%PjVtZgU$bZwhvEiCqORUYGl$@koc$mr)MP`-j%bm*VdmKflqUdoY;>P zx_Z89*uME7ws)}ptOGvvCpi&+u>L&A^86FN*gs-OFh@u03Gq+;L+c6gJ{Ui*v3>N# z_7eRjagrl$?~b$1`^VMq>eIk?wm!J}eRv-D)IZb);zwN1UH#ts2k;%&Lz)w=ey_=b z`}$pMFU=oUzn8p#FU~g+KLYr!e*gFbpXMd?zlg6z+|}=w@xZ6Oy*+*m(yo4&L;*hz zp4{yS?}C>gejmazcs@B zq(SAWZgNzw1R?EuS(E4F z7n?14=Byl3vAHNRzaS?+%Us%@Ok@U!x!9a*HWisCD0J4*FOez^xLv{Y^xl#<&9E;j)G~N&OmAss2zGPos;h)ke=>XLTEt0ZtBBl?4m=_cFMcHurN0#6D$|xQv(>sv~!}4Sk9Tu%P7bN zgIwU8j*#iBcv`l_Y|4sUQjDoL%L3s>#xCld8eb$m-41aO%8Sh_VF<`7Q~=mM@r|-XGU>6%1d%MZXD|&Wa0#Rpq5IBaLsh~1ogGna24ciu>Q z3}@8%Hwj0~F6x|?9fA{5jNQWLw2yipbiD;FC^lynueO+(eu>_C`$0K@$e9Za3zOz7 zn4Nyxf_V!T{$c@>nqpY2Uy_`j&IgNUrY>BZh81`5Lc`1@OBOE1in}azW_oWqhonfR zKhk`?A^CqxnWJGAUlPS6Yf-d1gA0+BzHmwUQddQTy*hdDf6nogkKn>AWI|BOD)RdX& zX}ACA=GqaUT^08xgaL1QJu(GF=_S~L;YGuk?B`{14t6cYro2MJ;PyvMPL?^pIA=u; zHWOlzJd@>KGrd@QiIBiMgMyagbW>KA1=|M3oS)SjFU(|k8_i4!x4;*3@00ZW)p;2p zyMo>*MGUuxGG{?;EB`JiVrb*kOM}}vu3nv!#nA4MSJsNRQW2WKiMMcn8L{>}tQYC# z(oAz9y-k@yelL^G@hK)iN{kkoinEzQlLbvp7hybZe;A77qa#bi#!`PVdEh5kBvoMP zi$S(yb$&6ETd)#u^<0r~fkl9?#x59QGpkmk%h7IrXwq}&&2Q@43Ge{E$IvC*+bEs0 zH-|p%ZD0}iJ`k(s%TOO+&EyjnPCSQ?FO7>$pAy|S>Gg{Z$#c?X8q#iCJTpCA$fY1Q zW-uh=>KD(yJ=PVDkeO<5g^)^FsRq}z@R>yCW>+-$%ziBx@Cf$HP4AZyaqWM~(C;O3 z6w+@U@}hJ62~EGLM11-^MYx1xUxskVxuPeQcU6~2lW5RyI+3=kas(Ia68RO&5Dns! z9EJ9H_Bi(KBDj5?ef#X;!>O0(QoZ&xsGNPfkmP=A+Vd{*NqOYNHaPMo;!#<`q2H`T zn|{ALjsrlPqu=WGj>?cD8dTO^AF=jf{+mtWHRvPG!+GVf^bv>gHmt*Zqy6HP{_{Me zw+*miy*13vhV`6T@CU{Q#_G{gwW?IHw#H`hSFAJI)@MuCmfF@8 zDlFj&OSaUKthg^3aa(Myt+Yn5E?Zh;wZ&%J3hNZbOgm@k?x=)q3l2QP8xgDbJ{ufx ztSs=Pk+l874jxmaRFu@(ER3=w+_tvX77L?k;kH%DHvEm%DoR0$bx;l5t`8#HdiCC2 z-GMNyM<(^^y^od!9;**z*45b7g)5AOwl&}cCeN~=Vp3XKYJ*`lz}IG1Sd6yfY+Ec4 z3T?4aK&ey|G0HWiw%BCF8m(=ubN)|t2cFageqJBg#qrNsL$l+YiWkCU+hE0wLC3lS zPSppr)q7t8!`;wy?ALkk=?f<828JrSY@@XV_= zJR)H+5U0BXpqTPx6Pb8BTOS0YZ)YS+rIuQ#=B$`nXtR_m)*ynR++!=z5GQL`n+1?Y z1x7iZsal67qXUJJswjc|KwaNp?GA!AXE5_&Gl+Y)myyM~v%M`fN`qxh&oul0fNAys zbCRiv^-qGXmB3uBr-U@dzUfaB@K(lG>kFHA7dU;vmzvbycgQdFsK4zZ9kr)BvM_ICOkk#ZH-}CJ8!GbFb;Zk8>G|sH^)J3G1Lt+msp=~{~u6He9#bg za4>DcTAy=;YAEwXpZp_LjV^+cWhho2&=sUxSuz8PxAlMD-%GR}$YYO=xT$d(aRMtA&U_ALt3g^eS-DIvo}U0qLxWZ)y!-l4hXE zl@;;OFI)?y%zDx+Tqo_-CB4W88l}O^*G4ssdz1QW)Y7Y%xY4v?3(cVGt(*L9YihVv zrA|@OW{a({t=XfXnatW^SzB?Vtr+p_inUdWwRQZO<2aMc1CE)3TJ!;(n9tUrmf*n7 zdha7x+@P<#cRpLOnAFk=P)bXstr%+>x0v9eu=K5jw30ND3DA=u#RPpA9C!+kFrL{u zGUj+vQm0tE2aBPcmK3dGt)nRsSWHN~q;^y%<`9(1b1t zXV-K9wJLODp}%c4*A>JzUL1IXWJ_1=Q50#pR-mp9G_!}XTZN2ZEXaz*3Ov99<|;-B zW29^2Y!(_6TBz6Up+Q{BylcfW71U|;#!~iSb08vU3l`_Y;G{bc#w!6i-yG0oQZu`Q z(Bu}Ziq03?J=|NS*0x5=y}69GHK?U`usW@*umrJ^0c@1~uw25VyHF%#!ha`KlSsP^A!x}2_=ab6%8ov=K z+p4`P!{%$OZ2=Phc3;-7>lRKO^zpVwc3E#a=o7rNJ~S*i@$uI;X+lvCoD$~+Rz?zI zWdbIU7VG=R#%~{)>V8A)anBfe88#?wO-e=|?p7{q=xWh%26$sE6K<&Ud@C%>LtC|_ zrc$|f!VQT&5LTsYOIDqPQH)Y*SgZdj|Kue}9@~FA>#ftWwB|=D!zA+V*twr9ebc6S z!%DjyC97D&>BF{1DcdM#g4%tpEsvFPI;$UeLFvl|UVVF}wRrF0Pm+#b{r%QZ&9>7? zd#ntjt5k+{ckoQzdRL{gX3N#jU|99`k5}zJcXe6Hqsm#io{B&;P{Xk0%sF4Iw6$z?QTwz0BjdboVwF|Q|6%S; z0HUhexbe#(j0iZmBBBn6MhZB?=HNPPiRLmc87?{O0R6)T5P4Evb@|c@#6_$ zR9*XrMfnjuoj$DzaZ1$6WR{C79Io7KFp;xw2fJ%6NVeK2s>arGG4pxwq}It(RlTnl z`>TqU)L6?bwA$ybn8TQ}ouE*jyt$V8F>>|itM|2kS7uWx-(X>HIY8%Y4)PNB1yo_T%w=EiP5}c&+D@_6zRMS$VamTb{c4 zlI1-pOPOVeHT8_-w8?@jy-1OQluF&YymQpwL_zvzT8C_`-x& z4Xgd_wNi^q_uA(}WlkD1)&HN9T_v`cq%kv<`?aztkZrwXs%^XoEo36J4JXnzg5{pp z889&)6&7xnu@R(a=3MjVPHs#&8?6E_~=_x z(at?ui-M3z`_Jamh5hyhzaWbjG8Tj?2Do)~x<7ep(Lf4%8&sX0_E~tjO)67S(qgsc!SxU<{cU8q4RCV2OwqR)7(D9bi?eit7WM2=e`fPzk z>(FkLbf-sGRpuoR>f+h;RNOP&Ev38eN>q6>qNsZlEvVLKZ0)5L*%DR3#vzo`qymdL z&#shocbr7EW`+l)I9F)V>e-!=?%5+zZ9M2sO+Qy;5%+9QO1kf`M790Cs_Wu&g+p7P zea%w3f2TyXd!r|{;am|FH>{hb^j&K^)w{m#RQ0(Es&&{9OX&euiR$1b8Fleo2^BY7 zVJZEE)1KRKJVd6nRZ*3rpXZExX>YA5C{>qzU{59Qd$i`xETsmlXOQjxbe zqDecDvdI3>UXtAO){1ylnRehW{UsGPGa-jC{{P?ou6@M=t<)_zt|7w7Nj13WY*Oxt zcYi;);>pIZ|Mly^$EPQ+{UJK{Nx0Xy=kJa@;k7dQ^YqL=!@bU5e(3wU^S%;IXl~A{ zTesd!5Bk(Aef7n~hjKr-@bl%{qjq>r{r2q7pX^LK^7Z%k|9n1j+M%-_?%A&NF? zv&$Fk`sDg=hj+|BbF%n;n=A8e^Etov`1*3n{paTlWB}v+Uz*RZS&s5D# z3)kZ4Ej6Pn{<&wBmh*NrMahVG`SVqE@~R#=wqeuKDEK}*E3dj((7U*j$Y0%EsBpfc z({JNaFSq{y^q-yMy17<8jkPD^dd;fn9I(gp_G8MyW`)lF3$~-}t-QegVa`YMUF`qz zhrJc#Rs*%zX|{85q~&kgGl~kUK<7ugBo+*XBo2}+B&clDX+S)v8@2^*K=YUmRFPmMHpmIt5M%iAunxAhMI&BD4 z6a1rUzOmV}*X@Hd*VE;hE~-V1Q6&TSR~|m|VA-8Ym#A(htgiiC(^6QuS8v0rSE8Cv z$>-@aGIhK>Bf9y0HY3fCnawon$?4LuTF{lQ1RN}t&KJhU1rV*ktECCSG+T%Xn%1t)MLtQ zWm9zGhitk_Rbz*{{vqoqzAqu0E2zVbnIPBm+@XR^gx0i|D;U+UvOKQwoJQcf*X zRv!O372MsbR9{x-mfuvDSbV0}oc~!yb8VEaIki37U6Q`PTG3Te@VMBu{~_nWwi(UU z_Z%ArmDD*FZ_?NPtc`VUJ*-~SYmPa4Q?}Zzk=5K1XCwVCDmHfNLg}9lL4mjT+H}7n zoBREMrUQ;8W9{9yLd%4I&^RMrEU_A7)AM;lMMS zU#3jH?a*g`^x-q3Wse6q&UemXD+NwsXm>1`WS^wh+)z|fIK)QDYSylI4NR+hWqnX% zrPas>Uzh*m>Z`U&TE9${KGt=G{HVS!$UYh9IL|pzuUW0>ZtG+JDccvQ)uR&*7vFRF z{j=|j7kPfDcxmi{isB}h-?VuzEAK|BI6bj-oU6OyL8PuBRV*3gxY4=Zi)~2fmQ(i} zMh5P?YrEmQirCm|E8A2KyP+YSbz9tAC+Af6{W4`+v{F~yOH~ySu7Anvb(+W6(*pR2EQ3|*nuygmL_REgV3 zR&zz*M2GLRv9aT}wmyP}G&FOfJ>8JhukfT z&}VGMv6{6zp7GgP_~!c8SDd;P^!S_dKb{$^4ozOadbMvzKtrD#+ruTND|?2%$);On z)#LOnYOTc;Hb>1Cdt(-to|YxEWd&n+wXz|``6IR#ma0CEbWKo{&Fz8X^MmKkS~!Qr zL4}^ZrCNKFqw3GN#TBPoX6jX)JE&}o@#LsVnd6!#KcH{k700}wc_-_eciDnIC3Ec$ z=u6Vme{G?6@oYA~QMN_fPh0c}-LKD4-WRvjCBd9w9m?t zI14^jhQ&PMbmt@UTp!8z=(_XhiW}aJvz%-6)3Nl=J|*7vAM4v>;>&9bdlm1{_al#! zr}O)SzNFy|3*s z`)H0C>$=tZ6u+czDu>T>39+-9syAc%_mbd>#nIA-kZR^(GWk7LG{U1GY0rg6;px1~ji+o$@{ z_$4d9<#ZFLQl2}mx*OBN={Un*k_}TFox}FQ(G{=zNRK!#(3eKj)V`8o_AwkY4s;9i zu#t1jxC&+za?SYJvbH3j(>8ut0;N&GEsal95z)<@Ci)&R;{?ZyZ%Ap(<&;KRU&$c* z5gap4bh930)0bn$jV`BbttN9y<2TF7wH9A|Dg!H&`CZ{xB?OQs|-jCB$8lh5bxNYNhm)+g1)^p7G-Li7E+Xappx%p-Fa^3V~ zzu~!0TIshxI`b@G2Hr-_n1@5uYZmt4+p1m{9UC%ZY;> z=2}r&S^$2uZZqb(B(%ZHo@6~k|JiR?aJjs&nP-y6?laDfe3N_wE>*zCl{h9Hdv}A) z$2^mMT;Sl}z&C09qU=w2GON=a{O^DaXlHU<9MQT+e$v94_+-SQ8fn*89DF6+W#q#~ ztc-t3_V*T44G=Q;A7q|=b^U=cT6#}DofT*IcMdML`I#@XYrP^-peJ?3A3T|)57z%O zj;H6?k!YJgc`~a%b5JyM^>_qIdOchNcSV=F|vnvMm zingwh+U=Ix?NQsk9cA~9*6!UZy8}%THIf>&?XW$k`cZC{MGfkbsdufXpfhsaDsjmhvop-oPB(kFp6zZK;a~KvhbeWINajkVP5oc*?VNs>y;fQXZ zQ6bh6r*Ca6LI*r5>weUtNFsHooyXCcJ-zP_#+*``p8 zvLhMYQqg&|tXmp7@02;_qVuOJIFgT%z1!rt9G&;&-B+TsMe10APIypMiOz=^-S?ss zOy7sjzpA>wt(Scdosh%8t4Z3_2kRPjo_cKa0*N zr#=DbjGNwPBs!tV$6*rC^yAUFFT*YYoe7KkC~4UvFU(Hq7H4C>q#|V4U2Cbks?>f7 zoXPb7o%>JEeT+_Rcw|u*M&Rh_dF%Af&FFk|YD9wtBcKgcHlnk%PT7Rcs_=Q`v~2V2 z+G_6%7x|S+$Dg%*RHc-g@0DP?y=AmBW?sB+%@J*Kjk?79`l-3t!Jr4uL+7Xiq3DD@ zT);Z#*PmtuBG!drw=0=+pon$OZ#=E?k%7B=$sWZWC86=>2D7wwS~{Cu_1NZ9O&u%lWNthQU_U> zR$86fB){U;W3XF)Qh71ownXo*>ys88sFhlT)E^11SKE$jwMxbDZcU}*49`{9aJ=hF zm*5f1v~Te!NH7f(OtD|m7CfkxPLOuqMdzKmaSzbhTsQWyo-MM)CR;ad9XiXxCT>P& zQ`nTl*m}!Co;}Jo@A|1HXlD}@m)yfsR%{uPxOa=C9sHEN{=6*TC!|z%{3koliY>E4 zZtu;voZ(rqYWCb`E3~uccJ23xon1tw)@5$eUajTaq#w=qvm(HP0-XiHlZgU}PQlRXe9IV5S%J=i z({?>dE46)e7WC=wDO+Xfu2T?wK$hPtZ@*5#zUl(Vf~-iV;PW0mN-MN|@=`DhGJ%5C zU_lR#1!wl<+qjojtV(0c;H({lY6t2p80wcOD{$FZdJqfo9Z=AVtKcBN5MSSJX9ro( z7h;BQglwIMz6_2vy5&pkJm1=hg=lj~PzF2fT)?1#$Jts~0M)pPQ;la+D)M{Hy`w9G z=L8B~|AMYYeIY9SB4h=Y$@>ps7Vb@!<#TJ{HYk|Ht%W8*ErfuAV#_>TEjWEq35BSy zg#0$p4}uUy>ZL zyBTZYxxf-@P*9q{D!A5zC>Z)Ks~}}9Da3Pkj-Z0tDWn=pcVA}}e7pt}RIFdhC|E6l zspgc=37j2Z3rrh2fi1Pfj(y6f0-bH476g@on?CGCcSg3-Wi~Ct{Sa#c6psRo#sY;dwxvKZ09_!cl85mUhGd6 zM;fkLrEICTZT4N%y=uwrfl=Ll8Cx^kWrf!Jqes-dMfWX^G~c#L`RJl;bLM;9Wj2po zdu>*SR$EUG{zu`dUOn=I!IY3Kix8!H&1it75nZy(6QmJvIc}&h>0s8_aMXS0m%9!={Hx7I;e6g)rQ#t#cMuUnvXj8sn*6 z7s_xjCnOVnb_t$k>%tiBaG!ap)qAFgcT4tcS{F{Z2T|5qS&LMqdf}Fw{HV!K2Kgx? zKUL(XiTt#YA89cB$jOhI{A7@yGV)VJewyHCqqWxod(VnjNA2!9mb`}r-S?Dh{nC%06&WHcQd9Jt!baoz`4oN}ElD!LD* ztS!6ySlQkALTg#DDQq3pBpGx3?*6y7SZ=&Ld076cZNuO1)wCln##%dd9VNB%`0TEy zZ1l6ICDc1LmW^9x|0J06iIzW=&IJp)dDYK9+o-kN-4{}@TCK3M ziQw63l(u{$JU9HfgQjpE+&ZKh~R5yj;rf9)e}tfc6n&Lx&T+A;w1W zPj{JTecSU9&w07*5p1(qxjf8T{&@Uoi-P;%RH&EB7!rPy-A&U<_Ole8>|x_RCG3G^ zw{U~-L$L8sl__r@@Jz1VqJ;v+8$WK3%-OAfO<&}x&?`GyK zNZWh!&c~lT-o<_Vd}Gr1x4mP&*)?z*Bk6Sh{^3t2@A~ZL`-^j**q#6O;kS#tz!ps| zc^Lgt#^ObHT{b!XQMfdBT=zH6d%vk1GvbqmAO4KoRebroO!bGhzO~=bPorP?9G-Ch zvt=7RAphs@A=~~Po9i-l<@v9>U)ne?An@_Zw6B`mG@tf*>D%^&@kjn>)QlPbp#9>N zc^}OlQ~TzYZ?5{ae|P2Rp!oLkoRozJFSwH$J4rUdOrW<$jn`JB{KpG6HJq&Vrshzr9-Pkk8(rx1SOTE7IwU@a@ zgg%a#sf>&JRwmpXcDcbxGBI;^yFOu$<#a=?E(z<>^PzP4tS}F^sfS9SaD(laQ*~0O zjfX$ahK3)p$GT+ebvudewi`Vpw&lOtNlMDw!1ell7fH$M4~9u>w?Fii*uIg|O;Ykk zUQdbbt`+?yCA(f3F0p-6>nACBvjBFdR}?*8y0t>~)BY>gUA9?=RPNQPE6&P##q^ML zdEF+&VxLxB{*J7dc9NvaE}M{>&y=X|fOmzjq{|zYA<@s|H*~eDJ~v6NZkC4i3cM>_ z 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

        q6Z_z|FI2k<@|{X2mt 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

        TQNuZc9{nvR^4yv1mAt*=|rms~j>7kK3s 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 z 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�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 From 97a516d7572349adea34e9459ab37499e6e8a5dc Mon Sep 17 00:00:00 2001 From: Ruslan Urmeev Date: Mon, 18 May 2020 19:09:25 +0400 Subject: [PATCH 006/115] add OCHamcrest as a sub project --- AppCenter/AppCenter.xcodeproj/project.pbxproj | 167 ++++++++++++++++++ .../AppCenterTests/Util/MSTestFrameworks.h | 4 - .../project.pbxproj | 163 +++++++++++++++++ .../project.pbxproj | 163 +++++++++++++++++ .../project.pbxproj | 133 ++++++++++++++ .../AppCenterPush.xcodeproj/project.pbxproj | 148 ++++++++++++++++ Config/Tests.xcconfig | 2 +- 7 files changed, 775 insertions(+), 5 deletions(-) diff --git a/AppCenter/AppCenter.xcodeproj/project.pbxproj b/AppCenter/AppCenter.xcodeproj/project.pbxproj index 37266ebe53..1e10d239ed 100644 --- a/AppCenter/AppCenter.xcodeproj/project.pbxproj +++ b/AppCenter/AppCenter.xcodeproj/project.pbxproj @@ -405,6 +405,9 @@ DF5DA1FD23A0E57B00DE695C /* MSDispatcherUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = DF5DA1FC23A0E57B00DE695C /* MSDispatcherUtil.m */; }; DF5DA1FE23A0E57B00DE695C /* MSDispatcherUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = DF5DA1FC23A0E57B00DE695C /* MSDispatcherUtil.m */; }; DF5DA1FF23A0E57B00DE695C /* MSDispatcherUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = DF5DA1FC23A0E57B00DE695C /* MSDispatcherUtil.m */; }; + DFCB80192472D1B20058D292 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFCB80102472C1BD0058D292 /* OCHamcrest.framework */; }; + DFCB801F2472D4370058D292 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFCB80082472C1BD0058D292 /* OCHamcrest.framework */; }; + DFCB80222472D50A0058D292 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFCB80122472C1BD0058D292 /* OCHamcrest.framework */; }; DFE954C1244D88450061E3FA /* MSAppCenterIngestionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E829E4221D25C8BA00F19DA1 /* MSAppCenterIngestionTests.m */; }; DFE9552F244D96170061E3FA /* HTTPStubs.m in Sources */ = {isa = PBXBuildFile; fileRef = DFE95520244D96170061E3FA /* HTTPStubs.m */; }; DFE95530244D96170061E3FA /* HTTPStubs.m in Sources */ = {isa = PBXBuildFile; fileRef = DFE95520244D96170061E3FA /* HTTPStubs.m */; }; @@ -1018,6 +1021,76 @@ remoteGlobalIDString = C9A9201B230C07A50068070D; remoteInfo = "AppCenter tvOS Framework"; }; + DFCB80072472C1BD0058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB7FFD2472C1BD0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 087601E213440806001B439B; + remoteInfo = OCHamcrest; + }; + DFCB80092472C1BD0058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB7FFD2472C1BD0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 087601F713440807001B439B; + remoteInfo = OCHamcrestTests; + }; + DFCB800B2472C1BD0058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB7FFD2472C1BD0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 081BEE621345979F003F846A; + remoteInfo = libochamcrest; + }; + DFCB800D2472C1BD0058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB7FFD2472C1BD0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 081BEE6C1345979F003F846A; + remoteInfo = libochamcrestTests; + }; + DFCB800F2472C1BD0058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB7FFD2472C1BD0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 24C5BFE91C1777D900C2BAFD; + remoteInfo = "OCHamcrest-iOS"; + }; + DFCB80112472C1BD0058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB7FFD2472C1BD0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 24C5BFF61C17781400C2BAFD; + remoteInfo = "OCHamcrest-tvOS"; + }; + DFCB80132472C1BD0058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB7FFD2472C1BD0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 24C5C0031C17782500C2BAFD; + remoteInfo = "OCHamcrest-watchOS"; + }; + DFCB80172472D1960058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB7FFD2472C1BD0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 24C5BFE81C1777D900C2BAFD; + remoteInfo = "OCHamcrest-iOS"; + }; + DFCB801D2472D42E0058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB7FFD2472C1BD0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 087601E113440806001B439B; + remoteInfo = OCHamcrest; + }; + DFCB80202472D5010058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB7FFD2472C1BD0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 24C5BFF51C17781400C2BAFD; + remoteInfo = "OCHamcrest-tvOS"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -1255,6 +1328,9 @@ D5812F312423C2FA00C5F5C5 /* MSUserDefaultsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSUserDefaultsTests.m; sourceTree = ""; }; DF5DA1F823A0E55500DE695C /* MSDispatcherUtil.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSDispatcherUtil.h; sourceTree = ""; }; DF5DA1FC23A0E57B00DE695C /* MSDispatcherUtil.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSDispatcherUtil.m; sourceTree = ""; }; + DFCB7D712472B6680058D292 /* OCHamcrest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCHamcrest.framework; path = "../../../../../Library/Developer/Xcode/DerivedData/AppCenter-gpfxuikqxttcjbbawrgyhnkoxjrm/Build/Products/Debug-iphonesimulator/OCHamcrest.framework"; sourceTree = ""; }; + DFCB7FFD2472C1BD0058D292 /* OCHamcrest.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OCHamcrest.xcodeproj; path = ../../Vendor/OCHamcrest/Source/OCHamcrest.xcodeproj; sourceTree = ""; }; + DFCB80152472C23E0058D292 /* OCHamcrest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCHamcrest.framework; path = "../../../../../Library/Developer/Xcode/DerivedData/AppCenter-gpfxuikqxttcjbbawrgyhnkoxjrm/Build/Products/Debug-maccatalyst/OCHamcrest.framework"; sourceTree = ""; }; DFE95520244D96170061E3FA /* HTTPStubs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTTPStubs.m; sourceTree = ""; }; DFE95521244D96170061E3FA /* NSURLRequest+HTTPBodyTesting.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSURLRequest+HTTPBodyTesting.m"; sourceTree = ""; }; DFE95522244D96170061E3FA /* HTTPStubsMethodSwizzling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTTPStubsMethodSwizzling.h; sourceTree = ""; }; @@ -1335,6 +1411,7 @@ buildActionMask = 2147483647; files = ( C2CB275F230EDE380076A4E0 /* AppCenter.framework in Frameworks */, + DFCB80222472D50A0058D292 /* OCHamcrest.framework in Frameworks */, C2392EF8246429E200425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1344,6 +1421,7 @@ buildActionMask = 2147483647; files = ( C2CB275C230EDCD30076A4E0 /* AppCenter.framework in Frameworks */, + DFCB801F2472D4370058D292 /* OCHamcrest.framework in Frameworks */, C2392EF7246429CE00425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1353,6 +1431,7 @@ buildActionMask = 2147483647; files = ( C28A8A4C230EDBEF00C4CE43 /* AppCenter.framework in Frameworks */, + DFCB80192472D1B20058D292 /* OCHamcrest.framework in Frameworks */, C2392EF6246429B300425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1715,6 +1794,7 @@ 6E2395831D22EF5F00E543C8 /* Frameworks */ = { isa = PBXGroup; children = ( + DFCB7FFD2472C1BD0058D292 /* OCHamcrest.xcodeproj */, C2392EDA2464279400425640 /* OCMock.xcodeproj */, DFE9551F244D96170061E3FA /* OHHTTPStubs */, F82E4C6C217F159A00EDAB34 /* sqlite3.c */, @@ -1771,10 +1851,26 @@ C934BFBF230AC17500083490 /* Frameworks */ = { isa = PBXGroup; children = ( + DFCB80152472C23E0058D292 /* OCHamcrest.framework */, + DFCB7D712472B6680058D292 /* OCHamcrest.framework */, ); name = Frameworks; sourceTree = ""; }; + DFCB7FFE2472C1BD0058D292 /* Products */ = { + isa = PBXGroup; + children = ( + DFCB80082472C1BD0058D292 /* OCHamcrest.framework */, + DFCB800A2472C1BD0058D292 /* OCHamcrestTests.xctest */, + DFCB800C2472C1BD0058D292 /* libochamcrest.a */, + DFCB800E2472C1BD0058D292 /* libochamcrestTests.xctest */, + DFCB80102472C1BD0058D292 /* OCHamcrest.framework */, + DFCB80122472C1BD0058D292 /* OCHamcrest.framework */, + DFCB80142472C1BD0058D292 /* OCHamcrest.framework */, + ); + name = Products; + sourceTree = ""; + }; DFE9551F244D96170061E3FA /* OHHTTPStubs */ = { isa = PBXGroup; children = ( @@ -2392,6 +2488,7 @@ ); dependencies = ( C2CB275E230EDE320076A4E0 /* PBXTargetDependency */, + DFCB80212472D5010058D292 /* PBXTargetDependency */, C2392EFE24642BD700425640 /* PBXTargetDependency */, ); name = "AppCenter tvOS Tests"; @@ -2411,6 +2508,7 @@ ); dependencies = ( C2CB275B230EDCCC0076A4E0 /* PBXTargetDependency */, + DFCB801E2472D42E0058D292 /* PBXTargetDependency */, C2392EFC24642BCF00425640 /* PBXTargetDependency */, ); name = "AppCenter macOS Tests"; @@ -2430,6 +2528,7 @@ ); dependencies = ( C28A8A4E230EDC0700C4CE43 /* PBXTargetDependency */, + DFCB80182472D1960058D292 /* PBXTargetDependency */, C2392EFA24642B9000425640 /* PBXTargetDependency */, ); name = "AppCenter iOS Tests"; @@ -2525,6 +2624,10 @@ productRefGroup = 6E0401041D1C98220051BCFA /* Products */; projectDirPath = ""; projectReferences = ( + { + ProductGroup = DFCB7FFE2472C1BD0058D292 /* Products */; + ProjectRef = DFCB7FFD2472C1BD0058D292 /* OCHamcrest.xcodeproj */; + }, { ProductGroup = C2392EDB2464279400425640 /* Products */; ProjectRef = C2392EDA2464279400425640 /* OCMock.xcodeproj */; @@ -2599,6 +2702,55 @@ remoteRef = C2392EF02464279400425640 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + DFCB80082472C1BD0058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB80072472C1BD0058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB800A2472C1BD0058D292 /* OCHamcrestTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = OCHamcrestTests.xctest; + remoteRef = DFCB80092472C1BD0058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB800C2472C1BD0058D292 /* libochamcrest.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libochamcrest.a; + remoteRef = DFCB800B2472C1BD0058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB800E2472C1BD0058D292 /* libochamcrestTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = libochamcrestTests.xctest; + remoteRef = DFCB800D2472C1BD0058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB80102472C1BD0058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB800F2472C1BD0058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB80122472C1BD0058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB80112472C1BD0058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB80142472C1BD0058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB80132472C1BD0058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -3290,6 +3442,21 @@ target = C9A9201B230C07A50068070D /* AppCenter tvOS Framework */; targetProxy = C2CB275D230EDE320076A4E0 /* PBXContainerItemProxy */; }; + DFCB80182472D1960058D292 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "OCHamcrest-iOS"; + targetProxy = DFCB80172472D1960058D292 /* PBXContainerItemProxy */; + }; + DFCB801E2472D42E0058D292 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = OCHamcrest; + targetProxy = DFCB801D2472D42E0058D292 /* PBXContainerItemProxy */; + }; + DFCB80212472D5010058D292 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "OCHamcrest-tvOS"; + targetProxy = DFCB80202472D5010058D292 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ diff --git a/AppCenter/AppCenterTests/Util/MSTestFrameworks.h b/AppCenter/AppCenterTests/Util/MSTestFrameworks.h index bab05b24f9..e7dd120893 100644 --- a/AppCenter/AppCenterTests/Util/MSTestFrameworks.h +++ b/AppCenter/AppCenterTests/Util/MSTestFrameworks.h @@ -9,11 +9,7 @@ #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" #pragma clang diagnostic ignored "-Wobjc-interface-ivars" -#if TARGET_OS_IOS -#import -#else #import -#endif #import #import diff --git a/AppCenterAnalytics/AppCenterAnalytics.xcodeproj/project.pbxproj b/AppCenterAnalytics/AppCenterAnalytics.xcodeproj/project.pbxproj index f263d903a6..84cd3040f4 100644 --- a/AppCenterAnalytics/AppCenterAnalytics.xcodeproj/project.pbxproj +++ b/AppCenterAnalytics/AppCenterAnalytics.xcodeproj/project.pbxproj @@ -270,6 +270,9 @@ C9EBAB19230D724700A20F0F /* AppCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9EBAB18230D724700A20F0F /* AppCenter.framework */; settings = {ATTRIBUTES = (Required, ); }; }; C9EBAB29230D72F300A20F0F /* AppCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9EBAB28230D72F300A20F0F /* AppCenter.framework */; }; C9EBAB2B230D72F900A20F0F /* AppCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9EBAB2A230D72F900A20F0F /* AppCenter.framework */; }; + DFCB80412472D5EB0058D292 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFCB80362472D5D70058D292 /* OCHamcrest.framework */; }; + DFCB80442472D6470058D292 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFCB802E2472D5D70058D292 /* OCHamcrest.framework */; }; + DFCB80472472D6590058D292 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFCB80382472D5D70058D292 /* OCHamcrest.framework */; }; E815912A1D526956003D5F3C /* MSStartSessionLogTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E81591291D526956003D5F3C /* MSStartSessionLogTests.m */; }; E815912C1D526A09003D5F3C /* MSSessionTrackerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E815912B1D526A09003D5F3C /* MSSessionTrackerTests.m */; }; E81591321D526C3B003D5F3C /* MSSessionTrackerUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = E81591311D526C3B003D5F3C /* MSSessionTrackerUtil.m */; }; @@ -391,6 +394,76 @@ remoteGlobalIDString = C9A91F2B230BFB8A0068070D; remoteInfo = "AppCenterAnalytics tvOS Framework"; }; + DFCB802D2472D5D70058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80232472D5D70058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 087601E213440806001B439B; + remoteInfo = OCHamcrest; + }; + DFCB802F2472D5D70058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80232472D5D70058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 087601F713440807001B439B; + remoteInfo = OCHamcrestTests; + }; + DFCB80312472D5D70058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80232472D5D70058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 081BEE621345979F003F846A; + remoteInfo = libochamcrest; + }; + DFCB80332472D5D70058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80232472D5D70058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 081BEE6C1345979F003F846A; + remoteInfo = libochamcrestTests; + }; + DFCB80352472D5D70058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80232472D5D70058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 24C5BFE91C1777D900C2BAFD; + remoteInfo = "OCHamcrest-iOS"; + }; + DFCB80372472D5D70058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80232472D5D70058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 24C5BFF61C17781400C2BAFD; + remoteInfo = "OCHamcrest-tvOS"; + }; + DFCB80392472D5D70058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80232472D5D70058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 24C5C0031C17782500C2BAFD; + remoteInfo = "OCHamcrest-watchOS"; + }; + DFCB803F2472D5E30058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80232472D5D70058D292 /* OCHamcrest.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 24C5BFE81C1777D900C2BAFD; + remoteInfo = "OCHamcrest-iOS"; + }; + DFCB80422472D63E0058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80232472D5D70058D292 /* OCHamcrest.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 087601E113440806001B439B; + remoteInfo = OCHamcrest; + }; + DFCB80452472D6520058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80232472D5D70058D292 /* OCHamcrest.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 24C5BFF51C17781400C2BAFD; + remoteInfo = "OCHamcrest-tvOS"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -460,6 +533,7 @@ C9EBAB18230D724700A20F0F /* AppCenter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AppCenter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C9EBAB28230D72F300A20F0F /* AppCenter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AppCenter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C9EBAB2A230D72F900A20F0F /* AppCenter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AppCenter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DFCB80232472D5D70058D292 /* OCHamcrest.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OCHamcrest.xcodeproj; path = ../../Vendor/OCHamcrest/Source/OCHamcrest.xcodeproj; sourceTree = ""; }; E758FA7B20FFDEE700011793 /* MSPropertyConfigurator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSPropertyConfigurator.h; sourceTree = ""; }; E758FA7C20FFDEE700011793 /* MSPropertyConfigurator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSPropertyConfigurator.m; sourceTree = ""; }; E758FA8320FFE0E200011793 /* MSPropertyConfiguratorPrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSPropertyConfiguratorPrivate.h; sourceTree = ""; }; @@ -492,6 +566,7 @@ files = ( C2D73CE2230FC7DC00390198 /* AppCenter.framework in Frameworks */, C2D73CE0230FC7D400390198 /* AppCenterAnalytics.framework in Frameworks */, + DFCB80472472D6590058D292 /* OCHamcrest.framework in Frameworks */, C2392F6724642D6C00425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -502,6 +577,7 @@ files = ( C2D73CE5230FC7EF00390198 /* AppCenter.framework in Frameworks */, C2D73CE3230FC7E900390198 /* AppCenterAnalytics.framework in Frameworks */, + DFCB80442472D6470058D292 /* OCHamcrest.framework in Frameworks */, C2392F6424642D5100425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -536,6 +612,7 @@ files = ( C2D73CE8230FC7FC00390198 /* AppCenter.framework in Frameworks */, C2D73CE6230FC7F900390198 /* AppCenterAnalytics.framework in Frameworks */, + DFCB80412472D5EB0058D292 /* OCHamcrest.framework in Frameworks */, C2392F6124642D3F00425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -615,6 +692,7 @@ 6E0684361D35A39300A8CC6C /* Frameworks */ = { isa = PBXGroup; children = ( + DFCB80232472D5D70058D292 /* OCHamcrest.xcodeproj */, C2392EFF24642C8700425640 /* OCMock.xcodeproj */, F82E4C70217F1FA600EDAB34 /* sqlite3.c */, ); @@ -661,6 +739,20 @@ name = Frameworks; sourceTree = ""; }; + DFCB80242472D5D70058D292 /* Products */ = { + isa = PBXGroup; + children = ( + DFCB802E2472D5D70058D292 /* OCHamcrest.framework */, + DFCB80302472D5D70058D292 /* OCHamcrestTests.xctest */, + DFCB80322472D5D70058D292 /* libochamcrest.a */, + DFCB80342472D5D70058D292 /* libochamcrestTests.xctest */, + DFCB80362472D5D70058D292 /* OCHamcrest.framework */, + DFCB80382472D5D70058D292 /* OCHamcrest.framework */, + DFCB803A2472D5D70058D292 /* OCHamcrest.framework */, + ); + name = Products; + sourceTree = ""; + }; E85547B71D2D6253002DF6E2 = { isa = PBXGroup; children = ( @@ -910,6 +1002,7 @@ ); dependencies = ( C2D73CDF230FC7C700390198 /* PBXTargetDependency */, + DFCB80462472D6520058D292 /* PBXTargetDependency */, C2392F6624642D5D00425640 /* PBXTargetDependency */, ); name = "AppCenterAnalytics tvOS Tests"; @@ -929,6 +1022,7 @@ ); dependencies = ( C2D73CDD230FC7C300390198 /* PBXTargetDependency */, + DFCB80432472D63E0058D292 /* PBXTargetDependency */, C2392F6324642D4900425640 /* PBXTargetDependency */, ); name = "AppCenterAnalytics macOS Tests"; @@ -1004,6 +1098,7 @@ dependencies = ( C2D73CDB230FC7BE00390198 /* PBXTargetDependency */, C2392F6024642D3300425640 /* PBXTargetDependency */, + DFCB80402472D5E30058D292 /* PBXTargetDependency */, ); name = "AppCenterAnalytics iOS Tests"; productName = AppCenterAnalyticsTests; @@ -1044,6 +1139,10 @@ productRefGroup = E85547C11D2D6253002DF6E2 /* Products */; projectDirPath = ""; projectReferences = ( + { + ProductGroup = DFCB80242472D5D70058D292 /* Products */; + ProjectRef = DFCB80232472D5D70058D292 /* OCHamcrest.xcodeproj */; + }, { ProductGroup = C2392F0024642C8700425640 /* Products */; ProjectRef = C2392EFF24642C8700425640 /* OCMock.xcodeproj */; @@ -1118,6 +1217,55 @@ remoteRef = C2392F1524642C8700425640 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + DFCB802E2472D5D70058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB802D2472D5D70058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB80302472D5D70058D292 /* OCHamcrestTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = OCHamcrestTests.xctest; + remoteRef = DFCB802F2472D5D70058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB80322472D5D70058D292 /* libochamcrest.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libochamcrest.a; + remoteRef = DFCB80312472D5D70058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB80342472D5D70058D292 /* libochamcrestTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = libochamcrestTests.xctest; + remoteRef = DFCB80332472D5D70058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB80362472D5D70058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB80352472D5D70058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB80382472D5D70058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB80372472D5D70058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB803A2472D5D70058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB80392472D5D70058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -1478,6 +1626,21 @@ target = C9A91F2B230BFB8A0068070D /* AppCenterAnalytics tvOS Framework */; targetProxy = C2D73CDE230FC7C700390198 /* PBXContainerItemProxy */; }; + DFCB80402472D5E30058D292 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "OCHamcrest-iOS"; + targetProxy = DFCB803F2472D5E30058D292 /* PBXContainerItemProxy */; + }; + DFCB80432472D63E0058D292 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = OCHamcrest; + targetProxy = DFCB80422472D63E0058D292 /* PBXContainerItemProxy */; + }; + DFCB80462472D6520058D292 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "OCHamcrest-tvOS"; + targetProxy = DFCB80452472D6520058D292 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ diff --git a/AppCenterCrashes/AppCenterCrashes.xcodeproj/project.pbxproj b/AppCenterCrashes/AppCenterCrashes.xcodeproj/project.pbxproj index ce17cf53b1..1e34adb27b 100644 --- a/AppCenterCrashes/AppCenterCrashes.xcodeproj/project.pbxproj +++ b/AppCenterCrashes/AppCenterCrashes.xcodeproj/project.pbxproj @@ -402,6 +402,9 @@ C9EBAB2D230D735E00A20F0F /* AppCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9EBAB2C230D735E00A20F0F /* AppCenter.framework */; }; C9EBAB2F230D736A00A20F0F /* AppCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9EBAB2E230D736A00A20F0F /* AppCenter.framework */; }; C9EBAB31230D736F00A20F0F /* AppCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9EBAB30230D736F00A20F0F /* AppCenter.framework */; }; + DFCB80662472D6920058D292 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFCB805B2472D6770058D292 /* OCHamcrest.framework */; }; + DFCB80692472D6DF0058D292 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFCB80532472D6770058D292 /* OCHamcrest.framework */; }; + DFCB806C2472D6F00058D292 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFCB805D2472D6770058D292 /* OCHamcrest.framework */; }; DFEB98292318FAF400AE88C1 /* libCrashReporter-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DFEB98282318FAF400AE88C1 /* libCrashReporter-tvOS.a */; }; DFEB98332318FF5500AE88C1 /* libCrashReporter-iOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DFEB98262318F90400AE88C1 /* libCrashReporter-iOS.a */; }; F82E4C75217F1FD700EDAB34 /* sqlite3.c in Sources */ = {isa = PBXBuildFile; fileRef = F82E4C74217F1FD600EDAB34 /* sqlite3.c */; settings = {COMPILER_FLAGS = "-w"; }; }; @@ -542,6 +545,76 @@ remoteGlobalIDString = C9A91F5D230BFDB70068070D; remoteInfo = "AppCenterCrashes macOS Framework"; }; + DFCB80522472D6770058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80482472D6770058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 087601E213440806001B439B; + remoteInfo = OCHamcrest; + }; + DFCB80542472D6770058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80482472D6770058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 087601F713440807001B439B; + remoteInfo = OCHamcrestTests; + }; + DFCB80562472D6770058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80482472D6770058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 081BEE621345979F003F846A; + remoteInfo = libochamcrest; + }; + DFCB80582472D6770058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80482472D6770058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 081BEE6C1345979F003F846A; + remoteInfo = libochamcrestTests; + }; + DFCB805A2472D6770058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80482472D6770058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 24C5BFE91C1777D900C2BAFD; + remoteInfo = "OCHamcrest-iOS"; + }; + DFCB805C2472D6770058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80482472D6770058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 24C5BFF61C17781400C2BAFD; + remoteInfo = "OCHamcrest-tvOS"; + }; + DFCB805E2472D6770058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80482472D6770058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 24C5C0031C17782500C2BAFD; + remoteInfo = "OCHamcrest-watchOS"; + }; + DFCB80642472D6880058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80482472D6770058D292 /* OCHamcrest.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 24C5BFE81C1777D900C2BAFD; + remoteInfo = "OCHamcrest-iOS"; + }; + DFCB80672472D6D70058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80482472D6770058D292 /* OCHamcrest.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 087601E113440806001B439B; + remoteInfo = OCHamcrest; + }; + DFCB806A2472D6E80058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB80482472D6770058D292 /* OCHamcrest.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 24C5BFF51C17781400C2BAFD; + remoteInfo = "OCHamcrest-tvOS"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -680,6 +753,7 @@ C9EBAB2C230D735E00A20F0F /* AppCenter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AppCenter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C9EBAB2E230D736A00A20F0F /* AppCenter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AppCenter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C9EBAB30230D736F00A20F0F /* AppCenter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AppCenter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DFCB80482472D6770058D292 /* OCHamcrest.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OCHamcrest.xcodeproj; path = ../../Vendor/OCHamcrest/Source/OCHamcrest.xcodeproj; sourceTree = ""; }; DFEB97C62318F0BA00AE88C1 /* PLCrashNamespace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashNamespace.h; sourceTree = ""; }; DFEB97C72318F0BA00AE88C1 /* PLCrashAsyncSignalInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashAsyncSignalInfo.h; sourceTree = ""; }; DFEB97C82318F0BA00AE88C1 /* PLCrashFeatureConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashFeatureConfig.h; sourceTree = ""; }; @@ -781,6 +855,7 @@ files = ( C2B25A2C230F079800511D49 /* AppCenter.framework in Frameworks */, C2B25A2D230F079800511D49 /* AppCenterCrashes.framework in Frameworks */, + DFCB806C2472D6F00058D292 /* OCHamcrest.framework in Frameworks */, C2392F7024642DAD00425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -791,6 +866,7 @@ files = ( C2B25A32230F07B500511D49 /* AppCenter.framework in Frameworks */, C2B25A30230F07B000511D49 /* AppCenterCrashes.framework in Frameworks */, + DFCB80692472D6DF0058D292 /* OCHamcrest.framework in Frameworks */, C2392F6D24642D9B00425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -801,6 +877,7 @@ files = ( C2B25A27230F040400511D49 /* AppCenter.framework in Frameworks */, C2B25A28230F040400511D49 /* AppCenterCrashes.framework in Frameworks */, + DFCB80662472D6920058D292 /* OCHamcrest.framework in Frameworks */, C2392F6A24642D8900425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1032,6 +1109,7 @@ 6E171AEC1D22F7AB000DC480 /* Frameworks */ = { isa = PBXGroup; children = ( + DFCB80482472D6770058D292 /* OCHamcrest.xcodeproj */, C2392F4724642CEA00425640 /* OCMock.xcodeproj */, F82E4C74217F1FD600EDAB34 /* sqlite3.c */, ); @@ -1176,6 +1254,20 @@ path = Model; sourceTree = ""; }; + DFCB80492472D6770058D292 /* Products */ = { + isa = PBXGroup; + children = ( + DFCB80532472D6770058D292 /* OCHamcrest.framework */, + DFCB80552472D6770058D292 /* OCHamcrestTests.xctest */, + DFCB80572472D6770058D292 /* libochamcrest.a */, + DFCB80592472D6770058D292 /* libochamcrestTests.xctest */, + DFCB805B2472D6770058D292 /* OCHamcrest.framework */, + DFCB805D2472D6770058D292 /* OCHamcrest.framework */, + DFCB805F2472D6770058D292 /* OCHamcrest.framework */, + ); + name = Products; + sourceTree = ""; + }; DFEB978F2318F09A00AE88C1 /* PLCrashReporter */ = { isa = PBXGroup; children = ( @@ -1457,6 +1549,7 @@ dependencies = ( C2B25A2A230F079000511D49 /* PBXTargetDependency */, C2392F6F24642DA400425640 /* PBXTargetDependency */, + DFCB806B2472D6E80058D292 /* PBXTargetDependency */, ); name = "AppCenterCrashes tvOS Tests"; productName = AppCenterCrashesTests; @@ -1475,6 +1568,7 @@ ); dependencies = ( C2B25A2F230F07AB00511D49 /* PBXTargetDependency */, + DFCB80682472D6D70058D292 /* PBXTargetDependency */, C2392F6C24642D9500425640 /* PBXTargetDependency */, ); name = "AppCenterCrashes macOS Tests"; @@ -1495,6 +1589,7 @@ dependencies = ( C2B25A25230F03F300511D49 /* PBXTargetDependency */, C2392F6924642D8400425640 /* PBXTargetDependency */, + DFCB80652472D6880058D292 /* PBXTargetDependency */, ); name = "AppCenterCrashes iOS Tests"; productName = AppCenterCrashesTests; @@ -1589,6 +1684,10 @@ productRefGroup = 6E0401341D1C98690051BCFA /* Products */; projectDirPath = ""; projectReferences = ( + { + ProductGroup = DFCB80492472D6770058D292 /* Products */; + ProjectRef = DFCB80482472D6770058D292 /* OCHamcrest.xcodeproj */; + }, { ProductGroup = C2392F4824642CEA00425640 /* Products */; ProjectRef = C2392F4724642CEA00425640 /* OCMock.xcodeproj */; @@ -1663,6 +1762,55 @@ remoteRef = C2392F5D24642CEA00425640 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + DFCB80532472D6770058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB80522472D6770058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB80552472D6770058D292 /* OCHamcrestTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = OCHamcrestTests.xctest; + remoteRef = DFCB80542472D6770058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB80572472D6770058D292 /* libochamcrest.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libochamcrest.a; + remoteRef = DFCB80562472D6770058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB80592472D6770058D292 /* libochamcrestTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = libochamcrestTests.xctest; + remoteRef = DFCB80582472D6770058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB805B2472D6770058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB805A2472D6770058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB805D2472D6770058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB805C2472D6770058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB805F2472D6770058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB805E2472D6770058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -2155,6 +2303,21 @@ target = C9A91F5D230BFDB70068070D /* AppCenterCrashes macOS Framework */; targetProxy = C2B25A2E230F07AB00511D49 /* PBXContainerItemProxy */; }; + DFCB80652472D6880058D292 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "OCHamcrest-iOS"; + targetProxy = DFCB80642472D6880058D292 /* PBXContainerItemProxy */; + }; + DFCB80682472D6D70058D292 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = OCHamcrest; + targetProxy = DFCB80672472D6D70058D292 /* PBXContainerItemProxy */; + }; + DFCB806B2472D6E80058D292 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "OCHamcrest-tvOS"; + targetProxy = DFCB806A2472D6E80058D292 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ diff --git a/AppCenterDistribute/AppCenterDistribute.xcodeproj/project.pbxproj b/AppCenterDistribute/AppCenterDistribute.xcodeproj/project.pbxproj index 23aba116c2..7b52dac338 100644 --- a/AppCenterDistribute/AppCenterDistribute.xcodeproj/project.pbxproj +++ b/AppCenterDistribute/AppCenterDistribute.xcodeproj/project.pbxproj @@ -109,6 +109,7 @@ C9EBAAEF230D3A9B00A20F0F /* MSDistributeInfoTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = 586031A5F44AF875F6226F45 /* MSDistributeInfoTracker.m */; }; C9EBAAF0230D3A9B00A20F0F /* MSReleaseDetails.m in Sources */ = {isa = PBXBuildFile; fileRef = 048BB2FD1E60A40D009D92C2 /* MSReleaseDetails.m */; }; C9EBAB37230D73A800A20F0F /* AppCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9EBAB36230D73A800A20F0F /* AppCenter.framework */; }; + DFCB808D2472D7310058D292 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFCB80802472D71C0058D292 /* OCHamcrest.framework */; }; DFE95501244D8B4D0061E3FA /* HTTPStubs.m in Sources */ = {isa = PBXBuildFile; fileRef = DFE954F2244D8B410061E3FA /* HTTPStubs.m */; }; DFE95502244D8B4D0061E3FA /* NSURLRequest+HTTPBodyTesting.m in Sources */ = {isa = PBXBuildFile; fileRef = DFE954F3244D8B410061E3FA /* NSURLRequest+HTTPBodyTesting.m */; }; DFE95503244D8B4D0061E3FA /* HTTPStubsResponse+JSON.m in Sources */ = {isa = PBXBuildFile; fileRef = DFE954FC244D8B410061E3FA /* HTTPStubsResponse+JSON.m */; }; @@ -205,6 +206,62 @@ remoteGlobalIDString = F0B950F01B0080BE00942C38; remoteInfo = "OCMock iOS"; }; + DFCB80772472D71C0058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB806D2472D71C0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 087601E213440806001B439B; + remoteInfo = OCHamcrest; + }; + DFCB80792472D71C0058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB806D2472D71C0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 087601F713440807001B439B; + remoteInfo = OCHamcrestTests; + }; + DFCB807B2472D71C0058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB806D2472D71C0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 081BEE621345979F003F846A; + remoteInfo = libochamcrest; + }; + DFCB807D2472D71C0058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB806D2472D71C0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 081BEE6C1345979F003F846A; + remoteInfo = libochamcrestTests; + }; + DFCB807F2472D71C0058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB806D2472D71C0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 24C5BFE91C1777D900C2BAFD; + remoteInfo = "OCHamcrest-iOS"; + }; + DFCB80812472D71C0058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB806D2472D71C0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 24C5BFF61C17781400C2BAFD; + remoteInfo = "OCHamcrest-tvOS"; + }; + DFCB80832472D71C0058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB806D2472D71C0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 24C5C0031C17782500C2BAFD; + remoteInfo = "OCHamcrest-watchOS"; + }; + DFCB808B2472D7280058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB806D2472D71C0058D292 /* OCHamcrest.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 24C5BFE81C1777D900C2BAFD; + remoteInfo = "OCHamcrest-iOS"; + }; F8DD7524230D7E7A00B095B6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 04FD4A141E451E12009B4468 /* Project object */; @@ -308,6 +365,7 @@ C2392F2F24642CB500425640 /* OCMock.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OCMock.xcodeproj; path = ../../Vendor/OCMock/Source/OCMock.xcodeproj; sourceTree = ""; }; C9A91F8C230BFFFF0068070D /* AppCenterDistribute.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AppCenterDistribute.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C9EBAB36230D73A800A20F0F /* AppCenter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AppCenter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DFCB806D2472D71C0058D292 /* OCHamcrest.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OCHamcrest.xcodeproj; path = ../../Vendor/OCHamcrest/Source/OCHamcrest.xcodeproj; sourceTree = ""; }; DFE954F2244D8B410061E3FA /* HTTPStubs.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HTTPStubs.m; sourceTree = ""; }; DFE954F3244D8B410061E3FA /* NSURLRequest+HTTPBodyTesting.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSURLRequest+HTTPBodyTesting.m"; sourceTree = ""; }; DFE954F4244D8B410061E3FA /* HTTPStubsMethodSwizzling.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTTPStubsMethodSwizzling.h; sourceTree = ""; }; @@ -337,6 +395,7 @@ files = ( C2200613230FDF7000848D5B /* AppCenter.framework in Frameworks */, C2200611230FDF6D00848D5B /* AppCenterDistribute.framework in Frameworks */, + DFCB808D2472D7310058D292 /* OCHamcrest.framework in Frameworks */, C2392F7324642DC600425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -504,6 +563,7 @@ 04FD4A491E453930009B4468 /* Frameworks */ = { isa = PBXGroup; children = ( + DFCB806D2472D71C0058D292 /* OCHamcrest.xcodeproj */, C2392F2F24642CB500425640 /* OCMock.xcodeproj */, DFE954F1244D8B410061E3FA /* OHHTTPStubs */, F82E4C82217F217F00EDAB34 /* sqlite3.c */, @@ -611,6 +671,20 @@ name = Frameworks; sourceTree = ""; }; + DFCB806E2472D71C0058D292 /* Products */ = { + isa = PBXGroup; + children = ( + DFCB80782472D71C0058D292 /* OCHamcrest.framework */, + DFCB807A2472D71C0058D292 /* OCHamcrestTests.xctest */, + DFCB807C2472D71C0058D292 /* libochamcrest.a */, + DFCB807E2472D71C0058D292 /* libochamcrestTests.xctest */, + DFCB80802472D71C0058D292 /* OCHamcrest.framework */, + DFCB80822472D71C0058D292 /* OCHamcrest.framework */, + DFCB80842472D71C0058D292 /* OCHamcrest.framework */, + ); + name = Products; + sourceTree = ""; + }; DFE954F1244D8B410061E3FA /* OHHTTPStubs */ = { isa = PBXGroup; children = ( @@ -695,6 +769,7 @@ ); dependencies = ( C2200610230FDF6800848D5B /* PBXTargetDependency */, + DFCB808C2472D7280058D292 /* PBXTargetDependency */, C2392F7224642DC100425640 /* PBXTargetDependency */, ); name = "AppCenterDistribute iOS Tests"; @@ -780,6 +855,10 @@ productRefGroup = 04FD4A1D1E451E12009B4468 /* Products */; projectDirPath = ""; projectReferences = ( + { + ProductGroup = DFCB806E2472D71C0058D292 /* Products */; + ProjectRef = DFCB806D2472D71C0058D292 /* OCHamcrest.xcodeproj */; + }, { ProductGroup = C2392F3024642CB500425640 /* Products */; ProjectRef = C2392F2F24642CB500425640 /* OCMock.xcodeproj */; @@ -847,6 +926,55 @@ remoteRef = C2392F4524642CB600425640 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + DFCB80782472D71C0058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB80772472D71C0058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB807A2472D71C0058D292 /* OCHamcrestTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = OCHamcrestTests.xctest; + remoteRef = DFCB80792472D71C0058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB807C2472D71C0058D292 /* libochamcrest.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libochamcrest.a; + remoteRef = DFCB807B2472D71C0058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB807E2472D71C0058D292 /* libochamcrestTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = libochamcrestTests.xctest; + remoteRef = DFCB807D2472D71C0058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB80802472D71C0058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB807F2472D71C0058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB80822472D71C0058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB80812472D71C0058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB80842472D71C0058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB80832472D71C0058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -1030,6 +1158,11 @@ name = "OCMock iOS"; targetProxy = C2392F7124642DC100425640 /* PBXContainerItemProxy */; }; + DFCB808C2472D7280058D292 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "OCHamcrest-iOS"; + targetProxy = DFCB808B2472D7280058D292 /* PBXContainerItemProxy */; + }; F8DD7525230D7E7A00B095B6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = B2C070B71E5E68540076D6A9 /* AppCenterDistribute Resources */; diff --git a/AppCenterPush/AppCenterPush.xcodeproj/project.pbxproj b/AppCenterPush/AppCenterPush.xcodeproj/project.pbxproj index 906e34643d..17345e4a99 100644 --- a/AppCenterPush/AppCenterPush.xcodeproj/project.pbxproj +++ b/AppCenterPush/AppCenterPush.xcodeproj/project.pbxproj @@ -118,6 +118,8 @@ C9EBAB39230D73B300A20F0F /* AppCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9EBAB38230D73B300A20F0F /* AppCenter.framework */; }; C9EBAB3B230D73B700A20F0F /* AppCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9EBAB3A230D73B700A20F0F /* AppCenter.framework */; }; D39B04E41E66FBD50048E397 /* MSPushTestUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = D39B04E31E66FBD50048E397 /* MSPushTestUtil.m */; }; + DFCB80AD2472D7770058D292 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFCB80A12472D7500058D292 /* OCHamcrest.framework */; }; + DFCB80B02472D7930058D292 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFCB80992472D7500058D292 /* OCHamcrest.framework */; }; F82E4C85217F218D00EDAB34 /* sqlite3.c in Sources */ = {isa = PBXBuildFile; fileRef = F82E4C84217F218D00EDAB34 /* sqlite3.c */; settings = {COMPILER_FLAGS = "-w"; }; }; F82E4C86217F218D00EDAB34 /* sqlite3.c in Sources */ = {isa = PBXBuildFile; fileRef = F82E4C84217F218D00EDAB34 /* sqlite3.c */; settings = {COMPILER_FLAGS = "-w"; }; }; /* End PBXBuildFile section */ @@ -214,6 +216,69 @@ remoteGlobalIDString = D3AD5F221E5C9562001627AB; remoteInfo = "Fat Framework"; }; + DFCB80982472D7500058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB808E2472D7500058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 087601E213440806001B439B; + remoteInfo = OCHamcrest; + }; + DFCB809A2472D7500058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB808E2472D7500058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 087601F713440807001B439B; + remoteInfo = OCHamcrestTests; + }; + DFCB809C2472D7500058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB808E2472D7500058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 081BEE621345979F003F846A; + remoteInfo = libochamcrest; + }; + DFCB809E2472D7500058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB808E2472D7500058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 081BEE6C1345979F003F846A; + remoteInfo = libochamcrestTests; + }; + DFCB80A02472D7500058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB808E2472D7500058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 24C5BFE91C1777D900C2BAFD; + remoteInfo = "OCHamcrest-iOS"; + }; + DFCB80A22472D7500058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB808E2472D7500058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 24C5BFF61C17781400C2BAFD; + remoteInfo = "OCHamcrest-tvOS"; + }; + DFCB80A42472D7500058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB808E2472D7500058D292 /* OCHamcrest.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 24C5C0031C17782500C2BAFD; + remoteInfo = "OCHamcrest-watchOS"; + }; + DFCB80AB2472D76E0058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB808E2472D7500058D292 /* OCHamcrest.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 24C5BFE81C1777D900C2BAFD; + remoteInfo = "OCHamcrest-iOS"; + }; + DFCB80AE2472D7840058D292 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DFCB808E2472D7500058D292 /* OCHamcrest.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 087601E113440806001B439B; + remoteInfo = OCHamcrest; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -268,6 +333,7 @@ D3AD5F3E1E5D69B0001627AB /* iOS.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = iOS.modulemap; sourceTree = ""; }; D3AD5F6A1E5D7464001627AB /* MSPushLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MSPushLog.h; path = Model/MSPushLog.h; sourceTree = ""; }; D3AD5F6B1E5D7464001627AB /* MSPushLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MSPushLog.m; path = Model/MSPushLog.m; sourceTree = ""; }; + DFCB808E2472D7500058D292 /* OCHamcrest.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OCHamcrest.xcodeproj; path = ../Vendor/OCHamcrest/Source/OCHamcrest.xcodeproj; sourceTree = ""; }; F82E4C84217F218D00EDAB34 /* sqlite3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sqlite3.c; path = ../Vendor/SQLite3/sqlite3.c; sourceTree = ""; }; F8DD7526230D7EA400B095B6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ @@ -279,6 +345,7 @@ files = ( C220061D230FDF9600848D5B /* AppCenter.framework in Frameworks */, C220061B230FDF9200848D5B /* AppCenterPush.framework in Frameworks */, + DFCB80B02472D7930058D292 /* OCHamcrest.framework in Frameworks */, C2392F7924642DFB00425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -307,6 +374,7 @@ C220061A230FDF8500848D5B /* AppCenter.framework in Frameworks */, C2200618230FDF8200848D5B /* AppCenterPush.framework in Frameworks */, C203273D2350B51A00EA65A5 /* UserNotifications.framework in Frameworks */, + DFCB80AD2472D7770058D292 /* OCHamcrest.framework in Frameworks */, C2392F7624642DE500425640 /* OCMock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -475,6 +543,7 @@ D3AD5F661E5D73F2001627AB /* Frameworks */ = { isa = PBXGroup; children = ( + DFCB808E2472D7500058D292 /* OCHamcrest.xcodeproj */, C2392F1724642CA300425640 /* OCMock.xcodeproj */, F82E4C84217F218D00EDAB34 /* sqlite3.c */, ); @@ -500,6 +569,20 @@ name = Vendor; sourceTree = ""; }; + DFCB808F2472D7500058D292 /* Products */ = { + isa = PBXGroup; + children = ( + DFCB80992472D7500058D292 /* OCHamcrest.framework */, + DFCB809B2472D7500058D292 /* OCHamcrestTests.xctest */, + DFCB809D2472D7500058D292 /* libochamcrest.a */, + DFCB809F2472D7500058D292 /* libochamcrestTests.xctest */, + DFCB80A12472D7500058D292 /* OCHamcrest.framework */, + DFCB80A32472D7500058D292 /* OCHamcrest.framework */, + DFCB80A52472D7500058D292 /* OCHamcrest.framework */, + ); + name = Products; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -558,6 +641,7 @@ ); dependencies = ( C2200617230FDF7900848D5B /* PBXTargetDependency */, + DFCB80AF2472D7840058D292 /* PBXTargetDependency */, C2392F7824642DF300425640 /* PBXTargetDependency */, ); name = "AppCenterPush macOS Tests"; @@ -614,6 +698,7 @@ dependencies = ( C2200615230FDF7600848D5B /* PBXTargetDependency */, C2392F7524642DDE00425640 /* PBXTargetDependency */, + DFCB80AC2472D76E0058D292 /* PBXTargetDependency */, ); name = "AppCenterPush iOS Tests"; productName = AppCenterPushTests; @@ -651,6 +736,10 @@ productRefGroup = D33A94521E5B11BB003966DB /* Products */; projectDirPath = ""; projectReferences = ( + { + ProductGroup = DFCB808F2472D7500058D292 /* Products */; + ProjectRef = DFCB808E2472D7500058D292 /* OCHamcrest.xcodeproj */; + }, { ProductGroup = C2392F1824642CA300425640 /* Products */; ProjectRef = C2392F1724642CA300425640 /* OCMock.xcodeproj */; @@ -720,6 +809,55 @@ remoteRef = C2392F2D24642CA300425640 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + DFCB80992472D7500058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB80982472D7500058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB809B2472D7500058D292 /* OCHamcrestTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = OCHamcrestTests.xctest; + remoteRef = DFCB809A2472D7500058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB809D2472D7500058D292 /* libochamcrest.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libochamcrest.a; + remoteRef = DFCB809C2472D7500058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB809F2472D7500058D292 /* libochamcrestTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = libochamcrestTests.xctest; + remoteRef = DFCB809E2472D7500058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB80A12472D7500058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB80A02472D7500058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB80A32472D7500058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB80A22472D7500058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + DFCB80A52472D7500058D292 /* OCHamcrest.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OCHamcrest.framework; + remoteRef = DFCB80A42472D7500058D292 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -928,6 +1066,16 @@ target = D3AD5F221E5C9562001627AB /* AppCenterPush iOS Fat Framework */; targetProxy = D3AD5F3C1E5D6809001627AB /* PBXContainerItemProxy */; }; + DFCB80AC2472D76E0058D292 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "OCHamcrest-iOS"; + targetProxy = DFCB80AB2472D76E0058D292 /* PBXContainerItemProxy */; + }; + DFCB80AF2472D7840058D292 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = OCHamcrest; + targetProxy = DFCB80AE2472D7840058D292 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ diff --git a/Config/Tests.xcconfig b/Config/Tests.xcconfig index e8d476b895..e007261733 100644 --- a/Config/Tests.xcconfig +++ b/Config/Tests.xcconfig @@ -8,7 +8,7 @@ INFOPLIST_FILE = $(PROJECT_NAME)Tests/Info.plist // OCMock assumes the use of 'unqualified id' WARNING_CFLAGS = -Wno-objc-messaging-id -OTHER_CFLAGS = $(inherited) -iframework "$(SRCROOT)/../Vendor/$(APPCENTER_BUILD_PLATFORM)/OCHamcrest" -iframework "$(SRCROOT)/../Vendor/$(APPCENTER_BUILD_PLATFORM)/OHHTTPStubs" -iframework "$(PLATFORM_DIR)/Developer/Library/Frameworks" +OTHER_CFLAGS = $(inherited) -iframework "$(SRCROOT)/../Vendor/$(APPCENTER_BUILD_PLATFORM)/OHHTTPStubs" -iframework "$(PLATFORM_DIR)/Developer/Library/Frameworks" OTHER_LDFLAGS = $(inherited) -ObjC -lz OTHER_LDFLAGS = $(OTHER_LDFLAGS) -framework Foundation From 00a38803d521ad09e4f0b6a067753222b5277a17 Mon Sep 17 00:00:00 2001 From: Ruslan Urmeev Date: Tue, 19 May 2020 12:36:54 +0400 Subject: [PATCH 007/115] Fix tests in Core for iOS and Catalyst --- AppCenter/AppCenter/Internals/Util/MSUtility+Environment.m | 2 +- AppCenter/AppCenterTests/MSDependencyConfigurationTests.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AppCenter/AppCenter/Internals/Util/MSUtility+Environment.m b/AppCenter/AppCenter/Internals/Util/MSUtility+Environment.m index 5f929694b6..3c9b396db7 100644 --- a/AppCenter/AppCenter/Internals/Util/MSUtility+Environment.m +++ b/AppCenter/AppCenter/Internals/Util/MSUtility+Environment.m @@ -11,7 +11,7 @@ @implementation MSUtility (Environment) + (MSEnvironment)currentAppEnvironment { -#if TARGET_OS_SIMULATOR || TARGET_OS_OSX +#if TARGET_OS_SIMULATOR || TARGET_OS_OSX || TARGET_OS_MACCATALYST return MSEnvironmentOther; #else diff --git a/AppCenter/AppCenterTests/MSDependencyConfigurationTests.m b/AppCenter/AppCenterTests/MSDependencyConfigurationTests.m index a1348059e9..2d08d7a2aa 100644 --- a/AppCenter/AppCenterTests/MSDependencyConfigurationTests.m +++ b/AppCenter/AppCenterTests/MSDependencyConfigurationTests.m @@ -33,7 +33,7 @@ - (void)testNotSettingDependencyCallUsesDefaultHttpClient { // If id httpClientClassMock = OCMClassMock([MSHttpClient class]); - OCMStub([httpClientClassMock alloc]).andReturn(httpClientClassMock); + OCMStub([httpClientClassMock new]).andReturn(httpClientClassMock); // When [MSAppCenter configureWithAppSecret:@"App-Secret"]; From feff38cdfd9d84c06cb3f99eeb96443d5e0eec38 Mon Sep 17 00:00:00 2001 From: Ruslan Urmeev Date: Tue, 19 May 2020 14:29:08 +0400 Subject: [PATCH 008/115] Update cgmanifest --- cgmanifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cgmanifest.json b/cgmanifest.json index c580d9d4b5..84ce0a43a2 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -16,7 +16,7 @@ "git": { "name": "OCHamcrest", "repositoryUrl": "https://github.com/hamcrest/OCHamcrest.git", - "commitHash": "edbded0a97d5c5e26f43c125ffc4522300970d98" + "commitHash": "5f77cf33732dfa02e0b9f15e43d05a9110cc2ff0" } } }, From 5e1602cb5ad2a5daec3b412beff91da182359bc2 Mon Sep 17 00:00:00 2001 From: Vladimir Vechkanov Date: Tue, 19 May 2020 15:08:45 +0400 Subject: [PATCH 009/115] Add cycle into xcframework build script --- Scripts/build-xcframework.sh | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/Scripts/build-xcframework.sh b/Scripts/build-xcframework.sh index aaccfb9e0b..72700dc3cd 100755 --- a/Scripts/build-xcframework.sh +++ b/Scripts/build-xcframework.sh @@ -12,20 +12,14 @@ XC_FRAMEWORK_PATH="${WORK_DIR}/Output/${PROJECT_NAME}.xcframework" # Clean previus XCFramework build. rm -rf ${PROJECT_NAME}.xcframework/ -# Build XCFramework. -function SetXcBuildCommandFramework() { - FRAMEWORK_PATH="$WORK_DIR/Release-$1/${PROJECT_NAME}.framework" +# Create a command to build XCFramework. +for SDK in iphoneos iphonesimulator appletvos appletvsimulator macOS maccatalyst; do + FRAMEWORK_PATH="$WORK_DIR/Release-$SDK/${PROJECT_NAME}.framework" [ -e "$FRAMEWORK_PATH" ] && XC_BUILD_COMMAND="$XC_BUILD_COMMAND -framework $FRAMEWORK_PATH"; -} - -# Create a cycle instead next lines -SetXcBuildCommandFramework "iphoneos" -SetXcBuildCommandFramework "iphonesimulator" -SetXcBuildCommandFramework "appletvos" -SetXcBuildCommandFramework "appletvsimulator" -SetXcBuildCommandFramework "macos" - +done XC_BUILD_COMMAND="xcodebuild -create-xcframework $XC_BUILD_COMMAND -output $XC_FRAMEWORK_PATH" + +#Build XCFramework eval "$XC_BUILD_COMMAND" RES_FILE_PATH="$WORK_DIR/Release-iphoneos/AppCenterDistributeResources.bundle" From 71532d50b6cbcd4bfa07f2a71ae706f9acc9d379 Mon Sep 17 00:00:00 2001 From: Ivan Matkov Date: Tue, 19 May 2020 14:25:20 +0300 Subject: [PATCH 010/115] Remove extra references --- AppCenter/AppCenter.xcodeproj/project.pbxproj | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/AppCenter/AppCenter.xcodeproj/project.pbxproj b/AppCenter/AppCenter.xcodeproj/project.pbxproj index 1e10d239ed..e4f1c92e74 100644 --- a/AppCenter/AppCenter.xcodeproj/project.pbxproj +++ b/AppCenter/AppCenter.xcodeproj/project.pbxproj @@ -1328,9 +1328,7 @@ D5812F312423C2FA00C5F5C5 /* MSUserDefaultsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSUserDefaultsTests.m; sourceTree = ""; }; DF5DA1F823A0E55500DE695C /* MSDispatcherUtil.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSDispatcherUtil.h; sourceTree = ""; }; DF5DA1FC23A0E57B00DE695C /* MSDispatcherUtil.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSDispatcherUtil.m; sourceTree = ""; }; - DFCB7D712472B6680058D292 /* OCHamcrest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCHamcrest.framework; path = "../../../../../Library/Developer/Xcode/DerivedData/AppCenter-gpfxuikqxttcjbbawrgyhnkoxjrm/Build/Products/Debug-iphonesimulator/OCHamcrest.framework"; sourceTree = ""; }; DFCB7FFD2472C1BD0058D292 /* OCHamcrest.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OCHamcrest.xcodeproj; path = ../../Vendor/OCHamcrest/Source/OCHamcrest.xcodeproj; sourceTree = ""; }; - DFCB80152472C23E0058D292 /* OCHamcrest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCHamcrest.framework; path = "../../../../../Library/Developer/Xcode/DerivedData/AppCenter-gpfxuikqxttcjbbawrgyhnkoxjrm/Build/Products/Debug-maccatalyst/OCHamcrest.framework"; sourceTree = ""; }; DFE95520244D96170061E3FA /* HTTPStubs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTTPStubs.m; sourceTree = ""; }; DFE95521244D96170061E3FA /* NSURLRequest+HTTPBodyTesting.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSURLRequest+HTTPBodyTesting.m"; sourceTree = ""; }; DFE95522244D96170061E3FA /* HTTPStubsMethodSwizzling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTTPStubsMethodSwizzling.h; sourceTree = ""; }; @@ -1595,7 +1593,6 @@ 6E0401051D1C98220051BCFA /* AppCenter */, 6E2395791D22EF4F00E543C8 /* AppCenterTests */, 6E0401041D1C98220051BCFA /* Products */, - C934BFBF230AC17500083490 /* Frameworks */, ); sourceTree = ""; wrapsLines = 0; @@ -1848,15 +1845,6 @@ name = Products; sourceTree = ""; }; - C934BFBF230AC17500083490 /* Frameworks */ = { - isa = PBXGroup; - children = ( - DFCB80152472C23E0058D292 /* OCHamcrest.framework */, - DFCB7D712472B6680058D292 /* OCHamcrest.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; DFCB7FFE2472C1BD0058D292 /* Products */ = { isa = PBXGroup; children = ( From 2c9e73e0f6822b8c61e7b7d93b7b97de7259a120 Mon Sep 17 00:00:00 2001 From: Vladimir Vechkanov Date: Tue, 19 May 2020 19:28:18 +0400 Subject: [PATCH 011/115] Add mac catalyst into build script --- Scripts/build-xcframework.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Scripts/build-xcframework.sh b/Scripts/build-xcframework.sh index 72700dc3cd..e7dba3cf8c 100755 --- a/Scripts/build-xcframework.sh +++ b/Scripts/build-xcframework.sh @@ -9,9 +9,16 @@ WORK_DIR="${SRCROOT}/../AppCenter-SDK-Apple/xcframework" # Work dir will be the final output to the framework. XC_FRAMEWORK_PATH="${WORK_DIR}/Output/${PROJECT_NAME}.xcframework" +# Dir where catalyst build framewrok stored after build +CATALYST_BUILD_DIR="build/Release-maccatalyst/" + # Clean previus XCFramework build. rm -rf ${PROJECT_NAME}.xcframework/ +# Build and move mac catalyst framework +xcodebuild -project "${PROJECT_NAME}.xcodeproj" -configuration "Release" -scheme "${PROJECT_NAME} iOS Framework" -destination 'platform=macOS,variant=Mac Catalyst' +cp -R "$CATALYST_BUILD_DIR" "${XCFRAMEWORK_DIR}" + # Create a command to build XCFramework. for SDK in iphoneos iphonesimulator appletvos appletvsimulator macOS maccatalyst; do FRAMEWORK_PATH="$WORK_DIR/Release-$SDK/${PROJECT_NAME}.framework" From f0114bb54fc2a8561c9476a710dfbf5c3846d9e2 Mon Sep 17 00:00:00 2001 From: Oleg Misal Date: Tue, 19 May 2020 21:56:05 +0300 Subject: [PATCH 012/115] Build command fixed --- Scripts/build-xcframework.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/build-xcframework.sh b/Scripts/build-xcframework.sh index e7dba3cf8c..c99192b26e 100755 --- a/Scripts/build-xcframework.sh +++ b/Scripts/build-xcframework.sh @@ -16,7 +16,7 @@ CATALYST_BUILD_DIR="build/Release-maccatalyst/" rm -rf ${PROJECT_NAME}.xcframework/ # Build and move mac catalyst framework -xcodebuild -project "${PROJECT_NAME}.xcodeproj" -configuration "Release" -scheme "${PROJECT_NAME} iOS Framework" -destination 'platform=macOS,variant=Mac Catalyst' +xcodebuild -project "${SRCROOT}/${PROJECT_NAME}.xcodeproj" -configuration "Release" -scheme "${PROJECT_NAME} iOS Framework" -destination 'platform=macOS,variant=Mac Catalyst' cp -R "$CATALYST_BUILD_DIR" "${XCFRAMEWORK_DIR}" # Create a command to build XCFramework. From 234602358dbf02094155b1c9ecac94f86eb27e61 Mon Sep 17 00:00:00 2001 From: Ivan Matkov Date: Wed, 20 May 2020 13:43:07 +0300 Subject: [PATCH 013/115] Add PLCrashReporter as submodule (#2059) --- .gitmodules | 3 + .../project.pbxproj | 505 ++++++++++-------- .../Support/AppCenterCrashes.xcconfig | 2 + .../MSErrorLogFormatterTests.mm | 2 +- Vendor/PLCrashReporter | 1 + .../PLCrashReporter/include/CrashReporter.h | 363 ------------- .../include/PLCrashAsyncSignalInfo.h | 58 -- .../include/PLCrashFeatureConfig.h | 108 ---- .../PLCrashReporter/include/PLCrashMacros.h | 139 ----- .../include/PLCrashNamespace.h | 312 ----------- .../PLCrashReporter/include/PLCrashReport.h | 200 ------- .../include/PLCrashReportApplicationInfo.h | 62 --- .../include/PLCrashReportBinaryImageInfo.h | 90 ---- .../include/PLCrashReportExceptionInfo.h | 65 --- .../include/PLCrashReportFormatter.h | 51 -- .../include/PLCrashReportMachExceptionInfo.h | 48 -- .../include/PLCrashReportMachineInfo.h | 73 --- .../include/PLCrashReportProcessInfo.h | 103 ---- .../include/PLCrashReportProcessorInfo.h | 74 --- .../include/PLCrashReportRegisterInfo.h | 52 -- .../include/PLCrashReportSignalInfo.h | 60 --- .../include/PLCrashReportStackFrameInfo.h | 52 -- .../include/PLCrashReportSymbolInfo.h | 61 --- .../include/PLCrashReportSystemInfo.h | 171 ------ .../include/PLCrashReportTextFormatter.h | 62 --- .../include/PLCrashReportThreadInfo.h | 77 --- .../PLCrashReporter/include/PLCrashReporter.h | 137 ----- .../include/PLCrashReporterConfig.h | 178 ------ .../PLCrashReporter/libCrashReporter-iOS.a | Bin 11527072 -> 0 bytes .../PLCrashReporter/include/CrashReporter.h | 363 ------------- .../include/PLCrashAsyncSignalInfo.h | 58 -- .../include/PLCrashFeatureConfig.h | 108 ---- .../PLCrashReporter/include/PLCrashMacros.h | 139 ----- .../include/PLCrashNamespace.h | 312 ----------- .../PLCrashReporter/include/PLCrashReport.h | 200 ------- .../include/PLCrashReportApplicationInfo.h | 62 --- .../include/PLCrashReportBinaryImageInfo.h | 90 ---- .../include/PLCrashReportExceptionInfo.h | 65 --- .../include/PLCrashReportFormatter.h | 51 -- .../include/PLCrashReportMachExceptionInfo.h | 48 -- .../include/PLCrashReportMachineInfo.h | 73 --- .../include/PLCrashReportProcessInfo.h | 103 ---- .../include/PLCrashReportProcessorInfo.h | 74 --- .../include/PLCrashReportRegisterInfo.h | 52 -- .../include/PLCrashReportSignalInfo.h | 60 --- .../include/PLCrashReportStackFrameInfo.h | 52 -- .../include/PLCrashReportSymbolInfo.h | 61 --- .../include/PLCrashReportSystemInfo.h | 171 ------ .../include/PLCrashReportTextFormatter.h | 62 --- .../include/PLCrashReportThreadInfo.h | 77 --- .../PLCrashReporter/include/PLCrashReporter.h | 137 ----- .../include/PLCrashReporterConfig.h | 178 ------ .../libCrashReporter-MacOSX-Static.a | Bin 1903880 -> 0 bytes .../PLCrashReporter/include/CrashReporter.h | 363 ------------- .../include/PLCrashAsyncSignalInfo.h | 58 -- .../include/PLCrashFeatureConfig.h | 108 ---- .../PLCrashReporter/include/PLCrashMacros.h | 139 ----- .../PLCrashReporter/include/PLCrashReport.h | 200 ------- .../include/PLCrashReportApplicationInfo.h | 62 --- .../include/PLCrashReportBinaryImageInfo.h | 90 ---- .../include/PLCrashReportExceptionInfo.h | 65 --- .../include/PLCrashReportFormatter.h | 51 -- .../include/PLCrashReportMachExceptionInfo.h | 48 -- .../include/PLCrashReportMachineInfo.h | 73 --- .../include/PLCrashReportProcessInfo.h | 103 ---- .../include/PLCrashReportProcessorInfo.h | 74 --- .../include/PLCrashReportRegisterInfo.h | 52 -- .../include/PLCrashReportSignalInfo.h | 60 --- .../include/PLCrashReportStackFrameInfo.h | 52 -- .../include/PLCrashReportSymbolInfo.h | 61 --- .../include/PLCrashReportSystemInfo.h | 171 ------ .../include/PLCrashReportTextFormatter.h | 62 --- .../include/PLCrashReportThreadInfo.h | 77 --- .../PLCrashReporter/include/PLCrashReporter.h | 137 ----- .../include/PLCrashReporterConfig.h | 178 ------ .../PLCrashReporter/libCrashReporter-tvOS.a | Bin 3630768 -> 0 bytes cgmanifest.json | 2 +- 77 files changed, 290 insertions(+), 7701 deletions(-) create mode 160000 Vendor/PLCrashReporter delete mode 100644 Vendor/iOS/PLCrashReporter/include/CrashReporter.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashAsyncSignalInfo.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashFeatureConfig.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashMacros.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashNamespace.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReport.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReportApplicationInfo.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReportBinaryImageInfo.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReportExceptionInfo.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReportFormatter.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReportMachExceptionInfo.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReportMachineInfo.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReportProcessInfo.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReportProcessorInfo.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReportRegisterInfo.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReportSignalInfo.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReportStackFrameInfo.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReportSymbolInfo.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReportSystemInfo.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReportTextFormatter.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReportThreadInfo.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReporter.h delete mode 100644 Vendor/iOS/PLCrashReporter/include/PLCrashReporterConfig.h delete mode 100644 Vendor/iOS/PLCrashReporter/libCrashReporter-iOS.a delete mode 100644 Vendor/macOS/PLCrashReporter/include/CrashReporter.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashAsyncSignalInfo.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashFeatureConfig.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashMacros.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashNamespace.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReport.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReportApplicationInfo.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReportBinaryImageInfo.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReportExceptionInfo.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReportFormatter.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReportMachExceptionInfo.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReportMachineInfo.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReportProcessInfo.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReportProcessorInfo.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReportRegisterInfo.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReportSignalInfo.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReportStackFrameInfo.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReportSymbolInfo.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReportSystemInfo.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReportTextFormatter.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReportThreadInfo.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReporter.h delete mode 100644 Vendor/macOS/PLCrashReporter/include/PLCrashReporterConfig.h delete mode 100644 Vendor/macOS/PLCrashReporter/libCrashReporter-MacOSX-Static.a delete mode 100644 Vendor/tvOS/PLCrashReporter/include/CrashReporter.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashAsyncSignalInfo.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashFeatureConfig.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashMacros.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReport.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReportApplicationInfo.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReportBinaryImageInfo.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReportExceptionInfo.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReportFormatter.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReportMachExceptionInfo.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReportMachineInfo.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReportProcessInfo.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReportProcessorInfo.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReportRegisterInfo.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReportSignalInfo.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReportStackFrameInfo.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReportSymbolInfo.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReportSystemInfo.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReportTextFormatter.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReportThreadInfo.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReporter.h delete mode 100644 Vendor/tvOS/PLCrashReporter/include/PLCrashReporterConfig.h delete mode 100644 Vendor/tvOS/PLCrashReporter/libCrashReporter-tvOS.a diff --git a/.gitmodules b/.gitmodules index 8c9bc13918..403854f1f7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "Vendor/OCHamcrest"] path = Vendor/OCHamcrest url = https://github.com/hamcrest/OCHamcrest.git +[submodule "Vendor/PLCrashReporter"] + path = Vendor/PLCrashReporter + url = https://github.com/microsoft/plcrashreporter diff --git a/AppCenterCrashes/AppCenterCrashes.xcodeproj/project.pbxproj b/AppCenterCrashes/AppCenterCrashes.xcodeproj/project.pbxproj index 1e34adb27b..a52a09ff0a 100644 --- a/AppCenterCrashes/AppCenterCrashes.xcodeproj/project.pbxproj +++ b/AppCenterCrashes/AppCenterCrashes.xcodeproj/project.pbxproj @@ -225,6 +225,9 @@ C2392F6A24642D8900425640 /* OCMock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2392F5A24642CEA00425640 /* OCMock.framework */; }; C2392F6D24642D9B00425640 /* OCMock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2392F5224642CEA00425640 /* OCMock.framework */; }; C2392F7024642DAD00425640 /* OCMock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2392F5C24642CEA00425640 /* OCMock.framework */; }; + C24C9D1D2472B49E0072C35D /* libCrashReporter-iphoneos.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C24C9CF32472B3C30072C35D /* libCrashReporter-iphoneos.a */; }; + C24C9D1E2472B4AA0072C35D /* libCrashReporter-MacOSX-Static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C24C9CEF2472B3C30072C35D /* libCrashReporter-MacOSX-Static.a */; }; + C24C9D1F2472B4B20072C35D /* libCrashReporter-appletvos.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C24C9CF92472B3C30072C35D /* libCrashReporter-appletvos.a */; }; C291A048237955AA0051A846 /* MSApplicationForwarderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C291A047237955AA0051A846 /* MSApplicationForwarderTests.m */; }; C291A049237955AA0051A846 /* MSApplicationForwarderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C291A047237955AA0051A846 /* MSApplicationForwarderTests.m */; }; C291A04A237955AA0051A846 /* MSApplicationForwarderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C291A047237955AA0051A846 /* MSApplicationForwarderTests.m */; }; @@ -405,8 +408,6 @@ DFCB80662472D6920058D292 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFCB805B2472D6770058D292 /* OCHamcrest.framework */; }; DFCB80692472D6DF0058D292 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFCB80532472D6770058D292 /* OCHamcrest.framework */; }; DFCB806C2472D6F00058D292 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFCB805D2472D6770058D292 /* OCHamcrest.framework */; }; - DFEB98292318FAF400AE88C1 /* libCrashReporter-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DFEB98282318FAF400AE88C1 /* libCrashReporter-tvOS.a */; }; - DFEB98332318FF5500AE88C1 /* libCrashReporter-iOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DFEB98262318F90400AE88C1 /* libCrashReporter-iOS.a */; }; F82E4C75217F1FD700EDAB34 /* sqlite3.c in Sources */ = {isa = PBXBuildFile; fileRef = F82E4C74217F1FD600EDAB34 /* sqlite3.c */; settings = {COMPILER_FLAGS = "-w"; }; }; F82E4C76217F1FD700EDAB34 /* sqlite3.c in Sources */ = {isa = PBXBuildFile; fileRef = F82E4C74217F1FD600EDAB34 /* sqlite3.c */; settings = {COMPILER_FLAGS = "-w"; }; }; F82E4C77217F1FD700EDAB34 /* sqlite3.c in Sources */ = {isa = PBXBuildFile; fileRef = F82E4C74217F1FD600EDAB34 /* sqlite3.c */; settings = {COMPILER_FLAGS = "-w"; }; }; @@ -428,7 +429,6 @@ F859D1131E549B45008B2D8E /* live_report_swift_crash.plcrash in Resources */ = {isa = PBXBuildFile; fileRef = F859D1021E549B45008B2D8E /* live_report_swift_crash.plcrash */; }; F859D1141E549B45008B2D8E /* live_report_undefined_instr.plcrash in Resources */ = {isa = PBXBuildFile; fileRef = F859D1031E549B45008B2D8E /* live_report_undefined_instr.plcrash */; }; F859D1151E549B45008B2D8E /* live_report_write_readonly.plcrash in Resources */ = {isa = PBXBuildFile; fileRef = F859D1041E549B45008B2D8E /* live_report_write_readonly.plcrash */; }; - F8DD752D230D89F800B095B6 /* libCrashReporter-MacOSX-Static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 049327B11ECA19FD00D0187A /* libCrashReporter-MacOSX-Static.a */; }; F8FAFDFA242CABC300C7864B /* MSMockNSUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = F8FAFDF9242CABC300C7864B /* MSMockNSUserDefaults.m */; }; /* End PBXBuildFile section */ @@ -524,6 +524,125 @@ remoteGlobalIDString = 817EB1151BD765130047E85A; remoteInfo = "OCMock tvOS"; }; + C24C9CEC2472B3C30072C35D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 8DC2EF5B0486A6940098B216; + remoteInfo = "CrashReporter-MacOSX"; + }; + C24C9CEE2472B3C30072C35D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 05E731F30EFA1AAB005EDFB7; + remoteInfo = "CrashReporter-MacOSX-Static"; + }; + C24C9CF02472B3C30072C35D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 058812B91040582D009128FB; + remoteInfo = "CrashReporter-iOS"; + }; + C24C9CF22472B3C30072C35D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 05CD31520EE936A9000FDE88; + remoteInfo = "CrashReporter-iOS-Device"; + }; + C24C9CF62472B3C30072C35D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 8064D8BB1C4D22E5005A8B4C; + remoteInfo = "CrashReporter-tvOS"; + }; + C24C9CF82472B3C30072C35D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 8064D81B1C4D22D8005A8B4C; + remoteInfo = "CrashReporter-tvOS-Device"; + }; + C24C9CFC2472B3C30072C35D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 05E731E30EFA1A3E005EDFB7; + remoteInfo = plcrashutil; + }; + C24C9CFE2472B3C30072C35D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 05CD32690EE93DC3000FDE88; + remoteInfo = "Tests-MacOSX"; + }; + C24C9D022472B3C30072C35D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 05CD33240EE94439000FDE88; + remoteInfo = "Tests-iOS-Device"; + }; + C24C9D062472B3C30072C35D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 8064D9951C4D27E2005A8B4C; + remoteInfo = "Tests-tvOS-Device"; + }; + C24C9D082472B3C30072C35D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 05F40CE70EF7AB80008050CF; + remoteInfo = DemoCrash; + }; + C24C9D0A2472B3C30072C35D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 052A45CF136353FB00987004; + remoteInfo = "DemoCrash-iOS-Device"; + }; + C24C9D0E2472B3C30072C35D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 8064D9A31C4D27E9005A8B4C; + remoteInfo = "DemoCrash-tvOS-Device"; + }; + C24C9D122472B3C30072C35D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 050DE24D0F61B80B00152ED3; + remoteInfo = "Fuzz Testing"; + }; + C24C9D142472B4810072C35D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 05CD31510EE936A9000FDE88; + remoteInfo = "CrashReporter iOS"; + }; + C24C9D192472B4870072C35D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 05E731F20EFA1AAB005EDFB7; + remoteInfo = "CrashReporter macOS"; + }; + C24C9D1B2472B48D0072C35D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 8064D7AD1C4D22D8005A8B4C; + remoteInfo = "CrashReporter tvOS"; + }; C2B25A24230F03F300511D49 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 6E04012B1D1C98690051BCFA /* Project object */; @@ -629,7 +748,6 @@ 0469D1B31F4E013C00A43A8E /* AppCenterCrashes Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "AppCenterCrashes Release.xcconfig"; sourceTree = ""; }; 0484DD5F1F3910EF0092B777 /* Tests tvOS.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = "Tests tvOS.xcconfig"; path = "../../Config/Tests tvOS.xcconfig"; sourceTree = ""; }; 049327961ECA170D00D0187A /* AppCenterCrashes.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AppCenterCrashes.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 049327B11ECA19FD00D0187A /* libCrashReporter-MacOSX-Static.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libCrashReporter-MacOSX-Static.a"; sourceTree = ""; }; 049553051EF19F9F0097E071 /* MSCrashesUtilPrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSCrashesUtilPrivate.h; sourceTree = ""; }; 049BC8251ECE36D400FB6719 /* iOS.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = iOS.xcconfig; sourceTree = ""; }; 049BC8261ECE370100FB6719 /* macOS.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = macOS.xcconfig; sourceTree = ""; }; @@ -740,6 +858,7 @@ BA68266A68B7F21A86A093B0 /* MSMockCrashesDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSMockCrashesDelegate.m; sourceTree = ""; }; BA6829F386854E39B92F77C4 /* MSMockCrashesDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSMockCrashesDelegate.h; sourceTree = ""; }; C2392F4724642CEA00425640 /* OCMock.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OCMock.xcodeproj; path = ../../Vendor/OCMock/Source/OCMock.xcodeproj; sourceTree = ""; }; + C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = CrashReporter.xcodeproj; sourceTree = ""; }; C291A047237955AA0051A846 /* MSApplicationForwarderTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSApplicationForwarderTests.m; sourceTree = ""; }; C2B25A26230F040400511D49 /* AppCenter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AppCenter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C2B25A2B230F079800511D49 /* AppCenter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AppCenter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -754,76 +873,6 @@ C9EBAB2E230D736A00A20F0F /* AppCenter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AppCenter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C9EBAB30230D736F00A20F0F /* AppCenter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AppCenter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DFCB80482472D6770058D292 /* OCHamcrest.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OCHamcrest.xcodeproj; path = ../../Vendor/OCHamcrest/Source/OCHamcrest.xcodeproj; sourceTree = ""; }; - DFEB97C62318F0BA00AE88C1 /* PLCrashNamespace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashNamespace.h; sourceTree = ""; }; - DFEB97C72318F0BA00AE88C1 /* PLCrashAsyncSignalInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashAsyncSignalInfo.h; sourceTree = ""; }; - DFEB97C82318F0BA00AE88C1 /* PLCrashFeatureConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashFeatureConfig.h; sourceTree = ""; }; - DFEB97C92318F0BA00AE88C1 /* PLCrashReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReporter.h; sourceTree = ""; }; - DFEB97CA2318F0BA00AE88C1 /* PLCrashReportRegisterInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReportRegisterInfo.h; sourceTree = ""; }; - DFEB97CB2318F0BA00AE88C1 /* PLCrashReportBinaryImageInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReportBinaryImageInfo.h; sourceTree = ""; }; - DFEB97CC2318F0BA00AE88C1 /* PLCrashReport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReport.h; sourceTree = ""; }; - DFEB97CD2318F0BA00AE88C1 /* PLCrashMacros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashMacros.h; sourceTree = ""; }; - DFEB97CE2318F0BA00AE88C1 /* PLCrashReporterConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReporterConfig.h; sourceTree = ""; }; - DFEB97CF2318F0BA00AE88C1 /* PLCrashReportMachExceptionInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReportMachExceptionInfo.h; sourceTree = ""; }; - DFEB97D02318F0BA00AE88C1 /* PLCrashReportThreadInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReportThreadInfo.h; sourceTree = ""; }; - DFEB97D12318F0BA00AE88C1 /* PLCrashReportStackFrameInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReportStackFrameInfo.h; sourceTree = ""; }; - DFEB97D22318F0BA00AE88C1 /* PLCrashReportSystemInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReportSystemInfo.h; sourceTree = ""; }; - DFEB97D32318F0BA00AE88C1 /* PLCrashReportExceptionInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReportExceptionInfo.h; sourceTree = ""; }; - DFEB97D42318F0BA00AE88C1 /* PLCrashReportProcessorInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReportProcessorInfo.h; sourceTree = ""; }; - DFEB97D52318F0BA00AE88C1 /* CrashReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrashReporter.h; sourceTree = ""; }; - DFEB97D62318F0BA00AE88C1 /* PLCrashReportSignalInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReportSignalInfo.h; sourceTree = ""; }; - DFEB97D72318F0BA00AE88C1 /* PLCrashReportApplicationInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReportApplicationInfo.h; sourceTree = ""; }; - DFEB97D82318F0BA00AE88C1 /* PLCrashReportMachineInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReportMachineInfo.h; sourceTree = ""; }; - DFEB97D92318F0BA00AE88C1 /* PLCrashReportTextFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReportTextFormatter.h; sourceTree = ""; }; - DFEB97DA2318F0BA00AE88C1 /* PLCrashReportFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReportFormatter.h; sourceTree = ""; }; - DFEB97DB2318F0BA00AE88C1 /* PLCrashReportProcessInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReportProcessInfo.h; sourceTree = ""; }; - DFEB97DC2318F0BA00AE88C1 /* PLCrashReportSymbolInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReportSymbolInfo.h; sourceTree = ""; }; - DFEB97F82318F42700AE88C1 /* PLCrashNamespace.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashNamespace.h; sourceTree = ""; }; - DFEB97F92318F42700AE88C1 /* PLCrashFeatureConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashFeatureConfig.h; sourceTree = ""; }; - DFEB97FA2318F42700AE88C1 /* PLCrashReporter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReporter.h; sourceTree = ""; }; - DFEB97FB2318F42700AE88C1 /* PLCrashReportRegisterInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportRegisterInfo.h; sourceTree = ""; }; - DFEB97FC2318F42700AE88C1 /* PLCrashReportBinaryImageInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportBinaryImageInfo.h; sourceTree = ""; }; - DFEB97FD2318F42700AE88C1 /* PLCrashReport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReport.h; sourceTree = ""; }; - DFEB97FE2318F42700AE88C1 /* PLCrashMacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashMacros.h; sourceTree = ""; }; - DFEB97FF2318F42700AE88C1 /* PLCrashReporterConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReporterConfig.h; sourceTree = ""; }; - DFEB98002318F42700AE88C1 /* PLCrashReportMachExceptionInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportMachExceptionInfo.h; sourceTree = ""; }; - DFEB98012318F42700AE88C1 /* PLCrashReportThreadInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportThreadInfo.h; sourceTree = ""; }; - DFEB98022318F42700AE88C1 /* PLCrashReportStackFrameInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportStackFrameInfo.h; sourceTree = ""; }; - DFEB98032318F42700AE88C1 /* PLCrashReportSystemInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportSystemInfo.h; sourceTree = ""; }; - DFEB98042318F42700AE88C1 /* PLCrashReportExceptionInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportExceptionInfo.h; sourceTree = ""; }; - DFEB98052318F42700AE88C1 /* PLCrashReportProcessorInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportProcessorInfo.h; sourceTree = ""; }; - DFEB98062318F42700AE88C1 /* CrashReporter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CrashReporter.h; sourceTree = ""; }; - DFEB98072318F42700AE88C1 /* PLCrashReportSignalInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportSignalInfo.h; sourceTree = ""; }; - DFEB98082318F42700AE88C1 /* PLCrashReportApplicationInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportApplicationInfo.h; sourceTree = ""; }; - DFEB98092318F42700AE88C1 /* PLCrashReportMachineInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportMachineInfo.h; sourceTree = ""; }; - DFEB980A2318F42700AE88C1 /* PLCrashReportTextFormatter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportTextFormatter.h; sourceTree = ""; }; - DFEB980B2318F42700AE88C1 /* PLCrashReportFormatter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportFormatter.h; sourceTree = ""; }; - DFEB980C2318F42700AE88C1 /* PLCrashReportProcessInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportProcessInfo.h; sourceTree = ""; }; - DFEB980D2318F42700AE88C1 /* PLCrashReportSymbolInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportSymbolInfo.h; sourceTree = ""; }; - DFEB980F2318F56B00AE88C1 /* PLCrashNamespace.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashNamespace.h; sourceTree = ""; }; - DFEB98102318F56B00AE88C1 /* PLCrashAsyncSignalInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashAsyncSignalInfo.h; sourceTree = ""; }; - DFEB98112318F56B00AE88C1 /* PLCrashFeatureConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashFeatureConfig.h; sourceTree = ""; }; - DFEB98122318F56B00AE88C1 /* PLCrashReporter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReporter.h; sourceTree = ""; }; - DFEB98132318F56B00AE88C1 /* PLCrashReportRegisterInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportRegisterInfo.h; sourceTree = ""; }; - DFEB98142318F56B00AE88C1 /* PLCrashReportBinaryImageInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportBinaryImageInfo.h; sourceTree = ""; }; - DFEB98152318F56B00AE88C1 /* PLCrashReport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReport.h; sourceTree = ""; }; - DFEB98162318F56B00AE88C1 /* PLCrashMacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashMacros.h; sourceTree = ""; }; - DFEB98172318F56B00AE88C1 /* PLCrashReporterConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReporterConfig.h; sourceTree = ""; }; - DFEB98182318F56B00AE88C1 /* PLCrashReportMachExceptionInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportMachExceptionInfo.h; sourceTree = ""; }; - DFEB98192318F56B00AE88C1 /* PLCrashReportThreadInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportThreadInfo.h; sourceTree = ""; }; - DFEB981A2318F56B00AE88C1 /* PLCrashReportStackFrameInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportStackFrameInfo.h; sourceTree = ""; }; - DFEB981B2318F56B00AE88C1 /* PLCrashReportSystemInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportSystemInfo.h; sourceTree = ""; }; - DFEB981C2318F56B00AE88C1 /* PLCrashReportExceptionInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportExceptionInfo.h; sourceTree = ""; }; - DFEB981D2318F56B00AE88C1 /* PLCrashReportProcessorInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportProcessorInfo.h; sourceTree = ""; }; - DFEB981E2318F56B00AE88C1 /* CrashReporter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CrashReporter.h; sourceTree = ""; }; - DFEB981F2318F56B00AE88C1 /* PLCrashReportSignalInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportSignalInfo.h; sourceTree = ""; }; - DFEB98202318F56B00AE88C1 /* PLCrashReportApplicationInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportApplicationInfo.h; sourceTree = ""; }; - DFEB98212318F56B00AE88C1 /* PLCrashReportMachineInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportMachineInfo.h; sourceTree = ""; }; - DFEB98222318F56B00AE88C1 /* PLCrashReportTextFormatter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportTextFormatter.h; sourceTree = ""; }; - DFEB98232318F56B00AE88C1 /* PLCrashReportFormatter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportFormatter.h; sourceTree = ""; }; - DFEB98242318F56B00AE88C1 /* PLCrashReportProcessInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportProcessInfo.h; sourceTree = ""; }; - DFEB98252318F56B00AE88C1 /* PLCrashReportSymbolInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashReportSymbolInfo.h; sourceTree = ""; }; - DFEB98262318F90400AE88C1 /* libCrashReporter-iOS.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libCrashReporter-iOS.a"; sourceTree = ""; }; - DFEB98282318FAF400AE88C1 /* libCrashReporter-tvOS.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libCrashReporter-tvOS.a"; sourceTree = ""; }; F82E4C74217F1FD600EDAB34 /* sqlite3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sqlite3.c; path = ../../Vendor/SQLite3/sqlite3.c; sourceTree = ""; }; F851DAEC1E81867D00525570 /* MSCrashesCXXExceptionTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MSCrashesCXXExceptionTests.mm; sourceTree = ""; }; F859D0F41E549B45008B2D8E /* live_report_bad_ptr.plcrash */ = {isa = PBXFileReference; lastKnownFileType = file; path = live_report_bad_ptr.plcrash; sourceTree = ""; }; @@ -886,8 +935,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DFEB98332318FF5500AE88C1 /* libCrashReporter-iOS.a in Frameworks */, C9EBAB2D230D735E00A20F0F /* AppCenter.framework in Frameworks */, + C24C9D1D2472B49E0072C35D /* libCrashReporter-iphoneos.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -895,8 +944,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DFEB98292318FAF400AE88C1 /* libCrashReporter-tvOS.a in Frameworks */, C9EBAB2F230D736A00A20F0F /* AppCenter.framework in Frameworks */, + C24C9D1F2472B4B20072C35D /* libCrashReporter-appletvos.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -904,24 +953,15 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F8DD752D230D89F800B095B6 /* libCrashReporter-MacOSX-Static.a in Frameworks */, C9EBAB31230D736F00A20F0F /* AppCenter.framework in Frameworks */, + C24C9D1E2472B4AA0072C35D /* libCrashReporter-MacOSX-Static.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 049327981ECA19FD00D0187A /* PLCrashReporter */ = { - isa = PBXGroup; - children = ( - DFEB97F72318F42700AE88C1 /* include */, - 049327B11ECA19FD00D0187A /* libCrashReporter-MacOSX-Static.a */, - ); - name = PLCrashReporter; - path = ../Vendor/macOS/PLCrashReporter; - sourceTree = ""; - }; + 04A140B31ECE8249001CEE94 /* Model */ = { isa = PBXGroup; children = ( @@ -971,30 +1011,10 @@ path = Util; sourceTree = ""; }; - 04EBBEAB1F01C0980006B8AE /* tvOS */ = { - isa = PBXGroup; - children = ( - DFEB97C32318F0BA00AE88C1 /* PLCrashReporter */, - ); - name = tvOS; - sourceTree = ""; - }; - 04EBBEAC1F01C0A00006B8AE /* macOS */ = { - isa = PBXGroup; - children = ( - 049327981ECA19FD00D0187A /* PLCrashReporter */, - ); - name = macOS; - sourceTree = ""; - }; - 04EBBEAD1F01C0A50006B8AE /* iOS */ = { - isa = PBXGroup; - children = ( - DFEB978F2318F09A00AE88C1 /* PLCrashReporter */, - ); - name = iOS; - sourceTree = ""; - }; + + + + 350B29E91F192A5C009B91CF /* WrapperSDKUtilities */ = { isa = PBXGroup; children = ( @@ -1162,9 +1182,7 @@ 6EC99A221D4151C60016C325 /* Vendor */ = { isa = PBXGroup; children = ( - 04EBBEAD1F01C0A50006B8AE /* iOS */, - 04EBBEAC1F01C0A00006B8AE /* macOS */, - 04EBBEAB1F01C0980006B8AE /* tvOS */, + C24C9CD02472B3AB0072C35D /* PLCrashReporter */, ); name = Vendor; sourceTree = ""; @@ -1228,6 +1246,36 @@ name = Products; sourceTree = ""; }; + C24C9CD02472B3AB0072C35D /* PLCrashReporter */ = { + isa = PBXGroup; + children = ( + C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */, + ); + name = PLCrashReporter; + path = ../Vendor/PLCrashReporter; + sourceTree = ""; + }; + C24C9CD22472B3C30072C35D /* Products */ = { + isa = PBXGroup; + children = ( + C24C9CED2472B3C30072C35D /* CrashReporter.framework */, + C24C9CF12472B3C30072C35D /* CrashReporter.framework */, + C24C9CF72472B3C30072C35D /* CrashReporter.framework */, + C24C9CEF2472B3C30072C35D /* libCrashReporter-MacOSX-Static.a */, + C24C9CF32472B3C30072C35D /* libCrashReporter-iphoneos.a */, + C24C9CF92472B3C30072C35D /* libCrashReporter-appletvos.a */, + C24C9CFF2472B3C30072C35D /* Tests-MacOSX.xctest */, + C24C9D032472B3C30072C35D /* Tests-iOS-Device.xctest */, + C24C9D072472B3C30072C35D /* Tests-tvOS-Device.xctest */, + C24C9D092472B3C30072C35D /* DemoCrash.app */, + C24C9D0B2472B3C30072C35D /* DemoCrash-iOS-Device.app */, + C24C9D0F2472B3C30072C35D /* DemoCrash-tvOS-Device.app */, + C24C9CFD2472B3C30072C35D /* plcrashutil */, + C24C9D132472B3C30072C35D /* Fuzz Testing */, + ); + name = Products; + sourceTree = ""; + }; C9A91F68230BFDFD0068070D /* Frameworks */ = { isa = PBXGroup; children = ( @@ -1268,115 +1316,6 @@ name = Products; sourceTree = ""; }; - DFEB978F2318F09A00AE88C1 /* PLCrashReporter */ = { - isa = PBXGroup; - children = ( - DFEB980E2318F56B00AE88C1 /* include */, - DFEB98262318F90400AE88C1 /* libCrashReporter-iOS.a */, - ); - name = PLCrashReporter; - path = ../Vendor/iOS/PLCrashReporter; - sourceTree = ""; - }; - DFEB97C32318F0BA00AE88C1 /* PLCrashReporter */ = { - isa = PBXGroup; - children = ( - DFEB97C52318F0BA00AE88C1 /* include */, - DFEB98282318FAF400AE88C1 /* libCrashReporter-tvOS.a */, - ); - name = PLCrashReporter; - path = ../Vendor/tvOS/PLCrashReporter; - sourceTree = ""; - }; - DFEB97C52318F0BA00AE88C1 /* include */ = { - isa = PBXGroup; - children = ( - DFEB97C62318F0BA00AE88C1 /* PLCrashNamespace.h */, - DFEB97C72318F0BA00AE88C1 /* PLCrashAsyncSignalInfo.h */, - DFEB97C82318F0BA00AE88C1 /* PLCrashFeatureConfig.h */, - DFEB97C92318F0BA00AE88C1 /* PLCrashReporter.h */, - DFEB97CA2318F0BA00AE88C1 /* PLCrashReportRegisterInfo.h */, - DFEB97CB2318F0BA00AE88C1 /* PLCrashReportBinaryImageInfo.h */, - DFEB97CC2318F0BA00AE88C1 /* PLCrashReport.h */, - DFEB97CD2318F0BA00AE88C1 /* PLCrashMacros.h */, - DFEB97CE2318F0BA00AE88C1 /* PLCrashReporterConfig.h */, - DFEB97CF2318F0BA00AE88C1 /* PLCrashReportMachExceptionInfo.h */, - DFEB97D02318F0BA00AE88C1 /* PLCrashReportThreadInfo.h */, - DFEB97D12318F0BA00AE88C1 /* PLCrashReportStackFrameInfo.h */, - DFEB97D22318F0BA00AE88C1 /* PLCrashReportSystemInfo.h */, - DFEB97D32318F0BA00AE88C1 /* PLCrashReportExceptionInfo.h */, - DFEB97D42318F0BA00AE88C1 /* PLCrashReportProcessorInfo.h */, - DFEB97D52318F0BA00AE88C1 /* CrashReporter.h */, - DFEB97D62318F0BA00AE88C1 /* PLCrashReportSignalInfo.h */, - DFEB97D72318F0BA00AE88C1 /* PLCrashReportApplicationInfo.h */, - DFEB97D82318F0BA00AE88C1 /* PLCrashReportMachineInfo.h */, - DFEB97D92318F0BA00AE88C1 /* PLCrashReportTextFormatter.h */, - DFEB97DA2318F0BA00AE88C1 /* PLCrashReportFormatter.h */, - DFEB97DB2318F0BA00AE88C1 /* PLCrashReportProcessInfo.h */, - DFEB97DC2318F0BA00AE88C1 /* PLCrashReportSymbolInfo.h */, - ); - path = include; - sourceTree = ""; - }; - DFEB97F72318F42700AE88C1 /* include */ = { - isa = PBXGroup; - children = ( - DFEB97F82318F42700AE88C1 /* PLCrashNamespace.h */, - DFEB97F92318F42700AE88C1 /* PLCrashFeatureConfig.h */, - DFEB97FA2318F42700AE88C1 /* PLCrashReporter.h */, - DFEB97FB2318F42700AE88C1 /* PLCrashReportRegisterInfo.h */, - DFEB97FC2318F42700AE88C1 /* PLCrashReportBinaryImageInfo.h */, - DFEB97FD2318F42700AE88C1 /* PLCrashReport.h */, - DFEB97FE2318F42700AE88C1 /* PLCrashMacros.h */, - DFEB97FF2318F42700AE88C1 /* PLCrashReporterConfig.h */, - DFEB98002318F42700AE88C1 /* PLCrashReportMachExceptionInfo.h */, - DFEB98012318F42700AE88C1 /* PLCrashReportThreadInfo.h */, - DFEB98022318F42700AE88C1 /* PLCrashReportStackFrameInfo.h */, - DFEB98032318F42700AE88C1 /* PLCrashReportSystemInfo.h */, - DFEB98042318F42700AE88C1 /* PLCrashReportExceptionInfo.h */, - DFEB98052318F42700AE88C1 /* PLCrashReportProcessorInfo.h */, - DFEB98062318F42700AE88C1 /* CrashReporter.h */, - DFEB98072318F42700AE88C1 /* PLCrashReportSignalInfo.h */, - DFEB98082318F42700AE88C1 /* PLCrashReportApplicationInfo.h */, - DFEB98092318F42700AE88C1 /* PLCrashReportMachineInfo.h */, - DFEB980A2318F42700AE88C1 /* PLCrashReportTextFormatter.h */, - DFEB980B2318F42700AE88C1 /* PLCrashReportFormatter.h */, - DFEB980C2318F42700AE88C1 /* PLCrashReportProcessInfo.h */, - DFEB980D2318F42700AE88C1 /* PLCrashReportSymbolInfo.h */, - ); - path = include; - sourceTree = ""; - }; - DFEB980E2318F56B00AE88C1 /* include */ = { - isa = PBXGroup; - children = ( - DFEB980F2318F56B00AE88C1 /* PLCrashNamespace.h */, - DFEB98102318F56B00AE88C1 /* PLCrashAsyncSignalInfo.h */, - DFEB98112318F56B00AE88C1 /* PLCrashFeatureConfig.h */, - DFEB98122318F56B00AE88C1 /* PLCrashReporter.h */, - DFEB98132318F56B00AE88C1 /* PLCrashReportRegisterInfo.h */, - DFEB98142318F56B00AE88C1 /* PLCrashReportBinaryImageInfo.h */, - DFEB98152318F56B00AE88C1 /* PLCrashReport.h */, - DFEB98162318F56B00AE88C1 /* PLCrashMacros.h */, - DFEB98172318F56B00AE88C1 /* PLCrashReporterConfig.h */, - DFEB98182318F56B00AE88C1 /* PLCrashReportMachExceptionInfo.h */, - DFEB98192318F56B00AE88C1 /* PLCrashReportThreadInfo.h */, - DFEB981A2318F56B00AE88C1 /* PLCrashReportStackFrameInfo.h */, - DFEB981B2318F56B00AE88C1 /* PLCrashReportSystemInfo.h */, - DFEB981C2318F56B00AE88C1 /* PLCrashReportExceptionInfo.h */, - DFEB981D2318F56B00AE88C1 /* PLCrashReportProcessorInfo.h */, - DFEB981E2318F56B00AE88C1 /* CrashReporter.h */, - DFEB981F2318F56B00AE88C1 /* PLCrashReportSignalInfo.h */, - DFEB98202318F56B00AE88C1 /* PLCrashReportApplicationInfo.h */, - DFEB98212318F56B00AE88C1 /* PLCrashReportMachineInfo.h */, - DFEB98222318F56B00AE88C1 /* PLCrashReportTextFormatter.h */, - DFEB98232318F56B00AE88C1 /* PLCrashReportFormatter.h */, - DFEB98242318F56B00AE88C1 /* PLCrashReportProcessInfo.h */, - DFEB98252318F56B00AE88C1 /* PLCrashReportSymbolInfo.h */, - ); - path = include; - sourceTree = ""; - }; F859D0F31E549B45008B2D8E /* CrashProbe */ = { isa = PBXGroup; children = ( @@ -1608,6 +1547,7 @@ buildRules = ( ); dependencies = ( + C24C9D152472B4810072C35D /* PBXTargetDependency */, ); name = "AppCenterCrashes iOS Framework"; productName = AppCenterCrashesStaticIOS; @@ -1626,6 +1566,7 @@ buildRules = ( ); dependencies = ( + C24C9D1C2472B48D0072C35D /* PBXTargetDependency */, ); name = "AppCenterCrashes tvOS Framework"; productName = AppCenterCrashesStaticIOS; @@ -1644,6 +1585,7 @@ buildRules = ( ); dependencies = ( + C24C9D1A2472B4870072C35D /* PBXTargetDependency */, ); name = "AppCenterCrashes macOS Framework"; productName = AppCenterCrashesStaticIOS; @@ -1688,6 +1630,10 @@ ProductGroup = DFCB80492472D6770058D292 /* Products */; ProjectRef = DFCB80482472D6770058D292 /* OCHamcrest.xcodeproj */; }, + { + ProductGroup = C24C9CD22472B3C30072C35D /* Products */; + ProjectRef = C24C9CD12472B3C30072C35D /* CrashReporter.xcodeproj */; + }, { ProductGroup = C2392F4824642CEA00425640 /* Products */; ProjectRef = C2392F4724642CEA00425640 /* OCMock.xcodeproj */; @@ -1811,6 +1757,104 @@ remoteRef = DFCB805E2472D6770058D292 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + C24C9CED2472B3C30072C35D /* CrashReporter.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CrashReporter.framework; + remoteRef = C24C9CEC2472B3C30072C35D /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C24C9CEF2472B3C30072C35D /* libCrashReporter-MacOSX-Static.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libCrashReporter-MacOSX-Static.a"; + remoteRef = C24C9CEE2472B3C30072C35D /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C24C9CF12472B3C30072C35D /* CrashReporter.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CrashReporter.framework; + remoteRef = C24C9CF02472B3C30072C35D /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C24C9CF32472B3C30072C35D /* libCrashReporter-iphoneos.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libCrashReporter-iphoneos.a"; + remoteRef = C24C9CF22472B3C30072C35D /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C24C9CF72472B3C30072C35D /* CrashReporter.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CrashReporter.framework; + remoteRef = C24C9CF62472B3C30072C35D /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C24C9CF92472B3C30072C35D /* libCrashReporter-appletvos.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libCrashReporter-appletvos.a"; + remoteRef = C24C9CF82472B3C30072C35D /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C24C9CFD2472B3C30072C35D /* plcrashutil */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = plcrashutil; + remoteRef = C24C9CFC2472B3C30072C35D /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C24C9CFF2472B3C30072C35D /* Tests-MacOSX.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "Tests-MacOSX.xctest"; + remoteRef = C24C9CFE2472B3C30072C35D /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C24C9D032472B3C30072C35D /* Tests-iOS-Device.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "Tests-iOS-Device.xctest"; + remoteRef = C24C9D022472B3C30072C35D /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C24C9D072472B3C30072C35D /* Tests-tvOS-Device.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "Tests-tvOS-Device.xctest"; + remoteRef = C24C9D062472B3C30072C35D /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C24C9D092472B3C30072C35D /* DemoCrash.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = DemoCrash.app; + remoteRef = C24C9D082472B3C30072C35D /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C24C9D0B2472B3C30072C35D /* DemoCrash-iOS-Device.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = "DemoCrash-iOS-Device.app"; + remoteRef = C24C9D0A2472B3C30072C35D /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C24C9D0F2472B3C30072C35D /* DemoCrash-tvOS-Device.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = "DemoCrash-tvOS-Device.app"; + remoteRef = C24C9D0E2472B3C30072C35D /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C24C9D132472B3C30072C35D /* Fuzz Testing */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = "Fuzz Testing"; + remoteRef = C24C9D122472B3C30072C35D /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -2288,6 +2332,21 @@ name = "OCMock tvOS"; targetProxy = C2392F6E24642DA400425640 /* PBXContainerItemProxy */; }; + C24C9D152472B4810072C35D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "CrashReporter iOS"; + targetProxy = C24C9D142472B4810072C35D /* PBXContainerItemProxy */; + }; + C24C9D1A2472B4870072C35D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "CrashReporter macOS"; + targetProxy = C24C9D192472B4870072C35D /* PBXContainerItemProxy */; + }; + C24C9D1C2472B48D0072C35D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "CrashReporter tvOS"; + targetProxy = C24C9D1B2472B48D0072C35D /* PBXContainerItemProxy */; + }; C2B25A25230F03F300511D49 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = C9A91F49230BFD930068070D /* AppCenterCrashes iOS Framework */; diff --git a/AppCenterCrashes/AppCenterCrashes/Support/AppCenterCrashes.xcconfig b/AppCenterCrashes/AppCenterCrashes/Support/AppCenterCrashes.xcconfig index 9ed4688a59..789678b75a 100644 --- a/AppCenterCrashes/AppCenterCrashes/Support/AppCenterCrashes.xcconfig +++ b/AppCenterCrashes/AppCenterCrashes/Support/AppCenterCrashes.xcconfig @@ -1,3 +1,5 @@ PRODUCT_BUNDLE_IDENTIFIER = com.microsoft.appcenter.crashes OTHER_LDFLAGS = $(inherited) -framework Foundation -lc++ -lz + +USER_HEADER_SEARCH_PATHS = $(USER_HEADER_SEARCH_PATHS) "$(SRCROOT)/../Vendor/PLCrashReporter"/** diff --git a/AppCenterCrashes/AppCenterCrashesTests/MSErrorLogFormatterTests.mm b/AppCenterCrashes/AppCenterCrashesTests/MSErrorLogFormatterTests.mm index c7ebf10da4..c5348cc131 100644 --- a/AppCenterCrashes/AppCenterCrashesTests/MSErrorLogFormatterTests.mm +++ b/AppCenterCrashes/AppCenterCrashesTests/MSErrorLogFormatterTests.mm @@ -456,7 +456,7 @@ - (void)testErrorLogFromCrashReportWithWrapper { // If NSError *error = nil; - MSPLCrashReport *report = [[MSPLCrashReport alloc] initWithData:crashData error:&error]; + PLCrashReport *report = [[PLCrashReport alloc] initWithData:crashData error:&error]; MSDevice *device = self.deviceMock; device.wrapperSdkVersion = @"10.11.12"; device.wrapperSdkName = @"Wrapper SDK for iOS"; diff --git a/Vendor/PLCrashReporter b/Vendor/PLCrashReporter new file mode 160000 index 0000000000..9105145ab6 --- /dev/null +++ b/Vendor/PLCrashReporter @@ -0,0 +1 @@ +Subproject commit 9105145ab6e4edb20ea196191bae858e174c8f43 diff --git a/Vendor/iOS/PLCrashReporter/include/CrashReporter.h b/Vendor/iOS/PLCrashReporter/include/CrashReporter.h deleted file mode 100644 index c654319112..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/CrashReporter.h +++ /dev/null @@ -1,363 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2008-2009 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -#ifdef __APPLE__ -#import -#endif - -// This must be included before any other PLCrashReporter includes, as -// it redefines symbol names -#import "PLCrashNamespace.h" - -#import "PLCrashReporter.h" -#import "PLCrashReport.h" -#import "PLCrashReportTextFormatter.h" - -/** - * @defgroup functions Crash Reporter Functions Reference - */ - -/** - * @defgroup types Crash Reporter Data Types Reference - */ - -/** - * @defgroup constants Crash Reporter Constants Reference - */ - -/** - * @internal - * @defgroup plcrash_internal Crash Reporter Internal Documentation - */ - -/** - * @defgroup enums Enumerations - * @ingroup constants - */ - -/** - * @defgroup globals Global Variables - * @ingroup constants - */ - -/** - * @defgroup exceptions Exceptions - * @ingroup constants - */ - -/* Exceptions */ -extern NSString *PLCrashReporterException; - -/* Error Domain and Codes */ -extern NSString *PLCrashReporterErrorDomain; - -/** - * NSError codes in the Plausible Crash Reporter error domain. - * @ingroup enums - */ -typedef enum { - /** An unknown error has occured. If this - * code is received, it is a bug, and should be reported. */ - PLCrashReporterErrorUnknown = 0, - - /** An Mach or POSIX operating system error has occured. The underlying NSError cause may be fetched from the userInfo - * dictionary using the NSUnderlyingErrorKey key. */ - PLCrashReporterErrorOperatingSystem = 1, - - /** The crash report log file is corrupt or invalid */ - PLCrashReporterErrorCrashReportInvalid = 2, - - /** An attempt to use a resource which was in use at the time in a manner which would have conflicted with the request. */ - PLCrashReporterErrorResourceBusy = 3 -} PLCrashReporterError; - - -/* Library Imports */ -#import "PLCrashReporter.h" -#import "PLCrashReport.h" -#import "PLCrashReportTextFormatter.h" - -/** - * @mainpage Plausible Crash Reporter - * - * @section intro_sec Introduction - * - * Plausile CrashReporter implements in-process crash reporting on the iPhone and Mac OS X. - * - * The following features are supported: - * - * - Implemented as an in-process signal handler. - * - Does not interfer with debugging in gdb.. - * - Handles both uncaught Objective-C exceptions and fatal signals (SIGSEGV, SIGBUS, etc). - * - Full thread state for all active threads (backtraces, register dumps) is provided. - * - * If your application crashes, a crash report will be written. When the application is next run, you may check for a - * pending crash report, and submit the report to your own HTTP server, send an e-mail, or even introspect the - * report locally. - * - * @section intro_encoding Crash Report Format - * - * Crash logs are encoded using google protobuf, and may be decoded - * using the provided PLCrashReport API. Additionally, the include plcrashutil handles conversion of binary crash reports to the - * symbolicate-compatible iPhone text format. - * - * @section doc_sections Documentation Sections - * - @subpage example_usage_iphone - * - @subpage error_handling - * - @subpage async_safety - */ - -/** - * @page example_usage_iphone Example iPhone Usage - * - * @code - * // - * // Called to handle a pending crash report. - * // - * - (void) handleCrashReport { - * PLCrashReporter *crashReporter = [PLCrashReporter sharedReporter]; - * NSData *crashData; - * NSError *error; - * - * // Try loading the crash report - * crashData = [crashReporter loadPendingCrashReportDataAndReturnError: &error]; - * if (crashData == nil) { - * NSLog(@"Could not load crash report: %@", error); - * goto finish; - * } - * - * // We could send the report from here, but we'll just print out - * // some debugging info instead - * PLCrashReport *report = [[[PLCrashReport alloc] initWithData: crashData error: &error] autorelease]; - * if (report == nil) { - * NSLog(@"Could not parse crash report"); - * goto finish; - * } - * - * NSLog(@"Crashed on %@", report.systemInfo.timestamp); - * NSLog(@"Crashed with signal %@ (code %@, address=0x%" PRIx64 ")", report.signalInfo.name, - * report.signalInfo.code, report.signalInfo.address); - * - * // Purge the report - * finish: - * [crashReporter purgePendingCrashReport]; - * return; - * } - * - * // from UIApplicationDelegate protocol - * - (void) applicationDidFinishLaunching: (UIApplication *) application { - * PLCrashReporter *crashReporter = [PLCrashReporter sharedReporter]; - * NSError *error; - * - * // Check if we previously crashed - * if ([crashReporter hasPendingCrashReport]) - * [self handleCrashReport]; - - * // Enable the Crash Reporter - * if (![crashReporter enableCrashReporterAndReturnError: &error]) - * NSLog(@"Warning: Could not enable crash reporter: %@", error); - * - * } - * @endcode - * - */ - -/** - * @page error_handling Error Handling Programming Guide - * - * Where a method may return an error, Plausible Crash Reporter provides access to the underlying - * cause via an optional NSError argument. - * - * All returned errors will be a member of one of the below defined domains, however, new domains and - * error codes may be added at any time. If you do not wish to report on the error cause, many methods - * support a simple form that requires no NSError argument. - * - * @section error_domains Error Domains, Codes, and User Info - * - * @subsection crashreporter_errors Crash Reporter Errors - * - * Any errors in Plausible Crash Reporter use the #PLCrashReporterErrorDomain error domain, and and one - * of the error codes defined in #PLCrashReporterError. - */ - -/** - * @page async_safety Async-Safe Programming Guide - * - * Plausible CrashReporter provides support for executing an application specified function in the context of the - * crash reporter's signal handler, after the crash report has been written to disk. This was a regularly requested - * feature, and provides the ability to implement application finalization in the event of a crash. However, writing - * code intended for execution inside of a signal handler is exceptionally difficult, and is not recommended. - * - * @section program_flow Program Flow and Signal Handlers - * - * When the signal handler is called the normal flow of the program is interrupted, and your program is an unknown - * state. Locks may be held, the heap may be corrupt (or in the process of being updated), and your signal - * handler may invoke a function that was being executed at the time of the signal. This may result in deadlocks, - * data corruption, and program termination. - * - * @section functions Async-Safe Functions - * - * A subset of functions are defined to be async-safe by the OS, and are safely callable from within a signal handler. If - * you do implement a custom post-crash handler, it must be async-safe. A table of POSIX-defined async-safe functions - * and additional information is available from the - * CERT programming guide - SIG30-C - * - * Most notably, the Objective-C runtime itself is not async-safe, and Objective-C may not be used within a signal - * handler. - * - * @sa PLCrashReporter::setCrashCallbacks: - */ - -/** - * @page mach_exceptions Mach Exceptions on Mac OS X and iOS - * - * PLCrashReporter includes support for monitoring crashes via an in-process Mach exception handler. There are a small - * number of crash cases that will not be caught with via a POSIX signal handler, but can be caught via a Mach - * exception handler: - * - * - Stack overflow. sigaltstack() is broken in later iOS releases, and even if functional, must be configured - * on a per-thread basis. - * - Internal Apple assertions that call libSystem's __assert. These include compiler-checked constraints - * for built-in functions, such as strcpy_chk(). The __abort() implementation actually disables the SIGABRT - * signal handler (resetting it to SIG_DFL) prior to to issueing a SIGABRT, bypassing signal-based crash - * reporters entirely. - * - * Unfortunately, the latter issue (__assert) can not be handled on iOS; trapping abort requires that - * a Mach exception handler operate out-of-process, which is impossible on iOS. On Mac OS X, this will - * only be handled once we've implemented fully out-of-process crash excution. - * - * On Mac OS X, the Mach exception implementation is fully supported using entirely public API. On iOS, - * the APIs required are not fully public -- more details on the implications of this for exception handling on - * iOS may be found in @ref mach_exceptions_ios below. It is worth noting that even where the Mach exception APIs - * are fully supported, kernel-internal constants, as well - * as architecture-specific trap information, may be required to fully interpret a Mach exception's root cause. - * - * For example, the EXC_SOFTWARE exception is dispatched for four different failure types, using the exception - * code to differentiate failure types: - * - Non-existent system call invoked (SIGSYS) - * - Write on a pipe with no reader (SIGPIPE) - * - Abort program (SIGABRT -- unused) - * - Kill program (SIGKILL) - * - * Of those four types, only the constant required to interpret the SIGKILL behavior (EXC_SOFT_SIGNAL) is publicly defined. - * Of the remaining three failure types, the constant values are kernel implementation-private, defined only in the available - * kernel sources. On iOS, these sources are unavailable, and while they generally do match the Mac OS X implementation, there - * are no gaurantees that this is -- or will remain -- the case in the future. - * - * Likewise, interpretation of particular fault types requires information regarding the underlying machine traps - * that triggered the Mach exceptions. For example, a floating point trap on x86/x86-64 will trigger an EXC_ARITHMETIC, - * with a subcode value containing the value of the FPU status register. Determining the exact FPU cause requires - * extracting the actual exception flags from status register as per the x86 architecture documentation. The exact format - * of this subcode value is not actually documented outside the kernel, and may change in future releases. - * - * While we have the advantage of access to the x86 kernel sources, the situation on ARM is even less clear. The actual - * use of the Mach exception codes and subcodes is largely undefined by both headers and publicly available documentation, - * and the available x86 kernel sources are of little use in interpreting this data. - * - * As such, while Mach exceptions may catch some cases that BSD signals can not, they are not a perfect solution, - * and may also provide less insight into the actual failures that occur. By comparison, the BSD signal interface - * is both fully defined and architecture independent, with any necessary interpretation of the Mach exception - * codes handled in-kernel at the time of exception dispatch. It is generally recommended by Apple as the preferred - * interface, and should generally be preferred by PLCrashReporter API clients. - * - * @section mach_exceptions_compatibility Compatibility Issues - * - * @subsection Debuggers - * - * Enabling in-process Mach exception handlers will conflict with any attached debuggers; the debugger - * may suspend the processes Mach exception handling thread, which will result in any exception messages - * sent via the debugger being lost, as the in-process handler will be unable to receive and forward - * the messages. - * - * @subsection Managed Runtimes (Xamarin, Unity) - * - * A Mach exception handler may conflict with any managed runtime that registers a BSD signal handler that - * can safely handle otherwise fatal signals, allowing execution to proceed. This includes products - * such as Xamarin for iOS. - * - * In such a case, PLCrashReporter will write a crash report for non-fatal signals, as there is no - * immediate mechanism for determining whether a signal handler exists and that it can safely - * handle the failure. This can result in unexpected delays in application execution, increased I/O to - * disk, and other undesirable operations. - * - * @section mach_exceptions_ios Mach Exceptions on iOS - * - * The APIs required for Mach exception handling are not fully public on iOS. After filing a request with - * Apple DTS to clarify the status of the Mach exception APIs on iOS, and implementing a Mach Exception - * handler using only supported API, they provided the following guidance: - * - * Our engineers have reviewed your request and have determined that this would be best handled as a bug report, - * which you have already filed. There is no documented way of accomplishing this, nor is there a workaround - * possible. - * - * Due to user request, PLCrashReporter provides an optional implementation of Mach exception handling for both - * iOS and Mac OS X. - * - * This implementation uses only supported API on Mac OS X, and depends on limited undefined API on iOS. The reporter - * may be excluded entirely at build time by modifying the PLCRASH_FEATURE_MACH_EXCEPTIONS build configuration; it - * may also be disabled at runtime by configuring the PLCrashReporter instance appropriately via PLCrashReporterConfig. - * - * The iOS implementation is implemented almost entirely using public API, and links against no actual private symbols; - * the use of undocumented functionality is limited to assuming the use of specific msgh_id values (see below - * for details). As a result, it may be considered perfectly safe to include the Mach Exception code in the - * standard build, and enable/disable it at runtime. - * - * The following issues exist in the iOS implementation: - * - The msgh_id values required for an exception reply message are not available from the available - * headers and must be hard-coded. This prevents one from safely replying to exception messages, which - * means that it is impossible to (correctly) inform the server that an exception has *not* been - * handled. - * - * Impact: - * This can lead to the process locking up and not dispatching to the host exception handler (eg, Apple's - * crash reporter), depending on the behavior of the kernel exception code. - * - * - The mach_* structure/type variants required by MACH_EXCEPTION_CODES are not publicly defined (on Mac OS X, - * these are provided by mach_exc.defs). This prevents one from forwarding exception messages to an existing - * handler that was registered with a MACH_EXCEPTION_CODES behavior (eg, forwarding is entirely non-functional - * on ARM64 devices). - * - * Impact: - * This can break forwarding to any task exception handler that registers itself with MACH_EXCEPTION_CODES, - * including other handlers registered within the current process, eg, by a managed runtime. This could - * also result in misinterpretation of a Mach exception message, in the case where the message format is - * modified by Apple to be incompatible with the existing 32-bit format. - * - * This is the case with LLDB; it will register a task exception handler with MACH_EXCEPTION_CODES set. Failure - * to correctly forward these exceptions will result in the debugger breaking in interesting ways; for example, - * changes to the set of dyld-loaded images are detected by setting a breakpoint on the dyld image registration - * funtions, and this functionality will break if the exception is not correctly forwarded. - * - * Since Mach exception handling is important for a fully functional crash reporter, we have also filed a radar - * to request that the API be made public: - * Radar: rdar://12939497 RFE: Provide mach_exc.defs for iOS - * - * At the time of this writing, the radar remains open/unresolved. - */ diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashAsyncSignalInfo.h b/Vendor/iOS/PLCrashReporter/include/PLCrashAsyncSignalInfo.h deleted file mode 100644 index 15f12a831b..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashAsyncSignalInfo.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2008-2009 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PLCRASH_ASYNC_SIGNAL_INFO_H -#define PLCRASH_ASYNC_SIGNAL_INFO_H - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @internal - * - * @defgroup plcrash_async_signal_info Signal Information - * @ingroup plcrash_async - * - * Provides mapping of signal number and code to strings. - * - * @{ - */ - -const char *plcrash_async_signal_signame (int signal); -const char *plcrash_async_signal_sigcode (int signal, int si_code); - -/** - * @} plcrash_async_signal_info - */ - -#ifdef __cplusplus -} -#endif - -#endif /* PLCRASH_ASYNC_SIGNAL_INFO_H */ diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashFeatureConfig.h b/Vendor/iOS/PLCrashReporter/include/PLCrashFeatureConfig.h deleted file mode 100644 index 58351108d4..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashFeatureConfig.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2012-2013 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PLCRASH_FEATURE_CONFIG_H -#define PLCRASH_FEATURE_CONFIG_H - -#include - -/** - * @internal - * - * Build-time configuration for PLCrashReporter. - * - * This is used to automatically enable/disable features on a per-platform and per-configuration - * basis; it may also be used by third-party vendors to configure a custom build of PLCrashReporter. - * - * @defgroup build_config Build Configuration - * @ingroup constants - * @{ - */ - -/* - * Defaults - */ - -/* - * For release builds, disable unused unwind implementations on targets that do not use them. For non-release - * builds, we include the unwind implementations to allow testing on a broader range of targets. - */ -#ifdef PLCF_RELEASE_BUILD -# if defined(__arm__) -# ifndef PLCRASH_FEATURE_UNWIND_DWARF -# define PLCRASH_FEATURE_UNWIND_DWARF 0 -# endif -# ifndef PLCRASH_FEATURE_UNWIND_COMPACT -# define PLCRASH_FEATURE_UNWIND_COMPACT 0 -# endif -# endif -#endif - -/* - * Configuration Flags - */ - - -#ifndef PLCRASH_FEATURE_MACH_EXCEPTIONS -/** - * If true, enable Mach exception support. On Mac OS X, the Mach exception implementation is fully supported, - * using publicly available API. On iOS, the APIs required for a complete implementation are not public. However, a - * popular commercial crash reporter is now shipping with support for Mach exceptions, which implies that either - * they've received special dispensation to use private APIs / private structures, they've found another way to do - * it, or they're just using undocumented functionality and hoping for the best. - * - * The exposed surface of undocumented API usage is relatively low, and there has been strong user demand to - * implement Mach exception handling regardless of concerns over API visiblity. Given this, we've enabled - * Mach exception handling by default, and provided both build-time and runtime configuration - * to disable its use. - * - * For more information on the potential issues with enabling mach exception support, @sa @ref mach_exceptions. - */ -#if TARGET_OS_TV -# define PLCRASH_FEATURE_MACH_EXCEPTIONS 0 -#else -# define PLCRASH_FEATURE_MACH_EXCEPTIONS 1 -#endif -#endif - -#ifndef PLCRASH_FEATURE_UNWIND_DWARF -/** If true, enable DWARF unwinding support. */ -# define PLCRASH_FEATURE_UNWIND_DWARF 1 -#endif - - -#ifndef PLCRASH_FEATURE_UNWIND_COMPACT -/** If true, enable compact unwinding support. */ -# define PLCRASH_FEATURE_UNWIND_COMPACT 1 -#endif - -/** - * @} - */ - -#endif /* PLCRASH_FEATURE_CONFIG_H */ diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashMacros.h b/Vendor/iOS/PLCrashReporter/include/PLCrashMacros.h deleted file mode 100644 index 89adaa8d10..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashMacros.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2013 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PLCRASH_CONSTANTS_H -#define PLCRASH_CONSTANTS_H - -#include - -#if defined(__cplusplus) -# define PLCR_EXPORT extern "C" -# define PLCR_C_BEGIN_DECLS extern "C" { -# define PLCR_C_END_DECLS } -#else -# define PLCR_EXPORT extern -# define PLCR_C_BEGIN_DECLS -# define PLCR_C_END_DECLS -#endif - -#if defined(__cplusplus) -# if defined(PLCRASHREPORTER_PREFIX) - /** @internal Define the plcrash namespace, automatically inserting an inline namespace containing the configured PLCRASHREPORTER_PREFIX, if any. */ -# define PLCR_CPP_BEGIN_NS namespace plcrash { inline namespace PLCRASHREPORTER_PREFIX { - - /** @internal Close the definition of the `plcrash` namespace (and the PLCRASHREPORTER_PREFIX inline namespace, if any). */ -# define PLCR_CPP_END_NS }} -# else -# define PLCR_CPP_BEGIN_NS namespace plcrash { -# define PLCR_CPP_END_NS } -# endif -#endif - -#ifdef __clang__ -# define PLCR_PRAGMA_CLANG(_p) _Pragma(_p) -#else -# define PLCR_PRAGMA_CLANG(_p) -#endif - -#ifdef __clang__ -# define PLCR_DEPRECATED __attribute__((deprecated)) -#else -# define PLCR_DEPRECATED -#endif - -#if defined(__clang__) || defined(__GNUC__) -# define PLCR_UNUSED __attribute__((unused)) -#else -# define PLCR_UNUSED -#endif - -#ifdef PLCR_PRIVATE -/** - * Marks a definition as deprecated only for for external clients, allowing - * uses of it internal fo the framework. - */ -# define PLCR_EXTERNAL_DEPRECATED - -/** - * @internal - * A macro to put above a definition marked PLCR_EXTERNAL_DEPRECATED that will - * silence warnings about there being a deprecation documentation marker but the - * definition not being marked deprecated. - */ -# define PLCR_EXTERNAL_DEPRECATED_NOWARN_PUSH() \ - PLCR_PRAGMA_CLANG("clang diagnostic push"); \ - PLCR_PRAGMA_CLANG("clang diagnostic ignored \"-Wdocumentation-deprecated-sync\"") - -/** - * @internal - * A macro to put below a definition marked PLCR_EXTERNAL_DEPRECATED that will - * silence warnings about there being a deprecation documentation marker but the - * definition not being marked deprecated. - */ -# define PLCR_EXTERNAL_DEPRECATED_NOWARN_POP() PLCR_PRAGMA_CLANG("clang diagnostic pop") - -#else - -# define PLCR_EXTERNAL_DEPRECATED PLCR_DEPRECATED -# define PLCR_EXTERNAL_DEPRECATED_NOWARN_PUSH() -# define PLCR_EXTERNAL_DEPRECATED_NOWARN_PUSH() - -#endif /* PLCR_PRIVATE */ - -#ifdef PLCR_PRIVATE -# if defined(__clang__) && __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough") -# define PLCR_FALLTHROUGH [[clang::fallthrough]] -# else -# define PLCR_FALLTHROUGH do {} while (0) -# endif -#endif - -#ifdef PLCR_PRIVATE -/** - * @internal - * Static compile-time assertion. - * - * @param name The assertion name; must be valid for use within a C identifier. - * @param cond Assertion condition - */ -# define PLCR_ASSERT_STATIC(name, cond) PLCR_ASSERT_STATIC_(name, cond, __LINE__) -/* - * C++11 and C11 both provide a static_assert(). - * - * Otherwise, we have to use typedef-based static assertions. - */ -# if (defined(__cplusplus) && __cplusplus >= 201103L) || (!defined(__cplusplus) && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) -# define PLCR_ASSERT_STATIC_(name, cond, line) PLCR_ASSERT_STATIC__(#name, cond) -# define PLCR_ASSERT_STATIC__(name, cond) static_assert(cond, #name) -# else -# define PLCR_ASSERT_STATIC_(name, cond, line) PLCR_ASSERT_STATIC__(name, cond, line) -# define PLCR_ASSERT_STATIC__(name, cond, line) typedef int plcf_static_assert_##name##_##line [(cond) ? 1 : -1] PLCR_UNUSED -# endif -#endif /* PLCR_PRIVATE */ - -#endif /* PLCRASH_CONSTANTS_H */ diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashNamespace.h b/Vendor/iOS/PLCrashReporter/include/PLCrashNamespace.h deleted file mode 100644 index c8a3ad4417..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashNamespace.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2012-2013 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * For external library integrators: - * - * Set this value to any valid C symbol prefix. This will automatically - * prepend the given prefix to all external symbols in the library. - * - * This may be used to avoid symbol conflicts between multiple libraries - * that may both incorporate PLCrashReporter. - */ -#define PLCRASHREPORTER_PREFIX MS - - -// We need two extra layers of indirection to make CPP substitute -// the PLCRASHREPORTER_PREFIX define. -#define PLNS_impl2(prefix, symbol) prefix ## symbol -#define PLNS_impl(prefix, symbol) PLNS_impl2(prefix, symbol) -#define PLNS(symbol) PLNS_impl(PLCRASHREPORTER_PREFIX, symbol) - - -/* - * Rewrite all ObjC/C symbols. - * - * For C++ symbol handling, refer to the PLCR_CPP_BEGIN_NS and PLCR_CPP_END_NS - * macros. - */ -#ifdef PLCRASHREPORTER_PREFIX - -/* Objective-C Classes */ -#define PLCrashMachExceptionServer PLNS(PLCrashMachExceptionServer) -#define PLCrashReport PLNS(PLCrashReport) -#define PLCrashReportApplicationInfo PLNS(PLCrashReportApplicationInfo) -#define PLCrashReportBinaryImageInfo PLNS(PLCrashReportBinaryImageInfo) -#define PLCrashReportExceptionInfo PLNS(PLCrashReportExceptionInfo) -#define PLCrashReportMachExceptionInfo PLNS(PLCrashReportMachExceptionInfo) -#define PLCrashReportMachineInfo PLNS(PLCrashReportMachineInfo) -#define PLCrashReportProcessInfo PLNS(PLCrashReportProcessInfo) -#define PLCrashReportProcessorInfo PLNS(PLCrashReportProcessorInfo) -#define PLCrashReportRegisterInfo PLNS(PLCrashReportRegisterInfo) -#define PLCrashReportSignalInfo PLNS(PLCrashReportSignalInfo) -#define PLCrashReportStackFrameInfo PLNS(PLCrashReportStackFrameInfo) -#define PLCrashReportSymbolInfo PLNS(PLCrashReportSymbolInfo) -#define PLCrashReportSystemInfo PLNS(PLCrashReportSystemInfo) -#define PLCrashReportTextFormatter PLNS(PLCrashReportTextFormatter) -#define PLCrashReportThreadInfo PLNS(PLCrashReportThreadInfo) -#define PLCrashReporter PLNS(PLCrashReporter) -#define PLCrashSignalHandler PLNS(PLCrashSignalHandler) -#define PLCrashHostInfo PLNS(PLCrashHostInfo) -#define PLCrashMachExceptionPort PLNS(PLCrashMachExceptionPort) -#define PLCrashMachExceptionPortSet PLNS(PLCrashMachExceptionPortSet) -#define PLCrashProcessInfo PLNS(PLCrashProcessInfo) -#define PLCrashReporterConfig PLNS(PLCrashReporterConfig) -#define PLCrashUncaughtExceptionHandler PLNS(PLCrashUncaughtExceptionHandler) -#define PLCrashReportFormatter PLNS(PLCrashReportFormatter) - -/* Public C functions */ -#define PLCrashMachExceptionForward PLNS(PLCrashMachExceptionForward) -#define PLCrashSignalHandlerForward PLNS(PLCrashSignalHandlerForward) -#define plcrash_signal_handler PLNS(plcrash_signal_handler) - - -/* Public C global symbols */ -#define PLCrashReporterErrorDomain PLNS(PLCrashReporterErrorDomain) -#define PLCrashReportHostArchitecture PLNS(PLCrashReportHostArchitecture) -#define PLCrashReportHostOperatingSystem PLNS(PLCrashReportHostOperatingSystem) -#define PLCrashReporterException PLNS(PLCrashReporterException) - -/* For backwards compatibility, plcrash_async_byteorder vends C++ methods when included under C++. We have - * to handle this distinctly from our PLCR_CPP_BEGIN_NS C++ namespacing mechanism. */ -#define plcrash_async_byteorder PLNS(plcrash_async_byteorder) - -/* - * All private C symbols. Once these are migrated to C++, we'll be able to use the much simpler - * PLCR_CPP_BEGIN_NS machinery. - * - * This list was automatically generated (and can be updated) by setting PLCRASHREPORTER_PREFIX to 'AcmeCo', - * building the library, and executing the following: - * nm -g -U | grep '^[0-9]' | c++filt | grep -v AcmeCo | grep -E '_pl|_PL' | awk '{print $3}' | cut -c 2- | sort | uniq | awk '{print "#define",$1,"PLNS("$1")"}' - */ -#define pl_mach_thread_self PLNS(pl_mach_thread_self) -#define plcrash__architecture__descriptor PLNS(plcrash__architecture__descriptor) -#define plcrash__architecture__enum_values_by_name PLNS(plcrash__architecture__enum_values_by_name) -#define plcrash__architecture__enum_values_by_number PLNS(plcrash__architecture__enum_values_by_number) -#define plcrash__crash_report__application_info__descriptor PLNS(plcrash__crash_report__application_info__descriptor) -#define plcrash__crash_report__binary_image__descriptor PLNS(plcrash__crash_report__binary_image__descriptor) -#define plcrash__crash_report__descriptor PLNS(plcrash__crash_report__descriptor) -#define plcrash__crash_report__exception__descriptor PLNS(plcrash__crash_report__exception__descriptor) -#define plcrash__crash_report__free_unpacked PLNS(plcrash__crash_report__free_unpacked) -#define plcrash__crash_report__get_packed_size PLNS(plcrash__crash_report__get_packed_size) -#define plcrash__crash_report__init PLNS(plcrash__crash_report__init) -#define plcrash__crash_report__machine_info__descriptor PLNS(plcrash__crash_report__machine_info__descriptor) -#define plcrash__crash_report__pack PLNS(plcrash__crash_report__pack) -#define plcrash__crash_report__pack_to_buffer PLNS(plcrash__crash_report__pack_to_buffer) -#define plcrash__crash_report__process_info__descriptor PLNS(plcrash__crash_report__process_info__descriptor) -#define plcrash__crash_report__processor__descriptor PLNS(plcrash__crash_report__processor__descriptor) -#define plcrash__crash_report__processor__type_encoding__descriptor PLNS(plcrash__crash_report__processor__type_encoding__descriptor) -#define plcrash__crash_report__processor__type_encoding__enum_values_by_name PLNS(plcrash__crash_report__processor__type_encoding__enum_values_by_name) -#define plcrash__crash_report__processor__type_encoding__enum_values_by_number PLNS(plcrash__crash_report__processor__type_encoding__enum_values_by_number) -#define plcrash__crash_report__report_info__descriptor PLNS(plcrash__crash_report__report_info__descriptor) -#define plcrash__crash_report__signal__descriptor PLNS(plcrash__crash_report__signal__descriptor) -#define plcrash__crash_report__signal__mach_exception__descriptor PLNS(plcrash__crash_report__signal__mach_exception__descriptor) -#define plcrash__crash_report__symbol__descriptor PLNS(plcrash__crash_report__symbol__descriptor) -#define plcrash__crash_report__system_info__descriptor PLNS(plcrash__crash_report__system_info__descriptor) -#define plcrash__crash_report__system_info__operating_system__descriptor PLNS(plcrash__crash_report__system_info__operating_system__descriptor) -#define plcrash__crash_report__system_info__operating_system__enum_values_by_name PLNS(plcrash__crash_report__system_info__operating_system__enum_values_by_name) -#define plcrash__crash_report__system_info__operating_system__enum_values_by_number PLNS(plcrash__crash_report__system_info__operating_system__enum_values_by_number) -#define plcrash__crash_report__thread__descriptor PLNS(plcrash__crash_report__thread__descriptor) -#define plcrash__crash_report__thread__register_value__descriptor PLNS(plcrash__crash_report__thread__register_value__descriptor) -#define plcrash__crash_report__thread__stack_frame__descriptor PLNS(plcrash__crash_report__thread__stack_frame__descriptor) -#define plcrash__crash_report__unpack PLNS(plcrash__crash_report__unpack) -#define plcrash_async_address_apply_offset PLNS(plcrash_async_address_apply_offset) -#define plcrash_async_allocator_alloc PLNS(plcrash_async_allocator_alloc) -#define plcrash_async_allocator_new PLNS(plcrash_async_allocator_new) -#define plcrash_async_byteorder_big_endian PLNS(plcrash_async_byteorder_big_endian) -#define plcrash_async_byteorder_direct PLNS(plcrash_async_byteorder_direct) -#define plcrash_async_byteorder_little_endian PLNS(plcrash_async_byteorder_little_endian) -#define plcrash_async_byteorder_swapped PLNS(plcrash_async_byteorder_swapped) -#define plcrash_async_cfe_entry_apply PLNS(plcrash_async_cfe_entry_apply) -#define plcrash_async_cfe_entry_free PLNS(plcrash_async_cfe_entry_free) -#define plcrash_async_cfe_entry_init PLNS(plcrash_async_cfe_entry_init) -#define plcrash_async_cfe_entry_register_count PLNS(plcrash_async_cfe_entry_register_count) -#define plcrash_async_cfe_entry_register_list PLNS(plcrash_async_cfe_entry_register_list) -#define plcrash_async_cfe_entry_return_address_register PLNS(plcrash_async_cfe_entry_return_address_register) -#define plcrash_async_cfe_entry_stack_adjustment PLNS(plcrash_async_cfe_entry_stack_adjustment) -#define plcrash_async_cfe_entry_stack_offset PLNS(plcrash_async_cfe_entry_stack_offset) -#define plcrash_async_cfe_entry_type PLNS(plcrash_async_cfe_entry_type) -#define plcrash_async_cfe_reader_find_pc PLNS(plcrash_async_cfe_reader_find_pc) -#define plcrash_async_cfe_reader_free PLNS(plcrash_async_cfe_reader_free) -#define plcrash_async_cfe_reader_init PLNS(plcrash_async_cfe_reader_init) -#define plcrash_async_cfe_register_decode PLNS(plcrash_async_cfe_register_decode) -#define plcrash_async_cfe_register_encode PLNS(plcrash_async_cfe_register_encode) -#define plcrash_async_file_close PLNS(plcrash_async_file_close) -#define plcrash_async_file_flush PLNS(plcrash_async_file_flush) -#define plcrash_async_file_init PLNS(plcrash_async_file_init) -#define plcrash_async_file_write PLNS(plcrash_async_file_write) -#define plcrash_async_find_symbol PLNS(plcrash_async_find_symbol) -#define plcrash_async_image_containing_address PLNS(plcrash_async_image_containing_address) -#define plcrash_async_image_list_next PLNS(plcrash_async_image_list_next) -#define plcrash_async_image_list_set_reading PLNS(plcrash_async_image_list_set_reading) -#define plcrash_async_mach_exception_get_siginfo PLNS(plcrash_async_mach_exception_get_siginfo) -#define plcrash_async_macho_byteorder PLNS(plcrash_async_macho_byteorder) -#define plcrash_async_macho_contains_address PLNS(plcrash_async_macho_contains_address) -#define plcrash_async_macho_cpu_subtype PLNS(plcrash_async_macho_cpu_subtype) -#define plcrash_async_macho_cpu_type PLNS(plcrash_async_macho_cpu_type) -#define plcrash_async_macho_find_command PLNS(plcrash_async_macho_find_command) -#define plcrash_async_macho_find_segment_cmd PLNS(plcrash_async_macho_find_segment_cmd) -#define plcrash_async_macho_find_symbol_by_name PLNS(plcrash_async_macho_find_symbol_by_name) -#define plcrash_async_macho_find_symbol_by_pc PLNS(plcrash_async_macho_find_symbol_by_pc) -#define plcrash_async_macho_header PLNS(plcrash_async_macho_header) -#define plcrash_async_macho_header_size PLNS(plcrash_async_macho_header_size) -#define plcrash_async_macho_map_section PLNS(plcrash_async_macho_map_section) -#define plcrash_async_macho_map_segment PLNS(plcrash_async_macho_map_segment) -#define plcrash_async_macho_mapped_segment_free PLNS(plcrash_async_macho_mapped_segment_free) -#define plcrash_async_macho_next_command PLNS(plcrash_async_macho_next_command) -#define plcrash_async_macho_next_command_type PLNS(plcrash_async_macho_next_command_type) -#define plcrash_async_macho_string_free PLNS(plcrash_async_macho_string_free) -#define plcrash_async_macho_string_get_length PLNS(plcrash_async_macho_string_get_length) -#define plcrash_async_macho_string_get_pointer PLNS(plcrash_async_macho_string_get_pointer) -#define plcrash_async_macho_string_init PLNS(plcrash_async_macho_string_init) -#define plcrash_async_macho_symtab_reader_free PLNS(plcrash_async_macho_symtab_reader_free) -#define plcrash_async_macho_symtab_reader_init PLNS(plcrash_async_macho_symtab_reader_init) -#define plcrash_async_macho_symtab_reader_read PLNS(plcrash_async_macho_symtab_reader_read) -#define plcrash_async_macho_symtab_reader_symbol_name PLNS(plcrash_async_macho_symtab_reader_symbol_name) -#define plcrash_async_memcpy PLNS(plcrash_async_memcpy) -#define plcrash_async_memset PLNS(plcrash_async_memset) -#define plcrash_async_mobject_base_address PLNS(plcrash_async_mobject_base_address) -#define plcrash_async_mobject_free PLNS(plcrash_async_mobject_free) -#define plcrash_async_mobject_init PLNS(plcrash_async_mobject_init) -#define plcrash_async_mobject_length PLNS(plcrash_async_mobject_length) -#define plcrash_async_mobject_read_uint16 PLNS(plcrash_async_mobject_read_uint16) -#define plcrash_async_mobject_read_uint32 PLNS(plcrash_async_mobject_read_uint32) -#define plcrash_async_mobject_read_uint64 PLNS(plcrash_async_mobject_read_uint64) -#define plcrash_async_mobject_read_uint8 PLNS(plcrash_async_mobject_read_uint8) -#define plcrash_async_mobject_remap_address PLNS(plcrash_async_mobject_remap_address) -#define plcrash_async_mobject_task PLNS(plcrash_async_mobject_task) -#define plcrash_async_mobject_verify_local_pointer PLNS(plcrash_async_mobject_verify_local_pointer) -#define plcrash_async_objc_cache_free PLNS(plcrash_async_objc_cache_free) -#define plcrash_async_objc_cache_init PLNS(plcrash_async_objc_cache_init) -#define plcrash_async_objc_find_method PLNS(plcrash_async_objc_find_method) -#define plcrash_async_objc_isa_pointer PLNS(plcrash_async_objc_isa_pointer) -#define plcrash_async_read_addr PLNS(plcrash_async_read_addr) -#define plcrash_async_signal_sigcode PLNS(plcrash_async_signal_sigcode) -#define plcrash_async_signal_signame PLNS(plcrash_async_signal_signame) -#define plcrash_async_strcmp PLNS(plcrash_async_strcmp) -#define plcrash_async_strerror PLNS(plcrash_async_strerror) -#define plcrash_async_strncmp PLNS(plcrash_async_strncmp) -#define plcrash_async_symbol_cache_free PLNS(plcrash_async_symbol_cache_free) -#define plcrash_async_symbol_cache_init PLNS(plcrash_async_symbol_cache_init) -#define plcrash_async_task_memcpy PLNS(plcrash_async_task_memcpy) -#define plcrash_async_task_read_uint16 PLNS(plcrash_async_task_read_uint16) -#define plcrash_async_task_read_uint32 PLNS(plcrash_async_task_read_uint32) -#define plcrash_async_task_read_uint64 PLNS(plcrash_async_task_read_uint64) -#define plcrash_async_task_read_uint8 PLNS(plcrash_async_task_read_uint8) -#define plcrash_async_thread_state_clear_all_regs PLNS(plcrash_async_thread_state_clear_all_regs) -#define plcrash_async_thread_state_clear_reg PLNS(plcrash_async_thread_state_clear_reg) -#define plcrash_async_thread_state_clear_volatile_regs PLNS(plcrash_async_thread_state_clear_volatile_regs) -#define plcrash_async_thread_state_copy PLNS(plcrash_async_thread_state_copy) -#define plcrash_async_thread_state_current PLNS(plcrash_async_thread_state_current) -#define plcrash_async_thread_state_current_stub PLNS(plcrash_async_thread_state_current_stub) -#define plcrash_async_thread_state_get_greg_size PLNS(plcrash_async_thread_state_get_greg_size) -#define plcrash_async_thread_state_get_reg PLNS(plcrash_async_thread_state_get_reg) -#define plcrash_async_thread_state_get_reg_count PLNS(plcrash_async_thread_state_get_reg_count) -#define plcrash_async_thread_state_get_reg_name PLNS(plcrash_async_thread_state_get_reg_name) -#define plcrash_async_thread_state_get_stack_direction PLNS(plcrash_async_thread_state_get_stack_direction) -#define plcrash_async_thread_state_has_reg PLNS(plcrash_async_thread_state_has_reg) -#define plcrash_async_thread_state_init PLNS(plcrash_async_thread_state_init) -#define plcrash_async_thread_state_mach_thread_init PLNS(plcrash_async_thread_state_mach_thread_init) -#define plcrash_async_thread_state_map_dwarf_to_reg PLNS(plcrash_async_thread_state_map_dwarf_to_reg) -#define plcrash_async_thread_state_map_reg_to_dwarf PLNS(plcrash_async_thread_state_map_reg_to_dwarf) -#define plcrash_async_thread_state_mcontext_init PLNS(plcrash_async_thread_state_mcontext_init) -#define plcrash_async_thread_state_set_reg PLNS(plcrash_async_thread_state_set_reg) -#define plcrash_async_writen PLNS(plcrash_async_writen) -#define plcrash_log_writer_close PLNS(plcrash_log_writer_close) -#define plcrash_log_writer_free PLNS(plcrash_log_writer_free) -#define plcrash_log_writer_init PLNS(plcrash_log_writer_init) -#define plcrash_log_writer_set_exception PLNS(plcrash_log_writer_set_exception) -#define plcrash_log_writer_write PLNS(plcrash_log_writer_write) -#define plcrash_nasync_image_list_append PLNS(plcrash_nasync_image_list_append) -#define plcrash_nasync_image_list_free PLNS(plcrash_nasync_image_list_free) -#define plcrash_nasync_image_list_init PLNS(plcrash_nasync_image_list_init) -#define plcrash_nasync_image_list_remove PLNS(plcrash_nasync_image_list_remove) -#define plcrash_nasync_macho_free PLNS(plcrash_nasync_macho_free) -#define plcrash_nasync_macho_init PLNS(plcrash_nasync_macho_init) -#define plcrash_populate_error PLNS(plcrash_populate_error) -#define plcrash_populate_mach_error PLNS(plcrash_populate_mach_error) -#define plcrash_populate_posix_error PLNS(plcrash_populate_posix_error) -#define plcrash_sysctl_int PLNS(plcrash_sysctl_int) -#define plcrash_sysctl_string PLNS(plcrash_sysctl_string) -#define plcrash_sysctl_valid_utf8_bytes PLNS(plcrash_sysctl_valid_utf8_bytes) -#define plcrash_sysctl_valid_utf8_bytes_max PLNS(plcrash_sysctl_valid_utf8_bytes_max) -#define plcrash_writer_pack PLNS(plcrash_writer_pack) -#define plframe_cursor_free PLNS(plframe_cursor_free) -#define plframe_cursor_get_reg PLNS(plframe_cursor_get_reg) -#define plframe_cursor_get_regcount PLNS(plframe_cursor_get_regcount) -#define plframe_cursor_get_regname PLNS(plframe_cursor_get_regname) -#define plframe_cursor_init PLNS(plframe_cursor_init) -#define plframe_cursor_next PLNS(plframe_cursor_next) -#define plframe_cursor_next_with_readers PLNS(plframe_cursor_next_with_readers) -#define plframe_cursor_read_compact_unwind PLNS(plframe_cursor_read_compact_unwind) -#define plframe_cursor_read_dwarf_unwind PLNS(plframe_cursor_read_dwarf_unwind) -#define plframe_cursor_read_frame_ptr PLNS(plframe_cursor_read_frame_ptr) -#define plframe_cursor_thread_init PLNS(plframe_cursor_thread_init) -#define plframe_strerror PLNS(plframe_strerror) -#define plframe_test_thread_spawn PLNS(plframe_test_thread_spawn) -#define plframe_test_thread_stop PLNS(plframe_test_thread_stop) - -#endif - -/* - * The following symbols are exported by the protobuf-c library. When building - * a shared library, we can hide these as private symbols. - * - * However, when building a static library, we can only do so if we use - * MH_OBJECT "single object prelink". The MH_OBJECT approach allows us to apply - * symbol hiding/aliasing/etc similar to that supported by dylibs, but because it is - * seemingly unused within Apple, the use thereof regularly introduces linking bugs - * and errors in new Xcode releases. - * - * Rather than fighting the linker, we use the namespacing machinery to rewrite these - * symbols, but only when explicitly compiling PLCrashReporter. Since protobuf-c is a library - * that may be used elsewhere, we don't want to rewrite these symbols if they're used - * independently by PLCrashReporter API clients. - */ -#ifdef PLCR_PRIVATE - /* If no prefix has been defined, we need to specify our own private prefix */ -# ifndef PLCRASHREPORTER_PREFIX -# define PLCRASHREPORTER_PREFIX PL_ -# endif - -# define protobuf_c_buffer_simple_append PLNS(protobuf_c_buffer_simple_append) -# define protobuf_c_default_allocator PLNS(protobuf_c_default_allocator) -# define protobuf_c_enum_descriptor_get_value PLNS(protobuf_c_enum_descriptor_get_value) -# define protobuf_c_enum_descriptor_get_value_by_name PLNS(protobuf_c_enum_descriptor_get_value_by_name) -# define protobuf_c_message_descriptor_get_field PLNS(protobuf_c_message_descriptor_get_field) -# define protobuf_c_message_descriptor_get_field_by_name PLNS(protobuf_c_message_descriptor_get_field_by_name) -# define protobuf_c_message_free_unpacked PLNS(protobuf_c_message_free_unpacked) -# define protobuf_c_message_get_packed_size PLNS(protobuf_c_message_get_packed_size) -# define protobuf_c_message_pack PLNS(protobuf_c_message_pack) -# define protobuf_c_message_pack_to_buffer PLNS(protobuf_c_message_pack_to_buffer) -# define protobuf_c_message_unpack PLNS(protobuf_c_message_unpack) -# define protobuf_c_out_of_memory PLNS(protobuf_c_out_of_memory) -# define protobuf_c_service_descriptor_get_method_by_name PLNS(protobuf_c_service_descriptor_get_method_by_name) -# define protobuf_c_service_destroy PLNS(protobuf_c_service_destroy) -# define protobuf_c_service_generated_init PLNS(protobuf_c_service_generated_init) -#endif /* PLCR_PRIVATE */ diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReport.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReport.h deleted file mode 100644 index a179cd6909..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReport.h +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2008-2013 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -#import "PLCrashReportApplicationInfo.h" -#import "PLCrashReportBinaryImageInfo.h" -#import "PLCrashReportExceptionInfo.h" -#import "PLCrashReportMachineInfo.h" -#import "PLCrashReportMachExceptionInfo.h" -#import "PLCrashReportProcessInfo.h" -#import "PLCrashReportProcessorInfo.h" -#import "PLCrashReportRegisterInfo.h" -#import "PLCrashReportSignalInfo.h" -#import "PLCrashReportStackFrameInfo.h" -#import "PLCrashReportSymbolInfo.h" -#import "PLCrashReportSystemInfo.h" -#import "PLCrashReportThreadInfo.h" - -/** - * @ingroup constants - * Crash file magic identifier */ -#define PLCRASH_REPORT_FILE_MAGIC "plcrash" - -/** - * @ingroup constants - * Crash format version byte identifier. Will not change outside of the introduction of - * an entirely new crash log format. */ -#define PLCRASH_REPORT_FILE_VERSION 1 - -/** - * @ingroup types - * Crash log file header format. - * - * Crash log files start with 7 byte magic identifier (#PLCRASH_REPORT_FILE_MAGIC), - * followed by a single unsigned byte version number (#PLCRASH_REPORT_FILE_VERSION). - * The crash log message format itself is extensible, so this version number will only - * be incremented in the event of an incompatible encoding or format change. - */ -struct PLCrashReportFileHeader { - /** Crash log magic identifier, not NULL terminated */ - const char magic[7]; - - /** Crash log encoding/format version */ - const uint8_t version; - - /** File data */ - const uint8_t data[]; -} __attribute__((packed)); - - -/** - * @internal - * Private decoder instance variables (used to hide the underlying protobuf parser). - */ -typedef struct _PLCrashReportDecoder _PLCrashReportDecoder; - -@interface PLCrashReport : NSObject { -@private - /** Private implementation variables (used to hide the underlying protobuf parser) */ - _PLCrashReportDecoder *_decoder; - - /** System info */ - PLCrashReportSystemInfo *_systemInfo; - - /** Machine info */ - PLCrashReportMachineInfo *_machineInfo; - - /** Application info */ - PLCrashReportApplicationInfo *_applicationInfo; - - /** Process info */ - PLCrashReportProcessInfo *_processInfo; - - /** Signal info */ - PLCrashReportSignalInfo *_signalInfo; - - /** Mach exception info */ - PLCrashReportMachExceptionInfo *_machExceptionInfo; - - /** Thread info (PLCrashReportThreadInfo instances) */ - NSArray *_threads; - - /** Binary images (PLCrashReportBinaryImageInfo instances */ - NSArray *_images; - - /** Exception information (may be nil) */ - PLCrashReportExceptionInfo *_exceptionInfo; - - /** Report UUID */ - CFUUIDRef _uuid; -} - -- (id) initWithData: (NSData *) encodedData error: (NSError **) outError; - -- (PLCrashReportBinaryImageInfo *) imageForAddress: (uint64_t) address; - -/** - * System information. - */ -@property(nonatomic, readonly) PLCrashReportSystemInfo *systemInfo; - -/** - * YES if machine information is available. - */ -@property(nonatomic, readonly) BOOL hasMachineInfo; - -/** - * Machine information. Only available in later (v1.1+) crash report format versions. If not available, - * will be nil. - */ -@property(nonatomic, readonly) PLCrashReportMachineInfo *machineInfo; - -/** - * Application information. - */ -@property(nonatomic, readonly) PLCrashReportApplicationInfo *applicationInfo; - -/** - * YES if process information is available. - */ -@property(nonatomic, readonly) BOOL hasProcessInfo; - -/** - * Process information. Only available in later (v1.1+) crash report format versions. If not available, - * will be nil. - */ -@property(nonatomic, readonly) PLCrashReportProcessInfo *processInfo; - -/** - * Signal information. This provides the signal and signal code of the fatal signal. - */ -@property(nonatomic, readonly) PLCrashReportSignalInfo *signalInfo; - -/** - * Mach exception information, if available. This will only be included in the - * case that encoding crash reporter's exception-based reporting was enabled, and a Mach - * exception was caught. - * - * @warning If Mach exception information is available, the legacy signalInfo property will also be provided; this - * s required to maintain backwards compatibility with the established API. Note, however, that the signal info may be derived from the - * Mach exception info by the encoding crash reporter, and thus may not exactly match the kernel exception-to-signal - * mappings implemented in xnu. As such, when Mach exception info is available, its use should be preferred. - */ -@property(nonatomic, readonly) PLCrashReportMachExceptionInfo *machExceptionInfo; - -/** - * Thread information. Returns a list of PLCrashReportThreadInfo instances. - */ -@property(nonatomic, readonly) NSArray *threads; - -/** - * Binary image information. Returns a list of PLCrashReportBinaryImageInfo instances. - */ -@property(nonatomic, readonly) NSArray *images; - -/** - * YES if exception information is available. - */ -@property(nonatomic, readonly) BOOL hasExceptionInfo; - -/** - * Exception information. Only available if a crash was caused by an uncaught exception, - * otherwise nil. - */ -@property(nonatomic, readonly) PLCrashReportExceptionInfo *exceptionInfo; - -/** - * A client-generated 16-byte UUID. May be used to filter duplicate reports submitted or generated - * by a single client. Only available in later (v1.2+) crash report format versions. If not available, - * will be NULL. - */ -@property(nonatomic, readonly) CFUUIDRef uuidRef; - -@end diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReportApplicationInfo.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReportApplicationInfo.h deleted file mode 100644 index 47a8706827..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReportApplicationInfo.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2008-2009 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -@interface PLCrashReportApplicationInfo : NSObject { -@private - /** Application identifier */ - NSString *_applicationIdentifier; - - /** Application version */ - NSString *_applicationVersion; - - /** Application marketing version */ - NSString *_applicationMarketingVersion; -} - -- (id) initWithApplicationIdentifier: (NSString *) applicationIdentifier - applicationVersion: (NSString *) applicationVersion - applicationMarketingVersion: (NSString *) applicationMarketingVersion; - -/** - * The application identifier. This is usually the application's CFBundleIdentifier value. - */ -@property(nonatomic, readonly) NSString *applicationIdentifier; - -/** - * The application version. This is usually the application's CFBundleVersion value. - */ -@property(nonatomic, readonly) NSString *applicationVersion; - -/** - * The application marketing version. This is usually the application's CFBundleShortVersionString value if available. May be nil. - */ -@property(nonatomic, readonly) NSString *applicationMarketingVersion; - -@end diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReportBinaryImageInfo.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReportBinaryImageInfo.h deleted file mode 100644 index 339fdbb08f..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReportBinaryImageInfo.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2008-2009 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import -#import "PLCrashReportProcessorInfo.h" - -@interface PLCrashReportBinaryImageInfo : NSObject { -@private - /** Code type */ - PLCrashReportProcessorInfo *_processorInfo; - - /** Base image address */ - uint64_t _baseAddress; - - /** Image segment size */ - uint64_t _imageSize; - - /** Name of binary image */ - NSString *_imageName; - - /** If the UUID is available */ - BOOL _hasImageUUID; - - /** 128-bit object UUID. May be nil. */ - NSString *_imageUUID; -} - -- (id) initWithCodeType: (PLCrashReportProcessorInfo *) processorInfo - baseAddress: (uint64_t) baseAddress - size: (uint64_t) imageSize - name: (NSString *) imageName - uuid: (NSData *) uuid; - -/** - * Image code type, or nil if unavailable. - */ -@property(nonatomic, readonly) PLCrashReportProcessorInfo *codeType; - -/** - * Image base address. - */ -@property(nonatomic, readonly) uint64_t imageBaseAddress; - -/** - * Segment size. - */ -@property(nonatomic, readonly) uint64_t imageSize; - -/** - * Image name (absolute path) - */ -@property(nonatomic, readonly) NSString *imageName; - - -/** - * YES if this image has an associated UUID. - */ -@property(nonatomic, readonly) BOOL hasImageUUID; - -/** - * 128-bit object UUID (matches Mach-O DWARF dSYM files). May be nil if unavailable. - */ -@property(nonatomic, readonly) NSString *imageUUID; - -@end diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReportExceptionInfo.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReportExceptionInfo.h deleted file mode 100644 index 623b1d4e15..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReportExceptionInfo.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2008-2009 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import -#import "PLCrashReportThreadInfo.h" - - -@interface PLCrashReportExceptionInfo : NSObject { -@private - /** Name */ - NSString *_name; - - /** Reason */ - NSString *_reason; - - /** Ordered list of PLCrashReportStackFrame instances, or nil if unavailable. */ - NSArray *_stackFrames; -} - -- (id) initWithExceptionName: (NSString *) name reason: (NSString *) reason; - -- (id) initWithExceptionName: (NSString *) name - reason: (NSString *) reason - stackFrames: (NSArray *) stackFrames; - -/** - * The exception name. - */ -@property(nonatomic, readonly) NSString *exceptionName; - -/** - * The exception reason. - */ -@property(nonatomic, readonly) NSString *exceptionReason; - -/* The exception's original call stack, as an array of PLCrashReportStackFrameInfo instances, or nil if unavailable. - * This may be preserved across rethrow of an exception, and can be used to determine the original call stack. */ -@property(nonatomic, readonly) NSArray *stackFrames; - -@end diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReportFormatter.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReportFormatter.h deleted file mode 100644 index 77c2029fd0..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReportFormatter.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2008-2013 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -#import "PLCrashReport.h" - -/** - * A crash report formatter accepts a PLCrashReport instance, formats it according to implementation-specified rules, - * (such as implementing text output support), and returns the result. - */ -@protocol PLCrashReportFormatter - -/** - * Format the provided @a report. - * - * @param report Report to be formatted. - * @param outError A pointer to an NSError object variable. If an error occurs, this pointer will contain an error - * object indicating why the pending crash report could not be formatted. If no error occurs, this parameter will - * be left unmodified. You may specify nil for this parameter, and no error information will be provided. - * - * @return Returns the formatted report data on success, or nil on failure. - */ -- (NSData *) formatReport: (PLCrashReport *) report error: (NSError **) outError; - -@end diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReportMachExceptionInfo.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReportMachExceptionInfo.h deleted file mode 100644 index a9d7f7c245..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReportMachExceptionInfo.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2013 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -@interface PLCrashReportMachExceptionInfo : NSObject { -@private - /** The Mach exception type. */ - uint64_t _type; - - /** The Mach exception codes, represented as an ordered array of NSNumber instances. */ - NSArray *_codes; -} - -- (id) initWithType: (uint64_t) type codes: (NSArray *) codes; - -/** The Mach exception type. */ -@property(nonatomic, readonly) uint64_t type; - -/** The Mach exception codes, represented as an ordered array of 64-bit unsigned NSNumber instances. */ -@property(nonatomic, readonly) NSArray *codes; - -@end diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReportMachineInfo.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReportMachineInfo.h deleted file mode 100644 index 4d0597c1df..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReportMachineInfo.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2008-2013 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -#import "PLCrashReportProcessorInfo.h" - -@interface PLCrashReportMachineInfo : NSObject { -@private - /** The hardware model name (eg, MacBookPro6,1). This may be unavailable, and this property will be nil. */ - NSString *_modelName; - - /** The processor type. */ - PLCrashReportProcessorInfo *_processorInfo; - - /* The number of actual physical processor cores. */ - NSUInteger _processorCount; - - /* The number of logical processors. */ - NSUInteger _logicalProcessorCount; -} - -- (id) initWithModelName: (NSString *) modelName - processorInfo: (PLCrashReportProcessorInfo *) processorInfo - processorCount: (NSUInteger) processorCount - logicalProcessorCount: (NSUInteger) logicalProcessorCount; - -/** The hardware model name (eg, MacBookPro6,1). This may be unavailable, and this property will be nil. */ -@property(nonatomic, readonly) NSString *modelName; - -/** The processor type. This will be unavailable in reports generated prior to PLCrashReporter 1.2, in which case this property will be nil. */ -@property(nonatomic, readonly) PLCrashReportProcessorInfo *processorInfo; - -/* - * The number of actual physical processor cores. Note that the number of active processors may be managed by the - * operating system's power management system, and this value may not reflect the number of active - * processors at the time of the crash. - */ -@property(nonatomic, readonly) NSUInteger processorCount; - -/* - * The number of logical processors. Note that the number of active processors may be managed by the - * operating system's power management system, and this value may not reflect the number of active - * processors at the time of the crash. - */ -@property(nonatomic, readonly) NSUInteger logicalProcessorCount; - -@end diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReportProcessInfo.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReportProcessInfo.h deleted file mode 100644 index ca683d50da..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReportProcessInfo.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Author: Damian Morris - * - * Copyright (c) 2010 MOSO Corporation, Pty Ltd. - * Copyright (c) 2010-2013 Plausible Labs Cooperative, Inc. - * - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -@interface PLCrashReportProcessInfo : NSObject { -@private - /** Process name, or nil if unavailable. */ - NSString *_processName; - - /** Process ID */ - NSUInteger _processID; - - /** Process path */ - NSString* _processPath; - - /** Date and time that the crashing process was started. This may be unavailable, and this property - * will be nil. */ - NSDate *_processStartTime; - - /** Parent process name, or nil if unavailable. */ - NSString *_parentProcessName; - - /** Parent process ID */ - NSUInteger _parentProcessID; - - /** If false, the process is being run via process-level CPU emulation (such as Rosetta). */ - BOOL _native; -} - -- (id) initWithProcessName: (NSString *) processName - processID: (NSUInteger) processID - processPath: (NSString *) processPath - processStartTime: (NSDate *) processStartTime - parentProcessName: (NSString *) parentProcessName - parentProcessID: (NSUInteger) parentProcessID - native: (BOOL) native; - -/** - * The process name. This value may not be included in the crash report, in which case this property - * will be nil. - */ -@property(nonatomic, readonly) NSString *processName; - -/** - * The process ID. - */ -@property(nonatomic, readonly) NSUInteger processID; - -/** - * The path to the process executable. This value may not be included in the crash report, in which case this property - * will be nil. - */ -@property(nonatomic, readonly) NSString *processPath; - -/** - * Date and time that the crashing process was started. This value may not be included in the crash report, in which case this property - * will be nil. - */ -@property(nonatomic, readonly) NSDate *processStartTime; - -/** - * The parent process name. This value may not be included in the crash report, in which case this property - * will be nil. - */ -@property(nonatomic, readonly) NSString *parentProcessName; - -/** - * The parent process ID. - */ -@property(nonatomic, readonly) NSUInteger parentProcessID; - -/** The process' native execution status. If false, the process is being run via process-level CPU emulation (such as Rosetta). */ -@property(nonatomic, readonly) BOOL native; - -@end diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReportProcessorInfo.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReportProcessorInfo.h deleted file mode 100644 index 03d570bd4c..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReportProcessorInfo.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2008-2013 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import -#import - -/** - * @ingroup constants - * - * The type encodings supported for CPU types and subtypes. Currently only Apple - * Mach-O defined encodings are supported. - * - * @internal - * These enum values match the protobuf values. Keep them synchronized. - */ -typedef enum { - /** Unknown cpu type encoding. */ - PLCrashReportProcessorTypeEncodingUnknown = 0, - - /** Apple Mach-defined processor types. */ - PLCrashReportProcessorTypeEncodingMach = 1 -} PLCrashReportProcessorTypeEncoding; - -@interface PLCrashReportProcessorInfo : NSObject { -@private - /** Type encoding */ - PLCrashReportProcessorTypeEncoding _typeEncoding; - - /** CPU type */ - uint64_t _type; - - /** CPU subtype */ - uint64_t _subtype; -} - -- (id) initWithTypeEncoding: (PLCrashReportProcessorTypeEncoding) typeEncoding - type: (uint64_t) type - subtype: (uint64_t) subtype; - -/** The CPU type encoding. */ -@property(nonatomic, readonly) PLCrashReportProcessorTypeEncoding typeEncoding; - -/** The CPU type. */ -@property(nonatomic, readonly) uint64_t type; - -/** The CPU subtype. */ -@property(nonatomic, readonly) uint64_t subtype; - -@end diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReportRegisterInfo.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReportRegisterInfo.h deleted file mode 100644 index 20b618d747..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReportRegisterInfo.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2008-2013 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -@interface PLCrashReportRegisterInfo : NSObject { -@private - /** Register name */ - NSString *_registerName; - - /** Register value */ - uint64_t _registerValue; -} - -- (id) initWithRegisterName: (NSString *) registerName registerValue: (uint64_t) registerValue; - -/** - * Register name. - */ -@property(nonatomic, readonly) NSString *registerName; - -/** - * Register value. - */ -@property(nonatomic, readonly) uint64_t registerValue; - -@end diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReportSignalInfo.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReportSignalInfo.h deleted file mode 100644 index 2c5c5fe23d..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReportSignalInfo.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2008-2009 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -@interface PLCrashReportSignalInfo : NSObject { -@private - /** Signal name */ - NSString *_name; - - /** Signal code */ - NSString *_code; - - /** Fauling instruction or address */ - uint64_t _address; -} - -- (id) initWithSignalName: (NSString *) name code: (NSString *) code address: (uint64_t) address; - -/** - * The signal name. - */ -@property(nonatomic, readonly) NSString *name; - -/** - * The signal code. - */ -@property(nonatomic, readonly) NSString *code; - -/** - * The faulting instruction or address. - */ -@property(nonatomic, readonly) uint64_t address; - -@end diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReportStackFrameInfo.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReportStackFrameInfo.h deleted file mode 100644 index 997e762650..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReportStackFrameInfo.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2008-2013 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import -#import "PLCrashReportSymbolInfo.h" - -@interface PLCrashReportStackFrameInfo : NSObject { -@private - /** Frame instruction pointer. */ - uint64_t _instructionPointer; - - /** Symbol information, if available. Otherwise, will be nil. */ - PLCrashReportSymbolInfo *_symbolInfo; -} - -- (id) initWithInstructionPointer: (uint64_t) instructionPointer symbolInfo: (PLCrashReportSymbolInfo *) symbolInfo; - -/** - * Frame's instruction pointer. - */ -@property(nonatomic, readonly) uint64_t instructionPointer; - -/** Symbol information for this frame. - * This may be unavailable, and this property will be nil. */ -@property(nonatomic, readonly) PLCrashReportSymbolInfo *symbolInfo; - -@end diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReportSymbolInfo.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReportSymbolInfo.h deleted file mode 100644 index c6ceb6c109..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReportSymbolInfo.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2012-2013 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -@interface PLCrashReportSymbolInfo : NSObject { -@private - /** The symbol name. */ - NSString *_symbolName; - - /** The symbol start address. */ - uint64_t _startAddress; - - /** The symbol end address, if explicitly defined. Will be 0 if unknown. */ - uint64_t _endAddress; -} - -- (id) initWithSymbolName: (NSString *) symbolName - startAddress: (uint64_t) startAddress - endAddress: (uint64_t) endAddress; - -/** The symbol name. */ -@property(nonatomic, readonly) NSString *symbolName; - -/** The symbol start address. */ -@property(nonatomic, readonly) uint64_t startAddress; - -/* The symbol end address, if explicitly defined. This will only be included if the end address is - * explicitly defined (eg, by DWARF debugging information), will not be derived by best-guess - * heuristics. - * - * If unknown, the address will be 0. - */ -@property(nonatomic, readonly) uint64_t endAddress; - -@end diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReportSystemInfo.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReportSystemInfo.h deleted file mode 100644 index 539ad1c4a9..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReportSystemInfo.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2008-2009 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import -#include "PLCrashMacros.h" -@class PLCrashReportProcessorInfo; - -/** - * @ingroup constants - * - * Indicates the Operating System under which a Crash Log was generated. - * - * @internal - * These enum values match the protobuf values. Keep them synchronized. - */ -typedef enum { - /** Mac OS X. */ - PLCrashReportOperatingSystemMacOSX = 0, - - /** iPhone OS */ - PLCrashReportOperatingSystemiPhoneOS = 1, - - /** iPhone Simulator (Mac OS X with additional simulator-specific runtime libraries) */ - PLCrashReportOperatingSystemiPhoneSimulator = 2, - - /** Unknown operating system */ - PLCrashReportOperatingSystemUnknown = 3, - - /** Apple tvOS */ - PLCrashReportOperatingSystemAppleTVOS = 4, - -} PLCrashReportOperatingSystem; - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdocumentation-deprecated-sync" -/** - * @ingroup constants - * - * Indicates the architecture under which a Crash Log was generated. - * - * @note The architecture value has been deprecated in v1.1 and later crash reports. All new reports - * will make use of the new PLCrashReportProcessorInfo CPU type encodings. - * - * @internal - * These enum values match the protobuf values. Keep them synchronized. - */ -typedef enum { - /** x86-32. */ - PLCrashReportArchitectureX86_32 = 0, - - /** x86-64 */ - PLCrashReportArchitectureX86_64 = 1, - - /** ARMv6 */ - PLCrashReportArchitectureARMv6 = 2, - - /** - * ARMv6 - * @deprecated This value has been deprecated in favor of ARM subtype-specific - * values. - * @sa PLCrashReportArchitectureARMv6 - */ - PLCrashReportArchitectureARM PLCR_DEPRECATED = PLCrashReportArchitectureARMv6, - - /** PPC */ - PLCrashReportArchitecturePPC = 3, - - /** PPC64 */ - PLCrashReportArchitecturePPC64 = 4, - - /** ARMv7 */ - PLCrashReportArchitectureARMv7 = 5, - - /** Unknown */ - PLCrashReportArchitectureUnknown = 6 -} PLCrashReportArchitecture; -#pragma clang diagnostic pop - -extern PLCrashReportOperatingSystem PLCrashReportHostOperatingSystem; -PLCR_EXTERNAL_DEPRECATED_NOWARN_PUSH(); -extern PLCrashReportArchitecture PLCrashReportHostArchitecture PLCR_EXTERNAL_DEPRECATED; -PLCR_EXTERNAL_DEPRECATED_NOWARN_PUSH(); - -@interface PLCrashReportSystemInfo : NSObject { -@private - /** Operating system */ - PLCrashReportOperatingSystem _operatingSystem; - - /** Operating system version */ - NSString *_osVersion; - - /** OS build. May be nil. */ - NSString *_osBuild; - - /** Architecture */ - PLCrashReportArchitecture _architecture; - - /** Date crash report was generated. May be nil if the date is unknown. */ - NSDate *_timestamp; - - /** Processor information. */ - PLCrashReportProcessorInfo *_processorInfo; -} - -- (id) initWithOperatingSystem: (PLCrashReportOperatingSystem) operatingSystem - operatingSystemVersion: (NSString *) operatingSystemVersion - architecture: (PLCrashReportArchitecture) architecture - timestamp: (NSDate *) timestamp PLCR_DEPRECATED; - -- (id) initWithOperatingSystem: (PLCrashReportOperatingSystem) operatingSystem - operatingSystemVersion: (NSString *) operatingSystemVersion - operatingSystemBuild: (NSString *) operatingSystemBuild - architecture: (PLCrashReportArchitecture) architecture - timestamp: (NSDate *) timestamp PLCR_DEPRECATED; - -- (id) initWithOperatingSystem: (PLCrashReportOperatingSystem) operatingSystem - operatingSystemVersion: (NSString *) operatingSystemVersion - operatingSystemBuild: (NSString *) operatingSystemBuild - architecture: (PLCrashReportArchitecture) architecture - processorInfo: (PLCrashReportProcessorInfo *) processorInfo - timestamp: (NSDate *) timestamp; - -/** The operating system. */ -@property(nonatomic, readonly) PLCrashReportOperatingSystem operatingSystem; - -/** The operating system's release version. */ -@property(nonatomic, readonly) NSString *operatingSystemVersion; - -/** The operating system's build identifier (eg, 10J869). This may be unavailable, and this property will be nil. */ -@property(nonatomic, readonly) NSString *operatingSystemBuild; - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdocumentation-deprecated-sync" -/** Architecture. @deprecated The architecture value has been deprecated in v1.1 and later crash reports. All new reports - * include the CPU type as part of the crash report's machine info structure, using the PLCrashReportProcessorInfo - * extensible encoding. */ -@property(nonatomic, readonly) PLCrashReportArchitecture architecture PLCR_DEPRECATED; - -/** Date and time that the crash report was generated. This may be unavailable, and this property will be nil. */ -@property(nonatomic, readonly) NSDate *timestamp; - -/** The processor type. For v1.2 reports and later, this is an alias to the machine info's processorInfo. - * For earlier reports, this will be synthesized from the deprecated architecture property. */ -@property(nonatomic, readonly) PLCrashReportProcessorInfo *processorInfo; - -@end diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReportTextFormatter.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReportTextFormatter.h deleted file mode 100644 index 2ba7e3503e..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReportTextFormatter.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Authors: - * Landon Fuller - * Damian Morris - * - * Copyright (c) 2008-2013 Plausible Labs Cooperative, Inc. - * Copyright (c) 2010 MOSO Corporation, Pty Ltd. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - -#import - -#import "PLCrashReportFormatter.h" - -/** - * Supported text output formats. - * - * @ingroup enums - */ -typedef enum { - /** An iOS-compatible crash log text format. Compatible with the crash logs generated by the device and available - * through iTunes Connect. */ - PLCrashReportTextFormatiOS = 0 -} PLCrashReportTextFormat; - - -@interface PLCrashReportTextFormatter : NSObject { -@private - /** Text output format. */ - PLCrashReportTextFormat _textFormat; - - /** Encoding to use for string output. */ - NSStringEncoding _stringEncoding; -} - -+ (NSString *) stringValueForCrashReport: (PLCrashReport *) report withTextFormat: (PLCrashReportTextFormat) textFormat; - -- (id) initWithTextFormat: (PLCrashReportTextFormat) textFormat stringEncoding: (NSStringEncoding) stringEncoding; - -@end diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReportThreadInfo.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReportThreadInfo.h deleted file mode 100644 index 04c8604454..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReportThreadInfo.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2008-2009 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -#import "PLCrashReportStackFrameInfo.h" -#import "PLCrashReportRegisterInfo.h" - -@interface PLCrashReportThreadInfo : NSObject { -@private - /** The thread number. Should be unique within a given crash log. */ - NSInteger _threadNumber; - - /** Ordered list of PLCrashReportStackFrame instances */ - NSArray *_stackFrames; - - /** YES if this thread crashed. */ - BOOL _crashed; - - /** List of PLCrashReportRegister instances. Will be empty if _crashed is NO. */ - NSArray *_registers; -} - -- (id) initWithThreadNumber: (NSInteger) threadNumber - stackFrames: (NSArray *) stackFrames - crashed: (BOOL) crashed - registers: (NSArray *) registers; - -/** - * Application thread number. - */ -@property(nonatomic, readonly) NSInteger threadNumber; - -/** - * Thread backtrace. Provides an array of PLCrashReportStackFrameInfo instances. - * The array is ordered, last callee to first. - */ -@property(nonatomic, readonly) NSArray *stackFrames; - -/** - * If this thread crashed, set to YES. - */ -@property(nonatomic, readonly) BOOL crashed; - -/** - * State of the general purpose and related registers, as a list of - * PLCrashReportRegister instances. If this thead did not crash (crashed returns NO), - * this list will be empty. - */ -@property(nonatomic, readonly) NSArray *registers; - -@end diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReporter.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReporter.h deleted file mode 100644 index aa002d1631..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReporter.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2008-2009 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import -#import - -#import "PLCrashReporterConfig.h" -#import "PLCrashMacros.h" - -@class PLCrashMachExceptionServer; -@class PLCrashMachExceptionPortSet; - -/** - * @ingroup functions - * - * Prototype of a callback function used to execute additional user code with signal information as provided - * by PLCrashReporter. Called upon completion of crash handling, after the crash report has been written to disk. - * - * @param info The signal info. - * @param uap The crash's threads context. - * @param context The API client's supplied context value. - * - * @sa The @ref async_safety documentation. - * @sa PLCrashReporter::setPostCrashCallbacks: - */ -typedef void (*PLCrashReporterPostCrashSignalCallback)(siginfo_t *info, ucontext_t *uap, void *context); - -/** - * @ingroup types - * - * This structure contains callbacks supported by PLCrashReporter to allow the host application to perform - * additional tasks prior to program termination after a crash has occured. - * - * @sa The @ref async_safety documentation. - */ -typedef struct PLCrashReporterCallbacks { - /** The version number of this structure. If not one of the defined version numbers for this type, the behavior - * is undefined. The current version of this structure is 0. */ - uint16_t version; - - /** An arbitrary user-supplied context value. This value may be NULL. */ - void *context; - - /** - * The callback used to report caught signal information. In version 0 of this structure, all crashes will be - * reported via this function. - * - * @warning When using PLCrashReporterSignalHandlerTypeMach, the siginfo_t argument to this function will be derived - * from the Mach exception data, and may be incorrect, or may otherwise not match the expected data as provided via - * PLCrashReporterSignalHandlerTypeBSD. In addition, the provided ucontext_t value will be zero-initialized, and will - * not provide valid thread state. - * - * This callback will be deprecated in favor of a Mach-compatible replacement in a future release; support is maintained - * here to allow clients that rely on post-crash callbacks without thread state to make use of Mach exceptions. - */ - PLCrashReporterPostCrashSignalCallback handleSignal; -} PLCrashReporterCallbacks; - -@interface PLCrashReporter : NSObject { -@private - /** Reporter configuration */ - PLCrashReporterConfig *_config; - - /** YES if the crash reporter has been enabled */ - BOOL _enabled; - -#if PLCRASH_FEATURE_MACH_EXCEPTIONS - /** The backing Mach exception server, if any. Nil if the reporter has not been enabled, or if - * the configured signal handler type is not PLCrashReporterSignalHandlerTypeMach. */ - PLCrashMachExceptionServer *_machServer; - - /** Previously registered Mach exception ports, if any. */ - PLCrashMachExceptionPortSet *_previousMachPorts; -#endif /* PLCRASH_FEATURE_MACH_EXCEPTIONS */ - - /** Application identifier */ - NSString *_applicationIdentifier; - - /** Application version */ - NSString *_applicationVersion; - - /** Application marketing version */ - NSString *_applicationMarketingVersion; - - /** Path to the crash reporter internal data directory */ - NSString *_crashReportDirectory; -} - -+ (PLCrashReporter *) sharedReporter PLCR_DEPRECATED; - -- (instancetype) initWithConfiguration: (PLCrashReporterConfig *) config; - -- (BOOL) hasPendingCrashReport; - -- (NSData *) loadPendingCrashReportData; -- (NSData *) loadPendingCrashReportDataAndReturnError: (NSError **) outError; - -- (NSData *) generateLiveReportWithThread: (thread_t) thread; -- (NSData *) generateLiveReportWithThread: (thread_t) thread error: (NSError **) outError; - -- (NSData *) generateLiveReport; -- (NSData *) generateLiveReportAndReturnError: (NSError **) outError; - -- (BOOL) purgePendingCrashReport; -- (BOOL) purgePendingCrashReportAndReturnError: (NSError **) outError; - -- (BOOL) enableCrashReporter; -- (BOOL) enableCrashReporterAndReturnError: (NSError **) outError; - -- (void) setCrashCallbacks: (PLCrashReporterCallbacks *) callbacks; - -@end diff --git a/Vendor/iOS/PLCrashReporter/include/PLCrashReporterConfig.h b/Vendor/iOS/PLCrashReporter/include/PLCrashReporterConfig.h deleted file mode 100644 index 15c3a24b98..0000000000 --- a/Vendor/iOS/PLCrashReporter/include/PLCrashReporterConfig.h +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Author: Landon Fuller - * - * Copyright (c) 2013 Plausible Labs Cooperative, Inc. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import -#import "PLCrashFeatureConfig.h" - -/** - * @ingroup enums - * Supported mechanisms for trapping and handling crashes. - */ -typedef NS_ENUM(NSUInteger, PLCrashReporterSignalHandlerType) { - /** - * Trap fatal signals via a sigaction(2)-registered BSD signal handler. - * - * PLCrashReporter's signal handler will supersede previously registered handlers; existing - * handlers will not be called. This behavior may be modified in a future release, and should - * not be relied upon as a mechanism to prevent existing signal handlers from being called. - * - * There are some limitations to signal-based crash handling on Mac OS X and iOS; specifically: - * - * - On Mac OS X, stack overflows will only be handled on the thread on which - * the crash reporter was initialized. This should generally be the main thread. - * - On iOS 6.0 and later, any stack overflows will not be handled due to sigaltstack() being - * non-functional on the device. (see rdar://13002712 - SA_ONSTACK/sigaltstack() ignored on iOS). - * - Some exit paths in Apple's Libc will deregister a signal handler before firing SIGABRT, resulting - * in the signal handler never being called (see rdar://14313497 - ___abort() disables SIGABRT signal - * handlers prior to raising SIGABRT). These __abort()-based checks are: - * - Implemented for unsafe memcpy/strcpy/snprintf C functions. - * - Only enabled when operating on a fixed-width target buffer (in which case the - * compiler rewrites the function calls to the built-in variants, and provides the fixed-width length as an argument). - * - Only trigger in the case that the source data exceeds the size of the fixed width target - * buffer, and the maximum length argument either isn't supplied by the caller (eg, when using strcpy), - * or a too-long argument is supplied (eg, strncpy with a length argument longer than the target buffer), - * AND that argument can't be checked at compile-time. - */ - PLCrashReporterSignalHandlerTypeBSD = 0, - -#if PLCRASH_FEATURE_MACH_EXCEPTIONS - /** - * Trap fatal signals via a Mach exception server. - * - * If any existing Mach exception server has been registered for the task, exceptions will be forwarded to that - * exception handler. Should the exceptions be handled by an existing handler, no report will be generated - * by PLCrashReporter. - * - * @par Mac OS X - * - * On Mac OS X, the Mach exception implementation is fully supported, using publicly available API -- note, - * however, that some kernel-internal constants, as well as architecture-specific trap information, - * may be required to fully interpret a Mach exception's root cause. - * - * @par iOS - * - * On iOS, the APIs required for a complete implementation are not fully public. - * - * The exposed surface of undocumented API usage is relatively low, and there has been strong user demand to - * implement Mach exception handling regardless of concerns over API visiblity. Given this, we've included - * Mach exception handling as an optional feature, with both build-time and runtime configuration - * to disable its inclusion or use, respectively. - * - * @par Debugger Incompatibility - * - * The Mach exception handler executes in-process, and will interfere with debuggers when they attempt to - * suspend all active threads (which will include the Mach exception handler). Mach-based handling - * should not be used when a debugger is attached. - * - * @par More Details - * - * For more information, refer to @ref mach_exceptions. - */ - PLCrashReporterSignalHandlerTypeMach = 1 -#endif /* PLCRASH_FEATURE_MACH_EXCEPTIONS */ -}; - -/** - * @ingroup enums - * Supported mechanisms for performing local symbolication. - * - * Local symbolication is performed using inexact heuristics and symbol data available at runtime; it may - * return information that is incorrect. This may still be useful in the case where DWARF data is unavailable - * for a given build; in that case, it can provide function and method names (though not line numbers) for a - * crash report that may otherwise be unusable. - * - * Note, however, this comes at the cost of a significant increase in code that must run within the critical - * crash reporting section, where failures may result in crash reports being corrupted or left unwritten. In - * addition, some of the provided symbolication strategies rely on knowledge of runtime internals that may - * change in future iOS releases. Given that DWARF symbolication data will always be more accurate, and - * the risks inherent in executing considerably more code at crash time, it is strongly recommended that local - * symbolication only be enabled for non-release builds. - * - * Multiple symbolication strategies may be enabled, in which case a best-match heuristic will be applied to the - * results. - */ -typedef NS_OPTIONS(NSUInteger, PLCrashReporterSymbolicationStrategy) { - /** No symbolication. */ - PLCrashReporterSymbolicationStrategyNone = 0, - - /** - * Use the standard binary symbol table. On iOS, this alone will return - * incomplete results, as most symbols are rewritten to the common '\' string. - */ - PLCrashReporterSymbolicationStrategySymbolTable = 1 << 0, - - /** - * Use Objective-C metadata to find method and class names. This relies on detailed parsing - * of the Objective-C runtime data, including undefined flags and other runtime internals. As such, - * it may return incorrect data should the runtime be changed incompatibly. - */ - PLCrashReporterSymbolicationStrategyObjC = 1 << 1, - - /** - * Enable all available symbolication strategies. - */ - PLCrashReporterSymbolicationStrategyAll = (PLCrashReporterSymbolicationStrategySymbolTable|PLCrashReporterSymbolicationStrategyObjC) -}; - -@interface PLCrashReporterConfig : NSObject { -@private - /** The configured signal handler type. */ - PLCrashReporterSignalHandlerType _signalHandlerType; - - /** The configured symbolication strategy. */ - PLCrashReporterSymbolicationStrategy _symbolicationStrategy; - - /** - * Flag indicating if the uncaughtExceptionHandler should be initialized or not. It usually is, except in a - * Xamarin environment. - */ - BOOL _shouldRegisterUncaughtExceptionHandler; -} - -+ (instancetype) defaultConfiguration; - -- (instancetype) init; -- (instancetype) initWithSignalHandlerType: (PLCrashReporterSignalHandlerType) signalHandlerType - symbolicationStrategy: (PLCrashReporterSymbolicationStrategy) symbolicationStrategy; - -- (instancetype) initWithSignalHandlerType: (PLCrashReporterSignalHandlerType) signalHandlerType - symbolicationStrategy: (PLCrashReporterSymbolicationStrategy) symbolicationStrategy - shouldRegisterUncaughtExceptionHandler: (BOOL) shouldRegisterUncaughtExceptionHandler; - - -/** The configured signal handler type. */ -@property(nonatomic, readonly) PLCrashReporterSignalHandlerType signalHandlerType; - -/** The configured symbolication strategy. */ -@property(nonatomic, readonly) PLCrashReporterSymbolicationStrategy symbolicationStrategy; - -/** Should PLCrashReporter regiser an uncaught exception handler? This is entended to be used in Xamarin apps */ -@property(nonatomic, readonly) BOOL shouldRegisterUncaughtExceptionHandler; - -@end - diff --git a/Vendor/iOS/PLCrashReporter/libCrashReporter-iOS.a b/Vendor/iOS/PLCrashReporter/libCrashReporter-iOS.a deleted file mode 100644 index 87658ad0a9fe49ad4632fec9c28056a30d699b6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11527072 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 i{Jp#<-R2RUf5_{JQ= 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%0A3_x=V{WkbB~%QM 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 z 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 pdXAK#6reGh`qt2 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