| | @@ -1,8 +1,8 @@ |
| 1 | 1 | /****************************************************************************** |
| 2 | 2 | ** This file is an amalgamation of many separate C source files from SQLite |
| 3 | | -** version 3.29.0. By combining all the individual C code files into this |
| 3 | +** version 3.30.0. By combining all the individual C code files into this |
| 4 | 4 | ** single large file, the entire code can be compiled as a single translation |
| 5 | 5 | ** unit. This allows many compilers to do optimizations that would not be |
| 6 | 6 | ** possible if the files were compiled separately. Performance improvements |
| 7 | 7 | ** of 5% or more are commonly seen when SQLite is compiled as a single |
| 8 | 8 | ** translation unit. |
| | @@ -329,12 +329,10 @@ |
| 329 | 329 | #if SQLITE_ENABLE_SQLLOG |
| 330 | 330 | "ENABLE_SQLLOG", |
| 331 | 331 | #endif |
| 332 | 332 | #if defined(SQLITE_ENABLE_STAT4) |
| 333 | 333 | "ENABLE_STAT4", |
| 334 | | -#elif defined(SQLITE_ENABLE_STAT3) |
| 335 | | - "ENABLE_STAT3", |
| 336 | 334 | #endif |
| 337 | 335 | #if SQLITE_ENABLE_STMTVTAB |
| 338 | 336 | "ENABLE_STMTVTAB", |
| 339 | 337 | #endif |
| 340 | 338 | #if SQLITE_ENABLE_STMT_SCANSTATUS |
| | @@ -1165,13 +1163,13 @@ |
| 1165 | 1163 | ** |
| 1166 | 1164 | ** See also: [sqlite3_libversion()], |
| 1167 | 1165 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 1168 | 1166 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 1169 | 1167 | */ |
| 1170 | | -#define SQLITE_VERSION "3.29.0" |
| 1171 | | -#define SQLITE_VERSION_NUMBER 3029000 |
| 1172 | | -#define SQLITE_SOURCE_ID "2019-07-10 17:32:03 fc82b73eaac8b36950e527f12c4b5dc1e147e6f4ad2217ae43ad82882a88bfa6" |
| 1168 | +#define SQLITE_VERSION "3.30.0" |
| 1169 | +#define SQLITE_VERSION_NUMBER 3030000 |
| 1170 | +#define SQLITE_SOURCE_ID "2019-09-03 16:23:41 3044cf6917ea8324175fc91657e9a5978af9748f72e1914bc361753f0b2d897d" |
| 1173 | 1171 | |
| 1174 | 1172 | /* |
| 1175 | 1173 | ** CAPI3REF: Run-Time Library Version Numbers |
| 1176 | 1174 | ** KEYWORDS: sqlite3_version sqlite3_sourceid |
| 1177 | 1175 | ** |
| | @@ -3135,10 +3133,21 @@ |
| 3135 | 3133 | ** The second parameter is a pointer to an integer into which |
| 3136 | 3134 | ** is written 0 or 1 to indicate whether triggers are disabled or enabled |
| 3137 | 3135 | ** following this call. The second parameter may be a NULL pointer, in |
| 3138 | 3136 | ** which case the trigger setting is not reported back. </dd> |
| 3139 | 3137 | ** |
| 3138 | +** [[SQLITE_DBCONFIG_ENABLE_VIEW]] |
| 3139 | +** <dt>SQLITE_DBCONFIG_ENABLE_VIEW</dt> |
| 3140 | +** <dd> ^This option is used to enable or disable [CREATE VIEW | views]. |
| 3141 | +** There should be two additional arguments. |
| 3142 | +** The first argument is an integer which is 0 to disable views, |
| 3143 | +** positive to enable views or negative to leave the setting unchanged. |
| 3144 | +** The second parameter is a pointer to an integer into which |
| 3145 | +** is written 0 or 1 to indicate whether views are disabled or enabled |
| 3146 | +** following this call. The second parameter may be a NULL pointer, in |
| 3147 | +** which case the view setting is not reported back. </dd> |
| 3148 | +** |
| 3140 | 3149 | ** [[SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER]] |
| 3141 | 3150 | ** <dt>SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER</dt> |
| 3142 | 3151 | ** <dd> ^This option is used to enable or disable the |
| 3143 | 3152 | ** [fts3_tokenizer()] function which is part of the |
| 3144 | 3153 | ** [FTS3] full-text search engine extension. |
| | @@ -3307,11 +3316,12 @@ |
| 3307 | 3316 | #define SQLITE_DBCONFIG_DEFENSIVE 1010 /* int int* */ |
| 3308 | 3317 | #define SQLITE_DBCONFIG_WRITABLE_SCHEMA 1011 /* int int* */ |
| 3309 | 3318 | #define SQLITE_DBCONFIG_LEGACY_ALTER_TABLE 1012 /* int int* */ |
| 3310 | 3319 | #define SQLITE_DBCONFIG_DQS_DML 1013 /* int int* */ |
| 3311 | 3320 | #define SQLITE_DBCONFIG_DQS_DDL 1014 /* int int* */ |
| 3312 | | -#define SQLITE_DBCONFIG_MAX 1014 /* Largest DBCONFIG */ |
| 3321 | +#define SQLITE_DBCONFIG_ENABLE_VIEW 1015 /* int int* */ |
| 3322 | +#define SQLITE_DBCONFIG_MAX 1015 /* Largest DBCONFIG */ |
| 3313 | 3323 | |
| 3314 | 3324 | /* |
| 3315 | 3325 | ** CAPI3REF: Enable Or Disable Extended Result Codes |
| 3316 | 3326 | ** METHOD: sqlite3 |
| 3317 | 3327 | ** |
| | @@ -4856,11 +4866,11 @@ |
| 4856 | 4866 | ** a schema change, on the first [sqlite3_step()] call following any change |
| 4857 | 4867 | ** to the [sqlite3_bind_text | bindings] of that [parameter]. |
| 4858 | 4868 | ** ^The specific value of WHERE-clause [parameter] might influence the |
| 4859 | 4869 | ** choice of query plan if the parameter is the left-hand side of a [LIKE] |
| 4860 | 4870 | ** or [GLOB] operator or if the parameter is compared to an indexed column |
| 4861 | | -** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled. |
| 4871 | +** and the [SQLITE_ENABLE_STAT4] compile-time option is enabled. |
| 4862 | 4872 | ** </li> |
| 4863 | 4873 | ** </ol> |
| 4864 | 4874 | ** |
| 4865 | 4875 | ** <p>^sqlite3_prepare_v3() differs from sqlite3_prepare_v2() only in having |
| 4866 | 4876 | ** the extra prepFlags parameter, which is a bit array consisting of zero or |
| | @@ -5890,10 +5900,13 @@ |
| 5890 | 5900 | ** the same inputs within a single SQL statement. Most SQL functions are |
| 5891 | 5901 | ** deterministic. The built-in [random()] SQL function is an example of a |
| 5892 | 5902 | ** function that is not deterministic. The SQLite query planner is able to |
| 5893 | 5903 | ** perform additional optimizations on deterministic functions, so use |
| 5894 | 5904 | ** of the [SQLITE_DETERMINISTIC] flag is recommended where possible. |
| 5905 | +** ^The fourth parameter may also optionally include the [SQLITE_DIRECTONLY] |
| 5906 | +** flag, which if present prevents the function from being invoked from |
| 5907 | +** within VIEWs or TRIGGERs. |
| 5895 | 5908 | ** |
| 5896 | 5909 | ** ^(The fifth parameter is an arbitrary pointer. The implementation of the |
| 5897 | 5910 | ** function can gain access to this pointer using [sqlite3_user_data()].)^ |
| 5898 | 5911 | ** |
| 5899 | 5912 | ** ^The sixth, seventh and eighth parameters passed to the three |
| | @@ -6007,12 +6020,20 @@ |
| 6007 | 6020 | ** |
| 6008 | 6021 | ** These constants may be ORed together with the |
| 6009 | 6022 | ** [SQLITE_UTF8 | preferred text encoding] as the fourth argument |
| 6010 | 6023 | ** to [sqlite3_create_function()], [sqlite3_create_function16()], or |
| 6011 | 6024 | ** [sqlite3_create_function_v2()]. |
| 6025 | +** |
| 6026 | +** The SQLITE_DETERMINISTIC flag means that the new function will always |
| 6027 | +** maps the same inputs into the same output. The abs() function is |
| 6028 | +** deterministic, for example, but randomblob() is not. |
| 6029 | +** |
| 6030 | +** The SQLITE_DIRECTONLY flag means that the function may only be invoked |
| 6031 | +** from top-level SQL, and cannot be used in VIEWs or TRIGGERs. |
| 6012 | 6032 | */ |
| 6013 | | -#define SQLITE_DETERMINISTIC 0x800 |
| 6033 | +#define SQLITE_DETERMINISTIC 0x000000800 |
| 6034 | +#define SQLITE_DIRECTONLY 0x000080000 |
| 6014 | 6035 | |
| 6015 | 6036 | /* |
| 6016 | 6037 | ** CAPI3REF: Deprecated Functions |
| 6017 | 6038 | ** DEPRECATED |
| 6018 | 6039 | ** |
| | @@ -7654,10 +7675,16 @@ |
| 7654 | 7675 | ** no longer needs the pClientData pointer. ^The destructor will also |
| 7655 | 7676 | ** be invoked if the call to sqlite3_create_module_v2() fails. |
| 7656 | 7677 | ** ^The sqlite3_create_module() |
| 7657 | 7678 | ** interface is equivalent to sqlite3_create_module_v2() with a NULL |
| 7658 | 7679 | ** destructor. |
| 7680 | +** |
| 7681 | +** ^If the third parameter (the pointer to the sqlite3_module object) is |
| 7682 | +** NULL then no new module is create and any existing modules with the |
| 7683 | +** same name are dropped. |
| 7684 | +** |
| 7685 | +** See also: [sqlite3_drop_modules()] |
| 7659 | 7686 | */ |
| 7660 | 7687 | SQLITE_API int sqlite3_create_module( |
| 7661 | 7688 | sqlite3 *db, /* SQLite connection to register module with */ |
| 7662 | 7689 | const char *zName, /* Name of the module */ |
| 7663 | 7690 | const sqlite3_module *p, /* Methods for the module */ |
| | @@ -7668,10 +7695,27 @@ |
| 7668 | 7695 | const char *zName, /* Name of the module */ |
| 7669 | 7696 | const sqlite3_module *p, /* Methods for the module */ |
| 7670 | 7697 | void *pClientData, /* Client data for xCreate/xConnect */ |
| 7671 | 7698 | void(*xDestroy)(void*) /* Module destructor function */ |
| 7672 | 7699 | ); |
| 7700 | + |
| 7701 | +/* |
| 7702 | +** CAPI3REF: Remove Unnecessary Virtual Table Implementations |
| 7703 | +** METHOD: sqlite3 |
| 7704 | +** |
| 7705 | +** ^The sqlite3_drop_modules(D,L) interface removes all virtual |
| 7706 | +** table modules from database connection D except those named on list L. |
| 7707 | +** The L parameter must be either NULL or a pointer to an array of pointers |
| 7708 | +** to strings where the array is terminated by a single NULL pointer. |
| 7709 | +** ^If the L parameter is NULL, then all virtual table modules are removed. |
| 7710 | +** |
| 7711 | +** See also: [sqlite3_create_module()] |
| 7712 | +*/ |
| 7713 | +SQLITE_API int sqlite3_drop_modules( |
| 7714 | + sqlite3 *db, /* Remove modules from this connection */ |
| 7715 | + const char **azKeep /* Except, do not remove the ones named here */ |
| 7716 | +); |
| 7673 | 7717 | |
| 7674 | 7718 | /* |
| 7675 | 7719 | ** CAPI3REF: Virtual Table Instance Object |
| 7676 | 7720 | ** KEYWORDS: sqlite3_vtab |
| 7677 | 7721 | ** |
| | @@ -8377,11 +8421,11 @@ |
| 8377 | 8421 | ** [sqlite3_test_control()] interface. |
| 8378 | 8422 | */ |
| 8379 | 8423 | #define SQLITE_TESTCTRL_FIRST 5 |
| 8380 | 8424 | #define SQLITE_TESTCTRL_PRNG_SAVE 5 |
| 8381 | 8425 | #define SQLITE_TESTCTRL_PRNG_RESTORE 6 |
| 8382 | | -#define SQLITE_TESTCTRL_PRNG_RESET 7 |
| 8426 | +#define SQLITE_TESTCTRL_PRNG_RESET 7 /* NOT USED */ |
| 8383 | 8427 | #define SQLITE_TESTCTRL_BITVEC_TEST 8 |
| 8384 | 8428 | #define SQLITE_TESTCTRL_FAULT_INSTALL 9 |
| 8385 | 8429 | #define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 |
| 8386 | 8430 | #define SQLITE_TESTCTRL_PENDING_BYTE 11 |
| 8387 | 8431 | #define SQLITE_TESTCTRL_ASSERT 12 |
| | @@ -8400,11 +8444,13 @@ |
| 8400 | 8444 | #define SQLITE_TESTCTRL_ISINIT 23 |
| 8401 | 8445 | #define SQLITE_TESTCTRL_SORTER_MMAP 24 |
| 8402 | 8446 | #define SQLITE_TESTCTRL_IMPOSTER 25 |
| 8403 | 8447 | #define SQLITE_TESTCTRL_PARSER_COVERAGE 26 |
| 8404 | 8448 | #define SQLITE_TESTCTRL_RESULT_INTREAL 27 |
| 8405 | | -#define SQLITE_TESTCTRL_LAST 27 /* Largest TESTCTRL */ |
| 8449 | +#define SQLITE_TESTCTRL_PRNG_SEED 28 |
| 8450 | +#define SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS 29 |
| 8451 | +#define SQLITE_TESTCTRL_LAST 29 /* Largest TESTCTRL */ |
| 8406 | 8452 | |
| 8407 | 8453 | /* |
| 8408 | 8454 | ** CAPI3REF: SQL Keyword Checking |
| 8409 | 8455 | ** |
| 8410 | 8456 | ** These routines provide access to the set of SQL language keywords |
| | @@ -13097,19 +13143,19 @@ |
| 13097 | 13143 | ** Ticket #3860: The llvm-gcc-4.2 compiler from Apple chokes on |
| 13098 | 13144 | ** the ((void*)&((char*)0)[X]) construct. But MSVC chokes on ((void*)(X)). |
| 13099 | 13145 | ** So we have to define the macros in different ways depending on the |
| 13100 | 13146 | ** compiler. |
| 13101 | 13147 | */ |
| 13102 | | -#if defined(__PTRDIFF_TYPE__) /* This case should work for GCC */ |
| 13148 | +#if defined(HAVE_STDINT_H) /* Use this case if we have ANSI headers */ |
| 13149 | +# define SQLITE_INT_TO_PTR(X) ((void*)(intptr_t)(X)) |
| 13150 | +# define SQLITE_PTR_TO_INT(X) ((int)(intptr_t)(X)) |
| 13151 | +#elif defined(__PTRDIFF_TYPE__) /* This case should work for GCC */ |
| 13103 | 13152 | # define SQLITE_INT_TO_PTR(X) ((void*)(__PTRDIFF_TYPE__)(X)) |
| 13104 | 13153 | # define SQLITE_PTR_TO_INT(X) ((int)(__PTRDIFF_TYPE__)(X)) |
| 13105 | 13154 | #elif !defined(__GNUC__) /* Works for compilers other than LLVM */ |
| 13106 | 13155 | # define SQLITE_INT_TO_PTR(X) ((void*)&((char*)0)[X]) |
| 13107 | 13156 | # define SQLITE_PTR_TO_INT(X) ((int)(((char*)X)-(char*)0)) |
| 13108 | | -#elif defined(HAVE_STDINT_H) /* Use this case if we have ANSI headers */ |
| 13109 | | -# define SQLITE_INT_TO_PTR(X) ((void*)(intptr_t)(X)) |
| 13110 | | -# define SQLITE_PTR_TO_INT(X) ((int)(intptr_t)(X)) |
| 13111 | 13157 | #else /* Generates a warning - but it always works */ |
| 13112 | 13158 | # define SQLITE_INT_TO_PTR(X) ((void*)(X)) |
| 13113 | 13159 | # define SQLITE_PTR_TO_INT(X) ((int)(X)) |
| 13114 | 13160 | #endif |
| 13115 | 13161 | |
| | @@ -13595,104 +13641,107 @@ |
| 13595 | 13641 | #define TK_TRIGGER 77 |
| 13596 | 13642 | #define TK_VACUUM 78 |
| 13597 | 13643 | #define TK_VIEW 79 |
| 13598 | 13644 | #define TK_VIRTUAL 80 |
| 13599 | 13645 | #define TK_WITH 81 |
| 13600 | | -#define TK_CURRENT 82 |
| 13601 | | -#define TK_FOLLOWING 83 |
| 13602 | | -#define TK_PARTITION 84 |
| 13603 | | -#define TK_PRECEDING 85 |
| 13604 | | -#define TK_RANGE 86 |
| 13605 | | -#define TK_UNBOUNDED 87 |
| 13606 | | -#define TK_EXCLUDE 88 |
| 13607 | | -#define TK_GROUPS 89 |
| 13608 | | -#define TK_OTHERS 90 |
| 13609 | | -#define TK_TIES 91 |
| 13610 | | -#define TK_REINDEX 92 |
| 13611 | | -#define TK_RENAME 93 |
| 13612 | | -#define TK_CTIME_KW 94 |
| 13613 | | -#define TK_ANY 95 |
| 13614 | | -#define TK_BITAND 96 |
| 13615 | | -#define TK_BITOR 97 |
| 13616 | | -#define TK_LSHIFT 98 |
| 13617 | | -#define TK_RSHIFT 99 |
| 13618 | | -#define TK_PLUS 100 |
| 13619 | | -#define TK_MINUS 101 |
| 13620 | | -#define TK_STAR 102 |
| 13621 | | -#define TK_SLASH 103 |
| 13622 | | -#define TK_REM 104 |
| 13623 | | -#define TK_CONCAT 105 |
| 13624 | | -#define TK_COLLATE 106 |
| 13625 | | -#define TK_BITNOT 107 |
| 13626 | | -#define TK_ON 108 |
| 13627 | | -#define TK_INDEXED 109 |
| 13628 | | -#define TK_STRING 110 |
| 13629 | | -#define TK_JOIN_KW 111 |
| 13630 | | -#define TK_CONSTRAINT 112 |
| 13631 | | -#define TK_DEFAULT 113 |
| 13632 | | -#define TK_NULL 114 |
| 13633 | | -#define TK_PRIMARY 115 |
| 13634 | | -#define TK_UNIQUE 116 |
| 13635 | | -#define TK_CHECK 117 |
| 13636 | | -#define TK_REFERENCES 118 |
| 13637 | | -#define TK_AUTOINCR 119 |
| 13638 | | -#define TK_INSERT 120 |
| 13639 | | -#define TK_DELETE 121 |
| 13640 | | -#define TK_UPDATE 122 |
| 13641 | | -#define TK_SET 123 |
| 13642 | | -#define TK_DEFERRABLE 124 |
| 13643 | | -#define TK_FOREIGN 125 |
| 13644 | | -#define TK_DROP 126 |
| 13645 | | -#define TK_UNION 127 |
| 13646 | | -#define TK_ALL 128 |
| 13647 | | -#define TK_EXCEPT 129 |
| 13648 | | -#define TK_INTERSECT 130 |
| 13649 | | -#define TK_SELECT 131 |
| 13650 | | -#define TK_VALUES 132 |
| 13651 | | -#define TK_DISTINCT 133 |
| 13652 | | -#define TK_DOT 134 |
| 13653 | | -#define TK_FROM 135 |
| 13654 | | -#define TK_JOIN 136 |
| 13655 | | -#define TK_USING 137 |
| 13656 | | -#define TK_ORDER 138 |
| 13657 | | -#define TK_GROUP 139 |
| 13658 | | -#define TK_HAVING 140 |
| 13659 | | -#define TK_LIMIT 141 |
| 13660 | | -#define TK_WHERE 142 |
| 13661 | | -#define TK_INTO 143 |
| 13662 | | -#define TK_NOTHING 144 |
| 13663 | | -#define TK_FLOAT 145 |
| 13664 | | -#define TK_BLOB 146 |
| 13665 | | -#define TK_INTEGER 147 |
| 13666 | | -#define TK_VARIABLE 148 |
| 13667 | | -#define TK_CASE 149 |
| 13668 | | -#define TK_WHEN 150 |
| 13669 | | -#define TK_THEN 151 |
| 13670 | | -#define TK_ELSE 152 |
| 13671 | | -#define TK_INDEX 153 |
| 13672 | | -#define TK_ALTER 154 |
| 13673 | | -#define TK_ADD 155 |
| 13674 | | -#define TK_WINDOW 156 |
| 13675 | | -#define TK_OVER 157 |
| 13676 | | -#define TK_FILTER 158 |
| 13677 | | -#define TK_TRUEFALSE 159 |
| 13678 | | -#define TK_ISNOT 160 |
| 13679 | | -#define TK_FUNCTION 161 |
| 13646 | +#define TK_NULLS 82 |
| 13647 | +#define TK_FIRST 83 |
| 13648 | +#define TK_LAST 84 |
| 13649 | +#define TK_CURRENT 85 |
| 13650 | +#define TK_FOLLOWING 86 |
| 13651 | +#define TK_PARTITION 87 |
| 13652 | +#define TK_PRECEDING 88 |
| 13653 | +#define TK_RANGE 89 |
| 13654 | +#define TK_UNBOUNDED 90 |
| 13655 | +#define TK_EXCLUDE 91 |
| 13656 | +#define TK_GROUPS 92 |
| 13657 | +#define TK_OTHERS 93 |
| 13658 | +#define TK_TIES 94 |
| 13659 | +#define TK_REINDEX 95 |
| 13660 | +#define TK_RENAME 96 |
| 13661 | +#define TK_CTIME_KW 97 |
| 13662 | +#define TK_ANY 98 |
| 13663 | +#define TK_BITAND 99 |
| 13664 | +#define TK_BITOR 100 |
| 13665 | +#define TK_LSHIFT 101 |
| 13666 | +#define TK_RSHIFT 102 |
| 13667 | +#define TK_PLUS 103 |
| 13668 | +#define TK_MINUS 104 |
| 13669 | +#define TK_STAR 105 |
| 13670 | +#define TK_SLASH 106 |
| 13671 | +#define TK_REM 107 |
| 13672 | +#define TK_CONCAT 108 |
| 13673 | +#define TK_COLLATE 109 |
| 13674 | +#define TK_BITNOT 110 |
| 13675 | +#define TK_ON 111 |
| 13676 | +#define TK_INDEXED 112 |
| 13677 | +#define TK_STRING 113 |
| 13678 | +#define TK_JOIN_KW 114 |
| 13679 | +#define TK_CONSTRAINT 115 |
| 13680 | +#define TK_DEFAULT 116 |
| 13681 | +#define TK_NULL 117 |
| 13682 | +#define TK_PRIMARY 118 |
| 13683 | +#define TK_UNIQUE 119 |
| 13684 | +#define TK_CHECK 120 |
| 13685 | +#define TK_REFERENCES 121 |
| 13686 | +#define TK_AUTOINCR 122 |
| 13687 | +#define TK_INSERT 123 |
| 13688 | +#define TK_DELETE 124 |
| 13689 | +#define TK_UPDATE 125 |
| 13690 | +#define TK_SET 126 |
| 13691 | +#define TK_DEFERRABLE 127 |
| 13692 | +#define TK_FOREIGN 128 |
| 13693 | +#define TK_DROP 129 |
| 13694 | +#define TK_UNION 130 |
| 13695 | +#define TK_ALL 131 |
| 13696 | +#define TK_EXCEPT 132 |
| 13697 | +#define TK_INTERSECT 133 |
| 13698 | +#define TK_SELECT 134 |
| 13699 | +#define TK_VALUES 135 |
| 13700 | +#define TK_DISTINCT 136 |
| 13701 | +#define TK_DOT 137 |
| 13702 | +#define TK_FROM 138 |
| 13703 | +#define TK_JOIN 139 |
| 13704 | +#define TK_USING 140 |
| 13705 | +#define TK_ORDER 141 |
| 13706 | +#define TK_GROUP 142 |
| 13707 | +#define TK_HAVING 143 |
| 13708 | +#define TK_LIMIT 144 |
| 13709 | +#define TK_WHERE 145 |
| 13710 | +#define TK_INTO 146 |
| 13711 | +#define TK_NOTHING 147 |
| 13712 | +#define TK_FLOAT 148 |
| 13713 | +#define TK_BLOB 149 |
| 13714 | +#define TK_INTEGER 150 |
| 13715 | +#define TK_VARIABLE 151 |
| 13716 | +#define TK_CASE 152 |
| 13717 | +#define TK_WHEN 153 |
| 13718 | +#define TK_THEN 154 |
| 13719 | +#define TK_ELSE 155 |
| 13720 | +#define TK_INDEX 156 |
| 13721 | +#define TK_ALTER 157 |
| 13722 | +#define TK_ADD 158 |
| 13723 | +#define TK_WINDOW 159 |
| 13724 | +#define TK_OVER 160 |
| 13725 | +#define TK_FILTER 161 |
| 13680 | 13726 | #define TK_COLUMN 162 |
| 13681 | 13727 | #define TK_AGG_FUNCTION 163 |
| 13682 | 13728 | #define TK_AGG_COLUMN 164 |
| 13683 | | -#define TK_UMINUS 165 |
| 13684 | | -#define TK_UPLUS 166 |
| 13685 | | -#define TK_TRUTH 167 |
| 13686 | | -#define TK_REGISTER 168 |
| 13687 | | -#define TK_VECTOR 169 |
| 13688 | | -#define TK_SELECT_COLUMN 170 |
| 13689 | | -#define TK_IF_NULL_ROW 171 |
| 13690 | | -#define TK_ASTERISK 172 |
| 13691 | | -#define TK_SPAN 173 |
| 13692 | | -#define TK_SPACE 174 |
| 13693 | | -#define TK_ILLEGAL 175 |
| 13729 | +#define TK_TRUEFALSE 165 |
| 13730 | +#define TK_ISNOT 166 |
| 13731 | +#define TK_FUNCTION 167 |
| 13732 | +#define TK_UMINUS 168 |
| 13733 | +#define TK_UPLUS 169 |
| 13734 | +#define TK_TRUTH 170 |
| 13735 | +#define TK_REGISTER 171 |
| 13736 | +#define TK_VECTOR 172 |
| 13737 | +#define TK_SELECT_COLUMN 173 |
| 13738 | +#define TK_IF_NULL_ROW 174 |
| 13739 | +#define TK_ASTERISK 175 |
| 13740 | +#define TK_SPAN 176 |
| 13741 | +#define TK_SPACE 177 |
| 13742 | +#define TK_ILLEGAL 178 |
| 13694 | 13743 | |
| 13695 | 13744 | /************** End of parse.h ***********************************************/ |
| 13696 | 13745 | /************** Continuing where we left off in sqliteInt.h ******************/ |
| 13697 | 13746 | #include <stdio.h> |
| 13698 | 13747 | #include <stdlib.h> |
| | @@ -14099,24 +14148,10 @@ |
| 14099 | 14148 | #if SQLITE_DEFAULT_MMAP_SIZE>SQLITE_MAX_MMAP_SIZE |
| 14100 | 14149 | # undef SQLITE_DEFAULT_MMAP_SIZE |
| 14101 | 14150 | # define SQLITE_DEFAULT_MMAP_SIZE SQLITE_MAX_MMAP_SIZE |
| 14102 | 14151 | #endif |
| 14103 | 14152 | |
| 14104 | | -/* |
| 14105 | | -** Only one of SQLITE_ENABLE_STAT3 or SQLITE_ENABLE_STAT4 can be defined. |
| 14106 | | -** Priority is given to SQLITE_ENABLE_STAT4. If either are defined, also |
| 14107 | | -** define SQLITE_ENABLE_STAT3_OR_STAT4 |
| 14108 | | -*/ |
| 14109 | | -#ifdef SQLITE_ENABLE_STAT4 |
| 14110 | | -# undef SQLITE_ENABLE_STAT3 |
| 14111 | | -# define SQLITE_ENABLE_STAT3_OR_STAT4 1 |
| 14112 | | -#elif SQLITE_ENABLE_STAT3 |
| 14113 | | -# define SQLITE_ENABLE_STAT3_OR_STAT4 1 |
| 14114 | | -#elif SQLITE_ENABLE_STAT3_OR_STAT4 |
| 14115 | | -# undef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 14116 | | -#endif |
| 14117 | | - |
| 14118 | 14153 | /* |
| 14119 | 14154 | ** SELECTTRACE_ENABLED will be either 1 or 0 depending on whether or not |
| 14120 | 14155 | ** the Select query generator tracing logic is turned on. |
| 14121 | 14156 | */ |
| 14122 | 14157 | #if defined(SQLITE_ENABLE_SELECTTRACE) |
| | @@ -14982,28 +15017,28 @@ |
| 14982 | 15017 | #define OP_Affinity 91 /* synopsis: affinity(r[P1@P2]) */ |
| 14983 | 15018 | #define OP_MakeRecord 92 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ |
| 14984 | 15019 | #define OP_Count 93 /* synopsis: r[P2]=count() */ |
| 14985 | 15020 | #define OP_ReadCookie 94 |
| 14986 | 15021 | #define OP_SetCookie 95 |
| 14987 | | -#define OP_BitAnd 96 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ |
| 14988 | | -#define OP_BitOr 97 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ |
| 14989 | | -#define OP_ShiftLeft 98 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<<r[P1] */ |
| 14990 | | -#define OP_ShiftRight 99 /* same as TK_RSHIFT, synopsis: r[P3]=r[P2]>>r[P1] */ |
| 14991 | | -#define OP_Add 100 /* same as TK_PLUS, synopsis: r[P3]=r[P1]+r[P2] */ |
| 14992 | | -#define OP_Subtract 101 /* same as TK_MINUS, synopsis: r[P3]=r[P2]-r[P1] */ |
| 14993 | | -#define OP_Multiply 102 /* same as TK_STAR, synopsis: r[P3]=r[P1]*r[P2] */ |
| 14994 | | -#define OP_Divide 103 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */ |
| 14995 | | -#define OP_Remainder 104 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */ |
| 14996 | | -#define OP_Concat 105 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */ |
| 14997 | | -#define OP_ReopenIdx 106 /* synopsis: root=P2 iDb=P3 */ |
| 14998 | | -#define OP_BitNot 107 /* same as TK_BITNOT, synopsis: r[P2]= ~r[P1] */ |
| 14999 | | -#define OP_OpenRead 108 /* synopsis: root=P2 iDb=P3 */ |
| 15000 | | -#define OP_OpenWrite 109 /* synopsis: root=P2 iDb=P3 */ |
| 15001 | | -#define OP_String8 110 /* same as TK_STRING, synopsis: r[P2]='P4' */ |
| 15002 | | -#define OP_OpenDup 111 |
| 15003 | | -#define OP_OpenAutoindex 112 /* synopsis: nColumn=P2 */ |
| 15004 | | -#define OP_OpenEphemeral 113 /* synopsis: nColumn=P2 */ |
| 15022 | +#define OP_ReopenIdx 96 /* synopsis: root=P2 iDb=P3 */ |
| 15023 | +#define OP_OpenRead 97 /* synopsis: root=P2 iDb=P3 */ |
| 15024 | +#define OP_OpenWrite 98 /* synopsis: root=P2 iDb=P3 */ |
| 15025 | +#define OP_BitAnd 99 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ |
| 15026 | +#define OP_BitOr 100 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ |
| 15027 | +#define OP_ShiftLeft 101 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<<r[P1] */ |
| 15028 | +#define OP_ShiftRight 102 /* same as TK_RSHIFT, synopsis: r[P3]=r[P2]>>r[P1] */ |
| 15029 | +#define OP_Add 103 /* same as TK_PLUS, synopsis: r[P3]=r[P1]+r[P2] */ |
| 15030 | +#define OP_Subtract 104 /* same as TK_MINUS, synopsis: r[P3]=r[P2]-r[P1] */ |
| 15031 | +#define OP_Multiply 105 /* same as TK_STAR, synopsis: r[P3]=r[P1]*r[P2] */ |
| 15032 | +#define OP_Divide 106 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */ |
| 15033 | +#define OP_Remainder 107 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */ |
| 15034 | +#define OP_Concat 108 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */ |
| 15035 | +#define OP_OpenDup 109 |
| 15036 | +#define OP_BitNot 110 /* same as TK_BITNOT, synopsis: r[P2]= ~r[P1] */ |
| 15037 | +#define OP_OpenAutoindex 111 /* synopsis: nColumn=P2 */ |
| 15038 | +#define OP_OpenEphemeral 112 /* synopsis: nColumn=P2 */ |
| 15039 | +#define OP_String8 113 /* same as TK_STRING, synopsis: r[P2]='P4' */ |
| 15005 | 15040 | #define OP_SorterOpen 114 |
| 15006 | 15041 | #define OP_SequenceTest 115 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */ |
| 15007 | 15042 | #define OP_OpenPseudo 116 /* synopsis: P3 columns in r[P2] */ |
| 15008 | 15043 | #define OP_Close 117 |
| 15009 | 15044 | #define OP_ColumnsUsed 118 |
| | @@ -15031,14 +15066,14 @@ |
| 15031 | 15066 | #define OP_SqlExec 140 |
| 15032 | 15067 | #define OP_ParseSchema 141 |
| 15033 | 15068 | #define OP_LoadAnalysis 142 |
| 15034 | 15069 | #define OP_DropTable 143 |
| 15035 | 15070 | #define OP_DropIndex 144 |
| 15036 | | -#define OP_Real 145 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ |
| 15037 | | -#define OP_DropTrigger 146 |
| 15038 | | -#define OP_IntegrityCk 147 |
| 15039 | | -#define OP_RowSetAdd 148 /* synopsis: rowset(P1)=r[P2] */ |
| 15071 | +#define OP_DropTrigger 145 |
| 15072 | +#define OP_IntegrityCk 146 |
| 15073 | +#define OP_RowSetAdd 147 /* synopsis: rowset(P1)=r[P2] */ |
| 15074 | +#define OP_Real 148 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ |
| 15040 | 15075 | #define OP_Param 149 |
| 15041 | 15076 | #define OP_FkCounter 150 /* synopsis: fkctr[P1]+=P2 */ |
| 15042 | 15077 | #define OP_MemMax 151 /* synopsis: r[P1]=max(r[P1],r[P2]) */ |
| 15043 | 15078 | #define OP_OffsetLimit 152 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ |
| 15044 | 15079 | #define OP_AggInverse 153 /* synopsis: accum=r[P3] inverse(r[P2@P5]) */ |
| | @@ -15083,17 +15118,17 @@ |
| 15083 | 15118 | /* 56 */ 0x0b, 0x0b, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,\ |
| 15084 | 15119 | /* 64 */ 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, 0x10, 0x10,\ |
| 15085 | 15120 | /* 72 */ 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10,\ |
| 15086 | 15121 | /* 80 */ 0x10, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00,\ |
| 15087 | 15122 | /* 88 */ 0x12, 0x20, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,\ |
| 15088 | | -/* 96 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26,\ |
| 15089 | | -/* 104 */ 0x26, 0x26, 0x00, 0x12, 0x00, 0x00, 0x10, 0x00,\ |
| 15090 | | -/* 112 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ |
| 15123 | +/* 96 */ 0x00, 0x00, 0x00, 0x26, 0x26, 0x26, 0x26, 0x26,\ |
| 15124 | +/* 104 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x00, 0x12, 0x00,\ |
| 15125 | +/* 112 */ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ |
| 15091 | 15126 | /* 120 */ 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ |
| 15092 | 15127 | /* 128 */ 0x10, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x10,\ |
| 15093 | 15128 | /* 136 */ 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,\ |
| 15094 | | -/* 144 */ 0x00, 0x10, 0x00, 0x00, 0x06, 0x10, 0x00, 0x04,\ |
| 15129 | +/* 144 */ 0x00, 0x00, 0x00, 0x06, 0x10, 0x10, 0x00, 0x04,\ |
| 15095 | 15130 | /* 152 */ 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ |
| 15096 | 15131 | /* 160 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10,\ |
| 15097 | 15132 | /* 168 */ 0x00, 0x00, 0x00, 0x00, 0x00,} |
| 15098 | 15133 | |
| 15099 | 15134 | /* The sqlite3P2Values() routine is able to run faster if it knows |
| | @@ -15159,14 +15194,14 @@ |
| 15159 | 15194 | SQLITE_PRIVATE void sqlite3ExplainBreakpoint(const char*,const char*); |
| 15160 | 15195 | #else |
| 15161 | 15196 | # define sqlite3ExplainBreakpoint(A,B) /*no-op*/ |
| 15162 | 15197 | #endif |
| 15163 | 15198 | SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*); |
| 15164 | | -SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe*, u32 addr, u8); |
| 15165 | | -SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, u32 addr, int P1); |
| 15166 | | -SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, u32 addr, int P2); |
| 15167 | | -SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, u32 addr, int P3); |
| 15199 | +SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe*, int addr, u8); |
| 15200 | +SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, int addr, int P1); |
| 15201 | +SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, int addr, int P2); |
| 15202 | +SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, int addr, int P3); |
| 15168 | 15203 | SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, u16 P5); |
| 15169 | 15204 | SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe*, int addr); |
| 15170 | 15205 | SQLITE_PRIVATE int sqlite3VdbeChangeToNoop(Vdbe*, int addr); |
| 15171 | 15206 | SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe*, u8 op); |
| 15172 | 15207 | SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N); |
| | @@ -16377,10 +16412,11 @@ |
| 16377 | 16412 | u8 iDb; /* Which db file is being initialized */ |
| 16378 | 16413 | u8 busy; /* TRUE if currently initializing */ |
| 16379 | 16414 | unsigned orphanTrigger : 1; /* Last statement is orphaned TEMP trigger */ |
| 16380 | 16415 | unsigned imposterTable : 1; /* Building an imposter table */ |
| 16381 | 16416 | unsigned reopenMemdb : 1; /* ATTACH is really a reopen using MemDB */ |
| 16417 | + char **azInit; /* "type", "name", and "tbl_name" columns */ |
| 16382 | 16418 | } init; |
| 16383 | 16419 | int nVdbeActive; /* Number of VDBEs currently running */ |
| 16384 | 16420 | int nVdbeRead; /* Number of active VDBEs that read or write */ |
| 16385 | 16421 | int nVdbeWrite; /* Number of active VDBEs that read and write */ |
| 16386 | 16422 | int nVdbeExec; /* Number of nested calls to VdbeExec() */ |
| | @@ -16515,20 +16551,21 @@ |
| 16515 | 16551 | #define SQLITE_LegacyAlter 0x04000000 /* Legacy ALTER TABLE behaviour */ |
| 16516 | 16552 | #define SQLITE_NoSchemaError 0x08000000 /* Do not report schema parse errors*/ |
| 16517 | 16553 | #define SQLITE_Defensive 0x10000000 /* Input SQL is likely hostile */ |
| 16518 | 16554 | #define SQLITE_DqsDDL 0x20000000 /* dbl-quoted strings allowed in DDL*/ |
| 16519 | 16555 | #define SQLITE_DqsDML 0x40000000 /* dbl-quoted strings allowed in DML*/ |
| 16556 | +#define SQLITE_EnableView 0x80000000 /* Enable the use of views */ |
| 16520 | 16557 | |
| 16521 | 16558 | /* Flags used only if debugging */ |
| 16522 | 16559 | #define HI(X) ((u64)(X)<<32) |
| 16523 | 16560 | #ifdef SQLITE_DEBUG |
| 16524 | | -#define SQLITE_SqlTrace HI(0x0001) /* Debug print SQL as it executes */ |
| 16525 | | -#define SQLITE_VdbeListing HI(0x0002) /* Debug listings of VDBE progs */ |
| 16526 | | -#define SQLITE_VdbeTrace HI(0x0004) /* True to trace VDBE execution */ |
| 16527 | | -#define SQLITE_VdbeAddopTrace HI(0x0008) /* Trace sqlite3VdbeAddOp() calls */ |
| 16528 | | -#define SQLITE_VdbeEQP HI(0x0010) /* Debug EXPLAIN QUERY PLAN */ |
| 16529 | | -#define SQLITE_ParserTrace HI(0x0020) /* PRAGMA parser_trace=ON */ |
| 16561 | +#define SQLITE_SqlTrace HI(0x0100000) /* Debug print SQL as it executes */ |
| 16562 | +#define SQLITE_VdbeListing HI(0x0200000) /* Debug listings of VDBE progs */ |
| 16563 | +#define SQLITE_VdbeTrace HI(0x0400000) /* True to trace VDBE execution */ |
| 16564 | +#define SQLITE_VdbeAddopTrace HI(0x0800000) /* Trace sqlite3VdbeAddOp() calls */ |
| 16565 | +#define SQLITE_VdbeEQP HI(0x1000000) /* Debug EXPLAIN QUERY PLAN */ |
| 16566 | +#define SQLITE_ParserTrace HI(0x2000000) /* PRAGMA parser_trace=ON */ |
| 16530 | 16567 | #endif |
| 16531 | 16568 | |
| 16532 | 16569 | /* |
| 16533 | 16570 | ** Allowed values for sqlite3.mDbFlags |
| 16534 | 16571 | */ |
| | @@ -16552,12 +16589,12 @@ |
| 16552 | 16589 | #define SQLITE_OrderByIdxJoin 0x0040 /* ORDER BY of joins via index */ |
| 16553 | 16590 | #define SQLITE_Transitive 0x0080 /* Transitive constraints */ |
| 16554 | 16591 | #define SQLITE_OmitNoopJoin 0x0100 /* Omit unused tables in joins */ |
| 16555 | 16592 | #define SQLITE_CountOfView 0x0200 /* The count-of-view optimization */ |
| 16556 | 16593 | #define SQLITE_CursorHints 0x0400 /* Add OP_CursorHint opcodes */ |
| 16557 | | -#define SQLITE_Stat34 0x0800 /* Use STAT3 or STAT4 data */ |
| 16558 | | - /* TH3 expects the Stat34 ^^^^^^ value to be 0x0800. Don't change it */ |
| 16594 | +#define SQLITE_Stat4 0x0800 /* Use STAT4 data */ |
| 16595 | + /* TH3 expects the Stat4 ^^^^^^ value to be 0x0800. Don't change it */ |
| 16559 | 16596 | #define SQLITE_PushDown 0x1000 /* The push-down optimization */ |
| 16560 | 16597 | #define SQLITE_SimplifyJoin 0x2000 /* Convert LEFT JOIN to JOIN */ |
| 16561 | 16598 | #define SQLITE_SkipScan 0x4000 /* Skip-scans */ |
| 16562 | 16599 | #define SQLITE_PropagateConst 0x8000 /* The constant propagation opt */ |
| 16563 | 16600 | #define SQLITE_AllOpts 0xffff /* All optimizations */ |
| | @@ -16641,10 +16678,11 @@ |
| 16641 | 16678 | ** Value constraints (enforced via assert()): |
| 16642 | 16679 | ** SQLITE_FUNC_MINMAX == NC_MinMaxAgg == SF_MinMaxAgg |
| 16643 | 16680 | ** SQLITE_FUNC_LENGTH == OPFLAG_LENGTHARG |
| 16644 | 16681 | ** SQLITE_FUNC_TYPEOF == OPFLAG_TYPEOFARG |
| 16645 | 16682 | ** SQLITE_FUNC_CONSTANT == SQLITE_DETERMINISTIC from the API |
| 16683 | +** SQLITE_FUNC_DIRECT == SQLITE_DIRECTONLY from the API |
| 16646 | 16684 | ** SQLITE_FUNC_ENCMASK depends on SQLITE_UTF* macros in the API |
| 16647 | 16685 | */ |
| 16648 | 16686 | #define SQLITE_FUNC_ENCMASK 0x0003 /* SQLITE_UTF8, SQLITE_UTF16BE or UTF16LE */ |
| 16649 | 16687 | #define SQLITE_FUNC_LIKE 0x0004 /* Candidate for the LIKE optimization */ |
| 16650 | 16688 | #define SQLITE_FUNC_CASE 0x0008 /* Case-sensitive LIKE-type function */ |
| | @@ -16661,10 +16699,11 @@ |
| 16661 | 16699 | ** single query - might change over time */ |
| 16662 | 16700 | #define SQLITE_FUNC_AFFINITY 0x4000 /* Built-in affinity() function */ |
| 16663 | 16701 | #define SQLITE_FUNC_OFFSET 0x8000 /* Built-in sqlite_offset() function */ |
| 16664 | 16702 | #define SQLITE_FUNC_WINDOW 0x00010000 /* Built-in window-only function */ |
| 16665 | 16703 | #define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */ |
| 16704 | +#define SQLITE_FUNC_DIRECT 0x00080000 /* Not for use in TRIGGERs or VIEWs */ |
| 16666 | 16705 | |
| 16667 | 16706 | /* |
| 16668 | 16707 | ** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are |
| 16669 | 16708 | ** used to create the initializers for the FuncDef structures. |
| 16670 | 16709 | ** |
| | @@ -16774,10 +16813,11 @@ |
| 16774 | 16813 | ** hash table. |
| 16775 | 16814 | */ |
| 16776 | 16815 | struct Module { |
| 16777 | 16816 | const sqlite3_module *pModule; /* Callback pointers */ |
| 16778 | 16817 | const char *zName; /* Name passed to create_module() */ |
| 16818 | + int nRefModule; /* Number of pointers to this object */ |
| 16779 | 16819 | void *pAux; /* pAux passed to create_module() */ |
| 16780 | 16820 | void (*xDestroy)(void *); /* Module destructor function */ |
| 16781 | 16821 | Table *pEpoTab; /* Eponymous table for this module */ |
| 16782 | 16822 | }; |
| 16783 | 16823 | |
| | @@ -16839,15 +16879,16 @@ |
| 16839 | 16879 | ** used as the P4 operand, they will be more readable. |
| 16840 | 16880 | ** |
| 16841 | 16881 | ** Note also that the numeric types are grouped together so that testing |
| 16842 | 16882 | ** for a numeric type is a single comparison. And the BLOB type is first. |
| 16843 | 16883 | */ |
| 16844 | | -#define SQLITE_AFF_BLOB 'A' |
| 16845 | | -#define SQLITE_AFF_TEXT 'B' |
| 16846 | | -#define SQLITE_AFF_NUMERIC 'C' |
| 16847 | | -#define SQLITE_AFF_INTEGER 'D' |
| 16848 | | -#define SQLITE_AFF_REAL 'E' |
| 16884 | +#define SQLITE_AFF_NONE 0x40 /* '@' */ |
| 16885 | +#define SQLITE_AFF_BLOB 0x41 /* 'A' */ |
| 16886 | +#define SQLITE_AFF_TEXT 0x42 /* 'B' */ |
| 16887 | +#define SQLITE_AFF_NUMERIC 0x43 /* 'C' */ |
| 16888 | +#define SQLITE_AFF_INTEGER 0x44 /* 'D' */ |
| 16889 | +#define SQLITE_AFF_REAL 0x45 /* 'E' */ |
| 16849 | 16890 | |
| 16850 | 16891 | #define sqlite3IsNumericAffinity(X) ((X)>=SQLITE_AFF_NUMERIC) |
| 16851 | 16892 | |
| 16852 | 16893 | /* |
| 16853 | 16894 | ** The SQLITE_AFF_MASK values masks off the significant bits of an |
| | @@ -17111,13 +17152,16 @@ |
| 17111 | 17152 | u32 nRef; /* Number of references to this KeyInfo object */ |
| 17112 | 17153 | u8 enc; /* Text encoding - one of the SQLITE_UTF* values */ |
| 17113 | 17154 | u16 nKeyField; /* Number of key columns in the index */ |
| 17114 | 17155 | u16 nAllField; /* Total columns, including key plus others */ |
| 17115 | 17156 | sqlite3 *db; /* The database connection */ |
| 17116 | | - u8 *aSortOrder; /* Sort order for each column. */ |
| 17157 | + u8 *aSortFlags; /* Sort order for each column. */ |
| 17117 | 17158 | CollSeq *aColl[1]; /* Collating sequence for each term of the key */ |
| 17118 | 17159 | }; |
| 17160 | + |
| 17161 | +#define KEYINFO_ORDER_DESC 0x01 |
| 17162 | +#define KEYINFO_ORDER_BIGNULL 0x02 |
| 17119 | 17163 | |
| 17120 | 17164 | /* |
| 17121 | 17165 | ** This object holds a record which has been parsed out into individual |
| 17122 | 17166 | ** fields, for the purposes of doing a comparison. |
| 17123 | 17167 | ** |
| | @@ -17222,11 +17266,11 @@ |
| 17222 | 17266 | unsigned isCovering:1; /* True if this is a covering index */ |
| 17223 | 17267 | unsigned noSkipScan:1; /* Do not try to use skip-scan if true */ |
| 17224 | 17268 | unsigned hasStat1:1; /* aiRowLogEst values come from sqlite_stat1 */ |
| 17225 | 17269 | unsigned bNoQuery:1; /* Do not use this index to optimize queries */ |
| 17226 | 17270 | unsigned bAscKeyBug:1; /* True if the bba7b69f9849b5bf bug applies */ |
| 17227 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 17271 | +#ifdef SQLITE_ENABLE_STAT4 |
| 17228 | 17272 | int nSample; /* Number of elements in aSample[] */ |
| 17229 | 17273 | int nSampleCol; /* Size of IndexSample.anEq[] and so on */ |
| 17230 | 17274 | tRowcnt *aAvgEq; /* Average nEq values for keys not in aSample */ |
| 17231 | 17275 | IndexSample *aSample; /* Samples of the left-most key */ |
| 17232 | 17276 | tRowcnt *aiRowEst; /* Non-logarithmic stat1 data for this index */ |
| | @@ -17254,11 +17298,11 @@ |
| 17254 | 17298 | */ |
| 17255 | 17299 | #define XN_ROWID (-1) /* Indexed column is the rowid */ |
| 17256 | 17300 | #define XN_EXPR (-2) /* Indexed column is an expression */ |
| 17257 | 17301 | |
| 17258 | 17302 | /* |
| 17259 | | -** Each sample stored in the sqlite_stat3 table is represented in memory |
| 17303 | +** Each sample stored in the sqlite_stat4 table is represented in memory |
| 17260 | 17304 | ** using a structure of this type. See documentation at the top of the |
| 17261 | 17305 | ** analyze.c source file for additional information. |
| 17262 | 17306 | */ |
| 17263 | 17307 | struct IndexSample { |
| 17264 | 17308 | void *p; /* Pointer to sampled record */ |
| | @@ -17412,11 +17456,11 @@ |
| 17412 | 17456 | ** the subtrees in Expr.x.pList or Expr.x.pSelect are always separately |
| 17413 | 17457 | ** allocated, regardless of whether or not EP_Reduced is set. |
| 17414 | 17458 | */ |
| 17415 | 17459 | struct Expr { |
| 17416 | 17460 | u8 op; /* Operation performed by this node */ |
| 17417 | | - char affinity; /* The affinity of the column or 0 if not a column */ |
| 17461 | + char affExpr; /* affinity, or RAISE type */ |
| 17418 | 17462 | u32 flags; /* Various flags. EP_* See below */ |
| 17419 | 17463 | union { |
| 17420 | 17464 | char *zToken; /* Token value. Zero terminated and dequoted */ |
| 17421 | 17465 | int iValue; /* Non-negative integer value if EP_IntValue */ |
| 17422 | 17466 | } u; |
| | @@ -17443,10 +17487,11 @@ |
| 17443 | 17487 | #endif |
| 17444 | 17488 | int iTable; /* TK_COLUMN: cursor number of table holding column |
| 17445 | 17489 | ** TK_REGISTER: register number |
| 17446 | 17490 | ** TK_TRIGGER: 1 -> new, 0 -> old |
| 17447 | 17491 | ** EP_Unlikely: 134217728 times likelihood |
| 17492 | + ** TK_SELECT_COLUMN: Number of columns on the LHS |
| 17448 | 17493 | ** TK_SELECT: 1st register of result vector */ |
| 17449 | 17494 | ynVar iColumn; /* TK_COLUMN: column index. -1 for rowid. |
| 17450 | 17495 | ** TK_VARIABLE: variable number (always >= 1). |
| 17451 | 17496 | ** TK_SELECT_COLUMN: column of the result vector */ |
| 17452 | 17497 | i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */ |
| | @@ -17456,11 +17501,11 @@ |
| 17456 | 17501 | ** TK_AGG_FUNCTION: nesting depth */ |
| 17457 | 17502 | AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */ |
| 17458 | 17503 | union { |
| 17459 | 17504 | Table *pTab; /* TK_COLUMN: Table containing column. Can be NULL |
| 17460 | 17505 | ** for a column of an index on an expression */ |
| 17461 | | - Window *pWin; /* TK_FUNCTION: Window definition for the func */ |
| 17506 | + Window *pWin; /* EP_WinFunc: Window/Filter defn for a function */ |
| 17462 | 17507 | struct { /* TK_IN, TK_SELECT, and TK_EXISTS */ |
| 17463 | 17508 | int iAddr; /* Subroutine entry address */ |
| 17464 | 17509 | int regReturn; /* Register used to hold return address */ |
| 17465 | 17510 | } sub; |
| 17466 | 17511 | } y; |
| | @@ -17471,40 +17516,41 @@ |
| 17471 | 17516 | ** Value restrictions: |
| 17472 | 17517 | ** |
| 17473 | 17518 | ** EP_Agg == NC_HasAgg == SF_HasAgg |
| 17474 | 17519 | ** EP_Win == NC_HasWin |
| 17475 | 17520 | */ |
| 17476 | | -#define EP_FromJoin 0x000001 /* Originates in ON/USING clause of outer join */ |
| 17477 | | -#define EP_Distinct 0x000002 /* Aggregate function with DISTINCT keyword */ |
| 17478 | | -#define EP_HasFunc 0x000004 /* Contains one or more functions of any kind */ |
| 17479 | | -#define EP_FixedCol 0x000008 /* TK_Column with a known fixed value */ |
| 17480 | | -#define EP_Agg 0x000010 /* Contains one or more aggregate functions */ |
| 17481 | | -#define EP_VarSelect 0x000020 /* pSelect is correlated, not constant */ |
| 17482 | | -#define EP_DblQuoted 0x000040 /* token.z was originally in "..." */ |
| 17483 | | -#define EP_InfixFunc 0x000080 /* True for an infix function: LIKE, GLOB, etc */ |
| 17484 | | -#define EP_Collate 0x000100 /* Tree contains a TK_COLLATE operator */ |
| 17485 | | -#define EP_Generic 0x000200 /* Ignore COLLATE or affinity on this tree */ |
| 17486 | | -#define EP_IntValue 0x000400 /* Integer value contained in u.iValue */ |
| 17487 | | -#define EP_xIsSelect 0x000800 /* x.pSelect is valid (otherwise x.pList is) */ |
| 17488 | | -#define EP_Skip 0x001000 /* Operator does not contribute to affinity */ |
| 17489 | | -#define EP_Reduced 0x002000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ |
| 17490 | | -#define EP_TokenOnly 0x004000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ |
| 17491 | | -#define EP_Win 0x008000 /* Contains window functions */ |
| 17492 | | -#define EP_MemToken 0x010000 /* Need to sqlite3DbFree() Expr.zToken */ |
| 17493 | | -#define EP_NoReduce 0x020000 /* Cannot EXPRDUP_REDUCE this Expr */ |
| 17494 | | -#define EP_Unlikely 0x040000 /* unlikely() or likelihood() function */ |
| 17495 | | -#define EP_ConstFunc 0x080000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */ |
| 17496 | | -#define EP_CanBeNull 0x100000 /* Can be null despite NOT NULL constraint */ |
| 17497 | | -#define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */ |
| 17498 | | -#define EP_Alias 0x400000 /* Is an alias for a result set column */ |
| 17499 | | -#define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ |
| 17500 | | -#define EP_WinFunc 0x1000000 /* TK_FUNCTION with Expr.y.pWin set */ |
| 17501 | | -#define EP_Subrtn 0x2000000 /* Uses Expr.y.sub. TK_IN, _SELECT, or _EXISTS */ |
| 17502 | | -#define EP_Quoted 0x4000000 /* TK_ID was originally quoted */ |
| 17503 | | -#define EP_Static 0x8000000 /* Held in memory not obtained from malloc() */ |
| 17504 | | -#define EP_IsTrue 0x10000000 /* Always has boolean value of TRUE */ |
| 17505 | | -#define EP_IsFalse 0x20000000 /* Always has boolean value of FALSE */ |
| 17521 | +#define EP_FromJoin 0x000001 /* Originates in ON/USING clause of outer join */ |
| 17522 | +#define EP_Distinct 0x000002 /* Aggregate function with DISTINCT keyword */ |
| 17523 | +#define EP_HasFunc 0x000004 /* Contains one or more functions of any kind */ |
| 17524 | +#define EP_FixedCol 0x000008 /* TK_Column with a known fixed value */ |
| 17525 | +#define EP_Agg 0x000010 /* Contains one or more aggregate functions */ |
| 17526 | +#define EP_VarSelect 0x000020 /* pSelect is correlated, not constant */ |
| 17527 | +#define EP_DblQuoted 0x000040 /* token.z was originally in "..." */ |
| 17528 | +#define EP_InfixFunc 0x000080 /* True for an infix function: LIKE, GLOB, etc */ |
| 17529 | +#define EP_Collate 0x000100 /* Tree contains a TK_COLLATE operator */ |
| 17530 | + /* 0x000200 Available for reuse */ |
| 17531 | +#define EP_IntValue 0x000400 /* Integer value contained in u.iValue */ |
| 17532 | +#define EP_xIsSelect 0x000800 /* x.pSelect is valid (otherwise x.pList is) */ |
| 17533 | +#define EP_Skip 0x001000 /* Operator does not contribute to affinity */ |
| 17534 | +#define EP_Reduced 0x002000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ |
| 17535 | +#define EP_TokenOnly 0x004000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ |
| 17536 | +#define EP_Win 0x008000 /* Contains window functions */ |
| 17537 | +#define EP_MemToken 0x010000 /* Need to sqlite3DbFree() Expr.zToken */ |
| 17538 | +#define EP_NoReduce 0x020000 /* Cannot EXPRDUP_REDUCE this Expr */ |
| 17539 | +#define EP_Unlikely 0x040000 /* unlikely() or likelihood() function */ |
| 17540 | +#define EP_ConstFunc 0x080000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */ |
| 17541 | +#define EP_CanBeNull 0x100000 /* Can be null despite NOT NULL constraint */ |
| 17542 | +#define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */ |
| 17543 | +#define EP_Alias 0x400000 /* Is an alias for a result set column */ |
| 17544 | +#define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ |
| 17545 | +#define EP_WinFunc 0x1000000 /* TK_FUNCTION with Expr.y.pWin set */ |
| 17546 | +#define EP_Subrtn 0x2000000 /* Uses Expr.y.sub. TK_IN, _SELECT, or _EXISTS */ |
| 17547 | +#define EP_Quoted 0x4000000 /* TK_ID was originally quoted */ |
| 17548 | +#define EP_Static 0x8000000 /* Held in memory not obtained from malloc() */ |
| 17549 | +#define EP_IsTrue 0x10000000 /* Always has boolean value of TRUE */ |
| 17550 | +#define EP_IsFalse 0x20000000 /* Always has boolean value of FALSE */ |
| 17551 | +#define EP_Indirect 0x40000000 /* Contained within a TRIGGER or a VIEW */ |
| 17506 | 17552 | |
| 17507 | 17553 | /* |
| 17508 | 17554 | ** The EP_Propagate mask is a set of properties that automatically propagate |
| 17509 | 17555 | ** upwards into parent nodes. |
| 17510 | 17556 | */ |
| | @@ -17543,10 +17589,18 @@ |
| 17543 | 17589 | /* |
| 17544 | 17590 | ** Flags passed to the sqlite3ExprDup() function. See the header comment |
| 17545 | 17591 | ** above sqlite3ExprDup() for details. |
| 17546 | 17592 | */ |
| 17547 | 17593 | #define EXPRDUP_REDUCE 0x0001 /* Used reduced-size Expr nodes */ |
| 17594 | + |
| 17595 | +/* |
| 17596 | +** True if the expression passed as an argument was a function with |
| 17597 | +** an OVER() clause (a window function). |
| 17598 | +*/ |
| 17599 | +#define IsWindowFunc(p) ( \ |
| 17600 | + ExprHasProperty((p), EP_WinFunc) && p->y.pWin->eFrmType!=TK_FILTER \ |
| 17601 | +) |
| 17548 | 17602 | |
| 17549 | 17603 | /* |
| 17550 | 17604 | ** A list of expressions. Each expression may optionally have a |
| 17551 | 17605 | ** name. An expr/name combination can be used in several ways, such |
| 17552 | 17606 | ** as the list of "expr AS ID" fields following a "SELECT" or in the |
| | @@ -17566,15 +17620,16 @@ |
| 17566 | 17620 | int nExpr; /* Number of expressions on the list */ |
| 17567 | 17621 | struct ExprList_item { /* For each expression in the list */ |
| 17568 | 17622 | Expr *pExpr; /* The parse tree for this expression */ |
| 17569 | 17623 | char *zName; /* Token associated with this expression */ |
| 17570 | 17624 | char *zSpan; /* Original text of the expression */ |
| 17571 | | - u8 sortOrder; /* 1 for DESC or 0 for ASC */ |
| 17625 | + u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */ |
| 17572 | 17626 | unsigned done :1; /* A flag to indicate when processing is finished */ |
| 17573 | 17627 | unsigned bSpanIsTab :1; /* zSpan holds DB.TABLE.COLUMN */ |
| 17574 | 17628 | unsigned reusable :1; /* Constant expression is reusable */ |
| 17575 | 17629 | unsigned bSorterRef :1; /* Defer evaluation until after sorting */ |
| 17630 | + unsigned bNulls: 1; /* True if explicit "NULLS FIRST/LAST" */ |
| 17576 | 17631 | union { |
| 17577 | 17632 | struct { |
| 17578 | 17633 | u16 iOrderByCol; /* For ORDER BY, column number in result set */ |
| 17579 | 17634 | u16 iAlias; /* Index into Parse.aAlias[] for zName */ |
| 17580 | 17635 | } x; |
| | @@ -17861,10 +17916,11 @@ |
| 17861 | 17916 | #define SF_FixedLimit 0x04000 /* nSelectRow set by a constant LIMIT */ |
| 17862 | 17917 | #define SF_MaybeConvert 0x08000 /* Need convertCompoundSelectToSubquery() */ |
| 17863 | 17918 | #define SF_Converted 0x10000 /* By convertCompoundSelectToSubquery() */ |
| 17864 | 17919 | #define SF_IncludeHidden 0x20000 /* Include hidden columns in output */ |
| 17865 | 17920 | #define SF_ComplexResult 0x40000 /* Result contains subquery or function */ |
| 17921 | +#define SF_WhereBegin 0x80000 /* Really a WhereBegin() call. Debug Only */ |
| 17866 | 17922 | |
| 17867 | 17923 | /* |
| 17868 | 17924 | ** The results of a SELECT can be distributed in several ways, as defined |
| 17869 | 17925 | ** by one of the following macros. The "SRT" prefix means "SELECT Result |
| 17870 | 17926 | ** Type". |
| | @@ -18365,15 +18421,16 @@ |
| 18365 | 18421 | ** |
| 18366 | 18422 | ** This structure also contains some state information. |
| 18367 | 18423 | */ |
| 18368 | 18424 | struct Sqlite3Config { |
| 18369 | 18425 | int bMemstat; /* True to enable memory status */ |
| 18370 | | - int bCoreMutex; /* True to enable core mutexing */ |
| 18371 | | - int bFullMutex; /* True to enable full mutexing */ |
| 18372 | | - int bOpenUri; /* True to interpret filenames as URIs */ |
| 18373 | | - int bUseCis; /* Use covering indices for full-scans */ |
| 18374 | | - int bSmallMalloc; /* Avoid large memory allocations if true */ |
| 18426 | + u8 bCoreMutex; /* True to enable core mutexing */ |
| 18427 | + u8 bFullMutex; /* True to enable full mutexing */ |
| 18428 | + u8 bOpenUri; /* True to interpret filenames as URIs */ |
| 18429 | + u8 bUseCis; /* Use covering indices for full-scans */ |
| 18430 | + u8 bSmallMalloc; /* Avoid large memory allocations if true */ |
| 18431 | + u8 bExtraSchemaChecks; /* Verify type,name,tbl_name in schema */ |
| 18375 | 18432 | int mxStrlen; /* Maximum string length */ |
| 18376 | 18433 | int neverCorrupt; /* Database is always well-formed */ |
| 18377 | 18434 | int szLookaside; /* Default lookaside buffer size */ |
| 18378 | 18435 | int nLookaside; /* Default lookaside buffer count */ |
| 18379 | 18436 | int nStmtSpill; /* Stmt-journal spill-to-disk threshold */ |
| | @@ -18421,10 +18478,11 @@ |
| 18421 | 18478 | #endif |
| 18422 | 18479 | int bLocaltimeFault; /* True to fail localtime() calls */ |
| 18423 | 18480 | int bInternalFunctions; /* Internal SQL functions are visible */ |
| 18424 | 18481 | int iOnceResetThreshold; /* When to reset OP_Once counters */ |
| 18425 | 18482 | u32 szSorterRef; /* Min size in bytes to use sorter-refs */ |
| 18483 | + unsigned int iPrngSeed; /* Alternative fixed seed for the PRNG */ |
| 18426 | 18484 | }; |
| 18427 | 18485 | |
| 18428 | 18486 | /* |
| 18429 | 18487 | ** This macro is used inside of assert() statements to indicate that |
| 18430 | 18488 | ** the assert is only valid on a well-formed database. Instead of: |
| | @@ -18517,14 +18575,15 @@ |
| 18517 | 18575 | u8 bLine[100]; /* Draw vertical in column i if bLine[i] is true */ |
| 18518 | 18576 | }; |
| 18519 | 18577 | #endif /* SQLITE_DEBUG */ |
| 18520 | 18578 | |
| 18521 | 18579 | /* |
| 18522 | | -** This object is used in various ways, all related to window functions |
| 18580 | +** This object is used in various ways, most (but not all) related to window |
| 18581 | +** functions. |
| 18523 | 18582 | ** |
| 18524 | 18583 | ** (1) A single instance of this structure is attached to the |
| 18525 | | -** the Expr.pWin field for each window function in an expression tree. |
| 18584 | +** the Expr.y.pWin field for each window function in an expression tree. |
| 18526 | 18585 | ** This object holds the information contained in the OVER clause, |
| 18527 | 18586 | ** plus additional fields used during code generation. |
| 18528 | 18587 | ** |
| 18529 | 18588 | ** (2) All window functions in a single SELECT form a linked-list |
| 18530 | 18589 | ** attached to Select.pWin. The Window.pFunc and Window.pExpr |
| | @@ -18531,10 +18590,14 @@ |
| 18531 | 18590 | ** fields point back to the expression that is the window function. |
| 18532 | 18591 | ** |
| 18533 | 18592 | ** (3) The terms of the WINDOW clause of a SELECT are instances of this |
| 18534 | 18593 | ** object on a linked list attached to Select.pWinDefn. |
| 18535 | 18594 | ** |
| 18595 | +** (4) For an aggregate function with a FILTER clause, an instance |
| 18596 | +** of this object is stored in Expr.y.pWin with eFrmType set to |
| 18597 | +** TK_FILTER. In this case the only field used is Window.pFilter. |
| 18598 | +** |
| 18536 | 18599 | ** The uses (1) and (2) are really the same Window object that just happens |
| 18537 | 18600 | ** to be accessible in two different ways. Use case (3) are separate objects. |
| 18538 | 18601 | */ |
| 18539 | 18602 | struct Window { |
| 18540 | 18603 | char *zName; /* Name of window (may be NULL) */ |
| | @@ -18546,10 +18609,11 @@ |
| 18546 | 18609 | u8 eEnd; /* UNBOUNDED, CURRENT, PRECEDING or FOLLOWING */ |
| 18547 | 18610 | u8 bImplicitFrame; /* True if frame was implicitly specified */ |
| 18548 | 18611 | u8 eExclude; /* TK_NO, TK_CURRENT, TK_TIES, TK_GROUP, or 0 */ |
| 18549 | 18612 | Expr *pStart; /* Expression for "<expr> PRECEDING" */ |
| 18550 | 18613 | Expr *pEnd; /* Expression for "<expr> FOLLOWING" */ |
| 18614 | + Window **ppThis; /* Pointer to this object in Select.pWin list */ |
| 18551 | 18615 | Window *pNextWin; /* Next window function belonging to this SELECT */ |
| 18552 | 18616 | Expr *pFilter; /* The FILTER expression */ |
| 18553 | 18617 | FuncDef *pFunc; /* The function */ |
| 18554 | 18618 | int iEphCsr; /* Partition buffer or Peer buffer */ |
| 18555 | 18619 | int regAccum; |
| | @@ -18565,14 +18629,16 @@ |
| 18565 | 18629 | int regEndRowid; |
| 18566 | 18630 | }; |
| 18567 | 18631 | |
| 18568 | 18632 | #ifndef SQLITE_OMIT_WINDOWFUNC |
| 18569 | 18633 | SQLITE_PRIVATE void sqlite3WindowDelete(sqlite3*, Window*); |
| 18634 | +SQLITE_PRIVATE void sqlite3WindowUnlinkFromSelect(Window*); |
| 18570 | 18635 | SQLITE_PRIVATE void sqlite3WindowListDelete(sqlite3 *db, Window *p); |
| 18571 | 18636 | SQLITE_PRIVATE Window *sqlite3WindowAlloc(Parse*, int, int, Expr*, int , Expr*, u8); |
| 18572 | 18637 | SQLITE_PRIVATE void sqlite3WindowAttach(Parse*, Expr*, Window*); |
| 18573 | | -SQLITE_PRIVATE int sqlite3WindowCompare(Parse*, Window*, Window*); |
| 18638 | +SQLITE_PRIVATE void sqlite3WindowLink(Select *pSel, Window *pWin); |
| 18639 | +SQLITE_PRIVATE int sqlite3WindowCompare(Parse*, Window*, Window*, int); |
| 18574 | 18640 | SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse*, Window*); |
| 18575 | 18641 | SQLITE_PRIVATE void sqlite3WindowCodeStep(Parse*, Select*, WhereInfo*, int, int); |
| 18576 | 18642 | SQLITE_PRIVATE int sqlite3WindowRewrite(Parse*, Select*); |
| 18577 | 18643 | SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse*, struct SrcList_item*); |
| 18578 | 18644 | SQLITE_PRIVATE void sqlite3WindowUpdate(Parse*, Window*, Window*, FuncDef*); |
| | @@ -18840,11 +18906,11 @@ |
| 18840 | 18906 | SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse*, Expr*, u32); |
| 18841 | 18907 | SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3*, Expr*); |
| 18842 | 18908 | SQLITE_PRIVATE void sqlite3ExprUnmapAndDelete(Parse*, Expr*); |
| 18843 | 18909 | SQLITE_PRIVATE ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*); |
| 18844 | 18910 | SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector(Parse*,ExprList*,IdList*,Expr*); |
| 18845 | | -SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList*,int); |
| 18911 | +SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList*,int,int); |
| 18846 | 18912 | SQLITE_PRIVATE void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int); |
| 18847 | 18913 | SQLITE_PRIVATE void sqlite3ExprListSetSpan(Parse*,ExprList*,const char*,const char*); |
| 18848 | 18914 | SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3*, ExprList*); |
| 18849 | 18915 | SQLITE_PRIVATE u32 sqlite3ExprListFlags(const ExprList*); |
| 18850 | 18916 | SQLITE_PRIVATE int sqlite3IndexHasDuplicateRootPage(Index*); |
| | @@ -18859,12 +18925,12 @@ |
| 18859 | 18925 | SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3*,int); |
| 18860 | 18926 | SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3*); |
| 18861 | 18927 | SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3*); |
| 18862 | 18928 | SQLITE_PRIVATE void sqlite3DeleteColumnNames(sqlite3*,Table*); |
| 18863 | 18929 | SQLITE_PRIVATE int sqlite3ColumnsFromExprList(Parse*,ExprList*,i16*,Column**); |
| 18864 | | -SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation(Parse*,Table*,Select*); |
| 18865 | | -SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse*,Select*); |
| 18930 | +SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation(Parse*,Table*,Select*,char); |
| 18931 | +SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse*,Select*,char); |
| 18866 | 18932 | SQLITE_PRIVATE void sqlite3OpenMasterTable(Parse *, int); |
| 18867 | 18933 | SQLITE_PRIVATE Index *sqlite3PrimaryKeyIndex(Table*); |
| 18868 | 18934 | SQLITE_PRIVATE i16 sqlite3ColumnOfIndex(Index*, i16); |
| 18869 | 18935 | SQLITE_PRIVATE void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int); |
| 18870 | 18936 | #if SQLITE_ENABLE_HIDDEN_COLUMNS |
| | @@ -19161,11 +19227,11 @@ |
| 19161 | 19227 | SQLITE_PRIVATE LogEst sqlite3LogEstAdd(LogEst,LogEst); |
| 19162 | 19228 | #ifndef SQLITE_OMIT_VIRTUALTABLE |
| 19163 | 19229 | SQLITE_PRIVATE LogEst sqlite3LogEstFromDouble(double); |
| 19164 | 19230 | #endif |
| 19165 | 19231 | #if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ |
| 19166 | | - defined(SQLITE_ENABLE_STAT3_OR_STAT4) || \ |
| 19232 | + defined(SQLITE_ENABLE_STAT4) || \ |
| 19167 | 19233 | defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) |
| 19168 | 19234 | SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst); |
| 19169 | 19235 | #endif |
| 19170 | 19236 | SQLITE_PRIVATE VList *sqlite3VListAdd(sqlite3*,VList*,const char*,int,int); |
| 19171 | 19237 | SQLITE_PRIVATE const char *sqlite3VListNumToName(VList*,int); |
| | @@ -19227,13 +19293,14 @@ |
| 19227 | 19293 | SQLITE_PRIVATE CollSeq *sqlite3ExprNNCollSeq(Parse *pParse, Expr *pExpr); |
| 19228 | 19294 | SQLITE_PRIVATE int sqlite3ExprCollSeqMatch(Parse*,Expr*,Expr*); |
| 19229 | 19295 | SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken(Parse *pParse, Expr*, const Token*, int); |
| 19230 | 19296 | SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(Parse*,Expr*,const char*); |
| 19231 | 19297 | SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr*); |
| 19298 | +SQLITE_PRIVATE Expr *sqlite3ExprSkipCollateAndLikely(Expr*); |
| 19232 | 19299 | SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *, CollSeq *); |
| 19233 | 19300 | SQLITE_PRIVATE int sqlite3WritableSchema(sqlite3*); |
| 19234 | | -SQLITE_PRIVATE int sqlite3CheckObjectName(Parse *, const char *); |
| 19301 | +SQLITE_PRIVATE int sqlite3CheckObjectName(Parse*, const char*,const char*,const char*); |
| 19235 | 19302 | SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *, int); |
| 19236 | 19303 | SQLITE_PRIVATE int sqlite3AddInt64(i64*,i64); |
| 19237 | 19304 | SQLITE_PRIVATE int sqlite3SubInt64(i64*,i64); |
| 19238 | 19305 | SQLITE_PRIVATE int sqlite3MulInt64(i64*,i64); |
| 19239 | 19306 | SQLITE_PRIVATE int sqlite3AbsInt32(int); |
| | @@ -19316,10 +19383,11 @@ |
| 19316 | 19383 | SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoAlloc(sqlite3*,int,int); |
| 19317 | 19384 | SQLITE_PRIVATE void sqlite3KeyInfoUnref(KeyInfo*); |
| 19318 | 19385 | SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoRef(KeyInfo*); |
| 19319 | 19386 | SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse*, Index*); |
| 19320 | 19387 | SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoFromExprList(Parse*, ExprList*, int, int); |
| 19388 | +SQLITE_PRIVATE int sqlite3HasExplicitNulls(Parse*, ExprList*); |
| 19321 | 19389 | |
| 19322 | 19390 | #ifdef SQLITE_DEBUG |
| 19323 | 19391 | SQLITE_PRIVATE int sqlite3KeyInfoIsWriteable(KeyInfo*); |
| 19324 | 19392 | #endif |
| 19325 | 19393 | SQLITE_PRIVATE int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *, |
| | @@ -19348,12 +19416,11 @@ |
| 19348 | 19416 | SQLITE_PRIVATE int sqlite3ExprCheckIN(Parse*, Expr*); |
| 19349 | 19417 | #else |
| 19350 | 19418 | # define sqlite3ExprCheckIN(x,y) SQLITE_OK |
| 19351 | 19419 | #endif |
| 19352 | 19420 | |
| 19353 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 19354 | | -SQLITE_PRIVATE void sqlite3AnalyzeFunctions(void); |
| 19421 | +#ifdef SQLITE_ENABLE_STAT4 |
| 19355 | 19422 | SQLITE_PRIVATE int sqlite3Stat4ProbeSetValue( |
| 19356 | 19423 | Parse*,Index*,UnpackedRecord**,Expr*,int,int,int*); |
| 19357 | 19424 | SQLITE_PRIVATE int sqlite3Stat4ValueFromExpr(Parse*, Expr*, u8, sqlite3_value**); |
| 19358 | 19425 | SQLITE_PRIVATE void sqlite3Stat4ProbeFree(UnpackedRecord*); |
| 19359 | 19426 | SQLITE_PRIVATE int sqlite3Stat4Column(sqlite3*, const void*, int, int, sqlite3_value**); |
| | @@ -19396,10 +19463,11 @@ |
| 19396 | 19463 | # define sqlite3VtabRollback(X) |
| 19397 | 19464 | # define sqlite3VtabCommit(X) |
| 19398 | 19465 | # define sqlite3VtabInSync(db) 0 |
| 19399 | 19466 | # define sqlite3VtabLock(X) |
| 19400 | 19467 | # define sqlite3VtabUnlock(X) |
| 19468 | +# define sqlite3VtabModuleUnref(D,X) |
| 19401 | 19469 | # define sqlite3VtabUnlockList(X) |
| 19402 | 19470 | # define sqlite3VtabSavepoint(X, Y, Z) SQLITE_OK |
| 19403 | 19471 | # define sqlite3GetVTable(X,Y) ((VTable*)0) |
| 19404 | 19472 | #else |
| 19405 | 19473 | SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table*); |
| | @@ -19407,10 +19475,11 @@ |
| 19407 | 19475 | SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, Vdbe*); |
| 19408 | 19476 | SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3 *db); |
| 19409 | 19477 | SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3 *db); |
| 19410 | 19478 | SQLITE_PRIVATE void sqlite3VtabLock(VTable *); |
| 19411 | 19479 | SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *); |
| 19480 | +SQLITE_PRIVATE void sqlite3VtabModuleUnref(sqlite3*,Module*); |
| 19412 | 19481 | SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3*); |
| 19413 | 19482 | SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *, int, int); |
| 19414 | 19483 | SQLITE_PRIVATE void sqlite3VtabImportErrmsg(Vdbe*, sqlite3_vtab*); |
| 19415 | 19484 | SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3*, Table*); |
| 19416 | 19485 | SQLITE_PRIVATE Module *sqlite3VtabCreateModule( |
| | @@ -19874,10 +19943,11 @@ |
| 19874 | 19943 | 1, /* bCoreMutex */ |
| 19875 | 19944 | SQLITE_THREADSAFE==1, /* bFullMutex */ |
| 19876 | 19945 | SQLITE_USE_URI, /* bOpenUri */ |
| 19877 | 19946 | SQLITE_ALLOW_COVERING_INDEX_SCAN, /* bUseCis */ |
| 19878 | 19947 | 0, /* bSmallMalloc */ |
| 19948 | + 1, /* bExtraSchemaChecks */ |
| 19879 | 19949 | 0x7ffffffe, /* mxStrlen */ |
| 19880 | 19950 | 0, /* neverCorrupt */ |
| 19881 | 19951 | SQLITE_DEFAULT_LOOKASIDE, /* szLookaside, nLookaside */ |
| 19882 | 19952 | SQLITE_STMTJRNL_SPILL, /* nStmtSpill */ |
| 19883 | 19953 | {0,0,0,0,0,0,0,0}, /* m */ |
| | @@ -19920,10 +19990,11 @@ |
| 19920 | 19990 | #endif |
| 19921 | 19991 | 0, /* bLocaltimeFault */ |
| 19922 | 19992 | 0, /* bInternalFunctions */ |
| 19923 | 19993 | 0x7ffffffe, /* iOnceResetThreshold */ |
| 19924 | 19994 | SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ |
| 19995 | + 0, /* iPrngSeed */ |
| 19925 | 19996 | }; |
| 19926 | 19997 | |
| 19927 | 19998 | /* |
| 19928 | 19999 | ** Hash table for global functions - functions common to all |
| 19929 | 20000 | ** database connections. After initialization, this table is |
| | @@ -20489,11 +20560,10 @@ |
| 20489 | 20560 | void sqliteVdbePopStack(Vdbe*,int); |
| 20490 | 20561 | SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor**, int*); |
| 20491 | 20562 | SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor*); |
| 20492 | 20563 | SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32); |
| 20493 | 20564 | SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8); |
| 20494 | | -SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem*, int, u32*); |
| 20495 | 20565 | SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32); |
| 20496 | 20566 | SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); |
| 20497 | 20567 | SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int); |
| 20498 | 20568 | |
| 20499 | 20569 | int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *); |
| | @@ -22495,11 +22565,19 @@ |
| 22495 | 22565 | SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *pVfs, void *pHandle){ |
| 22496 | 22566 | pVfs->xDlClose(pVfs, pHandle); |
| 22497 | 22567 | } |
| 22498 | 22568 | #endif /* SQLITE_OMIT_LOAD_EXTENSION */ |
| 22499 | 22569 | SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ |
| 22500 | | - return pVfs->xRandomness(pVfs, nByte, zBufOut); |
| 22570 | + if( sqlite3Config.iPrngSeed ){ |
| 22571 | + memset(zBufOut, 0, nByte); |
| 22572 | + if( ALWAYS(nByte>(signed)sizeof(unsigned)) ) nByte = sizeof(unsigned int); |
| 22573 | + memcpy(zBufOut, &sqlite3Config.iPrngSeed, nByte); |
| 22574 | + return SQLITE_OK; |
| 22575 | + }else{ |
| 22576 | + return pVfs->xRandomness(pVfs, nByte, zBufOut); |
| 22577 | + } |
| 22578 | + |
| 22501 | 22579 | } |
| 22502 | 22580 | SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *pVfs, int nMicro){ |
| 22503 | 22581 | return pVfs->xSleep(pVfs, nMicro); |
| 22504 | 22582 | } |
| 22505 | 22583 | SQLITE_PRIVATE int sqlite3OsGetLastError(sqlite3_vfs *pVfs){ |
| | @@ -28776,17 +28854,21 @@ |
| 28776 | 28854 | sqlite3TreeViewWith(pView, p->pWith, 1); |
| 28777 | 28855 | cnt = 1; |
| 28778 | 28856 | sqlite3TreeViewPush(pView, 1); |
| 28779 | 28857 | } |
| 28780 | 28858 | do{ |
| 28781 | | - sqlite3TreeViewLine(pView, |
| 28782 | | - "SELECT%s%s (%u/%p) selFlags=0x%x nSelectRow=%d", |
| 28783 | | - ((p->selFlags & SF_Distinct) ? " DISTINCT" : ""), |
| 28784 | | - ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""), |
| 28785 | | - p->selId, p, p->selFlags, |
| 28786 | | - (int)p->nSelectRow |
| 28787 | | - ); |
| 28859 | + if( p->selFlags & SF_WhereBegin ){ |
| 28860 | + sqlite3TreeViewLine(pView, "sqlite3WhereBegin()"); |
| 28861 | + }else{ |
| 28862 | + sqlite3TreeViewLine(pView, |
| 28863 | + "SELECT%s%s (%u/%p) selFlags=0x%x nSelectRow=%d", |
| 28864 | + ((p->selFlags & SF_Distinct) ? " DISTINCT" : ""), |
| 28865 | + ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""), |
| 28866 | + p->selId, p, p->selFlags, |
| 28867 | + (int)p->nSelectRow |
| 28868 | + ); |
| 28869 | + } |
| 28788 | 28870 | if( cnt++ ) sqlite3TreeViewPop(pView); |
| 28789 | 28871 | if( p->pPrior ){ |
| 28790 | 28872 | n = 1000; |
| 28791 | 28873 | }else{ |
| 28792 | 28874 | n = 0; |
| | @@ -28799,11 +28881,14 @@ |
| 28799 | 28881 | #ifndef SQLITE_OMIT_WINDOWFUNC |
| 28800 | 28882 | if( p->pWin ) n++; |
| 28801 | 28883 | if( p->pWinDefn ) n++; |
| 28802 | 28884 | #endif |
| 28803 | 28885 | } |
| 28804 | | - sqlite3TreeViewExprList(pView, p->pEList, (n--)>0, "result-set"); |
| 28886 | + if( p->pEList ){ |
| 28887 | + sqlite3TreeViewExprList(pView, p->pEList, n>0, "result-set"); |
| 28888 | + } |
| 28889 | + n--; |
| 28805 | 28890 | #ifndef SQLITE_OMIT_WINDOWFUNC |
| 28806 | 28891 | if( p->pWin ){ |
| 28807 | 28892 | Window *pX; |
| 28808 | 28893 | pView = sqlite3TreeViewPush(pView, (n--)>0); |
| 28809 | 28894 | sqlite3TreeViewLine(pView, "window-functions"); |
| | @@ -28995,16 +29080,18 @@ |
| 28995 | 29080 | if( pExpr==0 ){ |
| 28996 | 29081 | sqlite3TreeViewLine(pView, "nil"); |
| 28997 | 29082 | sqlite3TreeViewPop(pView); |
| 28998 | 29083 | return; |
| 28999 | 29084 | } |
| 29000 | | - if( pExpr->flags ){ |
| 29085 | + if( pExpr->flags || pExpr->affExpr ){ |
| 29001 | 29086 | if( ExprHasProperty(pExpr, EP_FromJoin) ){ |
| 29002 | | - sqlite3_snprintf(sizeof(zFlgs),zFlgs," flags=0x%x iRJT=%d", |
| 29003 | | - pExpr->flags, pExpr->iRightJoinTable); |
| 29087 | + sqlite3_snprintf(sizeof(zFlgs),zFlgs," fg.af=%x.%c iRJT=%d", |
| 29088 | + pExpr->flags, pExpr->affExpr ? pExpr->affExpr : 'n', |
| 29089 | + pExpr->iRightJoinTable); |
| 29004 | 29090 | }else{ |
| 29005 | | - sqlite3_snprintf(sizeof(zFlgs),zFlgs," flags=0x%x",pExpr->flags); |
| 29091 | + sqlite3_snprintf(sizeof(zFlgs),zFlgs," fg.af=%x.%c", |
| 29092 | + pExpr->flags, pExpr->affExpr ? pExpr->affExpr : 'n'); |
| 29006 | 29093 | } |
| 29007 | 29094 | }else{ |
| 29008 | 29095 | zFlgs[0] = 0; |
| 29009 | 29096 | } |
| 29010 | 29097 | switch( pExpr->op ){ |
| | @@ -29148,14 +29235,14 @@ |
| 29148 | 29235 | #else |
| 29149 | 29236 | pWin = 0; |
| 29150 | 29237 | #endif |
| 29151 | 29238 | } |
| 29152 | 29239 | if( pExpr->op==TK_AGG_FUNCTION ){ |
| 29153 | | - sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q", |
| 29154 | | - pExpr->op2, pExpr->u.zToken); |
| 29240 | + sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q%s", |
| 29241 | + pExpr->op2, pExpr->u.zToken, zFlgs); |
| 29155 | 29242 | }else{ |
| 29156 | | - sqlite3TreeViewLine(pView, "FUNCTION %Q", pExpr->u.zToken); |
| 29243 | + sqlite3TreeViewLine(pView, "FUNCTION %Q%s", pExpr->u.zToken, zFlgs); |
| 29157 | 29244 | } |
| 29158 | 29245 | if( pFarg ){ |
| 29159 | 29246 | sqlite3TreeViewExprList(pView, pFarg, pWin!=0, 0); |
| 29160 | 29247 | } |
| 29161 | 29248 | #ifndef SQLITE_OMIT_WINDOWFUNC |
| | @@ -29228,11 +29315,11 @@ |
| 29228 | 29315 | break; |
| 29229 | 29316 | } |
| 29230 | 29317 | #ifndef SQLITE_OMIT_TRIGGER |
| 29231 | 29318 | case TK_RAISE: { |
| 29232 | 29319 | const char *zType = "unk"; |
| 29233 | | - switch( pExpr->affinity ){ |
| 29320 | + switch( pExpr->affExpr ){ |
| 29234 | 29321 | case OE_Rollback: zType = "rollback"; break; |
| 29235 | 29322 | case OE_Abort: zType = "abort"; break; |
| 29236 | 29323 | case OE_Fail: zType = "fail"; break; |
| 29237 | 29324 | case OE_Ignore: zType = "ignore"; break; |
| 29238 | 29325 | } |
| | @@ -29269,11 +29356,11 @@ |
| 29269 | 29356 | sqlite3TreeViewLine(pView, "%s%s", zBinOp, zFlgs); |
| 29270 | 29357 | sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); |
| 29271 | 29358 | sqlite3TreeViewExpr(pView, pExpr->pRight, 0); |
| 29272 | 29359 | }else if( zUniOp ){ |
| 29273 | 29360 | sqlite3TreeViewLine(pView, "%s%s", zUniOp, zFlgs); |
| 29274 | | - sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); |
| 29361 | + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); |
| 29275 | 29362 | } |
| 29276 | 29363 | sqlite3TreeViewPop(pView); |
| 29277 | 29364 | } |
| 29278 | 29365 | |
| 29279 | 29366 | |
| | @@ -31777,11 +31864,11 @@ |
| 31777 | 31864 | return e*10; |
| 31778 | 31865 | } |
| 31779 | 31866 | #endif /* SQLITE_OMIT_VIRTUALTABLE */ |
| 31780 | 31867 | |
| 31781 | 31868 | #if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ |
| 31782 | | - defined(SQLITE_ENABLE_STAT3_OR_STAT4) || \ |
| 31869 | + defined(SQLITE_ENABLE_STAT4) || \ |
| 31783 | 31870 | defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) |
| 31784 | 31871 | /* |
| 31785 | 31872 | ** Convert a LogEst into an integer. |
| 31786 | 31873 | ** |
| 31787 | 31874 | ** Note that this routine is only used when one or more of various |
| | @@ -31795,11 +31882,11 @@ |
| 31795 | 31882 | else if( n>=1 ) n -= 1; |
| 31796 | 31883 | #if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ |
| 31797 | 31884 | defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) |
| 31798 | 31885 | if( x>60 ) return (u64)LARGEST_INT64; |
| 31799 | 31886 | #else |
| 31800 | | - /* If only SQLITE_ENABLE_STAT3_OR_STAT4 is on, then the largest input |
| 31887 | + /* If only SQLITE_ENABLE_STAT4 is on, then the largest input |
| 31801 | 31888 | ** possible to this routine is 310, resulting in a maximum x of 31 */ |
| 31802 | 31889 | assert( x<=60 ); |
| 31803 | 31890 | #endif |
| 31804 | 31891 | return x>=3 ? (n+8)<<(x-3) : (n+8)>>(3-x); |
| 31805 | 31892 | } |
| | @@ -32288,28 +32375,28 @@ |
| 32288 | 32375 | /* 91 */ "Affinity" OpHelp("affinity(r[P1@P2])"), |
| 32289 | 32376 | /* 92 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), |
| 32290 | 32377 | /* 93 */ "Count" OpHelp("r[P2]=count()"), |
| 32291 | 32378 | /* 94 */ "ReadCookie" OpHelp(""), |
| 32292 | 32379 | /* 95 */ "SetCookie" OpHelp(""), |
| 32293 | | - /* 96 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), |
| 32294 | | - /* 97 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), |
| 32295 | | - /* 98 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<<r[P1]"), |
| 32296 | | - /* 99 */ "ShiftRight" OpHelp("r[P3]=r[P2]>>r[P1]"), |
| 32297 | | - /* 100 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"), |
| 32298 | | - /* 101 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"), |
| 32299 | | - /* 102 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"), |
| 32300 | | - /* 103 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"), |
| 32301 | | - /* 104 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"), |
| 32302 | | - /* 105 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"), |
| 32303 | | - /* 106 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), |
| 32304 | | - /* 107 */ "BitNot" OpHelp("r[P2]= ~r[P1]"), |
| 32305 | | - /* 108 */ "OpenRead" OpHelp("root=P2 iDb=P3"), |
| 32306 | | - /* 109 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), |
| 32307 | | - /* 110 */ "String8" OpHelp("r[P2]='P4'"), |
| 32308 | | - /* 111 */ "OpenDup" OpHelp(""), |
| 32309 | | - /* 112 */ "OpenAutoindex" OpHelp("nColumn=P2"), |
| 32310 | | - /* 113 */ "OpenEphemeral" OpHelp("nColumn=P2"), |
| 32380 | + /* 96 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), |
| 32381 | + /* 97 */ "OpenRead" OpHelp("root=P2 iDb=P3"), |
| 32382 | + /* 98 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), |
| 32383 | + /* 99 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), |
| 32384 | + /* 100 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), |
| 32385 | + /* 101 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<<r[P1]"), |
| 32386 | + /* 102 */ "ShiftRight" OpHelp("r[P3]=r[P2]>>r[P1]"), |
| 32387 | + /* 103 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"), |
| 32388 | + /* 104 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"), |
| 32389 | + /* 105 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"), |
| 32390 | + /* 106 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"), |
| 32391 | + /* 107 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"), |
| 32392 | + /* 108 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"), |
| 32393 | + /* 109 */ "OpenDup" OpHelp(""), |
| 32394 | + /* 110 */ "BitNot" OpHelp("r[P2]= ~r[P1]"), |
| 32395 | + /* 111 */ "OpenAutoindex" OpHelp("nColumn=P2"), |
| 32396 | + /* 112 */ "OpenEphemeral" OpHelp("nColumn=P2"), |
| 32397 | + /* 113 */ "String8" OpHelp("r[P2]='P4'"), |
| 32311 | 32398 | /* 114 */ "SorterOpen" OpHelp(""), |
| 32312 | 32399 | /* 115 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"), |
| 32313 | 32400 | /* 116 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"), |
| 32314 | 32401 | /* 117 */ "Close" OpHelp(""), |
| 32315 | 32402 | /* 118 */ "ColumnsUsed" OpHelp(""), |
| | @@ -32337,14 +32424,14 @@ |
| 32337 | 32424 | /* 140 */ "SqlExec" OpHelp(""), |
| 32338 | 32425 | /* 141 */ "ParseSchema" OpHelp(""), |
| 32339 | 32426 | /* 142 */ "LoadAnalysis" OpHelp(""), |
| 32340 | 32427 | /* 143 */ "DropTable" OpHelp(""), |
| 32341 | 32428 | /* 144 */ "DropIndex" OpHelp(""), |
| 32342 | | - /* 145 */ "Real" OpHelp("r[P2]=P4"), |
| 32343 | | - /* 146 */ "DropTrigger" OpHelp(""), |
| 32344 | | - /* 147 */ "IntegrityCk" OpHelp(""), |
| 32345 | | - /* 148 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), |
| 32429 | + /* 145 */ "DropTrigger" OpHelp(""), |
| 32430 | + /* 146 */ "IntegrityCk" OpHelp(""), |
| 32431 | + /* 147 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), |
| 32432 | + /* 148 */ "Real" OpHelp("r[P2]=P4"), |
| 32346 | 32433 | /* 149 */ "Param" OpHelp(""), |
| 32347 | 32434 | /* 150 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), |
| 32348 | 32435 | /* 151 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), |
| 32349 | 32436 | /* 152 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), |
| 32350 | 32437 | /* 153 */ "AggInverse" OpHelp("accum=r[P3] inverse(r[P2@P5])"), |
| | @@ -33093,17 +33180,18 @@ |
| 33093 | 33180 | #define osLstat ((int(*)(const char*,struct stat*))aSyscall[27].pCurrent) |
| 33094 | 33181 | |
| 33095 | 33182 | #if defined(__linux__) && defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) |
| 33096 | 33183 | # ifdef __ANDROID__ |
| 33097 | 33184 | { "ioctl", (sqlite3_syscall_ptr)(int(*)(int, int, ...))ioctl, 0 }, |
| 33185 | +#define osIoctl ((int(*)(int,int,...))aSyscall[28].pCurrent) |
| 33098 | 33186 | # else |
| 33099 | 33187 | { "ioctl", (sqlite3_syscall_ptr)ioctl, 0 }, |
| 33188 | +#define osIoctl ((int(*)(int,unsigned long,...))aSyscall[28].pCurrent) |
| 33100 | 33189 | # endif |
| 33101 | 33190 | #else |
| 33102 | 33191 | { "ioctl", (sqlite3_syscall_ptr)0, 0 }, |
| 33103 | 33192 | #endif |
| 33104 | | -#define osIoctl ((int(*)(int,int,...))aSyscall[28].pCurrent) |
| 33105 | 33193 | |
| 33106 | 33194 | }; /* End of the overrideable system calls */ |
| 33107 | 33195 | |
| 33108 | 33196 | |
| 33109 | 33197 | /* |
| | @@ -38341,10 +38429,11 @@ |
| 38341 | 38429 | } |
| 38342 | 38430 | if( pInode ){ |
| 38343 | 38431 | UnixUnusedFd **pp; |
| 38344 | 38432 | assert( sqlite3_mutex_notheld(pInode->pLockMutex) ); |
| 38345 | 38433 | sqlite3_mutex_enter(pInode->pLockMutex); |
| 38434 | + flags &= (SQLITE_OPEN_READONLY|SQLITE_OPEN_READWRITE); |
| 38346 | 38435 | for(pp=&pInode->pUnused; *pp && (*pp)->flags!=flags; pp=&((*pp)->pNext)); |
| 38347 | 38436 | pUnused = *pp; |
| 38348 | 38437 | if( pUnused ){ |
| 38349 | 38438 | *pp = pUnused->pNext; |
| 38350 | 38439 | } |
| | @@ -38644,11 +38733,12 @@ |
| 38644 | 38733 | *pOutFlags = flags; |
| 38645 | 38734 | } |
| 38646 | 38735 | |
| 38647 | 38736 | if( p->pPreallocatedUnused ){ |
| 38648 | 38737 | p->pPreallocatedUnused->fd = fd; |
| 38649 | | - p->pPreallocatedUnused->flags = flags; |
| 38738 | + p->pPreallocatedUnused->flags = |
| 38739 | + flags & (SQLITE_OPEN_READONLY|SQLITE_OPEN_READWRITE); |
| 38650 | 38740 | } |
| 38651 | 38741 | |
| 38652 | 38742 | if( isDelete ){ |
| 38653 | 38743 | #if OS_VXWORKS |
| 38654 | 38744 | zPath = zName; |
| | @@ -40175,11 +40265,11 @@ |
| 40175 | 40265 | } |
| 40176 | 40266 | default: { |
| 40177 | 40267 | assert( 0 ); /* The call assures that only valid opcodes are sent */ |
| 40178 | 40268 | } |
| 40179 | 40269 | } |
| 40180 | | - /*NOTREACHED*/ |
| 40270 | + /*NOTREACHED*/ assert(0); |
| 40181 | 40271 | return SQLITE_ERROR; |
| 40182 | 40272 | } |
| 40183 | 40273 | |
| 40184 | 40274 | /* |
| 40185 | 40275 | ** Within this division (the proxying locking implementation) the procedures |
| | @@ -44860,10 +44950,11 @@ |
| 44860 | 44950 | |
| 44861 | 44951 | if( !pShm ){ |
| 44862 | 44952 | rc = winOpenSharedMemory(pDbFd); |
| 44863 | 44953 | if( rc!=SQLITE_OK ) return rc; |
| 44864 | 44954 | pShm = pDbFd->pShm; |
| 44955 | + assert( pShm!=0 ); |
| 44865 | 44956 | } |
| 44866 | 44957 | pShmNode = pShm->pShmNode; |
| 44867 | 44958 | |
| 44868 | 44959 | sqlite3_mutex_enter(pShmNode->mutex); |
| 44869 | 44960 | if( pShmNode->isUnlocked ){ |
| | @@ -45162,10 +45253,11 @@ |
| 45162 | 45253 | osGetCurrentProcessId(), pFd, sqlite3ErrName(rc))); |
| 45163 | 45254 | return rc; |
| 45164 | 45255 | } |
| 45165 | 45256 | } |
| 45166 | 45257 | if( pFd->mmapSize >= iOff+nAmt ){ |
| 45258 | + assert( pFd->pMapRegion!=0 ); |
| 45167 | 45259 | *pp = &((u8 *)pFd->pMapRegion)[iOff]; |
| 45168 | 45260 | pFd->nFetchOut++; |
| 45169 | 45261 | } |
| 45170 | 45262 | } |
| 45171 | 45263 | #endif |
| | @@ -48083,10 +48175,11 @@ |
| 48083 | 48175 | if( sqlite3GlobalConfig.pcache2.xInit==0 ){ |
| 48084 | 48176 | /* IMPLEMENTATION-OF: R-26801-64137 If the xInit() method is NULL, then the |
| 48085 | 48177 | ** built-in default page cache is used instead of the application defined |
| 48086 | 48178 | ** page cache. */ |
| 48087 | 48179 | sqlite3PCacheSetDefault(); |
| 48180 | + assert( sqlite3GlobalConfig.pcache2.xInit!=0 ); |
| 48088 | 48181 | } |
| 48089 | 48182 | return sqlite3GlobalConfig.pcache2.xInit(sqlite3GlobalConfig.pcache2.pArg); |
| 48090 | 48183 | } |
| 48091 | 48184 | SQLITE_PRIVATE void sqlite3PcacheShutdown(void){ |
| 48092 | 48185 | if( sqlite3GlobalConfig.pcache2.xShutdown ){ |
| | @@ -49129,10 +49222,11 @@ |
| 49129 | 49222 | PgHdr1 *p = 0; |
| 49130 | 49223 | void *pPg; |
| 49131 | 49224 | |
| 49132 | 49225 | assert( sqlite3_mutex_held(pCache->pGroup->mutex) ); |
| 49133 | 49226 | if( pCache->pFree || (pCache->nPage==0 && pcache1InitBulk(pCache)) ){ |
| 49227 | + assert( pCache->pFree!=0 ); |
| 49134 | 49228 | p = pCache->pFree; |
| 49135 | 49229 | pCache->pFree = p->pNext; |
| 49136 | 49230 | p->pNext = 0; |
| 49137 | 49231 | }else{ |
| 49138 | 49232 | #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT |
| | @@ -61855,10 +61949,11 @@ |
| 61855 | 61949 | while( iOffset<w.iSyncPoint ){ |
| 61856 | 61950 | rc = walWriteOneFrame(&w, pLast, nTruncate, iOffset); |
| 61857 | 61951 | if( rc ) return rc; |
| 61858 | 61952 | iOffset += szFrame; |
| 61859 | 61953 | nExtra++; |
| 61954 | + assert( pLast!=0 ); |
| 61860 | 61955 | } |
| 61861 | 61956 | } |
| 61862 | 61957 | if( bSync ){ |
| 61863 | 61958 | assert( rc==SQLITE_OK ); |
| 61864 | 61959 | rc = sqlite3OsSync(w.pFd, WAL_SYNC_FLAGS(sync_flags)); |
| | @@ -61887,10 +61982,11 @@ |
| 61887 | 61982 | for(p=pList; p && rc==SQLITE_OK; p=p->pDirty){ |
| 61888 | 61983 | if( (p->flags & PGHDR_WAL_APPEND)==0 ) continue; |
| 61889 | 61984 | iFrame++; |
| 61890 | 61985 | rc = walIndexAppend(pWal, iFrame, p->pgno); |
| 61891 | 61986 | } |
| 61987 | + assert( pLast!=0 || nExtra==0 ); |
| 61892 | 61988 | while( rc==SQLITE_OK && nExtra>0 ){ |
| 61893 | 61989 | iFrame++; |
| 61894 | 61990 | nExtra--; |
| 61895 | 61991 | rc = walIndexAppend(pWal, iFrame, pLast->pgno); |
| 61896 | 61992 | } |
| | @@ -64898,13 +64994,16 @@ |
| 64898 | 64994 | testcase( gap+1==top ); |
| 64899 | 64995 | testcase( gap==top ); |
| 64900 | 64996 | if( (data[hdr+2] || data[hdr+1]) && gap+2<=top ){ |
| 64901 | 64997 | u8 *pSpace = pageFindSlot(pPage, nByte, &rc); |
| 64902 | 64998 | if( pSpace ){ |
| 64903 | | - assert( pSpace>=data && (pSpace - data)<65536 ); |
| 64904 | | - *pIdx = (int)(pSpace - data); |
| 64905 | | - return SQLITE_OK; |
| 64999 | + assert( pSpace+nByte<=data+pPage->pBt->usableSize ); |
| 65000 | + if( (*pIdx = (int)(pSpace-data))<=gap ){ |
| 65001 | + return SQLITE_CORRUPT_PAGE(pPage); |
| 65002 | + }else{ |
| 65003 | + return SQLITE_OK; |
| 65004 | + } |
| 64906 | 65005 | }else if( rc ){ |
| 64907 | 65006 | return rc; |
| 64908 | 65007 | } |
| 64909 | 65008 | } |
| 64910 | 65009 | |
| | @@ -68127,10 +68226,11 @@ |
| 68127 | 68226 | u8 aSave[4]; |
| 68128 | 68227 | u8 *aWrite = &pBuf[-4]; |
| 68129 | 68228 | assert( aWrite>=pBufStart ); /* due to (6) */ |
| 68130 | 68229 | memcpy(aSave, aWrite, 4); |
| 68131 | 68230 | rc = sqlite3OsRead(fd, aWrite, a+4, (i64)pBt->pageSize*(nextPage-1)); |
| 68231 | + if( rc && nextPage>pBt->nPage ) rc = SQLITE_CORRUPT_BKPT; |
| 68132 | 68232 | nextPage = get4byte(aWrite); |
| 68133 | 68233 | memcpy(aWrite, aSave, 4); |
| 68134 | 68234 | }else |
| 68135 | 68235 | #endif |
| 68136 | 68236 | |
| | @@ -69915,16 +70015,11 @@ |
| 69915 | 70015 | assert( MX_CELL(pPage->pBt)<=10921 ); |
| 69916 | 70016 | assert( pPage->nCell<=MX_CELL(pPage->pBt) || CORRUPT_DB ); |
| 69917 | 70017 | assert( pPage->nOverflow<=ArraySize(pPage->apOvfl) ); |
| 69918 | 70018 | assert( ArraySize(pPage->apOvfl)==ArraySize(pPage->aiOvfl) ); |
| 69919 | 70019 | assert( sqlite3_mutex_held(pPage->pBt->mutex) ); |
| 69920 | | - /* The cell should normally be sized correctly. However, when moving a |
| 69921 | | - ** malformed cell from a leaf page to an interior page, if the cell size |
| 69922 | | - ** wanted to be less than 4 but got rounded up to 4 on the leaf, then size |
| 69923 | | - ** might be less than 8 (leaf-size + pointer) on the interior node. Hence |
| 69924 | | - ** the term after the || in the following assert(). */ |
| 69925 | | - assert( sz==pPage->xCellSize(pPage, pCell) || (sz==8 && iChild>0) ); |
| 70020 | + assert( sz==pPage->xCellSize(pPage, pCell) || CORRUPT_DB ); |
| 69926 | 70021 | assert( pPage->nFree>=0 ); |
| 69927 | 70022 | if( pPage->nOverflow || sz+2>pPage->nFree ){ |
| 69928 | 70023 | if( pTemp ){ |
| 69929 | 70024 | memcpy(pTemp, pCell, sz); |
| 69930 | 70025 | pCell = pTemp; |
| | @@ -70152,11 +70247,11 @@ |
| 70152 | 70247 | int k; /* Current slot in pCArray->apEnd[] */ |
| 70153 | 70248 | u8 *pSrcEnd; /* Current pCArray->apEnd[k] value */ |
| 70154 | 70249 | |
| 70155 | 70250 | assert( i<iEnd ); |
| 70156 | 70251 | j = get2byte(&aData[hdr+5]); |
| 70157 | | - if( NEVER(j>(u32)usableSize) ){ j = 0; } |
| 70252 | + if( j>(u32)usableSize ){ j = 0; } |
| 70158 | 70253 | memcpy(&pTmp[j], &aData[j], usableSize - j); |
| 70159 | 70254 | |
| 70160 | 70255 | for(k=0; pCArray->ixNx[k]<=i && ALWAYS(k<NB*2); k++){} |
| 70161 | 70256 | pSrcEnd = pCArray->apEnd[k]; |
| 70162 | 70257 | |
| | @@ -70244,11 +70339,12 @@ |
| 70244 | 70339 | for(k=0; pCArray->ixNx[k]<=i && ALWAYS(k<NB*2); k++){} |
| 70245 | 70340 | pEnd = pCArray->apEnd[k]; |
| 70246 | 70341 | while( 1 /*Exit by break*/ ){ |
| 70247 | 70342 | int sz, rc; |
| 70248 | 70343 | u8 *pSlot; |
| 70249 | | - sz = cachedCellSize(pCArray, i); |
| 70344 | + assert( pCArray->szCell[i]!=0 ); |
| 70345 | + sz = pCArray->szCell[i]; |
| 70250 | 70346 | if( (aData[1]==0 && aData[2]==0) || (pSlot = pageFindSlot(pPg,sz,&rc))==0 ){ |
| 70251 | 70347 | if( (pData - pBegin)<sz ) return 1; |
| 70252 | 70348 | pData -= sz; |
| 70253 | 70349 | pSlot = pData; |
| 70254 | 70350 | } |
| | @@ -70405,10 +70501,11 @@ |
| 70405 | 70501 | pCellptr = &pPg->aCellIdx[iCell * 2]; |
| 70406 | 70502 | if( nCell>iCell ){ |
| 70407 | 70503 | memmove(&pCellptr[2], pCellptr, (nCell - iCell) * 2); |
| 70408 | 70504 | } |
| 70409 | 70505 | nCell++; |
| 70506 | + cachedCellSize(pCArray, iCell+iNew); |
| 70410 | 70507 | if( pageInsertArray( |
| 70411 | 70508 | pPg, pBegin, &pData, pCellptr, |
| 70412 | 70509 | iCell+iNew, 1, pCArray |
| 70413 | 70510 | ) ) goto editpage_fail; |
| 70414 | 70511 | } |
| | @@ -70927,11 +71024,11 @@ |
| 70927 | 71024 | ** long be able to find the cells if a pointer to each cell is not saved |
| 70928 | 71025 | ** first. |
| 70929 | 71026 | */ |
| 70930 | 71027 | memset(&b.szCell[b.nCell], 0, sizeof(b.szCell[0])*(limit+pOld->nOverflow)); |
| 70931 | 71028 | if( pOld->nOverflow>0 ){ |
| 70932 | | - if( limit<pOld->aiOvfl[0] ){ |
| 71029 | + if( NEVER(limit<pOld->aiOvfl[0]) ){ |
| 70933 | 71030 | rc = SQLITE_CORRUPT_BKPT; |
| 70934 | 71031 | goto balance_cleanup; |
| 70935 | 71032 | } |
| 70936 | 71033 | limit = pOld->aiOvfl[0]; |
| 70937 | 71034 | for(j=0; j<limit; j++){ |
| | @@ -71213,10 +71310,12 @@ |
| 71213 | 71310 | nNew>=5 ? apNew[4]->pgno : 0, nNew>=5 ? szNew[4] : 0, |
| 71214 | 71311 | nNew>=5 ? cntNew[4] - cntNew[3] - !leafData : 0 |
| 71215 | 71312 | )); |
| 71216 | 71313 | |
| 71217 | 71314 | assert( sqlite3PagerIswriteable(pParent->pDbPage) ); |
| 71315 | + assert( nNew>=1 && nNew<=ArraySize(apNew) ); |
| 71316 | + assert( apNew[nNew-1]!=0 ); |
| 71218 | 71317 | put4byte(pRight, apNew[nNew-1]->pgno); |
| 71219 | 71318 | |
| 71220 | 71319 | /* If the sibling pages are not leaves, ensure that the right-child pointer |
| 71221 | 71320 | ** of the right-most new sibling page is set to the value that was |
| 71222 | 71321 | ** originally in the same field of the right-most old sibling page. */ |
| | @@ -71558,15 +71657,17 @@ |
| 71558 | 71657 | |
| 71559 | 71658 | VVA_ONLY( int balance_quick_called = 0 ); |
| 71560 | 71659 | VVA_ONLY( int balance_deeper_called = 0 ); |
| 71561 | 71660 | |
| 71562 | 71661 | do { |
| 71563 | | - int iPage = pCur->iPage; |
| 71662 | + int iPage; |
| 71564 | 71663 | MemPage *pPage = pCur->pPage; |
| 71565 | 71664 | |
| 71566 | 71665 | if( NEVER(pPage->nFree<0) && btreeComputeFreeSpace(pPage) ) break; |
| 71567 | | - if( iPage==0 ){ |
| 71666 | + if( pPage->nOverflow==0 && pPage->nFree<=nMin ){ |
| 71667 | + break; |
| 71668 | + }else if( (iPage = pCur->iPage)==0 ){ |
| 71568 | 71669 | if( pPage->nOverflow ){ |
| 71569 | 71670 | /* The root page of the b-tree is overfull. In this case call the |
| 71570 | 71671 | ** balance_deeper() function to create a new child for the root-page |
| 71571 | 71672 | ** and copy the current contents of the root-page to it. The |
| 71572 | 71673 | ** next iteration of the do-loop will balance the child page. |
| | @@ -71583,12 +71684,10 @@ |
| 71583 | 71684 | assert( pCur->pPage->nOverflow ); |
| 71584 | 71685 | } |
| 71585 | 71686 | }else{ |
| 71586 | 71687 | break; |
| 71587 | 71688 | } |
| 71588 | | - }else if( pPage->nOverflow==0 && pPage->nFree<=nMin ){ |
| 71589 | | - break; |
| 71590 | 71689 | }else{ |
| 71591 | 71690 | MemPage * const pParent = pCur->apPage[iPage-1]; |
| 71592 | 71691 | int const iIdx = pCur->aiIdx[iPage-1]; |
| 71593 | 71692 | |
| 71594 | 71693 | rc = sqlite3PagerWrite(pParent->pDbPage); |
| | @@ -71726,11 +71825,13 @@ |
| 71726 | 71825 | MemPage *pPage = pCur->pPage; /* Page being written */ |
| 71727 | 71826 | BtShared *pBt; /* Btree */ |
| 71728 | 71827 | Pgno ovflPgno; /* Next overflow page to write */ |
| 71729 | 71828 | u32 ovflPageSize; /* Size to write on overflow page */ |
| 71730 | 71829 | |
| 71731 | | - if( pCur->info.pPayload + pCur->info.nLocal > pPage->aDataEnd ){ |
| 71830 | + if( pCur->info.pPayload + pCur->info.nLocal > pPage->aDataEnd |
| 71831 | + || pCur->info.pPayload < pPage->aData + pPage->cellOffset |
| 71832 | + ){ |
| 71732 | 71833 | return SQLITE_CORRUPT_BKPT; |
| 71733 | 71834 | } |
| 71734 | 71835 | /* Overwrite the local portion first */ |
| 71735 | 71836 | rc = btreeOverwriteContent(pPage, pCur->info.pPayload, pX, |
| 71736 | 71837 | 0, pCur->info.nLocal); |
| | @@ -71967,10 +72068,12 @@ |
| 71967 | 72068 | oldCell = findCell(pPage, idx); |
| 71968 | 72069 | if( !pPage->leaf ){ |
| 71969 | 72070 | memcpy(newCell, oldCell, 4); |
| 71970 | 72071 | } |
| 71971 | 72072 | rc = clearCell(pPage, oldCell, &info); |
| 72073 | + testcase( pCur->curFlags & BTCF_ValidOvfl ); |
| 72074 | + invalidateOverflowCache(pCur); |
| 71972 | 72075 | if( info.nSize==szNew && info.nLocal==info.nPayload |
| 71973 | 72076 | && (!ISAUTOVACUUM || szNew<pPage->minLocal) |
| 71974 | 72077 | ){ |
| 71975 | 72078 | /* Overwrite the old cell with the new if they are the same size. |
| 71976 | 72079 | ** We could also try to do this if the old cell is smaller, then add |
| | @@ -71980,11 +72083,16 @@ |
| 71980 | 72083 | ** |
| 71981 | 72084 | ** This optimization cannot be used on an autovacuum database if the |
| 71982 | 72085 | ** new entry uses overflow pages, as the insertCell() call below is |
| 71983 | 72086 | ** necessary to add the PTRMAP_OVERFLOW1 pointer-map entry. */ |
| 71984 | 72087 | assert( rc==SQLITE_OK ); /* clearCell never fails when nLocal==nPayload */ |
| 71985 | | - if( oldCell+szNew > pPage->aDataEnd ) return SQLITE_CORRUPT_BKPT; |
| 72088 | + if( oldCell < pPage->aData+pPage->hdrOffset+10 ){ |
| 72089 | + return SQLITE_CORRUPT_BKPT; |
| 72090 | + } |
| 72091 | + if( oldCell+szNew > pPage->aDataEnd ){ |
| 72092 | + return SQLITE_CORRUPT_BKPT; |
| 72093 | + } |
| 71986 | 72094 | memcpy(oldCell, newCell, szNew); |
| 71987 | 72095 | return SQLITE_OK; |
| 71988 | 72096 | } |
| 71989 | 72097 | dropCell(pPage, idx, info.nSize, &rc); |
| 71990 | 72098 | if( rc ) goto end_insert; |
| | @@ -74317,12 +74425,14 @@ |
| 74317 | 74425 | if( p->pDestDb ){ |
| 74318 | 74426 | p->pSrc->nBackup--; |
| 74319 | 74427 | } |
| 74320 | 74428 | if( p->isAttached ){ |
| 74321 | 74429 | pp = sqlite3PagerBackupPtr(sqlite3BtreePager(p->pSrc)); |
| 74430 | + assert( pp!=0 ); |
| 74322 | 74431 | while( *pp!=p ){ |
| 74323 | 74432 | pp = &(*pp)->pNext; |
| 74433 | + assert( pp!=0 ); |
| 74324 | 74434 | } |
| 74325 | 74435 | *pp = p->pNext; |
| 74326 | 74436 | } |
| 74327 | 74437 | |
| 74328 | 74438 | /* If a transaction is still open on the Btree, roll it back. */ |
| | @@ -75804,11 +75914,11 @@ |
| 75804 | 75914 | ** already been allocated, allocate the UnpackedRecord structure that |
| 75805 | 75915 | ** that function will return to its caller here. Then return a pointer to |
| 75806 | 75916 | ** an sqlite3_value within the UnpackedRecord.a[] array. |
| 75807 | 75917 | */ |
| 75808 | 75918 | static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ |
| 75809 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 75919 | +#ifdef SQLITE_ENABLE_STAT4 |
| 75810 | 75920 | if( p ){ |
| 75811 | 75921 | UnpackedRecord *pRec = p->ppRec[0]; |
| 75812 | 75922 | |
| 75813 | 75923 | if( pRec==0 ){ |
| 75814 | 75924 | Index *pIdx = p->pIdx; /* Index being probed */ |
| | @@ -75840,11 +75950,11 @@ |
| 75840 | 75950 | pRec->nField = p->iVal+1; |
| 75841 | 75951 | return &pRec->aMem[p->iVal]; |
| 75842 | 75952 | } |
| 75843 | 75953 | #else |
| 75844 | 75954 | UNUSED_PARAMETER(p); |
| 75845 | | -#endif /* defined(SQLITE_ENABLE_STAT3_OR_STAT4) */ |
| 75955 | +#endif /* defined(SQLITE_ENABLE_STAT4) */ |
| 75846 | 75956 | return sqlite3ValueNew(db); |
| 75847 | 75957 | } |
| 75848 | 75958 | |
| 75849 | 75959 | /* |
| 75850 | 75960 | ** The expression object indicated by the second argument is guaranteed |
| | @@ -75864,11 +75974,11 @@ |
| 75864 | 75974 | ** |
| 75865 | 75975 | ** If the conditions above are not met, this function returns SQLITE_OK |
| 75866 | 75976 | ** and sets (*ppVal) to NULL. Or, if an error occurs, (*ppVal) is set to |
| 75867 | 75977 | ** NULL and an SQLite error code returned. |
| 75868 | 75978 | */ |
| 75869 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 75979 | +#ifdef SQLITE_ENABLE_STAT4 |
| 75870 | 75980 | static int valueFromFunction( |
| 75871 | 75981 | sqlite3 *db, /* The database connection */ |
| 75872 | 75982 | Expr *p, /* The expression to evaluate */ |
| 75873 | 75983 | u8 enc, /* Encoding to use */ |
| 75874 | 75984 | u8 aff, /* Affinity to use */ |
| | @@ -75947,11 +76057,11 @@ |
| 75947 | 76057 | *ppVal = pVal; |
| 75948 | 76058 | return rc; |
| 75949 | 76059 | } |
| 75950 | 76060 | #else |
| 75951 | 76061 | # define valueFromFunction(a,b,c,d,e,f) SQLITE_OK |
| 75952 | | -#endif /* defined(SQLITE_ENABLE_STAT3_OR_STAT4) */ |
| 76062 | +#endif /* defined(SQLITE_ENABLE_STAT4) */ |
| 75953 | 76063 | |
| 75954 | 76064 | /* |
| 75955 | 76065 | ** Extract a value from the supplied expression in the manner described |
| 75956 | 76066 | ** above sqlite3ValueFromExpr(). Allocate the sqlite3_value object |
| 75957 | 76067 | ** using valueNew(). |
| | @@ -75976,11 +76086,11 @@ |
| 75976 | 76086 | const char *zNeg = ""; |
| 75977 | 76087 | int rc = SQLITE_OK; |
| 75978 | 76088 | |
| 75979 | 76089 | assert( pExpr!=0 ); |
| 75980 | 76090 | while( (op = pExpr->op)==TK_UPLUS || op==TK_SPAN ) pExpr = pExpr->pLeft; |
| 75981 | | -#if defined(SQLITE_ENABLE_STAT3_OR_STAT4) |
| 76091 | +#if defined(SQLITE_ENABLE_STAT4) |
| 75982 | 76092 | if( op==TK_REGISTER ) op = pExpr->op2; |
| 75983 | 76093 | #else |
| 75984 | 76094 | if( NEVER(op==TK_REGISTER) ) op = pExpr->op2; |
| 75985 | 76095 | #endif |
| 75986 | 76096 | |
| | @@ -76069,11 +76179,11 @@ |
| 76069 | 76179 | assert( zVal[nVal]=='\'' ); |
| 76070 | 76180 | sqlite3VdbeMemSetStr(pVal, sqlite3HexToBlob(db, zVal, nVal), nVal/2, |
| 76071 | 76181 | 0, SQLITE_DYNAMIC); |
| 76072 | 76182 | } |
| 76073 | 76183 | #endif |
| 76074 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 76184 | +#ifdef SQLITE_ENABLE_STAT4 |
| 76075 | 76185 | else if( op==TK_FUNCTION && pCtx!=0 ){ |
| 76076 | 76186 | rc = valueFromFunction(db, pExpr, enc, affinity, &pVal, pCtx); |
| 76077 | 76187 | } |
| 76078 | 76188 | #endif |
| 76079 | 76189 | else if( op==TK_TRUEFALSE ){ |
| | @@ -76086,17 +76196,17 @@ |
| 76086 | 76196 | |
| 76087 | 76197 | *ppVal = pVal; |
| 76088 | 76198 | return rc; |
| 76089 | 76199 | |
| 76090 | 76200 | no_mem: |
| 76091 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 76201 | +#ifdef SQLITE_ENABLE_STAT4 |
| 76092 | 76202 | if( pCtx==0 || pCtx->pParse->nErr==0 ) |
| 76093 | 76203 | #endif |
| 76094 | 76204 | sqlite3OomFault(db); |
| 76095 | 76205 | sqlite3DbFree(db, zVal); |
| 76096 | 76206 | assert( *ppVal==0 ); |
| 76097 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 76207 | +#ifdef SQLITE_ENABLE_STAT4 |
| 76098 | 76208 | if( pCtx==0 ) sqlite3ValueFree(pVal); |
| 76099 | 76209 | #else |
| 76100 | 76210 | assert( pCtx==0 ); sqlite3ValueFree(pVal); |
| 76101 | 76211 | #endif |
| 76102 | 76212 | return SQLITE_NOMEM_BKPT; |
| | @@ -76120,60 +76230,11 @@ |
| 76120 | 76230 | sqlite3_value **ppVal /* Write the new value here */ |
| 76121 | 76231 | ){ |
| 76122 | 76232 | return pExpr ? valueFromExpr(db, pExpr, enc, affinity, ppVal, 0) : 0; |
| 76123 | 76233 | } |
| 76124 | 76234 | |
| 76125 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 76126 | | -/* |
| 76127 | | -** The implementation of the sqlite_record() function. This function accepts |
| 76128 | | -** a single argument of any type. The return value is a formatted database |
| 76129 | | -** record (a blob) containing the argument value. |
| 76130 | | -** |
| 76131 | | -** This is used to convert the value stored in the 'sample' column of the |
| 76132 | | -** sqlite_stat3 table to the record format SQLite uses internally. |
| 76133 | | -*/ |
| 76134 | | -static void recordFunc( |
| 76135 | | - sqlite3_context *context, |
| 76136 | | - int argc, |
| 76137 | | - sqlite3_value **argv |
| 76138 | | -){ |
| 76139 | | - const int file_format = 1; |
| 76140 | | - u32 iSerial; /* Serial type */ |
| 76141 | | - int nSerial; /* Bytes of space for iSerial as varint */ |
| 76142 | | - u32 nVal; /* Bytes of space required for argv[0] */ |
| 76143 | | - int nRet; |
| 76144 | | - sqlite3 *db; |
| 76145 | | - u8 *aRet; |
| 76146 | | - |
| 76147 | | - UNUSED_PARAMETER( argc ); |
| 76148 | | - iSerial = sqlite3VdbeSerialType(argv[0], file_format, &nVal); |
| 76149 | | - nSerial = sqlite3VarintLen(iSerial); |
| 76150 | | - db = sqlite3_context_db_handle(context); |
| 76151 | | - |
| 76152 | | - nRet = 1 + nSerial + nVal; |
| 76153 | | - aRet = sqlite3DbMallocRawNN(db, nRet); |
| 76154 | | - if( aRet==0 ){ |
| 76155 | | - sqlite3_result_error_nomem(context); |
| 76156 | | - }else{ |
| 76157 | | - aRet[0] = nSerial+1; |
| 76158 | | - putVarint32(&aRet[1], iSerial); |
| 76159 | | - sqlite3VdbeSerialPut(&aRet[1+nSerial], argv[0], iSerial); |
| 76160 | | - sqlite3_result_blob(context, aRet, nRet, SQLITE_TRANSIENT); |
| 76161 | | - sqlite3DbFreeNN(db, aRet); |
| 76162 | | - } |
| 76163 | | -} |
| 76164 | | - |
| 76165 | | -/* |
| 76166 | | -** Register built-in functions used to help read ANALYZE data. |
| 76167 | | -*/ |
| 76168 | | -SQLITE_PRIVATE void sqlite3AnalyzeFunctions(void){ |
| 76169 | | - static FuncDef aAnalyzeTableFuncs[] = { |
| 76170 | | - FUNCTION(sqlite_record, 1, 0, 0, recordFunc), |
| 76171 | | - }; |
| 76172 | | - sqlite3InsertBuiltinFuncs(aAnalyzeTableFuncs, ArraySize(aAnalyzeTableFuncs)); |
| 76173 | | -} |
| 76174 | | - |
| 76235 | +#ifdef SQLITE_ENABLE_STAT4 |
| 76175 | 76236 | /* |
| 76176 | 76237 | ** Attempt to extract a value from pExpr and use it to construct *ppVal. |
| 76177 | 76238 | ** |
| 76178 | 76239 | ** If pAlloc is not NULL, then an UnpackedRecord object is created for |
| 76179 | 76240 | ** pAlloc if one does not exist and the new value is added to the |
| | @@ -77413,20 +77474,20 @@ |
| 77413 | 77474 | |
| 77414 | 77475 | /* |
| 77415 | 77476 | ** Change the value of the opcode, or P1, P2, P3, or P5 operands |
| 77416 | 77477 | ** for a specific instruction. |
| 77417 | 77478 | */ |
| 77418 | | -SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe *p, u32 addr, u8 iNewOpcode){ |
| 77479 | +SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe *p, int addr, u8 iNewOpcode){ |
| 77419 | 77480 | sqlite3VdbeGetOp(p,addr)->opcode = iNewOpcode; |
| 77420 | 77481 | } |
| 77421 | | -SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe *p, u32 addr, int val){ |
| 77482 | +SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe *p, int addr, int val){ |
| 77422 | 77483 | sqlite3VdbeGetOp(p,addr)->p1 = val; |
| 77423 | 77484 | } |
| 77424 | | -SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe *p, u32 addr, int val){ |
| 77485 | +SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe *p, int addr, int val){ |
| 77425 | 77486 | sqlite3VdbeGetOp(p,addr)->p2 = val; |
| 77426 | 77487 | } |
| 77427 | | -SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe *p, u32 addr, int val){ |
| 77488 | +SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe *p, int addr, int val){ |
| 77428 | 77489 | sqlite3VdbeGetOp(p,addr)->p3 = val; |
| 77429 | 77490 | } |
| 77430 | 77491 | SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe *p, u16 p5){ |
| 77431 | 77492 | assert( p->nOp>0 || p->db->mallocFailed ); |
| 77432 | 77493 | if( p->nOp>0 ) p->aOp[p->nOp-1].p5 = p5; |
| | @@ -77929,18 +77990,20 @@ |
| 77929 | 77990 | sqlite3StrAccumInit(&x, 0, zTemp, nTemp, 0); |
| 77930 | 77991 | switch( pOp->p4type ){ |
| 77931 | 77992 | case P4_KEYINFO: { |
| 77932 | 77993 | int j; |
| 77933 | 77994 | KeyInfo *pKeyInfo = pOp->p4.pKeyInfo; |
| 77934 | | - assert( pKeyInfo->aSortOrder!=0 ); |
| 77995 | + assert( pKeyInfo->aSortFlags!=0 ); |
| 77935 | 77996 | sqlite3_str_appendf(&x, "k(%d", pKeyInfo->nKeyField); |
| 77936 | 77997 | for(j=0; j<pKeyInfo->nKeyField; j++){ |
| 77937 | 77998 | CollSeq *pColl = pKeyInfo->aColl[j]; |
| 77938 | 77999 | const char *zColl = pColl ? pColl->zName : ""; |
| 77939 | 78000 | if( strcmp(zColl, "BINARY")==0 ) zColl = "B"; |
| 77940 | | - sqlite3_str_appendf(&x, ",%s%s", |
| 77941 | | - pKeyInfo->aSortOrder[j] ? "-" : "", zColl); |
| 78001 | + sqlite3_str_appendf(&x, ",%s%s%s", |
| 78002 | + (pKeyInfo->aSortFlags[j] & KEYINFO_ORDER_DESC) ? "-" : "", |
| 78003 | + (pKeyInfo->aSortFlags[j] & KEYINFO_ORDER_BIGNULL)? "N." : "", |
| 78004 | + zColl); |
| 77942 | 78005 | } |
| 77943 | 78006 | sqlite3_str_append(&x, ")", 1); |
| 77944 | 78007 | break; |
| 77945 | 78008 | } |
| 77946 | 78009 | #ifdef SQLITE_ENABLE_CURSOR_HINTS |
| | @@ -78343,12 +78406,15 @@ |
| 78343 | 78406 | }else{ |
| 78344 | 78407 | /* We are currently listing subprograms. Figure out which one and |
| 78345 | 78408 | ** pick up the appropriate opcode. */ |
| 78346 | 78409 | int j; |
| 78347 | 78410 | i -= p->nOp; |
| 78411 | + assert( apSub!=0 ); |
| 78412 | + assert( nSub>0 ); |
| 78348 | 78413 | for(j=0; i>=apSub[j]->nOp; j++){ |
| 78349 | 78414 | i -= apSub[j]->nOp; |
| 78415 | + assert( i<apSub[j]->nOp || j+1<nSub ); |
| 78350 | 78416 | } |
| 78351 | 78417 | pOp = &apSub[j]->aOp[i]; |
| 78352 | 78418 | } |
| 78353 | 78419 | |
| 78354 | 78420 | /* When an OP_Program opcode is encounter (the only opcode that has |
| | @@ -79866,14 +79932,21 @@ |
| 79866 | 79932 | ** |
| 79867 | 79933 | ** The 8 and 9 types were added in 3.3.0, file format 4. Prior versions |
| 79868 | 79934 | ** of SQLite will not understand those serial types. |
| 79869 | 79935 | */ |
| 79870 | 79936 | |
| 79937 | +#if 0 /* Inlined into the OP_MakeRecord opcode */ |
| 79871 | 79938 | /* |
| 79872 | 79939 | ** Return the serial-type for the value stored in pMem. |
| 79873 | 79940 | ** |
| 79874 | 79941 | ** This routine might convert a large MEM_IntReal value into MEM_Real. |
| 79942 | +** |
| 79943 | +** 2019-07-11: The primary user of this subroutine was the OP_MakeRecord |
| 79944 | +** opcode in the byte-code engine. But by moving this routine in-line, we |
| 79945 | +** can omit some redundant tests and make that opcode a lot faster. So |
| 79946 | +** this routine is now only used by the STAT3 logic and STAT3 support has |
| 79947 | +** ended. The code is kept here for historical reference only. |
| 79875 | 79948 | */ |
| 79876 | 79949 | SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ |
| 79877 | 79950 | int flags = pMem->flags; |
| 79878 | 79951 | u32 n; |
| 79879 | 79952 | |
| | @@ -79930,10 +80003,11 @@ |
| 79930 | 80003 | n += pMem->u.nZero; |
| 79931 | 80004 | } |
| 79932 | 80005 | *pLen = n; |
| 79933 | 80006 | return ((n*2) + 12 + ((flags&MEM_Str)!=0)); |
| 79934 | 80007 | } |
| 80008 | +#endif /* inlined into OP_MakeRecord */ |
| 79935 | 80009 | |
| 79936 | 80010 | /* |
| 79937 | 80011 | ** The sizes for serial types less than 128 |
| 79938 | 80012 | */ |
| 79939 | 80013 | static const u8 sqlite3SmallTypeSizes[] = { |
| | @@ -80238,11 +80312,11 @@ |
| 80238 | 80312 | int nByte; /* Number of bytes required for *p */ |
| 80239 | 80313 | nByte = ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nKeyField+1); |
| 80240 | 80314 | p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte); |
| 80241 | 80315 | if( !p ) return 0; |
| 80242 | 80316 | p->aMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))]; |
| 80243 | | - assert( pKeyInfo->aSortOrder!=0 ); |
| 80317 | + assert( pKeyInfo->aSortFlags!=0 ); |
| 80244 | 80318 | p->pKeyInfo = pKeyInfo; |
| 80245 | 80319 | p->nField = pKeyInfo->nKeyField + 1; |
| 80246 | 80320 | return p; |
| 80247 | 80321 | } |
| 80248 | 80322 | |
| | @@ -80337,11 +80411,11 @@ |
| 80337 | 80411 | |
| 80338 | 80412 | idx1 = getVarint32(aKey1, szHdr1); |
| 80339 | 80413 | if( szHdr1>98307 ) return SQLITE_CORRUPT; |
| 80340 | 80414 | d1 = szHdr1; |
| 80341 | 80415 | assert( pKeyInfo->nAllField>=pPKey2->nField || CORRUPT_DB ); |
| 80342 | | - assert( pKeyInfo->aSortOrder!=0 ); |
| 80416 | + assert( pKeyInfo->aSortFlags!=0 ); |
| 80343 | 80417 | assert( pKeyInfo->nKeyField>0 ); |
| 80344 | 80418 | assert( idx1<=szHdr1 || CORRUPT_DB ); |
| 80345 | 80419 | do{ |
| 80346 | 80420 | u32 serial_type1; |
| 80347 | 80421 | |
| | @@ -80368,11 +80442,16 @@ |
| 80368 | 80442 | */ |
| 80369 | 80443 | rc = sqlite3MemCompare(&mem1, &pPKey2->aMem[i], |
| 80370 | 80444 | pKeyInfo->nAllField>i ? pKeyInfo->aColl[i] : 0); |
| 80371 | 80445 | if( rc!=0 ){ |
| 80372 | 80446 | assert( mem1.szMalloc==0 ); /* See comment below */ |
| 80373 | | - if( pKeyInfo->aSortOrder[i] ){ |
| 80447 | + if( (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) |
| 80448 | + && ((mem1.flags & MEM_Null) || (pPKey2->aMem[i].flags & MEM_Null)) |
| 80449 | + ){ |
| 80450 | + rc = -rc; |
| 80451 | + } |
| 80452 | + if( pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_DESC ){ |
| 80374 | 80453 | rc = -rc; /* Invert the result for DESC sort order. */ |
| 80375 | 80454 | } |
| 80376 | 80455 | goto debugCompareEnd; |
| 80377 | 80456 | } |
| 80378 | 80457 | i++; |
| | @@ -80744,11 +80823,11 @@ |
| 80744 | 80823 | } |
| 80745 | 80824 | |
| 80746 | 80825 | VVA_ONLY( mem1.szMalloc = 0; ) /* Only needed by assert() statements */ |
| 80747 | 80826 | assert( pPKey2->pKeyInfo->nAllField>=pPKey2->nField |
| 80748 | 80827 | || CORRUPT_DB ); |
| 80749 | | - assert( pPKey2->pKeyInfo->aSortOrder!=0 ); |
| 80828 | + assert( pPKey2->pKeyInfo->aSortFlags!=0 ); |
| 80750 | 80829 | assert( pPKey2->pKeyInfo->nKeyField>0 ); |
| 80751 | 80830 | assert( idx1<=szHdr1 || CORRUPT_DB ); |
| 80752 | 80831 | do{ |
| 80753 | 80832 | u32 serial_type; |
| 80754 | 80833 | |
| | @@ -80867,12 +80946,18 @@ |
| 80867 | 80946 | serial_type = aKey1[idx1]; |
| 80868 | 80947 | rc = (serial_type!=0); |
| 80869 | 80948 | } |
| 80870 | 80949 | |
| 80871 | 80950 | if( rc!=0 ){ |
| 80872 | | - if( pPKey2->pKeyInfo->aSortOrder[i] ){ |
| 80873 | | - rc = -rc; |
| 80951 | + int sortFlags = pPKey2->pKeyInfo->aSortFlags[i]; |
| 80952 | + if( sortFlags ){ |
| 80953 | + if( (sortFlags & KEYINFO_ORDER_BIGNULL)==0 |
| 80954 | + || ((sortFlags & KEYINFO_ORDER_DESC) |
| 80955 | + !=(serial_type==0 || (pRhs->flags&MEM_Null))) |
| 80956 | + ){ |
| 80957 | + rc = -rc; |
| 80958 | + } |
| 80874 | 80959 | } |
| 80875 | 80960 | assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, rc) ); |
| 80876 | 80961 | assert( mem1.szMalloc==0 ); /* See comment below */ |
| 80877 | 80962 | return rc; |
| 80878 | 80963 | } |
| | @@ -81036,11 +81121,15 @@ |
| 81036 | 81121 | return 0; /* Corruption */ |
| 81037 | 81122 | } |
| 81038 | 81123 | nCmp = MIN( pPKey2->aMem[0].n, nStr ); |
| 81039 | 81124 | res = memcmp(&aKey1[szHdr], pPKey2->aMem[0].z, nCmp); |
| 81040 | 81125 | |
| 81041 | | - if( res==0 ){ |
| 81126 | + if( res>0 ){ |
| 81127 | + res = pPKey2->r2; |
| 81128 | + }else if( res<0 ){ |
| 81129 | + res = pPKey2->r1; |
| 81130 | + }else{ |
| 81042 | 81131 | res = nStr - pPKey2->aMem[0].n; |
| 81043 | 81132 | if( res==0 ){ |
| 81044 | 81133 | if( pPKey2->nField>1 ){ |
| 81045 | 81134 | res = sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 1); |
| 81046 | 81135 | }else{ |
| | @@ -81050,14 +81139,10 @@ |
| 81050 | 81139 | }else if( res>0 ){ |
| 81051 | 81140 | res = pPKey2->r2; |
| 81052 | 81141 | }else{ |
| 81053 | 81142 | res = pPKey2->r1; |
| 81054 | 81143 | } |
| 81055 | | - }else if( res>0 ){ |
| 81056 | | - res = pPKey2->r2; |
| 81057 | | - }else{ |
| 81058 | | - res = pPKey2->r1; |
| 81059 | 81144 | } |
| 81060 | 81145 | } |
| 81061 | 81146 | |
| 81062 | 81147 | assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, res) |
| 81063 | 81148 | || CORRUPT_DB |
| | @@ -81085,11 +81170,14 @@ |
| 81085 | 81170 | ** The easiest way to enforce this limit is to consider only records with |
| 81086 | 81171 | ** 13 fields or less. If the first field is an integer, the maximum legal |
| 81087 | 81172 | ** header size is (12*5 + 1 + 1) bytes. */ |
| 81088 | 81173 | if( p->pKeyInfo->nAllField<=13 ){ |
| 81089 | 81174 | int flags = p->aMem[0].flags; |
| 81090 | | - if( p->pKeyInfo->aSortOrder[0] ){ |
| 81175 | + if( p->pKeyInfo->aSortFlags[0] ){ |
| 81176 | + if( p->pKeyInfo->aSortFlags[0] & KEYINFO_ORDER_BIGNULL ){ |
| 81177 | + return sqlite3VdbeRecordCompare; |
| 81178 | + } |
| 81091 | 81179 | p->r1 = 1; |
| 81092 | 81180 | p->r2 = -1; |
| 81093 | 81181 | }else{ |
| 81094 | 81182 | p->r1 = -1; |
| 81095 | 81183 | p->r2 = 1; |
| | @@ -81334,11 +81422,11 @@ |
| 81334 | 81422 | ** throw an error if it is given inputs that would make it non-deterministic. |
| 81335 | 81423 | ** This routine is invoked by date/time functions that use non-deterministic |
| 81336 | 81424 | ** features such as 'now'. |
| 81337 | 81425 | */ |
| 81338 | 81426 | SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context *pCtx){ |
| 81339 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 81427 | +#ifdef SQLITE_ENABLE_STAT4 |
| 81340 | 81428 | if( pCtx->pVdbe==0 ) return 1; |
| 81341 | 81429 | #endif |
| 81342 | 81430 | if( pCtx->pVdbe->aOp[pCtx->iOp].opcode==OP_PureFunc ){ |
| 81343 | 81431 | sqlite3_result_error(pCtx, |
| 81344 | 81432 | "non-deterministic function in index expression or CHECK constraint", |
| | @@ -81431,11 +81519,11 @@ |
| 81431 | 81519 | preupdate.op = op; |
| 81432 | 81520 | preupdate.iNewReg = iReg; |
| 81433 | 81521 | preupdate.keyinfo.db = db; |
| 81434 | 81522 | preupdate.keyinfo.enc = ENC(db); |
| 81435 | 81523 | preupdate.keyinfo.nKeyField = pTab->nCol; |
| 81436 | | - preupdate.keyinfo.aSortOrder = (u8*)&fakeSortOrder; |
| 81524 | + preupdate.keyinfo.aSortFlags = (u8*)&fakeSortOrder; |
| 81437 | 81525 | preupdate.iKey1 = iKey1; |
| 81438 | 81526 | preupdate.iKey2 = iKey2; |
| 81439 | 81527 | preupdate.pTab = pTab; |
| 81440 | 81528 | |
| 81441 | 81529 | db->pPreUpdate = &preupdate; |
| | @@ -82300,11 +82388,11 @@ |
| 82300 | 82388 | ** of the amount of time that elapses between invocations. In other words, |
| 82301 | 82389 | ** the time returned is always the time of the first call. |
| 82302 | 82390 | */ |
| 82303 | 82391 | SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context *p){ |
| 82304 | 82392 | int rc; |
| 82305 | | -#ifndef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 82393 | +#ifndef SQLITE_ENABLE_STAT4 |
| 82306 | 82394 | sqlite3_int64 *piTime = &p->pVdbe->iCurrentTime; |
| 82307 | 82395 | assert( p->pVdbe!=0 ); |
| 82308 | 82396 | #else |
| 82309 | 82397 | sqlite3_int64 iTime = 0; |
| 82310 | 82398 | sqlite3_int64 *piTime = p->pVdbe!=0 ? &p->pVdbe->iCurrentTime : &iTime; |
| | @@ -82365,11 +82453,11 @@ |
| 82365 | 82453 | */ |
| 82366 | 82454 | SQLITE_API void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){ |
| 82367 | 82455 | AuxData *pAuxData; |
| 82368 | 82456 | |
| 82369 | 82457 | assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); |
| 82370 | | -#if SQLITE_ENABLE_STAT3_OR_STAT4 |
| 82458 | +#if SQLITE_ENABLE_STAT4 |
| 82371 | 82459 | if( pCtx->pVdbe==0 ) return 0; |
| 82372 | 82460 | #else |
| 82373 | 82461 | assert( pCtx->pVdbe!=0 ); |
| 82374 | 82462 | #endif |
| 82375 | 82463 | for(pAuxData=pCtx->pVdbe->pAuxData; pAuxData; pAuxData=pAuxData->pNextAux){ |
| | @@ -82399,11 +82487,11 @@ |
| 82399 | 82487 | ){ |
| 82400 | 82488 | AuxData *pAuxData; |
| 82401 | 82489 | Vdbe *pVdbe = pCtx->pVdbe; |
| 82402 | 82490 | |
| 82403 | 82491 | assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); |
| 82404 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 82492 | +#ifdef SQLITE_ENABLE_STAT4 |
| 82405 | 82493 | if( pVdbe==0 ) goto failed; |
| 82406 | 82494 | #else |
| 82407 | 82495 | assert( pVdbe!=0 ); |
| 82408 | 82496 | #endif |
| 82409 | 82497 | |
| | @@ -84051,10 +84139,11 @@ |
| 84051 | 84139 | ** |
| 84052 | 84140 | ** SQLITE_AFF_TEXT: |
| 84053 | 84141 | ** Convert pRec to a text representation. |
| 84054 | 84142 | ** |
| 84055 | 84143 | ** SQLITE_AFF_BLOB: |
| 84144 | +** SQLITE_AFF_NONE: |
| 84056 | 84145 | ** No-op. pRec is unchanged. |
| 84057 | 84146 | */ |
| 84058 | 84147 | static void applyAffinity( |
| 84059 | 84148 | Mem *pRec, /* The value to apply affinity to */ |
| 84060 | 84149 | char affinity, /* The affinity to be applied */ |
| | @@ -84192,15 +84281,16 @@ |
| 84192 | 84281 | c = 's'; |
| 84193 | 84282 | } |
| 84194 | 84283 | *(zCsr++) = c; |
| 84195 | 84284 | sqlite3_snprintf(100, zCsr, "%d[", pMem->n); |
| 84196 | 84285 | zCsr += sqlite3Strlen30(zCsr); |
| 84197 | | - for(i=0; i<16 && i<pMem->n; i++){ |
| 84286 | + for(i=0; i<25 && i<pMem->n; i++){ |
| 84198 | 84287 | sqlite3_snprintf(100, zCsr, "%02X", ((int)pMem->z[i] & 0xFF)); |
| 84199 | 84288 | zCsr += sqlite3Strlen30(zCsr); |
| 84200 | 84289 | } |
| 84201 | | - for(i=0; i<16 && i<pMem->n; i++){ |
| 84290 | + *zCsr++ = '|'; |
| 84291 | + for(i=0; i<25 && i<pMem->n; i++){ |
| 84202 | 84292 | char z = pMem->z[i]; |
| 84203 | 84293 | if( z<32 || z>126 ) *zCsr++ = '.'; |
| 84204 | 84294 | else *zCsr++ = z; |
| 84205 | 84295 | } |
| 84206 | 84296 | *(zCsr++) = ']'; |
| | @@ -84226,11 +84316,11 @@ |
| 84226 | 84316 | } |
| 84227 | 84317 | k = 2; |
| 84228 | 84318 | sqlite3_snprintf(100, &zBuf[k], "%d", pMem->n); |
| 84229 | 84319 | k += sqlite3Strlen30(&zBuf[k]); |
| 84230 | 84320 | zBuf[k++] = '['; |
| 84231 | | - for(j=0; j<15 && j<pMem->n; j++){ |
| 84321 | + for(j=0; j<25 && j<pMem->n; j++){ |
| 84232 | 84322 | u8 c = pMem->z[j]; |
| 84233 | 84323 | if( c>=0x20 && c<0x7f ){ |
| 84234 | 84324 | zBuf[k++] = c; |
| 84235 | 84325 | }else{ |
| 84236 | 84326 | zBuf[k++] = '.'; |
| | @@ -85628,10 +85718,11 @@ |
| 85628 | 85718 | pIn1 = &aMem[pOp->p1]; |
| 85629 | 85719 | if( pIn1->flags & (MEM_Int|MEM_IntReal) ){ |
| 85630 | 85720 | testcase( pIn1->flags & MEM_Int ); |
| 85631 | 85721 | testcase( pIn1->flags & MEM_IntReal ); |
| 85632 | 85722 | sqlite3VdbeMemRealify(pIn1); |
| 85723 | + REGISTER_TRACE(pOp->p1, pIn1); |
| 85633 | 85724 | } |
| 85634 | 85725 | break; |
| 85635 | 85726 | } |
| 85636 | 85727 | #endif |
| 85637 | 85728 | |
| | @@ -86023,13 +86114,18 @@ |
| 86023 | 86114 | assert( memIsValid(&aMem[p2+idx]) ); |
| 86024 | 86115 | REGISTER_TRACE(p1+idx, &aMem[p1+idx]); |
| 86025 | 86116 | REGISTER_TRACE(p2+idx, &aMem[p2+idx]); |
| 86026 | 86117 | assert( i<pKeyInfo->nKeyField ); |
| 86027 | 86118 | pColl = pKeyInfo->aColl[i]; |
| 86028 | | - bRev = pKeyInfo->aSortOrder[i]; |
| 86119 | + bRev = (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_DESC); |
| 86029 | 86120 | iCompare = sqlite3MemCompare(&aMem[p1+idx], &aMem[p2+idx], pColl); |
| 86030 | 86121 | if( iCompare ){ |
| 86122 | + if( (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) |
| 86123 | + && ((aMem[p1+idx].flags & MEM_Null) || (aMem[p2+idx].flags & MEM_Null)) |
| 86124 | + ){ |
| 86125 | + iCompare = -iCompare; |
| 86126 | + } |
| 86031 | 86127 | if( bRev ) iCompare = -iCompare; |
| 86032 | 86128 | break; |
| 86033 | 86129 | } |
| 86034 | 86130 | } |
| 86035 | 86131 | break; |
| | @@ -86316,15 +86412,10 @@ |
| 86316 | 86412 | ** |
| 86317 | 86413 | ** If the record contains fewer than P2 fields, then extract a NULL. Or, |
| 86318 | 86414 | ** if the P4 argument is a P4_MEM use the value of the P4 argument as |
| 86319 | 86415 | ** the result. |
| 86320 | 86416 | ** |
| 86321 | | -** If the OPFLAG_CLEARCACHE bit is set on P5 and P1 is a pseudo-table cursor, |
| 86322 | | -** then the cache of the cursor is reset prior to extracting the column. |
| 86323 | | -** The first OP_Column against a pseudo-table after the value of the content |
| 86324 | | -** register has changed should have this bit set. |
| 86325 | | -** |
| 86326 | 86417 | ** If the OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG bits are set on P5 then |
| 86327 | 86418 | ** the result is guaranteed to only be used as the argument of a length() |
| 86328 | 86419 | ** or typeof() function, respectively. The loading of large blobs can be |
| 86329 | 86420 | ** skipped for length() and all content loading can be skipped for typeof(). |
| 86330 | 86421 | */ |
| | @@ -86609,19 +86700,31 @@ |
| 86609 | 86700 | zAffinity = pOp->p4.z; |
| 86610 | 86701 | assert( zAffinity!=0 ); |
| 86611 | 86702 | assert( pOp->p2>0 ); |
| 86612 | 86703 | assert( zAffinity[pOp->p2]==0 ); |
| 86613 | 86704 | pIn1 = &aMem[pOp->p1]; |
| 86614 | | - while( 1 /*edit-by-break*/ ){ |
| 86705 | + while( 1 /*exit-by-break*/ ){ |
| 86615 | 86706 | assert( pIn1 <= &p->aMem[(p->nMem+1 - p->nCursor)] ); |
| 86616 | 86707 | assert( memIsValid(pIn1) ); |
| 86617 | 86708 | applyAffinity(pIn1, zAffinity[0], encoding); |
| 86618 | 86709 | if( zAffinity[0]==SQLITE_AFF_REAL && (pIn1->flags & MEM_Int)!=0 ){ |
| 86619 | | - /* When applying REAL affinity, if the result is still MEM_Int, |
| 86620 | | - ** indicate that REAL is actually desired */ |
| 86621 | | - pIn1->flags |= MEM_IntReal; |
| 86622 | | - pIn1->flags &= ~MEM_Int; |
| 86710 | + /* When applying REAL affinity, if the result is still an MEM_Int |
| 86711 | + ** that will fit in 6 bytes, then change the type to MEM_IntReal |
| 86712 | + ** so that we keep the high-resolution integer value but know that |
| 86713 | + ** the type really wants to be REAL. */ |
| 86714 | + testcase( pIn1->u.i==140737488355328LL ); |
| 86715 | + testcase( pIn1->u.i==140737488355327LL ); |
| 86716 | + testcase( pIn1->u.i==-140737488355328LL ); |
| 86717 | + testcase( pIn1->u.i==-140737488355329LL ); |
| 86718 | + if( pIn1->u.i<=140737488355327LL && pIn1->u.i>=-140737488355328LL ){ |
| 86719 | + pIn1->flags |= MEM_IntReal; |
| 86720 | + pIn1->flags &= ~MEM_Int; |
| 86721 | + }else{ |
| 86722 | + pIn1->u.r = (double)pIn1->u.i; |
| 86723 | + pIn1->flags |= MEM_Real; |
| 86724 | + pIn1->flags &= ~MEM_Int; |
| 86725 | + } |
| 86623 | 86726 | } |
| 86624 | 86727 | REGISTER_TRACE((int)(pIn1-aMem), pIn1); |
| 86625 | 86728 | zAffinity++; |
| 86626 | 86729 | if( zAffinity[0]==0 ) break; |
| 86627 | 86730 | pIn1++; |
| | @@ -86724,38 +86827,124 @@ |
| 86724 | 86827 | } |
| 86725 | 86828 | } |
| 86726 | 86829 | #endif |
| 86727 | 86830 | |
| 86728 | 86831 | /* Loop through the elements that will make up the record to figure |
| 86729 | | - ** out how much space is required for the new record. |
| 86832 | + ** out how much space is required for the new record. After this loop, |
| 86833 | + ** the Mem.uTemp field of each term should hold the serial-type that will |
| 86834 | + ** be used for that term in the generated record: |
| 86835 | + ** |
| 86836 | + ** Mem.uTemp value type |
| 86837 | + ** --------------- --------------- |
| 86838 | + ** 0 NULL |
| 86839 | + ** 1 1-byte signed integer |
| 86840 | + ** 2 2-byte signed integer |
| 86841 | + ** 3 3-byte signed integer |
| 86842 | + ** 4 4-byte signed integer |
| 86843 | + ** 5 6-byte signed integer |
| 86844 | + ** 6 8-byte signed integer |
| 86845 | + ** 7 IEEE float |
| 86846 | + ** 8 Integer constant 0 |
| 86847 | + ** 9 Integer constant 1 |
| 86848 | + ** 10,11 reserved for expansion |
| 86849 | + ** N>=12 and even BLOB |
| 86850 | + ** N>=13 and odd text |
| 86851 | + ** |
| 86852 | + ** The following additional values are computed: |
| 86853 | + ** nHdr Number of bytes needed for the record header |
| 86854 | + ** nData Number of bytes of data space needed for the record |
| 86855 | + ** nZero Zero bytes at the end of the record |
| 86730 | 86856 | */ |
| 86731 | 86857 | pRec = pLast; |
| 86732 | 86858 | do{ |
| 86733 | 86859 | assert( memIsValid(pRec) ); |
| 86734 | | - serial_type = sqlite3VdbeSerialType(pRec, file_format, &len); |
| 86735 | | - if( pRec->flags & MEM_Zero ){ |
| 86736 | | - if( serial_type==0 ){ |
| 86860 | + if( pRec->flags & MEM_Null ){ |
| 86861 | + if( pRec->flags & MEM_Zero ){ |
| 86737 | 86862 | /* Values with MEM_Null and MEM_Zero are created by xColumn virtual |
| 86738 | 86863 | ** table methods that never invoke sqlite3_result_xxxxx() while |
| 86739 | 86864 | ** computing an unchanging column value in an UPDATE statement. |
| 86740 | 86865 | ** Give such values a special internal-use-only serial-type of 10 |
| 86741 | 86866 | ** so that they can be passed through to xUpdate and have |
| 86742 | 86867 | ** a true sqlite3_value_nochange(). */ |
| 86743 | 86868 | assert( pOp->p5==OPFLAG_NOCHNG_MAGIC || CORRUPT_DB ); |
| 86744 | | - serial_type = 10; |
| 86745 | | - }else if( nData ){ |
| 86746 | | - if( sqlite3VdbeMemExpandBlob(pRec) ) goto no_mem; |
| 86869 | + pRec->uTemp = 10; |
| 86747 | 86870 | }else{ |
| 86748 | | - nZero += pRec->u.nZero; |
| 86749 | | - len -= pRec->u.nZero; |
| 86750 | | - } |
| 86751 | | - } |
| 86752 | | - nData += len; |
| 86753 | | - testcase( serial_type==127 ); |
| 86754 | | - testcase( serial_type==128 ); |
| 86755 | | - nHdr += serial_type<=127 ? 1 : sqlite3VarintLen(serial_type); |
| 86756 | | - pRec->uTemp = serial_type; |
| 86871 | + pRec->uTemp = 0; |
| 86872 | + } |
| 86873 | + nHdr++; |
| 86874 | + }else if( pRec->flags & (MEM_Int|MEM_IntReal) ){ |
| 86875 | + /* Figure out whether to use 1, 2, 4, 6 or 8 bytes. */ |
| 86876 | + i64 i = pRec->u.i; |
| 86877 | + u64 uu; |
| 86878 | + testcase( pRec->flags & MEM_Int ); |
| 86879 | + testcase( pRec->flags & MEM_IntReal ); |
| 86880 | + if( i<0 ){ |
| 86881 | + uu = ~i; |
| 86882 | + }else{ |
| 86883 | + uu = i; |
| 86884 | + } |
| 86885 | + nHdr++; |
| 86886 | + testcase( uu==127 ); testcase( uu==128 ); |
| 86887 | + testcase( uu==32767 ); testcase( uu==32768 ); |
| 86888 | + testcase( uu==8388607 ); testcase( uu==8388608 ); |
| 86889 | + testcase( uu==2147483647 ); testcase( uu==2147483648 ); |
| 86890 | + testcase( uu==140737488355327LL ); testcase( uu==140737488355328LL ); |
| 86891 | + if( uu<=127 ){ |
| 86892 | + if( (i&1)==i && file_format>=4 ){ |
| 86893 | + pRec->uTemp = 8+(u32)uu; |
| 86894 | + }else{ |
| 86895 | + nData++; |
| 86896 | + pRec->uTemp = 1; |
| 86897 | + } |
| 86898 | + }else if( uu<=32767 ){ |
| 86899 | + nData += 2; |
| 86900 | + pRec->uTemp = 2; |
| 86901 | + }else if( uu<=8388607 ){ |
| 86902 | + nData += 3; |
| 86903 | + pRec->uTemp = 3; |
| 86904 | + }else if( uu<=2147483647 ){ |
| 86905 | + nData += 4; |
| 86906 | + pRec->uTemp = 4; |
| 86907 | + }else if( uu<=140737488355327LL ){ |
| 86908 | + nData += 6; |
| 86909 | + pRec->uTemp = 5; |
| 86910 | + }else{ |
| 86911 | + nData += 8; |
| 86912 | + if( pRec->flags & MEM_IntReal ){ |
| 86913 | + /* If the value is IntReal and is going to take up 8 bytes to store |
| 86914 | + ** as an integer, then we might as well make it an 8-byte floating |
| 86915 | + ** point value */ |
| 86916 | + pRec->u.r = (double)pRec->u.i; |
| 86917 | + pRec->flags &= ~MEM_IntReal; |
| 86918 | + pRec->flags |= MEM_Real; |
| 86919 | + pRec->uTemp = 7; |
| 86920 | + }else{ |
| 86921 | + pRec->uTemp = 6; |
| 86922 | + } |
| 86923 | + } |
| 86924 | + }else if( pRec->flags & MEM_Real ){ |
| 86925 | + nHdr++; |
| 86926 | + nData += 8; |
| 86927 | + pRec->uTemp = 7; |
| 86928 | + }else{ |
| 86929 | + assert( db->mallocFailed || pRec->flags&(MEM_Str|MEM_Blob) ); |
| 86930 | + assert( pRec->n>=0 ); |
| 86931 | + len = (u32)pRec->n; |
| 86932 | + serial_type = (len*2) + 12 + ((pRec->flags & MEM_Str)!=0); |
| 86933 | + if( pRec->flags & MEM_Zero ){ |
| 86934 | + serial_type += pRec->u.nZero*2; |
| 86935 | + if( nData ){ |
| 86936 | + if( sqlite3VdbeMemExpandBlob(pRec) ) goto no_mem; |
| 86937 | + len += pRec->u.nZero; |
| 86938 | + }else{ |
| 86939 | + nZero += pRec->u.nZero; |
| 86940 | + } |
| 86941 | + } |
| 86942 | + nData += len; |
| 86943 | + nHdr += sqlite3VarintLen(serial_type); |
| 86944 | + pRec->uTemp = serial_type; |
| 86945 | + } |
| 86757 | 86946 | if( pRec==pData0 ) break; |
| 86758 | 86947 | pRec--; |
| 86759 | 86948 | }while(1); |
| 86760 | 86949 | |
| 86761 | 86950 | /* EVIDENCE-OF: R-22564-11647 The header begins with a single varint |
| | @@ -87087,11 +87276,11 @@ |
| 87087 | 87276 | "cannot commit - no transaction is active")); |
| 87088 | 87277 | |
| 87089 | 87278 | rc = SQLITE_ERROR; |
| 87090 | 87279 | goto abort_due_to_error; |
| 87091 | 87280 | } |
| 87092 | | - break; |
| 87281 | + /*NOTREACHED*/ assert(0); |
| 87093 | 87282 | } |
| 87094 | 87283 | |
| 87095 | 87284 | /* Opcode: Transaction P1 P2 P3 P4 P5 |
| 87096 | 87285 | ** |
| 87097 | 87286 | ** Begin a transaction on database P1 if a transaction is not already |
| | @@ -87825,30 +88014,34 @@ |
| 87825 | 88014 | #endif |
| 87826 | 88015 | |
| 87827 | 88016 | pC->deferredMoveto = 0; |
| 87828 | 88017 | pC->cacheStatus = CACHE_STALE; |
| 87829 | 88018 | if( pC->isTable ){ |
| 88019 | + u16 flags3, newType; |
| 87830 | 88020 | /* The BTREE_SEEK_EQ flag is only set on index cursors */ |
| 87831 | 88021 | assert( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ)==0 |
| 87832 | 88022 | || CORRUPT_DB ); |
| 87833 | 88023 | |
| 87834 | 88024 | /* The input value in P3 might be of any type: integer, real, string, |
| 87835 | 88025 | ** blob, or NULL. But it needs to be an integer before we can do |
| 87836 | 88026 | ** the seek, so convert it. */ |
| 87837 | 88027 | pIn3 = &aMem[pOp->p3]; |
| 87838 | | - if( (pIn3->flags & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Str))==MEM_Str ){ |
| 88028 | + flags3 = pIn3->flags; |
| 88029 | + if( (flags3 & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Str))==MEM_Str ){ |
| 87839 | 88030 | applyNumericAffinity(pIn3, 0); |
| 87840 | 88031 | } |
| 87841 | | - iKey = sqlite3VdbeIntValue(pIn3); |
| 88032 | + iKey = sqlite3VdbeIntValue(pIn3); /* Get the integer key value */ |
| 88033 | + newType = pIn3->flags; /* Record the type after applying numeric affinity */ |
| 88034 | + pIn3->flags = flags3; /* But convert the type back to its original */ |
| 87842 | 88035 | |
| 87843 | 88036 | /* If the P3 value could not be converted into an integer without |
| 87844 | 88037 | ** loss of information, then special processing is required... */ |
| 87845 | | - if( (pIn3->flags & (MEM_Int|MEM_IntReal))==0 ){ |
| 87846 | | - if( (pIn3->flags & MEM_Real)==0 ){ |
| 87847 | | - if( (pIn3->flags & MEM_Null) || oc>=OP_SeekGE ){ |
| 87848 | | - VdbeBranchTaken(1,2); goto jump_to_p2; |
| 87849 | | - break; |
| 88038 | + if( (newType & (MEM_Int|MEM_IntReal))==0 ){ |
| 88039 | + if( (newType & MEM_Real)==0 ){ |
| 88040 | + if( (newType & MEM_Null) || oc>=OP_SeekGE ){ |
| 88041 | + VdbeBranchTaken(1,2); |
| 88042 | + goto jump_to_p2; |
| 87850 | 88043 | }else{ |
| 87851 | 88044 | rc = sqlite3BtreeLast(pC->uc.pCursor, &res); |
| 87852 | 88045 | if( rc!=SQLITE_OK ) goto abort_due_to_error; |
| 87853 | 88046 | goto seek_not_found; |
| 87854 | 88047 | } |
| | @@ -89138,15 +89331,16 @@ |
| 89138 | 89331 | |
| 89139 | 89332 | /* The Next opcode is only used after SeekGT, SeekGE, Rewind, and Found. |
| 89140 | 89333 | ** The Prev opcode is only used after SeekLT, SeekLE, and Last. */ |
| 89141 | 89334 | assert( pOp->opcode!=OP_Next |
| 89142 | 89335 | || pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE |
| 89143 | | - || pC->seekOp==OP_Rewind || pC->seekOp==OP_Found |
| 89144 | | - || pC->seekOp==OP_NullRow|| pC->seekOp==OP_SeekRowid); |
| 89336 | + || pC->seekOp==OP_Rewind || pC->seekOp==OP_Found |
| 89337 | + || pC->seekOp==OP_NullRow|| pC->seekOp==OP_SeekRowid |
| 89338 | + || pC->seekOp==OP_IfNoHope); |
| 89145 | 89339 | assert( pOp->opcode!=OP_Prev |
| 89146 | 89340 | || pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE |
| 89147 | | - || pC->seekOp==OP_Last |
| 89341 | + || pC->seekOp==OP_Last || pC->seekOp==OP_IfNoHope |
| 89148 | 89342 | || pC->seekOp==OP_NullRow); |
| 89149 | 89343 | |
| 89150 | 89344 | rc = pOp->p4.xAdvance(pC->uc.pCursor, pOp->p3); |
| 89151 | 89345 | next_tail: |
| 89152 | 89346 | pC->cacheStatus = CACHE_STALE; |
| | @@ -89661,11 +89855,11 @@ |
| 89661 | 89855 | initData.db = db; |
| 89662 | 89856 | initData.iDb = iDb; |
| 89663 | 89857 | initData.pzErrMsg = &p->zErrMsg; |
| 89664 | 89858 | initData.mInitFlags = 0; |
| 89665 | 89859 | zSql = sqlite3MPrintf(db, |
| 89666 | | - "SELECT name, rootpage, sql FROM '%q'.%s WHERE %s ORDER BY rowid", |
| 89860 | + "SELECT*FROM\"%w\".%s WHERE %s ORDER BY rowid", |
| 89667 | 89861 | db->aDb[iDb].zDbSName, zMaster, pOp->p4.z); |
| 89668 | 89862 | if( zSql==0 ){ |
| 89669 | 89863 | rc = SQLITE_NOMEM_BKPT; |
| 89670 | 89864 | }else{ |
| 89671 | 89865 | assert( db->init.busy==0 ); |
| | @@ -91868,15 +92062,16 @@ |
| 91868 | 92062 | Incrblob *p = (Incrblob *)pBlob; |
| 91869 | 92063 | int rc; |
| 91870 | 92064 | sqlite3 *db; |
| 91871 | 92065 | |
| 91872 | 92066 | if( p ){ |
| 92067 | + sqlite3_stmt *pStmt = p->pStmt; |
| 91873 | 92068 | db = p->db; |
| 91874 | 92069 | sqlite3_mutex_enter(db->mutex); |
| 91875 | | - rc = sqlite3_finalize(p->pStmt); |
| 91876 | 92070 | sqlite3DbFree(db, p); |
| 91877 | 92071 | sqlite3_mutex_leave(db->mutex); |
| 92072 | + rc = sqlite3_finalize(pStmt); |
| 91878 | 92073 | }else{ |
| 91879 | 92074 | rc = SQLITE_OK; |
| 91880 | 92075 | } |
| 91881 | 92076 | return rc; |
| 91882 | 92077 | } |
| | @@ -92852,11 +93047,12 @@ |
| 92852 | 93047 | res = vdbeSorterCompareTail( |
| 92853 | 93048 | pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2 |
| 92854 | 93049 | ); |
| 92855 | 93050 | } |
| 92856 | 93051 | }else{ |
| 92857 | | - if( pTask->pSorter->pKeyInfo->aSortOrder[0] ){ |
| 93052 | + assert( !(pTask->pSorter->pKeyInfo->aSortFlags[0]&KEYINFO_ORDER_BIGNULL) ); |
| 93053 | + if( pTask->pSorter->pKeyInfo->aSortFlags[0] ){ |
| 92858 | 93054 | res = res * -1; |
| 92859 | 93055 | } |
| 92860 | 93056 | } |
| 92861 | 93057 | |
| 92862 | 93058 | return res; |
| | @@ -92920,11 +93116,12 @@ |
| 92920 | 93116 | if( pTask->pSorter->pKeyInfo->nKeyField>1 ){ |
| 92921 | 93117 | res = vdbeSorterCompareTail( |
| 92922 | 93118 | pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2 |
| 92923 | 93119 | ); |
| 92924 | 93120 | } |
| 92925 | | - }else if( pTask->pSorter->pKeyInfo->aSortOrder[0] ){ |
| 93121 | + }else if( pTask->pSorter->pKeyInfo->aSortFlags[0] ){ |
| 93122 | + assert( !(pTask->pSorter->pKeyInfo->aSortFlags[0]&KEYINFO_ORDER_BIGNULL) ); |
| 92926 | 93123 | res = res * -1; |
| 92927 | 93124 | } |
| 92928 | 93125 | |
| 92929 | 93126 | return res; |
| 92930 | 93127 | } |
| | @@ -93035,10 +93232,11 @@ |
| 93035 | 93232 | } |
| 93036 | 93233 | } |
| 93037 | 93234 | |
| 93038 | 93235 | if( pKeyInfo->nAllField<13 |
| 93039 | 93236 | && (pKeyInfo->aColl[0]==0 || pKeyInfo->aColl[0]==db->pDfltColl) |
| 93237 | + && (pKeyInfo->aSortFlags[0] & KEYINFO_ORDER_BIGNULL)==0 |
| 93040 | 93238 | ){ |
| 93041 | 93239 | pSorter->typeMask = SORTER_TYPE_INTEGER | SORTER_TYPE_TEXT; |
| 93042 | 93240 | } |
| 93043 | 93241 | } |
| 93044 | 93242 | |
| | @@ -93751,17 +93949,20 @@ |
| 93751 | 93949 | if( i==nWorker ){ |
| 93752 | 93950 | /* Use the foreground thread for this operation */ |
| 93753 | 93951 | rc = vdbeSorterListToPMA(&pSorter->aTask[nWorker], &pSorter->list); |
| 93754 | 93952 | }else{ |
| 93755 | 93953 | /* Launch a background thread for this operation */ |
| 93756 | | - u8 *aMem = pTask->list.aMemory; |
| 93757 | | - void *pCtx = (void*)pTask; |
| 93954 | + u8 *aMem; |
| 93955 | + void *pCtx; |
| 93758 | 93956 | |
| 93957 | + assert( pTask!=0 ); |
| 93759 | 93958 | assert( pTask->pThread==0 && pTask->bDone==0 ); |
| 93760 | 93959 | assert( pTask->list.pList==0 ); |
| 93761 | 93960 | assert( pTask->list.aMemory==0 || pSorter->list.aMemory!=0 ); |
| 93762 | 93961 | |
| 93962 | + aMem = pTask->list.aMemory; |
| 93963 | + pCtx = (void*)pTask; |
| 93763 | 93964 | pSorter->iPrev = (u8)(pTask - pSorter->aTask); |
| 93764 | 93965 | pTask->list = pSorter->list; |
| 93765 | 93966 | pSorter->list.pList = 0; |
| 93766 | 93967 | pSorter->list.szPMA = 0; |
| 93767 | 93968 | if( aMem ){ |
| | @@ -94881,18 +95082,13 @@ |
| 94881 | 95082 | u8 *zOut = zBuf; |
| 94882 | 95083 | int nRead = iAmt; |
| 94883 | 95084 | int iChunkOffset; |
| 94884 | 95085 | FileChunk *pChunk; |
| 94885 | 95086 | |
| 94886 | | -#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ |
| 94887 | | - || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) |
| 94888 | 95087 | if( (iAmt+iOfst)>p->endpoint.iOffset ){ |
| 94889 | 95088 | return SQLITE_IOERR_SHORT_READ; |
| 94890 | 95089 | } |
| 94891 | | -#endif |
| 94892 | | - |
| 94893 | | - assert( (iAmt+iOfst)<=p->endpoint.iOffset ); |
| 94894 | 95090 | assert( p->readpoint.iOffset==0 || p->readpoint.pChunk!=0 ); |
| 94895 | 95091 | if( p->readpoint.iOffset!=iOfst || iOfst==0 ){ |
| 94896 | 95092 | sqlite3_int64 iOff = 0; |
| 94897 | 95093 | for(pChunk=p->pFirst; |
| 94898 | 95094 | ALWAYS(pChunk) && (iOff+p->nChunkSize)<=iOfst; |
| | @@ -95247,13 +95443,26 @@ |
| 95247 | 95443 | ** as the second argument. |
| 95248 | 95444 | */ |
| 95249 | 95445 | static int walkWindowList(Walker *pWalker, Window *pList){ |
| 95250 | 95446 | Window *pWin; |
| 95251 | 95447 | for(pWin=pList; pWin; pWin=pWin->pNextWin){ |
| 95252 | | - if( sqlite3WalkExprList(pWalker, pWin->pOrderBy) ) return WRC_Abort; |
| 95253 | | - if( sqlite3WalkExprList(pWalker, pWin->pPartition) ) return WRC_Abort; |
| 95254 | | - if( sqlite3WalkExpr(pWalker, pWin->pFilter) ) return WRC_Abort; |
| 95448 | + int rc; |
| 95449 | + rc = sqlite3WalkExprList(pWalker, pWin->pOrderBy); |
| 95450 | + if( rc ) return WRC_Abort; |
| 95451 | + rc = sqlite3WalkExprList(pWalker, pWin->pPartition); |
| 95452 | + if( rc ) return WRC_Abort; |
| 95453 | + rc = sqlite3WalkExpr(pWalker, pWin->pFilter); |
| 95454 | + if( rc ) return WRC_Abort; |
| 95455 | + |
| 95456 | + /* The next two are purely for calls to sqlite3RenameExprUnmap() |
| 95457 | + ** within sqlite3WindowOffsetExpr(). Because of constraints imposed |
| 95458 | + ** by sqlite3WindowOffsetExpr(), they can never fail. The results do |
| 95459 | + ** not matter anyhow. */ |
| 95460 | + rc = sqlite3WalkExpr(pWalker, pWin->pStart); |
| 95461 | + if( NEVER(rc) ) return WRC_Abort; |
| 95462 | + rc = sqlite3WalkExpr(pWalker, pWin->pEnd); |
| 95463 | + if( NEVER(rc) ) return WRC_Abort; |
| 95255 | 95464 | } |
| 95256 | 95465 | return WRC_Continue; |
| 95257 | 95466 | } |
| 95258 | 95467 | #endif |
| 95259 | 95468 | |
| | @@ -95285,22 +95494,26 @@ |
| 95285 | 95494 | if( rc ) return rc & WRC_Abort; |
| 95286 | 95495 | if( !ExprHasProperty(pExpr,(EP_TokenOnly|EP_Leaf)) ){ |
| 95287 | 95496 | if( pExpr->pLeft && walkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort; |
| 95288 | 95497 | assert( pExpr->x.pList==0 || pExpr->pRight==0 ); |
| 95289 | 95498 | if( pExpr->pRight ){ |
| 95499 | + assert( !ExprHasProperty(pExpr, EP_WinFunc) ); |
| 95290 | 95500 | pExpr = pExpr->pRight; |
| 95291 | 95501 | continue; |
| 95292 | 95502 | }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){ |
| 95503 | + assert( !ExprHasProperty(pExpr, EP_WinFunc) ); |
| 95293 | 95504 | if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort; |
| 95294 | | - }else if( pExpr->x.pList ){ |
| 95295 | | - if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort; |
| 95296 | | - } |
| 95505 | + }else{ |
| 95506 | + if( pExpr->x.pList ){ |
| 95507 | + if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort; |
| 95508 | + } |
| 95297 | 95509 | #ifndef SQLITE_OMIT_WINDOWFUNC |
| 95298 | | - if( ExprHasProperty(pExpr, EP_WinFunc) ){ |
| 95299 | | - if( walkWindowList(pWalker, pExpr->y.pWin) ) return WRC_Abort; |
| 95510 | + if( ExprHasProperty(pExpr, EP_WinFunc) ){ |
| 95511 | + if( walkWindowList(pWalker, pExpr->y.pWin) ) return WRC_Abort; |
| 95512 | + } |
| 95513 | +#endif |
| 95300 | 95514 | } |
| 95301 | | -#endif |
| 95302 | 95515 | } |
| 95303 | 95516 | break; |
| 95304 | 95517 | } |
| 95305 | 95518 | return WRC_Continue; |
| 95306 | 95519 | } |
| | @@ -95338,12 +95551,13 @@ |
| 95338 | 95551 | if( sqlite3WalkExpr(pWalker, p->pLimit) ) return WRC_Abort; |
| 95339 | 95552 | #if !defined(SQLITE_OMIT_WINDOWFUNC) && !defined(SQLITE_OMIT_ALTERTABLE) |
| 95340 | 95553 | { |
| 95341 | 95554 | Parse *pParse = pWalker->pParse; |
| 95342 | 95555 | if( pParse && IN_RENAME_OBJECT ){ |
| 95556 | + /* The following may return WRC_Abort if there are unresolvable |
| 95557 | + ** symbols (e.g. a table that does not exist) in a window definition. */ |
| 95343 | 95558 | int rc = walkWindowList(pWalker, p->pWinDefn); |
| 95344 | | - assert( rc==WRC_Continue ); |
| 95345 | 95559 | return rc; |
| 95346 | 95560 | } |
| 95347 | 95561 | } |
| 95348 | 95562 | #endif |
| 95349 | 95563 | return WRC_Continue; |
| | @@ -95796,11 +96010,11 @@ |
| 95796 | 96010 | }else |
| 95797 | 96011 | #endif /* SQLITE_OMIT_UPSERT */ |
| 95798 | 96012 | { |
| 95799 | 96013 | #ifndef SQLITE_OMIT_TRIGGER |
| 95800 | 96014 | if( iCol<0 ){ |
| 95801 | | - pExpr->affinity = SQLITE_AFF_INTEGER; |
| 96015 | + pExpr->affExpr = SQLITE_AFF_INTEGER; |
| 95802 | 96016 | }else if( pExpr->iTable==0 ){ |
| 95803 | 96017 | testcase( iCol==31 ); |
| 95804 | 96018 | testcase( iCol==32 ); |
| 95805 | 96019 | pParse->oldmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol)); |
| 95806 | 96020 | }else{ |
| | @@ -95828,11 +96042,11 @@ |
| 95828 | 96042 | && sqlite3IsRowid(zCol) |
| 95829 | 96043 | && VisibleRowid(pMatch->pTab) |
| 95830 | 96044 | ){ |
| 95831 | 96045 | cnt = 1; |
| 95832 | 96046 | pExpr->iColumn = -1; |
| 95833 | | - pExpr->affinity = SQLITE_AFF_INTEGER; |
| 96047 | + pExpr->affExpr = SQLITE_AFF_INTEGER; |
| 95834 | 96048 | } |
| 95835 | 96049 | |
| 95836 | 96050 | /* |
| 95837 | 96051 | ** If the input is of the form Z (not Y.Z or X.Y.Z) then the name Z |
| 95838 | 96052 | ** might refer to an result-set alias. This happens, for example, when |
| | @@ -96104,11 +96318,11 @@ |
| 96104 | 96318 | assert( HasRowid(pItem->pTab) && pItem->pTab->pSelect==0 ); |
| 96105 | 96319 | pExpr->op = TK_COLUMN; |
| 96106 | 96320 | pExpr->y.pTab = pItem->pTab; |
| 96107 | 96321 | pExpr->iTable = pItem->iCursor; |
| 96108 | 96322 | pExpr->iColumn = -1; |
| 96109 | | - pExpr->affinity = SQLITE_AFF_INTEGER; |
| 96323 | + pExpr->affExpr = SQLITE_AFF_INTEGER; |
| 96110 | 96324 | break; |
| 96111 | 96325 | } |
| 96112 | 96326 | #endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) |
| 96113 | 96327 | && !defined(SQLITE_OMIT_SUBQUERY) */ |
| 96114 | 96328 | |
| | @@ -96164,11 +96378,13 @@ |
| 96164 | 96378 | int nId; /* Number of characters in function name */ |
| 96165 | 96379 | const char *zId; /* The function name. */ |
| 96166 | 96380 | FuncDef *pDef; /* Information about the function */ |
| 96167 | 96381 | u8 enc = ENC(pParse->db); /* The database encoding */ |
| 96168 | 96382 | int savedAllowFlags = (pNC->ncFlags & (NC_AllowAgg | NC_AllowWin)); |
| 96169 | | - |
| 96383 | +#ifndef SQLITE_OMIT_WINDOWFUNC |
| 96384 | + Window *pWin = (IsWindowFunc(pExpr) ? pExpr->y.pWin : 0); |
| 96385 | +#endif |
| 96170 | 96386 | assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); |
| 96171 | 96387 | zId = pExpr->u.zToken; |
| 96172 | 96388 | nId = sqlite3Strlen30(zId); |
| 96173 | 96389 | pDef = sqlite3FindFunction(pParse->db, zId, n, enc, 0); |
| 96174 | 96390 | if( pDef==0 ){ |
| | @@ -96236,31 +96452,40 @@ |
| 96236 | 96452 | ){ |
| 96237 | 96453 | /* Internal-use-only functions are disallowed unless the |
| 96238 | 96454 | ** SQL is being compiled using sqlite3NestedParse() */ |
| 96239 | 96455 | no_such_func = 1; |
| 96240 | 96456 | pDef = 0; |
| 96457 | + }else |
| 96458 | + if( (pDef->funcFlags & SQLITE_FUNC_DIRECT)!=0 |
| 96459 | + && ExprHasProperty(pExpr, EP_Indirect) |
| 96460 | + && !IN_RENAME_OBJECT |
| 96461 | + ){ |
| 96462 | + /* Functions tagged with SQLITE_DIRECTONLY may not be used |
| 96463 | + ** inside of triggers and views */ |
| 96464 | + sqlite3ErrorMsg(pParse, "%s() prohibited in triggers and views", |
| 96465 | + pDef->zName); |
| 96241 | 96466 | } |
| 96242 | 96467 | } |
| 96243 | 96468 | |
| 96244 | 96469 | if( 0==IN_RENAME_OBJECT ){ |
| 96245 | 96470 | #ifndef SQLITE_OMIT_WINDOWFUNC |
| 96246 | 96471 | assert( is_agg==0 || (pDef->funcFlags & SQLITE_FUNC_MINMAX) |
| 96247 | 96472 | || (pDef->xValue==0 && pDef->xInverse==0) |
| 96248 | 96473 | || (pDef->xValue && pDef->xInverse && pDef->xSFunc && pDef->xFinalize) |
| 96249 | 96474 | ); |
| 96250 | | - if( pDef && pDef->xValue==0 && ExprHasProperty(pExpr, EP_WinFunc) ){ |
| 96475 | + if( pDef && pDef->xValue==0 && pWin ){ |
| 96251 | 96476 | sqlite3ErrorMsg(pParse, |
| 96252 | 96477 | "%.*s() may not be used as a window function", nId, zId |
| 96253 | 96478 | ); |
| 96254 | 96479 | pNC->nErr++; |
| 96255 | 96480 | }else if( |
| 96256 | 96481 | (is_agg && (pNC->ncFlags & NC_AllowAgg)==0) |
| 96257 | | - || (is_agg && (pDef->funcFlags&SQLITE_FUNC_WINDOW) && !pExpr->y.pWin) |
| 96258 | | - || (is_agg && pExpr->y.pWin && (pNC->ncFlags & NC_AllowWin)==0) |
| 96482 | + || (is_agg && (pDef->funcFlags&SQLITE_FUNC_WINDOW) && !pWin) |
| 96483 | + || (is_agg && pWin && (pNC->ncFlags & NC_AllowWin)==0) |
| 96259 | 96484 | ){ |
| 96260 | 96485 | const char *zType; |
| 96261 | | - if( (pDef->funcFlags & SQLITE_FUNC_WINDOW) || pExpr->y.pWin ){ |
| 96486 | + if( (pDef->funcFlags & SQLITE_FUNC_WINDOW) || pWin ){ |
| 96262 | 96487 | zType = "window"; |
| 96263 | 96488 | }else{ |
| 96264 | 96489 | zType = "aggregate"; |
| 96265 | 96490 | } |
| 96266 | 96491 | sqlite3ErrorMsg(pParse, "misuse of %s function %.*s()",zType,nId,zId); |
| | @@ -96284,51 +96509,66 @@ |
| 96284 | 96509 | }else if( wrong_num_args ){ |
| 96285 | 96510 | sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()", |
| 96286 | 96511 | nId, zId); |
| 96287 | 96512 | pNC->nErr++; |
| 96288 | 96513 | } |
| 96514 | +#ifndef SQLITE_OMIT_WINDOWFUNC |
| 96515 | + else if( is_agg==0 && ExprHasProperty(pExpr, EP_WinFunc) ){ |
| 96516 | + sqlite3ErrorMsg(pParse, |
| 96517 | + "FILTER may not be used with non-aggregate %.*s()", |
| 96518 | + nId, zId |
| 96519 | + ); |
| 96520 | + pNC->nErr++; |
| 96521 | + } |
| 96522 | +#endif |
| 96289 | 96523 | if( is_agg ){ |
| 96290 | 96524 | /* Window functions may not be arguments of aggregate functions. |
| 96291 | 96525 | ** Or arguments of other window functions. But aggregate functions |
| 96292 | 96526 | ** may be arguments for window functions. */ |
| 96293 | 96527 | #ifndef SQLITE_OMIT_WINDOWFUNC |
| 96294 | | - pNC->ncFlags &= ~(NC_AllowWin | (!pExpr->y.pWin ? NC_AllowAgg : 0)); |
| 96528 | + pNC->ncFlags &= ~(NC_AllowWin | (!pWin ? NC_AllowAgg : 0)); |
| 96295 | 96529 | #else |
| 96296 | 96530 | pNC->ncFlags &= ~NC_AllowAgg; |
| 96297 | 96531 | #endif |
| 96298 | 96532 | } |
| 96299 | 96533 | } |
| 96534 | +#ifndef SQLITE_OMIT_WINDOWFUNC |
| 96535 | + else if( ExprHasProperty(pExpr, EP_WinFunc) ){ |
| 96536 | + is_agg = 1; |
| 96537 | + } |
| 96538 | +#endif |
| 96300 | 96539 | sqlite3WalkExprList(pWalker, pList); |
| 96301 | 96540 | if( is_agg ){ |
| 96302 | 96541 | #ifndef SQLITE_OMIT_WINDOWFUNC |
| 96303 | | - if( pExpr->y.pWin ){ |
| 96542 | + if( pWin ){ |
| 96304 | 96543 | Select *pSel = pNC->pWinSelect; |
| 96544 | + assert( pWin==pExpr->y.pWin ); |
| 96305 | 96545 | if( IN_RENAME_OBJECT==0 ){ |
| 96306 | | - sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->y.pWin, pDef); |
| 96307 | | - } |
| 96308 | | - sqlite3WalkExprList(pWalker, pExpr->y.pWin->pPartition); |
| 96309 | | - sqlite3WalkExprList(pWalker, pExpr->y.pWin->pOrderBy); |
| 96310 | | - sqlite3WalkExpr(pWalker, pExpr->y.pWin->pFilter); |
| 96311 | | - if( 0==pSel->pWin |
| 96312 | | - || 0==sqlite3WindowCompare(pParse, pSel->pWin, pExpr->y.pWin) |
| 96313 | | - ){ |
| 96314 | | - pExpr->y.pWin->pNextWin = pSel->pWin; |
| 96315 | | - pSel->pWin = pExpr->y.pWin; |
| 96316 | | - } |
| 96546 | + sqlite3WindowUpdate(pParse, pSel->pWinDefn, pWin, pDef); |
| 96547 | + } |
| 96548 | + sqlite3WalkExprList(pWalker, pWin->pPartition); |
| 96549 | + sqlite3WalkExprList(pWalker, pWin->pOrderBy); |
| 96550 | + sqlite3WalkExpr(pWalker, pWin->pFilter); |
| 96551 | + sqlite3WindowLink(pSel, pWin); |
| 96317 | 96552 | pNC->ncFlags |= NC_HasWin; |
| 96318 | 96553 | }else |
| 96319 | 96554 | #endif /* SQLITE_OMIT_WINDOWFUNC */ |
| 96320 | 96555 | { |
| 96321 | 96556 | NameContext *pNC2 = pNC; |
| 96322 | 96557 | pExpr->op = TK_AGG_FUNCTION; |
| 96323 | 96558 | pExpr->op2 = 0; |
| 96559 | +#ifndef SQLITE_OMIT_WINDOWFUNC |
| 96560 | + if( ExprHasProperty(pExpr, EP_WinFunc) ){ |
| 96561 | + sqlite3WalkExpr(pWalker, pExpr->y.pWin->pFilter); |
| 96562 | + } |
| 96563 | +#endif |
| 96324 | 96564 | while( pNC2 && !sqlite3FunctionUsesThisSrc(pExpr, pNC2->pSrcList) ){ |
| 96325 | 96565 | pExpr->op2++; |
| 96326 | 96566 | pNC2 = pNC2->pNext; |
| 96327 | 96567 | } |
| 96328 | | - assert( pDef!=0 ); |
| 96329 | | - if( pNC2 ){ |
| 96568 | + assert( pDef!=0 || IN_RENAME_OBJECT ); |
| 96569 | + if( pNC2 && pDef ){ |
| 96330 | 96570 | assert( SQLITE_FUNC_MINMAX==NC_MinMaxAgg ); |
| 96331 | 96571 | testcase( (pDef->funcFlags & SQLITE_FUNC_MINMAX)!=0 ); |
| 96332 | 96572 | pNC2->ncFlags |= NC_HasAgg | (pDef->funcFlags & SQLITE_FUNC_MINMAX); |
| 96333 | 96573 | |
| 96334 | 96574 | } |
| | @@ -96362,11 +96602,11 @@ |
| 96362 | 96602 | notValid(pParse, pNC, "parameters", NC_IsCheck|NC_PartIdx|NC_IdxExpr); |
| 96363 | 96603 | break; |
| 96364 | 96604 | } |
| 96365 | 96605 | case TK_IS: |
| 96366 | 96606 | case TK_ISNOT: { |
| 96367 | | - Expr *pRight = sqlite3ExprSkipCollate(pExpr->pRight); |
| 96607 | + Expr *pRight = sqlite3ExprSkipCollateAndLikely(pExpr->pRight); |
| 96368 | 96608 | assert( !ExprHasProperty(pExpr, EP_Reduced) ); |
| 96369 | 96609 | /* Handle special cases of "x IS TRUE", "x IS FALSE", "x IS NOT TRUE", |
| 96370 | 96610 | ** and "x IS NOT FALSE". */ |
| 96371 | 96611 | if( pRight->op==TK_ID ){ |
| 96372 | 96612 | int rc = resolveExprStep(pWalker, pRight); |
| | @@ -96573,11 +96813,11 @@ |
| 96573 | 96813 | assert( pEList!=0 ); |
| 96574 | 96814 | for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){ |
| 96575 | 96815 | int iCol = -1; |
| 96576 | 96816 | Expr *pE, *pDup; |
| 96577 | 96817 | if( pItem->done ) continue; |
| 96578 | | - pE = sqlite3ExprSkipCollate(pItem->pExpr); |
| 96818 | + pE = sqlite3ExprSkipCollateAndLikely(pItem->pExpr); |
| 96579 | 96819 | if( sqlite3ExprIsInteger(pE, &iCol) ){ |
| 96580 | 96820 | if( iCol<=0 || iCol>pEList->nExpr ){ |
| 96581 | 96821 | resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr); |
| 96582 | 96822 | return 1; |
| 96583 | 96823 | } |
| | @@ -96667,11 +96907,11 @@ |
| 96667 | 96907 | int i; |
| 96668 | 96908 | sqlite3 *db = pParse->db; |
| 96669 | 96909 | ExprList *pEList; |
| 96670 | 96910 | struct ExprList_item *pItem; |
| 96671 | 96911 | |
| 96672 | | - if( pOrderBy==0 || pParse->db->mallocFailed ) return 0; |
| 96912 | + if( pOrderBy==0 || pParse->db->mallocFailed || IN_RENAME_OBJECT ) return 0; |
| 96673 | 96913 | if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ |
| 96674 | 96914 | sqlite3ErrorMsg(pParse, "too many terms in %s BY clause", zType); |
| 96675 | 96915 | return 1; |
| 96676 | 96916 | } |
| 96677 | 96917 | pEList = pSelect->pEList; |
| | @@ -96689,39 +96929,37 @@ |
| 96689 | 96929 | return 0; |
| 96690 | 96930 | } |
| 96691 | 96931 | |
| 96692 | 96932 | #ifndef SQLITE_OMIT_WINDOWFUNC |
| 96693 | 96933 | /* |
| 96694 | | -** Walker callback for resolveRemoveWindows(). |
| 96934 | +** Walker callback for windowRemoveExprFromSelect(). |
| 96695 | 96935 | */ |
| 96696 | 96936 | static int resolveRemoveWindowsCb(Walker *pWalker, Expr *pExpr){ |
| 96937 | + UNUSED_PARAMETER(pWalker); |
| 96697 | 96938 | if( ExprHasProperty(pExpr, EP_WinFunc) ){ |
| 96698 | | - Window **pp; |
| 96699 | | - for(pp=&pWalker->u.pSelect->pWin; *pp; pp=&(*pp)->pNextWin){ |
| 96700 | | - if( *pp==pExpr->y.pWin ){ |
| 96701 | | - *pp = (*pp)->pNextWin; |
| 96702 | | - break; |
| 96703 | | - } |
| 96704 | | - } |
| 96939 | + Window *pWin = pExpr->y.pWin; |
| 96940 | + sqlite3WindowUnlinkFromSelect(pWin); |
| 96705 | 96941 | } |
| 96706 | 96942 | return WRC_Continue; |
| 96707 | 96943 | } |
| 96708 | 96944 | |
| 96709 | 96945 | /* |
| 96710 | 96946 | ** Remove any Window objects owned by the expression pExpr from the |
| 96711 | 96947 | ** Select.pWin list of Select object pSelect. |
| 96712 | 96948 | */ |
| 96713 | | -static void resolveRemoveWindows(Select *pSelect, Expr *pExpr){ |
| 96714 | | - Walker sWalker; |
| 96715 | | - memset(&sWalker, 0, sizeof(Walker)); |
| 96716 | | - sWalker.xExprCallback = resolveRemoveWindowsCb; |
| 96717 | | - sWalker.u.pSelect = pSelect; |
| 96718 | | - sqlite3WalkExpr(&sWalker, pExpr); |
| 96949 | +static void windowRemoveExprFromSelect(Select *pSelect, Expr *pExpr){ |
| 96950 | + if( pSelect->pWin ){ |
| 96951 | + Walker sWalker; |
| 96952 | + memset(&sWalker, 0, sizeof(Walker)); |
| 96953 | + sWalker.xExprCallback = resolveRemoveWindowsCb; |
| 96954 | + sWalker.u.pSelect = pSelect; |
| 96955 | + sqlite3WalkExpr(&sWalker, pExpr); |
| 96956 | + } |
| 96719 | 96957 | } |
| 96720 | 96958 | #else |
| 96721 | | -# define resolveRemoveWindows(x,y) |
| 96722 | | -#endif |
| 96959 | +# define windowRemoveExprFromSelect(a, b) |
| 96960 | +#endif /* SQLITE_OMIT_WINDOWFUNC */ |
| 96723 | 96961 | |
| 96724 | 96962 | /* |
| 96725 | 96963 | ** pOrderBy is an ORDER BY or GROUP BY clause in SELECT statement pSelect. |
| 96726 | 96964 | ** The Name context of the SELECT statement is pNC. zType is either |
| 96727 | 96965 | ** "ORDER" or "GROUP" depending on which type of clause pOrderBy is. |
| | @@ -96754,11 +96992,11 @@ |
| 96754 | 96992 | if( pOrderBy==0 ) return 0; |
| 96755 | 96993 | nResult = pSelect->pEList->nExpr; |
| 96756 | 96994 | pParse = pNC->pParse; |
| 96757 | 96995 | for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){ |
| 96758 | 96996 | Expr *pE = pItem->pExpr; |
| 96759 | | - Expr *pE2 = sqlite3ExprSkipCollate(pE); |
| 96997 | + Expr *pE2 = sqlite3ExprSkipCollateAndLikely(pE); |
| 96760 | 96998 | if( zType[0]!='G' ){ |
| 96761 | 96999 | iCol = resolveAsName(pParse, pSelect->pEList, pE2); |
| 96762 | 97000 | if( iCol>0 ){ |
| 96763 | 97001 | /* If an AS-name match is found, mark this ORDER BY column as being |
| 96764 | 97002 | ** a copy of the iCol-th result-set column. The subsequent call to |
| | @@ -96788,11 +97026,11 @@ |
| 96788 | 97026 | for(j=0; j<pSelect->pEList->nExpr; j++){ |
| 96789 | 97027 | if( sqlite3ExprCompare(0, pE, pSelect->pEList->a[j].pExpr, -1)==0 ){ |
| 96790 | 97028 | /* Since this expresion is being changed into a reference |
| 96791 | 97029 | ** to an identical expression in the result set, remove all Window |
| 96792 | 97030 | ** objects belonging to the expression from the Select.pWin list. */ |
| 96793 | | - resolveRemoveWindows(pSelect, pE); |
| 97031 | + windowRemoveExprFromSelect(pSelect, pE); |
| 96794 | 97032 | pItem->u.x.iOrderByCol = j+1; |
| 96795 | 97033 | } |
| 96796 | 97034 | } |
| 96797 | 97035 | } |
| 96798 | 97036 | return sqlite3ResolveOrderGroupBy(pParse, pSelect, pOrderBy, zType); |
| | @@ -97256,11 +97494,10 @@ |
| 97256 | 97494 | ** SELECT a AS b FROM t1 WHERE b; |
| 97257 | 97495 | ** SELECT * FROM t1 WHERE (select a from t1); |
| 97258 | 97496 | */ |
| 97259 | 97497 | SQLITE_PRIVATE char sqlite3ExprAffinity(Expr *pExpr){ |
| 97260 | 97498 | int op; |
| 97261 | | - if( pExpr->flags & EP_Generic ) return 0; |
| 97262 | 97499 | while( ExprHasProperty(pExpr, EP_Skip) ){ |
| 97263 | 97500 | assert( pExpr->op==TK_COLLATE ); |
| 97264 | 97501 | pExpr = pExpr->pLeft; |
| 97265 | 97502 | assert( pExpr!=0 ); |
| 97266 | 97503 | } |
| | @@ -97283,11 +97520,11 @@ |
| 97283 | 97520 | assert( pExpr->pLeft->flags&EP_xIsSelect ); |
| 97284 | 97521 | return sqlite3ExprAffinity( |
| 97285 | 97522 | pExpr->pLeft->x.pSelect->pEList->a[pExpr->iColumn].pExpr |
| 97286 | 97523 | ); |
| 97287 | 97524 | } |
| 97288 | | - return pExpr->affinity; |
| 97525 | + return pExpr->affExpr; |
| 97289 | 97526 | } |
| 97290 | 97527 | |
| 97291 | 97528 | /* |
| 97292 | 97529 | ** Set the collating sequence for expression pExpr to be the collating |
| 97293 | 97530 | ** sequence named by pToken. Return a pointer to a new Expr node that |
| | @@ -97318,14 +97555,26 @@ |
| 97318 | 97555 | sqlite3TokenInit(&s, (char*)zC); |
| 97319 | 97556 | return sqlite3ExprAddCollateToken(pParse, pExpr, &s, 0); |
| 97320 | 97557 | } |
| 97321 | 97558 | |
| 97322 | 97559 | /* |
| 97323 | | -** Skip over any TK_COLLATE operators and any unlikely() |
| 97324 | | -** or likelihood() function at the root of an expression. |
| 97560 | +** Skip over any TK_COLLATE operators. |
| 97325 | 97561 | */ |
| 97326 | 97562 | SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr *pExpr){ |
| 97563 | + while( pExpr && ExprHasProperty(pExpr, EP_Skip) ){ |
| 97564 | + assert( pExpr->op==TK_COLLATE ); |
| 97565 | + pExpr = pExpr->pLeft; |
| 97566 | + } |
| 97567 | + return pExpr; |
| 97568 | +} |
| 97569 | + |
| 97570 | +/* |
| 97571 | +** Skip over any TK_COLLATE operators and/or any unlikely() |
| 97572 | +** or likelihood() or likely() functions at the root of an |
| 97573 | +** expression. |
| 97574 | +*/ |
| 97575 | +SQLITE_PRIVATE Expr *sqlite3ExprSkipCollateAndLikely(Expr *pExpr){ |
| 97327 | 97576 | while( pExpr && ExprHasProperty(pExpr, EP_Skip|EP_Unlikely) ){ |
| 97328 | 97577 | if( ExprHasProperty(pExpr, EP_Unlikely) ){ |
| 97329 | 97578 | assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); |
| 97330 | 97579 | assert( pExpr->x.pList->nExpr>0 ); |
| 97331 | 97580 | assert( pExpr->op==TK_FUNCTION ); |
| | @@ -97356,11 +97605,10 @@ |
| 97356 | 97605 | sqlite3 *db = pParse->db; |
| 97357 | 97606 | CollSeq *pColl = 0; |
| 97358 | 97607 | Expr *p = pExpr; |
| 97359 | 97608 | while( p ){ |
| 97360 | 97609 | int op = p->op; |
| 97361 | | - if( p->flags & EP_Generic ) break; |
| 97362 | 97610 | if( op==TK_REGISTER ) op = p->op2; |
| 97363 | 97611 | if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_TRIGGER) |
| 97364 | 97612 | && p->y.pTab!=0 |
| 97365 | 97613 | ){ |
| 97366 | 97614 | /* op==TK_REGISTER && p->y.pTab!=0 happens when pExpr was originally |
| | @@ -97442,28 +97690,23 @@ |
| 97442 | 97690 | ** type affinity of the other operand. This routine returns the |
| 97443 | 97691 | ** type affinity that should be used for the comparison operator. |
| 97444 | 97692 | */ |
| 97445 | 97693 | SQLITE_PRIVATE char sqlite3CompareAffinity(Expr *pExpr, char aff2){ |
| 97446 | 97694 | char aff1 = sqlite3ExprAffinity(pExpr); |
| 97447 | | - if( aff1 && aff2 ){ |
| 97695 | + if( aff1>SQLITE_AFF_NONE && aff2>SQLITE_AFF_NONE ){ |
| 97448 | 97696 | /* Both sides of the comparison are columns. If one has numeric |
| 97449 | 97697 | ** affinity, use that. Otherwise use no affinity. |
| 97450 | 97698 | */ |
| 97451 | 97699 | if( sqlite3IsNumericAffinity(aff1) || sqlite3IsNumericAffinity(aff2) ){ |
| 97452 | 97700 | return SQLITE_AFF_NUMERIC; |
| 97453 | 97701 | }else{ |
| 97454 | 97702 | return SQLITE_AFF_BLOB; |
| 97455 | 97703 | } |
| 97456 | | - }else if( !aff1 && !aff2 ){ |
| 97457 | | - /* Neither side of the comparison is a column. Compare the |
| 97458 | | - ** results directly. |
| 97459 | | - */ |
| 97460 | | - return SQLITE_AFF_BLOB; |
| 97461 | 97704 | }else{ |
| 97462 | 97705 | /* One side is a column, the other is not. Use the columns affinity. */ |
| 97463 | | - assert( aff1==0 || aff2==0 ); |
| 97464 | | - return (aff1 + aff2); |
| 97706 | + assert( aff1<=SQLITE_AFF_NONE || aff2<=SQLITE_AFF_NONE ); |
| 97707 | + return (aff1<=SQLITE_AFF_NONE ? aff2 : aff1) | SQLITE_AFF_NONE; |
| 97465 | 97708 | } |
| 97466 | 97709 | } |
| 97467 | 97710 | |
| 97468 | 97711 | /* |
| 97469 | 97712 | ** pExpr is a comparison operator. Return the type affinity that should |
| | @@ -97492,18 +97735,17 @@ |
| 97492 | 97735 | ** if the index with affinity idx_affinity may be used to implement |
| 97493 | 97736 | ** the comparison in pExpr. |
| 97494 | 97737 | */ |
| 97495 | 97738 | SQLITE_PRIVATE int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity){ |
| 97496 | 97739 | char aff = comparisonAffinity(pExpr); |
| 97497 | | - switch( aff ){ |
| 97498 | | - case SQLITE_AFF_BLOB: |
| 97499 | | - return 1; |
| 97500 | | - case SQLITE_AFF_TEXT: |
| 97501 | | - return idx_affinity==SQLITE_AFF_TEXT; |
| 97502 | | - default: |
| 97503 | | - return sqlite3IsNumericAffinity(idx_affinity); |
| 97504 | | - } |
| 97740 | + if( aff<SQLITE_AFF_TEXT ){ |
| 97741 | + return 1; |
| 97742 | + } |
| 97743 | + if( aff==SQLITE_AFF_TEXT ){ |
| 97744 | + return idx_affinity==SQLITE_AFF_TEXT; |
| 97745 | + } |
| 97746 | + return sqlite3IsNumericAffinity(idx_affinity); |
| 97505 | 97747 | } |
| 97506 | 97748 | |
| 97507 | 97749 | /* |
| 97508 | 97750 | ** Return the P5 value that should be used for a binary comparison |
| 97509 | 97751 | ** opcode (OP_Eq, OP_Ge etc.) used to compare pExpr1 and pExpr2. |
| | @@ -98252,19 +98494,22 @@ |
| 98252 | 98494 | if( !ExprHasProperty(p, (EP_TokenOnly|EP_Leaf)) ){ |
| 98253 | 98495 | /* The Expr.x union is never used at the same time as Expr.pRight */ |
| 98254 | 98496 | assert( p->x.pList==0 || p->pRight==0 ); |
| 98255 | 98497 | if( p->pLeft && p->op!=TK_SELECT_COLUMN ) sqlite3ExprDeleteNN(db, p->pLeft); |
| 98256 | 98498 | if( p->pRight ){ |
| 98499 | + assert( !ExprHasProperty(p, EP_WinFunc) ); |
| 98257 | 98500 | sqlite3ExprDeleteNN(db, p->pRight); |
| 98258 | 98501 | }else if( ExprHasProperty(p, EP_xIsSelect) ){ |
| 98502 | + assert( !ExprHasProperty(p, EP_WinFunc) ); |
| 98259 | 98503 | sqlite3SelectDelete(db, p->x.pSelect); |
| 98260 | 98504 | }else{ |
| 98261 | 98505 | sqlite3ExprListDelete(db, p->x.pList); |
| 98262 | | - } |
| 98263 | | - if( ExprHasProperty(p, EP_WinFunc) ){ |
| 98264 | | - assert( p->op==TK_FUNCTION ); |
| 98265 | | - sqlite3WindowDelete(db, p->y.pWin); |
| 98506 | +#ifndef SQLITE_OMIT_WINDOWFUNC |
| 98507 | + if( ExprHasProperty(p, EP_WinFunc) ){ |
| 98508 | + sqlite3WindowDelete(db, p->y.pWin); |
| 98509 | + } |
| 98510 | +#endif |
| 98266 | 98511 | } |
| 98267 | 98512 | } |
| 98268 | 98513 | if( ExprHasProperty(p, EP_MemToken) ) sqlite3DbFree(db, p->u.zToken); |
| 98269 | 98514 | if( !ExprHasProperty(p, EP_Static) ){ |
| 98270 | 98515 | sqlite3DbFreeNN(db, p); |
| | @@ -98295,20 +98540,10 @@ |
| 98295 | 98540 | if( ExprHasProperty(p, EP_TokenOnly) ) return EXPR_TOKENONLYSIZE; |
| 98296 | 98541 | if( ExprHasProperty(p, EP_Reduced) ) return EXPR_REDUCEDSIZE; |
| 98297 | 98542 | return EXPR_FULLSIZE; |
| 98298 | 98543 | } |
| 98299 | 98544 | |
| 98300 | | -/* |
| 98301 | | -** Copy the complete content of an Expr node, taking care not to read |
| 98302 | | -** past the end of the structure for a reduced-size version of the source |
| 98303 | | -** Expr. |
| 98304 | | -*/ |
| 98305 | | -static void exprNodeCopy(Expr *pDest, Expr *pSrc){ |
| 98306 | | - memset(pDest, 0, sizeof(Expr)); |
| 98307 | | - memcpy(pDest, pSrc, exprStructSize(pSrc)); |
| 98308 | | -} |
| 98309 | | - |
| 98310 | 98545 | /* |
| 98311 | 98546 | ** The dupedExpr*Size() routines each return the number of bytes required |
| 98312 | 98547 | ** to store a copy of an expression or expression tree. They differ in |
| 98313 | 98548 | ** how much of the tree is measured. |
| 98314 | 98549 | ** |
| | @@ -98544,14 +98779,17 @@ |
| 98544 | 98779 | ** gatherSelectWindowsCallback() are used to scan all the expressions |
| 98545 | 98780 | ** an a newly duplicated SELECT statement and gather all of the Window |
| 98546 | 98781 | ** objects found there, assembling them onto the linked list at Select->pWin. |
| 98547 | 98782 | */ |
| 98548 | 98783 | static int gatherSelectWindowsCallback(Walker *pWalker, Expr *pExpr){ |
| 98549 | | - if( pExpr->op==TK_FUNCTION && pExpr->y.pWin!=0 ){ |
| 98550 | | - assert( ExprHasProperty(pExpr, EP_WinFunc) ); |
| 98551 | | - pExpr->y.pWin->pNextWin = pWalker->u.pSelect->pWin; |
| 98552 | | - pWalker->u.pSelect->pWin = pExpr->y.pWin; |
| 98784 | + if( pExpr->op==TK_FUNCTION && ExprHasProperty(pExpr, EP_WinFunc) ){ |
| 98785 | + Select *pSelect = pWalker->u.pSelect; |
| 98786 | + Window *pWin = pExpr->y.pWin; |
| 98787 | + assert( pWin ); |
| 98788 | + assert( IsWindowFunc(pExpr) ); |
| 98789 | + assert( pWin->ppThis==0 ); |
| 98790 | + sqlite3WindowLink(pSelect, pWin); |
| 98553 | 98791 | } |
| 98554 | 98792 | return WRC_Continue; |
| 98555 | 98793 | } |
| 98556 | 98794 | static int gatherSelectWindowsSelectCallback(Walker *pWalker, Select *p){ |
| 98557 | 98795 | return p==pWalker->u.pSelect ? WRC_Continue : WRC_Prune; |
| | @@ -98621,12 +98859,13 @@ |
| 98621 | 98859 | pNewExpr->pLeft = pPriorSelectCol; |
| 98622 | 98860 | } |
| 98623 | 98861 | } |
| 98624 | 98862 | pItem->zName = sqlite3DbStrDup(db, pOldItem->zName); |
| 98625 | 98863 | pItem->zSpan = sqlite3DbStrDup(db, pOldItem->zSpan); |
| 98626 | | - pItem->sortOrder = pOldItem->sortOrder; |
| 98864 | + pItem->sortFlags = pOldItem->sortFlags; |
| 98627 | 98865 | pItem->done = 0; |
| 98866 | + pItem->bNulls = pOldItem->bNulls; |
| 98628 | 98867 | pItem->bSpanIsTab = pOldItem->bSpanIsTab; |
| 98629 | 98868 | pItem->bSorterRef = pOldItem->bSorterRef; |
| 98630 | 98869 | pItem->u = pOldItem->u; |
| 98631 | 98870 | } |
| 98632 | 98871 | return pNew; |
| | @@ -98733,11 +98972,11 @@ |
| 98733 | 98972 | pNew->nSelectRow = p->nSelectRow; |
| 98734 | 98973 | pNew->pWith = withDup(db, p->pWith); |
| 98735 | 98974 | #ifndef SQLITE_OMIT_WINDOWFUNC |
| 98736 | 98975 | pNew->pWin = 0; |
| 98737 | 98976 | pNew->pWinDefn = sqlite3WindowListDup(db, p->pWinDefn); |
| 98738 | | - if( p->pWin ) gatherSelectWindows(pNew); |
| 98977 | + if( p->pWin && db->mallocFailed==0 ) gatherSelectWindows(pNew); |
| 98739 | 98978 | #endif |
| 98740 | 98979 | pNew->selId = p->selId; |
| 98741 | 98980 | *pp = pNew; |
| 98742 | 98981 | pp = &pNew->pPrior; |
| 98743 | 98982 | pNext = pNew; |
| | @@ -98842,10 +99081,14 @@ |
| 98842 | 99081 | goto vector_append_error; |
| 98843 | 99082 | } |
| 98844 | 99083 | |
| 98845 | 99084 | for(i=0; i<pColumns->nId; i++){ |
| 98846 | 99085 | Expr *pSubExpr = sqlite3ExprForVectorField(pParse, pExpr, i); |
| 99086 | + assert( pSubExpr!=0 || db->mallocFailed ); |
| 99087 | + assert( pSubExpr==0 || pSubExpr->iTable==0 ); |
| 99088 | + if( pSubExpr==0 ) continue; |
| 99089 | + pSubExpr->iTable = pColumns->nId; |
| 98847 | 99090 | pList = sqlite3ExprListAppend(pParse, pList, pSubExpr); |
| 98848 | 99091 | if( pList ){ |
| 98849 | 99092 | assert( pList->nExpr==iFirst+i+1 ); |
| 98850 | 99093 | pList->a[pList->nExpr-1].zName = pColumns->a[i].zName; |
| 98851 | 99094 | pColumns->a[i].zName = 0; |
| | @@ -98874,19 +99117,38 @@ |
| 98874 | 99117 | } |
| 98875 | 99118 | |
| 98876 | 99119 | /* |
| 98877 | 99120 | ** Set the sort order for the last element on the given ExprList. |
| 98878 | 99121 | */ |
| 98879 | | -SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder){ |
| 99122 | +SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder, int eNulls){ |
| 99123 | + struct ExprList_item *pItem; |
| 98880 | 99124 | if( p==0 ) return; |
| 98881 | | - assert( SQLITE_SO_UNDEFINED<0 && SQLITE_SO_ASC>=0 && SQLITE_SO_DESC>0 ); |
| 98882 | 99125 | assert( p->nExpr>0 ); |
| 98883 | | - if( iSortOrder<0 ){ |
| 98884 | | - assert( p->a[p->nExpr-1].sortOrder==SQLITE_SO_ASC ); |
| 98885 | | - return; |
| 99126 | + |
| 99127 | + assert( SQLITE_SO_UNDEFINED<0 && SQLITE_SO_ASC==0 && SQLITE_SO_DESC>0 ); |
| 99128 | + assert( iSortOrder==SQLITE_SO_UNDEFINED |
| 99129 | + || iSortOrder==SQLITE_SO_ASC |
| 99130 | + || iSortOrder==SQLITE_SO_DESC |
| 99131 | + ); |
| 99132 | + assert( eNulls==SQLITE_SO_UNDEFINED |
| 99133 | + || eNulls==SQLITE_SO_ASC |
| 99134 | + || eNulls==SQLITE_SO_DESC |
| 99135 | + ); |
| 99136 | + |
| 99137 | + pItem = &p->a[p->nExpr-1]; |
| 99138 | + assert( pItem->bNulls==0 ); |
| 99139 | + if( iSortOrder==SQLITE_SO_UNDEFINED ){ |
| 99140 | + iSortOrder = SQLITE_SO_ASC; |
| 98886 | 99141 | } |
| 98887 | | - p->a[p->nExpr-1].sortOrder = (u8)iSortOrder; |
| 99142 | + pItem->sortFlags = (u8)iSortOrder; |
| 99143 | + |
| 99144 | + if( eNulls!=SQLITE_SO_UNDEFINED ){ |
| 99145 | + pItem->bNulls = 1; |
| 99146 | + if( iSortOrder!=eNulls ){ |
| 99147 | + pItem->sortFlags |= KEYINFO_ORDER_BIGNULL; |
| 99148 | + } |
| 99149 | + } |
| 98888 | 99150 | } |
| 98889 | 99151 | |
| 98890 | 99152 | /* |
| 98891 | 99153 | ** Set the ExprList.a[].zName element of the most recently added item |
| 98892 | 99154 | ** on the expression list. |
| | @@ -99381,31 +99643,34 @@ |
| 99381 | 99643 | ** is harmless. A false positive, however, can result in the wrong |
| 99382 | 99644 | ** answer. |
| 99383 | 99645 | */ |
| 99384 | 99646 | SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){ |
| 99385 | 99647 | u8 op; |
| 99648 | + int unaryMinus = 0; |
| 99386 | 99649 | if( aff==SQLITE_AFF_BLOB ) return 1; |
| 99387 | | - while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; } |
| 99650 | + while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ |
| 99651 | + if( p->op==TK_UMINUS ) unaryMinus = 1; |
| 99652 | + p = p->pLeft; |
| 99653 | + } |
| 99388 | 99654 | op = p->op; |
| 99389 | 99655 | if( op==TK_REGISTER ) op = p->op2; |
| 99390 | 99656 | switch( op ){ |
| 99391 | 99657 | case TK_INTEGER: { |
| 99392 | | - return aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC; |
| 99658 | + return aff>=SQLITE_AFF_NUMERIC; |
| 99393 | 99659 | } |
| 99394 | 99660 | case TK_FLOAT: { |
| 99395 | | - return aff==SQLITE_AFF_REAL || aff==SQLITE_AFF_NUMERIC; |
| 99661 | + return aff>=SQLITE_AFF_NUMERIC; |
| 99396 | 99662 | } |
| 99397 | 99663 | case TK_STRING: { |
| 99398 | | - return aff==SQLITE_AFF_TEXT; |
| 99664 | + return !unaryMinus && aff==SQLITE_AFF_TEXT; |
| 99399 | 99665 | } |
| 99400 | 99666 | case TK_BLOB: { |
| 99401 | | - return 1; |
| 99667 | + return !unaryMinus; |
| 99402 | 99668 | } |
| 99403 | 99669 | case TK_COLUMN: { |
| 99404 | 99670 | assert( p->iTable>=0 ); /* p cannot be part of a CHECK constraint */ |
| 99405 | | - return p->iColumn<0 |
| 99406 | | - && (aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC); |
| 99671 | + return aff>=SQLITE_AFF_NUMERIC && p->iColumn<0; |
| 99407 | 99672 | } |
| 99408 | 99673 | default: { |
| 99409 | 99674 | return 0; |
| 99410 | 99675 | } |
| 99411 | 99676 | } |
| | @@ -99584,11 +99849,11 @@ |
| 99584 | 99849 | ** then aiMap[] is populated with {2, 0, 1}. |
| 99585 | 99850 | */ |
| 99586 | 99851 | #ifndef SQLITE_OMIT_SUBQUERY |
| 99587 | 99852 | SQLITE_PRIVATE int sqlite3FindInIndex( |
| 99588 | 99853 | Parse *pParse, /* Parsing context */ |
| 99589 | | - Expr *pX, /* The right-hand side (RHS) of the IN operator */ |
| 99854 | + Expr *pX, /* The IN expression */ |
| 99590 | 99855 | u32 inFlags, /* IN_INDEX_LOOP, _MEMBERSHIP, and/or _NOOP_OK */ |
| 99591 | 99856 | int *prRhsHasNull, /* Register holding NULL status. See notes */ |
| 99592 | 99857 | int *aiMap, /* Mapping from Index fields to RHS fields */ |
| 99593 | 99858 | int *piTab /* OUT: index to use */ |
| 99594 | 99859 | ){ |
| | @@ -100009,13 +100274,13 @@ |
| 100009 | 100274 | */ |
| 100010 | 100275 | char affinity; /* Affinity of the LHS of the IN */ |
| 100011 | 100276 | int i; |
| 100012 | 100277 | ExprList *pList = pExpr->x.pList; |
| 100013 | 100278 | struct ExprList_item *pItem; |
| 100014 | | - int r1, r2, r3; |
| 100279 | + int r1, r2; |
| 100015 | 100280 | affinity = sqlite3ExprAffinity(pLeft); |
| 100016 | | - if( !affinity ){ |
| 100281 | + if( affinity<=SQLITE_AFF_NONE ){ |
| 100017 | 100282 | affinity = SQLITE_AFF_BLOB; |
| 100018 | 100283 | } |
| 100019 | 100284 | if( pKeyInfo ){ |
| 100020 | 100285 | assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); |
| 100021 | 100286 | pKeyInfo->aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft); |
| | @@ -100037,13 +100302,13 @@ |
| 100037 | 100302 | ExprClearProperty(pExpr, EP_Subrtn); |
| 100038 | 100303 | addrOnce = 0; |
| 100039 | 100304 | } |
| 100040 | 100305 | |
| 100041 | 100306 | /* Evaluate the expression and insert it into the temp table */ |
| 100042 | | - r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); |
| 100043 | | - sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); |
| 100044 | | - sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r2, r3, 1); |
| 100307 | + sqlite3ExprCode(pParse, pE2, r1); |
| 100308 | + sqlite3VdbeAddOp4(v, OP_MakeRecord, r1, 1, r2, &affinity, 1); |
| 100309 | + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r2, r1, 1); |
| 100045 | 100310 | } |
| 100046 | 100311 | sqlite3ReleaseTempReg(pParse, r1); |
| 100047 | 100312 | sqlite3ReleaseTempReg(pParse, r2); |
| 100048 | 100313 | } |
| 100049 | 100314 | if( pKeyInfo ){ |
| | @@ -100065,11 +100330,11 @@ |
| 100065 | 100330 | ** (SELECT a FROM b) -- subquery |
| 100066 | 100331 | ** EXISTS (SELECT a FROM b) -- EXISTS subquery |
| 100067 | 100332 | ** |
| 100068 | 100333 | ** The pExpr parameter is the SELECT or EXISTS operator to be coded. |
| 100069 | 100334 | ** |
| 100070 | | -** The register that holds the result. For a multi-column SELECT, |
| 100335 | +** Return the register that holds the result. For a multi-column SELECT, |
| 100071 | 100336 | ** the result is stored in a contiguous array of registers and the |
| 100072 | 100337 | ** return value is the register of the left-most result column. |
| 100073 | 100338 | ** Return 0 if an error occurs. |
| 100074 | 100339 | */ |
| 100075 | 100340 | #ifndef SQLITE_OMIT_SUBQUERY |
| | @@ -100309,17 +100574,25 @@ |
| 100309 | 100574 | CollSeq *pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft); |
| 100310 | 100575 | int labelOk = sqlite3VdbeMakeLabel(pParse); |
| 100311 | 100576 | int r2, regToFree; |
| 100312 | 100577 | int regCkNull = 0; |
| 100313 | 100578 | int ii; |
| 100579 | + int bLhsReal; /* True if the LHS of the IN has REAL affinity */ |
| 100314 | 100580 | assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); |
| 100315 | 100581 | if( destIfNull!=destIfFalse ){ |
| 100316 | 100582 | regCkNull = sqlite3GetTempReg(pParse); |
| 100317 | 100583 | sqlite3VdbeAddOp3(v, OP_BitAnd, rLhs, rLhs, regCkNull); |
| 100318 | 100584 | } |
| 100585 | + bLhsReal = sqlite3ExprAffinity(pExpr->pLeft)==SQLITE_AFF_REAL; |
| 100319 | 100586 | for(ii=0; ii<pList->nExpr; ii++){ |
| 100320 | | - r2 = sqlite3ExprCodeTemp(pParse, pList->a[ii].pExpr, ®ToFree); |
| 100587 | + if( bLhsReal ){ |
| 100588 | + r2 = regToFree = sqlite3GetTempReg(pParse); |
| 100589 | + sqlite3ExprCode(pParse, pList->a[ii].pExpr, r2); |
| 100590 | + sqlite3VdbeAddOp4(v, OP_Affinity, r2, 1, 0, "E", P4_STATIC); |
| 100591 | + }else{ |
| 100592 | + r2 = sqlite3ExprCodeTemp(pParse, pList->a[ii].pExpr, ®ToFree); |
| 100593 | + } |
| 100321 | 100594 | if( regCkNull && sqlite3ExprCanBeNull(pList->a[ii].pExpr) ){ |
| 100322 | 100595 | sqlite3VdbeAddOp3(v, OP_BitAnd, regCkNull, r2, regCkNull); |
| 100323 | 100596 | } |
| 100324 | 100597 | if( ii<pList->nExpr-1 || destIfNull!=destIfFalse ){ |
| 100325 | 100598 | sqlite3VdbeAddOp4(v, OP_Eq, rLhs, labelOk, r2, |
| | @@ -100600,11 +100873,11 @@ |
| 100600 | 100873 | ** Convert a scalar expression node to a TK_REGISTER referencing |
| 100601 | 100874 | ** register iReg. The caller must ensure that iReg already contains |
| 100602 | 100875 | ** the correct value for the expression. |
| 100603 | 100876 | */ |
| 100604 | 100877 | static void exprToRegister(Expr *pExpr, int iReg){ |
| 100605 | | - Expr *p = sqlite3ExprSkipCollate(pExpr); |
| 100878 | + Expr *p = sqlite3ExprSkipCollateAndLikely(pExpr); |
| 100606 | 100879 | p->op2 = p->op; |
| 100607 | 100880 | p->op = TK_REGISTER; |
| 100608 | 100881 | p->iTable = iReg; |
| 100609 | 100882 | ExprClearProperty(p, EP_Skip); |
| 100610 | 100883 | } |
| | @@ -100701,11 +100974,11 @@ |
| 100701 | 100974 | ** datatype by applying the Affinity of the table column to the |
| 100702 | 100975 | ** constant. |
| 100703 | 100976 | */ |
| 100704 | 100977 | int iReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft,target); |
| 100705 | 100978 | int aff = sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn); |
| 100706 | | - if( aff!=SQLITE_AFF_BLOB ){ |
| 100979 | + if( aff>SQLITE_AFF_BLOB ){ |
| 100707 | 100980 | static const char zAff[] = "B\000C\000D\000E"; |
| 100708 | 100981 | assert( SQLITE_AFF_BLOB=='A' ); |
| 100709 | 100982 | assert( SQLITE_AFF_TEXT=='B' ); |
| 100710 | 100983 | if( iReg!=target ){ |
| 100711 | 100984 | sqlite3VdbeAddOp2(v, OP_SCopy, iReg, target); |
| | @@ -100717,11 +100990,23 @@ |
| 100717 | 100990 | return iReg; |
| 100718 | 100991 | } |
| 100719 | 100992 | if( iTab<0 ){ |
| 100720 | 100993 | if( pParse->iSelfTab<0 ){ |
| 100721 | 100994 | /* Generating CHECK constraints or inserting into partial index */ |
| 100722 | | - return pExpr->iColumn - pParse->iSelfTab; |
| 100995 | + assert( pExpr->y.pTab!=0 ); |
| 100996 | + assert( pExpr->iColumn>=XN_ROWID ); |
| 100997 | + assert( pExpr->iColumn<pExpr->y.pTab->nCol ); |
| 100998 | + if( pExpr->iColumn>=0 |
| 100999 | + && pExpr->y.pTab->aCol[pExpr->iColumn].affinity==SQLITE_AFF_REAL |
| 101000 | + ){ |
| 101001 | + sqlite3VdbeAddOp2(v, OP_SCopy, pExpr->iColumn - pParse->iSelfTab, |
| 101002 | + target); |
| 101003 | + sqlite3VdbeAddOp1(v, OP_RealAffinity, target); |
| 101004 | + return target; |
| 101005 | + }else{ |
| 101006 | + return pExpr->iColumn - pParse->iSelfTab; |
| 101007 | + } |
| 100723 | 101008 | }else{ |
| 100724 | 101009 | /* Coding an expression that is part of an index where column names |
| 100725 | 101010 | ** in the index refer to the table to which the index belongs */ |
| 100726 | 101011 | iTab = pParse->iSelfTab - 1; |
| 100727 | 101012 | } |
| | @@ -101004,11 +101289,11 @@ |
| 101004 | 101289 | const char *azAff[] = { "blob", "text", "numeric", "integer", "real" }; |
| 101005 | 101290 | char aff; |
| 101006 | 101291 | assert( nFarg==1 ); |
| 101007 | 101292 | aff = sqlite3ExprAffinity(pFarg->a[0].pExpr); |
| 101008 | 101293 | sqlite3VdbeLoadString(v, target, |
| 101009 | | - aff ? azAff[aff-SQLITE_AFF_BLOB] : "none"); |
| 101294 | + (aff<=SQLITE_AFF_NONE) ? "none" : azAff[aff-SQLITE_AFF_BLOB]); |
| 101010 | 101295 | return target; |
| 101011 | 101296 | } |
| 101012 | 101297 | #endif |
| 101013 | 101298 | |
| 101014 | 101299 | for(i=0; i<nFarg; i++){ |
| | @@ -101112,12 +101397,12 @@ |
| 101112 | 101397 | int n; |
| 101113 | 101398 | if( pExpr->pLeft->iTable==0 ){ |
| 101114 | 101399 | pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft); |
| 101115 | 101400 | } |
| 101116 | 101401 | assert( pExpr->iTable==0 || pExpr->pLeft->op==TK_SELECT ); |
| 101117 | | - if( pExpr->iTable |
| 101118 | | - && pExpr->iTable!=(n = sqlite3ExprVectorSize(pExpr->pLeft)) |
| 101402 | + if( pExpr->iTable!=0 |
| 101403 | + && pExpr->iTable!=(n = sqlite3ExprVectorSize(pExpr->pLeft)) |
| 101119 | 101404 | ){ |
| 101120 | 101405 | sqlite3ErrorMsg(pParse, "%d columns assigned %d values", |
| 101121 | 101406 | pExpr->iTable, n); |
| 101122 | 101407 | } |
| 101123 | 101408 | return pExpr->pLeft->iTable + pExpr->iColumn; |
| | @@ -101216,14 +101501,27 @@ |
| 101216 | 101501 | case TK_VECTOR: { |
| 101217 | 101502 | sqlite3ErrorMsg(pParse, "row value misused"); |
| 101218 | 101503 | break; |
| 101219 | 101504 | } |
| 101220 | 101505 | |
| 101506 | + /* TK_IF_NULL_ROW Expr nodes are inserted ahead of expressions |
| 101507 | + ** that derive from the right-hand table of a LEFT JOIN. The |
| 101508 | + ** Expr.iTable value is the table number for the right-hand table. |
| 101509 | + ** The expression is only evaluated if that table is not currently |
| 101510 | + ** on a LEFT JOIN NULL row. |
| 101511 | + */ |
| 101221 | 101512 | case TK_IF_NULL_ROW: { |
| 101222 | 101513 | int addrINR; |
| 101514 | + u8 okConstFactor = pParse->okConstFactor; |
| 101223 | 101515 | addrINR = sqlite3VdbeAddOp1(v, OP_IfNullRow, pExpr->iTable); |
| 101516 | + /* Temporarily disable factoring of constant expressions, since |
| 101517 | + ** even though expressions may appear to be constant, they are not |
| 101518 | + ** really constant because they originate from the right-hand side |
| 101519 | + ** of a LEFT JOIN. */ |
| 101520 | + pParse->okConstFactor = 0; |
| 101224 | 101521 | inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); |
| 101522 | + pParse->okConstFactor = okConstFactor; |
| 101225 | 101523 | sqlite3VdbeJumpHere(v, addrINR); |
| 101226 | 101524 | sqlite3VdbeChangeP3(v, addrINR, inReg); |
| 101227 | 101525 | break; |
| 101228 | 101526 | } |
| 101229 | 101527 | |
| | @@ -101256,25 +101554,31 @@ |
| 101256 | 101554 | ExprList *pEList; /* List of WHEN terms */ |
| 101257 | 101555 | struct ExprList_item *aListelem; /* Array of WHEN terms */ |
| 101258 | 101556 | Expr opCompare; /* The X==Ei expression */ |
| 101259 | 101557 | Expr *pX; /* The X expression */ |
| 101260 | 101558 | Expr *pTest = 0; /* X==Ei (form A) or just Ei (form B) */ |
| 101559 | + Expr *pDel = 0; |
| 101560 | + sqlite3 *db = pParse->db; |
| 101261 | 101561 | |
| 101262 | 101562 | assert( !ExprHasProperty(pExpr, EP_xIsSelect) && pExpr->x.pList ); |
| 101263 | 101563 | assert(pExpr->x.pList->nExpr > 0); |
| 101264 | 101564 | pEList = pExpr->x.pList; |
| 101265 | 101565 | aListelem = pEList->a; |
| 101266 | 101566 | nExpr = pEList->nExpr; |
| 101267 | 101567 | endLabel = sqlite3VdbeMakeLabel(pParse); |
| 101268 | 101568 | if( (pX = pExpr->pLeft)!=0 ){ |
| 101269 | | - exprNodeCopy(&tempX, pX); |
| 101569 | + pDel = sqlite3ExprDup(db, pX, 0); |
| 101570 | + if( db->mallocFailed ){ |
| 101571 | + sqlite3ExprDelete(db, pDel); |
| 101572 | + break; |
| 101573 | + } |
| 101270 | 101574 | testcase( pX->op==TK_COLUMN ); |
| 101271 | | - exprToRegister(&tempX, exprCodeVector(pParse, &tempX, ®Free1)); |
| 101575 | + exprToRegister(pDel, exprCodeVector(pParse, pDel, ®Free1)); |
| 101272 | 101576 | testcase( regFree1==0 ); |
| 101273 | 101577 | memset(&opCompare, 0, sizeof(opCompare)); |
| 101274 | 101578 | opCompare.op = TK_EQ; |
| 101275 | | - opCompare.pLeft = &tempX; |
| 101579 | + opCompare.pLeft = pDel; |
| 101276 | 101580 | pTest = &opCompare; |
| 101277 | 101581 | /* Ticket b351d95f9cd5ef17e9d9dbae18f5ca8611190001: |
| 101278 | 101582 | ** The value in regFree1 might get SCopy-ed into the file result. |
| 101279 | 101583 | ** So make sure that the regFree1 register is not reused for other |
| 101280 | 101584 | ** purposes and possibly overwritten. */ |
| | @@ -101298,36 +101602,37 @@ |
| 101298 | 101602 | if( (nExpr&1)!=0 ){ |
| 101299 | 101603 | sqlite3ExprCode(pParse, pEList->a[nExpr-1].pExpr, target); |
| 101300 | 101604 | }else{ |
| 101301 | 101605 | sqlite3VdbeAddOp2(v, OP_Null, 0, target); |
| 101302 | 101606 | } |
| 101607 | + sqlite3ExprDelete(db, pDel); |
| 101303 | 101608 | sqlite3VdbeResolveLabel(v, endLabel); |
| 101304 | 101609 | break; |
| 101305 | 101610 | } |
| 101306 | 101611 | #ifndef SQLITE_OMIT_TRIGGER |
| 101307 | 101612 | case TK_RAISE: { |
| 101308 | | - assert( pExpr->affinity==OE_Rollback |
| 101309 | | - || pExpr->affinity==OE_Abort |
| 101310 | | - || pExpr->affinity==OE_Fail |
| 101311 | | - || pExpr->affinity==OE_Ignore |
| 101613 | + assert( pExpr->affExpr==OE_Rollback |
| 101614 | + || pExpr->affExpr==OE_Abort |
| 101615 | + || pExpr->affExpr==OE_Fail |
| 101616 | + || pExpr->affExpr==OE_Ignore |
| 101312 | 101617 | ); |
| 101313 | 101618 | if( !pParse->pTriggerTab ){ |
| 101314 | 101619 | sqlite3ErrorMsg(pParse, |
| 101315 | 101620 | "RAISE() may only be used within a trigger-program"); |
| 101316 | 101621 | return 0; |
| 101317 | 101622 | } |
| 101318 | | - if( pExpr->affinity==OE_Abort ){ |
| 101623 | + if( pExpr->affExpr==OE_Abort ){ |
| 101319 | 101624 | sqlite3MayAbort(pParse); |
| 101320 | 101625 | } |
| 101321 | 101626 | assert( !ExprHasProperty(pExpr, EP_IntValue) ); |
| 101322 | | - if( pExpr->affinity==OE_Ignore ){ |
| 101627 | + if( pExpr->affExpr==OE_Ignore ){ |
| 101323 | 101628 | sqlite3VdbeAddOp4( |
| 101324 | 101629 | v, OP_Halt, SQLITE_OK, OE_Ignore, 0, pExpr->u.zToken,0); |
| 101325 | 101630 | VdbeCoverage(v); |
| 101326 | 101631 | }else{ |
| 101327 | 101632 | sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_TRIGGER, |
| 101328 | | - pExpr->affinity, pExpr->u.zToken, 0, 0); |
| 101633 | + pExpr->affExpr, pExpr->u.zToken, 0, 0); |
| 101329 | 101634 | } |
| 101330 | 101635 | |
| 101331 | 101636 | break; |
| 101332 | 101637 | } |
| 101333 | 101638 | #endif |
| | @@ -101388,11 +101693,11 @@ |
| 101388 | 101693 | ** code to fill the register in the initialization section of the |
| 101389 | 101694 | ** VDBE program, in order to factor it out of the evaluation loop. |
| 101390 | 101695 | */ |
| 101391 | 101696 | SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse *pParse, Expr *pExpr, int *pReg){ |
| 101392 | 101697 | int r2; |
| 101393 | | - pExpr = sqlite3ExprSkipCollate(pExpr); |
| 101698 | + pExpr = sqlite3ExprSkipCollateAndLikely(pExpr); |
| 101394 | 101699 | if( ConstFactorOk(pParse) |
| 101395 | 101700 | && pExpr->op!=TK_REGISTER |
| 101396 | 101701 | && sqlite3ExprIsConstantNotJoin(pExpr) |
| 101397 | 101702 | ){ |
| 101398 | 101703 | *pReg = 0; |
| | @@ -101579,44 +101884,48 @@ |
| 101579 | 101884 | Expr *pExpr, /* The BETWEEN expression */ |
| 101580 | 101885 | int dest, /* Jump destination or storage location */ |
| 101581 | 101886 | void (*xJump)(Parse*,Expr*,int,int), /* Action to take */ |
| 101582 | 101887 | int jumpIfNull /* Take the jump if the BETWEEN is NULL */ |
| 101583 | 101888 | ){ |
| 101584 | | - Expr exprAnd; /* The AND operator in x>=y AND x<=z */ |
| 101889 | + Expr exprAnd; /* The AND operator in x>=y AND x<=z */ |
| 101585 | 101890 | Expr compLeft; /* The x>=y term */ |
| 101586 | 101891 | Expr compRight; /* The x<=z term */ |
| 101587 | | - Expr exprX; /* The x subexpression */ |
| 101588 | 101892 | int regFree1 = 0; /* Temporary use register */ |
| 101893 | + Expr *pDel = 0; |
| 101894 | + sqlite3 *db = pParse->db; |
| 101589 | 101895 | |
| 101590 | 101896 | memset(&compLeft, 0, sizeof(Expr)); |
| 101591 | 101897 | memset(&compRight, 0, sizeof(Expr)); |
| 101592 | 101898 | memset(&exprAnd, 0, sizeof(Expr)); |
| 101593 | 101899 | |
| 101594 | 101900 | assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); |
| 101595 | | - exprNodeCopy(&exprX, pExpr->pLeft); |
| 101596 | | - exprAnd.op = TK_AND; |
| 101597 | | - exprAnd.pLeft = &compLeft; |
| 101598 | | - exprAnd.pRight = &compRight; |
| 101599 | | - compLeft.op = TK_GE; |
| 101600 | | - compLeft.pLeft = &exprX; |
| 101601 | | - compLeft.pRight = pExpr->x.pList->a[0].pExpr; |
| 101602 | | - compRight.op = TK_LE; |
| 101603 | | - compRight.pLeft = &exprX; |
| 101604 | | - compRight.pRight = pExpr->x.pList->a[1].pExpr; |
| 101605 | | - exprToRegister(&exprX, exprCodeVector(pParse, &exprX, ®Free1)); |
| 101606 | | - if( xJump ){ |
| 101607 | | - xJump(pParse, &exprAnd, dest, jumpIfNull); |
| 101608 | | - }else{ |
| 101609 | | - /* Mark the expression is being from the ON or USING clause of a join |
| 101610 | | - ** so that the sqlite3ExprCodeTarget() routine will not attempt to move |
| 101611 | | - ** it into the Parse.pConstExpr list. We should use a new bit for this, |
| 101612 | | - ** for clarity, but we are out of bits in the Expr.flags field so we |
| 101613 | | - ** have to reuse the EP_FromJoin bit. Bummer. */ |
| 101614 | | - exprX.flags |= EP_FromJoin; |
| 101615 | | - sqlite3ExprCodeTarget(pParse, &exprAnd, dest); |
| 101616 | | - } |
| 101617 | | - sqlite3ReleaseTempReg(pParse, regFree1); |
| 101901 | + pDel = sqlite3ExprDup(db, pExpr->pLeft, 0); |
| 101902 | + if( db->mallocFailed==0 ){ |
| 101903 | + exprAnd.op = TK_AND; |
| 101904 | + exprAnd.pLeft = &compLeft; |
| 101905 | + exprAnd.pRight = &compRight; |
| 101906 | + compLeft.op = TK_GE; |
| 101907 | + compLeft.pLeft = pDel; |
| 101908 | + compLeft.pRight = pExpr->x.pList->a[0].pExpr; |
| 101909 | + compRight.op = TK_LE; |
| 101910 | + compRight.pLeft = pDel; |
| 101911 | + compRight.pRight = pExpr->x.pList->a[1].pExpr; |
| 101912 | + exprToRegister(pDel, exprCodeVector(pParse, pDel, ®Free1)); |
| 101913 | + if( xJump ){ |
| 101914 | + xJump(pParse, &exprAnd, dest, jumpIfNull); |
| 101915 | + }else{ |
| 101916 | + /* Mark the expression is being from the ON or USING clause of a join |
| 101917 | + ** so that the sqlite3ExprCodeTarget() routine will not attempt to move |
| 101918 | + ** it into the Parse.pConstExpr list. We should use a new bit for this, |
| 101919 | + ** for clarity, but we are out of bits in the Expr.flags field so we |
| 101920 | + ** have to reuse the EP_FromJoin bit. Bummer. */ |
| 101921 | + pDel->flags |= EP_FromJoin; |
| 101922 | + sqlite3ExprCodeTarget(pParse, &exprAnd, dest); |
| 101923 | + } |
| 101924 | + sqlite3ReleaseTempReg(pParse, regFree1); |
| 101925 | + } |
| 101926 | + sqlite3ExprDelete(db, pDel); |
| 101618 | 101927 | |
| 101619 | 101928 | /* Ensure adequate test coverage */ |
| 101620 | 101929 | testcase( xJump==sqlite3ExprIfTrue && jumpIfNull==0 && regFree1==0 ); |
| 101621 | 101930 | testcase( xJump==sqlite3ExprIfTrue && jumpIfNull==0 && regFree1!=0 ); |
| 101622 | 101931 | testcase( xJump==sqlite3ExprIfTrue && jumpIfNull!=0 && regFree1==0 ); |
| | @@ -102051,24 +102360,21 @@ |
| 102051 | 102360 | return 1; |
| 102052 | 102361 | } |
| 102053 | 102362 | return 2; |
| 102054 | 102363 | } |
| 102055 | 102364 | if( pA->op!=TK_COLUMN && pA->op!=TK_AGG_COLUMN && pA->u.zToken ){ |
| 102056 | | - if( pA->op==TK_FUNCTION ){ |
| 102365 | + if( pA->op==TK_FUNCTION || pA->op==TK_AGG_FUNCTION ){ |
| 102057 | 102366 | if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; |
| 102058 | 102367 | #ifndef SQLITE_OMIT_WINDOWFUNC |
| 102059 | | - /* Justification for the assert(): |
| 102060 | | - ** window functions have p->op==TK_FUNCTION but aggregate functions |
| 102061 | | - ** have p->op==TK_AGG_FUNCTION. So any comparison between an aggregate |
| 102062 | | - ** function and a window function should have failed before reaching |
| 102063 | | - ** this point. And, it is not possible to have a window function and |
| 102064 | | - ** a scalar function with the same name and number of arguments. So |
| 102065 | | - ** if we reach this point, either A and B both window functions or |
| 102066 | | - ** neither are a window functions. */ |
| 102067 | | - assert( ExprHasProperty(pA,EP_WinFunc)==ExprHasProperty(pB,EP_WinFunc) ); |
| 102368 | + assert( pA->op==pB->op ); |
| 102369 | + if( ExprHasProperty(pA,EP_WinFunc)!=ExprHasProperty(pB,EP_WinFunc) ){ |
| 102370 | + return 2; |
| 102371 | + } |
| 102068 | 102372 | if( ExprHasProperty(pA,EP_WinFunc) ){ |
| 102069 | | - if( sqlite3WindowCompare(pParse,pA->y.pWin,pB->y.pWin)!=0 ) return 2; |
| 102373 | + if( sqlite3WindowCompare(pParse, pA->y.pWin, pB->y.pWin, 1)!=0 ){ |
| 102374 | + return 2; |
| 102375 | + } |
| 102070 | 102376 | } |
| 102071 | 102377 | #endif |
| 102072 | 102378 | }else if( pA->op==TK_NULL ){ |
| 102073 | 102379 | return 0; |
| 102074 | 102380 | }else if( pA->op==TK_COLLATE ){ |
| | @@ -102118,11 +102424,11 @@ |
| 102118 | 102424 | if( pA==0 || pB==0 ) return 1; |
| 102119 | 102425 | if( pA->nExpr!=pB->nExpr ) return 1; |
| 102120 | 102426 | for(i=0; i<pA->nExpr; i++){ |
| 102121 | 102427 | Expr *pExprA = pA->a[i].pExpr; |
| 102122 | 102428 | Expr *pExprB = pB->a[i].pExpr; |
| 102123 | | - if( pA->a[i].sortOrder!=pB->a[i].sortOrder ) return 1; |
| 102429 | + if( pA->a[i].sortFlags!=pB->a[i].sortFlags ) return 1; |
| 102124 | 102430 | if( sqlite3ExprCompare(0, pExprA, pExprB, iTab) ) return 1; |
| 102125 | 102431 | } |
| 102126 | 102432 | return 0; |
| 102127 | 102433 | } |
| 102128 | 102434 | |
| | @@ -102130,78 +102436,85 @@ |
| 102130 | 102436 | ** Like sqlite3ExprCompare() except COLLATE operators at the top-level |
| 102131 | 102437 | ** are ignored. |
| 102132 | 102438 | */ |
| 102133 | 102439 | SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr *pA, Expr *pB, int iTab){ |
| 102134 | 102440 | return sqlite3ExprCompare(0, |
| 102135 | | - sqlite3ExprSkipCollate(pA), |
| 102136 | | - sqlite3ExprSkipCollate(pB), |
| 102441 | + sqlite3ExprSkipCollateAndLikely(pA), |
| 102442 | + sqlite3ExprSkipCollateAndLikely(pB), |
| 102137 | 102443 | iTab); |
| 102138 | 102444 | } |
| 102139 | 102445 | |
| 102140 | 102446 | /* |
| 102141 | 102447 | ** Return non-zero if Expr p can only be true if pNN is not NULL. |
| 102448 | +** |
| 102449 | +** Or if seenNot is true, return non-zero if Expr p can only be |
| 102450 | +** non-NULL if pNN is not NULL |
| 102142 | 102451 | */ |
| 102143 | 102452 | static int exprImpliesNotNull( |
| 102144 | 102453 | Parse *pParse, /* Parsing context */ |
| 102145 | 102454 | Expr *p, /* The expression to be checked */ |
| 102146 | 102455 | Expr *pNN, /* The expression that is NOT NULL */ |
| 102147 | 102456 | int iTab, /* Table being evaluated */ |
| 102148 | | - int seenNot /* True if p is an operand of NOT */ |
| 102457 | + int seenNot /* Return true only if p can be any non-NULL value */ |
| 102149 | 102458 | ){ |
| 102150 | 102459 | assert( p ); |
| 102151 | 102460 | assert( pNN ); |
| 102152 | | - if( sqlite3ExprCompare(pParse, p, pNN, iTab)==0 ) return 1; |
| 102461 | + if( sqlite3ExprCompare(pParse, p, pNN, iTab)==0 ){ |
| 102462 | + return pNN->op!=TK_NULL; |
| 102463 | + } |
| 102153 | 102464 | switch( p->op ){ |
| 102154 | 102465 | case TK_IN: { |
| 102155 | 102466 | if( seenNot && ExprHasProperty(p, EP_xIsSelect) ) return 0; |
| 102156 | 102467 | assert( ExprHasProperty(p,EP_xIsSelect) |
| 102157 | 102468 | || (p->x.pList!=0 && p->x.pList->nExpr>0) ); |
| 102158 | | - return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, seenNot); |
| 102469 | + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); |
| 102159 | 102470 | } |
| 102160 | 102471 | case TK_BETWEEN: { |
| 102161 | 102472 | ExprList *pList = p->x.pList; |
| 102162 | 102473 | assert( pList!=0 ); |
| 102163 | 102474 | assert( pList->nExpr==2 ); |
| 102164 | 102475 | if( seenNot ) return 0; |
| 102165 | | - if( exprImpliesNotNull(pParse, pList->a[0].pExpr, pNN, iTab, seenNot) |
| 102166 | | - || exprImpliesNotNull(pParse, pList->a[1].pExpr, pNN, iTab, seenNot) |
| 102476 | + if( exprImpliesNotNull(pParse, pList->a[0].pExpr, pNN, iTab, 1) |
| 102477 | + || exprImpliesNotNull(pParse, pList->a[1].pExpr, pNN, iTab, 1) |
| 102167 | 102478 | ){ |
| 102168 | 102479 | return 1; |
| 102169 | 102480 | } |
| 102170 | | - return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, seenNot); |
| 102481 | + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); |
| 102171 | 102482 | } |
| 102172 | 102483 | case TK_EQ: |
| 102173 | 102484 | case TK_NE: |
| 102174 | 102485 | case TK_LT: |
| 102175 | 102486 | case TK_LE: |
| 102176 | 102487 | case TK_GT: |
| 102177 | 102488 | case TK_GE: |
| 102178 | 102489 | case TK_PLUS: |
| 102179 | 102490 | case TK_MINUS: |
| 102491 | + case TK_BITOR: |
| 102492 | + case TK_LSHIFT: |
| 102493 | + case TK_RSHIFT: |
| 102494 | + case TK_CONCAT: |
| 102495 | + seenNot = 1; |
| 102496 | + /* Fall thru */ |
| 102180 | 102497 | case TK_STAR: |
| 102181 | 102498 | case TK_REM: |
| 102182 | 102499 | case TK_BITAND: |
| 102183 | | - case TK_BITOR: |
| 102184 | | - case TK_SLASH: |
| 102185 | | - case TK_LSHIFT: |
| 102186 | | - case TK_RSHIFT: |
| 102187 | | - case TK_CONCAT: { |
| 102500 | + case TK_SLASH: { |
| 102188 | 102501 | if( exprImpliesNotNull(pParse, p->pRight, pNN, iTab, seenNot) ) return 1; |
| 102189 | 102502 | /* Fall thru into the next case */ |
| 102190 | 102503 | } |
| 102191 | 102504 | case TK_SPAN: |
| 102192 | 102505 | case TK_COLLATE: |
| 102193 | | - case TK_BITNOT: |
| 102194 | 102506 | case TK_UPLUS: |
| 102195 | 102507 | case TK_UMINUS: { |
| 102196 | 102508 | return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, seenNot); |
| 102197 | 102509 | } |
| 102198 | 102510 | case TK_TRUTH: { |
| 102199 | 102511 | if( seenNot ) return 0; |
| 102200 | 102512 | if( p->op2!=TK_IS ) return 0; |
| 102201 | | - return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, seenNot); |
| 102513 | + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); |
| 102202 | 102514 | } |
| 102515 | + case TK_BITNOT: |
| 102203 | 102516 | case TK_NOT: { |
| 102204 | 102517 | return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); |
| 102205 | 102518 | } |
| 102206 | 102519 | } |
| 102207 | 102520 | return 0; |
| | @@ -102263,20 +102576,18 @@ |
| 102263 | 102576 | testcase( pExpr->op==TK_AGG_COLUMN ); |
| 102264 | 102577 | testcase( pExpr->op==TK_AGG_FUNCTION ); |
| 102265 | 102578 | if( ExprHasProperty(pExpr, EP_FromJoin) ) return WRC_Prune; |
| 102266 | 102579 | switch( pExpr->op ){ |
| 102267 | 102580 | case TK_ISNOT: |
| 102268 | | - case TK_NOT: |
| 102269 | 102581 | case TK_ISNULL: |
| 102270 | 102582 | case TK_NOTNULL: |
| 102271 | 102583 | case TK_IS: |
| 102272 | 102584 | case TK_OR: |
| 102273 | 102585 | case TK_CASE: |
| 102274 | 102586 | case TK_IN: |
| 102275 | 102587 | case TK_FUNCTION: |
| 102276 | 102588 | testcase( pExpr->op==TK_ISNOT ); |
| 102277 | | - testcase( pExpr->op==TK_NOT ); |
| 102278 | 102589 | testcase( pExpr->op==TK_ISNULL ); |
| 102279 | 102590 | testcase( pExpr->op==TK_NOTNULL ); |
| 102280 | 102591 | testcase( pExpr->op==TK_IS ); |
| 102281 | 102592 | testcase( pExpr->op==TK_OR ); |
| 102282 | 102593 | testcase( pExpr->op==TK_CASE ); |
| | @@ -102288,10 +102599,22 @@ |
| 102288 | 102599 | pWalker->eCode = 1; |
| 102289 | 102600 | return WRC_Abort; |
| 102290 | 102601 | } |
| 102291 | 102602 | return WRC_Prune; |
| 102292 | 102603 | |
| 102604 | + case TK_AND: |
| 102605 | + if( sqlite3ExprImpliesNonNullRow(pExpr->pLeft, pWalker->u.iCur) |
| 102606 | + && sqlite3ExprImpliesNonNullRow(pExpr->pRight, pWalker->u.iCur) |
| 102607 | + ){ |
| 102608 | + pWalker->eCode = 1; |
| 102609 | + } |
| 102610 | + return WRC_Prune; |
| 102611 | + |
| 102612 | + case TK_BETWEEN: |
| 102613 | + sqlite3WalkExpr(pWalker, pExpr->pLeft); |
| 102614 | + return WRC_Prune; |
| 102615 | + |
| 102293 | 102616 | /* Virtual tables are allowed to use constraints like x=NULL. So |
| 102294 | 102617 | ** a term of the form x=y does not prove that y is not null if x |
| 102295 | 102618 | ** is the column of a virtual table */ |
| 102296 | 102619 | case TK_EQ: |
| 102297 | 102620 | case TK_NE: |
| | @@ -102308,10 +102631,11 @@ |
| 102308 | 102631 | if( (pExpr->pLeft->op==TK_COLUMN && IsVirtual(pExpr->pLeft->y.pTab)) |
| 102309 | 102632 | || (pExpr->pRight->op==TK_COLUMN && IsVirtual(pExpr->pRight->y.pTab)) |
| 102310 | 102633 | ){ |
| 102311 | 102634 | return WRC_Prune; |
| 102312 | 102635 | } |
| 102636 | + |
| 102313 | 102637 | default: |
| 102314 | 102638 | return WRC_Continue; |
| 102315 | 102639 | } |
| 102316 | 102640 | } |
| 102317 | 102641 | |
| | @@ -102337,11 +102661,11 @@ |
| 102337 | 102661 | ** be non-NULL, then the LEFT JOIN can be safely converted into an |
| 102338 | 102662 | ** ordinary join. |
| 102339 | 102663 | */ |
| 102340 | 102664 | SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){ |
| 102341 | 102665 | Walker w; |
| 102342 | | - p = sqlite3ExprSkipCollate(p); |
| 102666 | + p = sqlite3ExprSkipCollateAndLikely(p); |
| 102343 | 102667 | while( p ){ |
| 102344 | 102668 | if( p->op==TK_NOTNULL ){ |
| 102345 | 102669 | p = p->pLeft; |
| 102346 | 102670 | }else if( p->op==TK_AND ){ |
| 102347 | 102671 | if( sqlite3ExprImpliesNonNullRow(p->pLeft, iTab) ) return 1; |
| | @@ -102443,11 +102767,14 @@ |
| 102443 | 102767 | for(i=0; i<nSrc; i++){ |
| 102444 | 102768 | if( pExpr->iTable==pSrc->a[i].iCursor ) break; |
| 102445 | 102769 | } |
| 102446 | 102770 | if( i<nSrc ){ |
| 102447 | 102771 | p->nThis++; |
| 102448 | | - }else{ |
| 102772 | + }else if( nSrc==0 || pExpr->iTable<pSrc->a[0].iCursor ){ |
| 102773 | + /* In a well-formed parse tree (no name resolution errors), |
| 102774 | + ** TK_COLUMN nodes with smaller Expr.iTable values are in an |
| 102775 | + ** outer context. Those are the only ones to count as "other" */ |
| 102449 | 102776 | p->nOther++; |
| 102450 | 102777 | } |
| 102451 | 102778 | } |
| 102452 | 102779 | return WRC_Continue; |
| 102453 | 102780 | } |
| | @@ -102460,12 +102787,13 @@ |
| 102460 | 102787 | */ |
| 102461 | 102788 | SQLITE_PRIVATE int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){ |
| 102462 | 102789 | Walker w; |
| 102463 | 102790 | struct SrcCount cnt; |
| 102464 | 102791 | assert( pExpr->op==TK_AGG_FUNCTION ); |
| 102792 | + memset(&w, 0, sizeof(w)); |
| 102465 | 102793 | w.xExprCallback = exprSrcCount; |
| 102466 | | - w.xSelectCallback = 0; |
| 102794 | + w.xSelectCallback = sqlite3SelectWalkNoop; |
| 102467 | 102795 | w.u.pSrcCount = &cnt; |
| 102468 | 102796 | cnt.pSrc = pSrcList; |
| 102469 | 102797 | cnt.nThis = 0; |
| 102470 | 102798 | cnt.nOther = 0; |
| 102471 | 102799 | sqlite3WalkExprList(&w, pExpr->x.pList); |
| | @@ -102899,12 +103227,12 @@ |
| 102899 | 103227 | ** that the table is being renamed to. |
| 102900 | 103228 | */ |
| 102901 | 103229 | if( SQLITE_OK!=isAlterableTable(pParse, pTab) ){ |
| 102902 | 103230 | goto exit_rename_table; |
| 102903 | 103231 | } |
| 102904 | | - if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ goto |
| 102905 | | - exit_rename_table; |
| 103232 | + if( SQLITE_OK!=sqlite3CheckObjectName(pParse,zName,"table",zName) ){ |
| 103233 | + goto exit_rename_table; |
| 102906 | 103234 | } |
| 102907 | 103235 | |
| 102908 | 103236 | #ifndef SQLITE_OMIT_VIEW |
| 102909 | 103237 | if( pTab->pSelect ){ |
| 102910 | 103238 | sqlite3ErrorMsg(pParse, "view %s may not be altered", pTab->zName); |
| | @@ -104461,17 +104789,17 @@ |
| 104461 | 104789 | ** Additional tables might be added in future releases of SQLite. |
| 104462 | 104790 | ** The sqlite_stat2 table is not created or used unless the SQLite version |
| 104463 | 104791 | ** is between 3.6.18 and 3.7.8, inclusive, and unless SQLite is compiled |
| 104464 | 104792 | ** with SQLITE_ENABLE_STAT2. The sqlite_stat2 table is deprecated. |
| 104465 | 104793 | ** The sqlite_stat2 table is superseded by sqlite_stat3, which is only |
| 104466 | | -** created and used by SQLite versions 3.7.9 and later and with |
| 104794 | +** created and used by SQLite versions 3.7.9 through 3.29.0 when |
| 104467 | 104795 | ** SQLITE_ENABLE_STAT3 defined. The functionality of sqlite_stat3 |
| 104468 | | -** is a superset of sqlite_stat2. The sqlite_stat4 is an enhanced |
| 104469 | | -** version of sqlite_stat3 and is only available when compiled with |
| 104470 | | -** SQLITE_ENABLE_STAT4 and in SQLite versions 3.8.1 and later. It is |
| 104471 | | -** not possible to enable both STAT3 and STAT4 at the same time. If they |
| 104472 | | -** are both enabled, then STAT4 takes precedence. |
| 104796 | +** is a superset of sqlite_stat2 and is also now deprecated. The |
| 104797 | +** sqlite_stat4 is an enhanced version of sqlite_stat3 and is only |
| 104798 | +** available when compiled with SQLITE_ENABLE_STAT4 and in SQLite |
| 104799 | +** versions 3.8.1 and later. STAT4 is the only variant that is still |
| 104800 | +** supported. |
| 104473 | 104801 | ** |
| 104474 | 104802 | ** For most applications, sqlite_stat1 provides all the statistics required |
| 104475 | 104803 | ** for the query planner to make good choices. |
| 104476 | 104804 | ** |
| 104477 | 104805 | ** Format of sqlite_stat1: |
| | @@ -104578,21 +104906,15 @@ |
| 104578 | 104906 | #ifndef SQLITE_OMIT_ANALYZE |
| 104579 | 104907 | /* #include "sqliteInt.h" */ |
| 104580 | 104908 | |
| 104581 | 104909 | #if defined(SQLITE_ENABLE_STAT4) |
| 104582 | 104910 | # define IsStat4 1 |
| 104583 | | -# define IsStat3 0 |
| 104584 | | -#elif defined(SQLITE_ENABLE_STAT3) |
| 104585 | | -# define IsStat4 0 |
| 104586 | | -# define IsStat3 1 |
| 104587 | 104911 | #else |
| 104588 | 104912 | # define IsStat4 0 |
| 104589 | | -# define IsStat3 0 |
| 104590 | 104913 | # undef SQLITE_STAT4_SAMPLES |
| 104591 | 104914 | # define SQLITE_STAT4_SAMPLES 1 |
| 104592 | 104915 | #endif |
| 104593 | | -#define IsStat34 (IsStat3+IsStat4) /* 1 for STAT3 or STAT4. 0 otherwise */ |
| 104594 | 104916 | |
| 104595 | 104917 | /* |
| 104596 | 104918 | ** This routine generates code that opens the sqlite_statN tables. |
| 104597 | 104919 | ** The sqlite_stat1 table is always relevant. sqlite_stat2 is now |
| 104598 | 104920 | ** obsolete. sqlite_stat3 and sqlite_stat4 are only opened when |
| | @@ -104617,18 +104939,14 @@ |
| 104617 | 104939 | const char *zCols; |
| 104618 | 104940 | } aTable[] = { |
| 104619 | 104941 | { "sqlite_stat1", "tbl,idx,stat" }, |
| 104620 | 104942 | #if defined(SQLITE_ENABLE_STAT4) |
| 104621 | 104943 | { "sqlite_stat4", "tbl,idx,neq,nlt,ndlt,sample" }, |
| 104622 | | - { "sqlite_stat3", 0 }, |
| 104623 | | -#elif defined(SQLITE_ENABLE_STAT3) |
| 104624 | | - { "sqlite_stat3", "tbl,idx,neq,nlt,ndlt,sample" }, |
| 104625 | | - { "sqlite_stat4", 0 }, |
| 104626 | 104944 | #else |
| 104627 | | - { "sqlite_stat3", 0 }, |
| 104628 | 104945 | { "sqlite_stat4", 0 }, |
| 104629 | 104946 | #endif |
| 104947 | + { "sqlite_stat3", 0 }, |
| 104630 | 104948 | }; |
| 104631 | 104949 | int i; |
| 104632 | 104950 | sqlite3 *db = pParse->db; |
| 104633 | 104951 | Db *pDb; |
| 104634 | 104952 | Vdbe *v = sqlite3GetVdbe(pParse); |
| | @@ -104705,11 +105023,11 @@ |
| 104705 | 105023 | typedef struct Stat4Accum Stat4Accum; |
| 104706 | 105024 | typedef struct Stat4Sample Stat4Sample; |
| 104707 | 105025 | struct Stat4Sample { |
| 104708 | 105026 | tRowcnt *anEq; /* sqlite_stat4.nEq */ |
| 104709 | 105027 | tRowcnt *anDLt; /* sqlite_stat4.nDLt */ |
| 104710 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105028 | +#ifdef SQLITE_ENABLE_STAT4 |
| 104711 | 105029 | tRowcnt *anLt; /* sqlite_stat4.nLt */ |
| 104712 | 105030 | union { |
| 104713 | 105031 | i64 iRowid; /* Rowid in main table of the key */ |
| 104714 | 105032 | u8 *aRowid; /* Key for WITHOUT ROWID tables */ |
| 104715 | 105033 | } u; |
| | @@ -104736,11 +105054,11 @@ |
| 104736 | 105054 | sqlite3 *db; /* Database connection, for malloc() */ |
| 104737 | 105055 | }; |
| 104738 | 105056 | |
| 104739 | 105057 | /* Reclaim memory used by a Stat4Sample |
| 104740 | 105058 | */ |
| 104741 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105059 | +#ifdef SQLITE_ENABLE_STAT4 |
| 104742 | 105060 | static void sampleClear(sqlite3 *db, Stat4Sample *p){ |
| 104743 | 105061 | assert( db!=0 ); |
| 104744 | 105062 | if( p->nRowid ){ |
| 104745 | 105063 | sqlite3DbFree(db, p->u.aRowid); |
| 104746 | 105064 | p->nRowid = 0; |
| | @@ -104748,11 +105066,11 @@ |
| 104748 | 105066 | } |
| 104749 | 105067 | #endif |
| 104750 | 105068 | |
| 104751 | 105069 | /* Initialize the BLOB value of a ROWID |
| 104752 | 105070 | */ |
| 104753 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105071 | +#ifdef SQLITE_ENABLE_STAT4 |
| 104754 | 105072 | static void sampleSetRowid(sqlite3 *db, Stat4Sample *p, int n, const u8 *pData){ |
| 104755 | 105073 | assert( db!=0 ); |
| 104756 | 105074 | if( p->nRowid ) sqlite3DbFree(db, p->u.aRowid); |
| 104757 | 105075 | p->u.aRowid = sqlite3DbMallocRawNN(db, n); |
| 104758 | 105076 | if( p->u.aRowid ){ |
| | @@ -104764,11 +105082,11 @@ |
| 104764 | 105082 | } |
| 104765 | 105083 | #endif |
| 104766 | 105084 | |
| 104767 | 105085 | /* Initialize the INTEGER value of a ROWID. |
| 104768 | 105086 | */ |
| 104769 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105087 | +#ifdef SQLITE_ENABLE_STAT4 |
| 104770 | 105088 | static void sampleSetRowidInt64(sqlite3 *db, Stat4Sample *p, i64 iRowid){ |
| 104771 | 105089 | assert( db!=0 ); |
| 104772 | 105090 | if( p->nRowid ) sqlite3DbFree(db, p->u.aRowid); |
| 104773 | 105091 | p->nRowid = 0; |
| 104774 | 105092 | p->u.iRowid = iRowid; |
| | @@ -104777,11 +105095,11 @@ |
| 104777 | 105095 | |
| 104778 | 105096 | |
| 104779 | 105097 | /* |
| 104780 | 105098 | ** Copy the contents of object (*pFrom) into (*pTo). |
| 104781 | 105099 | */ |
| 104782 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105100 | +#ifdef SQLITE_ENABLE_STAT4 |
| 104783 | 105101 | static void sampleCopy(Stat4Accum *p, Stat4Sample *pTo, Stat4Sample *pFrom){ |
| 104784 | 105102 | pTo->isPSample = pFrom->isPSample; |
| 104785 | 105103 | pTo->iCol = pFrom->iCol; |
| 104786 | 105104 | pTo->iHash = pFrom->iHash; |
| 104787 | 105105 | memcpy(pTo->anEq, pFrom->anEq, sizeof(tRowcnt)*p->nCol); |
| | @@ -104798,11 +105116,11 @@ |
| 104798 | 105116 | /* |
| 104799 | 105117 | ** Reclaim all memory of a Stat4Accum structure. |
| 104800 | 105118 | */ |
| 104801 | 105119 | static void stat4Destructor(void *pOld){ |
| 104802 | 105120 | Stat4Accum *p = (Stat4Accum*)pOld; |
| 104803 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105121 | +#ifdef SQLITE_ENABLE_STAT4 |
| 104804 | 105122 | int i; |
| 104805 | 105123 | for(i=0; i<p->nCol; i++) sampleClear(p->db, p->aBest+i); |
| 104806 | 105124 | for(i=0; i<p->mxSample; i++) sampleClear(p->db, p->a+i); |
| 104807 | 105125 | sampleClear(p->db, &p->current); |
| 104808 | 105126 | #endif |
| | @@ -104818,11 +105136,11 @@ |
| 104818 | 105136 | ** |
| 104819 | 105137 | ** Note 1: In the special case of the covering index that implements a |
| 104820 | 105138 | ** WITHOUT ROWID table, N is the number of PRIMARY KEY columns, not the |
| 104821 | 105139 | ** total number of columns in the table. |
| 104822 | 105140 | ** |
| 104823 | | -** Note 2: C is only used for STAT3 and STAT4. |
| 105141 | +** Note 2: C is only used for STAT4. |
| 104824 | 105142 | ** |
| 104825 | 105143 | ** For indexes on ordinary rowid tables, N==K+1. But for indexes on |
| 104826 | 105144 | ** WITHOUT ROWID tables, N=K+P where P is the number of columns in the |
| 104827 | 105145 | ** PRIMARY KEY of the table. The covering index that implements the |
| 104828 | 105146 | ** original WITHOUT ROWID table as N==K as a special case. |
| | @@ -104841,11 +105159,11 @@ |
| 104841 | 105159 | int nCol; /* Number of columns in index being sampled */ |
| 104842 | 105160 | int nKeyCol; /* Number of key columns */ |
| 104843 | 105161 | int nColUp; /* nCol rounded up for alignment */ |
| 104844 | 105162 | int n; /* Bytes of space to allocate */ |
| 104845 | 105163 | sqlite3 *db; /* Database connection */ |
| 104846 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105164 | +#ifdef SQLITE_ENABLE_STAT4 |
| 104847 | 105165 | int mxSample = SQLITE_STAT4_SAMPLES; |
| 104848 | 105166 | #endif |
| 104849 | 105167 | |
| 104850 | 105168 | /* Decode the three function arguments */ |
| 104851 | 105169 | UNUSED_PARAMETER(argc); |
| | @@ -104858,11 +105176,11 @@ |
| 104858 | 105176 | |
| 104859 | 105177 | /* Allocate the space required for the Stat4Accum object */ |
| 104860 | 105178 | n = sizeof(*p) |
| 104861 | 105179 | + sizeof(tRowcnt)*nColUp /* Stat4Accum.anEq */ |
| 104862 | 105180 | + sizeof(tRowcnt)*nColUp /* Stat4Accum.anDLt */ |
| 104863 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105181 | +#ifdef SQLITE_ENABLE_STAT4 |
| 104864 | 105182 | + sizeof(tRowcnt)*nColUp /* Stat4Accum.anLt */ |
| 104865 | 105183 | + sizeof(Stat4Sample)*(nCol+mxSample) /* Stat4Accum.aBest[], a[] */ |
| 104866 | 105184 | + sizeof(tRowcnt)*3*nColUp*(nCol+mxSample) |
| 104867 | 105185 | #endif |
| 104868 | 105186 | ; |
| | @@ -104878,11 +105196,11 @@ |
| 104878 | 105196 | p->nCol = nCol; |
| 104879 | 105197 | p->nKeyCol = nKeyCol; |
| 104880 | 105198 | p->current.anDLt = (tRowcnt*)&p[1]; |
| 104881 | 105199 | p->current.anEq = &p->current.anDLt[nColUp]; |
| 104882 | 105200 | |
| 104883 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105201 | +#ifdef SQLITE_ENABLE_STAT4 |
| 104884 | 105202 | { |
| 104885 | 105203 | u8 *pSpace; /* Allocated space not yet assigned */ |
| 104886 | 105204 | int i; /* Used to iterate through p->aSample[] */ |
| 104887 | 105205 | |
| 104888 | 105206 | p->iGet = -1; |
| | @@ -104913,11 +105231,11 @@ |
| 104913 | 105231 | ** (given by the 3rd parameter) is never used and can be any positive |
| 104914 | 105232 | ** value. */ |
| 104915 | 105233 | sqlite3_result_blob(context, p, sizeof(*p), stat4Destructor); |
| 104916 | 105234 | } |
| 104917 | 105235 | static const FuncDef statInitFuncdef = { |
| 104918 | | - 2+IsStat34, /* nArg */ |
| 105236 | + 2+IsStat4, /* nArg */ |
| 104919 | 105237 | SQLITE_UTF8, /* funcFlags */ |
| 104920 | 105238 | 0, /* pUserData */ |
| 104921 | 105239 | 0, /* pNext */ |
| 104922 | 105240 | statInit, /* xSFunc */ |
| 104923 | 105241 | 0, /* xFinalize */ |
| | @@ -104953,11 +105271,11 @@ |
| 104953 | 105271 | if( pNew->iHash>pOld->iHash ) return 1; |
| 104954 | 105272 | return 0; |
| 104955 | 105273 | } |
| 104956 | 105274 | #endif |
| 104957 | 105275 | |
| 104958 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105276 | +#ifdef SQLITE_ENABLE_STAT4 |
| 104959 | 105277 | /* |
| 104960 | 105278 | ** Return true if pNew is to be preferred over pOld. |
| 104961 | 105279 | ** |
| 104962 | 105280 | ** This function assumes that for each argument sample, the contents of |
| 104963 | 105281 | ** the anEq[] array from pSample->anEq[pSample->iCol] onwards are valid. |
| | @@ -104972,19 +105290,15 @@ |
| 104972 | 105290 | |
| 104973 | 105291 | assert( pOld->isPSample==0 && pNew->isPSample==0 ); |
| 104974 | 105292 | assert( IsStat4 || (pNew->iCol==0 && pOld->iCol==0) ); |
| 104975 | 105293 | |
| 104976 | 105294 | if( (nEqNew>nEqOld) ) return 1; |
| 104977 | | -#ifdef SQLITE_ENABLE_STAT4 |
| 104978 | 105295 | if( nEqNew==nEqOld ){ |
| 104979 | 105296 | if( pNew->iCol<pOld->iCol ) return 1; |
| 104980 | 105297 | return (pNew->iCol==pOld->iCol && sampleIsBetterPost(pAccum, pNew, pOld)); |
| 104981 | 105298 | } |
| 104982 | 105299 | return 0; |
| 104983 | | -#else |
| 104984 | | - return (nEqNew==nEqOld && pNew->iHash>pOld->iHash); |
| 104985 | | -#endif |
| 104986 | 105300 | } |
| 104987 | 105301 | |
| 104988 | 105302 | /* |
| 104989 | 105303 | ** Copy the contents of sample *pNew into the p->a[] array. If necessary, |
| 104990 | 105304 | ** remove the least desirable sample from p->a[] to make room. |
| | @@ -104993,11 +105307,10 @@ |
| 104993 | 105307 | Stat4Sample *pSample = 0; |
| 104994 | 105308 | int i; |
| 104995 | 105309 | |
| 104996 | 105310 | assert( IsStat4 || nEqZero==0 ); |
| 104997 | 105311 | |
| 104998 | | -#ifdef SQLITE_ENABLE_STAT4 |
| 104999 | 105312 | /* Stat4Accum.nMaxEqZero is set to the maximum number of leading 0 |
| 105000 | 105313 | ** values in the anEq[] array of any sample in Stat4Accum.a[]. In |
| 105001 | 105314 | ** other words, if nMaxEqZero is n, then it is guaranteed that there |
| 105002 | 105315 | ** are no samples with Stat4Sample.anEq[m]==0 for (m>=n). */ |
| 105003 | 105316 | if( nEqZero>p->nMaxEqZero ){ |
| | @@ -105027,11 +105340,10 @@ |
| 105027 | 105340 | pUpgrade->iCol = pNew->iCol; |
| 105028 | 105341 | pUpgrade->anEq[pUpgrade->iCol] = pNew->anEq[pUpgrade->iCol]; |
| 105029 | 105342 | goto find_new_min; |
| 105030 | 105343 | } |
| 105031 | 105344 | } |
| 105032 | | -#endif |
| 105033 | 105345 | |
| 105034 | 105346 | /* If necessary, remove sample iMin to make room for the new sample. */ |
| 105035 | 105347 | if( p->nSample>=p->mxSample ){ |
| 105036 | 105348 | Stat4Sample *pMin = &p->a[p->iMin]; |
| 105037 | 105349 | tRowcnt *anEq = pMin->anEq; |
| | @@ -105048,26 +105360,22 @@ |
| 105048 | 105360 | } |
| 105049 | 105361 | |
| 105050 | 105362 | /* The "rows less-than" for the rowid column must be greater than that |
| 105051 | 105363 | ** for the last sample in the p->a[] array. Otherwise, the samples would |
| 105052 | 105364 | ** be out of order. */ |
| 105053 | | -#ifdef SQLITE_ENABLE_STAT4 |
| 105054 | 105365 | assert( p->nSample==0 |
| 105055 | 105366 | || pNew->anLt[p->nCol-1] > p->a[p->nSample-1].anLt[p->nCol-1] ); |
| 105056 | | -#endif |
| 105057 | 105367 | |
| 105058 | 105368 | /* Insert the new sample */ |
| 105059 | 105369 | pSample = &p->a[p->nSample]; |
| 105060 | 105370 | sampleCopy(p, pSample, pNew); |
| 105061 | 105371 | p->nSample++; |
| 105062 | 105372 | |
| 105063 | 105373 | /* Zero the first nEqZero entries in the anEq[] array. */ |
| 105064 | 105374 | memset(pSample->anEq, 0, sizeof(tRowcnt)*nEqZero); |
| 105065 | 105375 | |
| 105066 | | -#ifdef SQLITE_ENABLE_STAT4 |
| 105067 | | - find_new_min: |
| 105068 | | -#endif |
| 105376 | +find_new_min: |
| 105069 | 105377 | if( p->nSample>=p->mxSample ){ |
| 105070 | 105378 | int iMin = -1; |
| 105071 | 105379 | for(i=0; i<p->mxSample; i++){ |
| 105072 | 105380 | if( p->a[i].isPSample ) continue; |
| 105073 | 105381 | if( iMin<0 || sampleIsBetter(p, &p->a[iMin], &p->a[i]) ){ |
| | @@ -105076,11 +105384,11 @@ |
| 105076 | 105384 | } |
| 105077 | 105385 | assert( iMin>=0 ); |
| 105078 | 105386 | p->iMin = iMin; |
| 105079 | 105387 | } |
| 105080 | 105388 | } |
| 105081 | | -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ |
| 105389 | +#endif /* SQLITE_ENABLE_STAT4 */ |
| 105082 | 105390 | |
| 105083 | 105391 | /* |
| 105084 | 105392 | ** Field iChng of the index being scanned has changed. So at this point |
| 105085 | 105393 | ** p->current contains a sample that reflects the previous row of the |
| 105086 | 105394 | ** index. The value of anEq[iChng] and subsequent anEq[] elements are |
| | @@ -105117,32 +105425,11 @@ |
| 105117 | 105425 | } |
| 105118 | 105426 | p->nMaxEqZero = iChng; |
| 105119 | 105427 | } |
| 105120 | 105428 | #endif |
| 105121 | 105429 | |
| 105122 | | -#if defined(SQLITE_ENABLE_STAT3) && !defined(SQLITE_ENABLE_STAT4) |
| 105123 | | - if( iChng==0 ){ |
| 105124 | | - tRowcnt nLt = p->current.anLt[0]; |
| 105125 | | - tRowcnt nEq = p->current.anEq[0]; |
| 105126 | | - |
| 105127 | | - /* Check if this is to be a periodic sample. If so, add it. */ |
| 105128 | | - if( (nLt/p->nPSample)!=(nLt+nEq)/p->nPSample ){ |
| 105129 | | - p->current.isPSample = 1; |
| 105130 | | - sampleInsert(p, &p->current, 0); |
| 105131 | | - p->current.isPSample = 0; |
| 105132 | | - }else |
| 105133 | | - |
| 105134 | | - /* Or if it is a non-periodic sample. Add it in this case too. */ |
| 105135 | | - if( p->nSample<p->mxSample |
| 105136 | | - || sampleIsBetter(p, &p->current, &p->a[p->iMin]) |
| 105137 | | - ){ |
| 105138 | | - sampleInsert(p, &p->current, 0); |
| 105139 | | - } |
| 105140 | | - } |
| 105141 | | -#endif |
| 105142 | | - |
| 105143 | | -#ifndef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105430 | +#ifndef SQLITE_ENABLE_STAT4 |
| 105144 | 105431 | UNUSED_PARAMETER( p ); |
| 105145 | 105432 | UNUSED_PARAMETER( iChng ); |
| 105146 | 105433 | #endif |
| 105147 | 105434 | } |
| 105148 | 105435 | |
| | @@ -105158,11 +105445,11 @@ |
| 105158 | 105445 | ** This SQL function always returns NULL. It's purpose it to accumulate |
| 105159 | 105446 | ** statistical data and/or samples in the Stat4Accum object about the |
| 105160 | 105447 | ** index being analyzed. The stat_get() SQL function will later be used to |
| 105161 | 105448 | ** extract relevant information for constructing the sqlite_statN tables. |
| 105162 | 105449 | ** |
| 105163 | | -** The R parameter is only used for STAT3 and STAT4 |
| 105450 | +** The R parameter is only used for STAT4 |
| 105164 | 105451 | */ |
| 105165 | 105452 | static void statPush( |
| 105166 | 105453 | sqlite3_context *context, |
| 105167 | 105454 | int argc, |
| 105168 | 105455 | sqlite3_value **argv |
| | @@ -105190,18 +105477,18 @@ |
| 105190 | 105477 | for(i=0; i<iChng; i++){ |
| 105191 | 105478 | p->current.anEq[i]++; |
| 105192 | 105479 | } |
| 105193 | 105480 | for(i=iChng; i<p->nCol; i++){ |
| 105194 | 105481 | p->current.anDLt[i]++; |
| 105195 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105482 | +#ifdef SQLITE_ENABLE_STAT4 |
| 105196 | 105483 | p->current.anLt[i] += p->current.anEq[i]; |
| 105197 | 105484 | #endif |
| 105198 | 105485 | p->current.anEq[i] = 1; |
| 105199 | 105486 | } |
| 105200 | 105487 | } |
| 105201 | 105488 | p->nRow++; |
| 105202 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105489 | +#ifdef SQLITE_ENABLE_STAT4 |
| 105203 | 105490 | if( sqlite3_value_type(argv[2])==SQLITE_INTEGER ){ |
| 105204 | 105491 | sampleSetRowidInt64(p->db, &p->current, sqlite3_value_int64(argv[2])); |
| 105205 | 105492 | }else{ |
| 105206 | 105493 | sampleSetRowid(p->db, &p->current, sqlite3_value_bytes(argv[2]), |
| 105207 | 105494 | sqlite3_value_blob(argv[2])); |
| | @@ -105230,11 +105517,11 @@ |
| 105230 | 105517 | } |
| 105231 | 105518 | } |
| 105232 | 105519 | #endif |
| 105233 | 105520 | } |
| 105234 | 105521 | static const FuncDef statPushFuncdef = { |
| 105235 | | - 2+IsStat34, /* nArg */ |
| 105522 | + 2+IsStat4, /* nArg */ |
| 105236 | 105523 | SQLITE_UTF8, /* funcFlags */ |
| 105237 | 105524 | 0, /* pUserData */ |
| 105238 | 105525 | 0, /* pNext */ |
| 105239 | 105526 | statPush, /* xSFunc */ |
| 105240 | 105527 | 0, /* xFinalize */ |
| | @@ -105261,11 +105548,11 @@ |
| 105261 | 105548 | ** inserted as part of a manually constructed bytecode program. (See |
| 105262 | 105549 | ** the callStatGet() routine below.) It is guaranteed that the P |
| 105263 | 105550 | ** parameter will always be a poiner to a Stat4Accum object, never a |
| 105264 | 105551 | ** NULL. |
| 105265 | 105552 | ** |
| 105266 | | -** If neither STAT3 nor STAT4 are enabled, then J is always |
| 105553 | +** If STAT4 is not enabled, then J is always |
| 105267 | 105554 | ** STAT_GET_STAT1 and is hence omitted and this routine becomes |
| 105268 | 105555 | ** a one-parameter function, stat_get(P), that always returns the |
| 105269 | 105556 | ** stat1 table entry information. |
| 105270 | 105557 | */ |
| 105271 | 105558 | static void statGet( |
| | @@ -105272,12 +105559,12 @@ |
| 105272 | 105559 | sqlite3_context *context, |
| 105273 | 105560 | int argc, |
| 105274 | 105561 | sqlite3_value **argv |
| 105275 | 105562 | ){ |
| 105276 | 105563 | Stat4Accum *p = (Stat4Accum*)sqlite3_value_blob(argv[0]); |
| 105277 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105278 | | - /* STAT3 and STAT4 have a parameter on this routine. */ |
| 105564 | +#ifdef SQLITE_ENABLE_STAT4 |
| 105565 | + /* STAT4 has a parameter on this routine. */ |
| 105279 | 105566 | int eCall = sqlite3_value_int(argv[1]); |
| 105280 | 105567 | assert( argc==2 ); |
| 105281 | 105568 | assert( eCall==STAT_GET_STAT1 || eCall==STAT_GET_NEQ |
| 105282 | 105569 | || eCall==STAT_GET_ROWID || eCall==STAT_GET_NLT |
| 105283 | 105570 | || eCall==STAT_GET_NDLT |
| | @@ -105328,11 +105615,11 @@ |
| 105328 | 105615 | } |
| 105329 | 105616 | assert( z[0]=='\0' && z>zRet ); |
| 105330 | 105617 | |
| 105331 | 105618 | sqlite3_result_text(context, zRet, -1, sqlite3_free); |
| 105332 | 105619 | } |
| 105333 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105620 | +#ifdef SQLITE_ENABLE_STAT4 |
| 105334 | 105621 | else if( eCall==STAT_GET_ROWID ){ |
| 105335 | 105622 | if( p->iGet<0 ){ |
| 105336 | 105623 | samplePushPrevious(p, 0); |
| 105337 | 105624 | p->iGet = 0; |
| 105338 | 105625 | } |
| | @@ -105357,13 +105644,11 @@ |
| 105357 | 105644 | p->iGet++; |
| 105358 | 105645 | break; |
| 105359 | 105646 | } |
| 105360 | 105647 | } |
| 105361 | 105648 | |
| 105362 | | - if( IsStat3 ){ |
| 105363 | | - sqlite3_result_int64(context, (i64)aCnt[0]); |
| 105364 | | - }else{ |
| 105649 | + { |
| 105365 | 105650 | char *zRet = sqlite3MallocZero(p->nCol * 25); |
| 105366 | 105651 | if( zRet==0 ){ |
| 105367 | 105652 | sqlite3_result_error_nomem(context); |
| 105368 | 105653 | }else{ |
| 105369 | 105654 | int i; |
| | @@ -105376,17 +105661,17 @@ |
| 105376 | 105661 | z[-1] = '\0'; |
| 105377 | 105662 | sqlite3_result_text(context, zRet, -1, sqlite3_free); |
| 105378 | 105663 | } |
| 105379 | 105664 | } |
| 105380 | 105665 | } |
| 105381 | | -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ |
| 105666 | +#endif /* SQLITE_ENABLE_STAT4 */ |
| 105382 | 105667 | #ifndef SQLITE_DEBUG |
| 105383 | 105668 | UNUSED_PARAMETER( argc ); |
| 105384 | 105669 | #endif |
| 105385 | 105670 | } |
| 105386 | 105671 | static const FuncDef statGetFuncdef = { |
| 105387 | | - 1+IsStat34, /* nArg */ |
| 105672 | + 1+IsStat4, /* nArg */ |
| 105388 | 105673 | SQLITE_UTF8, /* funcFlags */ |
| 105389 | 105674 | 0, /* pUserData */ |
| 105390 | 105675 | 0, /* pNext */ |
| 105391 | 105676 | statGet, /* xSFunc */ |
| 105392 | 105677 | 0, /* xFinalize */ |
| | @@ -105395,20 +105680,20 @@ |
| 105395 | 105680 | {0} |
| 105396 | 105681 | }; |
| 105397 | 105682 | |
| 105398 | 105683 | static void callStatGet(Vdbe *v, int regStat4, int iParam, int regOut){ |
| 105399 | 105684 | assert( regOut!=regStat4 && regOut!=regStat4+1 ); |
| 105400 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105685 | +#ifdef SQLITE_ENABLE_STAT4 |
| 105401 | 105686 | sqlite3VdbeAddOp2(v, OP_Integer, iParam, regStat4+1); |
| 105402 | 105687 | #elif SQLITE_DEBUG |
| 105403 | 105688 | assert( iParam==STAT_GET_STAT1 ); |
| 105404 | 105689 | #else |
| 105405 | 105690 | UNUSED_PARAMETER( iParam ); |
| 105406 | 105691 | #endif |
| 105407 | 105692 | sqlite3VdbeAddOp4(v, OP_Function0, 0, regStat4, regOut, |
| 105408 | 105693 | (char*)&statGetFuncdef, P4_FUNCDEF); |
| 105409 | | - sqlite3VdbeChangeP5(v, 1 + IsStat34); |
| 105694 | + sqlite3VdbeChangeP5(v, 1 + IsStat4); |
| 105410 | 105695 | } |
| 105411 | 105696 | |
| 105412 | 105697 | /* |
| 105413 | 105698 | ** Generate code to do an analysis of all indices associated with |
| 105414 | 105699 | ** a single table. |
| | @@ -105431,11 +105716,11 @@ |
| 105431 | 105716 | int iDb; /* Index of database containing pTab */ |
| 105432 | 105717 | u8 needTableCnt = 1; /* True to count the table */ |
| 105433 | 105718 | int regNewRowid = iMem++; /* Rowid for the inserted record */ |
| 105434 | 105719 | int regStat4 = iMem++; /* Register to hold Stat4Accum object */ |
| 105435 | 105720 | int regChng = iMem++; /* Index of changed index field */ |
| 105436 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105721 | +#ifdef SQLITE_ENABLE_STAT4 |
| 105437 | 105722 | int regRowid = iMem++; /* Rowid argument passed to stat_push() */ |
| 105438 | 105723 | #endif |
| 105439 | 105724 | int regTemp = iMem++; /* Temporary use register */ |
| 105440 | 105725 | int regTabname = iMem++; /* Register containing table name */ |
| 105441 | 105726 | int regIdxname = iMem++; /* Register containing index name */ |
| | @@ -105565,20 +105850,20 @@ |
| 105565 | 105850 | ** (or for a WITHOUT ROWID table, the number of PK columns), |
| 105566 | 105851 | ** (2) the number of columns in the key without the rowid/pk |
| 105567 | 105852 | ** (3) the number of rows in the index, |
| 105568 | 105853 | ** |
| 105569 | 105854 | ** |
| 105570 | | - ** The third argument is only used for STAT3 and STAT4 |
| 105855 | + ** The third argument is only used for STAT4 |
| 105571 | 105856 | */ |
| 105572 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105857 | +#ifdef SQLITE_ENABLE_STAT4 |
| 105573 | 105858 | sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regStat4+3); |
| 105574 | 105859 | #endif |
| 105575 | 105860 | sqlite3VdbeAddOp2(v, OP_Integer, nCol, regStat4+1); |
| 105576 | 105861 | sqlite3VdbeAddOp2(v, OP_Integer, pIdx->nKeyCol, regStat4+2); |
| 105577 | 105862 | sqlite3VdbeAddOp4(v, OP_Function0, 0, regStat4+1, regStat4, |
| 105578 | 105863 | (char*)&statInitFuncdef, P4_FUNCDEF); |
| 105579 | | - sqlite3VdbeChangeP5(v, 2+IsStat34); |
| 105864 | + sqlite3VdbeChangeP5(v, 2+IsStat4); |
| 105580 | 105865 | |
| 105581 | 105866 | /* Implementation of the following: |
| 105582 | 105867 | ** |
| 105583 | 105868 | ** Rewind csr |
| 105584 | 105869 | ** if eof(csr) goto end_of_scan; |
| | @@ -105645,16 +105930,16 @@ |
| 105645 | 105930 | sqlite3DbFree(db, aGotoChng); |
| 105646 | 105931 | } |
| 105647 | 105932 | |
| 105648 | 105933 | /* |
| 105649 | 105934 | ** chng_addr_N: |
| 105650 | | - ** regRowid = idx(rowid) // STAT34 only |
| 105651 | | - ** stat_push(P, regChng, regRowid) // 3rd parameter STAT34 only |
| 105935 | + ** regRowid = idx(rowid) // STAT4 only |
| 105936 | + ** stat_push(P, regChng, regRowid) // 3rd parameter STAT4 only |
| 105652 | 105937 | ** Next csr |
| 105653 | 105938 | ** if !eof(csr) goto next_row; |
| 105654 | 105939 | */ |
| 105655 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105940 | +#ifdef SQLITE_ENABLE_STAT4 |
| 105656 | 105941 | assert( regRowid==(regStat4+2) ); |
| 105657 | 105942 | if( HasRowid(pTab) ){ |
| 105658 | 105943 | sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, regRowid); |
| 105659 | 105944 | }else{ |
| 105660 | 105945 | Index *pPk = sqlite3PrimaryKeyIndex(pIdx->pTable); |
| | @@ -105671,11 +105956,11 @@ |
| 105671 | 105956 | } |
| 105672 | 105957 | #endif |
| 105673 | 105958 | assert( regChng==(regStat4+1) ); |
| 105674 | 105959 | sqlite3VdbeAddOp4(v, OP_Function0, 1, regStat4, regTemp, |
| 105675 | 105960 | (char*)&statPushFuncdef, P4_FUNCDEF); |
| 105676 | | - sqlite3VdbeChangeP5(v, 2+IsStat34); |
| 105961 | + sqlite3VdbeChangeP5(v, 2+IsStat4); |
| 105677 | 105962 | sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); |
| 105678 | 105963 | |
| 105679 | 105964 | /* Add the entry to the stat1 table. */ |
| 105680 | 105965 | callStatGet(v, regStat4, STAT_GET_STAT1, regStat1); |
| 105681 | 105966 | assert( "BBB"[0]==SQLITE_AFF_TEXT ); |
| | @@ -105685,12 +105970,12 @@ |
| 105685 | 105970 | #ifdef SQLITE_ENABLE_PREUPDATE_HOOK |
| 105686 | 105971 | sqlite3VdbeChangeP4(v, -1, (char*)pStat1, P4_TABLE); |
| 105687 | 105972 | #endif |
| 105688 | 105973 | sqlite3VdbeChangeP5(v, OPFLAG_APPEND); |
| 105689 | 105974 | |
| 105690 | | - /* Add the entries to the stat3 or stat4 table. */ |
| 105691 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 105975 | + /* Add the entries to the stat4 table. */ |
| 105976 | +#ifdef SQLITE_ENABLE_STAT4 |
| 105692 | 105977 | { |
| 105693 | 105978 | int regEq = regStat1; |
| 105694 | 105979 | int regLt = regStat1+1; |
| 105695 | 105980 | int regDLt = regStat1+2; |
| 105696 | 105981 | int regSample = regStat1+3; |
| | @@ -105709,25 +105994,21 @@ |
| 105709 | 105994 | callStatGet(v, regStat4, STAT_GET_NEQ, regEq); |
| 105710 | 105995 | callStatGet(v, regStat4, STAT_GET_NLT, regLt); |
| 105711 | 105996 | callStatGet(v, regStat4, STAT_GET_NDLT, regDLt); |
| 105712 | 105997 | sqlite3VdbeAddOp4Int(v, seekOp, iTabCur, addrNext, regSampleRowid, 0); |
| 105713 | 105998 | VdbeCoverage(v); |
| 105714 | | -#ifdef SQLITE_ENABLE_STAT3 |
| 105715 | | - sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iTabCur, 0, regSample); |
| 105716 | | -#else |
| 105717 | 105999 | for(i=0; i<nCol; i++){ |
| 105718 | 106000 | sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iTabCur, i, regCol+i); |
| 105719 | 106001 | } |
| 105720 | 106002 | sqlite3VdbeAddOp3(v, OP_MakeRecord, regCol, nCol, regSample); |
| 105721 | | -#endif |
| 105722 | 106003 | sqlite3VdbeAddOp3(v, OP_MakeRecord, regTabname, 6, regTemp); |
| 105723 | 106004 | sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur+1, regNewRowid); |
| 105724 | 106005 | sqlite3VdbeAddOp3(v, OP_Insert, iStatCur+1, regTemp, regNewRowid); |
| 105725 | 106006 | sqlite3VdbeAddOp2(v, OP_Goto, 1, addrNext); /* P1==1 for end-of-loop */ |
| 105726 | 106007 | sqlite3VdbeJumpHere(v, addrIsNull); |
| 105727 | 106008 | } |
| 105728 | | -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ |
| 106009 | +#endif /* SQLITE_ENABLE_STAT4 */ |
| 105729 | 106010 | |
| 105730 | 106011 | /* End of analysis */ |
| 105731 | 106012 | sqlite3VdbeJumpHere(v, addrRewind); |
| 105732 | 106013 | } |
| 105733 | 106014 | |
| | @@ -105898,11 +106179,11 @@ |
| 105898 | 106179 | char *z = zIntArray; |
| 105899 | 106180 | int c; |
| 105900 | 106181 | int i; |
| 105901 | 106182 | tRowcnt v; |
| 105902 | 106183 | |
| 105903 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 106184 | +#ifdef SQLITE_ENABLE_STAT4 |
| 105904 | 106185 | if( z==0 ) z = ""; |
| 105905 | 106186 | #else |
| 105906 | 106187 | assert( z!=0 ); |
| 105907 | 106188 | #endif |
| 105908 | 106189 | for(i=0; *z && i<nOut; i++){ |
| | @@ -105909,11 +106190,11 @@ |
| 105909 | 106190 | v = 0; |
| 105910 | 106191 | while( (c=z[0])>='0' && c<='9' ){ |
| 105911 | 106192 | v = v*10 + c - '0'; |
| 105912 | 106193 | z++; |
| 105913 | 106194 | } |
| 105914 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 106195 | +#ifdef SQLITE_ENABLE_STAT4 |
| 105915 | 106196 | if( aOut ) aOut[i] = v; |
| 105916 | 106197 | if( aLog ) aLog[i] = sqlite3LogEst(v); |
| 105917 | 106198 | #else |
| 105918 | 106199 | assert( aOut==0 ); |
| 105919 | 106200 | UNUSED_PARAMETER(aOut); |
| | @@ -105920,11 +106201,11 @@ |
| 105920 | 106201 | assert( aLog!=0 ); |
| 105921 | 106202 | aLog[i] = sqlite3LogEst(v); |
| 105922 | 106203 | #endif |
| 105923 | 106204 | if( *z==' ' ) z++; |
| 105924 | 106205 | } |
| 105925 | | -#ifndef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 106206 | +#ifndef SQLITE_ENABLE_STAT4 |
| 105926 | 106207 | assert( pIndex!=0 ); { |
| 105927 | 106208 | #else |
| 105928 | 106209 | if( pIndex ){ |
| 105929 | 106210 | #endif |
| 105930 | 106211 | pIndex->bUnordered = 0; |
| | @@ -105931,11 +106212,13 @@ |
| 105931 | 106212 | pIndex->noSkipScan = 0; |
| 105932 | 106213 | while( z[0] ){ |
| 105933 | 106214 | if( sqlite3_strglob("unordered*", z)==0 ){ |
| 105934 | 106215 | pIndex->bUnordered = 1; |
| 105935 | 106216 | }else if( sqlite3_strglob("sz=[0-9]*", z)==0 ){ |
| 105936 | | - pIndex->szIdxRow = sqlite3LogEst(sqlite3Atoi(z+3)); |
| 106217 | + int sz = sqlite3Atoi(z+3); |
| 106218 | + if( sz<2 ) sz = 2; |
| 106219 | + pIndex->szIdxRow = sqlite3LogEst(sz); |
| 105937 | 106220 | }else if( sqlite3_strglob("noskipscan*", z)==0 ){ |
| 105938 | 106221 | pIndex->noSkipScan = 1; |
| 105939 | 106222 | } |
| 105940 | 106223 | #ifdef SQLITE_ENABLE_COSTMULT |
| 105941 | 106224 | else if( sqlite3_strglob("costmult=[0-9]*",z)==0 ){ |
| | @@ -105985,11 +106268,11 @@ |
| 105985 | 106268 | z = argv[2]; |
| 105986 | 106269 | |
| 105987 | 106270 | if( pIndex ){ |
| 105988 | 106271 | tRowcnt *aiRowEst = 0; |
| 105989 | 106272 | int nCol = pIndex->nKeyCol+1; |
| 105990 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 106273 | +#ifdef SQLITE_ENABLE_STAT4 |
| 105991 | 106274 | /* Index.aiRowEst may already be set here if there are duplicate |
| 105992 | 106275 | ** sqlite_stat1 entries for this index. In that case just clobber |
| 105993 | 106276 | ** the old data with the new instead of allocating a new array. */ |
| 105994 | 106277 | if( pIndex->aiRowEst==0 ){ |
| 105995 | 106278 | pIndex->aiRowEst = (tRowcnt*)sqlite3MallocZero(sizeof(tRowcnt) * nCol); |
| | @@ -106021,11 +106304,11 @@ |
| 106021 | 106304 | /* |
| 106022 | 106305 | ** If the Index.aSample variable is not NULL, delete the aSample[] array |
| 106023 | 106306 | ** and its contents. |
| 106024 | 106307 | */ |
| 106025 | 106308 | SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){ |
| 106026 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 106309 | +#ifdef SQLITE_ENABLE_STAT4 |
| 106027 | 106310 | if( pIdx->aSample ){ |
| 106028 | 106311 | int j; |
| 106029 | 106312 | for(j=0; j<pIdx->nSample; j++){ |
| 106030 | 106313 | IndexSample *p = &pIdx->aSample[j]; |
| 106031 | 106314 | sqlite3DbFree(db, p->p); |
| | @@ -106037,14 +106320,14 @@ |
| 106037 | 106320 | pIdx->aSample = 0; |
| 106038 | 106321 | } |
| 106039 | 106322 | #else |
| 106040 | 106323 | UNUSED_PARAMETER(db); |
| 106041 | 106324 | UNUSED_PARAMETER(pIdx); |
| 106042 | | -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ |
| 106325 | +#endif /* SQLITE_ENABLE_STAT4 */ |
| 106043 | 106326 | } |
| 106044 | 106327 | |
| 106045 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 106328 | +#ifdef SQLITE_ENABLE_STAT4 |
| 106046 | 106329 | /* |
| 106047 | 106330 | ** Populate the pIdx->aAvgEq[] array based on the samples currently |
| 106048 | 106331 | ** stored in pIdx->aSample[]. |
| 106049 | 106332 | */ |
| 106050 | 106333 | static void initAvgEq(Index *pIdx){ |
| | @@ -106118,25 +106401,23 @@ |
| 106118 | 106401 | } |
| 106119 | 106402 | return pIdx; |
| 106120 | 106403 | } |
| 106121 | 106404 | |
| 106122 | 106405 | /* |
| 106123 | | -** Load the content from either the sqlite_stat4 or sqlite_stat3 table |
| 106406 | +** Load the content from either the sqlite_stat4 |
| 106124 | 106407 | ** into the relevant Index.aSample[] arrays. |
| 106125 | 106408 | ** |
| 106126 | 106409 | ** Arguments zSql1 and zSql2 must point to SQL statements that return |
| 106127 | | -** data equivalent to the following (statements are different for stat3, |
| 106128 | | -** see the caller of this function for details): |
| 106410 | +** data equivalent to the following: |
| 106129 | 106411 | ** |
| 106130 | 106412 | ** zSql1: SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx |
| 106131 | 106413 | ** zSql2: SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4 |
| 106132 | 106414 | ** |
| 106133 | 106415 | ** where %Q is replaced with the database name before the SQL is executed. |
| 106134 | 106416 | */ |
| 106135 | 106417 | static int loadStatTbl( |
| 106136 | 106418 | sqlite3 *db, /* Database handle */ |
| 106137 | | - int bStat3, /* Assume single column records only */ |
| 106138 | 106419 | const char *zSql1, /* SQL statement 1 (see above) */ |
| 106139 | 106420 | const char *zSql2, /* SQL statement 2 (see above) */ |
| 106140 | 106421 | const char *zDb /* Database name (e.g. "main") */ |
| 106141 | 106422 | ){ |
| 106142 | 106423 | int rc; /* Result codes from subroutines */ |
| | @@ -106166,21 +106447,17 @@ |
| 106166 | 106447 | |
| 106167 | 106448 | zIndex = (char *)sqlite3_column_text(pStmt, 0); |
| 106168 | 106449 | if( zIndex==0 ) continue; |
| 106169 | 106450 | nSample = sqlite3_column_int(pStmt, 1); |
| 106170 | 106451 | pIdx = findIndexOrPrimaryKey(db, zIndex, zDb); |
| 106171 | | - assert( pIdx==0 || bStat3 || pIdx->nSample==0 ); |
| 106172 | | - /* Index.nSample is non-zero at this point if data has already been |
| 106173 | | - ** loaded from the stat4 table. In this case ignore stat3 data. */ |
| 106174 | | - if( pIdx==0 || pIdx->nSample ) continue; |
| 106175 | | - if( bStat3==0 ){ |
| 106176 | | - assert( !HasRowid(pIdx->pTable) || pIdx->nColumn==pIdx->nKeyCol+1 ); |
| 106177 | | - if( !HasRowid(pIdx->pTable) && IsPrimaryKeyIndex(pIdx) ){ |
| 106178 | | - nIdxCol = pIdx->nKeyCol; |
| 106179 | | - }else{ |
| 106180 | | - nIdxCol = pIdx->nColumn; |
| 106181 | | - } |
| 106452 | + assert( pIdx==0 || pIdx->nSample==0 ); |
| 106453 | + if( pIdx==0 ) continue; |
| 106454 | + assert( !HasRowid(pIdx->pTable) || pIdx->nColumn==pIdx->nKeyCol+1 ); |
| 106455 | + if( !HasRowid(pIdx->pTable) && IsPrimaryKeyIndex(pIdx) ){ |
| 106456 | + nIdxCol = pIdx->nKeyCol; |
| 106457 | + }else{ |
| 106458 | + nIdxCol = pIdx->nColumn; |
| 106182 | 106459 | } |
| 106183 | 106460 | pIdx->nSampleCol = nIdxCol; |
| 106184 | 106461 | nByte = sizeof(IndexSample) * nSample; |
| 106185 | 106462 | nByte += sizeof(tRowcnt) * nIdxCol * 3 * nSample; |
| 106186 | 106463 | nByte += nIdxCol * sizeof(tRowcnt); /* Space for Index.aAvgEq[] */ |
| | @@ -106218,13 +106495,12 @@ |
| 106218 | 106495 | zIndex = (char *)sqlite3_column_text(pStmt, 0); |
| 106219 | 106496 | if( zIndex==0 ) continue; |
| 106220 | 106497 | pIdx = findIndexOrPrimaryKey(db, zIndex, zDb); |
| 106221 | 106498 | if( pIdx==0 ) continue; |
| 106222 | 106499 | /* This next condition is true if data has already been loaded from |
| 106223 | | - ** the sqlite_stat4 table. In this case ignore stat3 data. */ |
| 106500 | + ** the sqlite_stat4 table. */ |
| 106224 | 106501 | nCol = pIdx->nSampleCol; |
| 106225 | | - if( bStat3 && nCol>1 ) continue; |
| 106226 | 106502 | if( pIdx!=pPrevIdx ){ |
| 106227 | 106503 | initAvgEq(pPrevIdx); |
| 106228 | 106504 | pPrevIdx = pIdx; |
| 106229 | 106505 | } |
| 106230 | 106506 | pSample = &pIdx->aSample[pIdx->nSample]; |
| | @@ -106253,49 +106529,40 @@ |
| 106253 | 106529 | if( rc==SQLITE_OK ) initAvgEq(pPrevIdx); |
| 106254 | 106530 | return rc; |
| 106255 | 106531 | } |
| 106256 | 106532 | |
| 106257 | 106533 | /* |
| 106258 | | -** Load content from the sqlite_stat4 and sqlite_stat3 tables into |
| 106534 | +** Load content from the sqlite_stat4 table into |
| 106259 | 106535 | ** the Index.aSample[] arrays of all indices. |
| 106260 | 106536 | */ |
| 106261 | 106537 | static int loadStat4(sqlite3 *db, const char *zDb){ |
| 106262 | 106538 | int rc = SQLITE_OK; /* Result codes from subroutines */ |
| 106263 | 106539 | |
| 106264 | 106540 | assert( db->lookaside.bDisable ); |
| 106265 | 106541 | if( sqlite3FindTable(db, "sqlite_stat4", zDb) ){ |
| 106266 | | - rc = loadStatTbl(db, 0, |
| 106542 | + rc = loadStatTbl(db, |
| 106267 | 106543 | "SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx", |
| 106268 | 106544 | "SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4", |
| 106269 | 106545 | zDb |
| 106270 | 106546 | ); |
| 106271 | 106547 | } |
| 106272 | | - |
| 106273 | | - if( rc==SQLITE_OK && sqlite3FindTable(db, "sqlite_stat3", zDb) ){ |
| 106274 | | - rc = loadStatTbl(db, 1, |
| 106275 | | - "SELECT idx,count(*) FROM %Q.sqlite_stat3 GROUP BY idx", |
| 106276 | | - "SELECT idx,neq,nlt,ndlt,sqlite_record(sample) FROM %Q.sqlite_stat3", |
| 106277 | | - zDb |
| 106278 | | - ); |
| 106279 | | - } |
| 106280 | | - |
| 106281 | 106548 | return rc; |
| 106282 | 106549 | } |
| 106283 | | -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ |
| 106550 | +#endif /* SQLITE_ENABLE_STAT4 */ |
| 106284 | 106551 | |
| 106285 | 106552 | /* |
| 106286 | | -** Load the content of the sqlite_stat1 and sqlite_stat3/4 tables. The |
| 106553 | +** Load the content of the sqlite_stat1 and sqlite_stat4 tables. The |
| 106287 | 106554 | ** contents of sqlite_stat1 are used to populate the Index.aiRowEst[] |
| 106288 | | -** arrays. The contents of sqlite_stat3/4 are used to populate the |
| 106555 | +** arrays. The contents of sqlite_stat4 are used to populate the |
| 106289 | 106556 | ** Index.aSample[] arrays. |
| 106290 | 106557 | ** |
| 106291 | 106558 | ** If the sqlite_stat1 table is not present in the database, SQLITE_ERROR |
| 106292 | | -** is returned. In this case, even if SQLITE_ENABLE_STAT3/4 was defined |
| 106293 | | -** during compilation and the sqlite_stat3/4 table is present, no data is |
| 106559 | +** is returned. In this case, even if SQLITE_ENABLE_STAT4 was defined |
| 106560 | +** during compilation and the sqlite_stat4 table is present, no data is |
| 106294 | 106561 | ** read from it. |
| 106295 | 106562 | ** |
| 106296 | | -** If SQLITE_ENABLE_STAT3/4 was defined during compilation and the |
| 106563 | +** If SQLITE_ENABLE_STAT4 was defined during compilation and the |
| 106297 | 106564 | ** sqlite_stat4 table is not present in the database, SQLITE_ERROR is |
| 106298 | 106565 | ** returned. However, in this case, data is read from the sqlite_stat1 |
| 106299 | 106566 | ** table (if it is present) before returning. |
| 106300 | 106567 | ** |
| 106301 | 106568 | ** If an OOM error occurs, this function always sets db->mallocFailed. |
| | @@ -106319,11 +106586,11 @@ |
| 106319 | 106586 | pTab->tabFlags &= ~TF_HasStat1; |
| 106320 | 106587 | } |
| 106321 | 106588 | for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ |
| 106322 | 106589 | Index *pIdx = sqliteHashData(i); |
| 106323 | 106590 | pIdx->hasStat1 = 0; |
| 106324 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 106591 | +#ifdef SQLITE_ENABLE_STAT4 |
| 106325 | 106592 | sqlite3DeleteIndexSamples(db, pIdx); |
| 106326 | 106593 | pIdx->aSample = 0; |
| 106327 | 106594 | #endif |
| 106328 | 106595 | } |
| 106329 | 106596 | |
| | @@ -106347,11 +106614,11 @@ |
| 106347 | 106614 | Index *pIdx = sqliteHashData(i); |
| 106348 | 106615 | if( !pIdx->hasStat1 ) sqlite3DefaultRowEst(pIdx); |
| 106349 | 106616 | } |
| 106350 | 106617 | |
| 106351 | 106618 | /* Load the statistics from the sqlite_stat4 table. */ |
| 106352 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 106619 | +#ifdef SQLITE_ENABLE_STAT4 |
| 106353 | 106620 | if( rc==SQLITE_OK ){ |
| 106354 | 106621 | db->lookaside.bDisable++; |
| 106355 | 106622 | rc = loadStat4(db, sInfo.zDatabase); |
| 106356 | 106623 | db->lookaside.bDisable--; |
| 106357 | 106624 | } |
| | @@ -106672,10 +106939,11 @@ |
| 106672 | 106939 | ){ |
| 106673 | 106940 | const char *zName = (const char *)sqlite3_value_text(argv[0]); |
| 106674 | 106941 | sqlite3 *db = sqlite3_context_db_handle(context); |
| 106675 | 106942 | int i; |
| 106676 | 106943 | Db *pDb = 0; |
| 106944 | + HashElem *pEntry; |
| 106677 | 106945 | char zErr[128]; |
| 106678 | 106946 | |
| 106679 | 106947 | UNUSED_PARAMETER(NotUsed); |
| 106680 | 106948 | |
| 106681 | 106949 | if( zName==0 ) zName = ""; |
| | @@ -106695,10 +106963,22 @@ |
| 106695 | 106963 | } |
| 106696 | 106964 | if( sqlite3BtreeIsInReadTrans(pDb->pBt) || sqlite3BtreeIsInBackup(pDb->pBt) ){ |
| 106697 | 106965 | sqlite3_snprintf(sizeof(zErr),zErr, "database %s is locked", zName); |
| 106698 | 106966 | goto detach_error; |
| 106699 | 106967 | } |
| 106968 | + |
| 106969 | + /* If any TEMP triggers reference the schema being detached, move those |
| 106970 | + ** triggers to reference the TEMP schema itself. */ |
| 106971 | + assert( db->aDb[1].pSchema ); |
| 106972 | + pEntry = sqliteHashFirst(&db->aDb[1].pSchema->trigHash); |
| 106973 | + while( pEntry ){ |
| 106974 | + Trigger *pTrig = (Trigger*)sqliteHashData(pEntry); |
| 106975 | + if( pTrig->pTabSchema==pDb->pSchema ){ |
| 106976 | + pTrig->pTabSchema = pTrig->pSchema; |
| 106977 | + } |
| 106978 | + pEntry = sqliteHashNext(pEntry); |
| 106979 | + } |
| 106700 | 106980 | |
| 106701 | 106981 | sqlite3BtreeClose(pDb->pBt); |
| 106702 | 106982 | pDb->pBt = 0; |
| 106703 | 106983 | pDb->pSchema = 0; |
| 106704 | 106984 | sqlite3CollapseDatabaseArray(db); |
| | @@ -106933,10 +107213,11 @@ |
| 106933 | 107213 | SQLITE_PRIVATE int sqlite3FixExpr( |
| 106934 | 107214 | DbFixer *pFix, /* Context of the fixation */ |
| 106935 | 107215 | Expr *pExpr /* The expression to be fixed to one database */ |
| 106936 | 107216 | ){ |
| 106937 | 107217 | while( pExpr ){ |
| 107218 | + ExprSetProperty(pExpr, EP_Indirect); |
| 106938 | 107219 | if( pExpr->op==TK_VARIABLE ){ |
| 106939 | 107220 | if( pFix->pParse->db->init.busy ){ |
| 106940 | 107221 | pExpr->op = TK_NULL; |
| 106941 | 107222 | }else{ |
| 106942 | 107223 | sqlite3ErrorMsg(pFix->pParse, "%s cannot use variables", pFix->zType); |
| | @@ -107085,11 +107366,11 @@ |
| 107085 | 107366 | if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; |
| 107086 | 107367 | #endif |
| 107087 | 107368 | sqlite3_mutex_enter(db->mutex); |
| 107088 | 107369 | db->xAuth = (sqlite3_xauth)xAuth; |
| 107089 | 107370 | db->pAuthArg = pArg; |
| 107090 | | - sqlite3ExpirePreparedStatements(db, 0); |
| 107371 | + if( db->xAuth ) sqlite3ExpirePreparedStatements(db, 1); |
| 107091 | 107372 | sqlite3_mutex_leave(db->mutex); |
| 107092 | 107373 | return SQLITE_OK; |
| 107093 | 107374 | } |
| 107094 | 107375 | |
| 107095 | 107376 | /* |
| | @@ -107739,11 +108020,11 @@ |
| 107739 | 108020 | #endif |
| 107740 | 108021 | sqlite3ExprDelete(db, p->pPartIdxWhere); |
| 107741 | 108022 | sqlite3ExprListDelete(db, p->aColExpr); |
| 107742 | 108023 | sqlite3DbFree(db, p->zColAff); |
| 107743 | 108024 | if( p->isResized ) sqlite3DbFree(db, (void *)p->azColl); |
| 107744 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 108025 | +#ifdef SQLITE_ENABLE_STAT4 |
| 107745 | 108026 | sqlite3_free(p->aiRowEst); |
| 107746 | 108027 | #endif |
| 107747 | 108028 | sqlite3DbFree(db, p); |
| 107748 | 108029 | } |
| 107749 | 108030 | |
| | @@ -108112,17 +108393,44 @@ |
| 108112 | 108393 | ** This routine is used to check if the UTF-8 string zName is a legal |
| 108113 | 108394 | ** unqualified name for a new schema object (table, index, view or |
| 108114 | 108395 | ** trigger). All names are legal except those that begin with the string |
| 108115 | 108396 | ** "sqlite_" (in upper, lower or mixed case). This portion of the namespace |
| 108116 | 108397 | ** is reserved for internal use. |
| 108398 | +** |
| 108399 | +** When parsing the sqlite_master table, this routine also checks to |
| 108400 | +** make sure the "type", "name", and "tbl_name" columns are consistent |
| 108401 | +** with the SQL. |
| 108117 | 108402 | */ |
| 108118 | | -SQLITE_PRIVATE int sqlite3CheckObjectName(Parse *pParse, const char *zName){ |
| 108119 | | - if( !pParse->db->init.busy && pParse->nested==0 |
| 108120 | | - && sqlite3WritableSchema(pParse->db)==0 |
| 108121 | | - && 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){ |
| 108122 | | - sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", zName); |
| 108123 | | - return SQLITE_ERROR; |
| 108403 | +SQLITE_PRIVATE int sqlite3CheckObjectName( |
| 108404 | + Parse *pParse, /* Parsing context */ |
| 108405 | + const char *zName, /* Name of the object to check */ |
| 108406 | + const char *zType, /* Type of this object */ |
| 108407 | + const char *zTblName /* Parent table name for triggers and indexes */ |
| 108408 | +){ |
| 108409 | + sqlite3 *db = pParse->db; |
| 108410 | + if( sqlite3WritableSchema(db) || db->init.imposterTable ){ |
| 108411 | + /* Skip these error checks for writable_schema=ON */ |
| 108412 | + return SQLITE_OK; |
| 108413 | + } |
| 108414 | + if( db->init.busy ){ |
| 108415 | + if( sqlite3_stricmp(zType, db->init.azInit[0]) |
| 108416 | + || sqlite3_stricmp(zName, db->init.azInit[1]) |
| 108417 | + || sqlite3_stricmp(zTblName, db->init.azInit[2]) |
| 108418 | + ){ |
| 108419 | + if( sqlite3Config.bExtraSchemaChecks ){ |
| 108420 | + sqlite3ErrorMsg(pParse, ""); /* corruptSchema() will supply the error */ |
| 108421 | + return SQLITE_ERROR; |
| 108422 | + } |
| 108423 | + } |
| 108424 | + }else{ |
| 108425 | + if( pParse->nested==0 |
| 108426 | + && 0==sqlite3StrNICmp(zName, "sqlite_", 7) |
| 108427 | + ){ |
| 108428 | + sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", |
| 108429 | + zName); |
| 108430 | + return SQLITE_ERROR; |
| 108431 | + } |
| 108124 | 108432 | } |
| 108125 | 108433 | return SQLITE_OK; |
| 108126 | 108434 | } |
| 108127 | 108435 | |
| 108128 | 108436 | /* |
| | @@ -108199,11 +108507,11 @@ |
| 108199 | 108507 | sqlite3RenameTokenMap(pParse, (void*)zName, pName); |
| 108200 | 108508 | } |
| 108201 | 108509 | } |
| 108202 | 108510 | pParse->sNameToken = *pName; |
| 108203 | 108511 | if( zName==0 ) return; |
| 108204 | | - if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ |
| 108512 | + if( sqlite3CheckObjectName(pParse, zName, isView?"view":"table", zName) ){ |
| 108205 | 108513 | goto begin_table_error; |
| 108206 | 108514 | } |
| 108207 | 108515 | if( db->init.iDb==1 ) isTemp = 1; |
| 108208 | 108516 | #ifndef SQLITE_OMIT_AUTHORIZATION |
| 108209 | 108517 | assert( isTemp==0 || isTemp==1 ); |
| | @@ -108699,11 +109007,11 @@ |
| 108699 | 109007 | } |
| 108700 | 109008 | pTab->iPKey = iCol; |
| 108701 | 109009 | pTab->keyConf = (u8)onError; |
| 108702 | 109010 | assert( autoInc==0 || autoInc==1 ); |
| 108703 | 109011 | pTab->tabFlags |= autoInc*TF_Autoincrement; |
| 108704 | | - if( pList ) pParse->iPkSortOrder = pList->a[0].sortOrder; |
| 109012 | + if( pList ) pParse->iPkSortOrder = pList->a[0].sortFlags; |
| 108705 | 109013 | }else if( autoInc ){ |
| 108706 | 109014 | #ifndef SQLITE_OMIT_AUTOINCREMENT |
| 108707 | 109015 | sqlite3ErrorMsg(pParse, "AUTOINCREMENT is only allowed on an " |
| 108708 | 109016 | "INTEGER PRIMARY KEY"); |
| 108709 | 109017 | #endif |
| | @@ -109114,10 +109422,11 @@ |
| 109114 | 109422 | */ |
| 109115 | 109423 | static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ |
| 109116 | 109424 | Index *pIdx; |
| 109117 | 109425 | Index *pPk; |
| 109118 | 109426 | int nPk; |
| 109427 | + int nExtra; |
| 109119 | 109428 | int i, j; |
| 109120 | 109429 | sqlite3 *db = pParse->db; |
| 109121 | 109430 | Vdbe *v = pParse->pVdbe; |
| 109122 | 109431 | |
| 109123 | 109432 | /* Mark every PRIMARY KEY column as NOT NULL (except for imposter tables) |
| | @@ -109149,17 +109458,18 @@ |
| 109149 | 109458 | sqlite3ExprAlloc(db, TK_ID, &ipkToken, 0)); |
| 109150 | 109459 | if( pList==0 ) return; |
| 109151 | 109460 | if( IN_RENAME_OBJECT ){ |
| 109152 | 109461 | sqlite3RenameTokenRemap(pParse, pList->a[0].pExpr, &pTab->iPKey); |
| 109153 | 109462 | } |
| 109154 | | - pList->a[0].sortOrder = pParse->iPkSortOrder; |
| 109463 | + pList->a[0].sortFlags = pParse->iPkSortOrder; |
| 109155 | 109464 | assert( pParse->pNewTable==pTab ); |
| 109156 | 109465 | pTab->iPKey = -1; |
| 109157 | 109466 | sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0, |
| 109158 | 109467 | SQLITE_IDXTYPE_PRIMARYKEY); |
| 109159 | 109468 | if( db->mallocFailed || pParse->nErr ) return; |
| 109160 | 109469 | pPk = sqlite3PrimaryKeyIndex(pTab); |
| 109470 | + assert( pPk->nKeyCol==1 ); |
| 109161 | 109471 | }else{ |
| 109162 | 109472 | pPk = sqlite3PrimaryKeyIndex(pTab); |
| 109163 | 109473 | assert( pPk!=0 ); |
| 109164 | 109474 | |
| 109165 | 109475 | /* |
| | @@ -109170,19 +109480,21 @@ |
| 109170 | 109480 | for(i=j=1; i<pPk->nKeyCol; i++){ |
| 109171 | 109481 | if( isDupColumn(pPk, j, pPk, i) ){ |
| 109172 | 109482 | pPk->nColumn--; |
| 109173 | 109483 | }else{ |
| 109174 | 109484 | testcase( hasColumn(pPk->aiColumn, j, pPk->aiColumn[i]) ); |
| 109485 | + pPk->azColl[j] = pPk->azColl[i]; |
| 109486 | + pPk->aSortOrder[j] = pPk->aSortOrder[i]; |
| 109175 | 109487 | pPk->aiColumn[j++] = pPk->aiColumn[i]; |
| 109176 | 109488 | } |
| 109177 | 109489 | } |
| 109178 | 109490 | pPk->nKeyCol = j; |
| 109179 | 109491 | } |
| 109180 | 109492 | assert( pPk!=0 ); |
| 109181 | 109493 | pPk->isCovering = 1; |
| 109182 | 109494 | if( !db->init.imposterTable ) pPk->uniqNotNull = 1; |
| 109183 | | - nPk = pPk->nKeyCol; |
| 109495 | + nPk = pPk->nColumn = pPk->nKeyCol; |
| 109184 | 109496 | |
| 109185 | 109497 | /* Bypass the creation of the PRIMARY KEY btree and the sqlite_master |
| 109186 | 109498 | ** table entry. This is only required if currently generating VDBE |
| 109187 | 109499 | ** code for a CREATE TABLE (not when parsing one as part of reading |
| 109188 | 109500 | ** a database schema). */ |
| | @@ -109228,25 +109540,25 @@ |
| 109228 | 109540 | assert( pIdx->nColumn>=j ); |
| 109229 | 109541 | } |
| 109230 | 109542 | |
| 109231 | 109543 | /* Add all table columns to the PRIMARY KEY index |
| 109232 | 109544 | */ |
| 109233 | | - if( nPk<pTab->nCol ){ |
| 109234 | | - if( resizeIndexObject(db, pPk, pTab->nCol) ) return; |
| 109235 | | - for(i=0, j=nPk; i<pTab->nCol; i++){ |
| 109236 | | - if( !hasColumn(pPk->aiColumn, j, i) ){ |
| 109237 | | - assert( j<pPk->nColumn ); |
| 109238 | | - pPk->aiColumn[j] = i; |
| 109239 | | - pPk->azColl[j] = sqlite3StrBINARY; |
| 109240 | | - j++; |
| 109241 | | - } |
| 109242 | | - } |
| 109243 | | - assert( pPk->nColumn==j ); |
| 109244 | | - assert( pTab->nCol==j ); |
| 109245 | | - }else{ |
| 109246 | | - pPk->nColumn = pTab->nCol; |
| 109247 | | - } |
| 109545 | + nExtra = 0; |
| 109546 | + for(i=0; i<pTab->nCol; i++){ |
| 109547 | + if( !hasColumn(pPk->aiColumn, nPk, i) ) nExtra++; |
| 109548 | + } |
| 109549 | + if( resizeIndexObject(db, pPk, nPk+nExtra) ) return; |
| 109550 | + for(i=0, j=nPk; i<pTab->nCol; i++){ |
| 109551 | + if( !hasColumn(pPk->aiColumn, j, i) ){ |
| 109552 | + assert( j<pPk->nColumn ); |
| 109553 | + pPk->aiColumn[j] = i; |
| 109554 | + pPk->azColl[j] = sqlite3StrBINARY; |
| 109555 | + j++; |
| 109556 | + } |
| 109557 | + } |
| 109558 | + assert( pPk->nColumn==j ); |
| 109559 | + assert( pTab->nCol<=j ); |
| 109248 | 109560 | recomputeColumnsNotIndexed(pPk); |
| 109249 | 109561 | } |
| 109250 | 109562 | |
| 109251 | 109563 | #ifndef SQLITE_OMIT_VIRTUALTABLE |
| 109252 | 109564 | /* |
| | @@ -109439,11 +109751,11 @@ |
| 109439 | 109751 | sqlite3VdbeChangeP5(v, OPFLAG_P2ISREG); |
| 109440 | 109752 | pParse->nTab = 2; |
| 109441 | 109753 | addrTop = sqlite3VdbeCurrentAddr(v) + 1; |
| 109442 | 109754 | sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop); |
| 109443 | 109755 | if( pParse->nErr ) return; |
| 109444 | | - pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect); |
| 109756 | + pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect, SQLITE_AFF_BLOB); |
| 109445 | 109757 | if( pSelTab==0 ) return; |
| 109446 | 109758 | assert( p->aCol==0 ); |
| 109447 | 109759 | p->nCol = pSelTab->nCol; |
| 109448 | 109760 | p->aCol = pSelTab->aCol; |
| 109449 | 109761 | pSelTab->nCol = 0; |
| | @@ -109703,14 +110015,14 @@ |
| 109703 | 110015 | pTable->nCol = -1; |
| 109704 | 110016 | db->lookaside.bDisable++; |
| 109705 | 110017 | #ifndef SQLITE_OMIT_AUTHORIZATION |
| 109706 | 110018 | xAuth = db->xAuth; |
| 109707 | 110019 | db->xAuth = 0; |
| 109708 | | - pSelTab = sqlite3ResultSetOfSelect(pParse, pSel); |
| 110020 | + pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, SQLITE_AFF_NONE); |
| 109709 | 110021 | db->xAuth = xAuth; |
| 109710 | 110022 | #else |
| 109711 | | - pSelTab = sqlite3ResultSetOfSelect(pParse, pSel); |
| 110023 | + pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, SQLITE_AFF_NONE); |
| 109712 | 110024 | #endif |
| 109713 | 110025 | pParse->nTab = n; |
| 109714 | 110026 | if( pTable->pCheck ){ |
| 109715 | 110027 | /* CREATE VIEW name(arglist) AS ... |
| 109716 | 110028 | ** The names of the columns in the table are taken from |
| | @@ -109722,11 +110034,12 @@ |
| 109722 | 110034 | &pTable->nCol, &pTable->aCol); |
| 109723 | 110035 | if( db->mallocFailed==0 |
| 109724 | 110036 | && pParse->nErr==0 |
| 109725 | 110037 | && pTable->nCol==pSel->pEList->nExpr |
| 109726 | 110038 | ){ |
| 109727 | | - sqlite3SelectAddColumnTypeAndCollation(pParse, pTable, pSel); |
| 110039 | + sqlite3SelectAddColumnTypeAndCollation(pParse, pTable, pSel, |
| 110040 | + SQLITE_AFF_NONE); |
| 109728 | 110041 | } |
| 109729 | 110042 | }else if( pSelTab ){ |
| 109730 | 110043 | /* CREATE VIEW name AS... without an argument list. Construct |
| 109731 | 110044 | ** the column names from the SELECT statement that defines the view. |
| 109732 | 110045 | */ |
| | @@ -110403,10 +110716,31 @@ |
| 110403 | 110716 | p->nKeyCol = nCol - 1; |
| 110404 | 110717 | *ppExtra = ((char*)p) + nByte; |
| 110405 | 110718 | } |
| 110406 | 110719 | return p; |
| 110407 | 110720 | } |
| 110721 | + |
| 110722 | +/* |
| 110723 | +** If expression list pList contains an expression that was parsed with |
| 110724 | +** an explicit "NULLS FIRST" or "NULLS LAST" clause, leave an error in |
| 110725 | +** pParse and return non-zero. Otherwise, return zero. |
| 110726 | +*/ |
| 110727 | +SQLITE_PRIVATE int sqlite3HasExplicitNulls(Parse *pParse, ExprList *pList){ |
| 110728 | + if( pList ){ |
| 110729 | + int i; |
| 110730 | + for(i=0; i<pList->nExpr; i++){ |
| 110731 | + if( pList->a[i].bNulls ){ |
| 110732 | + u8 sf = pList->a[i].sortFlags; |
| 110733 | + sqlite3ErrorMsg(pParse, "unsupported use of NULLS %s", |
| 110734 | + (sf==0 || sf==3) ? "FIRST" : "LAST" |
| 110735 | + ); |
| 110736 | + return 1; |
| 110737 | + } |
| 110738 | + } |
| 110739 | + } |
| 110740 | + return 0; |
| 110741 | +} |
| 110408 | 110742 | |
| 110409 | 110743 | /* |
| 110410 | 110744 | ** Create a new index for an SQL table. pName1.pName2 is the name of the index |
| 110411 | 110745 | ** and pTblList is the name of the table that is to be indexed. Both will |
| 110412 | 110746 | ** be NULL for a primary key or an index that is created to satisfy a |
| | @@ -110454,10 +110788,13 @@ |
| 110454 | 110788 | if( IN_DECLARE_VTAB && idxType!=SQLITE_IDXTYPE_PRIMARYKEY ){ |
| 110455 | 110789 | goto exit_create_index; |
| 110456 | 110790 | } |
| 110457 | 110791 | if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ |
| 110458 | 110792 | goto exit_create_index; |
| 110793 | + } |
| 110794 | + if( sqlite3HasExplicitNulls(pParse, pList) ){ |
| 110795 | + goto exit_create_index; |
| 110459 | 110796 | } |
| 110460 | 110797 | |
| 110461 | 110798 | /* |
| 110462 | 110799 | ** Find the table that is to be indexed. Return early if not found. |
| 110463 | 110800 | */ |
| | @@ -110553,11 +110890,11 @@ |
| 110553 | 110890 | */ |
| 110554 | 110891 | if( pName ){ |
| 110555 | 110892 | zName = sqlite3NameFromToken(db, pName); |
| 110556 | 110893 | if( zName==0 ) goto exit_create_index; |
| 110557 | 110894 | assert( pName->z!=0 ); |
| 110558 | | - if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ |
| 110895 | + if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName,"index",pTab->zName) ){ |
| 110559 | 110896 | goto exit_create_index; |
| 110560 | 110897 | } |
| 110561 | 110898 | if( !IN_RENAME_OBJECT ){ |
| 110562 | 110899 | if( !db->init.busy ){ |
| 110563 | 110900 | if( sqlite3FindTable(db, zName, 0)!=0 ){ |
| | @@ -110619,11 +110956,11 @@ |
| 110619 | 110956 | sqlite3TokenInit(&prevCol, pCol->zName); |
| 110620 | 110957 | pList = sqlite3ExprListAppend(pParse, 0, |
| 110621 | 110958 | sqlite3ExprAlloc(db, TK_ID, &prevCol, 0)); |
| 110622 | 110959 | if( pList==0 ) goto exit_create_index; |
| 110623 | 110960 | assert( pList->nExpr==1 ); |
| 110624 | | - sqlite3ExprListSetSortOrder(pList, sortOrder); |
| 110961 | + sqlite3ExprListSetSortOrder(pList, sortOrder, SQLITE_SO_UNDEFINED); |
| 110625 | 110962 | }else{ |
| 110626 | 110963 | sqlite3ExprListCheckLength(pParse, pList, "index"); |
| 110627 | 110964 | if( pParse->nErr ) goto exit_create_index; |
| 110628 | 110965 | } |
| 110629 | 110966 | |
| | @@ -110737,11 +111074,11 @@ |
| 110737 | 111074 | if( !zColl ) zColl = sqlite3StrBINARY; |
| 110738 | 111075 | if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl) ){ |
| 110739 | 111076 | goto exit_create_index; |
| 110740 | 111077 | } |
| 110741 | 111078 | pIndex->azColl[i] = zColl; |
| 110742 | | - requestedSortOrder = pListItem->sortOrder & sortOrderMask; |
| 111079 | + requestedSortOrder = pListItem->sortFlags & sortOrderMask; |
| 110743 | 111080 | pIndex->aSortOrder[i] = (u8)requestedSortOrder; |
| 110744 | 111081 | } |
| 110745 | 111082 | |
| 110746 | 111083 | /* Append the table key to the end of the index. For WITHOUT ROWID |
| 110747 | 111084 | ** tables (when pPk!=0) this will be the declared PRIMARY KEY. For |
| | @@ -110912,10 +111249,11 @@ |
| 110912 | 111249 | sqlite3VdbeAddOp3(v, OP_CreateBtree, iDb, iMem, BTREE_BLOBKEY); |
| 110913 | 111250 | |
| 110914 | 111251 | /* Gather the complete text of the CREATE INDEX statement into |
| 110915 | 111252 | ** the zStmt variable |
| 110916 | 111253 | */ |
| 111254 | + assert( pName!=0 || pStart==0 ); |
| 110917 | 111255 | if( pStart ){ |
| 110918 | 111256 | int n = (int)(pParse->sLastToken.z - pName->z) + pParse->sLastToken.n; |
| 110919 | 111257 | if( pName->z[n-1]==';' ) n--; |
| 110920 | 111258 | /* A named index with an explicit CREATE INDEX statement */ |
| 110921 | 111259 | zStmt = sqlite3MPrintf(db, "CREATE%s INDEX %.*s", |
| | @@ -111954,11 +112292,12 @@ |
| 111954 | 112292 | assert( sqlite3KeyInfoIsWriteable(pKey) ); |
| 111955 | 112293 | for(i=0; i<nCol; i++){ |
| 111956 | 112294 | const char *zColl = pIdx->azColl[i]; |
| 111957 | 112295 | pKey->aColl[i] = zColl==sqlite3StrBINARY ? 0 : |
| 111958 | 112296 | sqlite3LocateCollSeq(pParse, zColl); |
| 111959 | | - pKey->aSortOrder[i] = pIdx->aSortOrder[i]; |
| 112297 | + pKey->aSortFlags[i] = pIdx->aSortOrder[i]; |
| 112298 | + assert( 0==(pKey->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) ); |
| 111960 | 112299 | } |
| 111961 | 112300 | if( pParse->nErr ){ |
| 111962 | 112301 | assert( pParse->rc==SQLITE_ERROR_MISSING_COLLSEQ ); |
| 111963 | 112302 | if( pIdx->bNoQuery==0 ){ |
| 111964 | 112303 | /* Deactivate the index because it contains an unknown collating |
| | @@ -115493,13 +115832,10 @@ |
| 115493 | 115832 | }; |
| 115494 | 115833 | #ifndef SQLITE_OMIT_ALTERTABLE |
| 115495 | 115834 | sqlite3AlterFunctions(); |
| 115496 | 115835 | #endif |
| 115497 | 115836 | sqlite3WindowFunctions(); |
| 115498 | | -#if defined(SQLITE_ENABLE_STAT3) || defined(SQLITE_ENABLE_STAT4) |
| 115499 | | - sqlite3AnalyzeFunctions(); |
| 115500 | | -#endif |
| 115501 | 115837 | sqlite3RegisterDateTimeFunctions(); |
| 115502 | 115838 | sqlite3InsertBuiltinFuncs(aBuiltinFunc, ArraySize(aBuiltinFunc)); |
| 115503 | 115839 | |
| 115504 | 115840 | #if 0 /* Enable to print out how the built-in functions are hashed */ |
| 115505 | 115841 | { |
| | @@ -115998,17 +116334,17 @@ |
| 115998 | 116334 | pExpr = sqlite3Expr(db, TK_REGISTER, 0); |
| 115999 | 116335 | if( pExpr ){ |
| 116000 | 116336 | if( iCol>=0 && iCol!=pTab->iPKey ){ |
| 116001 | 116337 | pCol = &pTab->aCol[iCol]; |
| 116002 | 116338 | pExpr->iTable = regBase + iCol + 1; |
| 116003 | | - pExpr->affinity = pCol->affinity; |
| 116339 | + pExpr->affExpr = pCol->affinity; |
| 116004 | 116340 | zColl = pCol->zColl; |
| 116005 | 116341 | if( zColl==0 ) zColl = db->pDfltColl->zName; |
| 116006 | 116342 | pExpr = sqlite3ExprAddCollateString(pParse, pExpr, zColl); |
| 116007 | 116343 | }else{ |
| 116008 | 116344 | pExpr->iTable = regBase; |
| 116009 | | - pExpr->affinity = SQLITE_AFF_INTEGER; |
| 116345 | + pExpr->affExpr = SQLITE_AFF_INTEGER; |
| 116010 | 116346 | } |
| 116011 | 116347 | } |
| 116012 | 116348 | return pExpr; |
| 116013 | 116349 | } |
| 116014 | 116350 | |
| | @@ -116807,11 +117143,11 @@ |
| 116807 | 117143 | |
| 116808 | 117144 | tFrom.z = zFrom; |
| 116809 | 117145 | tFrom.n = nFrom; |
| 116810 | 117146 | pRaise = sqlite3Expr(db, TK_RAISE, "FOREIGN KEY constraint failed"); |
| 116811 | 117147 | if( pRaise ){ |
| 116812 | | - pRaise->affinity = OE_Abort; |
| 117148 | + pRaise->affExpr = OE_Abort; |
| 116813 | 117149 | } |
| 116814 | 117150 | pSelect = sqlite3SelectNew(pParse, |
| 116815 | 117151 | sqlite3ExprListAppend(pParse, 0, pRaise), |
| 116816 | 117152 | sqlite3SrcListAppend(pParse, 0, &tFrom, 0), |
| 116817 | 117153 | pWhere, |
| | @@ -116852,10 +117188,11 @@ |
| 116852 | 117188 | if( db->mallocFailed==1 ){ |
| 116853 | 117189 | fkTriggerDelete(db, pTrigger); |
| 116854 | 117190 | return 0; |
| 116855 | 117191 | } |
| 116856 | 117192 | assert( pStep!=0 ); |
| 117193 | + assert( pTrigger!=0 ); |
| 116857 | 117194 | |
| 116858 | 117195 | switch( action ){ |
| 116859 | 117196 | case OE_Restrict: |
| 116860 | 117197 | pStep->op = TK_SELECT; |
| 116861 | 117198 | break; |
| | @@ -117042,22 +117379,23 @@ |
| 117042 | 117379 | sqlite3OomFault(db); |
| 117043 | 117380 | return 0; |
| 117044 | 117381 | } |
| 117045 | 117382 | for(n=0; n<pIdx->nColumn; n++){ |
| 117046 | 117383 | i16 x = pIdx->aiColumn[n]; |
| 117384 | + char aff; |
| 117047 | 117385 | if( x>=0 ){ |
| 117048 | | - pIdx->zColAff[n] = pTab->aCol[x].affinity; |
| 117386 | + aff = pTab->aCol[x].affinity; |
| 117049 | 117387 | }else if( x==XN_ROWID ){ |
| 117050 | | - pIdx->zColAff[n] = SQLITE_AFF_INTEGER; |
| 117388 | + aff = SQLITE_AFF_INTEGER; |
| 117051 | 117389 | }else{ |
| 117052 | | - char aff; |
| 117053 | 117390 | assert( x==XN_EXPR ); |
| 117054 | 117391 | assert( pIdx->aColExpr!=0 ); |
| 117055 | 117392 | aff = sqlite3ExprAffinity(pIdx->aColExpr->a[n].pExpr); |
| 117056 | | - if( aff==0 ) aff = SQLITE_AFF_BLOB; |
| 117057 | | - pIdx->zColAff[n] = aff; |
| 117058 | 117393 | } |
| 117394 | + if( aff<SQLITE_AFF_BLOB ) aff = SQLITE_AFF_BLOB; |
| 117395 | + if( aff>SQLITE_AFF_NUMERIC) aff = SQLITE_AFF_NUMERIC; |
| 117396 | + pIdx->zColAff[n] = aff; |
| 117059 | 117397 | } |
| 117060 | 117398 | pIdx->zColAff[n] = 0; |
| 117061 | 117399 | } |
| 117062 | 117400 | |
| 117063 | 117401 | return pIdx->zColAff; |
| | @@ -117093,15 +117431,16 @@ |
| 117093 | 117431 | sqlite3OomFault(db); |
| 117094 | 117432 | return; |
| 117095 | 117433 | } |
| 117096 | 117434 | |
| 117097 | 117435 | for(i=0; i<pTab->nCol; i++){ |
| 117436 | + assert( pTab->aCol[i].affinity!=0 ); |
| 117098 | 117437 | zColAff[i] = pTab->aCol[i].affinity; |
| 117099 | 117438 | } |
| 117100 | 117439 | do{ |
| 117101 | 117440 | zColAff[i--] = 0; |
| 117102 | | - }while( i>=0 && zColAff[i]==SQLITE_AFF_BLOB ); |
| 117441 | + }while( i>=0 && zColAff[i]<=SQLITE_AFF_BLOB ); |
| 117103 | 117442 | pTab->zColAff = zColAff; |
| 117104 | 117443 | } |
| 117105 | 117444 | assert( zColAff!=0 ); |
| 117106 | 117445 | i = sqlite3Strlen30NN(zColAff); |
| 117107 | 117446 | if( i ){ |
| | @@ -117785,10 +118124,13 @@ |
| 117785 | 118124 | if( pUpsert ){ |
| 117786 | 118125 | if( IsVirtual(pTab) ){ |
| 117787 | 118126 | sqlite3ErrorMsg(pParse, "UPSERT not implemented for virtual table \"%s\"", |
| 117788 | 118127 | pTab->zName); |
| 117789 | 118128 | goto insert_cleanup; |
| 118129 | + } |
| 118130 | + if( sqlite3HasExplicitNulls(pParse, pUpsert->pUpsertTarget) ){ |
| 118131 | + goto insert_cleanup; |
| 117790 | 118132 | } |
| 117791 | 118133 | pTabList->a[0].iCursor = iDataCur; |
| 117792 | 118134 | pUpsert->pUpsertSrc = pTabList; |
| 117793 | 118135 | pUpsert->regData = regData; |
| 117794 | 118136 | pUpsert->iDataCur = iDataCur; |
| | @@ -119899,10 +120241,12 @@ |
| 119899 | 120241 | /* Version 3.26.0 and later */ |
| 119900 | 120242 | const char *(*normalized_sql)(sqlite3_stmt*); |
| 119901 | 120243 | /* Version 3.28.0 and later */ |
| 119902 | 120244 | int (*stmt_isexplain)(sqlite3_stmt*); |
| 119903 | 120245 | int (*value_frombind)(sqlite3_value*); |
| 120246 | + /* Version 3.30.0 and later */ |
| 120247 | + int (*drop_modules)(sqlite3*,const char**); |
| 119904 | 120248 | }; |
| 119905 | 120249 | |
| 119906 | 120250 | /* |
| 119907 | 120251 | ** This is the function signature used for all extension entry points. It |
| 119908 | 120252 | ** is also defined in the file "loadext.c". |
| | @@ -120191,10 +120535,12 @@ |
| 120191 | 120535 | /* Version 3.26.0 and later */ |
| 120192 | 120536 | #define sqlite3_normalized_sql sqlite3_api->normalized_sql |
| 120193 | 120537 | /* Version 3.28.0 and later */ |
| 120194 | 120538 | #define sqlite3_stmt_isexplain sqlite3_api->isexplain |
| 120195 | 120539 | #define sqlite3_value_frombind sqlite3_api->frombind |
| 120540 | +/* Version 3.30.0 and later */ |
| 120541 | +#define sqlite3_drop_modules sqlite3_api->drop_modules |
| 120196 | 120542 | #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ |
| 120197 | 120543 | |
| 120198 | 120544 | #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) |
| 120199 | 120545 | /* This case when the file really is being compiled as a loadable |
| 120200 | 120546 | ** extension */ |
| | @@ -120656,11 +121002,13 @@ |
| 120656 | 121002 | #else |
| 120657 | 121003 | 0, |
| 120658 | 121004 | #endif |
| 120659 | 121005 | /* Version 3.28.0 and later */ |
| 120660 | 121006 | sqlite3_stmt_isexplain, |
| 120661 | | - sqlite3_value_frombind |
| 121007 | + sqlite3_value_frombind, |
| 121008 | + /* Version 3.30.0 and later */ |
| 121009 | + sqlite3_drop_modules, |
| 120662 | 121010 | }; |
| 120663 | 121011 | |
| 120664 | 121012 | /* |
| 120665 | 121013 | ** Attempt to load an SQLite extension library contained in the file |
| 120666 | 121014 | ** zFile. The entry point is zProc. zProc may be 0 in which case a |
| | @@ -121369,11 +121717,11 @@ |
| 121369 | 121717 | /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, |
| 121370 | 121718 | /* ColNames: */ 0, 0, |
| 121371 | 121719 | /* iArg: */ SQLITE_FullFSync }, |
| 121372 | 121720 | #endif |
| 121373 | 121721 | #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) |
| 121374 | | -#if defined(SQLITE_INTROSPECTION_PRAGMAS) |
| 121722 | +#if !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) |
| 121375 | 121723 | {/* zName: */ "function_list", |
| 121376 | 121724 | /* ePragTyp: */ PragTyp_FUNCTION_LIST, |
| 121377 | 121725 | /* ePragFlg: */ PragFlg_Result0, |
| 121378 | 121726 | /* ColNames: */ 41, 2, |
| 121379 | 121727 | /* iArg: */ 0 }, |
| | @@ -121493,11 +121841,11 @@ |
| 121493 | 121841 | /* ColNames: */ 0, 0, |
| 121494 | 121842 | /* iArg: */ 0 }, |
| 121495 | 121843 | #endif |
| 121496 | 121844 | #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) |
| 121497 | 121845 | #if !defined(SQLITE_OMIT_VIRTUALTABLE) |
| 121498 | | -#if defined(SQLITE_INTROSPECTION_PRAGMAS) |
| 121846 | +#if !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) |
| 121499 | 121847 | {/* zName: */ "module_list", |
| 121500 | 121848 | /* ePragTyp: */ PragTyp_MODULE_LIST, |
| 121501 | 121849 | /* ePragFlg: */ PragFlg_Result0, |
| 121502 | 121850 | /* ColNames: */ 9, 1, |
| 121503 | 121851 | /* iArg: */ 0 }, |
| | @@ -121528,11 +121876,11 @@ |
| 121528 | 121876 | /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, |
| 121529 | 121877 | /* ColNames: */ 0, 0, |
| 121530 | 121878 | /* iArg: */ SQLITE_ParserTrace }, |
| 121531 | 121879 | #endif |
| 121532 | 121880 | #endif |
| 121533 | | -#if defined(SQLITE_INTROSPECTION_PRAGMAS) |
| 121881 | +#if !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) |
| 121534 | 121882 | {/* zName: */ "pragma_list", |
| 121535 | 121883 | /* ePragTyp: */ PragTyp_PRAGMA_LIST, |
| 121536 | 121884 | /* ePragFlg: */ PragFlg_Result0, |
| 121537 | 121885 | /* ColNames: */ 9, 1, |
| 121538 | 121886 | /* iArg: */ 0 }, |
| | @@ -121726,11 +122074,11 @@ |
| 121726 | 122074 | /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, |
| 121727 | 122075 | /* ColNames: */ 0, 0, |
| 121728 | 122076 | /* iArg: */ SQLITE_WriteSchema|SQLITE_NoSchemaError }, |
| 121729 | 122077 | #endif |
| 121730 | 122078 | }; |
| 121731 | | -/* Number of pragmas: 62 on by default, 81 total. */ |
| 122079 | +/* Number of pragmas: 65 on by default, 81 total. */ |
| 121732 | 122080 | |
| 121733 | 122081 | /************** End of pragma.h **********************************************/ |
| 121734 | 122082 | /************** Continuing where we left off in pragma.c *********************/ |
| 121735 | 122083 | |
| 121736 | 122084 | /* |
| | @@ -122858,10 +123206,19 @@ |
| 122858 | 123206 | |
| 122859 | 123207 | case PragTyp_INDEX_INFO: if( zRight ){ |
| 122860 | 123208 | Index *pIdx; |
| 122861 | 123209 | Table *pTab; |
| 122862 | 123210 | pIdx = sqlite3FindIndex(db, zRight, zDb); |
| 123211 | + if( pIdx==0 ){ |
| 123212 | + /* If there is no index named zRight, check to see if there is a |
| 123213 | + ** WITHOUT ROWID table named zRight, and if there is, show the |
| 123214 | + ** structure of the PRIMARY KEY index for that table. */ |
| 123215 | + pTab = sqlite3LocateTable(pParse, LOCATE_NOERR, zRight, zDb); |
| 123216 | + if( pTab && !HasRowid(pTab) ){ |
| 123217 | + pIdx = sqlite3PrimaryKeyIndex(pTab); |
| 123218 | + } |
| 123219 | + } |
| 122863 | 123220 | if( pIdx ){ |
| 122864 | 123221 | int iIdxDb = sqlite3SchemaToIndex(db, pIdx->pSchema); |
| 122865 | 123222 | int i; |
| 122866 | 123223 | int mx; |
| 122867 | 123224 | if( pPragma->iArg ){ |
| | @@ -122937,11 +123294,11 @@ |
| 122937 | 123294 | sqlite3VdbeMultiLoad(v, 1, "is", i++, pColl->zName); |
| 122938 | 123295 | } |
| 122939 | 123296 | } |
| 122940 | 123297 | break; |
| 122941 | 123298 | |
| 122942 | | -#ifdef SQLITE_INTROSPECTION_PRAGMAS |
| 123299 | +#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS |
| 122943 | 123300 | case PragTyp_FUNCTION_LIST: { |
| 122944 | 123301 | int i; |
| 122945 | 123302 | HashElem *j; |
| 122946 | 123303 | FuncDef *p; |
| 122947 | 123304 | pParse->nMem = 2; |
| | @@ -124272,35 +124629,37 @@ |
| 124272 | 124629 | ** database. See sqlite3Init() below for additional information. |
| 124273 | 124630 | ** This routine is also called from the OP_ParseSchema opcode of the VDBE. |
| 124274 | 124631 | ** |
| 124275 | 124632 | ** Each callback contains the following information: |
| 124276 | 124633 | ** |
| 124277 | | -** argv[0] = name of thing being created |
| 124278 | | -** argv[1] = root page number for table or index. 0 for trigger or view. |
| 124279 | | -** argv[2] = SQL text for the CREATE statement. |
| 124634 | +** argv[0] = type of object: "table", "index", "trigger", or "view". |
| 124635 | +** argv[1] = name of thing being created |
| 124636 | +** argv[2] = associated table if an index or trigger |
| 124637 | +** argv[3] = root page number for table or index. 0 for trigger or view. |
| 124638 | +** argv[4] = SQL text for the CREATE statement. |
| 124280 | 124639 | ** |
| 124281 | 124640 | */ |
| 124282 | 124641 | SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ |
| 124283 | 124642 | InitData *pData = (InitData*)pInit; |
| 124284 | 124643 | sqlite3 *db = pData->db; |
| 124285 | 124644 | int iDb = pData->iDb; |
| 124286 | 124645 | |
| 124287 | | - assert( argc==3 ); |
| 124646 | + assert( argc==5 ); |
| 124288 | 124647 | UNUSED_PARAMETER2(NotUsed, argc); |
| 124289 | 124648 | assert( sqlite3_mutex_held(db->mutex) ); |
| 124290 | 124649 | DbClearProperty(db, iDb, DB_Empty); |
| 124291 | 124650 | pData->nInitRow++; |
| 124292 | 124651 | if( db->mallocFailed ){ |
| 124293 | | - corruptSchema(pData, argv[0], 0); |
| 124652 | + corruptSchema(pData, argv[1], 0); |
| 124294 | 124653 | return 1; |
| 124295 | 124654 | } |
| 124296 | 124655 | |
| 124297 | 124656 | assert( iDb>=0 && iDb<db->nDb ); |
| 124298 | 124657 | if( argv==0 ) return 0; /* Might happen if EMPTY_RESULT_CALLBACKS are on */ |
| 124299 | | - if( argv[1]==0 ){ |
| 124300 | | - corruptSchema(pData, argv[0], 0); |
| 124301 | | - }else if( sqlite3_strnicmp(argv[2],"create ",7)==0 ){ |
| 124658 | + if( argv[3]==0 ){ |
| 124659 | + corruptSchema(pData, argv[1], 0); |
| 124660 | + }else if( sqlite3_strnicmp(argv[4],"create ",7)==0 ){ |
| 124302 | 124661 | /* Call the parser to process a CREATE TABLE, INDEX or VIEW. |
| 124303 | 124662 | ** But because db->init.busy is set to 1, no VDBE code is generated |
| 124304 | 124663 | ** or executed. All the parser does is build the internal data |
| 124305 | 124664 | ** structures that describe the table, index, or view. |
| 124306 | 124665 | */ |
| | @@ -124309,47 +124668,48 @@ |
| 124309 | 124668 | sqlite3_stmt *pStmt; |
| 124310 | 124669 | TESTONLY(int rcp); /* Return code from sqlite3_prepare() */ |
| 124311 | 124670 | |
| 124312 | 124671 | assert( db->init.busy ); |
| 124313 | 124672 | db->init.iDb = iDb; |
| 124314 | | - db->init.newTnum = sqlite3Atoi(argv[1]); |
| 124673 | + db->init.newTnum = sqlite3Atoi(argv[3]); |
| 124315 | 124674 | db->init.orphanTrigger = 0; |
| 124316 | | - TESTONLY(rcp = ) sqlite3_prepare(db, argv[2], -1, &pStmt, 0); |
| 124675 | + db->init.azInit = argv; |
| 124676 | + TESTONLY(rcp = ) sqlite3_prepare(db, argv[4], -1, &pStmt, 0); |
| 124317 | 124677 | rc = db->errCode; |
| 124318 | 124678 | assert( (rc&0xFF)==(rcp&0xFF) ); |
| 124319 | 124679 | db->init.iDb = saved_iDb; |
| 124320 | 124680 | /* assert( saved_iDb==0 || (db->mDbFlags & DBFLAG_Vacuum)!=0 ); */ |
| 124321 | 124681 | if( SQLITE_OK!=rc ){ |
| 124322 | 124682 | if( db->init.orphanTrigger ){ |
| 124323 | 124683 | assert( iDb==1 ); |
| 124324 | 124684 | }else{ |
| 124325 | | - pData->rc = rc; |
| 124685 | + if( rc > pData->rc ) pData->rc = rc; |
| 124326 | 124686 | if( rc==SQLITE_NOMEM ){ |
| 124327 | 124687 | sqlite3OomFault(db); |
| 124328 | 124688 | }else if( rc!=SQLITE_INTERRUPT && (rc&0xFF)!=SQLITE_LOCKED ){ |
| 124329 | | - corruptSchema(pData, argv[0], sqlite3_errmsg(db)); |
| 124689 | + corruptSchema(pData, argv[1], sqlite3_errmsg(db)); |
| 124330 | 124690 | } |
| 124331 | 124691 | } |
| 124332 | 124692 | } |
| 124333 | 124693 | sqlite3_finalize(pStmt); |
| 124334 | | - }else if( argv[0]==0 || (argv[2]!=0 && argv[2][0]!=0) ){ |
| 124335 | | - corruptSchema(pData, argv[0], 0); |
| 124694 | + }else if( argv[1]==0 || (argv[4]!=0 && argv[4][0]!=0) ){ |
| 124695 | + corruptSchema(pData, argv[1], 0); |
| 124336 | 124696 | }else{ |
| 124337 | 124697 | /* If the SQL column is blank it means this is an index that |
| 124338 | 124698 | ** was created to be the PRIMARY KEY or to fulfill a UNIQUE |
| 124339 | 124699 | ** constraint for a CREATE TABLE. The index should have already |
| 124340 | 124700 | ** been created when we processed the CREATE TABLE. All we have |
| 124341 | 124701 | ** to do here is record the root page number for that index. |
| 124342 | 124702 | */ |
| 124343 | 124703 | Index *pIndex; |
| 124344 | | - pIndex = sqlite3FindIndex(db, argv[0], db->aDb[iDb].zDbSName); |
| 124704 | + pIndex = sqlite3FindIndex(db, argv[1], db->aDb[iDb].zDbSName); |
| 124345 | 124705 | if( pIndex==0 |
| 124346 | | - || sqlite3GetInt32(argv[1],&pIndex->tnum)==0 |
| 124706 | + || sqlite3GetInt32(argv[3],&pIndex->tnum)==0 |
| 124347 | 124707 | || pIndex->tnum<2 |
| 124348 | 124708 | || sqlite3IndexHasDuplicateRootPage(pIndex) |
| 124349 | 124709 | ){ |
| 124350 | | - corruptSchema(pData, argv[0], pIndex?"invalid rootpage":"orphan index"); |
| 124710 | + corruptSchema(pData, argv[1], pIndex?"invalid rootpage":"orphan index"); |
| 124351 | 124711 | } |
| 124352 | 124712 | } |
| 124353 | 124713 | return 0; |
| 124354 | 124714 | } |
| 124355 | 124715 | |
| | @@ -124366,11 +124726,11 @@ |
| 124366 | 124726 | int i; |
| 124367 | 124727 | #ifndef SQLITE_OMIT_DEPRECATED |
| 124368 | 124728 | int size; |
| 124369 | 124729 | #endif |
| 124370 | 124730 | Db *pDb; |
| 124371 | | - char const *azArg[4]; |
| 124731 | + char const *azArg[6]; |
| 124372 | 124732 | int meta[5]; |
| 124373 | 124733 | InitData initData; |
| 124374 | 124734 | const char *zMasterName; |
| 124375 | 124735 | int openedTransaction = 0; |
| 124376 | 124736 | |
| | @@ -124385,22 +124745,24 @@ |
| 124385 | 124745 | /* Construct the in-memory representation schema tables (sqlite_master or |
| 124386 | 124746 | ** sqlite_temp_master) by invoking the parser directly. The appropriate |
| 124387 | 124747 | ** table name will be inserted automatically by the parser so we can just |
| 124388 | 124748 | ** use the abbreviation "x" here. The parser will also automatically tag |
| 124389 | 124749 | ** the schema table as read-only. */ |
| 124390 | | - azArg[0] = zMasterName = SCHEMA_TABLE(iDb); |
| 124391 | | - azArg[1] = "1"; |
| 124392 | | - azArg[2] = "CREATE TABLE x(type text,name text,tbl_name text," |
| 124750 | + azArg[0] = "table"; |
| 124751 | + azArg[1] = zMasterName = SCHEMA_TABLE(iDb); |
| 124752 | + azArg[2] = azArg[1]; |
| 124753 | + azArg[3] = "1"; |
| 124754 | + azArg[4] = "CREATE TABLE x(type text,name text,tbl_name text," |
| 124393 | 124755 | "rootpage int,sql text)"; |
| 124394 | | - azArg[3] = 0; |
| 124756 | + azArg[5] = 0; |
| 124395 | 124757 | initData.db = db; |
| 124396 | 124758 | initData.iDb = iDb; |
| 124397 | 124759 | initData.rc = SQLITE_OK; |
| 124398 | 124760 | initData.pzErrMsg = pzErrMsg; |
| 124399 | 124761 | initData.mInitFlags = mFlags; |
| 124400 | 124762 | initData.nInitRow = 0; |
| 124401 | | - sqlite3InitCallback(&initData, 3, (char **)azArg, 0); |
| 124763 | + sqlite3InitCallback(&initData, 5, (char **)azArg, 0); |
| 124402 | 124764 | if( initData.rc ){ |
| 124403 | 124765 | rc = initData.rc; |
| 124404 | 124766 | goto error_out; |
| 124405 | 124767 | } |
| 124406 | 124768 | |
| | @@ -124522,11 +124884,11 @@ |
| 124522 | 124884 | */ |
| 124523 | 124885 | assert( db->init.busy ); |
| 124524 | 124886 | { |
| 124525 | 124887 | char *zSql; |
| 124526 | 124888 | zSql = sqlite3MPrintf(db, |
| 124527 | | - "SELECT name, rootpage, sql FROM \"%w\".%s ORDER BY rowid", |
| 124889 | + "SELECT*FROM\"%w\".%s ORDER BY rowid", |
| 124528 | 124890 | db->aDb[iDb].zDbSName, zMasterName); |
| 124529 | 124891 | #ifndef SQLITE_OMIT_AUTHORIZATION |
| 124530 | 124892 | { |
| 124531 | 124893 | sqlite3_xauth xAuth; |
| 124532 | 124894 | xAuth = db->xAuth; |
| | @@ -124843,11 +125205,14 @@ |
| 124843 | 125205 | *pzTail = sParse.zTail; |
| 124844 | 125206 | } |
| 124845 | 125207 | rc = sParse.rc; |
| 124846 | 125208 | |
| 124847 | 125209 | #ifndef SQLITE_OMIT_EXPLAIN |
| 124848 | | - if( rc==SQLITE_OK && sParse.pVdbe && sParse.explain ){ |
| 125210 | + /* Justification for the ALWAYS(): The only way for rc to be SQLITE_OK and |
| 125211 | + ** sParse.pVdbe to be NULL is if the input SQL is an empty string, but in |
| 125212 | + ** that case, sParse.explain will be false. */ |
| 125213 | + if( sParse.explain && rc==SQLITE_OK && ALWAYS(sParse.pVdbe) ){ |
| 124849 | 125214 | static const char * const azColName[] = { |
| 124850 | 125215 | "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment", |
| 124851 | 125216 | "id", "parent", "notused", "detail" |
| 124852 | 125217 | }; |
| 124853 | 125218 | int iFirst, mx; |
| | @@ -124868,12 +125233,12 @@ |
| 124868 | 125233 | #endif |
| 124869 | 125234 | |
| 124870 | 125235 | if( db->init.busy==0 ){ |
| 124871 | 125236 | sqlite3VdbeSetSql(sParse.pVdbe, zSql, (int)(sParse.zTail-zSql), prepFlags); |
| 124872 | 125237 | } |
| 124873 | | - if( sParse.pVdbe && (rc!=SQLITE_OK || db->mallocFailed) ){ |
| 124874 | | - sqlite3VdbeFinalize(sParse.pVdbe); |
| 125238 | + if( rc!=SQLITE_OK || db->mallocFailed ){ |
| 125239 | + if( sParse.pVdbe ) sqlite3VdbeFinalize(sParse.pVdbe); |
| 124875 | 125240 | assert(!(*ppStmt)); |
| 124876 | 125241 | }else{ |
| 124877 | 125242 | *ppStmt = (sqlite3_stmt*)sParse.pVdbe; |
| 124878 | 125243 | } |
| 124879 | 125244 | |
| | @@ -125242,10 +125607,11 @@ |
| 125242 | 125607 | if( OK_IF_ALWAYS_TRUE(p->pWinDefn) ){ |
| 125243 | 125608 | sqlite3WindowListDelete(db, p->pWinDefn); |
| 125244 | 125609 | } |
| 125245 | 125610 | #endif |
| 125246 | 125611 | if( OK_IF_ALWAYS_TRUE(p->pWith) ) sqlite3WithDelete(db, p->pWith); |
| 125612 | + assert( p->pWin==0 ); |
| 125247 | 125613 | if( bFree ) sqlite3DbFreeNN(db, p); |
| 125248 | 125614 | p = pPrior; |
| 125249 | 125615 | bFree = 1; |
| 125250 | 125616 | } |
| 125251 | 125617 | } |
| | @@ -125803,11 +126169,11 @@ |
| 125803 | 126169 | sqlite3VdbeAddOp3(v, OP_Compare, regPrevKey, regBase, pSort->nOBSat); |
| 125804 | 126170 | pOp = sqlite3VdbeGetOp(v, pSort->addrSortIndex); |
| 125805 | 126171 | if( pParse->db->mallocFailed ) return; |
| 125806 | 126172 | pOp->p2 = nKey + nData; |
| 125807 | 126173 | pKI = pOp->p4.pKeyInfo; |
| 125808 | | - memset(pKI->aSortOrder, 0, pKI->nKeyField); /* Makes OP_Jump testable */ |
| 126174 | + memset(pKI->aSortFlags, 0, pKI->nKeyField); /* Makes OP_Jump testable */ |
| 125809 | 126175 | sqlite3VdbeChangeP4(v, -1, (char*)pKI, P4_KEYINFO); |
| 125810 | 126176 | testcase( pKI->nAllField > pKI->nKeyField+2 ); |
| 125811 | 126177 | pOp->p4.pKeyInfo = sqlite3KeyInfoFromExprList(pParse,pSort->pOrderBy,nOBSat, |
| 125812 | 126178 | pKI->nAllField-pKI->nKeyField-1); |
| 125813 | 126179 | addrJmp = sqlite3VdbeCurrentAddr(v); |
| | @@ -126414,11 +126780,11 @@ |
| 126414 | 126780 | */ |
| 126415 | 126781 | SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *db, int N, int X){ |
| 126416 | 126782 | int nExtra = (N+X)*(sizeof(CollSeq*)+1) - sizeof(CollSeq*); |
| 126417 | 126783 | KeyInfo *p = sqlite3DbMallocRawNN(db, sizeof(KeyInfo) + nExtra); |
| 126418 | 126784 | if( p ){ |
| 126419 | | - p->aSortOrder = (u8*)&p->aColl[N+X]; |
| 126785 | + p->aSortFlags = (u8*)&p->aColl[N+X]; |
| 126420 | 126786 | p->nKeyField = (u16)N; |
| 126421 | 126787 | p->nAllField = (u16)(N+X); |
| 126422 | 126788 | p->enc = ENC(db); |
| 126423 | 126789 | p->db = db; |
| 126424 | 126790 | p->nRef = 1; |
| | @@ -126491,11 +126857,11 @@ |
| 126491 | 126857 | pInfo = sqlite3KeyInfoAlloc(db, nExpr-iStart, nExtra+1); |
| 126492 | 126858 | if( pInfo ){ |
| 126493 | 126859 | assert( sqlite3KeyInfoIsWriteable(pInfo) ); |
| 126494 | 126860 | for(i=iStart, pItem=pList->a+iStart; i<nExpr; i++, pItem++){ |
| 126495 | 126861 | pInfo->aColl[i-iStart] = sqlite3ExprNNCollSeq(pParse, pItem->pExpr); |
| 126496 | | - pInfo->aSortOrder[i-iStart] = pItem->sortOrder; |
| 126862 | + pInfo->aSortFlags[i-iStart] = pItem->sortFlags; |
| 126497 | 126863 | } |
| 126498 | 126864 | } |
| 126499 | 126865 | return pInfo; |
| 126500 | 126866 | } |
| 126501 | 126867 | |
| | @@ -126783,12 +127149,10 @@ |
| 126783 | 127149 | char const *zOrigCol = 0; |
| 126784 | 127150 | #endif |
| 126785 | 127151 | |
| 126786 | 127152 | assert( pExpr!=0 ); |
| 126787 | 127153 | assert( pNC->pSrcList!=0 ); |
| 126788 | | - assert( pExpr->op!=TK_AGG_COLUMN ); /* This routine runes before aggregates |
| 126789 | | - ** are processed */ |
| 126790 | 127154 | switch( pExpr->op ){ |
| 126791 | 127155 | case TK_COLUMN: { |
| 126792 | 127156 | /* The expression is a column. Locate the table the column is being |
| 126793 | 127157 | ** extracted from in NameContext.pSrcList. This table may be real |
| 126794 | 127158 | ** database table or a subquery. |
| | @@ -127101,16 +127465,15 @@ |
| 127101 | 127465 | /* Get an appropriate name for the column |
| 127102 | 127466 | */ |
| 127103 | 127467 | if( (zName = pEList->a[i].zName)!=0 ){ |
| 127104 | 127468 | /* If the column contains an "AS <name>" phrase, use <name> as the name */ |
| 127105 | 127469 | }else{ |
| 127106 | | - Expr *pColExpr = sqlite3ExprSkipCollate(pEList->a[i].pExpr); |
| 127470 | + Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pEList->a[i].pExpr); |
| 127107 | 127471 | while( pColExpr->op==TK_DOT ){ |
| 127108 | 127472 | pColExpr = pColExpr->pRight; |
| 127109 | 127473 | assert( pColExpr!=0 ); |
| 127110 | 127474 | } |
| 127111 | | - assert( pColExpr->op!=TK_AGG_COLUMN ); |
| 127112 | 127475 | if( pColExpr->op==TK_COLUMN ){ |
| 127113 | 127476 | /* For columns use the column name name */ |
| 127114 | 127477 | int iCol = pColExpr->iColumn; |
| 127115 | 127478 | Table *pTab = pColExpr->y.pTab; |
| 127116 | 127479 | assert( pTab!=0 ); |
| | @@ -127174,11 +127537,12 @@ |
| 127174 | 127537 | ** statement be resolved. |
| 127175 | 127538 | */ |
| 127176 | 127539 | SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation( |
| 127177 | 127540 | Parse *pParse, /* Parsing contexts */ |
| 127178 | 127541 | Table *pTab, /* Add column type information to this table */ |
| 127179 | | - Select *pSelect /* SELECT used to determine types and collations */ |
| 127542 | + Select *pSelect, /* SELECT used to determine types and collations */ |
| 127543 | + char aff /* Default affinity for columns */ |
| 127180 | 127544 | ){ |
| 127181 | 127545 | sqlite3 *db = pParse->db; |
| 127182 | 127546 | NameContext sNC; |
| 127183 | 127547 | Column *pCol; |
| 127184 | 127548 | CollSeq *pColl; |
| | @@ -127207,11 +127571,11 @@ |
| 127207 | 127571 | if( pCol->zName ){ |
| 127208 | 127572 | memcpy(&pCol->zName[n+1], zType, m+1); |
| 127209 | 127573 | pCol->colFlags |= COLFLAG_HASTYPE; |
| 127210 | 127574 | } |
| 127211 | 127575 | } |
| 127212 | | - if( pCol->affinity==0 ) pCol->affinity = SQLITE_AFF_BLOB; |
| 127576 | + if( pCol->affinity<=SQLITE_AFF_NONE ) pCol->affinity = aff; |
| 127213 | 127577 | pColl = sqlite3ExprCollSeq(pParse, p); |
| 127214 | 127578 | if( pColl && pCol->zColl==0 ){ |
| 127215 | 127579 | pCol->zColl = sqlite3DbStrDup(db, pColl->zName); |
| 127216 | 127580 | } |
| 127217 | 127581 | } |
| | @@ -127220,11 +127584,11 @@ |
| 127220 | 127584 | |
| 127221 | 127585 | /* |
| 127222 | 127586 | ** Given a SELECT statement, generate a Table structure that describes |
| 127223 | 127587 | ** the result set of that SELECT. |
| 127224 | 127588 | */ |
| 127225 | | -SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){ |
| 127589 | +SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect, char aff){ |
| 127226 | 127590 | Table *pTab; |
| 127227 | 127591 | sqlite3 *db = pParse->db; |
| 127228 | 127592 | u64 savedFlags; |
| 127229 | 127593 | |
| 127230 | 127594 | savedFlags = db->flags; |
| | @@ -127240,11 +127604,11 @@ |
| 127240 | 127604 | } |
| 127241 | 127605 | pTab->nTabRef = 1; |
| 127242 | 127606 | pTab->zName = 0; |
| 127243 | 127607 | pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); |
| 127244 | 127608 | sqlite3ColumnsFromExprList(pParse, pSelect->pEList, &pTab->nCol, &pTab->aCol); |
| 127245 | | - sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSelect); |
| 127609 | + sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSelect, aff); |
| 127246 | 127610 | pTab->iPKey = -1; |
| 127247 | 127611 | if( db->mallocFailed ){ |
| 127248 | 127612 | sqlite3DeleteTable(db, pTab); |
| 127249 | 127613 | return 0; |
| 127250 | 127614 | } |
| | @@ -127394,11 +127758,11 @@ |
| 127394 | 127758 | pOrderBy->a[i].pExpr = |
| 127395 | 127759 | sqlite3ExprAddCollateString(pParse, pTerm, pColl->zName); |
| 127396 | 127760 | } |
| 127397 | 127761 | assert( sqlite3KeyInfoIsWriteable(pRet) ); |
| 127398 | 127762 | pRet->aColl[i] = pColl; |
| 127399 | | - pRet->aSortOrder[i] = pOrderBy->a[i].sortOrder; |
| 127763 | + pRet->aSortFlags[i] = pOrderBy->a[i].sortFlags; |
| 127400 | 127764 | } |
| 127401 | 127765 | } |
| 127402 | 127766 | |
| 127403 | 127767 | return pRet; |
| 127404 | 127768 | } |
| | @@ -128105,15 +128469,18 @@ |
| 128105 | 128469 | break; |
| 128106 | 128470 | } |
| 128107 | 128471 | |
| 128108 | 128472 | /* If this is a scalar select that is part of an expression, then |
| 128109 | 128473 | ** store the results in the appropriate memory cell and break out |
| 128110 | | - ** of the scan loop. |
| 128474 | + ** of the scan loop. Note that the select might return multiple columns |
| 128475 | + ** if it is the RHS of a row-value IN operator. |
| 128111 | 128476 | */ |
| 128112 | 128477 | case SRT_Mem: { |
| 128113 | | - assert( pIn->nSdst==1 || pParse->nErr>0 ); testcase( pIn->nSdst!=1 ); |
| 128114 | | - sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSDParm, 1); |
| 128478 | + if( pParse->nErr==0 ){ |
| 128479 | + testcase( pIn->nSdst>1 ); |
| 128480 | + sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSDParm, pIn->nSdst); |
| 128481 | + } |
| 128115 | 128482 | /* The LIMIT clause will jump out of the loop for us */ |
| 128116 | 128483 | break; |
| 128117 | 128484 | } |
| 128118 | 128485 | #endif /* #ifndef SQLITE_OMIT_SUBQUERY */ |
| 128119 | 128486 | |
| | @@ -128366,11 +128733,11 @@ |
| 128366 | 128733 | pKeyDup = sqlite3KeyInfoAlloc(db, nExpr, 1); |
| 128367 | 128734 | if( pKeyDup ){ |
| 128368 | 128735 | assert( sqlite3KeyInfoIsWriteable(pKeyDup) ); |
| 128369 | 128736 | for(i=0; i<nExpr; i++){ |
| 128370 | 128737 | pKeyDup->aColl[i] = multiSelectCollSeq(pParse, p, i); |
| 128371 | | - pKeyDup->aSortOrder[i] = 0; |
| 128738 | + pKeyDup->aSortFlags[i] = 0; |
| 128372 | 128739 | } |
| 128373 | 128740 | } |
| 128374 | 128741 | } |
| 128375 | 128742 | |
| 128376 | 128743 | /* Separate the left and the right query from one another |
| | @@ -129089,10 +129456,11 @@ |
| 129089 | 129456 | ** elements we are now copying in. |
| 129090 | 129457 | */ |
| 129091 | 129458 | for(pParent=p; pParent; pParent=pParent->pPrior, pSub=pSub->pPrior){ |
| 129092 | 129459 | int nSubSrc; |
| 129093 | 129460 | u8 jointype = 0; |
| 129461 | + assert( pSub!=0 ); |
| 129094 | 129462 | pSubSrc = pSub->pSrc; /* FROM clause of subquery */ |
| 129095 | 129463 | nSubSrc = pSubSrc->nSrc; /* Number of terms in subquery FROM clause */ |
| 129096 | 129464 | pSrc = pParent->pSrc; /* FROM clause of the outer query */ |
| 129097 | 129465 | |
| 129098 | 129466 | if( pSrc ){ |
| | @@ -129539,28 +129907,31 @@ |
| 129539 | 129907 | static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){ |
| 129540 | 129908 | int eRet = WHERE_ORDERBY_NORMAL; /* Return value */ |
| 129541 | 129909 | ExprList *pEList = pFunc->x.pList; /* Arguments to agg function */ |
| 129542 | 129910 | const char *zFunc; /* Name of aggregate function pFunc */ |
| 129543 | 129911 | ExprList *pOrderBy; |
| 129544 | | - u8 sortOrder; |
| 129912 | + u8 sortFlags; |
| 129545 | 129913 | |
| 129546 | 129914 | assert( *ppMinMax==0 ); |
| 129547 | 129915 | assert( pFunc->op==TK_AGG_FUNCTION ); |
| 129548 | | - if( pEList==0 || pEList->nExpr!=1 ) return eRet; |
| 129916 | + assert( !IsWindowFunc(pFunc) ); |
| 129917 | + if( pEList==0 || pEList->nExpr!=1 || ExprHasProperty(pFunc, EP_WinFunc) ){ |
| 129918 | + return eRet; |
| 129919 | + } |
| 129549 | 129920 | zFunc = pFunc->u.zToken; |
| 129550 | 129921 | if( sqlite3StrICmp(zFunc, "min")==0 ){ |
| 129551 | 129922 | eRet = WHERE_ORDERBY_MIN; |
| 129552 | | - sortOrder = SQLITE_SO_ASC; |
| 129923 | + sortFlags = KEYINFO_ORDER_BIGNULL; |
| 129553 | 129924 | }else if( sqlite3StrICmp(zFunc, "max")==0 ){ |
| 129554 | 129925 | eRet = WHERE_ORDERBY_MAX; |
| 129555 | | - sortOrder = SQLITE_SO_DESC; |
| 129926 | + sortFlags = KEYINFO_ORDER_DESC; |
| 129556 | 129927 | }else{ |
| 129557 | 129928 | return eRet; |
| 129558 | 129929 | } |
| 129559 | 129930 | *ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0); |
| 129560 | 129931 | assert( pOrderBy!=0 || db->mallocFailed ); |
| 129561 | | - if( pOrderBy ) pOrderBy->a[0].sortOrder = sortOrder; |
| 129932 | + if( pOrderBy ) pOrderBy->a[0].sortFlags = sortFlags; |
| 129562 | 129933 | return eRet; |
| 129563 | 129934 | } |
| 129564 | 129935 | |
| 129565 | 129936 | /* |
| 129566 | 129937 | ** The select statement passed as the first argument is an aggregate query. |
| | @@ -129590,11 +129961,11 @@ |
| 129590 | 129961 | |
| 129591 | 129962 | if( IsVirtual(pTab) ) return 0; |
| 129592 | 129963 | if( pExpr->op!=TK_AGG_FUNCTION ) return 0; |
| 129593 | 129964 | if( NEVER(pAggInfo->nFunc==0) ) return 0; |
| 129594 | 129965 | if( (pAggInfo->aFunc[0].pFunc->funcFlags&SQLITE_FUNC_COUNT)==0 ) return 0; |
| 129595 | | - if( pExpr->flags&EP_Distinct ) return 0; |
| 129966 | + if( ExprHasProperty(pExpr, EP_Distinct|EP_WinFunc) ) return 0; |
| 129596 | 129967 | |
| 129597 | 129968 | return pTab; |
| 129598 | 129969 | } |
| 129599 | 129970 | |
| 129600 | 129971 | /* |
| | @@ -130037,10 +130408,14 @@ |
| 130037 | 130408 | if( IsVirtual(pTab) || pTab->pSelect ){ |
| 130038 | 130409 | i16 nCol; |
| 130039 | 130410 | u8 eCodeOrig = pWalker->eCode; |
| 130040 | 130411 | if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort; |
| 130041 | 130412 | assert( pFrom->pSelect==0 ); |
| 130413 | + if( pTab->pSelect && (db->flags & SQLITE_EnableView)==0 ){ |
| 130414 | + sqlite3ErrorMsg(pParse, "access to view \"%s\" prohibited", |
| 130415 | + pTab->zName); |
| 130416 | + } |
| 130042 | 130417 | pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0); |
| 130043 | 130418 | nCol = pTab->nCol; |
| 130044 | 130419 | pTab->nCol = -1; |
| 130045 | 130420 | pWalker->eCode = 1; /* Turn on Select.selId renumbering */ |
| 130046 | 130421 | sqlite3WalkSelect(pWalker, pFrom->pSelect); |
| | @@ -130330,11 +130705,12 @@ |
| 130330 | 130705 | if( (pTab->tabFlags & TF_Ephemeral)!=0 ){ |
| 130331 | 130706 | /* A sub-query in the FROM clause of a SELECT */ |
| 130332 | 130707 | Select *pSel = pFrom->pSelect; |
| 130333 | 130708 | if( pSel ){ |
| 130334 | 130709 | while( pSel->pPrior ) pSel = pSel->pPrior; |
| 130335 | | - sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSel); |
| 130710 | + sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSel, |
| 130711 | + SQLITE_AFF_NONE); |
| 130336 | 130712 | } |
| 130337 | 130713 | } |
| 130338 | 130714 | } |
| 130339 | 130715 | } |
| 130340 | 130716 | #endif |
| | @@ -130470,20 +130846,28 @@ |
| 130470 | 130846 | int nArg; |
| 130471 | 130847 | int addrNext = 0; |
| 130472 | 130848 | int regAgg; |
| 130473 | 130849 | ExprList *pList = pF->pExpr->x.pList; |
| 130474 | 130850 | assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) ); |
| 130851 | + assert( !IsWindowFunc(pF->pExpr) ); |
| 130852 | + if( ExprHasProperty(pF->pExpr, EP_WinFunc) ){ |
| 130853 | + Expr *pFilter = pF->pExpr->y.pWin->pFilter; |
| 130854 | + addrNext = sqlite3VdbeMakeLabel(pParse); |
| 130855 | + sqlite3ExprIfFalse(pParse, pFilter, addrNext, SQLITE_JUMPIFNULL); |
| 130856 | + } |
| 130475 | 130857 | if( pList ){ |
| 130476 | 130858 | nArg = pList->nExpr; |
| 130477 | 130859 | regAgg = sqlite3GetTempRange(pParse, nArg); |
| 130478 | 130860 | sqlite3ExprCodeExprList(pParse, pList, regAgg, 0, SQLITE_ECEL_DUP); |
| 130479 | 130861 | }else{ |
| 130480 | 130862 | nArg = 0; |
| 130481 | 130863 | regAgg = 0; |
| 130482 | 130864 | } |
| 130483 | 130865 | if( pF->iDistinct>=0 ){ |
| 130484 | | - addrNext = sqlite3VdbeMakeLabel(pParse); |
| 130866 | + if( addrNext==0 ){ |
| 130867 | + addrNext = sqlite3VdbeMakeLabel(pParse); |
| 130868 | + } |
| 130485 | 130869 | testcase( nArg==0 ); /* Error condition */ |
| 130486 | 130870 | testcase( nArg>1 ); /* Also an error */ |
| 130487 | 130871 | codeDistinct(pParse, pF->iDistinct, addrNext, 1, regAgg); |
| 130488 | 130872 | } |
| 130489 | 130873 | if( pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ |
| | @@ -130982,11 +131366,11 @@ |
| 130982 | 131366 | ** "" column. The original design was for the fake column name to be a NULL, |
| 130983 | 131367 | ** which would be unambiguous. But legacy authorization callbacks might |
| 130984 | 131368 | ** assume the column name is non-NULL and segfault. The use of an empty |
| 130985 | 131369 | ** string for the fake column name seems safer. |
| 130986 | 131370 | */ |
| 130987 | | - if( pItem->colUsed==0 ){ |
| 131371 | + if( pItem->colUsed==0 && pItem->zName!=0 ){ |
| 130988 | 131372 | sqlite3AuthCheck(pParse, SQLITE_READ, pItem->zName, "", pItem->zDatabase); |
| 130989 | 131373 | } |
| 130990 | 131374 | |
| 130991 | 131375 | #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) |
| 130992 | 131376 | /* Generate code for all sub-queries in the FROM clause |
| | @@ -130996,12 +131380,19 @@ |
| 130996 | 131380 | |
| 130997 | 131381 | /* The code for a subquery should only be generated once, though it is |
| 130998 | 131382 | ** technically harmless for it to be generated multiple times. The |
| 130999 | 131383 | ** following assert() will detect if something changes to cause |
| 131000 | 131384 | ** the same subquery to be coded multiple times, as a signal to the |
| 131001 | | - ** developers to try to optimize the situation. */ |
| 131002 | | - assert( pItem->addrFillSub==0 ); |
| 131385 | + ** developers to try to optimize the situation. |
| 131386 | + ** |
| 131387 | + ** Update 2019-07-24: |
| 131388 | + ** See ticket https://sqlite.org/src/tktview/c52b09c7f38903b1311cec40. |
| 131389 | + ** The dbsqlfuzz fuzzer found a case where the same subquery gets |
| 131390 | + ** coded twice. So this assert() now becomes a testcase(). It should |
| 131391 | + ** be very rare, though. |
| 131392 | + */ |
| 131393 | + testcase( pItem->addrFillSub!=0 ); |
| 131003 | 131394 | |
| 131004 | 131395 | /* Increment Parse.nHeight by the height of the largest expression |
| 131005 | 131396 | ** tree referred to by this, the parent select. The child select |
| 131006 | 131397 | ** may contain expression trees of at most |
| 131007 | 131398 | ** (SQLITE_MAX_EXPR_DEPTH-Parse.nHeight) height. This is a bit |
| | @@ -131071,11 +131462,11 @@ |
| 131071 | 131462 | int topAddr; |
| 131072 | 131463 | int onceAddr = 0; |
| 131073 | 131464 | int retAddr; |
| 131074 | 131465 | struct SrcList_item *pPrior; |
| 131075 | 131466 | |
| 131076 | | - assert( pItem->addrFillSub==0 ); |
| 131467 | + testcase( pItem->addrFillSub==0 ); /* Ticket c52b09c7f38903b1311 */ |
| 131077 | 131468 | pItem->regReturn = ++pParse->nMem; |
| 131078 | 131469 | topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn); |
| 131079 | 131470 | pItem->addrFillSub = topAddr+1; |
| 131080 | 131471 | if( pItem->fg.isCorrelated==0 ){ |
| 131081 | 131472 | /* If the subquery is not correlated and if we are not inside of |
| | @@ -131362,13 +131753,20 @@ |
| 131362 | 131753 | minMaxFlag = minMaxQuery(db, sAggInfo.aFunc[0].pExpr, &pMinMaxOrderBy); |
| 131363 | 131754 | }else{ |
| 131364 | 131755 | minMaxFlag = WHERE_ORDERBY_NORMAL; |
| 131365 | 131756 | } |
| 131366 | 131757 | for(i=0; i<sAggInfo.nFunc; i++){ |
| 131367 | | - assert( !ExprHasProperty(sAggInfo.aFunc[i].pExpr, EP_xIsSelect) ); |
| 131758 | + Expr *pExpr = sAggInfo.aFunc[i].pExpr; |
| 131759 | + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); |
| 131368 | 131760 | sNC.ncFlags |= NC_InAggFunc; |
| 131369 | | - sqlite3ExprAnalyzeAggList(&sNC, sAggInfo.aFunc[i].pExpr->x.pList); |
| 131761 | + sqlite3ExprAnalyzeAggList(&sNC, pExpr->x.pList); |
| 131762 | +#ifndef SQLITE_OMIT_WINDOWFUNC |
| 131763 | + assert( !IsWindowFunc(pExpr) ); |
| 131764 | + if( ExprHasProperty(pExpr, EP_WinFunc) ){ |
| 131765 | + sqlite3ExprAnalyzeAggregates(&sNC, pExpr->y.pWin->pFilter); |
| 131766 | + } |
| 131767 | +#endif |
| 131370 | 131768 | sNC.ncFlags &= ~NC_InAggFunc; |
| 131371 | 131769 | } |
| 131372 | 131770 | sAggInfo.mxReg = pParse->nMem; |
| 131373 | 131771 | if( db->mallocFailed ) goto select_end; |
| 131374 | 131772 | #if SELECTTRACE_ENABLED |
| | @@ -132153,11 +132551,15 @@ |
| 132153 | 132551 | } |
| 132154 | 132552 | |
| 132155 | 132553 | /* Check that the trigger name is not reserved and that no trigger of the |
| 132156 | 132554 | ** specified name exists */ |
| 132157 | 132555 | zName = sqlite3NameFromToken(db, pName); |
| 132158 | | - if( !zName || SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ |
| 132556 | + if( zName==0 ){ |
| 132557 | + assert( db->mallocFailed ); |
| 132558 | + goto trigger_cleanup; |
| 132559 | + } |
| 132560 | + if( sqlite3CheckObjectName(pParse, zName, "trigger", pTab->zName) ){ |
| 132159 | 132561 | goto trigger_cleanup; |
| 132160 | 132562 | } |
| 132161 | 132563 | assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); |
| 132162 | 132564 | if( !IN_RENAME_OBJECT ){ |
| 132163 | 132565 | if( sqlite3HashFind(&(db->aDb[iDb].pSchema->trigHash),zName) ){ |
| | @@ -132316,10 +132718,11 @@ |
| 132316 | 132718 | |
| 132317 | 132719 | if( db->init.busy ){ |
| 132318 | 132720 | Trigger *pLink = pTrig; |
| 132319 | 132721 | Hash *pHash = &db->aDb[iDb].pSchema->trigHash; |
| 132320 | 132722 | assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); |
| 132723 | + assert( pLink!=0 ); |
| 132321 | 132724 | pTrig = sqlite3HashInsert(pHash, zName, pTrig); |
| 132322 | 132725 | if( pTrig ){ |
| 132323 | 132726 | sqlite3OomFault(db); |
| 132324 | 132727 | }else if( pLink->pSchema==pLink->pTabSchema ){ |
| 132325 | 132728 | Table *pTab; |
| | @@ -132434,10 +132837,13 @@ |
| 132434 | 132837 | pTriggerStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); |
| 132435 | 132838 | } |
| 132436 | 132839 | pTriggerStep->pIdList = pColumn; |
| 132437 | 132840 | pTriggerStep->pUpsert = pUpsert; |
| 132438 | 132841 | pTriggerStep->orconf = orconf; |
| 132842 | + if( pUpsert ){ |
| 132843 | + sqlite3HasExplicitNulls(pParse, pUpsert->pUpsertTarget); |
| 132844 | + } |
| 132439 | 132845 | }else{ |
| 132440 | 132846 | testcase( pColumn ); |
| 132441 | 132847 | sqlite3IdListDelete(db, pColumn); |
| 132442 | 132848 | testcase( pUpsert ); |
| 132443 | 132849 | sqlite3UpsertDelete(db, pUpsert); |
| | @@ -132589,14 +132995,13 @@ |
| 132589 | 132995 | int iDb; |
| 132590 | 132996 | |
| 132591 | 132997 | iDb = sqlite3SchemaToIndex(pParse->db, pTrigger->pSchema); |
| 132592 | 132998 | assert( iDb>=0 && iDb<db->nDb ); |
| 132593 | 132999 | pTable = tableOfTrigger(pTrigger); |
| 132594 | | - assert( pTable ); |
| 132595 | | - assert( pTable->pSchema==pTrigger->pSchema || iDb==1 ); |
| 133000 | + assert( (pTable && pTable->pSchema==pTrigger->pSchema) || iDb==1 ); |
| 132596 | 133001 | #ifndef SQLITE_OMIT_AUTHORIZATION |
| 132597 | | - { |
| 133002 | + if( pTable ){ |
| 132598 | 133003 | int code = SQLITE_DROP_TRIGGER; |
| 132599 | 133004 | const char *zDb = db->aDb[iDb].zDbSName; |
| 132600 | 133005 | const char *zTab = SCHEMA_TABLE(iDb); |
| 132601 | 133006 | if( iDb==1 ) code = SQLITE_DROP_TEMP_TRIGGER; |
| 132602 | 133007 | if( sqlite3AuthCheck(pParse, code, pTrigger->zName, pTable->zName, zDb) || |
| | @@ -132606,11 +133011,10 @@ |
| 132606 | 133011 | } |
| 132607 | 133012 | #endif |
| 132608 | 133013 | |
| 132609 | 133014 | /* Generate code to destroy the database record of the trigger. |
| 132610 | 133015 | */ |
| 132611 | | - assert( pTable!=0 ); |
| 132612 | 133016 | if( (v = sqlite3GetVdbe(pParse))!=0 ){ |
| 132613 | 133017 | sqlite3NestedParse(pParse, |
| 132614 | 133018 | "DELETE FROM %Q.%s WHERE name=%Q AND type='trigger'", |
| 132615 | 133019 | db->aDb[iDb].zDbSName, MASTER_NAME, pTrigger->zName |
| 132616 | 133020 | ); |
| | @@ -132630,13 +133034,15 @@ |
| 132630 | 133034 | pHash = &(db->aDb[iDb].pSchema->trigHash); |
| 132631 | 133035 | pTrigger = sqlite3HashInsert(pHash, zName, 0); |
| 132632 | 133036 | if( ALWAYS(pTrigger) ){ |
| 132633 | 133037 | if( pTrigger->pSchema==pTrigger->pTabSchema ){ |
| 132634 | 133038 | Table *pTab = tableOfTrigger(pTrigger); |
| 132635 | | - Trigger **pp; |
| 132636 | | - for(pp=&pTab->pTrigger; *pp!=pTrigger; pp=&((*pp)->pNext)); |
| 132637 | | - *pp = (*pp)->pNext; |
| 133039 | + if( pTab ){ |
| 133040 | + Trigger **pp; |
| 133041 | + for(pp=&pTab->pTrigger; *pp!=pTrigger; pp=&((*pp)->pNext)); |
| 133042 | + *pp = (*pp)->pNext; |
| 133043 | + } |
| 132638 | 133044 | } |
| 132639 | 133045 | sqlite3DeleteTrigger(db, pTrigger); |
| 132640 | 133046 | db->mDbFlags |= DBFLAG_SchemaChange; |
| 132641 | 133047 | } |
| 132642 | 133048 | } |
| | @@ -133880,32 +134286,34 @@ |
| 133880 | 134286 | } |
| 133881 | 134287 | } |
| 133882 | 134288 | } |
| 133883 | 134289 | |
| 133884 | 134290 | if( !isView ){ |
| 133885 | | - int addr1 = 0; /* Address of jump instruction */ |
| 133886 | | - |
| 133887 | 134291 | /* Do constraint checks. */ |
| 133888 | 134292 | assert( regOldRowid>0 ); |
| 133889 | 134293 | sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur, |
| 133890 | 134294 | regNewRowid, regOldRowid, chngKey, onError, labelContinue, &bReplace, |
| 133891 | 134295 | aXRef, 0); |
| 134296 | + |
| 134297 | + /* If REPLACE conflict handling may have been used, or if the PK of the |
| 134298 | + ** row is changing, then the GenerateConstraintChecks() above may have |
| 134299 | + ** moved cursor iDataCur. Reseek it. */ |
| 134300 | + if( bReplace || chngKey ){ |
| 134301 | + if( pPk ){ |
| 134302 | + sqlite3VdbeAddOp4Int(v, OP_NotFound,iDataCur,labelContinue,regKey,nKey); |
| 134303 | + }else{ |
| 134304 | + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue,regOldRowid); |
| 134305 | + } |
| 134306 | + VdbeCoverageNeverTaken(v); |
| 134307 | + } |
| 133892 | 134308 | |
| 133893 | 134309 | /* Do FK constraint checks. */ |
| 133894 | 134310 | if( hasFK ){ |
| 133895 | 134311 | sqlite3FkCheck(pParse, pTab, regOldRowid, 0, aXRef, chngKey); |
| 133896 | 134312 | } |
| 133897 | 134313 | |
| 133898 | 134314 | /* Delete the index entries associated with the current record. */ |
| 133899 | | - if( bReplace || chngKey ){ |
| 133900 | | - if( pPk ){ |
| 133901 | | - addr1 = sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, 0, regKey, nKey); |
| 133902 | | - }else{ |
| 133903 | | - addr1 = sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, 0, regOldRowid); |
| 133904 | | - } |
| 133905 | | - VdbeCoverageNeverTaken(v); |
| 133906 | | - } |
| 133907 | 134315 | sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, aRegIdx, -1); |
| 133908 | 134316 | |
| 133909 | 134317 | /* If changing the rowid value, or if there are foreign key constraints |
| 133910 | 134318 | ** to process, delete the old record. Otherwise, add a noop OP_Delete |
| 133911 | 134319 | ** to invoke the pre-update hook. |
| | @@ -133931,13 +134339,10 @@ |
| 133931 | 134339 | #else |
| 133932 | 134340 | if( hasFK>1 || chngKey ){ |
| 133933 | 134341 | sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, 0); |
| 133934 | 134342 | } |
| 133935 | 134343 | #endif |
| 133936 | | - if( bReplace || chngKey ){ |
| 133937 | | - sqlite3VdbeJumpHere(v, addr1); |
| 133938 | | - } |
| 133939 | 134344 | |
| 133940 | 134345 | if( hasFK ){ |
| 133941 | 134346 | sqlite3FkCheck(pParse, pTab, 0, regNewRowid, aXRef, chngKey); |
| 133942 | 134347 | } |
| 133943 | 134348 | |
| | @@ -134372,10 +134777,11 @@ |
| 134372 | 134777 | ){ |
| 134373 | 134778 | Vdbe *v = pParse->pVdbe; |
| 134374 | 134779 | sqlite3 *db = pParse->db; |
| 134375 | 134780 | SrcList *pSrc; /* FROM clause for the UPDATE */ |
| 134376 | 134781 | int iDataCur; |
| 134782 | + int i; |
| 134377 | 134783 | |
| 134378 | 134784 | assert( v!=0 ); |
| 134379 | 134785 | assert( pUpsert!=0 ); |
| 134380 | 134786 | VdbeNoopComment((v, "Begin DO UPDATE of UPSERT")); |
| 134381 | 134787 | iDataCur = pUpsert->iDataCur; |
| | @@ -134388,11 +134794,10 @@ |
| 134388 | 134794 | sqlite3ReleaseTempReg(pParse, regRowid); |
| 134389 | 134795 | }else{ |
| 134390 | 134796 | Index *pPk = sqlite3PrimaryKeyIndex(pTab); |
| 134391 | 134797 | int nPk = pPk->nKeyCol; |
| 134392 | 134798 | int iPk = pParse->nMem+1; |
| 134393 | | - int i; |
| 134394 | 134799 | pParse->nMem += nPk; |
| 134395 | 134800 | for(i=0; i<nPk; i++){ |
| 134396 | 134801 | int k; |
| 134397 | 134802 | assert( pPk->aiColumn[i]>=0 ); |
| 134398 | 134803 | k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]); |
| | @@ -134409,10 +134814,16 @@ |
| 134409 | 134814 | } |
| 134410 | 134815 | } |
| 134411 | 134816 | /* pUpsert does not own pUpsertSrc - the outer INSERT statement does. So |
| 134412 | 134817 | ** we have to make a copy before passing it down into sqlite3Update() */ |
| 134413 | 134818 | pSrc = sqlite3SrcListDup(db, pUpsert->pUpsertSrc, 0); |
| 134819 | + /* excluded.* columns of type REAL need to be converted to a hard real */ |
| 134820 | + for(i=0; i<pTab->nCol; i++){ |
| 134821 | + if( pTab->aCol[i].affinity==SQLITE_AFF_REAL ){ |
| 134822 | + sqlite3VdbeAddOp1(v, OP_RealAffinity, pUpsert->regData+i); |
| 134823 | + } |
| 134824 | + } |
| 134414 | 134825 | sqlite3Update(pParse, pSrc, pUpsert->pUpsertSet, |
| 134415 | 134826 | pUpsert->pUpsertWhere, OE_Abort, 0, 0, pUpsert); |
| 134416 | 134827 | pUpsert->pUpsertSet = 0; /* Will have been deleted by sqlite3Update() */ |
| 134417 | 134828 | pUpsert->pUpsertWhere = 0; /* Will have been deleted by sqlite3Update() */ |
| 134418 | 134829 | VdbeNoopComment((v, "End DO UPDATE of UPSERT")); |
| | @@ -134872,38 +135283,52 @@ |
| 134872 | 135283 | |
| 134873 | 135284 | /* |
| 134874 | 135285 | ** Construct and install a Module object for a virtual table. When this |
| 134875 | 135286 | ** routine is called, it is guaranteed that all appropriate locks are held |
| 134876 | 135287 | ** and the module is not already part of the connection. |
| 135288 | +** |
| 135289 | +** If there already exists a module with zName, replace it with the new one. |
| 135290 | +** If pModule==0, then delete the module zName if it exists. |
| 134877 | 135291 | */ |
| 134878 | 135292 | SQLITE_PRIVATE Module *sqlite3VtabCreateModule( |
| 134879 | 135293 | sqlite3 *db, /* Database in which module is registered */ |
| 134880 | 135294 | const char *zName, /* Name assigned to this module */ |
| 134881 | 135295 | const sqlite3_module *pModule, /* The definition of the module */ |
| 134882 | 135296 | void *pAux, /* Context pointer for xCreate/xConnect */ |
| 134883 | 135297 | void (*xDestroy)(void *) /* Module destructor function */ |
| 134884 | 135298 | ){ |
| 134885 | 135299 | Module *pMod; |
| 134886 | | - int nName = sqlite3Strlen30(zName); |
| 134887 | | - pMod = (Module *)sqlite3Malloc(sizeof(Module) + nName + 1); |
| 134888 | | - if( pMod==0 ){ |
| 134889 | | - sqlite3OomFault(db); |
| 135300 | + Module *pDel; |
| 135301 | + char *zCopy; |
| 135302 | + if( pModule==0 ){ |
| 135303 | + zCopy = (char*)zName; |
| 135304 | + pMod = 0; |
| 134890 | 135305 | }else{ |
| 134891 | | - Module *pDel; |
| 134892 | | - char *zCopy = (char *)(&pMod[1]); |
| 135306 | + int nName = sqlite3Strlen30(zName); |
| 135307 | + pMod = (Module *)sqlite3Malloc(sizeof(Module) + nName + 1); |
| 135308 | + if( pMod==0 ){ |
| 135309 | + sqlite3OomFault(db); |
| 135310 | + return 0; |
| 135311 | + } |
| 135312 | + zCopy = (char *)(&pMod[1]); |
| 134893 | 135313 | memcpy(zCopy, zName, nName+1); |
| 134894 | 135314 | pMod->zName = zCopy; |
| 134895 | 135315 | pMod->pModule = pModule; |
| 134896 | 135316 | pMod->pAux = pAux; |
| 134897 | 135317 | pMod->xDestroy = xDestroy; |
| 134898 | 135318 | pMod->pEpoTab = 0; |
| 134899 | | - pDel = (Module *)sqlite3HashInsert(&db->aModule,zCopy,(void*)pMod); |
| 134900 | | - assert( pDel==0 || pDel==pMod ); |
| 134901 | | - if( pDel ){ |
| 135319 | + pMod->nRefModule = 1; |
| 135320 | + } |
| 135321 | + pDel = (Module *)sqlite3HashInsert(&db->aModule,zCopy,(void*)pMod); |
| 135322 | + if( pDel ){ |
| 135323 | + if( pDel==pMod ){ |
| 134902 | 135324 | sqlite3OomFault(db); |
| 134903 | 135325 | sqlite3DbFree(db, pDel); |
| 134904 | 135326 | pMod = 0; |
| 135327 | + }else{ |
| 135328 | + sqlite3VtabEponymousTableClear(db, pDel); |
| 135329 | + sqlite3VtabModuleUnref(db, pDel); |
| 134905 | 135330 | } |
| 134906 | 135331 | } |
| 134907 | 135332 | return pMod; |
| 134908 | 135333 | } |
| 134909 | 135334 | |
| | @@ -134920,15 +135345,11 @@ |
| 134920 | 135345 | void (*xDestroy)(void *) /* Module destructor function */ |
| 134921 | 135346 | ){ |
| 134922 | 135347 | int rc = SQLITE_OK; |
| 134923 | 135348 | |
| 134924 | 135349 | sqlite3_mutex_enter(db->mutex); |
| 134925 | | - if( sqlite3HashFind(&db->aModule, zName) ){ |
| 134926 | | - rc = SQLITE_MISUSE_BKPT; |
| 134927 | | - }else{ |
| 134928 | | - (void)sqlite3VtabCreateModule(db, zName, pModule, pAux, xDestroy); |
| 134929 | | - } |
| 135350 | + (void)sqlite3VtabCreateModule(db, zName, pModule, pAux, xDestroy); |
| 134930 | 135351 | rc = sqlite3ApiExit(db, rc); |
| 134931 | 135352 | if( rc!=SQLITE_OK && xDestroy ) xDestroy(pAux); |
| 134932 | 135353 | sqlite3_mutex_leave(db->mutex); |
| 134933 | 135354 | return rc; |
| 134934 | 135355 | } |
| | @@ -134962,10 +135383,48 @@ |
| 134962 | 135383 | #ifdef SQLITE_ENABLE_API_ARMOR |
| 134963 | 135384 | if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT; |
| 134964 | 135385 | #endif |
| 134965 | 135386 | return createModule(db, zName, pModule, pAux, xDestroy); |
| 134966 | 135387 | } |
| 135388 | + |
| 135389 | +/* |
| 135390 | +** External API to drop all virtual-table modules, except those named |
| 135391 | +** on the azNames list. |
| 135392 | +*/ |
| 135393 | +SQLITE_API int sqlite3_drop_modules(sqlite3 *db, const char** azNames){ |
| 135394 | + HashElem *pThis, *pNext; |
| 135395 | +#ifdef SQLITE_ENABLE_API_ARMOR |
| 135396 | + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; |
| 135397 | +#endif |
| 135398 | + for(pThis=sqliteHashFirst(&db->aModule); pThis; pThis=pNext){ |
| 135399 | + Module *pMod = (Module*)sqliteHashData(pThis); |
| 135400 | + pNext = sqliteHashNext(pThis); |
| 135401 | + if( azNames ){ |
| 135402 | + int ii; |
| 135403 | + for(ii=0; azNames[ii]!=0 && strcmp(azNames[ii],pMod->zName)!=0; ii++){} |
| 135404 | + if( azNames[ii]!=0 ) continue; |
| 135405 | + } |
| 135406 | + createModule(db, pMod->zName, 0, 0, 0); |
| 135407 | + } |
| 135408 | + return SQLITE_OK; |
| 135409 | +} |
| 135410 | + |
| 135411 | +/* |
| 135412 | +** Decrement the reference count on a Module object. Destroy the |
| 135413 | +** module when the reference count reaches zero. |
| 135414 | +*/ |
| 135415 | +SQLITE_PRIVATE void sqlite3VtabModuleUnref(sqlite3 *db, Module *pMod){ |
| 135416 | + assert( pMod->nRefModule>0 ); |
| 135417 | + pMod->nRefModule--; |
| 135418 | + if( pMod->nRefModule==0 ){ |
| 135419 | + if( pMod->xDestroy ){ |
| 135420 | + pMod->xDestroy(pMod->pAux); |
| 135421 | + } |
| 135422 | + assert( pMod->pEpoTab==0 ); |
| 135423 | + sqlite3DbFree(db, pMod); |
| 135424 | + } |
| 135425 | +} |
| 134967 | 135426 | |
| 134968 | 135427 | /* |
| 134969 | 135428 | ** Lock the virtual table so that it cannot be disconnected. |
| 134970 | 135429 | ** Locks nest. Every lock should have a corresponding unlock. |
| 134971 | 135430 | ** If an unlock is omitted, resources leaks will occur. |
| | @@ -135002,10 +135461,11 @@ |
| 135002 | 135461 | assert( db->magic==SQLITE_MAGIC_OPEN || db->magic==SQLITE_MAGIC_ZOMBIE ); |
| 135003 | 135462 | |
| 135004 | 135463 | pVTab->nRef--; |
| 135005 | 135464 | if( pVTab->nRef==0 ){ |
| 135006 | 135465 | sqlite3_vtab *p = pVTab->pVtab; |
| 135466 | + sqlite3VtabModuleUnref(pVTab->db, pVTab->pMod); |
| 135007 | 135467 | if( p ){ |
| 135008 | 135468 | p->pModule->xDisconnect(p); |
| 135009 | 135469 | } |
| 135010 | 135470 | sqlite3DbFree(db, pVTab); |
| 135011 | 135471 | } |
| | @@ -135406,10 +135866,11 @@ |
| 135406 | 135866 | }else if( ALWAYS(pVTable->pVtab) ){ |
| 135407 | 135867 | /* Justification of ALWAYS(): A correct vtab constructor must allocate |
| 135408 | 135868 | ** the sqlite3_vtab object if successful. */ |
| 135409 | 135869 | memset(pVTable->pVtab, 0, sizeof(pVTable->pVtab[0])); |
| 135410 | 135870 | pVTable->pVtab->pModule = pMod->pModule; |
| 135871 | + pMod->nRefModule++; |
| 135411 | 135872 | pVTable->nRef = 1; |
| 135412 | 135873 | if( sCtx.bDeclared==0 ){ |
| 135413 | 135874 | const char *zFormat = "vtable constructor did not declare schema: %s"; |
| 135414 | 135875 | *pzErr = sqlite3MPrintf(db, zFormat, pTab->zName); |
| 135415 | 135876 | sqlite3VtabUnlock(pVTable); |
| | @@ -136190,17 +136651,19 @@ |
| 136190 | 136651 | int addrNxt; /* Jump here to start the next IN combination */ |
| 136191 | 136652 | int addrSkip; /* Jump here for next iteration of skip-scan */ |
| 136192 | 136653 | int addrCont; /* Jump here to continue with the next loop cycle */ |
| 136193 | 136654 | int addrFirst; /* First instruction of interior of the loop */ |
| 136194 | 136655 | int addrBody; /* Beginning of the body of this loop */ |
| 136656 | + int regBignull; /* big-null flag reg. True if a NULL-scan is needed */ |
| 136657 | + int addrBignull; /* Jump here for next part of big-null scan */ |
| 136195 | 136658 | #ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS |
| 136196 | 136659 | u32 iLikeRepCntr; /* LIKE range processing counter register (times 2) */ |
| 136197 | 136660 | int addrLikeRep; /* LIKE range processing address */ |
| 136198 | 136661 | #endif |
| 136199 | 136662 | u8 iFrom; /* Which entry in the FROM clause */ |
| 136200 | 136663 | u8 op, p3, p5; /* Opcode, P3 & P5 of the opcode that ends the loop */ |
| 136201 | | - int p1, p2; /* Operands of the opcode used to ends the loop */ |
| 136664 | + int p1, p2; /* Operands of the opcode used to end the loop */ |
| 136202 | 136665 | union { /* Information that depends on pWLoop->wsFlags */ |
| 136203 | 136666 | struct { |
| 136204 | 136667 | int nIn; /* Number of entries in aInLoop[] */ |
| 136205 | 136668 | struct InLoop { |
| 136206 | 136669 | int iCur; /* The VDBE cursor used by this IN operator */ |
| | @@ -136247,11 +136710,11 @@ |
| 136247 | 136710 | union { |
| 136248 | 136711 | struct { /* Information for internal btree tables */ |
| 136249 | 136712 | u16 nEq; /* Number of equality constraints */ |
| 136250 | 136713 | u16 nBtm; /* Size of BTM vector */ |
| 136251 | 136714 | u16 nTop; /* Size of TOP vector */ |
| 136252 | | - u16 nIdxCol; /* Index column used for ORDER BY */ |
| 136715 | + u16 nDistinctCol; /* Index columns used to sort for DISTINCT */ |
| 136253 | 136716 | Index *pIndex; /* Index used, or NULL */ |
| 136254 | 136717 | } btree; |
| 136255 | 136718 | struct { /* Information for virtual tables */ |
| 136256 | 136719 | int idxNum; /* Index number */ |
| 136257 | 136720 | u8 needFree; /* True if sqlite3_free(idxStr) is needed */ |
| | @@ -136398,20 +136861,21 @@ |
| 136398 | 136861 | #define TERM_CODED 0x04 /* This term is already coded */ |
| 136399 | 136862 | #define TERM_COPIED 0x08 /* Has a child */ |
| 136400 | 136863 | #define TERM_ORINFO 0x10 /* Need to free the WhereTerm.u.pOrInfo object */ |
| 136401 | 136864 | #define TERM_ANDINFO 0x20 /* Need to free the WhereTerm.u.pAndInfo obj */ |
| 136402 | 136865 | #define TERM_OR_OK 0x40 /* Used during OR-clause processing */ |
| 136403 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 136866 | +#ifdef SQLITE_ENABLE_STAT4 |
| 136404 | 136867 | # define TERM_VNULL 0x80 /* Manufactured x>NULL or x<=NULL term */ |
| 136405 | 136868 | #else |
| 136406 | | -# define TERM_VNULL 0x00 /* Disabled if not using stat3 */ |
| 136869 | +# define TERM_VNULL 0x00 /* Disabled if not using stat4 */ |
| 136407 | 136870 | #endif |
| 136408 | 136871 | #define TERM_LIKEOPT 0x100 /* Virtual terms from the LIKE optimization */ |
| 136409 | 136872 | #define TERM_LIKECOND 0x200 /* Conditionally this LIKE operator term */ |
| 136410 | 136873 | #define TERM_LIKE 0x400 /* The original LIKE operator */ |
| 136411 | 136874 | #define TERM_IS 0x800 /* Term.pExpr is an IS operator */ |
| 136412 | 136875 | #define TERM_VARSELECT 0x1000 /* Term.pExpr contains a correlated sub-query */ |
| 136876 | +#define TERM_NOPARTIDX 0x2000 /* Not for use to enable a partial index */ |
| 136413 | 136877 | |
| 136414 | 136878 | /* |
| 136415 | 136879 | ** An instance of the WhereScan object is used as an iterator for locating |
| 136416 | 136880 | ** terms in the WHERE clause that are useful to the query planner. |
| 136417 | 136881 | */ |
| | @@ -136518,11 +136982,11 @@ |
| 136518 | 136982 | WhereInfo *pWInfo; /* Information about this WHERE */ |
| 136519 | 136983 | WhereClause *pWC; /* WHERE clause terms */ |
| 136520 | 136984 | ExprList *pOrderBy; /* ORDER BY clause */ |
| 136521 | 136985 | WhereLoop *pNew; /* Template WhereLoop */ |
| 136522 | 136986 | WhereOrSet *pOrSet; /* Record best loops here, if not NULL */ |
| 136523 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 136987 | +#ifdef SQLITE_ENABLE_STAT4 |
| 136524 | 136988 | UnpackedRecord *pRec; /* Probe for stat4 (if required) */ |
| 136525 | 136989 | int nRecValid; /* Number of valid fields currently in pRec */ |
| 136526 | 136990 | #endif |
| 136527 | 136991 | unsigned int bldFlags; /* SQLITE_BLDF_* flags */ |
| 136528 | 136992 | unsigned int iPlanLimit; /* Search limiter */ |
| | @@ -136705,10 +137169,11 @@ |
| 136705 | 137169 | #define WHERE_AUTO_INDEX 0x00004000 /* Uses an ephemeral index */ |
| 136706 | 137170 | #define WHERE_SKIPSCAN 0x00008000 /* Uses the skip-scan algorithm */ |
| 136707 | 137171 | #define WHERE_UNQ_WANTED 0x00010000 /* WHERE_ONEROW would have been helpful*/ |
| 136708 | 137172 | #define WHERE_PARTIALIDX 0x00020000 /* The automatic index is partial */ |
| 136709 | 137173 | #define WHERE_IN_EARLYOUT 0x00040000 /* Perhaps quit IN loops early */ |
| 137174 | +#define WHERE_BIGNULL_SORT 0x00080000 /* Column nEq of index is BIGNULL */ |
| 136710 | 137175 | |
| 136711 | 137176 | #endif /* !defined(SQLITE_WHEREINT_H) */ |
| 136712 | 137177 | |
| 136713 | 137178 | /************** End of whereInt.h ********************************************/ |
| 136714 | 137179 | /************** Continuing where we left off in wherecode.c ******************/ |
| | @@ -137009,13 +137474,13 @@ |
| 137009 | 137474 | |
| 137010 | 137475 | /* |
| 137011 | 137476 | ** Code an OP_Affinity opcode to apply the column affinity string zAff |
| 137012 | 137477 | ** to the n registers starting at base. |
| 137013 | 137478 | ** |
| 137014 | | -** As an optimization, SQLITE_AFF_BLOB entries (which are no-ops) at the |
| 137015 | | -** beginning and end of zAff are ignored. If all entries in zAff are |
| 137016 | | -** SQLITE_AFF_BLOB, then no code gets generated. |
| 137479 | +** As an optimization, SQLITE_AFF_BLOB and SQLITE_AFF_NONE entries (which |
| 137480 | +** are no-ops) at the beginning and end of zAff are ignored. If all entries |
| 137481 | +** in zAff are SQLITE_AFF_BLOB or SQLITE_AFF_NONE, then no code gets generated. |
| 137017 | 137482 | ** |
| 137018 | 137483 | ** This routine makes its own copy of zAff so that the caller is free |
| 137019 | 137484 | ** to modify zAff after this routine returns. |
| 137020 | 137485 | */ |
| 137021 | 137486 | static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){ |
| | @@ -137024,19 +137489,20 @@ |
| 137024 | 137489 | assert( pParse->db->mallocFailed ); |
| 137025 | 137490 | return; |
| 137026 | 137491 | } |
| 137027 | 137492 | assert( v!=0 ); |
| 137028 | 137493 | |
| 137029 | | - /* Adjust base and n to skip over SQLITE_AFF_BLOB entries at the beginning |
| 137030 | | - ** and end of the affinity string. |
| 137494 | + /* Adjust base and n to skip over SQLITE_AFF_BLOB and SQLITE_AFF_NONE |
| 137495 | + ** entries at the beginning and end of the affinity string. |
| 137031 | 137496 | */ |
| 137032 | | - while( n>0 && zAff[0]==SQLITE_AFF_BLOB ){ |
| 137497 | + assert( SQLITE_AFF_NONE<SQLITE_AFF_BLOB ); |
| 137498 | + while( n>0 && zAff[0]<=SQLITE_AFF_BLOB ){ |
| 137033 | 137499 | n--; |
| 137034 | 137500 | base++; |
| 137035 | 137501 | zAff++; |
| 137036 | 137502 | } |
| 137037 | | - while( n>1 && zAff[n-1]==SQLITE_AFF_BLOB ){ |
| 137503 | + while( n>1 && zAff[n-1]<=SQLITE_AFF_BLOB ){ |
| 137038 | 137504 | n--; |
| 137039 | 137505 | } |
| 137040 | 137506 | |
| 137041 | 137507 | /* Code the OP_Affinity opcode if there is anything left to do. */ |
| 137042 | 137508 | if( n>0 ){ |
| | @@ -137807,10 +138273,11 @@ |
| 137807 | 138273 | ** that contains the value of pExpr. |
| 137808 | 138274 | */ |
| 137809 | 138275 | static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ |
| 137810 | 138276 | IdxExprTrans *pX = p->u.pIdxTrans; |
| 137811 | 138277 | if( sqlite3ExprCompare(0, pExpr, pX->pIdxExpr, pX->iTabCur)==0 ){ |
| 138278 | + pExpr->affExpr = sqlite3ExprAffinity(pExpr); |
| 137812 | 138279 | pExpr->op = TK_COLUMN; |
| 137813 | 138280 | pExpr->iTable = pX->iIdxCur; |
| 137814 | 138281 | pExpr->iColumn = pX->iIdxCol; |
| 137815 | 138282 | pExpr->y.pTab = 0; |
| 137816 | 138283 | return WRC_Prune; |
| | @@ -138239,36 +138706,16 @@ |
| 138239 | 138706 | char *zStartAff; /* Affinity for start of range constraint */ |
| 138240 | 138707 | char *zEndAff = 0; /* Affinity for end of range constraint */ |
| 138241 | 138708 | u8 bSeekPastNull = 0; /* True to seek past initial nulls */ |
| 138242 | 138709 | u8 bStopAtNull = 0; /* Add condition to terminate at NULLs */ |
| 138243 | 138710 | int omitTable; /* True if we use the index only */ |
| 138244 | | - |
| 138711 | + int regBignull = 0; /* big-null flag register */ |
| 138245 | 138712 | |
| 138246 | 138713 | pIdx = pLoop->u.btree.pIndex; |
| 138247 | 138714 | iIdxCur = pLevel->iIdxCur; |
| 138248 | 138715 | assert( nEq>=pLoop->nSkip ); |
| 138249 | 138716 | |
| 138250 | | - /* If this loop satisfies a sort order (pOrderBy) request that |
| 138251 | | - ** was passed to this function to implement a "SELECT min(x) ..." |
| 138252 | | - ** query, then the caller will only allow the loop to run for |
| 138253 | | - ** a single iteration. This means that the first row returned |
| 138254 | | - ** should not have a NULL value stored in 'x'. If column 'x' is |
| 138255 | | - ** the first one after the nEq equality constraints in the index, |
| 138256 | | - ** this requires some special handling. |
| 138257 | | - */ |
| 138258 | | - assert( pWInfo->pOrderBy==0 |
| 138259 | | - || pWInfo->pOrderBy->nExpr==1 |
| 138260 | | - || (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 ); |
| 138261 | | - if( (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)!=0 |
| 138262 | | - && pWInfo->nOBSat>0 |
| 138263 | | - && (pIdx->nKeyCol>nEq) |
| 138264 | | - ){ |
| 138265 | | - assert( pLoop->nSkip==0 ); |
| 138266 | | - bSeekPastNull = 1; |
| 138267 | | - nExtraReg = 1; |
| 138268 | | - } |
| 138269 | | - |
| 138270 | 138717 | /* Find any inequality constraint terms for the start and end |
| 138271 | 138718 | ** of the range. |
| 138272 | 138719 | */ |
| 138273 | 138720 | j = nEq; |
| 138274 | 138721 | if( pLoop->wsFlags & WHERE_BTM_LIMIT ){ |
| | @@ -138304,10 +138751,29 @@ |
| 138304 | 138751 | bSeekPastNull = 1; |
| 138305 | 138752 | } |
| 138306 | 138753 | } |
| 138307 | 138754 | } |
| 138308 | 138755 | assert( pRangeEnd==0 || (pRangeEnd->wtFlags & TERM_VNULL)==0 ); |
| 138756 | + |
| 138757 | + /* If the WHERE_BIGNULL_SORT flag is set, then index column nEq uses |
| 138758 | + ** a non-default "big-null" sort (either ASC NULLS LAST or DESC NULLS |
| 138759 | + ** FIRST). In both cases separate ordered scans are made of those |
| 138760 | + ** index entries for which the column is null and for those for which |
| 138761 | + ** it is not. For an ASC sort, the non-NULL entries are scanned first. |
| 138762 | + ** For DESC, NULL entries are scanned first. |
| 138763 | + */ |
| 138764 | + if( (pLoop->wsFlags & (WHERE_TOP_LIMIT|WHERE_BTM_LIMIT))==0 |
| 138765 | + && (pLoop->wsFlags & WHERE_BIGNULL_SORT)!=0 |
| 138766 | + ){ |
| 138767 | + assert( bSeekPastNull==0 && nExtraReg==0 && nBtm==0 && nTop==0 ); |
| 138768 | + assert( pRangeEnd==0 && pRangeStart==0 ); |
| 138769 | + assert( pLoop->nSkip==0 ); |
| 138770 | + nExtraReg = 1; |
| 138771 | + bSeekPastNull = 1; |
| 138772 | + pLevel->regBignull = regBignull = ++pParse->nMem; |
| 138773 | + pLevel->addrBignull = sqlite3VdbeMakeLabel(pParse); |
| 138774 | + } |
| 138309 | 138775 | |
| 138310 | 138776 | /* If we are doing a reverse order scan on an ascending index, or |
| 138311 | 138777 | ** a forward order scan on a descending index, interchange the |
| 138312 | 138778 | ** start and end terms (pRangeStart and pRangeEnd). |
| 138313 | 138779 | */ |
| | @@ -138327,11 +138793,11 @@ |
| 138327 | 138793 | regBase = codeAllEqualityTerms(pParse,pLevel,bRev,nExtraReg,&zStartAff); |
| 138328 | 138794 | assert( zStartAff==0 || sqlite3Strlen30(zStartAff)>=nEq ); |
| 138329 | 138795 | if( zStartAff && nTop ){ |
| 138330 | 138796 | zEndAff = sqlite3DbStrDup(db, &zStartAff[nEq]); |
| 138331 | 138797 | } |
| 138332 | | - addrNxt = pLevel->addrNxt; |
| 138798 | + addrNxt = (regBignull ? pLevel->addrBignull : pLevel->addrNxt); |
| 138333 | 138799 | |
| 138334 | 138800 | testcase( pRangeStart && (pRangeStart->eOperator & WO_LE)!=0 ); |
| 138335 | 138801 | testcase( pRangeStart && (pRangeStart->eOperator & WO_GE)!=0 ); |
| 138336 | 138802 | testcase( pRangeEnd && (pRangeEnd->eOperator & WO_LE)!=0 ); |
| 138337 | 138803 | testcase( pRangeEnd && (pRangeEnd->eOperator & WO_GE)!=0 ); |
| | @@ -138361,14 +138827,18 @@ |
| 138361 | 138827 | }else{ |
| 138362 | 138828 | startEq = 1; |
| 138363 | 138829 | } |
| 138364 | 138830 | bSeekPastNull = 0; |
| 138365 | 138831 | }else if( bSeekPastNull ){ |
| 138366 | | - sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); |
| 138367 | | - nConstraint++; |
| 138368 | 138832 | startEq = 0; |
| 138833 | + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); |
| 138834 | + start_constraints = 1; |
| 138835 | + nConstraint++; |
| 138836 | + }else if( regBignull ){ |
| 138837 | + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); |
| 138369 | 138838 | start_constraints = 1; |
| 138839 | + nConstraint++; |
| 138370 | 138840 | } |
| 138371 | 138841 | codeApplyAffinity(pParse, regBase, nConstraint - bSeekPastNull, zStartAff); |
| 138372 | 138842 | if( pLoop->nSkip>0 && nConstraint==pLoop->nSkip ){ |
| 138373 | 138843 | /* The skip-scan logic inside the call to codeAllEqualityConstraints() |
| 138374 | 138844 | ** above has already left the cursor sitting on the correct row, |
| | @@ -138375,10 +138845,15 @@ |
| 138375 | 138845 | ** so no further seeking is needed */ |
| 138376 | 138846 | }else{ |
| 138377 | 138847 | if( pLoop->wsFlags & WHERE_IN_EARLYOUT ){ |
| 138378 | 138848 | sqlite3VdbeAddOp1(v, OP_SeekHit, iIdxCur); |
| 138379 | 138849 | } |
| 138850 | + if( regBignull ){ |
| 138851 | + sqlite3VdbeAddOp2(v, OP_Integer, 1, regBignull); |
| 138852 | + VdbeComment((v, "NULL-scan pass ctr")); |
| 138853 | + } |
| 138854 | + |
| 138380 | 138855 | op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; |
| 138381 | 138856 | assert( op!=0 ); |
| 138382 | 138857 | sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); |
| 138383 | 138858 | VdbeCoverage(v); |
| 138384 | 138859 | VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); |
| | @@ -138385,10 +138860,27 @@ |
| 138385 | 138860 | VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); |
| 138386 | 138861 | VdbeCoverageIf(v, op==OP_SeekGT); testcase( op==OP_SeekGT ); |
| 138387 | 138862 | VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); |
| 138388 | 138863 | VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); |
| 138389 | 138864 | VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); |
| 138865 | + |
| 138866 | + assert( bSeekPastNull==0 || bStopAtNull==0 ); |
| 138867 | + if( regBignull ){ |
| 138868 | + assert( bSeekPastNull==1 || bStopAtNull==1 ); |
| 138869 | + assert( bSeekPastNull==!bStopAtNull ); |
| 138870 | + assert( bStopAtNull==startEq ); |
| 138871 | + sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); |
| 138872 | + op = aStartOp[(nConstraint>1)*4 + 2 + bRev]; |
| 138873 | + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, |
| 138874 | + nConstraint-startEq); |
| 138875 | + VdbeCoverage(v); |
| 138876 | + VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); |
| 138877 | + VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); |
| 138878 | + VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); |
| 138879 | + VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); |
| 138880 | + assert( op==OP_Rewind || op==OP_Last || op==OP_SeekGE || op==OP_SeekLE); |
| 138881 | + } |
| 138390 | 138882 | } |
| 138391 | 138883 | |
| 138392 | 138884 | /* Load the value for the inequality constraint at the end of the |
| 138393 | 138885 | ** range (if any). |
| 138394 | 138886 | */ |
| | @@ -138416,12 +138908,14 @@ |
| 138416 | 138908 | disableTerm(pLevel, pRangeEnd); |
| 138417 | 138909 | }else{ |
| 138418 | 138910 | endEq = 1; |
| 138419 | 138911 | } |
| 138420 | 138912 | }else if( bStopAtNull ){ |
| 138421 | | - sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); |
| 138422 | | - endEq = 0; |
| 138913 | + if( regBignull==0 ){ |
| 138914 | + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); |
| 138915 | + endEq = 0; |
| 138916 | + } |
| 138423 | 138917 | nConstraint++; |
| 138424 | 138918 | } |
| 138425 | 138919 | sqlite3DbFree(db, zStartAff); |
| 138426 | 138920 | sqlite3DbFree(db, zEndAff); |
| 138427 | 138921 | |
| | @@ -138428,12 +138922,35 @@ |
| 138428 | 138922 | /* Top of the loop body */ |
| 138429 | 138923 | pLevel->p2 = sqlite3VdbeCurrentAddr(v); |
| 138430 | 138924 | |
| 138431 | 138925 | /* Check if the index cursor is past the end of the range. */ |
| 138432 | 138926 | if( nConstraint ){ |
| 138927 | + if( regBignull ){ |
| 138928 | + /* Except, skip the end-of-range check while doing the NULL-scan */ |
| 138929 | + sqlite3VdbeAddOp2(v, OP_IfNot, regBignull, sqlite3VdbeCurrentAddr(v)+3); |
| 138930 | + VdbeComment((v, "If NULL-scan 2nd pass")); |
| 138931 | + VdbeCoverage(v); |
| 138932 | + } |
| 138433 | 138933 | op = aEndOp[bRev*2 + endEq]; |
| 138434 | 138934 | sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); |
| 138935 | + testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); |
| 138936 | + testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); |
| 138937 | + testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); |
| 138938 | + testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); |
| 138939 | + } |
| 138940 | + if( regBignull ){ |
| 138941 | + /* During a NULL-scan, check to see if we have reached the end of |
| 138942 | + ** the NULLs */ |
| 138943 | + assert( bSeekPastNull==!bStopAtNull ); |
| 138944 | + assert( bSeekPastNull+bStopAtNull==1 ); |
| 138945 | + assert( nConstraint+bSeekPastNull>0 ); |
| 138946 | + sqlite3VdbeAddOp2(v, OP_If, regBignull, sqlite3VdbeCurrentAddr(v)+2); |
| 138947 | + VdbeComment((v, "If NULL-scan 1st pass")); |
| 138948 | + VdbeCoverage(v); |
| 138949 | + op = aEndOp[bRev*2 + bSeekPastNull]; |
| 138950 | + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, |
| 138951 | + nConstraint+bSeekPastNull); |
| 138435 | 138952 | testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); |
| 138436 | 138953 | testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); |
| 138437 | 138954 | testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); |
| 138438 | 138955 | testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); |
| 138439 | 138956 | } |
| | @@ -139061,11 +139578,11 @@ |
| 139061 | 139578 | if( p && ExprHasProperty(p, EP_Unlikely) ){ |
| 139062 | 139579 | pTerm->truthProb = sqlite3LogEst(p->iTable) - 270; |
| 139063 | 139580 | }else{ |
| 139064 | 139581 | pTerm->truthProb = 1; |
| 139065 | 139582 | } |
| 139066 | | - pTerm->pExpr = sqlite3ExprSkipCollate(p); |
| 139583 | + pTerm->pExpr = sqlite3ExprSkipCollateAndLikely(p); |
| 139067 | 139584 | pTerm->wtFlags = wtFlags; |
| 139068 | 139585 | pTerm->pWC = pWC; |
| 139069 | 139586 | pTerm->iParent = -1; |
| 139070 | 139587 | memset(&pTerm->eOperator, 0, |
| 139071 | 139588 | sizeof(WhereTerm) - offsetof(WhereTerm,eOperator)); |
| | @@ -139094,26 +139611,34 @@ |
| 139094 | 139611 | ** that the collating sequence does not change. For example: |
| 139095 | 139612 | ** "Y collate NOCASE op X" becomes "X op Y" because any collation sequence on |
| 139096 | 139613 | ** the left hand side of a comparison overrides any collation sequence |
| 139097 | 139614 | ** attached to the right. For the same reason the EP_Collate flag |
| 139098 | 139615 | ** is not commuted. |
| 139616 | +** |
| 139617 | +** The return value is extra flags that are added to the WhereTerm object |
| 139618 | +** after it is commuted. The only extra flag ever added is TERM_NOPARTIDX |
| 139619 | +** which prevents the term from being used to enable a partial index if |
| 139620 | +** COLLATE changes have been made. |
| 139099 | 139621 | */ |
| 139100 | | -static void exprCommute(Parse *pParse, Expr *pExpr){ |
| 139622 | +static u16 exprCommute(Parse *pParse, Expr *pExpr){ |
| 139101 | 139623 | u16 expRight = (pExpr->pRight->flags & EP_Collate); |
| 139102 | 139624 | u16 expLeft = (pExpr->pLeft->flags & EP_Collate); |
| 139625 | + u16 wtFlags = 0; |
| 139103 | 139626 | assert( allowedOp(pExpr->op) && pExpr->op!=TK_IN ); |
| 139104 | 139627 | if( expRight==expLeft ){ |
| 139105 | 139628 | /* Either X and Y both have COLLATE operator or neither do */ |
| 139106 | 139629 | if( expRight ){ |
| 139107 | 139630 | /* Both X and Y have COLLATE operators. Make sure X is always |
| 139108 | 139631 | ** used by clearing the EP_Collate flag from Y. */ |
| 139109 | 139632 | pExpr->pRight->flags &= ~EP_Collate; |
| 139633 | + wtFlags |= TERM_NOPARTIDX; |
| 139110 | 139634 | }else if( sqlite3ExprCollSeq(pParse, pExpr->pLeft)!=0 ){ |
| 139111 | 139635 | /* Neither X nor Y have COLLATE operators, but X has a non-default |
| 139112 | 139636 | ** collating sequence. So add the EP_Collate marker on X to cause |
| 139113 | 139637 | ** it to be searched first. */ |
| 139114 | 139638 | pExpr->pLeft->flags |= EP_Collate; |
| 139639 | + wtFlags |= TERM_NOPARTIDX; |
| 139115 | 139640 | } |
| 139116 | 139641 | } |
| 139117 | 139642 | SWAP(Expr*,pExpr->pRight,pExpr->pLeft); |
| 139118 | 139643 | if( pExpr->op>=TK_GT ){ |
| 139119 | 139644 | assert( TK_LT==TK_GT+2 ); |
| | @@ -139121,10 +139646,11 @@ |
| 139121 | 139646 | assert( TK_GT>TK_EQ ); |
| 139122 | 139647 | assert( TK_GT<TK_LE ); |
| 139123 | 139648 | assert( pExpr->op>=TK_GT && pExpr->op<=TK_GE ); |
| 139124 | 139649 | pExpr->op = ((pExpr->op-TK_GT)^2)+TK_GT; |
| 139125 | 139650 | } |
| 139651 | + return wtFlags; |
| 139126 | 139652 | } |
| 139127 | 139653 | |
| 139128 | 139654 | /* |
| 139129 | 139655 | ** Translate from TK_xx operator to WO_xx bitmask. |
| 139130 | 139656 | */ |
| | @@ -140117,11 +140643,11 @@ |
| 140117 | 140643 | } |
| 140118 | 140644 | }else{ |
| 140119 | 140645 | pDup = pExpr; |
| 140120 | 140646 | pNew = pTerm; |
| 140121 | 140647 | } |
| 140122 | | - exprCommute(pParse, pDup); |
| 140648 | + pNew->wtFlags |= exprCommute(pParse, pDup); |
| 140123 | 140649 | pNew->leftCursor = aiCurCol[0]; |
| 140124 | 140650 | pNew->u.leftColumn = aiCurCol[1]; |
| 140125 | 140651 | testcase( (prereqLeft | extraRight) != prereqLeft ); |
| 140126 | 140652 | pNew->prereqRight = prereqLeft | extraRight; |
| 140127 | 140653 | pNew->prereqAll = prereqAll; |
| | @@ -140358,12 +140884,12 @@ |
| 140358 | 140884 | exprAnalyze(pSrc, pWC, idxNew); |
| 140359 | 140885 | markTermAsChild(pWC, idxNew, idxTerm); |
| 140360 | 140886 | } |
| 140361 | 140887 | } |
| 140362 | 140888 | |
| 140363 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 140364 | | - /* When sqlite_stat3 histogram data is available an operator of the |
| 140889 | +#ifdef SQLITE_ENABLE_STAT4 |
| 140890 | + /* When sqlite_stat4 histogram data is available an operator of the |
| 140365 | 140891 | ** form "x IS NOT NULL" can sometimes be evaluated more efficiently |
| 140366 | 140892 | ** as "x>NULL" if x is not an INTEGER PRIMARY KEY. So construct a |
| 140367 | 140893 | ** virtual term of that form. |
| 140368 | 140894 | ** |
| 140369 | 140895 | ** Note that the virtual term must be tagged with TERM_VNULL. |
| | @@ -140370,11 +140896,11 @@ |
| 140370 | 140896 | */ |
| 140371 | 140897 | if( pExpr->op==TK_NOTNULL |
| 140372 | 140898 | && pExpr->pLeft->op==TK_COLUMN |
| 140373 | 140899 | && pExpr->pLeft->iColumn>=0 |
| 140374 | 140900 | && !ExprHasProperty(pExpr, EP_FromJoin) |
| 140375 | | - && OptimizationEnabled(db, SQLITE_Stat34) |
| 140901 | + && OptimizationEnabled(db, SQLITE_Stat4) |
| 140376 | 140902 | ){ |
| 140377 | 140903 | Expr *pNewExpr; |
| 140378 | 140904 | Expr *pLeft = pExpr->pLeft; |
| 140379 | 140905 | int idxNew; |
| 140380 | 140906 | WhereTerm *pNewTerm; |
| | @@ -140395,11 +140921,11 @@ |
| 140395 | 140921 | pTerm = &pWC->a[idxTerm]; |
| 140396 | 140922 | pTerm->wtFlags |= TERM_COPIED; |
| 140397 | 140923 | pNewTerm->prereqAll = pTerm->prereqAll; |
| 140398 | 140924 | } |
| 140399 | 140925 | } |
| 140400 | | -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ |
| 140926 | +#endif /* SQLITE_ENABLE_STAT4 */ |
| 140401 | 140927 | |
| 140402 | 140928 | /* Prevent ON clause terms of a LEFT JOIN from being used to drive |
| 140403 | 140929 | ** an index for tables to the left of the join. |
| 140404 | 140930 | */ |
| 140405 | 140931 | testcase( pTerm!=&pWC->a[idxTerm] ); |
| | @@ -140428,11 +140954,11 @@ |
| 140428 | 140954 | ** In the previous sentence and in the diagram, "slot[]" refers to |
| 140429 | 140955 | ** the WhereClause.a[] array. The slot[] array grows as needed to contain |
| 140430 | 140956 | ** all terms of the WHERE clause. |
| 140431 | 140957 | */ |
| 140432 | 140958 | SQLITE_PRIVATE void sqlite3WhereSplit(WhereClause *pWC, Expr *pExpr, u8 op){ |
| 140433 | | - Expr *pE2 = sqlite3ExprSkipCollate(pExpr); |
| 140959 | + Expr *pE2 = sqlite3ExprSkipCollateAndLikely(pExpr); |
| 140434 | 140960 | pWC->op = op; |
| 140435 | 140961 | if( pE2==0 ) return; |
| 140436 | 140962 | if( pE2->op!=op ){ |
| 140437 | 140963 | whereClauseInsert(pWC, pExpr, 0); |
| 140438 | 140964 | }else{ |
| | @@ -140843,11 +141369,12 @@ |
| 140843 | 141369 | pScan->pIdxExpr,iCur)==0) |
| 140844 | 141370 | && (pScan->iEquiv<=1 || !ExprHasProperty(pTerm->pExpr, EP_FromJoin)) |
| 140845 | 141371 | ){ |
| 140846 | 141372 | if( (pTerm->eOperator & WO_EQUIV)!=0 |
| 140847 | 141373 | && pScan->nEquiv<ArraySize(pScan->aiCur) |
| 140848 | | - && (pX = sqlite3ExprSkipCollate(pTerm->pExpr->pRight))->op==TK_COLUMN |
| 141374 | + && (pX = sqlite3ExprSkipCollateAndLikely(pTerm->pExpr->pRight))->op |
| 141375 | + ==TK_COLUMN |
| 140849 | 141376 | ){ |
| 140850 | 141377 | int j; |
| 140851 | 141378 | for(j=0; j<pScan->nEquiv; j++){ |
| 140852 | 141379 | if( pScan->aiCur[j]==pX->iTable |
| 140853 | 141380 | && pScan->aiColumn[j]==pX->iColumn ){ |
| | @@ -141039,11 +141566,11 @@ |
| 141039 | 141566 | ){ |
| 141040 | 141567 | int i; |
| 141041 | 141568 | const char *zColl = pIdx->azColl[iCol]; |
| 141042 | 141569 | |
| 141043 | 141570 | for(i=0; i<pList->nExpr; i++){ |
| 141044 | | - Expr *p = sqlite3ExprSkipCollate(pList->a[i].pExpr); |
| 141571 | + Expr *p = sqlite3ExprSkipCollateAndLikely(pList->a[i].pExpr); |
| 141045 | 141572 | if( p->op==TK_COLUMN |
| 141046 | 141573 | && p->iColumn==pIdx->aiColumn[iCol] |
| 141047 | 141574 | && p->iTable==iBase |
| 141048 | 141575 | ){ |
| 141049 | 141576 | CollSeq *pColl = sqlite3ExprNNCollSeq(pParse, pList->a[i].pExpr); |
| | @@ -141103,11 +141630,11 @@ |
| 141103 | 141630 | /* If any of the expressions is an IPK column on table iBase, then return |
| 141104 | 141631 | ** true. Note: The (p->iTable==iBase) part of this test may be false if the |
| 141105 | 141632 | ** current SELECT is a correlated sub-query. |
| 141106 | 141633 | */ |
| 141107 | 141634 | for(i=0; i<pDistinct->nExpr; i++){ |
| 141108 | | - Expr *p = sqlite3ExprSkipCollate(pDistinct->a[i].pExpr); |
| 141635 | + Expr *p = sqlite3ExprSkipCollateAndLikely(pDistinct->a[i].pExpr); |
| 141109 | 141636 | if( p->op==TK_COLUMN && p->iTable==iBase && p->iColumn<0 ) return 1; |
| 141110 | 141637 | } |
| 141111 | 141638 | |
| 141112 | 141639 | /* Loop through all indices on the table, checking each to see if it makes |
| 141113 | 141640 | ** the DISTINCT qualifier redundant. It does so if: |
| | @@ -141523,10 +142050,11 @@ |
| 141523 | 142050 | if( pOrderBy ){ |
| 141524 | 142051 | int n = pOrderBy->nExpr; |
| 141525 | 142052 | for(i=0; i<n; i++){ |
| 141526 | 142053 | Expr *pExpr = pOrderBy->a[i].pExpr; |
| 141527 | 142054 | if( pExpr->op!=TK_COLUMN || pExpr->iTable!=pSrc->iCursor ) break; |
| 142055 | + if( pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL ) break; |
| 141528 | 142056 | } |
| 141529 | 142057 | if( i==n){ |
| 141530 | 142058 | nOrderBy = n; |
| 141531 | 142059 | } |
| 141532 | 142060 | } |
| | @@ -141621,11 +142149,11 @@ |
| 141621 | 142149 | j++; |
| 141622 | 142150 | } |
| 141623 | 142151 | for(i=0; i<nOrderBy; i++){ |
| 141624 | 142152 | Expr *pExpr = pOrderBy->a[i].pExpr; |
| 141625 | 142153 | pIdxOrderBy[i].iColumn = pExpr->iColumn; |
| 141626 | | - pIdxOrderBy[i].desc = pOrderBy->a[i].sortOrder; |
| 142154 | + pIdxOrderBy[i].desc = pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC; |
| 141627 | 142155 | } |
| 141628 | 142156 | |
| 141629 | 142157 | *pmNoOmit = mNoOmit; |
| 141630 | 142158 | return pIdxInfo; |
| 141631 | 142159 | } |
| | @@ -141667,11 +142195,11 @@ |
| 141667 | 142195 | pVtab->zErrMsg = 0; |
| 141668 | 142196 | return rc; |
| 141669 | 142197 | } |
| 141670 | 142198 | #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) */ |
| 141671 | 142199 | |
| 141672 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 142200 | +#ifdef SQLITE_ENABLE_STAT4 |
| 141673 | 142201 | /* |
| 141674 | 142202 | ** Estimate the location of a particular key among all keys in an |
| 141675 | 142203 | ** index. Store the results in aStat as follows: |
| 141676 | 142204 | ** |
| 141677 | 142205 | ** aStat[0] Est. number of rows less than pRec |
| | @@ -141860,11 +142388,11 @@ |
| 141860 | 142388 | |
| 141861 | 142389 | /* Restore the pRec->nField value before returning. */ |
| 141862 | 142390 | pRec->nField = nField; |
| 141863 | 142391 | return i; |
| 141864 | 142392 | } |
| 141865 | | -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ |
| 142393 | +#endif /* SQLITE_ENABLE_STAT4 */ |
| 141866 | 142394 | |
| 141867 | 142395 | /* |
| 141868 | 142396 | ** If it is not NULL, pTerm is a term that provides an upper or lower |
| 141869 | 142397 | ** bound on a range scan. Without considering pTerm, it is estimated |
| 141870 | 142398 | ** that the scan will visit nNew rows. This function returns the number |
| | @@ -141886,25 +142414,26 @@ |
| 141886 | 142414 | } |
| 141887 | 142415 | return nRet; |
| 141888 | 142416 | } |
| 141889 | 142417 | |
| 141890 | 142418 | |
| 141891 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 142419 | +#ifdef SQLITE_ENABLE_STAT4 |
| 141892 | 142420 | /* |
| 141893 | 142421 | ** Return the affinity for a single column of an index. |
| 141894 | 142422 | */ |
| 141895 | 142423 | SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3 *db, Index *pIdx, int iCol){ |
| 141896 | 142424 | assert( iCol>=0 && iCol<pIdx->nColumn ); |
| 141897 | 142425 | if( !pIdx->zColAff ){ |
| 141898 | 142426 | if( sqlite3IndexAffinityStr(db, pIdx)==0 ) return SQLITE_AFF_BLOB; |
| 141899 | 142427 | } |
| 142428 | + assert( pIdx->zColAff[iCol]!=0 ); |
| 141900 | 142429 | return pIdx->zColAff[iCol]; |
| 141901 | 142430 | } |
| 141902 | 142431 | #endif |
| 141903 | 142432 | |
| 141904 | 142433 | |
| 141905 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 142434 | +#ifdef SQLITE_ENABLE_STAT4 |
| 141906 | 142435 | /* |
| 141907 | 142436 | ** This function is called to estimate the number of rows visited by a |
| 141908 | 142437 | ** range-scan on a skip-scan index. For example: |
| 141909 | 142438 | ** |
| 141910 | 142439 | ** CREATE INDEX i1 ON t1(a, b, c); |
| | @@ -142006,11 +142535,11 @@ |
| 142006 | 142535 | sqlite3ValueFree(p2); |
| 142007 | 142536 | sqlite3ValueFree(pVal); |
| 142008 | 142537 | |
| 142009 | 142538 | return rc; |
| 142010 | 142539 | } |
| 142011 | | -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ |
| 142540 | +#endif /* SQLITE_ENABLE_STAT4 */ |
| 142012 | 142541 | |
| 142013 | 142542 | /* |
| 142014 | 142543 | ** This function is used to estimate the number of rows that will be visited |
| 142015 | 142544 | ** by scanning an index for a range of values. The range may have an upper |
| 142016 | 142545 | ** bound, a lower bound, or both. The WHERE clause terms that set the upper |
| | @@ -142059,16 +142588,16 @@ |
| 142059 | 142588 | ){ |
| 142060 | 142589 | int rc = SQLITE_OK; |
| 142061 | 142590 | int nOut = pLoop->nOut; |
| 142062 | 142591 | LogEst nNew; |
| 142063 | 142592 | |
| 142064 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 142593 | +#ifdef SQLITE_ENABLE_STAT4 |
| 142065 | 142594 | Index *p = pLoop->u.btree.pIndex; |
| 142066 | 142595 | int nEq = pLoop->u.btree.nEq; |
| 142067 | 142596 | |
| 142068 | | - if( p->nSample>0 && nEq<p->nSampleCol |
| 142069 | | - && OptimizationEnabled(pParse->db, SQLITE_Stat34) |
| 142597 | + if( p->nSample>0 && ALWAYS(nEq<p->nSampleCol) |
| 142598 | + && OptimizationEnabled(pParse->db, SQLITE_Stat4) |
| 142070 | 142599 | ){ |
| 142071 | 142600 | if( nEq==pBuilder->nRecValid ){ |
| 142072 | 142601 | UnpackedRecord *pRec = pBuilder->pRec; |
| 142073 | 142602 | tRowcnt a[2]; |
| 142074 | 142603 | int nBtm = pLoop->u.btree.nBtm; |
| | @@ -142162,11 +142691,11 @@ |
| 142162 | 142691 | if( iUpper>iLower ){ |
| 142163 | 142692 | nNew = sqlite3LogEst(iUpper - iLower); |
| 142164 | 142693 | /* TUNING: If both iUpper and iLower are derived from the same |
| 142165 | 142694 | ** sample, then assume they are 4x more selective. This brings |
| 142166 | 142695 | ** the estimated selectivity more in line with what it would be |
| 142167 | | - ** if estimated without the use of STAT3/4 tables. */ |
| 142696 | + ** if estimated without the use of STAT4 tables. */ |
| 142168 | 142697 | if( iLwrIdx==iUprIdx ) nNew -= 20; assert( 20==sqlite3LogEst(4) ); |
| 142169 | 142698 | }else{ |
| 142170 | 142699 | nNew = 10; assert( 10==sqlite3LogEst(2) ); |
| 142171 | 142700 | } |
| 142172 | 142701 | if( nNew<nOut ){ |
| | @@ -142211,16 +142740,16 @@ |
| 142211 | 142740 | #endif |
| 142212 | 142741 | pLoop->nOut = (LogEst)nOut; |
| 142213 | 142742 | return rc; |
| 142214 | 142743 | } |
| 142215 | 142744 | |
| 142216 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 142745 | +#ifdef SQLITE_ENABLE_STAT4 |
| 142217 | 142746 | /* |
| 142218 | 142747 | ** Estimate the number of rows that will be returned based on |
| 142219 | 142748 | ** an equality constraint x=VALUE and where that VALUE occurs in |
| 142220 | 142749 | ** the histogram data. This only works when x is the left-most |
| 142221 | | -** column of an index and sqlite_stat3 histogram data is available |
| 142750 | +** column of an index and sqlite_stat4 histogram data is available |
| 142222 | 142751 | ** for that index. When pExpr==NULL that means the constraint is |
| 142223 | 142752 | ** "x IS NULL" instead of "x=VALUE". |
| 142224 | 142753 | ** |
| 142225 | 142754 | ** Write the estimated row count into *pnRow and return SQLITE_OK. |
| 142226 | 142755 | ** If unable to make an estimate, leave *pnRow unchanged and return |
| | @@ -142274,13 +142803,13 @@ |
| 142274 | 142803 | p->zName, nEq-1, (int)a[1])); |
| 142275 | 142804 | *pnRow = a[1]; |
| 142276 | 142805 | |
| 142277 | 142806 | return rc; |
| 142278 | 142807 | } |
| 142279 | | -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ |
| 142808 | +#endif /* SQLITE_ENABLE_STAT4 */ |
| 142280 | 142809 | |
| 142281 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 142810 | +#ifdef SQLITE_ENABLE_STAT4 |
| 142282 | 142811 | /* |
| 142283 | 142812 | ** Estimate the number of rows that will be returned based on |
| 142284 | 142813 | ** an IN constraint where the right-hand side of the IN operator |
| 142285 | 142814 | ** is a list of values. Example: |
| 142286 | 142815 | ** |
| | @@ -142323,11 +142852,11 @@ |
| 142323 | 142852 | WHERETRACE(0x10,("IN row estimate: est=%d\n", nRowEst)); |
| 142324 | 142853 | } |
| 142325 | 142854 | assert( pBuilder->nRecValid==nRecValid ); |
| 142326 | 142855 | return rc; |
| 142327 | 142856 | } |
| 142328 | | -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ |
| 142857 | +#endif /* SQLITE_ENABLE_STAT4 */ |
| 142329 | 142858 | |
| 142330 | 142859 | |
| 142331 | 142860 | #ifdef WHERETRACE_ENABLED |
| 142332 | 142861 | /* |
| 142333 | 142862 | ** Print the content of a WhereTerm object |
| | @@ -142860,10 +143389,11 @@ |
| 142860 | 143389 | int i, j, k; |
| 142861 | 143390 | LogEst iReduce = 0; /* pLoop->nOut should not exceed nRow-iReduce */ |
| 142862 | 143391 | |
| 142863 | 143392 | assert( (pLoop->wsFlags & WHERE_AUTO_INDEX)==0 ); |
| 142864 | 143393 | for(i=pWC->nTerm, pTerm=pWC->a; i>0; i--, pTerm++){ |
| 143394 | + assert( pTerm!=0 ); |
| 142865 | 143395 | if( (pTerm->wtFlags & TERM_VIRTUAL)!=0 ) break; |
| 142866 | 143396 | if( (pTerm->prereqAll & pLoop->maskSelf)==0 ) continue; |
| 142867 | 143397 | if( (pTerm->prereqAll & notAllowed)!=0 ) continue; |
| 142868 | 143398 | for(j=pLoop->nLTerm-1; j>=0; j--){ |
| 142869 | 143399 | pX = pLoop->aLTerm[j]; |
| | @@ -143043,11 +143573,11 @@ |
| 143043 | 143573 | for(; rc==SQLITE_OK && pTerm!=0; pTerm = whereScanNext(&scan)){ |
| 143044 | 143574 | u16 eOp = pTerm->eOperator; /* Shorthand for pTerm->eOperator */ |
| 143045 | 143575 | LogEst rCostIdx; |
| 143046 | 143576 | LogEst nOutUnadjusted; /* nOut before IN() and WHERE adjustments */ |
| 143047 | 143577 | int nIn = 0; |
| 143048 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 143578 | +#ifdef SQLITE_ENABLE_STAT4 |
| 143049 | 143579 | int nRecValid = pBuilder->nRecValid; |
| 143050 | 143580 | #endif |
| 143051 | 143581 | if( (eOp==WO_ISNULL || (pTerm->wtFlags&TERM_VNULL)!=0) |
| 143052 | 143582 | && indexColumnNotNull(pProbe, saved_nEq) |
| 143053 | 143583 | ){ |
| | @@ -143104,12 +143634,10 @@ |
| 143104 | 143634 | if( pNew->aLTerm[i] && pNew->aLTerm[i]->pExpr==pExpr ) nIn = 0; |
| 143105 | 143635 | } |
| 143106 | 143636 | }else if( ALWAYS(pExpr->x.pList && pExpr->x.pList->nExpr) ){ |
| 143107 | 143637 | /* "x IN (value, value, ...)" */ |
| 143108 | 143638 | nIn = sqlite3LogEst(pExpr->x.pList->nExpr); |
| 143109 | | - assert( nIn>0 ); /* RHS always has 2 or more terms... The parser |
| 143110 | | - ** changes "x IN (?)" into "x=?". */ |
| 143111 | 143639 | } |
| 143112 | 143640 | if( pProbe->hasStat1 ){ |
| 143113 | 143641 | LogEst M, logK, safetyMargin; |
| 143114 | 143642 | /* Let: |
| 143115 | 143643 | ** N = the total number of rows in the table |
| | @@ -143201,11 +143729,11 @@ |
| 143201 | 143729 | ** values of nIn and nInMul. In other words, assuming that all |
| 143202 | 143730 | ** "x IN(...)" terms are replaced with "x = ?". This block updates |
| 143203 | 143731 | ** the value of pNew->nOut to account for pTerm (but not nIn/nInMul). */ |
| 143204 | 143732 | assert( pNew->nOut==saved_nOut ); |
| 143205 | 143733 | if( pNew->wsFlags & WHERE_COLUMN_RANGE ){ |
| 143206 | | - /* Adjust nOut using stat3/stat4 data. Or, if there is no stat3/stat4 |
| 143734 | + /* Adjust nOut using stat4 data. Or, if there is no stat4 |
| 143207 | 143735 | ** data, using some other estimate. */ |
| 143208 | 143736 | whereRangeScanEst(pParse, pBuilder, pBtm, pTop, pNew); |
| 143209 | 143737 | }else{ |
| 143210 | 143738 | int nEq = ++pNew->u.btree.nEq; |
| 143211 | 143739 | assert( eOp & (WO_ISNULL|WO_EQ|WO_IN|WO_IS) ); |
| | @@ -143215,17 +143743,17 @@ |
| 143215 | 143743 | assert( (eOp & WO_IN) || nIn==0 ); |
| 143216 | 143744 | testcase( eOp & WO_IN ); |
| 143217 | 143745 | pNew->nOut += pTerm->truthProb; |
| 143218 | 143746 | pNew->nOut -= nIn; |
| 143219 | 143747 | }else{ |
| 143220 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 143748 | +#ifdef SQLITE_ENABLE_STAT4 |
| 143221 | 143749 | tRowcnt nOut = 0; |
| 143222 | 143750 | if( nInMul==0 |
| 143223 | 143751 | && pProbe->nSample |
| 143224 | 143752 | && pNew->u.btree.nEq<=pProbe->nSampleCol |
| 143225 | 143753 | && ((eOp & WO_IN)==0 || !ExprHasProperty(pTerm->pExpr, EP_xIsSelect)) |
| 143226 | | - && OptimizationEnabled(db, SQLITE_Stat34) |
| 143754 | + && OptimizationEnabled(db, SQLITE_Stat4) |
| 143227 | 143755 | ){ |
| 143228 | 143756 | Expr *pExpr = pTerm->pExpr; |
| 143229 | 143757 | if( (eOp & (WO_EQ|WO_ISNULL|WO_IS))!=0 ){ |
| 143230 | 143758 | testcase( eOp & WO_EQ ); |
| 143231 | 143759 | testcase( eOp & WO_IS ); |
| | @@ -143258,10 +143786,11 @@ |
| 143258 | 143786 | |
| 143259 | 143787 | /* Set rCostIdx to the cost of visiting selected rows in index. Add |
| 143260 | 143788 | ** it to pNew->rRun, which is currently set to the cost of the index |
| 143261 | 143789 | ** seek only. Then, if this is a non-covering index, add the cost of |
| 143262 | 143790 | ** visiting the rows in the main table. */ |
| 143791 | + assert( pSrc->pTab->szTabRow>0 ); |
| 143263 | 143792 | rCostIdx = pNew->nOut + 1 + (15*pProbe->szIdxRow)/pSrc->pTab->szTabRow; |
| 143264 | 143793 | pNew->rRun = sqlite3LogEstAdd(rLogSize, rCostIdx); |
| 143265 | 143794 | if( (pNew->wsFlags & (WHERE_IDX_ONLY|WHERE_IPK))==0 ){ |
| 143266 | 143795 | pNew->rRun = sqlite3LogEstAdd(pNew->rRun, pNew->nOut + 16); |
| 143267 | 143796 | } |
| | @@ -143283,11 +143812,11 @@ |
| 143283 | 143812 | && pNew->u.btree.nEq<pProbe->nColumn |
| 143284 | 143813 | ){ |
| 143285 | 143814 | whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, nInMul+nIn); |
| 143286 | 143815 | } |
| 143287 | 143816 | pNew->nOut = saved_nOut; |
| 143288 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 143817 | +#ifdef SQLITE_ENABLE_STAT4 |
| 143289 | 143818 | pBuilder->nRecValid = nRecValid; |
| 143290 | 143819 | #endif |
| 143291 | 143820 | } |
| 143292 | 143821 | pNew->prereq = saved_prereq; |
| 143293 | 143822 | pNew->u.btree.nEq = saved_nEq; |
| | @@ -143356,11 +143885,11 @@ |
| 143356 | 143885 | int ii, jj; |
| 143357 | 143886 | |
| 143358 | 143887 | if( pIndex->bUnordered ) return 0; |
| 143359 | 143888 | if( (pOB = pBuilder->pWInfo->pOrderBy)==0 ) return 0; |
| 143360 | 143889 | for(ii=0; ii<pOB->nExpr; ii++){ |
| 143361 | | - Expr *pExpr = sqlite3ExprSkipCollate(pOB->a[ii].pExpr); |
| 143890 | + Expr *pExpr = sqlite3ExprSkipCollateAndLikely(pOB->a[ii].pExpr); |
| 143362 | 143891 | if( pExpr->op==TK_COLUMN && pExpr->iTable==iCursor ){ |
| 143363 | 143892 | if( pExpr->iColumn<0 ) return 1; |
| 143364 | 143893 | for(jj=0; jj<pIndex->nKeyCol; jj++){ |
| 143365 | 143894 | if( pExpr->iColumn==pIndex->aiColumn[jj] ) return 1; |
| 143366 | 143895 | } |
| | @@ -143387,11 +143916,13 @@ |
| 143387 | 143916 | if( !whereUsablePartialIndex(iTab,pWC,pWhere->pLeft) ) return 0; |
| 143388 | 143917 | pWhere = pWhere->pRight; |
| 143389 | 143918 | } |
| 143390 | 143919 | if( pParse->db->flags & SQLITE_EnableQPSG ) pParse = 0; |
| 143391 | 143920 | for(i=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){ |
| 143392 | | - Expr *pExpr = pTerm->pExpr; |
| 143921 | + Expr *pExpr; |
| 143922 | + if( pTerm->wtFlags & TERM_NOPARTIDX ) continue; |
| 143923 | + pExpr = pTerm->pExpr; |
| 143393 | 143924 | if( (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->iRightJoinTable==iTab) |
| 143394 | 143925 | && sqlite3ExprImpliesExpr(pParse, pExpr, pWhere, iTab) |
| 143395 | 143926 | ){ |
| 143396 | 143927 | return 1; |
| 143397 | 143928 | } |
| | @@ -143656,11 +144187,11 @@ |
| 143656 | 144187 | ** unique index is used (making the index functionally non-unique) |
| 143657 | 144188 | ** then the sqlite_stat1 data becomes important for scoring the |
| 143658 | 144189 | ** plan */ |
| 143659 | 144190 | pTab->tabFlags |= TF_StatsUsed; |
| 143660 | 144191 | } |
| 143661 | | -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 144192 | +#ifdef SQLITE_ENABLE_STAT4 |
| 143662 | 144193 | sqlite3Stat4ProbeFree(pBuilder->pRec); |
| 143663 | 144194 | pBuilder->nRecValid = 0; |
| 143664 | 144195 | pBuilder->pRec = 0; |
| 143665 | 144196 | #endif |
| 143666 | 144197 | } |
| | @@ -144284,12 +144815,12 @@ |
| 144284 | 144815 | pLoop = pLast; |
| 144285 | 144816 | } |
| 144286 | 144817 | if( pLoop->wsFlags & WHERE_VIRTUALTABLE ){ |
| 144287 | 144818 | if( pLoop->u.vtab.isOrdered ) obSat = obDone; |
| 144288 | 144819 | break; |
| 144289 | | - }else{ |
| 144290 | | - pLoop->u.btree.nIdxCol = 0; |
| 144820 | + }else if( wctrlFlags & WHERE_DISTINCTBY ){ |
| 144821 | + pLoop->u.btree.nDistinctCol = 0; |
| 144291 | 144822 | } |
| 144292 | 144823 | iCur = pWInfo->pTabList->a[pLoop->iTab].iCursor; |
| 144293 | 144824 | |
| 144294 | 144825 | /* Mark off any ORDER BY term X that is a column in the table of |
| 144295 | 144826 | ** the current loop for which there is term in the WHERE |
| | @@ -144296,11 +144827,11 @@ |
| 144296 | 144827 | ** clause of the form X IS NULL or X=? that reference only outer |
| 144297 | 144828 | ** loops. |
| 144298 | 144829 | */ |
| 144299 | 144830 | for(i=0; i<nOrderBy; i++){ |
| 144300 | 144831 | if( MASKBIT(i) & obSat ) continue; |
| 144301 | | - pOBExpr = sqlite3ExprSkipCollate(pOrderBy->a[i].pExpr); |
| 144832 | + pOBExpr = sqlite3ExprSkipCollateAndLikely(pOrderBy->a[i].pExpr); |
| 144302 | 144833 | if( pOBExpr->op!=TK_COLUMN ) continue; |
| 144303 | 144834 | if( pOBExpr->iTable!=iCur ) continue; |
| 144304 | 144835 | pTerm = sqlite3WhereFindTerm(&pWInfo->sWC, iCur, pOBExpr->iColumn, |
| 144305 | 144836 | ~ready, eqOpMask, 0); |
| 144306 | 144837 | if( pTerm==0 ) continue; |
| | @@ -144333,11 +144864,12 @@ |
| 144333 | 144864 | nKeyCol = pIndex->nKeyCol; |
| 144334 | 144865 | nColumn = pIndex->nColumn; |
| 144335 | 144866 | assert( nColumn==nKeyCol+1 || !HasRowid(pIndex->pTable) ); |
| 144336 | 144867 | assert( pIndex->aiColumn[nColumn-1]==XN_ROWID |
| 144337 | 144868 | || !HasRowid(pIndex->pTable)); |
| 144338 | | - isOrderDistinct = IsUniqueIndex(pIndex); |
| 144869 | + isOrderDistinct = IsUniqueIndex(pIndex) |
| 144870 | + && (pLoop->wsFlags & WHERE_SKIPSCAN)==0; |
| 144339 | 144871 | } |
| 144340 | 144872 | |
| 144341 | 144873 | /* Loop through all columns of the index and deal with the ones |
| 144342 | 144874 | ** that are not constrained by == or IN. |
| 144343 | 144875 | */ |
| | @@ -144351,19 +144883,25 @@ |
| 144351 | 144883 | ); |
| 144352 | 144884 | if( j<pLoop->u.btree.nEq && j>=pLoop->nSkip ){ |
| 144353 | 144885 | u16 eOp = pLoop->aLTerm[j]->eOperator; |
| 144354 | 144886 | |
| 144355 | 144887 | /* Skip over == and IS and ISNULL terms. (Also skip IN terms when |
| 144356 | | - ** doing WHERE_ORDERBY_LIMIT processing). |
| 144888 | + ** doing WHERE_ORDERBY_LIMIT processing). Except, IS and ISNULL |
| 144889 | + ** terms imply that the index is not UNIQUE NOT NULL in which case |
| 144890 | + ** the loop need to be marked as not order-distinct because it can |
| 144891 | + ** have repeated NULL rows. |
| 144357 | 144892 | ** |
| 144358 | 144893 | ** If the current term is a column of an ((?,?) IN (SELECT...)) |
| 144359 | 144894 | ** expression for which the SELECT returns more than one column, |
| 144360 | 144895 | ** check that it is the only column used by this loop. Otherwise, |
| 144361 | 144896 | ** if it is one of two or more, none of the columns can be |
| 144362 | | - ** considered to match an ORDER BY term. */ |
| 144897 | + ** considered to match an ORDER BY term. |
| 144898 | + */ |
| 144363 | 144899 | if( (eOp & eqOpMask)!=0 ){ |
| 144364 | | - if( eOp & WO_ISNULL ){ |
| 144900 | + if( eOp & (WO_ISNULL|WO_IS) ){ |
| 144901 | + testcase( eOp & WO_ISNULL ); |
| 144902 | + testcase( eOp & WO_IS ); |
| 144365 | 144903 | testcase( isOrderDistinct ); |
| 144366 | 144904 | isOrderDistinct = 0; |
| 144367 | 144905 | } |
| 144368 | 144906 | continue; |
| 144369 | 144907 | }else if( ALWAYS(eOp & WO_IN) ){ |
| | @@ -144385,11 +144923,11 @@ |
| 144385 | 144923 | /* Get the column number in the table (iColumn) and sort order |
| 144386 | 144924 | ** (revIdx) for the j-th column of the index. |
| 144387 | 144925 | */ |
| 144388 | 144926 | if( pIndex ){ |
| 144389 | 144927 | iColumn = pIndex->aiColumn[j]; |
| 144390 | | - revIdx = pIndex->aSortOrder[j]; |
| 144928 | + revIdx = pIndex->aSortOrder[j] & KEYINFO_ORDER_DESC; |
| 144391 | 144929 | if( iColumn==pIndex->pTable->iPKey ) iColumn = XN_ROWID; |
| 144392 | 144930 | }else{ |
| 144393 | 144931 | iColumn = XN_ROWID; |
| 144394 | 144932 | revIdx = 0; |
| 144395 | 144933 | } |
| | @@ -144409,11 +144947,11 @@ |
| 144409 | 144947 | ** of the index and mark that ORDER BY term off |
| 144410 | 144948 | */ |
| 144411 | 144949 | isMatch = 0; |
| 144412 | 144950 | for(i=0; bOnce && i<nOrderBy; i++){ |
| 144413 | 144951 | if( MASKBIT(i) & obSat ) continue; |
| 144414 | | - pOBExpr = sqlite3ExprSkipCollate(pOrderBy->a[i].pExpr); |
| 144952 | + pOBExpr = sqlite3ExprSkipCollateAndLikely(pOrderBy->a[i].pExpr); |
| 144415 | 144953 | testcase( wctrlFlags & WHERE_GROUPBY ); |
| 144416 | 144954 | testcase( wctrlFlags & WHERE_DISTINCTBY ); |
| 144417 | 144955 | if( (wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY))==0 ) bOnce = 0; |
| 144418 | 144956 | if( iColumn>=XN_ROWID ){ |
| 144419 | 144957 | if( pOBExpr->op!=TK_COLUMN ) continue; |
| | @@ -144427,24 +144965,35 @@ |
| 144427 | 144965 | } |
| 144428 | 144966 | if( iColumn!=XN_ROWID ){ |
| 144429 | 144967 | pColl = sqlite3ExprNNCollSeq(pWInfo->pParse, pOrderBy->a[i].pExpr); |
| 144430 | 144968 | if( sqlite3StrICmp(pColl->zName, pIndex->azColl[j])!=0 ) continue; |
| 144431 | 144969 | } |
| 144432 | | - pLoop->u.btree.nIdxCol = j+1; |
| 144970 | + if( wctrlFlags & WHERE_DISTINCTBY ){ |
| 144971 | + pLoop->u.btree.nDistinctCol = j+1; |
| 144972 | + } |
| 144433 | 144973 | isMatch = 1; |
| 144434 | 144974 | break; |
| 144435 | 144975 | } |
| 144436 | 144976 | if( isMatch && (wctrlFlags & WHERE_GROUPBY)==0 ){ |
| 144437 | 144977 | /* Make sure the sort order is compatible in an ORDER BY clause. |
| 144438 | 144978 | ** Sort order is irrelevant for a GROUP BY clause. */ |
| 144439 | 144979 | if( revSet ){ |
| 144440 | | - if( (rev ^ revIdx)!=pOrderBy->a[i].sortOrder ) isMatch = 0; |
| 144980 | + if( (rev ^ revIdx)!=(pOrderBy->a[i].sortFlags&KEYINFO_ORDER_DESC) ){ |
| 144981 | + isMatch = 0; |
| 144982 | + } |
| 144441 | 144983 | }else{ |
| 144442 | | - rev = revIdx ^ pOrderBy->a[i].sortOrder; |
| 144984 | + rev = revIdx ^ (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC); |
| 144443 | 144985 | if( rev ) *pRevMask |= MASKBIT(iLoop); |
| 144444 | 144986 | revSet = 1; |
| 144445 | 144987 | } |
| 144988 | + } |
| 144989 | + if( isMatch && (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL) ){ |
| 144990 | + if( j==pLoop->u.btree.nEq ){ |
| 144991 | + pLoop->wsFlags |= WHERE_BIGNULL_SORT; |
| 144992 | + }else{ |
| 144993 | + isMatch = 0; |
| 144994 | + } |
| 144446 | 144995 | } |
| 144447 | 144996 | if( isMatch ){ |
| 144448 | 144997 | if( iColumn==XN_ROWID ){ |
| 144449 | 144998 | testcase( distinctColumns==0 ); |
| 144450 | 144999 | distinctColumns = 1; |
| | @@ -145355,10 +145904,20 @@ |
| 145355 | 145904 | sqlite3DebugPrintf("*** Optimizer Start *** (wctrlFlags: 0x%x",wctrlFlags); |
| 145356 | 145905 | if( wctrlFlags & WHERE_USE_LIMIT ){ |
| 145357 | 145906 | sqlite3DebugPrintf(", limit: %d", iAuxArg); |
| 145358 | 145907 | } |
| 145359 | 145908 | sqlite3DebugPrintf(")\n"); |
| 145909 | + if( sqlite3WhereTrace & 0x100 ){ |
| 145910 | + Select sSelect; |
| 145911 | + memset(&sSelect, 0, sizeof(sSelect)); |
| 145912 | + sSelect.selFlags = SF_WhereBegin; |
| 145913 | + sSelect.pSrc = pTabList; |
| 145914 | + sSelect.pWhere = pWhere; |
| 145915 | + sSelect.pOrderBy = pOrderBy; |
| 145916 | + sSelect.pEList = pResultSet; |
| 145917 | + sqlite3TreeViewSelect(0, &sSelect, 0); |
| 145918 | + } |
| 145360 | 145919 | } |
| 145361 | 145920 | if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */ |
| 145362 | 145921 | sqlite3WhereClausePrint(sWLB.pWC); |
| 145363 | 145922 | } |
| 145364 | 145923 | #endif |
| | @@ -145631,10 +146190,11 @@ |
| 145631 | 146190 | if( op ){ |
| 145632 | 146191 | sqlite3VdbeAddOp3(v, op, iIndexCur, pIx->tnum, iDb); |
| 145633 | 146192 | sqlite3VdbeSetP4KeyInfo(pParse, pIx); |
| 145634 | 146193 | if( (pLoop->wsFlags & WHERE_CONSTRAINT)!=0 |
| 145635 | 146194 | && (pLoop->wsFlags & (WHERE_COLUMN_RANGE|WHERE_SKIPSCAN))==0 |
| 146195 | + && (pLoop->wsFlags & WHERE_BIGNULL_SORT)==0 |
| 145636 | 146196 | && (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 |
| 145637 | 146197 | && pWInfo->eDistinct!=WHERE_DISTINCT_ORDERED |
| 145638 | 146198 | ){ |
| 145639 | 146199 | sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ); /* Hint to COMDB2 */ |
| 145640 | 146200 | } |
| | @@ -145748,11 +146308,11 @@ |
| 145748 | 146308 | int n; |
| 145749 | 146309 | if( pWInfo->eDistinct==WHERE_DISTINCT_ORDERED |
| 145750 | 146310 | && i==pWInfo->nLevel-1 /* Ticket [ef9318757b152e3] 2017-10-21 */ |
| 145751 | 146311 | && (pLoop->wsFlags & WHERE_INDEXED)!=0 |
| 145752 | 146312 | && (pIdx = pLoop->u.btree.pIndex)->hasStat1 |
| 145753 | | - && (n = pLoop->u.btree.nIdxCol)>0 |
| 146313 | + && (n = pLoop->u.btree.nDistinctCol)>0 |
| 145754 | 146314 | && pIdx->aiRowLogEst[n]>=36 |
| 145755 | 146315 | ){ |
| 145756 | 146316 | int r1 = pParse->nMem+1; |
| 145757 | 146317 | int j, op; |
| 145758 | 146318 | for(j=0; j<n; j++){ |
| | @@ -145772,10 +146332,15 @@ |
| 145772 | 146332 | sqlite3VdbeChangeP5(v, pLevel->p5); |
| 145773 | 146333 | VdbeCoverage(v); |
| 145774 | 146334 | VdbeCoverageIf(v, pLevel->op==OP_Next); |
| 145775 | 146335 | VdbeCoverageIf(v, pLevel->op==OP_Prev); |
| 145776 | 146336 | VdbeCoverageIf(v, pLevel->op==OP_VNext); |
| 146337 | + if( pLevel->regBignull ){ |
| 146338 | + sqlite3VdbeResolveLabel(v, pLevel->addrBignull); |
| 146339 | + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, pLevel->regBignull, pLevel->p2-1); |
| 146340 | + VdbeCoverage(v); |
| 146341 | + } |
| 145777 | 146342 | #ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT |
| 145778 | 146343 | if( addrSeek ) sqlite3VdbeJumpHere(v, addrSeek); |
| 145779 | 146344 | #endif |
| 145780 | 146345 | }else{ |
| 145781 | 146346 | sqlite3VdbeResolveLabel(v, pLevel->addrCont); |
| | @@ -146711,10 +147276,12 @@ |
| 146711 | 147276 | ** expression (*ppExpr) in place. |
| 146712 | 147277 | */ |
| 146713 | 147278 | static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){ |
| 146714 | 147279 | struct WindowRewrite *p = pWalker->u.pRewrite; |
| 146715 | 147280 | Parse *pParse = pWalker->pParse; |
| 147281 | + assert( p!=0 ); |
| 147282 | + assert( p->pWin!=0 ); |
| 146716 | 147283 | |
| 146717 | 147284 | /* If this function is being called from within a scalar sub-select |
| 146718 | 147285 | ** that used by the SELECT statement being processed, only process |
| 146719 | 147286 | ** TK_COLUMN expressions that refer to it (the outer SELECT). Do |
| 146720 | 147287 | ** not process aggregates or window functions at all, as they belong |
| | @@ -146810,10 +147377,11 @@ |
| 146810 | 147377 | ExprList **ppSub /* IN/OUT: Sub-select expression-list */ |
| 146811 | 147378 | ){ |
| 146812 | 147379 | Walker sWalker; |
| 146813 | 147380 | WindowRewrite sRewrite; |
| 146814 | 147381 | |
| 147382 | + assert( pWin!=0 ); |
| 146815 | 147383 | memset(&sWalker, 0, sizeof(Walker)); |
| 146816 | 147384 | memset(&sRewrite, 0, sizeof(WindowRewrite)); |
| 146817 | 147385 | |
| 146818 | 147386 | sRewrite.pSub = *ppSub; |
| 146819 | 147387 | sRewrite.pWin = pWin; |
| | @@ -146848,11 +147416,11 @@ |
| 146848 | 147416 | if( bIntToNull && pDup && pDup->op==TK_INTEGER ){ |
| 146849 | 147417 | pDup->op = TK_NULL; |
| 146850 | 147418 | pDup->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse); |
| 146851 | 147419 | } |
| 146852 | 147420 | pList = sqlite3ExprListAppend(pParse, pList, pDup); |
| 146853 | | - if( pList ) pList->a[nInit+i].sortOrder = pAppend->a[i].sortOrder; |
| 147421 | + if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags; |
| 146854 | 147422 | } |
| 146855 | 147423 | } |
| 146856 | 147424 | return pList; |
| 146857 | 147425 | } |
| 146858 | 147426 | |
| | @@ -146894,15 +147462,18 @@ |
| 146894 | 147462 | /* Create the ORDER BY clause for the sub-select. This is the concatenation |
| 146895 | 147463 | ** of the window PARTITION and ORDER BY clauses. Then, if this makes it |
| 146896 | 147464 | ** redundant, remove the ORDER BY from the parent SELECT. */ |
| 146897 | 147465 | pSort = sqlite3ExprListDup(db, pMWin->pPartition, 0); |
| 146898 | 147466 | pSort = exprListAppendList(pParse, pSort, pMWin->pOrderBy, 1); |
| 146899 | | - if( pSort && p->pOrderBy ){ |
| 147467 | + if( pSort && p->pOrderBy && p->pOrderBy->nExpr<=pSort->nExpr ){ |
| 147468 | + int nSave = pSort->nExpr; |
| 147469 | + pSort->nExpr = p->pOrderBy->nExpr; |
| 146900 | 147470 | if( sqlite3ExprListCompare(pSort, p->pOrderBy, -1)==0 ){ |
| 146901 | 147471 | sqlite3ExprListDelete(db, p->pOrderBy); |
| 146902 | 147472 | p->pOrderBy = 0; |
| 146903 | 147473 | } |
| 147474 | + pSort->nExpr = nSave; |
| 146904 | 147475 | } |
| 146905 | 147476 | |
| 146906 | 147477 | /* Assign a cursor number for the ephemeral table used to buffer rows. |
| 146907 | 147478 | ** The OpenEphemeral instruction is coded later, after it is known how |
| 146908 | 147479 | ** many columns the table will have. */ |
| | @@ -146954,11 +147525,11 @@ |
| 146954 | 147525 | if( p->pSrc ){ |
| 146955 | 147526 | Table *pTab2; |
| 146956 | 147527 | p->pSrc->a[0].pSelect = pSub; |
| 146957 | 147528 | sqlite3SrcListAssignCursors(pParse, p->pSrc); |
| 146958 | 147529 | pSub->selFlags |= SF_Expanded; |
| 146959 | | - pTab2 = sqlite3ResultSetOfSelect(pParse, pSub); |
| 147530 | + pTab2 = sqlite3ResultSetOfSelect(pParse, pSub, SQLITE_AFF_NONE); |
| 146960 | 147531 | if( pTab2==0 ){ |
| 146961 | 147532 | rc = SQLITE_NOMEM; |
| 146962 | 147533 | }else{ |
| 146963 | 147534 | memcpy(pTab, pTab2, sizeof(Table)); |
| 146964 | 147535 | pTab->tabFlags |= TF_Ephemeral; |
| | @@ -146976,16 +147547,29 @@ |
| 146976 | 147547 | sqlite3DbFree(db, pTab); |
| 146977 | 147548 | } |
| 146978 | 147549 | |
| 146979 | 147550 | return rc; |
| 146980 | 147551 | } |
| 147552 | + |
| 147553 | +/* |
| 147554 | +** Unlink the Window object from the Select to which it is attached, |
| 147555 | +** if it is attached. |
| 147556 | +*/ |
| 147557 | +SQLITE_PRIVATE void sqlite3WindowUnlinkFromSelect(Window *p){ |
| 147558 | + if( p->ppThis ){ |
| 147559 | + *p->ppThis = p->pNextWin; |
| 147560 | + if( p->pNextWin ) p->pNextWin->ppThis = p->ppThis; |
| 147561 | + p->ppThis = 0; |
| 147562 | + } |
| 147563 | +} |
| 146981 | 147564 | |
| 146982 | 147565 | /* |
| 146983 | 147566 | ** Free the Window object passed as the second argument. |
| 146984 | 147567 | */ |
| 146985 | 147568 | SQLITE_PRIVATE void sqlite3WindowDelete(sqlite3 *db, Window *p){ |
| 146986 | 147569 | if( p ){ |
| 147570 | + sqlite3WindowUnlinkFromSelect(p); |
| 146987 | 147571 | sqlite3ExprDelete(db, p->pFilter); |
| 146988 | 147572 | sqlite3ExprListDelete(db, p->pPartition); |
| 146989 | 147573 | sqlite3ExprListDelete(db, p->pOrderBy); |
| 146990 | 147574 | sqlite3ExprDelete(db, p->pEnd); |
| 146991 | 147575 | sqlite3ExprDelete(db, p->pStart); |
| | @@ -147159,40 +147743,59 @@ |
| 147159 | 147743 | ** Attach window object pWin to expression p. |
| 147160 | 147744 | */ |
| 147161 | 147745 | SQLITE_PRIVATE void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){ |
| 147162 | 147746 | if( p ){ |
| 147163 | 147747 | assert( p->op==TK_FUNCTION ); |
| 147164 | | - /* This routine is only called for the parser. If pWin was not |
| 147165 | | - ** allocated due to an OOM, then the parser would fail before ever |
| 147166 | | - ** invoking this routine */ |
| 147167 | | - if( ALWAYS(pWin) ){ |
| 147168 | | - p->y.pWin = pWin; |
| 147169 | | - ExprSetProperty(p, EP_WinFunc); |
| 147170 | | - pWin->pOwner = p; |
| 147171 | | - if( p->flags & EP_Distinct ){ |
| 147172 | | - sqlite3ErrorMsg(pParse, |
| 147173 | | - "DISTINCT is not supported for window functions"); |
| 147174 | | - } |
| 147748 | + assert( pWin ); |
| 147749 | + p->y.pWin = pWin; |
| 147750 | + ExprSetProperty(p, EP_WinFunc); |
| 147751 | + pWin->pOwner = p; |
| 147752 | + if( (p->flags & EP_Distinct) && pWin->eFrmType!=TK_FILTER ){ |
| 147753 | + sqlite3ErrorMsg(pParse, |
| 147754 | + "DISTINCT is not supported for window functions" |
| 147755 | + ); |
| 147175 | 147756 | } |
| 147176 | 147757 | }else{ |
| 147177 | 147758 | sqlite3WindowDelete(pParse->db, pWin); |
| 147178 | 147759 | } |
| 147179 | 147760 | } |
| 147761 | + |
| 147762 | +/* |
| 147763 | +** Possibly link window pWin into the list at pSel->pWin (window functions |
| 147764 | +** to be processed as part of SELECT statement pSel). The window is linked |
| 147765 | +** in if either (a) there are no other windows already linked to this |
| 147766 | +** SELECT, or (b) the windows already linked use a compatible window frame. |
| 147767 | +*/ |
| 147768 | +SQLITE_PRIVATE void sqlite3WindowLink(Select *pSel, Window *pWin){ |
| 147769 | + if( 0==pSel->pWin |
| 147770 | + || 0==sqlite3WindowCompare(0, pSel->pWin, pWin, 0) |
| 147771 | + ){ |
| 147772 | + pWin->pNextWin = pSel->pWin; |
| 147773 | + if( pSel->pWin ){ |
| 147774 | + pSel->pWin->ppThis = &pWin->pNextWin; |
| 147775 | + } |
| 147776 | + pSel->pWin = pWin; |
| 147777 | + pWin->ppThis = &pSel->pWin; |
| 147778 | + } |
| 147779 | +} |
| 147180 | 147780 | |
| 147181 | 147781 | /* |
| 147182 | 147782 | ** Return 0 if the two window objects are identical, or non-zero otherwise. |
| 147183 | 147783 | ** Identical window objects can be processed in a single scan. |
| 147184 | 147784 | */ |
| 147185 | | -SQLITE_PRIVATE int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2){ |
| 147785 | +SQLITE_PRIVATE int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2, int bFilter){ |
| 147186 | 147786 | if( p1->eFrmType!=p2->eFrmType ) return 1; |
| 147187 | 147787 | if( p1->eStart!=p2->eStart ) return 1; |
| 147188 | 147788 | if( p1->eEnd!=p2->eEnd ) return 1; |
| 147189 | 147789 | if( p1->eExclude!=p2->eExclude ) return 1; |
| 147190 | 147790 | if( sqlite3ExprCompare(pParse, p1->pStart, p2->pStart, -1) ) return 1; |
| 147191 | 147791 | if( sqlite3ExprCompare(pParse, p1->pEnd, p2->pEnd, -1) ) return 1; |
| 147192 | 147792 | if( sqlite3ExprListCompare(p1->pPartition, p2->pPartition, -1) ) return 1; |
| 147193 | 147793 | if( sqlite3ExprListCompare(p1->pOrderBy, p2->pOrderBy, -1) ) return 1; |
| 147794 | + if( bFilter ){ |
| 147795 | + if( sqlite3ExprCompare(pParse, p1->pFilter, p2->pFilter, -1) ) return 1; |
| 147796 | + } |
| 147194 | 147797 | return 0; |
| 147195 | 147798 | } |
| 147196 | 147799 | |
| 147197 | 147800 | |
| 147198 | 147801 | /* |
| | @@ -147240,12 +147843,12 @@ |
| 147240 | 147843 | KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pList, 0, 0); |
| 147241 | 147844 | pWin->csrApp = pParse->nTab++; |
| 147242 | 147845 | pWin->regApp = pParse->nMem+1; |
| 147243 | 147846 | pParse->nMem += 3; |
| 147244 | 147847 | if( pKeyInfo && pWin->pFunc->zName[1]=='i' ){ |
| 147245 | | - assert( pKeyInfo->aSortOrder[0]==0 ); |
| 147246 | | - pKeyInfo->aSortOrder[0] = 1; |
| 147848 | + assert( pKeyInfo->aSortFlags[0]==0 ); |
| 147849 | + pKeyInfo->aSortFlags[0] = KEYINFO_ORDER_DESC; |
| 147247 | 147850 | } |
| 147248 | 147851 | sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pWin->csrApp, 2); |
| 147249 | 147852 | sqlite3VdbeAppendP4(v, pKeyInfo, P4_KEYINFO); |
| 147250 | 147853 | sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); |
| 147251 | 147854 | } |
| | @@ -147360,10 +147963,12 @@ |
| 147360 | 147963 | FuncDef *pFunc = pWin->pFunc; |
| 147361 | 147964 | int regArg; |
| 147362 | 147965 | int nArg = windowArgCount(pWin); |
| 147363 | 147966 | int i; |
| 147364 | 147967 | |
| 147968 | + assert( bInverse==0 || pWin->eStart!=TK_UNBOUNDED ); |
| 147969 | + |
| 147365 | 147970 | for(i=0; i<nArg; i++){ |
| 147366 | 147971 | if( i!=1 || pFunc->zName!=nth_valueName ){ |
| 147367 | 147972 | sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol+i, reg+i); |
| 147368 | 147973 | }else{ |
| 147369 | 147974 | sqlite3VdbeAddOp3(v, OP_Column, pMWin->iEphCsr, pWin->iArgCol+i, reg+i); |
| | @@ -147422,23 +148027,82 @@ |
| 147422 | 148027 | } |
| 147423 | 148028 | } |
| 147424 | 148029 | |
| 147425 | 148030 | typedef struct WindowCodeArg WindowCodeArg; |
| 147426 | 148031 | typedef struct WindowCsrAndReg WindowCsrAndReg; |
| 148032 | + |
| 148033 | +/* |
| 148034 | +** See comments above struct WindowCodeArg. |
| 148035 | +*/ |
| 147427 | 148036 | struct WindowCsrAndReg { |
| 147428 | | - int csr; |
| 147429 | | - int reg; |
| 148037 | + int csr; /* Cursor number */ |
| 148038 | + int reg; /* First in array of peer values */ |
| 147430 | 148039 | }; |
| 147431 | 148040 | |
| 148041 | +/* |
| 148042 | +** A single instance of this structure is allocated on the stack by |
| 148043 | +** sqlite3WindowCodeStep() and a pointer to it passed to the various helper |
| 148044 | +** routines. This is to reduce the number of arguments required by each |
| 148045 | +** helper function. |
| 148046 | +** |
| 148047 | +** regArg: |
| 148048 | +** Each window function requires an accumulator register (just as an |
| 148049 | +** ordinary aggregate function does). This variable is set to the first |
| 148050 | +** in an array of accumulator registers - one for each window function |
| 148051 | +** in the WindowCodeArg.pMWin list. |
| 148052 | +** |
| 148053 | +** eDelete: |
| 148054 | +** The window functions implementation sometimes caches the input rows |
| 148055 | +** that it processes in a temporary table. If it is not zero, this |
| 148056 | +** variable indicates when rows may be removed from the temp table (in |
| 148057 | +** order to reduce memory requirements - it would always be safe just |
| 148058 | +** to leave them there). Possible values for eDelete are: |
| 148059 | +** |
| 148060 | +** WINDOW_RETURN_ROW: |
| 148061 | +** An input row can be discarded after it is returned to the caller. |
| 148062 | +** |
| 148063 | +** WINDOW_AGGINVERSE: |
| 148064 | +** An input row can be discarded after the window functions xInverse() |
| 148065 | +** callbacks have been invoked in it. |
| 148066 | +** |
| 148067 | +** WINDOW_AGGSTEP: |
| 148068 | +** An input row can be discarded after the window functions xStep() |
| 148069 | +** callbacks have been invoked in it. |
| 148070 | +** |
| 148071 | +** start,current,end |
| 148072 | +** Consider a window-frame similar to the following: |
| 148073 | +** |
| 148074 | +** (ORDER BY a, b GROUPS BETWEEN 2 PRECEDING AND 2 FOLLOWING) |
| 148075 | +** |
| 148076 | +** The windows functions implmentation caches the input rows in a temp |
| 148077 | +** table, sorted by "a, b" (it actually populates the cache lazily, and |
| 148078 | +** aggressively removes rows once they are no longer required, but that's |
| 148079 | +** a mere detail). It keeps three cursors open on the temp table. One |
| 148080 | +** (current) that points to the next row to return to the query engine |
| 148081 | +** once its window function values have been calculated. Another (end) |
| 148082 | +** points to the next row to call the xStep() method of each window function |
| 148083 | +** on (so that it is 2 groups ahead of current). And a third (start) that |
| 148084 | +** points to the next row to call the xInverse() method of each window |
| 148085 | +** function on. |
| 148086 | +** |
| 148087 | +** Each cursor (start, current and end) consists of a VDBE cursor |
| 148088 | +** (WindowCsrAndReg.csr) and an array of registers (starting at |
| 148089 | +** WindowCodeArg.reg) that always contains a copy of the peer values |
| 148090 | +** read from the corresponding cursor. |
| 148091 | +** |
| 148092 | +** Depending on the window-frame in question, all three cursors may not |
| 148093 | +** be required. In this case both WindowCodeArg.csr and reg are set to |
| 148094 | +** 0. |
| 148095 | +*/ |
| 147432 | 148096 | struct WindowCodeArg { |
| 147433 | | - Parse *pParse; |
| 147434 | | - Window *pMWin; |
| 147435 | | - Vdbe *pVdbe; |
| 147436 | | - int regGosub; |
| 147437 | | - int addrGosub; |
| 147438 | | - int regArg; |
| 147439 | | - int eDelete; |
| 148097 | + Parse *pParse; /* Parse context */ |
| 148098 | + Window *pMWin; /* First in list of functions being processed */ |
| 148099 | + Vdbe *pVdbe; /* VDBE object */ |
| 148100 | + int addrGosub; /* OP_Gosub to this address to return one row */ |
| 148101 | + int regGosub; /* Register used with OP_Gosub(addrGosub) */ |
| 148102 | + int regArg; /* First in array of accumulator registers */ |
| 148103 | + int eDelete; /* See above */ |
| 147440 | 148104 | |
| 147441 | 148105 | WindowCsrAndReg start; |
| 147442 | 148106 | WindowCsrAndReg current; |
| 147443 | 148107 | WindowCsrAndReg end; |
| 147444 | 148108 | }; |
| | @@ -147530,12 +148194,14 @@ |
| 147530 | 148194 | |
| 147531 | 148195 | int nPeer; |
| 147532 | 148196 | int lblNext; |
| 147533 | 148197 | int lblBrk; |
| 147534 | 148198 | int addrNext; |
| 147535 | | - int csr = pMWin->csrApp; |
| 148199 | + int csr; |
| 147536 | 148200 | |
| 148201 | + assert( pMWin!=0 ); |
| 148202 | + csr = pMWin->csrApp; |
| 147537 | 148203 | nPeer = (pMWin->pOrderBy ? pMWin->pOrderBy->nExpr : 0); |
| 147538 | 148204 | |
| 147539 | 148205 | lblNext = sqlite3VdbeMakeLabel(pParse); |
| 147540 | 148206 | lblBrk = sqlite3VdbeMakeLabel(pParse); |
| 147541 | 148207 | |
| | @@ -147775,67 +148441,147 @@ |
| 147775 | 148441 | } |
| 147776 | 148442 | |
| 147777 | 148443 | /* |
| 147778 | 148444 | ** This function is called as part of generating VM programs for RANGE |
| 147779 | 148445 | ** offset PRECEDING/FOLLOWING frame boundaries. Assuming "ASC" order for |
| 147780 | | -** the ORDER BY term in the window, it generates code equivalent to: |
| 148446 | +** the ORDER BY term in the window, and that argument op is OP_Ge, it generates |
| 148447 | +** code equivalent to: |
| 147781 | 148448 | ** |
| 147782 | 148449 | ** if( csr1.peerVal + regVal >= csr2.peerVal ) goto lbl; |
| 147783 | 148450 | ** |
| 147784 | | -** A special type of arithmetic is used such that if csr.peerVal is not |
| 147785 | | -** a numeric type (real or integer), then the result of the addition is |
| 147786 | | -** a copy of csr1.peerVal. |
| 148451 | +** The value of parameter op may also be OP_Gt or OP_Le. In these cases the |
| 148452 | +** operator in the above pseudo-code is replaced with ">" or "<=", respectively. |
| 148453 | +** |
| 148454 | +** If the sort-order for the ORDER BY term in the window is DESC, then the |
| 148455 | +** comparison is reversed. Instead of adding regVal to csr1.peerVal, it is |
| 148456 | +** subtracted. And the comparison operator is inverted to - ">=" becomes "<=", |
| 148457 | +** ">" becomes "<", and so on. So, with DESC sort order, if the argument op |
| 148458 | +** is OP_Ge, the generated code is equivalent to: |
| 148459 | +** |
| 148460 | +** if( csr1.peerVal - regVal <= csr2.peerVal ) goto lbl; |
| 148461 | +** |
| 148462 | +** A special type of arithmetic is used such that if csr1.peerVal is not |
| 148463 | +** a numeric type (real or integer), then the result of the addition addition |
| 148464 | +** or subtraction is a a copy of csr1.peerVal. |
| 147787 | 148465 | */ |
| 147788 | 148466 | static void windowCodeRangeTest( |
| 147789 | 148467 | WindowCodeArg *p, |
| 147790 | | - int op, /* OP_Ge or OP_Gt */ |
| 147791 | | - int csr1, |
| 147792 | | - int regVal, |
| 147793 | | - int csr2, |
| 147794 | | - int lbl |
| 148468 | + int op, /* OP_Ge, OP_Gt, or OP_Le */ |
| 148469 | + int csr1, /* Cursor number for cursor 1 */ |
| 148470 | + int regVal, /* Register containing non-negative number */ |
| 148471 | + int csr2, /* Cursor number for cursor 2 */ |
| 148472 | + int lbl /* Jump destination if condition is true */ |
| 147795 | 148473 | ){ |
| 147796 | 148474 | Parse *pParse = p->pParse; |
| 147797 | 148475 | Vdbe *v = sqlite3GetVdbe(pParse); |
| 147798 | | - int reg1 = sqlite3GetTempReg(pParse); |
| 147799 | | - int reg2 = sqlite3GetTempReg(pParse); |
| 147800 | | - int arith = OP_Add; |
| 147801 | | - int addrGe; |
| 147802 | | - |
| 147803 | | - int regString = ++pParse->nMem; |
| 148476 | + ExprList *pOrderBy = p->pMWin->pOrderBy; /* ORDER BY clause for window */ |
| 148477 | + int reg1 = sqlite3GetTempReg(pParse); /* Reg. for csr1.peerVal+regVal */ |
| 148478 | + int reg2 = sqlite3GetTempReg(pParse); /* Reg. for csr2.peerVal */ |
| 148479 | + int regString = ++pParse->nMem; /* Reg. for constant value '' */ |
| 148480 | + int arith = OP_Add; /* OP_Add or OP_Subtract */ |
| 148481 | + int addrGe; /* Jump destination */ |
| 147804 | 148482 | |
| 147805 | 148483 | assert( op==OP_Ge || op==OP_Gt || op==OP_Le ); |
| 147806 | | - assert( p->pMWin->pOrderBy && p->pMWin->pOrderBy->nExpr==1 ); |
| 147807 | | - if( p->pMWin->pOrderBy->a[0].sortOrder ){ |
| 148484 | + assert( pOrderBy && pOrderBy->nExpr==1 ); |
| 148485 | + if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_DESC ){ |
| 147808 | 148486 | switch( op ){ |
| 147809 | 148487 | case OP_Ge: op = OP_Le; break; |
| 147810 | 148488 | case OP_Gt: op = OP_Lt; break; |
| 147811 | 148489 | default: assert( op==OP_Le ); op = OP_Ge; break; |
| 147812 | 148490 | } |
| 147813 | 148491 | arith = OP_Subtract; |
| 147814 | 148492 | } |
| 147815 | 148493 | |
| 148494 | + /* Read the peer-value from each cursor into a register */ |
| 147816 | 148495 | windowReadPeerValues(p, csr1, reg1); |
| 147817 | 148496 | windowReadPeerValues(p, csr2, reg2); |
| 147818 | 148497 | |
| 147819 | | - /* Check if the peer value for csr1 value is a text or blob by comparing |
| 147820 | | - ** it to the smallest possible string - ''. If it is, jump over the |
| 147821 | | - ** OP_Add or OP_Subtract operation and proceed directly to the comparison. */ |
| 148498 | + VdbeModuleComment((v, "CodeRangeTest: if( R%d %s R%d %s R%d ) goto lbl", |
| 148499 | + reg1, (arith==OP_Add ? "+" : "-"), regVal, |
| 148500 | + ((op==OP_Ge) ? ">=" : (op==OP_Le) ? "<=" : (op==OP_Gt) ? ">" : "<"), reg2 |
| 148501 | + )); |
| 148502 | + |
| 148503 | + /* Register reg1 currently contains csr1.peerVal (the peer-value from csr1). |
| 148504 | + ** This block adds (or subtracts for DESC) the numeric value in regVal |
| 148505 | + ** from it. Or, if reg1 is not numeric (it is a NULL, a text value or a blob), |
| 148506 | + ** then leave reg1 as it is. In pseudo-code, this is implemented as: |
| 148507 | + ** |
| 148508 | + ** if( reg1>='' ) goto addrGe; |
| 148509 | + ** reg1 = reg1 +/- regVal |
| 148510 | + ** addrGe: |
| 148511 | + ** |
| 148512 | + ** Since all strings and blobs are greater-than-or-equal-to an empty string, |
| 148513 | + ** the add/subtract is skipped for these, as required. If reg1 is a NULL, |
| 148514 | + ** then the arithmetic is performed, but since adding or subtracting from |
| 148515 | + ** NULL is always NULL anyway, this case is handled as required too. */ |
| 147822 | 148516 | sqlite3VdbeAddOp4(v, OP_String8, 0, regString, 0, "", P4_STATIC); |
| 147823 | 148517 | addrGe = sqlite3VdbeAddOp3(v, OP_Ge, regString, 0, reg1); |
| 147824 | 148518 | VdbeCoverage(v); |
| 147825 | 148519 | sqlite3VdbeAddOp3(v, arith, regVal, reg1, reg1); |
| 147826 | 148520 | sqlite3VdbeJumpHere(v, addrGe); |
| 148521 | + |
| 148522 | + /* If the BIGNULL flag is set for the ORDER BY, then it is required to |
| 148523 | + ** consider NULL values to be larger than all other values, instead of |
| 148524 | + ** the usual smaller. The VDBE opcodes OP_Ge and so on do not handle this |
| 148525 | + ** (and adding that capability causes a performance regression), so |
| 148526 | + ** instead if the BIGNULL flag is set then cases where either reg1 or |
| 148527 | + ** reg2 are NULL are handled separately in the following block. The code |
| 148528 | + ** generated is equivalent to: |
| 148529 | + ** |
| 148530 | + ** if( reg1 IS NULL ){ |
| 148531 | + ** if( op==OP_Ge ) goto lbl; |
| 148532 | + ** if( op==OP_Gt && reg2 IS NOT NULL ) goto lbl; |
| 148533 | + ** if( op==OP_Le && reg2 IS NULL ) goto lbl; |
| 148534 | + ** }else if( reg2 IS NULL ){ |
| 148535 | + ** if( op==OP_Le ) goto lbl; |
| 148536 | + ** } |
| 148537 | + ** |
| 148538 | + ** Additionally, if either reg1 or reg2 are NULL but the jump to lbl is |
| 148539 | + ** not taken, control jumps over the comparison operator coded below this |
| 148540 | + ** block. */ |
| 148541 | + if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_BIGNULL ){ |
| 148542 | + /* This block runs if reg1 contains a NULL. */ |
| 148543 | + int addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); VdbeCoverage(v); |
| 148544 | + switch( op ){ |
| 148545 | + case OP_Ge: |
| 148546 | + sqlite3VdbeAddOp2(v, OP_Goto, 0, lbl); |
| 148547 | + break; |
| 148548 | + case OP_Gt: |
| 148549 | + sqlite3VdbeAddOp2(v, OP_NotNull, reg2, lbl); |
| 148550 | + VdbeCoverage(v); |
| 148551 | + break; |
| 148552 | + case OP_Le: |
| 148553 | + sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); |
| 148554 | + VdbeCoverage(v); |
| 148555 | + break; |
| 148556 | + default: assert( op==OP_Lt ); /* no-op */ break; |
| 148557 | + } |
| 148558 | + sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+3); |
| 148559 | + |
| 148560 | + /* This block runs if reg1 is not NULL, but reg2 is. */ |
| 148561 | + sqlite3VdbeJumpHere(v, addr); |
| 148562 | + sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); VdbeCoverage(v); |
| 148563 | + if( op==OP_Gt || op==OP_Ge ){ |
| 148564 | + sqlite3VdbeChangeP2(v, -1, sqlite3VdbeCurrentAddr(v)+1); |
| 148565 | + } |
| 148566 | + } |
| 148567 | + |
| 148568 | + /* Compare registers reg2 and reg1, taking the jump if required. Note that |
| 148569 | + ** control skips over this test if the BIGNULL flag is set and either |
| 148570 | + ** reg1 or reg2 contain a NULL value. */ |
| 147827 | 148571 | sqlite3VdbeAddOp3(v, op, reg2, lbl, reg1); VdbeCoverage(v); |
| 147828 | 148572 | sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); |
| 148573 | + |
| 147829 | 148574 | assert( op==OP_Ge || op==OP_Gt || op==OP_Lt || op==OP_Le ); |
| 147830 | 148575 | testcase(op==OP_Ge); VdbeCoverageIf(v, op==OP_Ge); |
| 147831 | 148576 | testcase(op==OP_Lt); VdbeCoverageIf(v, op==OP_Lt); |
| 147832 | 148577 | testcase(op==OP_Le); VdbeCoverageIf(v, op==OP_Le); |
| 147833 | 148578 | testcase(op==OP_Gt); VdbeCoverageIf(v, op==OP_Gt); |
| 147834 | | - |
| 147835 | 148579 | sqlite3ReleaseTempReg(pParse, reg1); |
| 147836 | 148580 | sqlite3ReleaseTempReg(pParse, reg2); |
| 148581 | + |
| 148582 | + VdbeModuleComment((v, "CodeRangeTest: end")); |
| 147837 | 148583 | } |
| 147838 | 148584 | |
| 147839 | 148585 | /* |
| 147840 | 148586 | ** Helper function for sqlite3WindowCodeStep(). Each call to this function |
| 147841 | 148587 | ** generates VM code for a single RETURN_ROW, AGGSTEP or AGGINVERSE |
| | @@ -147980,10 +148726,11 @@ |
| 147980 | 148726 | pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0); |
| 147981 | 148727 | pNew->eFrmType = p->eFrmType; |
| 147982 | 148728 | pNew->eEnd = p->eEnd; |
| 147983 | 148729 | pNew->eStart = p->eStart; |
| 147984 | 148730 | pNew->eExclude = p->eExclude; |
| 148731 | + pNew->regResult = p->regResult; |
| 147985 | 148732 | pNew->pStart = sqlite3ExprDup(db, p->pStart, 0); |
| 147986 | 148733 | pNew->pEnd = sqlite3ExprDup(db, p->pEnd, 0); |
| 147987 | 148734 | pNew->pOwner = pOwner; |
| 147988 | 148735 | } |
| 147989 | 148736 | } |
| | @@ -148786,10 +149533,11 @@ |
| 148786 | 149533 | ** For a compound SELECT statement, make sure p->pPrior->pNext==p for |
| 148787 | 149534 | ** all elements in the list. And make sure list length does not exceed |
| 148788 | 149535 | ** SQLITE_LIMIT_COMPOUND_SELECT. |
| 148789 | 149536 | */ |
| 148790 | 149537 | static void parserDoubleLinkSelect(Parse *pParse, Select *p){ |
| 149538 | + assert( p!=0 ); |
| 148791 | 149539 | if( p->pPrior ){ |
| 148792 | 149540 | Select *pNext = 0, *pLoop; |
| 148793 | 149541 | int mxSelect, cnt = 0; |
| 148794 | 149542 | for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){ |
| 148795 | 149543 | pLoop->pNext = pNext; |
| | @@ -148812,11 +149560,11 @@ |
| 148812 | 149560 | static Expr *tokenExpr(Parse *pParse, int op, Token t){ |
| 148813 | 149561 | Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1); |
| 148814 | 149562 | if( p ){ |
| 148815 | 149563 | /* memset(p, 0, sizeof(Expr)); */ |
| 148816 | 149564 | p->op = (u8)op; |
| 148817 | | - p->affinity = 0; |
| 149565 | + p->affExpr = 0; |
| 148818 | 149566 | p->flags = EP_Leaf; |
| 148819 | 149567 | p->iAgg = -1; |
| 148820 | 149568 | p->pLeft = p->pRight = 0; |
| 148821 | 149569 | p->x.pList = 0; |
| 148822 | 149570 | p->pAggInfo = 0; |
| | @@ -148939,32 +149687,32 @@ |
| 148939 | 149687 | #ifndef INTERFACE |
| 148940 | 149688 | # define INTERFACE 1 |
| 148941 | 149689 | #endif |
| 148942 | 149690 | /************* Begin control #defines *****************************************/ |
| 148943 | 149691 | #define YYCODETYPE unsigned short int |
| 148944 | | -#define YYNOCODE 302 |
| 149692 | +#define YYNOCODE 307 |
| 148945 | 149693 | #define YYACTIONTYPE unsigned short int |
| 148946 | | -#define YYWILDCARD 95 |
| 149694 | +#define YYWILDCARD 98 |
| 148947 | 149695 | #define sqlite3ParserTOKENTYPE Token |
| 148948 | 149696 | typedef union { |
| 148949 | 149697 | int yyinit; |
| 148950 | 149698 | sqlite3ParserTOKENTYPE yy0; |
| 148951 | | - TriggerStep* yy11; |
| 148952 | | - IdList* yy76; |
| 148953 | | - ExprList* yy94; |
| 148954 | | - Upsert* yy95; |
| 148955 | | - int yy100; |
| 148956 | | - Expr* yy102; |
| 148957 | | - struct {int value; int mask;} yy199; |
| 148958 | | - u8 yy218; |
| 148959 | | - With* yy243; |
| 148960 | | - struct TrigEvent yy298; |
| 148961 | | - Window* yy379; |
| 148962 | | - struct FrameBound yy389; |
| 148963 | | - Select* yy391; |
| 148964 | | - SrcList* yy407; |
| 148965 | | - const char* yy528; |
| 149699 | + const char* yy8; |
| 149700 | + Select* yy25; |
| 149701 | + int yy32; |
| 149702 | + Expr* yy46; |
| 149703 | + struct FrameBound yy57; |
| 149704 | + u8 yy118; |
| 149705 | + ExprList* yy138; |
| 149706 | + Upsert* yy288; |
| 149707 | + With* yy297; |
| 149708 | + IdList* yy406; |
| 149709 | + Window* yy455; |
| 149710 | + struct {int value; int mask;} yy495; |
| 149711 | + TriggerStep* yy527; |
| 149712 | + struct TrigEvent yy572; |
| 149713 | + SrcList* yy609; |
| 148966 | 149714 | } YYMINORTYPE; |
| 148967 | 149715 | #ifndef YYSTACKDEPTH |
| 148968 | 149716 | #define YYSTACKDEPTH 100 |
| 148969 | 149717 | #endif |
| 148970 | 149718 | #define sqlite3ParserARG_SDECL |
| | @@ -148976,21 +149724,21 @@ |
| 148976 | 149724 | #define sqlite3ParserCTX_PDECL ,Parse *pParse |
| 148977 | 149725 | #define sqlite3ParserCTX_PARAM ,pParse |
| 148978 | 149726 | #define sqlite3ParserCTX_FETCH Parse *pParse=yypParser->pParse; |
| 148979 | 149727 | #define sqlite3ParserCTX_STORE yypParser->pParse=pParse; |
| 148980 | 149728 | #define YYFALLBACK 1 |
| 148981 | | -#define YYNSTATE 540 |
| 148982 | | -#define YYNRULE 376 |
| 148983 | | -#define YYNTOKEN 176 |
| 148984 | | -#define YY_MAX_SHIFT 539 |
| 148985 | | -#define YY_MIN_SHIFTREDUCE 783 |
| 148986 | | -#define YY_MAX_SHIFTREDUCE 1158 |
| 148987 | | -#define YY_ERROR_ACTION 1159 |
| 148988 | | -#define YY_ACCEPT_ACTION 1160 |
| 148989 | | -#define YY_NO_ACTION 1161 |
| 148990 | | -#define YY_MIN_REDUCE 1162 |
| 148991 | | -#define YY_MAX_REDUCE 1537 |
| 149729 | +#define YYNSTATE 543 |
| 149730 | +#define YYNRULE 381 |
| 149731 | +#define YYNTOKEN 179 |
| 149732 | +#define YY_MAX_SHIFT 542 |
| 149733 | +#define YY_MIN_SHIFTREDUCE 790 |
| 149734 | +#define YY_MAX_SHIFTREDUCE 1170 |
| 149735 | +#define YY_ERROR_ACTION 1171 |
| 149736 | +#define YY_ACCEPT_ACTION 1172 |
| 149737 | +#define YY_NO_ACTION 1173 |
| 149738 | +#define YY_MIN_REDUCE 1174 |
| 149739 | +#define YY_MAX_REDUCE 1554 |
| 148992 | 149740 | /************* End control #defines *******************************************/ |
| 148993 | 149741 | #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) |
| 148994 | 149742 | |
| 148995 | 149743 | /* Define the yytestcase() macro to be a no-op if is not already defined |
| 148996 | 149744 | ** otherwise. |
| | @@ -149053,605 +149801,577 @@ |
| 149053 | 149801 | ** yy_reduce_ofst[] For each state, the offset into yy_action for |
| 149054 | 149802 | ** shifting non-terminals after a reduce. |
| 149055 | 149803 | ** yy_default[] Default action for each state. |
| 149056 | 149804 | ** |
| 149057 | 149805 | *********** Begin parsing tables **********************************************/ |
| 149058 | | -#define YY_ACTTAB_COUNT (2142) |
| 149806 | +#define YY_ACTTAB_COUNT (1913) |
| 149059 | 149807 | static const YYACTIONTYPE yy_action[] = { |
| 149060 | | - /* 0 */ 112, 109, 209, 112, 109, 209, 1160, 1, 1, 539, |
| 149061 | | - /* 10 */ 2, 1164, 490, 1193, 1293, 534, 289, 1196, 134, 383, |
| 149062 | | - /* 20 */ 1485, 1428, 1164, 1229, 1208, 1242, 1195, 289, 491, 134, |
| 149063 | | - /* 30 */ 373, 915, 1229, 443, 16, 16, 1242, 70, 70, 916, |
| 149064 | | - /* 40 */ 242, 1292, 296, 119, 120, 110, 1136, 1136, 981, 984, |
| 149065 | | - /* 50 */ 974, 974, 117, 117, 118, 118, 118, 118, 264, 264, |
| 149066 | | - /* 60 */ 190, 264, 264, 264, 264, 112, 109, 209, 362, 264, |
| 149067 | | - /* 70 */ 264, 531, 376, 497, 531, 1134, 531, 1501, 239, 206, |
| 149068 | | - /* 80 */ 338, 9, 531, 242, 219, 1203, 118, 118, 118, 118, |
| 149069 | | - /* 90 */ 111, 439, 112, 109, 209, 219, 116, 116, 116, 116, |
| 149070 | | - /* 100 */ 115, 115, 114, 114, 114, 113, 414, 115, 115, 114, |
| 149071 | | - /* 110 */ 114, 114, 113, 414, 418, 12, 383, 400, 1134, 114, |
| 149072 | | - /* 120 */ 114, 114, 113, 414, 1115, 418, 1134, 1392, 116, 116, |
| 149073 | | - /* 130 */ 116, 116, 115, 115, 114, 114, 114, 113, 414, 961, |
| 149074 | | - /* 140 */ 119, 120, 110, 1136, 1136, 981, 984, 974, 974, 117, |
| 149075 | | - /* 150 */ 117, 118, 118, 118, 118, 952, 534, 414, 941, 951, |
| 149076 | | - /* 160 */ 1481, 539, 2, 1164, 1505, 534, 160, 175, 289, 1134, |
| 149077 | | - /* 170 */ 134, 434, 312, 297, 1115, 1116, 1117, 1242, 70, 70, |
| 149078 | | - /* 180 */ 1089, 338, 1089, 118, 118, 118, 118, 42, 42, 448, |
| 149079 | | - /* 190 */ 951, 951, 953, 116, 116, 116, 116, 115, 115, 114, |
| 149080 | | - /* 200 */ 114, 114, 113, 414, 1115, 311, 264, 264, 82, 441, |
| 149081 | | - /* 210 */ 264, 264, 190, 383, 284, 12, 288, 525, 407, 531, |
| 149082 | | - /* 220 */ 96, 159, 458, 531, 371, 116, 116, 116, 116, 115, |
| 149083 | | - /* 230 */ 115, 114, 114, 114, 113, 414, 219, 119, 120, 110, |
| 149084 | | - /* 240 */ 1136, 1136, 981, 984, 974, 974, 117, 117, 118, 118, |
| 149085 | | - /* 250 */ 118, 118, 511, 1477, 1115, 1116, 1117, 113, 414, 534, |
| 149086 | | - /* 260 */ 528, 528, 528, 121, 534, 1427, 418, 116, 116, 116, |
| 149087 | | - /* 270 */ 116, 115, 115, 114, 114, 114, 113, 414, 1464, 351, |
| 149088 | | - /* 280 */ 270, 42, 42, 383, 187, 1115, 70, 70, 533, 433, |
| 149089 | | - /* 290 */ 116, 116, 116, 116, 115, 115, 114, 114, 114, 113, |
| 149090 | | - /* 300 */ 414, 534, 1339, 405, 159, 411, 410, 119, 120, 110, |
| 149091 | | - /* 310 */ 1136, 1136, 981, 984, 974, 974, 117, 117, 118, 118, |
| 149092 | | - /* 320 */ 118, 118, 285, 42, 42, 349, 411, 410, 514, 479, |
| 149093 | | - /* 330 */ 1458, 79, 1084, 6, 1140, 1115, 1116, 1117, 480, 1142, |
| 149094 | | - /* 340 */ 501, 1115, 1084, 123, 238, 1084, 136, 1141, 1234, 1234, |
| 149095 | | - /* 350 */ 1143, 383, 1143, 1115, 167, 426, 80, 447, 512, 1451, |
| 149096 | | - /* 360 */ 116, 116, 116, 116, 115, 115, 114, 114, 114, 113, |
| 149097 | | - /* 370 */ 414, 1143, 1466, 1143, 350, 119, 120, 110, 1136, 1136, |
| 149098 | | - /* 380 */ 981, 984, 974, 974, 117, 117, 118, 118, 118, 118, |
| 149099 | | - /* 390 */ 402, 1115, 1116, 1117, 500, 534, 250, 267, 336, 474, |
| 149100 | | - /* 400 */ 331, 473, 236, 1115, 1116, 1117, 231, 1115, 329, 471, |
| 149101 | | - /* 410 */ 468, 467, 509, 1458, 1464, 505, 6, 70, 70, 466, |
| 149102 | | - /* 420 */ 181, 380, 379, 534, 971, 971, 982, 985, 116, 116, |
| 149103 | | - /* 430 */ 116, 116, 115, 115, 114, 114, 114, 113, 414, 1115, |
| 149104 | | - /* 440 */ 412, 412, 412, 496, 1115, 69, 69, 235, 383, 288, |
| 149105 | | - /* 450 */ 525, 273, 326, 516, 337, 458, 1084, 1115, 1116, 1117, |
| 149106 | | - /* 460 */ 1232, 1232, 492, 160, 508, 441, 1084, 1067, 1531, 1084, |
| 149107 | | - /* 470 */ 207, 1531, 119, 120, 110, 1136, 1136, 981, 984, 974, |
| 149108 | | - /* 480 */ 974, 117, 117, 118, 118, 118, 118, 881, 534, 1115, |
| 149109 | | - /* 490 */ 1116, 1117, 975, 534, 1115, 1116, 1117, 534, 421, 534, |
| 149110 | | - /* 500 */ 141, 534, 176, 356, 517, 1119, 32, 511, 482, 388, |
| 149111 | | - /* 510 */ 70, 70, 818, 288, 525, 70, 70, 441, 499, 50, |
| 149112 | | - /* 520 */ 50, 70, 70, 70, 70, 116, 116, 116, 116, 115, |
| 149113 | | - /* 530 */ 115, 114, 114, 114, 113, 414, 274, 264, 264, 1115, |
| 149114 | | - /* 540 */ 1065, 264, 264, 1115, 355, 383, 409, 961, 1439, 822, |
| 149115 | | - /* 550 */ 531, 516, 190, 419, 531, 483, 1119, 516, 337, 516, |
| 149116 | | - /* 560 */ 518, 1115, 818, 952, 382, 458, 515, 951, 481, 119, |
| 149117 | | - /* 570 */ 120, 110, 1136, 1136, 981, 984, 974, 974, 117, 117, |
| 149118 | | - /* 580 */ 118, 118, 118, 118, 1338, 278, 1045, 278, 275, 1115, |
| 149119 | | - /* 590 */ 1116, 1117, 259, 1115, 1116, 1117, 534, 5, 951, 951, |
| 149120 | | - /* 600 */ 953, 1046, 231, 3, 143, 471, 468, 467, 1391, 463, |
| 149121 | | - /* 610 */ 1115, 1115, 1116, 1117, 1452, 466, 1047, 836, 70, 70, |
| 149122 | | - /* 620 */ 480, 534, 116, 116, 116, 116, 115, 115, 114, 114, |
| 149123 | | - /* 630 */ 114, 113, 414, 95, 1115, 287, 235, 856, 902, 420, |
| 149124 | | - /* 640 */ 1115, 534, 383, 13, 13, 381, 815, 857, 472, 112, |
| 149125 | | - /* 650 */ 109, 209, 1115, 337, 413, 309, 837, 394, 1436, 534, |
| 149126 | | - /* 660 */ 1115, 1116, 1117, 54, 54, 291, 119, 120, 110, 1136, |
| 149127 | | - /* 670 */ 1136, 981, 984, 974, 974, 117, 117, 118, 118, 118, |
| 149128 | | - /* 680 */ 118, 13, 13, 1084, 1115, 1116, 1117, 901, 264, 264, |
| 149129 | | - /* 690 */ 1115, 1116, 1117, 1084, 292, 399, 1084, 800, 388, 140, |
| 149130 | | - /* 700 */ 295, 531, 1115, 1116, 1117, 403, 447, 532, 534, 870, |
| 149131 | | - /* 710 */ 870, 534, 1240, 534, 329, 534, 1185, 389, 534, 116, |
| 149132 | | - /* 720 */ 116, 116, 116, 115, 115, 114, 114, 114, 113, 414, |
| 149133 | | - /* 730 */ 13, 13, 1024, 13, 13, 13, 13, 13, 13, 383, |
| 149134 | | - /* 740 */ 13, 13, 424, 1100, 401, 264, 264, 277, 160, 184, |
| 149135 | | - /* 750 */ 1182, 185, 1533, 369, 513, 484, 432, 487, 531, 424, |
| 149136 | | - /* 760 */ 423, 1397, 941, 119, 120, 110, 1136, 1136, 981, 984, |
| 149137 | | - /* 770 */ 974, 974, 117, 117, 118, 118, 118, 118, 1397, 1399, |
| 149138 | | - /* 780 */ 425, 519, 392, 264, 264, 1029, 1029, 455, 264, 264, |
| 149139 | | - /* 790 */ 264, 264, 1004, 304, 261, 1278, 531, 900, 288, 525, |
| 149140 | | - /* 800 */ 310, 531, 493, 531, 1067, 1532, 458, 387, 1532, 311, |
| 149141 | | - /* 810 */ 429, 299, 534, 107, 264, 264, 116, 116, 116, 116, |
| 149142 | | - /* 820 */ 115, 115, 114, 114, 114, 113, 414, 531, 424, 1384, |
| 149143 | | - /* 830 */ 507, 258, 258, 1246, 55, 55, 383, 1277, 265, 265, |
| 149144 | | - /* 840 */ 962, 324, 434, 312, 531, 531, 506, 1397, 1026, 1241, |
| 149145 | | - /* 850 */ 298, 531, 1026, 445, 301, 1095, 303, 534, 368, 1156, |
| 149146 | | - /* 860 */ 119, 120, 110, 1136, 1136, 981, 984, 974, 974, 117, |
| 149147 | | - /* 870 */ 117, 118, 118, 118, 118, 1045, 534, 1065, 534, 15, |
| 149148 | | - /* 880 */ 15, 1084, 208, 1324, 453, 452, 534, 1324, 534, 449, |
| 149149 | | - /* 890 */ 1046, 1084, 494, 458, 1084, 234, 233, 232, 44, 44, |
| 149150 | | - /* 900 */ 56, 56, 319, 1095, 322, 1047, 534, 900, 57, 57, |
| 149151 | | - /* 910 */ 58, 58, 534, 116, 116, 116, 116, 115, 115, 114, |
| 149152 | | - /* 920 */ 114, 114, 113, 414, 534, 514, 522, 534, 59, 59, |
| 149153 | | - /* 930 */ 302, 1157, 534, 383, 60, 60, 1237, 946, 788, 789, |
| 149154 | | - /* 940 */ 790, 1459, 1456, 446, 6, 6, 61, 61, 1212, 45, |
| 149155 | | - /* 950 */ 45, 534, 396, 383, 46, 46, 397, 119, 120, 110, |
| 149156 | | - /* 960 */ 1136, 1136, 981, 984, 974, 974, 117, 117, 118, 118, |
| 149157 | | - /* 970 */ 118, 118, 428, 48, 48, 534, 392, 119, 120, 110, |
| 149158 | | - /* 980 */ 1136, 1136, 981, 984, 974, 974, 117, 117, 118, 118, |
| 149159 | | - /* 990 */ 118, 118, 1324, 368, 1066, 447, 825, 49, 49, 534, |
| 149160 | | - /* 1000 */ 458, 357, 534, 353, 534, 138, 534, 337, 1478, 478, |
| 149161 | | - /* 1010 */ 116, 116, 116, 116, 115, 115, 114, 114, 114, 113, |
| 149162 | | - /* 1020 */ 414, 62, 62, 392, 63, 63, 64, 64, 14, 14, |
| 149163 | | - /* 1030 */ 116, 116, 116, 116, 115, 115, 114, 114, 114, 113, |
| 149164 | | - /* 1040 */ 414, 534, 810, 317, 271, 534, 1457, 825, 534, 6, |
| 149165 | | - /* 1050 */ 534, 1324, 534, 142, 534, 1442, 534, 212, 534, 1324, |
| 149166 | | - /* 1060 */ 534, 398, 305, 65, 65, 534, 1157, 125, 125, 476, |
| 149167 | | - /* 1070 */ 66, 66, 51, 51, 67, 67, 68, 68, 52, 52, |
| 149168 | | - /* 1080 */ 147, 147, 148, 148, 534, 98, 534, 75, 75, 276, |
| 149169 | | - /* 1090 */ 534, 272, 534, 810, 534, 876, 534, 527, 389, 534, |
| 149170 | | - /* 1100 */ 875, 534, 1151, 202, 534, 383, 53, 53, 71, 71, |
| 149171 | | - /* 1110 */ 288, 525, 126, 126, 72, 72, 127, 127, 128, 128, |
| 149172 | | - /* 1120 */ 454, 124, 124, 146, 146, 383, 145, 145, 408, 119, |
| 149173 | | - /* 1130 */ 120, 110, 1136, 1136, 981, 984, 974, 974, 117, 117, |
| 149174 | | - /* 1140 */ 118, 118, 118, 118, 534, 900, 534, 95, 534, 119, |
| 149175 | | - /* 1150 */ 120, 110, 1136, 1136, 981, 984, 974, 974, 117, 117, |
| 149176 | | - /* 1160 */ 118, 118, 118, 118, 390, 161, 132, 132, 131, 131, |
| 149177 | | - /* 1170 */ 129, 129, 534, 915, 534, 1455, 534, 1454, 6, 1416, |
| 149178 | | - /* 1180 */ 6, 916, 116, 116, 116, 116, 115, 115, 114, 114, |
| 149179 | | - /* 1190 */ 114, 113, 414, 1415, 130, 130, 74, 74, 76, 76, |
| 149180 | | - /* 1200 */ 534, 30, 116, 116, 116, 116, 115, 115, 114, 114, |
| 149181 | | - /* 1210 */ 114, 113, 414, 534, 263, 206, 534, 1133, 1504, 93, |
| 149182 | | - /* 1220 */ 876, 845, 73, 73, 102, 875, 100, 139, 17, 38, |
| 149183 | | - /* 1230 */ 208, 1062, 31, 450, 370, 43, 43, 101, 47, 47, |
| 149184 | | - /* 1240 */ 827, 216, 436, 308, 943, 440, 95, 241, 241, 442, |
| 149185 | | - /* 1250 */ 313, 464, 241, 95, 237, 900, 327, 383, 266, 95, |
| 149186 | | - /* 1260 */ 835, 834, 193, 335, 938, 314, 1011, 435, 842, 843, |
| 149187 | | - /* 1270 */ 955, 1007, 909, 334, 237, 241, 873, 383, 1023, 107, |
| 149188 | | - /* 1280 */ 1023, 119, 120, 110, 1136, 1136, 981, 984, 974, 974, |
| 149189 | | - /* 1290 */ 117, 117, 118, 118, 118, 118, 1022, 808, 1022, 1274, |
| 149190 | | - /* 1300 */ 137, 119, 108, 110, 1136, 1136, 981, 984, 974, 974, |
| 149191 | | - /* 1310 */ 117, 117, 118, 118, 118, 118, 874, 1011, 318, 107, |
| 149192 | | - /* 1320 */ 321, 955, 323, 325, 1225, 1211, 197, 1210, 1209, 330, |
| 149193 | | - /* 1330 */ 339, 1265, 340, 283, 116, 116, 116, 116, 115, 115, |
| 149194 | | - /* 1340 */ 114, 114, 114, 113, 414, 1286, 1323, 1261, 1471, 1272, |
| 149195 | | - /* 1350 */ 520, 218, 521, 1329, 116, 116, 116, 116, 115, 115, |
| 149196 | | - /* 1360 */ 114, 114, 114, 113, 414, 1192, 1184, 1173, 1172, 1174, |
| 149197 | | - /* 1370 */ 1494, 1488, 459, 256, 383, 1258, 342, 199, 367, 344, |
| 149198 | | - /* 1380 */ 211, 195, 307, 444, 11, 346, 469, 333, 1308, 1316, |
| 149199 | | - /* 1390 */ 375, 427, 203, 360, 383, 1388, 188, 1387, 189, 120, |
| 149200 | | - /* 1400 */ 110, 1136, 1136, 981, 984, 974, 974, 117, 117, 118, |
| 149201 | | - /* 1410 */ 118, 118, 118, 1208, 1151, 300, 348, 1491, 245, 1148, |
| 149202 | | - /* 1420 */ 110, 1136, 1136, 981, 984, 974, 974, 117, 117, 118, |
| 149203 | | - /* 1430 */ 118, 118, 118, 198, 1435, 1433, 524, 78, 391, 163, |
| 149204 | | - /* 1440 */ 82, 1393, 438, 173, 81, 105, 526, 1313, 4, 35, |
| 149205 | | - /* 1450 */ 157, 116, 116, 116, 116, 115, 115, 114, 114, 114, |
| 149206 | | - /* 1460 */ 113, 414, 529, 165, 93, 430, 1305, 168, 169, 431, |
| 149207 | | - /* 1470 */ 462, 116, 116, 116, 116, 115, 115, 114, 114, 114, |
| 149208 | | - /* 1480 */ 113, 414, 170, 171, 221, 415, 372, 437, 1319, 177, |
| 149209 | | - /* 1490 */ 374, 36, 451, 225, 1382, 87, 457, 523, 257, 1404, |
| 149210 | | - /* 1500 */ 316, 105, 526, 227, 4, 182, 460, 160, 320, 228, |
| 149211 | | - /* 1510 */ 377, 1175, 475, 229, 1228, 404, 1227, 1226, 529, 827, |
| 149212 | | - /* 1520 */ 961, 1219, 378, 1200, 1199, 406, 103, 103, 1218, 332, |
| 149213 | | - /* 1530 */ 8, 281, 1198, 104, 1503, 415, 536, 535, 486, 282, |
| 149214 | | - /* 1540 */ 951, 415, 489, 495, 92, 244, 1269, 341, 243, 122, |
| 149215 | | - /* 1550 */ 1270, 343, 514, 523, 1268, 1462, 10, 288, 525, 345, |
| 149216 | | - /* 1560 */ 1461, 354, 99, 352, 503, 94, 1267, 347, 1251, 502, |
| 149217 | | - /* 1570 */ 498, 951, 951, 953, 954, 27, 961, 1250, 194, 358, |
| 149218 | | - /* 1580 */ 251, 359, 103, 103, 1181, 34, 537, 1110, 252, 104, |
| 149219 | | - /* 1590 */ 254, 415, 536, 535, 255, 1368, 951, 1420, 286, 538, |
| 149220 | | - /* 1600 */ 1170, 1165, 1421, 135, 1419, 1418, 149, 150, 279, 784, |
| 149221 | | - /* 1610 */ 416, 196, 151, 290, 210, 200, 77, 385, 269, 386, |
| 149222 | | - /* 1620 */ 133, 162, 935, 1021, 201, 1019, 153, 951, 951, 953, |
| 149223 | | - /* 1630 */ 954, 27, 1480, 1104, 417, 164, 217, 268, 859, 166, |
| 149224 | | - /* 1640 */ 306, 1035, 366, 366, 365, 253, 363, 220, 172, 797, |
| 149225 | | - /* 1650 */ 939, 155, 105, 526, 393, 4, 395, 174, 156, 83, |
| 149226 | | - /* 1660 */ 1038, 84, 213, 85, 294, 222, 86, 223, 1034, 529, |
| 149227 | | - /* 1670 */ 144, 18, 293, 224, 315, 456, 241, 1027, 1145, 178, |
| 149228 | | - /* 1680 */ 226, 179, 37, 799, 334, 461, 230, 465, 470, 838, |
| 149229 | | - /* 1690 */ 180, 88, 415, 19, 280, 328, 20, 89, 90, 158, |
| 149230 | | - /* 1700 */ 191, 477, 215, 1097, 523, 204, 192, 987, 91, 1070, |
| 149231 | | - /* 1710 */ 152, 39, 485, 154, 1071, 503, 40, 488, 205, 260, |
| 149232 | | - /* 1720 */ 504, 262, 105, 526, 214, 4, 908, 961, 183, 240, |
| 149233 | | - /* 1730 */ 903, 107, 1086, 103, 103, 21, 22, 1088, 23, 529, |
| 149234 | | - /* 1740 */ 104, 24, 415, 536, 535, 1090, 1093, 951, 1094, 25, |
| 149235 | | - /* 1750 */ 1074, 33, 7, 26, 510, 1002, 247, 186, 384, 95, |
| 149236 | | - /* 1760 */ 988, 986, 415, 288, 525, 990, 1044, 246, 1043, 991, |
| 149237 | | - /* 1770 */ 28, 41, 530, 956, 523, 809, 106, 29, 951, 951, |
| 149238 | | - /* 1780 */ 953, 954, 27, 869, 361, 503, 422, 248, 364, 1105, |
| 149239 | | - /* 1790 */ 502, 249, 1161, 1496, 1495, 1161, 1161, 961, 1161, 1161, |
| 149240 | | - /* 1800 */ 1161, 1161, 1161, 103, 103, 1161, 1161, 1161, 1161, 1161, |
| 149241 | | - /* 1810 */ 104, 1161, 415, 536, 535, 1104, 417, 951, 1161, 268, |
| 149242 | | - /* 1820 */ 1161, 1161, 1161, 1161, 366, 366, 365, 253, 363, 1161, |
| 149243 | | - /* 1830 */ 1161, 797, 1161, 1161, 1161, 1161, 105, 526, 1161, 4, |
| 149244 | | - /* 1840 */ 1161, 1161, 1161, 1161, 213, 1161, 294, 1161, 951, 951, |
| 149245 | | - /* 1850 */ 953, 954, 27, 529, 293, 1161, 1161, 1161, 1161, 1161, |
| 149246 | | - /* 1860 */ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, |
| 149247 | | - /* 1870 */ 1161, 1161, 1161, 1161, 1161, 1161, 415, 1161, 1161, 1161, |
| 149248 | | - /* 1880 */ 1161, 1161, 1161, 1161, 215, 1161, 1161, 1161, 523, 1161, |
| 149249 | | - /* 1890 */ 1161, 1161, 152, 1161, 1161, 154, 105, 526, 1161, 4, |
| 149250 | | - /* 1900 */ 1161, 1161, 1161, 1161, 1161, 1161, 214, 1161, 1161, 1161, |
| 149251 | | - /* 1910 */ 1161, 961, 1161, 529, 1161, 1161, 1161, 103, 103, 880, |
| 149252 | | - /* 1920 */ 1161, 1161, 1161, 1161, 104, 1161, 415, 536, 535, 1161, |
| 149253 | | - /* 1930 */ 1161, 951, 1161, 1161, 1161, 1161, 415, 1161, 1161, 1161, |
| 149254 | | - /* 1940 */ 384, 1161, 1161, 1161, 1161, 288, 525, 1161, 523, 1161, |
| 149255 | | - /* 1950 */ 1161, 1161, 1161, 1161, 1161, 1161, 97, 526, 1161, 4, |
| 149256 | | - /* 1960 */ 1161, 1161, 951, 951, 953, 954, 27, 1161, 422, 1161, |
| 149257 | | - /* 1970 */ 1161, 961, 1161, 529, 1161, 1161, 1161, 103, 103, 1161, |
| 149258 | | - /* 1980 */ 1161, 1161, 1161, 1161, 104, 1161, 415, 536, 535, 1161, |
| 149259 | | - /* 1990 */ 1161, 951, 268, 1161, 1161, 1161, 415, 366, 366, 365, |
| 149260 | | - /* 2000 */ 253, 363, 1161, 1161, 797, 1161, 1161, 1161, 523, 1161, |
| 149261 | | - /* 2010 */ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 213, 1161, 294, |
| 149262 | | - /* 2020 */ 1161, 1161, 951, 951, 953, 954, 27, 293, 1161, 1161, |
| 149263 | | - /* 2030 */ 1161, 961, 1161, 1161, 1161, 1161, 1161, 103, 103, 1161, |
| 149264 | | - /* 2040 */ 1161, 1161, 1161, 1161, 104, 1161, 415, 536, 535, 1161, |
| 149265 | | - /* 2050 */ 1161, 951, 1161, 1161, 1161, 1161, 1161, 215, 1161, 1161, |
| 149266 | | - /* 2060 */ 1161, 1161, 1161, 1161, 1161, 152, 1161, 1161, 154, 1161, |
| 149267 | | - /* 2070 */ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 214, |
| 149268 | | - /* 2080 */ 1161, 1161, 951, 951, 953, 954, 27, 1161, 1161, 1161, |
| 149269 | | - /* 2090 */ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, |
| 149270 | | - /* 2100 */ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, |
| 149271 | | - /* 2110 */ 1161, 1161, 1161, 384, 1161, 1161, 1161, 1161, 288, 525, |
| 149272 | | - /* 2120 */ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, |
| 149273 | | - /* 2130 */ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, |
| 149274 | | - /* 2140 */ 1161, 422, |
| 149808 | + /* 0 */ 537, 339, 537, 1241, 1220, 537, 12, 537, 112, 109, |
| 149809 | + /* 10 */ 209, 537, 1241, 537, 1205, 462, 112, 109, 209, 386, |
| 149810 | + /* 20 */ 338, 462, 42, 42, 42, 42, 445, 42, 42, 70, |
| 149811 | + /* 30 */ 70, 922, 1208, 70, 70, 70, 70, 1443, 403, 923, |
| 149812 | + /* 40 */ 531, 531, 531, 119, 120, 110, 1148, 1148, 991, 994, |
| 149813 | + /* 50 */ 984, 984, 117, 117, 118, 118, 118, 118, 425, 386, |
| 149814 | + /* 60 */ 1498, 542, 2, 1176, 1442, 519, 141, 1518, 289, 519, |
| 149815 | + /* 70 */ 134, 519, 95, 259, 495, 1215, 189, 1254, 518, 494, |
| 149816 | + /* 80 */ 484, 437, 296, 119, 120, 110, 1148, 1148, 991, 994, |
| 149817 | + /* 90 */ 984, 984, 117, 117, 118, 118, 118, 118, 270, 116, |
| 149818 | + /* 100 */ 116, 116, 116, 115, 115, 114, 114, 114, 113, 418, |
| 149819 | + /* 110 */ 264, 264, 264, 264, 423, 1479, 352, 1481, 123, 351, |
| 149820 | + /* 120 */ 1479, 508, 1094, 534, 1034, 534, 1099, 386, 1099, 239, |
| 149821 | + /* 130 */ 206, 112, 109, 209, 96, 1094, 376, 219, 1094, 116, |
| 149822 | + /* 140 */ 116, 116, 116, 115, 115, 114, 114, 114, 113, 418, |
| 149823 | + /* 150 */ 480, 119, 120, 110, 1148, 1148, 991, 994, 984, 984, |
| 149824 | + /* 160 */ 117, 117, 118, 118, 118, 118, 353, 422, 1407, 264, |
| 149825 | + /* 170 */ 264, 114, 114, 114, 113, 418, 883, 121, 416, 416, |
| 149826 | + /* 180 */ 416, 882, 534, 116, 116, 116, 116, 115, 115, 114, |
| 149827 | + /* 190 */ 114, 114, 113, 418, 212, 415, 414, 386, 443, 383, |
| 149828 | + /* 200 */ 382, 118, 118, 118, 118, 111, 177, 116, 116, 116, |
| 149829 | + /* 210 */ 116, 115, 115, 114, 114, 114, 113, 418, 112, 109, |
| 149830 | + /* 220 */ 209, 119, 120, 110, 1148, 1148, 991, 994, 984, 984, |
| 149831 | + /* 230 */ 117, 117, 118, 118, 118, 118, 386, 438, 312, 1163, |
| 149832 | + /* 240 */ 1155, 80, 1155, 1127, 514, 79, 116, 116, 116, 116, |
| 149833 | + /* 250 */ 115, 115, 114, 114, 114, 113, 418, 514, 428, 418, |
| 149834 | + /* 260 */ 119, 120, 110, 1148, 1148, 991, 994, 984, 984, 117, |
| 149835 | + /* 270 */ 117, 118, 118, 118, 118, 428, 427, 116, 116, 116, |
| 149836 | + /* 280 */ 116, 115, 115, 114, 114, 114, 113, 418, 115, 115, |
| 149837 | + /* 290 */ 114, 114, 114, 113, 418, 1127, 1127, 1128, 1129, 1094, |
| 149838 | + /* 300 */ 258, 258, 192, 386, 408, 371, 1168, 326, 118, 118, |
| 149839 | + /* 310 */ 118, 118, 1094, 534, 374, 1094, 116, 116, 116, 116, |
| 149840 | + /* 320 */ 115, 115, 114, 114, 114, 113, 418, 119, 120, 110, |
| 149841 | + /* 330 */ 1148, 1148, 991, 994, 984, 984, 117, 117, 118, 118, |
| 149842 | + /* 340 */ 118, 118, 386, 354, 445, 428, 829, 238, 1127, 1128, |
| 149843 | + /* 350 */ 1129, 515, 1466, 116, 116, 116, 116, 115, 115, 114, |
| 149844 | + /* 360 */ 114, 114, 113, 418, 1127, 1467, 119, 120, 110, 1148, |
| 149845 | + /* 370 */ 1148, 991, 994, 984, 984, 117, 117, 118, 118, 118, |
| 149846 | + /* 380 */ 118, 1169, 82, 116, 116, 116, 116, 115, 115, 114, |
| 149847 | + /* 390 */ 114, 114, 113, 418, 405, 112, 109, 209, 161, 445, |
| 149848 | + /* 400 */ 250, 267, 336, 478, 331, 477, 236, 951, 1127, 386, |
| 149849 | + /* 410 */ 888, 1521, 329, 822, 852, 162, 274, 1127, 1128, 1129, |
| 149850 | + /* 420 */ 338, 169, 116, 116, 116, 116, 115, 115, 114, 114, |
| 149851 | + /* 430 */ 114, 113, 418, 119, 120, 110, 1148, 1148, 991, 994, |
| 149852 | + /* 440 */ 984, 984, 117, 117, 118, 118, 118, 118, 386, 438, |
| 149853 | + /* 450 */ 312, 1502, 1112, 1176, 161, 288, 528, 311, 289, 883, |
| 149854 | + /* 460 */ 134, 1127, 1128, 1129, 882, 537, 143, 1254, 288, 528, |
| 149855 | + /* 470 */ 297, 275, 119, 120, 110, 1148, 1148, 991, 994, 984, |
| 149856 | + /* 480 */ 984, 117, 117, 118, 118, 118, 118, 70, 70, 116, |
| 149857 | + /* 490 */ 116, 116, 116, 115, 115, 114, 114, 114, 113, 418, |
| 149858 | + /* 500 */ 264, 264, 12, 264, 264, 395, 1127, 483, 1473, 1094, |
| 149859 | + /* 510 */ 204, 482, 6, 534, 1258, 386, 534, 1474, 825, 972, |
| 149860 | + /* 520 */ 504, 6, 1094, 500, 95, 1094, 534, 219, 116, 116, |
| 149861 | + /* 530 */ 116, 116, 115, 115, 114, 114, 114, 113, 418, 119, |
| 149862 | + /* 540 */ 120, 110, 1148, 1148, 991, 994, 984, 984, 117, 117, |
| 149863 | + /* 550 */ 118, 118, 118, 118, 386, 1339, 971, 422, 956, 1127, |
| 149864 | + /* 560 */ 1128, 1129, 231, 512, 1473, 475, 472, 471, 6, 113, |
| 149865 | + /* 570 */ 418, 825, 962, 298, 503, 470, 961, 452, 119, 120, |
| 149866 | + /* 580 */ 110, 1148, 1148, 991, 994, 984, 984, 117, 117, 118, |
| 149867 | + /* 590 */ 118, 118, 118, 395, 537, 116, 116, 116, 116, 115, |
| 149868 | + /* 600 */ 115, 114, 114, 114, 113, 418, 202, 961, 961, 963, |
| 149869 | + /* 610 */ 231, 971, 1127, 475, 472, 471, 13, 13, 951, 1127, |
| 149870 | + /* 620 */ 834, 386, 1207, 470, 399, 183, 447, 962, 462, 162, |
| 149871 | + /* 630 */ 397, 961, 1246, 1246, 116, 116, 116, 116, 115, 115, |
| 149872 | + /* 640 */ 114, 114, 114, 113, 418, 119, 120, 110, 1148, 1148, |
| 149873 | + /* 650 */ 991, 994, 984, 984, 117, 117, 118, 118, 118, 118, |
| 149874 | + /* 660 */ 386, 271, 961, 961, 963, 1127, 1128, 1129, 311, 433, |
| 149875 | + /* 670 */ 299, 1406, 1127, 1128, 1129, 178, 1471, 138, 162, 32, |
| 149876 | + /* 680 */ 6, 1127, 288, 528, 119, 120, 110, 1148, 1148, 991, |
| 149877 | + /* 690 */ 994, 984, 984, 117, 117, 118, 118, 118, 118, 909, |
| 149878 | + /* 700 */ 390, 116, 116, 116, 116, 115, 115, 114, 114, 114, |
| 149879 | + /* 710 */ 113, 418, 1127, 429, 817, 537, 1127, 265, 265, 981, |
| 149880 | + /* 720 */ 981, 992, 995, 324, 1055, 93, 520, 5, 338, 537, |
| 149881 | + /* 730 */ 534, 288, 528, 1522, 1127, 1128, 1129, 70, 70, 1056, |
| 149882 | + /* 740 */ 116, 116, 116, 116, 115, 115, 114, 114, 114, 113, |
| 149883 | + /* 750 */ 418, 70, 70, 1495, 1057, 537, 98, 1244, 1244, 264, |
| 149884 | + /* 760 */ 264, 908, 371, 1076, 1127, 1127, 1128, 1129, 817, 1127, |
| 149885 | + /* 770 */ 1128, 1129, 534, 519, 140, 863, 386, 13, 13, 456, |
| 149886 | + /* 780 */ 192, 193, 521, 453, 319, 864, 322, 284, 365, 430, |
| 149887 | + /* 790 */ 985, 402, 379, 1077, 1548, 101, 386, 1548, 3, 395, |
| 149888 | + /* 800 */ 119, 120, 110, 1148, 1148, 991, 994, 984, 984, 117, |
| 149889 | + /* 810 */ 117, 118, 118, 118, 118, 386, 451, 1127, 1128, 1129, |
| 149890 | + /* 820 */ 119, 120, 110, 1148, 1148, 991, 994, 984, 984, 117, |
| 149891 | + /* 830 */ 117, 118, 118, 118, 118, 1127, 1354, 1412, 1169, 119, |
| 149892 | + /* 840 */ 108, 110, 1148, 1148, 991, 994, 984, 984, 117, 117, |
| 149893 | + /* 850 */ 118, 118, 118, 118, 1412, 1414, 116, 116, 116, 116, |
| 149894 | + /* 860 */ 115, 115, 114, 114, 114, 113, 418, 272, 535, 1075, |
| 149895 | + /* 870 */ 877, 877, 337, 1492, 309, 462, 116, 116, 116, 116, |
| 149896 | + /* 880 */ 115, 115, 114, 114, 114, 113, 418, 537, 1127, 1128, |
| 149897 | + /* 890 */ 1129, 537, 360, 537, 356, 116, 116, 116, 116, 115, |
| 149898 | + /* 900 */ 115, 114, 114, 114, 113, 418, 386, 264, 264, 13, |
| 149899 | + /* 910 */ 13, 273, 1127, 13, 13, 13, 13, 304, 1253, 386, |
| 149900 | + /* 920 */ 534, 1077, 1549, 404, 1412, 1549, 496, 277, 451, 186, |
| 149901 | + /* 930 */ 1252, 120, 110, 1148, 1148, 991, 994, 984, 984, 117, |
| 149902 | + /* 940 */ 117, 118, 118, 118, 118, 110, 1148, 1148, 991, 994, |
| 149903 | + /* 950 */ 984, 984, 117, 117, 118, 118, 118, 118, 105, 529, |
| 149904 | + /* 960 */ 537, 4, 1339, 264, 264, 1127, 1128, 1129, 1039, 1039, |
| 149905 | + /* 970 */ 459, 795, 796, 797, 536, 532, 534, 242, 301, 807, |
| 149906 | + /* 980 */ 303, 462, 69, 69, 451, 1353, 116, 116, 116, 116, |
| 149907 | + /* 990 */ 115, 115, 114, 114, 114, 113, 418, 1075, 419, 116, |
| 149908 | + /* 1000 */ 116, 116, 116, 115, 115, 114, 114, 114, 113, 418, |
| 149909 | + /* 1010 */ 526, 537, 1146, 192, 350, 105, 529, 537, 4, 497, |
| 149910 | + /* 1020 */ 162, 337, 1492, 310, 1249, 385, 1550, 372, 9, 462, |
| 149911 | + /* 1030 */ 242, 400, 532, 13, 13, 499, 971, 843, 436, 70, |
| 149912 | + /* 1040 */ 70, 359, 103, 103, 8, 339, 278, 187, 278, 104, |
| 149913 | + /* 1050 */ 1127, 419, 539, 538, 1339, 419, 961, 302, 1339, 1172, |
| 149914 | + /* 1060 */ 1, 1, 542, 2, 1176, 1146, 1146, 526, 476, 289, |
| 149915 | + /* 1070 */ 30, 134, 317, 288, 528, 285, 844, 1014, 1254, 276, |
| 149916 | + /* 1080 */ 1472, 506, 410, 1194, 6, 207, 505, 961, 961, 963, |
| 149917 | + /* 1090 */ 964, 27, 449, 971, 415, 414, 234, 233, 232, 103, |
| 149918 | + /* 1100 */ 103, 31, 1152, 1127, 1128, 1129, 104, 1154, 419, 539, |
| 149919 | + /* 1110 */ 538, 264, 264, 961, 1399, 1153, 264, 264, 1470, 1146, |
| 149920 | + /* 1120 */ 537, 216, 6, 401, 534, 1197, 392, 458, 406, 534, |
| 149921 | + /* 1130 */ 537, 485, 358, 537, 261, 537, 1339, 907, 219, 1155, |
| 149922 | + /* 1140 */ 467, 1155, 50, 50, 961, 961, 963, 964, 27, 1497, |
| 149923 | + /* 1150 */ 1116, 421, 70, 70, 268, 70, 70, 13, 13, 369, |
| 149924 | + /* 1160 */ 369, 368, 253, 366, 264, 264, 804, 235, 422, 105, |
| 149925 | + /* 1170 */ 529, 516, 4, 287, 487, 510, 493, 534, 486, 213, |
| 149926 | + /* 1180 */ 1055, 294, 490, 384, 1127, 450, 532, 338, 413, 293, |
| 149927 | + /* 1190 */ 522, 417, 335, 1036, 509, 1056, 107, 1036, 16, 16, |
| 149928 | + /* 1200 */ 1469, 1094, 334, 1105, 6, 411, 1145, 264, 264, 419, |
| 149929 | + /* 1210 */ 1057, 102, 511, 100, 1094, 264, 264, 1094, 922, 215, |
| 149930 | + /* 1220 */ 534, 526, 907, 264, 264, 208, 923, 154, 534, 457, |
| 149931 | + /* 1230 */ 156, 525, 391, 142, 218, 506, 534, 1127, 1128, 1129, |
| 149932 | + /* 1240 */ 507, 139, 1131, 38, 214, 530, 392, 971, 329, 1454, |
| 149933 | + /* 1250 */ 907, 1105, 537, 103, 103, 105, 529, 537, 4, 537, |
| 149934 | + /* 1260 */ 104, 424, 419, 539, 538, 537, 502, 961, 517, 537, |
| 149935 | + /* 1270 */ 1072, 537, 532, 373, 54, 54, 288, 528, 387, 55, |
| 149936 | + /* 1280 */ 55, 15, 15, 288, 528, 17, 136, 44, 44, 1451, |
| 149937 | + /* 1290 */ 537, 56, 56, 57, 57, 419, 1131, 291, 961, 961, |
| 149938 | + /* 1300 */ 963, 964, 27, 393, 163, 537, 426, 526, 263, 206, |
| 149939 | + /* 1310 */ 208, 517, 58, 58, 235, 440, 842, 841, 197, 105, |
| 149940 | + /* 1320 */ 529, 506, 4, 1033, 439, 1033, 505, 59, 59, 308, |
| 149941 | + /* 1330 */ 849, 850, 95, 971, 537, 907, 532, 948, 832, 103, |
| 149942 | + /* 1340 */ 103, 105, 529, 537, 4, 1021, 104, 537, 419, 539, |
| 149943 | + /* 1350 */ 538, 1116, 421, 961, 537, 268, 60, 60, 532, 419, |
| 149944 | + /* 1360 */ 369, 369, 368, 253, 366, 61, 61, 804, 965, 45, |
| 149945 | + /* 1370 */ 45, 526, 537, 1032, 1277, 1032, 46, 46, 537, 391, |
| 149946 | + /* 1380 */ 213, 419, 294, 266, 961, 961, 963, 964, 27, 292, |
| 149947 | + /* 1390 */ 293, 295, 832, 526, 48, 48, 1290, 971, 1289, 1021, |
| 149948 | + /* 1400 */ 49, 49, 432, 103, 103, 887, 953, 537, 1457, 241, |
| 149949 | + /* 1410 */ 104, 305, 419, 539, 538, 925, 926, 961, 444, 971, |
| 149950 | + /* 1420 */ 215, 241, 965, 1224, 537, 103, 103, 1431, 154, 62, |
| 149951 | + /* 1430 */ 62, 156, 104, 1430, 419, 539, 538, 97, 529, 961, |
| 149952 | + /* 1440 */ 4, 537, 454, 537, 314, 214, 63, 63, 961, 961, |
| 149953 | + /* 1450 */ 963, 964, 27, 537, 532, 446, 1286, 318, 241, 537, |
| 149954 | + /* 1460 */ 321, 323, 325, 64, 64, 14, 14, 1237, 537, 1223, |
| 149955 | + /* 1470 */ 961, 961, 963, 964, 27, 65, 65, 419, 537, 387, |
| 149956 | + /* 1480 */ 537, 125, 125, 537, 288, 528, 537, 1486, 537, 526, |
| 149957 | + /* 1490 */ 66, 66, 313, 524, 537, 95, 468, 1221, 1511, 237, |
| 149958 | + /* 1500 */ 51, 51, 67, 67, 330, 68, 68, 426, 52, 52, |
| 149959 | + /* 1510 */ 149, 149, 1222, 340, 341, 971, 150, 150, 1298, 463, |
| 149960 | + /* 1520 */ 327, 103, 103, 95, 537, 1338, 1273, 537, 104, 537, |
| 149961 | + /* 1530 */ 419, 539, 538, 1284, 537, 961, 268, 283, 523, 1344, |
| 149962 | + /* 1540 */ 1204, 369, 369, 368, 253, 366, 75, 75, 804, 53, |
| 149963 | + /* 1550 */ 53, 71, 71, 537, 1196, 537, 126, 126, 537, 1017, |
| 149964 | + /* 1560 */ 537, 213, 237, 294, 537, 1185, 961, 961, 963, 964, |
| 149965 | + /* 1570 */ 27, 293, 537, 1184, 537, 72, 72, 127, 127, 1186, |
| 149966 | + /* 1580 */ 128, 128, 124, 124, 1505, 537, 148, 148, 537, 256, |
| 149967 | + /* 1590 */ 195, 537, 1270, 537, 147, 147, 132, 132, 537, 11, |
| 149968 | + /* 1600 */ 537, 215, 537, 199, 343, 345, 347, 131, 131, 154, |
| 149969 | + /* 1610 */ 129, 129, 156, 130, 130, 74, 74, 537, 370, 1323, |
| 149970 | + /* 1620 */ 76, 76, 73, 73, 43, 43, 214, 431, 211, 1331, |
| 149971 | + /* 1630 */ 300, 916, 880, 815, 241, 107, 137, 307, 881, 47, |
| 149972 | + /* 1640 */ 47, 107, 473, 378, 203, 448, 333, 1403, 1220, 1402, |
| 149973 | + /* 1650 */ 349, 190, 527, 191, 363, 198, 1508, 1163, 245, 165, |
| 149974 | + /* 1660 */ 387, 1450, 1448, 1160, 78, 288, 528, 1408, 81, 394, |
| 149975 | + /* 1670 */ 82, 442, 175, 159, 167, 93, 1328, 35, 1320, 434, |
| 149976 | + /* 1680 */ 170, 171, 172, 173, 435, 466, 221, 375, 426, 377, |
| 149977 | + /* 1690 */ 1334, 179, 455, 441, 1397, 225, 87, 36, 461, 1419, |
| 149978 | + /* 1700 */ 316, 257, 227, 184, 320, 464, 228, 479, 1187, 229, |
| 149979 | + /* 1710 */ 380, 1240, 1239, 407, 1238, 1212, 834, 332, 1231, 381, |
| 149980 | + /* 1720 */ 409, 1211, 204, 1210, 1491, 498, 1520, 1281, 92, 281, |
| 149981 | + /* 1730 */ 1230, 489, 282, 492, 342, 243, 1282, 344, 244, 1280, |
| 149982 | + /* 1740 */ 346, 412, 1279, 1477, 348, 122, 1476, 517, 10, 357, |
| 149983 | + /* 1750 */ 286, 1305, 1304, 99, 1383, 94, 501, 251, 1193, 34, |
| 149984 | + /* 1760 */ 1263, 355, 540, 194, 1262, 361, 362, 1122, 252, 254, |
| 149985 | + /* 1770 */ 255, 388, 541, 1182, 1177, 151, 1435, 389, 1436, 1434, |
| 149986 | + /* 1780 */ 1433, 791, 152, 135, 279, 200, 201, 420, 196, 77, |
| 149987 | + /* 1790 */ 153, 290, 269, 210, 1031, 133, 1029, 945, 166, 155, |
| 149988 | + /* 1800 */ 217, 168, 866, 306, 220, 1045, 174, 949, 157, 396, |
| 149989 | + /* 1810 */ 83, 398, 176, 84, 85, 164, 86, 158, 1048, 222, |
| 149990 | + /* 1820 */ 223, 1044, 144, 18, 224, 315, 1037, 180, 241, 460, |
| 149991 | + /* 1830 */ 1157, 226, 181, 37, 806, 465, 334, 230, 328, 469, |
| 149992 | + /* 1840 */ 182, 88, 474, 19, 20, 160, 89, 280, 145, 90, |
| 149993 | + /* 1850 */ 481, 845, 1110, 146, 997, 205, 1080, 39, 91, 40, |
| 149994 | + /* 1860 */ 488, 1081, 915, 491, 260, 262, 185, 910, 240, 107, |
| 149995 | + /* 1870 */ 1100, 1096, 1098, 1104, 21, 1084, 33, 513, 247, 22, |
| 149996 | + /* 1880 */ 23, 24, 1103, 25, 188, 95, 1012, 998, 996, 26, |
| 149997 | + /* 1890 */ 1000, 1054, 7, 1053, 1001, 246, 28, 41, 533, 966, |
| 149998 | + /* 1900 */ 816, 106, 29, 367, 248, 249, 1513, 1512, 364, 1117, |
| 149999 | + /* 1910 */ 1173, 1173, 876, |
| 149275 | 150000 | }; |
| 149276 | 150001 | static const YYCODETYPE yy_lookahead[] = { |
| 149277 | | - /* 0 */ 260, 261, 262, 260, 261, 262, 176, 177, 178, 179, |
| 149278 | | - /* 10 */ 180, 181, 184, 206, 209, 184, 186, 206, 188, 19, |
| 149279 | | - /* 20 */ 179, 281, 181, 213, 214, 195, 206, 186, 195, 188, |
| 149280 | | - /* 30 */ 195, 31, 222, 184, 206, 207, 195, 206, 207, 39, |
| 149281 | | - /* 40 */ 24, 209, 184, 43, 44, 45, 46, 47, 48, 49, |
| 149282 | | - /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 228, 229, |
| 149283 | | - /* 60 */ 184, 228, 229, 228, 229, 260, 261, 262, 192, 228, |
| 149284 | | - /* 70 */ 229, 241, 196, 242, 241, 59, 241, 205, 245, 246, |
| 149285 | | - /* 80 */ 184, 22, 241, 24, 254, 213, 54, 55, 56, 57, |
| 149286 | | - /* 90 */ 58, 256, 260, 261, 262, 254, 96, 97, 98, 99, |
| 149287 | | - /* 100 */ 100, 101, 102, 103, 104, 105, 106, 100, 101, 102, |
| 149288 | | - /* 110 */ 103, 104, 105, 106, 284, 203, 19, 221, 59, 102, |
| 149289 | | - /* 120 */ 103, 104, 105, 106, 59, 284, 110, 269, 96, 97, |
| 149290 | | - /* 130 */ 98, 99, 100, 101, 102, 103, 104, 105, 106, 94, |
| 149291 | | - /* 140 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, |
| 149292 | | - /* 150 */ 53, 54, 55, 56, 57, 110, 184, 106, 73, 114, |
| 149293 | | - /* 160 */ 178, 179, 180, 181, 219, 184, 81, 22, 186, 110, |
| 149294 | | - /* 170 */ 188, 121, 122, 195, 109, 110, 111, 195, 206, 207, |
| 149295 | | - /* 180 */ 83, 184, 85, 54, 55, 56, 57, 206, 207, 277, |
| 149296 | | - /* 190 */ 145, 146, 147, 96, 97, 98, 99, 100, 101, 102, |
| 149297 | | - /* 200 */ 103, 104, 105, 106, 59, 120, 228, 229, 143, 184, |
| 149298 | | - /* 210 */ 228, 229, 184, 19, 242, 203, 131, 132, 221, 241, |
| 149299 | | - /* 220 */ 26, 184, 184, 241, 196, 96, 97, 98, 99, 100, |
| 149300 | | - /* 230 */ 101, 102, 103, 104, 105, 106, 254, 43, 44, 45, |
| 149301 | | - /* 240 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, |
| 149302 | | - /* 250 */ 56, 57, 184, 184, 109, 110, 111, 105, 106, 184, |
| 149303 | | - /* 260 */ 200, 201, 202, 69, 184, 227, 284, 96, 97, 98, |
| 149304 | | - /* 270 */ 99, 100, 101, 102, 103, 104, 105, 106, 297, 298, |
| 149305 | | - /* 280 */ 255, 206, 207, 19, 272, 59, 206, 207, 184, 277, |
| 149306 | | - /* 290 */ 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, |
| 149307 | | - /* 300 */ 106, 184, 259, 19, 184, 100, 101, 43, 44, 45, |
| 149308 | | - /* 310 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, |
| 149309 | | - /* 320 */ 56, 57, 242, 206, 207, 184, 100, 101, 138, 292, |
| 149310 | | - /* 330 */ 293, 67, 76, 296, 108, 109, 110, 111, 295, 113, |
| 149311 | | - /* 340 */ 84, 59, 86, 22, 26, 89, 156, 121, 224, 225, |
| 149312 | | - /* 350 */ 145, 19, 147, 59, 72, 256, 24, 184, 290, 291, |
| 149313 | | - /* 360 */ 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, |
| 149314 | | - /* 370 */ 106, 145, 297, 147, 299, 43, 44, 45, 46, 47, |
| 149315 | | - /* 380 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, |
| 149316 | | - /* 390 */ 106, 109, 110, 111, 138, 184, 112, 113, 114, 115, |
| 149317 | | - /* 400 */ 116, 117, 118, 109, 110, 111, 112, 59, 124, 115, |
| 149318 | | - /* 410 */ 116, 117, 292, 293, 297, 298, 296, 206, 207, 125, |
| 149319 | | - /* 420 */ 72, 100, 101, 184, 46, 47, 48, 49, 96, 97, |
| 149320 | | - /* 430 */ 98, 99, 100, 101, 102, 103, 104, 105, 106, 59, |
| 149321 | | - /* 440 */ 200, 201, 202, 184, 59, 206, 207, 46, 19, 131, |
| 149322 | | - /* 450 */ 132, 278, 23, 242, 184, 184, 76, 109, 110, 111, |
| 149323 | | - /* 460 */ 224, 225, 251, 81, 84, 184, 86, 22, 23, 89, |
| 149324 | | - /* 470 */ 184, 26, 43, 44, 45, 46, 47, 48, 49, 50, |
| 149325 | | - /* 480 */ 51, 52, 53, 54, 55, 56, 57, 102, 184, 109, |
| 149326 | | - /* 490 */ 110, 111, 114, 184, 109, 110, 111, 184, 227, 184, |
| 149327 | | - /* 500 */ 230, 184, 22, 264, 195, 59, 22, 184, 195, 108, |
| 149328 | | - /* 510 */ 206, 207, 59, 131, 132, 206, 207, 184, 138, 206, |
| 149329 | | - /* 520 */ 207, 206, 207, 206, 207, 96, 97, 98, 99, 100, |
| 149330 | | - /* 530 */ 101, 102, 103, 104, 105, 106, 255, 228, 229, 59, |
| 149331 | | - /* 540 */ 95, 228, 229, 59, 184, 19, 242, 94, 184, 23, |
| 149332 | | - /* 550 */ 241, 242, 184, 282, 241, 242, 110, 242, 184, 242, |
| 149333 | | - /* 560 */ 251, 59, 109, 110, 196, 184, 251, 114, 251, 43, |
| 149334 | | - /* 570 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, |
| 149335 | | - /* 580 */ 54, 55, 56, 57, 259, 217, 12, 219, 255, 109, |
| 149336 | | - /* 590 */ 110, 111, 203, 109, 110, 111, 184, 22, 145, 146, |
| 149337 | | - /* 600 */ 147, 27, 112, 22, 230, 115, 116, 117, 227, 19, |
| 149338 | | - /* 610 */ 59, 109, 110, 111, 291, 125, 42, 35, 206, 207, |
| 149339 | | - /* 620 */ 295, 184, 96, 97, 98, 99, 100, 101, 102, 103, |
| 149340 | | - /* 630 */ 104, 105, 106, 26, 59, 233, 46, 63, 136, 184, |
| 149341 | | - /* 640 */ 59, 184, 19, 206, 207, 243, 23, 73, 66, 260, |
| 149342 | | - /* 650 */ 261, 262, 59, 184, 242, 195, 74, 220, 184, 184, |
| 149343 | | - /* 660 */ 109, 110, 111, 206, 207, 184, 43, 44, 45, 46, |
| 149344 | | - /* 670 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, |
| 149345 | | - /* 680 */ 57, 206, 207, 76, 109, 110, 111, 136, 228, 229, |
| 149346 | | - /* 690 */ 109, 110, 111, 86, 184, 220, 89, 21, 108, 230, |
| 149347 | | - /* 700 */ 184, 241, 109, 110, 111, 123, 184, 127, 184, 129, |
| 149348 | | - /* 710 */ 130, 184, 195, 184, 124, 184, 198, 199, 184, 96, |
| 149349 | | - /* 720 */ 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, |
| 149350 | | - /* 730 */ 206, 207, 11, 206, 207, 206, 207, 206, 207, 19, |
| 149351 | | - /* 740 */ 206, 207, 184, 23, 220, 228, 229, 220, 81, 220, |
| 149352 | | - /* 750 */ 195, 220, 287, 288, 220, 195, 80, 195, 241, 201, |
| 149353 | | - /* 760 */ 202, 184, 73, 43, 44, 45, 46, 47, 48, 49, |
| 149354 | | - /* 770 */ 50, 51, 52, 53, 54, 55, 56, 57, 201, 202, |
| 149355 | | - /* 780 */ 113, 195, 184, 228, 229, 120, 121, 122, 228, 229, |
| 149356 | | - /* 790 */ 228, 229, 116, 16, 23, 184, 241, 26, 131, 132, |
| 149357 | | - /* 800 */ 278, 241, 19, 241, 22, 23, 184, 189, 26, 120, |
| 149358 | | - /* 810 */ 121, 122, 184, 26, 228, 229, 96, 97, 98, 99, |
| 149359 | | - /* 820 */ 100, 101, 102, 103, 104, 105, 106, 241, 270, 153, |
| 149360 | | - /* 830 */ 66, 228, 229, 229, 206, 207, 19, 184, 228, 229, |
| 149361 | | - /* 840 */ 23, 16, 121, 122, 241, 241, 82, 270, 29, 227, |
| 149362 | | - /* 850 */ 252, 241, 33, 19, 77, 91, 79, 184, 22, 23, |
| 149363 | | - /* 860 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, |
| 149364 | | - /* 870 */ 53, 54, 55, 56, 57, 12, 184, 95, 184, 206, |
| 149365 | | - /* 880 */ 207, 76, 111, 184, 65, 267, 184, 184, 184, 271, |
| 149366 | | - /* 890 */ 27, 86, 109, 184, 89, 120, 121, 122, 206, 207, |
| 149367 | | - /* 900 */ 206, 207, 77, 139, 79, 42, 184, 136, 206, 207, |
| 149368 | | - /* 910 */ 206, 207, 184, 96, 97, 98, 99, 100, 101, 102, |
| 149369 | | - /* 920 */ 103, 104, 105, 106, 184, 138, 63, 184, 206, 207, |
| 149370 | | - /* 930 */ 153, 95, 184, 19, 206, 207, 227, 23, 7, 8, |
| 149371 | | - /* 940 */ 9, 293, 293, 109, 296, 296, 206, 207, 215, 206, |
| 149372 | | - /* 950 */ 207, 184, 253, 19, 206, 207, 253, 43, 44, 45, |
| 149373 | | - /* 960 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, |
| 149374 | | - /* 970 */ 56, 57, 184, 206, 207, 184, 184, 43, 44, 45, |
| 149375 | | - /* 980 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, |
| 149376 | | - /* 990 */ 56, 57, 184, 22, 23, 184, 59, 206, 207, 184, |
| 149377 | | - /* 1000 */ 184, 238, 184, 240, 184, 22, 184, 184, 157, 158, |
| 149378 | | - /* 1010 */ 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, |
| 149379 | | - /* 1020 */ 106, 206, 207, 184, 206, 207, 206, 207, 206, 207, |
| 149380 | | - /* 1030 */ 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, |
| 149381 | | - /* 1040 */ 106, 184, 59, 227, 252, 184, 293, 110, 184, 296, |
| 149382 | | - /* 1050 */ 184, 184, 184, 230, 184, 184, 184, 15, 184, 184, |
| 149383 | | - /* 1060 */ 184, 253, 184, 206, 207, 184, 95, 206, 207, 102, |
| 149384 | | - /* 1070 */ 206, 207, 206, 207, 206, 207, 206, 207, 206, 207, |
| 149385 | | - /* 1080 */ 206, 207, 206, 207, 184, 151, 184, 206, 207, 278, |
| 149386 | | - /* 1090 */ 184, 252, 184, 110, 184, 128, 184, 198, 199, 184, |
| 149387 | | - /* 1100 */ 133, 184, 60, 26, 184, 19, 206, 207, 206, 207, |
| 149388 | | - /* 1110 */ 131, 132, 206, 207, 206, 207, 206, 207, 206, 207, |
| 149389 | | - /* 1120 */ 253, 206, 207, 206, 207, 19, 206, 207, 253, 43, |
| 149390 | | - /* 1130 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, |
| 149391 | | - /* 1140 */ 54, 55, 56, 57, 184, 26, 184, 26, 184, 43, |
| 149392 | | - /* 1150 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, |
| 149393 | | - /* 1160 */ 54, 55, 56, 57, 285, 286, 206, 207, 206, 207, |
| 149394 | | - /* 1170 */ 206, 207, 184, 31, 184, 293, 184, 293, 296, 184, |
| 149395 | | - /* 1180 */ 296, 39, 96, 97, 98, 99, 100, 101, 102, 103, |
| 149396 | | - /* 1190 */ 104, 105, 106, 184, 206, 207, 206, 207, 206, 207, |
| 149397 | | - /* 1200 */ 184, 22, 96, 97, 98, 99, 100, 101, 102, 103, |
| 149398 | | - /* 1210 */ 104, 105, 106, 184, 245, 246, 184, 26, 23, 142, |
| 149399 | | - /* 1220 */ 128, 26, 206, 207, 150, 133, 152, 22, 22, 24, |
| 149400 | | - /* 1230 */ 111, 23, 53, 184, 26, 206, 207, 151, 206, 207, |
| 149401 | | - /* 1240 */ 119, 24, 122, 23, 23, 23, 26, 26, 26, 23, |
| 149402 | | - /* 1250 */ 23, 23, 26, 26, 26, 136, 23, 19, 22, 26, |
| 149403 | | - /* 1260 */ 113, 114, 24, 114, 144, 184, 59, 61, 7, 8, |
| 149404 | | - /* 1270 */ 59, 23, 23, 124, 26, 26, 23, 19, 145, 26, |
| 149405 | | - /* 1280 */ 147, 43, 44, 45, 46, 47, 48, 49, 50, 51, |
| 149406 | | - /* 1290 */ 52, 53, 54, 55, 56, 57, 145, 23, 147, 184, |
| 149407 | | - /* 1300 */ 26, 43, 44, 45, 46, 47, 48, 49, 50, 51, |
| 149408 | | - /* 1310 */ 52, 53, 54, 55, 56, 57, 23, 110, 184, 26, |
| 149409 | | - /* 1320 */ 184, 110, 184, 184, 184, 215, 135, 215, 184, 184, |
| 149410 | | - /* 1330 */ 184, 247, 184, 244, 96, 97, 98, 99, 100, 101, |
| 149411 | | - /* 1340 */ 102, 103, 104, 105, 106, 184, 184, 184, 301, 184, |
| 149412 | | - /* 1350 */ 184, 134, 225, 184, 96, 97, 98, 99, 100, 101, |
| 149413 | | - /* 1360 */ 102, 103, 104, 105, 106, 184, 184, 184, 184, 184, |
| 149414 | | - /* 1370 */ 134, 184, 274, 273, 19, 244, 244, 204, 182, 244, |
| 149415 | | - /* 1380 */ 283, 231, 279, 279, 232, 244, 210, 209, 235, 235, |
| 149416 | | - /* 1390 */ 235, 248, 218, 234, 19, 209, 238, 209, 238, 44, |
| 149417 | | - /* 1400 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, |
| 149418 | | - /* 1410 */ 55, 56, 57, 214, 60, 248, 248, 187, 134, 38, |
| 149419 | | - /* 1420 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, |
| 149420 | | - /* 1430 */ 55, 56, 57, 232, 191, 191, 266, 280, 191, 283, |
| 149421 | | - /* 1440 */ 143, 269, 108, 22, 280, 19, 20, 258, 22, 257, |
| 149422 | | - /* 1450 */ 43, 96, 97, 98, 99, 100, 101, 102, 103, 104, |
| 149423 | | - /* 1460 */ 105, 106, 36, 223, 142, 18, 235, 226, 226, 191, |
| 149424 | | - /* 1470 */ 18, 96, 97, 98, 99, 100, 101, 102, 103, 104, |
| 149425 | | - /* 1480 */ 105, 106, 226, 226, 190, 59, 235, 235, 223, 223, |
| 149426 | | - /* 1490 */ 258, 257, 191, 190, 235, 150, 62, 71, 191, 276, |
| 149427 | | - /* 1500 */ 275, 19, 20, 190, 22, 22, 211, 81, 191, 190, |
| 149428 | | - /* 1510 */ 211, 191, 108, 190, 208, 64, 208, 208, 36, 119, |
| 149429 | | - /* 1520 */ 94, 216, 211, 208, 210, 106, 100, 101, 216, 208, |
| 149430 | | - /* 1530 */ 48, 268, 208, 107, 208, 109, 110, 111, 211, 268, |
| 149431 | | - /* 1540 */ 114, 59, 211, 137, 108, 88, 250, 249, 191, 141, |
| 149432 | | - /* 1550 */ 250, 249, 138, 71, 250, 300, 22, 131, 132, 249, |
| 149433 | | - /* 1560 */ 300, 191, 150, 238, 82, 140, 250, 249, 239, 87, |
| 149434 | | - /* 1570 */ 139, 145, 146, 147, 148, 149, 94, 239, 237, 236, |
| 149435 | | - /* 1580 */ 25, 235, 100, 101, 194, 26, 193, 13, 185, 107, |
| 149436 | | - /* 1590 */ 185, 109, 110, 111, 6, 263, 114, 203, 265, 183, |
| 149437 | | - /* 1600 */ 183, 183, 203, 212, 203, 203, 197, 197, 212, 4, |
| 149438 | | - /* 1610 */ 3, 22, 197, 155, 15, 204, 203, 289, 93, 289, |
| 149439 | | - /* 1620 */ 16, 286, 132, 23, 204, 23, 123, 145, 146, 147, |
| 149440 | | - /* 1630 */ 148, 149, 0, 1, 2, 143, 24, 5, 20, 135, |
| 149441 | | - /* 1640 */ 16, 1, 10, 11, 12, 13, 14, 137, 135, 17, |
| 149442 | | - /* 1650 */ 144, 123, 19, 20, 61, 22, 37, 143, 123, 53, |
| 149443 | | - /* 1660 */ 109, 53, 30, 53, 32, 34, 53, 134, 1, 36, |
| 149444 | | - /* 1670 */ 5, 22, 40, 108, 153, 41, 26, 68, 75, 68, |
| 149445 | | - /* 1680 */ 134, 108, 24, 20, 124, 19, 118, 67, 67, 28, |
| 149446 | | - /* 1690 */ 22, 22, 59, 22, 67, 23, 22, 22, 142, 37, |
| 149447 | | - /* 1700 */ 23, 22, 70, 23, 71, 157, 23, 23, 26, 23, |
| 149448 | | - /* 1710 */ 78, 22, 24, 81, 23, 82, 22, 24, 134, 23, |
| 149449 | | - /* 1720 */ 87, 23, 19, 20, 92, 22, 109, 94, 22, 34, |
| 149450 | | - /* 1730 */ 136, 26, 85, 100, 101, 34, 34, 83, 34, 36, |
| 149451 | | - /* 1740 */ 107, 34, 109, 110, 111, 75, 90, 114, 75, 34, |
| 149452 | | - /* 1750 */ 23, 22, 44, 34, 24, 23, 22, 26, 126, 26, |
| 149453 | | - /* 1760 */ 23, 23, 59, 131, 132, 23, 23, 26, 23, 11, |
| 149454 | | - /* 1770 */ 22, 22, 26, 23, 71, 23, 22, 22, 145, 146, |
| 149455 | | - /* 1780 */ 147, 148, 149, 128, 23, 82, 154, 134, 15, 1, |
| 149456 | | - /* 1790 */ 87, 134, 302, 134, 134, 302, 302, 94, 302, 302, |
| 149457 | | - /* 1800 */ 302, 302, 302, 100, 101, 302, 302, 302, 302, 302, |
| 149458 | | - /* 1810 */ 107, 302, 109, 110, 111, 1, 2, 114, 302, 5, |
| 149459 | | - /* 1820 */ 302, 302, 302, 302, 10, 11, 12, 13, 14, 302, |
| 149460 | | - /* 1830 */ 302, 17, 302, 302, 302, 302, 19, 20, 302, 22, |
| 149461 | | - /* 1840 */ 302, 302, 302, 302, 30, 302, 32, 302, 145, 146, |
| 149462 | | - /* 1850 */ 147, 148, 149, 36, 40, 302, 302, 302, 302, 302, |
| 149463 | | - /* 1860 */ 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, |
| 149464 | | - /* 1870 */ 302, 302, 302, 302, 302, 302, 59, 302, 302, 302, |
| 149465 | | - /* 1880 */ 302, 302, 302, 302, 70, 302, 302, 302, 71, 302, |
| 149466 | | - /* 1890 */ 302, 302, 78, 302, 302, 81, 19, 20, 302, 22, |
| 149467 | | - /* 1900 */ 302, 302, 302, 302, 302, 302, 92, 302, 302, 302, |
| 149468 | | - /* 1910 */ 302, 94, 302, 36, 302, 302, 302, 100, 101, 102, |
| 149469 | | - /* 1920 */ 302, 302, 302, 302, 107, 302, 109, 110, 111, 302, |
| 149470 | | - /* 1930 */ 302, 114, 302, 302, 302, 302, 59, 302, 302, 302, |
| 149471 | | - /* 1940 */ 126, 302, 302, 302, 302, 131, 132, 302, 71, 302, |
| 149472 | | - /* 1950 */ 302, 302, 302, 302, 302, 302, 19, 20, 302, 22, |
| 149473 | | - /* 1960 */ 302, 302, 145, 146, 147, 148, 149, 302, 154, 302, |
| 149474 | | - /* 1970 */ 302, 94, 302, 36, 302, 302, 302, 100, 101, 302, |
| 149475 | | - /* 1980 */ 302, 302, 302, 302, 107, 302, 109, 110, 111, 302, |
| 149476 | | - /* 1990 */ 302, 114, 5, 302, 302, 302, 59, 10, 11, 12, |
| 149477 | | - /* 2000 */ 13, 14, 302, 302, 17, 302, 302, 302, 71, 302, |
| 149478 | | - /* 2010 */ 302, 302, 302, 302, 302, 302, 302, 30, 302, 32, |
| 149479 | | - /* 2020 */ 302, 302, 145, 146, 147, 148, 149, 40, 302, 302, |
| 149480 | | - /* 2030 */ 302, 94, 302, 302, 302, 302, 302, 100, 101, 302, |
| 149481 | | - /* 2040 */ 302, 302, 302, 302, 107, 302, 109, 110, 111, 302, |
| 149482 | | - /* 2050 */ 302, 114, 302, 302, 302, 302, 302, 70, 302, 302, |
| 149483 | | - /* 2060 */ 302, 302, 302, 302, 302, 78, 302, 302, 81, 302, |
| 149484 | | - /* 2070 */ 302, 302, 302, 302, 302, 302, 302, 302, 302, 92, |
| 149485 | | - /* 2080 */ 302, 302, 145, 146, 147, 148, 149, 302, 302, 302, |
| 149486 | | - /* 2090 */ 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, |
| 149487 | | - /* 2100 */ 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, |
| 149488 | | - /* 2110 */ 302, 302, 302, 126, 302, 302, 302, 302, 131, 132, |
| 149489 | | - /* 2120 */ 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, |
| 149490 | | - /* 2130 */ 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, |
| 149491 | | - /* 2140 */ 302, 154, 302, 302, 302, 302, 302, 302, 302, 302, |
| 149492 | | - /* 2150 */ 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, |
| 149493 | | - /* 2160 */ 302, 302, 302, 302, 302, 302, 302, 302, 302, |
| 149494 | | -}; |
| 149495 | | -#define YY_SHIFT_COUNT (539) |
| 150002 | + /* 0 */ 187, 187, 187, 216, 217, 187, 206, 187, 264, 265, |
| 150003 | + /* 10 */ 266, 187, 225, 187, 209, 187, 264, 265, 266, 19, |
| 150004 | + /* 20 */ 187, 187, 209, 210, 209, 210, 187, 209, 210, 209, |
| 150005 | + /* 30 */ 210, 31, 209, 209, 210, 209, 210, 285, 224, 39, |
| 150006 | + /* 40 */ 203, 204, 205, 43, 44, 45, 46, 47, 48, 49, |
| 150007 | + /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 230, 19, |
| 150008 | + /* 60 */ 181, 182, 183, 184, 230, 245, 233, 208, 189, 245, |
| 150009 | + /* 70 */ 191, 245, 26, 206, 254, 216, 276, 198, 254, 198, |
| 150010 | + /* 80 */ 254, 281, 187, 43, 44, 45, 46, 47, 48, 49, |
| 150011 | + /* 90 */ 50, 51, 52, 53, 54, 55, 56, 57, 259, 99, |
| 150012 | + /* 100 */ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, |
| 150013 | + /* 110 */ 231, 232, 231, 232, 286, 302, 303, 302, 22, 304, |
| 150014 | + /* 120 */ 302, 303, 76, 244, 11, 244, 86, 19, 88, 248, |
| 150015 | + /* 130 */ 249, 264, 265, 266, 26, 89, 198, 258, 92, 99, |
| 150016 | + /* 140 */ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, |
| 150017 | + /* 150 */ 105, 43, 44, 45, 46, 47, 48, 49, 50, 51, |
| 150018 | + /* 160 */ 52, 53, 54, 55, 56, 57, 212, 288, 273, 231, |
| 150019 | + /* 170 */ 232, 105, 106, 107, 108, 109, 131, 69, 203, 204, |
| 150020 | + /* 180 */ 205, 136, 244, 99, 100, 101, 102, 103, 104, 105, |
| 150021 | + /* 190 */ 106, 107, 108, 109, 15, 103, 104, 19, 260, 103, |
| 150022 | + /* 200 */ 104, 54, 55, 56, 57, 58, 22, 99, 100, 101, |
| 150023 | + /* 210 */ 102, 103, 104, 105, 106, 107, 108, 109, 264, 265, |
| 150024 | + /* 220 */ 266, 43, 44, 45, 46, 47, 48, 49, 50, 51, |
| 150025 | + /* 230 */ 52, 53, 54, 55, 56, 57, 19, 124, 125, 60, |
| 150026 | + /* 240 */ 148, 24, 150, 59, 187, 67, 99, 100, 101, 102, |
| 150027 | + /* 250 */ 103, 104, 105, 106, 107, 108, 109, 187, 187, 109, |
| 150028 | + /* 260 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, |
| 150029 | + /* 270 */ 53, 54, 55, 56, 57, 204, 205, 99, 100, 101, |
| 150030 | + /* 280 */ 102, 103, 104, 105, 106, 107, 108, 109, 103, 104, |
| 150031 | + /* 290 */ 105, 106, 107, 108, 109, 59, 112, 113, 114, 76, |
| 150032 | + /* 300 */ 231, 232, 187, 19, 19, 22, 23, 23, 54, 55, |
| 150033 | + /* 310 */ 56, 57, 89, 244, 199, 92, 99, 100, 101, 102, |
| 150034 | + /* 320 */ 103, 104, 105, 106, 107, 108, 109, 43, 44, 45, |
| 150035 | + /* 330 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, |
| 150036 | + /* 340 */ 56, 57, 19, 212, 187, 274, 23, 26, 112, 113, |
| 150037 | + /* 350 */ 114, 294, 295, 99, 100, 101, 102, 103, 104, 105, |
| 150038 | + /* 360 */ 106, 107, 108, 109, 59, 295, 43, 44, 45, 46, |
| 150039 | + /* 370 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, |
| 150040 | + /* 380 */ 57, 98, 146, 99, 100, 101, 102, 103, 104, 105, |
| 150041 | + /* 390 */ 106, 107, 108, 109, 109, 264, 265, 266, 187, 187, |
| 150042 | + /* 400 */ 115, 116, 117, 118, 119, 120, 121, 73, 59, 19, |
| 150043 | + /* 410 */ 105, 23, 127, 23, 26, 81, 259, 112, 113, 114, |
| 150044 | + /* 420 */ 187, 72, 99, 100, 101, 102, 103, 104, 105, 106, |
| 150045 | + /* 430 */ 107, 108, 109, 43, 44, 45, 46, 47, 48, 49, |
| 150046 | + /* 440 */ 50, 51, 52, 53, 54, 55, 56, 57, 19, 124, |
| 150047 | + /* 450 */ 125, 182, 23, 184, 187, 134, 135, 123, 189, 131, |
| 150048 | + /* 460 */ 191, 112, 113, 114, 136, 187, 233, 198, 134, 135, |
| 150049 | + /* 470 */ 198, 259, 43, 44, 45, 46, 47, 48, 49, 50, |
| 150050 | + /* 480 */ 51, 52, 53, 54, 55, 56, 57, 209, 210, 99, |
| 150051 | + /* 490 */ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, |
| 150052 | + /* 500 */ 231, 232, 206, 231, 232, 187, 59, 296, 297, 76, |
| 150053 | + /* 510 */ 160, 161, 301, 244, 232, 19, 244, 297, 59, 23, |
| 150054 | + /* 520 */ 87, 301, 89, 245, 26, 92, 244, 258, 99, 100, |
| 150055 | + /* 530 */ 101, 102, 103, 104, 105, 106, 107, 108, 109, 43, |
| 150056 | + /* 540 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, |
| 150057 | + /* 550 */ 54, 55, 56, 57, 19, 187, 97, 288, 23, 112, |
| 150058 | + /* 560 */ 113, 114, 115, 296, 297, 118, 119, 120, 301, 108, |
| 150059 | + /* 570 */ 109, 112, 113, 255, 141, 128, 117, 281, 43, 44, |
| 150060 | + /* 580 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, |
| 150061 | + /* 590 */ 55, 56, 57, 187, 187, 99, 100, 101, 102, 103, |
| 150062 | + /* 600 */ 104, 105, 106, 107, 108, 109, 26, 148, 149, 150, |
| 150063 | + /* 610 */ 115, 97, 59, 118, 119, 120, 209, 210, 73, 59, |
| 150064 | + /* 620 */ 122, 19, 209, 128, 256, 72, 187, 113, 187, 81, |
| 150065 | + /* 630 */ 223, 117, 227, 228, 99, 100, 101, 102, 103, 104, |
| 150066 | + /* 640 */ 105, 106, 107, 108, 109, 43, 44, 45, 46, 47, |
| 150067 | + /* 650 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, |
| 150068 | + /* 660 */ 19, 255, 148, 149, 150, 112, 113, 114, 123, 124, |
| 150069 | + /* 670 */ 125, 230, 112, 113, 114, 22, 297, 22, 81, 22, |
| 150070 | + /* 680 */ 301, 59, 134, 135, 43, 44, 45, 46, 47, 48, |
| 150071 | + /* 690 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 139, |
| 150072 | + /* 700 */ 192, 99, 100, 101, 102, 103, 104, 105, 106, 107, |
| 150073 | + /* 710 */ 108, 109, 59, 116, 59, 187, 59, 231, 232, 46, |
| 150074 | + /* 720 */ 47, 48, 49, 16, 12, 145, 198, 22, 187, 187, |
| 150075 | + /* 730 */ 244, 134, 135, 222, 112, 113, 114, 209, 210, 27, |
| 150076 | + /* 740 */ 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, |
| 150077 | + /* 750 */ 109, 209, 210, 187, 42, 187, 154, 227, 228, 231, |
| 150078 | + /* 760 */ 232, 139, 22, 23, 59, 112, 113, 114, 113, 112, |
| 150079 | + /* 770 */ 113, 114, 244, 245, 233, 63, 19, 209, 210, 271, |
| 150080 | + /* 780 */ 187, 24, 254, 275, 77, 73, 79, 245, 195, 260, |
| 150081 | + /* 790 */ 117, 223, 199, 22, 23, 154, 19, 26, 22, 187, |
| 150082 | + /* 800 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, |
| 150083 | + /* 810 */ 53, 54, 55, 56, 57, 19, 187, 112, 113, 114, |
| 150084 | + /* 820 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, |
| 150085 | + /* 830 */ 53, 54, 55, 56, 57, 59, 263, 187, 98, 43, |
| 150086 | + /* 840 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, |
| 150087 | + /* 850 */ 54, 55, 56, 57, 204, 205, 99, 100, 101, 102, |
| 150088 | + /* 860 */ 103, 104, 105, 106, 107, 108, 109, 255, 130, 98, |
| 150089 | + /* 870 */ 132, 133, 299, 300, 198, 187, 99, 100, 101, 102, |
| 150090 | + /* 880 */ 103, 104, 105, 106, 107, 108, 109, 187, 112, 113, |
| 150091 | + /* 890 */ 114, 187, 241, 187, 243, 99, 100, 101, 102, 103, |
| 150092 | + /* 900 */ 104, 105, 106, 107, 108, 109, 19, 231, 232, 209, |
| 150093 | + /* 910 */ 210, 282, 59, 209, 210, 209, 210, 16, 230, 19, |
| 150094 | + /* 920 */ 244, 22, 23, 223, 274, 26, 19, 223, 187, 223, |
| 150095 | + /* 930 */ 198, 44, 45, 46, 47, 48, 49, 50, 51, 52, |
| 150096 | + /* 940 */ 53, 54, 55, 56, 57, 45, 46, 47, 48, 49, |
| 150097 | + /* 950 */ 50, 51, 52, 53, 54, 55, 56, 57, 19, 20, |
| 150098 | + /* 960 */ 187, 22, 187, 231, 232, 112, 113, 114, 123, 124, |
| 150099 | + /* 970 */ 125, 7, 8, 9, 187, 36, 244, 24, 77, 21, |
| 150100 | + /* 980 */ 79, 187, 209, 210, 187, 263, 99, 100, 101, 102, |
| 150101 | + /* 990 */ 103, 104, 105, 106, 107, 108, 109, 98, 59, 99, |
| 150102 | + /* 1000 */ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, |
| 150103 | + /* 1010 */ 71, 187, 59, 187, 187, 19, 20, 187, 22, 112, |
| 150104 | + /* 1020 */ 81, 299, 300, 282, 230, 199, 291, 292, 22, 187, |
| 150105 | + /* 1030 */ 24, 256, 36, 209, 210, 187, 97, 35, 80, 209, |
| 150106 | + /* 1040 */ 210, 268, 103, 104, 48, 187, 220, 223, 222, 110, |
| 150107 | + /* 1050 */ 59, 112, 113, 114, 187, 59, 117, 156, 187, 179, |
| 150108 | + /* 1060 */ 180, 181, 182, 183, 184, 59, 113, 71, 66, 189, |
| 150109 | + /* 1070 */ 22, 191, 230, 134, 135, 245, 74, 119, 198, 282, |
| 150110 | + /* 1080 */ 297, 85, 224, 198, 301, 187, 90, 148, 149, 150, |
| 150111 | + /* 1090 */ 151, 152, 19, 97, 103, 104, 123, 124, 125, 103, |
| 150112 | + /* 1100 */ 104, 53, 111, 112, 113, 114, 110, 116, 112, 113, |
| 150113 | + /* 1110 */ 114, 231, 232, 117, 156, 124, 231, 232, 297, 113, |
| 150114 | + /* 1120 */ 187, 24, 301, 256, 244, 201, 202, 256, 126, 244, |
| 150115 | + /* 1130 */ 187, 198, 187, 187, 23, 187, 187, 26, 258, 148, |
| 150116 | + /* 1140 */ 19, 150, 209, 210, 148, 149, 150, 151, 152, 0, |
| 150117 | + /* 1150 */ 1, 2, 209, 210, 5, 209, 210, 209, 210, 10, |
| 150118 | + /* 1160 */ 11, 12, 13, 14, 231, 232, 17, 46, 288, 19, |
| 150119 | + /* 1170 */ 20, 223, 22, 236, 198, 66, 187, 244, 245, 30, |
| 150120 | + /* 1180 */ 12, 32, 198, 246, 59, 112, 36, 187, 245, 40, |
| 150121 | + /* 1190 */ 198, 245, 117, 29, 85, 27, 26, 33, 209, 210, |
| 150122 | + /* 1200 */ 297, 76, 127, 94, 301, 256, 26, 231, 232, 59, |
| 150123 | + /* 1210 */ 42, 153, 87, 155, 89, 231, 232, 92, 31, 70, |
| 150124 | + /* 1220 */ 244, 71, 26, 231, 232, 114, 39, 78, 244, 65, |
| 150125 | + /* 1230 */ 81, 63, 111, 233, 137, 85, 244, 112, 113, 114, |
| 150126 | + /* 1240 */ 90, 22, 59, 24, 95, 201, 202, 97, 127, 187, |
| 150127 | + /* 1250 */ 139, 142, 187, 103, 104, 19, 20, 187, 22, 187, |
| 150128 | + /* 1260 */ 110, 187, 112, 113, 114, 187, 141, 117, 141, 187, |
| 150129 | + /* 1270 */ 23, 187, 36, 26, 209, 210, 134, 135, 129, 209, |
| 150130 | + /* 1280 */ 210, 209, 210, 134, 135, 22, 159, 209, 210, 187, |
| 150131 | + /* 1290 */ 187, 209, 210, 209, 210, 59, 113, 187, 148, 149, |
| 150132 | + /* 1300 */ 150, 151, 152, 289, 290, 187, 157, 71, 248, 249, |
| 150133 | + /* 1310 */ 114, 141, 209, 210, 46, 125, 116, 117, 138, 19, |
| 150134 | + /* 1320 */ 20, 85, 22, 148, 61, 150, 90, 209, 210, 23, |
| 150135 | + /* 1330 */ 7, 8, 26, 97, 187, 139, 36, 147, 59, 103, |
| 150136 | + /* 1340 */ 104, 19, 20, 187, 22, 59, 110, 187, 112, 113, |
| 150137 | + /* 1350 */ 114, 1, 2, 117, 187, 5, 209, 210, 36, 59, |
| 150138 | + /* 1360 */ 10, 11, 12, 13, 14, 209, 210, 17, 59, 209, |
| 150139 | + /* 1370 */ 210, 71, 187, 148, 250, 150, 209, 210, 187, 111, |
| 150140 | + /* 1380 */ 30, 59, 32, 22, 148, 149, 150, 151, 152, 187, |
| 150141 | + /* 1390 */ 40, 187, 113, 71, 209, 210, 187, 97, 187, 113, |
| 150142 | + /* 1400 */ 209, 210, 187, 103, 104, 105, 23, 187, 187, 26, |
| 150143 | + /* 1410 */ 110, 187, 112, 113, 114, 83, 84, 117, 23, 97, |
| 150144 | + /* 1420 */ 70, 26, 113, 218, 187, 103, 104, 187, 78, 209, |
| 150145 | + /* 1430 */ 210, 81, 110, 187, 112, 113, 114, 19, 20, 117, |
| 150146 | + /* 1440 */ 22, 187, 187, 187, 187, 95, 209, 210, 148, 149, |
| 150147 | + /* 1450 */ 150, 151, 152, 187, 36, 23, 187, 187, 26, 187, |
| 150148 | + /* 1460 */ 187, 187, 187, 209, 210, 209, 210, 187, 187, 218, |
| 150149 | + /* 1470 */ 148, 149, 150, 151, 152, 209, 210, 59, 187, 129, |
| 150150 | + /* 1480 */ 187, 209, 210, 187, 134, 135, 187, 306, 187, 71, |
| 150151 | + /* 1490 */ 209, 210, 23, 228, 187, 26, 23, 187, 137, 26, |
| 150152 | + /* 1500 */ 209, 210, 209, 210, 187, 209, 210, 157, 209, 210, |
| 150153 | + /* 1510 */ 209, 210, 218, 187, 187, 97, 209, 210, 187, 278, |
| 150154 | + /* 1520 */ 23, 103, 104, 26, 187, 187, 187, 187, 110, 187, |
| 150155 | + /* 1530 */ 112, 113, 114, 187, 187, 117, 5, 247, 187, 187, |
| 150156 | + /* 1540 */ 187, 10, 11, 12, 13, 14, 209, 210, 17, 209, |
| 150157 | + /* 1550 */ 210, 209, 210, 187, 187, 187, 209, 210, 187, 23, |
| 150158 | + /* 1560 */ 187, 30, 26, 32, 187, 187, 148, 149, 150, 151, |
| 150159 | + /* 1570 */ 152, 40, 187, 187, 187, 209, 210, 209, 210, 187, |
| 150160 | + /* 1580 */ 209, 210, 209, 210, 187, 187, 209, 210, 187, 277, |
| 150161 | + /* 1590 */ 234, 187, 247, 187, 209, 210, 209, 210, 187, 235, |
| 150162 | + /* 1600 */ 187, 70, 187, 207, 247, 247, 247, 209, 210, 78, |
| 150163 | + /* 1610 */ 209, 210, 81, 209, 210, 209, 210, 187, 185, 238, |
| 150164 | + /* 1620 */ 209, 210, 209, 210, 209, 210, 95, 251, 287, 238, |
| 150165 | + /* 1630 */ 251, 23, 23, 23, 26, 26, 26, 283, 23, 209, |
| 150166 | + /* 1640 */ 210, 26, 213, 238, 221, 283, 212, 212, 217, 212, |
| 150167 | + /* 1650 */ 251, 241, 270, 241, 237, 235, 190, 60, 137, 287, |
| 150168 | + /* 1660 */ 129, 194, 194, 38, 284, 134, 135, 273, 284, 194, |
| 150169 | + /* 1670 */ 146, 111, 22, 43, 226, 145, 262, 261, 238, 18, |
| 150170 | + /* 1680 */ 229, 229, 229, 229, 194, 18, 193, 238, 157, 262, |
| 150171 | + /* 1690 */ 226, 226, 194, 238, 238, 193, 153, 261, 62, 280, |
| 150172 | + /* 1700 */ 279, 194, 193, 22, 194, 214, 193, 111, 194, 193, |
| 150173 | + /* 1710 */ 214, 211, 211, 64, 211, 211, 122, 211, 219, 214, |
| 150174 | + /* 1720 */ 109, 213, 160, 211, 300, 140, 211, 253, 111, 272, |
| 150175 | + /* 1730 */ 219, 214, 272, 214, 252, 194, 253, 252, 91, 253, |
| 150176 | + /* 1740 */ 252, 82, 253, 305, 252, 144, 305, 141, 22, 194, |
| 150177 | + /* 1750 */ 269, 257, 257, 153, 267, 143, 142, 25, 197, 26, |
| 150178 | + /* 1760 */ 242, 241, 196, 240, 242, 239, 238, 13, 188, 188, |
| 150179 | + /* 1770 */ 6, 293, 186, 186, 186, 200, 206, 293, 206, 206, |
| 150180 | + /* 1780 */ 206, 4, 200, 215, 215, 207, 207, 3, 22, 206, |
| 150181 | + /* 1790 */ 200, 158, 96, 15, 23, 16, 23, 135, 146, 126, |
| 150182 | + /* 1800 */ 24, 138, 20, 16, 140, 1, 138, 147, 126, 61, |
| 150183 | + /* 1810 */ 53, 37, 146, 53, 53, 290, 53, 126, 112, 34, |
| 150184 | + /* 1820 */ 137, 1, 5, 22, 111, 156, 68, 68, 26, 41, |
| 150185 | + /* 1830 */ 75, 137, 111, 24, 20, 19, 127, 121, 23, 67, |
| 150186 | + /* 1840 */ 22, 22, 67, 22, 22, 37, 22, 67, 23, 145, |
| 150187 | + /* 1850 */ 22, 28, 23, 23, 23, 137, 23, 22, 26, 22, |
| 150188 | + /* 1860 */ 24, 23, 112, 24, 23, 23, 22, 139, 34, 26, |
| 150189 | + /* 1870 */ 75, 88, 86, 75, 34, 23, 22, 24, 22, 34, |
| 150190 | + /* 1880 */ 34, 34, 93, 34, 26, 26, 23, 23, 23, 34, |
| 150191 | + /* 1890 */ 23, 23, 44, 23, 11, 26, 22, 22, 26, 23, |
| 150192 | + /* 1900 */ 23, 22, 22, 15, 137, 137, 137, 137, 23, 1, |
| 150193 | + /* 1910 */ 307, 307, 131, 307, 307, 307, 307, 307, 307, 307, |
| 150194 | + /* 1920 */ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, |
| 150195 | + /* 1930 */ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, |
| 150196 | + /* 1940 */ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, |
| 150197 | + /* 1950 */ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, |
| 150198 | + /* 1960 */ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, |
| 150199 | + /* 1970 */ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, |
| 150200 | + /* 1980 */ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, |
| 150201 | + /* 1990 */ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, |
| 150202 | + /* 2000 */ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, |
| 150203 | + /* 2010 */ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, |
| 150204 | + /* 2020 */ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, |
| 150205 | + /* 2030 */ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, |
| 150206 | + /* 2040 */ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, |
| 150207 | + /* 2050 */ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, |
| 150208 | + /* 2060 */ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, |
| 150209 | + /* 2070 */ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, |
| 150210 | + /* 2080 */ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, |
| 150211 | + /* 2090 */ 307, 307, |
| 150212 | +}; |
| 150213 | +#define YY_SHIFT_COUNT (542) |
| 149496 | 150214 | #define YY_SHIFT_MIN (0) |
| 149497 | | -#define YY_SHIFT_MAX (1987) |
| 150215 | +#define YY_SHIFT_MAX (1908) |
| 149498 | 150216 | static const unsigned short int yy_shift_ofst[] = { |
| 149499 | | - /* 0 */ 1814, 1632, 1987, 1426, 1426, 382, 1482, 1633, 1703, 1877, |
| 149500 | | - /* 10 */ 1877, 1877, 85, 0, 0, 264, 1106, 1877, 1877, 1877, |
| 149501 | | - /* 20 */ 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, |
| 149502 | | - /* 30 */ 226, 226, 380, 380, 294, 667, 382, 382, 382, 382, |
| 149503 | | - /* 40 */ 382, 382, 97, 194, 332, 429, 526, 623, 720, 817, |
| 149504 | | - /* 50 */ 914, 934, 1086, 1238, 1106, 1106, 1106, 1106, 1106, 1106, |
| 149505 | | - /* 60 */ 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, |
| 149506 | | - /* 70 */ 1106, 1106, 1258, 1106, 1355, 1375, 1375, 1817, 1877, 1877, |
| 149507 | | - /* 80 */ 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, |
| 149508 | | - /* 90 */ 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, |
| 149509 | | - /* 100 */ 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, |
| 149510 | | - /* 110 */ 1937, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, |
| 149511 | | - /* 120 */ 1877, 1877, 1877, 1877, 32, 129, 129, 129, 129, 129, |
| 149512 | | - /* 130 */ 171, 7, 17, 593, 676, 590, 593, 205, 205, 593, |
| 149513 | | - /* 140 */ 318, 318, 318, 318, 50, 152, 51, 2142, 2142, 284, |
| 149514 | | - /* 150 */ 284, 284, 65, 145, 282, 145, 145, 574, 574, 256, |
| 149515 | | - /* 160 */ 348, 445, 782, 593, 593, 593, 593, 593, 593, 593, |
| 149516 | | - /* 170 */ 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, |
| 149517 | | - /* 180 */ 593, 593, 593, 593, 607, 607, 593, 721, 805, 805, |
| 149518 | | - /* 190 */ 446, 851, 851, 446, 190, 979, 2142, 2142, 2142, 453, |
| 149519 | | - /* 200 */ 45, 45, 480, 490, 484, 385, 575, 502, 551, 581, |
| 149520 | | - /* 210 */ 593, 593, 593, 593, 593, 593, 593, 593, 593, 689, |
| 149521 | | - /* 220 */ 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, |
| 149522 | | - /* 230 */ 593, 593, 582, 582, 582, 593, 593, 593, 593, 771, |
| 149523 | | - /* 240 */ 593, 593, 593, 59, 764, 593, 593, 863, 593, 593, |
| 149524 | | - /* 250 */ 593, 593, 593, 593, 593, 593, 665, 819, 580, 16, |
| 149525 | | - /* 260 */ 16, 16, 16, 1119, 580, 580, 967, 321, 931, 1042, |
| 149526 | | - /* 270 */ 1077, 783, 783, 834, 1077, 1077, 834, 1121, 1195, 401, |
| 149527 | | - /* 280 */ 1142, 1142, 1142, 783, 787, 787, 1074, 1191, 1092, 1205, |
| 149528 | | - /* 290 */ 1354, 1284, 1284, 1381, 1381, 1284, 1297, 1334, 1421, 1407, |
| 149529 | | - /* 300 */ 1322, 1447, 1447, 1447, 1447, 1284, 1452, 1322, 1322, 1334, |
| 149530 | | - /* 310 */ 1421, 1407, 1407, 1322, 1284, 1452, 1345, 1434, 1284, 1452, |
| 149531 | | - /* 320 */ 1483, 1284, 1452, 1284, 1452, 1483, 1404, 1404, 1404, 1451, |
| 149532 | | - /* 330 */ 1483, 1404, 1400, 1404, 1451, 1404, 1404, 1483, 1419, 1419, |
| 149533 | | - /* 340 */ 1483, 1406, 1436, 1406, 1436, 1406, 1436, 1406, 1436, 1284, |
| 149534 | | - /* 350 */ 1457, 1457, 1408, 1414, 1534, 1284, 1412, 1408, 1425, 1431, |
| 149535 | | - /* 360 */ 1322, 1555, 1559, 1574, 1574, 1588, 1588, 1588, 2142, 2142, |
| 149536 | | - /* 370 */ 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, |
| 149537 | | - /* 380 */ 2142, 2142, 2142, 378, 777, 836, 971, 825, 775, 983, |
| 149538 | | - /* 390 */ 1208, 1179, 1217, 1120, 1220, 1206, 1221, 1222, 1226, 1227, |
| 149539 | | - /* 400 */ 1228, 1233, 937, 1147, 1261, 1149, 1207, 1248, 1249, 1253, |
| 149540 | | - /* 410 */ 1133, 1151, 1274, 1293, 1211, 1236, 1605, 1607, 1589, 1458, |
| 149541 | | - /* 420 */ 1599, 1525, 1604, 1600, 1602, 1490, 1492, 1503, 1612, 1504, |
| 149542 | | - /* 430 */ 1618, 1510, 1624, 1640, 1513, 1506, 1528, 1593, 1619, 1514, |
| 149543 | | - /* 440 */ 1606, 1608, 1610, 1613, 1535, 1551, 1631, 1533, 1667, 1665, |
| 149544 | | - /* 450 */ 1649, 1565, 1521, 1609, 1650, 1611, 1603, 1634, 1546, 1573, |
| 149545 | | - /* 460 */ 1658, 1663, 1666, 1560, 1568, 1668, 1620, 1669, 1671, 1672, |
| 149546 | | - /* 470 */ 1674, 1621, 1661, 1675, 1627, 1662, 1677, 1556, 1679, 1680, |
| 149547 | | - /* 480 */ 1548, 1683, 1684, 1682, 1686, 1689, 1688, 1691, 1694, 1693, |
| 149548 | | - /* 490 */ 1584, 1696, 1698, 1617, 1695, 1706, 1594, 1705, 1701, 1702, |
| 149549 | | - /* 500 */ 1704, 1707, 1647, 1670, 1654, 1708, 1673, 1656, 1715, 1727, |
| 149550 | | - /* 510 */ 1729, 1730, 1731, 1733, 1719, 1732, 1705, 1737, 1738, 1742, |
| 149551 | | - /* 520 */ 1743, 1741, 1745, 1734, 1758, 1748, 1749, 1750, 1752, 1754, |
| 149552 | | - /* 530 */ 1755, 1746, 1655, 1653, 1657, 1659, 1660, 1761, 1773, 1788, |
| 149553 | | -}; |
| 149554 | | -#define YY_REDUCE_COUNT (382) |
| 149555 | | -#define YY_REDUCE_MIN (-260) |
| 149556 | | -#define YY_REDUCE_MAX (1420) |
| 150217 | + /* 0 */ 1350, 1149, 1531, 939, 939, 548, 996, 1150, 1236, 1322, |
| 150218 | + /* 10 */ 1322, 1322, 334, 0, 0, 178, 777, 1322, 1322, 1322, |
| 150219 | + /* 20 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, |
| 150220 | + /* 30 */ 991, 991, 1125, 1125, 447, 597, 548, 548, 548, 548, |
| 150221 | + /* 40 */ 548, 548, 40, 108, 217, 284, 323, 390, 429, 496, |
| 150222 | + /* 50 */ 535, 602, 641, 757, 777, 777, 777, 777, 777, 777, |
| 150223 | + /* 60 */ 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, |
| 150224 | + /* 70 */ 777, 777, 796, 777, 887, 900, 900, 1300, 1322, 1322, |
| 150225 | + /* 80 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, |
| 150226 | + /* 90 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, |
| 150227 | + /* 100 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, |
| 150228 | + /* 110 */ 1418, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, |
| 150229 | + /* 120 */ 1322, 1322, 1322, 1322, 147, 254, 254, 254, 254, 254, |
| 150230 | + /* 130 */ 84, 185, 66, 853, 958, 1121, 853, 92, 92, 853, |
| 150231 | + /* 140 */ 321, 321, 321, 321, 325, 350, 350, 461, 150, 1913, |
| 150232 | + /* 150 */ 1913, 285, 285, 285, 236, 184, 349, 184, 184, 712, |
| 150233 | + /* 160 */ 712, 433, 553, 771, 899, 853, 853, 853, 853, 853, |
| 150234 | + /* 170 */ 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, |
| 150235 | + /* 180 */ 853, 853, 853, 853, 853, 853, 46, 46, 853, 113, |
| 150236 | + /* 190 */ 223, 223, 1183, 1183, 1127, 1142, 1913, 1913, 1913, 459, |
| 150237 | + /* 200 */ 514, 514, 653, 495, 657, 305, 705, 560, 622, 776, |
| 150238 | + /* 210 */ 853, 853, 853, 853, 853, 853, 853, 853, 853, 545, |
| 150239 | + /* 220 */ 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, |
| 150240 | + /* 230 */ 853, 853, 1002, 1002, 1002, 853, 853, 853, 853, 1111, |
| 150241 | + /* 240 */ 853, 853, 853, 1006, 1109, 853, 853, 1168, 853, 853, |
| 150242 | + /* 250 */ 853, 853, 853, 853, 853, 853, 845, 1164, 738, 953, |
| 150243 | + /* 260 */ 953, 953, 953, 1196, 738, 738, 45, 96, 964, 179, |
| 150244 | + /* 270 */ 580, 907, 907, 1073, 580, 580, 1073, 498, 388, 1268, |
| 150245 | + /* 280 */ 1187, 1187, 1187, 907, 1170, 1170, 1058, 1180, 328, 1219, |
| 150246 | + /* 290 */ 1597, 1521, 1521, 1625, 1625, 1521, 1524, 1560, 1650, 1630, |
| 150247 | + /* 300 */ 1530, 1661, 1661, 1661, 1661, 1521, 1667, 1530, 1530, 1560, |
| 150248 | + /* 310 */ 1650, 1630, 1630, 1530, 1521, 1667, 1543, 1636, 1521, 1667, |
| 150249 | + /* 320 */ 1681, 1521, 1667, 1521, 1667, 1681, 1596, 1596, 1596, 1649, |
| 150250 | + /* 330 */ 1681, 1596, 1594, 1596, 1649, 1596, 1596, 1562, 1681, 1611, |
| 150251 | + /* 340 */ 1611, 1681, 1585, 1617, 1585, 1617, 1585, 1617, 1585, 1617, |
| 150252 | + /* 350 */ 1521, 1647, 1647, 1659, 1659, 1601, 1606, 1726, 1521, 1600, |
| 150253 | + /* 360 */ 1601, 1612, 1614, 1530, 1732, 1733, 1754, 1754, 1764, 1764, |
| 150254 | + /* 370 */ 1764, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, |
| 150255 | + /* 380 */ 1913, 1913, 1913, 1913, 1913, 1913, 673, 901, 283, 740, |
| 150256 | + /* 390 */ 707, 973, 655, 1247, 1048, 1097, 1190, 1306, 1263, 1383, |
| 150257 | + /* 400 */ 1395, 1432, 1469, 1473, 1497, 1279, 1200, 1323, 1075, 1286, |
| 150258 | + /* 410 */ 1536, 1608, 1332, 1609, 1175, 1225, 1610, 1615, 1309, 1361, |
| 150259 | + /* 420 */ 1777, 1784, 1766, 1633, 1778, 1696, 1779, 1771, 1773, 1662, |
| 150260 | + /* 430 */ 1652, 1673, 1776, 1663, 1782, 1664, 1787, 1804, 1668, 1660, |
| 150261 | + /* 440 */ 1682, 1748, 1774, 1666, 1757, 1760, 1761, 1763, 1691, 1706, |
| 150262 | + /* 450 */ 1785, 1683, 1820, 1817, 1801, 1713, 1669, 1758, 1802, 1759, |
| 150263 | + /* 460 */ 1755, 1788, 1694, 1721, 1809, 1814, 1816, 1709, 1716, 1818, |
| 150264 | + /* 470 */ 1772, 1819, 1821, 1815, 1822, 1775, 1823, 1824, 1780, 1808, |
| 150265 | + /* 480 */ 1825, 1704, 1828, 1829, 1830, 1831, 1832, 1833, 1835, 1836, |
| 150266 | + /* 490 */ 1838, 1837, 1839, 1718, 1841, 1842, 1750, 1834, 1844, 1728, |
| 150267 | + /* 500 */ 1843, 1840, 1845, 1846, 1847, 1783, 1795, 1786, 1848, 1798, |
| 150268 | + /* 510 */ 1789, 1849, 1852, 1854, 1853, 1858, 1859, 1855, 1863, 1843, |
| 150269 | + /* 520 */ 1864, 1865, 1867, 1868, 1869, 1870, 1856, 1883, 1874, 1875, |
| 150270 | + /* 530 */ 1876, 1877, 1879, 1880, 1872, 1781, 1767, 1768, 1769, 1770, |
| 150271 | + /* 540 */ 1885, 1888, 1908, |
| 150272 | +}; |
| 150273 | +#define YY_REDUCE_COUNT (385) |
| 150274 | +#define YY_REDUCE_MIN (-256) |
| 150275 | +#define YY_REDUCE_MAX (1590) |
| 149557 | 150276 | static const short yy_reduce_ofst[] = { |
| 149558 | | - /* 0 */ -170, -18, -159, 309, 313, -167, -19, 75, 117, 211, |
| 149559 | | - /* 10 */ 315, 317, -165, -195, -168, -260, 389, 437, 475, 524, |
| 149560 | | - /* 20 */ 527, -169, 529, 531, -28, 80, 534, 239, 304, 412, |
| 149561 | | - /* 30 */ 558, 577, 37, 120, 368, -22, 460, 517, 555, 560, |
| 149562 | | - /* 40 */ 562, 586, -257, -257, -257, -257, -257, -257, -257, -257, |
| 149563 | | - /* 50 */ -257, -257, -257, -257, -257, -257, -257, -257, -257, -257, |
| 149564 | | - /* 60 */ -257, -257, -257, -257, -257, -257, -257, -257, -257, -257, |
| 149565 | | - /* 70 */ -257, -257, -257, -257, -257, -257, -257, -172, 457, 628, |
| 149566 | | - /* 80 */ 673, 692, 694, 702, 704, 722, 728, 740, 743, 748, |
| 149567 | | - /* 90 */ 767, 791, 815, 818, 820, 822, 857, 861, 864, 866, |
| 149568 | | - /* 100 */ 868, 870, 872, 874, 876, 881, 900, 902, 906, 908, |
| 149569 | | - /* 110 */ 910, 912, 915, 917, 920, 960, 962, 964, 988, 990, |
| 149570 | | - /* 120 */ 992, 1016, 1029, 1032, -257, -257, -257, -257, -257, -257, |
| 149571 | | - /* 130 */ -257, -257, -257, 271, 618, -190, 68, 60, 240, -124, |
| 149572 | | - /* 140 */ 603, 610, 603, 610, 12, -257, -257, -257, -257, -128, |
| 149573 | | - /* 150 */ -128, -128, -142, 25, 270, 281, 333, 124, 236, 648, |
| 149574 | | - /* 160 */ 374, 465, 465, 28, 598, 792, 839, 469, 38, 381, |
| 149575 | | - /* 170 */ 622, 709, 173, 699, 522, 703, 808, 811, 867, 816, |
| 149576 | | - /* 180 */ -104, 823, -3, 875, 649, 753, 323, -88, 882, 884, |
| 149577 | | - /* 190 */ 518, 43, 325, 899, 763, 604, 879, 969, 402, -193, |
| 149578 | | - /* 200 */ -189, -180, -151, -55, 69, 104, 141, 259, 286, 360, |
| 149579 | | - /* 210 */ 364, 455, 474, 481, 510, 516, 611, 653, 788, 99, |
| 149580 | | - /* 220 */ 871, 878, 995, 1009, 1049, 1081, 1115, 1134, 1136, 1138, |
| 149581 | | - /* 230 */ 1139, 1140, 733, 1110, 1112, 1144, 1145, 1146, 1148, 1084, |
| 149582 | | - /* 240 */ 1161, 1162, 1163, 1089, 1047, 1165, 1166, 1127, 1169, 104, |
| 149583 | | - /* 250 */ 1181, 1182, 1183, 1184, 1185, 1187, 1098, 1100, 1150, 1131, |
| 149584 | | - /* 260 */ 1132, 1135, 1141, 1084, 1150, 1150, 1152, 1173, 1196, 1097, |
| 149585 | | - /* 270 */ 1153, 1143, 1167, 1103, 1154, 1155, 1104, 1176, 1174, 1199, |
| 149586 | | - /* 280 */ 1178, 1186, 1188, 1168, 1158, 1160, 1170, 1159, 1201, 1230, |
| 149587 | | - /* 290 */ 1156, 1243, 1244, 1157, 1164, 1247, 1172, 1189, 1192, 1240, |
| 149588 | | - /* 300 */ 1231, 1241, 1242, 1256, 1257, 1278, 1294, 1251, 1252, 1232, |
| 149589 | | - /* 310 */ 1234, 1265, 1266, 1259, 1301, 1303, 1223, 1225, 1307, 1313, |
| 149590 | | - /* 320 */ 1295, 1317, 1319, 1320, 1323, 1299, 1306, 1308, 1309, 1305, |
| 149591 | | - /* 330 */ 1311, 1315, 1314, 1321, 1312, 1324, 1326, 1327, 1263, 1271, |
| 149592 | | - /* 340 */ 1331, 1296, 1298, 1300, 1302, 1304, 1310, 1316, 1318, 1357, |
| 149593 | | - /* 350 */ 1255, 1260, 1329, 1325, 1332, 1370, 1333, 1338, 1341, 1343, |
| 149594 | | - /* 360 */ 1346, 1390, 1393, 1403, 1405, 1416, 1417, 1418, 1328, 1330, |
| 149595 | | - /* 370 */ 1335, 1409, 1394, 1399, 1401, 1402, 1410, 1391, 1396, 1411, |
| 149596 | | - /* 380 */ 1420, 1413, 1415, |
| 150277 | + /* 0 */ 880, -121, 269, 528, 933, -119, -187, -185, -182, -180, |
| 150278 | + /* 10 */ -176, -174, -62, -46, 131, -248, -133, 407, 568, 700, |
| 150279 | + /* 20 */ 704, 278, 706, 824, 542, 830, 948, 773, 943, 946, |
| 150280 | + /* 30 */ 71, 650, 211, 267, 826, 272, 676, 732, 885, 976, |
| 150281 | + /* 40 */ 984, 992, -256, -256, -256, -256, -256, -256, -256, -256, |
| 150282 | + /* 50 */ -256, -256, -256, -256, -256, -256, -256, -256, -256, -256, |
| 150283 | + /* 60 */ -256, -256, -256, -256, -256, -256, -256, -256, -256, -256, |
| 150284 | + /* 70 */ -256, -256, -256, -256, -256, -256, -256, 989, 1065, 1070, |
| 150285 | + /* 80 */ 1072, 1078, 1082, 1084, 1103, 1118, 1147, 1156, 1160, 1167, |
| 150286 | + /* 90 */ 1185, 1191, 1220, 1237, 1254, 1256, 1266, 1272, 1281, 1291, |
| 150287 | + /* 100 */ 1293, 1296, 1299, 1301, 1307, 1337, 1340, 1342, 1347, 1366, |
| 150288 | + /* 110 */ 1368, 1371, 1373, 1377, 1385, 1387, 1398, 1401, 1404, 1406, |
| 150289 | + /* 120 */ 1411, 1413, 1415, 1430, -256, -256, -256, -256, -256, -256, |
| 150290 | + /* 130 */ -256, -256, -256, -172, 508, -213, 57, -163, -25, 593, |
| 150291 | + /* 140 */ 69, 486, 69, 486, -200, 573, 722, -256, -256, -256, |
| 150292 | + /* 150 */ -256, -141, -141, -141, -105, -161, -167, 157, 212, 405, |
| 150293 | + /* 160 */ 530, 220, 233, 735, 735, 115, 318, 406, 612, 541, |
| 150294 | + /* 170 */ -166, 441, 688, 794, 629, 368, 741, 775, 867, 797, |
| 150295 | + /* 180 */ 871, 842, -186, 1000, 858, 949, 379, 783, 70, 296, |
| 150296 | + /* 190 */ 821, 903, 924, 1044, 651, 282, 1014, 1060, 937, -195, |
| 150297 | + /* 200 */ -177, 413, 439, 511, 566, 787, 827, 848, 898, 945, |
| 150298 | + /* 210 */ 1062, 1074, 1102, 1110, 1202, 1204, 1209, 1211, 1215, 529, |
| 150299 | + /* 220 */ 1221, 1224, 1240, 1246, 1255, 1257, 1269, 1270, 1273, 1274, |
| 150300 | + /* 230 */ 1275, 1280, 1205, 1251, 1294, 1310, 1317, 1326, 1327, 1124, |
| 150301 | + /* 240 */ 1331, 1338, 1339, 1290, 1181, 1346, 1351, 1265, 1352, 787, |
| 150302 | + /* 250 */ 1353, 1367, 1378, 1386, 1392, 1397, 1241, 1312, 1356, 1345, |
| 150303 | + /* 260 */ 1357, 1358, 1359, 1124, 1356, 1356, 1364, 1396, 1433, 1341, |
| 150304 | + /* 270 */ 1381, 1376, 1379, 1354, 1391, 1405, 1362, 1429, 1423, 1431, |
| 150305 | + /* 280 */ 1434, 1435, 1437, 1399, 1410, 1412, 1382, 1417, 1420, 1466, |
| 150306 | + /* 290 */ 1372, 1467, 1468, 1380, 1384, 1475, 1394, 1414, 1416, 1448, |
| 150307 | + /* 300 */ 1440, 1451, 1452, 1453, 1454, 1490, 1493, 1449, 1455, 1427, |
| 150308 | + /* 310 */ 1436, 1464, 1465, 1456, 1498, 1502, 1419, 1421, 1507, 1509, |
| 150309 | + /* 320 */ 1491, 1510, 1513, 1514, 1516, 1496, 1500, 1501, 1503, 1499, |
| 150310 | + /* 330 */ 1505, 1504, 1508, 1506, 1511, 1512, 1515, 1424, 1517, 1457, |
| 150311 | + /* 340 */ 1460, 1519, 1474, 1482, 1483, 1485, 1486, 1488, 1489, 1492, |
| 150312 | + /* 350 */ 1541, 1438, 1441, 1494, 1495, 1518, 1520, 1487, 1555, 1481, |
| 150313 | + /* 360 */ 1522, 1523, 1526, 1528, 1561, 1566, 1580, 1581, 1586, 1587, |
| 150314 | + /* 370 */ 1588, 1478, 1484, 1525, 1575, 1570, 1572, 1573, 1574, 1582, |
| 150315 | + /* 380 */ 1568, 1569, 1578, 1579, 1583, 1590, |
| 149597 | 150316 | }; |
| 149598 | 150317 | static const YYACTIONTYPE yy_default[] = { |
| 149599 | | - /* 0 */ 1537, 1537, 1537, 1377, 1159, 1266, 1159, 1159, 1159, 1377, |
| 149600 | | - /* 10 */ 1377, 1377, 1159, 1296, 1296, 1430, 1190, 1159, 1159, 1159, |
| 149601 | | - /* 20 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1376, 1159, 1159, |
| 149602 | | - /* 30 */ 1159, 1159, 1460, 1460, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149603 | | - /* 40 */ 1159, 1159, 1159, 1302, 1159, 1159, 1159, 1159, 1159, 1378, |
| 149604 | | - /* 50 */ 1379, 1159, 1159, 1159, 1429, 1431, 1394, 1312, 1311, 1310, |
| 149605 | | - /* 60 */ 1309, 1412, 1283, 1307, 1300, 1304, 1372, 1373, 1371, 1375, |
| 149606 | | - /* 70 */ 1379, 1378, 1159, 1303, 1343, 1357, 1342, 1159, 1159, 1159, |
| 149607 | | - /* 80 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149608 | | - /* 90 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149609 | | - /* 100 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149610 | | - /* 110 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149611 | | - /* 120 */ 1159, 1159, 1159, 1159, 1351, 1356, 1362, 1355, 1352, 1345, |
| 149612 | | - /* 130 */ 1344, 1346, 1347, 1159, 1180, 1230, 1159, 1159, 1159, 1159, |
| 149613 | | - /* 140 */ 1448, 1447, 1159, 1159, 1190, 1348, 1349, 1359, 1358, 1437, |
| 149614 | | - /* 150 */ 1493, 1492, 1395, 1159, 1159, 1159, 1159, 1159, 1159, 1460, |
| 149615 | | - /* 160 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149616 | | - /* 170 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149617 | | - /* 180 */ 1159, 1159, 1159, 1159, 1460, 1460, 1159, 1190, 1460, 1460, |
| 149618 | | - /* 190 */ 1186, 1337, 1336, 1186, 1290, 1159, 1443, 1266, 1257, 1159, |
| 149619 | | - /* 200 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149620 | | - /* 210 */ 1159, 1159, 1159, 1434, 1432, 1159, 1159, 1159, 1159, 1159, |
| 149621 | | - /* 220 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149622 | | - /* 230 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149623 | | - /* 240 */ 1159, 1159, 1159, 1262, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149624 | | - /* 250 */ 1159, 1159, 1159, 1159, 1159, 1487, 1159, 1407, 1244, 1262, |
| 149625 | | - /* 260 */ 1262, 1262, 1262, 1264, 1245, 1243, 1256, 1191, 1166, 1529, |
| 149626 | | - /* 270 */ 1306, 1285, 1285, 1526, 1306, 1306, 1526, 1205, 1507, 1202, |
| 149627 | | - /* 280 */ 1296, 1296, 1296, 1285, 1290, 1290, 1374, 1263, 1256, 1159, |
| 149628 | | - /* 290 */ 1529, 1271, 1271, 1528, 1528, 1271, 1395, 1315, 1321, 1233, |
| 149629 | | - /* 300 */ 1306, 1239, 1239, 1239, 1239, 1271, 1177, 1306, 1306, 1315, |
| 149630 | | - /* 310 */ 1321, 1233, 1233, 1306, 1271, 1177, 1411, 1523, 1271, 1177, |
| 149631 | | - /* 320 */ 1385, 1271, 1177, 1271, 1177, 1385, 1231, 1231, 1231, 1220, |
| 149632 | | - /* 330 */ 1385, 1231, 1205, 1231, 1220, 1231, 1231, 1385, 1389, 1389, |
| 149633 | | - /* 340 */ 1385, 1289, 1284, 1289, 1284, 1289, 1284, 1289, 1284, 1271, |
| 149634 | | - /* 350 */ 1470, 1470, 1301, 1290, 1380, 1271, 1159, 1301, 1299, 1297, |
| 149635 | | - /* 360 */ 1306, 1183, 1223, 1490, 1490, 1486, 1486, 1486, 1534, 1534, |
| 149636 | | - /* 370 */ 1443, 1502, 1190, 1190, 1190, 1190, 1502, 1207, 1207, 1191, |
| 149637 | | - /* 380 */ 1191, 1190, 1502, 1159, 1159, 1159, 1159, 1159, 1159, 1497, |
| 149638 | | - /* 390 */ 1159, 1396, 1275, 1159, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149639 | | - /* 400 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149640 | | - /* 410 */ 1159, 1159, 1159, 1159, 1159, 1326, 1159, 1162, 1440, 1159, |
| 149641 | | - /* 420 */ 1159, 1438, 1159, 1159, 1159, 1159, 1159, 1159, 1276, 1159, |
| 149642 | | - /* 430 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149643 | | - /* 440 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1525, 1159, 1159, |
| 149644 | | - /* 450 */ 1159, 1159, 1159, 1159, 1410, 1409, 1159, 1159, 1273, 1159, |
| 149645 | | - /* 460 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149646 | | - /* 470 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149647 | | - /* 480 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149648 | | - /* 490 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1298, 1159, 1159, |
| 149649 | | - /* 500 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149650 | | - /* 510 */ 1159, 1159, 1475, 1291, 1159, 1159, 1516, 1159, 1159, 1159, |
| 149651 | | - /* 520 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, |
| 149652 | | - /* 530 */ 1159, 1511, 1247, 1328, 1159, 1327, 1331, 1159, 1171, 1159, |
| 150318 | + /* 0 */ 1554, 1554, 1554, 1392, 1171, 1278, 1171, 1171, 1171, 1392, |
| 150319 | + /* 10 */ 1392, 1392, 1171, 1308, 1308, 1445, 1202, 1171, 1171, 1171, |
| 150320 | + /* 20 */ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1391, 1171, 1171, |
| 150321 | + /* 30 */ 1171, 1171, 1475, 1475, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150322 | + /* 40 */ 1171, 1171, 1171, 1317, 1171, 1171, 1171, 1171, 1171, 1393, |
| 150323 | + /* 50 */ 1394, 1171, 1171, 1171, 1444, 1446, 1409, 1327, 1326, 1325, |
| 150324 | + /* 60 */ 1324, 1427, 1295, 1322, 1315, 1319, 1387, 1388, 1386, 1390, |
| 150325 | + /* 70 */ 1394, 1393, 1171, 1318, 1358, 1372, 1357, 1171, 1171, 1171, |
| 150326 | + /* 80 */ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150327 | + /* 90 */ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150328 | + /* 100 */ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150329 | + /* 110 */ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150330 | + /* 120 */ 1171, 1171, 1171, 1171, 1366, 1371, 1377, 1370, 1367, 1360, |
| 150331 | + /* 130 */ 1359, 1361, 1362, 1171, 1192, 1242, 1171, 1171, 1171, 1171, |
| 150332 | + /* 140 */ 1463, 1462, 1171, 1171, 1202, 1352, 1351, 1363, 1364, 1374, |
| 150333 | + /* 150 */ 1373, 1452, 1510, 1509, 1410, 1171, 1171, 1171, 1171, 1171, |
| 150334 | + /* 160 */ 1171, 1475, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150335 | + /* 170 */ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150336 | + /* 180 */ 1171, 1171, 1171, 1171, 1171, 1171, 1475, 1475, 1171, 1202, |
| 150337 | + /* 190 */ 1475, 1475, 1198, 1198, 1302, 1171, 1458, 1278, 1269, 1171, |
| 150338 | + /* 200 */ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150339 | + /* 210 */ 1171, 1171, 1171, 1449, 1447, 1171, 1171, 1171, 1171, 1171, |
| 150340 | + /* 220 */ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150341 | + /* 230 */ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150342 | + /* 240 */ 1171, 1171, 1171, 1274, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150343 | + /* 250 */ 1171, 1171, 1171, 1171, 1171, 1504, 1171, 1422, 1256, 1274, |
| 150344 | + /* 260 */ 1274, 1274, 1274, 1276, 1257, 1255, 1268, 1203, 1178, 1546, |
| 150345 | + /* 270 */ 1321, 1297, 1297, 1543, 1321, 1321, 1543, 1217, 1524, 1214, |
| 150346 | + /* 280 */ 1308, 1308, 1308, 1297, 1302, 1302, 1389, 1275, 1268, 1171, |
| 150347 | + /* 290 */ 1546, 1283, 1283, 1545, 1545, 1283, 1410, 1330, 1336, 1245, |
| 150348 | + /* 300 */ 1321, 1251, 1251, 1251, 1251, 1283, 1189, 1321, 1321, 1330, |
| 150349 | + /* 310 */ 1336, 1245, 1245, 1321, 1283, 1189, 1426, 1540, 1283, 1189, |
| 150350 | + /* 320 */ 1400, 1283, 1189, 1283, 1189, 1400, 1243, 1243, 1243, 1232, |
| 150351 | + /* 330 */ 1400, 1243, 1217, 1243, 1232, 1243, 1243, 1493, 1400, 1404, |
| 150352 | + /* 340 */ 1404, 1400, 1301, 1296, 1301, 1296, 1301, 1296, 1301, 1296, |
| 150353 | + /* 350 */ 1283, 1485, 1485, 1311, 1311, 1316, 1302, 1395, 1283, 1171, |
| 150354 | + /* 360 */ 1316, 1314, 1312, 1321, 1195, 1235, 1507, 1507, 1503, 1503, |
| 150355 | + /* 370 */ 1503, 1551, 1551, 1458, 1519, 1202, 1202, 1202, 1202, 1519, |
| 150356 | + /* 380 */ 1219, 1219, 1203, 1203, 1202, 1519, 1171, 1171, 1171, 1171, |
| 150357 | + /* 390 */ 1171, 1171, 1514, 1171, 1411, 1287, 1171, 1171, 1171, 1171, |
| 150358 | + /* 400 */ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150359 | + /* 410 */ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1341, |
| 150360 | + /* 420 */ 1171, 1174, 1455, 1171, 1171, 1453, 1171, 1171, 1171, 1171, |
| 150361 | + /* 430 */ 1171, 1171, 1288, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150362 | + /* 440 */ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150363 | + /* 450 */ 1171, 1542, 1171, 1171, 1171, 1171, 1171, 1171, 1425, 1424, |
| 150364 | + /* 460 */ 1171, 1171, 1285, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150365 | + /* 470 */ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150366 | + /* 480 */ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150367 | + /* 490 */ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150368 | + /* 500 */ 1313, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150369 | + /* 510 */ 1171, 1171, 1171, 1171, 1171, 1490, 1303, 1171, 1171, 1533, |
| 150370 | + /* 520 */ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, |
| 150371 | + /* 530 */ 1171, 1171, 1171, 1171, 1528, 1259, 1343, 1171, 1342, 1346, |
| 150372 | + /* 540 */ 1171, 1183, 1171, |
| 149653 | 150373 | }; |
| 149654 | 150374 | /********** End of lemon-generated parsing tables *****************************/ |
| 149655 | 150375 | |
| 149656 | 150376 | /* The next table maps tokens (terminal symbols) into fallback tokens. |
| 149657 | 150377 | ** If a construct like the following: |
| | @@ -149749,10 +150469,13 @@ |
| 149749 | 150469 | 59, /* TRIGGER => ID */ |
| 149750 | 150470 | 59, /* VACUUM => ID */ |
| 149751 | 150471 | 59, /* VIEW => ID */ |
| 149752 | 150472 | 59, /* VIRTUAL => ID */ |
| 149753 | 150473 | 59, /* WITH => ID */ |
| 150474 | + 59, /* NULLS => ID */ |
| 150475 | + 59, /* FIRST => ID */ |
| 150476 | + 59, /* LAST => ID */ |
| 149754 | 150477 | 59, /* CURRENT => ID */ |
| 149755 | 150478 | 59, /* FOLLOWING => ID */ |
| 149756 | 150479 | 59, /* PARTITION => ID */ |
| 149757 | 150480 | 59, /* PRECEDING => ID */ |
| 149758 | 150481 | 59, /* RANGE => ID */ |
| | @@ -149762,10 +150485,91 @@ |
| 149762 | 150485 | 59, /* OTHERS => ID */ |
| 149763 | 150486 | 59, /* TIES => ID */ |
| 149764 | 150487 | 59, /* REINDEX => ID */ |
| 149765 | 150488 | 59, /* RENAME => ID */ |
| 149766 | 150489 | 59, /* CTIME_KW => ID */ |
| 150490 | + 0, /* ANY => nothing */ |
| 150491 | + 0, /* BITAND => nothing */ |
| 150492 | + 0, /* BITOR => nothing */ |
| 150493 | + 0, /* LSHIFT => nothing */ |
| 150494 | + 0, /* RSHIFT => nothing */ |
| 150495 | + 0, /* PLUS => nothing */ |
| 150496 | + 0, /* MINUS => nothing */ |
| 150497 | + 0, /* STAR => nothing */ |
| 150498 | + 0, /* SLASH => nothing */ |
| 150499 | + 0, /* REM => nothing */ |
| 150500 | + 0, /* CONCAT => nothing */ |
| 150501 | + 0, /* COLLATE => nothing */ |
| 150502 | + 0, /* BITNOT => nothing */ |
| 150503 | + 0, /* ON => nothing */ |
| 150504 | + 0, /* INDEXED => nothing */ |
| 150505 | + 0, /* STRING => nothing */ |
| 150506 | + 0, /* JOIN_KW => nothing */ |
| 150507 | + 0, /* CONSTRAINT => nothing */ |
| 150508 | + 0, /* DEFAULT => nothing */ |
| 150509 | + 0, /* NULL => nothing */ |
| 150510 | + 0, /* PRIMARY => nothing */ |
| 150511 | + 0, /* UNIQUE => nothing */ |
| 150512 | + 0, /* CHECK => nothing */ |
| 150513 | + 0, /* REFERENCES => nothing */ |
| 150514 | + 0, /* AUTOINCR => nothing */ |
| 150515 | + 0, /* INSERT => nothing */ |
| 150516 | + 0, /* DELETE => nothing */ |
| 150517 | + 0, /* UPDATE => nothing */ |
| 150518 | + 0, /* SET => nothing */ |
| 150519 | + 0, /* DEFERRABLE => nothing */ |
| 150520 | + 0, /* FOREIGN => nothing */ |
| 150521 | + 0, /* DROP => nothing */ |
| 150522 | + 0, /* UNION => nothing */ |
| 150523 | + 0, /* ALL => nothing */ |
| 150524 | + 0, /* EXCEPT => nothing */ |
| 150525 | + 0, /* INTERSECT => nothing */ |
| 150526 | + 0, /* SELECT => nothing */ |
| 150527 | + 0, /* VALUES => nothing */ |
| 150528 | + 0, /* DISTINCT => nothing */ |
| 150529 | + 0, /* DOT => nothing */ |
| 150530 | + 0, /* FROM => nothing */ |
| 150531 | + 0, /* JOIN => nothing */ |
| 150532 | + 0, /* USING => nothing */ |
| 150533 | + 0, /* ORDER => nothing */ |
| 150534 | + 0, /* GROUP => nothing */ |
| 150535 | + 0, /* HAVING => nothing */ |
| 150536 | + 0, /* LIMIT => nothing */ |
| 150537 | + 0, /* WHERE => nothing */ |
| 150538 | + 0, /* INTO => nothing */ |
| 150539 | + 0, /* NOTHING => nothing */ |
| 150540 | + 0, /* FLOAT => nothing */ |
| 150541 | + 0, /* BLOB => nothing */ |
| 150542 | + 0, /* INTEGER => nothing */ |
| 150543 | + 0, /* VARIABLE => nothing */ |
| 150544 | + 0, /* CASE => nothing */ |
| 150545 | + 0, /* WHEN => nothing */ |
| 150546 | + 0, /* THEN => nothing */ |
| 150547 | + 0, /* ELSE => nothing */ |
| 150548 | + 0, /* INDEX => nothing */ |
| 150549 | + 0, /* ALTER => nothing */ |
| 150550 | + 0, /* ADD => nothing */ |
| 150551 | + 0, /* WINDOW => nothing */ |
| 150552 | + 0, /* OVER => nothing */ |
| 150553 | + 0, /* FILTER => nothing */ |
| 150554 | + 0, /* COLUMN => nothing */ |
| 150555 | + 0, /* AGG_FUNCTION => nothing */ |
| 150556 | + 0, /* AGG_COLUMN => nothing */ |
| 150557 | + 0, /* TRUEFALSE => nothing */ |
| 150558 | + 0, /* ISNOT => nothing */ |
| 150559 | + 0, /* FUNCTION => nothing */ |
| 150560 | + 0, /* UMINUS => nothing */ |
| 150561 | + 0, /* UPLUS => nothing */ |
| 150562 | + 0, /* TRUTH => nothing */ |
| 150563 | + 0, /* REGISTER => nothing */ |
| 150564 | + 0, /* VECTOR => nothing */ |
| 150565 | + 0, /* SELECT_COLUMN => nothing */ |
| 150566 | + 0, /* IF_NULL_ROW => nothing */ |
| 150567 | + 0, /* ASTERISK => nothing */ |
| 150568 | + 0, /* SPAN => nothing */ |
| 150569 | + 0, /* SPACE => nothing */ |
| 150570 | + 0, /* ILLEGAL => nothing */ |
| 149767 | 150571 | }; |
| 149768 | 150572 | #endif /* YYFALLBACK */ |
| 149769 | 150573 | |
| 149770 | 150574 | /* The following structure represents a single element of the |
| 149771 | 150575 | ** parser's stack. Information stored includes: |
| | @@ -149931,230 +150735,235 @@ |
| 149931 | 150735 | /* 77 */ "TRIGGER", |
| 149932 | 150736 | /* 78 */ "VACUUM", |
| 149933 | 150737 | /* 79 */ "VIEW", |
| 149934 | 150738 | /* 80 */ "VIRTUAL", |
| 149935 | 150739 | /* 81 */ "WITH", |
| 149936 | | - /* 82 */ "CURRENT", |
| 149937 | | - /* 83 */ "FOLLOWING", |
| 149938 | | - /* 84 */ "PARTITION", |
| 149939 | | - /* 85 */ "PRECEDING", |
| 149940 | | - /* 86 */ "RANGE", |
| 149941 | | - /* 87 */ "UNBOUNDED", |
| 149942 | | - /* 88 */ "EXCLUDE", |
| 149943 | | - /* 89 */ "GROUPS", |
| 149944 | | - /* 90 */ "OTHERS", |
| 149945 | | - /* 91 */ "TIES", |
| 149946 | | - /* 92 */ "REINDEX", |
| 149947 | | - /* 93 */ "RENAME", |
| 149948 | | - /* 94 */ "CTIME_KW", |
| 149949 | | - /* 95 */ "ANY", |
| 149950 | | - /* 96 */ "BITAND", |
| 149951 | | - /* 97 */ "BITOR", |
| 149952 | | - /* 98 */ "LSHIFT", |
| 149953 | | - /* 99 */ "RSHIFT", |
| 149954 | | - /* 100 */ "PLUS", |
| 149955 | | - /* 101 */ "MINUS", |
| 149956 | | - /* 102 */ "STAR", |
| 149957 | | - /* 103 */ "SLASH", |
| 149958 | | - /* 104 */ "REM", |
| 149959 | | - /* 105 */ "CONCAT", |
| 149960 | | - /* 106 */ "COLLATE", |
| 149961 | | - /* 107 */ "BITNOT", |
| 149962 | | - /* 108 */ "ON", |
| 149963 | | - /* 109 */ "INDEXED", |
| 149964 | | - /* 110 */ "STRING", |
| 149965 | | - /* 111 */ "JOIN_KW", |
| 149966 | | - /* 112 */ "CONSTRAINT", |
| 149967 | | - /* 113 */ "DEFAULT", |
| 149968 | | - /* 114 */ "NULL", |
| 149969 | | - /* 115 */ "PRIMARY", |
| 149970 | | - /* 116 */ "UNIQUE", |
| 149971 | | - /* 117 */ "CHECK", |
| 149972 | | - /* 118 */ "REFERENCES", |
| 149973 | | - /* 119 */ "AUTOINCR", |
| 149974 | | - /* 120 */ "INSERT", |
| 149975 | | - /* 121 */ "DELETE", |
| 149976 | | - /* 122 */ "UPDATE", |
| 149977 | | - /* 123 */ "SET", |
| 149978 | | - /* 124 */ "DEFERRABLE", |
| 149979 | | - /* 125 */ "FOREIGN", |
| 149980 | | - /* 126 */ "DROP", |
| 149981 | | - /* 127 */ "UNION", |
| 149982 | | - /* 128 */ "ALL", |
| 149983 | | - /* 129 */ "EXCEPT", |
| 149984 | | - /* 130 */ "INTERSECT", |
| 149985 | | - /* 131 */ "SELECT", |
| 149986 | | - /* 132 */ "VALUES", |
| 149987 | | - /* 133 */ "DISTINCT", |
| 149988 | | - /* 134 */ "DOT", |
| 149989 | | - /* 135 */ "FROM", |
| 149990 | | - /* 136 */ "JOIN", |
| 149991 | | - /* 137 */ "USING", |
| 149992 | | - /* 138 */ "ORDER", |
| 149993 | | - /* 139 */ "GROUP", |
| 149994 | | - /* 140 */ "HAVING", |
| 149995 | | - /* 141 */ "LIMIT", |
| 149996 | | - /* 142 */ "WHERE", |
| 149997 | | - /* 143 */ "INTO", |
| 149998 | | - /* 144 */ "NOTHING", |
| 149999 | | - /* 145 */ "FLOAT", |
| 150000 | | - /* 146 */ "BLOB", |
| 150001 | | - /* 147 */ "INTEGER", |
| 150002 | | - /* 148 */ "VARIABLE", |
| 150003 | | - /* 149 */ "CASE", |
| 150004 | | - /* 150 */ "WHEN", |
| 150005 | | - /* 151 */ "THEN", |
| 150006 | | - /* 152 */ "ELSE", |
| 150007 | | - /* 153 */ "INDEX", |
| 150008 | | - /* 154 */ "ALTER", |
| 150009 | | - /* 155 */ "ADD", |
| 150010 | | - /* 156 */ "WINDOW", |
| 150011 | | - /* 157 */ "OVER", |
| 150012 | | - /* 158 */ "FILTER", |
| 150013 | | - /* 159 */ "TRUEFALSE", |
| 150014 | | - /* 160 */ "ISNOT", |
| 150015 | | - /* 161 */ "FUNCTION", |
| 150740 | + /* 82 */ "NULLS", |
| 150741 | + /* 83 */ "FIRST", |
| 150742 | + /* 84 */ "LAST", |
| 150743 | + /* 85 */ "CURRENT", |
| 150744 | + /* 86 */ "FOLLOWING", |
| 150745 | + /* 87 */ "PARTITION", |
| 150746 | + /* 88 */ "PRECEDING", |
| 150747 | + /* 89 */ "RANGE", |
| 150748 | + /* 90 */ "UNBOUNDED", |
| 150749 | + /* 91 */ "EXCLUDE", |
| 150750 | + /* 92 */ "GROUPS", |
| 150751 | + /* 93 */ "OTHERS", |
| 150752 | + /* 94 */ "TIES", |
| 150753 | + /* 95 */ "REINDEX", |
| 150754 | + /* 96 */ "RENAME", |
| 150755 | + /* 97 */ "CTIME_KW", |
| 150756 | + /* 98 */ "ANY", |
| 150757 | + /* 99 */ "BITAND", |
| 150758 | + /* 100 */ "BITOR", |
| 150759 | + /* 101 */ "LSHIFT", |
| 150760 | + /* 102 */ "RSHIFT", |
| 150761 | + /* 103 */ "PLUS", |
| 150762 | + /* 104 */ "MINUS", |
| 150763 | + /* 105 */ "STAR", |
| 150764 | + /* 106 */ "SLASH", |
| 150765 | + /* 107 */ "REM", |
| 150766 | + /* 108 */ "CONCAT", |
| 150767 | + /* 109 */ "COLLATE", |
| 150768 | + /* 110 */ "BITNOT", |
| 150769 | + /* 111 */ "ON", |
| 150770 | + /* 112 */ "INDEXED", |
| 150771 | + /* 113 */ "STRING", |
| 150772 | + /* 114 */ "JOIN_KW", |
| 150773 | + /* 115 */ "CONSTRAINT", |
| 150774 | + /* 116 */ "DEFAULT", |
| 150775 | + /* 117 */ "NULL", |
| 150776 | + /* 118 */ "PRIMARY", |
| 150777 | + /* 119 */ "UNIQUE", |
| 150778 | + /* 120 */ "CHECK", |
| 150779 | + /* 121 */ "REFERENCES", |
| 150780 | + /* 122 */ "AUTOINCR", |
| 150781 | + /* 123 */ "INSERT", |
| 150782 | + /* 124 */ "DELETE", |
| 150783 | + /* 125 */ "UPDATE", |
| 150784 | + /* 126 */ "SET", |
| 150785 | + /* 127 */ "DEFERRABLE", |
| 150786 | + /* 128 */ "FOREIGN", |
| 150787 | + /* 129 */ "DROP", |
| 150788 | + /* 130 */ "UNION", |
| 150789 | + /* 131 */ "ALL", |
| 150790 | + /* 132 */ "EXCEPT", |
| 150791 | + /* 133 */ "INTERSECT", |
| 150792 | + /* 134 */ "SELECT", |
| 150793 | + /* 135 */ "VALUES", |
| 150794 | + /* 136 */ "DISTINCT", |
| 150795 | + /* 137 */ "DOT", |
| 150796 | + /* 138 */ "FROM", |
| 150797 | + /* 139 */ "JOIN", |
| 150798 | + /* 140 */ "USING", |
| 150799 | + /* 141 */ "ORDER", |
| 150800 | + /* 142 */ "GROUP", |
| 150801 | + /* 143 */ "HAVING", |
| 150802 | + /* 144 */ "LIMIT", |
| 150803 | + /* 145 */ "WHERE", |
| 150804 | + /* 146 */ "INTO", |
| 150805 | + /* 147 */ "NOTHING", |
| 150806 | + /* 148 */ "FLOAT", |
| 150807 | + /* 149 */ "BLOB", |
| 150808 | + /* 150 */ "INTEGER", |
| 150809 | + /* 151 */ "VARIABLE", |
| 150810 | + /* 152 */ "CASE", |
| 150811 | + /* 153 */ "WHEN", |
| 150812 | + /* 154 */ "THEN", |
| 150813 | + /* 155 */ "ELSE", |
| 150814 | + /* 156 */ "INDEX", |
| 150815 | + /* 157 */ "ALTER", |
| 150816 | + /* 158 */ "ADD", |
| 150817 | + /* 159 */ "WINDOW", |
| 150818 | + /* 160 */ "OVER", |
| 150819 | + /* 161 */ "FILTER", |
| 150016 | 150820 | /* 162 */ "COLUMN", |
| 150017 | 150821 | /* 163 */ "AGG_FUNCTION", |
| 150018 | 150822 | /* 164 */ "AGG_COLUMN", |
| 150019 | | - /* 165 */ "UMINUS", |
| 150020 | | - /* 166 */ "UPLUS", |
| 150021 | | - /* 167 */ "TRUTH", |
| 150022 | | - /* 168 */ "REGISTER", |
| 150023 | | - /* 169 */ "VECTOR", |
| 150024 | | - /* 170 */ "SELECT_COLUMN", |
| 150025 | | - /* 171 */ "IF_NULL_ROW", |
| 150026 | | - /* 172 */ "ASTERISK", |
| 150027 | | - /* 173 */ "SPAN", |
| 150028 | | - /* 174 */ "SPACE", |
| 150029 | | - /* 175 */ "ILLEGAL", |
| 150030 | | - /* 176 */ "input", |
| 150031 | | - /* 177 */ "cmdlist", |
| 150032 | | - /* 178 */ "ecmd", |
| 150033 | | - /* 179 */ "cmdx", |
| 150034 | | - /* 180 */ "explain", |
| 150035 | | - /* 181 */ "cmd", |
| 150036 | | - /* 182 */ "transtype", |
| 150037 | | - /* 183 */ "trans_opt", |
| 150038 | | - /* 184 */ "nm", |
| 150039 | | - /* 185 */ "savepoint_opt", |
| 150040 | | - /* 186 */ "create_table", |
| 150041 | | - /* 187 */ "create_table_args", |
| 150042 | | - /* 188 */ "createkw", |
| 150043 | | - /* 189 */ "temp", |
| 150044 | | - /* 190 */ "ifnotexists", |
| 150045 | | - /* 191 */ "dbnm", |
| 150046 | | - /* 192 */ "columnlist", |
| 150047 | | - /* 193 */ "conslist_opt", |
| 150048 | | - /* 194 */ "table_options", |
| 150049 | | - /* 195 */ "select", |
| 150050 | | - /* 196 */ "columnname", |
| 150051 | | - /* 197 */ "carglist", |
| 150052 | | - /* 198 */ "typetoken", |
| 150053 | | - /* 199 */ "typename", |
| 150054 | | - /* 200 */ "signed", |
| 150055 | | - /* 201 */ "plus_num", |
| 150056 | | - /* 202 */ "minus_num", |
| 150057 | | - /* 203 */ "scanpt", |
| 150058 | | - /* 204 */ "scantok", |
| 150059 | | - /* 205 */ "ccons", |
| 150060 | | - /* 206 */ "term", |
| 150061 | | - /* 207 */ "expr", |
| 150062 | | - /* 208 */ "onconf", |
| 150063 | | - /* 209 */ "sortorder", |
| 150064 | | - /* 210 */ "autoinc", |
| 150065 | | - /* 211 */ "eidlist_opt", |
| 150066 | | - /* 212 */ "refargs", |
| 150067 | | - /* 213 */ "defer_subclause", |
| 150068 | | - /* 214 */ "refarg", |
| 150069 | | - /* 215 */ "refact", |
| 150070 | | - /* 216 */ "init_deferred_pred_opt", |
| 150071 | | - /* 217 */ "conslist", |
| 150072 | | - /* 218 */ "tconscomma", |
| 150073 | | - /* 219 */ "tcons", |
| 150074 | | - /* 220 */ "sortlist", |
| 150075 | | - /* 221 */ "eidlist", |
| 150076 | | - /* 222 */ "defer_subclause_opt", |
| 150077 | | - /* 223 */ "orconf", |
| 150078 | | - /* 224 */ "resolvetype", |
| 150079 | | - /* 225 */ "raisetype", |
| 150080 | | - /* 226 */ "ifexists", |
| 150081 | | - /* 227 */ "fullname", |
| 150082 | | - /* 228 */ "selectnowith", |
| 150083 | | - /* 229 */ "oneselect", |
| 150084 | | - /* 230 */ "wqlist", |
| 150085 | | - /* 231 */ "multiselect_op", |
| 150086 | | - /* 232 */ "distinct", |
| 150087 | | - /* 233 */ "selcollist", |
| 150088 | | - /* 234 */ "from", |
| 150089 | | - /* 235 */ "where_opt", |
| 150090 | | - /* 236 */ "groupby_opt", |
| 150091 | | - /* 237 */ "having_opt", |
| 150092 | | - /* 238 */ "orderby_opt", |
| 150093 | | - /* 239 */ "limit_opt", |
| 150094 | | - /* 240 */ "window_clause", |
| 150095 | | - /* 241 */ "values", |
| 150096 | | - /* 242 */ "nexprlist", |
| 150097 | | - /* 243 */ "sclp", |
| 150098 | | - /* 244 */ "as", |
| 150099 | | - /* 245 */ "seltablist", |
| 150100 | | - /* 246 */ "stl_prefix", |
| 150101 | | - /* 247 */ "joinop", |
| 150102 | | - /* 248 */ "indexed_opt", |
| 150103 | | - /* 249 */ "on_opt", |
| 150104 | | - /* 250 */ "using_opt", |
| 150105 | | - /* 251 */ "exprlist", |
| 150106 | | - /* 252 */ "xfullname", |
| 150107 | | - /* 253 */ "idlist", |
| 150108 | | - /* 254 */ "with", |
| 150109 | | - /* 255 */ "setlist", |
| 150110 | | - /* 256 */ "insert_cmd", |
| 150111 | | - /* 257 */ "idlist_opt", |
| 150112 | | - /* 258 */ "upsert", |
| 150113 | | - /* 259 */ "over_clause", |
| 150114 | | - /* 260 */ "likeop", |
| 150115 | | - /* 261 */ "between_op", |
| 150116 | | - /* 262 */ "in_op", |
| 150117 | | - /* 263 */ "paren_exprlist", |
| 150118 | | - /* 264 */ "case_operand", |
| 150119 | | - /* 265 */ "case_exprlist", |
| 150120 | | - /* 266 */ "case_else", |
| 150121 | | - /* 267 */ "uniqueflag", |
| 150122 | | - /* 268 */ "collate", |
| 150123 | | - /* 269 */ "vinto", |
| 150124 | | - /* 270 */ "nmnum", |
| 150125 | | - /* 271 */ "trigger_decl", |
| 150126 | | - /* 272 */ "trigger_cmd_list", |
| 150127 | | - /* 273 */ "trigger_time", |
| 150128 | | - /* 274 */ "trigger_event", |
| 150129 | | - /* 275 */ "foreach_clause", |
| 150130 | | - /* 276 */ "when_clause", |
| 150131 | | - /* 277 */ "trigger_cmd", |
| 150132 | | - /* 278 */ "trnm", |
| 150133 | | - /* 279 */ "tridxby", |
| 150134 | | - /* 280 */ "database_kw_opt", |
| 150135 | | - /* 281 */ "key_opt", |
| 150136 | | - /* 282 */ "add_column_fullname", |
| 150137 | | - /* 283 */ "kwcolumn_opt", |
| 150138 | | - /* 284 */ "create_vtab", |
| 150139 | | - /* 285 */ "vtabarglist", |
| 150140 | | - /* 286 */ "vtabarg", |
| 150141 | | - /* 287 */ "vtabargtoken", |
| 150142 | | - /* 288 */ "lp", |
| 150143 | | - /* 289 */ "anylist", |
| 150144 | | - /* 290 */ "windowdefn_list", |
| 150145 | | - /* 291 */ "windowdefn", |
| 150146 | | - /* 292 */ "window", |
| 150147 | | - /* 293 */ "frame_opt", |
| 150148 | | - /* 294 */ "part_opt", |
| 150149 | | - /* 295 */ "filter_opt", |
| 150150 | | - /* 296 */ "range_or_rows", |
| 150151 | | - /* 297 */ "frame_bound", |
| 150152 | | - /* 298 */ "frame_bound_s", |
| 150153 | | - /* 299 */ "frame_bound_e", |
| 150154 | | - /* 300 */ "frame_exclude_opt", |
| 150155 | | - /* 301 */ "frame_exclude", |
| 150823 | + /* 165 */ "TRUEFALSE", |
| 150824 | + /* 166 */ "ISNOT", |
| 150825 | + /* 167 */ "FUNCTION", |
| 150826 | + /* 168 */ "UMINUS", |
| 150827 | + /* 169 */ "UPLUS", |
| 150828 | + /* 170 */ "TRUTH", |
| 150829 | + /* 171 */ "REGISTER", |
| 150830 | + /* 172 */ "VECTOR", |
| 150831 | + /* 173 */ "SELECT_COLUMN", |
| 150832 | + /* 174 */ "IF_NULL_ROW", |
| 150833 | + /* 175 */ "ASTERISK", |
| 150834 | + /* 176 */ "SPAN", |
| 150835 | + /* 177 */ "SPACE", |
| 150836 | + /* 178 */ "ILLEGAL", |
| 150837 | + /* 179 */ "input", |
| 150838 | + /* 180 */ "cmdlist", |
| 150839 | + /* 181 */ "ecmd", |
| 150840 | + /* 182 */ "cmdx", |
| 150841 | + /* 183 */ "explain", |
| 150842 | + /* 184 */ "cmd", |
| 150843 | + /* 185 */ "transtype", |
| 150844 | + /* 186 */ "trans_opt", |
| 150845 | + /* 187 */ "nm", |
| 150846 | + /* 188 */ "savepoint_opt", |
| 150847 | + /* 189 */ "create_table", |
| 150848 | + /* 190 */ "create_table_args", |
| 150849 | + /* 191 */ "createkw", |
| 150850 | + /* 192 */ "temp", |
| 150851 | + /* 193 */ "ifnotexists", |
| 150852 | + /* 194 */ "dbnm", |
| 150853 | + /* 195 */ "columnlist", |
| 150854 | + /* 196 */ "conslist_opt", |
| 150855 | + /* 197 */ "table_options", |
| 150856 | + /* 198 */ "select", |
| 150857 | + /* 199 */ "columnname", |
| 150858 | + /* 200 */ "carglist", |
| 150859 | + /* 201 */ "typetoken", |
| 150860 | + /* 202 */ "typename", |
| 150861 | + /* 203 */ "signed", |
| 150862 | + /* 204 */ "plus_num", |
| 150863 | + /* 205 */ "minus_num", |
| 150864 | + /* 206 */ "scanpt", |
| 150865 | + /* 207 */ "scantok", |
| 150866 | + /* 208 */ "ccons", |
| 150867 | + /* 209 */ "term", |
| 150868 | + /* 210 */ "expr", |
| 150869 | + /* 211 */ "onconf", |
| 150870 | + /* 212 */ "sortorder", |
| 150871 | + /* 213 */ "autoinc", |
| 150872 | + /* 214 */ "eidlist_opt", |
| 150873 | + /* 215 */ "refargs", |
| 150874 | + /* 216 */ "defer_subclause", |
| 150875 | + /* 217 */ "refarg", |
| 150876 | + /* 218 */ "refact", |
| 150877 | + /* 219 */ "init_deferred_pred_opt", |
| 150878 | + /* 220 */ "conslist", |
| 150879 | + /* 221 */ "tconscomma", |
| 150880 | + /* 222 */ "tcons", |
| 150881 | + /* 223 */ "sortlist", |
| 150882 | + /* 224 */ "eidlist", |
| 150883 | + /* 225 */ "defer_subclause_opt", |
| 150884 | + /* 226 */ "orconf", |
| 150885 | + /* 227 */ "resolvetype", |
| 150886 | + /* 228 */ "raisetype", |
| 150887 | + /* 229 */ "ifexists", |
| 150888 | + /* 230 */ "fullname", |
| 150889 | + /* 231 */ "selectnowith", |
| 150890 | + /* 232 */ "oneselect", |
| 150891 | + /* 233 */ "wqlist", |
| 150892 | + /* 234 */ "multiselect_op", |
| 150893 | + /* 235 */ "distinct", |
| 150894 | + /* 236 */ "selcollist", |
| 150895 | + /* 237 */ "from", |
| 150896 | + /* 238 */ "where_opt", |
| 150897 | + /* 239 */ "groupby_opt", |
| 150898 | + /* 240 */ "having_opt", |
| 150899 | + /* 241 */ "orderby_opt", |
| 150900 | + /* 242 */ "limit_opt", |
| 150901 | + /* 243 */ "window_clause", |
| 150902 | + /* 244 */ "values", |
| 150903 | + /* 245 */ "nexprlist", |
| 150904 | + /* 246 */ "sclp", |
| 150905 | + /* 247 */ "as", |
| 150906 | + /* 248 */ "seltablist", |
| 150907 | + /* 249 */ "stl_prefix", |
| 150908 | + /* 250 */ "joinop", |
| 150909 | + /* 251 */ "indexed_opt", |
| 150910 | + /* 252 */ "on_opt", |
| 150911 | + /* 253 */ "using_opt", |
| 150912 | + /* 254 */ "exprlist", |
| 150913 | + /* 255 */ "xfullname", |
| 150914 | + /* 256 */ "idlist", |
| 150915 | + /* 257 */ "nulls", |
| 150916 | + /* 258 */ "with", |
| 150917 | + /* 259 */ "setlist", |
| 150918 | + /* 260 */ "insert_cmd", |
| 150919 | + /* 261 */ "idlist_opt", |
| 150920 | + /* 262 */ "upsert", |
| 150921 | + /* 263 */ "filter_over", |
| 150922 | + /* 264 */ "likeop", |
| 150923 | + /* 265 */ "between_op", |
| 150924 | + /* 266 */ "in_op", |
| 150925 | + /* 267 */ "paren_exprlist", |
| 150926 | + /* 268 */ "case_operand", |
| 150927 | + /* 269 */ "case_exprlist", |
| 150928 | + /* 270 */ "case_else", |
| 150929 | + /* 271 */ "uniqueflag", |
| 150930 | + /* 272 */ "collate", |
| 150931 | + /* 273 */ "vinto", |
| 150932 | + /* 274 */ "nmnum", |
| 150933 | + /* 275 */ "trigger_decl", |
| 150934 | + /* 276 */ "trigger_cmd_list", |
| 150935 | + /* 277 */ "trigger_time", |
| 150936 | + /* 278 */ "trigger_event", |
| 150937 | + /* 279 */ "foreach_clause", |
| 150938 | + /* 280 */ "when_clause", |
| 150939 | + /* 281 */ "trigger_cmd", |
| 150940 | + /* 282 */ "trnm", |
| 150941 | + /* 283 */ "tridxby", |
| 150942 | + /* 284 */ "database_kw_opt", |
| 150943 | + /* 285 */ "key_opt", |
| 150944 | + /* 286 */ "add_column_fullname", |
| 150945 | + /* 287 */ "kwcolumn_opt", |
| 150946 | + /* 288 */ "create_vtab", |
| 150947 | + /* 289 */ "vtabarglist", |
| 150948 | + /* 290 */ "vtabarg", |
| 150949 | + /* 291 */ "vtabargtoken", |
| 150950 | + /* 292 */ "lp", |
| 150951 | + /* 293 */ "anylist", |
| 150952 | + /* 294 */ "windowdefn_list", |
| 150953 | + /* 295 */ "windowdefn", |
| 150954 | + /* 296 */ "window", |
| 150955 | + /* 297 */ "frame_opt", |
| 150956 | + /* 298 */ "part_opt", |
| 150957 | + /* 299 */ "filter_clause", |
| 150958 | + /* 300 */ "over_clause", |
| 150959 | + /* 301 */ "range_or_rows", |
| 150960 | + /* 302 */ "frame_bound", |
| 150961 | + /* 303 */ "frame_bound_s", |
| 150962 | + /* 304 */ "frame_bound_e", |
| 150963 | + /* 305 */ "frame_exclude_opt", |
| 150964 | + /* 306 */ "frame_exclude", |
| 150156 | 150965 | }; |
| 150157 | 150966 | #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ |
| 150158 | 150967 | |
| 150159 | 150968 | #ifndef NDEBUG |
| 150160 | 150969 | /* For tracing reduce actions, the names of all rules are required. |
| | @@ -150288,256 +151097,261 @@ |
| 150288 | 151097 | /* 125 */ "indexed_opt ::= NOT INDEXED", |
| 150289 | 151098 | /* 126 */ "using_opt ::= USING LP idlist RP", |
| 150290 | 151099 | /* 127 */ "using_opt ::=", |
| 150291 | 151100 | /* 128 */ "orderby_opt ::=", |
| 150292 | 151101 | /* 129 */ "orderby_opt ::= ORDER BY sortlist", |
| 150293 | | - /* 130 */ "sortlist ::= sortlist COMMA expr sortorder", |
| 150294 | | - /* 131 */ "sortlist ::= expr sortorder", |
| 151102 | + /* 130 */ "sortlist ::= sortlist COMMA expr sortorder nulls", |
| 151103 | + /* 131 */ "sortlist ::= expr sortorder nulls", |
| 150295 | 151104 | /* 132 */ "sortorder ::= ASC", |
| 150296 | 151105 | /* 133 */ "sortorder ::= DESC", |
| 150297 | 151106 | /* 134 */ "sortorder ::=", |
| 150298 | | - /* 135 */ "groupby_opt ::=", |
| 150299 | | - /* 136 */ "groupby_opt ::= GROUP BY nexprlist", |
| 150300 | | - /* 137 */ "having_opt ::=", |
| 150301 | | - /* 138 */ "having_opt ::= HAVING expr", |
| 150302 | | - /* 139 */ "limit_opt ::=", |
| 150303 | | - /* 140 */ "limit_opt ::= LIMIT expr", |
| 150304 | | - /* 141 */ "limit_opt ::= LIMIT expr OFFSET expr", |
| 150305 | | - /* 142 */ "limit_opt ::= LIMIT expr COMMA expr", |
| 150306 | | - /* 143 */ "cmd ::= with DELETE FROM xfullname indexed_opt where_opt", |
| 150307 | | - /* 144 */ "where_opt ::=", |
| 150308 | | - /* 145 */ "where_opt ::= WHERE expr", |
| 150309 | | - /* 146 */ "cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt", |
| 150310 | | - /* 147 */ "setlist ::= setlist COMMA nm EQ expr", |
| 150311 | | - /* 148 */ "setlist ::= setlist COMMA LP idlist RP EQ expr", |
| 150312 | | - /* 149 */ "setlist ::= nm EQ expr", |
| 150313 | | - /* 150 */ "setlist ::= LP idlist RP EQ expr", |
| 150314 | | - /* 151 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert", |
| 150315 | | - /* 152 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES", |
| 150316 | | - /* 153 */ "upsert ::=", |
| 150317 | | - /* 154 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt", |
| 150318 | | - /* 155 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING", |
| 150319 | | - /* 156 */ "upsert ::= ON CONFLICT DO NOTHING", |
| 150320 | | - /* 157 */ "insert_cmd ::= INSERT orconf", |
| 150321 | | - /* 158 */ "insert_cmd ::= REPLACE", |
| 150322 | | - /* 159 */ "idlist_opt ::=", |
| 150323 | | - /* 160 */ "idlist_opt ::= LP idlist RP", |
| 150324 | | - /* 161 */ "idlist ::= idlist COMMA nm", |
| 150325 | | - /* 162 */ "idlist ::= nm", |
| 150326 | | - /* 163 */ "expr ::= LP expr RP", |
| 150327 | | - /* 164 */ "expr ::= ID|INDEXED", |
| 150328 | | - /* 165 */ "expr ::= JOIN_KW", |
| 150329 | | - /* 166 */ "expr ::= nm DOT nm", |
| 150330 | | - /* 167 */ "expr ::= nm DOT nm DOT nm", |
| 150331 | | - /* 168 */ "term ::= NULL|FLOAT|BLOB", |
| 150332 | | - /* 169 */ "term ::= STRING", |
| 150333 | | - /* 170 */ "term ::= INTEGER", |
| 150334 | | - /* 171 */ "expr ::= VARIABLE", |
| 150335 | | - /* 172 */ "expr ::= expr COLLATE ID|STRING", |
| 150336 | | - /* 173 */ "expr ::= CAST LP expr AS typetoken RP", |
| 150337 | | - /* 174 */ "expr ::= ID|INDEXED LP distinct exprlist RP", |
| 150338 | | - /* 175 */ "expr ::= ID|INDEXED LP STAR RP", |
| 150339 | | - /* 176 */ "expr ::= ID|INDEXED LP distinct exprlist RP over_clause", |
| 150340 | | - /* 177 */ "expr ::= ID|INDEXED LP STAR RP over_clause", |
| 150341 | | - /* 178 */ "term ::= CTIME_KW", |
| 150342 | | - /* 179 */ "expr ::= LP nexprlist COMMA expr RP", |
| 150343 | | - /* 180 */ "expr ::= expr AND expr", |
| 150344 | | - /* 181 */ "expr ::= expr OR expr", |
| 150345 | | - /* 182 */ "expr ::= expr LT|GT|GE|LE expr", |
| 150346 | | - /* 183 */ "expr ::= expr EQ|NE expr", |
| 150347 | | - /* 184 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr", |
| 150348 | | - /* 185 */ "expr ::= expr PLUS|MINUS expr", |
| 150349 | | - /* 186 */ "expr ::= expr STAR|SLASH|REM expr", |
| 150350 | | - /* 187 */ "expr ::= expr CONCAT expr", |
| 150351 | | - /* 188 */ "likeop ::= NOT LIKE_KW|MATCH", |
| 150352 | | - /* 189 */ "expr ::= expr likeop expr", |
| 150353 | | - /* 190 */ "expr ::= expr likeop expr ESCAPE expr", |
| 150354 | | - /* 191 */ "expr ::= expr ISNULL|NOTNULL", |
| 150355 | | - /* 192 */ "expr ::= expr NOT NULL", |
| 150356 | | - /* 193 */ "expr ::= expr IS expr", |
| 150357 | | - /* 194 */ "expr ::= expr IS NOT expr", |
| 150358 | | - /* 195 */ "expr ::= NOT expr", |
| 150359 | | - /* 196 */ "expr ::= BITNOT expr", |
| 150360 | | - /* 197 */ "expr ::= PLUS|MINUS expr", |
| 150361 | | - /* 198 */ "between_op ::= BETWEEN", |
| 150362 | | - /* 199 */ "between_op ::= NOT BETWEEN", |
| 150363 | | - /* 200 */ "expr ::= expr between_op expr AND expr", |
| 150364 | | - /* 201 */ "in_op ::= IN", |
| 150365 | | - /* 202 */ "in_op ::= NOT IN", |
| 150366 | | - /* 203 */ "expr ::= expr in_op LP exprlist RP", |
| 150367 | | - /* 204 */ "expr ::= LP select RP", |
| 150368 | | - /* 205 */ "expr ::= expr in_op LP select RP", |
| 150369 | | - /* 206 */ "expr ::= expr in_op nm dbnm paren_exprlist", |
| 150370 | | - /* 207 */ "expr ::= EXISTS LP select RP", |
| 150371 | | - /* 208 */ "expr ::= CASE case_operand case_exprlist case_else END", |
| 150372 | | - /* 209 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", |
| 150373 | | - /* 210 */ "case_exprlist ::= WHEN expr THEN expr", |
| 150374 | | - /* 211 */ "case_else ::= ELSE expr", |
| 150375 | | - /* 212 */ "case_else ::=", |
| 150376 | | - /* 213 */ "case_operand ::= expr", |
| 150377 | | - /* 214 */ "case_operand ::=", |
| 150378 | | - /* 215 */ "exprlist ::=", |
| 150379 | | - /* 216 */ "nexprlist ::= nexprlist COMMA expr", |
| 150380 | | - /* 217 */ "nexprlist ::= expr", |
| 150381 | | - /* 218 */ "paren_exprlist ::=", |
| 150382 | | - /* 219 */ "paren_exprlist ::= LP exprlist RP", |
| 150383 | | - /* 220 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", |
| 150384 | | - /* 221 */ "uniqueflag ::= UNIQUE", |
| 150385 | | - /* 222 */ "uniqueflag ::=", |
| 150386 | | - /* 223 */ "eidlist_opt ::=", |
| 150387 | | - /* 224 */ "eidlist_opt ::= LP eidlist RP", |
| 150388 | | - /* 225 */ "eidlist ::= eidlist COMMA nm collate sortorder", |
| 150389 | | - /* 226 */ "eidlist ::= nm collate sortorder", |
| 150390 | | - /* 227 */ "collate ::=", |
| 150391 | | - /* 228 */ "collate ::= COLLATE ID|STRING", |
| 150392 | | - /* 229 */ "cmd ::= DROP INDEX ifexists fullname", |
| 150393 | | - /* 230 */ "cmd ::= VACUUM vinto", |
| 150394 | | - /* 231 */ "cmd ::= VACUUM nm vinto", |
| 150395 | | - /* 232 */ "vinto ::= INTO expr", |
| 150396 | | - /* 233 */ "vinto ::=", |
| 150397 | | - /* 234 */ "cmd ::= PRAGMA nm dbnm", |
| 150398 | | - /* 235 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", |
| 150399 | | - /* 236 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", |
| 150400 | | - /* 237 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", |
| 150401 | | - /* 238 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", |
| 150402 | | - /* 239 */ "plus_num ::= PLUS INTEGER|FLOAT", |
| 150403 | | - /* 240 */ "minus_num ::= MINUS INTEGER|FLOAT", |
| 150404 | | - /* 241 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", |
| 150405 | | - /* 242 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", |
| 150406 | | - /* 243 */ "trigger_time ::= BEFORE|AFTER", |
| 150407 | | - /* 244 */ "trigger_time ::= INSTEAD OF", |
| 150408 | | - /* 245 */ "trigger_time ::=", |
| 150409 | | - /* 246 */ "trigger_event ::= DELETE|INSERT", |
| 150410 | | - /* 247 */ "trigger_event ::= UPDATE", |
| 150411 | | - /* 248 */ "trigger_event ::= UPDATE OF idlist", |
| 150412 | | - /* 249 */ "when_clause ::=", |
| 150413 | | - /* 250 */ "when_clause ::= WHEN expr", |
| 150414 | | - /* 251 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", |
| 150415 | | - /* 252 */ "trigger_cmd_list ::= trigger_cmd SEMI", |
| 150416 | | - /* 253 */ "trnm ::= nm DOT nm", |
| 150417 | | - /* 254 */ "tridxby ::= INDEXED BY nm", |
| 150418 | | - /* 255 */ "tridxby ::= NOT INDEXED", |
| 150419 | | - /* 256 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt", |
| 150420 | | - /* 257 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt", |
| 150421 | | - /* 258 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt", |
| 150422 | | - /* 259 */ "trigger_cmd ::= scanpt select scanpt", |
| 150423 | | - /* 260 */ "expr ::= RAISE LP IGNORE RP", |
| 150424 | | - /* 261 */ "expr ::= RAISE LP raisetype COMMA nm RP", |
| 150425 | | - /* 262 */ "raisetype ::= ROLLBACK", |
| 150426 | | - /* 263 */ "raisetype ::= ABORT", |
| 150427 | | - /* 264 */ "raisetype ::= FAIL", |
| 150428 | | - /* 265 */ "cmd ::= DROP TRIGGER ifexists fullname", |
| 150429 | | - /* 266 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", |
| 150430 | | - /* 267 */ "cmd ::= DETACH database_kw_opt expr", |
| 150431 | | - /* 268 */ "key_opt ::=", |
| 150432 | | - /* 269 */ "key_opt ::= KEY expr", |
| 150433 | | - /* 270 */ "cmd ::= REINDEX", |
| 150434 | | - /* 271 */ "cmd ::= REINDEX nm dbnm", |
| 150435 | | - /* 272 */ "cmd ::= ANALYZE", |
| 150436 | | - /* 273 */ "cmd ::= ANALYZE nm dbnm", |
| 150437 | | - /* 274 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", |
| 150438 | | - /* 275 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", |
| 150439 | | - /* 276 */ "add_column_fullname ::= fullname", |
| 150440 | | - /* 277 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm", |
| 150441 | | - /* 278 */ "cmd ::= create_vtab", |
| 150442 | | - /* 279 */ "cmd ::= create_vtab LP vtabarglist RP", |
| 150443 | | - /* 280 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", |
| 150444 | | - /* 281 */ "vtabarg ::=", |
| 150445 | | - /* 282 */ "vtabargtoken ::= ANY", |
| 150446 | | - /* 283 */ "vtabargtoken ::= lp anylist RP", |
| 150447 | | - /* 284 */ "lp ::= LP", |
| 150448 | | - /* 285 */ "with ::= WITH wqlist", |
| 150449 | | - /* 286 */ "with ::= WITH RECURSIVE wqlist", |
| 150450 | | - /* 287 */ "wqlist ::= nm eidlist_opt AS LP select RP", |
| 150451 | | - /* 288 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP", |
| 150452 | | - /* 289 */ "windowdefn_list ::= windowdefn", |
| 150453 | | - /* 290 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn", |
| 150454 | | - /* 291 */ "windowdefn ::= nm AS LP window RP", |
| 150455 | | - /* 292 */ "window ::= PARTITION BY nexprlist orderby_opt frame_opt", |
| 150456 | | - /* 293 */ "window ::= nm PARTITION BY nexprlist orderby_opt frame_opt", |
| 150457 | | - /* 294 */ "window ::= ORDER BY sortlist frame_opt", |
| 150458 | | - /* 295 */ "window ::= nm ORDER BY sortlist frame_opt", |
| 150459 | | - /* 296 */ "window ::= frame_opt", |
| 150460 | | - /* 297 */ "window ::= nm frame_opt", |
| 150461 | | - /* 298 */ "frame_opt ::=", |
| 150462 | | - /* 299 */ "frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt", |
| 150463 | | - /* 300 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt", |
| 150464 | | - /* 301 */ "range_or_rows ::= RANGE|ROWS|GROUPS", |
| 150465 | | - /* 302 */ "frame_bound_s ::= frame_bound", |
| 150466 | | - /* 303 */ "frame_bound_s ::= UNBOUNDED PRECEDING", |
| 150467 | | - /* 304 */ "frame_bound_e ::= frame_bound", |
| 150468 | | - /* 305 */ "frame_bound_e ::= UNBOUNDED FOLLOWING", |
| 150469 | | - /* 306 */ "frame_bound ::= expr PRECEDING|FOLLOWING", |
| 150470 | | - /* 307 */ "frame_bound ::= CURRENT ROW", |
| 150471 | | - /* 308 */ "frame_exclude_opt ::=", |
| 150472 | | - /* 309 */ "frame_exclude_opt ::= EXCLUDE frame_exclude", |
| 150473 | | - /* 310 */ "frame_exclude ::= NO OTHERS", |
| 150474 | | - /* 311 */ "frame_exclude ::= CURRENT ROW", |
| 150475 | | - /* 312 */ "frame_exclude ::= GROUP|TIES", |
| 150476 | | - /* 313 */ "window_clause ::= WINDOW windowdefn_list", |
| 150477 | | - /* 314 */ "over_clause ::= filter_opt OVER LP window RP", |
| 150478 | | - /* 315 */ "over_clause ::= filter_opt OVER nm", |
| 150479 | | - /* 316 */ "filter_opt ::=", |
| 150480 | | - /* 317 */ "filter_opt ::= FILTER LP WHERE expr RP", |
| 150481 | | - /* 318 */ "input ::= cmdlist", |
| 150482 | | - /* 319 */ "cmdlist ::= cmdlist ecmd", |
| 150483 | | - /* 320 */ "cmdlist ::= ecmd", |
| 150484 | | - /* 321 */ "ecmd ::= SEMI", |
| 150485 | | - /* 322 */ "ecmd ::= cmdx SEMI", |
| 150486 | | - /* 323 */ "ecmd ::= explain cmdx", |
| 150487 | | - /* 324 */ "trans_opt ::=", |
| 150488 | | - /* 325 */ "trans_opt ::= TRANSACTION", |
| 150489 | | - /* 326 */ "trans_opt ::= TRANSACTION nm", |
| 150490 | | - /* 327 */ "savepoint_opt ::= SAVEPOINT", |
| 150491 | | - /* 328 */ "savepoint_opt ::=", |
| 150492 | | - /* 329 */ "cmd ::= create_table create_table_args", |
| 150493 | | - /* 330 */ "columnlist ::= columnlist COMMA columnname carglist", |
| 150494 | | - /* 331 */ "columnlist ::= columnname carglist", |
| 150495 | | - /* 332 */ "nm ::= ID|INDEXED", |
| 150496 | | - /* 333 */ "nm ::= STRING", |
| 150497 | | - /* 334 */ "nm ::= JOIN_KW", |
| 150498 | | - /* 335 */ "typetoken ::= typename", |
| 150499 | | - /* 336 */ "typename ::= ID|STRING", |
| 150500 | | - /* 337 */ "signed ::= plus_num", |
| 150501 | | - /* 338 */ "signed ::= minus_num", |
| 150502 | | - /* 339 */ "carglist ::= carglist ccons", |
| 150503 | | - /* 340 */ "carglist ::=", |
| 150504 | | - /* 341 */ "ccons ::= NULL onconf", |
| 150505 | | - /* 342 */ "conslist_opt ::= COMMA conslist", |
| 150506 | | - /* 343 */ "conslist ::= conslist tconscomma tcons", |
| 150507 | | - /* 344 */ "conslist ::= tcons", |
| 150508 | | - /* 345 */ "tconscomma ::=", |
| 150509 | | - /* 346 */ "defer_subclause_opt ::= defer_subclause", |
| 150510 | | - /* 347 */ "resolvetype ::= raisetype", |
| 150511 | | - /* 348 */ "selectnowith ::= oneselect", |
| 150512 | | - /* 349 */ "oneselect ::= values", |
| 150513 | | - /* 350 */ "sclp ::= selcollist COMMA", |
| 150514 | | - /* 351 */ "as ::= ID|STRING", |
| 150515 | | - /* 352 */ "expr ::= term", |
| 150516 | | - /* 353 */ "likeop ::= LIKE_KW|MATCH", |
| 150517 | | - /* 354 */ "exprlist ::= nexprlist", |
| 150518 | | - /* 355 */ "nmnum ::= plus_num", |
| 150519 | | - /* 356 */ "nmnum ::= nm", |
| 150520 | | - /* 357 */ "nmnum ::= ON", |
| 150521 | | - /* 358 */ "nmnum ::= DELETE", |
| 150522 | | - /* 359 */ "nmnum ::= DEFAULT", |
| 150523 | | - /* 360 */ "plus_num ::= INTEGER|FLOAT", |
| 150524 | | - /* 361 */ "foreach_clause ::=", |
| 150525 | | - /* 362 */ "foreach_clause ::= FOR EACH ROW", |
| 150526 | | - /* 363 */ "trnm ::= nm", |
| 150527 | | - /* 364 */ "tridxby ::=", |
| 150528 | | - /* 365 */ "database_kw_opt ::= DATABASE", |
| 150529 | | - /* 366 */ "database_kw_opt ::=", |
| 150530 | | - /* 367 */ "kwcolumn_opt ::=", |
| 150531 | | - /* 368 */ "kwcolumn_opt ::= COLUMNKW", |
| 150532 | | - /* 369 */ "vtabarglist ::= vtabarg", |
| 150533 | | - /* 370 */ "vtabarglist ::= vtabarglist COMMA vtabarg", |
| 150534 | | - /* 371 */ "vtabarg ::= vtabarg vtabargtoken", |
| 150535 | | - /* 372 */ "anylist ::=", |
| 150536 | | - /* 373 */ "anylist ::= anylist LP anylist RP", |
| 150537 | | - /* 374 */ "anylist ::= anylist ANY", |
| 150538 | | - /* 375 */ "with ::=", |
| 151107 | + /* 135 */ "nulls ::= NULLS FIRST", |
| 151108 | + /* 136 */ "nulls ::= NULLS LAST", |
| 151109 | + /* 137 */ "nulls ::=", |
| 151110 | + /* 138 */ "groupby_opt ::=", |
| 151111 | + /* 139 */ "groupby_opt ::= GROUP BY nexprlist", |
| 151112 | + /* 140 */ "having_opt ::=", |
| 151113 | + /* 141 */ "having_opt ::= HAVING expr", |
| 151114 | + /* 142 */ "limit_opt ::=", |
| 151115 | + /* 143 */ "limit_opt ::= LIMIT expr", |
| 151116 | + /* 144 */ "limit_opt ::= LIMIT expr OFFSET expr", |
| 151117 | + /* 145 */ "limit_opt ::= LIMIT expr COMMA expr", |
| 151118 | + /* 146 */ "cmd ::= with DELETE FROM xfullname indexed_opt where_opt", |
| 151119 | + /* 147 */ "where_opt ::=", |
| 151120 | + /* 148 */ "where_opt ::= WHERE expr", |
| 151121 | + /* 149 */ "cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt", |
| 151122 | + /* 150 */ "setlist ::= setlist COMMA nm EQ expr", |
| 151123 | + /* 151 */ "setlist ::= setlist COMMA LP idlist RP EQ expr", |
| 151124 | + /* 152 */ "setlist ::= nm EQ expr", |
| 151125 | + /* 153 */ "setlist ::= LP idlist RP EQ expr", |
| 151126 | + /* 154 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert", |
| 151127 | + /* 155 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES", |
| 151128 | + /* 156 */ "upsert ::=", |
| 151129 | + /* 157 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt", |
| 151130 | + /* 158 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING", |
| 151131 | + /* 159 */ "upsert ::= ON CONFLICT DO NOTHING", |
| 151132 | + /* 160 */ "insert_cmd ::= INSERT orconf", |
| 151133 | + /* 161 */ "insert_cmd ::= REPLACE", |
| 151134 | + /* 162 */ "idlist_opt ::=", |
| 151135 | + /* 163 */ "idlist_opt ::= LP idlist RP", |
| 151136 | + /* 164 */ "idlist ::= idlist COMMA nm", |
| 151137 | + /* 165 */ "idlist ::= nm", |
| 151138 | + /* 166 */ "expr ::= LP expr RP", |
| 151139 | + /* 167 */ "expr ::= ID|INDEXED", |
| 151140 | + /* 168 */ "expr ::= JOIN_KW", |
| 151141 | + /* 169 */ "expr ::= nm DOT nm", |
| 151142 | + /* 170 */ "expr ::= nm DOT nm DOT nm", |
| 151143 | + /* 171 */ "term ::= NULL|FLOAT|BLOB", |
| 151144 | + /* 172 */ "term ::= STRING", |
| 151145 | + /* 173 */ "term ::= INTEGER", |
| 151146 | + /* 174 */ "expr ::= VARIABLE", |
| 151147 | + /* 175 */ "expr ::= expr COLLATE ID|STRING", |
| 151148 | + /* 176 */ "expr ::= CAST LP expr AS typetoken RP", |
| 151149 | + /* 177 */ "expr ::= ID|INDEXED LP distinct exprlist RP", |
| 151150 | + /* 178 */ "expr ::= ID|INDEXED LP STAR RP", |
| 151151 | + /* 179 */ "expr ::= ID|INDEXED LP distinct exprlist RP filter_over", |
| 151152 | + /* 180 */ "expr ::= ID|INDEXED LP STAR RP filter_over", |
| 151153 | + /* 181 */ "term ::= CTIME_KW", |
| 151154 | + /* 182 */ "expr ::= LP nexprlist COMMA expr RP", |
| 151155 | + /* 183 */ "expr ::= expr AND expr", |
| 151156 | + /* 184 */ "expr ::= expr OR expr", |
| 151157 | + /* 185 */ "expr ::= expr LT|GT|GE|LE expr", |
| 151158 | + /* 186 */ "expr ::= expr EQ|NE expr", |
| 151159 | + /* 187 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr", |
| 151160 | + /* 188 */ "expr ::= expr PLUS|MINUS expr", |
| 151161 | + /* 189 */ "expr ::= expr STAR|SLASH|REM expr", |
| 151162 | + /* 190 */ "expr ::= expr CONCAT expr", |
| 151163 | + /* 191 */ "likeop ::= NOT LIKE_KW|MATCH", |
| 151164 | + /* 192 */ "expr ::= expr likeop expr", |
| 151165 | + /* 193 */ "expr ::= expr likeop expr ESCAPE expr", |
| 151166 | + /* 194 */ "expr ::= expr ISNULL|NOTNULL", |
| 151167 | + /* 195 */ "expr ::= expr NOT NULL", |
| 151168 | + /* 196 */ "expr ::= expr IS expr", |
| 151169 | + /* 197 */ "expr ::= expr IS NOT expr", |
| 151170 | + /* 198 */ "expr ::= NOT expr", |
| 151171 | + /* 199 */ "expr ::= BITNOT expr", |
| 151172 | + /* 200 */ "expr ::= PLUS|MINUS expr", |
| 151173 | + /* 201 */ "between_op ::= BETWEEN", |
| 151174 | + /* 202 */ "between_op ::= NOT BETWEEN", |
| 151175 | + /* 203 */ "expr ::= expr between_op expr AND expr", |
| 151176 | + /* 204 */ "in_op ::= IN", |
| 151177 | + /* 205 */ "in_op ::= NOT IN", |
| 151178 | + /* 206 */ "expr ::= expr in_op LP exprlist RP", |
| 151179 | + /* 207 */ "expr ::= LP select RP", |
| 151180 | + /* 208 */ "expr ::= expr in_op LP select RP", |
| 151181 | + /* 209 */ "expr ::= expr in_op nm dbnm paren_exprlist", |
| 151182 | + /* 210 */ "expr ::= EXISTS LP select RP", |
| 151183 | + /* 211 */ "expr ::= CASE case_operand case_exprlist case_else END", |
| 151184 | + /* 212 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", |
| 151185 | + /* 213 */ "case_exprlist ::= WHEN expr THEN expr", |
| 151186 | + /* 214 */ "case_else ::= ELSE expr", |
| 151187 | + /* 215 */ "case_else ::=", |
| 151188 | + /* 216 */ "case_operand ::= expr", |
| 151189 | + /* 217 */ "case_operand ::=", |
| 151190 | + /* 218 */ "exprlist ::=", |
| 151191 | + /* 219 */ "nexprlist ::= nexprlist COMMA expr", |
| 151192 | + /* 220 */ "nexprlist ::= expr", |
| 151193 | + /* 221 */ "paren_exprlist ::=", |
| 151194 | + /* 222 */ "paren_exprlist ::= LP exprlist RP", |
| 151195 | + /* 223 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", |
| 151196 | + /* 224 */ "uniqueflag ::= UNIQUE", |
| 151197 | + /* 225 */ "uniqueflag ::=", |
| 151198 | + /* 226 */ "eidlist_opt ::=", |
| 151199 | + /* 227 */ "eidlist_opt ::= LP eidlist RP", |
| 151200 | + /* 228 */ "eidlist ::= eidlist COMMA nm collate sortorder", |
| 151201 | + /* 229 */ "eidlist ::= nm collate sortorder", |
| 151202 | + /* 230 */ "collate ::=", |
| 151203 | + /* 231 */ "collate ::= COLLATE ID|STRING", |
| 151204 | + /* 232 */ "cmd ::= DROP INDEX ifexists fullname", |
| 151205 | + /* 233 */ "cmd ::= VACUUM vinto", |
| 151206 | + /* 234 */ "cmd ::= VACUUM nm vinto", |
| 151207 | + /* 235 */ "vinto ::= INTO expr", |
| 151208 | + /* 236 */ "vinto ::=", |
| 151209 | + /* 237 */ "cmd ::= PRAGMA nm dbnm", |
| 151210 | + /* 238 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", |
| 151211 | + /* 239 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", |
| 151212 | + /* 240 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", |
| 151213 | + /* 241 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", |
| 151214 | + /* 242 */ "plus_num ::= PLUS INTEGER|FLOAT", |
| 151215 | + /* 243 */ "minus_num ::= MINUS INTEGER|FLOAT", |
| 151216 | + /* 244 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", |
| 151217 | + /* 245 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", |
| 151218 | + /* 246 */ "trigger_time ::= BEFORE|AFTER", |
| 151219 | + /* 247 */ "trigger_time ::= INSTEAD OF", |
| 151220 | + /* 248 */ "trigger_time ::=", |
| 151221 | + /* 249 */ "trigger_event ::= DELETE|INSERT", |
| 151222 | + /* 250 */ "trigger_event ::= UPDATE", |
| 151223 | + /* 251 */ "trigger_event ::= UPDATE OF idlist", |
| 151224 | + /* 252 */ "when_clause ::=", |
| 151225 | + /* 253 */ "when_clause ::= WHEN expr", |
| 151226 | + /* 254 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", |
| 151227 | + /* 255 */ "trigger_cmd_list ::= trigger_cmd SEMI", |
| 151228 | + /* 256 */ "trnm ::= nm DOT nm", |
| 151229 | + /* 257 */ "tridxby ::= INDEXED BY nm", |
| 151230 | + /* 258 */ "tridxby ::= NOT INDEXED", |
| 151231 | + /* 259 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt", |
| 151232 | + /* 260 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt", |
| 151233 | + /* 261 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt", |
| 151234 | + /* 262 */ "trigger_cmd ::= scanpt select scanpt", |
| 151235 | + /* 263 */ "expr ::= RAISE LP IGNORE RP", |
| 151236 | + /* 264 */ "expr ::= RAISE LP raisetype COMMA nm RP", |
| 151237 | + /* 265 */ "raisetype ::= ROLLBACK", |
| 151238 | + /* 266 */ "raisetype ::= ABORT", |
| 151239 | + /* 267 */ "raisetype ::= FAIL", |
| 151240 | + /* 268 */ "cmd ::= DROP TRIGGER ifexists fullname", |
| 151241 | + /* 269 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", |
| 151242 | + /* 270 */ "cmd ::= DETACH database_kw_opt expr", |
| 151243 | + /* 271 */ "key_opt ::=", |
| 151244 | + /* 272 */ "key_opt ::= KEY expr", |
| 151245 | + /* 273 */ "cmd ::= REINDEX", |
| 151246 | + /* 274 */ "cmd ::= REINDEX nm dbnm", |
| 151247 | + /* 275 */ "cmd ::= ANALYZE", |
| 151248 | + /* 276 */ "cmd ::= ANALYZE nm dbnm", |
| 151249 | + /* 277 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", |
| 151250 | + /* 278 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", |
| 151251 | + /* 279 */ "add_column_fullname ::= fullname", |
| 151252 | + /* 280 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm", |
| 151253 | + /* 281 */ "cmd ::= create_vtab", |
| 151254 | + /* 282 */ "cmd ::= create_vtab LP vtabarglist RP", |
| 151255 | + /* 283 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", |
| 151256 | + /* 284 */ "vtabarg ::=", |
| 151257 | + /* 285 */ "vtabargtoken ::= ANY", |
| 151258 | + /* 286 */ "vtabargtoken ::= lp anylist RP", |
| 151259 | + /* 287 */ "lp ::= LP", |
| 151260 | + /* 288 */ "with ::= WITH wqlist", |
| 151261 | + /* 289 */ "with ::= WITH RECURSIVE wqlist", |
| 151262 | + /* 290 */ "wqlist ::= nm eidlist_opt AS LP select RP", |
| 151263 | + /* 291 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP", |
| 151264 | + /* 292 */ "windowdefn_list ::= windowdefn", |
| 151265 | + /* 293 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn", |
| 151266 | + /* 294 */ "windowdefn ::= nm AS LP window RP", |
| 151267 | + /* 295 */ "window ::= PARTITION BY nexprlist orderby_opt frame_opt", |
| 151268 | + /* 296 */ "window ::= nm PARTITION BY nexprlist orderby_opt frame_opt", |
| 151269 | + /* 297 */ "window ::= ORDER BY sortlist frame_opt", |
| 151270 | + /* 298 */ "window ::= nm ORDER BY sortlist frame_opt", |
| 151271 | + /* 299 */ "window ::= frame_opt", |
| 151272 | + /* 300 */ "window ::= nm frame_opt", |
| 151273 | + /* 301 */ "frame_opt ::=", |
| 151274 | + /* 302 */ "frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt", |
| 151275 | + /* 303 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt", |
| 151276 | + /* 304 */ "range_or_rows ::= RANGE|ROWS|GROUPS", |
| 151277 | + /* 305 */ "frame_bound_s ::= frame_bound", |
| 151278 | + /* 306 */ "frame_bound_s ::= UNBOUNDED PRECEDING", |
| 151279 | + /* 307 */ "frame_bound_e ::= frame_bound", |
| 151280 | + /* 308 */ "frame_bound_e ::= UNBOUNDED FOLLOWING", |
| 151281 | + /* 309 */ "frame_bound ::= expr PRECEDING|FOLLOWING", |
| 151282 | + /* 310 */ "frame_bound ::= CURRENT ROW", |
| 151283 | + /* 311 */ "frame_exclude_opt ::=", |
| 151284 | + /* 312 */ "frame_exclude_opt ::= EXCLUDE frame_exclude", |
| 151285 | + /* 313 */ "frame_exclude ::= NO OTHERS", |
| 151286 | + /* 314 */ "frame_exclude ::= CURRENT ROW", |
| 151287 | + /* 315 */ "frame_exclude ::= GROUP|TIES", |
| 151288 | + /* 316 */ "window_clause ::= WINDOW windowdefn_list", |
| 151289 | + /* 317 */ "filter_over ::= filter_clause over_clause", |
| 151290 | + /* 318 */ "filter_over ::= over_clause", |
| 151291 | + /* 319 */ "filter_over ::= filter_clause", |
| 151292 | + /* 320 */ "over_clause ::= OVER LP window RP", |
| 151293 | + /* 321 */ "over_clause ::= OVER nm", |
| 151294 | + /* 322 */ "filter_clause ::= FILTER LP WHERE expr RP", |
| 151295 | + /* 323 */ "input ::= cmdlist", |
| 151296 | + /* 324 */ "cmdlist ::= cmdlist ecmd", |
| 151297 | + /* 325 */ "cmdlist ::= ecmd", |
| 151298 | + /* 326 */ "ecmd ::= SEMI", |
| 151299 | + /* 327 */ "ecmd ::= cmdx SEMI", |
| 151300 | + /* 328 */ "ecmd ::= explain cmdx", |
| 151301 | + /* 329 */ "trans_opt ::=", |
| 151302 | + /* 330 */ "trans_opt ::= TRANSACTION", |
| 151303 | + /* 331 */ "trans_opt ::= TRANSACTION nm", |
| 151304 | + /* 332 */ "savepoint_opt ::= SAVEPOINT", |
| 151305 | + /* 333 */ "savepoint_opt ::=", |
| 151306 | + /* 334 */ "cmd ::= create_table create_table_args", |
| 151307 | + /* 335 */ "columnlist ::= columnlist COMMA columnname carglist", |
| 151308 | + /* 336 */ "columnlist ::= columnname carglist", |
| 151309 | + /* 337 */ "nm ::= ID|INDEXED", |
| 151310 | + /* 338 */ "nm ::= STRING", |
| 151311 | + /* 339 */ "nm ::= JOIN_KW", |
| 151312 | + /* 340 */ "typetoken ::= typename", |
| 151313 | + /* 341 */ "typename ::= ID|STRING", |
| 151314 | + /* 342 */ "signed ::= plus_num", |
| 151315 | + /* 343 */ "signed ::= minus_num", |
| 151316 | + /* 344 */ "carglist ::= carglist ccons", |
| 151317 | + /* 345 */ "carglist ::=", |
| 151318 | + /* 346 */ "ccons ::= NULL onconf", |
| 151319 | + /* 347 */ "conslist_opt ::= COMMA conslist", |
| 151320 | + /* 348 */ "conslist ::= conslist tconscomma tcons", |
| 151321 | + /* 349 */ "conslist ::= tcons", |
| 151322 | + /* 350 */ "tconscomma ::=", |
| 151323 | + /* 351 */ "defer_subclause_opt ::= defer_subclause", |
| 151324 | + /* 352 */ "resolvetype ::= raisetype", |
| 151325 | + /* 353 */ "selectnowith ::= oneselect", |
| 151326 | + /* 354 */ "oneselect ::= values", |
| 151327 | + /* 355 */ "sclp ::= selcollist COMMA", |
| 151328 | + /* 356 */ "as ::= ID|STRING", |
| 151329 | + /* 357 */ "expr ::= term", |
| 151330 | + /* 358 */ "likeop ::= LIKE_KW|MATCH", |
| 151331 | + /* 359 */ "exprlist ::= nexprlist", |
| 151332 | + /* 360 */ "nmnum ::= plus_num", |
| 151333 | + /* 361 */ "nmnum ::= nm", |
| 151334 | + /* 362 */ "nmnum ::= ON", |
| 151335 | + /* 363 */ "nmnum ::= DELETE", |
| 151336 | + /* 364 */ "nmnum ::= DEFAULT", |
| 151337 | + /* 365 */ "plus_num ::= INTEGER|FLOAT", |
| 151338 | + /* 366 */ "foreach_clause ::=", |
| 151339 | + /* 367 */ "foreach_clause ::= FOR EACH ROW", |
| 151340 | + /* 368 */ "trnm ::= nm", |
| 151341 | + /* 369 */ "tridxby ::=", |
| 151342 | + /* 370 */ "database_kw_opt ::= DATABASE", |
| 151343 | + /* 371 */ "database_kw_opt ::=", |
| 151344 | + /* 372 */ "kwcolumn_opt ::=", |
| 151345 | + /* 373 */ "kwcolumn_opt ::= COLUMNKW", |
| 151346 | + /* 374 */ "vtabarglist ::= vtabarg", |
| 151347 | + /* 375 */ "vtabarglist ::= vtabarglist COMMA vtabarg", |
| 151348 | + /* 376 */ "vtabarg ::= vtabarg vtabargtoken", |
| 151349 | + /* 377 */ "anylist ::=", |
| 151350 | + /* 378 */ "anylist ::= anylist LP anylist RP", |
| 151351 | + /* 379 */ "anylist ::= anylist ANY", |
| 151352 | + /* 380 */ "with ::=", |
| 150539 | 151353 | }; |
| 150540 | 151354 | #endif /* NDEBUG */ |
| 150541 | 151355 | |
| 150542 | 151356 | |
| 150543 | 151357 | #if YYSTACKDEPTH<=0 |
| | @@ -150659,101 +151473,102 @@ |
| 150659 | 151473 | ** Note: during a reduce, the only symbols destroyed are those |
| 150660 | 151474 | ** which appear on the RHS of the rule, but which are *not* used |
| 150661 | 151475 | ** inside the C code. |
| 150662 | 151476 | */ |
| 150663 | 151477 | /********* Begin destructor definitions ***************************************/ |
| 150664 | | - case 195: /* select */ |
| 150665 | | - case 228: /* selectnowith */ |
| 150666 | | - case 229: /* oneselect */ |
| 150667 | | - case 241: /* values */ |
| 150668 | | -{ |
| 150669 | | -sqlite3SelectDelete(pParse->db, (yypminor->yy391)); |
| 150670 | | -} |
| 150671 | | - break; |
| 150672 | | - case 206: /* term */ |
| 150673 | | - case 207: /* expr */ |
| 150674 | | - case 235: /* where_opt */ |
| 150675 | | - case 237: /* having_opt */ |
| 150676 | | - case 249: /* on_opt */ |
| 150677 | | - case 264: /* case_operand */ |
| 150678 | | - case 266: /* case_else */ |
| 150679 | | - case 269: /* vinto */ |
| 150680 | | - case 276: /* when_clause */ |
| 150681 | | - case 281: /* key_opt */ |
| 150682 | | - case 295: /* filter_opt */ |
| 150683 | | -{ |
| 150684 | | -sqlite3ExprDelete(pParse->db, (yypminor->yy102)); |
| 150685 | | -} |
| 150686 | | - break; |
| 150687 | | - case 211: /* eidlist_opt */ |
| 150688 | | - case 220: /* sortlist */ |
| 150689 | | - case 221: /* eidlist */ |
| 150690 | | - case 233: /* selcollist */ |
| 150691 | | - case 236: /* groupby_opt */ |
| 150692 | | - case 238: /* orderby_opt */ |
| 150693 | | - case 242: /* nexprlist */ |
| 150694 | | - case 243: /* sclp */ |
| 150695 | | - case 251: /* exprlist */ |
| 150696 | | - case 255: /* setlist */ |
| 150697 | | - case 263: /* paren_exprlist */ |
| 150698 | | - case 265: /* case_exprlist */ |
| 150699 | | - case 294: /* part_opt */ |
| 150700 | | -{ |
| 150701 | | -sqlite3ExprListDelete(pParse->db, (yypminor->yy94)); |
| 150702 | | -} |
| 150703 | | - break; |
| 150704 | | - case 227: /* fullname */ |
| 150705 | | - case 234: /* from */ |
| 150706 | | - case 245: /* seltablist */ |
| 150707 | | - case 246: /* stl_prefix */ |
| 150708 | | - case 252: /* xfullname */ |
| 150709 | | -{ |
| 150710 | | -sqlite3SrcListDelete(pParse->db, (yypminor->yy407)); |
| 150711 | | -} |
| 150712 | | - break; |
| 150713 | | - case 230: /* wqlist */ |
| 150714 | | -{ |
| 150715 | | -sqlite3WithDelete(pParse->db, (yypminor->yy243)); |
| 150716 | | -} |
| 150717 | | - break; |
| 150718 | | - case 240: /* window_clause */ |
| 150719 | | - case 290: /* windowdefn_list */ |
| 150720 | | -{ |
| 150721 | | -sqlite3WindowListDelete(pParse->db, (yypminor->yy379)); |
| 150722 | | -} |
| 150723 | | - break; |
| 150724 | | - case 250: /* using_opt */ |
| 150725 | | - case 253: /* idlist */ |
| 150726 | | - case 257: /* idlist_opt */ |
| 150727 | | -{ |
| 150728 | | -sqlite3IdListDelete(pParse->db, (yypminor->yy76)); |
| 150729 | | -} |
| 150730 | | - break; |
| 150731 | | - case 259: /* over_clause */ |
| 150732 | | - case 291: /* windowdefn */ |
| 150733 | | - case 292: /* window */ |
| 150734 | | - case 293: /* frame_opt */ |
| 150735 | | -{ |
| 150736 | | -sqlite3WindowDelete(pParse->db, (yypminor->yy379)); |
| 150737 | | -} |
| 150738 | | - break; |
| 150739 | | - case 272: /* trigger_cmd_list */ |
| 150740 | | - case 277: /* trigger_cmd */ |
| 150741 | | -{ |
| 150742 | | -sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy11)); |
| 150743 | | -} |
| 150744 | | - break; |
| 150745 | | - case 274: /* trigger_event */ |
| 150746 | | -{ |
| 150747 | | -sqlite3IdListDelete(pParse->db, (yypminor->yy298).b); |
| 150748 | | -} |
| 150749 | | - break; |
| 150750 | | - case 297: /* frame_bound */ |
| 150751 | | - case 298: /* frame_bound_s */ |
| 150752 | | - case 299: /* frame_bound_e */ |
| 150753 | | -{ |
| 150754 | | -sqlite3ExprDelete(pParse->db, (yypminor->yy389).pExpr); |
| 151478 | + case 198: /* select */ |
| 151479 | + case 231: /* selectnowith */ |
| 151480 | + case 232: /* oneselect */ |
| 151481 | + case 244: /* values */ |
| 151482 | +{ |
| 151483 | +sqlite3SelectDelete(pParse->db, (yypminor->yy25)); |
| 151484 | +} |
| 151485 | + break; |
| 151486 | + case 209: /* term */ |
| 151487 | + case 210: /* expr */ |
| 151488 | + case 238: /* where_opt */ |
| 151489 | + case 240: /* having_opt */ |
| 151490 | + case 252: /* on_opt */ |
| 151491 | + case 268: /* case_operand */ |
| 151492 | + case 270: /* case_else */ |
| 151493 | + case 273: /* vinto */ |
| 151494 | + case 280: /* when_clause */ |
| 151495 | + case 285: /* key_opt */ |
| 151496 | + case 299: /* filter_clause */ |
| 151497 | +{ |
| 151498 | +sqlite3ExprDelete(pParse->db, (yypminor->yy46)); |
| 151499 | +} |
| 151500 | + break; |
| 151501 | + case 214: /* eidlist_opt */ |
| 151502 | + case 223: /* sortlist */ |
| 151503 | + case 224: /* eidlist */ |
| 151504 | + case 236: /* selcollist */ |
| 151505 | + case 239: /* groupby_opt */ |
| 151506 | + case 241: /* orderby_opt */ |
| 151507 | + case 245: /* nexprlist */ |
| 151508 | + case 246: /* sclp */ |
| 151509 | + case 254: /* exprlist */ |
| 151510 | + case 259: /* setlist */ |
| 151511 | + case 267: /* paren_exprlist */ |
| 151512 | + case 269: /* case_exprlist */ |
| 151513 | + case 298: /* part_opt */ |
| 151514 | +{ |
| 151515 | +sqlite3ExprListDelete(pParse->db, (yypminor->yy138)); |
| 151516 | +} |
| 151517 | + break; |
| 151518 | + case 230: /* fullname */ |
| 151519 | + case 237: /* from */ |
| 151520 | + case 248: /* seltablist */ |
| 151521 | + case 249: /* stl_prefix */ |
| 151522 | + case 255: /* xfullname */ |
| 151523 | +{ |
| 151524 | +sqlite3SrcListDelete(pParse->db, (yypminor->yy609)); |
| 151525 | +} |
| 151526 | + break; |
| 151527 | + case 233: /* wqlist */ |
| 151528 | +{ |
| 151529 | +sqlite3WithDelete(pParse->db, (yypminor->yy297)); |
| 151530 | +} |
| 151531 | + break; |
| 151532 | + case 243: /* window_clause */ |
| 151533 | + case 294: /* windowdefn_list */ |
| 151534 | +{ |
| 151535 | +sqlite3WindowListDelete(pParse->db, (yypminor->yy455)); |
| 151536 | +} |
| 151537 | + break; |
| 151538 | + case 253: /* using_opt */ |
| 151539 | + case 256: /* idlist */ |
| 151540 | + case 261: /* idlist_opt */ |
| 151541 | +{ |
| 151542 | +sqlite3IdListDelete(pParse->db, (yypminor->yy406)); |
| 151543 | +} |
| 151544 | + break; |
| 151545 | + case 263: /* filter_over */ |
| 151546 | + case 295: /* windowdefn */ |
| 151547 | + case 296: /* window */ |
| 151548 | + case 297: /* frame_opt */ |
| 151549 | + case 300: /* over_clause */ |
| 151550 | +{ |
| 151551 | +sqlite3WindowDelete(pParse->db, (yypminor->yy455)); |
| 151552 | +} |
| 151553 | + break; |
| 151554 | + case 276: /* trigger_cmd_list */ |
| 151555 | + case 281: /* trigger_cmd */ |
| 151556 | +{ |
| 151557 | +sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy527)); |
| 151558 | +} |
| 151559 | + break; |
| 151560 | + case 278: /* trigger_event */ |
| 151561 | +{ |
| 151562 | +sqlite3IdListDelete(pParse->db, (yypminor->yy572).b); |
| 151563 | +} |
| 151564 | + break; |
| 151565 | + case 302: /* frame_bound */ |
| 151566 | + case 303: /* frame_bound_s */ |
| 151567 | + case 304: /* frame_bound_e */ |
| 151568 | +{ |
| 151569 | +sqlite3ExprDelete(pParse->db, (yypminor->yy57).pExpr); |
| 150755 | 151570 | } |
| 150756 | 151571 | break; |
| 150757 | 151572 | /********* End destructor definitions *****************************************/ |
| 150758 | 151573 | default: break; /* If no destructor action specified: do nothing */ |
| 150759 | 151574 | } |
| | @@ -150875,19 +151690,22 @@ |
| 150875 | 151690 | yycoverage[stateno][iLookAhead] = 1; |
| 150876 | 151691 | #endif |
| 150877 | 151692 | do{ |
| 150878 | 151693 | i = yy_shift_ofst[stateno]; |
| 150879 | 151694 | assert( i>=0 ); |
| 150880 | | - /* assert( i+YYNTOKEN<=(int)YY_NLOOKAHEAD ); */ |
| 151695 | + assert( i<=YY_ACTTAB_COUNT ); |
| 151696 | + assert( i+YYNTOKEN<=(int)YY_NLOOKAHEAD ); |
| 150881 | 151697 | assert( iLookAhead!=YYNOCODE ); |
| 150882 | 151698 | assert( iLookAhead < YYNTOKEN ); |
| 150883 | 151699 | i += iLookAhead; |
| 150884 | | - if( i>=YY_NLOOKAHEAD || yy_lookahead[i]!=iLookAhead ){ |
| 151700 | + assert( i<(int)YY_NLOOKAHEAD ); |
| 151701 | + if( yy_lookahead[i]!=iLookAhead ){ |
| 150885 | 151702 | #ifdef YYFALLBACK |
| 150886 | 151703 | YYCODETYPE iFallback; /* Fallback token */ |
| 150887 | | - if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0]) |
| 150888 | | - && (iFallback = yyFallback[iLookAhead])!=0 ){ |
| 151704 | + assert( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0]) ); |
| 151705 | + iFallback = yyFallback[iLookAhead]; |
| 151706 | + if( iFallback!=0 ){ |
| 150889 | 151707 | #ifndef NDEBUG |
| 150890 | 151708 | if( yyTraceFILE ){ |
| 150891 | 151709 | fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n", |
| 150892 | 151710 | yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); |
| 150893 | 151711 | } |
| | @@ -150898,20 +151716,12 @@ |
| 150898 | 151716 | } |
| 150899 | 151717 | #endif |
| 150900 | 151718 | #ifdef YYWILDCARD |
| 150901 | 151719 | { |
| 150902 | 151720 | int j = i - iLookAhead + YYWILDCARD; |
| 150903 | | - if( |
| 150904 | | -#if YY_SHIFT_MIN+YYWILDCARD<0 |
| 150905 | | - j>=0 && |
| 150906 | | -#endif |
| 150907 | | -#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT |
| 150908 | | - j<YY_ACTTAB_COUNT && |
| 150909 | | -#endif |
| 150910 | | - j<(int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])) && |
| 150911 | | - yy_lookahead[j]==YYWILDCARD && iLookAhead>0 |
| 150912 | | - ){ |
| 151721 | + assert( j<(int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])) ); |
| 151722 | + if( yy_lookahead[j]==YYWILDCARD && iLookAhead>0 ){ |
| 150913 | 151723 | #ifndef NDEBUG |
| 150914 | 151724 | if( yyTraceFILE ){ |
| 150915 | 151725 | fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", |
| 150916 | 151726 | yyTracePrompt, yyTokenName[iLookAhead], |
| 150917 | 151727 | yyTokenName[YYWILDCARD]); |
| | @@ -150921,10 +151731,11 @@ |
| 150921 | 151731 | } |
| 150922 | 151732 | } |
| 150923 | 151733 | #endif /* YYWILDCARD */ |
| 150924 | 151734 | return yy_default[stateno]; |
| 150925 | 151735 | }else{ |
| 151736 | + assert( i>=0 && i<sizeof(yy_action)/sizeof(yy_action[0]) ); |
| 150926 | 151737 | return yy_action[i]; |
| 150927 | 151738 | } |
| 150928 | 151739 | }while(1); |
| 150929 | 151740 | } |
| 150930 | 151741 | |
| | @@ -151044,386 +151855,391 @@ |
| 151044 | 151855 | } |
| 151045 | 151856 | |
| 151046 | 151857 | /* For rule J, yyRuleInfoLhs[J] contains the symbol on the left-hand side |
| 151047 | 151858 | ** of that rule */ |
| 151048 | 151859 | static const YYCODETYPE yyRuleInfoLhs[] = { |
| 151049 | | - 180, /* (0) explain ::= EXPLAIN */ |
| 151050 | | - 180, /* (1) explain ::= EXPLAIN QUERY PLAN */ |
| 151051 | | - 179, /* (2) cmdx ::= cmd */ |
| 151052 | | - 181, /* (3) cmd ::= BEGIN transtype trans_opt */ |
| 151053 | | - 182, /* (4) transtype ::= */ |
| 151054 | | - 182, /* (5) transtype ::= DEFERRED */ |
| 151055 | | - 182, /* (6) transtype ::= IMMEDIATE */ |
| 151056 | | - 182, /* (7) transtype ::= EXCLUSIVE */ |
| 151057 | | - 181, /* (8) cmd ::= COMMIT|END trans_opt */ |
| 151058 | | - 181, /* (9) cmd ::= ROLLBACK trans_opt */ |
| 151059 | | - 181, /* (10) cmd ::= SAVEPOINT nm */ |
| 151060 | | - 181, /* (11) cmd ::= RELEASE savepoint_opt nm */ |
| 151061 | | - 181, /* (12) cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ |
| 151062 | | - 186, /* (13) create_table ::= createkw temp TABLE ifnotexists nm dbnm */ |
| 151063 | | - 188, /* (14) createkw ::= CREATE */ |
| 151064 | | - 190, /* (15) ifnotexists ::= */ |
| 151065 | | - 190, /* (16) ifnotexists ::= IF NOT EXISTS */ |
| 151066 | | - 189, /* (17) temp ::= TEMP */ |
| 151067 | | - 189, /* (18) temp ::= */ |
| 151068 | | - 187, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_options */ |
| 151069 | | - 187, /* (20) create_table_args ::= AS select */ |
| 151070 | | - 194, /* (21) table_options ::= */ |
| 151071 | | - 194, /* (22) table_options ::= WITHOUT nm */ |
| 151072 | | - 196, /* (23) columnname ::= nm typetoken */ |
| 151073 | | - 198, /* (24) typetoken ::= */ |
| 151074 | | - 198, /* (25) typetoken ::= typename LP signed RP */ |
| 151075 | | - 198, /* (26) typetoken ::= typename LP signed COMMA signed RP */ |
| 151076 | | - 199, /* (27) typename ::= typename ID|STRING */ |
| 151077 | | - 203, /* (28) scanpt ::= */ |
| 151078 | | - 204, /* (29) scantok ::= */ |
| 151079 | | - 205, /* (30) ccons ::= CONSTRAINT nm */ |
| 151080 | | - 205, /* (31) ccons ::= DEFAULT scantok term */ |
| 151081 | | - 205, /* (32) ccons ::= DEFAULT LP expr RP */ |
| 151082 | | - 205, /* (33) ccons ::= DEFAULT PLUS scantok term */ |
| 151083 | | - 205, /* (34) ccons ::= DEFAULT MINUS scantok term */ |
| 151084 | | - 205, /* (35) ccons ::= DEFAULT scantok ID|INDEXED */ |
| 151085 | | - 205, /* (36) ccons ::= NOT NULL onconf */ |
| 151086 | | - 205, /* (37) ccons ::= PRIMARY KEY sortorder onconf autoinc */ |
| 151087 | | - 205, /* (38) ccons ::= UNIQUE onconf */ |
| 151088 | | - 205, /* (39) ccons ::= CHECK LP expr RP */ |
| 151089 | | - 205, /* (40) ccons ::= REFERENCES nm eidlist_opt refargs */ |
| 151090 | | - 205, /* (41) ccons ::= defer_subclause */ |
| 151091 | | - 205, /* (42) ccons ::= COLLATE ID|STRING */ |
| 151092 | | - 210, /* (43) autoinc ::= */ |
| 151093 | | - 210, /* (44) autoinc ::= AUTOINCR */ |
| 151094 | | - 212, /* (45) refargs ::= */ |
| 151095 | | - 212, /* (46) refargs ::= refargs refarg */ |
| 151096 | | - 214, /* (47) refarg ::= MATCH nm */ |
| 151097 | | - 214, /* (48) refarg ::= ON INSERT refact */ |
| 151098 | | - 214, /* (49) refarg ::= ON DELETE refact */ |
| 151099 | | - 214, /* (50) refarg ::= ON UPDATE refact */ |
| 151100 | | - 215, /* (51) refact ::= SET NULL */ |
| 151101 | | - 215, /* (52) refact ::= SET DEFAULT */ |
| 151102 | | - 215, /* (53) refact ::= CASCADE */ |
| 151103 | | - 215, /* (54) refact ::= RESTRICT */ |
| 151104 | | - 215, /* (55) refact ::= NO ACTION */ |
| 151105 | | - 213, /* (56) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ |
| 151106 | | - 213, /* (57) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ |
| 151107 | | - 216, /* (58) init_deferred_pred_opt ::= */ |
| 151108 | | - 216, /* (59) init_deferred_pred_opt ::= INITIALLY DEFERRED */ |
| 151109 | | - 216, /* (60) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ |
| 151110 | | - 193, /* (61) conslist_opt ::= */ |
| 151111 | | - 218, /* (62) tconscomma ::= COMMA */ |
| 151112 | | - 219, /* (63) tcons ::= CONSTRAINT nm */ |
| 151113 | | - 219, /* (64) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ |
| 151114 | | - 219, /* (65) tcons ::= UNIQUE LP sortlist RP onconf */ |
| 151115 | | - 219, /* (66) tcons ::= CHECK LP expr RP onconf */ |
| 151116 | | - 219, /* (67) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ |
| 151117 | | - 222, /* (68) defer_subclause_opt ::= */ |
| 151118 | | - 208, /* (69) onconf ::= */ |
| 151119 | | - 208, /* (70) onconf ::= ON CONFLICT resolvetype */ |
| 151120 | | - 223, /* (71) orconf ::= */ |
| 151121 | | - 223, /* (72) orconf ::= OR resolvetype */ |
| 151122 | | - 224, /* (73) resolvetype ::= IGNORE */ |
| 151123 | | - 224, /* (74) resolvetype ::= REPLACE */ |
| 151124 | | - 181, /* (75) cmd ::= DROP TABLE ifexists fullname */ |
| 151125 | | - 226, /* (76) ifexists ::= IF EXISTS */ |
| 151126 | | - 226, /* (77) ifexists ::= */ |
| 151127 | | - 181, /* (78) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ |
| 151128 | | - 181, /* (79) cmd ::= DROP VIEW ifexists fullname */ |
| 151129 | | - 181, /* (80) cmd ::= select */ |
| 151130 | | - 195, /* (81) select ::= WITH wqlist selectnowith */ |
| 151131 | | - 195, /* (82) select ::= WITH RECURSIVE wqlist selectnowith */ |
| 151132 | | - 195, /* (83) select ::= selectnowith */ |
| 151133 | | - 228, /* (84) selectnowith ::= selectnowith multiselect_op oneselect */ |
| 151134 | | - 231, /* (85) multiselect_op ::= UNION */ |
| 151135 | | - 231, /* (86) multiselect_op ::= UNION ALL */ |
| 151136 | | - 231, /* (87) multiselect_op ::= EXCEPT|INTERSECT */ |
| 151137 | | - 229, /* (88) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ |
| 151138 | | - 229, /* (89) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ |
| 151139 | | - 241, /* (90) values ::= VALUES LP nexprlist RP */ |
| 151140 | | - 241, /* (91) values ::= values COMMA LP nexprlist RP */ |
| 151141 | | - 232, /* (92) distinct ::= DISTINCT */ |
| 151142 | | - 232, /* (93) distinct ::= ALL */ |
| 151143 | | - 232, /* (94) distinct ::= */ |
| 151144 | | - 243, /* (95) sclp ::= */ |
| 151145 | | - 233, /* (96) selcollist ::= sclp scanpt expr scanpt as */ |
| 151146 | | - 233, /* (97) selcollist ::= sclp scanpt STAR */ |
| 151147 | | - 233, /* (98) selcollist ::= sclp scanpt nm DOT STAR */ |
| 151148 | | - 244, /* (99) as ::= AS nm */ |
| 151149 | | - 244, /* (100) as ::= */ |
| 151150 | | - 234, /* (101) from ::= */ |
| 151151 | | - 234, /* (102) from ::= FROM seltablist */ |
| 151152 | | - 246, /* (103) stl_prefix ::= seltablist joinop */ |
| 151153 | | - 246, /* (104) stl_prefix ::= */ |
| 151154 | | - 245, /* (105) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ |
| 151155 | | - 245, /* (106) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ |
| 151156 | | - 245, /* (107) seltablist ::= stl_prefix LP select RP as on_opt using_opt */ |
| 151157 | | - 245, /* (108) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ |
| 151158 | | - 191, /* (109) dbnm ::= */ |
| 151159 | | - 191, /* (110) dbnm ::= DOT nm */ |
| 151160 | | - 227, /* (111) fullname ::= nm */ |
| 151161 | | - 227, /* (112) fullname ::= nm DOT nm */ |
| 151162 | | - 252, /* (113) xfullname ::= nm */ |
| 151163 | | - 252, /* (114) xfullname ::= nm DOT nm */ |
| 151164 | | - 252, /* (115) xfullname ::= nm DOT nm AS nm */ |
| 151165 | | - 252, /* (116) xfullname ::= nm AS nm */ |
| 151166 | | - 247, /* (117) joinop ::= COMMA|JOIN */ |
| 151167 | | - 247, /* (118) joinop ::= JOIN_KW JOIN */ |
| 151168 | | - 247, /* (119) joinop ::= JOIN_KW nm JOIN */ |
| 151169 | | - 247, /* (120) joinop ::= JOIN_KW nm nm JOIN */ |
| 151170 | | - 249, /* (121) on_opt ::= ON expr */ |
| 151171 | | - 249, /* (122) on_opt ::= */ |
| 151172 | | - 248, /* (123) indexed_opt ::= */ |
| 151173 | | - 248, /* (124) indexed_opt ::= INDEXED BY nm */ |
| 151174 | | - 248, /* (125) indexed_opt ::= NOT INDEXED */ |
| 151175 | | - 250, /* (126) using_opt ::= USING LP idlist RP */ |
| 151176 | | - 250, /* (127) using_opt ::= */ |
| 151177 | | - 238, /* (128) orderby_opt ::= */ |
| 151178 | | - 238, /* (129) orderby_opt ::= ORDER BY sortlist */ |
| 151179 | | - 220, /* (130) sortlist ::= sortlist COMMA expr sortorder */ |
| 151180 | | - 220, /* (131) sortlist ::= expr sortorder */ |
| 151181 | | - 209, /* (132) sortorder ::= ASC */ |
| 151182 | | - 209, /* (133) sortorder ::= DESC */ |
| 151183 | | - 209, /* (134) sortorder ::= */ |
| 151184 | | - 236, /* (135) groupby_opt ::= */ |
| 151185 | | - 236, /* (136) groupby_opt ::= GROUP BY nexprlist */ |
| 151186 | | - 237, /* (137) having_opt ::= */ |
| 151187 | | - 237, /* (138) having_opt ::= HAVING expr */ |
| 151188 | | - 239, /* (139) limit_opt ::= */ |
| 151189 | | - 239, /* (140) limit_opt ::= LIMIT expr */ |
| 151190 | | - 239, /* (141) limit_opt ::= LIMIT expr OFFSET expr */ |
| 151191 | | - 239, /* (142) limit_opt ::= LIMIT expr COMMA expr */ |
| 151192 | | - 181, /* (143) cmd ::= with DELETE FROM xfullname indexed_opt where_opt */ |
| 151193 | | - 235, /* (144) where_opt ::= */ |
| 151194 | | - 235, /* (145) where_opt ::= WHERE expr */ |
| 151195 | | - 181, /* (146) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ |
| 151196 | | - 255, /* (147) setlist ::= setlist COMMA nm EQ expr */ |
| 151197 | | - 255, /* (148) setlist ::= setlist COMMA LP idlist RP EQ expr */ |
| 151198 | | - 255, /* (149) setlist ::= nm EQ expr */ |
| 151199 | | - 255, /* (150) setlist ::= LP idlist RP EQ expr */ |
| 151200 | | - 181, /* (151) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ |
| 151201 | | - 181, /* (152) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */ |
| 151202 | | - 258, /* (153) upsert ::= */ |
| 151203 | | - 258, /* (154) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */ |
| 151204 | | - 258, /* (155) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */ |
| 151205 | | - 258, /* (156) upsert ::= ON CONFLICT DO NOTHING */ |
| 151206 | | - 256, /* (157) insert_cmd ::= INSERT orconf */ |
| 151207 | | - 256, /* (158) insert_cmd ::= REPLACE */ |
| 151208 | | - 257, /* (159) idlist_opt ::= */ |
| 151209 | | - 257, /* (160) idlist_opt ::= LP idlist RP */ |
| 151210 | | - 253, /* (161) idlist ::= idlist COMMA nm */ |
| 151211 | | - 253, /* (162) idlist ::= nm */ |
| 151212 | | - 207, /* (163) expr ::= LP expr RP */ |
| 151213 | | - 207, /* (164) expr ::= ID|INDEXED */ |
| 151214 | | - 207, /* (165) expr ::= JOIN_KW */ |
| 151215 | | - 207, /* (166) expr ::= nm DOT nm */ |
| 151216 | | - 207, /* (167) expr ::= nm DOT nm DOT nm */ |
| 151217 | | - 206, /* (168) term ::= NULL|FLOAT|BLOB */ |
| 151218 | | - 206, /* (169) term ::= STRING */ |
| 151219 | | - 206, /* (170) term ::= INTEGER */ |
| 151220 | | - 207, /* (171) expr ::= VARIABLE */ |
| 151221 | | - 207, /* (172) expr ::= expr COLLATE ID|STRING */ |
| 151222 | | - 207, /* (173) expr ::= CAST LP expr AS typetoken RP */ |
| 151223 | | - 207, /* (174) expr ::= ID|INDEXED LP distinct exprlist RP */ |
| 151224 | | - 207, /* (175) expr ::= ID|INDEXED LP STAR RP */ |
| 151225 | | - 207, /* (176) expr ::= ID|INDEXED LP distinct exprlist RP over_clause */ |
| 151226 | | - 207, /* (177) expr ::= ID|INDEXED LP STAR RP over_clause */ |
| 151227 | | - 206, /* (178) term ::= CTIME_KW */ |
| 151228 | | - 207, /* (179) expr ::= LP nexprlist COMMA expr RP */ |
| 151229 | | - 207, /* (180) expr ::= expr AND expr */ |
| 151230 | | - 207, /* (181) expr ::= expr OR expr */ |
| 151231 | | - 207, /* (182) expr ::= expr LT|GT|GE|LE expr */ |
| 151232 | | - 207, /* (183) expr ::= expr EQ|NE expr */ |
| 151233 | | - 207, /* (184) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ |
| 151234 | | - 207, /* (185) expr ::= expr PLUS|MINUS expr */ |
| 151235 | | - 207, /* (186) expr ::= expr STAR|SLASH|REM expr */ |
| 151236 | | - 207, /* (187) expr ::= expr CONCAT expr */ |
| 151237 | | - 260, /* (188) likeop ::= NOT LIKE_KW|MATCH */ |
| 151238 | | - 207, /* (189) expr ::= expr likeop expr */ |
| 151239 | | - 207, /* (190) expr ::= expr likeop expr ESCAPE expr */ |
| 151240 | | - 207, /* (191) expr ::= expr ISNULL|NOTNULL */ |
| 151241 | | - 207, /* (192) expr ::= expr NOT NULL */ |
| 151242 | | - 207, /* (193) expr ::= expr IS expr */ |
| 151243 | | - 207, /* (194) expr ::= expr IS NOT expr */ |
| 151244 | | - 207, /* (195) expr ::= NOT expr */ |
| 151245 | | - 207, /* (196) expr ::= BITNOT expr */ |
| 151246 | | - 207, /* (197) expr ::= PLUS|MINUS expr */ |
| 151247 | | - 261, /* (198) between_op ::= BETWEEN */ |
| 151248 | | - 261, /* (199) between_op ::= NOT BETWEEN */ |
| 151249 | | - 207, /* (200) expr ::= expr between_op expr AND expr */ |
| 151250 | | - 262, /* (201) in_op ::= IN */ |
| 151251 | | - 262, /* (202) in_op ::= NOT IN */ |
| 151252 | | - 207, /* (203) expr ::= expr in_op LP exprlist RP */ |
| 151253 | | - 207, /* (204) expr ::= LP select RP */ |
| 151254 | | - 207, /* (205) expr ::= expr in_op LP select RP */ |
| 151255 | | - 207, /* (206) expr ::= expr in_op nm dbnm paren_exprlist */ |
| 151256 | | - 207, /* (207) expr ::= EXISTS LP select RP */ |
| 151257 | | - 207, /* (208) expr ::= CASE case_operand case_exprlist case_else END */ |
| 151258 | | - 265, /* (209) case_exprlist ::= case_exprlist WHEN expr THEN expr */ |
| 151259 | | - 265, /* (210) case_exprlist ::= WHEN expr THEN expr */ |
| 151260 | | - 266, /* (211) case_else ::= ELSE expr */ |
| 151261 | | - 266, /* (212) case_else ::= */ |
| 151262 | | - 264, /* (213) case_operand ::= expr */ |
| 151263 | | - 264, /* (214) case_operand ::= */ |
| 151264 | | - 251, /* (215) exprlist ::= */ |
| 151265 | | - 242, /* (216) nexprlist ::= nexprlist COMMA expr */ |
| 151266 | | - 242, /* (217) nexprlist ::= expr */ |
| 151267 | | - 263, /* (218) paren_exprlist ::= */ |
| 151268 | | - 263, /* (219) paren_exprlist ::= LP exprlist RP */ |
| 151269 | | - 181, /* (220) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ |
| 151270 | | - 267, /* (221) uniqueflag ::= UNIQUE */ |
| 151271 | | - 267, /* (222) uniqueflag ::= */ |
| 151272 | | - 211, /* (223) eidlist_opt ::= */ |
| 151273 | | - 211, /* (224) eidlist_opt ::= LP eidlist RP */ |
| 151274 | | - 221, /* (225) eidlist ::= eidlist COMMA nm collate sortorder */ |
| 151275 | | - 221, /* (226) eidlist ::= nm collate sortorder */ |
| 151276 | | - 268, /* (227) collate ::= */ |
| 151277 | | - 268, /* (228) collate ::= COLLATE ID|STRING */ |
| 151278 | | - 181, /* (229) cmd ::= DROP INDEX ifexists fullname */ |
| 151279 | | - 181, /* (230) cmd ::= VACUUM vinto */ |
| 151280 | | - 181, /* (231) cmd ::= VACUUM nm vinto */ |
| 151281 | | - 269, /* (232) vinto ::= INTO expr */ |
| 151282 | | - 269, /* (233) vinto ::= */ |
| 151283 | | - 181, /* (234) cmd ::= PRAGMA nm dbnm */ |
| 151284 | | - 181, /* (235) cmd ::= PRAGMA nm dbnm EQ nmnum */ |
| 151285 | | - 181, /* (236) cmd ::= PRAGMA nm dbnm LP nmnum RP */ |
| 151286 | | - 181, /* (237) cmd ::= PRAGMA nm dbnm EQ minus_num */ |
| 151287 | | - 181, /* (238) cmd ::= PRAGMA nm dbnm LP minus_num RP */ |
| 151288 | | - 201, /* (239) plus_num ::= PLUS INTEGER|FLOAT */ |
| 151289 | | - 202, /* (240) minus_num ::= MINUS INTEGER|FLOAT */ |
| 151290 | | - 181, /* (241) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ |
| 151291 | | - 271, /* (242) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ |
| 151292 | | - 273, /* (243) trigger_time ::= BEFORE|AFTER */ |
| 151293 | | - 273, /* (244) trigger_time ::= INSTEAD OF */ |
| 151294 | | - 273, /* (245) trigger_time ::= */ |
| 151295 | | - 274, /* (246) trigger_event ::= DELETE|INSERT */ |
| 151296 | | - 274, /* (247) trigger_event ::= UPDATE */ |
| 151297 | | - 274, /* (248) trigger_event ::= UPDATE OF idlist */ |
| 151298 | | - 276, /* (249) when_clause ::= */ |
| 151299 | | - 276, /* (250) when_clause ::= WHEN expr */ |
| 151300 | | - 272, /* (251) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ |
| 151301 | | - 272, /* (252) trigger_cmd_list ::= trigger_cmd SEMI */ |
| 151302 | | - 278, /* (253) trnm ::= nm DOT nm */ |
| 151303 | | - 279, /* (254) tridxby ::= INDEXED BY nm */ |
| 151304 | | - 279, /* (255) tridxby ::= NOT INDEXED */ |
| 151305 | | - 277, /* (256) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ |
| 151306 | | - 277, /* (257) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ |
| 151307 | | - 277, /* (258) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ |
| 151308 | | - 277, /* (259) trigger_cmd ::= scanpt select scanpt */ |
| 151309 | | - 207, /* (260) expr ::= RAISE LP IGNORE RP */ |
| 151310 | | - 207, /* (261) expr ::= RAISE LP raisetype COMMA nm RP */ |
| 151311 | | - 225, /* (262) raisetype ::= ROLLBACK */ |
| 151312 | | - 225, /* (263) raisetype ::= ABORT */ |
| 151313 | | - 225, /* (264) raisetype ::= FAIL */ |
| 151314 | | - 181, /* (265) cmd ::= DROP TRIGGER ifexists fullname */ |
| 151315 | | - 181, /* (266) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ |
| 151316 | | - 181, /* (267) cmd ::= DETACH database_kw_opt expr */ |
| 151317 | | - 281, /* (268) key_opt ::= */ |
| 151318 | | - 281, /* (269) key_opt ::= KEY expr */ |
| 151319 | | - 181, /* (270) cmd ::= REINDEX */ |
| 151320 | | - 181, /* (271) cmd ::= REINDEX nm dbnm */ |
| 151321 | | - 181, /* (272) cmd ::= ANALYZE */ |
| 151322 | | - 181, /* (273) cmd ::= ANALYZE nm dbnm */ |
| 151323 | | - 181, /* (274) cmd ::= ALTER TABLE fullname RENAME TO nm */ |
| 151324 | | - 181, /* (275) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ |
| 151325 | | - 282, /* (276) add_column_fullname ::= fullname */ |
| 151326 | | - 181, /* (277) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ |
| 151327 | | - 181, /* (278) cmd ::= create_vtab */ |
| 151328 | | - 181, /* (279) cmd ::= create_vtab LP vtabarglist RP */ |
| 151329 | | - 284, /* (280) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ |
| 151330 | | - 286, /* (281) vtabarg ::= */ |
| 151331 | | - 287, /* (282) vtabargtoken ::= ANY */ |
| 151332 | | - 287, /* (283) vtabargtoken ::= lp anylist RP */ |
| 151333 | | - 288, /* (284) lp ::= LP */ |
| 151334 | | - 254, /* (285) with ::= WITH wqlist */ |
| 151335 | | - 254, /* (286) with ::= WITH RECURSIVE wqlist */ |
| 151336 | | - 230, /* (287) wqlist ::= nm eidlist_opt AS LP select RP */ |
| 151337 | | - 230, /* (288) wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ |
| 151338 | | - 290, /* (289) windowdefn_list ::= windowdefn */ |
| 151339 | | - 290, /* (290) windowdefn_list ::= windowdefn_list COMMA windowdefn */ |
| 151340 | | - 291, /* (291) windowdefn ::= nm AS LP window RP */ |
| 151341 | | - 292, /* (292) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ |
| 151342 | | - 292, /* (293) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ |
| 151343 | | - 292, /* (294) window ::= ORDER BY sortlist frame_opt */ |
| 151344 | | - 292, /* (295) window ::= nm ORDER BY sortlist frame_opt */ |
| 151345 | | - 292, /* (296) window ::= frame_opt */ |
| 151346 | | - 292, /* (297) window ::= nm frame_opt */ |
| 151347 | | - 293, /* (298) frame_opt ::= */ |
| 151348 | | - 293, /* (299) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ |
| 151349 | | - 293, /* (300) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ |
| 151350 | | - 296, /* (301) range_or_rows ::= RANGE|ROWS|GROUPS */ |
| 151351 | | - 298, /* (302) frame_bound_s ::= frame_bound */ |
| 151352 | | - 298, /* (303) frame_bound_s ::= UNBOUNDED PRECEDING */ |
| 151353 | | - 299, /* (304) frame_bound_e ::= frame_bound */ |
| 151354 | | - 299, /* (305) frame_bound_e ::= UNBOUNDED FOLLOWING */ |
| 151355 | | - 297, /* (306) frame_bound ::= expr PRECEDING|FOLLOWING */ |
| 151356 | | - 297, /* (307) frame_bound ::= CURRENT ROW */ |
| 151357 | | - 300, /* (308) frame_exclude_opt ::= */ |
| 151358 | | - 300, /* (309) frame_exclude_opt ::= EXCLUDE frame_exclude */ |
| 151359 | | - 301, /* (310) frame_exclude ::= NO OTHERS */ |
| 151360 | | - 301, /* (311) frame_exclude ::= CURRENT ROW */ |
| 151361 | | - 301, /* (312) frame_exclude ::= GROUP|TIES */ |
| 151362 | | - 240, /* (313) window_clause ::= WINDOW windowdefn_list */ |
| 151363 | | - 259, /* (314) over_clause ::= filter_opt OVER LP window RP */ |
| 151364 | | - 259, /* (315) over_clause ::= filter_opt OVER nm */ |
| 151365 | | - 295, /* (316) filter_opt ::= */ |
| 151366 | | - 295, /* (317) filter_opt ::= FILTER LP WHERE expr RP */ |
| 151367 | | - 176, /* (318) input ::= cmdlist */ |
| 151368 | | - 177, /* (319) cmdlist ::= cmdlist ecmd */ |
| 151369 | | - 177, /* (320) cmdlist ::= ecmd */ |
| 151370 | | - 178, /* (321) ecmd ::= SEMI */ |
| 151371 | | - 178, /* (322) ecmd ::= cmdx SEMI */ |
| 151372 | | - 178, /* (323) ecmd ::= explain cmdx */ |
| 151373 | | - 183, /* (324) trans_opt ::= */ |
| 151374 | | - 183, /* (325) trans_opt ::= TRANSACTION */ |
| 151375 | | - 183, /* (326) trans_opt ::= TRANSACTION nm */ |
| 151376 | | - 185, /* (327) savepoint_opt ::= SAVEPOINT */ |
| 151377 | | - 185, /* (328) savepoint_opt ::= */ |
| 151378 | | - 181, /* (329) cmd ::= create_table create_table_args */ |
| 151379 | | - 192, /* (330) columnlist ::= columnlist COMMA columnname carglist */ |
| 151380 | | - 192, /* (331) columnlist ::= columnname carglist */ |
| 151381 | | - 184, /* (332) nm ::= ID|INDEXED */ |
| 151382 | | - 184, /* (333) nm ::= STRING */ |
| 151383 | | - 184, /* (334) nm ::= JOIN_KW */ |
| 151384 | | - 198, /* (335) typetoken ::= typename */ |
| 151385 | | - 199, /* (336) typename ::= ID|STRING */ |
| 151386 | | - 200, /* (337) signed ::= plus_num */ |
| 151387 | | - 200, /* (338) signed ::= minus_num */ |
| 151388 | | - 197, /* (339) carglist ::= carglist ccons */ |
| 151389 | | - 197, /* (340) carglist ::= */ |
| 151390 | | - 205, /* (341) ccons ::= NULL onconf */ |
| 151391 | | - 193, /* (342) conslist_opt ::= COMMA conslist */ |
| 151392 | | - 217, /* (343) conslist ::= conslist tconscomma tcons */ |
| 151393 | | - 217, /* (344) conslist ::= tcons */ |
| 151394 | | - 218, /* (345) tconscomma ::= */ |
| 151395 | | - 222, /* (346) defer_subclause_opt ::= defer_subclause */ |
| 151396 | | - 224, /* (347) resolvetype ::= raisetype */ |
| 151397 | | - 228, /* (348) selectnowith ::= oneselect */ |
| 151398 | | - 229, /* (349) oneselect ::= values */ |
| 151399 | | - 243, /* (350) sclp ::= selcollist COMMA */ |
| 151400 | | - 244, /* (351) as ::= ID|STRING */ |
| 151401 | | - 207, /* (352) expr ::= term */ |
| 151402 | | - 260, /* (353) likeop ::= LIKE_KW|MATCH */ |
| 151403 | | - 251, /* (354) exprlist ::= nexprlist */ |
| 151404 | | - 270, /* (355) nmnum ::= plus_num */ |
| 151405 | | - 270, /* (356) nmnum ::= nm */ |
| 151406 | | - 270, /* (357) nmnum ::= ON */ |
| 151407 | | - 270, /* (358) nmnum ::= DELETE */ |
| 151408 | | - 270, /* (359) nmnum ::= DEFAULT */ |
| 151409 | | - 201, /* (360) plus_num ::= INTEGER|FLOAT */ |
| 151410 | | - 275, /* (361) foreach_clause ::= */ |
| 151411 | | - 275, /* (362) foreach_clause ::= FOR EACH ROW */ |
| 151412 | | - 278, /* (363) trnm ::= nm */ |
| 151413 | | - 279, /* (364) tridxby ::= */ |
| 151414 | | - 280, /* (365) database_kw_opt ::= DATABASE */ |
| 151415 | | - 280, /* (366) database_kw_opt ::= */ |
| 151416 | | - 283, /* (367) kwcolumn_opt ::= */ |
| 151417 | | - 283, /* (368) kwcolumn_opt ::= COLUMNKW */ |
| 151418 | | - 285, /* (369) vtabarglist ::= vtabarg */ |
| 151419 | | - 285, /* (370) vtabarglist ::= vtabarglist COMMA vtabarg */ |
| 151420 | | - 286, /* (371) vtabarg ::= vtabarg vtabargtoken */ |
| 151421 | | - 289, /* (372) anylist ::= */ |
| 151422 | | - 289, /* (373) anylist ::= anylist LP anylist RP */ |
| 151423 | | - 289, /* (374) anylist ::= anylist ANY */ |
| 151424 | | - 254, /* (375) with ::= */ |
| 151860 | + 183, /* (0) explain ::= EXPLAIN */ |
| 151861 | + 183, /* (1) explain ::= EXPLAIN QUERY PLAN */ |
| 151862 | + 182, /* (2) cmdx ::= cmd */ |
| 151863 | + 184, /* (3) cmd ::= BEGIN transtype trans_opt */ |
| 151864 | + 185, /* (4) transtype ::= */ |
| 151865 | + 185, /* (5) transtype ::= DEFERRED */ |
| 151866 | + 185, /* (6) transtype ::= IMMEDIATE */ |
| 151867 | + 185, /* (7) transtype ::= EXCLUSIVE */ |
| 151868 | + 184, /* (8) cmd ::= COMMIT|END trans_opt */ |
| 151869 | + 184, /* (9) cmd ::= ROLLBACK trans_opt */ |
| 151870 | + 184, /* (10) cmd ::= SAVEPOINT nm */ |
| 151871 | + 184, /* (11) cmd ::= RELEASE savepoint_opt nm */ |
| 151872 | + 184, /* (12) cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ |
| 151873 | + 189, /* (13) create_table ::= createkw temp TABLE ifnotexists nm dbnm */ |
| 151874 | + 191, /* (14) createkw ::= CREATE */ |
| 151875 | + 193, /* (15) ifnotexists ::= */ |
| 151876 | + 193, /* (16) ifnotexists ::= IF NOT EXISTS */ |
| 151877 | + 192, /* (17) temp ::= TEMP */ |
| 151878 | + 192, /* (18) temp ::= */ |
| 151879 | + 190, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_options */ |
| 151880 | + 190, /* (20) create_table_args ::= AS select */ |
| 151881 | + 197, /* (21) table_options ::= */ |
| 151882 | + 197, /* (22) table_options ::= WITHOUT nm */ |
| 151883 | + 199, /* (23) columnname ::= nm typetoken */ |
| 151884 | + 201, /* (24) typetoken ::= */ |
| 151885 | + 201, /* (25) typetoken ::= typename LP signed RP */ |
| 151886 | + 201, /* (26) typetoken ::= typename LP signed COMMA signed RP */ |
| 151887 | + 202, /* (27) typename ::= typename ID|STRING */ |
| 151888 | + 206, /* (28) scanpt ::= */ |
| 151889 | + 207, /* (29) scantok ::= */ |
| 151890 | + 208, /* (30) ccons ::= CONSTRAINT nm */ |
| 151891 | + 208, /* (31) ccons ::= DEFAULT scantok term */ |
| 151892 | + 208, /* (32) ccons ::= DEFAULT LP expr RP */ |
| 151893 | + 208, /* (33) ccons ::= DEFAULT PLUS scantok term */ |
| 151894 | + 208, /* (34) ccons ::= DEFAULT MINUS scantok term */ |
| 151895 | + 208, /* (35) ccons ::= DEFAULT scantok ID|INDEXED */ |
| 151896 | + 208, /* (36) ccons ::= NOT NULL onconf */ |
| 151897 | + 208, /* (37) ccons ::= PRIMARY KEY sortorder onconf autoinc */ |
| 151898 | + 208, /* (38) ccons ::= UNIQUE onconf */ |
| 151899 | + 208, /* (39) ccons ::= CHECK LP expr RP */ |
| 151900 | + 208, /* (40) ccons ::= REFERENCES nm eidlist_opt refargs */ |
| 151901 | + 208, /* (41) ccons ::= defer_subclause */ |
| 151902 | + 208, /* (42) ccons ::= COLLATE ID|STRING */ |
| 151903 | + 213, /* (43) autoinc ::= */ |
| 151904 | + 213, /* (44) autoinc ::= AUTOINCR */ |
| 151905 | + 215, /* (45) refargs ::= */ |
| 151906 | + 215, /* (46) refargs ::= refargs refarg */ |
| 151907 | + 217, /* (47) refarg ::= MATCH nm */ |
| 151908 | + 217, /* (48) refarg ::= ON INSERT refact */ |
| 151909 | + 217, /* (49) refarg ::= ON DELETE refact */ |
| 151910 | + 217, /* (50) refarg ::= ON UPDATE refact */ |
| 151911 | + 218, /* (51) refact ::= SET NULL */ |
| 151912 | + 218, /* (52) refact ::= SET DEFAULT */ |
| 151913 | + 218, /* (53) refact ::= CASCADE */ |
| 151914 | + 218, /* (54) refact ::= RESTRICT */ |
| 151915 | + 218, /* (55) refact ::= NO ACTION */ |
| 151916 | + 216, /* (56) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ |
| 151917 | + 216, /* (57) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ |
| 151918 | + 219, /* (58) init_deferred_pred_opt ::= */ |
| 151919 | + 219, /* (59) init_deferred_pred_opt ::= INITIALLY DEFERRED */ |
| 151920 | + 219, /* (60) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ |
| 151921 | + 196, /* (61) conslist_opt ::= */ |
| 151922 | + 221, /* (62) tconscomma ::= COMMA */ |
| 151923 | + 222, /* (63) tcons ::= CONSTRAINT nm */ |
| 151924 | + 222, /* (64) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ |
| 151925 | + 222, /* (65) tcons ::= UNIQUE LP sortlist RP onconf */ |
| 151926 | + 222, /* (66) tcons ::= CHECK LP expr RP onconf */ |
| 151927 | + 222, /* (67) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ |
| 151928 | + 225, /* (68) defer_subclause_opt ::= */ |
| 151929 | + 211, /* (69) onconf ::= */ |
| 151930 | + 211, /* (70) onconf ::= ON CONFLICT resolvetype */ |
| 151931 | + 226, /* (71) orconf ::= */ |
| 151932 | + 226, /* (72) orconf ::= OR resolvetype */ |
| 151933 | + 227, /* (73) resolvetype ::= IGNORE */ |
| 151934 | + 227, /* (74) resolvetype ::= REPLACE */ |
| 151935 | + 184, /* (75) cmd ::= DROP TABLE ifexists fullname */ |
| 151936 | + 229, /* (76) ifexists ::= IF EXISTS */ |
| 151937 | + 229, /* (77) ifexists ::= */ |
| 151938 | + 184, /* (78) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ |
| 151939 | + 184, /* (79) cmd ::= DROP VIEW ifexists fullname */ |
| 151940 | + 184, /* (80) cmd ::= select */ |
| 151941 | + 198, /* (81) select ::= WITH wqlist selectnowith */ |
| 151942 | + 198, /* (82) select ::= WITH RECURSIVE wqlist selectnowith */ |
| 151943 | + 198, /* (83) select ::= selectnowith */ |
| 151944 | + 231, /* (84) selectnowith ::= selectnowith multiselect_op oneselect */ |
| 151945 | + 234, /* (85) multiselect_op ::= UNION */ |
| 151946 | + 234, /* (86) multiselect_op ::= UNION ALL */ |
| 151947 | + 234, /* (87) multiselect_op ::= EXCEPT|INTERSECT */ |
| 151948 | + 232, /* (88) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ |
| 151949 | + 232, /* (89) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ |
| 151950 | + 244, /* (90) values ::= VALUES LP nexprlist RP */ |
| 151951 | + 244, /* (91) values ::= values COMMA LP nexprlist RP */ |
| 151952 | + 235, /* (92) distinct ::= DISTINCT */ |
| 151953 | + 235, /* (93) distinct ::= ALL */ |
| 151954 | + 235, /* (94) distinct ::= */ |
| 151955 | + 246, /* (95) sclp ::= */ |
| 151956 | + 236, /* (96) selcollist ::= sclp scanpt expr scanpt as */ |
| 151957 | + 236, /* (97) selcollist ::= sclp scanpt STAR */ |
| 151958 | + 236, /* (98) selcollist ::= sclp scanpt nm DOT STAR */ |
| 151959 | + 247, /* (99) as ::= AS nm */ |
| 151960 | + 247, /* (100) as ::= */ |
| 151961 | + 237, /* (101) from ::= */ |
| 151962 | + 237, /* (102) from ::= FROM seltablist */ |
| 151963 | + 249, /* (103) stl_prefix ::= seltablist joinop */ |
| 151964 | + 249, /* (104) stl_prefix ::= */ |
| 151965 | + 248, /* (105) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ |
| 151966 | + 248, /* (106) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ |
| 151967 | + 248, /* (107) seltablist ::= stl_prefix LP select RP as on_opt using_opt */ |
| 151968 | + 248, /* (108) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ |
| 151969 | + 194, /* (109) dbnm ::= */ |
| 151970 | + 194, /* (110) dbnm ::= DOT nm */ |
| 151971 | + 230, /* (111) fullname ::= nm */ |
| 151972 | + 230, /* (112) fullname ::= nm DOT nm */ |
| 151973 | + 255, /* (113) xfullname ::= nm */ |
| 151974 | + 255, /* (114) xfullname ::= nm DOT nm */ |
| 151975 | + 255, /* (115) xfullname ::= nm DOT nm AS nm */ |
| 151976 | + 255, /* (116) xfullname ::= nm AS nm */ |
| 151977 | + 250, /* (117) joinop ::= COMMA|JOIN */ |
| 151978 | + 250, /* (118) joinop ::= JOIN_KW JOIN */ |
| 151979 | + 250, /* (119) joinop ::= JOIN_KW nm JOIN */ |
| 151980 | + 250, /* (120) joinop ::= JOIN_KW nm nm JOIN */ |
| 151981 | + 252, /* (121) on_opt ::= ON expr */ |
| 151982 | + 252, /* (122) on_opt ::= */ |
| 151983 | + 251, /* (123) indexed_opt ::= */ |
| 151984 | + 251, /* (124) indexed_opt ::= INDEXED BY nm */ |
| 151985 | + 251, /* (125) indexed_opt ::= NOT INDEXED */ |
| 151986 | + 253, /* (126) using_opt ::= USING LP idlist RP */ |
| 151987 | + 253, /* (127) using_opt ::= */ |
| 151988 | + 241, /* (128) orderby_opt ::= */ |
| 151989 | + 241, /* (129) orderby_opt ::= ORDER BY sortlist */ |
| 151990 | + 223, /* (130) sortlist ::= sortlist COMMA expr sortorder nulls */ |
| 151991 | + 223, /* (131) sortlist ::= expr sortorder nulls */ |
| 151992 | + 212, /* (132) sortorder ::= ASC */ |
| 151993 | + 212, /* (133) sortorder ::= DESC */ |
| 151994 | + 212, /* (134) sortorder ::= */ |
| 151995 | + 257, /* (135) nulls ::= NULLS FIRST */ |
| 151996 | + 257, /* (136) nulls ::= NULLS LAST */ |
| 151997 | + 257, /* (137) nulls ::= */ |
| 151998 | + 239, /* (138) groupby_opt ::= */ |
| 151999 | + 239, /* (139) groupby_opt ::= GROUP BY nexprlist */ |
| 152000 | + 240, /* (140) having_opt ::= */ |
| 152001 | + 240, /* (141) having_opt ::= HAVING expr */ |
| 152002 | + 242, /* (142) limit_opt ::= */ |
| 152003 | + 242, /* (143) limit_opt ::= LIMIT expr */ |
| 152004 | + 242, /* (144) limit_opt ::= LIMIT expr OFFSET expr */ |
| 152005 | + 242, /* (145) limit_opt ::= LIMIT expr COMMA expr */ |
| 152006 | + 184, /* (146) cmd ::= with DELETE FROM xfullname indexed_opt where_opt */ |
| 152007 | + 238, /* (147) where_opt ::= */ |
| 152008 | + 238, /* (148) where_opt ::= WHERE expr */ |
| 152009 | + 184, /* (149) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ |
| 152010 | + 259, /* (150) setlist ::= setlist COMMA nm EQ expr */ |
| 152011 | + 259, /* (151) setlist ::= setlist COMMA LP idlist RP EQ expr */ |
| 152012 | + 259, /* (152) setlist ::= nm EQ expr */ |
| 152013 | + 259, /* (153) setlist ::= LP idlist RP EQ expr */ |
| 152014 | + 184, /* (154) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ |
| 152015 | + 184, /* (155) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */ |
| 152016 | + 262, /* (156) upsert ::= */ |
| 152017 | + 262, /* (157) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */ |
| 152018 | + 262, /* (158) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */ |
| 152019 | + 262, /* (159) upsert ::= ON CONFLICT DO NOTHING */ |
| 152020 | + 260, /* (160) insert_cmd ::= INSERT orconf */ |
| 152021 | + 260, /* (161) insert_cmd ::= REPLACE */ |
| 152022 | + 261, /* (162) idlist_opt ::= */ |
| 152023 | + 261, /* (163) idlist_opt ::= LP idlist RP */ |
| 152024 | + 256, /* (164) idlist ::= idlist COMMA nm */ |
| 152025 | + 256, /* (165) idlist ::= nm */ |
| 152026 | + 210, /* (166) expr ::= LP expr RP */ |
| 152027 | + 210, /* (167) expr ::= ID|INDEXED */ |
| 152028 | + 210, /* (168) expr ::= JOIN_KW */ |
| 152029 | + 210, /* (169) expr ::= nm DOT nm */ |
| 152030 | + 210, /* (170) expr ::= nm DOT nm DOT nm */ |
| 152031 | + 209, /* (171) term ::= NULL|FLOAT|BLOB */ |
| 152032 | + 209, /* (172) term ::= STRING */ |
| 152033 | + 209, /* (173) term ::= INTEGER */ |
| 152034 | + 210, /* (174) expr ::= VARIABLE */ |
| 152035 | + 210, /* (175) expr ::= expr COLLATE ID|STRING */ |
| 152036 | + 210, /* (176) expr ::= CAST LP expr AS typetoken RP */ |
| 152037 | + 210, /* (177) expr ::= ID|INDEXED LP distinct exprlist RP */ |
| 152038 | + 210, /* (178) expr ::= ID|INDEXED LP STAR RP */ |
| 152039 | + 210, /* (179) expr ::= ID|INDEXED LP distinct exprlist RP filter_over */ |
| 152040 | + 210, /* (180) expr ::= ID|INDEXED LP STAR RP filter_over */ |
| 152041 | + 209, /* (181) term ::= CTIME_KW */ |
| 152042 | + 210, /* (182) expr ::= LP nexprlist COMMA expr RP */ |
| 152043 | + 210, /* (183) expr ::= expr AND expr */ |
| 152044 | + 210, /* (184) expr ::= expr OR expr */ |
| 152045 | + 210, /* (185) expr ::= expr LT|GT|GE|LE expr */ |
| 152046 | + 210, /* (186) expr ::= expr EQ|NE expr */ |
| 152047 | + 210, /* (187) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ |
| 152048 | + 210, /* (188) expr ::= expr PLUS|MINUS expr */ |
| 152049 | + 210, /* (189) expr ::= expr STAR|SLASH|REM expr */ |
| 152050 | + 210, /* (190) expr ::= expr CONCAT expr */ |
| 152051 | + 264, /* (191) likeop ::= NOT LIKE_KW|MATCH */ |
| 152052 | + 210, /* (192) expr ::= expr likeop expr */ |
| 152053 | + 210, /* (193) expr ::= expr likeop expr ESCAPE expr */ |
| 152054 | + 210, /* (194) expr ::= expr ISNULL|NOTNULL */ |
| 152055 | + 210, /* (195) expr ::= expr NOT NULL */ |
| 152056 | + 210, /* (196) expr ::= expr IS expr */ |
| 152057 | + 210, /* (197) expr ::= expr IS NOT expr */ |
| 152058 | + 210, /* (198) expr ::= NOT expr */ |
| 152059 | + 210, /* (199) expr ::= BITNOT expr */ |
| 152060 | + 210, /* (200) expr ::= PLUS|MINUS expr */ |
| 152061 | + 265, /* (201) between_op ::= BETWEEN */ |
| 152062 | + 265, /* (202) between_op ::= NOT BETWEEN */ |
| 152063 | + 210, /* (203) expr ::= expr between_op expr AND expr */ |
| 152064 | + 266, /* (204) in_op ::= IN */ |
| 152065 | + 266, /* (205) in_op ::= NOT IN */ |
| 152066 | + 210, /* (206) expr ::= expr in_op LP exprlist RP */ |
| 152067 | + 210, /* (207) expr ::= LP select RP */ |
| 152068 | + 210, /* (208) expr ::= expr in_op LP select RP */ |
| 152069 | + 210, /* (209) expr ::= expr in_op nm dbnm paren_exprlist */ |
| 152070 | + 210, /* (210) expr ::= EXISTS LP select RP */ |
| 152071 | + 210, /* (211) expr ::= CASE case_operand case_exprlist case_else END */ |
| 152072 | + 269, /* (212) case_exprlist ::= case_exprlist WHEN expr THEN expr */ |
| 152073 | + 269, /* (213) case_exprlist ::= WHEN expr THEN expr */ |
| 152074 | + 270, /* (214) case_else ::= ELSE expr */ |
| 152075 | + 270, /* (215) case_else ::= */ |
| 152076 | + 268, /* (216) case_operand ::= expr */ |
| 152077 | + 268, /* (217) case_operand ::= */ |
| 152078 | + 254, /* (218) exprlist ::= */ |
| 152079 | + 245, /* (219) nexprlist ::= nexprlist COMMA expr */ |
| 152080 | + 245, /* (220) nexprlist ::= expr */ |
| 152081 | + 267, /* (221) paren_exprlist ::= */ |
| 152082 | + 267, /* (222) paren_exprlist ::= LP exprlist RP */ |
| 152083 | + 184, /* (223) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ |
| 152084 | + 271, /* (224) uniqueflag ::= UNIQUE */ |
| 152085 | + 271, /* (225) uniqueflag ::= */ |
| 152086 | + 214, /* (226) eidlist_opt ::= */ |
| 152087 | + 214, /* (227) eidlist_opt ::= LP eidlist RP */ |
| 152088 | + 224, /* (228) eidlist ::= eidlist COMMA nm collate sortorder */ |
| 152089 | + 224, /* (229) eidlist ::= nm collate sortorder */ |
| 152090 | + 272, /* (230) collate ::= */ |
| 152091 | + 272, /* (231) collate ::= COLLATE ID|STRING */ |
| 152092 | + 184, /* (232) cmd ::= DROP INDEX ifexists fullname */ |
| 152093 | + 184, /* (233) cmd ::= VACUUM vinto */ |
| 152094 | + 184, /* (234) cmd ::= VACUUM nm vinto */ |
| 152095 | + 273, /* (235) vinto ::= INTO expr */ |
| 152096 | + 273, /* (236) vinto ::= */ |
| 152097 | + 184, /* (237) cmd ::= PRAGMA nm dbnm */ |
| 152098 | + 184, /* (238) cmd ::= PRAGMA nm dbnm EQ nmnum */ |
| 152099 | + 184, /* (239) cmd ::= PRAGMA nm dbnm LP nmnum RP */ |
| 152100 | + 184, /* (240) cmd ::= PRAGMA nm dbnm EQ minus_num */ |
| 152101 | + 184, /* (241) cmd ::= PRAGMA nm dbnm LP minus_num RP */ |
| 152102 | + 204, /* (242) plus_num ::= PLUS INTEGER|FLOAT */ |
| 152103 | + 205, /* (243) minus_num ::= MINUS INTEGER|FLOAT */ |
| 152104 | + 184, /* (244) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ |
| 152105 | + 275, /* (245) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ |
| 152106 | + 277, /* (246) trigger_time ::= BEFORE|AFTER */ |
| 152107 | + 277, /* (247) trigger_time ::= INSTEAD OF */ |
| 152108 | + 277, /* (248) trigger_time ::= */ |
| 152109 | + 278, /* (249) trigger_event ::= DELETE|INSERT */ |
| 152110 | + 278, /* (250) trigger_event ::= UPDATE */ |
| 152111 | + 278, /* (251) trigger_event ::= UPDATE OF idlist */ |
| 152112 | + 280, /* (252) when_clause ::= */ |
| 152113 | + 280, /* (253) when_clause ::= WHEN expr */ |
| 152114 | + 276, /* (254) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ |
| 152115 | + 276, /* (255) trigger_cmd_list ::= trigger_cmd SEMI */ |
| 152116 | + 282, /* (256) trnm ::= nm DOT nm */ |
| 152117 | + 283, /* (257) tridxby ::= INDEXED BY nm */ |
| 152118 | + 283, /* (258) tridxby ::= NOT INDEXED */ |
| 152119 | + 281, /* (259) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ |
| 152120 | + 281, /* (260) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ |
| 152121 | + 281, /* (261) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ |
| 152122 | + 281, /* (262) trigger_cmd ::= scanpt select scanpt */ |
| 152123 | + 210, /* (263) expr ::= RAISE LP IGNORE RP */ |
| 152124 | + 210, /* (264) expr ::= RAISE LP raisetype COMMA nm RP */ |
| 152125 | + 228, /* (265) raisetype ::= ROLLBACK */ |
| 152126 | + 228, /* (266) raisetype ::= ABORT */ |
| 152127 | + 228, /* (267) raisetype ::= FAIL */ |
| 152128 | + 184, /* (268) cmd ::= DROP TRIGGER ifexists fullname */ |
| 152129 | + 184, /* (269) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ |
| 152130 | + 184, /* (270) cmd ::= DETACH database_kw_opt expr */ |
| 152131 | + 285, /* (271) key_opt ::= */ |
| 152132 | + 285, /* (272) key_opt ::= KEY expr */ |
| 152133 | + 184, /* (273) cmd ::= REINDEX */ |
| 152134 | + 184, /* (274) cmd ::= REINDEX nm dbnm */ |
| 152135 | + 184, /* (275) cmd ::= ANALYZE */ |
| 152136 | + 184, /* (276) cmd ::= ANALYZE nm dbnm */ |
| 152137 | + 184, /* (277) cmd ::= ALTER TABLE fullname RENAME TO nm */ |
| 152138 | + 184, /* (278) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ |
| 152139 | + 286, /* (279) add_column_fullname ::= fullname */ |
| 152140 | + 184, /* (280) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ |
| 152141 | + 184, /* (281) cmd ::= create_vtab */ |
| 152142 | + 184, /* (282) cmd ::= create_vtab LP vtabarglist RP */ |
| 152143 | + 288, /* (283) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ |
| 152144 | + 290, /* (284) vtabarg ::= */ |
| 152145 | + 291, /* (285) vtabargtoken ::= ANY */ |
| 152146 | + 291, /* (286) vtabargtoken ::= lp anylist RP */ |
| 152147 | + 292, /* (287) lp ::= LP */ |
| 152148 | + 258, /* (288) with ::= WITH wqlist */ |
| 152149 | + 258, /* (289) with ::= WITH RECURSIVE wqlist */ |
| 152150 | + 233, /* (290) wqlist ::= nm eidlist_opt AS LP select RP */ |
| 152151 | + 233, /* (291) wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ |
| 152152 | + 294, /* (292) windowdefn_list ::= windowdefn */ |
| 152153 | + 294, /* (293) windowdefn_list ::= windowdefn_list COMMA windowdefn */ |
| 152154 | + 295, /* (294) windowdefn ::= nm AS LP window RP */ |
| 152155 | + 296, /* (295) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ |
| 152156 | + 296, /* (296) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ |
| 152157 | + 296, /* (297) window ::= ORDER BY sortlist frame_opt */ |
| 152158 | + 296, /* (298) window ::= nm ORDER BY sortlist frame_opt */ |
| 152159 | + 296, /* (299) window ::= frame_opt */ |
| 152160 | + 296, /* (300) window ::= nm frame_opt */ |
| 152161 | + 297, /* (301) frame_opt ::= */ |
| 152162 | + 297, /* (302) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ |
| 152163 | + 297, /* (303) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ |
| 152164 | + 301, /* (304) range_or_rows ::= RANGE|ROWS|GROUPS */ |
| 152165 | + 303, /* (305) frame_bound_s ::= frame_bound */ |
| 152166 | + 303, /* (306) frame_bound_s ::= UNBOUNDED PRECEDING */ |
| 152167 | + 304, /* (307) frame_bound_e ::= frame_bound */ |
| 152168 | + 304, /* (308) frame_bound_e ::= UNBOUNDED FOLLOWING */ |
| 152169 | + 302, /* (309) frame_bound ::= expr PRECEDING|FOLLOWING */ |
| 152170 | + 302, /* (310) frame_bound ::= CURRENT ROW */ |
| 152171 | + 305, /* (311) frame_exclude_opt ::= */ |
| 152172 | + 305, /* (312) frame_exclude_opt ::= EXCLUDE frame_exclude */ |
| 152173 | + 306, /* (313) frame_exclude ::= NO OTHERS */ |
| 152174 | + 306, /* (314) frame_exclude ::= CURRENT ROW */ |
| 152175 | + 306, /* (315) frame_exclude ::= GROUP|TIES */ |
| 152176 | + 243, /* (316) window_clause ::= WINDOW windowdefn_list */ |
| 152177 | + 263, /* (317) filter_over ::= filter_clause over_clause */ |
| 152178 | + 263, /* (318) filter_over ::= over_clause */ |
| 152179 | + 263, /* (319) filter_over ::= filter_clause */ |
| 152180 | + 300, /* (320) over_clause ::= OVER LP window RP */ |
| 152181 | + 300, /* (321) over_clause ::= OVER nm */ |
| 152182 | + 299, /* (322) filter_clause ::= FILTER LP WHERE expr RP */ |
| 152183 | + 179, /* (323) input ::= cmdlist */ |
| 152184 | + 180, /* (324) cmdlist ::= cmdlist ecmd */ |
| 152185 | + 180, /* (325) cmdlist ::= ecmd */ |
| 152186 | + 181, /* (326) ecmd ::= SEMI */ |
| 152187 | + 181, /* (327) ecmd ::= cmdx SEMI */ |
| 152188 | + 181, /* (328) ecmd ::= explain cmdx */ |
| 152189 | + 186, /* (329) trans_opt ::= */ |
| 152190 | + 186, /* (330) trans_opt ::= TRANSACTION */ |
| 152191 | + 186, /* (331) trans_opt ::= TRANSACTION nm */ |
| 152192 | + 188, /* (332) savepoint_opt ::= SAVEPOINT */ |
| 152193 | + 188, /* (333) savepoint_opt ::= */ |
| 152194 | + 184, /* (334) cmd ::= create_table create_table_args */ |
| 152195 | + 195, /* (335) columnlist ::= columnlist COMMA columnname carglist */ |
| 152196 | + 195, /* (336) columnlist ::= columnname carglist */ |
| 152197 | + 187, /* (337) nm ::= ID|INDEXED */ |
| 152198 | + 187, /* (338) nm ::= STRING */ |
| 152199 | + 187, /* (339) nm ::= JOIN_KW */ |
| 152200 | + 201, /* (340) typetoken ::= typename */ |
| 152201 | + 202, /* (341) typename ::= ID|STRING */ |
| 152202 | + 203, /* (342) signed ::= plus_num */ |
| 152203 | + 203, /* (343) signed ::= minus_num */ |
| 152204 | + 200, /* (344) carglist ::= carglist ccons */ |
| 152205 | + 200, /* (345) carglist ::= */ |
| 152206 | + 208, /* (346) ccons ::= NULL onconf */ |
| 152207 | + 196, /* (347) conslist_opt ::= COMMA conslist */ |
| 152208 | + 220, /* (348) conslist ::= conslist tconscomma tcons */ |
| 152209 | + 220, /* (349) conslist ::= tcons */ |
| 152210 | + 221, /* (350) tconscomma ::= */ |
| 152211 | + 225, /* (351) defer_subclause_opt ::= defer_subclause */ |
| 152212 | + 227, /* (352) resolvetype ::= raisetype */ |
| 152213 | + 231, /* (353) selectnowith ::= oneselect */ |
| 152214 | + 232, /* (354) oneselect ::= values */ |
| 152215 | + 246, /* (355) sclp ::= selcollist COMMA */ |
| 152216 | + 247, /* (356) as ::= ID|STRING */ |
| 152217 | + 210, /* (357) expr ::= term */ |
| 152218 | + 264, /* (358) likeop ::= LIKE_KW|MATCH */ |
| 152219 | + 254, /* (359) exprlist ::= nexprlist */ |
| 152220 | + 274, /* (360) nmnum ::= plus_num */ |
| 152221 | + 274, /* (361) nmnum ::= nm */ |
| 152222 | + 274, /* (362) nmnum ::= ON */ |
| 152223 | + 274, /* (363) nmnum ::= DELETE */ |
| 152224 | + 274, /* (364) nmnum ::= DEFAULT */ |
| 152225 | + 204, /* (365) plus_num ::= INTEGER|FLOAT */ |
| 152226 | + 279, /* (366) foreach_clause ::= */ |
| 152227 | + 279, /* (367) foreach_clause ::= FOR EACH ROW */ |
| 152228 | + 282, /* (368) trnm ::= nm */ |
| 152229 | + 283, /* (369) tridxby ::= */ |
| 152230 | + 284, /* (370) database_kw_opt ::= DATABASE */ |
| 152231 | + 284, /* (371) database_kw_opt ::= */ |
| 152232 | + 287, /* (372) kwcolumn_opt ::= */ |
| 152233 | + 287, /* (373) kwcolumn_opt ::= COLUMNKW */ |
| 152234 | + 289, /* (374) vtabarglist ::= vtabarg */ |
| 152235 | + 289, /* (375) vtabarglist ::= vtabarglist COMMA vtabarg */ |
| 152236 | + 290, /* (376) vtabarg ::= vtabarg vtabargtoken */ |
| 152237 | + 293, /* (377) anylist ::= */ |
| 152238 | + 293, /* (378) anylist ::= anylist LP anylist RP */ |
| 152239 | + 293, /* (379) anylist ::= anylist ANY */ |
| 152240 | + 258, /* (380) with ::= */ |
| 151425 | 152241 | }; |
| 151426 | 152242 | |
| 151427 | 152243 | /* For rule J, yyRuleInfoNRhs[J] contains the negative of the number |
| 151428 | 152244 | ** of symbols on the right-hand side of that rule. */ |
| 151429 | 152245 | static const signed char yyRuleInfoNRhs[] = { |
| | @@ -151555,256 +152371,261 @@ |
| 151555 | 152371 | -2, /* (125) indexed_opt ::= NOT INDEXED */ |
| 151556 | 152372 | -4, /* (126) using_opt ::= USING LP idlist RP */ |
| 151557 | 152373 | 0, /* (127) using_opt ::= */ |
| 151558 | 152374 | 0, /* (128) orderby_opt ::= */ |
| 151559 | 152375 | -3, /* (129) orderby_opt ::= ORDER BY sortlist */ |
| 151560 | | - -4, /* (130) sortlist ::= sortlist COMMA expr sortorder */ |
| 151561 | | - -2, /* (131) sortlist ::= expr sortorder */ |
| 152376 | + -5, /* (130) sortlist ::= sortlist COMMA expr sortorder nulls */ |
| 152377 | + -3, /* (131) sortlist ::= expr sortorder nulls */ |
| 151562 | 152378 | -1, /* (132) sortorder ::= ASC */ |
| 151563 | 152379 | -1, /* (133) sortorder ::= DESC */ |
| 151564 | 152380 | 0, /* (134) sortorder ::= */ |
| 151565 | | - 0, /* (135) groupby_opt ::= */ |
| 151566 | | - -3, /* (136) groupby_opt ::= GROUP BY nexprlist */ |
| 151567 | | - 0, /* (137) having_opt ::= */ |
| 151568 | | - -2, /* (138) having_opt ::= HAVING expr */ |
| 151569 | | - 0, /* (139) limit_opt ::= */ |
| 151570 | | - -2, /* (140) limit_opt ::= LIMIT expr */ |
| 151571 | | - -4, /* (141) limit_opt ::= LIMIT expr OFFSET expr */ |
| 151572 | | - -4, /* (142) limit_opt ::= LIMIT expr COMMA expr */ |
| 151573 | | - -6, /* (143) cmd ::= with DELETE FROM xfullname indexed_opt where_opt */ |
| 151574 | | - 0, /* (144) where_opt ::= */ |
| 151575 | | - -2, /* (145) where_opt ::= WHERE expr */ |
| 151576 | | - -8, /* (146) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ |
| 151577 | | - -5, /* (147) setlist ::= setlist COMMA nm EQ expr */ |
| 151578 | | - -7, /* (148) setlist ::= setlist COMMA LP idlist RP EQ expr */ |
| 151579 | | - -3, /* (149) setlist ::= nm EQ expr */ |
| 151580 | | - -5, /* (150) setlist ::= LP idlist RP EQ expr */ |
| 151581 | | - -7, /* (151) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ |
| 151582 | | - -7, /* (152) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */ |
| 151583 | | - 0, /* (153) upsert ::= */ |
| 151584 | | - -11, /* (154) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */ |
| 151585 | | - -8, /* (155) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */ |
| 151586 | | - -4, /* (156) upsert ::= ON CONFLICT DO NOTHING */ |
| 151587 | | - -2, /* (157) insert_cmd ::= INSERT orconf */ |
| 151588 | | - -1, /* (158) insert_cmd ::= REPLACE */ |
| 151589 | | - 0, /* (159) idlist_opt ::= */ |
| 151590 | | - -3, /* (160) idlist_opt ::= LP idlist RP */ |
| 151591 | | - -3, /* (161) idlist ::= idlist COMMA nm */ |
| 151592 | | - -1, /* (162) idlist ::= nm */ |
| 151593 | | - -3, /* (163) expr ::= LP expr RP */ |
| 151594 | | - -1, /* (164) expr ::= ID|INDEXED */ |
| 151595 | | - -1, /* (165) expr ::= JOIN_KW */ |
| 151596 | | - -3, /* (166) expr ::= nm DOT nm */ |
| 151597 | | - -5, /* (167) expr ::= nm DOT nm DOT nm */ |
| 151598 | | - -1, /* (168) term ::= NULL|FLOAT|BLOB */ |
| 151599 | | - -1, /* (169) term ::= STRING */ |
| 151600 | | - -1, /* (170) term ::= INTEGER */ |
| 151601 | | - -1, /* (171) expr ::= VARIABLE */ |
| 151602 | | - -3, /* (172) expr ::= expr COLLATE ID|STRING */ |
| 151603 | | - -6, /* (173) expr ::= CAST LP expr AS typetoken RP */ |
| 151604 | | - -5, /* (174) expr ::= ID|INDEXED LP distinct exprlist RP */ |
| 151605 | | - -4, /* (175) expr ::= ID|INDEXED LP STAR RP */ |
| 151606 | | - -6, /* (176) expr ::= ID|INDEXED LP distinct exprlist RP over_clause */ |
| 151607 | | - -5, /* (177) expr ::= ID|INDEXED LP STAR RP over_clause */ |
| 151608 | | - -1, /* (178) term ::= CTIME_KW */ |
| 151609 | | - -5, /* (179) expr ::= LP nexprlist COMMA expr RP */ |
| 151610 | | - -3, /* (180) expr ::= expr AND expr */ |
| 151611 | | - -3, /* (181) expr ::= expr OR expr */ |
| 151612 | | - -3, /* (182) expr ::= expr LT|GT|GE|LE expr */ |
| 151613 | | - -3, /* (183) expr ::= expr EQ|NE expr */ |
| 151614 | | - -3, /* (184) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ |
| 151615 | | - -3, /* (185) expr ::= expr PLUS|MINUS expr */ |
| 151616 | | - -3, /* (186) expr ::= expr STAR|SLASH|REM expr */ |
| 151617 | | - -3, /* (187) expr ::= expr CONCAT expr */ |
| 151618 | | - -2, /* (188) likeop ::= NOT LIKE_KW|MATCH */ |
| 151619 | | - -3, /* (189) expr ::= expr likeop expr */ |
| 151620 | | - -5, /* (190) expr ::= expr likeop expr ESCAPE expr */ |
| 151621 | | - -2, /* (191) expr ::= expr ISNULL|NOTNULL */ |
| 151622 | | - -3, /* (192) expr ::= expr NOT NULL */ |
| 151623 | | - -3, /* (193) expr ::= expr IS expr */ |
| 151624 | | - -4, /* (194) expr ::= expr IS NOT expr */ |
| 151625 | | - -2, /* (195) expr ::= NOT expr */ |
| 151626 | | - -2, /* (196) expr ::= BITNOT expr */ |
| 151627 | | - -2, /* (197) expr ::= PLUS|MINUS expr */ |
| 151628 | | - -1, /* (198) between_op ::= BETWEEN */ |
| 151629 | | - -2, /* (199) between_op ::= NOT BETWEEN */ |
| 151630 | | - -5, /* (200) expr ::= expr between_op expr AND expr */ |
| 151631 | | - -1, /* (201) in_op ::= IN */ |
| 151632 | | - -2, /* (202) in_op ::= NOT IN */ |
| 151633 | | - -5, /* (203) expr ::= expr in_op LP exprlist RP */ |
| 151634 | | - -3, /* (204) expr ::= LP select RP */ |
| 151635 | | - -5, /* (205) expr ::= expr in_op LP select RP */ |
| 151636 | | - -5, /* (206) expr ::= expr in_op nm dbnm paren_exprlist */ |
| 151637 | | - -4, /* (207) expr ::= EXISTS LP select RP */ |
| 151638 | | - -5, /* (208) expr ::= CASE case_operand case_exprlist case_else END */ |
| 151639 | | - -5, /* (209) case_exprlist ::= case_exprlist WHEN expr THEN expr */ |
| 151640 | | - -4, /* (210) case_exprlist ::= WHEN expr THEN expr */ |
| 151641 | | - -2, /* (211) case_else ::= ELSE expr */ |
| 151642 | | - 0, /* (212) case_else ::= */ |
| 151643 | | - -1, /* (213) case_operand ::= expr */ |
| 151644 | | - 0, /* (214) case_operand ::= */ |
| 151645 | | - 0, /* (215) exprlist ::= */ |
| 151646 | | - -3, /* (216) nexprlist ::= nexprlist COMMA expr */ |
| 151647 | | - -1, /* (217) nexprlist ::= expr */ |
| 151648 | | - 0, /* (218) paren_exprlist ::= */ |
| 151649 | | - -3, /* (219) paren_exprlist ::= LP exprlist RP */ |
| 151650 | | - -12, /* (220) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ |
| 151651 | | - -1, /* (221) uniqueflag ::= UNIQUE */ |
| 151652 | | - 0, /* (222) uniqueflag ::= */ |
| 151653 | | - 0, /* (223) eidlist_opt ::= */ |
| 151654 | | - -3, /* (224) eidlist_opt ::= LP eidlist RP */ |
| 151655 | | - -5, /* (225) eidlist ::= eidlist COMMA nm collate sortorder */ |
| 151656 | | - -3, /* (226) eidlist ::= nm collate sortorder */ |
| 151657 | | - 0, /* (227) collate ::= */ |
| 151658 | | - -2, /* (228) collate ::= COLLATE ID|STRING */ |
| 151659 | | - -4, /* (229) cmd ::= DROP INDEX ifexists fullname */ |
| 151660 | | - -2, /* (230) cmd ::= VACUUM vinto */ |
| 151661 | | - -3, /* (231) cmd ::= VACUUM nm vinto */ |
| 151662 | | - -2, /* (232) vinto ::= INTO expr */ |
| 151663 | | - 0, /* (233) vinto ::= */ |
| 151664 | | - -3, /* (234) cmd ::= PRAGMA nm dbnm */ |
| 151665 | | - -5, /* (235) cmd ::= PRAGMA nm dbnm EQ nmnum */ |
| 151666 | | - -6, /* (236) cmd ::= PRAGMA nm dbnm LP nmnum RP */ |
| 151667 | | - -5, /* (237) cmd ::= PRAGMA nm dbnm EQ minus_num */ |
| 151668 | | - -6, /* (238) cmd ::= PRAGMA nm dbnm LP minus_num RP */ |
| 151669 | | - -2, /* (239) plus_num ::= PLUS INTEGER|FLOAT */ |
| 151670 | | - -2, /* (240) minus_num ::= MINUS INTEGER|FLOAT */ |
| 151671 | | - -5, /* (241) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ |
| 151672 | | - -11, /* (242) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ |
| 151673 | | - -1, /* (243) trigger_time ::= BEFORE|AFTER */ |
| 151674 | | - -2, /* (244) trigger_time ::= INSTEAD OF */ |
| 151675 | | - 0, /* (245) trigger_time ::= */ |
| 151676 | | - -1, /* (246) trigger_event ::= DELETE|INSERT */ |
| 151677 | | - -1, /* (247) trigger_event ::= UPDATE */ |
| 151678 | | - -3, /* (248) trigger_event ::= UPDATE OF idlist */ |
| 151679 | | - 0, /* (249) when_clause ::= */ |
| 151680 | | - -2, /* (250) when_clause ::= WHEN expr */ |
| 151681 | | - -3, /* (251) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ |
| 151682 | | - -2, /* (252) trigger_cmd_list ::= trigger_cmd SEMI */ |
| 151683 | | - -3, /* (253) trnm ::= nm DOT nm */ |
| 151684 | | - -3, /* (254) tridxby ::= INDEXED BY nm */ |
| 151685 | | - -2, /* (255) tridxby ::= NOT INDEXED */ |
| 151686 | | - -8, /* (256) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ |
| 151687 | | - -8, /* (257) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ |
| 151688 | | - -6, /* (258) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ |
| 151689 | | - -3, /* (259) trigger_cmd ::= scanpt select scanpt */ |
| 151690 | | - -4, /* (260) expr ::= RAISE LP IGNORE RP */ |
| 151691 | | - -6, /* (261) expr ::= RAISE LP raisetype COMMA nm RP */ |
| 151692 | | - -1, /* (262) raisetype ::= ROLLBACK */ |
| 151693 | | - -1, /* (263) raisetype ::= ABORT */ |
| 151694 | | - -1, /* (264) raisetype ::= FAIL */ |
| 151695 | | - -4, /* (265) cmd ::= DROP TRIGGER ifexists fullname */ |
| 151696 | | - -6, /* (266) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ |
| 151697 | | - -3, /* (267) cmd ::= DETACH database_kw_opt expr */ |
| 151698 | | - 0, /* (268) key_opt ::= */ |
| 151699 | | - -2, /* (269) key_opt ::= KEY expr */ |
| 151700 | | - -1, /* (270) cmd ::= REINDEX */ |
| 151701 | | - -3, /* (271) cmd ::= REINDEX nm dbnm */ |
| 151702 | | - -1, /* (272) cmd ::= ANALYZE */ |
| 151703 | | - -3, /* (273) cmd ::= ANALYZE nm dbnm */ |
| 151704 | | - -6, /* (274) cmd ::= ALTER TABLE fullname RENAME TO nm */ |
| 151705 | | - -7, /* (275) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ |
| 151706 | | - -1, /* (276) add_column_fullname ::= fullname */ |
| 151707 | | - -8, /* (277) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ |
| 151708 | | - -1, /* (278) cmd ::= create_vtab */ |
| 151709 | | - -4, /* (279) cmd ::= create_vtab LP vtabarglist RP */ |
| 151710 | | - -8, /* (280) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ |
| 151711 | | - 0, /* (281) vtabarg ::= */ |
| 151712 | | - -1, /* (282) vtabargtoken ::= ANY */ |
| 151713 | | - -3, /* (283) vtabargtoken ::= lp anylist RP */ |
| 151714 | | - -1, /* (284) lp ::= LP */ |
| 151715 | | - -2, /* (285) with ::= WITH wqlist */ |
| 151716 | | - -3, /* (286) with ::= WITH RECURSIVE wqlist */ |
| 151717 | | - -6, /* (287) wqlist ::= nm eidlist_opt AS LP select RP */ |
| 151718 | | - -8, /* (288) wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ |
| 151719 | | - -1, /* (289) windowdefn_list ::= windowdefn */ |
| 151720 | | - -3, /* (290) windowdefn_list ::= windowdefn_list COMMA windowdefn */ |
| 151721 | | - -5, /* (291) windowdefn ::= nm AS LP window RP */ |
| 151722 | | - -5, /* (292) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ |
| 151723 | | - -6, /* (293) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ |
| 151724 | | - -4, /* (294) window ::= ORDER BY sortlist frame_opt */ |
| 151725 | | - -5, /* (295) window ::= nm ORDER BY sortlist frame_opt */ |
| 151726 | | - -1, /* (296) window ::= frame_opt */ |
| 151727 | | - -2, /* (297) window ::= nm frame_opt */ |
| 151728 | | - 0, /* (298) frame_opt ::= */ |
| 151729 | | - -3, /* (299) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ |
| 151730 | | - -6, /* (300) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ |
| 151731 | | - -1, /* (301) range_or_rows ::= RANGE|ROWS|GROUPS */ |
| 151732 | | - -1, /* (302) frame_bound_s ::= frame_bound */ |
| 151733 | | - -2, /* (303) frame_bound_s ::= UNBOUNDED PRECEDING */ |
| 151734 | | - -1, /* (304) frame_bound_e ::= frame_bound */ |
| 151735 | | - -2, /* (305) frame_bound_e ::= UNBOUNDED FOLLOWING */ |
| 151736 | | - -2, /* (306) frame_bound ::= expr PRECEDING|FOLLOWING */ |
| 151737 | | - -2, /* (307) frame_bound ::= CURRENT ROW */ |
| 151738 | | - 0, /* (308) frame_exclude_opt ::= */ |
| 151739 | | - -2, /* (309) frame_exclude_opt ::= EXCLUDE frame_exclude */ |
| 151740 | | - -2, /* (310) frame_exclude ::= NO OTHERS */ |
| 151741 | | - -2, /* (311) frame_exclude ::= CURRENT ROW */ |
| 151742 | | - -1, /* (312) frame_exclude ::= GROUP|TIES */ |
| 151743 | | - -2, /* (313) window_clause ::= WINDOW windowdefn_list */ |
| 151744 | | - -5, /* (314) over_clause ::= filter_opt OVER LP window RP */ |
| 151745 | | - -3, /* (315) over_clause ::= filter_opt OVER nm */ |
| 151746 | | - 0, /* (316) filter_opt ::= */ |
| 151747 | | - -5, /* (317) filter_opt ::= FILTER LP WHERE expr RP */ |
| 151748 | | - -1, /* (318) input ::= cmdlist */ |
| 151749 | | - -2, /* (319) cmdlist ::= cmdlist ecmd */ |
| 151750 | | - -1, /* (320) cmdlist ::= ecmd */ |
| 151751 | | - -1, /* (321) ecmd ::= SEMI */ |
| 151752 | | - -2, /* (322) ecmd ::= cmdx SEMI */ |
| 151753 | | - -2, /* (323) ecmd ::= explain cmdx */ |
| 151754 | | - 0, /* (324) trans_opt ::= */ |
| 151755 | | - -1, /* (325) trans_opt ::= TRANSACTION */ |
| 151756 | | - -2, /* (326) trans_opt ::= TRANSACTION nm */ |
| 151757 | | - -1, /* (327) savepoint_opt ::= SAVEPOINT */ |
| 151758 | | - 0, /* (328) savepoint_opt ::= */ |
| 151759 | | - -2, /* (329) cmd ::= create_table create_table_args */ |
| 151760 | | - -4, /* (330) columnlist ::= columnlist COMMA columnname carglist */ |
| 151761 | | - -2, /* (331) columnlist ::= columnname carglist */ |
| 151762 | | - -1, /* (332) nm ::= ID|INDEXED */ |
| 151763 | | - -1, /* (333) nm ::= STRING */ |
| 151764 | | - -1, /* (334) nm ::= JOIN_KW */ |
| 151765 | | - -1, /* (335) typetoken ::= typename */ |
| 151766 | | - -1, /* (336) typename ::= ID|STRING */ |
| 151767 | | - -1, /* (337) signed ::= plus_num */ |
| 151768 | | - -1, /* (338) signed ::= minus_num */ |
| 151769 | | - -2, /* (339) carglist ::= carglist ccons */ |
| 151770 | | - 0, /* (340) carglist ::= */ |
| 151771 | | - -2, /* (341) ccons ::= NULL onconf */ |
| 151772 | | - -2, /* (342) conslist_opt ::= COMMA conslist */ |
| 151773 | | - -3, /* (343) conslist ::= conslist tconscomma tcons */ |
| 151774 | | - -1, /* (344) conslist ::= tcons */ |
| 151775 | | - 0, /* (345) tconscomma ::= */ |
| 151776 | | - -1, /* (346) defer_subclause_opt ::= defer_subclause */ |
| 151777 | | - -1, /* (347) resolvetype ::= raisetype */ |
| 151778 | | - -1, /* (348) selectnowith ::= oneselect */ |
| 151779 | | - -1, /* (349) oneselect ::= values */ |
| 151780 | | - -2, /* (350) sclp ::= selcollist COMMA */ |
| 151781 | | - -1, /* (351) as ::= ID|STRING */ |
| 151782 | | - -1, /* (352) expr ::= term */ |
| 151783 | | - -1, /* (353) likeop ::= LIKE_KW|MATCH */ |
| 151784 | | - -1, /* (354) exprlist ::= nexprlist */ |
| 151785 | | - -1, /* (355) nmnum ::= plus_num */ |
| 151786 | | - -1, /* (356) nmnum ::= nm */ |
| 151787 | | - -1, /* (357) nmnum ::= ON */ |
| 151788 | | - -1, /* (358) nmnum ::= DELETE */ |
| 151789 | | - -1, /* (359) nmnum ::= DEFAULT */ |
| 151790 | | - -1, /* (360) plus_num ::= INTEGER|FLOAT */ |
| 151791 | | - 0, /* (361) foreach_clause ::= */ |
| 151792 | | - -3, /* (362) foreach_clause ::= FOR EACH ROW */ |
| 151793 | | - -1, /* (363) trnm ::= nm */ |
| 151794 | | - 0, /* (364) tridxby ::= */ |
| 151795 | | - -1, /* (365) database_kw_opt ::= DATABASE */ |
| 151796 | | - 0, /* (366) database_kw_opt ::= */ |
| 151797 | | - 0, /* (367) kwcolumn_opt ::= */ |
| 151798 | | - -1, /* (368) kwcolumn_opt ::= COLUMNKW */ |
| 151799 | | - -1, /* (369) vtabarglist ::= vtabarg */ |
| 151800 | | - -3, /* (370) vtabarglist ::= vtabarglist COMMA vtabarg */ |
| 151801 | | - -2, /* (371) vtabarg ::= vtabarg vtabargtoken */ |
| 151802 | | - 0, /* (372) anylist ::= */ |
| 151803 | | - -4, /* (373) anylist ::= anylist LP anylist RP */ |
| 151804 | | - -2, /* (374) anylist ::= anylist ANY */ |
| 151805 | | - 0, /* (375) with ::= */ |
| 152381 | + -2, /* (135) nulls ::= NULLS FIRST */ |
| 152382 | + -2, /* (136) nulls ::= NULLS LAST */ |
| 152383 | + 0, /* (137) nulls ::= */ |
| 152384 | + 0, /* (138) groupby_opt ::= */ |
| 152385 | + -3, /* (139) groupby_opt ::= GROUP BY nexprlist */ |
| 152386 | + 0, /* (140) having_opt ::= */ |
| 152387 | + -2, /* (141) having_opt ::= HAVING expr */ |
| 152388 | + 0, /* (142) limit_opt ::= */ |
| 152389 | + -2, /* (143) limit_opt ::= LIMIT expr */ |
| 152390 | + -4, /* (144) limit_opt ::= LIMIT expr OFFSET expr */ |
| 152391 | + -4, /* (145) limit_opt ::= LIMIT expr COMMA expr */ |
| 152392 | + -6, /* (146) cmd ::= with DELETE FROM xfullname indexed_opt where_opt */ |
| 152393 | + 0, /* (147) where_opt ::= */ |
| 152394 | + -2, /* (148) where_opt ::= WHERE expr */ |
| 152395 | + -8, /* (149) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ |
| 152396 | + -5, /* (150) setlist ::= setlist COMMA nm EQ expr */ |
| 152397 | + -7, /* (151) setlist ::= setlist COMMA LP idlist RP EQ expr */ |
| 152398 | + -3, /* (152) setlist ::= nm EQ expr */ |
| 152399 | + -5, /* (153) setlist ::= LP idlist RP EQ expr */ |
| 152400 | + -7, /* (154) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ |
| 152401 | + -7, /* (155) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */ |
| 152402 | + 0, /* (156) upsert ::= */ |
| 152403 | + -11, /* (157) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */ |
| 152404 | + -8, /* (158) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */ |
| 152405 | + -4, /* (159) upsert ::= ON CONFLICT DO NOTHING */ |
| 152406 | + -2, /* (160) insert_cmd ::= INSERT orconf */ |
| 152407 | + -1, /* (161) insert_cmd ::= REPLACE */ |
| 152408 | + 0, /* (162) idlist_opt ::= */ |
| 152409 | + -3, /* (163) idlist_opt ::= LP idlist RP */ |
| 152410 | + -3, /* (164) idlist ::= idlist COMMA nm */ |
| 152411 | + -1, /* (165) idlist ::= nm */ |
| 152412 | + -3, /* (166) expr ::= LP expr RP */ |
| 152413 | + -1, /* (167) expr ::= ID|INDEXED */ |
| 152414 | + -1, /* (168) expr ::= JOIN_KW */ |
| 152415 | + -3, /* (169) expr ::= nm DOT nm */ |
| 152416 | + -5, /* (170) expr ::= nm DOT nm DOT nm */ |
| 152417 | + -1, /* (171) term ::= NULL|FLOAT|BLOB */ |
| 152418 | + -1, /* (172) term ::= STRING */ |
| 152419 | + -1, /* (173) term ::= INTEGER */ |
| 152420 | + -1, /* (174) expr ::= VARIABLE */ |
| 152421 | + -3, /* (175) expr ::= expr COLLATE ID|STRING */ |
| 152422 | + -6, /* (176) expr ::= CAST LP expr AS typetoken RP */ |
| 152423 | + -5, /* (177) expr ::= ID|INDEXED LP distinct exprlist RP */ |
| 152424 | + -4, /* (178) expr ::= ID|INDEXED LP STAR RP */ |
| 152425 | + -6, /* (179) expr ::= ID|INDEXED LP distinct exprlist RP filter_over */ |
| 152426 | + -5, /* (180) expr ::= ID|INDEXED LP STAR RP filter_over */ |
| 152427 | + -1, /* (181) term ::= CTIME_KW */ |
| 152428 | + -5, /* (182) expr ::= LP nexprlist COMMA expr RP */ |
| 152429 | + -3, /* (183) expr ::= expr AND expr */ |
| 152430 | + -3, /* (184) expr ::= expr OR expr */ |
| 152431 | + -3, /* (185) expr ::= expr LT|GT|GE|LE expr */ |
| 152432 | + -3, /* (186) expr ::= expr EQ|NE expr */ |
| 152433 | + -3, /* (187) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ |
| 152434 | + -3, /* (188) expr ::= expr PLUS|MINUS expr */ |
| 152435 | + -3, /* (189) expr ::= expr STAR|SLASH|REM expr */ |
| 152436 | + -3, /* (190) expr ::= expr CONCAT expr */ |
| 152437 | + -2, /* (191) likeop ::= NOT LIKE_KW|MATCH */ |
| 152438 | + -3, /* (192) expr ::= expr likeop expr */ |
| 152439 | + -5, /* (193) expr ::= expr likeop expr ESCAPE expr */ |
| 152440 | + -2, /* (194) expr ::= expr ISNULL|NOTNULL */ |
| 152441 | + -3, /* (195) expr ::= expr NOT NULL */ |
| 152442 | + -3, /* (196) expr ::= expr IS expr */ |
| 152443 | + -4, /* (197) expr ::= expr IS NOT expr */ |
| 152444 | + -2, /* (198) expr ::= NOT expr */ |
| 152445 | + -2, /* (199) expr ::= BITNOT expr */ |
| 152446 | + -2, /* (200) expr ::= PLUS|MINUS expr */ |
| 152447 | + -1, /* (201) between_op ::= BETWEEN */ |
| 152448 | + -2, /* (202) between_op ::= NOT BETWEEN */ |
| 152449 | + -5, /* (203) expr ::= expr between_op expr AND expr */ |
| 152450 | + -1, /* (204) in_op ::= IN */ |
| 152451 | + -2, /* (205) in_op ::= NOT IN */ |
| 152452 | + -5, /* (206) expr ::= expr in_op LP exprlist RP */ |
| 152453 | + -3, /* (207) expr ::= LP select RP */ |
| 152454 | + -5, /* (208) expr ::= expr in_op LP select RP */ |
| 152455 | + -5, /* (209) expr ::= expr in_op nm dbnm paren_exprlist */ |
| 152456 | + -4, /* (210) expr ::= EXISTS LP select RP */ |
| 152457 | + -5, /* (211) expr ::= CASE case_operand case_exprlist case_else END */ |
| 152458 | + -5, /* (212) case_exprlist ::= case_exprlist WHEN expr THEN expr */ |
| 152459 | + -4, /* (213) case_exprlist ::= WHEN expr THEN expr */ |
| 152460 | + -2, /* (214) case_else ::= ELSE expr */ |
| 152461 | + 0, /* (215) case_else ::= */ |
| 152462 | + -1, /* (216) case_operand ::= expr */ |
| 152463 | + 0, /* (217) case_operand ::= */ |
| 152464 | + 0, /* (218) exprlist ::= */ |
| 152465 | + -3, /* (219) nexprlist ::= nexprlist COMMA expr */ |
| 152466 | + -1, /* (220) nexprlist ::= expr */ |
| 152467 | + 0, /* (221) paren_exprlist ::= */ |
| 152468 | + -3, /* (222) paren_exprlist ::= LP exprlist RP */ |
| 152469 | + -12, /* (223) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ |
| 152470 | + -1, /* (224) uniqueflag ::= UNIQUE */ |
| 152471 | + 0, /* (225) uniqueflag ::= */ |
| 152472 | + 0, /* (226) eidlist_opt ::= */ |
| 152473 | + -3, /* (227) eidlist_opt ::= LP eidlist RP */ |
| 152474 | + -5, /* (228) eidlist ::= eidlist COMMA nm collate sortorder */ |
| 152475 | + -3, /* (229) eidlist ::= nm collate sortorder */ |
| 152476 | + 0, /* (230) collate ::= */ |
| 152477 | + -2, /* (231) collate ::= COLLATE ID|STRING */ |
| 152478 | + -4, /* (232) cmd ::= DROP INDEX ifexists fullname */ |
| 152479 | + -2, /* (233) cmd ::= VACUUM vinto */ |
| 152480 | + -3, /* (234) cmd ::= VACUUM nm vinto */ |
| 152481 | + -2, /* (235) vinto ::= INTO expr */ |
| 152482 | + 0, /* (236) vinto ::= */ |
| 152483 | + -3, /* (237) cmd ::= PRAGMA nm dbnm */ |
| 152484 | + -5, /* (238) cmd ::= PRAGMA nm dbnm EQ nmnum */ |
| 152485 | + -6, /* (239) cmd ::= PRAGMA nm dbnm LP nmnum RP */ |
| 152486 | + -5, /* (240) cmd ::= PRAGMA nm dbnm EQ minus_num */ |
| 152487 | + -6, /* (241) cmd ::= PRAGMA nm dbnm LP minus_num RP */ |
| 152488 | + -2, /* (242) plus_num ::= PLUS INTEGER|FLOAT */ |
| 152489 | + -2, /* (243) minus_num ::= MINUS INTEGER|FLOAT */ |
| 152490 | + -5, /* (244) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ |
| 152491 | + -11, /* (245) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ |
| 152492 | + -1, /* (246) trigger_time ::= BEFORE|AFTER */ |
| 152493 | + -2, /* (247) trigger_time ::= INSTEAD OF */ |
| 152494 | + 0, /* (248) trigger_time ::= */ |
| 152495 | + -1, /* (249) trigger_event ::= DELETE|INSERT */ |
| 152496 | + -1, /* (250) trigger_event ::= UPDATE */ |
| 152497 | + -3, /* (251) trigger_event ::= UPDATE OF idlist */ |
| 152498 | + 0, /* (252) when_clause ::= */ |
| 152499 | + -2, /* (253) when_clause ::= WHEN expr */ |
| 152500 | + -3, /* (254) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ |
| 152501 | + -2, /* (255) trigger_cmd_list ::= trigger_cmd SEMI */ |
| 152502 | + -3, /* (256) trnm ::= nm DOT nm */ |
| 152503 | + -3, /* (257) tridxby ::= INDEXED BY nm */ |
| 152504 | + -2, /* (258) tridxby ::= NOT INDEXED */ |
| 152505 | + -8, /* (259) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ |
| 152506 | + -8, /* (260) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ |
| 152507 | + -6, /* (261) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ |
| 152508 | + -3, /* (262) trigger_cmd ::= scanpt select scanpt */ |
| 152509 | + -4, /* (263) expr ::= RAISE LP IGNORE RP */ |
| 152510 | + -6, /* (264) expr ::= RAISE LP raisetype COMMA nm RP */ |
| 152511 | + -1, /* (265) raisetype ::= ROLLBACK */ |
| 152512 | + -1, /* (266) raisetype ::= ABORT */ |
| 152513 | + -1, /* (267) raisetype ::= FAIL */ |
| 152514 | + -4, /* (268) cmd ::= DROP TRIGGER ifexists fullname */ |
| 152515 | + -6, /* (269) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ |
| 152516 | + -3, /* (270) cmd ::= DETACH database_kw_opt expr */ |
| 152517 | + 0, /* (271) key_opt ::= */ |
| 152518 | + -2, /* (272) key_opt ::= KEY expr */ |
| 152519 | + -1, /* (273) cmd ::= REINDEX */ |
| 152520 | + -3, /* (274) cmd ::= REINDEX nm dbnm */ |
| 152521 | + -1, /* (275) cmd ::= ANALYZE */ |
| 152522 | + -3, /* (276) cmd ::= ANALYZE nm dbnm */ |
| 152523 | + -6, /* (277) cmd ::= ALTER TABLE fullname RENAME TO nm */ |
| 152524 | + -7, /* (278) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ |
| 152525 | + -1, /* (279) add_column_fullname ::= fullname */ |
| 152526 | + -8, /* (280) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ |
| 152527 | + -1, /* (281) cmd ::= create_vtab */ |
| 152528 | + -4, /* (282) cmd ::= create_vtab LP vtabarglist RP */ |
| 152529 | + -8, /* (283) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ |
| 152530 | + 0, /* (284) vtabarg ::= */ |
| 152531 | + -1, /* (285) vtabargtoken ::= ANY */ |
| 152532 | + -3, /* (286) vtabargtoken ::= lp anylist RP */ |
| 152533 | + -1, /* (287) lp ::= LP */ |
| 152534 | + -2, /* (288) with ::= WITH wqlist */ |
| 152535 | + -3, /* (289) with ::= WITH RECURSIVE wqlist */ |
| 152536 | + -6, /* (290) wqlist ::= nm eidlist_opt AS LP select RP */ |
| 152537 | + -8, /* (291) wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ |
| 152538 | + -1, /* (292) windowdefn_list ::= windowdefn */ |
| 152539 | + -3, /* (293) windowdefn_list ::= windowdefn_list COMMA windowdefn */ |
| 152540 | + -5, /* (294) windowdefn ::= nm AS LP window RP */ |
| 152541 | + -5, /* (295) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ |
| 152542 | + -6, /* (296) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ |
| 152543 | + -4, /* (297) window ::= ORDER BY sortlist frame_opt */ |
| 152544 | + -5, /* (298) window ::= nm ORDER BY sortlist frame_opt */ |
| 152545 | + -1, /* (299) window ::= frame_opt */ |
| 152546 | + -2, /* (300) window ::= nm frame_opt */ |
| 152547 | + 0, /* (301) frame_opt ::= */ |
| 152548 | + -3, /* (302) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ |
| 152549 | + -6, /* (303) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ |
| 152550 | + -1, /* (304) range_or_rows ::= RANGE|ROWS|GROUPS */ |
| 152551 | + -1, /* (305) frame_bound_s ::= frame_bound */ |
| 152552 | + -2, /* (306) frame_bound_s ::= UNBOUNDED PRECEDING */ |
| 152553 | + -1, /* (307) frame_bound_e ::= frame_bound */ |
| 152554 | + -2, /* (308) frame_bound_e ::= UNBOUNDED FOLLOWING */ |
| 152555 | + -2, /* (309) frame_bound ::= expr PRECEDING|FOLLOWING */ |
| 152556 | + -2, /* (310) frame_bound ::= CURRENT ROW */ |
| 152557 | + 0, /* (311) frame_exclude_opt ::= */ |
| 152558 | + -2, /* (312) frame_exclude_opt ::= EXCLUDE frame_exclude */ |
| 152559 | + -2, /* (313) frame_exclude ::= NO OTHERS */ |
| 152560 | + -2, /* (314) frame_exclude ::= CURRENT ROW */ |
| 152561 | + -1, /* (315) frame_exclude ::= GROUP|TIES */ |
| 152562 | + -2, /* (316) window_clause ::= WINDOW windowdefn_list */ |
| 152563 | + -2, /* (317) filter_over ::= filter_clause over_clause */ |
| 152564 | + -1, /* (318) filter_over ::= over_clause */ |
| 152565 | + -1, /* (319) filter_over ::= filter_clause */ |
| 152566 | + -4, /* (320) over_clause ::= OVER LP window RP */ |
| 152567 | + -2, /* (321) over_clause ::= OVER nm */ |
| 152568 | + -5, /* (322) filter_clause ::= FILTER LP WHERE expr RP */ |
| 152569 | + -1, /* (323) input ::= cmdlist */ |
| 152570 | + -2, /* (324) cmdlist ::= cmdlist ecmd */ |
| 152571 | + -1, /* (325) cmdlist ::= ecmd */ |
| 152572 | + -1, /* (326) ecmd ::= SEMI */ |
| 152573 | + -2, /* (327) ecmd ::= cmdx SEMI */ |
| 152574 | + -2, /* (328) ecmd ::= explain cmdx */ |
| 152575 | + 0, /* (329) trans_opt ::= */ |
| 152576 | + -1, /* (330) trans_opt ::= TRANSACTION */ |
| 152577 | + -2, /* (331) trans_opt ::= TRANSACTION nm */ |
| 152578 | + -1, /* (332) savepoint_opt ::= SAVEPOINT */ |
| 152579 | + 0, /* (333) savepoint_opt ::= */ |
| 152580 | + -2, /* (334) cmd ::= create_table create_table_args */ |
| 152581 | + -4, /* (335) columnlist ::= columnlist COMMA columnname carglist */ |
| 152582 | + -2, /* (336) columnlist ::= columnname carglist */ |
| 152583 | + -1, /* (337) nm ::= ID|INDEXED */ |
| 152584 | + -1, /* (338) nm ::= STRING */ |
| 152585 | + -1, /* (339) nm ::= JOIN_KW */ |
| 152586 | + -1, /* (340) typetoken ::= typename */ |
| 152587 | + -1, /* (341) typename ::= ID|STRING */ |
| 152588 | + -1, /* (342) signed ::= plus_num */ |
| 152589 | + -1, /* (343) signed ::= minus_num */ |
| 152590 | + -2, /* (344) carglist ::= carglist ccons */ |
| 152591 | + 0, /* (345) carglist ::= */ |
| 152592 | + -2, /* (346) ccons ::= NULL onconf */ |
| 152593 | + -2, /* (347) conslist_opt ::= COMMA conslist */ |
| 152594 | + -3, /* (348) conslist ::= conslist tconscomma tcons */ |
| 152595 | + -1, /* (349) conslist ::= tcons */ |
| 152596 | + 0, /* (350) tconscomma ::= */ |
| 152597 | + -1, /* (351) defer_subclause_opt ::= defer_subclause */ |
| 152598 | + -1, /* (352) resolvetype ::= raisetype */ |
| 152599 | + -1, /* (353) selectnowith ::= oneselect */ |
| 152600 | + -1, /* (354) oneselect ::= values */ |
| 152601 | + -2, /* (355) sclp ::= selcollist COMMA */ |
| 152602 | + -1, /* (356) as ::= ID|STRING */ |
| 152603 | + -1, /* (357) expr ::= term */ |
| 152604 | + -1, /* (358) likeop ::= LIKE_KW|MATCH */ |
| 152605 | + -1, /* (359) exprlist ::= nexprlist */ |
| 152606 | + -1, /* (360) nmnum ::= plus_num */ |
| 152607 | + -1, /* (361) nmnum ::= nm */ |
| 152608 | + -1, /* (362) nmnum ::= ON */ |
| 152609 | + -1, /* (363) nmnum ::= DELETE */ |
| 152610 | + -1, /* (364) nmnum ::= DEFAULT */ |
| 152611 | + -1, /* (365) plus_num ::= INTEGER|FLOAT */ |
| 152612 | + 0, /* (366) foreach_clause ::= */ |
| 152613 | + -3, /* (367) foreach_clause ::= FOR EACH ROW */ |
| 152614 | + -1, /* (368) trnm ::= nm */ |
| 152615 | + 0, /* (369) tridxby ::= */ |
| 152616 | + -1, /* (370) database_kw_opt ::= DATABASE */ |
| 152617 | + 0, /* (371) database_kw_opt ::= */ |
| 152618 | + 0, /* (372) kwcolumn_opt ::= */ |
| 152619 | + -1, /* (373) kwcolumn_opt ::= COLUMNKW */ |
| 152620 | + -1, /* (374) vtabarglist ::= vtabarg */ |
| 152621 | + -3, /* (375) vtabarglist ::= vtabarglist COMMA vtabarg */ |
| 152622 | + -2, /* (376) vtabarg ::= vtabarg vtabargtoken */ |
| 152623 | + 0, /* (377) anylist ::= */ |
| 152624 | + -4, /* (378) anylist ::= anylist LP anylist RP */ |
| 152625 | + -2, /* (379) anylist ::= anylist ANY */ |
| 152626 | + 0, /* (380) with ::= */ |
| 151806 | 152627 | }; |
| 151807 | 152628 | |
| 151808 | 152629 | static void yy_accept(yyParser*); /* Forward Declaration */ |
| 151809 | 152630 | |
| 151810 | 152631 | /* |
| | @@ -151897,20 +152718,20 @@ |
| 151897 | 152718 | break; |
| 151898 | 152719 | case 2: /* cmdx ::= cmd */ |
| 151899 | 152720 | { sqlite3FinishCoding(pParse); } |
| 151900 | 152721 | break; |
| 151901 | 152722 | case 3: /* cmd ::= BEGIN transtype trans_opt */ |
| 151902 | | -{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy100);} |
| 152723 | +{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy32);} |
| 151903 | 152724 | break; |
| 151904 | 152725 | case 4: /* transtype ::= */ |
| 151905 | | -{yymsp[1].minor.yy100 = TK_DEFERRED;} |
| 152726 | +{yymsp[1].minor.yy32 = TK_DEFERRED;} |
| 151906 | 152727 | break; |
| 151907 | 152728 | case 5: /* transtype ::= DEFERRED */ |
| 151908 | 152729 | case 6: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==6); |
| 151909 | 152730 | case 7: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==7); |
| 151910 | | - case 301: /* range_or_rows ::= RANGE|ROWS|GROUPS */ yytestcase(yyruleno==301); |
| 151911 | | -{yymsp[0].minor.yy100 = yymsp[0].major; /*A-overwrites-X*/} |
| 152731 | + case 304: /* range_or_rows ::= RANGE|ROWS|GROUPS */ yytestcase(yyruleno==304); |
| 152732 | +{yymsp[0].minor.yy32 = yymsp[0].major; /*A-overwrites-X*/} |
| 151912 | 152733 | break; |
| 151913 | 152734 | case 8: /* cmd ::= COMMIT|END trans_opt */ |
| 151914 | 152735 | case 9: /* cmd ::= ROLLBACK trans_opt */ yytestcase(yyruleno==9); |
| 151915 | 152736 | {sqlite3EndTransaction(pParse,yymsp[-1].major);} |
| 151916 | 152737 | break; |
| | @@ -151929,11 +152750,11 @@ |
| 151929 | 152750 | sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &yymsp[0].minor.yy0); |
| 151930 | 152751 | } |
| 151931 | 152752 | break; |
| 151932 | 152753 | case 13: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */ |
| 151933 | 152754 | { |
| 151934 | | - sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy100,0,0,yymsp[-2].minor.yy100); |
| 152755 | + sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy32,0,0,yymsp[-2].minor.yy32); |
| 151935 | 152756 | } |
| 151936 | 152757 | break; |
| 151937 | 152758 | case 14: /* createkw ::= CREATE */ |
| 151938 | 152759 | {disableLookaside(pParse);} |
| 151939 | 152760 | break; |
| | @@ -151943,37 +152764,37 @@ |
| 151943 | 152764 | case 43: /* autoinc ::= */ yytestcase(yyruleno==43); |
| 151944 | 152765 | case 58: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==58); |
| 151945 | 152766 | case 68: /* defer_subclause_opt ::= */ yytestcase(yyruleno==68); |
| 151946 | 152767 | case 77: /* ifexists ::= */ yytestcase(yyruleno==77); |
| 151947 | 152768 | case 94: /* distinct ::= */ yytestcase(yyruleno==94); |
| 151948 | | - case 227: /* collate ::= */ yytestcase(yyruleno==227); |
| 151949 | | -{yymsp[1].minor.yy100 = 0;} |
| 152769 | + case 230: /* collate ::= */ yytestcase(yyruleno==230); |
| 152770 | +{yymsp[1].minor.yy32 = 0;} |
| 151950 | 152771 | break; |
| 151951 | 152772 | case 16: /* ifnotexists ::= IF NOT EXISTS */ |
| 151952 | | -{yymsp[-2].minor.yy100 = 1;} |
| 152773 | +{yymsp[-2].minor.yy32 = 1;} |
| 151953 | 152774 | break; |
| 151954 | 152775 | case 17: /* temp ::= TEMP */ |
| 151955 | 152776 | case 44: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==44); |
| 151956 | | -{yymsp[0].minor.yy100 = 1;} |
| 152777 | +{yymsp[0].minor.yy32 = 1;} |
| 151957 | 152778 | break; |
| 151958 | 152779 | case 19: /* create_table_args ::= LP columnlist conslist_opt RP table_options */ |
| 151959 | 152780 | { |
| 151960 | | - sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy100,0); |
| 152781 | + sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy32,0); |
| 151961 | 152782 | } |
| 151962 | 152783 | break; |
| 151963 | 152784 | case 20: /* create_table_args ::= AS select */ |
| 151964 | 152785 | { |
| 151965 | | - sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy391); |
| 151966 | | - sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy391); |
| 152786 | + sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy25); |
| 152787 | + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy25); |
| 151967 | 152788 | } |
| 151968 | 152789 | break; |
| 151969 | 152790 | case 22: /* table_options ::= WITHOUT nm */ |
| 151970 | 152791 | { |
| 151971 | 152792 | if( yymsp[0].minor.yy0.n==5 && sqlite3_strnicmp(yymsp[0].minor.yy0.z,"rowid",5)==0 ){ |
| 151972 | | - yymsp[-1].minor.yy100 = TF_WithoutRowid | TF_NoVisibleRowid; |
| 152793 | + yymsp[-1].minor.yy32 = TF_WithoutRowid | TF_NoVisibleRowid; |
| 151973 | 152794 | }else{ |
| 151974 | | - yymsp[-1].minor.yy100 = 0; |
| 152795 | + yymsp[-1].minor.yy32 = 0; |
| 151975 | 152796 | sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z); |
| 151976 | 152797 | } |
| 151977 | 152798 | } |
| 151978 | 152799 | break; |
| 151979 | 152800 | case 23: /* columnname ::= nm typetoken */ |
| | @@ -151998,11 +152819,11 @@ |
| 151998 | 152819 | {yymsp[-1].minor.yy0.n=yymsp[0].minor.yy0.n+(int)(yymsp[0].minor.yy0.z-yymsp[-1].minor.yy0.z);} |
| 151999 | 152820 | break; |
| 152000 | 152821 | case 28: /* scanpt ::= */ |
| 152001 | 152822 | { |
| 152002 | 152823 | assert( yyLookahead!=YYNOCODE ); |
| 152003 | | - yymsp[1].minor.yy528 = yyLookaheadToken.z; |
| 152824 | + yymsp[1].minor.yy8 = yyLookaheadToken.z; |
| 152004 | 152825 | } |
| 152005 | 152826 | break; |
| 152006 | 152827 | case 29: /* scantok ::= */ |
| 152007 | 152828 | { |
| 152008 | 152829 | assert( yyLookahead!=YYNOCODE ); |
| | @@ -152012,21 +152833,21 @@ |
| 152012 | 152833 | case 30: /* ccons ::= CONSTRAINT nm */ |
| 152013 | 152834 | case 63: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==63); |
| 152014 | 152835 | {pParse->constraintName = yymsp[0].minor.yy0;} |
| 152015 | 152836 | break; |
| 152016 | 152837 | case 31: /* ccons ::= DEFAULT scantok term */ |
| 152017 | | -{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy102,yymsp[-1].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} |
| 152838 | +{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy46,yymsp[-1].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} |
| 152018 | 152839 | break; |
| 152019 | 152840 | case 32: /* ccons ::= DEFAULT LP expr RP */ |
| 152020 | | -{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy102,yymsp[-2].minor.yy0.z+1,yymsp[0].minor.yy0.z);} |
| 152841 | +{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy46,yymsp[-2].minor.yy0.z+1,yymsp[0].minor.yy0.z);} |
| 152021 | 152842 | break; |
| 152022 | 152843 | case 33: /* ccons ::= DEFAULT PLUS scantok term */ |
| 152023 | | -{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy102,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} |
| 152844 | +{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy46,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} |
| 152024 | 152845 | break; |
| 152025 | 152846 | case 34: /* ccons ::= DEFAULT MINUS scantok term */ |
| 152026 | 152847 | { |
| 152027 | | - Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy102, 0); |
| 152848 | + Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy46, 0); |
| 152028 | 152849 | sqlite3AddDefaultValue(pParse,p,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]); |
| 152029 | 152850 | } |
| 152030 | 152851 | break; |
| 152031 | 152852 | case 35: /* ccons ::= DEFAULT scantok ID|INDEXED */ |
| 152032 | 152853 | { |
| | @@ -152037,319 +152858,319 @@ |
| 152037 | 152858 | } |
| 152038 | 152859 | sqlite3AddDefaultValue(pParse,p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.z+yymsp[0].minor.yy0.n); |
| 152039 | 152860 | } |
| 152040 | 152861 | break; |
| 152041 | 152862 | case 36: /* ccons ::= NOT NULL onconf */ |
| 152042 | | -{sqlite3AddNotNull(pParse, yymsp[0].minor.yy100);} |
| 152863 | +{sqlite3AddNotNull(pParse, yymsp[0].minor.yy32);} |
| 152043 | 152864 | break; |
| 152044 | 152865 | case 37: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */ |
| 152045 | | -{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy100,yymsp[0].minor.yy100,yymsp[-2].minor.yy100);} |
| 152866 | +{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy32,yymsp[0].minor.yy32,yymsp[-2].minor.yy32);} |
| 152046 | 152867 | break; |
| 152047 | 152868 | case 38: /* ccons ::= UNIQUE onconf */ |
| 152048 | | -{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy100,0,0,0,0, |
| 152869 | +{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy32,0,0,0,0, |
| 152049 | 152870 | SQLITE_IDXTYPE_UNIQUE);} |
| 152050 | 152871 | break; |
| 152051 | 152872 | case 39: /* ccons ::= CHECK LP expr RP */ |
| 152052 | | -{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy102);} |
| 152873 | +{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy46);} |
| 152053 | 152874 | break; |
| 152054 | 152875 | case 40: /* ccons ::= REFERENCES nm eidlist_opt refargs */ |
| 152055 | | -{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy94,yymsp[0].minor.yy100);} |
| 152876 | +{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy138,yymsp[0].minor.yy32);} |
| 152056 | 152877 | break; |
| 152057 | 152878 | case 41: /* ccons ::= defer_subclause */ |
| 152058 | | -{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy100);} |
| 152879 | +{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy32);} |
| 152059 | 152880 | break; |
| 152060 | 152881 | case 42: /* ccons ::= COLLATE ID|STRING */ |
| 152061 | 152882 | {sqlite3AddCollateType(pParse, &yymsp[0].minor.yy0);} |
| 152062 | 152883 | break; |
| 152063 | 152884 | case 45: /* refargs ::= */ |
| 152064 | | -{ yymsp[1].minor.yy100 = OE_None*0x0101; /* EV: R-19803-45884 */} |
| 152885 | +{ yymsp[1].minor.yy32 = OE_None*0x0101; /* EV: R-19803-45884 */} |
| 152065 | 152886 | break; |
| 152066 | 152887 | case 46: /* refargs ::= refargs refarg */ |
| 152067 | | -{ yymsp[-1].minor.yy100 = (yymsp[-1].minor.yy100 & ~yymsp[0].minor.yy199.mask) | yymsp[0].minor.yy199.value; } |
| 152888 | +{ yymsp[-1].minor.yy32 = (yymsp[-1].minor.yy32 & ~yymsp[0].minor.yy495.mask) | yymsp[0].minor.yy495.value; } |
| 152068 | 152889 | break; |
| 152069 | 152890 | case 47: /* refarg ::= MATCH nm */ |
| 152070 | | -{ yymsp[-1].minor.yy199.value = 0; yymsp[-1].minor.yy199.mask = 0x000000; } |
| 152891 | +{ yymsp[-1].minor.yy495.value = 0; yymsp[-1].minor.yy495.mask = 0x000000; } |
| 152071 | 152892 | break; |
| 152072 | 152893 | case 48: /* refarg ::= ON INSERT refact */ |
| 152073 | | -{ yymsp[-2].minor.yy199.value = 0; yymsp[-2].minor.yy199.mask = 0x000000; } |
| 152894 | +{ yymsp[-2].minor.yy495.value = 0; yymsp[-2].minor.yy495.mask = 0x000000; } |
| 152074 | 152895 | break; |
| 152075 | 152896 | case 49: /* refarg ::= ON DELETE refact */ |
| 152076 | | -{ yymsp[-2].minor.yy199.value = yymsp[0].minor.yy100; yymsp[-2].minor.yy199.mask = 0x0000ff; } |
| 152897 | +{ yymsp[-2].minor.yy495.value = yymsp[0].minor.yy32; yymsp[-2].minor.yy495.mask = 0x0000ff; } |
| 152077 | 152898 | break; |
| 152078 | 152899 | case 50: /* refarg ::= ON UPDATE refact */ |
| 152079 | | -{ yymsp[-2].minor.yy199.value = yymsp[0].minor.yy100<<8; yymsp[-2].minor.yy199.mask = 0x00ff00; } |
| 152900 | +{ yymsp[-2].minor.yy495.value = yymsp[0].minor.yy32<<8; yymsp[-2].minor.yy495.mask = 0x00ff00; } |
| 152080 | 152901 | break; |
| 152081 | 152902 | case 51: /* refact ::= SET NULL */ |
| 152082 | | -{ yymsp[-1].minor.yy100 = OE_SetNull; /* EV: R-33326-45252 */} |
| 152903 | +{ yymsp[-1].minor.yy32 = OE_SetNull; /* EV: R-33326-45252 */} |
| 152083 | 152904 | break; |
| 152084 | 152905 | case 52: /* refact ::= SET DEFAULT */ |
| 152085 | | -{ yymsp[-1].minor.yy100 = OE_SetDflt; /* EV: R-33326-45252 */} |
| 152906 | +{ yymsp[-1].minor.yy32 = OE_SetDflt; /* EV: R-33326-45252 */} |
| 152086 | 152907 | break; |
| 152087 | 152908 | case 53: /* refact ::= CASCADE */ |
| 152088 | | -{ yymsp[0].minor.yy100 = OE_Cascade; /* EV: R-33326-45252 */} |
| 152909 | +{ yymsp[0].minor.yy32 = OE_Cascade; /* EV: R-33326-45252 */} |
| 152089 | 152910 | break; |
| 152090 | 152911 | case 54: /* refact ::= RESTRICT */ |
| 152091 | | -{ yymsp[0].minor.yy100 = OE_Restrict; /* EV: R-33326-45252 */} |
| 152912 | +{ yymsp[0].minor.yy32 = OE_Restrict; /* EV: R-33326-45252 */} |
| 152092 | 152913 | break; |
| 152093 | 152914 | case 55: /* refact ::= NO ACTION */ |
| 152094 | | -{ yymsp[-1].minor.yy100 = OE_None; /* EV: R-33326-45252 */} |
| 152915 | +{ yymsp[-1].minor.yy32 = OE_None; /* EV: R-33326-45252 */} |
| 152095 | 152916 | break; |
| 152096 | 152917 | case 56: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ |
| 152097 | | -{yymsp[-2].minor.yy100 = 0;} |
| 152918 | +{yymsp[-2].minor.yy32 = 0;} |
| 152098 | 152919 | break; |
| 152099 | 152920 | case 57: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ |
| 152100 | 152921 | case 72: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==72); |
| 152101 | | - case 157: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==157); |
| 152102 | | -{yymsp[-1].minor.yy100 = yymsp[0].minor.yy100;} |
| 152922 | + case 160: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==160); |
| 152923 | +{yymsp[-1].minor.yy32 = yymsp[0].minor.yy32;} |
| 152103 | 152924 | break; |
| 152104 | 152925 | case 59: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ |
| 152105 | 152926 | case 76: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==76); |
| 152106 | | - case 199: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==199); |
| 152107 | | - case 202: /* in_op ::= NOT IN */ yytestcase(yyruleno==202); |
| 152108 | | - case 228: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==228); |
| 152109 | | -{yymsp[-1].minor.yy100 = 1;} |
| 152927 | + case 202: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==202); |
| 152928 | + case 205: /* in_op ::= NOT IN */ yytestcase(yyruleno==205); |
| 152929 | + case 231: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==231); |
| 152930 | +{yymsp[-1].minor.yy32 = 1;} |
| 152110 | 152931 | break; |
| 152111 | 152932 | case 60: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ |
| 152112 | | -{yymsp[-1].minor.yy100 = 0;} |
| 152933 | +{yymsp[-1].minor.yy32 = 0;} |
| 152113 | 152934 | break; |
| 152114 | 152935 | case 62: /* tconscomma ::= COMMA */ |
| 152115 | 152936 | {pParse->constraintName.n = 0;} |
| 152116 | 152937 | break; |
| 152117 | 152938 | case 64: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ |
| 152118 | | -{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy94,yymsp[0].minor.yy100,yymsp[-2].minor.yy100,0);} |
| 152939 | +{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy138,yymsp[0].minor.yy32,yymsp[-2].minor.yy32,0);} |
| 152119 | 152940 | break; |
| 152120 | 152941 | case 65: /* tcons ::= UNIQUE LP sortlist RP onconf */ |
| 152121 | | -{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy94,yymsp[0].minor.yy100,0,0,0,0, |
| 152942 | +{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy138,yymsp[0].minor.yy32,0,0,0,0, |
| 152122 | 152943 | SQLITE_IDXTYPE_UNIQUE);} |
| 152123 | 152944 | break; |
| 152124 | 152945 | case 66: /* tcons ::= CHECK LP expr RP onconf */ |
| 152125 | | -{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy102);} |
| 152946 | +{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy46);} |
| 152126 | 152947 | break; |
| 152127 | 152948 | case 67: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ |
| 152128 | 152949 | { |
| 152129 | | - sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy94, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy94, yymsp[-1].minor.yy100); |
| 152130 | | - sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy100); |
| 152950 | + sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy138, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy138, yymsp[-1].minor.yy32); |
| 152951 | + sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy32); |
| 152131 | 152952 | } |
| 152132 | 152953 | break; |
| 152133 | 152954 | case 69: /* onconf ::= */ |
| 152134 | 152955 | case 71: /* orconf ::= */ yytestcase(yyruleno==71); |
| 152135 | | -{yymsp[1].minor.yy100 = OE_Default;} |
| 152956 | +{yymsp[1].minor.yy32 = OE_Default;} |
| 152136 | 152957 | break; |
| 152137 | 152958 | case 70: /* onconf ::= ON CONFLICT resolvetype */ |
| 152138 | | -{yymsp[-2].minor.yy100 = yymsp[0].minor.yy100;} |
| 152959 | +{yymsp[-2].minor.yy32 = yymsp[0].minor.yy32;} |
| 152139 | 152960 | break; |
| 152140 | 152961 | case 73: /* resolvetype ::= IGNORE */ |
| 152141 | | -{yymsp[0].minor.yy100 = OE_Ignore;} |
| 152962 | +{yymsp[0].minor.yy32 = OE_Ignore;} |
| 152142 | 152963 | break; |
| 152143 | 152964 | case 74: /* resolvetype ::= REPLACE */ |
| 152144 | | - case 158: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==158); |
| 152145 | | -{yymsp[0].minor.yy100 = OE_Replace;} |
| 152965 | + case 161: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==161); |
| 152966 | +{yymsp[0].minor.yy32 = OE_Replace;} |
| 152146 | 152967 | break; |
| 152147 | 152968 | case 75: /* cmd ::= DROP TABLE ifexists fullname */ |
| 152148 | 152969 | { |
| 152149 | | - sqlite3DropTable(pParse, yymsp[0].minor.yy407, 0, yymsp[-1].minor.yy100); |
| 152970 | + sqlite3DropTable(pParse, yymsp[0].minor.yy609, 0, yymsp[-1].minor.yy32); |
| 152150 | 152971 | } |
| 152151 | 152972 | break; |
| 152152 | 152973 | case 78: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ |
| 152153 | 152974 | { |
| 152154 | | - sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy94, yymsp[0].minor.yy391, yymsp[-7].minor.yy100, yymsp[-5].minor.yy100); |
| 152975 | + sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy138, yymsp[0].minor.yy25, yymsp[-7].minor.yy32, yymsp[-5].minor.yy32); |
| 152155 | 152976 | } |
| 152156 | 152977 | break; |
| 152157 | 152978 | case 79: /* cmd ::= DROP VIEW ifexists fullname */ |
| 152158 | 152979 | { |
| 152159 | | - sqlite3DropTable(pParse, yymsp[0].minor.yy407, 1, yymsp[-1].minor.yy100); |
| 152980 | + sqlite3DropTable(pParse, yymsp[0].minor.yy609, 1, yymsp[-1].minor.yy32); |
| 152160 | 152981 | } |
| 152161 | 152982 | break; |
| 152162 | 152983 | case 80: /* cmd ::= select */ |
| 152163 | 152984 | { |
| 152164 | 152985 | SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0}; |
| 152165 | | - sqlite3Select(pParse, yymsp[0].minor.yy391, &dest); |
| 152166 | | - sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy391); |
| 152986 | + sqlite3Select(pParse, yymsp[0].minor.yy25, &dest); |
| 152987 | + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy25); |
| 152167 | 152988 | } |
| 152168 | 152989 | break; |
| 152169 | 152990 | case 81: /* select ::= WITH wqlist selectnowith */ |
| 152170 | 152991 | { |
| 152171 | | - Select *p = yymsp[0].minor.yy391; |
| 152992 | + Select *p = yymsp[0].minor.yy25; |
| 152172 | 152993 | if( p ){ |
| 152173 | | - p->pWith = yymsp[-1].minor.yy243; |
| 152994 | + p->pWith = yymsp[-1].minor.yy297; |
| 152174 | 152995 | parserDoubleLinkSelect(pParse, p); |
| 152175 | 152996 | }else{ |
| 152176 | | - sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy243); |
| 152997 | + sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy297); |
| 152177 | 152998 | } |
| 152178 | | - yymsp[-2].minor.yy391 = p; |
| 152999 | + yymsp[-2].minor.yy25 = p; |
| 152179 | 153000 | } |
| 152180 | 153001 | break; |
| 152181 | 153002 | case 82: /* select ::= WITH RECURSIVE wqlist selectnowith */ |
| 152182 | 153003 | { |
| 152183 | | - Select *p = yymsp[0].minor.yy391; |
| 153004 | + Select *p = yymsp[0].minor.yy25; |
| 152184 | 153005 | if( p ){ |
| 152185 | | - p->pWith = yymsp[-1].minor.yy243; |
| 153006 | + p->pWith = yymsp[-1].minor.yy297; |
| 152186 | 153007 | parserDoubleLinkSelect(pParse, p); |
| 152187 | 153008 | }else{ |
| 152188 | | - sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy243); |
| 153009 | + sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy297); |
| 152189 | 153010 | } |
| 152190 | | - yymsp[-3].minor.yy391 = p; |
| 153011 | + yymsp[-3].minor.yy25 = p; |
| 152191 | 153012 | } |
| 152192 | 153013 | break; |
| 152193 | 153014 | case 83: /* select ::= selectnowith */ |
| 152194 | 153015 | { |
| 152195 | | - Select *p = yymsp[0].minor.yy391; |
| 153016 | + Select *p = yymsp[0].minor.yy25; |
| 152196 | 153017 | if( p ){ |
| 152197 | 153018 | parserDoubleLinkSelect(pParse, p); |
| 152198 | 153019 | } |
| 152199 | | - yymsp[0].minor.yy391 = p; /*A-overwrites-X*/ |
| 153020 | + yymsp[0].minor.yy25 = p; /*A-overwrites-X*/ |
| 152200 | 153021 | } |
| 152201 | 153022 | break; |
| 152202 | 153023 | case 84: /* selectnowith ::= selectnowith multiselect_op oneselect */ |
| 152203 | 153024 | { |
| 152204 | | - Select *pRhs = yymsp[0].minor.yy391; |
| 152205 | | - Select *pLhs = yymsp[-2].minor.yy391; |
| 153025 | + Select *pRhs = yymsp[0].minor.yy25; |
| 153026 | + Select *pLhs = yymsp[-2].minor.yy25; |
| 152206 | 153027 | if( pRhs && pRhs->pPrior ){ |
| 152207 | 153028 | SrcList *pFrom; |
| 152208 | 153029 | Token x; |
| 152209 | 153030 | x.n = 0; |
| 152210 | 153031 | parserDoubleLinkSelect(pParse, pRhs); |
| 152211 | 153032 | pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0); |
| 152212 | 153033 | pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0); |
| 152213 | 153034 | } |
| 152214 | 153035 | if( pRhs ){ |
| 152215 | | - pRhs->op = (u8)yymsp[-1].minor.yy100; |
| 153036 | + pRhs->op = (u8)yymsp[-1].minor.yy32; |
| 152216 | 153037 | pRhs->pPrior = pLhs; |
| 152217 | 153038 | if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue; |
| 152218 | 153039 | pRhs->selFlags &= ~SF_MultiValue; |
| 152219 | | - if( yymsp[-1].minor.yy100!=TK_ALL ) pParse->hasCompound = 1; |
| 153040 | + if( yymsp[-1].minor.yy32!=TK_ALL ) pParse->hasCompound = 1; |
| 152220 | 153041 | }else{ |
| 152221 | 153042 | sqlite3SelectDelete(pParse->db, pLhs); |
| 152222 | 153043 | } |
| 152223 | | - yymsp[-2].minor.yy391 = pRhs; |
| 153044 | + yymsp[-2].minor.yy25 = pRhs; |
| 152224 | 153045 | } |
| 152225 | 153046 | break; |
| 152226 | 153047 | case 85: /* multiselect_op ::= UNION */ |
| 152227 | 153048 | case 87: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==87); |
| 152228 | | -{yymsp[0].minor.yy100 = yymsp[0].major; /*A-overwrites-OP*/} |
| 153049 | +{yymsp[0].minor.yy32 = yymsp[0].major; /*A-overwrites-OP*/} |
| 152229 | 153050 | break; |
| 152230 | 153051 | case 86: /* multiselect_op ::= UNION ALL */ |
| 152231 | | -{yymsp[-1].minor.yy100 = TK_ALL;} |
| 153052 | +{yymsp[-1].minor.yy32 = TK_ALL;} |
| 152232 | 153053 | break; |
| 152233 | 153054 | case 88: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ |
| 152234 | 153055 | { |
| 152235 | | - yymsp[-8].minor.yy391 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy94,yymsp[-5].minor.yy407,yymsp[-4].minor.yy102,yymsp[-3].minor.yy94,yymsp[-2].minor.yy102,yymsp[-1].minor.yy94,yymsp[-7].minor.yy100,yymsp[0].minor.yy102); |
| 153056 | + yymsp[-8].minor.yy25 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy138,yymsp[-5].minor.yy609,yymsp[-4].minor.yy46,yymsp[-3].minor.yy138,yymsp[-2].minor.yy46,yymsp[-1].minor.yy138,yymsp[-7].minor.yy32,yymsp[0].minor.yy46); |
| 152236 | 153057 | } |
| 152237 | 153058 | break; |
| 152238 | 153059 | case 89: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ |
| 152239 | 153060 | { |
| 152240 | | - yymsp[-9].minor.yy391 = sqlite3SelectNew(pParse,yymsp[-7].minor.yy94,yymsp[-6].minor.yy407,yymsp[-5].minor.yy102,yymsp[-4].minor.yy94,yymsp[-3].minor.yy102,yymsp[-1].minor.yy94,yymsp[-8].minor.yy100,yymsp[0].minor.yy102); |
| 152241 | | - if( yymsp[-9].minor.yy391 ){ |
| 152242 | | - yymsp[-9].minor.yy391->pWinDefn = yymsp[-2].minor.yy379; |
| 153061 | + yymsp[-9].minor.yy25 = sqlite3SelectNew(pParse,yymsp[-7].minor.yy138,yymsp[-6].minor.yy609,yymsp[-5].minor.yy46,yymsp[-4].minor.yy138,yymsp[-3].minor.yy46,yymsp[-1].minor.yy138,yymsp[-8].minor.yy32,yymsp[0].minor.yy46); |
| 153062 | + if( yymsp[-9].minor.yy25 ){ |
| 153063 | + yymsp[-9].minor.yy25->pWinDefn = yymsp[-2].minor.yy455; |
| 152243 | 153064 | }else{ |
| 152244 | | - sqlite3WindowListDelete(pParse->db, yymsp[-2].minor.yy379); |
| 153065 | + sqlite3WindowListDelete(pParse->db, yymsp[-2].minor.yy455); |
| 152245 | 153066 | } |
| 152246 | 153067 | } |
| 152247 | 153068 | break; |
| 152248 | 153069 | case 90: /* values ::= VALUES LP nexprlist RP */ |
| 152249 | 153070 | { |
| 152250 | | - yymsp[-3].minor.yy391 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy94,0,0,0,0,0,SF_Values,0); |
| 153071 | + yymsp[-3].minor.yy25 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy138,0,0,0,0,0,SF_Values,0); |
| 152251 | 153072 | } |
| 152252 | 153073 | break; |
| 152253 | 153074 | case 91: /* values ::= values COMMA LP nexprlist RP */ |
| 152254 | 153075 | { |
| 152255 | | - Select *pRight, *pLeft = yymsp[-4].minor.yy391; |
| 152256 | | - pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy94,0,0,0,0,0,SF_Values|SF_MultiValue,0); |
| 153076 | + Select *pRight, *pLeft = yymsp[-4].minor.yy25; |
| 153077 | + pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy138,0,0,0,0,0,SF_Values|SF_MultiValue,0); |
| 152257 | 153078 | if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue; |
| 152258 | 153079 | if( pRight ){ |
| 152259 | 153080 | pRight->op = TK_ALL; |
| 152260 | 153081 | pRight->pPrior = pLeft; |
| 152261 | | - yymsp[-4].minor.yy391 = pRight; |
| 153082 | + yymsp[-4].minor.yy25 = pRight; |
| 152262 | 153083 | }else{ |
| 152263 | | - yymsp[-4].minor.yy391 = pLeft; |
| 153084 | + yymsp[-4].minor.yy25 = pLeft; |
| 152264 | 153085 | } |
| 152265 | 153086 | } |
| 152266 | 153087 | break; |
| 152267 | 153088 | case 92: /* distinct ::= DISTINCT */ |
| 152268 | | -{yymsp[0].minor.yy100 = SF_Distinct;} |
| 153089 | +{yymsp[0].minor.yy32 = SF_Distinct;} |
| 152269 | 153090 | break; |
| 152270 | 153091 | case 93: /* distinct ::= ALL */ |
| 152271 | | -{yymsp[0].minor.yy100 = SF_All;} |
| 153092 | +{yymsp[0].minor.yy32 = SF_All;} |
| 152272 | 153093 | break; |
| 152273 | 153094 | case 95: /* sclp ::= */ |
| 152274 | 153095 | case 128: /* orderby_opt ::= */ yytestcase(yyruleno==128); |
| 152275 | | - case 135: /* groupby_opt ::= */ yytestcase(yyruleno==135); |
| 152276 | | - case 215: /* exprlist ::= */ yytestcase(yyruleno==215); |
| 152277 | | - case 218: /* paren_exprlist ::= */ yytestcase(yyruleno==218); |
| 152278 | | - case 223: /* eidlist_opt ::= */ yytestcase(yyruleno==223); |
| 152279 | | -{yymsp[1].minor.yy94 = 0;} |
| 153096 | + case 138: /* groupby_opt ::= */ yytestcase(yyruleno==138); |
| 153097 | + case 218: /* exprlist ::= */ yytestcase(yyruleno==218); |
| 153098 | + case 221: /* paren_exprlist ::= */ yytestcase(yyruleno==221); |
| 153099 | + case 226: /* eidlist_opt ::= */ yytestcase(yyruleno==226); |
| 153100 | +{yymsp[1].minor.yy138 = 0;} |
| 152280 | 153101 | break; |
| 152281 | 153102 | case 96: /* selcollist ::= sclp scanpt expr scanpt as */ |
| 152282 | 153103 | { |
| 152283 | | - yymsp[-4].minor.yy94 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy94, yymsp[-2].minor.yy102); |
| 152284 | | - if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy94, &yymsp[0].minor.yy0, 1); |
| 152285 | | - sqlite3ExprListSetSpan(pParse,yymsp[-4].minor.yy94,yymsp[-3].minor.yy528,yymsp[-1].minor.yy528); |
| 153104 | + yymsp[-4].minor.yy138 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy138, yymsp[-2].minor.yy46); |
| 153105 | + if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy138, &yymsp[0].minor.yy0, 1); |
| 153106 | + sqlite3ExprListSetSpan(pParse,yymsp[-4].minor.yy138,yymsp[-3].minor.yy8,yymsp[-1].minor.yy8); |
| 152286 | 153107 | } |
| 152287 | 153108 | break; |
| 152288 | 153109 | case 97: /* selcollist ::= sclp scanpt STAR */ |
| 152289 | 153110 | { |
| 152290 | 153111 | Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0); |
| 152291 | | - yymsp[-2].minor.yy94 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy94, p); |
| 153112 | + yymsp[-2].minor.yy138 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy138, p); |
| 152292 | 153113 | } |
| 152293 | 153114 | break; |
| 152294 | 153115 | case 98: /* selcollist ::= sclp scanpt nm DOT STAR */ |
| 152295 | 153116 | { |
| 152296 | 153117 | Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0); |
| 152297 | 153118 | Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); |
| 152298 | 153119 | Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); |
| 152299 | | - yymsp[-4].minor.yy94 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy94, pDot); |
| 153120 | + yymsp[-4].minor.yy138 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy138, pDot); |
| 152300 | 153121 | } |
| 152301 | 153122 | break; |
| 152302 | 153123 | case 99: /* as ::= AS nm */ |
| 152303 | 153124 | case 110: /* dbnm ::= DOT nm */ yytestcase(yyruleno==110); |
| 152304 | | - case 239: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==239); |
| 152305 | | - case 240: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==240); |
| 153125 | + case 242: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==242); |
| 153126 | + case 243: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==243); |
| 152306 | 153127 | {yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;} |
| 152307 | 153128 | break; |
| 152308 | 153129 | case 101: /* from ::= */ |
| 152309 | | -{yymsp[1].minor.yy407 = sqlite3DbMallocZero(pParse->db, sizeof(*yymsp[1].minor.yy407));} |
| 153130 | +{yymsp[1].minor.yy609 = sqlite3DbMallocZero(pParse->db, sizeof(*yymsp[1].minor.yy609));} |
| 152310 | 153131 | break; |
| 152311 | 153132 | case 102: /* from ::= FROM seltablist */ |
| 152312 | 153133 | { |
| 152313 | | - yymsp[-1].minor.yy407 = yymsp[0].minor.yy407; |
| 152314 | | - sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy407); |
| 153134 | + yymsp[-1].minor.yy609 = yymsp[0].minor.yy609; |
| 153135 | + sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy609); |
| 152315 | 153136 | } |
| 152316 | 153137 | break; |
| 152317 | 153138 | case 103: /* stl_prefix ::= seltablist joinop */ |
| 152318 | 153139 | { |
| 152319 | | - if( ALWAYS(yymsp[-1].minor.yy407 && yymsp[-1].minor.yy407->nSrc>0) ) yymsp[-1].minor.yy407->a[yymsp[-1].minor.yy407->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy100; |
| 153140 | + if( ALWAYS(yymsp[-1].minor.yy609 && yymsp[-1].minor.yy609->nSrc>0) ) yymsp[-1].minor.yy609->a[yymsp[-1].minor.yy609->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy32; |
| 152320 | 153141 | } |
| 152321 | 153142 | break; |
| 152322 | 153143 | case 104: /* stl_prefix ::= */ |
| 152323 | | -{yymsp[1].minor.yy407 = 0;} |
| 153144 | +{yymsp[1].minor.yy609 = 0;} |
| 152324 | 153145 | break; |
| 152325 | 153146 | case 105: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ |
| 152326 | 153147 | { |
| 152327 | | - yymsp[-6].minor.yy407 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy407,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy102,yymsp[0].minor.yy76); |
| 152328 | | - sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy407, &yymsp[-2].minor.yy0); |
| 153148 | + yymsp[-6].minor.yy609 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy609,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy46,yymsp[0].minor.yy406); |
| 153149 | + sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy609, &yymsp[-2].minor.yy0); |
| 152329 | 153150 | } |
| 152330 | 153151 | break; |
| 152331 | 153152 | case 106: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ |
| 152332 | 153153 | { |
| 152333 | | - yymsp[-8].minor.yy407 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy407,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy102,yymsp[0].minor.yy76); |
| 152334 | | - sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy407, yymsp[-4].minor.yy94); |
| 153154 | + yymsp[-8].minor.yy609 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy609,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy46,yymsp[0].minor.yy406); |
| 153155 | + sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy609, yymsp[-4].minor.yy138); |
| 152335 | 153156 | } |
| 152336 | 153157 | break; |
| 152337 | 153158 | case 107: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */ |
| 152338 | 153159 | { |
| 152339 | | - yymsp[-6].minor.yy407 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy407,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy391,yymsp[-1].minor.yy102,yymsp[0].minor.yy76); |
| 153160 | + yymsp[-6].minor.yy609 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy609,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy25,yymsp[-1].minor.yy46,yymsp[0].minor.yy406); |
| 152340 | 153161 | } |
| 152341 | 153162 | break; |
| 152342 | 153163 | case 108: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ |
| 152343 | 153164 | { |
| 152344 | | - if( yymsp[-6].minor.yy407==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy102==0 && yymsp[0].minor.yy76==0 ){ |
| 152345 | | - yymsp[-6].minor.yy407 = yymsp[-4].minor.yy407; |
| 152346 | | - }else if( yymsp[-4].minor.yy407->nSrc==1 ){ |
| 152347 | | - yymsp[-6].minor.yy407 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy407,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy102,yymsp[0].minor.yy76); |
| 152348 | | - if( yymsp[-6].minor.yy407 ){ |
| 152349 | | - struct SrcList_item *pNew = &yymsp[-6].minor.yy407->a[yymsp[-6].minor.yy407->nSrc-1]; |
| 152350 | | - struct SrcList_item *pOld = yymsp[-4].minor.yy407->a; |
| 153165 | + if( yymsp[-6].minor.yy609==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy46==0 && yymsp[0].minor.yy406==0 ){ |
| 153166 | + yymsp[-6].minor.yy609 = yymsp[-4].minor.yy609; |
| 153167 | + }else if( yymsp[-4].minor.yy609->nSrc==1 ){ |
| 153168 | + yymsp[-6].minor.yy609 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy609,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy46,yymsp[0].minor.yy406); |
| 153169 | + if( yymsp[-6].minor.yy609 ){ |
| 153170 | + struct SrcList_item *pNew = &yymsp[-6].minor.yy609->a[yymsp[-6].minor.yy609->nSrc-1]; |
| 153171 | + struct SrcList_item *pOld = yymsp[-4].minor.yy609->a; |
| 152351 | 153172 | pNew->zName = pOld->zName; |
| 152352 | 153173 | pNew->zDatabase = pOld->zDatabase; |
| 152353 | 153174 | pNew->pSelect = pOld->pSelect; |
| 152354 | 153175 | if( pOld->fg.isTabFunc ){ |
| 152355 | 153176 | pNew->u1.pFuncArg = pOld->u1.pFuncArg; |
| | @@ -152358,953 +153179,946 @@ |
| 152358 | 153179 | pNew->fg.isTabFunc = 1; |
| 152359 | 153180 | } |
| 152360 | 153181 | pOld->zName = pOld->zDatabase = 0; |
| 152361 | 153182 | pOld->pSelect = 0; |
| 152362 | 153183 | } |
| 152363 | | - sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy407); |
| 153184 | + sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy609); |
| 152364 | 153185 | }else{ |
| 152365 | 153186 | Select *pSubquery; |
| 152366 | | - sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy407); |
| 152367 | | - pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy407,0,0,0,0,SF_NestedFrom,0); |
| 152368 | | - yymsp[-6].minor.yy407 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy407,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy102,yymsp[0].minor.yy76); |
| 153187 | + sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy609); |
| 153188 | + pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy609,0,0,0,0,SF_NestedFrom,0); |
| 153189 | + yymsp[-6].minor.yy609 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy609,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy46,yymsp[0].minor.yy406); |
| 152369 | 153190 | } |
| 152370 | 153191 | } |
| 152371 | 153192 | break; |
| 152372 | 153193 | case 109: /* dbnm ::= */ |
| 152373 | 153194 | case 123: /* indexed_opt ::= */ yytestcase(yyruleno==123); |
| 152374 | 153195 | {yymsp[1].minor.yy0.z=0; yymsp[1].minor.yy0.n=0;} |
| 152375 | 153196 | break; |
| 152376 | 153197 | case 111: /* fullname ::= nm */ |
| 152377 | 153198 | { |
| 152378 | | - yylhsminor.yy407 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); |
| 152379 | | - if( IN_RENAME_OBJECT && yylhsminor.yy407 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy407->a[0].zName, &yymsp[0].minor.yy0); |
| 153199 | + yylhsminor.yy609 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); |
| 153200 | + if( IN_RENAME_OBJECT && yylhsminor.yy609 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy609->a[0].zName, &yymsp[0].minor.yy0); |
| 152380 | 153201 | } |
| 152381 | | - yymsp[0].minor.yy407 = yylhsminor.yy407; |
| 153202 | + yymsp[0].minor.yy609 = yylhsminor.yy609; |
| 152382 | 153203 | break; |
| 152383 | 153204 | case 112: /* fullname ::= nm DOT nm */ |
| 152384 | 153205 | { |
| 152385 | | - yylhsminor.yy407 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); |
| 152386 | | - if( IN_RENAME_OBJECT && yylhsminor.yy407 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy407->a[0].zName, &yymsp[0].minor.yy0); |
| 153206 | + yylhsminor.yy609 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); |
| 153207 | + if( IN_RENAME_OBJECT && yylhsminor.yy609 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy609->a[0].zName, &yymsp[0].minor.yy0); |
| 152387 | 153208 | } |
| 152388 | | - yymsp[-2].minor.yy407 = yylhsminor.yy407; |
| 153209 | + yymsp[-2].minor.yy609 = yylhsminor.yy609; |
| 152389 | 153210 | break; |
| 152390 | 153211 | case 113: /* xfullname ::= nm */ |
| 152391 | | -{yymsp[0].minor.yy407 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/} |
| 153212 | +{yymsp[0].minor.yy609 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/} |
| 152392 | 153213 | break; |
| 152393 | 153214 | case 114: /* xfullname ::= nm DOT nm */ |
| 152394 | | -{yymsp[-2].minor.yy407 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/} |
| 153215 | +{yymsp[-2].minor.yy609 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/} |
| 152395 | 153216 | break; |
| 152396 | 153217 | case 115: /* xfullname ::= nm DOT nm AS nm */ |
| 152397 | 153218 | { |
| 152398 | | - yymsp[-4].minor.yy407 = sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/ |
| 152399 | | - if( yymsp[-4].minor.yy407 ) yymsp[-4].minor.yy407->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); |
| 153219 | + yymsp[-4].minor.yy609 = sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/ |
| 153220 | + if( yymsp[-4].minor.yy609 ) yymsp[-4].minor.yy609->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); |
| 152400 | 153221 | } |
| 152401 | 153222 | break; |
| 152402 | 153223 | case 116: /* xfullname ::= nm AS nm */ |
| 152403 | 153224 | { |
| 152404 | | - yymsp[-2].minor.yy407 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/ |
| 152405 | | - if( yymsp[-2].minor.yy407 ) yymsp[-2].minor.yy407->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); |
| 153225 | + yymsp[-2].minor.yy609 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/ |
| 153226 | + if( yymsp[-2].minor.yy609 ) yymsp[-2].minor.yy609->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); |
| 152406 | 153227 | } |
| 152407 | 153228 | break; |
| 152408 | 153229 | case 117: /* joinop ::= COMMA|JOIN */ |
| 152409 | | -{ yymsp[0].minor.yy100 = JT_INNER; } |
| 153230 | +{ yymsp[0].minor.yy32 = JT_INNER; } |
| 152410 | 153231 | break; |
| 152411 | 153232 | case 118: /* joinop ::= JOIN_KW JOIN */ |
| 152412 | | -{yymsp[-1].minor.yy100 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/} |
| 153233 | +{yymsp[-1].minor.yy32 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/} |
| 152413 | 153234 | break; |
| 152414 | 153235 | case 119: /* joinop ::= JOIN_KW nm JOIN */ |
| 152415 | | -{yymsp[-2].minor.yy100 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/} |
| 153236 | +{yymsp[-2].minor.yy32 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/} |
| 152416 | 153237 | break; |
| 152417 | 153238 | case 120: /* joinop ::= JOIN_KW nm nm JOIN */ |
| 152418 | | -{yymsp[-3].minor.yy100 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/} |
| 153239 | +{yymsp[-3].minor.yy32 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/} |
| 152419 | 153240 | break; |
| 152420 | 153241 | case 121: /* on_opt ::= ON expr */ |
| 152421 | | - case 138: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==138); |
| 152422 | | - case 145: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==145); |
| 152423 | | - case 211: /* case_else ::= ELSE expr */ yytestcase(yyruleno==211); |
| 152424 | | - case 232: /* vinto ::= INTO expr */ yytestcase(yyruleno==232); |
| 152425 | | -{yymsp[-1].minor.yy102 = yymsp[0].minor.yy102;} |
| 153242 | + case 141: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==141); |
| 153243 | + case 148: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==148); |
| 153244 | + case 214: /* case_else ::= ELSE expr */ yytestcase(yyruleno==214); |
| 153245 | + case 235: /* vinto ::= INTO expr */ yytestcase(yyruleno==235); |
| 153246 | +{yymsp[-1].minor.yy46 = yymsp[0].minor.yy46;} |
| 152426 | 153247 | break; |
| 152427 | 153248 | case 122: /* on_opt ::= */ |
| 152428 | | - case 137: /* having_opt ::= */ yytestcase(yyruleno==137); |
| 152429 | | - case 139: /* limit_opt ::= */ yytestcase(yyruleno==139); |
| 152430 | | - case 144: /* where_opt ::= */ yytestcase(yyruleno==144); |
| 152431 | | - case 212: /* case_else ::= */ yytestcase(yyruleno==212); |
| 152432 | | - case 214: /* case_operand ::= */ yytestcase(yyruleno==214); |
| 152433 | | - case 233: /* vinto ::= */ yytestcase(yyruleno==233); |
| 152434 | | -{yymsp[1].minor.yy102 = 0;} |
| 153249 | + case 140: /* having_opt ::= */ yytestcase(yyruleno==140); |
| 153250 | + case 142: /* limit_opt ::= */ yytestcase(yyruleno==142); |
| 153251 | + case 147: /* where_opt ::= */ yytestcase(yyruleno==147); |
| 153252 | + case 215: /* case_else ::= */ yytestcase(yyruleno==215); |
| 153253 | + case 217: /* case_operand ::= */ yytestcase(yyruleno==217); |
| 153254 | + case 236: /* vinto ::= */ yytestcase(yyruleno==236); |
| 153255 | +{yymsp[1].minor.yy46 = 0;} |
| 152435 | 153256 | break; |
| 152436 | 153257 | case 124: /* indexed_opt ::= INDEXED BY nm */ |
| 152437 | 153258 | {yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;} |
| 152438 | 153259 | break; |
| 152439 | 153260 | case 125: /* indexed_opt ::= NOT INDEXED */ |
| 152440 | 153261 | {yymsp[-1].minor.yy0.z=0; yymsp[-1].minor.yy0.n=1;} |
| 152441 | 153262 | break; |
| 152442 | 153263 | case 126: /* using_opt ::= USING LP idlist RP */ |
| 152443 | | -{yymsp[-3].minor.yy76 = yymsp[-1].minor.yy76;} |
| 153264 | +{yymsp[-3].minor.yy406 = yymsp[-1].minor.yy406;} |
| 152444 | 153265 | break; |
| 152445 | 153266 | case 127: /* using_opt ::= */ |
| 152446 | | - case 159: /* idlist_opt ::= */ yytestcase(yyruleno==159); |
| 152447 | | -{yymsp[1].minor.yy76 = 0;} |
| 153267 | + case 162: /* idlist_opt ::= */ yytestcase(yyruleno==162); |
| 153268 | +{yymsp[1].minor.yy406 = 0;} |
| 152448 | 153269 | break; |
| 152449 | 153270 | case 129: /* orderby_opt ::= ORDER BY sortlist */ |
| 152450 | | - case 136: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==136); |
| 152451 | | -{yymsp[-2].minor.yy94 = yymsp[0].minor.yy94;} |
| 153271 | + case 139: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==139); |
| 153272 | +{yymsp[-2].minor.yy138 = yymsp[0].minor.yy138;} |
| 152452 | 153273 | break; |
| 152453 | | - case 130: /* sortlist ::= sortlist COMMA expr sortorder */ |
| 153274 | + case 130: /* sortlist ::= sortlist COMMA expr sortorder nulls */ |
| 152454 | 153275 | { |
| 152455 | | - yymsp[-3].minor.yy94 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy94,yymsp[-1].minor.yy102); |
| 152456 | | - sqlite3ExprListSetSortOrder(yymsp[-3].minor.yy94,yymsp[0].minor.yy100); |
| 153276 | + yymsp[-4].minor.yy138 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy138,yymsp[-2].minor.yy46); |
| 153277 | + sqlite3ExprListSetSortOrder(yymsp[-4].minor.yy138,yymsp[-1].minor.yy32,yymsp[0].minor.yy32); |
| 152457 | 153278 | } |
| 152458 | 153279 | break; |
| 152459 | | - case 131: /* sortlist ::= expr sortorder */ |
| 153280 | + case 131: /* sortlist ::= expr sortorder nulls */ |
| 152460 | 153281 | { |
| 152461 | | - yymsp[-1].minor.yy94 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy102); /*A-overwrites-Y*/ |
| 152462 | | - sqlite3ExprListSetSortOrder(yymsp[-1].minor.yy94,yymsp[0].minor.yy100); |
| 153282 | + yymsp[-2].minor.yy138 = sqlite3ExprListAppend(pParse,0,yymsp[-2].minor.yy46); /*A-overwrites-Y*/ |
| 153283 | + sqlite3ExprListSetSortOrder(yymsp[-2].minor.yy138,yymsp[-1].minor.yy32,yymsp[0].minor.yy32); |
| 152463 | 153284 | } |
| 152464 | 153285 | break; |
| 152465 | 153286 | case 132: /* sortorder ::= ASC */ |
| 152466 | | -{yymsp[0].minor.yy100 = SQLITE_SO_ASC;} |
| 153287 | +{yymsp[0].minor.yy32 = SQLITE_SO_ASC;} |
| 152467 | 153288 | break; |
| 152468 | 153289 | case 133: /* sortorder ::= DESC */ |
| 152469 | | -{yymsp[0].minor.yy100 = SQLITE_SO_DESC;} |
| 153290 | +{yymsp[0].minor.yy32 = SQLITE_SO_DESC;} |
| 152470 | 153291 | break; |
| 152471 | 153292 | case 134: /* sortorder ::= */ |
| 152472 | | -{yymsp[1].minor.yy100 = SQLITE_SO_UNDEFINED;} |
| 152473 | | - break; |
| 152474 | | - case 140: /* limit_opt ::= LIMIT expr */ |
| 152475 | | -{yymsp[-1].minor.yy102 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy102,0);} |
| 152476 | | - break; |
| 152477 | | - case 141: /* limit_opt ::= LIMIT expr OFFSET expr */ |
| 152478 | | -{yymsp[-3].minor.yy102 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy102,yymsp[0].minor.yy102);} |
| 152479 | | - break; |
| 152480 | | - case 142: /* limit_opt ::= LIMIT expr COMMA expr */ |
| 152481 | | -{yymsp[-3].minor.yy102 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy102,yymsp[-2].minor.yy102);} |
| 152482 | | - break; |
| 152483 | | - case 143: /* cmd ::= with DELETE FROM xfullname indexed_opt where_opt */ |
| 152484 | | -{ |
| 152485 | | - sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy407, &yymsp[-1].minor.yy0); |
| 152486 | | - sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy407,yymsp[0].minor.yy102,0,0); |
| 152487 | | -} |
| 152488 | | - break; |
| 152489 | | - case 146: /* cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ |
| 152490 | | -{ |
| 152491 | | - sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy407, &yymsp[-3].minor.yy0); |
| 152492 | | - sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy94,"set list"); |
| 152493 | | - sqlite3Update(pParse,yymsp[-4].minor.yy407,yymsp[-1].minor.yy94,yymsp[0].minor.yy102,yymsp[-5].minor.yy100,0,0,0); |
| 152494 | | -} |
| 152495 | | - break; |
| 152496 | | - case 147: /* setlist ::= setlist COMMA nm EQ expr */ |
| 152497 | | -{ |
| 152498 | | - yymsp[-4].minor.yy94 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy94, yymsp[0].minor.yy102); |
| 152499 | | - sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy94, &yymsp[-2].minor.yy0, 1); |
| 152500 | | -} |
| 152501 | | - break; |
| 152502 | | - case 148: /* setlist ::= setlist COMMA LP idlist RP EQ expr */ |
| 152503 | | -{ |
| 152504 | | - yymsp[-6].minor.yy94 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy94, yymsp[-3].minor.yy76, yymsp[0].minor.yy102); |
| 152505 | | -} |
| 152506 | | - break; |
| 152507 | | - case 149: /* setlist ::= nm EQ expr */ |
| 152508 | | -{ |
| 152509 | | - yylhsminor.yy94 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy102); |
| 152510 | | - sqlite3ExprListSetName(pParse, yylhsminor.yy94, &yymsp[-2].minor.yy0, 1); |
| 152511 | | -} |
| 152512 | | - yymsp[-2].minor.yy94 = yylhsminor.yy94; |
| 152513 | | - break; |
| 152514 | | - case 150: /* setlist ::= LP idlist RP EQ expr */ |
| 152515 | | -{ |
| 152516 | | - yymsp[-4].minor.yy94 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy76, yymsp[0].minor.yy102); |
| 152517 | | -} |
| 152518 | | - break; |
| 152519 | | - case 151: /* cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ |
| 152520 | | -{ |
| 152521 | | - sqlite3Insert(pParse, yymsp[-3].minor.yy407, yymsp[-1].minor.yy391, yymsp[-2].minor.yy76, yymsp[-5].minor.yy100, yymsp[0].minor.yy95); |
| 152522 | | -} |
| 152523 | | - break; |
| 152524 | | - case 152: /* cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */ |
| 152525 | | -{ |
| 152526 | | - sqlite3Insert(pParse, yymsp[-3].minor.yy407, 0, yymsp[-2].minor.yy76, yymsp[-5].minor.yy100, 0); |
| 152527 | | -} |
| 152528 | | - break; |
| 152529 | | - case 153: /* upsert ::= */ |
| 152530 | | -{ yymsp[1].minor.yy95 = 0; } |
| 152531 | | - break; |
| 152532 | | - case 154: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */ |
| 152533 | | -{ yymsp[-10].minor.yy95 = sqlite3UpsertNew(pParse->db,yymsp[-7].minor.yy94,yymsp[-5].minor.yy102,yymsp[-1].minor.yy94,yymsp[0].minor.yy102);} |
| 152534 | | - break; |
| 152535 | | - case 155: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */ |
| 152536 | | -{ yymsp[-7].minor.yy95 = sqlite3UpsertNew(pParse->db,yymsp[-4].minor.yy94,yymsp[-2].minor.yy102,0,0); } |
| 152537 | | - break; |
| 152538 | | - case 156: /* upsert ::= ON CONFLICT DO NOTHING */ |
| 152539 | | -{ yymsp[-3].minor.yy95 = sqlite3UpsertNew(pParse->db,0,0,0,0); } |
| 152540 | | - break; |
| 152541 | | - case 160: /* idlist_opt ::= LP idlist RP */ |
| 152542 | | -{yymsp[-2].minor.yy76 = yymsp[-1].minor.yy76;} |
| 152543 | | - break; |
| 152544 | | - case 161: /* idlist ::= idlist COMMA nm */ |
| 152545 | | -{yymsp[-2].minor.yy76 = sqlite3IdListAppend(pParse,yymsp[-2].minor.yy76,&yymsp[0].minor.yy0);} |
| 152546 | | - break; |
| 152547 | | - case 162: /* idlist ::= nm */ |
| 152548 | | -{yymsp[0].minor.yy76 = sqlite3IdListAppend(pParse,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/} |
| 152549 | | - break; |
| 152550 | | - case 163: /* expr ::= LP expr RP */ |
| 152551 | | -{yymsp[-2].minor.yy102 = yymsp[-1].minor.yy102;} |
| 152552 | | - break; |
| 152553 | | - case 164: /* expr ::= ID|INDEXED */ |
| 152554 | | - case 165: /* expr ::= JOIN_KW */ yytestcase(yyruleno==165); |
| 152555 | | -{yymsp[0].minor.yy102=tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/} |
| 152556 | | - break; |
| 152557 | | - case 166: /* expr ::= nm DOT nm */ |
| 153293 | + case 137: /* nulls ::= */ yytestcase(yyruleno==137); |
| 153294 | +{yymsp[1].minor.yy32 = SQLITE_SO_UNDEFINED;} |
| 153295 | + break; |
| 153296 | + case 135: /* nulls ::= NULLS FIRST */ |
| 153297 | +{yymsp[-1].minor.yy32 = SQLITE_SO_ASC;} |
| 153298 | + break; |
| 153299 | + case 136: /* nulls ::= NULLS LAST */ |
| 153300 | +{yymsp[-1].minor.yy32 = SQLITE_SO_DESC;} |
| 153301 | + break; |
| 153302 | + case 143: /* limit_opt ::= LIMIT expr */ |
| 153303 | +{yymsp[-1].minor.yy46 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy46,0);} |
| 153304 | + break; |
| 153305 | + case 144: /* limit_opt ::= LIMIT expr OFFSET expr */ |
| 153306 | +{yymsp[-3].minor.yy46 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy46,yymsp[0].minor.yy46);} |
| 153307 | + break; |
| 153308 | + case 145: /* limit_opt ::= LIMIT expr COMMA expr */ |
| 153309 | +{yymsp[-3].minor.yy46 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy46,yymsp[-2].minor.yy46);} |
| 153310 | + break; |
| 153311 | + case 146: /* cmd ::= with DELETE FROM xfullname indexed_opt where_opt */ |
| 153312 | +{ |
| 153313 | + sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy609, &yymsp[-1].minor.yy0); |
| 153314 | + sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy609,yymsp[0].minor.yy46,0,0); |
| 153315 | +} |
| 153316 | + break; |
| 153317 | + case 149: /* cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ |
| 153318 | +{ |
| 153319 | + sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy609, &yymsp[-3].minor.yy0); |
| 153320 | + sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy138,"set list"); |
| 153321 | + sqlite3Update(pParse,yymsp[-4].minor.yy609,yymsp[-1].minor.yy138,yymsp[0].minor.yy46,yymsp[-5].minor.yy32,0,0,0); |
| 153322 | +} |
| 153323 | + break; |
| 153324 | + case 150: /* setlist ::= setlist COMMA nm EQ expr */ |
| 153325 | +{ |
| 153326 | + yymsp[-4].minor.yy138 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy138, yymsp[0].minor.yy46); |
| 153327 | + sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy138, &yymsp[-2].minor.yy0, 1); |
| 153328 | +} |
| 153329 | + break; |
| 153330 | + case 151: /* setlist ::= setlist COMMA LP idlist RP EQ expr */ |
| 153331 | +{ |
| 153332 | + yymsp[-6].minor.yy138 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy138, yymsp[-3].minor.yy406, yymsp[0].minor.yy46); |
| 153333 | +} |
| 153334 | + break; |
| 153335 | + case 152: /* setlist ::= nm EQ expr */ |
| 153336 | +{ |
| 153337 | + yylhsminor.yy138 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy46); |
| 153338 | + sqlite3ExprListSetName(pParse, yylhsminor.yy138, &yymsp[-2].minor.yy0, 1); |
| 153339 | +} |
| 153340 | + yymsp[-2].minor.yy138 = yylhsminor.yy138; |
| 153341 | + break; |
| 153342 | + case 153: /* setlist ::= LP idlist RP EQ expr */ |
| 153343 | +{ |
| 153344 | + yymsp[-4].minor.yy138 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy406, yymsp[0].minor.yy46); |
| 153345 | +} |
| 153346 | + break; |
| 153347 | + case 154: /* cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ |
| 153348 | +{ |
| 153349 | + sqlite3Insert(pParse, yymsp[-3].minor.yy609, yymsp[-1].minor.yy25, yymsp[-2].minor.yy406, yymsp[-5].minor.yy32, yymsp[0].minor.yy288); |
| 153350 | +} |
| 153351 | + break; |
| 153352 | + case 155: /* cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */ |
| 153353 | +{ |
| 153354 | + sqlite3Insert(pParse, yymsp[-3].minor.yy609, 0, yymsp[-2].minor.yy406, yymsp[-5].minor.yy32, 0); |
| 153355 | +} |
| 153356 | + break; |
| 153357 | + case 156: /* upsert ::= */ |
| 153358 | +{ yymsp[1].minor.yy288 = 0; } |
| 153359 | + break; |
| 153360 | + case 157: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */ |
| 153361 | +{ yymsp[-10].minor.yy288 = sqlite3UpsertNew(pParse->db,yymsp[-7].minor.yy138,yymsp[-5].minor.yy46,yymsp[-1].minor.yy138,yymsp[0].minor.yy46);} |
| 153362 | + break; |
| 153363 | + case 158: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */ |
| 153364 | +{ yymsp[-7].minor.yy288 = sqlite3UpsertNew(pParse->db,yymsp[-4].minor.yy138,yymsp[-2].minor.yy46,0,0); } |
| 153365 | + break; |
| 153366 | + case 159: /* upsert ::= ON CONFLICT DO NOTHING */ |
| 153367 | +{ yymsp[-3].minor.yy288 = sqlite3UpsertNew(pParse->db,0,0,0,0); } |
| 153368 | + break; |
| 153369 | + case 163: /* idlist_opt ::= LP idlist RP */ |
| 153370 | +{yymsp[-2].minor.yy406 = yymsp[-1].minor.yy406;} |
| 153371 | + break; |
| 153372 | + case 164: /* idlist ::= idlist COMMA nm */ |
| 153373 | +{yymsp[-2].minor.yy406 = sqlite3IdListAppend(pParse,yymsp[-2].minor.yy406,&yymsp[0].minor.yy0);} |
| 153374 | + break; |
| 153375 | + case 165: /* idlist ::= nm */ |
| 153376 | +{yymsp[0].minor.yy406 = sqlite3IdListAppend(pParse,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/} |
| 153377 | + break; |
| 153378 | + case 166: /* expr ::= LP expr RP */ |
| 153379 | +{yymsp[-2].minor.yy46 = yymsp[-1].minor.yy46;} |
| 153380 | + break; |
| 153381 | + case 167: /* expr ::= ID|INDEXED */ |
| 153382 | + case 168: /* expr ::= JOIN_KW */ yytestcase(yyruleno==168); |
| 153383 | +{yymsp[0].minor.yy46=tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/} |
| 153384 | + break; |
| 153385 | + case 169: /* expr ::= nm DOT nm */ |
| 152558 | 153386 | { |
| 152559 | 153387 | Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); |
| 152560 | 153388 | Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1); |
| 152561 | 153389 | if( IN_RENAME_OBJECT ){ |
| 152562 | 153390 | sqlite3RenameTokenMap(pParse, (void*)temp2, &yymsp[0].minor.yy0); |
| 152563 | 153391 | sqlite3RenameTokenMap(pParse, (void*)temp1, &yymsp[-2].minor.yy0); |
| 152564 | 153392 | } |
| 152565 | | - yylhsminor.yy102 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); |
| 153393 | + yylhsminor.yy46 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); |
| 152566 | 153394 | } |
| 152567 | | - yymsp[-2].minor.yy102 = yylhsminor.yy102; |
| 153395 | + yymsp[-2].minor.yy46 = yylhsminor.yy46; |
| 152568 | 153396 | break; |
| 152569 | | - case 167: /* expr ::= nm DOT nm DOT nm */ |
| 153397 | + case 170: /* expr ::= nm DOT nm DOT nm */ |
| 152570 | 153398 | { |
| 152571 | 153399 | Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-4].minor.yy0, 1); |
| 152572 | 153400 | Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); |
| 152573 | 153401 | Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1); |
| 152574 | 153402 | Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3); |
| 152575 | 153403 | if( IN_RENAME_OBJECT ){ |
| 152576 | 153404 | sqlite3RenameTokenMap(pParse, (void*)temp3, &yymsp[0].minor.yy0); |
| 152577 | 153405 | sqlite3RenameTokenMap(pParse, (void*)temp2, &yymsp[-2].minor.yy0); |
| 152578 | 153406 | } |
| 152579 | | - yylhsminor.yy102 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); |
| 152580 | | -} |
| 152581 | | - yymsp[-4].minor.yy102 = yylhsminor.yy102; |
| 152582 | | - break; |
| 152583 | | - case 168: /* term ::= NULL|FLOAT|BLOB */ |
| 152584 | | - case 169: /* term ::= STRING */ yytestcase(yyruleno==169); |
| 152585 | | -{yymsp[0].minor.yy102=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/} |
| 152586 | | - break; |
| 152587 | | - case 170: /* term ::= INTEGER */ |
| 152588 | | -{ |
| 152589 | | - yylhsminor.yy102 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1); |
| 152590 | | -} |
| 152591 | | - yymsp[0].minor.yy102 = yylhsminor.yy102; |
| 152592 | | - break; |
| 152593 | | - case 171: /* expr ::= VARIABLE */ |
| 153407 | + yylhsminor.yy46 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); |
| 153408 | +} |
| 153409 | + yymsp[-4].minor.yy46 = yylhsminor.yy46; |
| 153410 | + break; |
| 153411 | + case 171: /* term ::= NULL|FLOAT|BLOB */ |
| 153412 | + case 172: /* term ::= STRING */ yytestcase(yyruleno==172); |
| 153413 | +{yymsp[0].minor.yy46=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/} |
| 153414 | + break; |
| 153415 | + case 173: /* term ::= INTEGER */ |
| 153416 | +{ |
| 153417 | + yylhsminor.yy46 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1); |
| 153418 | +} |
| 153419 | + yymsp[0].minor.yy46 = yylhsminor.yy46; |
| 153420 | + break; |
| 153421 | + case 174: /* expr ::= VARIABLE */ |
| 152594 | 153422 | { |
| 152595 | 153423 | if( !(yymsp[0].minor.yy0.z[0]=='#' && sqlite3Isdigit(yymsp[0].minor.yy0.z[1])) ){ |
| 152596 | 153424 | u32 n = yymsp[0].minor.yy0.n; |
| 152597 | | - yymsp[0].minor.yy102 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0); |
| 152598 | | - sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy102, n); |
| 153425 | + yymsp[0].minor.yy46 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0); |
| 153426 | + sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy46, n); |
| 152599 | 153427 | }else{ |
| 152600 | 153428 | /* When doing a nested parse, one can include terms in an expression |
| 152601 | 153429 | ** that look like this: #1 #2 ... These terms refer to registers |
| 152602 | 153430 | ** in the virtual machine. #N is the N-th register. */ |
| 152603 | 153431 | Token t = yymsp[0].minor.yy0; /*A-overwrites-X*/ |
| 152604 | 153432 | assert( t.n>=2 ); |
| 152605 | 153433 | if( pParse->nested==0 ){ |
| 152606 | 153434 | sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t); |
| 152607 | | - yymsp[0].minor.yy102 = 0; |
| 152608 | | - }else{ |
| 152609 | | - yymsp[0].minor.yy102 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0); |
| 152610 | | - if( yymsp[0].minor.yy102 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy102->iTable); |
| 152611 | | - } |
| 152612 | | - } |
| 152613 | | -} |
| 152614 | | - break; |
| 152615 | | - case 172: /* expr ::= expr COLLATE ID|STRING */ |
| 152616 | | -{ |
| 152617 | | - yymsp[-2].minor.yy102 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy102, &yymsp[0].minor.yy0, 1); |
| 152618 | | -} |
| 152619 | | - break; |
| 152620 | | - case 173: /* expr ::= CAST LP expr AS typetoken RP */ |
| 152621 | | -{ |
| 152622 | | - yymsp[-5].minor.yy102 = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1); |
| 152623 | | - sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy102, yymsp[-3].minor.yy102, 0); |
| 152624 | | -} |
| 152625 | | - break; |
| 152626 | | - case 174: /* expr ::= ID|INDEXED LP distinct exprlist RP */ |
| 152627 | | -{ |
| 152628 | | - yylhsminor.yy102 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy94, &yymsp[-4].minor.yy0, yymsp[-2].minor.yy100); |
| 152629 | | -} |
| 152630 | | - yymsp[-4].minor.yy102 = yylhsminor.yy102; |
| 152631 | | - break; |
| 152632 | | - case 175: /* expr ::= ID|INDEXED LP STAR RP */ |
| 152633 | | -{ |
| 152634 | | - yylhsminor.yy102 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0, 0); |
| 152635 | | -} |
| 152636 | | - yymsp[-3].minor.yy102 = yylhsminor.yy102; |
| 152637 | | - break; |
| 152638 | | - case 176: /* expr ::= ID|INDEXED LP distinct exprlist RP over_clause */ |
| 152639 | | -{ |
| 152640 | | - yylhsminor.yy102 = sqlite3ExprFunction(pParse, yymsp[-2].minor.yy94, &yymsp[-5].minor.yy0, yymsp[-3].minor.yy100); |
| 152641 | | - sqlite3WindowAttach(pParse, yylhsminor.yy102, yymsp[0].minor.yy379); |
| 152642 | | -} |
| 152643 | | - yymsp[-5].minor.yy102 = yylhsminor.yy102; |
| 152644 | | - break; |
| 152645 | | - case 177: /* expr ::= ID|INDEXED LP STAR RP over_clause */ |
| 152646 | | -{ |
| 152647 | | - yylhsminor.yy102 = sqlite3ExprFunction(pParse, 0, &yymsp[-4].minor.yy0, 0); |
| 152648 | | - sqlite3WindowAttach(pParse, yylhsminor.yy102, yymsp[0].minor.yy379); |
| 152649 | | -} |
| 152650 | | - yymsp[-4].minor.yy102 = yylhsminor.yy102; |
| 152651 | | - break; |
| 152652 | | - case 178: /* term ::= CTIME_KW */ |
| 152653 | | -{ |
| 152654 | | - yylhsminor.yy102 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0, 0); |
| 152655 | | -} |
| 152656 | | - yymsp[0].minor.yy102 = yylhsminor.yy102; |
| 152657 | | - break; |
| 152658 | | - case 179: /* expr ::= LP nexprlist COMMA expr RP */ |
| 152659 | | -{ |
| 152660 | | - ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy94, yymsp[-1].minor.yy102); |
| 152661 | | - yymsp[-4].minor.yy102 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); |
| 152662 | | - if( yymsp[-4].minor.yy102 ){ |
| 152663 | | - yymsp[-4].minor.yy102->x.pList = pList; |
| 153435 | + yymsp[0].minor.yy46 = 0; |
| 153436 | + }else{ |
| 153437 | + yymsp[0].minor.yy46 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0); |
| 153438 | + if( yymsp[0].minor.yy46 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy46->iTable); |
| 153439 | + } |
| 153440 | + } |
| 153441 | +} |
| 153442 | + break; |
| 153443 | + case 175: /* expr ::= expr COLLATE ID|STRING */ |
| 153444 | +{ |
| 153445 | + yymsp[-2].minor.yy46 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy46, &yymsp[0].minor.yy0, 1); |
| 153446 | +} |
| 153447 | + break; |
| 153448 | + case 176: /* expr ::= CAST LP expr AS typetoken RP */ |
| 153449 | +{ |
| 153450 | + yymsp[-5].minor.yy46 = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1); |
| 153451 | + sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy46, yymsp[-3].minor.yy46, 0); |
| 153452 | +} |
| 153453 | + break; |
| 153454 | + case 177: /* expr ::= ID|INDEXED LP distinct exprlist RP */ |
| 153455 | +{ |
| 153456 | + yylhsminor.yy46 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy138, &yymsp[-4].minor.yy0, yymsp[-2].minor.yy32); |
| 153457 | +} |
| 153458 | + yymsp[-4].minor.yy46 = yylhsminor.yy46; |
| 153459 | + break; |
| 153460 | + case 178: /* expr ::= ID|INDEXED LP STAR RP */ |
| 153461 | +{ |
| 153462 | + yylhsminor.yy46 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0, 0); |
| 153463 | +} |
| 153464 | + yymsp[-3].minor.yy46 = yylhsminor.yy46; |
| 153465 | + break; |
| 153466 | + case 179: /* expr ::= ID|INDEXED LP distinct exprlist RP filter_over */ |
| 153467 | +{ |
| 153468 | + yylhsminor.yy46 = sqlite3ExprFunction(pParse, yymsp[-2].minor.yy138, &yymsp[-5].minor.yy0, yymsp[-3].minor.yy32); |
| 153469 | + sqlite3WindowAttach(pParse, yylhsminor.yy46, yymsp[0].minor.yy455); |
| 153470 | +} |
| 153471 | + yymsp[-5].minor.yy46 = yylhsminor.yy46; |
| 153472 | + break; |
| 153473 | + case 180: /* expr ::= ID|INDEXED LP STAR RP filter_over */ |
| 153474 | +{ |
| 153475 | + yylhsminor.yy46 = sqlite3ExprFunction(pParse, 0, &yymsp[-4].minor.yy0, 0); |
| 153476 | + sqlite3WindowAttach(pParse, yylhsminor.yy46, yymsp[0].minor.yy455); |
| 153477 | +} |
| 153478 | + yymsp[-4].minor.yy46 = yylhsminor.yy46; |
| 153479 | + break; |
| 153480 | + case 181: /* term ::= CTIME_KW */ |
| 153481 | +{ |
| 153482 | + yylhsminor.yy46 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0, 0); |
| 153483 | +} |
| 153484 | + yymsp[0].minor.yy46 = yylhsminor.yy46; |
| 153485 | + break; |
| 153486 | + case 182: /* expr ::= LP nexprlist COMMA expr RP */ |
| 153487 | +{ |
| 153488 | + ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy138, yymsp[-1].minor.yy46); |
| 153489 | + yymsp[-4].minor.yy46 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); |
| 153490 | + if( yymsp[-4].minor.yy46 ){ |
| 153491 | + yymsp[-4].minor.yy46->x.pList = pList; |
| 152664 | 153492 | }else{ |
| 152665 | 153493 | sqlite3ExprListDelete(pParse->db, pList); |
| 152666 | 153494 | } |
| 152667 | 153495 | } |
| 152668 | 153496 | break; |
| 152669 | | - case 180: /* expr ::= expr AND expr */ |
| 152670 | | -{yymsp[-2].minor.yy102=sqlite3ExprAnd(pParse,yymsp[-2].minor.yy102,yymsp[0].minor.yy102);} |
| 152671 | | - break; |
| 152672 | | - case 181: /* expr ::= expr OR expr */ |
| 152673 | | - case 182: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==182); |
| 152674 | | - case 183: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==183); |
| 152675 | | - case 184: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==184); |
| 152676 | | - case 185: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==185); |
| 152677 | | - case 186: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==186); |
| 152678 | | - case 187: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==187); |
| 152679 | | -{yymsp[-2].minor.yy102=sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy102,yymsp[0].minor.yy102);} |
| 152680 | | - break; |
| 152681 | | - case 188: /* likeop ::= NOT LIKE_KW|MATCH */ |
| 153497 | + case 183: /* expr ::= expr AND expr */ |
| 153498 | +{yymsp[-2].minor.yy46=sqlite3ExprAnd(pParse,yymsp[-2].minor.yy46,yymsp[0].minor.yy46);} |
| 153499 | + break; |
| 153500 | + case 184: /* expr ::= expr OR expr */ |
| 153501 | + case 185: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==185); |
| 153502 | + case 186: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==186); |
| 153503 | + case 187: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==187); |
| 153504 | + case 188: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==188); |
| 153505 | + case 189: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==189); |
| 153506 | + case 190: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==190); |
| 153507 | +{yymsp[-2].minor.yy46=sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy46,yymsp[0].minor.yy46);} |
| 153508 | + break; |
| 153509 | + case 191: /* likeop ::= NOT LIKE_KW|MATCH */ |
| 152682 | 153510 | {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.n|=0x80000000; /*yymsp[-1].minor.yy0-overwrite-yymsp[0].minor.yy0*/} |
| 152683 | 153511 | break; |
| 152684 | | - case 189: /* expr ::= expr likeop expr */ |
| 153512 | + case 192: /* expr ::= expr likeop expr */ |
| 152685 | 153513 | { |
| 152686 | 153514 | ExprList *pList; |
| 152687 | 153515 | int bNot = yymsp[-1].minor.yy0.n & 0x80000000; |
| 152688 | 153516 | yymsp[-1].minor.yy0.n &= 0x7fffffff; |
| 152689 | | - pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy102); |
| 152690 | | - pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy102); |
| 152691 | | - yymsp[-2].minor.yy102 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0); |
| 152692 | | - if( bNot ) yymsp[-2].minor.yy102 = sqlite3PExpr(pParse, TK_NOT, yymsp[-2].minor.yy102, 0); |
| 152693 | | - if( yymsp[-2].minor.yy102 ) yymsp[-2].minor.yy102->flags |= EP_InfixFunc; |
| 153517 | + pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy46); |
| 153518 | + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy46); |
| 153519 | + yymsp[-2].minor.yy46 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0); |
| 153520 | + if( bNot ) yymsp[-2].minor.yy46 = sqlite3PExpr(pParse, TK_NOT, yymsp[-2].minor.yy46, 0); |
| 153521 | + if( yymsp[-2].minor.yy46 ) yymsp[-2].minor.yy46->flags |= EP_InfixFunc; |
| 152694 | 153522 | } |
| 152695 | 153523 | break; |
| 152696 | | - case 190: /* expr ::= expr likeop expr ESCAPE expr */ |
| 153524 | + case 193: /* expr ::= expr likeop expr ESCAPE expr */ |
| 152697 | 153525 | { |
| 152698 | 153526 | ExprList *pList; |
| 152699 | 153527 | int bNot = yymsp[-3].minor.yy0.n & 0x80000000; |
| 152700 | 153528 | yymsp[-3].minor.yy0.n &= 0x7fffffff; |
| 152701 | | - pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy102); |
| 152702 | | - pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy102); |
| 152703 | | - pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy102); |
| 152704 | | - yymsp[-4].minor.yy102 = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0, 0); |
| 152705 | | - if( bNot ) yymsp[-4].minor.yy102 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy102, 0); |
| 152706 | | - if( yymsp[-4].minor.yy102 ) yymsp[-4].minor.yy102->flags |= EP_InfixFunc; |
| 152707 | | -} |
| 152708 | | - break; |
| 152709 | | - case 191: /* expr ::= expr ISNULL|NOTNULL */ |
| 152710 | | -{yymsp[-1].minor.yy102 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy102,0);} |
| 152711 | | - break; |
| 152712 | | - case 192: /* expr ::= expr NOT NULL */ |
| 152713 | | -{yymsp[-2].minor.yy102 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy102,0);} |
| 152714 | | - break; |
| 152715 | | - case 193: /* expr ::= expr IS expr */ |
| 152716 | | -{ |
| 152717 | | - yymsp[-2].minor.yy102 = sqlite3PExpr(pParse,TK_IS,yymsp[-2].minor.yy102,yymsp[0].minor.yy102); |
| 152718 | | - binaryToUnaryIfNull(pParse, yymsp[0].minor.yy102, yymsp[-2].minor.yy102, TK_ISNULL); |
| 152719 | | -} |
| 152720 | | - break; |
| 152721 | | - case 194: /* expr ::= expr IS NOT expr */ |
| 152722 | | -{ |
| 152723 | | - yymsp[-3].minor.yy102 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-3].minor.yy102,yymsp[0].minor.yy102); |
| 152724 | | - binaryToUnaryIfNull(pParse, yymsp[0].minor.yy102, yymsp[-3].minor.yy102, TK_NOTNULL); |
| 152725 | | -} |
| 152726 | | - break; |
| 152727 | | - case 195: /* expr ::= NOT expr */ |
| 152728 | | - case 196: /* expr ::= BITNOT expr */ yytestcase(yyruleno==196); |
| 152729 | | -{yymsp[-1].minor.yy102 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy102, 0);/*A-overwrites-B*/} |
| 152730 | | - break; |
| 152731 | | - case 197: /* expr ::= PLUS|MINUS expr */ |
| 152732 | | -{ |
| 152733 | | - yymsp[-1].minor.yy102 = sqlite3PExpr(pParse, yymsp[-1].major==TK_PLUS ? TK_UPLUS : TK_UMINUS, yymsp[0].minor.yy102, 0); |
| 153529 | + pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy46); |
| 153530 | + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy46); |
| 153531 | + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy46); |
| 153532 | + yymsp[-4].minor.yy46 = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0, 0); |
| 153533 | + if( bNot ) yymsp[-4].minor.yy46 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy46, 0); |
| 153534 | + if( yymsp[-4].minor.yy46 ) yymsp[-4].minor.yy46->flags |= EP_InfixFunc; |
| 153535 | +} |
| 153536 | + break; |
| 153537 | + case 194: /* expr ::= expr ISNULL|NOTNULL */ |
| 153538 | +{yymsp[-1].minor.yy46 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy46,0);} |
| 153539 | + break; |
| 153540 | + case 195: /* expr ::= expr NOT NULL */ |
| 153541 | +{yymsp[-2].minor.yy46 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy46,0);} |
| 153542 | + break; |
| 153543 | + case 196: /* expr ::= expr IS expr */ |
| 153544 | +{ |
| 153545 | + yymsp[-2].minor.yy46 = sqlite3PExpr(pParse,TK_IS,yymsp[-2].minor.yy46,yymsp[0].minor.yy46); |
| 153546 | + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy46, yymsp[-2].minor.yy46, TK_ISNULL); |
| 153547 | +} |
| 153548 | + break; |
| 153549 | + case 197: /* expr ::= expr IS NOT expr */ |
| 153550 | +{ |
| 153551 | + yymsp[-3].minor.yy46 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-3].minor.yy46,yymsp[0].minor.yy46); |
| 153552 | + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy46, yymsp[-3].minor.yy46, TK_NOTNULL); |
| 153553 | +} |
| 153554 | + break; |
| 153555 | + case 198: /* expr ::= NOT expr */ |
| 153556 | + case 199: /* expr ::= BITNOT expr */ yytestcase(yyruleno==199); |
| 153557 | +{yymsp[-1].minor.yy46 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy46, 0);/*A-overwrites-B*/} |
| 153558 | + break; |
| 153559 | + case 200: /* expr ::= PLUS|MINUS expr */ |
| 153560 | +{ |
| 153561 | + yymsp[-1].minor.yy46 = sqlite3PExpr(pParse, yymsp[-1].major==TK_PLUS ? TK_UPLUS : TK_UMINUS, yymsp[0].minor.yy46, 0); |
| 152734 | 153562 | /*A-overwrites-B*/ |
| 152735 | 153563 | } |
| 152736 | 153564 | break; |
| 152737 | | - case 198: /* between_op ::= BETWEEN */ |
| 152738 | | - case 201: /* in_op ::= IN */ yytestcase(yyruleno==201); |
| 152739 | | -{yymsp[0].minor.yy100 = 0;} |
| 152740 | | - break; |
| 152741 | | - case 200: /* expr ::= expr between_op expr AND expr */ |
| 152742 | | -{ |
| 152743 | | - ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy102); |
| 152744 | | - pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy102); |
| 152745 | | - yymsp[-4].minor.yy102 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy102, 0); |
| 152746 | | - if( yymsp[-4].minor.yy102 ){ |
| 152747 | | - yymsp[-4].minor.yy102->x.pList = pList; |
| 153565 | + case 201: /* between_op ::= BETWEEN */ |
| 153566 | + case 204: /* in_op ::= IN */ yytestcase(yyruleno==204); |
| 153567 | +{yymsp[0].minor.yy32 = 0;} |
| 153568 | + break; |
| 153569 | + case 203: /* expr ::= expr between_op expr AND expr */ |
| 153570 | +{ |
| 153571 | + ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy46); |
| 153572 | + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy46); |
| 153573 | + yymsp[-4].minor.yy46 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy46, 0); |
| 153574 | + if( yymsp[-4].minor.yy46 ){ |
| 153575 | + yymsp[-4].minor.yy46->x.pList = pList; |
| 152748 | 153576 | }else{ |
| 152749 | 153577 | sqlite3ExprListDelete(pParse->db, pList); |
| 152750 | 153578 | } |
| 152751 | | - if( yymsp[-3].minor.yy100 ) yymsp[-4].minor.yy102 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy102, 0); |
| 153579 | + if( yymsp[-3].minor.yy32 ) yymsp[-4].minor.yy46 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy46, 0); |
| 152752 | 153580 | } |
| 152753 | 153581 | break; |
| 152754 | | - case 203: /* expr ::= expr in_op LP exprlist RP */ |
| 153582 | + case 206: /* expr ::= expr in_op LP exprlist RP */ |
| 152755 | 153583 | { |
| 152756 | | - if( yymsp[-1].minor.yy94==0 ){ |
| 153584 | + if( yymsp[-1].minor.yy138==0 ){ |
| 152757 | 153585 | /* Expressions of the form |
| 152758 | 153586 | ** |
| 152759 | 153587 | ** expr1 IN () |
| 152760 | 153588 | ** expr1 NOT IN () |
| 152761 | 153589 | ** |
| 152762 | 153590 | ** simplify to constants 0 (false) and 1 (true), respectively, |
| 152763 | 153591 | ** regardless of the value of expr1. |
| 152764 | 153592 | */ |
| 152765 | | - sqlite3ExprUnmapAndDelete(pParse, yymsp[-4].minor.yy102); |
| 152766 | | - yymsp[-4].minor.yy102 = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[yymsp[-3].minor.yy100],1); |
| 152767 | | - }else if( yymsp[-1].minor.yy94->nExpr==1 ){ |
| 152768 | | - /* Expressions of the form: |
| 152769 | | - ** |
| 152770 | | - ** expr1 IN (?1) |
| 152771 | | - ** expr1 NOT IN (?2) |
| 152772 | | - ** |
| 152773 | | - ** with exactly one value on the RHS can be simplified to something |
| 152774 | | - ** like this: |
| 152775 | | - ** |
| 152776 | | - ** expr1 == ?1 |
| 152777 | | - ** expr1 <> ?2 |
| 152778 | | - ** |
| 152779 | | - ** But, the RHS of the == or <> is marked with the EP_Generic flag |
| 152780 | | - ** so that it may not contribute to the computation of comparison |
| 152781 | | - ** affinity or the collating sequence to use for comparison. Otherwise, |
| 152782 | | - ** the semantics would be subtly different from IN or NOT IN. |
| 152783 | | - */ |
| 152784 | | - Expr *pRHS = yymsp[-1].minor.yy94->a[0].pExpr; |
| 152785 | | - yymsp[-1].minor.yy94->a[0].pExpr = 0; |
| 152786 | | - sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy94); |
| 152787 | | - /* pRHS cannot be NULL because a malloc error would have been detected |
| 152788 | | - ** before now and control would have never reached this point */ |
| 152789 | | - if( ALWAYS(pRHS) ){ |
| 152790 | | - pRHS->flags &= ~EP_Collate; |
| 152791 | | - pRHS->flags |= EP_Generic; |
| 152792 | | - } |
| 152793 | | - yymsp[-4].minor.yy102 = sqlite3PExpr(pParse, yymsp[-3].minor.yy100 ? TK_NE : TK_EQ, yymsp[-4].minor.yy102, pRHS); |
| 152794 | | - }else{ |
| 152795 | | - yymsp[-4].minor.yy102 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy102, 0); |
| 152796 | | - if( yymsp[-4].minor.yy102 ){ |
| 152797 | | - yymsp[-4].minor.yy102->x.pList = yymsp[-1].minor.yy94; |
| 152798 | | - sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy102); |
| 152799 | | - }else{ |
| 152800 | | - sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy94); |
| 152801 | | - } |
| 152802 | | - if( yymsp[-3].minor.yy100 ) yymsp[-4].minor.yy102 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy102, 0); |
| 152803 | | - } |
| 152804 | | - } |
| 152805 | | - break; |
| 152806 | | - case 204: /* expr ::= LP select RP */ |
| 152807 | | -{ |
| 152808 | | - yymsp[-2].minor.yy102 = sqlite3PExpr(pParse, TK_SELECT, 0, 0); |
| 152809 | | - sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy102, yymsp[-1].minor.yy391); |
| 152810 | | - } |
| 152811 | | - break; |
| 152812 | | - case 205: /* expr ::= expr in_op LP select RP */ |
| 152813 | | -{ |
| 152814 | | - yymsp[-4].minor.yy102 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy102, 0); |
| 152815 | | - sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy102, yymsp[-1].minor.yy391); |
| 152816 | | - if( yymsp[-3].minor.yy100 ) yymsp[-4].minor.yy102 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy102, 0); |
| 152817 | | - } |
| 152818 | | - break; |
| 152819 | | - case 206: /* expr ::= expr in_op nm dbnm paren_exprlist */ |
| 153593 | + sqlite3ExprUnmapAndDelete(pParse, yymsp[-4].minor.yy46); |
| 153594 | + yymsp[-4].minor.yy46 = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[yymsp[-3].minor.yy32],1); |
| 153595 | + }else{ |
| 153596 | + yymsp[-4].minor.yy46 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy46, 0); |
| 153597 | + if( yymsp[-4].minor.yy46 ){ |
| 153598 | + yymsp[-4].minor.yy46->x.pList = yymsp[-1].minor.yy138; |
| 153599 | + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy46); |
| 153600 | + }else{ |
| 153601 | + sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy138); |
| 153602 | + } |
| 153603 | + if( yymsp[-3].minor.yy32 ) yymsp[-4].minor.yy46 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy46, 0); |
| 153604 | + } |
| 153605 | + } |
| 153606 | + break; |
| 153607 | + case 207: /* expr ::= LP select RP */ |
| 153608 | +{ |
| 153609 | + yymsp[-2].minor.yy46 = sqlite3PExpr(pParse, TK_SELECT, 0, 0); |
| 153610 | + sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy46, yymsp[-1].minor.yy25); |
| 153611 | + } |
| 153612 | + break; |
| 153613 | + case 208: /* expr ::= expr in_op LP select RP */ |
| 153614 | +{ |
| 153615 | + yymsp[-4].minor.yy46 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy46, 0); |
| 153616 | + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy46, yymsp[-1].minor.yy25); |
| 153617 | + if( yymsp[-3].minor.yy32 ) yymsp[-4].minor.yy46 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy46, 0); |
| 153618 | + } |
| 153619 | + break; |
| 153620 | + case 209: /* expr ::= expr in_op nm dbnm paren_exprlist */ |
| 152820 | 153621 | { |
| 152821 | 153622 | SrcList *pSrc = sqlite3SrcListAppend(pParse, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); |
| 152822 | 153623 | Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0); |
| 152823 | | - if( yymsp[0].minor.yy94 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy94); |
| 152824 | | - yymsp[-4].minor.yy102 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy102, 0); |
| 152825 | | - sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy102, pSelect); |
| 152826 | | - if( yymsp[-3].minor.yy100 ) yymsp[-4].minor.yy102 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy102, 0); |
| 153624 | + if( yymsp[0].minor.yy138 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy138); |
| 153625 | + yymsp[-4].minor.yy46 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy46, 0); |
| 153626 | + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy46, pSelect); |
| 153627 | + if( yymsp[-3].minor.yy32 ) yymsp[-4].minor.yy46 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy46, 0); |
| 152827 | 153628 | } |
| 152828 | 153629 | break; |
| 152829 | | - case 207: /* expr ::= EXISTS LP select RP */ |
| 153630 | + case 210: /* expr ::= EXISTS LP select RP */ |
| 152830 | 153631 | { |
| 152831 | 153632 | Expr *p; |
| 152832 | | - p = yymsp[-3].minor.yy102 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); |
| 152833 | | - sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy391); |
| 152834 | | - } |
| 152835 | | - break; |
| 152836 | | - case 208: /* expr ::= CASE case_operand case_exprlist case_else END */ |
| 152837 | | -{ |
| 152838 | | - yymsp[-4].minor.yy102 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy102, 0); |
| 152839 | | - if( yymsp[-4].minor.yy102 ){ |
| 152840 | | - yymsp[-4].minor.yy102->x.pList = yymsp[-1].minor.yy102 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy94,yymsp[-1].minor.yy102) : yymsp[-2].minor.yy94; |
| 152841 | | - sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy102); |
| 152842 | | - }else{ |
| 152843 | | - sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy94); |
| 152844 | | - sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy102); |
| 152845 | | - } |
| 152846 | | -} |
| 152847 | | - break; |
| 152848 | | - case 209: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ |
| 152849 | | -{ |
| 152850 | | - yymsp[-4].minor.yy94 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy94, yymsp[-2].minor.yy102); |
| 152851 | | - yymsp[-4].minor.yy94 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy94, yymsp[0].minor.yy102); |
| 152852 | | -} |
| 152853 | | - break; |
| 152854 | | - case 210: /* case_exprlist ::= WHEN expr THEN expr */ |
| 152855 | | -{ |
| 152856 | | - yymsp[-3].minor.yy94 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy102); |
| 152857 | | - yymsp[-3].minor.yy94 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy94, yymsp[0].minor.yy102); |
| 152858 | | -} |
| 152859 | | - break; |
| 152860 | | - case 213: /* case_operand ::= expr */ |
| 152861 | | -{yymsp[0].minor.yy102 = yymsp[0].minor.yy102; /*A-overwrites-X*/} |
| 152862 | | - break; |
| 152863 | | - case 216: /* nexprlist ::= nexprlist COMMA expr */ |
| 152864 | | -{yymsp[-2].minor.yy94 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy94,yymsp[0].minor.yy102);} |
| 152865 | | - break; |
| 152866 | | - case 217: /* nexprlist ::= expr */ |
| 152867 | | -{yymsp[0].minor.yy94 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy102); /*A-overwrites-Y*/} |
| 152868 | | - break; |
| 152869 | | - case 219: /* paren_exprlist ::= LP exprlist RP */ |
| 152870 | | - case 224: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==224); |
| 152871 | | -{yymsp[-2].minor.yy94 = yymsp[-1].minor.yy94;} |
| 152872 | | - break; |
| 152873 | | - case 220: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ |
| 153633 | + p = yymsp[-3].minor.yy46 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); |
| 153634 | + sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy25); |
| 153635 | + } |
| 153636 | + break; |
| 153637 | + case 211: /* expr ::= CASE case_operand case_exprlist case_else END */ |
| 153638 | +{ |
| 153639 | + yymsp[-4].minor.yy46 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy46, 0); |
| 153640 | + if( yymsp[-4].minor.yy46 ){ |
| 153641 | + yymsp[-4].minor.yy46->x.pList = yymsp[-1].minor.yy46 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy138,yymsp[-1].minor.yy46) : yymsp[-2].minor.yy138; |
| 153642 | + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy46); |
| 153643 | + }else{ |
| 153644 | + sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy138); |
| 153645 | + sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy46); |
| 153646 | + } |
| 153647 | +} |
| 153648 | + break; |
| 153649 | + case 212: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ |
| 153650 | +{ |
| 153651 | + yymsp[-4].minor.yy138 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy138, yymsp[-2].minor.yy46); |
| 153652 | + yymsp[-4].minor.yy138 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy138, yymsp[0].minor.yy46); |
| 153653 | +} |
| 153654 | + break; |
| 153655 | + case 213: /* case_exprlist ::= WHEN expr THEN expr */ |
| 153656 | +{ |
| 153657 | + yymsp[-3].minor.yy138 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy46); |
| 153658 | + yymsp[-3].minor.yy138 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy138, yymsp[0].minor.yy46); |
| 153659 | +} |
| 153660 | + break; |
| 153661 | + case 216: /* case_operand ::= expr */ |
| 153662 | +{yymsp[0].minor.yy46 = yymsp[0].minor.yy46; /*A-overwrites-X*/} |
| 153663 | + break; |
| 153664 | + case 219: /* nexprlist ::= nexprlist COMMA expr */ |
| 153665 | +{yymsp[-2].minor.yy138 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy138,yymsp[0].minor.yy46);} |
| 153666 | + break; |
| 153667 | + case 220: /* nexprlist ::= expr */ |
| 153668 | +{yymsp[0].minor.yy138 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy46); /*A-overwrites-Y*/} |
| 153669 | + break; |
| 153670 | + case 222: /* paren_exprlist ::= LP exprlist RP */ |
| 153671 | + case 227: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==227); |
| 153672 | +{yymsp[-2].minor.yy138 = yymsp[-1].minor.yy138;} |
| 153673 | + break; |
| 153674 | + case 223: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ |
| 152874 | 153675 | { |
| 152875 | 153676 | sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, |
| 152876 | | - sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy94, yymsp[-10].minor.yy100, |
| 152877 | | - &yymsp[-11].minor.yy0, yymsp[0].minor.yy102, SQLITE_SO_ASC, yymsp[-8].minor.yy100, SQLITE_IDXTYPE_APPDEF); |
| 153677 | + sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy138, yymsp[-10].minor.yy32, |
| 153678 | + &yymsp[-11].minor.yy0, yymsp[0].minor.yy46, SQLITE_SO_ASC, yymsp[-8].minor.yy32, SQLITE_IDXTYPE_APPDEF); |
| 152878 | 153679 | if( IN_RENAME_OBJECT && pParse->pNewIndex ){ |
| 152879 | 153680 | sqlite3RenameTokenMap(pParse, pParse->pNewIndex->zName, &yymsp[-4].minor.yy0); |
| 152880 | 153681 | } |
| 152881 | 153682 | } |
| 152882 | 153683 | break; |
| 152883 | | - case 221: /* uniqueflag ::= UNIQUE */ |
| 152884 | | - case 263: /* raisetype ::= ABORT */ yytestcase(yyruleno==263); |
| 152885 | | -{yymsp[0].minor.yy100 = OE_Abort;} |
| 152886 | | - break; |
| 152887 | | - case 222: /* uniqueflag ::= */ |
| 152888 | | -{yymsp[1].minor.yy100 = OE_None;} |
| 152889 | | - break; |
| 152890 | | - case 225: /* eidlist ::= eidlist COMMA nm collate sortorder */ |
| 152891 | | -{ |
| 152892 | | - yymsp[-4].minor.yy94 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy94, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy100, yymsp[0].minor.yy100); |
| 152893 | | -} |
| 152894 | | - break; |
| 152895 | | - case 226: /* eidlist ::= nm collate sortorder */ |
| 152896 | | -{ |
| 152897 | | - yymsp[-2].minor.yy94 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy100, yymsp[0].minor.yy100); /*A-overwrites-Y*/ |
| 152898 | | -} |
| 152899 | | - break; |
| 152900 | | - case 229: /* cmd ::= DROP INDEX ifexists fullname */ |
| 152901 | | -{sqlite3DropIndex(pParse, yymsp[0].minor.yy407, yymsp[-1].minor.yy100);} |
| 152902 | | - break; |
| 152903 | | - case 230: /* cmd ::= VACUUM vinto */ |
| 152904 | | -{sqlite3Vacuum(pParse,0,yymsp[0].minor.yy102);} |
| 152905 | | - break; |
| 152906 | | - case 231: /* cmd ::= VACUUM nm vinto */ |
| 152907 | | -{sqlite3Vacuum(pParse,&yymsp[-1].minor.yy0,yymsp[0].minor.yy102);} |
| 152908 | | - break; |
| 152909 | | - case 234: /* cmd ::= PRAGMA nm dbnm */ |
| 153684 | + case 224: /* uniqueflag ::= UNIQUE */ |
| 153685 | + case 266: /* raisetype ::= ABORT */ yytestcase(yyruleno==266); |
| 153686 | +{yymsp[0].minor.yy32 = OE_Abort;} |
| 153687 | + break; |
| 153688 | + case 225: /* uniqueflag ::= */ |
| 153689 | +{yymsp[1].minor.yy32 = OE_None;} |
| 153690 | + break; |
| 153691 | + case 228: /* eidlist ::= eidlist COMMA nm collate sortorder */ |
| 153692 | +{ |
| 153693 | + yymsp[-4].minor.yy138 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy138, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy32, yymsp[0].minor.yy32); |
| 153694 | +} |
| 153695 | + break; |
| 153696 | + case 229: /* eidlist ::= nm collate sortorder */ |
| 153697 | +{ |
| 153698 | + yymsp[-2].minor.yy138 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy32, yymsp[0].minor.yy32); /*A-overwrites-Y*/ |
| 153699 | +} |
| 153700 | + break; |
| 153701 | + case 232: /* cmd ::= DROP INDEX ifexists fullname */ |
| 153702 | +{sqlite3DropIndex(pParse, yymsp[0].minor.yy609, yymsp[-1].minor.yy32);} |
| 153703 | + break; |
| 153704 | + case 233: /* cmd ::= VACUUM vinto */ |
| 153705 | +{sqlite3Vacuum(pParse,0,yymsp[0].minor.yy46);} |
| 153706 | + break; |
| 153707 | + case 234: /* cmd ::= VACUUM nm vinto */ |
| 153708 | +{sqlite3Vacuum(pParse,&yymsp[-1].minor.yy0,yymsp[0].minor.yy46);} |
| 153709 | + break; |
| 153710 | + case 237: /* cmd ::= PRAGMA nm dbnm */ |
| 152910 | 153711 | {sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);} |
| 152911 | 153712 | break; |
| 152912 | | - case 235: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ |
| 153713 | + case 238: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ |
| 152913 | 153714 | {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);} |
| 152914 | 153715 | break; |
| 152915 | | - case 236: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ |
| 153716 | + case 239: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ |
| 152916 | 153717 | {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);} |
| 152917 | 153718 | break; |
| 152918 | | - case 237: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ |
| 153719 | + case 240: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ |
| 152919 | 153720 | {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);} |
| 152920 | 153721 | break; |
| 152921 | | - case 238: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ |
| 153722 | + case 241: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ |
| 152922 | 153723 | {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);} |
| 152923 | 153724 | break; |
| 152924 | | - case 241: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ |
| 153725 | + case 244: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ |
| 152925 | 153726 | { |
| 152926 | 153727 | Token all; |
| 152927 | 153728 | all.z = yymsp[-3].minor.yy0.z; |
| 152928 | 153729 | all.n = (int)(yymsp[0].minor.yy0.z - yymsp[-3].minor.yy0.z) + yymsp[0].minor.yy0.n; |
| 152929 | | - sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy11, &all); |
| 153730 | + sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy527, &all); |
| 152930 | 153731 | } |
| 152931 | 153732 | break; |
| 152932 | | - case 242: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ |
| 153733 | + case 245: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ |
| 152933 | 153734 | { |
| 152934 | | - sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy100, yymsp[-4].minor.yy298.a, yymsp[-4].minor.yy298.b, yymsp[-2].minor.yy407, yymsp[0].minor.yy102, yymsp[-10].minor.yy100, yymsp[-8].minor.yy100); |
| 153735 | + sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy32, yymsp[-4].minor.yy572.a, yymsp[-4].minor.yy572.b, yymsp[-2].minor.yy609, yymsp[0].minor.yy46, yymsp[-10].minor.yy32, yymsp[-8].minor.yy32); |
| 152935 | 153736 | yymsp[-10].minor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); /*A-overwrites-T*/ |
| 152936 | 153737 | } |
| 152937 | 153738 | break; |
| 152938 | | - case 243: /* trigger_time ::= BEFORE|AFTER */ |
| 152939 | | -{ yymsp[0].minor.yy100 = yymsp[0].major; /*A-overwrites-X*/ } |
| 152940 | | - break; |
| 152941 | | - case 244: /* trigger_time ::= INSTEAD OF */ |
| 152942 | | -{ yymsp[-1].minor.yy100 = TK_INSTEAD;} |
| 152943 | | - break; |
| 152944 | | - case 245: /* trigger_time ::= */ |
| 152945 | | -{ yymsp[1].minor.yy100 = TK_BEFORE; } |
| 152946 | | - break; |
| 152947 | | - case 246: /* trigger_event ::= DELETE|INSERT */ |
| 152948 | | - case 247: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==247); |
| 152949 | | -{yymsp[0].minor.yy298.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy298.b = 0;} |
| 152950 | | - break; |
| 152951 | | - case 248: /* trigger_event ::= UPDATE OF idlist */ |
| 152952 | | -{yymsp[-2].minor.yy298.a = TK_UPDATE; yymsp[-2].minor.yy298.b = yymsp[0].minor.yy76;} |
| 152953 | | - break; |
| 152954 | | - case 249: /* when_clause ::= */ |
| 152955 | | - case 268: /* key_opt ::= */ yytestcase(yyruleno==268); |
| 152956 | | - case 316: /* filter_opt ::= */ yytestcase(yyruleno==316); |
| 152957 | | -{ yymsp[1].minor.yy102 = 0; } |
| 152958 | | - break; |
| 152959 | | - case 250: /* when_clause ::= WHEN expr */ |
| 152960 | | - case 269: /* key_opt ::= KEY expr */ yytestcase(yyruleno==269); |
| 152961 | | -{ yymsp[-1].minor.yy102 = yymsp[0].minor.yy102; } |
| 152962 | | - break; |
| 152963 | | - case 251: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ |
| 152964 | | -{ |
| 152965 | | - assert( yymsp[-2].minor.yy11!=0 ); |
| 152966 | | - yymsp[-2].minor.yy11->pLast->pNext = yymsp[-1].minor.yy11; |
| 152967 | | - yymsp[-2].minor.yy11->pLast = yymsp[-1].minor.yy11; |
| 152968 | | -} |
| 152969 | | - break; |
| 152970 | | - case 252: /* trigger_cmd_list ::= trigger_cmd SEMI */ |
| 152971 | | -{ |
| 152972 | | - assert( yymsp[-1].minor.yy11!=0 ); |
| 152973 | | - yymsp[-1].minor.yy11->pLast = yymsp[-1].minor.yy11; |
| 152974 | | -} |
| 152975 | | - break; |
| 152976 | | - case 253: /* trnm ::= nm DOT nm */ |
| 153739 | + case 246: /* trigger_time ::= BEFORE|AFTER */ |
| 153740 | +{ yymsp[0].minor.yy32 = yymsp[0].major; /*A-overwrites-X*/ } |
| 153741 | + break; |
| 153742 | + case 247: /* trigger_time ::= INSTEAD OF */ |
| 153743 | +{ yymsp[-1].minor.yy32 = TK_INSTEAD;} |
| 153744 | + break; |
| 153745 | + case 248: /* trigger_time ::= */ |
| 153746 | +{ yymsp[1].minor.yy32 = TK_BEFORE; } |
| 153747 | + break; |
| 153748 | + case 249: /* trigger_event ::= DELETE|INSERT */ |
| 153749 | + case 250: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==250); |
| 153750 | +{yymsp[0].minor.yy572.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy572.b = 0;} |
| 153751 | + break; |
| 153752 | + case 251: /* trigger_event ::= UPDATE OF idlist */ |
| 153753 | +{yymsp[-2].minor.yy572.a = TK_UPDATE; yymsp[-2].minor.yy572.b = yymsp[0].minor.yy406;} |
| 153754 | + break; |
| 153755 | + case 252: /* when_clause ::= */ |
| 153756 | + case 271: /* key_opt ::= */ yytestcase(yyruleno==271); |
| 153757 | +{ yymsp[1].minor.yy46 = 0; } |
| 153758 | + break; |
| 153759 | + case 253: /* when_clause ::= WHEN expr */ |
| 153760 | + case 272: /* key_opt ::= KEY expr */ yytestcase(yyruleno==272); |
| 153761 | +{ yymsp[-1].minor.yy46 = yymsp[0].minor.yy46; } |
| 153762 | + break; |
| 153763 | + case 254: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ |
| 153764 | +{ |
| 153765 | + assert( yymsp[-2].minor.yy527!=0 ); |
| 153766 | + yymsp[-2].minor.yy527->pLast->pNext = yymsp[-1].minor.yy527; |
| 153767 | + yymsp[-2].minor.yy527->pLast = yymsp[-1].minor.yy527; |
| 153768 | +} |
| 153769 | + break; |
| 153770 | + case 255: /* trigger_cmd_list ::= trigger_cmd SEMI */ |
| 153771 | +{ |
| 153772 | + assert( yymsp[-1].minor.yy527!=0 ); |
| 153773 | + yymsp[-1].minor.yy527->pLast = yymsp[-1].minor.yy527; |
| 153774 | +} |
| 153775 | + break; |
| 153776 | + case 256: /* trnm ::= nm DOT nm */ |
| 152977 | 153777 | { |
| 152978 | 153778 | yymsp[-2].minor.yy0 = yymsp[0].minor.yy0; |
| 152979 | 153779 | sqlite3ErrorMsg(pParse, |
| 152980 | 153780 | "qualified table names are not allowed on INSERT, UPDATE, and DELETE " |
| 152981 | 153781 | "statements within triggers"); |
| 152982 | 153782 | } |
| 152983 | 153783 | break; |
| 152984 | | - case 254: /* tridxby ::= INDEXED BY nm */ |
| 153784 | + case 257: /* tridxby ::= INDEXED BY nm */ |
| 152985 | 153785 | { |
| 152986 | 153786 | sqlite3ErrorMsg(pParse, |
| 152987 | 153787 | "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " |
| 152988 | 153788 | "within triggers"); |
| 152989 | 153789 | } |
| 152990 | 153790 | break; |
| 152991 | | - case 255: /* tridxby ::= NOT INDEXED */ |
| 153791 | + case 258: /* tridxby ::= NOT INDEXED */ |
| 152992 | 153792 | { |
| 152993 | 153793 | sqlite3ErrorMsg(pParse, |
| 152994 | 153794 | "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " |
| 152995 | 153795 | "within triggers"); |
| 152996 | 153796 | } |
| 152997 | 153797 | break; |
| 152998 | | - case 256: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ |
| 152999 | | -{yylhsminor.yy11 = sqlite3TriggerUpdateStep(pParse, &yymsp[-5].minor.yy0, yymsp[-2].minor.yy94, yymsp[-1].minor.yy102, yymsp[-6].minor.yy100, yymsp[-7].minor.yy0.z, yymsp[0].minor.yy528);} |
| 153000 | | - yymsp[-7].minor.yy11 = yylhsminor.yy11; |
| 153001 | | - break; |
| 153002 | | - case 257: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ |
| 153003 | | -{ |
| 153004 | | - yylhsminor.yy11 = sqlite3TriggerInsertStep(pParse,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy76,yymsp[-2].minor.yy391,yymsp[-6].minor.yy100,yymsp[-1].minor.yy95,yymsp[-7].minor.yy528,yymsp[0].minor.yy528);/*yylhsminor.yy11-overwrites-yymsp[-6].minor.yy100*/ |
| 153005 | | -} |
| 153006 | | - yymsp[-7].minor.yy11 = yylhsminor.yy11; |
| 153007 | | - break; |
| 153008 | | - case 258: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ |
| 153009 | | -{yylhsminor.yy11 = sqlite3TriggerDeleteStep(pParse, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy102, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy528);} |
| 153010 | | - yymsp[-5].minor.yy11 = yylhsminor.yy11; |
| 153011 | | - break; |
| 153012 | | - case 259: /* trigger_cmd ::= scanpt select scanpt */ |
| 153013 | | -{yylhsminor.yy11 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy391, yymsp[-2].minor.yy528, yymsp[0].minor.yy528); /*yylhsminor.yy11-overwrites-yymsp[-1].minor.yy391*/} |
| 153014 | | - yymsp[-2].minor.yy11 = yylhsminor.yy11; |
| 153015 | | - break; |
| 153016 | | - case 260: /* expr ::= RAISE LP IGNORE RP */ |
| 153017 | | -{ |
| 153018 | | - yymsp[-3].minor.yy102 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); |
| 153019 | | - if( yymsp[-3].minor.yy102 ){ |
| 153020 | | - yymsp[-3].minor.yy102->affinity = OE_Ignore; |
| 153021 | | - } |
| 153022 | | -} |
| 153023 | | - break; |
| 153024 | | - case 261: /* expr ::= RAISE LP raisetype COMMA nm RP */ |
| 153025 | | -{ |
| 153026 | | - yymsp[-5].minor.yy102 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); |
| 153027 | | - if( yymsp[-5].minor.yy102 ) { |
| 153028 | | - yymsp[-5].minor.yy102->affinity = (char)yymsp[-3].minor.yy100; |
| 153029 | | - } |
| 153030 | | -} |
| 153031 | | - break; |
| 153032 | | - case 262: /* raisetype ::= ROLLBACK */ |
| 153033 | | -{yymsp[0].minor.yy100 = OE_Rollback;} |
| 153034 | | - break; |
| 153035 | | - case 264: /* raisetype ::= FAIL */ |
| 153036 | | -{yymsp[0].minor.yy100 = OE_Fail;} |
| 153037 | | - break; |
| 153038 | | - case 265: /* cmd ::= DROP TRIGGER ifexists fullname */ |
| 153039 | | -{ |
| 153040 | | - sqlite3DropTrigger(pParse,yymsp[0].minor.yy407,yymsp[-1].minor.yy100); |
| 153041 | | -} |
| 153042 | | - break; |
| 153043 | | - case 266: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ |
| 153044 | | -{ |
| 153045 | | - sqlite3Attach(pParse, yymsp[-3].minor.yy102, yymsp[-1].minor.yy102, yymsp[0].minor.yy102); |
| 153046 | | -} |
| 153047 | | - break; |
| 153048 | | - case 267: /* cmd ::= DETACH database_kw_opt expr */ |
| 153049 | | -{ |
| 153050 | | - sqlite3Detach(pParse, yymsp[0].minor.yy102); |
| 153051 | | -} |
| 153052 | | - break; |
| 153053 | | - case 270: /* cmd ::= REINDEX */ |
| 153798 | + case 259: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ |
| 153799 | +{yylhsminor.yy527 = sqlite3TriggerUpdateStep(pParse, &yymsp[-5].minor.yy0, yymsp[-2].minor.yy138, yymsp[-1].minor.yy46, yymsp[-6].minor.yy32, yymsp[-7].minor.yy0.z, yymsp[0].minor.yy8);} |
| 153800 | + yymsp[-7].minor.yy527 = yylhsminor.yy527; |
| 153801 | + break; |
| 153802 | + case 260: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ |
| 153803 | +{ |
| 153804 | + yylhsminor.yy527 = sqlite3TriggerInsertStep(pParse,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy406,yymsp[-2].minor.yy25,yymsp[-6].minor.yy32,yymsp[-1].minor.yy288,yymsp[-7].minor.yy8,yymsp[0].minor.yy8);/*yylhsminor.yy527-overwrites-yymsp[-6].minor.yy32*/ |
| 153805 | +} |
| 153806 | + yymsp[-7].minor.yy527 = yylhsminor.yy527; |
| 153807 | + break; |
| 153808 | + case 261: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ |
| 153809 | +{yylhsminor.yy527 = sqlite3TriggerDeleteStep(pParse, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy46, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy8);} |
| 153810 | + yymsp[-5].minor.yy527 = yylhsminor.yy527; |
| 153811 | + break; |
| 153812 | + case 262: /* trigger_cmd ::= scanpt select scanpt */ |
| 153813 | +{yylhsminor.yy527 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy25, yymsp[-2].minor.yy8, yymsp[0].minor.yy8); /*yylhsminor.yy527-overwrites-yymsp[-1].minor.yy25*/} |
| 153814 | + yymsp[-2].minor.yy527 = yylhsminor.yy527; |
| 153815 | + break; |
| 153816 | + case 263: /* expr ::= RAISE LP IGNORE RP */ |
| 153817 | +{ |
| 153818 | + yymsp[-3].minor.yy46 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); |
| 153819 | + if( yymsp[-3].minor.yy46 ){ |
| 153820 | + yymsp[-3].minor.yy46->affExpr = OE_Ignore; |
| 153821 | + } |
| 153822 | +} |
| 153823 | + break; |
| 153824 | + case 264: /* expr ::= RAISE LP raisetype COMMA nm RP */ |
| 153825 | +{ |
| 153826 | + yymsp[-5].minor.yy46 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); |
| 153827 | + if( yymsp[-5].minor.yy46 ) { |
| 153828 | + yymsp[-5].minor.yy46->affExpr = (char)yymsp[-3].minor.yy32; |
| 153829 | + } |
| 153830 | +} |
| 153831 | + break; |
| 153832 | + case 265: /* raisetype ::= ROLLBACK */ |
| 153833 | +{yymsp[0].minor.yy32 = OE_Rollback;} |
| 153834 | + break; |
| 153835 | + case 267: /* raisetype ::= FAIL */ |
| 153836 | +{yymsp[0].minor.yy32 = OE_Fail;} |
| 153837 | + break; |
| 153838 | + case 268: /* cmd ::= DROP TRIGGER ifexists fullname */ |
| 153839 | +{ |
| 153840 | + sqlite3DropTrigger(pParse,yymsp[0].minor.yy609,yymsp[-1].minor.yy32); |
| 153841 | +} |
| 153842 | + break; |
| 153843 | + case 269: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ |
| 153844 | +{ |
| 153845 | + sqlite3Attach(pParse, yymsp[-3].minor.yy46, yymsp[-1].minor.yy46, yymsp[0].minor.yy46); |
| 153846 | +} |
| 153847 | + break; |
| 153848 | + case 270: /* cmd ::= DETACH database_kw_opt expr */ |
| 153849 | +{ |
| 153850 | + sqlite3Detach(pParse, yymsp[0].minor.yy46); |
| 153851 | +} |
| 153852 | + break; |
| 153853 | + case 273: /* cmd ::= REINDEX */ |
| 153054 | 153854 | {sqlite3Reindex(pParse, 0, 0);} |
| 153055 | 153855 | break; |
| 153056 | | - case 271: /* cmd ::= REINDEX nm dbnm */ |
| 153856 | + case 274: /* cmd ::= REINDEX nm dbnm */ |
| 153057 | 153857 | {sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} |
| 153058 | 153858 | break; |
| 153059 | | - case 272: /* cmd ::= ANALYZE */ |
| 153859 | + case 275: /* cmd ::= ANALYZE */ |
| 153060 | 153860 | {sqlite3Analyze(pParse, 0, 0);} |
| 153061 | 153861 | break; |
| 153062 | | - case 273: /* cmd ::= ANALYZE nm dbnm */ |
| 153862 | + case 276: /* cmd ::= ANALYZE nm dbnm */ |
| 153063 | 153863 | {sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} |
| 153064 | 153864 | break; |
| 153065 | | - case 274: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ |
| 153865 | + case 277: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ |
| 153066 | 153866 | { |
| 153067 | | - sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy407,&yymsp[0].minor.yy0); |
| 153867 | + sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy609,&yymsp[0].minor.yy0); |
| 153068 | 153868 | } |
| 153069 | 153869 | break; |
| 153070 | | - case 275: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ |
| 153870 | + case 278: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ |
| 153071 | 153871 | { |
| 153072 | 153872 | yymsp[-1].minor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-1].minor.yy0.z) + pParse->sLastToken.n; |
| 153073 | 153873 | sqlite3AlterFinishAddColumn(pParse, &yymsp[-1].minor.yy0); |
| 153074 | 153874 | } |
| 153075 | 153875 | break; |
| 153076 | | - case 276: /* add_column_fullname ::= fullname */ |
| 153876 | + case 279: /* add_column_fullname ::= fullname */ |
| 153077 | 153877 | { |
| 153078 | 153878 | disableLookaside(pParse); |
| 153079 | | - sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy407); |
| 153080 | | -} |
| 153081 | | - break; |
| 153082 | | - case 277: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ |
| 153083 | | -{ |
| 153084 | | - sqlite3AlterRenameColumn(pParse, yymsp[-5].minor.yy407, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); |
| 153085 | | -} |
| 153086 | | - break; |
| 153087 | | - case 278: /* cmd ::= create_vtab */ |
| 153879 | + sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy609); |
| 153880 | +} |
| 153881 | + break; |
| 153882 | + case 280: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ |
| 153883 | +{ |
| 153884 | + sqlite3AlterRenameColumn(pParse, yymsp[-5].minor.yy609, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); |
| 153885 | +} |
| 153886 | + break; |
| 153887 | + case 281: /* cmd ::= create_vtab */ |
| 153088 | 153888 | {sqlite3VtabFinishParse(pParse,0);} |
| 153089 | 153889 | break; |
| 153090 | | - case 279: /* cmd ::= create_vtab LP vtabarglist RP */ |
| 153890 | + case 282: /* cmd ::= create_vtab LP vtabarglist RP */ |
| 153091 | 153891 | {sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);} |
| 153092 | 153892 | break; |
| 153093 | | - case 280: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ |
| 153893 | + case 283: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ |
| 153094 | 153894 | { |
| 153095 | | - sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy100); |
| 153895 | + sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy32); |
| 153096 | 153896 | } |
| 153097 | 153897 | break; |
| 153098 | | - case 281: /* vtabarg ::= */ |
| 153898 | + case 284: /* vtabarg ::= */ |
| 153099 | 153899 | {sqlite3VtabArgInit(pParse);} |
| 153100 | 153900 | break; |
| 153101 | | - case 282: /* vtabargtoken ::= ANY */ |
| 153102 | | - case 283: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==283); |
| 153103 | | - case 284: /* lp ::= LP */ yytestcase(yyruleno==284); |
| 153901 | + case 285: /* vtabargtoken ::= ANY */ |
| 153902 | + case 286: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==286); |
| 153903 | + case 287: /* lp ::= LP */ yytestcase(yyruleno==287); |
| 153104 | 153904 | {sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);} |
| 153105 | 153905 | break; |
| 153106 | | - case 285: /* with ::= WITH wqlist */ |
| 153107 | | - case 286: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==286); |
| 153108 | | -{ sqlite3WithPush(pParse, yymsp[0].minor.yy243, 1); } |
| 153109 | | - break; |
| 153110 | | - case 287: /* wqlist ::= nm eidlist_opt AS LP select RP */ |
| 153111 | | -{ |
| 153112 | | - yymsp[-5].minor.yy243 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy94, yymsp[-1].minor.yy391); /*A-overwrites-X*/ |
| 153113 | | -} |
| 153114 | | - break; |
| 153115 | | - case 288: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ |
| 153116 | | -{ |
| 153117 | | - yymsp[-7].minor.yy243 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy243, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy94, yymsp[-1].minor.yy391); |
| 153118 | | -} |
| 153119 | | - break; |
| 153120 | | - case 289: /* windowdefn_list ::= windowdefn */ |
| 153121 | | -{ yylhsminor.yy379 = yymsp[0].minor.yy379; } |
| 153122 | | - yymsp[0].minor.yy379 = yylhsminor.yy379; |
| 153123 | | - break; |
| 153124 | | - case 290: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */ |
| 153125 | | -{ |
| 153126 | | - assert( yymsp[0].minor.yy379!=0 ); |
| 153127 | | - sqlite3WindowChain(pParse, yymsp[0].minor.yy379, yymsp[-2].minor.yy379); |
| 153128 | | - yymsp[0].minor.yy379->pNextWin = yymsp[-2].minor.yy379; |
| 153129 | | - yylhsminor.yy379 = yymsp[0].minor.yy379; |
| 153130 | | -} |
| 153131 | | - yymsp[-2].minor.yy379 = yylhsminor.yy379; |
| 153132 | | - break; |
| 153133 | | - case 291: /* windowdefn ::= nm AS LP window RP */ |
| 153134 | | -{ |
| 153135 | | - if( ALWAYS(yymsp[-1].minor.yy379) ){ |
| 153136 | | - yymsp[-1].minor.yy379->zName = sqlite3DbStrNDup(pParse->db, yymsp[-4].minor.yy0.z, yymsp[-4].minor.yy0.n); |
| 153137 | | - } |
| 153138 | | - yylhsminor.yy379 = yymsp[-1].minor.yy379; |
| 153139 | | -} |
| 153140 | | - yymsp[-4].minor.yy379 = yylhsminor.yy379; |
| 153141 | | - break; |
| 153142 | | - case 292: /* window ::= PARTITION BY nexprlist orderby_opt frame_opt */ |
| 153143 | | -{ |
| 153144 | | - yymsp[-4].minor.yy379 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy379, yymsp[-2].minor.yy94, yymsp[-1].minor.yy94, 0); |
| 153145 | | -} |
| 153146 | | - break; |
| 153147 | | - case 293: /* window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ |
| 153148 | | -{ |
| 153149 | | - yylhsminor.yy379 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy379, yymsp[-2].minor.yy94, yymsp[-1].minor.yy94, &yymsp[-5].minor.yy0); |
| 153150 | | -} |
| 153151 | | - yymsp[-5].minor.yy379 = yylhsminor.yy379; |
| 153152 | | - break; |
| 153153 | | - case 294: /* window ::= ORDER BY sortlist frame_opt */ |
| 153154 | | -{ |
| 153155 | | - yymsp[-3].minor.yy379 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy379, 0, yymsp[-1].minor.yy94, 0); |
| 153156 | | -} |
| 153157 | | - break; |
| 153158 | | - case 295: /* window ::= nm ORDER BY sortlist frame_opt */ |
| 153159 | | -{ |
| 153160 | | - yylhsminor.yy379 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy379, 0, yymsp[-1].minor.yy94, &yymsp[-4].minor.yy0); |
| 153161 | | -} |
| 153162 | | - yymsp[-4].minor.yy379 = yylhsminor.yy379; |
| 153163 | | - break; |
| 153164 | | - case 296: /* window ::= frame_opt */ |
| 153165 | | -{ |
| 153166 | | - yylhsminor.yy379 = yymsp[0].minor.yy379; |
| 153167 | | -} |
| 153168 | | - yymsp[0].minor.yy379 = yylhsminor.yy379; |
| 153169 | | - break; |
| 153170 | | - case 297: /* window ::= nm frame_opt */ |
| 153171 | | -{ |
| 153172 | | - yylhsminor.yy379 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy379, 0, 0, &yymsp[-1].minor.yy0); |
| 153173 | | -} |
| 153174 | | - yymsp[-1].minor.yy379 = yylhsminor.yy379; |
| 153175 | | - break; |
| 153176 | | - case 298: /* frame_opt ::= */ |
| 153177 | | -{ |
| 153178 | | - yymsp[1].minor.yy379 = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0); |
| 153179 | | -} |
| 153180 | | - break; |
| 153181 | | - case 299: /* frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ |
| 153182 | | -{ |
| 153183 | | - yylhsminor.yy379 = sqlite3WindowAlloc(pParse, yymsp[-2].minor.yy100, yymsp[-1].minor.yy389.eType, yymsp[-1].minor.yy389.pExpr, TK_CURRENT, 0, yymsp[0].minor.yy218); |
| 153184 | | -} |
| 153185 | | - yymsp[-2].minor.yy379 = yylhsminor.yy379; |
| 153186 | | - break; |
| 153187 | | - case 300: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ |
| 153188 | | -{ |
| 153189 | | - yylhsminor.yy379 = sqlite3WindowAlloc(pParse, yymsp[-5].minor.yy100, yymsp[-3].minor.yy389.eType, yymsp[-3].minor.yy389.pExpr, yymsp[-1].minor.yy389.eType, yymsp[-1].minor.yy389.pExpr, yymsp[0].minor.yy218); |
| 153190 | | -} |
| 153191 | | - yymsp[-5].minor.yy379 = yylhsminor.yy379; |
| 153192 | | - break; |
| 153193 | | - case 302: /* frame_bound_s ::= frame_bound */ |
| 153194 | | - case 304: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==304); |
| 153195 | | -{yylhsminor.yy389 = yymsp[0].minor.yy389;} |
| 153196 | | - yymsp[0].minor.yy389 = yylhsminor.yy389; |
| 153197 | | - break; |
| 153198 | | - case 303: /* frame_bound_s ::= UNBOUNDED PRECEDING */ |
| 153199 | | - case 305: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==305); |
| 153200 | | - case 307: /* frame_bound ::= CURRENT ROW */ yytestcase(yyruleno==307); |
| 153201 | | -{yylhsminor.yy389.eType = yymsp[-1].major; yylhsminor.yy389.pExpr = 0;} |
| 153202 | | - yymsp[-1].minor.yy389 = yylhsminor.yy389; |
| 153203 | | - break; |
| 153204 | | - case 306: /* frame_bound ::= expr PRECEDING|FOLLOWING */ |
| 153205 | | -{yylhsminor.yy389.eType = yymsp[0].major; yylhsminor.yy389.pExpr = yymsp[-1].minor.yy102;} |
| 153206 | | - yymsp[-1].minor.yy389 = yylhsminor.yy389; |
| 153207 | | - break; |
| 153208 | | - case 308: /* frame_exclude_opt ::= */ |
| 153209 | | -{yymsp[1].minor.yy218 = 0;} |
| 153210 | | - break; |
| 153211 | | - case 309: /* frame_exclude_opt ::= EXCLUDE frame_exclude */ |
| 153212 | | -{yymsp[-1].minor.yy218 = yymsp[0].minor.yy218;} |
| 153213 | | - break; |
| 153214 | | - case 310: /* frame_exclude ::= NO OTHERS */ |
| 153215 | | - case 311: /* frame_exclude ::= CURRENT ROW */ yytestcase(yyruleno==311); |
| 153216 | | -{yymsp[-1].minor.yy218 = yymsp[-1].major; /*A-overwrites-X*/} |
| 153217 | | - break; |
| 153218 | | - case 312: /* frame_exclude ::= GROUP|TIES */ |
| 153219 | | -{yymsp[0].minor.yy218 = yymsp[0].major; /*A-overwrites-X*/} |
| 153220 | | - break; |
| 153221 | | - case 313: /* window_clause ::= WINDOW windowdefn_list */ |
| 153222 | | -{ yymsp[-1].minor.yy379 = yymsp[0].minor.yy379; } |
| 153223 | | - break; |
| 153224 | | - case 314: /* over_clause ::= filter_opt OVER LP window RP */ |
| 153225 | | -{ |
| 153226 | | - yylhsminor.yy379 = yymsp[-1].minor.yy379; |
| 153227 | | - assert( yylhsminor.yy379!=0 ); |
| 153228 | | - yylhsminor.yy379->pFilter = yymsp[-4].minor.yy102; |
| 153229 | | -} |
| 153230 | | - yymsp[-4].minor.yy379 = yylhsminor.yy379; |
| 153231 | | - break; |
| 153232 | | - case 315: /* over_clause ::= filter_opt OVER nm */ |
| 153233 | | -{ |
| 153234 | | - yylhsminor.yy379 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); |
| 153235 | | - if( yylhsminor.yy379 ){ |
| 153236 | | - yylhsminor.yy379->zName = sqlite3DbStrNDup(pParse->db, yymsp[0].minor.yy0.z, yymsp[0].minor.yy0.n); |
| 153237 | | - yylhsminor.yy379->pFilter = yymsp[-2].minor.yy102; |
| 153238 | | - }else{ |
| 153239 | | - sqlite3ExprDelete(pParse->db, yymsp[-2].minor.yy102); |
| 153240 | | - } |
| 153241 | | -} |
| 153242 | | - yymsp[-2].minor.yy379 = yylhsminor.yy379; |
| 153243 | | - break; |
| 153244 | | - case 317: /* filter_opt ::= FILTER LP WHERE expr RP */ |
| 153245 | | -{ yymsp[-4].minor.yy102 = yymsp[-1].minor.yy102; } |
| 153906 | + case 288: /* with ::= WITH wqlist */ |
| 153907 | + case 289: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==289); |
| 153908 | +{ sqlite3WithPush(pParse, yymsp[0].minor.yy297, 1); } |
| 153909 | + break; |
| 153910 | + case 290: /* wqlist ::= nm eidlist_opt AS LP select RP */ |
| 153911 | +{ |
| 153912 | + yymsp[-5].minor.yy297 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy138, yymsp[-1].minor.yy25); /*A-overwrites-X*/ |
| 153913 | +} |
| 153914 | + break; |
| 153915 | + case 291: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ |
| 153916 | +{ |
| 153917 | + yymsp[-7].minor.yy297 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy297, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy138, yymsp[-1].minor.yy25); |
| 153918 | +} |
| 153919 | + break; |
| 153920 | + case 292: /* windowdefn_list ::= windowdefn */ |
| 153921 | +{ yylhsminor.yy455 = yymsp[0].minor.yy455; } |
| 153922 | + yymsp[0].minor.yy455 = yylhsminor.yy455; |
| 153923 | + break; |
| 153924 | + case 293: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */ |
| 153925 | +{ |
| 153926 | + assert( yymsp[0].minor.yy455!=0 ); |
| 153927 | + sqlite3WindowChain(pParse, yymsp[0].minor.yy455, yymsp[-2].minor.yy455); |
| 153928 | + yymsp[0].minor.yy455->pNextWin = yymsp[-2].minor.yy455; |
| 153929 | + yylhsminor.yy455 = yymsp[0].minor.yy455; |
| 153930 | +} |
| 153931 | + yymsp[-2].minor.yy455 = yylhsminor.yy455; |
| 153932 | + break; |
| 153933 | + case 294: /* windowdefn ::= nm AS LP window RP */ |
| 153934 | +{ |
| 153935 | + if( ALWAYS(yymsp[-1].minor.yy455) ){ |
| 153936 | + yymsp[-1].minor.yy455->zName = sqlite3DbStrNDup(pParse->db, yymsp[-4].minor.yy0.z, yymsp[-4].minor.yy0.n); |
| 153937 | + } |
| 153938 | + yylhsminor.yy455 = yymsp[-1].minor.yy455; |
| 153939 | +} |
| 153940 | + yymsp[-4].minor.yy455 = yylhsminor.yy455; |
| 153941 | + break; |
| 153942 | + case 295: /* window ::= PARTITION BY nexprlist orderby_opt frame_opt */ |
| 153943 | +{ |
| 153944 | + yymsp[-4].minor.yy455 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy455, yymsp[-2].minor.yy138, yymsp[-1].minor.yy138, 0); |
| 153945 | +} |
| 153946 | + break; |
| 153947 | + case 296: /* window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ |
| 153948 | +{ |
| 153949 | + yylhsminor.yy455 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy455, yymsp[-2].minor.yy138, yymsp[-1].minor.yy138, &yymsp[-5].minor.yy0); |
| 153950 | +} |
| 153951 | + yymsp[-5].minor.yy455 = yylhsminor.yy455; |
| 153952 | + break; |
| 153953 | + case 297: /* window ::= ORDER BY sortlist frame_opt */ |
| 153954 | +{ |
| 153955 | + yymsp[-3].minor.yy455 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy455, 0, yymsp[-1].minor.yy138, 0); |
| 153956 | +} |
| 153957 | + break; |
| 153958 | + case 298: /* window ::= nm ORDER BY sortlist frame_opt */ |
| 153959 | +{ |
| 153960 | + yylhsminor.yy455 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy455, 0, yymsp[-1].minor.yy138, &yymsp[-4].minor.yy0); |
| 153961 | +} |
| 153962 | + yymsp[-4].minor.yy455 = yylhsminor.yy455; |
| 153963 | + break; |
| 153964 | + case 299: /* window ::= frame_opt */ |
| 153965 | + case 318: /* filter_over ::= over_clause */ yytestcase(yyruleno==318); |
| 153966 | +{ |
| 153967 | + yylhsminor.yy455 = yymsp[0].minor.yy455; |
| 153968 | +} |
| 153969 | + yymsp[0].minor.yy455 = yylhsminor.yy455; |
| 153970 | + break; |
| 153971 | + case 300: /* window ::= nm frame_opt */ |
| 153972 | +{ |
| 153973 | + yylhsminor.yy455 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy455, 0, 0, &yymsp[-1].minor.yy0); |
| 153974 | +} |
| 153975 | + yymsp[-1].minor.yy455 = yylhsminor.yy455; |
| 153976 | + break; |
| 153977 | + case 301: /* frame_opt ::= */ |
| 153978 | +{ |
| 153979 | + yymsp[1].minor.yy455 = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0); |
| 153980 | +} |
| 153981 | + break; |
| 153982 | + case 302: /* frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ |
| 153983 | +{ |
| 153984 | + yylhsminor.yy455 = sqlite3WindowAlloc(pParse, yymsp[-2].minor.yy32, yymsp[-1].minor.yy57.eType, yymsp[-1].minor.yy57.pExpr, TK_CURRENT, 0, yymsp[0].minor.yy118); |
| 153985 | +} |
| 153986 | + yymsp[-2].minor.yy455 = yylhsminor.yy455; |
| 153987 | + break; |
| 153988 | + case 303: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ |
| 153989 | +{ |
| 153990 | + yylhsminor.yy455 = sqlite3WindowAlloc(pParse, yymsp[-5].minor.yy32, yymsp[-3].minor.yy57.eType, yymsp[-3].minor.yy57.pExpr, yymsp[-1].minor.yy57.eType, yymsp[-1].minor.yy57.pExpr, yymsp[0].minor.yy118); |
| 153991 | +} |
| 153992 | + yymsp[-5].minor.yy455 = yylhsminor.yy455; |
| 153993 | + break; |
| 153994 | + case 305: /* frame_bound_s ::= frame_bound */ |
| 153995 | + case 307: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==307); |
| 153996 | +{yylhsminor.yy57 = yymsp[0].minor.yy57;} |
| 153997 | + yymsp[0].minor.yy57 = yylhsminor.yy57; |
| 153998 | + break; |
| 153999 | + case 306: /* frame_bound_s ::= UNBOUNDED PRECEDING */ |
| 154000 | + case 308: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==308); |
| 154001 | + case 310: /* frame_bound ::= CURRENT ROW */ yytestcase(yyruleno==310); |
| 154002 | +{yylhsminor.yy57.eType = yymsp[-1].major; yylhsminor.yy57.pExpr = 0;} |
| 154003 | + yymsp[-1].minor.yy57 = yylhsminor.yy57; |
| 154004 | + break; |
| 154005 | + case 309: /* frame_bound ::= expr PRECEDING|FOLLOWING */ |
| 154006 | +{yylhsminor.yy57.eType = yymsp[0].major; yylhsminor.yy57.pExpr = yymsp[-1].minor.yy46;} |
| 154007 | + yymsp[-1].minor.yy57 = yylhsminor.yy57; |
| 154008 | + break; |
| 154009 | + case 311: /* frame_exclude_opt ::= */ |
| 154010 | +{yymsp[1].minor.yy118 = 0;} |
| 154011 | + break; |
| 154012 | + case 312: /* frame_exclude_opt ::= EXCLUDE frame_exclude */ |
| 154013 | +{yymsp[-1].minor.yy118 = yymsp[0].minor.yy118;} |
| 154014 | + break; |
| 154015 | + case 313: /* frame_exclude ::= NO OTHERS */ |
| 154016 | + case 314: /* frame_exclude ::= CURRENT ROW */ yytestcase(yyruleno==314); |
| 154017 | +{yymsp[-1].minor.yy118 = yymsp[-1].major; /*A-overwrites-X*/} |
| 154018 | + break; |
| 154019 | + case 315: /* frame_exclude ::= GROUP|TIES */ |
| 154020 | +{yymsp[0].minor.yy118 = yymsp[0].major; /*A-overwrites-X*/} |
| 154021 | + break; |
| 154022 | + case 316: /* window_clause ::= WINDOW windowdefn_list */ |
| 154023 | +{ yymsp[-1].minor.yy455 = yymsp[0].minor.yy455; } |
| 154024 | + break; |
| 154025 | + case 317: /* filter_over ::= filter_clause over_clause */ |
| 154026 | +{ |
| 154027 | + yymsp[0].minor.yy455->pFilter = yymsp[-1].minor.yy46; |
| 154028 | + yylhsminor.yy455 = yymsp[0].minor.yy455; |
| 154029 | +} |
| 154030 | + yymsp[-1].minor.yy455 = yylhsminor.yy455; |
| 154031 | + break; |
| 154032 | + case 319: /* filter_over ::= filter_clause */ |
| 154033 | +{ |
| 154034 | + yylhsminor.yy455 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); |
| 154035 | + if( yylhsminor.yy455 ){ |
| 154036 | + yylhsminor.yy455->eFrmType = TK_FILTER; |
| 154037 | + yylhsminor.yy455->pFilter = yymsp[0].minor.yy46; |
| 154038 | + }else{ |
| 154039 | + sqlite3ExprDelete(pParse->db, yymsp[0].minor.yy46); |
| 154040 | + } |
| 154041 | +} |
| 154042 | + yymsp[0].minor.yy455 = yylhsminor.yy455; |
| 154043 | + break; |
| 154044 | + case 320: /* over_clause ::= OVER LP window RP */ |
| 154045 | +{ |
| 154046 | + yymsp[-3].minor.yy455 = yymsp[-1].minor.yy455; |
| 154047 | + assert( yymsp[-3].minor.yy455!=0 ); |
| 154048 | +} |
| 154049 | + break; |
| 154050 | + case 321: /* over_clause ::= OVER nm */ |
| 154051 | +{ |
| 154052 | + yymsp[-1].minor.yy455 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); |
| 154053 | + if( yymsp[-1].minor.yy455 ){ |
| 154054 | + yymsp[-1].minor.yy455->zName = sqlite3DbStrNDup(pParse->db, yymsp[0].minor.yy0.z, yymsp[0].minor.yy0.n); |
| 154055 | + } |
| 154056 | +} |
| 154057 | + break; |
| 154058 | + case 322: /* filter_clause ::= FILTER LP WHERE expr RP */ |
| 154059 | +{ yymsp[-4].minor.yy46 = yymsp[-1].minor.yy46; } |
| 153246 | 154060 | break; |
| 153247 | 154061 | default: |
| 153248 | | - /* (318) input ::= cmdlist */ yytestcase(yyruleno==318); |
| 153249 | | - /* (319) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==319); |
| 153250 | | - /* (320) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=320); |
| 153251 | | - /* (321) ecmd ::= SEMI */ yytestcase(yyruleno==321); |
| 153252 | | - /* (322) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==322); |
| 153253 | | - /* (323) ecmd ::= explain cmdx */ yytestcase(yyruleno==323); |
| 153254 | | - /* (324) trans_opt ::= */ yytestcase(yyruleno==324); |
| 153255 | | - /* (325) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==325); |
| 153256 | | - /* (326) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==326); |
| 153257 | | - /* (327) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==327); |
| 153258 | | - /* (328) savepoint_opt ::= */ yytestcase(yyruleno==328); |
| 153259 | | - /* (329) cmd ::= create_table create_table_args */ yytestcase(yyruleno==329); |
| 153260 | | - /* (330) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==330); |
| 153261 | | - /* (331) columnlist ::= columnname carglist */ yytestcase(yyruleno==331); |
| 153262 | | - /* (332) nm ::= ID|INDEXED */ yytestcase(yyruleno==332); |
| 153263 | | - /* (333) nm ::= STRING */ yytestcase(yyruleno==333); |
| 153264 | | - /* (334) nm ::= JOIN_KW */ yytestcase(yyruleno==334); |
| 153265 | | - /* (335) typetoken ::= typename */ yytestcase(yyruleno==335); |
| 153266 | | - /* (336) typename ::= ID|STRING */ yytestcase(yyruleno==336); |
| 153267 | | - /* (337) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=337); |
| 153268 | | - /* (338) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=338); |
| 153269 | | - /* (339) carglist ::= carglist ccons */ yytestcase(yyruleno==339); |
| 153270 | | - /* (340) carglist ::= */ yytestcase(yyruleno==340); |
| 153271 | | - /* (341) ccons ::= NULL onconf */ yytestcase(yyruleno==341); |
| 153272 | | - /* (342) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==342); |
| 153273 | | - /* (343) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==343); |
| 153274 | | - /* (344) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=344); |
| 153275 | | - /* (345) tconscomma ::= */ yytestcase(yyruleno==345); |
| 153276 | | - /* (346) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=346); |
| 153277 | | - /* (347) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=347); |
| 153278 | | - /* (348) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=348); |
| 153279 | | - /* (349) oneselect ::= values */ yytestcase(yyruleno==349); |
| 153280 | | - /* (350) sclp ::= selcollist COMMA */ yytestcase(yyruleno==350); |
| 153281 | | - /* (351) as ::= ID|STRING */ yytestcase(yyruleno==351); |
| 153282 | | - /* (352) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=352); |
| 153283 | | - /* (353) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==353); |
| 153284 | | - /* (354) exprlist ::= nexprlist */ yytestcase(yyruleno==354); |
| 153285 | | - /* (355) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=355); |
| 153286 | | - /* (356) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=356); |
| 153287 | | - /* (357) nmnum ::= ON */ yytestcase(yyruleno==357); |
| 153288 | | - /* (358) nmnum ::= DELETE */ yytestcase(yyruleno==358); |
| 153289 | | - /* (359) nmnum ::= DEFAULT */ yytestcase(yyruleno==359); |
| 153290 | | - /* (360) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==360); |
| 153291 | | - /* (361) foreach_clause ::= */ yytestcase(yyruleno==361); |
| 153292 | | - /* (362) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==362); |
| 153293 | | - /* (363) trnm ::= nm */ yytestcase(yyruleno==363); |
| 153294 | | - /* (364) tridxby ::= */ yytestcase(yyruleno==364); |
| 153295 | | - /* (365) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==365); |
| 153296 | | - /* (366) database_kw_opt ::= */ yytestcase(yyruleno==366); |
| 153297 | | - /* (367) kwcolumn_opt ::= */ yytestcase(yyruleno==367); |
| 153298 | | - /* (368) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==368); |
| 153299 | | - /* (369) vtabarglist ::= vtabarg */ yytestcase(yyruleno==369); |
| 153300 | | - /* (370) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==370); |
| 153301 | | - /* (371) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==371); |
| 153302 | | - /* (372) anylist ::= */ yytestcase(yyruleno==372); |
| 153303 | | - /* (373) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==373); |
| 153304 | | - /* (374) anylist ::= anylist ANY */ yytestcase(yyruleno==374); |
| 153305 | | - /* (375) with ::= */ yytestcase(yyruleno==375); |
| 154062 | + /* (323) input ::= cmdlist */ yytestcase(yyruleno==323); |
| 154063 | + /* (324) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==324); |
| 154064 | + /* (325) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=325); |
| 154065 | + /* (326) ecmd ::= SEMI */ yytestcase(yyruleno==326); |
| 154066 | + /* (327) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==327); |
| 154067 | + /* (328) ecmd ::= explain cmdx */ yytestcase(yyruleno==328); |
| 154068 | + /* (329) trans_opt ::= */ yytestcase(yyruleno==329); |
| 154069 | + /* (330) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==330); |
| 154070 | + /* (331) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==331); |
| 154071 | + /* (332) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==332); |
| 154072 | + /* (333) savepoint_opt ::= */ yytestcase(yyruleno==333); |
| 154073 | + /* (334) cmd ::= create_table create_table_args */ yytestcase(yyruleno==334); |
| 154074 | + /* (335) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==335); |
| 154075 | + /* (336) columnlist ::= columnname carglist */ yytestcase(yyruleno==336); |
| 154076 | + /* (337) nm ::= ID|INDEXED */ yytestcase(yyruleno==337); |
| 154077 | + /* (338) nm ::= STRING */ yytestcase(yyruleno==338); |
| 154078 | + /* (339) nm ::= JOIN_KW */ yytestcase(yyruleno==339); |
| 154079 | + /* (340) typetoken ::= typename */ yytestcase(yyruleno==340); |
| 154080 | + /* (341) typename ::= ID|STRING */ yytestcase(yyruleno==341); |
| 154081 | + /* (342) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=342); |
| 154082 | + /* (343) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=343); |
| 154083 | + /* (344) carglist ::= carglist ccons */ yytestcase(yyruleno==344); |
| 154084 | + /* (345) carglist ::= */ yytestcase(yyruleno==345); |
| 154085 | + /* (346) ccons ::= NULL onconf */ yytestcase(yyruleno==346); |
| 154086 | + /* (347) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==347); |
| 154087 | + /* (348) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==348); |
| 154088 | + /* (349) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=349); |
| 154089 | + /* (350) tconscomma ::= */ yytestcase(yyruleno==350); |
| 154090 | + /* (351) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=351); |
| 154091 | + /* (352) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=352); |
| 154092 | + /* (353) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=353); |
| 154093 | + /* (354) oneselect ::= values */ yytestcase(yyruleno==354); |
| 154094 | + /* (355) sclp ::= selcollist COMMA */ yytestcase(yyruleno==355); |
| 154095 | + /* (356) as ::= ID|STRING */ yytestcase(yyruleno==356); |
| 154096 | + /* (357) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=357); |
| 154097 | + /* (358) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==358); |
| 154098 | + /* (359) exprlist ::= nexprlist */ yytestcase(yyruleno==359); |
| 154099 | + /* (360) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=360); |
| 154100 | + /* (361) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=361); |
| 154101 | + /* (362) nmnum ::= ON */ yytestcase(yyruleno==362); |
| 154102 | + /* (363) nmnum ::= DELETE */ yytestcase(yyruleno==363); |
| 154103 | + /* (364) nmnum ::= DEFAULT */ yytestcase(yyruleno==364); |
| 154104 | + /* (365) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==365); |
| 154105 | + /* (366) foreach_clause ::= */ yytestcase(yyruleno==366); |
| 154106 | + /* (367) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==367); |
| 154107 | + /* (368) trnm ::= nm */ yytestcase(yyruleno==368); |
| 154108 | + /* (369) tridxby ::= */ yytestcase(yyruleno==369); |
| 154109 | + /* (370) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==370); |
| 154110 | + /* (371) database_kw_opt ::= */ yytestcase(yyruleno==371); |
| 154111 | + /* (372) kwcolumn_opt ::= */ yytestcase(yyruleno==372); |
| 154112 | + /* (373) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==373); |
| 154113 | + /* (374) vtabarglist ::= vtabarg */ yytestcase(yyruleno==374); |
| 154114 | + /* (375) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==375); |
| 154115 | + /* (376) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==376); |
| 154116 | + /* (377) anylist ::= */ yytestcase(yyruleno==377); |
| 154117 | + /* (378) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==378); |
| 154118 | + /* (379) anylist ::= anylist ANY */ yytestcase(yyruleno==379); |
| 154119 | + /* (380) with ::= */ yytestcase(yyruleno==380); |
| 153306 | 154120 | break; |
| 153307 | 154121 | /********** End reduce actions ************************************************/ |
| 153308 | 154122 | }; |
| 153309 | 154123 | assert( yyruleno<sizeof(yyRuleInfoLhs)/sizeof(yyRuleInfoLhs[0]) ); |
| 153310 | 154124 | yygoto = yyRuleInfoLhs[yyruleno]; |
| | @@ -153592,13 +154406,12 @@ |
| 153592 | 154406 | ** Return the fallback token corresponding to canonical token iToken, or |
| 153593 | 154407 | ** 0 if iToken has no fallback. |
| 153594 | 154408 | */ |
| 153595 | 154409 | SQLITE_PRIVATE int sqlite3ParserFallback(int iToken){ |
| 153596 | 154410 | #ifdef YYFALLBACK |
| 153597 | | - if( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) ){ |
| 153598 | | - return yyFallback[iToken]; |
| 153599 | | - } |
| 154411 | + assert( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) ); |
| 154412 | + return yyFallback[iToken]; |
| 153600 | 154413 | #else |
| 153601 | 154414 | (void)iToken; |
| 153602 | 154415 | #endif |
| 153603 | 154416 | return 0; |
| 153604 | 154417 | } |
| | @@ -153763,148 +154576,150 @@ |
| 153763 | 154576 | ** might be implemented more directly using a hand-written hash table. |
| 153764 | 154577 | ** But by using this automatically generated code, the size of the code |
| 153765 | 154578 | ** is substantially reduced. This is important for embedded applications |
| 153766 | 154579 | ** on platforms with limited memory. |
| 153767 | 154580 | */ |
| 153768 | | -/* Hash score: 214 */ |
| 153769 | | -/* zKWText[] encodes 950 bytes of keyword text in 629 bytes */ |
| 154581 | +/* Hash score: 221 */ |
| 154582 | +/* zKWText[] encodes 967 bytes of keyword text in 638 bytes */ |
| 153770 | 154583 | /* REINDEXEDESCAPEACHECKEYBEFOREIGNOREGEXPLAINSTEADDATABASELECT */ |
| 153771 | | -/* ABLEFTHENDEFERRABLELSEXCLUDELETEMPORARYCONSTRAINTERSECTIES */ |
| 153772 | | -/* AVEPOINTOFFSETRANSACTIONATURALTERAISEXCEPTRIGGEREFERENCES */ |
| 153773 | | -/* UNIQUERYWITHOUTERELEASEXCLUSIVEXISTSATTACHAVINGLOBEGINNERANGE */ |
| 153774 | | -/* BETWEENOTHINGROUPSCASCADETACHCASECOLLATECREATECURRENT_DATE */ |
| 153775 | | -/* IMMEDIATEJOINSERTLIKEMATCHPLANALYZEPRAGMABORTUPDATEVALUES */ |
| 153776 | | -/* VIRTUALIMITWHENOTNULLWHERECURSIVEAFTERENAMEANDEFAULT */ |
| 154584 | +/* ABLEFTHENDEFERRABLELSEXCLUDELETEMPORARYISNULLSAVEPOINTERSECT */ |
| 154585 | +/* IESNOTNULLIKEXCEPTRANSACTIONATURALTERAISEXCLUSIVEXISTS */ |
| 154586 | +/* CONSTRAINTOFFSETRIGGEREFERENCESUNIQUERYWITHOUTERELEASEATTACH */ |
| 154587 | +/* AVINGLOBEGINNERANGEBETWEENOTHINGROUPSCASCADETACHCASECOLLATE */ |
| 154588 | +/* CREATECURRENT_DATEIMMEDIATEJOINSERTMATCHPLANALYZEPRAGMABORT */ |
| 154589 | +/* UPDATEVALUESVIRTUALASTWHENWHERECURSIVEAFTERENAMEANDEFAULT */ |
| 153777 | 154590 | /* AUTOINCREMENTCASTCOLUMNCOMMITCONFLICTCROSSCURRENT_TIMESTAMP */ |
| 153778 | | -/* ARTITIONDEFERREDISTINCTDROPRECEDINGFAILFILTEREPLACEFOLLOWING */ |
| 153779 | | -/* FROMFULLIFISNULLORDERESTRICTOTHERSOVERIGHTROLLBACKROWS */ |
| 154591 | +/* ARTITIONDEFERREDISTINCTDROPRECEDINGFAILIMITFILTEREPLACEFIRST */ |
| 154592 | +/* FOLLOWINGFROMFULLIFORDERESTRICTOTHERSOVERIGHTROLLBACKROWS */ |
| 153780 | 154593 | /* UNBOUNDEDUNIONUSINGVACUUMVIEWINDOWBYINITIALLYPRIMARY */ |
| 153781 | | -static const char zKWText[628] = { |
| 154594 | +static const char zKWText[637] = { |
| 153782 | 154595 | 'R','E','I','N','D','E','X','E','D','E','S','C','A','P','E','A','C','H', |
| 153783 | 154596 | 'E','C','K','E','Y','B','E','F','O','R','E','I','G','N','O','R','E','G', |
| 153784 | 154597 | 'E','X','P','L','A','I','N','S','T','E','A','D','D','A','T','A','B','A', |
| 153785 | 154598 | 'S','E','L','E','C','T','A','B','L','E','F','T','H','E','N','D','E','F', |
| 153786 | 154599 | 'E','R','R','A','B','L','E','L','S','E','X','C','L','U','D','E','L','E', |
| 153787 | | - 'T','E','M','P','O','R','A','R','Y','C','O','N','S','T','R','A','I','N', |
| 153788 | | - 'T','E','R','S','E','C','T','I','E','S','A','V','E','P','O','I','N','T', |
| 153789 | | - 'O','F','F','S','E','T','R','A','N','S','A','C','T','I','O','N','A','T', |
| 153790 | | - 'U','R','A','L','T','E','R','A','I','S','E','X','C','E','P','T','R','I', |
| 153791 | | - 'G','G','E','R','E','F','E','R','E','N','C','E','S','U','N','I','Q','U', |
| 153792 | | - 'E','R','Y','W','I','T','H','O','U','T','E','R','E','L','E','A','S','E', |
| 153793 | | - 'X','C','L','U','S','I','V','E','X','I','S','T','S','A','T','T','A','C', |
| 153794 | | - 'H','A','V','I','N','G','L','O','B','E','G','I','N','N','E','R','A','N', |
| 153795 | | - 'G','E','B','E','T','W','E','E','N','O','T','H','I','N','G','R','O','U', |
| 153796 | | - 'P','S','C','A','S','C','A','D','E','T','A','C','H','C','A','S','E','C', |
| 153797 | | - 'O','L','L','A','T','E','C','R','E','A','T','E','C','U','R','R','E','N', |
| 153798 | | - 'T','_','D','A','T','E','I','M','M','E','D','I','A','T','E','J','O','I', |
| 153799 | | - 'N','S','E','R','T','L','I','K','E','M','A','T','C','H','P','L','A','N', |
| 153800 | | - 'A','L','Y','Z','E','P','R','A','G','M','A','B','O','R','T','U','P','D', |
| 153801 | | - 'A','T','E','V','A','L','U','E','S','V','I','R','T','U','A','L','I','M', |
| 153802 | | - 'I','T','W','H','E','N','O','T','N','U','L','L','W','H','E','R','E','C', |
| 153803 | | - 'U','R','S','I','V','E','A','F','T','E','R','E','N','A','M','E','A','N', |
| 153804 | | - 'D','E','F','A','U','L','T','A','U','T','O','I','N','C','R','E','M','E', |
| 153805 | | - 'N','T','C','A','S','T','C','O','L','U','M','N','C','O','M','M','I','T', |
| 153806 | | - 'C','O','N','F','L','I','C','T','C','R','O','S','S','C','U','R','R','E', |
| 153807 | | - 'N','T','_','T','I','M','E','S','T','A','M','P','A','R','T','I','T','I', |
| 153808 | | - 'O','N','D','E','F','E','R','R','E','D','I','S','T','I','N','C','T','D', |
| 153809 | | - 'R','O','P','R','E','C','E','D','I','N','G','F','A','I','L','F','I','L', |
| 153810 | | - 'T','E','R','E','P','L','A','C','E','F','O','L','L','O','W','I','N','G', |
| 153811 | | - 'F','R','O','M','F','U','L','L','I','F','I','S','N','U','L','L','O','R', |
| 153812 | | - 'D','E','R','E','S','T','R','I','C','T','O','T','H','E','R','S','O','V', |
| 153813 | | - 'E','R','I','G','H','T','R','O','L','L','B','A','C','K','R','O','W','S', |
| 153814 | | - 'U','N','B','O','U','N','D','E','D','U','N','I','O','N','U','S','I','N', |
| 153815 | | - 'G','V','A','C','U','U','M','V','I','E','W','I','N','D','O','W','B','Y', |
| 153816 | | - 'I','N','I','T','I','A','L','L','Y','P','R','I','M','A','R','Y', |
| 154600 | + 'T','E','M','P','O','R','A','R','Y','I','S','N','U','L','L','S','A','V', |
| 154601 | + 'E','P','O','I','N','T','E','R','S','E','C','T','I','E','S','N','O','T', |
| 154602 | + 'N','U','L','L','I','K','E','X','C','E','P','T','R','A','N','S','A','C', |
| 154603 | + 'T','I','O','N','A','T','U','R','A','L','T','E','R','A','I','S','E','X', |
| 154604 | + 'C','L','U','S','I','V','E','X','I','S','T','S','C','O','N','S','T','R', |
| 154605 | + 'A','I','N','T','O','F','F','S','E','T','R','I','G','G','E','R','E','F', |
| 154606 | + 'E','R','E','N','C','E','S','U','N','I','Q','U','E','R','Y','W','I','T', |
| 154607 | + 'H','O','U','T','E','R','E','L','E','A','S','E','A','T','T','A','C','H', |
| 154608 | + 'A','V','I','N','G','L','O','B','E','G','I','N','N','E','R','A','N','G', |
| 154609 | + 'E','B','E','T','W','E','E','N','O','T','H','I','N','G','R','O','U','P', |
| 154610 | + 'S','C','A','S','C','A','D','E','T','A','C','H','C','A','S','E','C','O', |
| 154611 | + 'L','L','A','T','E','C','R','E','A','T','E','C','U','R','R','E','N','T', |
| 154612 | + '_','D','A','T','E','I','M','M','E','D','I','A','T','E','J','O','I','N', |
| 154613 | + 'S','E','R','T','M','A','T','C','H','P','L','A','N','A','L','Y','Z','E', |
| 154614 | + 'P','R','A','G','M','A','B','O','R','T','U','P','D','A','T','E','V','A', |
| 154615 | + 'L','U','E','S','V','I','R','T','U','A','L','A','S','T','W','H','E','N', |
| 154616 | + 'W','H','E','R','E','C','U','R','S','I','V','E','A','F','T','E','R','E', |
| 154617 | + 'N','A','M','E','A','N','D','E','F','A','U','L','T','A','U','T','O','I', |
| 154618 | + 'N','C','R','E','M','E','N','T','C','A','S','T','C','O','L','U','M','N', |
| 154619 | + 'C','O','M','M','I','T','C','O','N','F','L','I','C','T','C','R','O','S', |
| 154620 | + 'S','C','U','R','R','E','N','T','_','T','I','M','E','S','T','A','M','P', |
| 154621 | + 'A','R','T','I','T','I','O','N','D','E','F','E','R','R','E','D','I','S', |
| 154622 | + 'T','I','N','C','T','D','R','O','P','R','E','C','E','D','I','N','G','F', |
| 154623 | + 'A','I','L','I','M','I','T','F','I','L','T','E','R','E','P','L','A','C', |
| 154624 | + 'E','F','I','R','S','T','F','O','L','L','O','W','I','N','G','F','R','O', |
| 154625 | + 'M','F','U','L','L','I','F','O','R','D','E','R','E','S','T','R','I','C', |
| 154626 | + 'T','O','T','H','E','R','S','O','V','E','R','I','G','H','T','R','O','L', |
| 154627 | + 'L','B','A','C','K','R','O','W','S','U','N','B','O','U','N','D','E','D', |
| 154628 | + 'U','N','I','O','N','U','S','I','N','G','V','A','C','U','U','M','V','I', |
| 154629 | + 'E','W','I','N','D','O','W','B','Y','I','N','I','T','I','A','L','L','Y', |
| 154630 | + 'P','R','I','M','A','R','Y', |
| 153817 | 154631 | }; |
| 153818 | 154632 | /* aKWHash[i] is the hash value for the i-th keyword */ |
| 153819 | 154633 | static const unsigned char aKWHash[127] = { |
| 153820 | | - 75, 111, 127, 73, 108, 29, 0, 0, 83, 0, 77, 63, 0, |
| 153821 | | - 37, 33, 78, 15, 0, 126, 86, 57, 120, 128, 19, 0, 0, |
| 153822 | | - 133, 0, 131, 123, 0, 22, 98, 0, 9, 0, 0, 117, 71, |
| 153823 | | - 0, 69, 6, 0, 49, 95, 140, 0, 129, 106, 0, 0, 54, |
| 153824 | | - 0, 109, 24, 0, 17, 0, 134, 56, 23, 26, 5, 58, 135, |
| 153825 | | - 101, 0, 0, 139, 112, 62, 138, 59, 115, 65, 0, 96, 0, |
| 153826 | | - 105, 45, 0, 104, 0, 0, 0, 100, 97, 102, 107, 119, 14, |
| 153827 | | - 31, 118, 0, 81, 0, 136, 116, 137, 61, 124, 132, 80, 121, |
| 153828 | | - 88, 30, 85, 0, 0, 99, 35, 125, 122, 0, 130, 0, 0, |
| 153829 | | - 41, 0, 91, 89, 90, 0, 20, 87, 113, 82, |
| 154634 | + 82, 113, 130, 80, 110, 29, 0, 0, 89, 0, 83, 70, 0, |
| 154635 | + 53, 35, 84, 15, 0, 129, 92, 64, 124, 131, 19, 0, 0, |
| 154636 | + 136, 0, 134, 126, 0, 22, 100, 0, 9, 0, 0, 121, 78, |
| 154637 | + 0, 76, 6, 0, 58, 97, 143, 0, 132, 108, 0, 0, 48, |
| 154638 | + 0, 111, 24, 0, 17, 0, 137, 63, 23, 26, 5, 65, 138, |
| 154639 | + 103, 120, 0, 142, 114, 69, 141, 66, 118, 72, 0, 98, 0, |
| 154640 | + 107, 41, 0, 106, 0, 0, 0, 102, 99, 104, 109, 123, 14, |
| 154641 | + 50, 122, 0, 87, 0, 139, 119, 140, 68, 127, 135, 86, 81, |
| 154642 | + 37, 91, 117, 0, 0, 101, 51, 128, 125, 0, 133, 0, 0, |
| 154643 | + 44, 0, 93, 67, 39, 0, 20, 45, 115, 88, |
| 153830 | 154644 | }; |
| 153831 | 154645 | /* aKWNext[] forms the hash collision chain. If aKWHash[i]==0 |
| 153832 | 154646 | ** then the i-th keyword has no more hash collisions. Otherwise, |
| 153833 | 154647 | ** the next keyword with the same hash is aKWHash[i]-1. */ |
| 153834 | | -static const unsigned char aKWNext[140] = { |
| 154648 | +static const unsigned char aKWNext[143] = { |
| 153835 | 154649 | 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, |
| 153836 | 154650 | 0, 2, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, |
| 153837 | | - 0, 0, 0, 21, 0, 0, 12, 0, 0, 0, 0, 0, 0, |
| 153838 | | - 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 153839 | | - 51, 28, 0, 0, 38, 0, 0, 0, 44, 0, 0, 0, 3, |
| 153840 | | - 0, 0, 67, 1, 66, 0, 0, 0, 36, 0, 47, 0, 0, |
| 153841 | | - 0, 0, 0, 48, 50, 76, 0, 0, 42, 0, 60, 0, 0, |
| 153842 | | - 0, 43, 0, 16, 55, 10, 0, 0, 0, 0, 0, 0, 0, |
| 153843 | | - 11, 72, 93, 0, 0, 8, 0, 110, 0, 103, 40, 53, 70, |
| 153844 | | - 0, 114, 0, 74, 52, 0, 0, 92, 39, 46, 0, 68, 32, |
| 153845 | | - 84, 0, 34, 27, 25, 18, 94, 0, 64, 79, |
| 154651 | + 0, 0, 0, 21, 0, 0, 0, 0, 12, 0, 0, 0, 0, |
| 154652 | + 0, 0, 0, 7, 0, 36, 0, 0, 28, 0, 0, 0, 31, |
| 154653 | + 0, 0, 0, 40, 0, 0, 0, 0, 0, 60, 0, 54, 0, |
| 154654 | + 0, 38, 47, 0, 0, 0, 3, 0, 0, 74, 1, 73, 0, |
| 154655 | + 0, 0, 52, 0, 0, 0, 0, 0, 0, 57, 59, 56, 30, |
| 154656 | + 0, 0, 0, 46, 0, 16, 49, 10, 0, 0, 0, 0, 0, |
| 154657 | + 0, 0, 11, 79, 95, 0, 0, 8, 0, 112, 0, 105, 0, |
| 154658 | + 43, 62, 0, 77, 0, 116, 0, 61, 0, 0, 94, 42, 55, |
| 154659 | + 0, 75, 34, 90, 32, 33, 27, 25, 18, 96, 0, 71, 85, |
| 153846 | 154660 | }; |
| 153847 | 154661 | /* aKWLen[i] is the length (in bytes) of the i-th keyword */ |
| 153848 | | -static const unsigned char aKWLen[140] = { |
| 154662 | +static const unsigned char aKWLen[143] = { |
| 153849 | 154663 | 7, 7, 5, 4, 6, 4, 5, 3, 6, 7, 3, 6, 6, |
| 153850 | 154664 | 7, 7, 3, 8, 2, 6, 5, 4, 4, 3, 10, 4, 7, |
| 153851 | | - 6, 9, 4, 2, 10, 9, 4, 9, 4, 6, 2, 3, 11, |
| 153852 | | - 6, 2, 7, 5, 5, 6, 7, 10, 6, 5, 7, 4, 5, |
| 153853 | | - 7, 9, 6, 6, 6, 4, 5, 5, 5, 7, 7, 6, 5, |
| 153854 | | - 7, 3, 6, 4, 7, 6, 12, 9, 4, 6, 4, 5, 4, |
| 153855 | | - 7, 6, 5, 6, 6, 7, 5, 4, 7, 3, 2, 4, 5, |
| 153856 | | - 9, 5, 6, 3, 7, 13, 2, 2, 4, 6, 6, 8, 5, |
| 153857 | | - 17, 12, 7, 9, 8, 8, 2, 4, 9, 4, 6, 7, 9, |
| 153858 | | - 4, 4, 2, 6, 5, 8, 6, 4, 5, 8, 4, 3, 9, |
| 153859 | | - 5, 5, 6, 4, 6, 2, 2, 9, 3, 7, |
| 154665 | + 6, 9, 4, 2, 6, 5, 9, 9, 4, 7, 3, 2, 4, |
| 154666 | + 4, 6, 11, 6, 2, 7, 5, 5, 9, 6, 10, 4, 6, |
| 154667 | + 2, 3, 7, 10, 6, 5, 7, 4, 5, 7, 6, 6, 4, |
| 154668 | + 5, 5, 5, 7, 7, 6, 5, 7, 3, 6, 4, 7, 6, |
| 154669 | + 12, 9, 4, 6, 5, 4, 7, 6, 5, 6, 6, 7, 4, |
| 154670 | + 4, 5, 9, 5, 6, 3, 7, 13, 2, 2, 4, 6, 6, |
| 154671 | + 8, 5, 17, 12, 7, 9, 8, 8, 2, 4, 9, 4, 5, |
| 154672 | + 6, 7, 5, 9, 4, 4, 2, 5, 8, 6, 4, 5, 8, |
| 154673 | + 4, 3, 9, 5, 5, 6, 4, 6, 2, 2, 9, 3, 7, |
| 153860 | 154674 | }; |
| 153861 | 154675 | /* aKWOffset[i] is the index into zKWText[] of the start of |
| 153862 | 154676 | ** the text for the i-th keyword. */ |
| 153863 | | -static const unsigned short int aKWOffset[140] = { |
| 154677 | +static const unsigned short int aKWOffset[143] = { |
| 153864 | 154678 | 0, 2, 2, 8, 9, 14, 16, 20, 23, 25, 25, 29, 33, |
| 153865 | 154679 | 36, 41, 46, 48, 53, 54, 59, 62, 65, 67, 69, 78, 81, |
| 153866 | | - 86, 90, 90, 94, 99, 106, 114, 117, 123, 126, 126, 129, 131, |
| 153867 | | - 136, 140, 141, 146, 150, 154, 159, 165, 175, 178, 183, 183, 187, |
| 153868 | | - 191, 197, 205, 211, 216, 221, 224, 227, 231, 236, 242, 248, 248, |
| 153869 | | - 254, 255, 259, 265, 269, 276, 282, 294, 303, 305, 311, 315, 320, |
| 153870 | | - 322, 329, 334, 339, 345, 351, 357, 362, 365, 365, 365, 368, 372, |
| 153871 | | - 375, 384, 388, 394, 396, 403, 405, 407, 416, 420, 426, 432, 440, |
| 153872 | | - 445, 445, 445, 461, 470, 477, 478, 485, 488, 497, 501, 506, 513, |
| 153873 | | - 522, 526, 530, 532, 538, 542, 550, 556, 559, 564, 572, 572, 576, |
| 153874 | | - 585, 590, 595, 601, 604, 607, 610, 612, 617, 621, |
| 154680 | + 86, 90, 90, 94, 99, 101, 105, 111, 119, 123, 123, 123, 126, |
| 154681 | + 129, 132, 137, 142, 146, 147, 152, 156, 160, 168, 174, 181, 184, |
| 154682 | + 184, 187, 189, 195, 205, 208, 213, 213, 217, 221, 228, 233, 238, |
| 154683 | + 241, 244, 248, 253, 259, 265, 265, 271, 272, 276, 282, 286, 293, |
| 154684 | + 299, 311, 320, 322, 328, 333, 335, 342, 347, 352, 358, 364, 370, |
| 154685 | + 374, 378, 381, 390, 394, 400, 402, 409, 411, 413, 422, 426, 432, |
| 154686 | + 438, 446, 451, 451, 451, 467, 476, 483, 484, 491, 494, 503, 506, |
| 154687 | + 511, 516, 523, 528, 537, 541, 545, 547, 551, 559, 565, 568, 573, |
| 154688 | + 581, 581, 585, 594, 599, 604, 610, 613, 616, 619, 621, 626, 630, |
| 153875 | 154689 | }; |
| 153876 | 154690 | /* aKWCode[i] is the parser symbol code for the i-th keyword */ |
| 153877 | | -static const unsigned char aKWCode[140] = { |
| 154691 | +static const unsigned char aKWCode[143] = { |
| 153878 | 154692 | TK_REINDEX, TK_INDEXED, TK_INDEX, TK_DESC, TK_ESCAPE, |
| 153879 | 154693 | TK_EACH, TK_CHECK, TK_KEY, TK_BEFORE, TK_FOREIGN, |
| 153880 | 154694 | TK_FOR, TK_IGNORE, TK_LIKE_KW, TK_EXPLAIN, TK_INSTEAD, |
| 153881 | 154695 | TK_ADD, TK_DATABASE, TK_AS, TK_SELECT, TK_TABLE, |
| 153882 | 154696 | TK_JOIN_KW, TK_THEN, TK_END, TK_DEFERRABLE, TK_ELSE, |
| 153883 | 154697 | TK_EXCLUDE, TK_DELETE, TK_TEMP, TK_TEMP, TK_OR, |
| 153884 | | - TK_CONSTRAINT, TK_INTERSECT, TK_TIES, TK_SAVEPOINT, TK_INTO, |
| 153885 | | - TK_OFFSET, TK_OF, TK_SET, TK_TRANSACTION,TK_ACTION, |
| 153886 | | - TK_ON, TK_JOIN_KW, TK_ALTER, TK_RAISE, TK_EXCEPT, |
| 153887 | | - TK_TRIGGER, TK_REFERENCES, TK_UNIQUE, TK_QUERY, TK_WITHOUT, |
| 153888 | | - TK_WITH, TK_JOIN_KW, TK_RELEASE, TK_EXCLUSIVE, TK_EXISTS, |
| 153889 | | - TK_ATTACH, TK_HAVING, TK_LIKE_KW, TK_BEGIN, TK_JOIN_KW, |
| 153890 | | - TK_RANGE, TK_BETWEEN, TK_NOTHING, TK_GROUPS, TK_GROUP, |
| 153891 | | - TK_CASCADE, TK_ASC, TK_DETACH, TK_CASE, TK_COLLATE, |
| 153892 | | - TK_CREATE, TK_CTIME_KW, TK_IMMEDIATE, TK_JOIN, TK_INSERT, |
| 153893 | | - TK_LIKE_KW, TK_MATCH, TK_PLAN, TK_ANALYZE, TK_PRAGMA, |
| 153894 | | - TK_ABORT, TK_UPDATE, TK_VALUES, TK_VIRTUAL, TK_LIMIT, |
| 153895 | | - TK_WHEN, TK_NOTNULL, TK_NOT, TK_NO, TK_NULL, |
| 153896 | | - TK_WHERE, TK_RECURSIVE, TK_AFTER, TK_RENAME, TK_AND, |
| 153897 | | - TK_DEFAULT, TK_AUTOINCR, TK_TO, TK_IN, TK_CAST, |
| 153898 | | - TK_COLUMNKW, TK_COMMIT, TK_CONFLICT, TK_JOIN_KW, TK_CTIME_KW, |
| 153899 | | - TK_CTIME_KW, TK_CURRENT, TK_PARTITION, TK_DEFERRED, TK_DISTINCT, |
| 153900 | | - TK_IS, TK_DROP, TK_PRECEDING, TK_FAIL, TK_FILTER, |
| 153901 | | - TK_REPLACE, TK_FOLLOWING, TK_FROM, TK_JOIN_KW, TK_IF, |
| 153902 | | - TK_ISNULL, TK_ORDER, TK_RESTRICT, TK_OTHERS, TK_OVER, |
| 153903 | | - TK_JOIN_KW, TK_ROLLBACK, TK_ROWS, TK_ROW, TK_UNBOUNDED, |
| 153904 | | - TK_UNION, TK_USING, TK_VACUUM, TK_VIEW, TK_WINDOW, |
| 153905 | | - TK_DO, TK_BY, TK_INITIALLY, TK_ALL, TK_PRIMARY, |
| 154698 | + TK_ISNULL, TK_NULLS, TK_SAVEPOINT, TK_INTERSECT, TK_TIES, |
| 154699 | + TK_NOTNULL, TK_NOT, TK_NO, TK_NULL, TK_LIKE_KW, |
| 154700 | + TK_EXCEPT, TK_TRANSACTION,TK_ACTION, TK_ON, TK_JOIN_KW, |
| 154701 | + TK_ALTER, TK_RAISE, TK_EXCLUSIVE, TK_EXISTS, TK_CONSTRAINT, |
| 154702 | + TK_INTO, TK_OFFSET, TK_OF, TK_SET, TK_TRIGGER, |
| 154703 | + TK_REFERENCES, TK_UNIQUE, TK_QUERY, TK_WITHOUT, TK_WITH, |
| 154704 | + TK_JOIN_KW, TK_RELEASE, TK_ATTACH, TK_HAVING, TK_LIKE_KW, |
| 154705 | + TK_BEGIN, TK_JOIN_KW, TK_RANGE, TK_BETWEEN, TK_NOTHING, |
| 154706 | + TK_GROUPS, TK_GROUP, TK_CASCADE, TK_ASC, TK_DETACH, |
| 154707 | + TK_CASE, TK_COLLATE, TK_CREATE, TK_CTIME_KW, TK_IMMEDIATE, |
| 154708 | + TK_JOIN, TK_INSERT, TK_MATCH, TK_PLAN, TK_ANALYZE, |
| 154709 | + TK_PRAGMA, TK_ABORT, TK_UPDATE, TK_VALUES, TK_VIRTUAL, |
| 154710 | + TK_LAST, TK_WHEN, TK_WHERE, TK_RECURSIVE, TK_AFTER, |
| 154711 | + TK_RENAME, TK_AND, TK_DEFAULT, TK_AUTOINCR, TK_TO, |
| 154712 | + TK_IN, TK_CAST, TK_COLUMNKW, TK_COMMIT, TK_CONFLICT, |
| 154713 | + TK_JOIN_KW, TK_CTIME_KW, TK_CTIME_KW, TK_CURRENT, TK_PARTITION, |
| 154714 | + TK_DEFERRED, TK_DISTINCT, TK_IS, TK_DROP, TK_PRECEDING, |
| 154715 | + TK_FAIL, TK_LIMIT, TK_FILTER, TK_REPLACE, TK_FIRST, |
| 154716 | + TK_FOLLOWING, TK_FROM, TK_JOIN_KW, TK_IF, TK_ORDER, |
| 154717 | + TK_RESTRICT, TK_OTHERS, TK_OVER, TK_JOIN_KW, TK_ROLLBACK, |
| 154718 | + TK_ROWS, TK_ROW, TK_UNBOUNDED, TK_UNION, TK_USING, |
| 154719 | + TK_VACUUM, TK_VIEW, TK_WINDOW, TK_DO, TK_BY, |
| 154720 | + TK_INITIALLY, TK_ALL, TK_PRIMARY, |
| 153906 | 154721 | }; |
| 153907 | 154722 | /* Check to see if z[0..n-1] is a keyword. If it is, write the |
| 153908 | 154723 | ** parser symbol code for that keyword into *pType. Always |
| 153909 | 154724 | ** return the integer n (the length of the token). */ |
| 153910 | 154725 | static int keywordCode(const char *z, int n, int *pType){ |
| | @@ -153951,120 +154766,123 @@ |
| 153951 | 154766 | testcase( i==25 ); /* EXCLUDE */ |
| 153952 | 154767 | testcase( i==26 ); /* DELETE */ |
| 153953 | 154768 | testcase( i==27 ); /* TEMPORARY */ |
| 153954 | 154769 | testcase( i==28 ); /* TEMP */ |
| 153955 | 154770 | testcase( i==29 ); /* OR */ |
| 153956 | | - testcase( i==30 ); /* CONSTRAINT */ |
| 153957 | | - testcase( i==31 ); /* INTERSECT */ |
| 153958 | | - testcase( i==32 ); /* TIES */ |
| 153959 | | - testcase( i==33 ); /* SAVEPOINT */ |
| 153960 | | - testcase( i==34 ); /* INTO */ |
| 153961 | | - testcase( i==35 ); /* OFFSET */ |
| 153962 | | - testcase( i==36 ); /* OF */ |
| 153963 | | - testcase( i==37 ); /* SET */ |
| 153964 | | - testcase( i==38 ); /* TRANSACTION */ |
| 153965 | | - testcase( i==39 ); /* ACTION */ |
| 153966 | | - testcase( i==40 ); /* ON */ |
| 153967 | | - testcase( i==41 ); /* NATURAL */ |
| 153968 | | - testcase( i==42 ); /* ALTER */ |
| 153969 | | - testcase( i==43 ); /* RAISE */ |
| 153970 | | - testcase( i==44 ); /* EXCEPT */ |
| 153971 | | - testcase( i==45 ); /* TRIGGER */ |
| 153972 | | - testcase( i==46 ); /* REFERENCES */ |
| 153973 | | - testcase( i==47 ); /* UNIQUE */ |
| 153974 | | - testcase( i==48 ); /* QUERY */ |
| 153975 | | - testcase( i==49 ); /* WITHOUT */ |
| 153976 | | - testcase( i==50 ); /* WITH */ |
| 153977 | | - testcase( i==51 ); /* OUTER */ |
| 153978 | | - testcase( i==52 ); /* RELEASE */ |
| 153979 | | - testcase( i==53 ); /* EXCLUSIVE */ |
| 153980 | | - testcase( i==54 ); /* EXISTS */ |
| 153981 | | - testcase( i==55 ); /* ATTACH */ |
| 153982 | | - testcase( i==56 ); /* HAVING */ |
| 153983 | | - testcase( i==57 ); /* GLOB */ |
| 153984 | | - testcase( i==58 ); /* BEGIN */ |
| 153985 | | - testcase( i==59 ); /* INNER */ |
| 153986 | | - testcase( i==60 ); /* RANGE */ |
| 153987 | | - testcase( i==61 ); /* BETWEEN */ |
| 153988 | | - testcase( i==62 ); /* NOTHING */ |
| 153989 | | - testcase( i==63 ); /* GROUPS */ |
| 153990 | | - testcase( i==64 ); /* GROUP */ |
| 153991 | | - testcase( i==65 ); /* CASCADE */ |
| 153992 | | - testcase( i==66 ); /* ASC */ |
| 153993 | | - testcase( i==67 ); /* DETACH */ |
| 153994 | | - testcase( i==68 ); /* CASE */ |
| 153995 | | - testcase( i==69 ); /* COLLATE */ |
| 153996 | | - testcase( i==70 ); /* CREATE */ |
| 153997 | | - testcase( i==71 ); /* CURRENT_DATE */ |
| 153998 | | - testcase( i==72 ); /* IMMEDIATE */ |
| 153999 | | - testcase( i==73 ); /* JOIN */ |
| 154000 | | - testcase( i==74 ); /* INSERT */ |
| 154001 | | - testcase( i==75 ); /* LIKE */ |
| 154002 | | - testcase( i==76 ); /* MATCH */ |
| 154003 | | - testcase( i==77 ); /* PLAN */ |
| 154004 | | - testcase( i==78 ); /* ANALYZE */ |
| 154005 | | - testcase( i==79 ); /* PRAGMA */ |
| 154006 | | - testcase( i==80 ); /* ABORT */ |
| 154007 | | - testcase( i==81 ); /* UPDATE */ |
| 154008 | | - testcase( i==82 ); /* VALUES */ |
| 154009 | | - testcase( i==83 ); /* VIRTUAL */ |
| 154010 | | - testcase( i==84 ); /* LIMIT */ |
| 154011 | | - testcase( i==85 ); /* WHEN */ |
| 154012 | | - testcase( i==86 ); /* NOTNULL */ |
| 154013 | | - testcase( i==87 ); /* NOT */ |
| 154014 | | - testcase( i==88 ); /* NO */ |
| 154015 | | - testcase( i==89 ); /* NULL */ |
| 154016 | | - testcase( i==90 ); /* WHERE */ |
| 154017 | | - testcase( i==91 ); /* RECURSIVE */ |
| 154018 | | - testcase( i==92 ); /* AFTER */ |
| 154019 | | - testcase( i==93 ); /* RENAME */ |
| 154020 | | - testcase( i==94 ); /* AND */ |
| 154021 | | - testcase( i==95 ); /* DEFAULT */ |
| 154022 | | - testcase( i==96 ); /* AUTOINCREMENT */ |
| 154023 | | - testcase( i==97 ); /* TO */ |
| 154024 | | - testcase( i==98 ); /* IN */ |
| 154025 | | - testcase( i==99 ); /* CAST */ |
| 154026 | | - testcase( i==100 ); /* COLUMN */ |
| 154027 | | - testcase( i==101 ); /* COMMIT */ |
| 154028 | | - testcase( i==102 ); /* CONFLICT */ |
| 154029 | | - testcase( i==103 ); /* CROSS */ |
| 154030 | | - testcase( i==104 ); /* CURRENT_TIMESTAMP */ |
| 154031 | | - testcase( i==105 ); /* CURRENT_TIME */ |
| 154032 | | - testcase( i==106 ); /* CURRENT */ |
| 154033 | | - testcase( i==107 ); /* PARTITION */ |
| 154034 | | - testcase( i==108 ); /* DEFERRED */ |
| 154035 | | - testcase( i==109 ); /* DISTINCT */ |
| 154036 | | - testcase( i==110 ); /* IS */ |
| 154037 | | - testcase( i==111 ); /* DROP */ |
| 154038 | | - testcase( i==112 ); /* PRECEDING */ |
| 154039 | | - testcase( i==113 ); /* FAIL */ |
| 154040 | | - testcase( i==114 ); /* FILTER */ |
| 154041 | | - testcase( i==115 ); /* REPLACE */ |
| 154042 | | - testcase( i==116 ); /* FOLLOWING */ |
| 154043 | | - testcase( i==117 ); /* FROM */ |
| 154044 | | - testcase( i==118 ); /* FULL */ |
| 154045 | | - testcase( i==119 ); /* IF */ |
| 154046 | | - testcase( i==120 ); /* ISNULL */ |
| 154047 | | - testcase( i==121 ); /* ORDER */ |
| 154048 | | - testcase( i==122 ); /* RESTRICT */ |
| 154049 | | - testcase( i==123 ); /* OTHERS */ |
| 154050 | | - testcase( i==124 ); /* OVER */ |
| 154051 | | - testcase( i==125 ); /* RIGHT */ |
| 154052 | | - testcase( i==126 ); /* ROLLBACK */ |
| 154053 | | - testcase( i==127 ); /* ROWS */ |
| 154054 | | - testcase( i==128 ); /* ROW */ |
| 154055 | | - testcase( i==129 ); /* UNBOUNDED */ |
| 154056 | | - testcase( i==130 ); /* UNION */ |
| 154057 | | - testcase( i==131 ); /* USING */ |
| 154058 | | - testcase( i==132 ); /* VACUUM */ |
| 154059 | | - testcase( i==133 ); /* VIEW */ |
| 154060 | | - testcase( i==134 ); /* WINDOW */ |
| 154061 | | - testcase( i==135 ); /* DO */ |
| 154062 | | - testcase( i==136 ); /* BY */ |
| 154063 | | - testcase( i==137 ); /* INITIALLY */ |
| 154064 | | - testcase( i==138 ); /* ALL */ |
| 154065 | | - testcase( i==139 ); /* PRIMARY */ |
| 154771 | + testcase( i==30 ); /* ISNULL */ |
| 154772 | + testcase( i==31 ); /* NULLS */ |
| 154773 | + testcase( i==32 ); /* SAVEPOINT */ |
| 154774 | + testcase( i==33 ); /* INTERSECT */ |
| 154775 | + testcase( i==34 ); /* TIES */ |
| 154776 | + testcase( i==35 ); /* NOTNULL */ |
| 154777 | + testcase( i==36 ); /* NOT */ |
| 154778 | + testcase( i==37 ); /* NO */ |
| 154779 | + testcase( i==38 ); /* NULL */ |
| 154780 | + testcase( i==39 ); /* LIKE */ |
| 154781 | + testcase( i==40 ); /* EXCEPT */ |
| 154782 | + testcase( i==41 ); /* TRANSACTION */ |
| 154783 | + testcase( i==42 ); /* ACTION */ |
| 154784 | + testcase( i==43 ); /* ON */ |
| 154785 | + testcase( i==44 ); /* NATURAL */ |
| 154786 | + testcase( i==45 ); /* ALTER */ |
| 154787 | + testcase( i==46 ); /* RAISE */ |
| 154788 | + testcase( i==47 ); /* EXCLUSIVE */ |
| 154789 | + testcase( i==48 ); /* EXISTS */ |
| 154790 | + testcase( i==49 ); /* CONSTRAINT */ |
| 154791 | + testcase( i==50 ); /* INTO */ |
| 154792 | + testcase( i==51 ); /* OFFSET */ |
| 154793 | + testcase( i==52 ); /* OF */ |
| 154794 | + testcase( i==53 ); /* SET */ |
| 154795 | + testcase( i==54 ); /* TRIGGER */ |
| 154796 | + testcase( i==55 ); /* REFERENCES */ |
| 154797 | + testcase( i==56 ); /* UNIQUE */ |
| 154798 | + testcase( i==57 ); /* QUERY */ |
| 154799 | + testcase( i==58 ); /* WITHOUT */ |
| 154800 | + testcase( i==59 ); /* WITH */ |
| 154801 | + testcase( i==60 ); /* OUTER */ |
| 154802 | + testcase( i==61 ); /* RELEASE */ |
| 154803 | + testcase( i==62 ); /* ATTACH */ |
| 154804 | + testcase( i==63 ); /* HAVING */ |
| 154805 | + testcase( i==64 ); /* GLOB */ |
| 154806 | + testcase( i==65 ); /* BEGIN */ |
| 154807 | + testcase( i==66 ); /* INNER */ |
| 154808 | + testcase( i==67 ); /* RANGE */ |
| 154809 | + testcase( i==68 ); /* BETWEEN */ |
| 154810 | + testcase( i==69 ); /* NOTHING */ |
| 154811 | + testcase( i==70 ); /* GROUPS */ |
| 154812 | + testcase( i==71 ); /* GROUP */ |
| 154813 | + testcase( i==72 ); /* CASCADE */ |
| 154814 | + testcase( i==73 ); /* ASC */ |
| 154815 | + testcase( i==74 ); /* DETACH */ |
| 154816 | + testcase( i==75 ); /* CASE */ |
| 154817 | + testcase( i==76 ); /* COLLATE */ |
| 154818 | + testcase( i==77 ); /* CREATE */ |
| 154819 | + testcase( i==78 ); /* CURRENT_DATE */ |
| 154820 | + testcase( i==79 ); /* IMMEDIATE */ |
| 154821 | + testcase( i==80 ); /* JOIN */ |
| 154822 | + testcase( i==81 ); /* INSERT */ |
| 154823 | + testcase( i==82 ); /* MATCH */ |
| 154824 | + testcase( i==83 ); /* PLAN */ |
| 154825 | + testcase( i==84 ); /* ANALYZE */ |
| 154826 | + testcase( i==85 ); /* PRAGMA */ |
| 154827 | + testcase( i==86 ); /* ABORT */ |
| 154828 | + testcase( i==87 ); /* UPDATE */ |
| 154829 | + testcase( i==88 ); /* VALUES */ |
| 154830 | + testcase( i==89 ); /* VIRTUAL */ |
| 154831 | + testcase( i==90 ); /* LAST */ |
| 154832 | + testcase( i==91 ); /* WHEN */ |
| 154833 | + testcase( i==92 ); /* WHERE */ |
| 154834 | + testcase( i==93 ); /* RECURSIVE */ |
| 154835 | + testcase( i==94 ); /* AFTER */ |
| 154836 | + testcase( i==95 ); /* RENAME */ |
| 154837 | + testcase( i==96 ); /* AND */ |
| 154838 | + testcase( i==97 ); /* DEFAULT */ |
| 154839 | + testcase( i==98 ); /* AUTOINCREMENT */ |
| 154840 | + testcase( i==99 ); /* TO */ |
| 154841 | + testcase( i==100 ); /* IN */ |
| 154842 | + testcase( i==101 ); /* CAST */ |
| 154843 | + testcase( i==102 ); /* COLUMN */ |
| 154844 | + testcase( i==103 ); /* COMMIT */ |
| 154845 | + testcase( i==104 ); /* CONFLICT */ |
| 154846 | + testcase( i==105 ); /* CROSS */ |
| 154847 | + testcase( i==106 ); /* CURRENT_TIMESTAMP */ |
| 154848 | + testcase( i==107 ); /* CURRENT_TIME */ |
| 154849 | + testcase( i==108 ); /* CURRENT */ |
| 154850 | + testcase( i==109 ); /* PARTITION */ |
| 154851 | + testcase( i==110 ); /* DEFERRED */ |
| 154852 | + testcase( i==111 ); /* DISTINCT */ |
| 154853 | + testcase( i==112 ); /* IS */ |
| 154854 | + testcase( i==113 ); /* DROP */ |
| 154855 | + testcase( i==114 ); /* PRECEDING */ |
| 154856 | + testcase( i==115 ); /* FAIL */ |
| 154857 | + testcase( i==116 ); /* LIMIT */ |
| 154858 | + testcase( i==117 ); /* FILTER */ |
| 154859 | + testcase( i==118 ); /* REPLACE */ |
| 154860 | + testcase( i==119 ); /* FIRST */ |
| 154861 | + testcase( i==120 ); /* FOLLOWING */ |
| 154862 | + testcase( i==121 ); /* FROM */ |
| 154863 | + testcase( i==122 ); /* FULL */ |
| 154864 | + testcase( i==123 ); /* IF */ |
| 154865 | + testcase( i==124 ); /* ORDER */ |
| 154866 | + testcase( i==125 ); /* RESTRICT */ |
| 154867 | + testcase( i==126 ); /* OTHERS */ |
| 154868 | + testcase( i==127 ); /* OVER */ |
| 154869 | + testcase( i==128 ); /* RIGHT */ |
| 154870 | + testcase( i==129 ); /* ROLLBACK */ |
| 154871 | + testcase( i==130 ); /* ROWS */ |
| 154872 | + testcase( i==131 ); /* ROW */ |
| 154873 | + testcase( i==132 ); /* UNBOUNDED */ |
| 154874 | + testcase( i==133 ); /* UNION */ |
| 154875 | + testcase( i==134 ); /* USING */ |
| 154876 | + testcase( i==135 ); /* VACUUM */ |
| 154877 | + testcase( i==136 ); /* VIEW */ |
| 154878 | + testcase( i==137 ); /* WINDOW */ |
| 154879 | + testcase( i==138 ); /* DO */ |
| 154880 | + testcase( i==139 ); /* BY */ |
| 154881 | + testcase( i==140 ); /* INITIALLY */ |
| 154882 | + testcase( i==141 ); /* ALL */ |
| 154883 | + testcase( i==142 ); /* PRIMARY */ |
| 154066 | 154884 | *pType = aKWCode[i]; |
| 154067 | 154885 | break; |
| 154068 | 154886 | } |
| 154069 | 154887 | } |
| 154070 | 154888 | return n; |
| | @@ -154072,11 +154890,11 @@ |
| 154072 | 154890 | SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char *z, int n){ |
| 154073 | 154891 | int id = TK_ID; |
| 154074 | 154892 | keywordCode((char*)z, n, &id); |
| 154075 | 154893 | return id; |
| 154076 | 154894 | } |
| 154077 | | -#define SQLITE_N_KEYWORD 140 |
| 154895 | +#define SQLITE_N_KEYWORD 143 |
| 154078 | 154896 | SQLITE_API int sqlite3_keyword_name(int i,const char **pzName,int *pnName){ |
| 154079 | 154897 | if( i<0 || i>=SQLITE_N_KEYWORD ) return SQLITE_ERROR; |
| 154080 | 154898 | *pzName = zKWText + aKWOffset[i]; |
| 154081 | 154899 | *pnName = aKWLen[i]; |
| 154082 | 154900 | return SQLITE_OK; |
| | @@ -156033,10 +156851,11 @@ |
| 156033 | 156851 | int op; /* The opcode */ |
| 156034 | 156852 | u32 mask; /* Mask of the bit in sqlite3.flags to set/clear */ |
| 156035 | 156853 | } aFlagOp[] = { |
| 156036 | 156854 | { SQLITE_DBCONFIG_ENABLE_FKEY, SQLITE_ForeignKeys }, |
| 156037 | 156855 | { SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_EnableTrigger }, |
| 156856 | + { SQLITE_DBCONFIG_ENABLE_VIEW, SQLITE_EnableView }, |
| 156038 | 156857 | { SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, SQLITE_Fts3Tokenizer }, |
| 156039 | 156858 | { SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, SQLITE_LoadExtension }, |
| 156040 | 156859 | { SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE, SQLITE_NoCkptOnClose }, |
| 156041 | 156860 | { SQLITE_DBCONFIG_ENABLE_QPSG, SQLITE_EnableQPSG }, |
| 156042 | 156861 | { SQLITE_DBCONFIG_TRIGGER_EQP, SQLITE_TriggerEQP }, |
| | @@ -156432,15 +157251,12 @@ |
| 156432 | 157251 | } |
| 156433 | 157252 | sqlite3HashClear(&db->aCollSeq); |
| 156434 | 157253 | #ifndef SQLITE_OMIT_VIRTUALTABLE |
| 156435 | 157254 | for(i=sqliteHashFirst(&db->aModule); i; i=sqliteHashNext(i)){ |
| 156436 | 157255 | Module *pMod = (Module *)sqliteHashData(i); |
| 156437 | | - if( pMod->xDestroy ){ |
| 156438 | | - pMod->xDestroy(pMod->pAux); |
| 156439 | | - } |
| 156440 | 157256 | sqlite3VtabEponymousTableClear(db, pMod); |
| 156441 | | - sqlite3DbFree(db, pMod); |
| 157257 | + sqlite3VtabModuleUnref(db, pMod); |
| 156442 | 157258 | } |
| 156443 | 157259 | sqlite3HashClear(&db->aModule); |
| 156444 | 157260 | #endif |
| 156445 | 157261 | |
| 156446 | 157262 | sqlite3Error(db, SQLITE_OK); /* Deallocates any cached error strings. */ |
| | @@ -156917,11 +157733,12 @@ |
| 156917 | 157733 | ){ |
| 156918 | 157734 | return SQLITE_MISUSE_BKPT; |
| 156919 | 157735 | } |
| 156920 | 157736 | |
| 156921 | 157737 | assert( SQLITE_FUNC_CONSTANT==SQLITE_DETERMINISTIC ); |
| 156922 | | - extraFlags = enc & SQLITE_DETERMINISTIC; |
| 157738 | + assert( SQLITE_FUNC_DIRECT==SQLITE_DIRECTONLY ); |
| 157739 | + extraFlags = enc & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY); |
| 156923 | 157740 | enc &= (SQLITE_FUNC_ENCMASK|SQLITE_ANY); |
| 156924 | 157741 | |
| 156925 | 157742 | #ifndef SQLITE_OMIT_UTF16 |
| 156926 | 157743 | /* If SQLITE_UTF16 is specified as the encoding type, transform this |
| 156927 | 157744 | ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the |
| | @@ -156980,10 +157797,11 @@ |
| 156980 | 157797 | pDestructor->nRef++; |
| 156981 | 157798 | } |
| 156982 | 157799 | p->u.pDestructor = pDestructor; |
| 156983 | 157800 | p->funcFlags = (p->funcFlags & SQLITE_FUNC_ENCMASK) | extraFlags; |
| 156984 | 157801 | testcase( p->funcFlags & SQLITE_DETERMINISTIC ); |
| 157802 | + testcase( p->funcFlags & SQLITE_DIRECTONLY ); |
| 156985 | 157803 | p->xSFunc = xSFunc ? xSFunc : xStep; |
| 156986 | 157804 | p->xFinalize = xFinal; |
| 156987 | 157805 | p->xValue = xValue; |
| 156988 | 157806 | p->xInverse = xInverse; |
| 156989 | 157807 | p->pUserData = pUserData; |
| | @@ -158272,10 +159090,11 @@ |
| 158272 | 159090 | db->szMmap = sqlite3GlobalConfig.szMmap; |
| 158273 | 159091 | db->nextPagesize = 0; |
| 158274 | 159092 | db->nMaxSorterMmap = 0x7FFFFFFF; |
| 158275 | 159093 | db->flags |= SQLITE_ShortColNames |
| 158276 | 159094 | | SQLITE_EnableTrigger |
| 159095 | + | SQLITE_EnableView |
| 158277 | 159096 | | SQLITE_CacheSpill |
| 158278 | 159097 | |
| 158279 | 159098 | /* The SQLITE_DQS compile-time option determines the default settings |
| 158280 | 159099 | ** for SQLITE_DBCONFIG_DQS_DDL and SQLITE_DBCONFIG_DQS_DML. |
| 158281 | 159100 | ** |
| | @@ -159021,16 +159840,37 @@ |
| 159021 | 159840 | case SQLITE_TESTCTRL_PRNG_RESTORE: { |
| 159022 | 159841 | sqlite3PrngRestoreState(); |
| 159023 | 159842 | break; |
| 159024 | 159843 | } |
| 159025 | 159844 | |
| 159026 | | - /* |
| 159027 | | - ** Reset the PRNG back to its uninitialized state. The next call |
| 159028 | | - ** to sqlite3_randomness() will reseed the PRNG using a single call |
| 159029 | | - ** to the xRandomness method of the default VFS. |
| 159845 | + /* sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SEED, int x, sqlite3 *db); |
| 159846 | + ** |
| 159847 | + ** Control the seed for the pseudo-random number generator (PRNG) that |
| 159848 | + ** is built into SQLite. Cases: |
| 159849 | + ** |
| 159850 | + ** x!=0 && db!=0 Seed the PRNG to the current value of the |
| 159851 | + ** schema cookie in the main database for db, or |
| 159852 | + ** x if the schema cookie is zero. This case |
| 159853 | + ** is convenient to use with database fuzzers |
| 159854 | + ** as it allows the fuzzer some control over the |
| 159855 | + ** the PRNG seed. |
| 159856 | + ** |
| 159857 | + ** x!=0 && db==0 Seed the PRNG to the value of x. |
| 159858 | + ** |
| 159859 | + ** x==0 && db==0 Revert to default behavior of using the |
| 159860 | + ** xRandomness method on the primary VFS. |
| 159861 | + ** |
| 159862 | + ** This test-control also resets the PRNG so that the new seed will |
| 159863 | + ** be used for the next call to sqlite3_randomness(). |
| 159030 | 159864 | */ |
| 159031 | | - case SQLITE_TESTCTRL_PRNG_RESET: { |
| 159865 | + case SQLITE_TESTCTRL_PRNG_SEED: { |
| 159866 | + int x = va_arg(ap, int); |
| 159867 | + int y; |
| 159868 | + sqlite3 *db = va_arg(ap, sqlite3*); |
| 159869 | + assert( db==0 || db->aDb[0].pSchema!=0 ); |
| 159870 | + if( db && (y = db->aDb[0].pSchema->schema_cookie)!=0 ){ x = y; } |
| 159871 | + sqlite3Config.iPrngSeed = x; |
| 159032 | 159872 | sqlite3_randomness(0,0); |
| 159033 | 159873 | break; |
| 159034 | 159874 | } |
| 159035 | 159875 | |
| 159036 | 159876 | /* |
| | @@ -159238,10 +160078,21 @@ |
| 159238 | 160078 | */ |
| 159239 | 160079 | case SQLITE_TESTCTRL_NEVER_CORRUPT: { |
| 159240 | 160080 | sqlite3GlobalConfig.neverCorrupt = va_arg(ap, int); |
| 159241 | 160081 | break; |
| 159242 | 160082 | } |
| 160083 | + |
| 160084 | + /* sqlite3_test_control(SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS, int); |
| 160085 | + ** |
| 160086 | + ** Set or clear a flag that causes SQLite to verify that type, name, |
| 160087 | + ** and tbl_name fields of the sqlite_master table. This is normally |
| 160088 | + ** on, but it is sometimes useful to turn it off for testing. |
| 160089 | + */ |
| 160090 | + case SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS: { |
| 160091 | + sqlite3GlobalConfig.bExtraSchemaChecks = va_arg(ap, int); |
| 160092 | + break; |
| 160093 | + } |
| 159243 | 160094 | |
| 159244 | 160095 | /* Set the threshold at which OP_Once counters reset back to zero. |
| 159245 | 160096 | ** By default this is 0x7ffffffe (over 2 billion), but that value is |
| 159246 | 160097 | ** too big to test in a reasonable amount of time, so this control is |
| 159247 | 160098 | ** provided to set a small and easily reachable reset value. |
| | @@ -174941,10 +175792,11 @@ |
| 174941 | 175792 | blobGrowBuffer(pPrev, nTerm, &rc); |
| 174942 | 175793 | if( rc!=SQLITE_OK ) return rc; |
| 174943 | 175794 | |
| 174944 | 175795 | nPrefix = fts3PrefixCompress(pPrev->a, pPrev->n, zTerm, nTerm); |
| 174945 | 175796 | nSuffix = nTerm - nPrefix; |
| 175797 | + if( nSuffix<=0 ) return FTS_CORRUPT_VTAB; |
| 174946 | 175798 | memcpy(pPrev->a, zTerm, nTerm); |
| 174947 | 175799 | pPrev->n = nTerm; |
| 174948 | 175800 | |
| 174949 | 175801 | if( bFirst==0 ){ |
| 174950 | 175802 | pNode->n += sqlite3Fts3PutVarint(&pNode->a[pNode->n], nPrefix); |
| | @@ -177161,14 +178013,14 @@ |
| 177161 | 178013 | char *pCsr = pPhrase->pTail; |
| 177162 | 178014 | int iCsr = pPhrase->iTail; |
| 177163 | 178015 | |
| 177164 | 178016 | while( iCsr<(iStart+pIter->nSnippet) && iCsr>=iStart ){ |
| 177165 | 178017 | int j; |
| 177166 | | - u64 mPhrase = (u64)1 << i; |
| 178018 | + u64 mPhrase = (u64)1 << (i%64); |
| 177167 | 178019 | u64 mPos = (u64)1 << (iCsr - iStart); |
| 177168 | 178020 | assert( iCsr>=iStart && (iCsr - iStart)<=64 ); |
| 177169 | | - assert( i>=0 && i<=64 ); |
| 178021 | + assert( i>=0 ); |
| 177170 | 178022 | if( (mCover|mCovered)&mPhrase ){ |
| 177171 | 178023 | iScore++; |
| 177172 | 178024 | }else{ |
| 177173 | 178025 | iScore += 1000; |
| 177174 | 178026 | } |
| | @@ -180325,10 +181177,11 @@ |
| 180325 | 181177 | ){ |
| 180326 | 181178 | u32 i, j, nKey; |
| 180327 | 181179 | const char *zKey; |
| 180328 | 181180 | JsonNode *pRoot = &pParse->aNode[iRoot]; |
| 180329 | 181181 | if( zPath[0]==0 ) return pRoot; |
| 181182 | + if( pRoot->jnFlags & JNODE_REPLACE ) return 0; |
| 180330 | 181183 | if( zPath[0]=='.' ){ |
| 180331 | 181184 | if( pRoot->eType!=JSON_OBJECT ) return 0; |
| 180332 | 181185 | zPath++; |
| 180333 | 181186 | if( zPath[0]=='"' ){ |
| 180334 | 181187 | zKey = zPath + 1; |
| | @@ -182455,18 +183308,20 @@ |
| 182455 | 183308 | |
| 182456 | 183309 | /* Check if the requested node is already in the hash table. If so, |
| 182457 | 183310 | ** increase its reference count and return it. |
| 182458 | 183311 | */ |
| 182459 | 183312 | if( (pNode = nodeHashLookup(pRtree, iNode))!=0 ){ |
| 182460 | | - assert( !pParent || !pNode->pParent || pNode->pParent==pParent ); |
| 182461 | 183313 | if( pParent && !pNode->pParent ){ |
| 182462 | 183314 | if( nodeInParentChain(pNode, pParent) ){ |
| 182463 | 183315 | RTREE_IS_CORRUPT(pRtree); |
| 182464 | 183316 | return SQLITE_CORRUPT_VTAB; |
| 182465 | 183317 | } |
| 182466 | 183318 | pParent->nRef++; |
| 182467 | 183319 | pNode->pParent = pParent; |
| 183320 | + }else if( pParent && pNode->pParent && pParent!=pNode->pParent ){ |
| 183321 | + RTREE_IS_CORRUPT(pRtree); |
| 183322 | + return SQLITE_CORRUPT_VTAB; |
| 182468 | 183323 | } |
| 182469 | 183324 | pNode->nRef++; |
| 182470 | 183325 | *ppNode = pNode; |
| 182471 | 183326 | return SQLITE_OK; |
| 182472 | 183327 | } |
| | @@ -183350,17 +184205,18 @@ |
| 183350 | 184205 | int eInt; |
| 183351 | 184206 | RtreeSearchPoint x; |
| 183352 | 184207 | |
| 183353 | 184208 | eInt = pRtree->eCoordType==RTREE_COORD_INT32; |
| 183354 | 184209 | while( (p = rtreeSearchPointFirst(pCur))!=0 && p->iLevel>0 ){ |
| 184210 | + u8 *pCellData; |
| 183355 | 184211 | pNode = rtreeNodeOfFirstSearchPoint(pCur, &rc); |
| 183356 | 184212 | if( rc ) return rc; |
| 183357 | 184213 | nCell = NCELL(pNode); |
| 183358 | 184214 | assert( nCell<200 ); |
| 184215 | + pCellData = pNode->zData + (4+pRtree->nBytesPerCell*p->iCell); |
| 183359 | 184216 | while( p->iCell<nCell ){ |
| 183360 | 184217 | sqlite3_rtree_dbl rScore = (sqlite3_rtree_dbl)-1; |
| 183361 | | - u8 *pCellData = pNode->zData + (4+pRtree->nBytesPerCell*p->iCell); |
| 183362 | 184218 | eWithin = FULLY_WITHIN; |
| 183363 | 184219 | for(ii=0; ii<nConstraint; ii++){ |
| 183364 | 184220 | RtreeConstraint *pConstraint = pCur->aConstraint + ii; |
| 183365 | 184221 | if( pConstraint->op>=RTREE_MATCH ){ |
| 183366 | 184222 | rc = rtreeCallbackConstraint(pConstraint, eInt, pCellData, p, |
| | @@ -183369,17 +184225,27 @@ |
| 183369 | 184225 | }else if( p->iLevel==1 ){ |
| 183370 | 184226 | rtreeLeafConstraint(pConstraint, eInt, pCellData, &eWithin); |
| 183371 | 184227 | }else{ |
| 183372 | 184228 | rtreeNonleafConstraint(pConstraint, eInt, pCellData, &eWithin); |
| 183373 | 184229 | } |
| 183374 | | - if( eWithin==NOT_WITHIN ) break; |
| 184230 | + if( eWithin==NOT_WITHIN ){ |
| 184231 | + p->iCell++; |
| 184232 | + pCellData += pRtree->nBytesPerCell; |
| 184233 | + break; |
| 184234 | + } |
| 183375 | 184235 | } |
| 183376 | | - p->iCell++; |
| 183377 | 184236 | if( eWithin==NOT_WITHIN ) continue; |
| 184237 | + p->iCell++; |
| 183378 | 184238 | x.iLevel = p->iLevel - 1; |
| 183379 | 184239 | if( x.iLevel ){ |
| 183380 | 184240 | x.id = readInt64(pCellData); |
| 184241 | + for(ii=0; ii<pCur->nPoint; ii++){ |
| 184242 | + if( pCur->aPoint[ii].id==x.id ){ |
| 184243 | + RTREE_IS_CORRUPT(pRtree); |
| 184244 | + return SQLITE_CORRUPT_VTAB; |
| 184245 | + } |
| 184246 | + } |
| 183381 | 184247 | x.iCell = 0; |
| 183382 | 184248 | }else{ |
| 183383 | 184249 | x.id = p->id; |
| 183384 | 184250 | x.iCell = p->iCell - 1; |
| 183385 | 184251 | } |
| | @@ -189683,10 +190549,11 @@ |
| 189683 | 190549 | "CREATE TABLE IF NOT EXISTS %s.rbu_state(k INTEGER PRIMARY KEY, v)" |
| 189684 | 190550 | |
| 189685 | 190551 | typedef struct RbuFrame RbuFrame; |
| 189686 | 190552 | typedef struct RbuObjIter RbuObjIter; |
| 189687 | 190553 | typedef struct RbuState RbuState; |
| 190554 | +typedef struct RbuSpan RbuSpan; |
| 189688 | 190555 | typedef struct rbu_vfs rbu_vfs; |
| 189689 | 190556 | typedef struct rbu_file rbu_file; |
| 189690 | 190557 | typedef struct RbuUpdateStmt RbuUpdateStmt; |
| 189691 | 190558 | |
| 189692 | 190559 | #if !defined(SQLITE_AMALGAMATION) |
| | @@ -189726,10 +190593,15 @@ |
| 189726 | 190593 | struct RbuUpdateStmt { |
| 189727 | 190594 | char *zMask; /* Copy of update mask used with pUpdate */ |
| 189728 | 190595 | sqlite3_stmt *pUpdate; /* Last update statement (or NULL) */ |
| 189729 | 190596 | RbuUpdateStmt *pNext; |
| 189730 | 190597 | }; |
| 190598 | + |
| 190599 | +struct RbuSpan { |
| 190600 | + const char *zSpan; |
| 190601 | + int nSpan; |
| 190602 | +}; |
| 189731 | 190603 | |
| 189732 | 190604 | /* |
| 189733 | 190605 | ** An iterator of this type is used to iterate through all objects in |
| 189734 | 190606 | ** the target database that require updating. For each such table, the |
| 189735 | 190607 | ** iterator visits, in order: |
| | @@ -189776,10 +190648,13 @@ |
| 189776 | 190648 | int nCol; /* Number of columns in current object */ |
| 189777 | 190649 | sqlite3_stmt *pSelect; /* Source data */ |
| 189778 | 190650 | sqlite3_stmt *pInsert; /* Statement for INSERT operations */ |
| 189779 | 190651 | sqlite3_stmt *pDelete; /* Statement for DELETE ops */ |
| 189780 | 190652 | sqlite3_stmt *pTmpInsert; /* Insert into rbu_tmp_$zDataTbl */ |
| 190653 | + int nIdxCol; |
| 190654 | + RbuSpan *aIdxCol; |
| 190655 | + char *zIdxSql; |
| 189781 | 190656 | |
| 189782 | 190657 | /* Last UPDATE used (for PK b-tree updates only), or NULL. */ |
| 189783 | 190658 | RbuUpdateStmt *pRbuUpdate; |
| 189784 | 190659 | }; |
| 189785 | 190660 | |
| | @@ -190310,17 +191185,22 @@ |
| 190310 | 191185 | RbuUpdateStmt *pTmp = pUp->pNext; |
| 190311 | 191186 | sqlite3_finalize(pUp->pUpdate); |
| 190312 | 191187 | sqlite3_free(pUp); |
| 190313 | 191188 | pUp = pTmp; |
| 190314 | 191189 | } |
| 191190 | + sqlite3_free(pIter->aIdxCol); |
| 191191 | + sqlite3_free(pIter->zIdxSql); |
| 190315 | 191192 | |
| 190316 | 191193 | pIter->pSelect = 0; |
| 190317 | 191194 | pIter->pInsert = 0; |
| 190318 | 191195 | pIter->pDelete = 0; |
| 190319 | 191196 | pIter->pRbuUpdate = 0; |
| 190320 | 191197 | pIter->pTmpInsert = 0; |
| 190321 | 191198 | pIter->nCol = 0; |
| 191199 | + pIter->nIdxCol = 0; |
| 191200 | + pIter->aIdxCol = 0; |
| 191201 | + pIter->zIdxSql = 0; |
| 190322 | 191202 | } |
| 190323 | 191203 | |
| 190324 | 191204 | /* |
| 190325 | 191205 | ** Clean up any resources allocated as part of the iterator object passed |
| 190326 | 191206 | ** as the only argument. |
| | @@ -190431,12 +191311,12 @@ |
| 190431 | 191311 | assert( argc==1 || argc==2 ); |
| 190432 | 191312 | |
| 190433 | 191313 | zIn = (const char*)sqlite3_value_text(argv[0]); |
| 190434 | 191314 | if( zIn ){ |
| 190435 | 191315 | if( rbuIsVacuum(p) ){ |
| 190436 | | - assert( argc==2 ); |
| 190437 | | - if( 0==sqlite3_value_int(argv[1]) ){ |
| 191316 | + assert( argc==2 || argc==1 ); |
| 191317 | + if( argc==1 || 0==sqlite3_value_int(argv[1]) ){ |
| 190438 | 191318 | sqlite3_result_text(pCtx, zIn, -1, SQLITE_STATIC); |
| 190439 | 191319 | } |
| 190440 | 191320 | }else{ |
| 190441 | 191321 | if( strlen(zIn)>4 && memcmp("data", zIn, 4)==0 ){ |
| 190442 | 191322 | int i; |
| | @@ -190590,18 +191470,19 @@ |
| 190590 | 191470 | ** if the allocation succeeds, (*pRc) is left unchanged. |
| 190591 | 191471 | */ |
| 190592 | 191472 | static char *rbuStrndup(const char *zStr, int *pRc){ |
| 190593 | 191473 | char *zRet = 0; |
| 190594 | 191474 | |
| 190595 | | - assert( *pRc==SQLITE_OK ); |
| 190596 | | - if( zStr ){ |
| 190597 | | - size_t nCopy = strlen(zStr) + 1; |
| 190598 | | - zRet = (char*)sqlite3_malloc64(nCopy); |
| 190599 | | - if( zRet ){ |
| 190600 | | - memcpy(zRet, zStr, nCopy); |
| 190601 | | - }else{ |
| 190602 | | - *pRc = SQLITE_NOMEM; |
| 191475 | + if( *pRc==SQLITE_OK ){ |
| 191476 | + if( zStr ){ |
| 191477 | + size_t nCopy = strlen(zStr) + 1; |
| 191478 | + zRet = (char*)sqlite3_malloc64(nCopy); |
| 191479 | + if( zRet ){ |
| 191480 | + memcpy(zRet, zStr, nCopy); |
| 191481 | + }else{ |
| 191482 | + *pRc = SQLITE_NOMEM; |
| 191483 | + } |
| 190603 | 191484 | } |
| 190604 | 191485 | } |
| 190605 | 191486 | |
| 190606 | 191487 | return zRet; |
| 190607 | 191488 | } |
| | @@ -190769,10 +191650,13 @@ |
| 190769 | 191650 | sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", zIdx) |
| 190770 | 191651 | ); |
| 190771 | 191652 | while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ |
| 190772 | 191653 | int iCid = sqlite3_column_int(pXInfo, 1); |
| 190773 | 191654 | if( iCid>=0 ) pIter->abIndexed[iCid] = 1; |
| 191655 | + if( iCid==-2 ){ |
| 191656 | + memset(pIter->abIndexed, 0x01, sizeof(u8)*pIter->nTblCol); |
| 191657 | + } |
| 190774 | 191658 | } |
| 190775 | 191659 | rbuFinalize(p, pXInfo); |
| 190776 | 191660 | bIndex = 1; |
| 190777 | 191661 | pIter->nIndex++; |
| 190778 | 191662 | } |
| | @@ -191180,33 +192064,41 @@ |
| 191180 | 192064 | |
| 191181 | 192065 | while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ |
| 191182 | 192066 | int iCid = sqlite3_column_int(pXInfo, 1); |
| 191183 | 192067 | int bDesc = sqlite3_column_int(pXInfo, 3); |
| 191184 | 192068 | const char *zCollate = (const char*)sqlite3_column_text(pXInfo, 4); |
| 191185 | | - const char *zCol; |
| 192069 | + const char *zCol = 0; |
| 191186 | 192070 | const char *zType; |
| 191187 | 192071 | |
| 191188 | | - if( iCid<0 ){ |
| 191189 | | - /* An integer primary key. If the table has an explicit IPK, use |
| 191190 | | - ** its name. Otherwise, use "rbu_rowid". */ |
| 191191 | | - if( pIter->eType==RBU_PK_IPK ){ |
| 191192 | | - int i; |
| 191193 | | - for(i=0; pIter->abTblPk[i]==0; i++); |
| 191194 | | - assert( i<pIter->nTblCol ); |
| 191195 | | - zCol = pIter->azTblCol[i]; |
| 191196 | | - }else if( rbuIsVacuum(p) ){ |
| 191197 | | - zCol = "_rowid_"; |
| 191198 | | - }else{ |
| 191199 | | - zCol = "rbu_rowid"; |
| 191200 | | - } |
| 191201 | | - zType = "INTEGER"; |
| 191202 | | - }else{ |
| 191203 | | - zCol = pIter->azTblCol[iCid]; |
| 191204 | | - zType = pIter->azTblType[iCid]; |
| 191205 | | - } |
| 191206 | | - |
| 191207 | | - zRet = sqlite3_mprintf("%z%s\"%w\" COLLATE %Q", zRet, zCom, zCol, zCollate); |
| 192072 | + if( iCid==-2 ){ |
| 192073 | + int iSeq = sqlite3_column_int(pXInfo, 0); |
| 192074 | + zRet = sqlite3_mprintf("%z%s(%.*s) COLLATE %Q", zRet, zCom, |
| 192075 | + pIter->aIdxCol[iSeq].nSpan, pIter->aIdxCol[iSeq].zSpan, zCollate |
| 192076 | + ); |
| 192077 | + zType = ""; |
| 192078 | + }else { |
| 192079 | + if( iCid<0 ){ |
| 192080 | + /* An integer primary key. If the table has an explicit IPK, use |
| 192081 | + ** its name. Otherwise, use "rbu_rowid". */ |
| 192082 | + if( pIter->eType==RBU_PK_IPK ){ |
| 192083 | + int i; |
| 192084 | + for(i=0; pIter->abTblPk[i]==0; i++); |
| 192085 | + assert( i<pIter->nTblCol ); |
| 192086 | + zCol = pIter->azTblCol[i]; |
| 192087 | + }else if( rbuIsVacuum(p) ){ |
| 192088 | + zCol = "_rowid_"; |
| 192089 | + }else{ |
| 192090 | + zCol = "rbu_rowid"; |
| 192091 | + } |
| 192092 | + zType = "INTEGER"; |
| 192093 | + }else{ |
| 192094 | + zCol = pIter->azTblCol[iCid]; |
| 192095 | + zType = pIter->azTblType[iCid]; |
| 192096 | + } |
| 192097 | + zRet = sqlite3_mprintf("%z%s\"%w\" COLLATE %Q", zRet, zCom,zCol,zCollate); |
| 192098 | + } |
| 192099 | + |
| 191208 | 192100 | if( pIter->bUnique==0 || sqlite3_column_int(pXInfo, 5) ){ |
| 191209 | 192101 | const char *zOrder = (bDesc ? " DESC" : ""); |
| 191210 | 192102 | zImpPK = sqlite3_mprintf("%z%s\"rbu_imp_%d%w\"%s", |
| 191211 | 192103 | zImpPK, zCom, nBind, zCol, zOrder |
| 191212 | 192104 | ); |
| | @@ -191682,34 +192574,65 @@ |
| 191682 | 192574 | static char *rbuObjIterGetIndexWhere(sqlite3rbu *p, RbuObjIter *pIter){ |
| 191683 | 192575 | sqlite3_stmt *pStmt = 0; |
| 191684 | 192576 | int rc = p->rc; |
| 191685 | 192577 | char *zRet = 0; |
| 191686 | 192578 | |
| 192579 | + assert( pIter->zIdxSql==0 && pIter->nIdxCol==0 && pIter->aIdxCol==0 ); |
| 192580 | + |
| 191687 | 192581 | if( rc==SQLITE_OK ){ |
| 191688 | 192582 | rc = prepareAndCollectError(p->dbMain, &pStmt, &p->zErrmsg, |
| 191689 | 192583 | "SELECT trim(sql) FROM sqlite_master WHERE type='index' AND name=?" |
| 191690 | 192584 | ); |
| 191691 | 192585 | } |
| 191692 | 192586 | if( rc==SQLITE_OK ){ |
| 191693 | 192587 | int rc2; |
| 191694 | 192588 | rc = sqlite3_bind_text(pStmt, 1, pIter->zIdx, -1, SQLITE_STATIC); |
| 191695 | 192589 | if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ |
| 191696 | | - const char *zSql = (const char*)sqlite3_column_text(pStmt, 0); |
| 192590 | + char *zSql = (char*)sqlite3_column_text(pStmt, 0); |
| 192591 | + if( zSql ){ |
| 192592 | + pIter->zIdxSql = zSql = rbuStrndup(zSql, &rc); |
| 192593 | + } |
| 191697 | 192594 | if( zSql ){ |
| 191698 | 192595 | int nParen = 0; /* Number of open parenthesis */ |
| 191699 | 192596 | int i; |
| 192597 | + int iIdxCol = 0; |
| 192598 | + int nIdxAlloc = 0; |
| 191700 | 192599 | for(i=0; zSql[i]; i++){ |
| 191701 | 192600 | char c = zSql[i]; |
| 192601 | + |
| 192602 | + /* If necessary, grow the pIter->aIdxCol[] array */ |
| 192603 | + if( iIdxCol==nIdxAlloc ){ |
| 192604 | + RbuSpan *aIdxCol = (RbuSpan*)sqlite3_realloc( |
| 192605 | + pIter->aIdxCol, (nIdxAlloc+16)*sizeof(RbuSpan) |
| 192606 | + ); |
| 192607 | + if( aIdxCol==0 ){ |
| 192608 | + rc = SQLITE_NOMEM; |
| 192609 | + break; |
| 192610 | + } |
| 192611 | + pIter->aIdxCol = aIdxCol; |
| 192612 | + nIdxAlloc += 16; |
| 192613 | + } |
| 192614 | + |
| 191702 | 192615 | if( c=='(' ){ |
| 192616 | + if( nParen==0 ){ |
| 192617 | + assert( iIdxCol==0 ); |
| 192618 | + pIter->aIdxCol[0].zSpan = &zSql[i+1]; |
| 192619 | + } |
| 191703 | 192620 | nParen++; |
| 191704 | 192621 | } |
| 191705 | 192622 | else if( c==')' ){ |
| 191706 | 192623 | nParen--; |
| 191707 | 192624 | if( nParen==0 ){ |
| 192625 | + int nSpan = &zSql[i] - pIter->aIdxCol[iIdxCol].zSpan; |
| 192626 | + pIter->aIdxCol[iIdxCol++].nSpan = nSpan; |
| 191708 | 192627 | i++; |
| 191709 | 192628 | break; |
| 191710 | 192629 | } |
| 192630 | + }else if( c==',' && nParen==1 ){ |
| 192631 | + int nSpan = &zSql[i] - pIter->aIdxCol[iIdxCol].zSpan; |
| 192632 | + pIter->aIdxCol[iIdxCol++].nSpan = nSpan; |
| 192633 | + pIter->aIdxCol[iIdxCol].zSpan = &zSql[i+1]; |
| 191711 | 192634 | }else if( c=='"' || c=='\'' || c=='`' ){ |
| 191712 | 192635 | for(i++; 1; i++){ |
| 191713 | 192636 | if( zSql[i]==c ){ |
| 191714 | 192637 | if( zSql[i+1]!=c ) break; |
| 191715 | 192638 | i++; |
| | @@ -191717,15 +192640,23 @@ |
| 191717 | 192640 | } |
| 191718 | 192641 | }else if( c=='[' ){ |
| 191719 | 192642 | for(i++; 1; i++){ |
| 191720 | 192643 | if( zSql[i]==']' ) break; |
| 191721 | 192644 | } |
| 192645 | + }else if( c=='-' && zSql[i+1]=='-' ){ |
| 192646 | + for(i=i+2; zSql[i] && zSql[i]!='\n'; i++); |
| 192647 | + if( zSql[i]=='\0' ) break; |
| 192648 | + }else if( c=='/' && zSql[i+1]=='*' ){ |
| 192649 | + for(i=i+2; zSql[i] && (zSql[i]!='*' || zSql[i+1]!='/'); i++); |
| 192650 | + if( zSql[i]=='\0' ) break; |
| 192651 | + i++; |
| 191722 | 192652 | } |
| 191723 | 192653 | } |
| 191724 | 192654 | if( zSql[i] ){ |
| 191725 | 192655 | zRet = rbuStrndup(&zSql[i], &rc); |
| 191726 | 192656 | } |
| 192657 | + pIter->nIdxCol = iIdxCol; |
| 191727 | 192658 | } |
| 191728 | 192659 | } |
| 191729 | 192660 | |
| 191730 | 192661 | rc2 = sqlite3_finalize(pStmt); |
| 191731 | 192662 | if( rc==SQLITE_OK ) rc = rc2; |
| | @@ -191766,15 +192697,15 @@ |
| 191766 | 192697 | char *zBind = 0; |
| 191767 | 192698 | char *zPart = 0; |
| 191768 | 192699 | int nBind = 0; |
| 191769 | 192700 | |
| 191770 | 192701 | assert( pIter->eType!=RBU_PK_VTAB ); |
| 192702 | + zPart = rbuObjIterGetIndexWhere(p, pIter); |
| 191771 | 192703 | zCollist = rbuObjIterGetIndexCols( |
| 191772 | 192704 | p, pIter, &zImposterCols, &zImposterPK, &zWhere, &nBind |
| 191773 | 192705 | ); |
| 191774 | 192706 | zBind = rbuObjIterGetBindlist(p, nBind); |
| 191775 | | - zPart = rbuObjIterGetIndexWhere(p, pIter); |
| 191776 | 192707 | |
| 191777 | 192708 | /* Create the imposter table used to write to this index. */ |
| 191778 | 192709 | sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 1); |
| 191779 | 192710 | sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1,tnum); |
| 191780 | 192711 | rbuMPrintfExec(p, p->dbMain, |
| | @@ -193296,14 +194227,15 @@ |
| 193296 | 194227 | ){ |
| 193297 | 194228 | sqlite3rbu *p = (sqlite3rbu*)sqlite3_user_data(pCtx); |
| 193298 | 194229 | sqlite3_stmt *pStmt = 0; |
| 193299 | 194230 | char *zErrmsg = 0; |
| 193300 | 194231 | int rc; |
| 194232 | + sqlite3 *db = (rbuIsVacuum(p) ? p->dbRbu : p->dbMain); |
| 193301 | 194233 | |
| 193302 | 194234 | assert( nVal==1 ); |
| 193303 | 194235 | |
| 193304 | | - rc = prepareFreeAndCollectError(p->dbMain, &pStmt, &zErrmsg, |
| 194236 | + rc = prepareFreeAndCollectError(db, &pStmt, &zErrmsg, |
| 193305 | 194237 | sqlite3_mprintf("SELECT count(*) FROM sqlite_master " |
| 193306 | 194238 | "WHERE type='index' AND tbl_name = %Q", sqlite3_value_text(apVal[0])) |
| 193307 | 194239 | ); |
| 193308 | 194240 | if( rc!=SQLITE_OK ){ |
| 193309 | 194241 | sqlite3_result_error(pCtx, zErrmsg, -1); |
| | @@ -193314,11 +194246,11 @@ |
| 193314 | 194246 | } |
| 193315 | 194247 | rc = sqlite3_finalize(pStmt); |
| 193316 | 194248 | if( rc==SQLITE_OK ){ |
| 193317 | 194249 | sqlite3_result_int(pCtx, nIndex); |
| 193318 | 194250 | }else{ |
| 193319 | | - sqlite3_result_error(pCtx, sqlite3_errmsg(p->dbMain), -1); |
| 194251 | + sqlite3_result_error(pCtx, sqlite3_errmsg(db), -1); |
| 193320 | 194252 | } |
| 193321 | 194253 | } |
| 193322 | 194254 | |
| 193323 | 194255 | sqlite3_free(zErrmsg); |
| 193324 | 194256 | } |
| | @@ -197757,11 +198689,11 @@ |
| 197757 | 198689 | if( *pRc==SQLITE_OK && (size_t)(p->nAlloc-p->nBuf)<nByte ){ |
| 197758 | 198690 | u8 *aNew; |
| 197759 | 198691 | i64 nNew = p->nAlloc ? p->nAlloc : 128; |
| 197760 | 198692 | do { |
| 197761 | 198693 | nNew = nNew*2; |
| 197762 | | - }while( (nNew-p->nBuf)<nByte ); |
| 198694 | + }while( (size_t)(nNew-p->nBuf)<nByte ); |
| 197763 | 198695 | |
| 197764 | 198696 | aNew = (u8 *)sqlite3_realloc64(p->aBuf, nNew); |
| 197765 | 198697 | if( 0==aNew ){ |
| 197766 | 198698 | *pRc = SQLITE_NOMEM; |
| 197767 | 198699 | }else{ |
| | @@ -202158,10 +203090,11 @@ |
| 202158 | 203090 | int bColumnsize; /* "columnsize=" option value (dflt==1) */ |
| 202159 | 203091 | int eDetail; /* FTS5_DETAIL_XXX value */ |
| 202160 | 203092 | char *zContentExprlist; |
| 202161 | 203093 | Fts5Tokenizer *pTok; |
| 202162 | 203094 | fts5_tokenizer *pTokApi; |
| 203095 | + int bLock; /* True when table is preparing statement */ |
| 202163 | 203096 | |
| 202164 | 203097 | /* Values loaded from the %_config table */ |
| 202165 | 203098 | int iCookie; /* Incremented when %_config is modified */ |
| 202166 | 203099 | int pgsz; /* Approximate page size used in %_data */ |
| 202167 | 203100 | int nAutomerge; /* 'automerge' setting */ |
| | @@ -203525,19 +204458,22 @@ |
| 203525 | 204458 | fts5yycoverage[stateno][iLookAhead] = 1; |
| 203526 | 204459 | #endif |
| 203527 | 204460 | do{ |
| 203528 | 204461 | i = fts5yy_shift_ofst[stateno]; |
| 203529 | 204462 | assert( i>=0 ); |
| 203530 | | - /* assert( i+fts5YYNFTS5TOKEN<=(int)fts5YY_NLOOKAHEAD ); */ |
| 204463 | + assert( i<=fts5YY_ACTTAB_COUNT ); |
| 204464 | + assert( i+fts5YYNFTS5TOKEN<=(int)fts5YY_NLOOKAHEAD ); |
| 203531 | 204465 | assert( iLookAhead!=fts5YYNOCODE ); |
| 203532 | 204466 | assert( iLookAhead < fts5YYNFTS5TOKEN ); |
| 203533 | 204467 | i += iLookAhead; |
| 203534 | | - if( i>=fts5YY_NLOOKAHEAD || fts5yy_lookahead[i]!=iLookAhead ){ |
| 204468 | + assert( i<(int)fts5YY_NLOOKAHEAD ); |
| 204469 | + if( fts5yy_lookahead[i]!=iLookAhead ){ |
| 203535 | 204470 | #ifdef fts5YYFALLBACK |
| 203536 | 204471 | fts5YYCODETYPE iFallback; /* Fallback token */ |
| 203537 | | - if( iLookAhead<sizeof(fts5yyFallback)/sizeof(fts5yyFallback[0]) |
| 203538 | | - && (iFallback = fts5yyFallback[iLookAhead])!=0 ){ |
| 204472 | + assert( iLookAhead<sizeof(fts5yyFallback)/sizeof(fts5yyFallback[0]) ); |
| 204473 | + iFallback = fts5yyFallback[iLookAhead]; |
| 204474 | + if( iFallback!=0 ){ |
| 203539 | 204475 | #ifndef NDEBUG |
| 203540 | 204476 | if( fts5yyTraceFILE ){ |
| 203541 | 204477 | fprintf(fts5yyTraceFILE, "%sFALLBACK %s => %s\n", |
| 203542 | 204478 | fts5yyTracePrompt, fts5yyTokenName[iLookAhead], fts5yyTokenName[iFallback]); |
| 203543 | 204479 | } |
| | @@ -203548,20 +204484,12 @@ |
| 203548 | 204484 | } |
| 203549 | 204485 | #endif |
| 203550 | 204486 | #ifdef fts5YYWILDCARD |
| 203551 | 204487 | { |
| 203552 | 204488 | int j = i - iLookAhead + fts5YYWILDCARD; |
| 203553 | | - if( |
| 203554 | | -#if fts5YY_SHIFT_MIN+fts5YYWILDCARD<0 |
| 203555 | | - j>=0 && |
| 203556 | | -#endif |
| 203557 | | -#if fts5YY_SHIFT_MAX+fts5YYWILDCARD>=fts5YY_ACTTAB_COUNT |
| 203558 | | - j<fts5YY_ACTTAB_COUNT && |
| 203559 | | -#endif |
| 203560 | | - j<(int)(sizeof(fts5yy_lookahead)/sizeof(fts5yy_lookahead[0])) && |
| 203561 | | - fts5yy_lookahead[j]==fts5YYWILDCARD && iLookAhead>0 |
| 203562 | | - ){ |
| 204489 | + assert( j<(int)(sizeof(fts5yy_lookahead)/sizeof(fts5yy_lookahead[0])) ); |
| 204490 | + if( fts5yy_lookahead[j]==fts5YYWILDCARD && iLookAhead>0 ){ |
| 203563 | 204491 | #ifndef NDEBUG |
| 203564 | 204492 | if( fts5yyTraceFILE ){ |
| 203565 | 204493 | fprintf(fts5yyTraceFILE, "%sWILDCARD %s => %s\n", |
| 203566 | 204494 | fts5yyTracePrompt, fts5yyTokenName[iLookAhead], |
| 203567 | 204495 | fts5yyTokenName[fts5YYWILDCARD]); |
| | @@ -203571,10 +204499,11 @@ |
| 203571 | 204499 | } |
| 203572 | 204500 | } |
| 203573 | 204501 | #endif /* fts5YYWILDCARD */ |
| 203574 | 204502 | return fts5yy_default[stateno]; |
| 203575 | 204503 | }else{ |
| 204504 | + assert( i>=0 && i<sizeof(fts5yy_action)/sizeof(fts5yy_action[0]) ); |
| 203576 | 204505 | return fts5yy_action[i]; |
| 203577 | 204506 | } |
| 203578 | 204507 | }while(1); |
| 203579 | 204508 | } |
| 203580 | 204509 | |
| | @@ -204271,13 +205200,12 @@ |
| 204271 | 205200 | ** Return the fallback token corresponding to canonical token iToken, or |
| 204272 | 205201 | ** 0 if iToken has no fallback. |
| 204273 | 205202 | */ |
| 204274 | 205203 | static int sqlite3Fts5ParserFallback(int iToken){ |
| 204275 | 205204 | #ifdef fts5YYFALLBACK |
| 204276 | | - if( iToken<(int)(sizeof(fts5yyFallback)/sizeof(fts5yyFallback[0])) ){ |
| 204277 | | - return fts5yyFallback[iToken]; |
| 204278 | | - } |
| 205205 | + assert( iToken<(int)(sizeof(fts5yyFallback)/sizeof(fts5yyFallback[0])) ); |
| 205206 | + return fts5yyFallback[iToken]; |
| 204279 | 205207 | #else |
| 204280 | 205208 | (void)iToken; |
| 204281 | 205209 | #endif |
| 204282 | 205210 | return 0; |
| 204283 | 205211 | } |
| | @@ -210470,10 +211398,11 @@ |
| 210470 | 211398 | sqlite3_free(pRet); |
| 210471 | 211399 | pRet = 0; |
| 210472 | 211400 | }else{ |
| 210473 | 211401 | /* TODO1: Fix this */ |
| 210474 | 211402 | pRet->p[nByte] = 0x00; |
| 211403 | + pRet->p[nByte+1] = 0x00; |
| 210475 | 211404 | pRet->szLeaf = fts5GetU16(&pRet->p[2]); |
| 210476 | 211405 | } |
| 210477 | 211406 | } |
| 210478 | 211407 | p->rc = rc; |
| 210479 | 211408 | p->nRead++; |
| | @@ -214776,13 +215705,16 @@ |
| 214776 | 215705 | |
| 214777 | 215706 | i64 iPrev = 0; |
| 214778 | 215707 | Fts5PoslistWriter writer; |
| 214779 | 215708 | memset(&writer, 0, sizeof(writer)); |
| 214780 | 215709 | |
| 215710 | + /* See the earlier comment in this function for an explanation of why |
| 215711 | + ** corrupt input position lists might cause the output to consume |
| 215712 | + ** at most 20 bytes of unexpected space. */ |
| 214781 | 215713 | fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid); |
| 214782 | 215714 | fts5BufferZero(&tmp); |
| 214783 | | - sqlite3Fts5BufferSize(&p->rc, &tmp, i1.nPoslist + i2.nPoslist); |
| 215715 | + sqlite3Fts5BufferSize(&p->rc, &tmp, i1.nPoslist + i2.nPoslist + 10 + 10); |
| 214784 | 215716 | if( p->rc ) break; |
| 214785 | 215717 | |
| 214786 | 215718 | sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1); |
| 214787 | 215719 | sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2); |
| 214788 | 215720 | assert_nc( iPos1>=0 && iPos2>=0 ); |
| | @@ -214826,10 +215758,16 @@ |
| 214826 | 215758 | if( nCopy>0 ){ |
| 214827 | 215759 | fts5BufferSafeAppendBlob(&tmp, aCopy, nCopy); |
| 214828 | 215760 | } |
| 214829 | 215761 | |
| 214830 | 215762 | /* WRITEPOSLISTSIZE */ |
| 215763 | + assert_nc( tmp.n<=i1.nPoslist+i2.nPoslist ); |
| 215764 | + assert( tmp.n<=i1.nPoslist+i2.nPoslist+10+10 ); |
| 215765 | + if( tmp.n>i1.nPoslist+i2.nPoslist ){ |
| 215766 | + if( p->rc==SQLITE_OK ) p->rc = FTS5_CORRUPT; |
| 215767 | + break; |
| 215768 | + } |
| 214831 | 215769 | fts5BufferSafeAppendVarint(&out, tmp.n * 2); |
| 214832 | 215770 | fts5BufferSafeAppendBlob(&out, tmp.p, tmp.n); |
| 214833 | 215771 | fts5DoclistIterNext(&i1); |
| 214834 | 215772 | fts5DoclistIterNext(&i2); |
| 214835 | 215773 | assert_nc( out.n<=(p1->n+p2->n+9) ); |
| | @@ -216897,10 +217835,17 @@ |
| 216897 | 217835 | assert( SQLITE_INDEX_CONSTRAINT_EQ<SQLITE_INDEX_CONSTRAINT_MATCH ); |
| 216898 | 217836 | assert( SQLITE_INDEX_CONSTRAINT_GT<SQLITE_INDEX_CONSTRAINT_MATCH ); |
| 216899 | 217837 | assert( SQLITE_INDEX_CONSTRAINT_LE<SQLITE_INDEX_CONSTRAINT_MATCH ); |
| 216900 | 217838 | assert( SQLITE_INDEX_CONSTRAINT_GE<SQLITE_INDEX_CONSTRAINT_MATCH ); |
| 216901 | 217839 | assert( SQLITE_INDEX_CONSTRAINT_LE<SQLITE_INDEX_CONSTRAINT_MATCH ); |
| 217840 | + |
| 217841 | + if( pConfig->bLock ){ |
| 217842 | + pTab->base.zErrMsg = sqlite3_mprintf( |
| 217843 | + "recursively defined fts5 content table" |
| 217844 | + ); |
| 217845 | + return SQLITE_ERROR; |
| 217846 | + } |
| 216902 | 217847 | |
| 216903 | 217848 | /* Set idxFlags flags for all WHERE clause terms that will be used. */ |
| 216904 | 217849 | for(i=0; i<pInfo->nConstraint; i++){ |
| 216905 | 217850 | struct sqlite3_index_constraint *p = &pInfo->aConstraint[i]; |
| 216906 | 217851 | int iCol = p->iColumn; |
| | @@ -217287,11 +218232,11 @@ |
| 217287 | 218232 | ** And since the statement required here reads from this very virtual |
| 217288 | 218233 | ** table, saving it creates a circular reference. |
| 217289 | 218234 | ** |
| 217290 | 218235 | ** If SQLite a built-in statement cache, this wouldn't be a problem. */ |
| 217291 | 218236 | rc = fts5PrepareStatement(&pSorter->pStmt, pConfig, |
| 217292 | | - "SELECT rowid, rank FROM %Q.%Q ORDER BY %s(%s%s%s) %s", |
| 218237 | + "SELECT rowid, rank FROM %Q.%Q ORDER BY %s(\"%w\"%s%s) %s", |
| 217293 | 218238 | pConfig->zDb, pConfig->zName, zRank, pConfig->zName, |
| 217294 | 218239 | (zRankArgs ? ", " : ""), |
| 217295 | 218240 | (zRankArgs ? zRankArgs : ""), |
| 217296 | 218241 | bDesc ? "DESC" : "ASC" |
| 217297 | 218242 | ); |
| | @@ -217343,14 +218288,14 @@ |
| 217343 | 218288 | for(n=0; z[n] && z[n]!=' '; n++); |
| 217344 | 218289 | |
| 217345 | 218290 | assert( pTab->p.base.zErrMsg==0 ); |
| 217346 | 218291 | pCsr->ePlan = FTS5_PLAN_SPECIAL; |
| 217347 | 218292 | |
| 217348 | | - if( 0==sqlite3_strnicmp("reads", z, n) ){ |
| 218293 | + if( n==5 && 0==sqlite3_strnicmp("reads", z, n) ){ |
| 217349 | 218294 | pCsr->iSpecial = sqlite3Fts5IndexReads(pTab->p.pIndex); |
| 217350 | 218295 | } |
| 217351 | | - else if( 0==sqlite3_strnicmp("id", z, n) ){ |
| 218296 | + else if( n==2 && 0==sqlite3_strnicmp("id", z, n) ){ |
| 217352 | 218297 | pCsr->iSpecial = pCsr->iCsrId; |
| 217353 | 218298 | } |
| 217354 | 218299 | else{ |
| 217355 | 218300 | /* An unrecognized directive. Return an error message. */ |
| 217356 | 218301 | pTab->p.base.zErrMsg = sqlite3_mprintf("unknown special query: %.*s", n, z); |
| | @@ -218594,11 +219539,11 @@ |
| 218594 | 219539 | assert( argc>=1 ); |
| 218595 | 219540 | pAux = (Fts5Auxiliary*)sqlite3_user_data(context); |
| 218596 | 219541 | iCsrId = sqlite3_value_int64(argv[0]); |
| 218597 | 219542 | |
| 218598 | 219543 | pCsr = fts5CursorFromCsrid(pAux->pGlobal, iCsrId); |
| 218599 | | - if( pCsr==0 ){ |
| 219544 | + if( pCsr==0 || pCsr->ePlan==0 ){ |
| 218600 | 219545 | char *zErr = sqlite3_mprintf("no such cursor: %lld", iCsrId); |
| 218601 | 219546 | sqlite3_result_error(context, zErr, -1); |
| 218602 | 219547 | sqlite3_free(zErr); |
| 218603 | 219548 | }else{ |
| 218604 | 219549 | fts5ApiInvoke(pAux, pCsr, context, argc-1, &argv[1]); |
| | @@ -219010,11 +219955,11 @@ |
| 219010 | 219955 | int nArg, /* Number of args */ |
| 219011 | 219956 | sqlite3_value **apUnused /* Function arguments */ |
| 219012 | 219957 | ){ |
| 219013 | 219958 | assert( nArg==0 ); |
| 219014 | 219959 | UNUSED_PARAM2(nArg, apUnused); |
| 219015 | | - sqlite3_result_text(pCtx, "fts5: 2019-07-10 17:32:03 fc82b73eaac8b36950e527f12c4b5dc1e147e6f4ad2217ae43ad82882a88bfa6", -1, SQLITE_TRANSIENT); |
| 219960 | + sqlite3_result_text(pCtx, "fts5: 2019-09-03 16:23:41 3044cf6917ea8324175fc91657e9a5978af9748f72e1914bc361753f0b2d897d", -1, SQLITE_TRANSIENT); |
| 219016 | 219961 | } |
| 219017 | 219962 | |
| 219018 | 219963 | /* |
| 219019 | 219964 | ** Return true if zName is the extension on one of the shadow tables used |
| 219020 | 219965 | ** by this module. |
| | @@ -219282,11 +220227,13 @@ |
| 219282 | 220227 | if( zSql==0 ){ |
| 219283 | 220228 | rc = SQLITE_NOMEM; |
| 219284 | 220229 | }else{ |
| 219285 | 220230 | int f = SQLITE_PREPARE_PERSISTENT; |
| 219286 | 220231 | if( eStmt>FTS5_STMT_LOOKUP ) f |= SQLITE_PREPARE_NO_VTAB; |
| 220232 | + p->pConfig->bLock++; |
| 219287 | 220233 | rc = sqlite3_prepare_v3(pC->db, zSql, -1, f, &p->aStmt[eStmt], 0); |
| 220234 | + p->pConfig->bLock--; |
| 219288 | 220235 | sqlite3_free(zSql); |
| 219289 | 220236 | if( rc!=SQLITE_OK && pzErrMsg ){ |
| 219290 | 220237 | *pzErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pC->db)); |
| 219291 | 220238 | } |
| 219292 | 220239 | } |
| | @@ -223776,12 +224723,12 @@ |
| 223776 | 224723 | } |
| 223777 | 224724 | #endif /* SQLITE_CORE */ |
| 223778 | 224725 | #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */ |
| 223779 | 224726 | |
| 223780 | 224727 | /************** End of stmt.c ************************************************/ |
| 223781 | | -#if __LINE__!=223781 |
| 224728 | +#if __LINE__!=224728 |
| 223782 | 224729 | #undef SQLITE_SOURCE_ID |
| 223783 | | -#define SQLITE_SOURCE_ID "2019-07-10 17:32:03 fc82b73eaac8b36950e527f12c4b5dc1e147e6f4ad2217ae43ad82882a88alt2" |
| 224730 | +#define SQLITE_SOURCE_ID "2019-09-03 16:23:41 3044cf6917ea8324175fc91657e9a5978af9748f72e1914bc361753f0b2dalt2" |
| 223784 | 224731 | #endif |
| 223785 | 224732 | /* Return the source-id for this library */ |
| 223786 | 224733 | SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; } |
| 223787 | 224734 | /************************** End of sqlite3.c ******************************/ |
| 223788 | 224735 | |