diff --git a/sqlite/PKGBUILD b/sqlite/PKGBUILD index f8885c15..b0eda71a 100644 --- a/sqlite/PKGBUILD +++ b/sqlite/PKGBUILD @@ -2,11 +2,10 @@ pkgbase="sqlite" pkgname=('sqlite' 'libsqlite' 'libsqlite-devel' 'sqlite-doc') -_amalgamationver=3080200 +_amalgamationver=3080300 _docver=${_amalgamationver} -#_docver=3080001 pkgver=3.8.3 -pkgrel=1 +pkgrel=2 pkgdesc="A C library that implements an SQL database engine" arch=('i686' 'x86_64') license=('custom:Public Domain') @@ -14,24 +13,24 @@ url="http://www.sqlite.org/" depends=('libreadline' 'icu' 'zlib') makedepends=('libreadline-devel' 'icu-devel' 'zlib-devel') source=( # tarball containing the amalgamation for SQLite >= 3.7.5 together with a configure script and makefile for building it; includes now also the Tcl Extension Architecture (TEA) - http://www.sqlite.org/2013/sqlite-autoconf-$_amalgamationver.tar.gz - http://www.sqlite.org/2013/sqlite-doc-${_docver}.zip + http://www.sqlite.org/2014/sqlite-autoconf-$_amalgamationver.tar.gz + http://www.sqlite.org/2014/sqlite-doc-${_docver}.zip license.txt 'sqlite-3.8.0.1-msys2.patch' - 'sqlite3-3.8.3-1.src.patch' + 'sqlite3-3.8.3-2.src.patch' 'sqlite-3.8.3-cygwin-need-_XOPEN_SORCE.patch') options=('!libtool' '!emptydirs') -sha1sums=('6033ef603ce221d367c665477514d972ef1dc90e' - 'b9cbd42d08b8c1ce96656a6b111e918bb515b605' +sha1sums=('c2a21d71d0c7dc3af71cf90f04dfd22ecfb280c2' + '199c977b948d3e6b9b0b165cb661275e0856d38e' 'f34f6daa4ab3073d74e774aad21d66878cf26853' '0810721cc17128498f99863c185753e06a95ad79' - 'a6ffdd697078d6621be8a1fbb6d938f67f799a41' + '408ba072efcd069c657bdfa498524fba6ebb559d' '2ff3db98562a0a5c556ed6d0125de878466a9554') prepare() { cd "$srcdir"/sqlite-autoconf-$_amalgamationver - patch -p2 -i ${srcdir}/sqlite3-3.8.3-1.src.patch + patch -p2 -i ${srcdir}/sqlite3-3.8.3-2.src.patch patch -p1 -i ${srcdir}/sqlite-3.8.3-cygwin-need-_XOPEN_SORCE.patch patch -p1 -i ${srcdir}/sqlite-3.8.0.1-msys2.patch autoreconf -fi diff --git a/sqlite/sqlite3-3.8.3-1.src.patch b/sqlite/sqlite3-3.8.3-1.src.patch deleted file mode 100644 index c513ffcf..00000000 --- a/sqlite/sqlite3-3.8.3-1.src.patch +++ /dev/null @@ -1,18211 +0,0 @@ ---- origsrc/sqlite-autoconf-3080200/Makefile.am 2013-12-06 16:05:18.000000000 +0100 -+++ src/sqlite-autoconf-3080200/Makefile.am 2014-01-22 10:49:58.358717000 +0100 -@@ -7,7 +7,7 @@ libsqlite3_la_LDFLAGS = -no-undefined -v - - bin_PROGRAMS = sqlite3 - sqlite3_SOURCES = shell.c sqlite3.h --sqlite3_LDADD = $(top_builddir)/libsqlite3.la @READLINE_LIBS@ -+sqlite3_LDADD = $(top_builddir)/libsqlite3.la @READLINE_LIBS@ -licui18n -licuuc -lz - sqlite3_DEPENDENCIES = $(top_builddir)/libsqlite3.la - - include_HEADERS = sqlite3.h sqlite3ext.h ---- origsrc/sqlite-autoconf-3080200/configure.ac 2013-12-06 16:05:18.000000000 +0100 -+++ src/sqlite-autoconf-3080200/configure.ac 2014-01-22 10:49:58.365717400 +0100 -@@ -8,7 +8,7 @@ - # - - AC_PREREQ(2.61) --AC_INIT(sqlite, 3.8.2, http://www.sqlite.org) -+AC_INIT(sqlite, 3.8.3, http://www.sqlite.org) - AC_CONFIG_SRCDIR([sqlite3.c]) - - # Use automake. ---- origsrc/sqlite-autoconf-3080200/icu.c 1970-01-01 01:00:00.000000000 +0100 -+++ src/sqlite-autoconf-3080200/icu.c 2014-01-22 10:49:58.375718000 +0100 -@@ -0,0 +1,504 @@ -+/* -+** 2007 May 6 -+** -+** The author disclaims copyright to this source code. In place of -+** a legal notice, here is a blessing: -+** -+** May you do good and not evil. -+** May you find forgiveness for yourself and forgive others. -+** May you share freely, never taking more than you give. -+** -+************************************************************************* -+** $Id: icu.c,v 1.7 2007/12/13 21:54:11 drh Exp $ -+** -+** This file implements an integration between the ICU library -+** ("International Components for Unicode", an open-source library -+** for handling unicode data) and SQLite. The integration uses -+** ICU to provide the following to SQLite: -+** -+** * An implementation of the SQL regexp() function (and hence REGEXP -+** operator) using the ICU uregex_XX() APIs. -+** -+** * Implementations of the SQL scalar upper() and lower() functions -+** for case mapping. -+** -+** * Integration of ICU and SQLite collation sequences. -+** -+** * An implementation of the LIKE operator that uses ICU to -+** provide case-independent matching. -+*/ -+ -+#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) -+ -+/* Include ICU headers */ -+#include -+#include -+#include -+#include -+ -+#include -+ -+#ifndef SQLITE_CORE -+ #include "sqlite3ext.h" -+ SQLITE_EXTENSION_INIT1 -+#else -+ #include "sqlite3.h" -+#endif -+ -+/* -+** Maximum length (in bytes) of the pattern in a LIKE or GLOB -+** operator. -+*/ -+#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH -+# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 -+#endif -+ -+/* -+** Version of sqlite3_free() that is always a function, never a macro. -+*/ -+static void xFree(void *p){ -+ sqlite3_free(p); -+} -+ -+/* -+** Compare two UTF-8 strings for equality where the first string is -+** a "LIKE" expression. Return true (1) if they are the same and -+** false (0) if they are different. -+*/ -+static int icuLikeCompare( -+ const uint8_t *zPattern, /* LIKE pattern */ -+ const uint8_t *zString, /* The UTF-8 string to compare against */ -+ const UChar32 uEsc /* The escape character */ -+){ -+ static const int MATCH_ONE = (UChar32)'_'; -+ static const int MATCH_ALL = (UChar32)'%'; -+ -+ int iPattern = 0; /* Current byte index in zPattern */ -+ int iString = 0; /* Current byte index in zString */ -+ -+ int prevEscape = 0; /* True if the previous character was uEsc */ -+ -+ while( zPattern[iPattern]!=0 ){ -+ -+ /* Read (and consume) the next character from the input pattern. */ -+ UChar32 uPattern; -+ U8_NEXT_UNSAFE(zPattern, iPattern, uPattern); -+ assert(uPattern!=0); -+ -+ /* There are now 4 possibilities: -+ ** -+ ** 1. uPattern is an unescaped match-all character "%", -+ ** 2. uPattern is an unescaped match-one character "_", -+ ** 3. uPattern is an unescaped escape character, or -+ ** 4. uPattern is to be handled as an ordinary character -+ */ -+ if( !prevEscape && uPattern==MATCH_ALL ){ -+ /* Case 1. */ -+ uint8_t c; -+ -+ /* Skip any MATCH_ALL or MATCH_ONE characters that follow a -+ ** MATCH_ALL. For each MATCH_ONE, skip one character in the -+ ** test string. -+ */ -+ while( (c=zPattern[iPattern]) == MATCH_ALL || c == MATCH_ONE ){ -+ if( c==MATCH_ONE ){ -+ if( zString[iString]==0 ) return 0; -+ U8_FWD_1_UNSAFE(zString, iString); -+ } -+ iPattern++; -+ } -+ -+ if( zPattern[iPattern]==0 ) return 1; -+ -+ while( zString[iString] ){ -+ if( icuLikeCompare(&zPattern[iPattern], &zString[iString], uEsc) ){ -+ return 1; -+ } -+ U8_FWD_1_UNSAFE(zString, iString); -+ } -+ return 0; -+ -+ }else if( !prevEscape && uPattern==MATCH_ONE ){ -+ /* Case 2. */ -+ if( zString[iString]==0 ) return 0; -+ U8_FWD_1_UNSAFE(zString, iString); -+ -+ }else if( !prevEscape && uPattern==uEsc){ -+ /* Case 3. */ -+ prevEscape = 1; -+ -+ }else{ -+ /* Case 4. */ -+ UChar32 uString; -+ U8_NEXT_UNSAFE(zString, iString, uString); -+ uString = u_foldCase(uString, U_FOLD_CASE_DEFAULT); -+ uPattern = u_foldCase(uPattern, U_FOLD_CASE_DEFAULT); -+ if( uString!=uPattern ){ -+ return 0; -+ } -+ prevEscape = 0; -+ } -+ } -+ -+ return zString[iString]==0; -+} -+ -+/* -+** Implementation of the like() SQL function. This function implements -+** the build-in LIKE operator. The first argument to the function is the -+** pattern and the second argument is the string. So, the SQL statements: -+** -+** A LIKE B -+** -+** is implemented as like(B, A). If there is an escape character E, -+** -+** A LIKE B ESCAPE E -+** -+** is mapped to like(B, A, E). -+*/ -+static void icuLikeFunc( -+ sqlite3_context *context, -+ int argc, -+ sqlite3_value **argv -+){ -+ const unsigned char *zA = sqlite3_value_text(argv[0]); -+ const unsigned char *zB = sqlite3_value_text(argv[1]); -+ UChar32 uEsc = 0; -+ -+ /* Limit the length of the LIKE or GLOB pattern to avoid problems -+ ** of deep recursion and N*N behavior in patternCompare(). -+ */ -+ if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){ -+ sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1); -+ return; -+ } -+ -+ -+ if( argc==3 ){ -+ /* The escape character string must consist of a single UTF-8 character. -+ ** Otherwise, return an error. -+ */ -+ int nE= sqlite3_value_bytes(argv[2]); -+ const unsigned char *zE = sqlite3_value_text(argv[2]); -+ int i = 0; -+ if( zE==0 ) return; -+ U8_NEXT(zE, i, nE, uEsc); -+ if( i!=nE){ -+ sqlite3_result_error(context, -+ "ESCAPE expression must be a single character", -1); -+ return; -+ } -+ } -+ -+ if( zA && zB ){ -+ sqlite3_result_int(context, icuLikeCompare(zA, zB, uEsc)); -+ } -+} -+ -+/* -+** This function is called when an ICU function called from within -+** the implementation of an SQL scalar function returns an error. -+** -+** The scalar function context passed as the first argument is -+** loaded with an error message based on the following two args. -+*/ -+static void icuFunctionError( -+ sqlite3_context *pCtx, /* SQLite scalar function context */ -+ const char *zName, /* Name of ICU function that failed */ -+ UErrorCode e /* Error code returned by ICU function */ -+){ -+ char zBuf[128]; -+ sqlite3_snprintf(128, zBuf, "ICU error: %s(): %s", zName, u_errorName(e)); -+ zBuf[127] = '\0'; -+ sqlite3_result_error(pCtx, zBuf, -1); -+} -+ -+/* -+** Function to delete compiled regexp objects. Registered as -+** a destructor function with sqlite3_set_auxdata(). -+*/ -+static void icuRegexpDelete(void *p){ -+ URegularExpression *pExpr = (URegularExpression *)p; -+ uregex_close(pExpr); -+} -+ -+/* -+** Implementation of SQLite REGEXP operator. This scalar function takes -+** two arguments. The first is a regular expression pattern to compile -+** the second is a string to match against that pattern. If either -+** argument is an SQL NULL, then NULL Is returned. Otherwise, the result -+** is 1 if the string matches the pattern, or 0 otherwise. -+** -+** SQLite maps the regexp() function to the regexp() operator such -+** that the following two are equivalent: -+** -+** zString REGEXP zPattern -+** regexp(zPattern, zString) -+** -+** Uses the following ICU regexp APIs: -+** -+** uregex_open() -+** uregex_matches() -+** uregex_close() -+*/ -+static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){ -+ UErrorCode status = U_ZERO_ERROR; -+ URegularExpression *pExpr; -+ UBool res; -+ const UChar *zString = sqlite3_value_text16(apArg[1]); -+ -+ (void)nArg; /* Unused parameter */ -+ -+ /* If the left hand side of the regexp operator is NULL, -+ ** then the result is also NULL. -+ */ -+ if( !zString ){ -+ return; -+ } -+ -+ pExpr = sqlite3_get_auxdata(p, 0); -+ if( !pExpr ){ -+ const UChar *zPattern = sqlite3_value_text16(apArg[0]); -+ if( !zPattern ){ -+ return; -+ } -+ pExpr = uregex_open(zPattern, -1, 0, 0, &status); -+ -+ if( U_SUCCESS(status) ){ -+ sqlite3_set_auxdata(p, 0, pExpr, icuRegexpDelete); -+ }else{ -+ assert(!pExpr); -+ icuFunctionError(p, "uregex_open", status); -+ return; -+ } -+ } -+ -+ /* Configure the text that the regular expression operates on. */ -+ uregex_setText(pExpr, zString, -1, &status); -+ if( !U_SUCCESS(status) ){ -+ icuFunctionError(p, "uregex_setText", status); -+ return; -+ } -+ -+ /* Attempt the match */ -+ res = uregex_matches(pExpr, 0, &status); -+ if( !U_SUCCESS(status) ){ -+ icuFunctionError(p, "uregex_matches", status); -+ return; -+ } -+ -+ /* Set the text that the regular expression operates on to a NULL -+ ** pointer. This is not really necessary, but it is tidier than -+ ** leaving the regular expression object configured with an invalid -+ ** pointer after this function returns. -+ */ -+ uregex_setText(pExpr, 0, 0, &status); -+ -+ /* Return 1 or 0. */ -+ sqlite3_result_int(p, res ? 1 : 0); -+} -+ -+/* -+** Implementations of scalar functions for case mapping - upper() and -+** lower(). Function upper() converts its input to upper-case (ABC). -+** Function lower() converts to lower-case (abc). -+** -+** ICU provides two types of case mapping, "general" case mapping and -+** "language specific". Refer to ICU documentation for the differences -+** between the two. -+** -+** To utilise "general" case mapping, the upper() or lower() scalar -+** functions are invoked with one argument: -+** -+** upper('ABC') -> 'abc' -+** lower('abc') -> 'ABC' -+** -+** To access ICU "language specific" case mapping, upper() or lower() -+** should be invoked with two arguments. The second argument is the name -+** of the locale to use. Passing an empty string ("") or SQL NULL value -+** as the second argument is the same as invoking the 1 argument version -+** of upper() or lower(). -+** -+** lower('I', 'en_us') -> 'i' -+** lower('I', 'tr_tr') -> 'ı' (small dotless i) -+** -+** http://www.icu-project.org/userguide/posix.html#case_mappings -+*/ -+static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){ -+ const UChar *zInput; -+ UChar *zOutput; -+ int nInput; -+ int nOutput; -+ -+ UErrorCode status = U_ZERO_ERROR; -+ const char *zLocale = 0; -+ -+ assert(nArg==1 || nArg==2); -+ if( nArg==2 ){ -+ zLocale = (const char *)sqlite3_value_text(apArg[1]); -+ } -+ -+ zInput = sqlite3_value_text16(apArg[0]); -+ if( !zInput ){ -+ return; -+ } -+ nInput = sqlite3_value_bytes16(apArg[0]); -+ -+ nOutput = nInput * 2 + 2; -+ zOutput = sqlite3_malloc(nOutput); -+ if( !zOutput ){ -+ return; -+ } -+ -+ if( sqlite3_user_data(p) ){ -+ u_strToUpper(zOutput, nOutput/2, zInput, nInput/2, zLocale, &status); -+ }else{ -+ u_strToLower(zOutput, nOutput/2, zInput, nInput/2, zLocale, &status); -+ } -+ -+ if( !U_SUCCESS(status) ){ -+ icuFunctionError(p, "u_strToLower()/u_strToUpper", status); -+ return; -+ } -+ -+ sqlite3_result_text16(p, zOutput, -1, xFree); -+} -+ -+/* -+** Collation sequence destructor function. The pCtx argument points to -+** a UCollator structure previously allocated using ucol_open(). -+*/ -+static void icuCollationDel(void *pCtx){ -+ UCollator *p = (UCollator *)pCtx; -+ ucol_close(p); -+} -+ -+/* -+** Collation sequence comparison function. The pCtx argument points to -+** a UCollator structure previously allocated using ucol_open(). -+*/ -+static int icuCollationColl( -+ void *pCtx, -+ int nLeft, -+ const void *zLeft, -+ int nRight, -+ const void *zRight -+){ -+ UCollationResult res; -+ UCollator *p = (UCollator *)pCtx; -+ res = ucol_strcoll(p, (UChar *)zLeft, nLeft/2, (UChar *)zRight, nRight/2); -+ switch( res ){ -+ case UCOL_LESS: return -1; -+ case UCOL_GREATER: return +1; -+ case UCOL_EQUAL: return 0; -+ } -+ assert(!"Unexpected return value from ucol_strcoll()"); -+ return 0; -+} -+ -+/* -+** Implementation of the scalar function icu_load_collation(). -+** -+** This scalar function is used to add ICU collation based collation -+** types to an SQLite database connection. It is intended to be called -+** as follows: -+** -+** SELECT icu_load_collation(, ); -+** -+** Where is a string containing an ICU locale identifier (i.e. -+** "en_AU", "tr_TR" etc.) and is the name of the -+** collation sequence to create. -+*/ -+static void icuLoadCollation( -+ sqlite3_context *p, -+ int nArg, -+ sqlite3_value **apArg -+){ -+ sqlite3 *db = (sqlite3 *)sqlite3_user_data(p); -+ UErrorCode status = U_ZERO_ERROR; -+ const char *zLocale; /* Locale identifier - (eg. "jp_JP") */ -+ const char *zName; /* SQL Collation sequence name (eg. "japanese") */ -+ UCollator *pUCollator; /* ICU library collation object */ -+ int rc; /* Return code from sqlite3_create_collation_x() */ -+ -+ assert(nArg==2); -+ zLocale = (const char *)sqlite3_value_text(apArg[0]); -+ zName = (const char *)sqlite3_value_text(apArg[1]); -+ -+ if( !zLocale || !zName ){ -+ return; -+ } -+ -+ pUCollator = ucol_open(zLocale, &status); -+ if( !U_SUCCESS(status) ){ -+ icuFunctionError(p, "ucol_open", status); -+ return; -+ } -+ assert(p); -+ -+ rc = sqlite3_create_collation_v2(db, zName, SQLITE_UTF16, (void *)pUCollator, -+ icuCollationColl, icuCollationDel -+ ); -+ if( rc!=SQLITE_OK ){ -+ ucol_close(pUCollator); -+ sqlite3_result_error(p, "Error registering collation function", -1); -+ } -+} -+ -+/* -+** Register the ICU extension functions with database db. -+*/ -+int sqlite3IcuInit(sqlite3 *db){ -+ struct IcuScalar { -+ const char *zName; /* Function name */ -+ int nArg; /* Number of arguments */ -+ int enc; /* Optimal text encoding */ -+ void *pContext; /* sqlite3_user_data() context */ -+ void (*xFunc)(sqlite3_context*,int,sqlite3_value**); -+ } scalars[] = { -+ {"regexp", 2, SQLITE_ANY, 0, icuRegexpFunc}, -+ -+ {"lower", 1, SQLITE_UTF16, 0, icuCaseFunc16}, -+ {"lower", 2, SQLITE_UTF16, 0, icuCaseFunc16}, -+ {"upper", 1, SQLITE_UTF16, (void*)1, icuCaseFunc16}, -+ {"upper", 2, SQLITE_UTF16, (void*)1, icuCaseFunc16}, -+ -+ {"lower", 1, SQLITE_UTF8, 0, icuCaseFunc16}, -+ {"lower", 2, SQLITE_UTF8, 0, icuCaseFunc16}, -+ {"upper", 1, SQLITE_UTF8, (void*)1, icuCaseFunc16}, -+ {"upper", 2, SQLITE_UTF8, (void*)1, icuCaseFunc16}, -+ -+ {"like", 2, SQLITE_UTF8, 0, icuLikeFunc}, -+ {"like", 3, SQLITE_UTF8, 0, icuLikeFunc}, -+ -+ {"icu_load_collation", 2, SQLITE_UTF8, (void*)db, icuLoadCollation}, -+ }; -+ -+ int rc = SQLITE_OK; -+ int i; -+ -+ for(i=0; rc==SQLITE_OK && i<(int)(sizeof(scalars)/sizeof(scalars[0])); i++){ -+ struct IcuScalar *p = &scalars[i]; -+ rc = sqlite3_create_function( -+ db, p->zName, p->nArg, p->enc, p->pContext, p->xFunc, 0, 0 -+ ); -+ } -+ -+ return rc; -+} -+ -+#if !SQLITE_CORE -+#ifdef _WIN32 -+__declspec(dllexport) -+#endif -+int sqlite3_icu_init( -+ sqlite3 *db, -+ char **pzErrMsg, -+ const sqlite3_api_routines *pApi -+){ -+ SQLITE_EXTENSION_INIT2(pApi) -+ return sqlite3IcuInit(db); -+} -+#endif -+ -+#endif ---- origsrc/sqlite-autoconf-3080200/shell.c 2013-12-06 16:05:18.000000000 +0100 -+++ src/sqlite-autoconf-3080200/shell.c 2014-01-22 10:49:58.386718600 +0100 -@@ -28,11 +28,24 @@ - # define _LARGEFILE_SOURCE 1 - #endif - -+#define SQLITE_CORE 1 -+#define SQLITE_ENABLE_ICU 1 -+#define SQLITE_ENABLE_ZLIB 1 -+ - #include - #include - #include - #include - #include "sqlite3.h" -+#ifndef SQLITE_CORE -+# define SQLITE_CORE 1 /* Disable the API redefinition in sqlite3ext.h */ -+#endif -+#ifdef SQLITE_ENABLE_ICU -+#include "icu.c" -+#endif -+#ifdef SQLITE_ENABLE_ZLIB -+#include "zlib.c" -+#endif - #include - #include - -@@ -482,7 +495,7 @@ struct callback_data { - #define MODE_Csv 7 /* Quote strings, numbers are plain */ - #define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */ - --static const char *modeDescr[] = { -+static const char *const modeDescr[] = { - "line", - "column", - "list", -@@ -597,6 +610,7 @@ static void output_c_string(FILE *out, c - */ - static void output_html_string(FILE *out, const char *z){ - int i; -+ if( z==0 ) z = ""; - while( *z ){ - for(i=0; z[i] - && z[i]!='<' -@@ -1155,7 +1169,7 @@ static int display_stats( - ** is equal, according to strcmp(), to any of the strings in the array. - ** Otherwise, return zero. - */ --static int str_in_array(const char *zStr, const char **azArray){ -+static int str_in_array(const char *zStr, const char *const *azArray){ - int i; - for(i=0; azArray[i]; i++){ - if( 0==strcmp(zStr, azArray[i]) ) return 1; -@@ -1176,7 +1190,7 @@ static int str_in_array(const char *zStr - ** - ** * For each "Goto", if the jump destination is earlier in the program - ** and ends on one of: --** Yield SeekGt SeekLt RowSetRead -+** Yield SeekGt SeekLt RowSetRead Rewind - ** then indent all opcodes between the earlier instruction - ** and "Goto" by 2 spaces. - */ -@@ -1187,9 +1201,9 @@ static void explain_data_prepare(struct - int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */ - int iOp; /* Index of operation in p->aiIndent[] */ - -- const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 }; -- const char *azYield[] = { "Yield", "SeekLt", "SeekGt", "RowSetRead", 0 }; -- const char *azGoto[] = { "Goto", 0 }; -+ const char *const azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 }; -+ const char *const azYield[] = { "Yield", "SeekLt", "SeekGt", "RowSetRead", "Rewind", 0 }; -+ const char *const azGoto[] = { "Goto", 0 }; - - /* Try to figure out if this is really an EXPLAIN statement. If this - ** cannot be verified, return early. */ -@@ -1225,7 +1239,7 @@ static void explain_data_prepare(struct - for(i=p2op; iaiIndent[i] += 2; - } - if( str_in_array(zOp, azGoto) && p2opnIndent && abYield[p2op] ){ -- for(i=p2op; iaiIndent[i] += 2; -+ for(i=p2op+1; iaiIndent[i] += 2; - } - } - -@@ -1836,7 +1850,7 @@ static void csv_append_char(CSVReader *p - ** + Report syntax errors on stderr - */ - static char *csv_read_one_field(CSVReader *p){ -- int c, pc; -+ int c, pc, ppc; - int cSep = p->cSeparator; - p->n = 0; - c = fgetc(p->in); -@@ -1847,7 +1861,7 @@ static char *csv_read_one_field(CSVReade - if( c=='"' ){ - int startLine = p->nLine; - int cQuote = c; -- pc = 0; -+ pc = ppc = 0; - while( 1 ){ - c = fgetc(p->in); - if( c=='\n' ) p->nLine++; -@@ -1859,7 +1873,7 @@ static char *csv_read_one_field(CSVReade - } - if( (c==cSep && pc==cQuote) - || (c=='\n' && pc==cQuote) -- || (c=='\n' && pc=='\r' && p->n>=2 && p->z[p->n-2]==cQuote) -+ || (c=='\n' && pc=='\r' && ppc==cQuote) - || (c==EOF && pc==cQuote) - ){ - do{ p->n--; }while( p->z[p->n]!=cQuote ); -@@ -1877,6 +1891,7 @@ static char *csv_read_one_field(CSVReade - break; - } - csv_append_char(p, c); -+ ppc = pc; - pc = c; - } - }else{ -@@ -2770,6 +2785,9 @@ static int do_meta_command(char *zLine, - { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS }, - { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD }, - { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC }, -+ { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT }, -+ { "explain_stmt", SQLITE_TESTCTRL_EXPLAIN_STMT }, -+ { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT } - }; - int testctrl = -1; - int rc = 0; -@@ -2864,6 +2882,9 @@ static int do_meta_command(char *zLine, - case SQLITE_TESTCTRL_FAULT_INSTALL: - case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: - case SQLITE_TESTCTRL_SCRATCHMALLOC: -+ case SQLITE_TESTCTRL_LOCALTIME_FAULT: -+ case SQLITE_TESTCTRL_EXPLAIN_STMT: -+ case SQLITE_TESTCTRL_NEVER_CORRUPT: - default: - fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n", - azArg[1]); -@@ -3037,7 +3058,10 @@ static int process_input(struct callback - seenInterrupt = 0; - } - lineno++; -- if( nSql==0 && _all_whitespace(zLine) ) continue; -+ if( nSql==0 && _all_whitespace(zLine) ){ -+ if( p->echoOn ) printf("%s\n", zLine); -+ continue; -+ } - if( zLine && zLine[0]=='.' && nSql==0 ){ - if( p->echoOn ) printf("%s\n", zLine); - rc = do_meta_command(zLine, p); -@@ -3099,6 +3123,7 @@ static int process_input(struct callback - } - nSql = 0; - }else if( nSql && _all_whitespace(zSql) ){ -+ if( p->echoOn ) printf("%s\n", zSql); - nSql = 0; - } - } -@@ -3265,6 +3290,9 @@ static void usage(int showDetail){ - ** Initialize the state information in data - */ - static void main_init(struct callback_data *data) { -+#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(SQLITE_WIN32_NO_WIDE) -+ sqlite3_vfs *pVfs; -+#endif - memset(data, 0, sizeof(*data)); - data->mode = MODE_List; - memcpy(data->separator,"|", 2); -@@ -3274,6 +3302,18 @@ static void main_init(struct callback_da - sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); - sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); - sqlite3_config(SQLITE_CONFIG_SINGLETHREAD); -+#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(SQLITE_WIN32_NO_WIDE) -+ pVfs = sqlite3_vfs_find("win32-longpath"); -+ if( pVfs ){ -+ sqlite3_vfs_register(pVfs, 1); -+ } -+#endif -+#ifdef SQLITE_ENABLE_ICU -+ sqlite3_auto_extension((void *)sqlite3IcuInit); -+#endif -+#ifdef SQLITE_ENABLE_ZLIB -+ sqlite3_auto_extension((void *)sqlite3ZlibInit); -+#endif - } - - /* -@@ -3297,9 +3337,9 @@ int main(int argc, char **argv){ - int i; - int rc = 0; - -- if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){ -- fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n", -- sqlite3_sourceid(), SQLITE_SOURCE_ID); -+ if( sqlite3_libversion_number()<3008000 ){ -+ fprintf(stderr, "Unsuitable SQLite version %s, must be at least 3.8.0", -+ sqlite3_libversion()); - exit(1); - } - Argv0 = argv[0]; ---- origsrc/sqlite-autoconf-3080200/sqlite3.1 2013-12-06 16:05:18.000000000 +0100 -+++ src/sqlite-autoconf-3080200/sqlite3.1 2014-01-22 10:49:58.396719200 +0100 -@@ -2,7 +2,7 @@ - .\" First parameter, NAME, should be all caps - .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection - .\" other parameters are allowed: see man(7), man(1) --.TH SQLITE3 1 "Mon Apr 15 23:49:17 2002" -+.TH SQLITE3 1 "Mon Jan 10 16:21:00 2014" - .\" Please adjust this date whenever revising the manpage. - .\" - .\" Some roff macros, for reference: -@@ -49,7 +49,7 @@ a table named "memos" and insert a coupl - $ - .B sqlite3 mydata.db - .br --SQLite version 3.1.3 -+SQLite version 3.8.3 - .br - Enter ".help" for instructions - .br -@@ -108,15 +108,24 @@ sqlite> - .B .help - .nf - .cc | -+.backup ?DB? FILE Backup DB (default "main") to FILE -+.bail ON|OFF Stop after hitting an error. Default OFF - .databases List names and files of attached databases - .dump ?TABLE? ... Dump the database in an SQL text format -+ If TABLE specified, only dump tables matching -+ LIKE pattern TABLE. - .echo ON|OFF Turn command echo on or off - .exit Exit this program --.explain ON|OFF Turn output mode suitable for EXPLAIN on or off. -+.explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off. -+ With no args, it turns EXPLAIN on. - .header(s) ON|OFF Turn display of headers on or off - .help Show this message - .import FILE TABLE Import data from FILE into TABLE --.indices TABLE Show names of all indices on TABLE -+.indices ?TABLE? Show names of all indices -+ If TABLE specified, only show indices for tables -+ matching LIKE pattern TABLE. -+.load FILE ?ENTRY? Load an extension library -+.log FILE|off Turn logging on or off. FILE can be stderr/stdout - .mode MODE ?TABLE? Set output mode where MODE is one of: - csv Comma-separated values - column Left-aligned columns. (See .width) -@@ -126,46 +135,76 @@ sqlite> - list Values delimited by .separator string - tabs Tab-separated values - tcl TCL list elements --.nullvalue STRING Print STRING in place of NULL values -+.nullvalue STRING Use STRING in place of NULL values -+.open ?FILENAME? Close existing database and reopen FILENAME - .output FILENAME Send output to FILENAME - .output stdout Send output to the screen -+.print STRING... Print literal STRING - .prompt MAIN CONTINUE Replace the standard prompts - .quit Exit this program - .read FILENAME Execute SQL in FILENAME -+.restore ?DB? FILE Restore content of DB (default "main") from FILE - .schema ?TABLE? Show the CREATE statements -+ If TABLE specified, only show tables matching -+ LIKE pattern TABLE. - .separator STRING Change separator used by output mode and .import - .show Show the current values for various settings --.tables ?PATTERN? List names of tables matching a LIKE pattern -+.stats ON|OFF Turn stats on or off -+.tables ?TABLE? List names of tables -+ If TABLE specified, only list tables matching -+ LIKE pattern TABLE. - .timeout MS Try opening locked tables for MS milliseconds --.width NUM NUM ... Set column widths for "column" mode -+.trace FILE|off Output each SQL statement as it is run -+.vfsname ?AUX? Print the name of the VFS stack -+.width NUM1 NUM2 ... Set column widths for "column" mode -+.timer ON|OFF Turn the CPU timer measurement on or off - sqlite> - |cc . - .sp - .fi -- - .SH OPTIONS - .B sqlite3 - has the following options: - .TP --.BI \-init\ file --Read and execute commands from --.I file --, which can contain a mix of SQL statements and meta-commands. -+.B \-bail -+Stop after hitting an error. -+.TP -+.B \-batch -+Force batch I/O. -+.TP -+.B \-column -+Query results will be displayed in a table like form, using -+whitespace characters to separate the columns and align the -+output. -+.TP -+.BI \-cmd\ command -+run -+.I command -+before reading stdin -+.TP -+.B \-csv -+Set output mode to CSV (comma separated values). - .TP - .B \-echo - Print commands before execution. - .TP -+.BI \-init\ file -+Read and execute commands from -+.I file -+, which can contain a mix of SQL statements and meta-commands. -+.TP - .B \-[no]header - Turn headers on or off. - .TP --.B \-column --Query results will be displayed in a table like form, using --whitespace characters to separate the columns and align the --output. -+.B \-help -+Show help on options and exit. - .TP - .B \-html - Query results will be output as simple HTML tables. - .TP -+.B \-interactive -+Force interactive I/O. -+.TP - .B \-line - Query results will be displayed with one value per line, rows - separated by a blank line. Designed to be easily parsed by -@@ -175,18 +214,28 @@ scripts or other programs - Query results will be displayed with the separator (|, by default) - character between each field value. The default. - .TP --.BI \-separator\ separator --Set output field separator. Default is '|'. -+.BI \-mmap\ N -+Set default mmap size to -+.I N -+\. - .TP - .BI \-nullvalue\ string - Set string used to represent NULL values. Default is '' - (empty string). - .TP -+.BI \-separator\ separator -+Set output field separator. Default is '|'. -+.TP -+.B \-stats -+Print memory stats before each finalize. -+.TP - .B \-version - Show SQLite version. - .TP --.B \-help --Show help on options and exit. -+.BI \-vfs\ name -+Use -+.I name -+as the default VFS. - - - .SH INIT FILE -@@ -222,8 +271,9 @@ o All other command line options are pro - .SH SEE ALSO - http://www.sqlite.org/ - .br --The sqlite-doc package -+The sqlite3-doc package. - .SH AUTHOR - This manual page was originally written by Andreas Rottmann - , for the Debian GNU/Linux system (but may be used --by others). It was subsequently revised by Bill Bumgarner . -+by others). It was subsequently revised by Bill Bumgarner and -+further updated by Laszlo Boszormenyi . ---- origsrc/sqlite-autoconf-3080200/sqlite3.c 2013-12-06 16:05:18.000000000 +0100 -+++ src/sqlite-autoconf-3080200/sqlite3.c 2014-01-22 10:49:58.573729300 +0100 -@@ -1,6 +1,6 @@ - /****************************************************************************** - ** This file is an amalgamation of many separate C source files from SQLite --** version 3.8.2. By combining all the individual C code files into this -+** version 3.8.3. By combining all the individual C code files into this - ** single large file, the entire code can be compiled as a single translation - ** unit. This allows many compilers to do optimizations that would not be - ** possible if the files were compiled separately. Performance improvements -@@ -135,9 +135,9 @@ extern "C" { - ** [sqlite3_libversion_number()], [sqlite3_sourceid()], - ** [sqlite_version()] and [sqlite_source_id()]. - */ --#define SQLITE_VERSION "3.8.2" --#define SQLITE_VERSION_NUMBER 3008002 --#define SQLITE_SOURCE_ID "2013-12-06 14:53:30 27392118af4c38c5203a04b8013e1afdb1cebd0d" -+#define SQLITE_VERSION "3.8.3" -+#define SQLITE_VERSION_NUMBER 3008003 -+#define SQLITE_SOURCE_ID "2014-01-21 15:04:47 5e43bf013253921e4dfbe71de11ee7ed4b3e7eae" - - /* - ** CAPI3REF: Run-Time Library Version Numbers -@@ -519,6 +519,7 @@ SQLITE_API int sqlite3_exec( - #define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) - #define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) - #define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) -+#define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8)) - #define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) - #define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8)) - #define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8)) -@@ -586,7 +587,8 @@ SQLITE_API int sqlite3_exec( - ** after reboot following a crash or power loss, the only bytes in a - ** file that were written at the application level might have changed - ** and that adjacent bytes, even bytes within the same sector are --** guaranteed to be unchanged. -+** guaranteed to be unchanged. The SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN -+** flag indicate that a file cannot be deleted when open. - */ - #define SQLITE_IOCAP_ATOMIC 0x00000001 - #define SQLITE_IOCAP_ATOMIC512 0x00000002 -@@ -817,15 +819,29 @@ struct sqlite3_io_methods { - ** additional information. - ** - **
  • [[SQLITE_FCNTL_SYNC_OMITTED]] --** ^(The [SQLITE_FCNTL_SYNC_OMITTED] opcode is generated internally by --** SQLite and sent to all VFSes in place of a call to the xSync method --** when the database connection has [PRAGMA synchronous] set to OFF.)^ --** Some specialized VFSes need this signal in order to operate correctly --** when [PRAGMA synchronous | PRAGMA synchronous=OFF] is set, but most --** VFSes do not need this signal and should silently ignore this opcode. --** Applications should not call [sqlite3_file_control()] with this --** opcode as doing so may disrupt the operation of the specialized VFSes --** that do require it. -+** No longer in use. -+** -+**
  • [[SQLITE_FCNTL_SYNC]] -+** The [SQLITE_FCNTL_SYNC] opcode is generated internally by SQLite and -+** sent to the VFS immediately before the xSync method is invoked on a -+** database file descriptor. Or, if the xSync method is not invoked -+** because the user has configured SQLite with -+** [PRAGMA synchronous | PRAGMA synchronous=OFF] it is invoked in place -+** of the xSync method. In most cases, the pointer argument passed with -+** this file-control is NULL. However, if the database file is being synced -+** as part of a multi-database commit, the argument points to a nul-terminated -+** string containing the transactions master-journal file name. VFSes that -+** do not need this signal should silently ignore this opcode. Applications -+** should not call [sqlite3_file_control()] with this opcode as doing so may -+** disrupt the operation of the specialized VFSes that do require it. -+** -+**
  • [[SQLITE_FCNTL_COMMIT_PHASETWO]] -+** The [SQLITE_FCNTL_COMMIT_PHASETWO] opcode is generated internally by SQLite -+** and sent to the VFS after a transaction has been committed immediately -+** but before the database is unlocked. VFSes that do not need this signal -+** should silently ignore this opcode. Applications should not call -+** [sqlite3_file_control()] with this opcode as doing so may disrupt the -+** operation of the specialized VFSes that do require it. - ** - **
  • [[SQLITE_FCNTL_WIN32_AV_RETRY]] - ** ^The [SQLITE_FCNTL_WIN32_AV_RETRY] opcode is used to configure automatic -@@ -949,6 +965,12 @@ struct sqlite3_io_methods { - ** SQLite stack may generate instances of this file control if - ** the [SQLITE_USE_FCNTL_TRACE] compile-time option is enabled. - ** -+**
  • [[SQLITE_FCNTL_HAS_MOVED]] -+** The [SQLITE_FCNTL_HAS_MOVED] file control interprets its argument as a -+** pointer to an integer and it writes a boolean into that integer depending -+** on whether or not the file has been renamed, moved, or deleted since it -+** was first opened. -+** - ** - */ - #define SQLITE_FCNTL_LOCKSTATE 1 -@@ -969,6 +991,9 @@ struct sqlite3_io_methods { - #define SQLITE_FCNTL_TEMPFILENAME 16 - #define SQLITE_FCNTL_MMAP_SIZE 18 - #define SQLITE_FCNTL_TRACE 19 -+#define SQLITE_FCNTL_HAS_MOVED 20 -+#define SQLITE_FCNTL_SYNC 21 -+#define SQLITE_FCNTL_COMMIT_PHASETWO 22 - - /* - ** CAPI3REF: Mutex Handle -@@ -2403,11 +2428,13 @@ SQLITE_API sqlite3_int64 sqlite3_memory_ - ** applications to access the same PRNG for other purposes. - ** - ** ^A call to this routine stores N bytes of randomness into buffer P. -+** ^If N is less than one, then P can be a NULL pointer. - ** --** ^The first time this routine is invoked (either internally or by --** the application) the PRNG is seeded using randomness obtained --** from the xRandomness method of the default [sqlite3_vfs] object. --** ^On all subsequent invocations, the pseudo-randomness is generated -+** ^If this routine has not been previously called or if the previous -+** call had N less than one, then the PRNG is seeded using randomness -+** obtained from the xRandomness method of the default [sqlite3_vfs] object. -+** ^If the previous call to this routine had an N of 1 or more then -+** the pseudo-randomness is generated - ** internally and without recourse to the [sqlite3_vfs] xRandomness - ** method. - */ -@@ -2567,6 +2594,7 @@ SQLITE_API int sqlite3_set_authorizer( - #define SQLITE_FUNCTION 31 /* NULL Function Name */ - #define SQLITE_SAVEPOINT 32 /* Operation Savepoint Name */ - #define SQLITE_COPY 0 /* No longer used */ -+#define SQLITE_RECURSIVE 33 /* NULL NULL */ - - /* - ** CAPI3REF: Tracing And Profiling Functions -@@ -3985,15 +4013,24 @@ SQLITE_API int sqlite3_reset(sqlite3_stm - ** - ** ^The fourth parameter, eTextRep, specifies what - ** [SQLITE_UTF8 | text encoding] this SQL function prefers for --** its parameters. Every SQL function implementation must be able to work --** with UTF-8, UTF-16le, or UTF-16be. But some implementations may be --** more efficient with one encoding than another. ^An application may --** invoke sqlite3_create_function() or sqlite3_create_function16() multiple --** times with the same function but with different values of eTextRep. -+** its parameters. The application should set this parameter to -+** [SQLITE_UTF16LE] if the function implementation invokes -+** [sqlite3_value_text16le()] on an input, or [SQLITE_UTF16BE] if the -+** implementation invokes [sqlite3_value_text16be()] on an input, or -+** [SQLITE_UTF16] if [sqlite3_value_text16()] is used, or [SQLITE_UTF8] -+** otherwise. ^The same SQL function may be registered multiple times using -+** different preferred text encodings, with different implementations for -+** each encoding. - ** ^When multiple implementations of the same function are available, SQLite - ** will pick the one that involves the least amount of data conversion. --** If there is only a single implementation which does not care what text --** encoding is used, then the fourth argument should be [SQLITE_ANY]. -+** -+** ^The fourth parameter may optionally be ORed with [SQLITE_DETERMINISTIC] -+** to signal that the function will always return the same result given -+** the same inputs within a single SQL statement. Most SQL functions are -+** deterministic. The built-in [random()] SQL function is an example of a -+** function that is not deterministic. The SQLite query planner is able to -+** perform additional optimizations on deterministic functions, so use -+** of the [SQLITE_DETERMINISTIC] flag is recommended where possible. - ** - ** ^(The fifth parameter is an arbitrary pointer. The implementation of the - ** function can gain access to this pointer using [sqlite3_user_data()].)^ -@@ -4079,10 +4116,20 @@ SQLITE_API int sqlite3_create_function_v - #define SQLITE_UTF16LE 2 - #define SQLITE_UTF16BE 3 - #define SQLITE_UTF16 4 /* Use native byte order */ --#define SQLITE_ANY 5 /* sqlite3_create_function only */ -+#define SQLITE_ANY 5 /* Deprecated */ - #define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ - - /* -+** CAPI3REF: Function Flags -+** -+** These constants may be ORed together with the -+** [SQLITE_UTF8 | preferred text encoding] as the fourth argument -+** to [sqlite3_create_function()], [sqlite3_create_function16()], or -+** [sqlite3_create_function_v2()]. -+*/ -+#define SQLITE_DETERMINISTIC 0x800 -+ -+/* - ** CAPI3REF: Deprecated Functions - ** DEPRECATED - ** -@@ -7996,163 +8043,166 @@ SQLITE_PRIVATE void sqlite3HashClear(Has - /************** Continuing where we left off in sqliteInt.h ******************/ - /************** Include parse.h in the middle of sqliteInt.h *****************/ - /************** Begin file parse.h *******************************************/ --#define TK_SEMI 1 --#define TK_EXPLAIN 2 --#define TK_QUERY 3 --#define TK_PLAN 4 --#define TK_BEGIN 5 --#define TK_TRANSACTION 6 --#define TK_DEFERRED 7 --#define TK_IMMEDIATE 8 --#define TK_EXCLUSIVE 9 --#define TK_COMMIT 10 --#define TK_END 11 --#define TK_ROLLBACK 12 --#define TK_SAVEPOINT 13 --#define TK_RELEASE 14 --#define TK_TO 15 --#define TK_TABLE 16 --#define TK_CREATE 17 --#define TK_IF 18 --#define TK_NOT 19 --#define TK_EXISTS 20 --#define TK_TEMP 21 --#define TK_LP 22 --#define TK_RP 23 --#define TK_AS 24 --#define TK_WITHOUT 25 --#define TK_COMMA 26 --#define TK_ID 27 --#define TK_INDEXED 28 --#define TK_ABORT 29 --#define TK_ACTION 30 --#define TK_AFTER 31 --#define TK_ANALYZE 32 --#define TK_ASC 33 --#define TK_ATTACH 34 --#define TK_BEFORE 35 --#define TK_BY 36 --#define TK_CASCADE 37 --#define TK_CAST 38 --#define TK_COLUMNKW 39 --#define TK_CONFLICT 40 --#define TK_DATABASE 41 --#define TK_DESC 42 --#define TK_DETACH 43 --#define TK_EACH 44 --#define TK_FAIL 45 --#define TK_FOR 46 --#define TK_IGNORE 47 --#define TK_INITIALLY 48 --#define TK_INSTEAD 49 --#define TK_LIKE_KW 50 --#define TK_MATCH 51 --#define TK_NO 52 --#define TK_KEY 53 --#define TK_OF 54 --#define TK_OFFSET 55 --#define TK_PRAGMA 56 --#define TK_RAISE 57 --#define TK_REPLACE 58 --#define TK_RESTRICT 59 --#define TK_ROW 60 --#define TK_TRIGGER 61 --#define TK_VACUUM 62 --#define TK_VIEW 63 --#define TK_VIRTUAL 64 --#define TK_REINDEX 65 --#define TK_RENAME 66 --#define TK_CTIME_KW 67 --#define TK_ANY 68 --#define TK_OR 69 --#define TK_AND 70 --#define TK_IS 71 --#define TK_BETWEEN 72 --#define TK_IN 73 --#define TK_ISNULL 74 --#define TK_NOTNULL 75 --#define TK_NE 76 --#define TK_EQ 77 --#define TK_GT 78 --#define TK_LE 79 --#define TK_LT 80 --#define TK_GE 81 --#define TK_ESCAPE 82 --#define TK_BITAND 83 --#define TK_BITOR 84 --#define TK_LSHIFT 85 --#define TK_RSHIFT 86 --#define TK_PLUS 87 --#define TK_MINUS 88 --#define TK_STAR 89 --#define TK_SLASH 90 --#define TK_REM 91 --#define TK_CONCAT 92 --#define TK_COLLATE 93 --#define TK_BITNOT 94 --#define TK_STRING 95 --#define TK_JOIN_KW 96 --#define TK_CONSTRAINT 97 --#define TK_DEFAULT 98 --#define TK_NULL 99 --#define TK_PRIMARY 100 --#define TK_UNIQUE 101 --#define TK_CHECK 102 --#define TK_REFERENCES 103 --#define TK_AUTOINCR 104 --#define TK_ON 105 --#define TK_INSERT 106 --#define TK_DELETE 107 --#define TK_UPDATE 108 --#define TK_SET 109 --#define TK_DEFERRABLE 110 --#define TK_FOREIGN 111 --#define TK_DROP 112 --#define TK_UNION 113 --#define TK_ALL 114 --#define TK_EXCEPT 115 --#define TK_INTERSECT 116 --#define TK_SELECT 117 --#define TK_DISTINCT 118 --#define TK_DOT 119 --#define TK_FROM 120 --#define TK_JOIN 121 --#define TK_USING 122 --#define TK_ORDER 123 --#define TK_GROUP 124 --#define TK_HAVING 125 --#define TK_LIMIT 126 --#define TK_WHERE 127 --#define TK_INTO 128 --#define TK_VALUES 129 --#define TK_INTEGER 130 --#define TK_FLOAT 131 --#define TK_BLOB 132 --#define TK_REGISTER 133 --#define TK_VARIABLE 134 --#define TK_CASE 135 --#define TK_WHEN 136 --#define TK_THEN 137 --#define TK_ELSE 138 --#define TK_INDEX 139 --#define TK_ALTER 140 --#define TK_ADD 141 --#define TK_TO_TEXT 142 --#define TK_TO_BLOB 143 --#define TK_TO_NUMERIC 144 --#define TK_TO_INT 145 --#define TK_TO_REAL 146 --#define TK_ISNOT 147 --#define TK_END_OF_FILE 148 --#define TK_ILLEGAL 149 --#define TK_SPACE 150 --#define TK_UNCLOSED_STRING 151 --#define TK_FUNCTION 152 --#define TK_COLUMN 153 --#define TK_AGG_FUNCTION 154 --#define TK_AGG_COLUMN 155 --#define TK_UMINUS 156 --#define TK_UPLUS 157 -+#define TK_SEMI 1 -+#define TK_EXPLAIN 2 -+#define TK_QUERY 3 -+#define TK_PLAN 4 -+#define TK_BEGIN 5 -+#define TK_TRANSACTION 6 -+#define TK_DEFERRED 7 -+#define TK_IMMEDIATE 8 -+#define TK_EXCLUSIVE 9 -+#define TK_COMMIT 10 -+#define TK_END 11 -+#define TK_ROLLBACK 12 -+#define TK_SAVEPOINT 13 -+#define TK_RELEASE 14 -+#define TK_TO 15 -+#define TK_TABLE 16 -+#define TK_CREATE 17 -+#define TK_IF 18 -+#define TK_NOT 19 -+#define TK_EXISTS 20 -+#define TK_TEMP 21 -+#define TK_LP 22 -+#define TK_RP 23 -+#define TK_AS 24 -+#define TK_WITHOUT 25 -+#define TK_COMMA 26 -+#define TK_ID 27 -+#define TK_INDEXED 28 -+#define TK_ABORT 29 -+#define TK_ACTION 30 -+#define TK_AFTER 31 -+#define TK_ANALYZE 32 -+#define TK_ASC 33 -+#define TK_ATTACH 34 -+#define TK_BEFORE 35 -+#define TK_BY 36 -+#define TK_CASCADE 37 -+#define TK_CAST 38 -+#define TK_COLUMNKW 39 -+#define TK_CONFLICT 40 -+#define TK_DATABASE 41 -+#define TK_DESC 42 -+#define TK_DETACH 43 -+#define TK_EACH 44 -+#define TK_FAIL 45 -+#define TK_FOR 46 -+#define TK_IGNORE 47 -+#define TK_INITIALLY 48 -+#define TK_INSTEAD 49 -+#define TK_LIKE_KW 50 -+#define TK_MATCH 51 -+#define TK_NO 52 -+#define TK_KEY 53 -+#define TK_OF 54 -+#define TK_OFFSET 55 -+#define TK_PRAGMA 56 -+#define TK_RAISE 57 -+#define TK_RECURSIVE 58 -+#define TK_REPLACE 59 -+#define TK_RESTRICT 60 -+#define TK_ROW 61 -+#define TK_TRIGGER 62 -+#define TK_VACUUM 63 -+#define TK_VIEW 64 -+#define TK_VIRTUAL 65 -+#define TK_WITH 66 -+#define TK_REINDEX 67 -+#define TK_RENAME 68 -+#define TK_CTIME_KW 69 -+#define TK_ANY 70 -+#define TK_OR 71 -+#define TK_AND 72 -+#define TK_IS 73 -+#define TK_BETWEEN 74 -+#define TK_IN 75 -+#define TK_ISNULL 76 -+#define TK_NOTNULL 77 -+#define TK_NE 78 -+#define TK_EQ 79 -+#define TK_GT 80 -+#define TK_LE 81 -+#define TK_LT 82 -+#define TK_GE 83 -+#define TK_ESCAPE 84 -+#define TK_BITAND 85 -+#define TK_BITOR 86 -+#define TK_LSHIFT 87 -+#define TK_RSHIFT 88 -+#define TK_PLUS 89 -+#define TK_MINUS 90 -+#define TK_STAR 91 -+#define TK_SLASH 92 -+#define TK_REM 93 -+#define TK_CONCAT 94 -+#define TK_COLLATE 95 -+#define TK_BITNOT 96 -+#define TK_STRING 97 -+#define TK_JOIN_KW 98 -+#define TK_CONSTRAINT 99 -+#define TK_DEFAULT 100 -+#define TK_NULL 101 -+#define TK_PRIMARY 102 -+#define TK_UNIQUE 103 -+#define TK_CHECK 104 -+#define TK_REFERENCES 105 -+#define TK_AUTOINCR 106 -+#define TK_ON 107 -+#define TK_INSERT 108 -+#define TK_DELETE 109 -+#define TK_UPDATE 110 -+#define TK_SET 111 -+#define TK_DEFERRABLE 112 -+#define TK_FOREIGN 113 -+#define TK_DROP 114 -+#define TK_UNION 115 -+#define TK_ALL 116 -+#define TK_EXCEPT 117 -+#define TK_INTERSECT 118 -+#define TK_SELECT 119 -+#define TK_VALUES 120 -+#define TK_DISTINCT 121 -+#define TK_DOT 122 -+#define TK_FROM 123 -+#define TK_JOIN 124 -+#define TK_USING 125 -+#define TK_ORDER 126 -+#define TK_GROUP 127 -+#define TK_HAVING 128 -+#define TK_LIMIT 129 -+#define TK_WHERE 130 -+#define TK_INTO 131 -+#define TK_INTEGER 132 -+#define TK_FLOAT 133 -+#define TK_BLOB 134 -+#define TK_VARIABLE 135 -+#define TK_CASE 136 -+#define TK_WHEN 137 -+#define TK_THEN 138 -+#define TK_ELSE 139 -+#define TK_INDEX 140 -+#define TK_ALTER 141 -+#define TK_ADD 142 -+#define TK_TO_TEXT 143 -+#define TK_TO_BLOB 144 -+#define TK_TO_NUMERIC 145 -+#define TK_TO_INT 146 -+#define TK_TO_REAL 147 -+#define TK_ISNOT 148 -+#define TK_END_OF_FILE 149 -+#define TK_ILLEGAL 150 -+#define TK_SPACE 151 -+#define TK_UNCLOSED_STRING 152 -+#define TK_FUNCTION 153 -+#define TK_COLUMN 154 -+#define TK_AGG_FUNCTION 155 -+#define TK_AGG_COLUMN 156 -+#define TK_UMINUS 157 -+#define TK_UPLUS 158 -+#define TK_REGISTER 159 -+#define TK_LEVEL 160 - - /************** End of parse.h ***********************************************/ - /************** Continuing where we left off in sqliteInt.h ******************/ -@@ -8583,6 +8633,7 @@ typedef struct LookasideSlot LookasideSl - typedef struct Module Module; - typedef struct NameContext NameContext; - typedef struct Parse Parse; -+typedef struct PrintfArguments PrintfArguments; - typedef struct RowSet RowSet; - typedef struct Savepoint Savepoint; - typedef struct Select Select; -@@ -8600,6 +8651,7 @@ typedef struct VTable VTable; - typedef struct VtabCtx VtabCtx; - typedef struct Walker Walker; - typedef struct WhereInfo WhereInfo; -+typedef struct With With; - - /* - ** Defer sourcing vdbe.h and btree.h until after the "u8" and -@@ -9055,7 +9107,7 @@ typedef struct VdbeOpList VdbeOpList; - #define OP_Blob 27 /* synopsis: r[P2]=P4 (len=P1) */ - #define OP_Variable 28 /* synopsis: r[P2]=parameter(P1,P4) */ - #define OP_Move 29 /* synopsis: r[P2@P3]=r[P1@P3] */ --#define OP_Copy 30 /* synopsis: r[P2@P3]=r[P1@P3] */ -+#define OP_Copy 30 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ - #define OP_SCopy 31 /* synopsis: r[P2]=r[P1] */ - #define OP_ResultRow 32 /* synopsis: output=r[P1@P2] */ - #define OP_CollSeq 33 -@@ -9079,105 +9131,106 @@ typedef struct VdbeOpList VdbeOpList; - #define OP_OpenWrite 51 /* synopsis: root=P2 iDb=P3 */ - #define OP_OpenAutoindex 52 /* synopsis: nColumn=P2 */ - #define OP_OpenEphemeral 53 /* synopsis: nColumn=P2 */ --#define OP_SorterOpen 54 --#define OP_OpenPseudo 55 /* synopsis: content in r[P2@P3] */ --#define OP_Close 56 --#define OP_SeekLt 57 /* synopsis: key=r[P3@P4] */ --#define OP_SeekLe 58 /* synopsis: key=r[P3@P4] */ --#define OP_SeekGe 59 /* synopsis: key=r[P3@P4] */ --#define OP_SeekGt 60 /* synopsis: key=r[P3@P4] */ --#define OP_Seek 61 /* synopsis: intkey=r[P2] */ --#define OP_NoConflict 62 /* synopsis: key=r[P3@P4] */ --#define OP_NotFound 63 /* synopsis: key=r[P3@P4] */ --#define OP_Found 64 /* synopsis: key=r[P3@P4] */ --#define OP_NotExists 65 /* synopsis: intkey=r[P3] */ --#define OP_Sequence 66 /* synopsis: r[P2]=rowid */ --#define OP_NewRowid 67 /* synopsis: r[P2]=rowid */ --#define OP_Insert 68 /* synopsis: intkey=r[P3] data=r[P2] */ --#define OP_Or 69 /* same as TK_OR, synopsis: r[P3]=(r[P1] || r[P2]) */ --#define OP_And 70 /* same as TK_AND, synopsis: r[P3]=(r[P1] && r[P2]) */ --#define OP_InsertInt 71 /* synopsis: intkey=P3 data=r[P2] */ --#define OP_Delete 72 --#define OP_ResetCount 73 --#define OP_IsNull 74 /* same as TK_ISNULL, synopsis: if r[P1]==NULL goto P2 */ --#define OP_NotNull 75 /* same as TK_NOTNULL, synopsis: if r[P1]!=NULL goto P2 */ --#define OP_Ne 76 /* same as TK_NE, synopsis: if r[P1]!=r[P3] goto P2 */ --#define OP_Eq 77 /* same as TK_EQ, synopsis: if r[P1]==r[P3] goto P2 */ --#define OP_Gt 78 /* same as TK_GT, synopsis: if r[P1]>r[P3] goto P2 */ --#define OP_Le 79 /* same as TK_LE, synopsis: if r[P1]<=r[P3] goto P2 */ --#define OP_Lt 80 /* same as TK_LT, synopsis: if r[P1]=r[P3] goto P2 */ --#define OP_SorterCompare 82 /* synopsis: if key(P1)!=rtrim(r[P3],P4) goto P2 */ --#define OP_BitAnd 83 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ --#define OP_BitOr 84 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ --#define OP_ShiftLeft 85 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<>r[P1] */ --#define OP_Add 87 /* same as TK_PLUS, synopsis: r[P3]=r[P1]+r[P2] */ --#define OP_Subtract 88 /* same as TK_MINUS, synopsis: r[P3]=r[P2]-r[P1] */ --#define OP_Multiply 89 /* same as TK_STAR, synopsis: r[P3]=r[P1]*r[P2] */ --#define OP_Divide 90 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */ --#define OP_Remainder 91 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */ --#define OP_Concat 92 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */ --#define OP_SorterData 93 /* synopsis: r[P2]=data */ --#define OP_BitNot 94 /* same as TK_BITNOT, synopsis: r[P1]= ~r[P1] */ --#define OP_String8 95 /* same as TK_STRING, synopsis: r[P2]='P4' */ --#define OP_RowKey 96 /* synopsis: r[P2]=key */ --#define OP_RowData 97 /* synopsis: r[P2]=data */ --#define OP_Rowid 98 /* synopsis: r[P2]=rowid */ --#define OP_NullRow 99 --#define OP_Last 100 --#define OP_SorterSort 101 --#define OP_Sort 102 --#define OP_Rewind 103 --#define OP_SorterInsert 104 --#define OP_IdxInsert 105 /* synopsis: key=r[P2] */ --#define OP_IdxDelete 106 /* synopsis: key=r[P2@P3] */ --#define OP_IdxRowid 107 /* synopsis: r[P2]=rowid */ --#define OP_IdxLT 108 /* synopsis: key=r[P3@P4] */ --#define OP_IdxGE 109 /* synopsis: key=r[P3@P4] */ --#define OP_Destroy 110 --#define OP_Clear 111 --#define OP_CreateIndex 112 /* synopsis: r[P2]=root iDb=P1 */ --#define OP_CreateTable 113 /* synopsis: r[P2]=root iDb=P1 */ --#define OP_ParseSchema 114 --#define OP_LoadAnalysis 115 --#define OP_DropTable 116 --#define OP_DropIndex 117 --#define OP_DropTrigger 118 --#define OP_IntegrityCk 119 --#define OP_RowSetAdd 120 /* synopsis: rowset(P1)=r[P2] */ --#define OP_RowSetRead 121 /* synopsis: r[P3]=rowset(P1) */ --#define OP_RowSetTest 122 /* synopsis: if r[P3] in rowset(P1) goto P2 */ --#define OP_Program 123 --#define OP_Param 124 --#define OP_FkCounter 125 /* synopsis: fkctr[P1]+=P2 */ --#define OP_FkIfZero 126 /* synopsis: if fkctr[P1]==0 goto P2 */ --#define OP_MemMax 127 /* synopsis: r[P1]=max(r[P1],r[P2]) */ --#define OP_IfPos 128 /* synopsis: if r[P1]>0 goto P2 */ --#define OP_IfNeg 129 /* synopsis: if r[P1]<0 goto P2 */ --#define OP_IfZero 130 /* synopsis: r[P1]+=P3, if r[P1]==0 goto P2 */ --#define OP_Real 131 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ -+#define OP_SwapCursors 54 -+#define OP_SorterOpen 55 -+#define OP_OpenPseudo 56 /* synopsis: content in r[P2@P3] */ -+#define OP_Close 57 -+#define OP_SeekLt 58 /* synopsis: key=r[P3@P4] */ -+#define OP_SeekLe 59 /* synopsis: key=r[P3@P4] */ -+#define OP_SeekGe 60 /* synopsis: key=r[P3@P4] */ -+#define OP_SeekGt 61 /* synopsis: key=r[P3@P4] */ -+#define OP_Seek 62 /* synopsis: intkey=r[P2] */ -+#define OP_NoConflict 63 /* synopsis: key=r[P3@P4] */ -+#define OP_NotFound 64 /* synopsis: key=r[P3@P4] */ -+#define OP_Found 65 /* synopsis: key=r[P3@P4] */ -+#define OP_NotExists 66 /* synopsis: intkey=r[P3] */ -+#define OP_Sequence 67 /* synopsis: r[P2]=rowid */ -+#define OP_NewRowid 68 /* synopsis: r[P2]=rowid */ -+#define OP_Insert 69 /* synopsis: intkey=r[P3] data=r[P2] */ -+#define OP_InsertInt 70 /* synopsis: intkey=P3 data=r[P2] */ -+#define OP_Or 71 /* same as TK_OR, synopsis: r[P3]=(r[P1] || r[P2]) */ -+#define OP_And 72 /* same as TK_AND, synopsis: r[P3]=(r[P1] && r[P2]) */ -+#define OP_Delete 73 -+#define OP_ResetCount 74 -+#define OP_SorterCompare 75 /* synopsis: if key(P1)!=rtrim(r[P3],P4) goto P2 */ -+#define OP_IsNull 76 /* same as TK_ISNULL, synopsis: if r[P1]==NULL goto P2 */ -+#define OP_NotNull 77 /* same as TK_NOTNULL, synopsis: if r[P1]!=NULL goto P2 */ -+#define OP_Ne 78 /* same as TK_NE, synopsis: if r[P1]!=r[P3] goto P2 */ -+#define OP_Eq 79 /* same as TK_EQ, synopsis: if r[P1]==r[P3] goto P2 */ -+#define OP_Gt 80 /* same as TK_GT, synopsis: if r[P1]>r[P3] goto P2 */ -+#define OP_Le 81 /* same as TK_LE, synopsis: if r[P1]<=r[P3] goto P2 */ -+#define OP_Lt 82 /* same as TK_LT, synopsis: if r[P1]=r[P3] goto P2 */ -+#define OP_SorterData 84 /* synopsis: r[P2]=data */ -+#define OP_BitAnd 85 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ -+#define OP_BitOr 86 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ -+#define OP_ShiftLeft 87 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<>r[P1] */ -+#define OP_Add 89 /* same as TK_PLUS, synopsis: r[P3]=r[P1]+r[P2] */ -+#define OP_Subtract 90 /* same as TK_MINUS, synopsis: r[P3]=r[P2]-r[P1] */ -+#define OP_Multiply 91 /* same as TK_STAR, synopsis: r[P3]=r[P1]*r[P2] */ -+#define OP_Divide 92 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */ -+#define OP_Remainder 93 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */ -+#define OP_Concat 94 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */ -+#define OP_RowKey 95 /* synopsis: r[P2]=key */ -+#define OP_BitNot 96 /* same as TK_BITNOT, synopsis: r[P1]= ~r[P1] */ -+#define OP_String8 97 /* same as TK_STRING, synopsis: r[P2]='P4' */ -+#define OP_RowData 98 /* synopsis: r[P2]=data */ -+#define OP_Rowid 99 /* synopsis: r[P2]=rowid */ -+#define OP_NullRow 100 -+#define OP_Last 101 -+#define OP_SorterSort 102 -+#define OP_Sort 103 -+#define OP_Rewind 104 -+#define OP_SorterInsert 105 -+#define OP_IdxInsert 106 /* synopsis: key=r[P2] */ -+#define OP_IdxDelete 107 /* synopsis: key=r[P2@P3] */ -+#define OP_IdxRowid 108 /* synopsis: r[P2]=rowid */ -+#define OP_IdxLT 109 /* synopsis: key=r[P3@P4] */ -+#define OP_IdxGE 110 /* synopsis: key=r[P3@P4] */ -+#define OP_Destroy 111 -+#define OP_Clear 112 -+#define OP_CreateIndex 113 /* synopsis: r[P2]=root iDb=P1 */ -+#define OP_CreateTable 114 /* synopsis: r[P2]=root iDb=P1 */ -+#define OP_ParseSchema 115 -+#define OP_LoadAnalysis 116 -+#define OP_DropTable 117 -+#define OP_DropIndex 118 -+#define OP_DropTrigger 119 -+#define OP_IntegrityCk 120 -+#define OP_RowSetAdd 121 /* synopsis: rowset(P1)=r[P2] */ -+#define OP_RowSetRead 122 /* synopsis: r[P3]=rowset(P1) */ -+#define OP_RowSetTest 123 /* synopsis: if r[P3] in rowset(P1) goto P2 */ -+#define OP_Program 124 -+#define OP_Param 125 -+#define OP_FkCounter 126 /* synopsis: fkctr[P1]+=P2 */ -+#define OP_FkIfZero 127 /* synopsis: if fkctr[P1]==0 goto P2 */ -+#define OP_MemMax 128 /* synopsis: r[P1]=max(r[P1],r[P2]) */ -+#define OP_IfPos 129 /* synopsis: if r[P1]>0 goto P2 */ -+#define OP_IfNeg 130 /* synopsis: if r[P1]<0 goto P2 */ -+#define OP_IfZero 131 /* synopsis: r[P1]+=P3, if r[P1]==0 goto P2 */ - #define OP_AggFinal 132 /* synopsis: accum=r[P1] N=P2 */ --#define OP_IncrVacuum 133 --#define OP_Expire 134 --#define OP_TableLock 135 /* synopsis: iDb=P1 root=P2 write=P3 */ --#define OP_VBegin 136 --#define OP_VCreate 137 --#define OP_VDestroy 138 --#define OP_VOpen 139 --#define OP_VColumn 140 /* synopsis: r[P3]=vcolumn(P2) */ --#define OP_VNext 141 --#define OP_ToText 142 /* same as TK_TO_TEXT */ --#define OP_ToBlob 143 /* same as TK_TO_BLOB */ --#define OP_ToNumeric 144 /* same as TK_TO_NUMERIC */ --#define OP_ToInt 145 /* same as TK_TO_INT */ --#define OP_ToReal 146 /* same as TK_TO_REAL */ --#define OP_VRename 147 --#define OP_Pagecount 148 --#define OP_MaxPgcnt 149 --#define OP_Trace 150 --#define OP_Noop 151 --#define OP_Explain 152 -+#define OP_Real 133 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ -+#define OP_IncrVacuum 134 -+#define OP_Expire 135 -+#define OP_TableLock 136 /* synopsis: iDb=P1 root=P2 write=P3 */ -+#define OP_VBegin 137 -+#define OP_VCreate 138 -+#define OP_VDestroy 139 -+#define OP_VOpen 140 -+#define OP_VColumn 141 /* synopsis: r[P3]=vcolumn(P2) */ -+#define OP_VNext 142 -+#define OP_ToText 143 /* same as TK_TO_TEXT */ -+#define OP_ToBlob 144 /* same as TK_TO_BLOB */ -+#define OP_ToNumeric 145 /* same as TK_TO_NUMERIC */ -+#define OP_ToInt 146 /* same as TK_TO_INT */ -+#define OP_ToReal 147 /* same as TK_TO_REAL */ -+#define OP_VRename 148 -+#define OP_Pagecount 149 -+#define OP_MaxPgcnt 150 -+#define OP_Trace 151 -+#define OP_Noop 152 -+#define OP_Explain 153 - - - /* Properties such as "out2" or "jump" that are specified in -@@ -9199,19 +9252,19 @@ typedef struct VdbeOpList VdbeOpList; - /* 32 */ 0x00, 0x00, 0x04, 0x05, 0x04, 0x00, 0x00, 0x01,\ - /* 40 */ 0x01, 0x05, 0x05, 0x00, 0x00, 0x00, 0x02, 0x02,\ - /* 48 */ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ --/* 56 */ 0x00, 0x11, 0x11, 0x11, 0x11, 0x08, 0x11, 0x11,\ --/* 64 */ 0x11, 0x11, 0x02, 0x02, 0x00, 0x4c, 0x4c, 0x00,\ --/* 72 */ 0x00, 0x00, 0x05, 0x05, 0x15, 0x15, 0x15, 0x15,\ --/* 80 */ 0x15, 0x15, 0x00, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c,\ --/* 88 */ 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x00, 0x24, 0x02,\ --/* 96 */ 0x00, 0x00, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01,\ --/* 104 */ 0x08, 0x08, 0x00, 0x02, 0x01, 0x01, 0x02, 0x00,\ --/* 112 */ 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ --/* 120 */ 0x0c, 0x45, 0x15, 0x01, 0x02, 0x00, 0x01, 0x08,\ --/* 128 */ 0x05, 0x05, 0x05, 0x02, 0x00, 0x01, 0x00, 0x00,\ --/* 136 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x04,\ --/* 144 */ 0x04, 0x04, 0x04, 0x00, 0x02, 0x02, 0x00, 0x00,\ --/* 152 */ 0x00,} -+/* 56 */ 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x08, 0x11,\ -+/* 64 */ 0x11, 0x11, 0x11, 0x02, 0x02, 0x00, 0x00, 0x4c,\ -+/* 72 */ 0x4c, 0x00, 0x00, 0x00, 0x05, 0x05, 0x15, 0x15,\ -+/* 80 */ 0x15, 0x15, 0x15, 0x15, 0x00, 0x4c, 0x4c, 0x4c,\ -+/* 88 */ 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x00,\ -+/* 96 */ 0x24, 0x02, 0x00, 0x02, 0x00, 0x01, 0x01, 0x01,\ -+/* 104 */ 0x01, 0x08, 0x08, 0x00, 0x02, 0x01, 0x01, 0x02,\ -+/* 112 */ 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\ -+/* 120 */ 0x00, 0x0c, 0x45, 0x15, 0x01, 0x02, 0x00, 0x01,\ -+/* 128 */ 0x08, 0x05, 0x05, 0x05, 0x00, 0x02, 0x01, 0x00,\ -+/* 136 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04,\ -+/* 144 */ 0x04, 0x04, 0x04, 0x04, 0x00, 0x02, 0x02, 0x00,\ -+/* 152 */ 0x00, 0x00,} - - /************** End of opcodes.h *********************************************/ - /************** Continuing where we left off in vdbe.h ***********************/ -@@ -9220,7 +9273,7 @@ typedef struct VdbeOpList VdbeOpList; - ** Prototypes for the VDBE interface. See comments on the implementation - ** for a description of what each of these routines does. - */ --SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(sqlite3*); -+SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse*); - SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe*,int); - SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe*,int,int); - SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe*,int,int,int); -@@ -9235,6 +9288,7 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP3( - SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, u8 P5); - SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe*, int addr); - SQLITE_PRIVATE void sqlite3VdbeChangeToNoop(Vdbe*, int addr); -+SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe*, u8 op); - SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N); - SQLITE_PRIVATE void sqlite3VdbeSetP4KeyInfo(Parse*, Index*); - SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe*, int); -@@ -9441,6 +9495,7 @@ SQLITE_PRIVATE int sqlite3PagerAcquire(P - SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno); - SQLITE_PRIVATE void sqlite3PagerRef(DbPage*); - SQLITE_PRIVATE void sqlite3PagerUnref(DbPage*); -+SQLITE_PRIVATE void sqlite3PagerUnrefNotNull(DbPage*); - - /* Operations on page references. */ - SQLITE_PRIVATE int sqlite3PagerWrite(DbPage*); -@@ -9455,7 +9510,7 @@ SQLITE_PRIVATE void sqlite3PagerPagecoun - SQLITE_PRIVATE int sqlite3PagerBegin(Pager*, int exFlag, int); - SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int); - SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager*); --SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager); -+SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager, const char *zMaster); - SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager*); - SQLITE_PRIVATE int sqlite3PagerRollback(Pager*); - SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int n); -@@ -9726,7 +9781,10 @@ SQLITE_PRIVATE void sqlite3PCacheSetDefa - #if !defined(SQLITE_OS_UNIX) && !defined(SQLITE_OS_OTHER) - # define SQLITE_OS_OTHER 0 - # ifndef SQLITE_OS_WIN --# if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__) -+# if defined(__CYGWIN__) -+# define SQLITE_OS_WIN 1 -+# define SQLITE_OS_UNIX 1 -+# elif defined(_WIN32) || defined(WIN32) || defined(__MINGW32__) || defined(__BORLANDC__) - # define SQLITE_OS_WIN 1 - # define SQLITE_OS_UNIX 0 - # else -@@ -9742,7 +9800,7 @@ SQLITE_PRIVATE void sqlite3PCacheSetDefa - # endif - #endif - --#if SQLITE_OS_WIN -+#if SQLITE_OS_WIN && !defined(__CYGWIN__) - # include - #endif - -@@ -10014,10 +10072,10 @@ SQLITE_PRIVATE int sqlite3OsCloseFree(sq - # define SQLITE_MUTEX_OMIT - #endif - #if SQLITE_THREADSAFE && !defined(SQLITE_MUTEX_NOOP) --# if SQLITE_OS_UNIX --# define SQLITE_MUTEX_PTHREADS --# elif SQLITE_OS_WIN -+# if SQLITE_OS_WIN - # define SQLITE_MUTEX_W32 -+# elif SQLITE_OS_UNIX -+# define SQLITE_MUTEX_PTHREADS - # else - # define SQLITE_MUTEX_NOOP - # endif -@@ -10327,7 +10385,7 @@ struct sqlite3 { - #define SQLITE_ColumnCache 0x0002 /* Column cache */ - #define SQLITE_GroupByOrder 0x0004 /* GROUPBY cover of ORDERBY */ - #define SQLITE_FactorOutConst 0x0008 /* Constant factoring */ --#define SQLITE_IdxRealAsInt 0x0010 /* Store REAL as INT in indices */ -+/* not used 0x0010 // Was: SQLITE_IdxRealAsInt */ - #define SQLITE_DistinctOpt 0x0020 /* DISTINCT using indexes */ - #define SQLITE_CoverIdxScan 0x0040 /* Covering index scans */ - #define SQLITE_OrderByIdxJoin 0x0080 /* ORDER BY of joins via index */ -@@ -10699,7 +10757,7 @@ struct Table { - }; - - /* --** Allowed values for Tabe.tabFlags. -+** Allowed values for Table.tabFlags. - */ - #define TF_Readonly 0x01 /* Read-only system table */ - #define TF_Ephemeral 0x02 /* An ephemeral table */ -@@ -10959,6 +11017,7 @@ struct AggInfo { - int sortingIdx; /* Cursor number of the sorting index */ - int sortingIdxPTab; /* Cursor number of pseudo-table */ - int nSortingColumn; /* Number of columns in the sorting index */ -+ int mnReg, mxReg; /* Range of registers allocated for aCol and aFunc */ - ExprList *pGroupBy; /* The group by clause */ - struct AggInfo_col { /* For each column used in source tables */ - Table *pTab; /* Source table */ -@@ -11287,6 +11346,7 @@ struct SrcList { - unsigned notIndexed :1; /* True if there is a NOT INDEXED clause */ - unsigned isCorrelated :1; /* True if sub-query is correlated */ - unsigned viaCoroutine :1; /* Implemented as a co-routine */ -+ unsigned isRecursive :1; /* True for recursive reference in WITH */ - #ifndef SQLITE_OMIT_EXPLAIN - u8 iSelectId; /* If pSelect!=0, the id of the sub-select in EQP */ - #endif -@@ -11375,6 +11435,8 @@ struct NameContext { - #define NC_IsCheck 0x04 /* True if resolving names in a CHECK constraint */ - #define NC_InAggFunc 0x08 /* True if analyzing arguments to an agg func */ - #define NC_PartIdx 0x10 /* True if resolving a partial index WHERE */ -+#define NC_Recursive 0x20 /* Resolving a recursive CTE definition */ -+#define NC_UsesLevel 0x40 /* The LEVEL pseudo-column has been seen */ - - /* - ** An instance of the following structure contains all information -@@ -11413,6 +11475,7 @@ struct Select { - Select *pRightmost; /* Right-most select in a compound select statement */ - Expr *pLimit; /* LIMIT expression. NULL means not used. */ - Expr *pOffset; /* OFFSET expression. NULL means not used. */ -+ With *pWith; /* WITH clause attached to this select. Or NULL. */ - }; - - /* -@@ -11430,6 +11493,8 @@ struct Select { - #define SF_Materialize 0x0100 /* Force materialization of views */ - #define SF_NestedFrom 0x0200 /* Part of a parenthesized FROM clause */ - #define SF_MaybeConvert 0x0400 /* Need convertCompoundSelectToSubquery() */ -+#define SF_Recursive 0x0800 /* The recursive part of a recursive CTE */ -+#define SF_UsesLevel 0x1000 /* Uses the LEVEL pseudo-column */ - - - /* -@@ -11450,6 +11515,7 @@ struct Select { - #define SRT_Table 8 /* Store result as data with an automatic rowid */ - #define SRT_EphemTab 9 /* Create transient tab and store like SRT_Table */ - #define SRT_Coroutine 10 /* Generate a single row of result */ -+#define SRT_DistTable 11 /* Like SRT_TABLE, but unique results only */ - - /* - ** An instance of this object describes where to put of the results of -@@ -11560,6 +11626,10 @@ struct Parse { - int nMem; /* Number of memory cells used so far */ - int nSet; /* Number of sets used so far */ - int nOnce; /* Number of OP_Once instructions so far */ -+ int nOpAlloc; /* Number of slots allocated for Vdbe.aOp[] */ -+ int nLabel; /* Number of labels used */ -+ int *aLabel; /* Space to hold the labels */ -+ int iFixedOp; /* Never back out opcodes iFixedOp-1 or earlier */ - int ckBase; /* Base register of data during check constraints */ - int iPartIdxTab; /* Table corresponding to a partial index */ - int iCacheLevel; /* ColCache valid when aColCache[].iLevel<=iCacheLevel */ -@@ -11630,6 +11700,9 @@ struct Parse { - #endif - Table *pZombieTab; /* List of Table objects to delete after code gen */ - TriggerPrg *pTriggerPrg; /* Linked list of coded triggers */ -+ With *pWith; /* Current WITH clause, or NULL */ -+ u8 bFreeWith; /* True if pWith should be freed with parser */ -+ int regLevel; /* Register holding the LEVEL variable */ - }; - - /* -@@ -11749,7 +11822,7 @@ struct TriggerStep { - Select *pSelect; /* SELECT statment or RHS of INSERT INTO .. SELECT ... */ - Token target; /* Target table for DELETE, UPDATE, INSERT */ - Expr *pWhere; /* The WHERE clause for DELETE or UPDATE steps */ -- ExprList *pExprList; /* SET clause for UPDATE. VALUES clause for INSERT */ -+ ExprList *pExprList; /* SET clause for UPDATE. */ - IdList *pIdList; /* Column names for INSERT */ - TriggerStep *pNext; /* Next in the link-list */ - TriggerStep *pLast; /* Last element in link-list. Valid for 1st elem only */ -@@ -11871,9 +11944,9 @@ struct Sqlite3Config { - struct Walker { - int (*xExprCallback)(Walker*, Expr*); /* Callback for expressions */ - int (*xSelectCallback)(Walker*,Select*); /* Callback for SELECTs */ -+ void (*xSelectCallback2)(Walker*,Select*);/* Second callback for SELECTs */ - Parse *pParse; /* Parser context. */ - int walkerDepth; /* Number of subqueries */ -- u8 bSelectDepthFirst; /* Do subqueries first */ - union { /* Extra data for callback */ - NameContext *pNC; /* Naming context */ - int i; /* Integer value */ -@@ -11898,6 +11971,21 @@ SQLITE_PRIVATE int sqlite3WalkSelectFrom - #define WRC_Abort 2 /* Abandon the tree walk */ - - /* -+** An instance of this structure represents a set of one or more CTEs -+** (common table expressions) created by a single WITH clause. -+*/ -+struct With { -+ int nCte; /* Number of CTEs in the WITH clause */ -+ With *pOuter; /* Containing WITH clause, or NULL */ -+ struct Cte { /* For each CTE in the WITH clause.... */ -+ char *zName; /* Name of this CTE */ -+ ExprList *pCols; /* List of explicit column names, or NULL */ -+ Select *pSelect; /* The definition of this CTE */ -+ const char *zErr; /* Error message for circular references */ -+ } a[1]; -+}; -+ -+/* - ** Assuming zIn points to the first byte of a UTF-8 character, - ** advance zIn to point to the first byte of the next UTF-8 character. - */ -@@ -12036,10 +12124,20 @@ SQLITE_PRIVATE int sqlite3IsNaN(double - # define sqlite3IsNaN(X) 0 - #endif - --SQLITE_PRIVATE void sqlite3VXPrintf(StrAccum*, int, const char*, va_list); --#ifndef SQLITE_OMIT_TRACE --SQLITE_PRIVATE void sqlite3XPrintf(StrAccum*, const char*, ...); --#endif -+/* -+** An instance of the following structure holds information about SQL -+** functions arguments that are the parameters to the printf() function. -+*/ -+struct PrintfArguments { -+ int nArg; /* Total number of arguments */ -+ int nUsed; /* Number of arguments used so far */ -+ sqlite3_value **apArg; /* The argument values */ -+}; -+ -+#define SQLITE_PRINTF_INTERNAL 0x01 -+#define SQLITE_PRINTF_SQLFUNC 0x02 -+SQLITE_PRIVATE void sqlite3VXPrintf(StrAccum*, u32, const char*, va_list); -+SQLITE_PRIVATE void sqlite3XPrintf(StrAccum*, u32, const char*, ...); - SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3*,const char*, ...); - SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3*,const char*, va_list); - SQLITE_PRIVATE char *sqlite3MAppendf(sqlite3*,char*,const char*,...); -@@ -12154,7 +12252,7 @@ SQLITE_PRIVATE void sqlite3Autoincreme - # define sqlite3AutoincrementEnd(X) - #endif - SQLITE_PRIVATE int sqlite3CodeCoroutine(Parse*, Select*, SelectDest*); --SQLITE_PRIVATE void sqlite3Insert(Parse*, SrcList*, ExprList*, Select*, IdList*, int); -+SQLITE_PRIVATE void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int); - SQLITE_PRIVATE void *sqlite3ArrayAllocate(sqlite3*,void*,int,int*,int*); - SQLITE_PRIVATE IdList *sqlite3IdListAppend(sqlite3*, IdList*, Token*); - SQLITE_PRIVATE int sqlite3IdListIndex(IdList*,const char*); -@@ -12229,7 +12327,6 @@ SQLITE_PRIVATE int sqlite3FunctionUsesTh - SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse*); - SQLITE_PRIVATE void sqlite3PrngSaveState(void); - SQLITE_PRIVATE void sqlite3PrngRestoreState(void); --SQLITE_PRIVATE void sqlite3PrngResetState(void); - SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3*,int); - SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse*, int); - SQLITE_PRIVATE void sqlite3CodeVerifyNamedSchema(Parse*, const char *zDb); -@@ -12249,7 +12346,7 @@ SQLITE_PRIVATE int sqlite3ExprNeedsNoAff - SQLITE_PRIVATE int sqlite3IsRowid(const char*); - SQLITE_PRIVATE void sqlite3GenerateRowDelete(Parse*,Table*,Trigger*,int,int,int,i16,u8,u8,u8); - SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int, int*); --SQLITE_PRIVATE int sqlite3GenerateIndexKey(Parse*, Index*, int, int, int, int*); -+SQLITE_PRIVATE int sqlite3GenerateIndexKey(Parse*, Index*, int, int, int, int*,Index*,int); - SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(Parse*,Table*,int*,int,int,int,int, - u8,u8,int,int*); - SQLITE_PRIVATE void sqlite3CompleteInsertion(Parse*,Table*,int,int,int,int*,int,int,int); -@@ -12293,7 +12390,7 @@ SQLITE_PRIVATE void sqlite3CodeRowTrig - SQLITE_PRIVATE void sqlite3DeleteTriggerStep(sqlite3*, TriggerStep*); - SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3*,Select*); - SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep(sqlite3*,Token*, IdList*, -- ExprList*,Select*,u8); -+ Select*,u8); - SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(sqlite3*,Token*,ExprList*, Expr*, u8); - SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep(sqlite3*,Token*, Expr*); - SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3*, Trigger*); -@@ -12398,8 +12495,7 @@ SQLITE_PRIVATE void *sqlite3HexToBlob(sq - SQLITE_PRIVATE u8 sqlite3HexToInt(int h); - SQLITE_PRIVATE int sqlite3TwoPartName(Parse *, Token *, Token *, Token **); - --#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) || \ -- defined(SQLITE_DEBUG_OS_TRACE) -+#if defined(SQLITE_TEST) - SQLITE_PRIVATE const char *sqlite3ErrName(int); - #endif - -@@ -12429,6 +12525,7 @@ SQLITE_PRIVATE const void *sqlite3ValueT - SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value*, u8); - SQLITE_PRIVATE void sqlite3ValueSetStr(sqlite3_value*, int, const void *,u8, - void(*)(void*)); -+SQLITE_PRIVATE void sqlite3ValueSetNull(sqlite3_value*); - SQLITE_PRIVATE void sqlite3ValueFree(sqlite3_value*); - SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *); - SQLITE_PRIVATE char *sqlite3Utf16to8(sqlite3 *, const void*, int, u8); -@@ -12494,6 +12591,7 @@ SQLITE_PRIVATE int sqlite3OpenTempDataba - - SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum*, char*, int, int); - SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum*,const char*,int); -+SQLITE_PRIVATE void sqlite3StrAccumAppendAll(StrAccum*,const char*); - SQLITE_PRIVATE void sqlite3AppendSpace(StrAccum*,int); - SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum*); - SQLITE_PRIVATE void sqlite3StrAccumReset(StrAccum*); -@@ -12585,6 +12683,16 @@ SQLITE_PRIVATE const char *sqlite3Journa - SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3*, int, int, int*, int*); - SQLITE_PRIVATE int sqlite3WalDefaultHook(void*,sqlite3*,const char*,int); - #endif -+#ifndef SQLITE_OMIT_CTE -+SQLITE_PRIVATE With *sqlite3WithAdd(Parse*,With*,Token*,ExprList*,Select*); -+SQLITE_PRIVATE void sqlite3WithDelete(sqlite3*,With*); -+SQLITE_PRIVATE void sqlite3WithPush(Parse*, With*, u8); -+#else -+#define sqlite3WithPush(x,y,z) -+#define sqlite3WithDelete(x,y) -+#define sqlite3WithAdd(p,w,t,x,y) (sqlite3ErrorMsg((p), \ -+ "near \"%T\": syntax error", (t)),(With*)(w)) -+#endif - - /* Declarations for functions in fkey.c. All of these are replaced by - ** no-op macros if OMIT_FOREIGN_KEY is defined. In this case no foreign -@@ -13720,12 +13828,9 @@ struct Vdbe { - Mem **apArg; /* Arguments to currently executing user function */ - Mem *aColName; /* Column names to return */ - Mem *pResultSet; /* Pointer to an array of results */ -+ Parse *pParse; /* Parsing context used to create this Vdbe */ - int nMem; /* Number of memory locations currently allocated */ - int nOp; /* Number of instructions in the program */ -- int nOpAlloc; /* Number of slots allocated for aOp[] */ -- int nLabel; /* Number of labels used */ -- int *aLabel; /* Space to hold the labels */ -- u16 nResColumn; /* Number of columns in one row of the result set */ - int nCursor; /* Number of slots in apCsr[] */ - u32 magic; /* Magic number for sanity checking */ - char *zErrMsg; /* Error message written here */ -@@ -13738,6 +13843,7 @@ struct Vdbe { - u32 cacheCtr; /* VdbeCursor row cache generation counter */ - int pc; /* The program counter */ - int rc; /* Value to return */ -+ u16 nResColumn; /* Number of columns in one row of the result set */ - u8 errorAction; /* Recovery action to do in case of an error */ - u8 minWriteFileFormat; /* Minimum file format for writable database files */ - bft explain:2; /* True if EXPLAIN present on SQL command */ -@@ -13797,7 +13903,7 @@ SQLITE_PRIVATE void sqlite3VdbePrintOp(F - #endif - SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32); - SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem*, int); --SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(unsigned char*, int, Mem*, int); -+SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32); - SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); - SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(Vdbe*, int, int); - -@@ -15387,7 +15493,21 @@ SQLITE_PRIVATE int sqlite3OsCheckReserve - ** routine has no return value since the return value would be meaningless. - */ - SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){ -- DO_OS_MALLOC_TEST(id); -+#ifdef SQLITE_TEST -+ if( op!=SQLITE_FCNTL_COMMIT_PHASETWO ){ -+ /* Faults are not injected into COMMIT_PHASETWO because, assuming SQLite -+ ** is using a regular VFS, it is called after the corresponding -+ ** transaction has been committed. Injecting a fault at this point -+ ** confuses the test scripts - the COMMIT comand returns SQLITE_NOMEM -+ ** but the transaction is committed anyway. -+ ** -+ ** The core must call OsFileControl() though, not OsFileControlHint(), -+ ** as if a custom VFS (e.g. zipvfs) returns an error here, it probably -+ ** means the commit really has failed and an error should be returned -+ ** to the user. */ -+ DO_OS_MALLOC_TEST(id); -+ } -+#endif - return id->pMethods->xFileControl(id, op, pArg); - } - SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file *id, int op, void *pArg){ -@@ -18618,6 +18738,10 @@ SQLITE_PRIVATE sqlite3_mutex_methods con - ** This file contains the C functions that implement mutexes for win32 - */ - -+#ifdef __CYGWIN__ -+# include /* amalgamator: keep */ -+#endif -+ - /* - ** The code in this file is only used if we are compiling multithreaded - ** on a win32 system. -@@ -18714,6 +18838,9 @@ static int winMutex_isInit = 0; - */ - static LONG winMutex_lock = 0; - -+#if defined(__CYGWIN__) && defined(SQLITE_AMALGAMATION) -+static -+#endif - SQLITE_API void sqlite3_win32_sleep(DWORD milliseconds); /* os_win.c */ - - static int winMutexInit(void){ -@@ -19382,7 +19509,7 @@ SQLITE_PRIVATE void sqlite3ScratchFree(v - */ - #ifndef SQLITE_OMIT_LOOKASIDE - static int isLookaside(sqlite3 *db, void *p){ -- return p && p>=db->lookaside.pStart && plookaside.pEnd; -+ return p>=db->lookaside.pStart && plookaside.pEnd; - } - #else - #define isLookaside(A,B) 0 -@@ -19398,8 +19525,9 @@ SQLITE_PRIVATE int sqlite3MallocSize(voi - return sqlite3GlobalConfig.m.xSize(p); - } - SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, void *p){ -- assert( db==0 || sqlite3_mutex_held(db->mutex) ); -- if( db && isLookaside(db, p) ){ -+ assert( db!=0 ); -+ assert( sqlite3_mutex_held(db->mutex) ); -+ if( isLookaside(db, p) ){ - return db->lookaside.sz; - }else{ - assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) ); -@@ -19883,6 +20011,31 @@ SQLITE_PRIVATE void sqlite3AppendSpace(S - } - - /* -+** Set the StrAccum object to an error mode. -+*/ -+static void setStrAccumError(StrAccum *p, u8 eError){ -+ p->accError = eError; -+ p->nAlloc = 0; -+} -+ -+/* -+** Extra argument values from a PrintfArguments object -+*/ -+static sqlite3_int64 getIntArg(PrintfArguments *p){ -+ if( p->nArg<=p->nUsed ) return 0; -+ return sqlite3_value_int64(p->apArg[p->nUsed++]); -+} -+static double getDoubleArg(PrintfArguments *p){ -+ if( p->nArg<=p->nUsed ) return 0.0; -+ return sqlite3_value_double(p->apArg[p->nUsed++]); -+} -+static char *getTextArg(PrintfArguments *p){ -+ if( p->nArg<=p->nUsed ) return 0; -+ return (char*)sqlite3_value_text(p->apArg[p->nUsed++]); -+} -+ -+ -+/* - ** On machines with a small stack size, you can redefine the - ** SQLITE_PRINT_BUF_SIZE to be something smaller, if desired. - */ -@@ -19895,10 +20048,10 @@ SQLITE_PRIVATE void sqlite3AppendSpace(S - ** Render a string given by "fmt" into the StrAccum object. - */ - SQLITE_PRIVATE void sqlite3VXPrintf( -- StrAccum *pAccum, /* Accumulate results here */ -- int useExtended, /* Allow extended %-conversions */ -- const char *fmt, /* Format string */ -- va_list ap /* arguments */ -+ StrAccum *pAccum, /* Accumulate results here */ -+ u32 bFlags, /* SQLITE_PRINTF_* flags */ -+ const char *fmt, /* Format string */ -+ va_list ap /* arguments */ - ){ - int c; /* Next character in the format string */ - char *bufpt; /* Pointer to the conversion buffer */ -@@ -19916,6 +20069,8 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - etByte flag_longlong; /* True if the "ll" flag is present */ - etByte done; /* Loop termination flag */ - etByte xtype = 0; /* Conversion paradigm */ -+ u8 bArgList; /* True for SQLITE_PRINTF_SQLFUNC */ -+ u8 useIntern; /* Ok to use internal conversions (ex: %T) */ - char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */ - sqlite_uint64 longvalue; /* Value for integer types */ - LONGDOUBLE_TYPE realvalue; /* Value for real types */ -@@ -19930,9 +20085,18 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - etByte flag_dp; /* True if decimal point should be shown */ - etByte flag_rtz; /* True if trailing zeros should be removed */ - #endif -+ PrintfArguments *pArgList = 0; /* Arguments for SQLITE_PRINTF_SQLFUNC */ - char buf[etBUFSIZE]; /* Conversion buffer */ - - bufpt = 0; -+ if( bFlags ){ -+ if( (bArgList = (bFlags & SQLITE_PRINTF_SQLFUNC))!=0 ){ -+ pArgList = va_arg(ap, PrintfArguments*); -+ } -+ useIntern = bFlags & SQLITE_PRINTF_INTERNAL; -+ }else{ -+ bArgList = useIntern = 0; -+ } - for(; (c=(*fmt))!=0; ++fmt){ - if( c!='%' ){ - int amt; -@@ -19964,7 +20128,11 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - /* Get the field width */ - width = 0; - if( c=='*' ){ -- width = va_arg(ap,int); -+ if( bArgList ){ -+ width = (int)getIntArg(pArgList); -+ }else{ -+ width = va_arg(ap,int); -+ } - if( width<0 ){ - flag_leftjustify = 1; - width = -width; -@@ -19981,7 +20149,11 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - precision = 0; - c = *++fmt; - if( c=='*' ){ -- precision = va_arg(ap,int); -+ if( bArgList ){ -+ precision = (int)getIntArg(pArgList); -+ }else{ -+ precision = va_arg(ap,int); -+ } - if( precision<0 ) precision = -precision; - c = *++fmt; - }else{ -@@ -20012,7 +20184,7 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - for(idx=0; idxflags & FLAG_INTERN)==0 ){ -+ if( useIntern || (infop->flags & FLAG_INTERN)==0 ){ - xtype = infop->type; - }else{ - return; -@@ -20052,7 +20224,9 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - case etRADIX: - if( infop->flags & FLAG_SIGNED ){ - i64 v; -- if( flag_longlong ){ -+ if( bArgList ){ -+ v = getIntArg(pArgList); -+ }else if( flag_longlong ){ - v = va_arg(ap,i64); - }else if( flag_long ){ - v = va_arg(ap,long int); -@@ -20073,7 +20247,9 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - else prefix = 0; - } - }else{ -- if( flag_longlong ){ -+ if( bArgList ){ -+ longvalue = (u64)getIntArg(pArgList); -+ }else if( flag_longlong ){ - longvalue = va_arg(ap,u64); - }else if( flag_long ){ - longvalue = va_arg(ap,unsigned long int); -@@ -20093,7 +20269,7 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - nOut = precision + 10; - zOut = zExtra = sqlite3Malloc( nOut ); - if( zOut==0 ){ -- pAccum->accError = STRACCUM_NOMEM; -+ setStrAccumError(pAccum, STRACCUM_NOMEM); - return; - } - } -@@ -20133,7 +20309,11 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - case etFLOAT: - case etEXP: - case etGENERIC: -- realvalue = va_arg(ap,double); -+ if( bArgList ){ -+ realvalue = getDoubleArg(pArgList); -+ }else{ -+ realvalue = va_arg(ap,double); -+ } - #ifdef SQLITE_OMIT_FLOATING_POINT - length = 0; - #else -@@ -20205,7 +20385,7 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - if( MAX(e2,0)+precision+width > etBUFSIZE - 15 ){ - bufpt = zExtra = sqlite3Malloc( MAX(e2,0)+precision+width+15 ); - if( bufpt==0 ){ -- pAccum->accError = STRACCUM_NOMEM; -+ setStrAccumError(pAccum, STRACCUM_NOMEM); - return; - } - } -@@ -20288,7 +20468,9 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - #endif /* !defined(SQLITE_OMIT_FLOATING_POINT) */ - break; - case etSIZE: -- *(va_arg(ap,int*)) = pAccum->nChar; -+ if( !bArgList ){ -+ *(va_arg(ap,int*)) = pAccum->nChar; -+ } - length = width = 0; - break; - case etPERCENT: -@@ -20297,7 +20479,12 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - length = 1; - break; - case etCHARX: -- c = va_arg(ap,int); -+ if( bArgList ){ -+ bufpt = getTextArg(pArgList); -+ c = bufpt ? bufpt[0] : 0; -+ }else{ -+ c = va_arg(ap,int); -+ } - buf[0] = (char)c; - if( precision>=0 ){ - for(idx=1; idx=0 ){ -@@ -20328,7 +20519,13 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - int needQuote; - char ch; - char q = ((xtype==etSQLESCAPE3)?'"':'\''); /* Quote character */ -- char *escarg = va_arg(ap,char*); -+ char *escarg; -+ -+ if( bArgList ){ -+ escarg = getTextArg(pArgList); -+ }else{ -+ escarg = va_arg(ap,char*); -+ } - isnull = escarg==0; - if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)"); - k = precision; -@@ -20340,7 +20537,7 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - if( n>etBUFSIZE ){ - bufpt = zExtra = sqlite3Malloc( n ); - if( bufpt==0 ){ -- pAccum->accError = STRACCUM_NOMEM; -+ setStrAccumError(pAccum, STRACCUM_NOMEM); - return; - } - }else{ -@@ -20363,7 +20560,8 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - } - case etTOKEN: { - Token *pToken = va_arg(ap, Token*); -- if( pToken ){ -+ assert( bArgList==0 ); -+ if( pToken && pToken->n ){ - sqlite3StrAccumAppend(pAccum, (const char*)pToken->z, pToken->n); - } - length = width = 0; -@@ -20373,12 +20571,13 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - SrcList *pSrc = va_arg(ap, SrcList*); - int k = va_arg(ap, int); - struct SrcList_item *pItem = &pSrc->a[k]; -+ assert( bArgList==0 ); - assert( k>=0 && knSrc ); - if( pItem->zDatabase ){ -- sqlite3StrAccumAppend(pAccum, pItem->zDatabase, -1); -+ sqlite3StrAccumAppendAll(pAccum, pItem->zDatabase); - sqlite3StrAccumAppend(pAccum, ".", 1); - } -- sqlite3StrAccumAppend(pAccum, pItem->zName, -1); -+ sqlite3StrAccumAppendAll(pAccum, pItem->zName); - length = width = 0; - break; - } -@@ -20409,7 +20608,7 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - sqlite3AppendSpace(pAccum, nspace); - } - } -- sqlite3_free(zExtra); -+ if( zExtra ) sqlite3_free(zExtra); - }/* End for loop over the format string */ - } /* End of function */ - -@@ -20417,22 +20616,20 @@ SQLITE_PRIVATE void sqlite3VXPrintf( - ** Append N bytes of text from z to the StrAccum object. - */ - SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){ -- assert( z!=0 || N==0 ); -- if( p->accError ){ -- testcase(p->accError==STRACCUM_TOOBIG); -- testcase(p->accError==STRACCUM_NOMEM); -- return; -- } -- assert( p->zText!=0 || p->nChar==0 ); -- if( N<=0 ){ -- if( N==0 || z[0]==0 ) return; -- N = sqlite3Strlen30(z); -- } -+ assert( z!=0 ); -+ assert( p->zText!=0 || p->nChar==0 || p->accError ); -+ assert( N>=0 ); -+ assert( p->accError==0 || p->nAlloc==0 ); - if( p->nChar+N >= p->nAlloc ){ - char *zNew; -+ if( p->accError ){ -+ testcase(p->accError==STRACCUM_TOOBIG); -+ testcase(p->accError==STRACCUM_NOMEM); -+ return; -+ } - if( !p->useMalloc ){ -- p->accError = STRACCUM_TOOBIG; - N = p->nAlloc - p->nChar - 1; -+ setStrAccumError(p, STRACCUM_TOOBIG); - if( N<=0 ){ - return; - } -@@ -20442,7 +20639,7 @@ SQLITE_PRIVATE void sqlite3StrAccumAppen - szNew += N + 1; - if( szNew > p->mxAlloc ){ - sqlite3StrAccumReset(p); -- p->accError = STRACCUM_TOOBIG; -+ setStrAccumError(p, STRACCUM_TOOBIG); - return; - }else{ - p->nAlloc = (int)szNew; -@@ -20456,8 +20653,8 @@ SQLITE_PRIVATE void sqlite3StrAccumAppen - if( zOld==0 && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar); - p->zText = zNew; - }else{ -- p->accError = STRACCUM_NOMEM; - sqlite3StrAccumReset(p); -+ setStrAccumError(p, STRACCUM_NOMEM); - return; - } - } -@@ -20468,6 +20665,14 @@ SQLITE_PRIVATE void sqlite3StrAccumAppen - } - - /* -+** Append the complete text of zero-terminated string z[] to the p string. -+*/ -+SQLITE_PRIVATE void sqlite3StrAccumAppendAll(StrAccum *p, const char *z){ -+ sqlite3StrAccumAppend(p, z, sqlite3Strlen30(z)); -+} -+ -+ -+/* - ** Finish off a string by making sure it is zero-terminated. - ** Return a pointer to the resulting string. Return a NULL - ** pointer if any kind of error was encountered. -@@ -20484,7 +20689,7 @@ SQLITE_PRIVATE char *sqlite3StrAccumFini - if( p->zText ){ - memcpy(p->zText, p->zBase, p->nChar+1); - }else{ -- p->accError = STRACCUM_NOMEM; -+ setStrAccumError(p, STRACCUM_NOMEM); - } - } - } -@@ -20530,7 +20735,7 @@ SQLITE_PRIVATE char *sqlite3VMPrintf(sql - sqlite3StrAccumInit(&acc, zBase, sizeof(zBase), - db->aLimit[SQLITE_LIMIT_LENGTH]); - acc.db = db; -- sqlite3VXPrintf(&acc, 1, zFormat, ap); -+ sqlite3VXPrintf(&acc, SQLITE_PRINTF_INTERNAL, zFormat, ap); - z = sqlite3StrAccumFinish(&acc); - if( acc.accError==STRACCUM_NOMEM ){ - db->mallocFailed = 1; -@@ -20686,17 +20891,15 @@ SQLITE_PRIVATE void sqlite3DebugPrintf(c - } - #endif - --#ifndef SQLITE_OMIT_TRACE - /* - ** variable-argument wrapper around sqlite3VXPrintf(). - */ --SQLITE_PRIVATE void sqlite3XPrintf(StrAccum *p, const char *zFormat, ...){ -+SQLITE_PRIVATE void sqlite3XPrintf(StrAccum *p, u32 bFlags, const char *zFormat, ...){ - va_list ap; - va_start(ap,zFormat); -- sqlite3VXPrintf(p, 1, zFormat, ap); -+ sqlite3VXPrintf(p, bFlags, zFormat, ap); - va_end(ap); - } --#endif - - /************** End of printf.c **********************************************/ - /************** Begin file random.c ******************************************/ -@@ -20753,6 +20956,12 @@ SQLITE_API void sqlite3_randomness(int N - sqlite3_mutex_enter(mutex); - #endif - -+ if( N<=0 ){ -+ wsdPrng.isInit = 0; -+ sqlite3_mutex_leave(mutex); -+ return; -+ } -+ - /* Initialize the state of the random number generator once, - ** the first time this routine is called. The seed value does - ** not need to contain a lot of randomness since we are not -@@ -20780,7 +20989,8 @@ SQLITE_API void sqlite3_randomness(int N - wsdPrng.isInit = 1; - } - -- while( N-- ){ -+ assert( N>0 ); -+ do{ - wsdPrng.i++; - t = wsdPrng.s[wsdPrng.i]; - wsdPrng.j += t; -@@ -20788,7 +20998,7 @@ SQLITE_API void sqlite3_randomness(int N - wsdPrng.s[wsdPrng.j] = t; - t += wsdPrng.s[wsdPrng.i]; - *(zBuf++) = wsdPrng.s[t]; -- } -+ }while( --N ); - sqlite3_mutex_leave(mutex); - } - -@@ -20817,9 +21027,6 @@ SQLITE_PRIVATE void sqlite3PrngRestoreSt - sizeof(sqlite3Prng) - ); - } --SQLITE_PRIVATE void sqlite3PrngResetState(void){ -- GLOBAL(struct sqlite3PrngType, sqlite3Prng).isInit = 0; --} - #endif /* SQLITE_OMIT_BUILTIN_TEST */ - - /************** End of random.c **********************************************/ -@@ -21471,18 +21678,17 @@ SQLITE_PRIVATE int sqlite3Strlen30(const - ** to NULL. - */ - SQLITE_PRIVATE void sqlite3Error(sqlite3 *db, int err_code, const char *zFormat, ...){ -- if( db && (db->pErr || (db->pErr = sqlite3ValueNew(db))!=0) ){ -- db->errCode = err_code; -- if( zFormat ){ -- char *z; -- va_list ap; -- va_start(ap, zFormat); -- z = sqlite3VMPrintf(db, zFormat, ap); -- va_end(ap); -- sqlite3ValueSetStr(db->pErr, -1, z, SQLITE_UTF8, SQLITE_DYNAMIC); -- }else{ -- sqlite3ValueSetStr(db->pErr, 0, 0, SQLITE_UTF8, SQLITE_STATIC); -- } -+ assert( db!=0 ); -+ db->errCode = err_code; -+ if( zFormat && (db->pErr || (db->pErr = sqlite3ValueNew(db))!=0) ){ -+ char *z; -+ va_list ap; -+ va_start(ap, zFormat); -+ z = sqlite3VMPrintf(db, zFormat, ap); -+ va_end(ap); -+ sqlite3ValueSetStr(db->pErr, -1, z, SQLITE_UTF8, SQLITE_DYNAMIC); -+ }else if( db->pErr ){ -+ sqlite3ValueSetNull(db->pErr); - } - } - -@@ -22967,7 +23173,7 @@ SQLITE_PRIVATE const char *sqlite3Opcode - /* 27 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), - /* 28 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), - /* 29 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), -- /* 30 */ "Copy" OpHelp("r[P2@P3]=r[P1@P3]"), -+ /* 30 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), - /* 31 */ "SCopy" OpHelp("r[P2]=r[P1]"), - /* 32 */ "ResultRow" OpHelp("output=r[P1@P2]"), - /* 33 */ "CollSeq" OpHelp(""), -@@ -22991,105 +23197,106 @@ SQLITE_PRIVATE const char *sqlite3Opcode - /* 51 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), - /* 52 */ "OpenAutoindex" OpHelp("nColumn=P2"), - /* 53 */ "OpenEphemeral" OpHelp("nColumn=P2"), -- /* 54 */ "SorterOpen" OpHelp(""), -- /* 55 */ "OpenPseudo" OpHelp("content in r[P2@P3]"), -- /* 56 */ "Close" OpHelp(""), -- /* 57 */ "SeekLt" OpHelp("key=r[P3@P4]"), -- /* 58 */ "SeekLe" OpHelp("key=r[P3@P4]"), -- /* 59 */ "SeekGe" OpHelp("key=r[P3@P4]"), -- /* 60 */ "SeekGt" OpHelp("key=r[P3@P4]"), -- /* 61 */ "Seek" OpHelp("intkey=r[P2]"), -- /* 62 */ "NoConflict" OpHelp("key=r[P3@P4]"), -- /* 63 */ "NotFound" OpHelp("key=r[P3@P4]"), -- /* 64 */ "Found" OpHelp("key=r[P3@P4]"), -- /* 65 */ "NotExists" OpHelp("intkey=r[P3]"), -- /* 66 */ "Sequence" OpHelp("r[P2]=rowid"), -- /* 67 */ "NewRowid" OpHelp("r[P2]=rowid"), -- /* 68 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"), -- /* 69 */ "Or" OpHelp("r[P3]=(r[P1] || r[P2])"), -- /* 70 */ "And" OpHelp("r[P3]=(r[P1] && r[P2])"), -- /* 71 */ "InsertInt" OpHelp("intkey=P3 data=r[P2]"), -- /* 72 */ "Delete" OpHelp(""), -- /* 73 */ "ResetCount" OpHelp(""), -- /* 74 */ "IsNull" OpHelp("if r[P1]==NULL goto P2"), -- /* 75 */ "NotNull" OpHelp("if r[P1]!=NULL goto P2"), -- /* 76 */ "Ne" OpHelp("if r[P1]!=r[P3] goto P2"), -- /* 77 */ "Eq" OpHelp("if r[P1]==r[P3] goto P2"), -- /* 78 */ "Gt" OpHelp("if r[P1]>r[P3] goto P2"), -- /* 79 */ "Le" OpHelp("if r[P1]<=r[P3] goto P2"), -- /* 80 */ "Lt" OpHelp("if r[P1]=r[P3] goto P2"), -- /* 82 */ "SorterCompare" OpHelp("if key(P1)!=rtrim(r[P3],P4) goto P2"), -- /* 83 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), -- /* 84 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), -- /* 85 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<>r[P1]"), -- /* 87 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"), -- /* 88 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"), -- /* 89 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"), -- /* 90 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"), -- /* 91 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"), -- /* 92 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"), -- /* 93 */ "SorterData" OpHelp("r[P2]=data"), -- /* 94 */ "BitNot" OpHelp("r[P1]= ~r[P1]"), -- /* 95 */ "String8" OpHelp("r[P2]='P4'"), -- /* 96 */ "RowKey" OpHelp("r[P2]=key"), -- /* 97 */ "RowData" OpHelp("r[P2]=data"), -- /* 98 */ "Rowid" OpHelp("r[P2]=rowid"), -- /* 99 */ "NullRow" OpHelp(""), -- /* 100 */ "Last" OpHelp(""), -- /* 101 */ "SorterSort" OpHelp(""), -- /* 102 */ "Sort" OpHelp(""), -- /* 103 */ "Rewind" OpHelp(""), -- /* 104 */ "SorterInsert" OpHelp(""), -- /* 105 */ "IdxInsert" OpHelp("key=r[P2]"), -- /* 106 */ "IdxDelete" OpHelp("key=r[P2@P3]"), -- /* 107 */ "IdxRowid" OpHelp("r[P2]=rowid"), -- /* 108 */ "IdxLT" OpHelp("key=r[P3@P4]"), -- /* 109 */ "IdxGE" OpHelp("key=r[P3@P4]"), -- /* 110 */ "Destroy" OpHelp(""), -- /* 111 */ "Clear" OpHelp(""), -- /* 112 */ "CreateIndex" OpHelp("r[P2]=root iDb=P1"), -- /* 113 */ "CreateTable" OpHelp("r[P2]=root iDb=P1"), -- /* 114 */ "ParseSchema" OpHelp(""), -- /* 115 */ "LoadAnalysis" OpHelp(""), -- /* 116 */ "DropTable" OpHelp(""), -- /* 117 */ "DropIndex" OpHelp(""), -- /* 118 */ "DropTrigger" OpHelp(""), -- /* 119 */ "IntegrityCk" OpHelp(""), -- /* 120 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), -- /* 121 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"), -- /* 122 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"), -- /* 123 */ "Program" OpHelp(""), -- /* 124 */ "Param" OpHelp(""), -- /* 125 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), -- /* 126 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"), -- /* 127 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), -- /* 128 */ "IfPos" OpHelp("if r[P1]>0 goto P2"), -- /* 129 */ "IfNeg" OpHelp("if r[P1]<0 goto P2"), -- /* 130 */ "IfZero" OpHelp("r[P1]+=P3, if r[P1]==0 goto P2"), -- /* 131 */ "Real" OpHelp("r[P2]=P4"), -+ /* 54 */ "SwapCursors" OpHelp(""), -+ /* 55 */ "SorterOpen" OpHelp(""), -+ /* 56 */ "OpenPseudo" OpHelp("content in r[P2@P3]"), -+ /* 57 */ "Close" OpHelp(""), -+ /* 58 */ "SeekLt" OpHelp("key=r[P3@P4]"), -+ /* 59 */ "SeekLe" OpHelp("key=r[P3@P4]"), -+ /* 60 */ "SeekGe" OpHelp("key=r[P3@P4]"), -+ /* 61 */ "SeekGt" OpHelp("key=r[P3@P4]"), -+ /* 62 */ "Seek" OpHelp("intkey=r[P2]"), -+ /* 63 */ "NoConflict" OpHelp("key=r[P3@P4]"), -+ /* 64 */ "NotFound" OpHelp("key=r[P3@P4]"), -+ /* 65 */ "Found" OpHelp("key=r[P3@P4]"), -+ /* 66 */ "NotExists" OpHelp("intkey=r[P3]"), -+ /* 67 */ "Sequence" OpHelp("r[P2]=rowid"), -+ /* 68 */ "NewRowid" OpHelp("r[P2]=rowid"), -+ /* 69 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"), -+ /* 70 */ "InsertInt" OpHelp("intkey=P3 data=r[P2]"), -+ /* 71 */ "Or" OpHelp("r[P3]=(r[P1] || r[P2])"), -+ /* 72 */ "And" OpHelp("r[P3]=(r[P1] && r[P2])"), -+ /* 73 */ "Delete" OpHelp(""), -+ /* 74 */ "ResetCount" OpHelp(""), -+ /* 75 */ "SorterCompare" OpHelp("if key(P1)!=rtrim(r[P3],P4) goto P2"), -+ /* 76 */ "IsNull" OpHelp("if r[P1]==NULL goto P2"), -+ /* 77 */ "NotNull" OpHelp("if r[P1]!=NULL goto P2"), -+ /* 78 */ "Ne" OpHelp("if r[P1]!=r[P3] goto P2"), -+ /* 79 */ "Eq" OpHelp("if r[P1]==r[P3] goto P2"), -+ /* 80 */ "Gt" OpHelp("if r[P1]>r[P3] goto P2"), -+ /* 81 */ "Le" OpHelp("if r[P1]<=r[P3] goto P2"), -+ /* 82 */ "Lt" OpHelp("if r[P1]=r[P3] goto P2"), -+ /* 84 */ "SorterData" OpHelp("r[P2]=data"), -+ /* 85 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), -+ /* 86 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), -+ /* 87 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<>r[P1]"), -+ /* 89 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"), -+ /* 90 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"), -+ /* 91 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"), -+ /* 92 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"), -+ /* 93 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"), -+ /* 94 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"), -+ /* 95 */ "RowKey" OpHelp("r[P2]=key"), -+ /* 96 */ "BitNot" OpHelp("r[P1]= ~r[P1]"), -+ /* 97 */ "String8" OpHelp("r[P2]='P4'"), -+ /* 98 */ "RowData" OpHelp("r[P2]=data"), -+ /* 99 */ "Rowid" OpHelp("r[P2]=rowid"), -+ /* 100 */ "NullRow" OpHelp(""), -+ /* 101 */ "Last" OpHelp(""), -+ /* 102 */ "SorterSort" OpHelp(""), -+ /* 103 */ "Sort" OpHelp(""), -+ /* 104 */ "Rewind" OpHelp(""), -+ /* 105 */ "SorterInsert" OpHelp(""), -+ /* 106 */ "IdxInsert" OpHelp("key=r[P2]"), -+ /* 107 */ "IdxDelete" OpHelp("key=r[P2@P3]"), -+ /* 108 */ "IdxRowid" OpHelp("r[P2]=rowid"), -+ /* 109 */ "IdxLT" OpHelp("key=r[P3@P4]"), -+ /* 110 */ "IdxGE" OpHelp("key=r[P3@P4]"), -+ /* 111 */ "Destroy" OpHelp(""), -+ /* 112 */ "Clear" OpHelp(""), -+ /* 113 */ "CreateIndex" OpHelp("r[P2]=root iDb=P1"), -+ /* 114 */ "CreateTable" OpHelp("r[P2]=root iDb=P1"), -+ /* 115 */ "ParseSchema" OpHelp(""), -+ /* 116 */ "LoadAnalysis" OpHelp(""), -+ /* 117 */ "DropTable" OpHelp(""), -+ /* 118 */ "DropIndex" OpHelp(""), -+ /* 119 */ "DropTrigger" OpHelp(""), -+ /* 120 */ "IntegrityCk" OpHelp(""), -+ /* 121 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), -+ /* 122 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"), -+ /* 123 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"), -+ /* 124 */ "Program" OpHelp(""), -+ /* 125 */ "Param" OpHelp(""), -+ /* 126 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), -+ /* 127 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"), -+ /* 128 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), -+ /* 129 */ "IfPos" OpHelp("if r[P1]>0 goto P2"), -+ /* 130 */ "IfNeg" OpHelp("if r[P1]<0 goto P2"), -+ /* 131 */ "IfZero" OpHelp("r[P1]+=P3, if r[P1]==0 goto P2"), - /* 132 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), -- /* 133 */ "IncrVacuum" OpHelp(""), -- /* 134 */ "Expire" OpHelp(""), -- /* 135 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), -- /* 136 */ "VBegin" OpHelp(""), -- /* 137 */ "VCreate" OpHelp(""), -- /* 138 */ "VDestroy" OpHelp(""), -- /* 139 */ "VOpen" OpHelp(""), -- /* 140 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), -- /* 141 */ "VNext" OpHelp(""), -- /* 142 */ "ToText" OpHelp(""), -- /* 143 */ "ToBlob" OpHelp(""), -- /* 144 */ "ToNumeric" OpHelp(""), -- /* 145 */ "ToInt" OpHelp(""), -- /* 146 */ "ToReal" OpHelp(""), -- /* 147 */ "VRename" OpHelp(""), -- /* 148 */ "Pagecount" OpHelp(""), -- /* 149 */ "MaxPgcnt" OpHelp(""), -- /* 150 */ "Trace" OpHelp(""), -- /* 151 */ "Noop" OpHelp(""), -- /* 152 */ "Explain" OpHelp(""), -+ /* 133 */ "Real" OpHelp("r[P2]=P4"), -+ /* 134 */ "IncrVacuum" OpHelp(""), -+ /* 135 */ "Expire" OpHelp(""), -+ /* 136 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), -+ /* 137 */ "VBegin" OpHelp(""), -+ /* 138 */ "VCreate" OpHelp(""), -+ /* 139 */ "VDestroy" OpHelp(""), -+ /* 140 */ "VOpen" OpHelp(""), -+ /* 141 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), -+ /* 142 */ "VNext" OpHelp(""), -+ /* 143 */ "ToText" OpHelp(""), -+ /* 144 */ "ToBlob" OpHelp(""), -+ /* 145 */ "ToNumeric" OpHelp(""), -+ /* 146 */ "ToInt" OpHelp(""), -+ /* 147 */ "ToReal" OpHelp(""), -+ /* 148 */ "VRename" OpHelp(""), -+ /* 149 */ "Pagecount" OpHelp(""), -+ /* 150 */ "MaxPgcnt" OpHelp(""), -+ /* 151 */ "Trace" OpHelp(""), -+ /* 152 */ "Noop" OpHelp(""), -+ /* 153 */ "Explain" OpHelp(""), - }; - return azName[i]; - } -@@ -23162,7 +23369,7 @@ SQLITE_PRIVATE const char *sqlite3Opcode - ** where the database is located. - */ - #if !defined(SQLITE_ENABLE_LOCKING_STYLE) --# if defined(__APPLE__) -+# if defined(__APPLE__) || defined(__CYGWIN__) - # define SQLITE_ENABLE_LOCKING_STYLE 1 - # else - # define SQLITE_ENABLE_LOCKING_STYLE 0 -@@ -23221,13 +23428,17 @@ SQLITE_PRIVATE const char *sqlite3Opcode - #include - #endif - -+#ifdef __CYGWIN__ -+# include -+#endif - --#if SQLITE_ENABLE_LOCKING_STYLE -+#if SQLITE_ENABLE_LOCKING_STYLE || defined(__CYGWIN__) - # include --# if OS_VXWORKS -+# if OS_VXWORKS || defined(__CYGWIN__) - # include - # include --# else -+# endif -+# if !OS_VXWORKS - # include - # include - # endif -@@ -23272,7 +23483,15 @@ SQLITE_PRIVATE const char *sqlite3Opcode - /* - ** Maximum supported path-length. - */ --#define MAX_PATHNAME 512 -+#ifndef MAX_PATHNAME -+# if defined(PATH_MAX) -+# define MAX_PATHNAME PATH_MAX -+# elif defined(MAXPATHLEN) -+# define MAX_PATHNAME MAXPATHLEN -+# else -+# define MAX_PATHNAME 512 -+# endif -+#endif - - /* - ** Only set the lastErrno if the error code is a real error and not -@@ -23330,7 +23549,7 @@ struct unixFile { - #if SQLITE_ENABLE_LOCKING_STYLE - int openFlags; /* The flags specified at open() */ - #endif --#if SQLITE_ENABLE_LOCKING_STYLE || defined(__APPLE__) -+#if SQLITE_ENABLE_LOCKING_STYLE && !defined(__CYGWIN__) || defined(__APPLE__) - unsigned fsFlags; /* cached details from statfs() */ - #endif - #if OS_VXWORKS -@@ -23358,6 +23577,12 @@ struct unixFile { - #endif - }; - -+/* This variable holds the process id (pid) from when the xRandomness() -+** method was called. If xOpen() is called from a different process id, -+** indicating that a fork() has occurred, the PRNG will be reset. -+*/ -+static int randomnessPid = 0; -+ - /* - ** Allowed values for the unixFile.ctrlFlags bitmask: - */ -@@ -23656,6 +23881,7 @@ static int openDirectory(const char*, in - ** testing and sandboxing. The following array holds the names and pointers - ** to all overrideable system calls. - */ -+#define aSyscall aUnixSyscall - static struct unix_syscall { - const char *zName; /* Name of the system call */ - sqlite3_syscall_ptr pCurrent; /* Current value of the system call */ -@@ -24152,7 +24378,9 @@ struct vxworksFileId { - ** variable: - */ - static struct vxworksFileId *vxworksFileList = 0; -+#endif /* OS_VXWORKS */ - -+#if OS_VXWORKS || defined(__CYGWIN__) - /* - ** Simplify a filename into its canonical form - ** by making the following changes: -@@ -24171,7 +24399,13 @@ static int vxworksSimplifyName(char *z, - while( n>1 && z[n-1]=='/' ){ n--; } - for(i=j=0; ipInode!=0 && -+ (osStat(pFile->zPath, &buf)!=0 || buf.st_ino!=pFile->pInode->fileId.ino); -+} -+ - - /* - ** Check a unixFile that is a database. Verify the following: -@@ -24655,10 +24900,7 @@ static void verifyDbFile(unixFile *pFile - pFile->ctrlFlags |= UNIXFILE_WARNED; - return; - } -- if( pFile->pInode!=0 -- && ((rc = osStat(pFile->zPath, &buf))!=0 -- || buf.st_ino!=pFile->pInode->fileId.ino) -- ){ -+ if( fileHasMoved(pFile) ){ - sqlite3_log(SQLITE_WARNING, "file renamed while open: %s", pFile->zPath); - pFile->ctrlFlags |= UNIXFILE_WARNED; - return; -@@ -25074,11 +25316,10 @@ static int posixUnlock(sqlite3_file *id, - */ - if( eFileLock==SHARED_LOCK ){ - --#if !defined(__APPLE__) || !SQLITE_ENABLE_LOCKING_STYLE -+#if (!defined(__APPLE__) && !defined(__CYGWIN__)) || !SQLITE_ENABLE_LOCKING_STYLE - (void)handleNFSUnlock; - assert( handleNFSUnlock==0 ); --#endif --#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE -+#else - if( handleNFSUnlock ){ - int tErrno; /* Error code from system call errors */ - off_t divSize = SHARED_SIZE - 1; -@@ -25526,7 +25767,7 @@ static int dotlockClose(sqlite3_file *id - ** Omit this section if SQLITE_ENABLE_LOCKING_STYLE is turned off or if - ** compiling for VXWORKS. - */ --#if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS -+#if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS || defined(__CYGWIN__) - - /* - ** Retry flock() calls that fail with EINTR -@@ -25732,7 +25973,7 @@ static int flockClose(sqlite3_file *id) - ** the database file at a time. This reduces potential concurrency, but - ** makes the lock implementation much easier. - */ --#if OS_VXWORKS -+#if OS_VXWORKS || defined(__CYGWIN__) - - /* - ** This routine checks if there is a RESERVED lock held on the specified -@@ -26374,7 +26615,7 @@ static int afpClose(sqlite3_file *id) { - /****************************************************************************** - *************************** Begin NFS Locking ********************************/ - --#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE -+#if (defined(__APPLE__) || defined(__CYGWIN__)) && SQLITE_ENABLE_LOCKING_STYLE - /* - ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock - ** must be either NO_LOCK or SHARED_LOCK. -@@ -26389,7 +26630,7 @@ static int nfsUnlock(sqlite3_file *id, i - #endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ - /* - ** The code above is the NFS lock implementation. The code is specific --** to MacOSX and does not work on other unix platforms. No alternative -+** to MacOSX/Cygwin and does not work on other unix platforms. No alternative - ** is available. - ** - ********************* End of the NFS lock implementation ********************** -@@ -26671,8 +26912,7 @@ static int unixWrite( - ** Count the number of fullsyncs and normal syncs. This is used to test - ** that syncs and fullsyncs are occurring at the right times. - */ --SQLITE_API int sqlite3_sync_count = 0; --SQLITE_API int sqlite3_fullsync_count = 0; -+extern int sqlite3_sync_count, sqlite3_fullsync_count; - #endif - - /* -@@ -26968,7 +27208,7 @@ static int unixFileSize(sqlite3_file *id - return SQLITE_OK; - } - --#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) -+#if SQLITE_ENABLE_LOCKING_STYLE && (defined(__APPLE__) || defined(__CYGWIN__)) - /* - ** Handler for proxy-locking file-control verbs. Defined below in the - ** proxying locking division. -@@ -27065,6 +27305,7 @@ static int unixGetTempname(int nBuf, cha - /* - ** Information and control of an open file handle. - */ -+ - static int unixFileControl(sqlite3_file *id, int op, void *pArg){ - unixFile *pFile = (unixFile*)id; - switch( op ){ -@@ -27107,6 +27348,10 @@ static int unixFileControl(sqlite3_file - } - return SQLITE_OK; - } -+ case SQLITE_FCNTL_HAS_MOVED: { -+ *(int*)pArg = fileHasMoved(pFile); -+ return SQLITE_OK; -+ } - #if SQLITE_MAX_MMAP_SIZE>0 - case SQLITE_FCNTL_MMAP_SIZE: { - i64 newLimit = *(i64*)pArg; -@@ -27136,7 +27381,7 @@ static int unixFileControl(sqlite3_file - return SQLITE_OK; - } - #endif --#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) -+#if SQLITE_ENABLE_LOCKING_STYLE && (defined(__APPLE__) || defined(__CYGWIN__)) - case SQLITE_SET_LOCKPROXYFILE: - case SQLITE_GET_LOCKPROXYFILE: { - return proxyFileControl(id,op,pArg); -@@ -28138,10 +28383,10 @@ static int unixFetch(sqlite3_file *fd, i - ** may now be invalid and should be unmapped. - */ - static int unixUnfetch(sqlite3_file *fd, i64 iOff, void *p){ -+#if SQLITE_MAX_MMAP_SIZE>0 - unixFile *pFd = (unixFile *)fd; /* The underlying database file */ - UNUSED_PARAMETER(iOff); - --#if SQLITE_MAX_MMAP_SIZE>0 - /* If p==0 (unmap the entire file) then there must be no outstanding - ** xFetch references. Or, if p!=0 (meaning it is an xFetch reference), - ** then there must be at least one outstanding. */ -@@ -28157,6 +28402,10 @@ static int unixUnfetch(sqlite3_file *fd, - } - - assert( pFd->nFetchOut>=0 ); -+#else -+ UNUSED_PARAMETER(fd); -+ UNUSED_PARAMETER(p); -+ UNUSED_PARAMETER(iOff); - #endif - return SQLITE_OK; - } -@@ -28263,7 +28512,19 @@ IOMETHODS( - dotlockCheckReservedLock /* xCheckReservedLock method */ - ) - --#if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS -+#if defined(__CYGWIN__) -+IOMETHODS( -+ cygwinIoFinder, /* Finder function name */ -+ cygwinIoMethods, /* sqlite3_io_methods object name */ -+ 1, /* shared memory is disabled */ -+ flockClose, /* xClose method */ -+ flockLock, /* xLock method */ -+ flockUnlock, /* xUnlock method */ -+ flockCheckReservedLock /* xCheckReservedLock method */ -+) -+#endif -+ -+#if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS || defined(__CYGWIN__) - IOMETHODS( - flockIoFinder, /* Finder function name */ - flockIoMethods, /* sqlite3_io_methods object name */ -@@ -28275,7 +28536,7 @@ IOMETHODS( - ) - #endif - --#if OS_VXWORKS -+#if OS_VXWORKS || defined(__CYGWIN__) - IOMETHODS( - semIoFinder, /* Finder function name */ - semIoMethods, /* sqlite3_io_methods object name */ -@@ -28308,7 +28569,7 @@ IOMETHODS( - ** to go ahead and define the sqlite3_io_methods and finder function - ** for proxy locking here. So we forward declare the I/O methods. - */ --#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE -+#if (defined(__APPLE__) || defined(__CYGWIN__)) && SQLITE_ENABLE_LOCKING_STYLE - static int proxyClose(sqlite3_file*); - static int proxyLock(sqlite3_file*, int); - static int proxyUnlock(sqlite3_file*, int); -@@ -28325,7 +28586,7 @@ IOMETHODS( - #endif - - /* nfs lockd on OSX 10.3+ doesn't clear write locks when a read lock is set */ --#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE -+#if (defined(__APPLE__) || defined(__CYGWIN__)) && SQLITE_ENABLE_LOCKING_STYLE - IOMETHODS( - nfsIoFinder, /* Finder function name */ - nfsIoMethods, /* sqlite3_io_methods object name */ -@@ -28441,6 +28702,66 @@ static const sqlite3_io_methods - - #endif /* OS_VXWORKS && SQLITE_ENABLE_LOCKING_STYLE */ - -+#if defined(__CYGWIN__) && SQLITE_ENABLE_LOCKING_STYLE -+/* -+** This "finder" function attempts to determine the best locking strategy -+** for the database file "filePath". It then returns the sqlite3_io_methods -+** object that implements that strategy. -+** -+** This is for Cygwin only. -+*/ -+static const sqlite3_io_methods *autolockIoFinderImpl( -+ const char *filePath, /* name of the database file */ -+ unixFile *pNew /* the open file object */ -+){ -+ static const sqlite3_io_methods *ioMethods = NULL; -+ -+ if( !filePath ){ -+ /* If filePath==NULL that means we are dealing with a transient file -+ ** that does not need to be locked. */ -+ return &nolockIoMethods; -+ } -+ -+ if( !ioMethods ){ -+ const char *strategy = getenv("CYGWIN_SQLITE_LOCKING"); -+ ioMethods = &cygwinIoMethods; -+ -+ if( strategy ){ -+ if( !sqlite3_strnicmp(strategy, "unix", 4) ){ -+ if( (strategy[4]=='-') || (strategy[4]=='_')){ -+ strategy += 5; -+ } -+ ioMethods = &posixIoMethods; -+ } -+ if( sqlite3_stricmp(strategy, "excl") == 0 ){ -+ pNew->ctrlFlags |= UNIXFILE_EXCL; -+ ioMethods = &posixIoMethods; -+ }else if( sqlite3_stricmp(strategy, "posix") == 0 ){ -+ ioMethods = &posixIoMethods; -+ }else if( sqlite3_stricmp(strategy, "bsd") == 0 -+ || sqlite3_stricmp(strategy, "flock") == 0 ){ -+ ioMethods = &flockIoMethods; -+ }else if( sqlite3_stricmp(strategy, "dotfile") == 0 ){ -+ ioMethods = &dotlockIoMethods; -+ }else if( sqlite3_stricmp(strategy, "nfs") == 0 ){ -+ ioMethods = &nfsIoMethods; -+ }else if( sqlite3_stricmp(strategy, "none") == 0 ){ -+ ioMethods = &nolockIoMethods; -+ }else if( sqlite3_strnicmp(strategy, "win", 3) == 0 -+ || sqlite3_strnicmp(strategy, "cyg", 3) == 0 -+ || sqlite3_stricmp(strategy, "proxy") == 0 ){ -+ /* Fall back to original default */ -+ ioMethods = &cygwinIoMethods; -+ } -+ } -+ } -+ return ioMethods; -+} -+static const sqlite3_io_methods -+ *(*const autolockIoFinder)(const char*,unixFile*) = autolockIoFinderImpl; -+ -+#endif /* OS_VXWORKS && SQLITE_ENABLE_LOCKING_STYLE */ -+ - /* - ** An abstract type for a pointer to a IO method finder function: - */ -@@ -28474,7 +28795,7 @@ static int fillInUnixFile( - ** exception is when opening the proxy "conch" file in builds that - ** include the special Apple locking styles. - */ --#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE -+#if (defined(__APPLE__) || defined(__CYGWIN__)) && SQLITE_ENABLE_LOCKING_STYLE - assert( zFilename==0 || zFilename[0]=='/' - || pVfs->pAppData==(void*)&autolockIoFinder ); - #else -@@ -28521,7 +28842,7 @@ static int fillInUnixFile( - } - - if( pLockingStyle == &posixIoMethods --#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE -+#if (defined(__APPLE__) || defined(__CYGWIN__)) && SQLITE_ENABLE_LOCKING_STYLE - || pLockingStyle == &nfsIoMethods - #endif - ){ -@@ -28597,7 +28918,7 @@ static int fillInUnixFile( - pNew->lockingContext = zLockFile; - } - --#if OS_VXWORKS -+#if OS_VXWORKS || defined(__CYGWIN__) - else if( pLockingStyle == &semIoMethods ){ - /* Named semaphore locking uses the file path so it needs to be - ** included in the semLockingContext -@@ -28607,8 +28928,14 @@ static int fillInUnixFile( - if( (rc==SQLITE_OK) && (pNew->pInode->pSem==NULL) ){ - char *zSemName = pNew->pInode->aSemName; - int n; -+#if OS_VXWORKS - sqlite3_snprintf(MAX_PATHNAME, zSemName, "/%s.sem", - pNew->pId->zCanonicalName); -+#else -+ sqlite3_snprintf(MAX_PATHNAME, zSemName, "/%s.sem", -+ zFilename); -+ vxworksSimplifyName(zSemName, MAX_PATHNAME); -+#endif - for( n=1; zSemName[n]; n++ ) - if( zSemName[n]=='/' ) zSemName[n] = '_'; - pNew->pInode->pSem = sem_open(zSemName, O_CREAT, 0666, 1); -@@ -28620,6 +28947,15 @@ static int fillInUnixFile( - unixLeaveMutex(); - } - #endif -+ -+#if defined(__CYGWIN__) -+ else if( pLockingStyle == &cygwinIoMethods ){ -+ if ((osFcntl(h, F_LCK_MANDATORY, 1) != 0) && (errno != EINVAL)) { -+ /* The API exists but it refused to enable mandatory locking! */ -+ rc = SQLITE_IOERR_ACCESS; -+ } -+ } -+#endif - - pNew->lastErrno = 0; - #if OS_VXWORKS -@@ -28649,6 +28985,8 @@ static const char *unixTempFileDir(void) - 0, - 0, - 0, -+ 0, -+ 0, - "/var/tmp", - "/usr/tmp", - "/tmp", -@@ -28661,6 +28999,8 @@ static const char *unixTempFileDir(void) - azDirs[0] = sqlite3_temp_directory; - if( !azDirs[1] ) azDirs[1] = getenv("SQLITE_TMPDIR"); - if( !azDirs[2] ) azDirs[2] = getenv("TMPDIR"); -+ if( !azDirs[3] ) azDirs[2] = getenv("TMP"); -+ if( !azDirs[4] ) azDirs[3] = getenv("TEMP"); - for(i=0; iopenFlags = openFlags; - } -@@ -29051,7 +29401,7 @@ static int unixOpen( - noLock = eType!=SQLITE_OPEN_MAIN_DB; - - --#if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE -+#if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE && !defined(__CYGWIN__) - if( fstatfs(fd, &fsInfo) == -1 ){ - ((unixFile*)pFile)->lastErrno = errno; - robust_close(p, fd, __LINE__); -@@ -29069,7 +29419,7 @@ static int unixOpen( - if( syncDir ) ctrlFlags |= UNIXFILE_DIRSYNC; - if( flags & SQLITE_OPEN_URI ) ctrlFlags |= UNIXFILE_URI; - --#if SQLITE_ENABLE_LOCKING_STYLE -+#if SQLITE_ENABLE_LOCKING_STYLE && !defined(__CYGWIN__) - #if SQLITE_PREFER_PROXY_LOCKING - isAutoProxy = 1; - #endif -@@ -29211,6 +29561,13 @@ static int unixAccess( - } - - -+#if SQLITE_OS_WIN -+# if defined(SQLITE_AMALGAMATION) -+ static -+# endif -+ void winSimplifyName(char *z); -+#endif -+ - /* - ** Turn a relative pathname into a full pathname. The relative path - ** is stored as a nul-terminated string in the buffer pointed to by -@@ -29226,6 +29583,9 @@ static int unixFullPathname( - int nOut, /* Size of output buffer in bytes */ - char *zOut /* Output buffer */ - ){ -+#ifdef __CYGWIN__ -+ int i; -+#endif - - /* It's odd to simulate an io-error here, but really this is just - ** using the io-error infrastructure to test that SQLite handles this -@@ -29238,6 +29598,35 @@ static int unixFullPathname( - UNUSED_PARAMETER(pVfs); - - zOut[nOut-1] = '\0'; -+#ifdef __CYGWIN__ -+ if( sqlite3Isalpha(zPath[0]) && (zPath[1]==':') -+ && ((zPath[2]=='\\') || (zPath[2]=='/')) ){ -+ int nDrive; -+ char temp[4]; -+ temp[0] = zPath[0]; -+ memcpy(&temp[1], ":\\", 3); -+ cygwin_conv_path(CCP_WIN_A_TO_POSIX, temp, zOut, nOut); -+ nDrive = (int)strlen(zOut); -+ sqlite3_snprintf(nOut-nDrive, &zOut[nDrive], "%s", zPath+2); -+ }else if( ((zPath[0]=='\\') || (zPath[0]=='/')) && ((zPath[1]=='\\') || (zPath[1]=='/')) -+ && (zPath[2]=='?') && ((zPath[3]=='\\') || (zPath[3]=='/')) && sqlite3Isalpha(zPath[4]) -+ && (zPath[5]==':') && ((zPath[6]=='\\') || (zPath[6]=='/')) ){ -+ int nDrive; -+ char temp[4]; -+ temp[0] = zPath[4]; -+ memcpy(&temp[1], ":\\", 3); -+ cygwin_conv_path(CCP_WIN_A_TO_POSIX, temp, zOut, nOut); -+ nDrive = (int)strlen(zOut); -+ sqlite3_snprintf(nOut-nDrive, &zOut[nDrive], "%s", zPath+6); -+ }else if( ((zPath[0]=='\\') || (zPath[0]=='/')) && ((zPath[1]=='\\') || (zPath[1]=='/')) -+ && (zPath[2]=='?') && ((zPath[3]=='\\') || (zPath[3]=='/')) && sqlite3_strnicmp(zPath+4, "UNC", 3)==0 -+ && ((zPath[7]=='\\') || (zPath[7]=='/')) ){ -+ /* UNC paths in Cygwin start with "//" */ -+ sqlite3_snprintf(nOut, zOut, "//%s", zPath+8); -+ }else if( zPath[0]=='\\' ){ -+ sqlite3_snprintf(nOut, zOut, "%s", zPath); -+ }else -+#endif - if( zPath[0]=='/' ){ - sqlite3_snprintf(nOut, zOut, "%s", zPath); - }else{ -@@ -29248,6 +29637,9 @@ static int unixFullPathname( - nCwd = (int)strlen(zOut); - sqlite3_snprintf(nOut-nCwd, &zOut[nCwd], "/%s", zPath); - } -+#if SQLITE_OS_WIN && defined(__CYGWIN__) -+ winSimplifyName(zOut); -+#endif - return SQLITE_OK; - } - -@@ -29334,18 +29726,18 @@ static int unixRandomness(sqlite3_vfs *N - ** tests repeatable. - */ - memset(zBuf, 0, nBuf); -+ randomnessPid = getpid(); - #if !defined(SQLITE_TEST) - { -- int pid, fd, got; -+ int fd, got; - fd = robust_open("/dev/urandom", O_RDONLY, 0); - if( fd<0 ){ - time_t t; - time(&t); - memcpy(zBuf, &t, sizeof(t)); -- pid = getpid(); -- memcpy(&zBuf[sizeof(t)], &pid, sizeof(pid)); -- assert( sizeof(t)+sizeof(pid)<=(size_t)nBuf ); -- nBuf = sizeof(t) + sizeof(pid); -+ memcpy(&zBuf[sizeof(t)], &randomnessPid, sizeof(randomnessPid)); -+ assert( sizeof(t)+sizeof(randomnessPid)<=(size_t)nBuf ); -+ nBuf = sizeof(t) + sizeof(randomnessPid); - }else{ - do{ got = osRead(fd, zBuf, nBuf); }while( got<0 && errno==EINTR ); - robust_close(0, fd, __LINE__); -@@ -29391,7 +29783,7 @@ static int unixSleep(sqlite3_vfs *NotUse - ** sqlite3OsCurrentTime() during testing. - */ - #ifdef SQLITE_TEST --SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */ -+SQLITE_API extern int sqlite3_current_time; /* Fake system time in seconds since 1970. */ - #endif - - /* -@@ -29616,9 +30008,9 @@ static int unixGetLastError(sqlite3_vfs - */ - - /* --** Proxy locking is only available on MacOSX -+** Proxy locking is only available on MacOSX/Cygwin - */ --#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE -+#if (defined(__APPLE__) || defined(__CYGWIN__)) && SQLITE_ENABLE_LOCKING_STYLE - - /* - ** The proxyLockingContext has the path and file structures for the remote -@@ -29684,7 +30076,7 @@ static int proxyGetLockPath(const char * - */ - static int proxyCreateLockPath(const char *lockPath){ - int i, len; -- char buf[MAXPATHLEN]; -+ char buf[MAX_PATHNAME]; - int start = 0; - - assert(lockPath!=NULL); -@@ -29809,6 +30201,12 @@ end_create_proxy: - SQLITE_API int sqlite3_hostid_num = 0; - #endif - -+#ifdef __CYGWIN__ -+# define st_mtimespec st_mtim -+# undef uuid_t -+# define uuid_t void * -+#endif -+ - #define PROXY_HOSTIDLEN 16 /* conch file host id length */ - - /* Not always defined in the headers as it ought to be */ -@@ -29850,7 +30248,7 @@ static int proxyGetHostID(unsigned char - #define PROXY_CONCHVERSION 2 /* 1-byte header, 16-byte host id, path */ - #define PROXY_HEADERLEN 1 /* conch file header length */ - #define PROXY_PATHINDEX (PROXY_HEADERLEN+PROXY_HOSTIDLEN) --#define PROXY_MAXCONCHLEN (PROXY_HEADERLEN+PROXY_HOSTIDLEN+MAXPATHLEN) -+#define PROXY_MAXCONCHLEN (PROXY_HEADERLEN+PROXY_HOSTIDLEN+MAX_PATHNAME) - - /* - ** Takes an open conch file, copies the contents to a new path and then moves -@@ -29861,7 +30259,7 @@ static int proxyGetHostID(unsigned char - static int proxyBreakConchLock(unixFile *pFile, uuid_t myHostID){ - proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; - unixFile *conchFile = pCtx->conchFile; -- char tPath[MAXPATHLEN]; -+ char tPath[MAX_PATHNAME]; - char buf[PROXY_MAXCONCHLEN]; - char *cPath = pCtx->conchFilePath; - size_t readLen = 0; -@@ -29872,8 +30270,8 @@ static int proxyBreakConchLock(unixFile - UNUSED_PARAMETER(myHostID); - - /* create a new path by replace the trailing '-conch' with '-break' */ -- pathLen = strlcpy(tPath, cPath, MAXPATHLEN); -- if( pathLen>MAXPATHLEN || pathLen<6 || -+ pathLen = strlcpy(tPath, cPath, MAX_PATHNAME); -+ if( pathLen>MAX_PATHNAME || pathLen<6 || - (strlcpy(&tPath[pathLen-5], "break", 6) != 5) ){ - sqlite3_snprintf(sizeof(errmsg),errmsg,"path error (len %d)",(int)pathLen); - goto end_breaklock; -@@ -30006,7 +30404,7 @@ static int proxyTakeConch(unixFile *pFil - uuid_t myHostID; - int pError = 0; - char readBuf[PROXY_MAXCONCHLEN]; -- char lockPath[MAXPATHLEN]; -+ char lockPath[MAX_PATHNAME]; - char *tempLockPath = NULL; - int rc = SQLITE_OK; - int createConch = 0; -@@ -30058,8 +30456,8 @@ static int proxyTakeConch(unixFile *pFil - if( hostIdMatch ){ - size_t pathLen = (readLen - PROXY_PATHINDEX); - -- if( pathLen>=MAXPATHLEN ){ -- pathLen=MAXPATHLEN-1; -+ if( pathLen>=MAX_PATHNAME ){ -+ pathLen=MAX_PATHNAME-1; - } - memcpy(lockPath, &readBuf[PROXY_PATHINDEX], pathLen); - lockPath[pathLen] = 0; -@@ -30085,7 +30483,7 @@ static int proxyTakeConch(unixFile *pFil - - /* either the conch didn't match or we need to create a new one */ - if( !pCtx->lockProxyPath ){ -- proxyGetLockPath(pCtx->dbPath, lockPath, MAXPATHLEN); -+ proxyGetLockPath(pCtx->dbPath, lockPath, MAX_PATHNAME); - tempLockPath = lockPath; - /* create a copy of the lock path _only_ if the conch is taken */ - } -@@ -30113,9 +30511,9 @@ static int proxyTakeConch(unixFile *pFil - writeBuffer[0] = (char)PROXY_CONCHVERSION; - memcpy(&writeBuffer[PROXY_HEADERLEN], myHostID, PROXY_HOSTIDLEN); - if( pCtx->lockProxyPath!=NULL ){ -- strlcpy(&writeBuffer[PROXY_PATHINDEX], pCtx->lockProxyPath, MAXPATHLEN); -+ strlcpy(&writeBuffer[PROXY_PATHINDEX], pCtx->lockProxyPath, MAX_PATHNAME); - }else{ -- strlcpy(&writeBuffer[PROXY_PATHINDEX], tempLockPath, MAXPATHLEN); -+ strlcpy(&writeBuffer[PROXY_PATHINDEX], tempLockPath, MAX_PATHNAME); - } - writeSize = PROXY_PATHINDEX + strlen(&writeBuffer[PROXY_PATHINDEX]); - robust_ftruncate(conchFile->h, writeSize); -@@ -30197,11 +30595,13 @@ static int proxyTakeConch(unixFile *pFil - if( rc==SQLITE_OK ){ - pCtx->conchHeld = 1; - -+#if defined(__APPLE__) - if( pCtx->lockProxy->pMethod == &afpIoMethods ){ - afpLockingContext *afpCtx; - afpCtx = (afpLockingContext *)pCtx->lockProxy->lockingContext; - afpCtx->dbPath = pCtx->lockProxyPath; - } -+#endif - } else { - conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK); - } -@@ -30294,7 +30694,7 @@ static int switchLockProxyPath(unixFile - - /* nothing to do if the path is NULL, :auto: or matches the existing path */ - if( !path || path[0]=='\0' || !strcmp(path, ":auto:") || -- (oldPath && !strncmp(oldPath, path, MAXPATHLEN)) ){ -+ (oldPath && !strncmp(oldPath, path, MAX_PATHNAME)) ){ - return SQLITE_OK; - }else{ - unixFile *lockProxy = pCtx->lockProxy; -@@ -30314,7 +30714,7 @@ static int switchLockProxyPath(unixFile - - /* - ** pFile is a file that has been opened by a prior xOpen call. dbPath --** is a string buffer at least MAXPATHLEN+1 characters in size. -+** is a string buffer at least MAX_PATHNAME+1 characters in size. - ** - ** This routine find the filename associated with pFile and writes it - ** int dbPath. -@@ -30324,8 +30724,8 @@ static int proxyGetDbPathForUnixFile(uni - if( pFile->pMethod == &afpIoMethods ){ - /* afp style keeps a reference to the db path in the filePath field - ** of the struct */ -- assert( (int)strlen((char*)pFile->lockingContext)<=MAXPATHLEN ); -- strlcpy(dbPath, ((afpLockingContext *)pFile->lockingContext)->dbPath, MAXPATHLEN); -+ assert( (int)strlen((char*)pFile->lockingContext)<=MAX_PATHNAME ); -+ strlcpy(dbPath, ((afpLockingContext *)pFile->lockingContext)->dbPath, MAX_PATHNAME); - } else - #endif - if( pFile->pMethod == &dotlockIoMethods ){ -@@ -30335,8 +30735,8 @@ static int proxyGetDbPathForUnixFile(uni - memcpy(dbPath, (char *)pFile->lockingContext, len + 1); - }else{ - /* all other styles use the locking context to store the db file path */ -- assert( strlen((char*)pFile->lockingContext)<=MAXPATHLEN ); -- strlcpy(dbPath, (char *)pFile->lockingContext, MAXPATHLEN); -+ assert( strlen((char*)pFile->lockingContext)<=MAX_PATHNAME ); -+ strlcpy(dbPath, (char *)pFile->lockingContext, MAX_PATHNAME); - } - return SQLITE_OK; - } -@@ -30351,7 +30751,7 @@ static int proxyGetDbPathForUnixFile(uni - */ - static int proxyTransformUnixFile(unixFile *pFile, const char *path) { - proxyLockingContext *pCtx; -- char dbPath[MAXPATHLEN+1]; /* Name of the database file */ -+ char dbPath[MAX_PATHNAME+1]; /* Name of the database file */ - char *lockPath=NULL; - int rc = SQLITE_OK; - -@@ -30383,15 +30783,19 @@ static int proxyTransformUnixFile(unixFi - ** Ugh, since O_RDONLY==0x0000 we test for !O_RDWR since unixOpen asserts - ** that openFlags will have only one of O_RDONLY or O_RDWR. - */ -+#if defined(__APPLE__) - struct statfs fsInfo; -+#endif - struct stat conchInfo; - int goLockless = 0; - - if( osStat(pCtx->conchFilePath, &conchInfo) == -1 ) { - int err = errno; -+#if defined(__APPLE__) - if( (err==ENOENT) && (statfs(dbPath, &fsInfo) != -1) ){ - goLockless = (fsInfo.f_flags&MNT_RDONLY) == MNT_RDONLY; - } -+#endif - } - if( goLockless ){ - pCtx->conchHeld = -1; /* read only FS/ lockless */ -@@ -30472,7 +30876,7 @@ static int proxyFileControl(sqlite3_file - (proxyLockingContext*)pFile->lockingContext; - if( !strcmp(pArg, ":auto:") - || (pCtx->lockProxyPath && -- !strncmp(pCtx->lockProxyPath, proxyPath, MAXPATHLEN)) -+ !strncmp(pCtx->lockProxyPath, proxyPath, MAX_PATHNAME)) - ){ - rc = SQLITE_OK; - }else{ -@@ -30650,7 +31054,15 @@ static int proxyClose(sqlite3_file *id) - ** necessarily been initialized when this routine is called, and so they - ** should not be used. - */ --SQLITE_API int sqlite3_os_init(void){ -+#if SQLITE_OS_WIN -+#if defined(SQLITE_AMALGAMATION) -+static -+#endif -+SQLITE_API int sqlite3_os_unix_init(void){ -+#else -+SQLITE_API int sqlite3_os_init(void){ -+#endif -+ - /* - ** The following macro defines an initializer for an sqlite3_vfs object. - ** The name of the VFS is NAME. The pAppData is a pointer to a pointer -@@ -30704,25 +31116,33 @@ SQLITE_API int sqlite3_os_init(void){ - ** array cannot be const. - */ - static sqlite3_vfs aVfs[] = { --#if SQLITE_ENABLE_LOCKING_STYLE && (OS_VXWORKS || defined(__APPLE__)) -+#if SQLITE_ENABLE_LOCKING_STYLE && (OS_VXWORKS || defined(__APPLE__) || defined(__CYGWIN__)) - UNIXVFS("unix", autolockIoFinder ), - #else - UNIXVFS("unix", posixIoFinder ), - #endif -+#ifdef __CYGWIN__ -+ UNIXVFS("unix-cygwin", cygwinIoFinder ), -+#if !SQLITE_OS_WIN -+ UNIXVFS("win32-longpath", cygwinIoFinder ), -+#endif -+#endif - UNIXVFS("unix-none", nolockIoFinder ), - UNIXVFS("unix-dotfile", dotlockIoFinder ), - UNIXVFS("unix-excl", posixIoFinder ), --#if OS_VXWORKS -+#if OS_VXWORKS || defined(__CYGWIN__) - UNIXVFS("unix-namedsem", semIoFinder ), - #endif - #if SQLITE_ENABLE_LOCKING_STYLE - UNIXVFS("unix-posix", posixIoFinder ), --#if !OS_VXWORKS -- UNIXVFS("unix-flock", flockIoFinder ), - #endif -+#if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS || defined(__CYGWIN__) -+ UNIXVFS("unix-flock", flockIoFinder ), - #endif --#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) -+#if SQLITE_ENABLE_LOCKING_STYLE && (defined(__APPLE__) || defined(__CYGWIN__)) -+#if defined(__APPLE__) - UNIXVFS("unix-afp", afpIoFinder ), -+#endif - UNIXVFS("unix-nfs", nfsIoFinder ), - UNIXVFS("unix-proxy", proxyIoFinder ), - #endif -@@ -30740,6 +31160,8 @@ SQLITE_API int sqlite3_os_init(void){ - return SQLITE_OK; - } - -+#undef aSyscall -+#if !SQLITE_OS_WIN - /* - ** Shutdown the operating system interface. - ** -@@ -30750,6 +31172,7 @@ SQLITE_API int sqlite3_os_init(void){ - SQLITE_API int sqlite3_os_end(void){ - return SQLITE_OK; - } -+#endif /* !SQLITE_OS_WIN */ - - #endif /* SQLITE_OS_UNIX */ - -@@ -30772,8 +31195,16 @@ SQLITE_API int sqlite3_os_end(void){ - #if SQLITE_OS_WIN /* This file is used for Windows only */ - - #ifdef __CYGWIN__ --# include -+/* # include */ -+# include /* amalgamator: keep */ -+# include /* amalgamator: keep */ - # include /* amalgamator: keep */ -+# include /* amalgamator: keep */ -+#else -+enum { -+ CCP_POSIX_TO_WIN_W=1, -+ CCP_WIN_A_TO_POSIX -+}; - #endif - - /* -@@ -31002,7 +31433,8 @@ SQLITE_API int sqlite3_open_file_count = - ** Are most of the Win32 ANSI APIs available (i.e. with certain exceptions - ** based on the sub-platform)? - */ --#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(SQLITE_WIN32_NO_ANSI) -+#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(_WIN64) \ -+ && !defined(__CYGWIN__) && !defined(SQLITE_WIN32_NO_ANSI) - # define SQLITE_WIN32_HAS_ANSI - #endif - -@@ -31078,7 +31510,11 @@ SQLITE_API int sqlite3_open_file_count = - ** UNICODE_STRING_MAX_CHARS. - */ - #ifndef SQLITE_WINNT_MAX_PATH_CHARS --# define SQLITE_WINNT_MAX_PATH_CHARS (UNICODE_STRING_MAX_CHARS) -+# ifdef __CYGWIN__ -+# define SQLITE_WINNT_MAX_PATH_CHARS (PATH_MAX) -+# else -+# define SQLITE_WINNT_MAX_PATH_CHARS (UNICODE_STRING_MAX_CHARS) -+# endif - #endif - - /* -@@ -31625,7 +32061,7 @@ static struct win_syscall { - - #define osGetLastError ((DWORD(WINAPI*)(VOID))aSyscall[26].pCurrent) - --#if !defined(SQLITE_OMIT_LOAD_EXTENSION) -+#if !defined(SQLITE_OMIT_LOAD_EXTENSION) || !defined(__CYGWIN__) - #if SQLITE_OS_WINCE - /* The GetProcAddressA() routine is only available on Windows CE. */ - { "GetProcAddressA", (SYSCALL)GetProcAddressA, 0 }, -@@ -32012,6 +32448,65 @@ static struct win_syscall { - #define osCreateFileMappingFromApp ((HANDLE(WINAPI*)(HANDLE, \ - LPSECURITY_ATTRIBUTES,ULONG,ULONG64,LPCWSTR))aSyscall[75].pCurrent) - -+#if defined(SQLITE_WIN32_HAS_ANSI) && !defined(__CYGWIN__) -+ { "GetModuleHandleA", (SYSCALL)GetModuleHandleA, 0 }, -+#else -+ { "GetModuleHandleA", (SYSCALL)0, 0 }, -+#endif -+ -+#define osGetModuleHandleA ((HMODULE(*)(LPCSTR))aSyscall[76].pCurrent) -+ -+#if defined(SQLITE_WIN32_HAS_WIDE) && !defined(__CYGWIN__) -+ { "GetModuleHandleW", (SYSCALL)GetModuleHandleW, 0 }, -+#else -+ { "GetModuleHandleW", (SYSCALL)0, 0 }, -+#endif -+ -+#define osGetModuleHandleW ((HMODULE(*)(LPCWSTR))aSyscall[77].pCurrent) -+ -+#if defined(__CYGWIN__) -+ { "getenv", (SYSCALL)getenv, 0 }, -+#else -+ { "getenv", (SYSCALL)0, 0 }, -+#endif -+ -+#define getenv ((const char *(*)(const char *))aSyscall[78].pCurrent) -+ -+#if defined(__CYGWIN__) -+ { "getcwd", (SYSCALL)getcwd, 0 }, -+#else -+ { "getcwd", (SYSCALL)0, 0 }, -+#endif -+ -+#define getcwd ((char*(*)(char*,size_t))aSyscall[79].pCurrent) -+ -+#if defined(__CYGWIN__) -+ { "__errno", (SYSCALL)__errno, 0 }, -+#else -+ { "__errno", (SYSCALL)0, 0 }, -+#endif -+ -+#define osErrno (*((int*(*)(void))aSyscall[80].pCurrent)()) -+ -+#if defined(__CYGWIN__) && defined(SQLITE_WIN32_HAS_WIDE) -+ { "cygwin_conv_path", (SYSCALL)cygwin_conv_path, 0 }, -+#else -+ { "cygwin_conv_path", (SYSCALL)0, 0 }, -+#endif -+ -+#define cygwin_conv_path ((ssize_t(*)(unsigned int, \ -+ const void *, void *, size_t))aSyscall[81].pCurrent) -+ -+ { "cygwin_conv_to_full_win32_path", (SYSCALL)0, 0 }, -+ -+#define cygwin_conv_to_full_win32_path ((void(*)(const char *, \ -+ char *))aSyscall[82].pCurrent) -+ -+ { "cygwin_conv_to_full_posix_path", (SYSCALL)0, 0 }, -+ -+#define cygwin_conv_to_full_posix_path ((void(*)(const char *, \ -+ char *))aSyscall[83].pCurrent) -+ - }; /* End of the overrideable system calls */ - - /* -@@ -32185,6 +32680,7 @@ SQLITE_API int sqlite3_win32_reset_heap( - } - #endif /* SQLITE_WIN32_MALLOC */ - -+#ifndef __CYGWIN__ - /* - ** This function outputs the specified (ANSI) string to the Win32 debugger - ** (if available). -@@ -32221,6 +32717,7 @@ SQLITE_API void sqlite3_win32_write_debu - } - #endif - } -+#endif /* !__CYGWIN__ */ - - /* - ** The following routine suspends the current thread for at least ms -@@ -32230,6 +32727,9 @@ SQLITE_API void sqlite3_win32_write_debu - static HANDLE sleepObj = NULL; - #endif - -+#if defined(__CYGWIN__) && defined(SQLITE_AMALGAMATION) -+static -+#endif - SQLITE_API void sqlite3_win32_sleep(DWORD milliseconds){ - #if SQLITE_OS_WINRT - if ( sleepObj==NULL ){ -@@ -32487,9 +32987,11 @@ SQLITE_PRIVATE void sqlite3MemSetDefault - /* - ** Convert a UTF-8 string to Microsoft Unicode (UTF-16?). - ** --** Space to hold the returned string is obtained from malloc. -+** Space to hold the returned string is obtained from malloc, -+** unless buf is not NULL and the needed size is less than -+** SQLITE_WIN32_MAX_PATH_CHARS bytes. - */ --static LPWSTR winUtf8ToUnicode(const char *zFilename){ -+static LPWSTR winUtf8ToUnicode(const char *zFilename, WCHAR *buf){ - int nChar; - LPWSTR zWideFilename; - -@@ -32497,9 +32999,13 @@ static LPWSTR winUtf8ToUnicode(const cha - if( nChar==0 ){ - return 0; - } -- zWideFilename = sqlite3MallocZero( nChar*sizeof(zWideFilename[0]) ); -- if( zWideFilename==0 ){ -- return 0; -+ if( buf && (nChar<=SQLITE_WIN32_MAX_PATH_CHARS/sizeof(WCHAR)) ){ -+ zWideFilename = buf; -+ }else{ -+ zWideFilename = sqlite3Malloc( nChar*sizeof(WCHAR) ); -+ if( zWideFilename==0 ){ -+ return 0; -+ } - } - nChar = osMultiByteToWideChar(CP_UTF8, 0, zFilename, -1, zWideFilename, - nChar); -@@ -32552,7 +33058,7 @@ static LPWSTR winMbcsToUnicode(const cha - if( nByte==0 ){ - return 0; - } -- zMbcsFilename = sqlite3MallocZero( nByte*sizeof(zMbcsFilename[0]) ); -+ zMbcsFilename = sqlite3Malloc( nByte*sizeof(zMbcsFilename[0]) ); - if( zMbcsFilename==0 ){ - return 0; - } -@@ -32581,7 +33087,7 @@ static char *winUnicodeToMbcs(LPCWSTR zW - if( nByte == 0 ){ - return 0; - } -- zFilename = sqlite3MallocZero( nByte ); -+ zFilename = sqlite3Malloc( nByte ); - if( zFilename==0 ){ - return 0; - } -@@ -32594,6 +33100,7 @@ static char *winUnicodeToMbcs(LPCWSTR zW - return zFilename; - } - -+#if !defined(__CYGWIN__) - /* - ** Convert multibyte character string to UTF-8. Space to hold the - ** returned string is obtained from sqlite3_malloc(). -@@ -32613,18 +33120,22 @@ SQLITE_API char *sqlite3_win32_mbcs_to_u - - /* - ** Convert UTF-8 to multibyte character string. Space to hold the --** returned string is obtained from sqlite3_malloc(). -+** returned string is obtained from sqlite3_malloc(). If 'buf' is -+** non-zero, it points to scratch area to be used internally, -+** saving a 'malloc' call. - */ --SQLITE_API char *sqlite3_win32_utf8_to_mbcs(const char *zFilename){ -+SQLITE_API char *sqlite3_win32_utf8_to_mbcs(const char *zFilename, WCHAR *buf){ - char *zFilenameMbcs; - LPWSTR zTmpWide; - -- zTmpWide = winUtf8ToUnicode(zFilename); -+ zTmpWide = winUtf8ToUnicode(zFilename, buf); - if( zTmpWide==0 ){ - return 0; - } - zFilenameMbcs = winUnicodeToMbcs(zTmpWide); -- sqlite3_free(zTmpWide); -+ if( zTmpWide != buf ){ -+ sqlite3_free(zTmpWide); -+ } - return zFilenameMbcs; - } - -@@ -32650,7 +33161,7 @@ SQLITE_API int sqlite3_win32_set_directo - || type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE - ); - assert( !ppDirectory || sqlite3MemdebugHasType(*ppDirectory, MEMTYPE_HEAP) ); -- if( ppDirectory ){ -+ if( !getenv && ppDirectory ){ - char *zValueUtf8 = 0; - if( zValue && zValue[0] ){ - zValueUtf8 = winUnicodeToUtf8(zValue); -@@ -32664,6 +33175,7 @@ SQLITE_API int sqlite3_win32_set_directo - } - return SQLITE_ERROR; - } -+#endif /* !__CYGWIN__*/ - - /* - ** The return value of winGetLastErrorMsg -@@ -32897,8 +33409,9 @@ static int winceCreateLock(const char *z - DWORD lastErrno; - BOOL bLogged = FALSE; - BOOL bInit = TRUE; -+ WCHAR buf[SQLITE_WIN32_MAX_PATH_CHARS/sizeof(WCHAR)]; - -- zName = winUtf8ToUnicode(zFilename); -+ zName = winUtf8ToUnicode(zFilename, buf); - if( zName==0 ){ - /* out of memory */ - return SQLITE_IOERR_NOMEM; -@@ -32918,7 +33431,9 @@ static int winceCreateLock(const char *z - pFile->hMutex = osCreateMutexW(NULL, FALSE, zName); - if (!pFile->hMutex){ - pFile->lastErrno = osGetLastError(); -- sqlite3_free(zName); -+ if( zName!=buf ){ -+ sqlite3_free(zName); -+ } - return winLogError(SQLITE_IOERR, pFile->lastErrno, - "winceCreateLock1", zFilename); - } -@@ -32942,7 +33457,9 @@ static int winceCreateLock(const char *z - bInit = FALSE; - } - -- sqlite3_free(zName); -+ if( zName!=buf ){ -+ sqlite3_free(zName); -+ } - - /* If we succeeded in making the shared memory handle, map it. */ - if( pFile->hShared ){ -@@ -33580,8 +34097,7 @@ static int winTruncate(sqlite3_file *id, - ** Count the number of fullsyncs and normal syncs. This is used to test - ** that syncs and fullsyncs are occuring at the right times. - */ --SQLITE_API int sqlite3_sync_count = 0; --SQLITE_API int sqlite3_fullsync_count = 0; -+extern int sqlite3_sync_count, sqlite3_fullsync_count; - #endif - - /* -@@ -34083,7 +34599,7 @@ static int winFileControl(sqlite3_file * - return SQLITE_OK; - } - case SQLITE_FCNTL_VFSNAME: { -- *(char**)pArg = sqlite3_mprintf("win32"); -+ *(char**)pArg = sqlite3_mprintf("%s", pFile->pVfs->zName); - OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); - return SQLITE_OK; - } -@@ -34165,7 +34681,7 @@ static int winDeviceCharacteristics(sqli - ** During sqlite3_os_init() we do a GetSystemInfo() - ** to get the granularity size. - */ --SYSTEM_INFO winSysInfo; -+static SYSTEM_INFO winSysInfo; - - #ifndef SQLITE_OMIT_WAL - -@@ -34188,7 +34704,7 @@ static void winShmEnterMutex(void){ - static void winShmLeaveMutex(void){ - sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); - } --#ifdef SQLITE_DEBUG -+#ifndef NDEBUG - static int winShmMutexHeld(void) { - return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); - } -@@ -35067,7 +35583,7 @@ static const sqlite3_io_methods winIoMet - ** sqlite3_vfs object. - */ - --#if defined(__CYGWIN__) -+#if 0 - /* - ** Convert a filename from whatever the underlying operating system - ** supports for filenames into UTF-8. Space to hold the result is -@@ -35092,16 +35608,77 @@ static char *winConvertToUtf8Filename(co - ** Convert a UTF-8 filename into whatever form the underlying - ** operating system wants filenames in. Space to hold the result - ** is obtained from malloc and must be freed by the calling --** function. -+** function, unless buf is not NULL and the needed size is less -+** than SQLITE_WIN32_MAX_PATH_CHARS bytes. - */ --static void *winConvertFromUtf8Filename(const char *zFilename){ -+static void *winConvertFromUtf8Filename(const char *zFilename, WCHAR *buf){ - void *zConverted = 0; - if( osIsNT() ){ -- zConverted = winUtf8ToUnicode(zFilename); -+ int nChar; -+ LPWSTR zWideFilename; -+ -+ if( (cygwin_conv_path!=NULL) && !(winIsDriveLetterAndColon(zFilename) -+ && winIsDirSep(zFilename[2]))){ -+ int nByte = cygwin_conv_path(CCP_POSIX_TO_WIN_W, zFilename, 0, 0); -+ if( nByte>0 ){ -+ if( buf && (nBytemxPathname -@@ -35923,7 +36564,73 @@ static int winFullPathname( - char *zFull /* Output buffer */ - ){ - --#if defined(__CYGWIN__) -+#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__) -+ DWORD nByte; -+ void *zConverted; -+ char *zOut; -+ WCHAR buf[SQLITE_WIN32_MAX_PATH_CHARS/sizeof(WCHAR)]; -+#endif -+ -+ if( cygwin_conv_path || cygwin_conv_to_full_posix_path ){ -+ /* It's odd to simulate an io-error here, but really this is just -+ ** using the io-error infrastructure to test that SQLite handles this -+ ** function failing. This function could fail if, for example, the -+ ** current working directory has been unlinked. -+ */ -+ SimulateIOError( return SQLITE_ERROR ); -+ UNUSED_PARAMETER(pVfs); -+ -+ zFull[nFull-1] = '\0'; -+ if( winIsDirSep(zRelative[0]) && winIsDirSep(zRelative[1]) -+ && zRelative[2]=='?' && winIsDirSep(zRelative[3])){ -+ /* This is an extended path. Convert to non-extended form. */ -+ if( winIsDriveLetterAndColon(&zRelative[4]) && winIsDirSep(zRelative[6]) ){ -+ int nDrive; -+ char temp[4]; -+ temp[0] = zRelative[4]; -+ memcpy(&temp[1], ":\\", 3); -+ if( cygwin_conv_path ){ -+ cygwin_conv_path(CCP_WIN_A_TO_POSIX, temp, zFull, nFull); -+ }else{ -+ cygwin_conv_to_full_posix_path(temp, zFull); -+ } -+ nDrive = (int)strlen(zFull); -+ sqlite3_snprintf(nFull-nDrive, &zFull[nDrive], "%s", zRelative+4); -+ }else if( sqlite3_strnicmp(zRelative+4, "UNC", 3)==0 && winIsDirSep(zRelative[7]) ){ -+ /* UNC paths in Cygwin start with "//" */ -+ sqlite3_snprintf(nFull, zFull, "//%s", zRelative+8); -+ }else{ -+ /* Something wrong, no conversion */ -+ sqlite3_snprintf(nFull, zFull, "%s", zRelative); -+ } -+ }else if( winIsDriveLetterAndColon(zRelative) && winIsDirSep(zRelative[2]) ){ -+ int nDrive; -+ char temp[4]; -+ temp[0] = zRelative[0]; -+ memcpy(&temp[1], ":\\", 3); -+ if( cygwin_conv_path ){ -+ cygwin_conv_path(CCP_WIN_A_TO_POSIX, temp, zFull, nFull); -+ }else{ -+ cygwin_conv_to_full_posix_path(temp, zFull); -+ } -+ nDrive = (int)strlen(zFull); -+ sqlite3_snprintf(nFull-nDrive, &zFull[nDrive], "%s", zRelative+2); -+ }else if( getcwd && !winIsDirSep(zRelative[0]) ){ -+ int nCwd; -+ if( getcwd(zFull, nFull-1)==0 ){ -+ return winLogError(SQLITE_CANTOPEN_BKPT, (DWORD)osErrno, "getcwd", zRelative); -+ } -+ nCwd = (int)strlen(zFull); -+ sqlite3_snprintf(nFull-nCwd, &zFull[nCwd], "/%s", zRelative); -+ }else{ -+ sqlite3_snprintf(nFull, zFull, "%s", zRelative); -+ } -+#if defined(_WIN32) || defined(__CYGWIN__) -+ winSimplifyName(zFull); -+#endif -+ return SQLITE_OK; -+ } -+#if 0 - SimulateIOError( return SQLITE_ERROR ); - UNUSED_PARAMETER(nFull); - assert( nFull>=pVfs->mxPathname ); -@@ -36000,9 +36707,11 @@ static int winFullPathname( - #endif - - #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__) -+#if 0 - DWORD nByte; - void *zConverted; - char *zOut; -+#endif - - /* If this path name begins with "/X:", where "X" is any alphabetic - ** character, discard the initial "/" from the pathname. -@@ -36028,32 +36737,131 @@ static int winFullPathname( - sqlite3_data_directory, winGetDirSep(), zRelative); - return SQLITE_OK; - } -- zConverted = winConvertFromUtf8Filename(zRelative); -- if( zConverted==0 ){ -- return SQLITE_IOERR_NOMEM; -+ nByte = osMultiByteToWideChar(CP_UTF8, 0, zRelative, -1, NULL, 0); -+ if( nByte==0 ){ -+ return winLogError(SQLITE_IOERR_CONVPATH, (DWORD)osGetLastError(), -+ "winFullPathname", zRelative); -+ } -+ if( osIsNT() ){ -+ LPWSTR zWideFilename; -+ int i, j; -+ -+ if( nByte>SQLITE_WIN32_MAX_PATH_CHARS ){ -+ /* No Win32 API functions can handle such long paths. Let's see if -+ * we can do something about it. If not, just leave it as is. */ -+ if( winIsDirSep(zRelative[0]) && winIsDirSep(zRelative[1]) -+ && zRelative[2]!='?' ){ -+ /* It's an UNC path, convert it to an extended UNC path. */ -+ zWideFilename = sqlite3MallocZero( (nByte+6)*sizeof(WCHAR) ); -+ if( zWideFilename==0 ){ -+ return SQLITE_IOERR_NOMEM; -+ } -+ memcpy(zWideFilename, L"\\\\?\\UNC\\", 16); -+ nByte = osMultiByteToWideChar(CP_UTF8, 0, zRelative+2, -1, -+ zWideFilename+8, nByte); -+ goto finished; -+ }else if( winIsDriveLetterAndColon(zRelative) -+ && winIsDirSep(zRelative[2]) ){ -+ /* It has a correct drive prefix, convert to extended form. */ -+ zWideFilename = sqlite3MallocZero( (nByte+4)*sizeof(WCHAR) ); -+ if( zWideFilename==0 ){ -+ return SQLITE_IOERR_NOMEM; -+ } -+ memcpy(zWideFilename, L"\\\\?\\", 8); -+ nByte = osMultiByteToWideChar(CP_UTF8, 0, zRelative, -1, -+ zWideFilename+4, nByte); -+ zWideFilename[6] = '\\'; -+ goto finished; -+ } -+ /* Another form, e.g. relative path or maybe it already -+ * has the '\\?\' prefix. Just leave it as-is. */ -+ } -+ if( nByte<=SQLITE_WIN32_MAX_PATH_CHARS/sizeof(WCHAR) ){ -+ zWideFilename = buf; -+ }else{ -+ zWideFilename = sqlite3Malloc( nByte*sizeof(WCHAR) ); -+ if( zWideFilename==0 ){ -+ return SQLITE_IOERR_NOMEM; -+ } -+ } -+ /* Check whether it has the '\\?\' prefix and can be shortened. */ -+ if( nByte<=(SQLITE_WIN32_MAX_PATH_CHARS+6) -+ && winIsDirSep(zRelative[0]) && winIsDirSep(zRelative[1]) -+ && (zRelative[2]=='?') && winIsDirSep(zRelative[3]) ){ -+ if( sqlite3_strnicmp(&zRelative[4], "UNC", 3) -+ && winIsDirSep(zRelative[7]) ){ -+ memcpy(zWideFilename, L"\\\\", 4); -+ nByte = osMultiByteToWideChar(CP_UTF8, 0, zRelative+8, -1, -+ zWideFilename+2, nByte-8); -+ }else if( nByte<=(SQLITE_WIN32_MAX_PATH_CHARS+4) ){ -+ nByte = osMultiByteToWideChar(CP_UTF8, 0, zRelative+4, -1, -+ zWideFilename, nByte-4); -+ }else{ -+ nByte = osMultiByteToWideChar(CP_UTF8, 0, zRelative, -1, -+ zWideFilename, nByte); -+ } -+ }else{ -+ nByte = osMultiByteToWideChar(CP_UTF8, 0, zRelative, -1, -+ zWideFilename, nByte); -+ } -+ if( nByte==0 ){ -+ sqlite3_free(zWideFilename); -+ return SQLITE_IOERR_NOMEM; -+ } -+ finished: -+ zConverted = zWideFilename; -+ for(i=j=0; zWideFilename[i]; ++i){ -+ if( winIsDirSep(zWideFilename[i]) ){ -+ if( zWideFilename[i+1]=='.' && winIsDirSep(zWideFilename[i+2]) ){ -+ ++i; -+ continue; -+ } -+ if( !zWideFilename[i+1] || (winIsDirSep(zWideFilename[i+1]) && (i!=0)) ){ -+ continue; -+ } -+ zWideFilename[j++] = '\\'; -+ }else{ -+ zWideFilename[j++] = zWideFilename[i]; -+ } -+ } -+ while(j0 ); - assert( winSysInfo.dwPageSize>0 ); - -+#if !defined(__CYGWIN__) -+ if( osIsNT() ){ -+ module = osGetModuleHandleW(L"CYGWIN1.DLL"); -+ if( !module){ -+ module = osGetModuleHandleW(L"MSYS-2.0.DLL"); -+ } -+#ifdef SQLITE_WIN32_HAS_ANSI -+ }else{ -+ module = osGetModuleHandleA("CYGWIN1.DLL"); -+ if( !module){ -+ module = osGetModuleHandleA("MSYS-2.0.DLL"); -+ } -+#endif -+ } -+ if( module ){ -+ for( i=78; iisPinned==0 ); - pCache = pPage->pCache; - pGroup = pCache->pGroup; -+ assert( pPage->pLruNext || pPage==pGroup->pLruTail ); -+ assert( pPage->pLruPrev || pPage==pGroup->pLruHead ); - assert( sqlite3_mutex_held(pGroup->mutex) ); -- if( pPage->pLruNext || pPage==pGroup->pLruTail ){ -- if( pPage->pLruPrev ){ -- pPage->pLruPrev->pLruNext = pPage->pLruNext; -- } -- if( pPage->pLruNext ){ -- pPage->pLruNext->pLruPrev = pPage->pLruPrev; -- } -- if( pGroup->pLruHead==pPage ){ -- pGroup->pLruHead = pPage->pLruNext; -- } -- if( pGroup->pLruTail==pPage ){ -- pGroup->pLruTail = pPage->pLruPrev; -- } -- pPage->pLruNext = 0; -- pPage->pLruPrev = 0; -- pPage->pCache->nRecyclable--; -+ if( pPage->pLruPrev ){ -+ pPage->pLruPrev->pLruNext = pPage->pLruNext; -+ }else{ -+ pGroup->pLruHead = pPage->pLruNext; - } -+ if( pPage->pLruNext ){ -+ pPage->pLruNext->pLruPrev = pPage->pLruPrev; -+ }else{ -+ pGroup->pLruTail = pPage->pLruPrev; -+ } -+ pPage->pLruNext = 0; -+ pPage->pLruPrev = 0; -+ pPage->isPinned = 1; -+ pCache->nRecyclable--; - } - - -@@ -37912,6 +38800,7 @@ static void pcache1EnforceMaxPage(PGroup - while( pGroup->nCurrentPage>pGroup->nMaxPage && pGroup->pLruTail ){ - PgHdr1 *p = pGroup->pLruTail; - assert( p->pCache->pGroup==pGroup ); -+ assert( p->isPinned==0 ); - pcache1PinPage(p); - pcache1RemoveFromHash(p); - pcache1FreePage(p); -@@ -37939,7 +38828,7 @@ static void pcache1TruncateUnsafe( - if( pPage->iKey>=iLimit ){ - pCache->nPage--; - *pp = pPage->pNext; -- pcache1PinPage(pPage); -+ if( !pPage->isPinned ) pcache1PinPage(pPage); - pcache1FreePage(pPage); - }else{ - pp = &pPage->pNext; -@@ -38162,8 +39051,11 @@ static sqlite3_pcache_page *pcache1Fetch - } - - /* Step 2: Abort if no existing page is found and createFlag is 0 */ -- if( pPage || createFlag==0 ){ -- pcache1PinPage(pPage); -+ if( pPage ){ -+ if( !pPage->isPinned ) pcache1PinPage(pPage); -+ goto fetch_out; -+ } -+ if( createFlag==0 ){ - goto fetch_out; - } - -@@ -38204,6 +39096,7 @@ static sqlite3_pcache_page *pcache1Fetch - )){ - PCache1 *pOther; - pPage = pGroup->pLruTail; -+ assert( pPage->isPinned==0 ); - pcache1RemoveFromHash(pPage); - pcache1PinPage(pPage); - pOther = pPage->pCache; -@@ -38240,6 +39133,7 @@ static sqlite3_pcache_page *pcache1Fetch - pPage->pCache = pCache; - pPage->pLruPrev = 0; - pPage->pLruNext = 0; -+ pPage->isPinned = 1; - *(void **)pPage->page.pExtra = 0; - pCache->apHash[h] = pPage; - } -@@ -38275,6 +39169,7 @@ static void pcache1Unpin( - */ - assert( pPage->pLruPrev==0 && pPage->pLruNext==0 ); - assert( pGroup->pLruHead!=pPage && pGroup->pLruTail!=pPage ); -+ assert( pPage->isPinned==1 ); - - if( reuseUnlikely || pGroup->nCurrentPage>pGroup->nMaxPage ){ - pcache1RemoveFromHash(pPage); -@@ -38290,6 +39185,7 @@ static void pcache1Unpin( - pGroup->pLruHead = pPage; - } - pCache->nRecyclable++; -+ pPage->isPinned = 0; - } - - pcache1LeaveMutex(pCache->pGroup); -@@ -38416,6 +39312,7 @@ SQLITE_PRIVATE int sqlite3PcacheReleaseM - #ifdef SQLITE_PCACHE_SEPARATE_HEADER - nFree += sqlite3MemSize(p); - #endif -+ assert( p->isPinned==0 ); - pcache1PinPage(p); - pcache1RemoveFromHash(p); - pcache1FreePage(p); -@@ -38440,6 +39337,7 @@ SQLITE_PRIVATE void sqlite3PcacheStats( - PgHdr1 *p; - int nRecyclable = 0; - for(p=pcache1.grp.pLruHead; p; p=p->pLruNext){ -+ assert( p->isPinned==0 ); - nRecyclable++; - } - *pnCurrent = pcache1.grp.nCurrentPage; -@@ -40126,15 +41024,12 @@ static char *print_pager_state(Pager *p) - static int subjRequiresPage(PgHdr *pPg){ - Pager *pPager = pPg->pPager; - PagerSavepoint *p; -- Pgno pgno; -+ Pgno pgno = pPg->pgno; - int i; -- if( pPager->nSavepoint ){ -- pgno = pPg->pgno; -- for(i=0; inSavepoint; i++){ -- p = &pPager->aSavepoint[i]; -- if( p->nOrig>=pgno && 0==sqlite3BitvecTest(p->pInSavepoint, pgno) ){ -- return 1; -- } -+ for(i=0; inSavepoint; i++){ -+ p = &pPager->aSavepoint[i]; -+ if( p->nOrig>=pgno && 0==sqlite3BitvecTest(p->pInSavepoint, pgno) ){ -+ return 1; - } - } - return 0; -@@ -40143,8 +41038,8 @@ static int subjRequiresPage(PgHdr *pPg){ - /* - ** Return true if the page is already in the journal file. - */ --static int pageInJournal(PgHdr *pPg){ -- return sqlite3BitvecTest(pPg->pPager->pInJournal, pPg->pgno); -+static int pageInJournal(Pager *pPager, PgHdr *pPg){ -+ return sqlite3BitvecTest(pPager->pInJournal, pPg->pgno); - } - - /* -@@ -40351,6 +41246,7 @@ static int readMasterJournal(sqlite3_fil - || szJ<16 - || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-16, &len)) - || len>=nMaster -+ || len==0 - || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-12, &cksum)) - || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, aMagic, 8, szJ-8)) - || memcmp(aMagic, aJournalMagic, 8) -@@ -41091,7 +41987,7 @@ static int pager_end_transaction(Pager * - PgHdr *p = pager_lookup(pPager, 1); - if( p ){ - p->pageHash = 0; -- sqlite3PagerUnref(p); -+ sqlite3PagerUnrefNotNull(p); - } - } - #endif -@@ -41120,6 +42016,11 @@ static int pager_end_transaction(Pager * - rc = pager_truncate(pPager, pPager->dbSize); - } - -+ if( rc==SQLITE_OK && bCommit && isOpen(pPager->fd) ){ -+ rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_COMMIT_PHASETWO, 0); -+ if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; -+ } -+ - if( !pPager->exclusiveMode - && (!pagerUseWal(pPager) || sqlite3WalExclusiveMode(pPager->pWal, 0)) - ){ -@@ -41933,7 +42834,7 @@ end_playback: - if( rc==SQLITE_OK - && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) - ){ -- rc = sqlite3PagerSync(pPager); -+ rc = sqlite3PagerSync(pPager, 0); - } - if( rc==SQLITE_OK ){ - rc = pager_end_transaction(pPager, zMaster[0]!='\0', 0); -@@ -42079,7 +42980,7 @@ static int pagerUndoCallback(void *pCtx, - if( rc==SQLITE_OK ){ - pPager->xReiniter(pPg); - } -- sqlite3PagerUnref(pPg); -+ sqlite3PagerUnrefNotNull(pPg); - } - } - -@@ -43434,7 +44335,7 @@ static int subjournalPage(PgHdr *pPg){ - assert( isOpen(pPager->jfd) || pagerUseWal(pPager) ); - assert( isOpen(pPager->sjfd) || pPager->nSubRec==0 ); - assert( pagerUseWal(pPager) -- || pageInJournal(pPg) -+ || pageInJournal(pPager, pPg) - || pPg->pgno>pPager->dbOrigSize - ); - rc = openSubJournal(pPager); -@@ -43899,6 +44800,30 @@ SQLITE_PRIVATE int sqlite3PagerOpen( - } - - -+/* Verify that the database file has not be deleted or renamed out from -+** under the pager. Return SQLITE_OK if the database is still were it ought -+** to be on disk. Return non-zero (SQLITE_READONLY_DBMOVED or some other error -+** code from sqlite3OsAccess()) if the database has gone missing. -+*/ -+static int databaseIsUnmoved(Pager *pPager){ -+ int bHasMoved = 0; -+ int rc; -+ -+ if( pPager->tempFile ) return SQLITE_OK; -+ if( pPager->dbSize==0 ) return SQLITE_OK; -+ assert( pPager->zFilename && pPager->zFilename[0] ); -+ rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_HAS_MOVED, &bHasMoved); -+ if( rc==SQLITE_NOTFOUND ){ -+ /* If the HAS_MOVED file-control is unimplemented, assume that the file -+ ** has not been moved. That is the historical behavior of SQLite: prior to -+ ** version 3.8.3, it never checked */ -+ rc = SQLITE_OK; -+ }else if( rc==SQLITE_OK && bHasMoved ){ -+ rc = SQLITE_READONLY_DBMOVED; -+ } -+ return rc; -+} -+ - - /* - ** This function is called after transitioning from PAGER_UNLOCK to -@@ -44370,7 +45295,7 @@ SQLITE_PRIVATE int sqlite3PagerAcquire( - if( rc!=SQLITE_OK ) goto pager_acquire_err; - } - -- if( iFrame==0 && bMmapOk ){ -+ if( bMmapOk && iFrame==0 ){ - void *pData = 0; - - rc = sqlite3OsFetch(pPager->fd, -@@ -44511,16 +45436,19 @@ SQLITE_PRIVATE DbPage *sqlite3PagerLooku - ** are released, a rollback occurs and the lock on the database is - ** removed. - */ --SQLITE_PRIVATE void sqlite3PagerUnref(DbPage *pPg){ -- if( pPg ){ -- Pager *pPager = pPg->pPager; -- if( pPg->flags & PGHDR_MMAP ){ -- pagerReleaseMapPage(pPg); -- }else{ -- sqlite3PcacheRelease(pPg); -- } -- pagerUnlockIfUnused(pPager); -+SQLITE_PRIVATE void sqlite3PagerUnrefNotNull(DbPage *pPg){ -+ Pager *pPager; -+ assert( pPg!=0 ); -+ pPager = pPg->pPager; -+ if( pPg->flags & PGHDR_MMAP ){ -+ pagerReleaseMapPage(pPg); -+ }else{ -+ sqlite3PcacheRelease(pPg); - } -+ pagerUnlockIfUnused(pPager); -+} -+SQLITE_PRIVATE void sqlite3PagerUnref(DbPage *pPg){ -+ if( pPg ) sqlite3PagerUnrefNotNull(pPg); - } - - /* -@@ -44575,13 +45503,19 @@ static int pager_open_journal(Pager *pPa - (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL): - (SQLITE_OPEN_MAIN_JOURNAL) - ); -- #ifdef SQLITE_ENABLE_ATOMIC_WRITE -- rc = sqlite3JournalOpen( -- pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager) -- ); -- #else -- rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0); -- #endif -+ -+ /* Verify that the database still has the same name as it did when -+ ** it was originally opened. */ -+ rc = databaseIsUnmoved(pPager); -+ if( rc==SQLITE_OK ){ -+#ifdef SQLITE_ENABLE_ATOMIC_WRITE -+ rc = sqlite3JournalOpen( -+ pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager) -+ ); -+#else -+ rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0); -+#endif -+ } - } - assert( rc!=SQLITE_OK || isOpen(pPager->jfd) ); - } -@@ -44702,9 +45636,9 @@ SQLITE_PRIVATE int sqlite3PagerBegin(Pag - ** of any open savepoints as appropriate. - */ - static int pager_write(PgHdr *pPg){ -- void *pData = pPg->pData; - Pager *pPager = pPg->pPager; - int rc = SQLITE_OK; -+ int inJournal; - - /* This routine is not called unless a write-transaction has already - ** been started. The journal file may or may not be open at this point. -@@ -44715,14 +45649,8 @@ static int pager_write(PgHdr *pPg){ - || pPager->eState==PAGER_WRITER_DBMOD - ); - assert( assert_pager_state(pPager) ); -- -- /* If an error has been previously detected, report the same error -- ** again. This should not happen, but the check provides robustness. */ -- if( NEVER(pPager->errCode) ) return pPager->errCode; -- -- /* Higher-level routines never call this function if database is not -- ** writable. But check anyway, just for robustness. */ -- if( NEVER(pPager->readOnly) ) return SQLITE_PERM; -+ assert( pPager->errCode==0 ); -+ assert( pPager->readOnly==0 ); - - CHECK_PAGE(pPg); - -@@ -44746,7 +45674,8 @@ static int pager_write(PgHdr *pPg){ - ** to the journal then we can return right away. - */ - sqlite3PcacheMakeDirty(pPg); -- if( pageInJournal(pPg) && !subjRequiresPage(pPg) ){ -+ inJournal = pageInJournal(pPager, pPg); -+ if( inJournal && (pPager->nSavepoint==0 || !subjRequiresPage(pPg)) ){ - assert( !pagerUseWal(pPager) ); - }else{ - -@@ -44754,7 +45683,7 @@ static int pager_write(PgHdr *pPg){ - ** EXCLUSIVE lock on the main database file. Write the current page to - ** the transaction journal if it is not there already. - */ -- if( !pageInJournal(pPg) && !pagerUseWal(pPager) ){ -+ if( !inJournal && !pagerUseWal(pPager) ){ - assert( pagerUseWal(pPager)==0 ); - if( pPg->pgno<=pPager->dbOrigSize && isOpen(pPager->jfd) ){ - u32 cksum; -@@ -44767,7 +45696,7 @@ static int pager_write(PgHdr *pPg){ - assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) ); - - assert( pPager->journalHdr<=pPager->journalOff ); -- CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2); -+ CODEC2(pPager, pPg->pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2); - cksum = pager_cksum(pPager, (u8*)pData2); - - /* Even if an IO or diskfull error occurs while journalling the -@@ -44819,7 +45748,7 @@ static int pager_write(PgHdr *pPg){ - ** the statement journal format differs from the standard journal format - ** in that it omits the checksums and the header. - */ -- if( subjRequiresPage(pPg) ){ -+ if( pPager->nSavepoint>0 && subjRequiresPage(pPg) ){ - rc = subjournalPage(pPg); - } - } -@@ -44851,19 +45780,19 @@ SQLITE_PRIVATE int sqlite3PagerWrite(DbP - - PgHdr *pPg = pDbPage; - Pager *pPager = pPg->pPager; -- Pgno nPagePerSector = (pPager->sectorSize/pPager->pageSize); - - assert( (pPg->flags & PGHDR_MMAP)==0 ); - assert( pPager->eState>=PAGER_WRITER_LOCKED ); - assert( pPager->eState!=PAGER_ERROR ); - assert( assert_pager_state(pPager) ); - -- if( nPagePerSector>1 ){ -+ if( pPager->sectorSize > (u32)pPager->pageSize ){ - Pgno nPageCount; /* Total number of pages in database file */ - Pgno pg1; /* First page of the sector pPg is located on. */ - int nPage = 0; /* Number of pages starting at pg1 to journal */ - int ii; /* Loop counter */ - int needSync = 0; /* True if any page has PGHDR_NEED_SYNC */ -+ Pgno nPagePerSector = (pPager->sectorSize/pPager->pageSize); - - /* Set the doNotSpill NOSYNC bit to 1. This is because we cannot allow - ** a journal header to be written between the pages journaled by -@@ -44902,14 +45831,14 @@ SQLITE_PRIVATE int sqlite3PagerWrite(DbP - if( pPage->flags&PGHDR_NEED_SYNC ){ - needSync = 1; - } -- sqlite3PagerUnref(pPage); -+ sqlite3PagerUnrefNotNull(pPage); - } - } - }else if( (pPage = pager_lookup(pPager, pg))!=0 ){ - if( pPage->flags&PGHDR_NEED_SYNC ){ - needSync = 1; - } -- sqlite3PagerUnref(pPage); -+ sqlite3PagerUnrefNotNull(pPage); - } - } - -@@ -44925,7 +45854,7 @@ SQLITE_PRIVATE int sqlite3PagerWrite(DbP - PgHdr *pPage = pager_lookup(pPager, pg1+ii); - if( pPage ){ - pPage->flags |= PGHDR_NEED_SYNC; -- sqlite3PagerUnref(pPage); -+ sqlite3PagerUnrefNotNull(pPage); - } - } - } -@@ -45078,17 +46007,17 @@ static int pager_incr_changecounter(Page - ** If successful, or if called on a pager for which it is a no-op, this - ** function returns SQLITE_OK. Otherwise, an IO error code is returned. - */ --SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager){ -+SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager, const char *zMaster){ - int rc = SQLITE_OK; -- if( !pPager->noSync ){ -+ -+ if( isOpen(pPager->fd) ){ -+ void *pArg = (void*)zMaster; -+ rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC, pArg); -+ if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; -+ } -+ if( rc==SQLITE_OK && !pPager->noSync ){ - assert( !MEMDB ); - rc = sqlite3OsSync(pPager->fd, pPager->syncFlags); -- }else if( isOpen(pPager->fd) ){ -- assert( !MEMDB ); -- rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC_OMITTED, 0); -- if( rc==SQLITE_NOTFOUND ){ -- rc = SQLITE_OK; -- } - } - return rc; - } -@@ -45287,7 +46216,7 @@ SQLITE_PRIVATE int sqlite3PagerCommitPha - - /* Finally, sync the database file. */ - if( !noSync ){ -- rc = sqlite3PagerSync(pPager); -+ rc = sqlite3PagerSync(pPager, zMaster); - } - IOTRACE(("DBSYNC %p\n", pPager)) - } -@@ -45416,7 +46345,9 @@ SQLITE_PRIVATE int sqlite3PagerRollback( - - assert( pPager->eState==PAGER_READER || rc!=SQLITE_OK ); - assert( rc==SQLITE_OK || rc==SQLITE_FULL || rc==SQLITE_CORRUPT -- || rc==SQLITE_NOMEM || (rc&0xFF)==SQLITE_IOERR ); -+ || rc==SQLITE_NOMEM || (rc&0xFF)==SQLITE_IOERR -+ || rc==SQLITE_CANTOPEN -+ ); - - /* If an error occurs during a ROLLBACK, we can no longer trust the pager - ** cache. So call pager_error() on the way out to make any error persistent. -@@ -45819,7 +46750,7 @@ SQLITE_PRIVATE int sqlite3PagerMovepage( - if( (pPg->flags&PGHDR_NEED_SYNC) && !isCommit ){ - needSyncPgno = pPg->pgno; - assert( pPager->journalMode==PAGER_JOURNALMODE_OFF || -- pageInJournal(pPg) || pPg->pgno>pPager->dbOrigSize ); -+ pageInJournal(pPager, pPg) || pPg->pgno>pPager->dbOrigSize ); - assert( pPg->flags&PGHDR_DIRTY ); - } - -@@ -45853,7 +46784,7 @@ SQLITE_PRIVATE int sqlite3PagerMovepage( - if( MEMDB ){ - assert( pPgOld ); - sqlite3PcacheMove(pPgOld, origPgno); -- sqlite3PagerUnref(pPgOld); -+ sqlite3PagerUnrefNotNull(pPgOld); - } - - if( needSyncPgno ){ -@@ -45882,7 +46813,7 @@ SQLITE_PRIVATE int sqlite3PagerMovepage( - } - pPgHdr->flags |= PGHDR_NEED_SYNC; - sqlite3PcacheMakeDirty(pPgHdr); -- sqlite3PagerUnref(pPgHdr); -+ sqlite3PagerUnrefNotNull(pPgHdr); - } - - return SQLITE_OK; -@@ -52001,7 +52932,7 @@ static int getAndInitPage( - rc = SQLITE_CORRUPT_BKPT; - }else{ - rc = btreeGetPage(pBt, pgno, ppPage, bReadonly); -- if( rc==SQLITE_OK ){ -+ if( rc==SQLITE_OK && (*ppPage)->isInit==0 ){ - rc = btreeInitPage(*ppPage); - if( rc!=SQLITE_OK ){ - releasePage(*ppPage); -@@ -52022,10 +52953,11 @@ static void releasePage(MemPage *pPage){ - if( pPage ){ - assert( pPage->aData ); - assert( pPage->pBt ); -+ assert( pPage->pDbPage!=0 ); - assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); - assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData ); - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); -- sqlite3PagerUnref(pPage->pDbPage); -+ sqlite3PagerUnrefNotNull(pPage->pDbPage); - } - } - -@@ -54102,7 +55034,7 @@ SQLITE_PRIVATE int sqlite3BtreeCloseCurs - int iPage = pCur->iPage; - memset(&info, 0, sizeof(info)); - btreeParseCell(pCur->apPage[iPage], pCur->aiIdx[iPage], &info); -- assert( memcmp(&info, &pCur->info, sizeof(info))==0 ); -+ assert( CORRUPT_DB || memcmp(&info, &pCur->info, sizeof(info))==0 ); - } - #else - #define assertCellInfo(x) -@@ -54541,10 +55473,10 @@ SQLITE_PRIVATE int sqlite3BtreeData(BtCu - /* - ** Return a pointer to payload information from the entry that the - ** pCur cursor is pointing to. The pointer is to the beginning of --** the key if skipKey==0 and it points to the beginning of data if --** skipKey==1. The number of bytes of available key/data is written --** into *pAmt. If *pAmt==0, then the value returned will not be --** a valid pointer. -+** the key if index btrees (pPage->intKey==0) and is the data for -+** table btrees (pPage->intKey==1). The number of bytes of available -+** key/data is written into *pAmt. If *pAmt==0, then the value -+** returned will not be a valid pointer. - ** - ** This routine is an optimization. It is common for the entire key - ** and data to fit on the local page and for there to be no overflow -@@ -54557,41 +55489,21 @@ SQLITE_PRIVATE int sqlite3BtreeData(BtCu - ** page of the database. The data might change or move the next time - ** any btree routine is called. - */ --static const unsigned char *fetchPayload( -+static const void *fetchPayload( - BtCursor *pCur, /* Cursor pointing to entry to read from */ -- u32 *pAmt, /* Write the number of available bytes here */ -- int skipKey /* read beginning at data if this is true */ -+ u32 *pAmt /* Write the number of available bytes here */ - ){ -- unsigned char *aPayload; -- MemPage *pPage; -- u32 nKey; -- u32 nLocal; -- - assert( pCur!=0 && pCur->iPage>=0 && pCur->apPage[pCur->iPage]); - assert( pCur->eState==CURSOR_VALID ); -+ assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); - assert( cursorHoldsMutex(pCur) ); -- pPage = pCur->apPage[pCur->iPage]; -- assert( pCur->aiIdx[pCur->iPage]nCell ); -+ assert( pCur->aiIdx[pCur->iPage]apPage[pCur->iPage]->nCell ); - if( pCur->info.nSize==0 ){ - btreeParseCell(pCur->apPage[pCur->iPage], pCur->aiIdx[pCur->iPage], - &pCur->info); - } -- aPayload = pCur->info.pCell; -- aPayload += pCur->info.nHeader; -- if( pPage->intKey ){ -- nKey = 0; -- }else{ -- nKey = (int)pCur->info.nKey; -- } -- if( skipKey ){ -- aPayload += nKey; -- nLocal = pCur->info.nLocal - nKey; -- }else{ -- nLocal = pCur->info.nLocal; -- assert( nLocal<=nKey ); -- } -- *pAmt = nLocal; -- return aPayload; -+ *pAmt = pCur->info.nLocal; -+ return (void*)(pCur->info.pCell + pCur->info.nHeader); - } - - -@@ -54610,22 +55522,10 @@ static const unsigned char *fetchPayload - ** in the common case where no overflow pages are used. - */ - SQLITE_PRIVATE const void *sqlite3BtreeKeyFetch(BtCursor *pCur, u32 *pAmt){ -- const void *p = 0; -- assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); -- assert( cursorHoldsMutex(pCur) ); -- if( ALWAYS(pCur->eState==CURSOR_VALID) ){ -- p = (const void*)fetchPayload(pCur, pAmt, 0); -- } -- return p; -+ return fetchPayload(pCur, pAmt); - } - SQLITE_PRIVATE const void *sqlite3BtreeDataFetch(BtCursor *pCur, u32 *pAmt){ -- const void *p = 0; -- assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); -- assert( cursorHoldsMutex(pCur) ); -- if( ALWAYS(pCur->eState==CURSOR_VALID) ){ -- p = (const void*)fetchPayload(pCur, pAmt, 1); -- } -- return p; -+ return fetchPayload(pCur, pAmt); - } - - -@@ -54744,8 +55644,6 @@ static void moveToParent(BtCursor *pCur) - static int moveToRoot(BtCursor *pCur){ - MemPage *pRoot; - int rc = SQLITE_OK; -- Btree *p = pCur->pBtree; -- BtShared *pBt = p->pBt; - - assert( cursorHoldsMutex(pCur) ); - assert( CURSOR_INVALID < CURSOR_REQUIRESEEK ); -@@ -54760,56 +55658,52 @@ static int moveToRoot(BtCursor *pCur){ - } - - if( pCur->iPage>=0 ){ -- int i; -- for(i=1; i<=pCur->iPage; i++){ -- releasePage(pCur->apPage[i]); -- } -- pCur->iPage = 0; -+ while( pCur->iPage ) releasePage(pCur->apPage[pCur->iPage--]); - }else if( pCur->pgnoRoot==0 ){ - pCur->eState = CURSOR_INVALID; - return SQLITE_OK; - }else{ -- rc = getAndInitPage(pBt, pCur->pgnoRoot, &pCur->apPage[0], -+ rc = getAndInitPage(pCur->pBtree->pBt, pCur->pgnoRoot, &pCur->apPage[0], - pCur->wrFlag==0 ? PAGER_GET_READONLY : 0); - if( rc!=SQLITE_OK ){ - pCur->eState = CURSOR_INVALID; - return rc; - } - pCur->iPage = 0; -- -- /* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor -- ** expected to open it on an index b-tree. Otherwise, if pKeyInfo is -- ** NULL, the caller expects a table b-tree. If this is not the case, -- ** return an SQLITE_CORRUPT error. */ -- assert( pCur->apPage[0]->intKey==1 || pCur->apPage[0]->intKey==0 ); -- if( (pCur->pKeyInfo==0)!=pCur->apPage[0]->intKey ){ -- return SQLITE_CORRUPT_BKPT; -- } - } -- -- /* Assert that the root page is of the correct type. This must be the -- ** case as the call to this function that loaded the root-page (either -- ** this call or a previous invocation) would have detected corruption -- ** if the assumption were not true, and it is not possible for the flags -- ** byte to have been modified while this cursor is holding a reference -- ** to the page. */ - pRoot = pCur->apPage[0]; - assert( pRoot->pgno==pCur->pgnoRoot ); -- assert( pRoot->isInit && (pCur->pKeyInfo==0)==pRoot->intKey ); -+ -+ /* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor -+ ** expected to open it on an index b-tree. Otherwise, if pKeyInfo is -+ ** NULL, the caller expects a table b-tree. If this is not the case, -+ ** return an SQLITE_CORRUPT error. -+ ** -+ ** Earlier versions of SQLite assumed that this test could not fail -+ ** if the root page was already loaded when this function was called (i.e. -+ ** if pCur->iPage>=0). But this is not so if the database is corrupted -+ ** in such a way that page pRoot is linked into a second b-tree table -+ ** (or the freelist). */ -+ assert( pRoot->intKey==1 || pRoot->intKey==0 ); -+ if( pRoot->isInit==0 || (pCur->pKeyInfo==0)!=pRoot->intKey ){ -+ return SQLITE_CORRUPT_BKPT; -+ } - - pCur->aiIdx[0] = 0; - pCur->info.nSize = 0; - pCur->atLast = 0; - pCur->validNKey = 0; - -- if( pRoot->nCell==0 && !pRoot->leaf ){ -+ if( pRoot->nCell>0 ){ -+ pCur->eState = CURSOR_VALID; -+ }else if( !pRoot->leaf ){ - Pgno subpage; - if( pRoot->pgno!=1 ) return SQLITE_CORRUPT_BKPT; - subpage = get4byte(&pRoot->aData[pRoot->hdrOffset+8]); - pCur->eState = CURSOR_VALID; - rc = moveToChild(pCur, subpage); - }else{ -- pCur->eState = ((pRoot->nCell>0)?CURSOR_VALID:CURSOR_INVALID); -+ pCur->eState = CURSOR_INVALID; - } - return rc; - } -@@ -55065,9 +55959,7 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnp - ** 2 bytes of the cell. - */ - nCell = pCell[0]; -- if( nCell<=pPage->max1bytePayload -- /* && (pCell+nCell)aDataEnd */ -- ){ -+ if( nCell<=pPage->max1bytePayload ){ - /* This branch runs if the record-size field of the cell is a - ** single byte varint and the record fits entirely on the main - ** b-tree page. */ -@@ -55075,7 +55967,6 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnp - c = sqlite3VdbeRecordCompare(nCell, (void*)&pCell[1], pIdxKey); - }else if( !(pCell[1] & 0x80) - && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal -- /* && (pCell+nCell+2)<=pPage->aDataEnd */ - ){ - /* The record-size field is a 2 byte varint and the record - ** fits entirely on the main b-tree page. */ -@@ -55638,6 +56529,7 @@ end_allocate_page: - if( rc==SQLITE_OK ){ - if( sqlite3PagerPageRefcount((*ppPage)->pDbPage)>1 ){ - releasePage(*ppPage); -+ *ppPage = 0; - return SQLITE_CORRUPT_BKPT; - } - (*ppPage)->isInit = 0; -@@ -55899,7 +56791,7 @@ static int fillInCell( - nHeader += 4; - } - if( pPage->hasData ){ -- nHeader += putVarint(&pCell[nHeader], nData+nZero); -+ nHeader += putVarint32(&pCell[nHeader], nData+nZero); - }else{ - nData = nZero = 0; - } -@@ -56027,7 +56919,6 @@ static void dropCell(MemPage *pPage, int - u32 pc; /* Offset to cell content of cell being deleted */ - u8 *data; /* pPage->aData */ - u8 *ptr; /* Used to move bytes around within data[] */ -- u8 *endPtr; /* End of loop */ - int rc; /* The return code */ - int hdr; /* Beginning of the header. 0 most pages. 100 page 1 */ - -@@ -56052,13 +56943,8 @@ static void dropCell(MemPage *pPage, int - *pRC = rc; - return; - } -- endPtr = &pPage->aCellIdx[2*pPage->nCell - 2]; -- assert( (SQLITE_PTR_TO_INT(ptr)&1)==0 ); /* ptr is always 2-byte aligned */ -- while( ptrnCell--; -+ memmove(ptr, ptr+2, 2*(pPage->nCell - idx)); - put2byte(&data[hdr+3], pPage->nCell); - pPage->nFree += 2; - } -@@ -56095,9 +56981,6 @@ static void insertCell( - int ins; /* Index in data[] where new cell pointer is inserted */ - int cellOffset; /* Address of first cell pointer in data[] */ - u8 *data; /* The content of the whole page */ -- u8 *ptr; /* Used for moving information around in data[] */ -- u8 *endPtr; /* End of the loop */ -- - int nSkip = (iChild ? 4 : 0); - - if( *pRC ) return; -@@ -56148,13 +57031,7 @@ static void insertCell( - if( iChild ){ - put4byte(&data[idx], iChild); - } -- ptr = &data[end]; -- endPtr = &data[ins]; -- assert( (SQLITE_PTR_TO_INT(ptr)&1)==0 ); /* ptr is always 2-byte aligned */ -- while( ptr>endPtr ){ -- *(u16*)ptr = *(u16*)&ptr[-2]; -- ptr -= 2; -- } -+ memmove(&data[ins+2], &data[ins], end-ins); - put2byte(&data[ins], idx); - put2byte(&data[pPage->hdrOffset+3], pPage->nCell); - #ifndef SQLITE_OMIT_AUTOVACUUM -@@ -57752,6 +58629,7 @@ static int clearDatabasePage( - int rc; - unsigned char *pCell; - int i; -+ int hdr; - - assert( sqlite3_mutex_held(pBt->mutex) ); - if( pgno>btreePagecount(pBt) ){ -@@ -57760,6 +58638,7 @@ static int clearDatabasePage( - - rc = getAndInitPage(pBt, pgno, &pPage, 0); - if( rc ) return rc; -+ hdr = pPage->hdrOffset; - for(i=0; inCell; i++){ - pCell = findCell(pPage, i); - if( !pPage->leaf ){ -@@ -57770,7 +58649,7 @@ static int clearDatabasePage( - if( rc ) goto cleardatabasepage_out; - } - if( !pPage->leaf ){ -- rc = clearDatabasePage(pBt, get4byte(&pPage->aData[8]), 1, pnChange); -+ rc = clearDatabasePage(pBt, get4byte(&pPage->aData[hdr+8]), 1, pnChange); - if( rc ) goto cleardatabasepage_out; - }else if( pnChange ){ - assert( pPage->intKey ); -@@ -57779,7 +58658,7 @@ static int clearDatabasePage( - if( freePageFlag ){ - freePage(pPage, &rc); - }else if( (rc = sqlite3PagerWrite(pPage->pDbPage))==0 ){ -- zeroPage(pPage, pPage->aData[0] | PTF_LEAF); -+ zeroPage(pPage, pPage->aData[hdr] | PTF_LEAF); - } - - cleardatabasepage_out: -@@ -58116,7 +58995,7 @@ static void checkAppendMsg( - sqlite3StrAccumAppend(&pCheck->errMsg, "\n", 1); - } - if( zMsg1 ){ -- sqlite3StrAccumAppend(&pCheck->errMsg, zMsg1, -1); -+ sqlite3StrAccumAppendAll(&pCheck->errMsg, zMsg1); - } - sqlite3VXPrintf(&pCheck->errMsg, 1, zFormat, ap); - va_end(ap); -@@ -59410,7 +60289,7 @@ SQLITE_API int sqlite3_backup_step(sqlit - - /* Sync the database file to disk. */ - if( rc==SQLITE_OK ){ -- rc = sqlite3PagerSync(pDestPager); -+ rc = sqlite3PagerSync(pDestPager, 0); - } - }else{ - sqlite3PagerTruncateImage(pDestPager, nDestTruncate); -@@ -59485,10 +60364,10 @@ SQLITE_API int sqlite3_backup_finish(sql - - /* Set the error code of the destination database handle. */ - rc = (p->rc==SQLITE_DONE) ? SQLITE_OK : p->rc; -- sqlite3Error(p->pDestDb, rc, 0); -- -- /* Exit the mutexes and free the backup context structure. */ - if( p->pDestDb ){ -+ sqlite3Error(p->pDestDb, rc, 0); -+ -+ /* Exit the mutexes and free the backup context structure. */ - sqlite3LeaveMutexAndCloseZombie(p->pDestDb); - } - sqlite3BtreeLeave(p->pSrc); -@@ -59692,18 +60571,14 @@ SQLITE_PRIVATE int sqlite3VdbeChangeEnco - - /* - ** Make sure pMem->z points to a writable allocation of at least --** n bytes. -+** min(n,32) bytes. - ** --** If the third argument passed to this function is true, then memory --** cell pMem must contain a string or blob. In this case the content is --** preserved. Otherwise, if the third parameter to this function is false, --** any current string or blob value may be discarded. --** --** This function sets the MEM_Dyn flag and clears any xDel callback. --** It also clears MEM_Ephem and MEM_Static. If the preserve flag is --** not set, Mem.n is zeroed. -+** If the bPreserve argument is true, then copy of the content of -+** pMem->z into the new allocation. pMem must be either a string or -+** blob if bPreserve is true. If bPreserve is false, any prior content -+** in pMem->z is discarded. - */ --SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve){ -+SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPreserve){ - assert( 1 >= - ((pMem->zMalloc && pMem->zMalloc==pMem->z) ? 1 : 0) + - (((pMem->flags&MEM_Dyn)&&pMem->xDel) ? 1 : 0) + -@@ -59712,37 +60587,39 @@ SQLITE_PRIVATE int sqlite3VdbeMemGrow(Me - ); - assert( (pMem->flags&MEM_RowSet)==0 ); - -- /* If the preserve flag is set to true, then the memory cell must already -+ /* If the bPreserve flag is set to true, then the memory cell must already - ** contain a valid string or blob value. */ -- assert( preserve==0 || pMem->flags&(MEM_Blob|MEM_Str) ); -+ assert( bPreserve==0 || pMem->flags&(MEM_Blob|MEM_Str) ); -+ testcase( bPreserve && pMem->z==0 ); - -- if( n<32 ) n = 32; -- if( sqlite3DbMallocSize(pMem->db, pMem->zMalloc)z==pMem->zMalloc ){ -+ if( pMem->zMalloc==0 || sqlite3DbMallocSize(pMem->db, pMem->zMalloc)z==pMem->zMalloc ){ - pMem->z = pMem->zMalloc = sqlite3DbReallocOrFree(pMem->db, pMem->z, n); -- preserve = 0; -+ bPreserve = 0; - }else{ - sqlite3DbFree(pMem->db, pMem->zMalloc); - pMem->zMalloc = sqlite3DbMallocRaw(pMem->db, n); - } -+ if( pMem->zMalloc==0 ){ -+ sqlite3VdbeMemRelease(pMem); -+ pMem->flags = MEM_Null; -+ return SQLITE_NOMEM; -+ } - } - -- if( pMem->z && preserve && pMem->zMalloc && pMem->z!=pMem->zMalloc ){ -+ if( pMem->z && bPreserve && pMem->z!=pMem->zMalloc ){ - memcpy(pMem->zMalloc, pMem->z, pMem->n); - } -- if( pMem->flags&MEM_Dyn && pMem->xDel ){ -+ if( (pMem->flags&MEM_Dyn)!=0 && pMem->xDel ){ - assert( pMem->xDel!=SQLITE_DYNAMIC ); - pMem->xDel((void *)(pMem->z)); - } - - pMem->z = pMem->zMalloc; -- if( pMem->z==0 ){ -- pMem->flags = MEM_Null; -- }else{ -- pMem->flags &= ~(MEM_Ephem|MEM_Static); -- } -+ pMem->flags &= ~(MEM_Ephem|MEM_Static); - pMem->xDel = 0; -- return (pMem->z ? SQLITE_OK : SQLITE_NOMEM); -+ return SQLITE_OK; - } - - /* -@@ -59928,10 +60805,12 @@ SQLITE_PRIVATE void sqlite3VdbeMemReleas - */ - SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p){ - VdbeMemRelease(p); -- sqlite3DbFree(p->db, p->zMalloc); -+ if( p->zMalloc ){ -+ sqlite3DbFree(p->db, p->zMalloc); -+ p->zMalloc = 0; -+ } - p->z = 0; -- p->zMalloc = 0; -- p->xDel = 0; -+ assert( p->xDel==0 ); /* Zeroed by VdbeMemRelease() above */ - } - - /* -@@ -60115,6 +60994,9 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetNul - MemSetTypeFlag(pMem, MEM_Null); - pMem->type = SQLITE_NULL; - } -+SQLITE_PRIVATE void sqlite3ValueSetNull(sqlite3_value *p){ -+ sqlite3VdbeMemSetNull((Mem*)p); -+} - - /* - ** Delete any previous value and set the value to be a BLOB of length -@@ -60852,7 +61734,7 @@ static void recordFunc( - }else{ - aRet[0] = nSerial+1; - sqlite3PutVarint(&aRet[1], iSerial); -- sqlite3VdbeSerialPut(&aRet[1+nSerial], nVal, argv[0], file_format); -+ sqlite3VdbeSerialPut(&aRet[1+nSerial], argv[0], iSerial); - sqlite3_result_blob(context, aRet, nRet, SQLITE_TRANSIENT); - sqlite3DbFree(db, aRet); - } -@@ -61037,7 +61919,8 @@ SQLITE_PRIVATE int sqlite3ValueBytes(sql - /* - ** Create a new virtual database engine. - */ --SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(sqlite3 *db){ -+SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse *pParse){ -+ sqlite3 *db = pParse->db; - Vdbe *p; - p = sqlite3DbMallocZero(db, sizeof(Vdbe) ); - if( p==0 ) return 0; -@@ -61049,6 +61932,10 @@ SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(s - p->pPrev = 0; - db->pVdbe = p; - p->magic = VDBE_MAGIC_INIT; -+ p->pParse = pParse; -+ assert( pParse->aLabel==0 ); -+ assert( pParse->nLabel==0 ); -+ assert( pParse->nOpAlloc==0 ); - return p; - } - -@@ -61104,13 +61991,14 @@ SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe - ** unchanged (this is so that any opcodes already allocated can be - ** correctly deallocated along with the rest of the Vdbe). - */ --static int growOpArray(Vdbe *p){ -+static int growOpArray(Vdbe *v){ - VdbeOp *pNew; -+ Parse *p = v->pParse; - int nNew = (p->nOpAlloc ? p->nOpAlloc*2 : (int)(1024/sizeof(Op))); -- pNew = sqlite3DbRealloc(p->db, p->aOp, nNew*sizeof(Op)); -+ pNew = sqlite3DbRealloc(p->db, v->aOp, nNew*sizeof(Op)); - if( pNew ){ - p->nOpAlloc = sqlite3DbMallocSize(p->db, pNew)/sizeof(Op); -- p->aOp = pNew; -+ v->aOp = pNew; - } - return (pNew ? SQLITE_OK : SQLITE_NOMEM); - } -@@ -61149,7 +62037,7 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdb - i = p->nOp; - assert( p->magic==VDBE_MAGIC_INIT ); - assert( op>0 && op<0xff ); -- if( p->nOpAlloc<=i ){ -+ if( p->pParse->nOpAlloc<=i ){ - if( growOpArray(p) ){ - return 1; - } -@@ -61168,6 +62056,15 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdb - #endif - #ifdef SQLITE_DEBUG - if( p->db->flags & SQLITE_VdbeAddopTrace ){ -+ int jj, kk; -+ Parse *pParse = p->pParse; -+ for(jj=kk=0; jjaColCache + jj; -+ if( x->iLevel>pParse->iCacheLevel || x->iReg==0 ) continue; -+ printf(" r[%d]={%d:%d}", x->iReg, x->iTable, x->iColumn); -+ kk++; -+ } -+ if( kk ) printf("\n"); - sqlite3VdbePrintOp(0, i, &p->aOp[i]); - test_addop_breakpoint(); - } -@@ -61251,9 +62148,10 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp4Int( - ** - ** Zero is returned if a malloc() fails. - */ --SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe *p){ -+SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe *v){ -+ Parse *p = v->pParse; - int i = p->nLabel++; -- assert( p->magic==VDBE_MAGIC_INIT ); -+ assert( v->magic==VDBE_MAGIC_INIT ); - if( (i & (i-1))==0 ){ - p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel, - (i*2+1)*sizeof(p->aLabel[0])); -@@ -61269,13 +62167,15 @@ SQLITE_PRIVATE int sqlite3VdbeMakeLabel( - ** be inserted. The parameter "x" must have been obtained from - ** a prior call to sqlite3VdbeMakeLabel(). - */ --SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *p, int x){ -+SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *v, int x){ -+ Parse *p = v->pParse; - int j = -1-x; -- assert( p->magic==VDBE_MAGIC_INIT ); -+ assert( v->magic==VDBE_MAGIC_INIT ); - assert( jnLabel ); - if( j>=0 && p->aLabel ){ -- p->aLabel[j] = p->nOp; -+ p->aLabel[j] = v->nOp; - } -+ p->iFixedOp = v->nOp - 1; - } - - /* -@@ -61423,7 +62323,8 @@ static void resolveP2Values(Vdbe *p, int - int i; - int nMaxArgs = *pMaxFuncArgs; - Op *pOp; -- int *aLabel = p->aLabel; -+ Parse *pParse = p->pParse; -+ int *aLabel = pParse->aLabel; - p->readOnly = 1; - p->bIsReader = 0; - for(pOp=p->aOp, i=p->nOp-1; i>=0; i--, pOp++){ -@@ -61486,12 +62387,13 @@ static void resolveP2Values(Vdbe *p, int - - pOp->opflags = sqlite3OpcodeProperty[opcode]; - if( (pOp->opflags & OPFLG_JUMP)!=0 && pOp->p2<0 ){ -- assert( -1-pOp->p2nLabel ); -+ assert( -1-pOp->p2nLabel ); - pOp->p2 = aLabel[-1-pOp->p2]; - } - } -- sqlite3DbFree(p->db, p->aLabel); -- p->aLabel = 0; -+ sqlite3DbFree(p->db, pParse->aLabel); -+ pParse->aLabel = 0; -+ pParse->nLabel = 0; - *pMaxFuncArgs = nMaxArgs; - assert( p->bIsReader!=0 || p->btreeMask==0 ); - } -@@ -61535,7 +62437,7 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOp - SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp){ - int addr; - assert( p->magic==VDBE_MAGIC_INIT ); -- if( p->nOp + nOp > p->nOpAlloc && growOpArray(p) ){ -+ if( p->nOp + nOp > p->pParse->nOpAlloc && growOpArray(p) ){ - return 0; - } - addr = p->nOp; -@@ -61622,7 +62524,8 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP5( - ** the address of the next instruction to be coded. - */ - SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe *p, int addr){ -- if( ALWAYS(addr>=0) ) sqlite3VdbeChangeP2(p, addr, p->nOp); -+ sqlite3VdbeChangeP2(p, addr, p->nOp); -+ p->pParse->iFixedOp = p->nOp - 1; - } - - -@@ -61725,6 +62628,18 @@ SQLITE_PRIVATE void sqlite3VdbeChangeToN - } - - /* -+** Remove the last opcode inserted -+*/ -+SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe *p, u8 op){ -+ if( (p->nOp-1)>(p->pParse->iFixedOp) && p->aOp[p->nOp-1].opcode==op ){ -+ sqlite3VdbeChangeToNoop(p, p->nOp-1); -+ return 1; -+ }else{ -+ return 0; -+ } -+} -+ -+/* - ** Change the value of the P4 operand for a specific instruction. - ** This routine is useful when a large program is loaded from a - ** static array using sqlite3VdbeAddOpList but we want to make a -@@ -61889,7 +62804,17 @@ static int translateP(char c, const Op * - } - - /* --** Compute a string for the "comment" field of a VDBE opcode listing -+** Compute a string for the "comment" field of a VDBE opcode listing. -+** -+** The Synopsis: field in comments in the vdbe.c source file gets converted -+** to an extra string that is appended to the sqlite3OpcodeName(). In the -+** absence of other comments, this synopsis becomes the comment on the opcode. -+** Some translation occurs: -+** -+** "PX" -> "r[X]" -+** "PX@PY" -> "r[X..X+Y-1]" or "r[x]" if y is 0 or 1 -+** "PX@PY+1" -> "r[X..X+Y]" or "r[x]" if y is 0 -+** "PY..PY" -> "r[X..Y]" or "r[x]" if y<=x - */ - static int displayComment( - const Op *pOp, /* The opcode to be commented */ -@@ -61923,7 +62848,13 @@ static int displayComment( - ii += 3; - jj += sqlite3Strlen30(zTemp+jj); - v2 = translateP(zSynopsis[ii], pOp); -- if( v2>1 ) sqlite3_snprintf(nTemp-jj, zTemp+jj, "..%d", v1+v2-1); -+ if( strncmp(zSynopsis+ii+1,"+1",2)==0 ){ -+ ii += 2; -+ v2++; -+ } -+ if( v2>1 ){ -+ sqlite3_snprintf(nTemp-jj, zTemp+jj, "..%d", v1+v2-1); -+ } - }else if( strncmp(zSynopsis+ii+1, "..P3", 4)==0 && pOp->p3==0 ){ - ii += 4; - } -@@ -62155,6 +63086,9 @@ SQLITE_PRIVATE void sqlite3VdbePrintOp(F - #else - zCom[0] = 0 - #endif -+ /* NB: The sqlite3OpcodeName() function is implemented by code created -+ ** by the mkopcodeh.awk and mkopcodec.awk scripts which extract the -+ ** information from the vdbe.c source text */ - fprintf(pOut, zFormat1, pc, - sqlite3OpcodeName(pOp->opcode), pOp->p1, pOp->p2, pOp->p3, zP4, pOp->p5, - zCom -@@ -62586,6 +63520,7 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady - assert( p->nOp>0 ); - assert( pParse!=0 ); - assert( p->magic==VDBE_MAGIC_INIT ); -+ assert( pParse==p->pParse ); - db = p->db; - assert( db->mallocFailed==0 ); - nVar = pParse->nVar; -@@ -62609,8 +63544,8 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady - /* Allocate space for memory registers, SQL variables, VDBE cursors and - ** an array to marshal SQL function arguments in. - */ -- zCsr = (u8*)&p->aOp[p->nOp]; /* Memory avaliable for allocation */ -- zEnd = (u8*)&p->aOp[p->nOpAlloc]; /* First byte past end of zCsr[] */ -+ zCsr = (u8*)&p->aOp[p->nOp]; /* Memory avaliable for allocation */ -+ zEnd = (u8*)&p->aOp[pParse->nOpAlloc]; /* First byte past end of zCsr[] */ - - resolveP2Values(p, &nArg); - p->usesStmtJournal = (u8)(pParse->isMultiWrite && pParse->mayAbort); -@@ -63437,6 +64372,7 @@ SQLITE_PRIVATE int sqlite3VdbeTransferEr - if( p->zErrMsg ){ - u8 mallocFailed = db->mallocFailed; - sqlite3BeginBenignMalloc(); -+ if( db->pErr==0 ) db->pErr = sqlite3ValueNew(db); - sqlite3ValueSetStr(db->pErr, -1, p->zErrMsg, SQLITE_UTF8, SQLITE_TRANSIENT); - sqlite3EndBenignMalloc(); - db->mallocFailed = mallocFailed; -@@ -63505,8 +64441,7 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe - ** to sqlite3_step(). For consistency (since sqlite3_step() was - ** called), set the database error in this case as well. - */ -- sqlite3Error(db, p->rc, 0); -- sqlite3ValueSetStr(db->pErr, -1, p->zErrMsg, SQLITE_UTF8, SQLITE_TRANSIENT); -+ sqlite3Error(db, p->rc, p->zErrMsg ? "%s" : 0, p->zErrMsg); - sqlite3DbFree(db, p->zErrMsg); - p->zErrMsg = 0; - } -@@ -63613,7 +64548,6 @@ SQLITE_PRIVATE void sqlite3VdbeClearObje - } - for(i=p->nzVar-1; i>=0; i--) sqlite3DbFree(db, p->azVar[i]); - vdbeFreeOpArray(db, p->aOp, p->nOp); -- sqlite3DbFree(db, p->aLabel); - sqlite3DbFree(db, p->aColName); - sqlite3DbFree(db, p->zSql); - sqlite3DbFree(db, p->pFree); -@@ -63844,21 +64778,15 @@ static u64 floatSwap(u64 in){ - ** buf. It is assumed that the caller has allocated sufficient space. - ** Return the number of bytes written. - ** --** nBuf is the amount of space left in buf[]. nBuf must always be --** large enough to hold the entire field. Except, if the field is --** a blob with a zero-filled tail, then buf[] might be just the right --** size to hold everything except for the zero-filled tail. If buf[] --** is only big enough to hold the non-zero prefix, then only write that --** prefix into buf[]. But if buf[] is large enough to hold both the --** prefix and the tail then write the prefix and set the tail to all --** zeros. -+** nBuf is the amount of space left in buf[]. The caller is responsible -+** for allocating enough space to buf[] to hold the entire field, exclusive -+** of the pMem->u.nZero bytes for a MEM_Zero value. - ** - ** Return the number of bytes actually written into buf[]. The number - ** of bytes in the zero-filled tail is included in the return value only - ** if those bytes were zeroed in buf[]. - */ --SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(u8 *buf, int nBuf, Mem *pMem, int file_format){ -- u32 serial_type = sqlite3VdbeSerialType(pMem, file_format); -+SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type){ - u32 len; - - /* Integer and Real */ -@@ -63873,7 +64801,6 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialPut( - v = pMem->u.i; - } - len = i = sqlite3VdbeSerialTypeLen(serial_type); -- assert( len<=(u32)nBuf ); - while( i-- ){ - buf[i] = (u8)(v&0xFF); - v >>= 8; -@@ -63885,17 +64812,8 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialPut( - if( serial_type>=12 ){ - assert( pMem->n + ((pMem->flags & MEM_Zero)?pMem->u.nZero:0) - == (int)sqlite3VdbeSerialTypeLen(serial_type) ); -- assert( pMem->n<=nBuf ); - len = pMem->n; - memcpy(buf, pMem->z, len); -- if( pMem->flags & MEM_Zero ){ -- len += pMem->u.nZero; -- assert( nBuf>=0 ); -- if( len > (u32)nBuf ){ -- len = (u32)nBuf; -- } -- memset(&buf[pMem->n], 0, len-pMem->n); -- } - return len; - } - -@@ -64896,7 +65814,7 @@ SQLITE_API int sqlite3_step(sqlite3_stmt - v->doingRerun = 1; - assert( v->expired==0 ); - } -- if( rc2!=SQLITE_OK && ALWAYS(v->isPrepareV2) && ALWAYS(db->pErr) ){ -+ if( rc2!=SQLITE_OK ){ - /* This case occurs after failing to recompile an sql statement. - ** The error message from the SQL compiler has already been loaded - ** into the database handle. This block copies the error message -@@ -64906,6 +65824,7 @@ SQLITE_API int sqlite3_step(sqlite3_stmt - ** sqlite3_errmsg() and sqlite3_errcode(). - */ - const char *zErr = (const char *)sqlite3_value_text(db->pErr); -+ assert( zErr!=0 || db->mallocFailed ); - sqlite3DbFree(db, v->zErrMsg); - if( !db->mallocFailed ){ - v->zErrMsg = sqlite3DbStrDup(db, zErr); -@@ -65821,6 +66740,7 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSq - const char *zStart = zRawSql; - while( *(zRawSql++)!='\n' && *zRawSql ); - sqlite3StrAccumAppend(&out, "-- ", 3); -+ assert( (zRawSql - zStart) > 0 ); - sqlite3StrAccumAppend(&out, zStart, (int)(zRawSql-zStart)); - } - }else{ -@@ -65853,9 +66773,9 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSq - if( pVar->flags & MEM_Null ){ - sqlite3StrAccumAppend(&out, "NULL", 4); - }else if( pVar->flags & MEM_Int ){ -- sqlite3XPrintf(&out, "%lld", pVar->u.i); -+ sqlite3XPrintf(&out, 0, "%lld", pVar->u.i); - }else if( pVar->flags & MEM_Real ){ -- sqlite3XPrintf(&out, "%!.15g", pVar->r); -+ sqlite3XPrintf(&out, 0, "%!.15g", pVar->r); - }else if( pVar->flags & MEM_Str ){ - int nOut; /* Number of bytes of the string text to include in output */ - #ifndef SQLITE_OMIT_UTF16 -@@ -65876,15 +66796,17 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSq - while( nOutn && (pVar->z[nOut]&0xc0)==0x80 ){ nOut++; } - } - #endif -- sqlite3XPrintf(&out, "'%.*q'", nOut, pVar->z); -+ sqlite3XPrintf(&out, 0, "'%.*q'", nOut, pVar->z); - #ifdef SQLITE_TRACE_SIZE_LIMIT -- if( nOutn ) sqlite3XPrintf(&out, "/*+%d bytes*/", pVar->n-nOut); -+ if( nOutn ){ -+ sqlite3XPrintf(&out, 0, "/*+%d bytes*/", pVar->n-nOut); -+ } - #endif - #ifndef SQLITE_OMIT_UTF16 - if( enc!=SQLITE_UTF8 ) sqlite3VdbeMemRelease(&utf8); - #endif - }else if( pVar->flags & MEM_Zero ){ -- sqlite3XPrintf(&out, "zeroblob(%d)", pVar->u.nZero); -+ sqlite3XPrintf(&out, 0, "zeroblob(%d)", pVar->u.nZero); - }else{ - int nOut; /* Number of bytes of the blob to include in output */ - assert( pVar->flags & MEM_Blob ); -@@ -65894,11 +66816,13 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSq - if( nOut>SQLITE_TRACE_SIZE_LIMIT ) nOut = SQLITE_TRACE_SIZE_LIMIT; - #endif - for(i=0; iz[i]&0xff); -+ sqlite3XPrintf(&out, 0, "%02x", pVar->z[i]&0xff); - } - sqlite3StrAccumAppend(&out, "'", 1); - #ifdef SQLITE_TRACE_SIZE_LIMIT -- if( nOutn ) sqlite3XPrintf(&out, "/*+%d bytes*/", pVar->n-nOut); -+ if( nOutn ){ -+ sqlite3XPrintf(&out, 0, "/*+%d bytes*/", pVar->n-nOut); -+ } - #endif - } - } -@@ -65957,7 +66881,7 @@ SQLITE_PRIVATE void sqlite3ExplainPrintf - sqlite3AppendSpace(&p->str, p->aIndent[n-1]); - } - va_start(ap, zFormat); -- sqlite3VXPrintf(&p->str, 1, zFormat, ap); -+ sqlite3VXPrintf(&p->str, SQLITE_PRINTF_INTERNAL, zFormat, ap); - va_end(ap); - } - } -@@ -66664,429 +67588,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec( - u64 start; /* CPU clock count at start of opcode */ - int origPc; /* Program counter at start of opcode */ - #endif -- /******************************************************************** -- ** Automatically generated code -- ** -- ** The following union is automatically generated by the -- ** vdbe-compress.tcl script. The purpose of this union is to -- ** reduce the amount of stack space required by this function. -- ** See comments in the vdbe-compress.tcl script for details. -- */ -- union vdbeExecUnion { -- struct OP_Yield_stack_vars { -- int pcDest; -- } aa; -- struct OP_Halt_stack_vars { -- const char *zType; -- const char *zLogFmt; -- } ab; -- struct OP_Null_stack_vars { -- int cnt; -- u16 nullFlag; -- } ac; -- struct OP_Variable_stack_vars { -- Mem *pVar; /* Value being transferred */ -- } ad; -- struct OP_Move_stack_vars { -- char *zMalloc; /* Holding variable for allocated memory */ -- int n; /* Number of registers left to copy */ -- int p1; /* Register to copy from */ -- int p2; /* Register to copy to */ -- } ae; -- struct OP_Copy_stack_vars { -- int n; -- } af; -- struct OP_ResultRow_stack_vars { -- Mem *pMem; -- int i; -- } ag; -- struct OP_Concat_stack_vars { -- i64 nByte; -- } ah; -- struct OP_Remainder_stack_vars { -- char bIntint; /* Started out as two integer operands */ -- int flags; /* Combined MEM_* flags from both inputs */ -- i64 iA; /* Integer value of left operand */ -- i64 iB; /* Integer value of right operand */ -- double rA; /* Real value of left operand */ -- double rB; /* Real value of right operand */ -- } ai; -- struct OP_Function_stack_vars { -- int i; -- Mem *pArg; -- sqlite3_context ctx; -- sqlite3_value **apVal; -- int n; -- } aj; -- struct OP_ShiftRight_stack_vars { -- i64 iA; -- u64 uA; -- i64 iB; -- u8 op; -- } ak; -- struct OP_Ge_stack_vars { -- int res; /* Result of the comparison of pIn1 against pIn3 */ -- char affinity; /* Affinity to use for comparison */ -- u16 flags1; /* Copy of initial value of pIn1->flags */ -- u16 flags3; /* Copy of initial value of pIn3->flags */ -- } al; -- struct OP_Compare_stack_vars { -- int n; -- int i; -- int p1; -- int p2; -- const KeyInfo *pKeyInfo; -- int idx; -- CollSeq *pColl; /* Collating sequence to use on this term */ -- int bRev; /* True for DESCENDING sort order */ -- } am; -- struct OP_Or_stack_vars { -- int v1; /* Left operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */ -- int v2; /* Right operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */ -- } an; -- struct OP_IfNot_stack_vars { -- int c; -- } ao; -- struct OP_Column_stack_vars { -- i64 payloadSize64; /* Number of bytes in the record */ -- int p2; /* column number to retrieve */ -- VdbeCursor *pC; /* The VDBE cursor */ -- BtCursor *pCrsr; /* The BTree cursor */ -- u32 *aType; /* aType[i] holds the numeric type of the i-th column */ -- u32 *aOffset; /* aOffset[i] is offset to start of data for i-th column */ -- int len; /* The length of the serialized data for the column */ -- int i; /* Loop counter */ -- Mem *pDest; /* Where to write the extracted value */ -- Mem sMem; /* For storing the record being decoded */ -- const u8 *zData; /* Part of the record being decoded */ -- const u8 *zHdr; /* Next unparsed byte of the header */ -- const u8 *zEndHdr; /* Pointer to first byte after the header */ -- u32 offset; /* Offset into the data */ -- u32 szField; /* Number of bytes in the content of a field */ -- u32 avail; /* Number of bytes of available data */ -- u32 t; /* A type code from the record header */ -- Mem *pReg; /* PseudoTable input register */ -- } ap; -- struct OP_Affinity_stack_vars { -- const char *zAffinity; /* The affinity to be applied */ -- char cAff; /* A single character of affinity */ -- } aq; -- struct OP_MakeRecord_stack_vars { -- u8 *zNewRecord; /* A buffer to hold the data for the new record */ -- Mem *pRec; /* The new record */ -- u64 nData; /* Number of bytes of data space */ -- int nHdr; /* Number of bytes of header space */ -- i64 nByte; /* Data space required for this record */ -- int nZero; /* Number of zero bytes at the end of the record */ -- int nVarint; /* Number of bytes in a varint */ -- u32 serial_type; /* Type field */ -- Mem *pData0; /* First field to be combined into the record */ -- Mem *pLast; /* Last field of the record */ -- int nField; /* Number of fields in the record */ -- char *zAffinity; /* The affinity string for the record */ -- int file_format; /* File format to use for encoding */ -- int i; /* Space used in zNewRecord[] */ -- int len; /* Length of a field */ -- } ar; -- struct OP_Count_stack_vars { -- i64 nEntry; -- BtCursor *pCrsr; -- } as; -- struct OP_Savepoint_stack_vars { -- int p1; /* Value of P1 operand */ -- char *zName; /* Name of savepoint */ -- int nName; -- Savepoint *pNew; -- Savepoint *pSavepoint; -- Savepoint *pTmp; -- int iSavepoint; -- int ii; -- } at; -- struct OP_AutoCommit_stack_vars { -- int desiredAutoCommit; -- int iRollback; -- int turnOnAC; -- } au; -- struct OP_Transaction_stack_vars { -- Btree *pBt; -- } av; -- struct OP_ReadCookie_stack_vars { -- int iMeta; -- int iDb; -- int iCookie; -- } aw; -- struct OP_SetCookie_stack_vars { -- Db *pDb; -- } ax; -- struct OP_VerifyCookie_stack_vars { -- int iMeta; -- int iGen; -- Btree *pBt; -- } ay; -- struct OP_OpenWrite_stack_vars { -- int nField; -- KeyInfo *pKeyInfo; -- int p2; -- int iDb; -- int wrFlag; -- Btree *pX; -- VdbeCursor *pCur; -- Db *pDb; -- } az; -- struct OP_OpenEphemeral_stack_vars { -- VdbeCursor *pCx; -- KeyInfo *pKeyInfo; -- } ba; -- struct OP_SorterOpen_stack_vars { -- VdbeCursor *pCx; -- } bb; -- struct OP_OpenPseudo_stack_vars { -- VdbeCursor *pCx; -- } bc; -- struct OP_SeekGt_stack_vars { -- int res; -- int oc; -- VdbeCursor *pC; -- UnpackedRecord r; -- int nField; -- i64 iKey; /* The rowid we are to seek to */ -- } bd; -- struct OP_Seek_stack_vars { -- VdbeCursor *pC; -- } be; -- struct OP_Found_stack_vars { -- int alreadyExists; -- int ii; -- VdbeCursor *pC; -- int res; -- char *pFree; -- UnpackedRecord *pIdxKey; -- UnpackedRecord r; -- char aTempRec[ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*4 + 7]; -- } bf; -- struct OP_NotExists_stack_vars { -- VdbeCursor *pC; -- BtCursor *pCrsr; -- int res; -- u64 iKey; -- } bg; -- struct OP_NewRowid_stack_vars { -- i64 v; /* The new rowid */ -- VdbeCursor *pC; /* Cursor of table to get the new rowid */ -- int res; /* Result of an sqlite3BtreeLast() */ -- int cnt; /* Counter to limit the number of searches */ -- Mem *pMem; /* Register holding largest rowid for AUTOINCREMENT */ -- VdbeFrame *pFrame; /* Root frame of VDBE */ -- } bh; -- struct OP_InsertInt_stack_vars { -- Mem *pData; /* MEM cell holding data for the record to be inserted */ -- Mem *pKey; /* MEM cell holding key for the record */ -- i64 iKey; /* The integer ROWID or key for the record to be inserted */ -- VdbeCursor *pC; /* Cursor to table into which insert is written */ -- int nZero; /* Number of zero-bytes to append */ -- int seekResult; /* Result of prior seek or 0 if no USESEEKRESULT flag */ -- const char *zDb; /* database name - used by the update hook */ -- const char *zTbl; /* Table name - used by the opdate hook */ -- int op; /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */ -- } bi; -- struct OP_Delete_stack_vars { -- i64 iKey; -- VdbeCursor *pC; -- } bj; -- struct OP_SorterCompare_stack_vars { -- VdbeCursor *pC; -- int res; -- int nIgnore; -- } bk; -- struct OP_SorterData_stack_vars { -- VdbeCursor *pC; -- } bl; -- struct OP_RowData_stack_vars { -- VdbeCursor *pC; -- BtCursor *pCrsr; -- u32 n; -- i64 n64; -- } bm; -- struct OP_Rowid_stack_vars { -- VdbeCursor *pC; -- i64 v; -- sqlite3_vtab *pVtab; -- const sqlite3_module *pModule; -- } bn; -- struct OP_NullRow_stack_vars { -- VdbeCursor *pC; -- } bo; -- struct OP_Last_stack_vars { -- VdbeCursor *pC; -- BtCursor *pCrsr; -- int res; -- } bp; -- struct OP_Rewind_stack_vars { -- VdbeCursor *pC; -- BtCursor *pCrsr; -- int res; -- } bq; -- struct OP_SorterNext_stack_vars { -- VdbeCursor *pC; -- int res; -- } br; -- struct OP_IdxInsert_stack_vars { -- VdbeCursor *pC; -- BtCursor *pCrsr; -- int nKey; -- const char *zKey; -- } bs; -- struct OP_IdxDelete_stack_vars { -- VdbeCursor *pC; -- BtCursor *pCrsr; -- int res; -- UnpackedRecord r; -- } bt; -- struct OP_IdxRowid_stack_vars { -- BtCursor *pCrsr; -- VdbeCursor *pC; -- i64 rowid; -- } bu; -- struct OP_IdxGE_stack_vars { -- VdbeCursor *pC; -- int res; -- UnpackedRecord r; -- } bv; -- struct OP_Destroy_stack_vars { -- int iMoved; -- int iCnt; -- Vdbe *pVdbe; -- int iDb; -- } bw; -- struct OP_Clear_stack_vars { -- int nChange; -- } bx; -- struct OP_CreateTable_stack_vars { -- int pgno; -- int flags; -- Db *pDb; -- } by; -- struct OP_ParseSchema_stack_vars { -- int iDb; -- const char *zMaster; -- char *zSql; -- InitData initData; -- } bz; -- struct OP_IntegrityCk_stack_vars { -- int nRoot; /* Number of tables to check. (Number of root pages.) */ -- int *aRoot; /* Array of rootpage numbers for tables to be checked */ -- int j; /* Loop counter */ -- int nErr; /* Number of errors reported */ -- char *z; /* Text of the error report */ -- Mem *pnErr; /* Register keeping track of errors remaining */ -- } ca; -- struct OP_RowSetRead_stack_vars { -- i64 val; -- } cb; -- struct OP_RowSetTest_stack_vars { -- int iSet; -- int exists; -- } cc; -- struct OP_Program_stack_vars { -- int nMem; /* Number of memory registers for sub-program */ -- int nByte; /* Bytes of runtime space required for sub-program */ -- Mem *pRt; /* Register to allocate runtime space */ -- Mem *pMem; /* Used to iterate through memory cells */ -- Mem *pEnd; /* Last memory cell in new array */ -- VdbeFrame *pFrame; /* New vdbe frame to execute in */ -- SubProgram *pProgram; /* Sub-program to execute */ -- void *t; /* Token identifying trigger */ -- } cd; -- struct OP_Param_stack_vars { -- VdbeFrame *pFrame; -- Mem *pIn; -- } ce; -- struct OP_MemMax_stack_vars { -- Mem *pIn1; -- VdbeFrame *pFrame; -- } cf; -- struct OP_AggStep_stack_vars { -- int n; -- int i; -- Mem *pMem; -- Mem *pRec; -- sqlite3_context ctx; -- sqlite3_value **apVal; -- } cg; -- struct OP_AggFinal_stack_vars { -- Mem *pMem; -- } ch; -- struct OP_Checkpoint_stack_vars { -- int i; /* Loop counter */ -- int aRes[3]; /* Results */ -- Mem *pMem; /* Write results here */ -- } ci; -- struct OP_JournalMode_stack_vars { -- Btree *pBt; /* Btree to change journal mode of */ -- Pager *pPager; /* Pager associated with pBt */ -- int eNew; /* New journal mode */ -- int eOld; /* The old journal mode */ --#ifndef SQLITE_OMIT_WAL -- const char *zFilename; /* Name of database file for pPager */ --#endif -- } cj; -- struct OP_IncrVacuum_stack_vars { -- Btree *pBt; -- } ck; -- struct OP_VBegin_stack_vars { -- VTable *pVTab; -- } cl; -- struct OP_VOpen_stack_vars { -- VdbeCursor *pCur; -- sqlite3_vtab_cursor *pVtabCursor; -- sqlite3_vtab *pVtab; -- sqlite3_module *pModule; -- } cm; -- struct OP_VFilter_stack_vars { -- int nArg; -- int iQuery; -- const sqlite3_module *pModule; -- Mem *pQuery; -- Mem *pArgc; -- sqlite3_vtab_cursor *pVtabCursor; -- sqlite3_vtab *pVtab; -- VdbeCursor *pCur; -- int res; -- int i; -- Mem **apArg; -- } cn; -- struct OP_VColumn_stack_vars { -- sqlite3_vtab *pVtab; -- const sqlite3_module *pModule; -- Mem *pDest; -- sqlite3_context sContext; -- } co; -- struct OP_VNext_stack_vars { -- sqlite3_vtab *pVtab; -- const sqlite3_module *pModule; -- int res; -- VdbeCursor *pCur; -- } cp; -- struct OP_VRename_stack_vars { -- sqlite3_vtab *pVtab; -- Mem *pName; -- } cq; -- struct OP_VUpdate_stack_vars { -- sqlite3_vtab *pVtab; -- sqlite3_module *pModule; -- int nArg; -- int i; -- sqlite_int64 rowid; -- Mem **apArg; -- Mem *pX; -- } cr; -- struct OP_Trace_stack_vars { -- char *zTrace; -- char *z; -- } cs; -- } u; -- /* End automatically generated code -- ********************************************************************/ -+ /*** INSERT STACK UNION HERE ***/ - - assert( p->magic==VDBE_MAGIC_RUN ); /* sqlite3_step() verifies this */ - sqlite3VdbeEnter(p); -@@ -67332,16 +67834,14 @@ case OP_Return: { /* in1 */ - ** Swap the program counter with the value in register P1. - */ - case OP_Yield: { /* in1 */ --#if 0 /* local variables moved into u.aa */ - int pcDest; --#endif /* local variables moved into u.aa */ - pIn1 = &aMem[pOp->p1]; - assert( (pIn1->flags & MEM_Dyn)==0 ); - pIn1->flags = MEM_Int; -- u.aa.pcDest = (int)pIn1->u.i; -+ pcDest = (int)pIn1->u.i; - pIn1->u.i = pc; - REGISTER_TRACE(pOp->p1, pIn1); -- pc = u.aa.pcDest; -+ pc = pcDest; - break; - } - -@@ -67390,10 +67890,8 @@ case OP_HaltIfNull: { /* in3 */ - ** is the same as executing Halt. - */ - case OP_Halt: { --#if 0 /* local variables moved into u.ab */ - const char *zType; - const char *zLogFmt; --#endif /* local variables moved into u.ab */ - - if( pOp->p1==SQLITE_OK && p->pFrame ){ - /* Halt the sub-program. Return control to the parent frame. */ -@@ -67404,7 +67902,7 @@ case OP_Halt: { - pc = sqlite3VdbeFrameRestore(pFrame); - lastRowid = db->lastRowid; - if( pOp->p2==OE_Ignore ){ -- /* Instruction pc is the OP_Program that invoked the sub-program -+ /* Instruction pc is the OP_Program that invoked the sub-program - ** currently being halted. If the p2 instruction of this OP_Halt - ** instruction is set to OE_Ignore, then the sub-program is throwing - ** an IGNORE exception. In this case jump to the address specified -@@ -67427,21 +67925,21 @@ case OP_Halt: { - testcase( pOp->p5==2 ); - testcase( pOp->p5==3 ); - testcase( pOp->p5==4 ); -- u.ab.zType = azType[pOp->p5-1]; -+ zType = azType[pOp->p5-1]; - }else{ -- u.ab.zType = 0; -+ zType = 0; - } -- assert( u.ab.zType!=0 || pOp->p4.z!=0 ); -- u.ab.zLogFmt = "abort at %d in [%s]: %s"; -- if( u.ab.zType && pOp->p4.z ){ -- sqlite3SetString(&p->zErrMsg, db, "%s constraint failed: %s", -- u.ab.zType, pOp->p4.z); -+ assert( zType!=0 || pOp->p4.z!=0 ); -+ zLogFmt = "abort at %d in [%s]: %s"; -+ if( zType && pOp->p4.z ){ -+ sqlite3SetString(&p->zErrMsg, db, "%s constraint failed: %s", -+ zType, pOp->p4.z); - }else if( pOp->p4.z ){ - sqlite3SetString(&p->zErrMsg, db, "%s", pOp->p4.z); - }else{ -- sqlite3SetString(&p->zErrMsg, db, "%s constraint failed", u.ab.zType); -+ sqlite3SetString(&p->zErrMsg, db, "%s constraint failed", zType); - } -- sqlite3_log(pOp->p1, u.ab.zLogFmt, pc, p->zSql, p->zErrMsg); -+ sqlite3_log(pOp->p1, zLogFmt, pc, p->zSql, p->zErrMsg); - } - rc = sqlite3VdbeHalt(p); - assert( rc==SQLITE_BUSY || rc==SQLITE_OK || rc==SQLITE_ERROR ); -@@ -67555,19 +68053,17 @@ case OP_String: { /* out2-prere - ** OP_Ne or OP_Eq. - */ - case OP_Null: { /* out2-prerelease */ --#if 0 /* local variables moved into u.ac */ - int cnt; - u16 nullFlag; --#endif /* local variables moved into u.ac */ -- u.ac.cnt = pOp->p3-pOp->p2; -+ cnt = pOp->p3-pOp->p2; - assert( pOp->p3<=(p->nMem-p->nCursor) ); -- pOut->flags = u.ac.nullFlag = pOp->p1 ? (MEM_Null|MEM_Cleared) : MEM_Null; -- while( u.ac.cnt>0 ){ -+ pOut->flags = nullFlag = pOp->p1 ? (MEM_Null|MEM_Cleared) : MEM_Null; -+ while( cnt>0 ){ - pOut++; - memAboutToChange(p, pOut); - VdbeMemRelease(pOut); -- pOut->flags = u.ac.nullFlag; -- u.ac.cnt--; -+ pOut->flags = nullFlag; -+ cnt--; - } - break; - } -@@ -67596,17 +68092,15 @@ case OP_Blob: { /* out2-p - ** The P4 value is used by sqlite3_bind_parameter_name(). - */ - case OP_Variable: { /* out2-prerelease */ --#if 0 /* local variables moved into u.ad */ - Mem *pVar; /* Value being transferred */ --#endif /* local variables moved into u.ad */ - - assert( pOp->p1>0 && pOp->p1<=p->nVar ); - assert( pOp->p4.z==0 || pOp->p4.z==p->azVar[pOp->p1-1] ); -- u.ad.pVar = &p->aVar[pOp->p1 - 1]; -- if( sqlite3VdbeMemTooBig(u.ad.pVar) ){ -+ pVar = &p->aVar[pOp->p1 - 1]; -+ if( sqlite3VdbeMemTooBig(pVar) ){ - goto too_big; - } -- sqlite3VdbeMemShallowCopy(pOut, u.ad.pVar, MEM_Static); -+ sqlite3VdbeMemShallowCopy(pOut, pVar, MEM_Static); - UPDATE_MAX_BLOBSIZE(pOut); - break; - } -@@ -67620,44 +68114,42 @@ case OP_Variable: { /* out2-p - ** P1..P1+P3 and P2..P2+P3 to overlap. - */ - case OP_Move: { --#if 0 /* local variables moved into u.ae */ - char *zMalloc; /* Holding variable for allocated memory */ - int n; /* Number of registers left to copy */ - int p1; /* Register to copy from */ - int p2; /* Register to copy to */ --#endif /* local variables moved into u.ae */ - -- u.ae.n = pOp->p3; -- u.ae.p1 = pOp->p1; -- u.ae.p2 = pOp->p2; -- assert( u.ae.n>=0 && u.ae.p1>0 && u.ae.p2>0 ); -- assert( u.ae.p1+u.ae.n<=u.ae.p2 || u.ae.p2+u.ae.n<=u.ae.p1 ); -+ n = pOp->p3; -+ p1 = pOp->p1; -+ p2 = pOp->p2; -+ assert( n>=0 && p1>0 && p2>0 ); -+ assert( p1+n<=p2 || p2+n<=p1 ); - -- pIn1 = &aMem[u.ae.p1]; -- pOut = &aMem[u.ae.p2]; -+ pIn1 = &aMem[p1]; -+ pOut = &aMem[p2]; - do{ - assert( pOut<=&aMem[(p->nMem-p->nCursor)] ); - assert( pIn1<=&aMem[(p->nMem-p->nCursor)] ); - assert( memIsValid(pIn1) ); - memAboutToChange(p, pOut); -- u.ae.zMalloc = pOut->zMalloc; -+ zMalloc = pOut->zMalloc; - pOut->zMalloc = 0; - sqlite3VdbeMemMove(pOut, pIn1); - #ifdef SQLITE_DEBUG -- if( pOut->pScopyFrom>=&aMem[u.ae.p1] && pOut->pScopyFrom<&aMem[u.ae.p1+pOp->p3] ){ -- pOut->pScopyFrom += u.ae.p1 - pOp->p2; -+ if( pOut->pScopyFrom>=&aMem[p1] && pOut->pScopyFrom<&aMem[p1+pOp->p3] ){ -+ pOut->pScopyFrom += p1 - pOp->p2; - } - #endif -- pIn1->zMalloc = u.ae.zMalloc; -- REGISTER_TRACE(u.ae.p2++, pOut); -+ pIn1->zMalloc = zMalloc; -+ REGISTER_TRACE(p2++, pOut); - pIn1++; - pOut++; -- }while( u.ae.n-- ); -+ }while( n-- ); - break; - } - - /* Opcode: Copy P1 P2 P3 * * --** Synopsis: r[P2@P3]=r[P1@P3] -+** Synopsis: r[P2@P3+1]=r[P1@P3+1] - ** - ** Make a copy of registers P1..P1+P3 into registers P2..P2+P3. - ** -@@ -67665,11 +68157,9 @@ case OP_Move: { - ** is made of any string or blob constant. See also OP_SCopy. - */ - case OP_Copy: { --#if 0 /* local variables moved into u.af */ - int n; --#endif /* local variables moved into u.af */ - -- u.af.n = pOp->p3; -+ n = pOp->p3; - pIn1 = &aMem[pOp->p1]; - pOut = &aMem[pOp->p2]; - assert( pOut!=pIn1 ); -@@ -67679,8 +68169,8 @@ case OP_Copy: { - #ifdef SQLITE_DEBUG - pOut->pScopyFrom = 0; - #endif -- REGISTER_TRACE(pOp->p2+pOp->p3-u.af.n, pOut); -- if( (u.af.n--)==0 ) break; -+ REGISTER_TRACE(pOp->p2+pOp->p3-n, pOut); -+ if( (n--)==0 ) break; - pOut++; - pIn1++; - } -@@ -67721,10 +68211,8 @@ case OP_SCopy: { /* out2 */ - ** row. - */ - case OP_ResultRow: { --#if 0 /* local variables moved into u.ag */ - Mem *pMem; - int i; --#endif /* local variables moved into u.ag */ - assert( p->nResColumn==pOp->p2 ); - assert( pOp->p1>0 ); - assert( pOp->p1+pOp->p2<=(p->nMem-p->nCursor)+1 ); -@@ -67750,8 +68238,8 @@ case OP_ResultRow: { - break; - } - -- /* If the SQLITE_CountRows flag is set in sqlite3.flags mask, then -- ** DML statements invoke this opcode to return the number of rows -+ /* If the SQLITE_CountRows flag is set in sqlite3.flags mask, then -+ ** DML statements invoke this opcode to return the number of rows - ** modified to the user. This is the only way that a VM that - ** opens a statement transaction may invoke this opcode. - ** -@@ -67778,15 +68266,15 @@ case OP_ResultRow: { - ** and have an assigned type. The results are de-ephemeralized as - ** a side effect. - */ -- u.ag.pMem = p->pResultSet = &aMem[pOp->p1]; -- for(u.ag.i=0; u.ag.ip2; u.ag.i++){ -- assert( memIsValid(&u.ag.pMem[u.ag.i]) ); -- Deephemeralize(&u.ag.pMem[u.ag.i]); -- assert( (u.ag.pMem[u.ag.i].flags & MEM_Ephem)==0 -- || (u.ag.pMem[u.ag.i].flags & (MEM_Str|MEM_Blob))==0 ); -- sqlite3VdbeMemNulTerminate(&u.ag.pMem[u.ag.i]); -- sqlite3VdbeMemStoreType(&u.ag.pMem[u.ag.i]); -- REGISTER_TRACE(pOp->p1+u.ag.i, &u.ag.pMem[u.ag.i]); -+ pMem = p->pResultSet = &aMem[pOp->p1]; -+ for(i=0; ip2; i++){ -+ assert( memIsValid(&pMem[i]) ); -+ Deephemeralize(&pMem[i]); -+ assert( (pMem[i].flags & MEM_Ephem)==0 -+ || (pMem[i].flags & (MEM_Str|MEM_Blob))==0 ); -+ sqlite3VdbeMemNulTerminate(&pMem[i]); -+ sqlite3VdbeMemStoreType(&pMem[i]); -+ REGISTER_TRACE(pOp->p1+i, &pMem[i]); - } - if( db->mallocFailed ) goto no_mem; - -@@ -67811,9 +68299,7 @@ case OP_ResultRow: { - ** to avoid a memcpy(). - */ - case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ --#if 0 /* local variables moved into u.ah */ - i64 nByte; --#endif /* local variables moved into u.ah */ - - pIn1 = &aMem[pOp->p1]; - pIn2 = &aMem[pOp->p2]; -@@ -67826,22 +68312,22 @@ case OP_Concat: { /* same as T - if( ExpandBlob(pIn1) || ExpandBlob(pIn2) ) goto no_mem; - Stringify(pIn1, encoding); - Stringify(pIn2, encoding); -- u.ah.nByte = pIn1->n + pIn2->n; -- if( u.ah.nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ -+ nByte = pIn1->n + pIn2->n; -+ if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ - goto too_big; - } - MemSetTypeFlag(pOut, MEM_Str); -- if( sqlite3VdbeMemGrow(pOut, (int)u.ah.nByte+2, pOut==pIn2) ){ -+ if( sqlite3VdbeMemGrow(pOut, (int)nByte+2, pOut==pIn2) ){ - goto no_mem; - } - if( pOut!=pIn2 ){ - memcpy(pOut->z, pIn2->z, pIn2->n); - } - memcpy(&pOut->z[pIn2->n], pIn1->z, pIn1->n); -- pOut->z[u.ah.nByte]=0; -- pOut->z[u.ah.nByte+1] = 0; -+ pOut->z[nByte]=0; -+ pOut->z[nByte+1] = 0; - pOut->flags |= MEM_Term; -- pOut->n = (int)u.ah.nByte; -+ pOut->n = (int)nByte; - pOut->enc = encoding; - UPDATE_MAX_BLOBSIZE(pOut); - break; -@@ -67890,79 +68376,77 @@ case OP_Subtract: /* same a - case OP_Multiply: /* same as TK_STAR, in1, in2, out3 */ - case OP_Divide: /* same as TK_SLASH, in1, in2, out3 */ - case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ --#if 0 /* local variables moved into u.ai */ - char bIntint; /* Started out as two integer operands */ - int flags; /* Combined MEM_* flags from both inputs */ - i64 iA; /* Integer value of left operand */ - i64 iB; /* Integer value of right operand */ - double rA; /* Real value of left operand */ - double rB; /* Real value of right operand */ --#endif /* local variables moved into u.ai */ - - pIn1 = &aMem[pOp->p1]; - applyNumericAffinity(pIn1); - pIn2 = &aMem[pOp->p2]; - applyNumericAffinity(pIn2); - pOut = &aMem[pOp->p3]; -- u.ai.flags = pIn1->flags | pIn2->flags; -- if( (u.ai.flags & MEM_Null)!=0 ) goto arithmetic_result_is_null; -+ flags = pIn1->flags | pIn2->flags; -+ if( (flags & MEM_Null)!=0 ) goto arithmetic_result_is_null; - if( (pIn1->flags & pIn2->flags & MEM_Int)==MEM_Int ){ -- u.ai.iA = pIn1->u.i; -- u.ai.iB = pIn2->u.i; -- u.ai.bIntint = 1; -+ iA = pIn1->u.i; -+ iB = pIn2->u.i; -+ bIntint = 1; - switch( pOp->opcode ){ -- case OP_Add: if( sqlite3AddInt64(&u.ai.iB,u.ai.iA) ) goto fp_math; break; -- case OP_Subtract: if( sqlite3SubInt64(&u.ai.iB,u.ai.iA) ) goto fp_math; break; -- case OP_Multiply: if( sqlite3MulInt64(&u.ai.iB,u.ai.iA) ) goto fp_math; break; -+ case OP_Add: if( sqlite3AddInt64(&iB,iA) ) goto fp_math; break; -+ case OP_Subtract: if( sqlite3SubInt64(&iB,iA) ) goto fp_math; break; -+ case OP_Multiply: if( sqlite3MulInt64(&iB,iA) ) goto fp_math; break; - case OP_Divide: { -- if( u.ai.iA==0 ) goto arithmetic_result_is_null; -- if( u.ai.iA==-1 && u.ai.iB==SMALLEST_INT64 ) goto fp_math; -- u.ai.iB /= u.ai.iA; -+ if( iA==0 ) goto arithmetic_result_is_null; -+ if( iA==-1 && iB==SMALLEST_INT64 ) goto fp_math; -+ iB /= iA; - break; - } - default: { -- if( u.ai.iA==0 ) goto arithmetic_result_is_null; -- if( u.ai.iA==-1 ) u.ai.iA = 1; -- u.ai.iB %= u.ai.iA; -+ if( iA==0 ) goto arithmetic_result_is_null; -+ if( iA==-1 ) iA = 1; -+ iB %= iA; - break; - } - } -- pOut->u.i = u.ai.iB; -+ pOut->u.i = iB; - MemSetTypeFlag(pOut, MEM_Int); - }else{ -- u.ai.bIntint = 0; -+ bIntint = 0; - fp_math: -- u.ai.rA = sqlite3VdbeRealValue(pIn1); -- u.ai.rB = sqlite3VdbeRealValue(pIn2); -+ rA = sqlite3VdbeRealValue(pIn1); -+ rB = sqlite3VdbeRealValue(pIn2); - switch( pOp->opcode ){ -- case OP_Add: u.ai.rB += u.ai.rA; break; -- case OP_Subtract: u.ai.rB -= u.ai.rA; break; -- case OP_Multiply: u.ai.rB *= u.ai.rA; break; -+ case OP_Add: rB += rA; break; -+ case OP_Subtract: rB -= rA; break; -+ case OP_Multiply: rB *= rA; break; - case OP_Divide: { - /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ -- if( u.ai.rA==(double)0 ) goto arithmetic_result_is_null; -- u.ai.rB /= u.ai.rA; -+ if( rA==(double)0 ) goto arithmetic_result_is_null; -+ rB /= rA; - break; - } - default: { -- u.ai.iA = (i64)u.ai.rA; -- u.ai.iB = (i64)u.ai.rB; -- if( u.ai.iA==0 ) goto arithmetic_result_is_null; -- if( u.ai.iA==-1 ) u.ai.iA = 1; -- u.ai.rB = (double)(u.ai.iB % u.ai.iA); -+ iA = (i64)rA; -+ iB = (i64)rB; -+ if( iA==0 ) goto arithmetic_result_is_null; -+ if( iA==-1 ) iA = 1; -+ rB = (double)(iB % iA); - break; - } - } - #ifdef SQLITE_OMIT_FLOATING_POINT -- pOut->u.i = u.ai.rB; -+ pOut->u.i = rB; - MemSetTypeFlag(pOut, MEM_Int); - #else -- if( sqlite3IsNaN(u.ai.rB) ){ -+ if( sqlite3IsNaN(rB) ){ - goto arithmetic_result_is_null; - } -- pOut->r = u.ai.rB; -+ pOut->r = rB; - MemSetTypeFlag(pOut, MEM_Real); -- if( (u.ai.flags & MEM_Real)==0 && !u.ai.bIntint ){ -+ if( (flags & MEM_Real)==0 && !bIntint ){ - sqlite3VdbeIntegerAffinity(pOut); - } - #endif -@@ -68015,56 +68499,54 @@ case OP_CollSeq: { - ** See also: AggStep and AggFinal - */ - case OP_Function: { --#if 0 /* local variables moved into u.aj */ - int i; - Mem *pArg; - sqlite3_context ctx; - sqlite3_value **apVal; - int n; --#endif /* local variables moved into u.aj */ - -- u.aj.n = pOp->p5; -- u.aj.apVal = p->apArg; -- assert( u.aj.apVal || u.aj.n==0 ); -+ n = pOp->p5; -+ apVal = p->apArg; -+ assert( apVal || n==0 ); - assert( pOp->p3>0 && pOp->p3<=(p->nMem-p->nCursor) ); - pOut = &aMem[pOp->p3]; - memAboutToChange(p, pOut); - -- assert( u.aj.n==0 || (pOp->p2>0 && pOp->p2+u.aj.n<=(p->nMem-p->nCursor)+1) ); -- assert( pOp->p3p2 || pOp->p3>=pOp->p2+u.aj.n ); -- u.aj.pArg = &aMem[pOp->p2]; -- for(u.aj.i=0; u.aj.ip2+u.aj.i, u.aj.pArg); -+ assert( n==0 || (pOp->p2>0 && pOp->p2+n<=(p->nMem-p->nCursor)+1) ); -+ assert( pOp->p3p2 || pOp->p3>=pOp->p2+n ); -+ pArg = &aMem[pOp->p2]; -+ for(i=0; ip2+i, pArg); - } - - assert( pOp->p4type==P4_FUNCDEF ); -- u.aj.ctx.pFunc = pOp->p4.pFunc; -- u.aj.ctx.iOp = pc; -- u.aj.ctx.pVdbe = p; -+ ctx.pFunc = pOp->p4.pFunc; -+ ctx.iOp = pc; -+ ctx.pVdbe = p; - - /* The output cell may already have a buffer allocated. Move -- ** the pointer to u.aj.ctx.s so in case the user-function can use -+ ** the pointer to ctx.s so in case the user-function can use - ** the already allocated buffer instead of allocating a new one. - */ -- memcpy(&u.aj.ctx.s, pOut, sizeof(Mem)); -+ memcpy(&ctx.s, pOut, sizeof(Mem)); - pOut->flags = MEM_Null; - pOut->xDel = 0; - pOut->zMalloc = 0; -- MemSetTypeFlag(&u.aj.ctx.s, MEM_Null); -+ MemSetTypeFlag(&ctx.s, MEM_Null); - -- u.aj.ctx.fErrorOrAux = 0; -- if( u.aj.ctx.pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ -+ ctx.fErrorOrAux = 0; -+ if( ctx.pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ - assert( pOp>aOp ); - assert( pOp[-1].p4type==P4_COLLSEQ ); - assert( pOp[-1].opcode==OP_CollSeq ); -- u.aj.ctx.pColl = pOp[-1].p4.pColl; -+ ctx.pColl = pOp[-1].p4.pColl; - } - db->lastRowid = lastRowid; -- (*u.aj.ctx.pFunc->xFunc)(&u.aj.ctx, u.aj.n, u.aj.apVal); /* IMP: R-24505-23230 */ -+ (*ctx.pFunc->xFunc)(&ctx, n, apVal); /* IMP: R-24505-23230 */ - lastRowid = db->lastRowid; - - if( db->mallocFailed ){ -@@ -68073,23 +68555,23 @@ case OP_Function: { - ** to return a value. The following call releases any resources - ** associated with such a value. - */ -- sqlite3VdbeMemRelease(&u.aj.ctx.s); -+ sqlite3VdbeMemRelease(&ctx.s); - goto no_mem; - } - - /* If the function returned an error, throw an exception */ -- if( u.aj.ctx.fErrorOrAux ){ -- if( u.aj.ctx.isError ){ -- sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&u.aj.ctx.s)); -- rc = u.aj.ctx.isError; -+ if( ctx.fErrorOrAux ){ -+ if( ctx.isError ){ -+ sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&ctx.s)); -+ rc = ctx.isError; - } - sqlite3VdbeDeleteAuxData(p, pc, pOp->p1); - } - - /* Copy the result of the function into register P3 */ -- sqlite3VdbeChangeEncoding(&u.aj.ctx.s, encoding); -+ sqlite3VdbeChangeEncoding(&ctx.s, encoding); - assert( pOut->flags==MEM_Null ); -- memcpy(pOut, &u.aj.ctx.s, sizeof(Mem)); -+ memcpy(pOut, &ctx.s, sizeof(Mem)); - if( sqlite3VdbeMemTooBig(pOut) ){ - goto too_big; - } -@@ -68141,12 +68623,10 @@ case OP_BitAnd: /* same - case OP_BitOr: /* same as TK_BITOR, in1, in2, out3 */ - case OP_ShiftLeft: /* same as TK_LSHIFT, in1, in2, out3 */ - case OP_ShiftRight: { /* same as TK_RSHIFT, in1, in2, out3 */ --#if 0 /* local variables moved into u.ak */ - i64 iA; - u64 uA; - i64 iB; - u8 op; --#endif /* local variables moved into u.ak */ - - pIn1 = &aMem[pOp->p1]; - pIn2 = &aMem[pOp->p2]; -@@ -68155,38 +68635,38 @@ case OP_ShiftRight: { /* same - sqlite3VdbeMemSetNull(pOut); - break; - } -- u.ak.iA = sqlite3VdbeIntValue(pIn2); -- u.ak.iB = sqlite3VdbeIntValue(pIn1); -- u.ak.op = pOp->opcode; -- if( u.ak.op==OP_BitAnd ){ -- u.ak.iA &= u.ak.iB; -- }else if( u.ak.op==OP_BitOr ){ -- u.ak.iA |= u.ak.iB; -- }else if( u.ak.iB!=0 ){ -- assert( u.ak.op==OP_ShiftRight || u.ak.op==OP_ShiftLeft ); -+ iA = sqlite3VdbeIntValue(pIn2); -+ iB = sqlite3VdbeIntValue(pIn1); -+ op = pOp->opcode; -+ if( op==OP_BitAnd ){ -+ iA &= iB; -+ }else if( op==OP_BitOr ){ -+ iA |= iB; -+ }else if( iB!=0 ){ -+ assert( op==OP_ShiftRight || op==OP_ShiftLeft ); - - /* If shifting by a negative amount, shift in the other direction */ -- if( u.ak.iB<0 ){ -+ if( iB<0 ){ - assert( OP_ShiftRight==OP_ShiftLeft+1 ); -- u.ak.op = 2*OP_ShiftLeft + 1 - u.ak.op; -- u.ak.iB = u.ak.iB>(-64) ? -u.ak.iB : 64; -+ op = 2*OP_ShiftLeft + 1 - op; -+ iB = iB>(-64) ? -iB : 64; - } - -- if( u.ak.iB>=64 ){ -- u.ak.iA = (u.ak.iA>=0 || u.ak.op==OP_ShiftLeft) ? 0 : -1; -+ if( iB>=64 ){ -+ iA = (iA>=0 || op==OP_ShiftLeft) ? 0 : -1; - }else{ -- memcpy(&u.ak.uA, &u.ak.iA, sizeof(u.ak.uA)); -- if( u.ak.op==OP_ShiftLeft ){ -- u.ak.uA <<= u.ak.iB; -+ memcpy(&uA, &iA, sizeof(uA)); -+ if( op==OP_ShiftLeft ){ -+ uA <<= iB; - }else{ -- u.ak.uA >>= u.ak.iB; -+ uA >>= iB; - /* Sign-extend on a right shift of a negative number */ -- if( u.ak.iA<0 ) u.ak.uA |= ((((u64)0xffffffff)<<32)|0xffffffff) << (64-u.ak.iB); -+ if( iA<0 ) uA |= ((((u64)0xffffffff)<<32)|0xffffffff) << (64-iB); - } -- memcpy(&u.ak.iA, &u.ak.uA, sizeof(u.ak.iA)); -+ memcpy(&iA, &uA, sizeof(iA)); - } - } -- pOut->u.i = u.ak.iA; -+ pOut->u.i = iA; - MemSetTypeFlag(pOut, MEM_Int); - break; - } -@@ -68440,18 +68920,16 @@ case OP_Lt: /* same as TK_ - case OP_Le: /* same as TK_LE, jump, in1, in3 */ - case OP_Gt: /* same as TK_GT, jump, in1, in3 */ - case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ --#if 0 /* local variables moved into u.al */ - int res; /* Result of the comparison of pIn1 against pIn3 */ - char affinity; /* Affinity to use for comparison */ - u16 flags1; /* Copy of initial value of pIn1->flags */ - u16 flags3; /* Copy of initial value of pIn3->flags */ --#endif /* local variables moved into u.al */ - - pIn1 = &aMem[pOp->p1]; - pIn3 = &aMem[pOp->p3]; -- u.al.flags1 = pIn1->flags; -- u.al.flags3 = pIn3->flags; -- if( (u.al.flags1 | u.al.flags3)&MEM_Null ){ -+ flags1 = pIn1->flags; -+ flags3 = pIn3->flags; -+ if( (flags1 | flags3)&MEM_Null ){ - /* One or both operands are NULL */ - if( pOp->p5 & SQLITE_NULLEQ ){ - /* If SQLITE_NULLEQ is set (which will only happen if the operator is -@@ -68459,14 +68937,14 @@ case OP_Ge: { /* same as TK_ - ** or not both operands are null. - */ - assert( pOp->opcode==OP_Eq || pOp->opcode==OP_Ne ); -- assert( (u.al.flags1 & MEM_Cleared)==0 ); -- if( (u.al.flags1&MEM_Null)!=0 -- && (u.al.flags3&MEM_Null)!=0 -- && (u.al.flags3&MEM_Cleared)==0 -+ assert( (flags1 & MEM_Cleared)==0 ); -+ if( (flags1&MEM_Null)!=0 -+ && (flags3&MEM_Null)!=0 -+ && (flags3&MEM_Cleared)==0 - ){ -- u.al.res = 0; /* Results are equal */ -+ res = 0; /* Results are equal */ - }else{ -- u.al.res = 1; /* Results are not equal */ -+ res = 1; /* Results are not equal */ - } - }else{ - /* SQLITE_NULLEQ is clear and at least one operand is NULL, -@@ -68484,40 +68962,40 @@ case OP_Ge: { /* same as TK_ - } - }else{ - /* Neither operand is NULL. Do a comparison. */ -- u.al.affinity = pOp->p5 & SQLITE_AFF_MASK; -- if( u.al.affinity ){ -- applyAffinity(pIn1, u.al.affinity, encoding); -- applyAffinity(pIn3, u.al.affinity, encoding); -+ affinity = pOp->p5 & SQLITE_AFF_MASK; -+ if( affinity ){ -+ applyAffinity(pIn1, affinity, encoding); -+ applyAffinity(pIn3, affinity, encoding); - if( db->mallocFailed ) goto no_mem; - } - - assert( pOp->p4type==P4_COLLSEQ || pOp->p4.pColl==0 ); - ExpandBlob(pIn1); - ExpandBlob(pIn3); -- u.al.res = sqlite3MemCompare(pIn3, pIn1, pOp->p4.pColl); -+ res = sqlite3MemCompare(pIn3, pIn1, pOp->p4.pColl); - } - switch( pOp->opcode ){ -- case OP_Eq: u.al.res = u.al.res==0; break; -- case OP_Ne: u.al.res = u.al.res!=0; break; -- case OP_Lt: u.al.res = u.al.res<0; break; -- case OP_Le: u.al.res = u.al.res<=0; break; -- case OP_Gt: u.al.res = u.al.res>0; break; -- default: u.al.res = u.al.res>=0; break; -+ case OP_Eq: res = res==0; break; -+ case OP_Ne: res = res!=0; break; -+ case OP_Lt: res = res<0; break; -+ case OP_Le: res = res<=0; break; -+ case OP_Gt: res = res>0; break; -+ default: res = res>=0; break; - } - - if( pOp->p5 & SQLITE_STOREP2 ){ - pOut = &aMem[pOp->p2]; - memAboutToChange(p, pOut); - MemSetTypeFlag(pOut, MEM_Int); -- pOut->u.i = u.al.res; -+ pOut->u.i = res; - REGISTER_TRACE(pOp->p2, pOut); -- }else if( u.al.res ){ -+ }else if( res ){ - pc = pOp->p2-1; - } - - /* Undo any changes made by applyAffinity() to the input registers. */ -- pIn1->flags = (pIn1->flags&~MEM_TypeMask) | (u.al.flags1&MEM_TypeMask); -- pIn3->flags = (pIn3->flags&~MEM_TypeMask) | (u.al.flags3&MEM_TypeMask); -+ pIn1->flags = (pIn1->flags&~MEM_TypeMask) | (flags1&MEM_TypeMask); -+ pIn3->flags = (pIn3->flags&~MEM_TypeMask) | (flags3&MEM_TypeMask); - break; - } - -@@ -68557,7 +69035,6 @@ case OP_Permutation: { - ** and strings are less than blobs. - */ - case OP_Compare: { --#if 0 /* local variables moved into u.am */ - int n; - int i; - int p1; -@@ -68566,38 +69043,37 @@ case OP_Compare: { - int idx; - CollSeq *pColl; /* Collating sequence to use on this term */ - int bRev; /* True for DESCENDING sort order */ --#endif /* local variables moved into u.am */ - - if( (pOp->p5 & OPFLAG_PERMUTE)==0 ) aPermute = 0; -- u.am.n = pOp->p3; -- u.am.pKeyInfo = pOp->p4.pKeyInfo; -- assert( u.am.n>0 ); -- assert( u.am.pKeyInfo!=0 ); -- u.am.p1 = pOp->p1; -- u.am.p2 = pOp->p2; -+ n = pOp->p3; -+ pKeyInfo = pOp->p4.pKeyInfo; -+ assert( n>0 ); -+ assert( pKeyInfo!=0 ); -+ p1 = pOp->p1; -+ p2 = pOp->p2; - #if SQLITE_DEBUG - if( aPermute ){ - int k, mx = 0; -- for(k=0; kmx ) mx = aPermute[k]; -- assert( u.am.p1>0 && u.am.p1+mx<=(p->nMem-p->nCursor)+1 ); -- assert( u.am.p2>0 && u.am.p2+mx<=(p->nMem-p->nCursor)+1 ); -+ for(k=0; kmx ) mx = aPermute[k]; -+ assert( p1>0 && p1+mx<=(p->nMem-p->nCursor)+1 ); -+ assert( p2>0 && p2+mx<=(p->nMem-p->nCursor)+1 ); - }else{ -- assert( u.am.p1>0 && u.am.p1+u.am.n<=(p->nMem-p->nCursor)+1 ); -- assert( u.am.p2>0 && u.am.p2+u.am.n<=(p->nMem-p->nCursor)+1 ); -+ assert( p1>0 && p1+n<=(p->nMem-p->nCursor)+1 ); -+ assert( p2>0 && p2+n<=(p->nMem-p->nCursor)+1 ); - } - #endif /* SQLITE_DEBUG */ -- for(u.am.i=0; u.am.inField ); -- u.am.pColl = u.am.pKeyInfo->aColl[u.am.i]; -- u.am.bRev = u.am.pKeyInfo->aSortOrder[u.am.i]; -- iCompare = sqlite3MemCompare(&aMem[u.am.p1+u.am.idx], &aMem[u.am.p2+u.am.idx], u.am.pColl); -+ for(i=0; inField ); -+ pColl = pKeyInfo->aColl[i]; -+ bRev = pKeyInfo->aSortOrder[i]; -+ iCompare = sqlite3MemCompare(&aMem[p1+idx], &aMem[p2+idx], pColl); - if( iCompare ){ -- if( u.am.bRev ) iCompare = -iCompare; -+ if( bRev ) iCompare = -iCompare; - break; - } - } -@@ -68644,35 +69120,33 @@ case OP_Jump: { /* jump */ - */ - case OP_And: /* same as TK_AND, in1, in2, out3 */ - case OP_Or: { /* same as TK_OR, in1, in2, out3 */ --#if 0 /* local variables moved into u.an */ - int v1; /* Left operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */ - int v2; /* Right operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */ --#endif /* local variables moved into u.an */ - - pIn1 = &aMem[pOp->p1]; - if( pIn1->flags & MEM_Null ){ -- u.an.v1 = 2; -+ v1 = 2; - }else{ -- u.an.v1 = sqlite3VdbeIntValue(pIn1)!=0; -+ v1 = sqlite3VdbeIntValue(pIn1)!=0; - } - pIn2 = &aMem[pOp->p2]; - if( pIn2->flags & MEM_Null ){ -- u.an.v2 = 2; -+ v2 = 2; - }else{ -- u.an.v2 = sqlite3VdbeIntValue(pIn2)!=0; -+ v2 = sqlite3VdbeIntValue(pIn2)!=0; - } - if( pOp->opcode==OP_And ){ - static const unsigned char and_logic[] = { 0, 0, 0, 0, 1, 2, 0, 2, 2 }; -- u.an.v1 = and_logic[u.an.v1*3+u.an.v2]; -+ v1 = and_logic[v1*3+v2]; - }else{ - static const unsigned char or_logic[] = { 0, 1, 2, 1, 1, 1, 2, 1, 2 }; -- u.an.v1 = or_logic[u.an.v1*3+u.an.v2]; -+ v1 = or_logic[v1*3+v2]; - } - pOut = &aMem[pOp->p3]; -- if( u.an.v1==2 ){ -+ if( v1==2 ){ - MemSetTypeFlag(pOut, MEM_Null); - }else{ -- pOut->u.i = u.an.v1; -+ pOut->u.i = v1; - MemSetTypeFlag(pOut, MEM_Int); - } - break; -@@ -68743,21 +69217,19 @@ case OP_Once: { /* jump */ - */ - case OP_If: /* jump, in1 */ - case OP_IfNot: { /* jump, in1 */ --#if 0 /* local variables moved into u.ao */ - int c; --#endif /* local variables moved into u.ao */ - pIn1 = &aMem[pOp->p1]; - if( pIn1->flags & MEM_Null ){ -- u.ao.c = pOp->p3; -+ c = pOp->p3; - }else{ - #ifdef SQLITE_OMIT_FLOATING_POINT -- u.ao.c = sqlite3VdbeIntValue(pIn1)!=0; -+ c = sqlite3VdbeIntValue(pIn1)!=0; - #else -- u.ao.c = sqlite3VdbeRealValue(pIn1)!=0.0; -+ c = sqlite3VdbeRealValue(pIn1)!=0.0; - #endif -- if( pOp->opcode==OP_IfNot ) u.ao.c = !u.ao.c; -+ if( pOp->opcode==OP_IfNot ) c = !c; - } -- if( u.ao.c ){ -+ if( c ){ - pc = pOp->p2-1; - } - break; -@@ -68815,7 +69287,6 @@ case OP_NotNull: { /* same as - ** skipped for length() and all content loading can be skipped for typeof(). - */ - case OP_Column: { --#if 0 /* local variables moved into u.ap */ - i64 payloadSize64; /* Number of bytes in the record */ - int p2; /* column number to retrieve */ - VdbeCursor *pC; /* The VDBE cursor */ -@@ -68834,85 +69305,84 @@ case OP_Column: { - u32 avail; /* Number of bytes of available data */ - u32 t; /* A type code from the record header */ - Mem *pReg; /* PseudoTable input register */ --#endif /* local variables moved into u.ap */ - -- u.ap.p2 = pOp->p2; -+ p2 = pOp->p2; - assert( pOp->p3>0 && pOp->p3<=(p->nMem-p->nCursor) ); -- u.ap.pDest = &aMem[pOp->p3]; -- memAboutToChange(p, u.ap.pDest); -+ pDest = &aMem[pOp->p3]; -+ memAboutToChange(p, pDest); - assert( pOp->p1>=0 && pOp->p1nCursor ); -- u.ap.pC = p->apCsr[pOp->p1]; -- assert( u.ap.pC!=0 ); -- assert( u.ap.p2nField ); -- u.ap.aType = u.ap.pC->aType; -- u.ap.aOffset = u.ap.aType + u.ap.pC->nField; -+ pC = p->apCsr[pOp->p1]; -+ assert( pC!=0 ); -+ assert( p2nField ); -+ aType = pC->aType; -+ aOffset = aType + pC->nField; - #ifndef SQLITE_OMIT_VIRTUALTABLE -- assert( u.ap.pC->pVtabCursor==0 ); /* OP_Column never called on virtual table */ -+ assert( pC->pVtabCursor==0 ); /* OP_Column never called on virtual table */ - #endif -- u.ap.pCrsr = u.ap.pC->pCursor; -- assert( u.ap.pCrsr!=0 || u.ap.pC->pseudoTableReg>0 ); /* u.ap.pCrsr NULL on PseudoTables */ -- assert( u.ap.pCrsr!=0 || u.ap.pC->nullRow ); /* u.ap.pC->nullRow on PseudoTables */ -+ pCrsr = pC->pCursor; -+ assert( pCrsr!=0 || pC->pseudoTableReg>0 ); /* pCrsr NULL on PseudoTables */ -+ assert( pCrsr!=0 || pC->nullRow ); /* pC->nullRow on PseudoTables */ - - /* If the cursor cache is stale, bring it up-to-date */ -- rc = sqlite3VdbeCursorMoveto(u.ap.pC); -+ rc = sqlite3VdbeCursorMoveto(pC); - if( rc ) goto abort_due_to_error; -- if( u.ap.pC->cacheStatus!=p->cacheCtr || (pOp->p5&OPFLAG_CLEARCACHE)!=0 ){ -- if( u.ap.pC->nullRow ){ -- if( u.ap.pCrsr==0 ){ -- assert( u.ap.pC->pseudoTableReg>0 ); -- u.ap.pReg = &aMem[u.ap.pC->pseudoTableReg]; -- if( u.ap.pC->multiPseudo ){ -- sqlite3VdbeMemShallowCopy(u.ap.pDest, u.ap.pReg+u.ap.p2, MEM_Ephem); -- Deephemeralize(u.ap.pDest); -+ if( pC->cacheStatus!=p->cacheCtr || (pOp->p5&OPFLAG_CLEARCACHE)!=0 ){ -+ if( pC->nullRow ){ -+ if( pCrsr==0 ){ -+ assert( pC->pseudoTableReg>0 ); -+ pReg = &aMem[pC->pseudoTableReg]; -+ if( pC->multiPseudo ){ -+ sqlite3VdbeMemShallowCopy(pDest, pReg+p2, MEM_Ephem); -+ Deephemeralize(pDest); - goto op_column_out; - } -- assert( u.ap.pReg->flags & MEM_Blob ); -- assert( memIsValid(u.ap.pReg) ); -- u.ap.pC->payloadSize = u.ap.pC->szRow = u.ap.avail = u.ap.pReg->n; -- u.ap.pC->aRow = (u8*)u.ap.pReg->z; -+ assert( pReg->flags & MEM_Blob ); -+ assert( memIsValid(pReg) ); -+ pC->payloadSize = pC->szRow = avail = pReg->n; -+ pC->aRow = (u8*)pReg->z; - }else{ -- MemSetTypeFlag(u.ap.pDest, MEM_Null); -+ MemSetTypeFlag(pDest, MEM_Null); - goto op_column_out; - } - }else{ -- assert( u.ap.pCrsr ); -- if( u.ap.pC->isTable==0 ){ -- assert( sqlite3BtreeCursorIsValid(u.ap.pCrsr) ); -- VVA_ONLY(rc =) sqlite3BtreeKeySize(u.ap.pCrsr, &u.ap.payloadSize64); -+ assert( pCrsr ); -+ if( pC->isTable==0 ){ -+ assert( sqlite3BtreeCursorIsValid(pCrsr) ); -+ VVA_ONLY(rc =) sqlite3BtreeKeySize(pCrsr, &payloadSize64); - assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */ - /* sqlite3BtreeParseCellPtr() uses getVarint32() to extract the -- ** payload size, so it is impossible for u.ap.payloadSize64 to be -+ ** payload size, so it is impossible for payloadSize64 to be - ** larger than 32 bits. */ -- assert( (u.ap.payloadSize64 & SQLITE_MAX_U32)==(u64)u.ap.payloadSize64 ); -- u.ap.pC->aRow = sqlite3BtreeKeyFetch(u.ap.pCrsr, &u.ap.avail); -- u.ap.pC->payloadSize = (u32)u.ap.payloadSize64; -+ assert( (payloadSize64 & SQLITE_MAX_U32)==(u64)payloadSize64 ); -+ pC->aRow = sqlite3BtreeKeyFetch(pCrsr, &avail); -+ pC->payloadSize = (u32)payloadSize64; - }else{ -- assert( sqlite3BtreeCursorIsValid(u.ap.pCrsr) ); -- VVA_ONLY(rc =) sqlite3BtreeDataSize(u.ap.pCrsr, &u.ap.pC->payloadSize); -+ assert( sqlite3BtreeCursorIsValid(pCrsr) ); -+ VVA_ONLY(rc =) sqlite3BtreeDataSize(pCrsr, &pC->payloadSize); - assert( rc==SQLITE_OK ); /* DataSize() cannot fail */ -- u.ap.pC->aRow = sqlite3BtreeDataFetch(u.ap.pCrsr, &u.ap.avail); -+ pC->aRow = sqlite3BtreeDataFetch(pCrsr, &avail); - } -- assert( u.ap.avail<=65536 ); /* Maximum page size is 64KiB */ -- if( u.ap.pC->payloadSize <= (u32)u.ap.avail ){ -- u.ap.pC->szRow = u.ap.pC->payloadSize; -+ assert( avail<=65536 ); /* Maximum page size is 64KiB */ -+ if( pC->payloadSize <= (u32)avail ){ -+ pC->szRow = pC->payloadSize; - }else{ -- u.ap.pC->szRow = u.ap.avail; -+ pC->szRow = avail; - } -- if( u.ap.pC->payloadSize > (u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ -+ if( pC->payloadSize > (u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ - goto too_big; - } - } -- u.ap.pC->cacheStatus = p->cacheCtr; -- u.ap.pC->iHdrOffset = getVarint32(u.ap.pC->aRow, u.ap.offset); -- u.ap.pC->nHdrParsed = 0; -- u.ap.aOffset[0] = u.ap.offset; -- if( u.ap.availaRow does not have to hold the entire row, but it does at least -- ** need to cover the header of the record. If u.ap.pC->aRow does not contain -+ pC->cacheStatus = p->cacheCtr; -+ pC->iHdrOffset = getVarint32(pC->aRow, offset); -+ pC->nHdrParsed = 0; -+ aOffset[0] = offset; -+ if( availaRow does not have to hold the entire row, but it does at least -+ ** need to cover the header of the record. If pC->aRow does not contain - ** the complete header, then set it to zero, forcing the header to be - ** dynamically allocated. */ -- u.ap.pC->aRow = 0; -- u.ap.pC->szRow = 0; -+ pC->aRow = 0; -+ pC->szRow = 0; - } - - /* Make sure a corrupt database has not given us an oversize header. -@@ -68924,72 +69394,72 @@ case OP_Column: { - ** 3-byte type for each of the maximum of 32768 columns plus three - ** extra bytes for the header length itself. 32768*3 + 3 = 98307. - */ -- if( u.ap.offset > 98307 || u.ap.offset > u.ap.pC->payloadSize ){ -+ if( offset > 98307 || offset > pC->payloadSize ){ - rc = SQLITE_CORRUPT_BKPT; - goto op_column_error; - } - } - -- /* Make sure at least the first u.ap.p2+1 entries of the header have been -- ** parsed and valid information is in u.ap.aOffset[] and u.ap.aType[]. -+ /* Make sure at least the first p2+1 entries of the header have been -+ ** parsed and valid information is in aOffset[] and aType[]. - */ -- if( u.ap.pC->nHdrParsed<=u.ap.p2 ){ -+ if( pC->nHdrParsed<=p2 ){ - /* If there is more header available for parsing in the record, try -- ** to extract additional fields up through the u.ap.p2+1-th field -+ ** to extract additional fields up through the p2+1-th field - */ -- if( u.ap.pC->iHdrOffsetaRow==0 ){ -- memset(&u.ap.sMem, 0, sizeof(u.ap.sMem)); -- rc = sqlite3VdbeMemFromBtree(u.ap.pCrsr, 0, u.ap.aOffset[0], -- !u.ap.pC->isTable, &u.ap.sMem); -+ if( pC->iHdrOffsetaRow==0 ){ -+ memset(&sMem, 0, sizeof(sMem)); -+ rc = sqlite3VdbeMemFromBtree(pCrsr, 0, aOffset[0], -+ !pC->isTable, &sMem); - if( rc!=SQLITE_OK ){ - goto op_column_error; - } -- u.ap.zData = (u8*)u.ap.sMem.z; -+ zData = (u8*)sMem.z; - }else{ -- u.ap.zData = u.ap.pC->aRow; -+ zData = pC->aRow; - } -- -- /* Fill in u.ap.aType[u.ap.i] and u.ap.aOffset[u.ap.i] values through the u.ap.p2-th field. */ -- u.ap.i = u.ap.pC->nHdrParsed; -- u.ap.offset = u.ap.aOffset[u.ap.i]; -- u.ap.zHdr = u.ap.zData + u.ap.pC->iHdrOffset; -- u.ap.zEndHdr = u.ap.zData + u.ap.aOffset[0]; -- assert( u.ap.i<=u.ap.p2 && u.ap.zHdrnHdrParsed; -+ offset = aOffset[i]; -+ zHdr = zData + pC->iHdrOffset; -+ zEndHdr = zData + aOffset[0]; -+ assert( i<=p2 && zHdrnHdrParsed = u.ap.i; -- u.ap.pC->iHdrOffset = (u32)(u.ap.zHdr - u.ap.zData); -- if( u.ap.pC->aRow==0 ){ -- sqlite3VdbeMemRelease(&u.ap.sMem); -- u.ap.sMem.flags = MEM_Null; -+ i++; -+ aOffset[i] = offset; -+ }while( i<=p2 && zHdrnHdrParsed = i; -+ pC->iHdrOffset = (u32)(zHdr - zData); -+ if( pC->aRow==0 ){ -+ sqlite3VdbeMemRelease(&sMem); -+ sMem.flags = MEM_Null; - } -- -+ - /* If we have read more header data than was contained in the header, - ** or if the end of the last field appears to be past the end of the - ** record, or if the end of the last field appears to be before the end -- ** of the record (when all fields present), then we must be dealing -+ ** of the record (when all fields present), then we must be dealing - ** with a corrupt database. - */ -- if( (u.ap.zHdr > u.ap.zEndHdr) -- || (u.ap.offset > u.ap.pC->payloadSize) -- || (u.ap.zHdr==u.ap.zEndHdr && u.ap.offset!=u.ap.pC->payloadSize) -+ if( (zHdr > zEndHdr) -+ || (offset > pC->payloadSize) -+ || (zHdr==zEndHdr && offset!=pC->payloadSize) - ){ - rc = SQLITE_CORRUPT_BKPT; - goto op_column_error; -@@ -68997,77 +69467,77 @@ case OP_Column: { - } - - /* If after trying to extra new entries from the header, nHdrParsed is -- ** still not up to u.ap.p2, that means that the record has fewer than u.ap.p2 -+ ** still not up to p2, that means that the record has fewer than p2 - ** columns. So the result will be either the default value or a NULL. - */ -- if( u.ap.pC->nHdrParsed<=u.ap.p2 ){ -+ if( pC->nHdrParsed<=p2 ){ - if( pOp->p4type==P4_MEM ){ -- sqlite3VdbeMemShallowCopy(u.ap.pDest, pOp->p4.pMem, MEM_Static); -+ sqlite3VdbeMemShallowCopy(pDest, pOp->p4.pMem, MEM_Static); - }else{ -- MemSetTypeFlag(u.ap.pDest, MEM_Null); -+ MemSetTypeFlag(pDest, MEM_Null); - } - goto op_column_out; - } - } - -- /* Extract the content for the u.ap.p2+1-th column. Control can only -- ** reach this point if u.ap.aOffset[u.ap.p2], u.ap.aOffset[u.ap.p2+1], and u.ap.aType[u.ap.p2] are -+ /* Extract the content for the p2+1-th column. Control can only -+ ** reach this point if aOffset[p2], aOffset[p2+1], and aType[p2] are - ** all valid. - */ -- assert( u.ap.p2nHdrParsed ); -+ assert( p2nHdrParsed ); - assert( rc==SQLITE_OK ); -- if( u.ap.pC->szRow>=u.ap.aOffset[u.ap.p2+1] ){ -+ if( pC->szRow>=aOffset[p2+1] ){ - /* This is the common case where the desired content fits on the original - ** page - where the content is not on an overflow page */ -- VdbeMemRelease(u.ap.pDest); -- sqlite3VdbeSerialGet(u.ap.pC->aRow+u.ap.aOffset[u.ap.p2], u.ap.aType[u.ap.p2], u.ap.pDest); -+ VdbeMemRelease(pDest); -+ sqlite3VdbeSerialGet(pC->aRow+aOffset[p2], aType[p2], pDest); - }else{ - /* This branch happens only when content is on overflow pages */ -- u.ap.t = u.ap.aType[u.ap.p2]; -+ t = aType[p2]; - if( ((pOp->p5 & (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG))!=0 -- && ((u.ap.t>=12 && (u.ap.t&1)==0) || (pOp->p5 & OPFLAG_TYPEOFARG)!=0)) -- || (u.ap.len = sqlite3VdbeSerialTypeLen(u.ap.t))==0 -+ && ((t>=12 && (t&1)==0) || (pOp->p5 & OPFLAG_TYPEOFARG)!=0)) -+ || (len = sqlite3VdbeSerialTypeLen(t))==0 - ){ - /* Content is irrelevant for the typeof() function and for - ** the length(X) function if X is a blob. So we might as well use - ** bogus content rather than reading content from disk. NULL works -- ** for text and blob and whatever is in the u.ap.payloadSize64 variable -+ ** for text and blob and whatever is in the payloadSize64 variable - ** will work for everything else. Content is also irrelevant if - ** the content length is 0. */ -- u.ap.zData = u.ap.t<=13 ? (u8*)&u.ap.payloadSize64 : 0; -- u.ap.sMem.zMalloc = 0; -+ zData = t<=13 ? (u8*)&payloadSize64 : 0; -+ sMem.zMalloc = 0; - }else{ -- memset(&u.ap.sMem, 0, sizeof(u.ap.sMem)); -- sqlite3VdbeMemMove(&u.ap.sMem, u.ap.pDest); -- rc = sqlite3VdbeMemFromBtree(u.ap.pCrsr, u.ap.aOffset[u.ap.p2], u.ap.len, !u.ap.pC->isTable, -- &u.ap.sMem); -+ memset(&sMem, 0, sizeof(sMem)); -+ sqlite3VdbeMemMove(&sMem, pDest); -+ rc = sqlite3VdbeMemFromBtree(pCrsr, aOffset[p2], len, !pC->isTable, -+ &sMem); - if( rc!=SQLITE_OK ){ - goto op_column_error; - } -- u.ap.zData = (u8*)u.ap.sMem.z; -+ zData = (u8*)sMem.z; - } -- sqlite3VdbeSerialGet(u.ap.zData, u.ap.t, u.ap.pDest); -+ sqlite3VdbeSerialGet(zData, t, pDest); - /* If we dynamically allocated space to hold the data (in the - ** sqlite3VdbeMemFromBtree() call above) then transfer control of that -- ** dynamically allocated space over to the u.ap.pDest structure. -+ ** dynamically allocated space over to the pDest structure. - ** This prevents a memory copy. */ -- if( u.ap.sMem.zMalloc ){ -- assert( u.ap.sMem.z==u.ap.sMem.zMalloc ); -- assert( !(u.ap.pDest->flags & MEM_Dyn) ); -- assert( !(u.ap.pDest->flags & (MEM_Blob|MEM_Str)) || u.ap.pDest->z==u.ap.sMem.z ); -- u.ap.pDest->flags &= ~(MEM_Ephem|MEM_Static); -- u.ap.pDest->flags |= MEM_Term; -- u.ap.pDest->z = u.ap.sMem.z; -- u.ap.pDest->zMalloc = u.ap.sMem.zMalloc; -+ if( sMem.zMalloc ){ -+ assert( sMem.z==sMem.zMalloc ); -+ assert( !(pDest->flags & MEM_Dyn) ); -+ assert( !(pDest->flags & (MEM_Blob|MEM_Str)) || pDest->z==sMem.z ); -+ pDest->flags &= ~(MEM_Ephem|MEM_Static); -+ pDest->flags |= MEM_Term; -+ pDest->z = sMem.z; -+ pDest->zMalloc = sMem.zMalloc; - } - } -- u.ap.pDest->enc = encoding; -+ pDest->enc = encoding; - - op_column_out: -- rc = sqlite3VdbeMemMakeWriteable(u.ap.pDest); -+ Deephemeralize(pDest); - op_column_error: -- UPDATE_MAX_BLOBSIZE(u.ap.pDest); -- REGISTER_TRACE(pOp->p3, u.ap.pDest); -+ UPDATE_MAX_BLOBSIZE(pDest); -+ REGISTER_TRACE(pOp->p3, pDest); - break; - } - -@@ -69081,20 +69551,18 @@ op_column_error: - ** memory cell in the range. - */ - case OP_Affinity: { --#if 0 /* local variables moved into u.aq */ - const char *zAffinity; /* The affinity to be applied */ - char cAff; /* A single character of affinity */ --#endif /* local variables moved into u.aq */ - -- u.aq.zAffinity = pOp->p4.z; -- assert( u.aq.zAffinity!=0 ); -- assert( u.aq.zAffinity[pOp->p2]==0 ); -+ zAffinity = pOp->p4.z; -+ assert( zAffinity!=0 ); -+ assert( zAffinity[pOp->p2]==0 ); - pIn1 = &aMem[pOp->p1]; -- while( (u.aq.cAff = *(u.aq.zAffinity++))!=0 ){ -+ while( (cAff = *(zAffinity++))!=0 ){ - assert( pIn1 <= &p->aMem[(p->nMem-p->nCursor)] ); - assert( memIsValid(pIn1) ); - ExpandBlob(pIn1); -- applyAffinity(pIn1, u.aq.cAff, encoding); -+ applyAffinity(pIn1, cAff, encoding); - pIn1++; - } - break; -@@ -69117,7 +69585,6 @@ case OP_Affinity: { - ** If P4 is NULL then all index fields have the affinity NONE. - */ - case OP_MakeRecord: { --#if 0 /* local variables moved into u.ar */ - u8 *zNewRecord; /* A buffer to hold the data for the new record */ - Mem *pRec; /* The new record */ - u64 nData; /* Number of bytes of data space */ -@@ -69131,102 +69598,119 @@ case OP_MakeRecord: { - int nField; /* Number of fields in the record */ - char *zAffinity; /* The affinity string for the record */ - int file_format; /* File format to use for encoding */ -- int i; /* Space used in zNewRecord[] */ -+ int i; /* Space used in zNewRecord[] header */ -+ int j; /* Space used in zNewRecord[] content */ - int len; /* Length of a field */ --#endif /* local variables moved into u.ar */ - - /* Assuming the record contains N fields, the record format looks - ** like this: - ** - ** ------------------------------------------------------------------------ -- ** | hdr-size | type 0 | type 1 | ... | type N-1 | data0 | ... | data N-1 | -+ ** | hdr-size | type 0 | type 1 | ... | type N-1 | data0 | ... | data N-1 | - ** ------------------------------------------------------------------------ - ** - ** Data(0) is taken from register P1. Data(1) comes from register P1+1 - ** and so froth. - ** -- ** Each type field is a varint representing the serial type of the -+ ** Each type field is a varint representing the serial type of the - ** corresponding data element (see sqlite3VdbeSerialType()). The - ** hdr-size field is also a varint which is the offset from the beginning - ** of the record to data0. - */ -- u.ar.nData = 0; /* Number of bytes of data space */ -- u.ar.nHdr = 0; /* Number of bytes of header space */ -- u.ar.nZero = 0; /* Number of zero bytes at the end of the record */ -- u.ar.nField = pOp->p1; -- u.ar.zAffinity = pOp->p4.z; -- assert( u.ar.nField>0 && pOp->p2>0 && pOp->p2+u.ar.nField<=(p->nMem-p->nCursor)+1 ); -- u.ar.pData0 = &aMem[u.ar.nField]; -- u.ar.nField = pOp->p2; -- u.ar.pLast = &u.ar.pData0[u.ar.nField-1]; -- u.ar.file_format = p->minWriteFileFormat; -+ nData = 0; /* Number of bytes of data space */ -+ nHdr = 0; /* Number of bytes of header space */ -+ nZero = 0; /* Number of zero bytes at the end of the record */ -+ nField = pOp->p1; -+ zAffinity = pOp->p4.z; -+ assert( nField>0 && pOp->p2>0 && pOp->p2+nField<=(p->nMem-p->nCursor)+1 ); -+ pData0 = &aMem[nField]; -+ nField = pOp->p2; -+ pLast = &pData0[nField-1]; -+ file_format = p->minWriteFileFormat; - - /* Identify the output register */ - assert( pOp->p3p1 || pOp->p3>=pOp->p1+pOp->p2 ); - pOut = &aMem[pOp->p3]; - memAboutToChange(p, pOut); - -+ /* Apply the requested affinity to all inputs -+ */ -+ assert( pData0<=pLast ); -+ if( zAffinity ){ -+ pRec = pData0; -+ do{ -+ applyAffinity(pRec, *(zAffinity++), encoding); -+ }while( (++pRec)<=pLast ); -+ } -+ - /* Loop through the elements that will make up the record to figure - ** out how much space is required for the new record. - */ -- for(u.ar.pRec=u.ar.pData0; u.ar.pRec<=u.ar.pLast; u.ar.pRec++){ -- assert( memIsValid(u.ar.pRec) ); -- if( u.ar.zAffinity ){ -- applyAffinity(u.ar.pRec, u.ar.zAffinity[u.ar.pRec-u.ar.pData0], encoding); -- } -- if( u.ar.pRec->flags&MEM_Zero && u.ar.pRec->n>0 ){ -- sqlite3VdbeMemExpandBlob(u.ar.pRec); -- } -- u.ar.serial_type = sqlite3VdbeSerialType(u.ar.pRec, u.ar.file_format); -- u.ar.len = sqlite3VdbeSerialTypeLen(u.ar.serial_type); -- u.ar.nData += u.ar.len; -- u.ar.nHdr += sqlite3VarintLen(u.ar.serial_type); -- if( u.ar.pRec->flags & MEM_Zero ){ -- /* Only pure zero-filled BLOBs can be input to this Opcode. -- ** We do not allow blobs with a prefix and a zero-filled tail. */ -- u.ar.nZero += u.ar.pRec->u.nZero; -- }else if( u.ar.len ){ -- u.ar.nZero = 0; -- } -- } -+ pRec = pLast; -+ do{ -+ assert( memIsValid(pRec) ); -+ serial_type = sqlite3VdbeSerialType(pRec, file_format); -+ len = sqlite3VdbeSerialTypeLen(serial_type); -+ if( pRec->flags & MEM_Zero ){ -+ if( nData ){ -+ sqlite3VdbeMemExpandBlob(pRec); -+ }else{ -+ nZero += pRec->u.nZero; -+ len -= pRec->u.nZero; -+ } -+ } -+ nData += len; -+ testcase( serial_type==127 ); -+ testcase( serial_type==128 ); -+ nHdr += serial_type<=127 ? 1 : sqlite3VarintLen(serial_type); -+ }while( (--pRec)>=pData0 ); - - /* Add the initial header varint and total the size */ -- u.ar.nHdr += u.ar.nVarint = sqlite3VarintLen(u.ar.nHdr); -- if( u.ar.nVarintdb->aLimit[SQLITE_LIMIT_LENGTH] ){ -+ nByte = nHdr+nData; -+ if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ - goto too_big; - } - -- /* Make sure the output register has a buffer large enough to store -+ /* Make sure the output register has a buffer large enough to store - ** the new record. The output register (pOp->p3) is not allowed to - ** be one of the input registers (because the following call to - ** sqlite3VdbeMemGrow() could clobber the value before it is used). - */ -- if( sqlite3VdbeMemGrow(pOut, (int)u.ar.nByte, 0) ){ -+ if( sqlite3VdbeMemGrow(pOut, (int)nByte, 0) ){ - goto no_mem; - } -- u.ar.zNewRecord = (u8 *)pOut->z; -+ zNewRecord = (u8 *)pOut->z; - - /* Write the record */ -- u.ar.i = putVarint32(u.ar.zNewRecord, u.ar.nHdr); -- for(u.ar.pRec=u.ar.pData0; u.ar.pRec<=u.ar.pLast; u.ar.pRec++){ -- u.ar.serial_type = sqlite3VdbeSerialType(u.ar.pRec, u.ar.file_format); -- u.ar.i += putVarint32(&u.ar.zNewRecord[u.ar.i], u.ar.serial_type); /* serial type */ -- } -- for(u.ar.pRec=u.ar.pData0; u.ar.pRec<=u.ar.pLast; u.ar.pRec++){ /* serial data */ -- u.ar.i += sqlite3VdbeSerialPut(&u.ar.zNewRecord[u.ar.i], (int)(u.ar.nByte-u.ar.i), u.ar.pRec,u.ar.file_format); -- } -- assert( u.ar.i==u.ar.nByte ); -+ i = putVarint32(zNewRecord, nHdr); -+ j = nHdr; -+ assert( pData0<=pLast ); -+ pRec = pData0; -+ do{ -+ serial_type = sqlite3VdbeSerialType(pRec, file_format); -+ i += putVarint32(&zNewRecord[i], serial_type); /* serial type */ -+ j += sqlite3VdbeSerialPut(&zNewRecord[j], pRec, serial_type); /* content */ -+ }while( (++pRec)<=pLast ); -+ assert( i==nHdr ); -+ assert( j==nByte ); - - assert( pOp->p3>0 && pOp->p3<=(p->nMem-p->nCursor) ); -- pOut->n = (int)u.ar.nByte; -+ pOut->n = (int)nByte; - pOut->flags = MEM_Blob | MEM_Dyn; - pOut->xDel = 0; -- if( u.ar.nZero ){ -- pOut->u.nZero = u.ar.nZero; -+ if( nZero ){ -+ pOut->u.nZero = nZero; - pOut->flags |= MEM_Zero; - } - pOut->enc = SQLITE_UTF8; /* In case the blob is ever converted to text */ -@@ -69243,15 +69727,14 @@ case OP_MakeRecord: { - */ - #ifndef SQLITE_OMIT_BTREECOUNT - case OP_Count: { /* out2-prerelease */ --#if 0 /* local variables moved into u.as */ - i64 nEntry; - BtCursor *pCrsr; --#endif /* local variables moved into u.as */ - -- u.as.pCrsr = p->apCsr[pOp->p1]->pCursor; -- assert( u.as.pCrsr ); -- rc = sqlite3BtreeCount(u.as.pCrsr, &u.as.nEntry); -- pOut->u.i = u.as.nEntry; -+ pCrsr = p->apCsr[pOp->p1]->pCursor; -+ assert( pCrsr ); -+ nEntry = 0; /* Not needed. Only used to silence a warning. */ -+ rc = sqlite3BtreeCount(pCrsr, &nEntry); -+ pOut->u.i = nEntry; - break; - } - #endif -@@ -69263,7 +69746,6 @@ case OP_Count: { /* out2-prerele - ** existing savepoint, P1==1, or to rollback an existing savepoint P1==2. - */ - case OP_Savepoint: { --#if 0 /* local variables moved into u.at */ - int p1; /* Value of P1 operand */ - char *zName; /* Name of savepoint */ - int nName; -@@ -69272,30 +69754,29 @@ case OP_Savepoint: { - Savepoint *pTmp; - int iSavepoint; - int ii; --#endif /* local variables moved into u.at */ - -- u.at.p1 = pOp->p1; -- u.at.zName = pOp->p4.z; -+ p1 = pOp->p1; -+ zName = pOp->p4.z; - -- /* Assert that the u.at.p1 parameter is valid. Also that if there is no open -- ** transaction, then there cannot be any savepoints. -+ /* Assert that the p1 parameter is valid. Also that if there is no open -+ ** transaction, then there cannot be any savepoints. - */ - assert( db->pSavepoint==0 || db->autoCommit==0 ); -- assert( u.at.p1==SAVEPOINT_BEGIN||u.at.p1==SAVEPOINT_RELEASE||u.at.p1==SAVEPOINT_ROLLBACK ); -+ assert( p1==SAVEPOINT_BEGIN||p1==SAVEPOINT_RELEASE||p1==SAVEPOINT_ROLLBACK ); - assert( db->pSavepoint || db->isTransactionSavepoint==0 ); - assert( checkSavepointCount(db) ); - assert( p->bIsReader ); - -- if( u.at.p1==SAVEPOINT_BEGIN ){ -+ if( p1==SAVEPOINT_BEGIN ){ - if( db->nVdbeWrite>0 ){ -- /* A new savepoint cannot be created if there are active write -+ /* A new savepoint cannot be created if there are active write - ** statements (i.e. open read/write incremental blob handles). - */ - sqlite3SetString(&p->zErrMsg, db, "cannot open savepoint - " - "SQL statements in progress"); - rc = SQLITE_BUSY; - }else{ -- u.at.nName = sqlite3Strlen30(u.at.zName); -+ nName = sqlite3Strlen30(zName); - - #ifndef SQLITE_OMIT_VIRTUALTABLE - /* This call is Ok even if this savepoint is actually a transaction -@@ -69309,11 +69790,11 @@ case OP_Savepoint: { - #endif - - /* Create a new savepoint structure. */ -- u.at.pNew = sqlite3DbMallocRaw(db, sizeof(Savepoint)+u.at.nName+1); -- if( u.at.pNew ){ -- u.at.pNew->zName = (char *)&u.at.pNew[1]; -- memcpy(u.at.pNew->zName, u.at.zName, u.at.nName+1); -- -+ pNew = sqlite3DbMallocRaw(db, sizeof(Savepoint)+nName+1); -+ if( pNew ){ -+ pNew->zName = (char *)&pNew[1]; -+ memcpy(pNew->zName, zName, nName+1); -+ - /* If there is no open transaction, then mark this as a special - ** "transaction savepoint". */ - if( db->autoCommit ){ -@@ -69322,45 +69803,45 @@ case OP_Savepoint: { - }else{ - db->nSavepoint++; - } -- -+ - /* Link the new savepoint into the database handle's list. */ -- u.at.pNew->pNext = db->pSavepoint; -- db->pSavepoint = u.at.pNew; -- u.at.pNew->nDeferredCons = db->nDeferredCons; -- u.at.pNew->nDeferredImmCons = db->nDeferredImmCons; -+ pNew->pNext = db->pSavepoint; -+ db->pSavepoint = pNew; -+ pNew->nDeferredCons = db->nDeferredCons; -+ pNew->nDeferredImmCons = db->nDeferredImmCons; - } - } - }else{ -- u.at.iSavepoint = 0; -+ iSavepoint = 0; - - /* Find the named savepoint. If there is no such savepoint, then an - ** an error is returned to the user. */ - for( -- u.at.pSavepoint = db->pSavepoint; -- u.at.pSavepoint && sqlite3StrICmp(u.at.pSavepoint->zName, u.at.zName); -- u.at.pSavepoint = u.at.pSavepoint->pNext -+ pSavepoint = db->pSavepoint; -+ pSavepoint && sqlite3StrICmp(pSavepoint->zName, zName); -+ pSavepoint = pSavepoint->pNext - ){ -- u.at.iSavepoint++; -+ iSavepoint++; - } -- if( !u.at.pSavepoint ){ -- sqlite3SetString(&p->zErrMsg, db, "no such savepoint: %s", u.at.zName); -+ if( !pSavepoint ){ -+ sqlite3SetString(&p->zErrMsg, db, "no such savepoint: %s", zName); - rc = SQLITE_ERROR; -- }else if( db->nVdbeWrite>0 && u.at.p1==SAVEPOINT_RELEASE ){ -- /* It is not possible to release (commit) a savepoint if there are -+ }else if( db->nVdbeWrite>0 && p1==SAVEPOINT_RELEASE ){ -+ /* It is not possible to release (commit) a savepoint if there are - ** active write statements. - */ -- sqlite3SetString(&p->zErrMsg, db, -+ sqlite3SetString(&p->zErrMsg, db, - "cannot release savepoint - SQL statements in progress" - ); - rc = SQLITE_BUSY; - }else{ - - /* Determine whether or not this is a transaction savepoint. If so, -- ** and this is a RELEASE command, then the current transaction -- ** is committed. -+ ** and this is a RELEASE command, then the current transaction -+ ** is committed. - */ -- int isTransaction = u.at.pSavepoint->pNext==0 && db->isTransactionSavepoint; -- if( isTransaction && u.at.p1==SAVEPOINT_RELEASE ){ -+ int isTransaction = pSavepoint->pNext==0 && db->isTransactionSavepoint; -+ if( isTransaction && p1==SAVEPOINT_RELEASE ){ - if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ - goto vdbe_return; - } -@@ -69374,52 +69855,52 @@ case OP_Savepoint: { - db->isTransactionSavepoint = 0; - rc = p->rc; - }else{ -- u.at.iSavepoint = db->nSavepoint - u.at.iSavepoint - 1; -- if( u.at.p1==SAVEPOINT_ROLLBACK ){ -- for(u.at.ii=0; u.at.iinDb; u.at.ii++){ -- sqlite3BtreeTripAllCursors(db->aDb[u.at.ii].pBt, SQLITE_ABORT); -+ iSavepoint = db->nSavepoint - iSavepoint - 1; -+ if( p1==SAVEPOINT_ROLLBACK ){ -+ for(ii=0; iinDb; ii++){ -+ sqlite3BtreeTripAllCursors(db->aDb[ii].pBt, SQLITE_ABORT); - } - } -- for(u.at.ii=0; u.at.iinDb; u.at.ii++){ -- rc = sqlite3BtreeSavepoint(db->aDb[u.at.ii].pBt, u.at.p1, u.at.iSavepoint); -+ for(ii=0; iinDb; ii++){ -+ rc = sqlite3BtreeSavepoint(db->aDb[ii].pBt, p1, iSavepoint); - if( rc!=SQLITE_OK ){ - goto abort_due_to_error; - } - } -- if( u.at.p1==SAVEPOINT_ROLLBACK && (db->flags&SQLITE_InternChanges)!=0 ){ -+ if( p1==SAVEPOINT_ROLLBACK && (db->flags&SQLITE_InternChanges)!=0 ){ - sqlite3ExpirePreparedStatements(db); - sqlite3ResetAllSchemasOfConnection(db); - db->flags = (db->flags | SQLITE_InternChanges); - } - } -- -- /* Regardless of whether this is a RELEASE or ROLLBACK, destroy all -+ -+ /* Regardless of whether this is a RELEASE or ROLLBACK, destroy all - ** savepoints nested inside of the savepoint being operated on. */ -- while( db->pSavepoint!=u.at.pSavepoint ){ -- u.at.pTmp = db->pSavepoint; -- db->pSavepoint = u.at.pTmp->pNext; -- sqlite3DbFree(db, u.at.pTmp); -+ while( db->pSavepoint!=pSavepoint ){ -+ pTmp = db->pSavepoint; -+ db->pSavepoint = pTmp->pNext; -+ sqlite3DbFree(db, pTmp); - db->nSavepoint--; - } - -- /* If it is a RELEASE, then destroy the savepoint being operated on -- ** too. If it is a ROLLBACK TO, then set the number of deferred -+ /* If it is a RELEASE, then destroy the savepoint being operated on -+ ** too. If it is a ROLLBACK TO, then set the number of deferred - ** constraint violations present in the database to the value stored - ** when the savepoint was created. */ -- if( u.at.p1==SAVEPOINT_RELEASE ){ -- assert( u.at.pSavepoint==db->pSavepoint ); -- db->pSavepoint = u.at.pSavepoint->pNext; -- sqlite3DbFree(db, u.at.pSavepoint); -+ if( p1==SAVEPOINT_RELEASE ){ -+ assert( pSavepoint==db->pSavepoint ); -+ db->pSavepoint = pSavepoint->pNext; -+ sqlite3DbFree(db, pSavepoint); - if( !isTransaction ){ - db->nSavepoint--; - } - }else{ -- db->nDeferredCons = u.at.pSavepoint->nDeferredCons; -- db->nDeferredImmCons = u.at.pSavepoint->nDeferredImmCons; -+ db->nDeferredCons = pSavepoint->nDeferredCons; -+ db->nDeferredImmCons = pSavepoint->nDeferredImmCons; - } - - if( !isTransaction ){ -- rc = sqlite3VtabSavepoint(db, u.at.p1, u.at.iSavepoint); -+ rc = sqlite3VtabSavepoint(db, p1, iSavepoint); - if( rc!=SQLITE_OK ) goto abort_due_to_error; - } - } -@@ -69438,50 +69919,48 @@ case OP_Savepoint: { - ** This instruction causes the VM to halt. - */ - case OP_AutoCommit: { --#if 0 /* local variables moved into u.au */ - int desiredAutoCommit; - int iRollback; - int turnOnAC; --#endif /* local variables moved into u.au */ - -- u.au.desiredAutoCommit = pOp->p1; -- u.au.iRollback = pOp->p2; -- u.au.turnOnAC = u.au.desiredAutoCommit && !db->autoCommit; -- assert( u.au.desiredAutoCommit==1 || u.au.desiredAutoCommit==0 ); -- assert( u.au.desiredAutoCommit==1 || u.au.iRollback==0 ); -+ desiredAutoCommit = pOp->p1; -+ iRollback = pOp->p2; -+ turnOnAC = desiredAutoCommit && !db->autoCommit; -+ assert( desiredAutoCommit==1 || desiredAutoCommit==0 ); -+ assert( desiredAutoCommit==1 || iRollback==0 ); - assert( db->nVdbeActive>0 ); /* At least this one VM is active */ - assert( p->bIsReader ); - - #if 0 -- if( u.au.turnOnAC && u.au.iRollback && db->nVdbeActive>1 ){ -+ if( turnOnAC && iRollback && db->nVdbeActive>1 ){ - /* If this instruction implements a ROLLBACK and other VMs are - ** still running, and a transaction is active, return an error indicating -- ** that the other VMs must complete first. -+ ** that the other VMs must complete first. - */ - sqlite3SetString(&p->zErrMsg, db, "cannot rollback transaction - " - "SQL statements in progress"); - rc = SQLITE_BUSY; - }else - #endif -- if( u.au.turnOnAC && !u.au.iRollback && db->nVdbeWrite>0 ){ -+ if( turnOnAC && !iRollback && db->nVdbeWrite>0 ){ - /* If this instruction implements a COMMIT and other VMs are writing -- ** return an error indicating that the other VMs must complete first. -+ ** return an error indicating that the other VMs must complete first. - */ - sqlite3SetString(&p->zErrMsg, db, "cannot commit transaction - " - "SQL statements in progress"); - rc = SQLITE_BUSY; -- }else if( u.au.desiredAutoCommit!=db->autoCommit ){ -- if( u.au.iRollback ){ -- assert( u.au.desiredAutoCommit==1 ); -+ }else if( desiredAutoCommit!=db->autoCommit ){ -+ if( iRollback ){ -+ assert( desiredAutoCommit==1 ); - sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); - db->autoCommit = 1; - }else if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ - goto vdbe_return; - }else{ -- db->autoCommit = (u8)u.au.desiredAutoCommit; -+ db->autoCommit = (u8)desiredAutoCommit; - if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){ - p->pc = pc; -- db->autoCommit = (u8)(1-u.au.desiredAutoCommit); -+ db->autoCommit = (u8)(1-desiredAutoCommit); - p->rc = rc = SQLITE_BUSY; - goto vdbe_return; - } -@@ -69496,10 +69975,10 @@ case OP_AutoCommit: { - goto vdbe_return; - }else{ - sqlite3SetString(&p->zErrMsg, db, -- (!u.au.desiredAutoCommit)?"cannot start a transaction within a transaction":( -- (u.au.iRollback)?"cannot rollback - no transaction is active": -+ (!desiredAutoCommit)?"cannot start a transaction within a transaction":( -+ (iRollback)?"cannot rollback - no transaction is active": - "cannot commit - no transaction is active")); -- -+ - rc = SQLITE_ERROR; - } - break; -@@ -69537,9 +70016,7 @@ case OP_AutoCommit: { - ** If P2 is zero, then a read-lock is obtained on the database file. - */ - case OP_Transaction: { --#if 0 /* local variables moved into u.av */ - Btree *pBt; --#endif /* local variables moved into u.av */ - - assert( p->bIsReader ); - assert( p->readOnly==0 || pOp->p2==0 ); -@@ -69549,10 +70026,10 @@ case OP_Transaction: { - rc = SQLITE_READONLY; - goto abort_due_to_error; - } -- u.av.pBt = db->aDb[pOp->p1].pBt; -+ pBt = db->aDb[pOp->p1].pBt; - -- if( u.av.pBt ){ -- rc = sqlite3BtreeBeginTrans(u.av.pBt, pOp->p2); -+ if( pBt ){ -+ rc = sqlite3BtreeBeginTrans(pBt, pOp->p2); - if( rc==SQLITE_BUSY ){ - p->pc = pc; - p->rc = rc = SQLITE_BUSY; -@@ -69562,19 +70039,19 @@ case OP_Transaction: { - goto abort_due_to_error; - } - -- if( pOp->p2 && p->usesStmtJournal -- && (db->autoCommit==0 || db->nVdbeRead>1) -+ if( pOp->p2 && p->usesStmtJournal -+ && (db->autoCommit==0 || db->nVdbeRead>1) - ){ -- assert( sqlite3BtreeIsInTrans(u.av.pBt) ); -+ assert( sqlite3BtreeIsInTrans(pBt) ); - if( p->iStatement==0 ){ - assert( db->nStatement>=0 && db->nSavepoint>=0 ); -- db->nStatement++; -+ db->nStatement++; - p->iStatement = db->nSavepoint + db->nStatement; - } - - rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, p->iStatement-1); - if( rc==SQLITE_OK ){ -- rc = sqlite3BtreeBeginStmt(u.av.pBt, p->iStatement); -+ rc = sqlite3BtreeBeginStmt(pBt, p->iStatement); - } - - /* Store the current value of the database handles deferred constraint -@@ -69600,22 +70077,20 @@ case OP_Transaction: { - ** executing this instruction. - */ - case OP_ReadCookie: { /* out2-prerelease */ --#if 0 /* local variables moved into u.aw */ - int iMeta; - int iDb; - int iCookie; --#endif /* local variables moved into u.aw */ - - assert( p->bIsReader ); -- u.aw.iDb = pOp->p1; -- u.aw.iCookie = pOp->p3; -+ iDb = pOp->p1; -+ iCookie = pOp->p3; - assert( pOp->p3=0 && u.aw.iDbnDb ); -- assert( db->aDb[u.aw.iDb].pBt!=0 ); -- assert( (p->btreeMask & (((yDbMask)1)<=0 && iDbnDb ); -+ assert( db->aDb[iDb].pBt!=0 ); -+ assert( (p->btreeMask & (((yDbMask)1)<aDb[u.aw.iDb].pBt, u.aw.iCookie, (u32 *)&u.aw.iMeta); -- pOut->u.i = u.aw.iMeta; -+ sqlite3BtreeGetMeta(db->aDb[iDb].pBt, iCookie, (u32 *)&iMeta); -+ pOut->u.i = iMeta; - break; - } - -@@ -69630,27 +70105,25 @@ case OP_ReadCookie: { /* o - ** A transaction must be started before executing this opcode. - */ - case OP_SetCookie: { /* in3 */ --#if 0 /* local variables moved into u.ax */ - Db *pDb; --#endif /* local variables moved into u.ax */ - assert( pOp->p2p1>=0 && pOp->p1nDb ); - assert( (p->btreeMask & (((yDbMask)1)<p1))!=0 ); - assert( p->readOnly==0 ); -- u.ax.pDb = &db->aDb[pOp->p1]; -- assert( u.ax.pDb->pBt!=0 ); -+ pDb = &db->aDb[pOp->p1]; -+ assert( pDb->pBt!=0 ); - assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) ); - pIn3 = &aMem[pOp->p3]; - sqlite3VdbeMemIntegerify(pIn3); - /* See note about index shifting on OP_ReadCookie */ -- rc = sqlite3BtreeUpdateMeta(u.ax.pDb->pBt, pOp->p2, (int)pIn3->u.i); -+ rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, (int)pIn3->u.i); - if( pOp->p2==BTREE_SCHEMA_VERSION ){ - /* When the schema cookie changes, record the new cookie internally */ -- u.ax.pDb->pSchema->schema_cookie = (int)pIn3->u.i; -+ pDb->pSchema->schema_cookie = (int)pIn3->u.i; - db->flags |= SQLITE_InternChanges; - }else if( pOp->p2==BTREE_FILE_FORMAT ){ - /* Record changes in the file format */ -- u.ax.pDb->pSchema->file_format = (u8)pIn3->u.i; -+ pDb->pSchema->file_format = (u8)pIn3->u.i; - } - if( pOp->p1==1 ){ - /* Invalidate all prepared statements whenever the TEMP database -@@ -69680,27 +70153,25 @@ case OP_SetCookie: { /* in3 */ - ** invoked. - */ - case OP_VerifyCookie: { --#if 0 /* local variables moved into u.ay */ - int iMeta; - int iGen; - Btree *pBt; --#endif /* local variables moved into u.ay */ - - assert( pOp->p1>=0 && pOp->p1nDb ); - assert( (p->btreeMask & (((yDbMask)1)<p1))!=0 ); - assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) ); - assert( p->bIsReader ); -- u.ay.pBt = db->aDb[pOp->p1].pBt; -- if( u.ay.pBt ){ -- sqlite3BtreeGetMeta(u.ay.pBt, BTREE_SCHEMA_VERSION, (u32 *)&u.ay.iMeta); -- u.ay.iGen = db->aDb[pOp->p1].pSchema->iGeneration; -+ pBt = db->aDb[pOp->p1].pBt; -+ if( pBt ){ -+ sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&iMeta); -+ iGen = db->aDb[pOp->p1].pSchema->iGeneration; - }else{ -- u.ay.iGen = u.ay.iMeta = 0; -+ iGen = iMeta = 0; - } -- if( u.ay.iMeta!=pOp->p2 || u.ay.iGen!=pOp->p3 ){ -+ if( iMeta!=pOp->p2 || iGen!=pOp->p3 ){ - sqlite3DbFree(db, p->zErrMsg); - p->zErrMsg = sqlite3DbStrDup(db, "database schema has changed"); -- /* If the schema-cookie from the database file matches the cookie -+ /* If the schema-cookie from the database file matches the cookie - ** stored with the in-memory representation of the schema, do - ** not reload the schema from the database file. - ** -@@ -69710,10 +70181,10 @@ case OP_VerifyCookie: { - ** prepared queries. If such a query is out-of-date, we do not want to - ** discard the database schema, as the user code implementing the - ** v-table would have to be ready for the sqlite3_vtab structure itself -- ** to be invalidated whenever sqlite3_step() is called from within -+ ** to be invalidated whenever sqlite3_step() is called from within - ** a v-table method. - */ -- if( db->aDb[pOp->p1].pSchema->schema_cookie!=u.ay.iMeta ){ -+ if( db->aDb[pOp->p1].pSchema->schema_cookie!=iMeta ){ - sqlite3ResetOneSchema(db, pOp->p1); - } - -@@ -69776,7 +70247,6 @@ case OP_VerifyCookie: { - */ - case OP_OpenRead: - case OP_OpenWrite: { --#if 0 /* local variables moved into u.az */ - int nField; - KeyInfo *pKeyInfo; - int p2; -@@ -69785,7 +70255,6 @@ case OP_OpenWrite: { - Btree *pX; - VdbeCursor *pCur; - Db *pDb; --#endif /* local variables moved into u.az */ - - assert( (pOp->p5&(OPFLAG_P2ISREG|OPFLAG_BULKCSR))==pOp->p5 ); - assert( pOp->opcode==OP_OpenWrite || pOp->p5==0 ); -@@ -69797,60 +70266,60 @@ case OP_OpenWrite: { - break; - } - -- u.az.nField = 0; -- u.az.pKeyInfo = 0; -- u.az.p2 = pOp->p2; -- u.az.iDb = pOp->p3; -- assert( u.az.iDb>=0 && u.az.iDbnDb ); -- assert( (p->btreeMask & (((yDbMask)1)<aDb[u.az.iDb]; -- u.az.pX = u.az.pDb->pBt; -- assert( u.az.pX!=0 ); -+ nField = 0; -+ pKeyInfo = 0; -+ p2 = pOp->p2; -+ iDb = pOp->p3; -+ assert( iDb>=0 && iDbnDb ); -+ assert( (p->btreeMask & (((yDbMask)1)<aDb[iDb]; -+ pX = pDb->pBt; -+ assert( pX!=0 ); - if( pOp->opcode==OP_OpenWrite ){ -- u.az.wrFlag = 1; -- assert( sqlite3SchemaMutexHeld(db, u.az.iDb, 0) ); -- if( u.az.pDb->pSchema->file_format < p->minWriteFileFormat ){ -- p->minWriteFileFormat = u.az.pDb->pSchema->file_format; -+ wrFlag = 1; -+ assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); -+ if( pDb->pSchema->file_format < p->minWriteFileFormat ){ -+ p->minWriteFileFormat = pDb->pSchema->file_format; - } - }else{ -- u.az.wrFlag = 0; -+ wrFlag = 0; - } - if( pOp->p5 & OPFLAG_P2ISREG ){ -- assert( u.az.p2>0 ); -- assert( u.az.p2<=(p->nMem-p->nCursor) ); -- pIn2 = &aMem[u.az.p2]; -+ assert( p2>0 ); -+ assert( p2<=(p->nMem-p->nCursor) ); -+ pIn2 = &aMem[p2]; - assert( memIsValid(pIn2) ); - assert( (pIn2->flags & MEM_Int)!=0 ); - sqlite3VdbeMemIntegerify(pIn2); -- u.az.p2 = (int)pIn2->u.i; -- /* The u.az.p2 value always comes from a prior OP_CreateTable opcode and -- ** that opcode will always set the u.az.p2 value to 2 or more or else fail. -+ p2 = (int)pIn2->u.i; -+ /* The p2 value always comes from a prior OP_CreateTable opcode and -+ ** that opcode will always set the p2 value to 2 or more or else fail. - ** If there were a failure, the prepared statement would have halted - ** before reaching this instruction. */ -- if( NEVER(u.az.p2<2) ) { -+ if( NEVER(p2<2) ) { - rc = SQLITE_CORRUPT_BKPT; - goto abort_due_to_error; - } - } - if( pOp->p4type==P4_KEYINFO ){ -- u.az.pKeyInfo = pOp->p4.pKeyInfo; -- assert( u.az.pKeyInfo->enc==ENC(db) ); -- assert( u.az.pKeyInfo->db==db ); -- u.az.nField = u.az.pKeyInfo->nField+u.az.pKeyInfo->nXField; -+ pKeyInfo = pOp->p4.pKeyInfo; -+ assert( pKeyInfo->enc==ENC(db) ); -+ assert( pKeyInfo->db==db ); -+ nField = pKeyInfo->nField+pKeyInfo->nXField; - }else if( pOp->p4type==P4_INT32 ){ -- u.az.nField = pOp->p4.i; -+ nField = pOp->p4.i; - } - assert( pOp->p1>=0 ); -- assert( u.az.nField>=0 ); -- testcase( u.az.nField==0 ); /* Table with INTEGER PRIMARY KEY and nothing else */ -- u.az.pCur = allocateCursor(p, pOp->p1, u.az.nField, u.az.iDb, 1); -- if( u.az.pCur==0 ) goto no_mem; -- u.az.pCur->nullRow = 1; -- u.az.pCur->isOrdered = 1; -- rc = sqlite3BtreeCursor(u.az.pX, u.az.p2, u.az.wrFlag, u.az.pKeyInfo, u.az.pCur->pCursor); -- u.az.pCur->pKeyInfo = u.az.pKeyInfo; -+ assert( nField>=0 ); -+ testcase( nField==0 ); /* Table with INTEGER PRIMARY KEY and nothing else */ -+ pCur = allocateCursor(p, pOp->p1, nField, iDb, 1); -+ if( pCur==0 ) goto no_mem; -+ pCur->nullRow = 1; -+ pCur->isOrdered = 1; -+ rc = sqlite3BtreeCursor(pX, p2, wrFlag, pKeyInfo, pCur->pCursor); -+ pCur->pKeyInfo = pKeyInfo; - assert( OPFLAG_BULKCSR==BTREE_BULKLOAD ); -- sqlite3BtreeCursorHints(u.az.pCur->pCursor, (pOp->p5 & OPFLAG_BULKCSR)); -+ sqlite3BtreeCursorHints(pCur->pCursor, (pOp->p5 & OPFLAG_BULKCSR)); - - /* Since it performs no memory allocation or IO, the only value that - ** sqlite3BtreeCursor() may return is SQLITE_OK. */ -@@ -69859,8 +70328,8 @@ case OP_OpenWrite: { - /* Set the VdbeCursor.isTable variable. Previous versions of - ** SQLite used to check if the root-page flags were sane at this point - ** and report database corruption if they were not, but this check has -- ** since moved into the btree layer. */ -- u.az.pCur->isTable = pOp->p4type!=P4_KEYINFO; -+ ** since moved into the btree layer. */ -+ pCur->isTable = pOp->p4type!=P4_KEYINFO; - break; - } - -@@ -69892,12 +70361,10 @@ case OP_OpenWrite: { - */ - case OP_OpenAutoindex: - case OP_OpenEphemeral: { --#if 0 /* local variables moved into u.ba */ - VdbeCursor *pCx; - KeyInfo *pKeyInfo; --#endif /* local variables moved into u.ba */ - -- static const int vfsFlags = -+ static const int vfsFlags = - SQLITE_OPEN_READWRITE | - SQLITE_OPEN_CREATE | - SQLITE_OPEN_EXCLUSIVE | -@@ -69905,13 +70372,13 @@ case OP_OpenEphemeral: { - SQLITE_OPEN_TRANSIENT_DB; - assert( pOp->p1>=0 ); - assert( pOp->p2>=0 ); -- u.ba.pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1); -- if( u.ba.pCx==0 ) goto no_mem; -- u.ba.pCx->nullRow = 1; -- rc = sqlite3BtreeOpen(db->pVfs, 0, db, &u.ba.pCx->pBt, -+ pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1); -+ if( pCx==0 ) goto no_mem; -+ pCx->nullRow = 1; -+ rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBt, - BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags); - if( rc==SQLITE_OK ){ -- rc = sqlite3BtreeBeginTrans(u.ba.pCx->pBt, 1); -+ rc = sqlite3BtreeBeginTrans(pCx->pBt, 1); - } - if( rc==SQLITE_OK ){ - /* If a transient index is required, create it by calling -@@ -69919,26 +70386,53 @@ case OP_OpenEphemeral: { - ** opening it. If a transient table is required, just use the - ** automatically created table with root-page 1 (an BLOB_INTKEY table). - */ -- if( (u.ba.pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ -+ if( (pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ - int pgno; - assert( pOp->p4type==P4_KEYINFO ); -- rc = sqlite3BtreeCreateTable(u.ba.pCx->pBt, &pgno, BTREE_BLOBKEY | pOp->p5); -+ rc = sqlite3BtreeCreateTable(pCx->pBt, &pgno, BTREE_BLOBKEY | pOp->p5); - if( rc==SQLITE_OK ){ - assert( pgno==MASTER_ROOT+1 ); -- assert( u.ba.pKeyInfo->db==db ); -- assert( u.ba.pKeyInfo->enc==ENC(db) ); -- u.ba.pCx->pKeyInfo = u.ba.pKeyInfo; -- rc = sqlite3BtreeCursor(u.ba.pCx->pBt, pgno, 1, u.ba.pKeyInfo, u.ba.pCx->pCursor); -+ assert( pKeyInfo->db==db ); -+ assert( pKeyInfo->enc==ENC(db) ); -+ pCx->pKeyInfo = pKeyInfo; -+ rc = sqlite3BtreeCursor(pCx->pBt, pgno, 1, pKeyInfo, pCx->pCursor); - } -- u.ba.pCx->isTable = 0; -+ pCx->isTable = 0; - }else{ -- rc = sqlite3BtreeCursor(u.ba.pCx->pBt, MASTER_ROOT, 1, 0, u.ba.pCx->pCursor); -- u.ba.pCx->isTable = 1; -+ rc = sqlite3BtreeCursor(pCx->pBt, MASTER_ROOT, 1, 0, pCx->pCursor); -+ pCx->isTable = 1; - } - } -- u.ba.pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); -+ pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); -+ break; -+} -+ -+#ifndef SQLITE_OMIT_CTE -+/* Opcode: SwapCursors P1 P2 * * * -+** -+** Parameters P1 and P2 are both cursors opened by the OpenEphemeral -+** opcode. This opcode deletes the contents of epheremal table P1, -+** then renames P2 to P1 and P1 to P2. In other words, following this -+** opcode cursor P2 is open on an empty table and P1 is open on the -+** table that was initially accessed by P2. -+*/ -+case OP_SwapCursors: { -+ Mem tmp; -+ VdbeCursor *pTmp; -+ -+ tmp = p->aMem[p->nMem - pOp->p1]; -+ p->aMem[p->nMem - pOp->p1] = p->aMem[p->nMem - pOp->p2]; -+ p->aMem[p->nMem - pOp->p2] = tmp; -+ -+ pTmp = p->apCsr[pOp->p1]; -+ p->apCsr[pOp->p1] = p->apCsr[pOp->p2]; -+ p->apCsr[pOp->p2] = pTmp; -+ -+ assert( pTmp->isTable ); -+ rc = sqlite3BtreeClearTable(pTmp->pBt, MASTER_ROOT, 0); - break; - } -+#endif /* ifndef SQLITE_OMIT_CTE */ - - /* Opcode: SorterOpen P1 * * P4 * - ** -@@ -69947,18 +70441,16 @@ case OP_OpenEphemeral: { - ** tables using an external merge-sort algorithm. - */ - case OP_SorterOpen: { --#if 0 /* local variables moved into u.bb */ - VdbeCursor *pCx; --#endif /* local variables moved into u.bb */ - - assert( pOp->p1>=0 ); - assert( pOp->p2>=0 ); -- u.bb.pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1); -- if( u.bb.pCx==0 ) goto no_mem; -- u.bb.pCx->pKeyInfo = pOp->p4.pKeyInfo; -- assert( u.bb.pCx->pKeyInfo->db==db ); -- assert( u.bb.pCx->pKeyInfo->enc==ENC(db) ); -- rc = sqlite3VdbeSorterInit(db, u.bb.pCx); -+ pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1); -+ if( pCx==0 ) goto no_mem; -+ pCx->pKeyInfo = pOp->p4.pKeyInfo; -+ assert( pCx->pKeyInfo->db==db ); -+ assert( pCx->pKeyInfo->enc==ENC(db) ); -+ rc = sqlite3VdbeSorterInit(db, pCx); - break; - } - -@@ -69980,18 +70472,16 @@ case OP_SorterOpen: { - ** the pseudo-table. - */ - case OP_OpenPseudo: { --#if 0 /* local variables moved into u.bc */ - VdbeCursor *pCx; --#endif /* local variables moved into u.bc */ - - assert( pOp->p1>=0 ); - assert( pOp->p3>=0 ); -- u.bc.pCx = allocateCursor(p, pOp->p1, pOp->p3, -1, 0); -- if( u.bc.pCx==0 ) goto no_mem; -- u.bc.pCx->nullRow = 1; -- u.bc.pCx->pseudoTableReg = pOp->p2; -- u.bc.pCx->isTable = 1; -- u.bc.pCx->multiPseudo = pOp->p5; -+ pCx = allocateCursor(p, pOp->p1, pOp->p3, -1, 0); -+ if( pCx==0 ) goto no_mem; -+ pCx->nullRow = 1; -+ pCx->pseudoTableReg = pOp->p2; -+ pCx->isTable = 1; -+ pCx->multiPseudo = pOp->p5; - break; - } - -@@ -70067,35 +70557,33 @@ case OP_SeekLt: /* jump, in3 */ - case OP_SeekLe: /* jump, in3 */ - case OP_SeekGe: /* jump, in3 */ - case OP_SeekGt: { /* jump, in3 */ --#if 0 /* local variables moved into u.bd */ - int res; - int oc; - VdbeCursor *pC; - UnpackedRecord r; - int nField; - i64 iKey; /* The rowid we are to seek to */ --#endif /* local variables moved into u.bd */ - - assert( pOp->p1>=0 && pOp->p1nCursor ); - assert( pOp->p2!=0 ); -- u.bd.pC = p->apCsr[pOp->p1]; -- assert( u.bd.pC!=0 ); -- assert( u.bd.pC->pseudoTableReg==0 ); -+ pC = p->apCsr[pOp->p1]; -+ assert( pC!=0 ); -+ assert( pC->pseudoTableReg==0 ); - assert( OP_SeekLe == OP_SeekLt+1 ); - assert( OP_SeekGe == OP_SeekLt+2 ); - assert( OP_SeekGt == OP_SeekLt+3 ); -- assert( u.bd.pC->isOrdered ); -- assert( u.bd.pC->pCursor!=0 ); -- u.bd.oc = pOp->opcode; -- u.bd.pC->nullRow = 0; -- if( u.bd.pC->isTable ){ -+ assert( pC->isOrdered ); -+ assert( pC->pCursor!=0 ); -+ oc = pOp->opcode; -+ pC->nullRow = 0; -+ if( pC->isTable ){ - /* The input value in P3 might be of any type: integer, real, string, - ** blob, or NULL. But it needs to be an integer before we can do - ** the seek, so covert it. */ - pIn3 = &aMem[pOp->p3]; - applyNumericAffinity(pIn3); -- u.bd.iKey = sqlite3VdbeIntValue(pIn3); -- u.bd.pC->rowidIsValid = 0; -+ iKey = sqlite3VdbeIntValue(pIn3); -+ pC->rowidIsValid = 0; - - /* If the P3 value could not be converted into an integer without - ** loss of information, then special processing is required... */ -@@ -70107,96 +70595,96 @@ case OP_SeekGt: { /* jump, in3 */ - break; - } - -- /* If the approximation u.bd.iKey is larger than the actual real search -+ /* If the approximation iKey is larger than the actual real search - ** term, substitute >= for > and < for <=. e.g. if the search term - ** is 4.9 and the integer approximation 5: - ** - ** (x > 4.9) -> (x >= 5) - ** (x <= 4.9) -> (x < 5) - */ -- if( pIn3->r<(double)u.bd.iKey ){ -+ if( pIn3->r<(double)iKey ){ - assert( OP_SeekGe==(OP_SeekGt-1) ); - assert( OP_SeekLt==(OP_SeekLe-1) ); - assert( (OP_SeekLe & 0x0001)==(OP_SeekGt & 0x0001) ); -- if( (u.bd.oc & 0x0001)==(OP_SeekGt & 0x0001) ) u.bd.oc--; -+ if( (oc & 0x0001)==(OP_SeekGt & 0x0001) ) oc--; - } - -- /* If the approximation u.bd.iKey is smaller than the actual real search -+ /* If the approximation iKey is smaller than the actual real search - ** term, substitute <= for < and > for >=. */ -- else if( pIn3->r>(double)u.bd.iKey ){ -+ else if( pIn3->r>(double)iKey ){ - assert( OP_SeekLe==(OP_SeekLt+1) ); - assert( OP_SeekGt==(OP_SeekGe+1) ); - assert( (OP_SeekLt & 0x0001)==(OP_SeekGe & 0x0001) ); -- if( (u.bd.oc & 0x0001)==(OP_SeekLt & 0x0001) ) u.bd.oc++; -+ if( (oc & 0x0001)==(OP_SeekLt & 0x0001) ) oc++; - } -- } -- rc = sqlite3BtreeMovetoUnpacked(u.bd.pC->pCursor, 0, (u64)u.bd.iKey, 0, &u.bd.res); -+ } -+ rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, 0, (u64)iKey, 0, &res); - if( rc!=SQLITE_OK ){ - goto abort_due_to_error; - } -- if( u.bd.res==0 ){ -- u.bd.pC->rowidIsValid = 1; -- u.bd.pC->lastRowid = u.bd.iKey; -+ if( res==0 ){ -+ pC->rowidIsValid = 1; -+ pC->lastRowid = iKey; - } - }else{ -- u.bd.nField = pOp->p4.i; -+ nField = pOp->p4.i; - assert( pOp->p4type==P4_INT32 ); -- assert( u.bd.nField>0 ); -- u.bd.r.pKeyInfo = u.bd.pC->pKeyInfo; -- u.bd.r.nField = (u16)u.bd.nField; -+ assert( nField>0 ); -+ r.pKeyInfo = pC->pKeyInfo; -+ r.nField = (u16)nField; - - /* The next line of code computes as follows, only faster: -- ** if( u.bd.oc==OP_SeekGt || u.bd.oc==OP_SeekLe ){ -- ** u.bd.r.flags = UNPACKED_INCRKEY; -+ ** if( oc==OP_SeekGt || oc==OP_SeekLe ){ -+ ** r.flags = UNPACKED_INCRKEY; - ** }else{ -- ** u.bd.r.flags = 0; -+ ** r.flags = 0; - ** } - */ -- u.bd.r.flags = (u8)(UNPACKED_INCRKEY * (1 & (u.bd.oc - OP_SeekLt))); -- assert( u.bd.oc!=OP_SeekGt || u.bd.r.flags==UNPACKED_INCRKEY ); -- assert( u.bd.oc!=OP_SeekLe || u.bd.r.flags==UNPACKED_INCRKEY ); -- assert( u.bd.oc!=OP_SeekGe || u.bd.r.flags==0 ); -- assert( u.bd.oc!=OP_SeekLt || u.bd.r.flags==0 ); -+ r.flags = (u8)(UNPACKED_INCRKEY * (1 & (oc - OP_SeekLt))); -+ assert( oc!=OP_SeekGt || r.flags==UNPACKED_INCRKEY ); -+ assert( oc!=OP_SeekLe || r.flags==UNPACKED_INCRKEY ); -+ assert( oc!=OP_SeekGe || r.flags==0 ); -+ assert( oc!=OP_SeekLt || r.flags==0 ); - -- u.bd.r.aMem = &aMem[pOp->p3]; -+ r.aMem = &aMem[pOp->p3]; - #ifdef SQLITE_DEBUG -- { int i; for(i=0; ipCursor, &u.bd.r, 0, 0, &u.bd.res); -+ ExpandBlob(r.aMem); -+ rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, &r, 0, 0, &res); - if( rc!=SQLITE_OK ){ - goto abort_due_to_error; - } -- u.bd.pC->rowidIsValid = 0; -+ pC->rowidIsValid = 0; - } -- u.bd.pC->deferredMoveto = 0; -- u.bd.pC->cacheStatus = CACHE_STALE; -+ pC->deferredMoveto = 0; -+ pC->cacheStatus = CACHE_STALE; - #ifdef SQLITE_TEST - sqlite3_search_count++; - #endif -- if( u.bd.oc>=OP_SeekGe ){ assert( u.bd.oc==OP_SeekGe || u.bd.oc==OP_SeekGt ); -- if( u.bd.res<0 || (u.bd.res==0 && u.bd.oc==OP_SeekGt) ){ -- rc = sqlite3BtreeNext(u.bd.pC->pCursor, &u.bd.res); -+ if( oc>=OP_SeekGe ){ assert( oc==OP_SeekGe || oc==OP_SeekGt ); -+ if( res<0 || (res==0 && oc==OP_SeekGt) ){ -+ rc = sqlite3BtreeNext(pC->pCursor, &res); - if( rc!=SQLITE_OK ) goto abort_due_to_error; -- u.bd.pC->rowidIsValid = 0; -+ pC->rowidIsValid = 0; - }else{ -- u.bd.res = 0; -+ res = 0; - } - }else{ -- assert( u.bd.oc==OP_SeekLt || u.bd.oc==OP_SeekLe ); -- if( u.bd.res>0 || (u.bd.res==0 && u.bd.oc==OP_SeekLt) ){ -- rc = sqlite3BtreePrevious(u.bd.pC->pCursor, &u.bd.res); -+ assert( oc==OP_SeekLt || oc==OP_SeekLe ); -+ if( res>0 || (res==0 && oc==OP_SeekLt) ){ -+ rc = sqlite3BtreePrevious(pC->pCursor, &res); - if( rc!=SQLITE_OK ) goto abort_due_to_error; -- u.bd.pC->rowidIsValid = 0; -+ pC->rowidIsValid = 0; - }else{ -- /* u.bd.res might be negative because the table is empty. Check to -+ /* res might be negative because the table is empty. Check to - ** see if this is the case. - */ -- u.bd.res = sqlite3BtreeEof(u.bd.pC->pCursor); -+ res = sqlite3BtreeEof(pC->pCursor); - } - } - assert( pOp->p2>0 ); -- if( u.bd.res ){ -+ if( res ){ - pc = pOp->p2 - 1; - } - break; -@@ -70213,20 +70701,18 @@ case OP_SeekGt: { /* jump, in3 */ - ** occur, no unnecessary I/O happens. - */ - case OP_Seek: { /* in2 */ --#if 0 /* local variables moved into u.be */ - VdbeCursor *pC; --#endif /* local variables moved into u.be */ - - assert( pOp->p1>=0 && pOp->p1nCursor ); -- u.be.pC = p->apCsr[pOp->p1]; -- assert( u.be.pC!=0 ); -- assert( u.be.pC->pCursor!=0 ); -- assert( u.be.pC->isTable ); -- u.be.pC->nullRow = 0; -+ pC = p->apCsr[pOp->p1]; -+ assert( pC!=0 ); -+ assert( pC->pCursor!=0 ); -+ assert( pC->isTable ); -+ pC->nullRow = 0; - pIn2 = &aMem[pOp->p2]; -- u.be.pC->movetoTarget = sqlite3VdbeIntValue(pIn2); -- u.be.pC->rowidIsValid = 0; -- u.be.pC->deferredMoveto = 1; -+ pC->movetoTarget = sqlite3VdbeIntValue(pIn2); -+ pC->rowidIsValid = 0; -+ pC->deferredMoveto = 1; - break; - } - -@@ -70281,7 +70767,6 @@ case OP_Seek: { /* in2 */ - case OP_NoConflict: /* jump, in3 */ - case OP_NotFound: /* jump, in3 */ - case OP_Found: { /* jump, in3 */ --#if 0 /* local variables moved into u.bf */ - int alreadyExists; - int ii; - VdbeCursor *pC; -@@ -70290,72 +70775,71 @@ case OP_Found: { /* jump, in3 */ - UnpackedRecord *pIdxKey; - UnpackedRecord r; - char aTempRec[ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*4 + 7]; --#endif /* local variables moved into u.bf */ - - #ifdef SQLITE_TEST - if( pOp->opcode!=OP_NoConflict ) sqlite3_found_count++; - #endif - -- u.bf.alreadyExists = 0; - assert( pOp->p1>=0 && pOp->p1nCursor ); - assert( pOp->p4type==P4_INT32 ); -- u.bf.pC = p->apCsr[pOp->p1]; -- assert( u.bf.pC!=0 ); -+ pC = p->apCsr[pOp->p1]; -+ assert( pC!=0 ); - pIn3 = &aMem[pOp->p3]; -- assert( u.bf.pC->pCursor!=0 ); -- assert( u.bf.pC->isTable==0 ); -+ assert( pC->pCursor!=0 ); -+ assert( pC->isTable==0 ); -+ pFree = 0; /* Not needed. Only used to suppress a compiler warning. */ - if( pOp->p4.i>0 ){ -- u.bf.r.pKeyInfo = u.bf.pC->pKeyInfo; -- u.bf.r.nField = (u16)pOp->p4.i; -- u.bf.r.aMem = pIn3; -+ r.pKeyInfo = pC->pKeyInfo; -+ r.nField = (u16)pOp->p4.i; -+ r.aMem = pIn3; - #ifdef SQLITE_DEBUG - { - int i; -- for(i=0; ip3+i, &u.bf.r.aMem[i]); -+ for(i=0; ip3+i, &r.aMem[i]); - } - } - #endif -- u.bf.r.flags = UNPACKED_PREFIX_MATCH; -- u.bf.pIdxKey = &u.bf.r; -+ r.flags = UNPACKED_PREFIX_MATCH; -+ pIdxKey = &r; - }else{ -- u.bf.pIdxKey = sqlite3VdbeAllocUnpackedRecord( -- u.bf.pC->pKeyInfo, u.bf.aTempRec, sizeof(u.bf.aTempRec), &u.bf.pFree -- ); -- if( u.bf.pIdxKey==0 ) goto no_mem; -+ pIdxKey = sqlite3VdbeAllocUnpackedRecord( -+ pC->pKeyInfo, aTempRec, sizeof(aTempRec), &pFree -+ ); -+ if( pIdxKey==0 ) goto no_mem; - assert( pIn3->flags & MEM_Blob ); - assert( (pIn3->flags & MEM_Zero)==0 ); /* zeroblobs already expanded */ -- sqlite3VdbeRecordUnpack(u.bf.pC->pKeyInfo, pIn3->n, pIn3->z, u.bf.pIdxKey); -- u.bf.pIdxKey->flags |= UNPACKED_PREFIX_MATCH; -+ sqlite3VdbeRecordUnpack(pC->pKeyInfo, pIn3->n, pIn3->z, pIdxKey); -+ pIdxKey->flags |= UNPACKED_PREFIX_MATCH; - } - if( pOp->opcode==OP_NoConflict ){ - /* For the OP_NoConflict opcode, take the jump if any of the - ** input fields are NULL, since any key with a NULL will not - ** conflict */ -- for(u.bf.ii=0; u.bf.iip2 - 1; - break; - } - } - } -- rc = sqlite3BtreeMovetoUnpacked(u.bf.pC->pCursor, u.bf.pIdxKey, 0, 0, &u.bf.res); -+ rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, pIdxKey, 0, 0, &res); - if( pOp->p4.i==0 ){ -- sqlite3DbFree(db, u.bf.pFree); -+ sqlite3DbFree(db, pFree); - } - if( rc!=SQLITE_OK ){ - break; - } -- u.bf.pC->seekResult = u.bf.res; -- u.bf.alreadyExists = (u.bf.res==0); -- u.bf.pC->nullRow = 1-u.bf.alreadyExists; -- u.bf.pC->deferredMoveto = 0; -- u.bf.pC->cacheStatus = CACHE_STALE; -+ pC->seekResult = res; -+ alreadyExists = (res==0); -+ pC->nullRow = 1-alreadyExists; -+ pC->deferredMoveto = 0; -+ pC->cacheStatus = CACHE_STALE; - if( pOp->opcode==OP_Found ){ -- if( u.bf.alreadyExists ) pc = pOp->p2 - 1; -+ if( alreadyExists ) pc = pOp->p2 - 1; - }else{ -- if( !u.bf.alreadyExists ) pc = pOp->p2 - 1; -+ if( !alreadyExists ) pc = pOp->p2 - 1; - } - break; - } -@@ -70375,35 +70859,33 @@ case OP_Found: { /* jump, in3 */ - ** See also: Found, NotFound, NoConflict - */ - case OP_NotExists: { /* jump, in3 */ --#if 0 /* local variables moved into u.bg */ - VdbeCursor *pC; - BtCursor *pCrsr; - int res; - u64 iKey; --#endif /* local variables moved into u.bg */ - - pIn3 = &aMem[pOp->p3]; - assert( pIn3->flags & MEM_Int ); - assert( pOp->p1>=0 && pOp->p1nCursor ); -- u.bg.pC = p->apCsr[pOp->p1]; -- assert( u.bg.pC!=0 ); -- assert( u.bg.pC->isTable ); -- assert( u.bg.pC->pseudoTableReg==0 ); -- u.bg.pCrsr = u.bg.pC->pCursor; -- assert( u.bg.pCrsr!=0 ); -- u.bg.res = 0; -- u.bg.iKey = pIn3->u.i; -- rc = sqlite3BtreeMovetoUnpacked(u.bg.pCrsr, 0, u.bg.iKey, 0, &u.bg.res); -- u.bg.pC->lastRowid = pIn3->u.i; -- u.bg.pC->rowidIsValid = u.bg.res==0 ?1:0; -- u.bg.pC->nullRow = 0; -- u.bg.pC->cacheStatus = CACHE_STALE; -- u.bg.pC->deferredMoveto = 0; -- if( u.bg.res!=0 ){ -+ pC = p->apCsr[pOp->p1]; -+ assert( pC!=0 ); -+ assert( pC->isTable ); -+ assert( pC->pseudoTableReg==0 ); -+ pCrsr = pC->pCursor; -+ assert( pCrsr!=0 ); -+ res = 0; -+ iKey = pIn3->u.i; -+ rc = sqlite3BtreeMovetoUnpacked(pCrsr, 0, iKey, 0, &res); -+ pC->lastRowid = pIn3->u.i; -+ pC->rowidIsValid = res==0 ?1:0; -+ pC->nullRow = 0; -+ pC->cacheStatus = CACHE_STALE; -+ pC->deferredMoveto = 0; -+ if( res!=0 ){ - pc = pOp->p2 - 1; -- assert( u.bg.pC->rowidIsValid==0 ); -+ assert( pC->rowidIsValid==0 ); - } -- u.bg.pC->seekResult = u.bg.res; -+ pC->seekResult = res; - break; - } - -@@ -70439,21 +70921,19 @@ case OP_Sequence: { /* out2-pr - ** AUTOINCREMENT feature. - */ - case OP_NewRowid: { /* out2-prerelease */ --#if 0 /* local variables moved into u.bh */ - i64 v; /* The new rowid */ - VdbeCursor *pC; /* Cursor of table to get the new rowid */ - int res; /* Result of an sqlite3BtreeLast() */ - int cnt; /* Counter to limit the number of searches */ - Mem *pMem; /* Register holding largest rowid for AUTOINCREMENT */ - VdbeFrame *pFrame; /* Root frame of VDBE */ --#endif /* local variables moved into u.bh */ - -- u.bh.v = 0; -- u.bh.res = 0; -+ v = 0; -+ res = 0; - assert( pOp->p1>=0 && pOp->p1nCursor ); -- u.bh.pC = p->apCsr[pOp->p1]; -- assert( u.bh.pC!=0 ); -- if( NEVER(u.bh.pC->pCursor==0) ){ -+ pC = p->apCsr[pOp->p1]; -+ assert( pC!=0 ); -+ if( NEVER(pC->pCursor==0) ){ - /* The zero initialization above is all that is needed */ - }else{ - /* The next rowid or record number (different terms for the same -@@ -70469,7 +70949,7 @@ case OP_NewRowid: { /* out2-pr - ** succeeded. If the random rowid does exist, we select a new one - ** and try again, up to 100 times. - */ -- assert( u.bh.pC->isTable ); -+ assert( pC->isTable ); - - #ifdef SQLITE_32BIT_ROWID - # define MAX_ROWID 0x7fffffff -@@ -70481,23 +70961,23 @@ case OP_NewRowid: { /* out2-pr - # define MAX_ROWID (i64)( (((u64)0x7fffffff)<<32) | (u64)0xffffffff ) - #endif - -- if( !u.bh.pC->useRandomRowid ){ -- u.bh.v = sqlite3BtreeGetCachedRowid(u.bh.pC->pCursor); -- if( u.bh.v==0 ){ -- rc = sqlite3BtreeLast(u.bh.pC->pCursor, &u.bh.res); -+ if( !pC->useRandomRowid ){ -+ v = sqlite3BtreeGetCachedRowid(pC->pCursor); -+ if( v==0 ){ -+ rc = sqlite3BtreeLast(pC->pCursor, &res); - if( rc!=SQLITE_OK ){ - goto abort_due_to_error; - } -- if( u.bh.res ){ -- u.bh.v = 1; /* IMP: R-61914-48074 */ -+ if( res ){ -+ v = 1; /* IMP: R-61914-48074 */ - }else{ -- assert( sqlite3BtreeCursorIsValid(u.bh.pC->pCursor) ); -- rc = sqlite3BtreeKeySize(u.bh.pC->pCursor, &u.bh.v); -+ assert( sqlite3BtreeCursorIsValid(pC->pCursor) ); -+ rc = sqlite3BtreeKeySize(pC->pCursor, &v); - assert( rc==SQLITE_OK ); /* Cannot fail following BtreeLast() */ -- if( u.bh.v>=MAX_ROWID ){ -- u.bh.pC->useRandomRowid = 1; -+ if( v>=MAX_ROWID ){ -+ pC->useRandomRowid = 1; - }else{ -- u.bh.v++; /* IMP: R-29538-34987 */ -+ v++; /* IMP: R-29538-34987 */ - } - } - } -@@ -70507,35 +70987,35 @@ case OP_NewRowid: { /* out2-pr - /* Assert that P3 is a valid memory cell. */ - assert( pOp->p3>0 ); - if( p->pFrame ){ -- for(u.bh.pFrame=p->pFrame; u.bh.pFrame->pParent; u.bh.pFrame=u.bh.pFrame->pParent); -+ for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent); - /* Assert that P3 is a valid memory cell. */ -- assert( pOp->p3<=u.bh.pFrame->nMem ); -- u.bh.pMem = &u.bh.pFrame->aMem[pOp->p3]; -+ assert( pOp->p3<=pFrame->nMem ); -+ pMem = &pFrame->aMem[pOp->p3]; - }else{ - /* Assert that P3 is a valid memory cell. */ - assert( pOp->p3<=(p->nMem-p->nCursor) ); -- u.bh.pMem = &aMem[pOp->p3]; -- memAboutToChange(p, u.bh.pMem); -+ pMem = &aMem[pOp->p3]; -+ memAboutToChange(p, pMem); - } -- assert( memIsValid(u.bh.pMem) ); -+ assert( memIsValid(pMem) ); - -- REGISTER_TRACE(pOp->p3, u.bh.pMem); -- sqlite3VdbeMemIntegerify(u.bh.pMem); -- assert( (u.bh.pMem->flags & MEM_Int)!=0 ); /* mem(P3) holds an integer */ -- if( u.bh.pMem->u.i==MAX_ROWID || u.bh.pC->useRandomRowid ){ -+ REGISTER_TRACE(pOp->p3, pMem); -+ sqlite3VdbeMemIntegerify(pMem); -+ assert( (pMem->flags & MEM_Int)!=0 ); /* mem(P3) holds an integer */ -+ if( pMem->u.i==MAX_ROWID || pC->useRandomRowid ){ - rc = SQLITE_FULL; /* IMP: R-12275-61338 */ - goto abort_due_to_error; - } -- if( u.bh.vu.i+1 ){ -- u.bh.v = u.bh.pMem->u.i + 1; -+ if( vu.i+1 ){ -+ v = pMem->u.i + 1; - } -- u.bh.pMem->u.i = u.bh.v; -+ pMem->u.i = v; - } - #endif - -- sqlite3BtreeSetCachedRowid(u.bh.pC->pCursor, u.bh.vpCursor, vuseRandomRowid ){ -+ if( pC->useRandomRowid ){ - /* IMPLEMENTATION-OF: R-07677-41881 If the largest ROWID is equal to the - ** largest possible integer (9223372036854775807) then the database - ** engine starts picking positive candidate ROWIDs at random until -@@ -70543,35 +71023,35 @@ case OP_NewRowid: { /* out2-pr - assert( pOp->p3==0 ); /* We cannot be in random rowid mode if this is - ** an AUTOINCREMENT table. */ - /* on the first attempt, simply do one more than previous */ -- u.bh.v = lastRowid; -- u.bh.v &= (MAX_ROWID>>1); /* ensure doesn't go negative */ -- u.bh.v++; /* ensure non-zero */ -- u.bh.cnt = 0; -- while( ((rc = sqlite3BtreeMovetoUnpacked(u.bh.pC->pCursor, 0, (u64)u.bh.v, -- 0, &u.bh.res))==SQLITE_OK) -- && (u.bh.res==0) -- && (++u.bh.cnt<100)){ -+ v = lastRowid; -+ v &= (MAX_ROWID>>1); /* ensure doesn't go negative */ -+ v++; /* ensure non-zero */ -+ cnt = 0; -+ while( ((rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, 0, (u64)v, -+ 0, &res))==SQLITE_OK) -+ && (res==0) -+ && (++cnt<100)){ - /* collision - try another random rowid */ -- sqlite3_randomness(sizeof(u.bh.v), &u.bh.v); -- if( u.bh.cnt<5 ){ -+ sqlite3_randomness(sizeof(v), &v); -+ if( cnt<5 ){ - /* try "small" random rowids for the initial attempts */ -- u.bh.v &= 0xffffff; -+ v &= 0xffffff; - }else{ -- u.bh.v &= (MAX_ROWID>>1); /* ensure doesn't go negative */ -+ v &= (MAX_ROWID>>1); /* ensure doesn't go negative */ - } -- u.bh.v++; /* ensure non-zero */ -+ v++; /* ensure non-zero */ - } -- if( rc==SQLITE_OK && u.bh.res==0 ){ -+ if( rc==SQLITE_OK && res==0 ){ - rc = SQLITE_FULL; /* IMP: R-38219-53002 */ - goto abort_due_to_error; - } -- assert( u.bh.v>0 ); /* EV: R-40812-03570 */ -+ assert( v>0 ); /* EV: R-40812-03570 */ - } -- u.bh.pC->rowidIsValid = 0; -- u.bh.pC->deferredMoveto = 0; -- u.bh.pC->cacheStatus = CACHE_STALE; -+ pC->rowidIsValid = 0; -+ pC->deferredMoveto = 0; -+ pC->cacheStatus = CACHE_STALE; - } -- pOut->u.i = u.bh.v; -+ pOut->u.i = v; - break; - } - -@@ -70623,7 +71103,6 @@ case OP_NewRowid: { /* out2-pr - */ - case OP_Insert: - case OP_InsertInt: { --#if 0 /* local variables moved into u.bi */ - Mem *pData; /* MEM cell holding data for the record to be inserted */ - Mem *pKey; /* MEM cell holding key for the record */ - i64 iKey; /* The integer ROWID or key for the record to be inserted */ -@@ -70633,60 +71112,59 @@ case OP_InsertInt: { - const char *zDb; /* database name - used by the update hook */ - const char *zTbl; /* Table name - used by the opdate hook */ - int op; /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */ --#endif /* local variables moved into u.bi */ - -- u.bi.pData = &aMem[pOp->p2]; -+ pData = &aMem[pOp->p2]; - assert( pOp->p1>=0 && pOp->p1nCursor ); -- assert( memIsValid(u.bi.pData) ); -- u.bi.pC = p->apCsr[pOp->p1]; -- assert( u.bi.pC!=0 ); -- assert( u.bi.pC->pCursor!=0 ); -- assert( u.bi.pC->pseudoTableReg==0 ); -- assert( u.bi.pC->isTable ); -- REGISTER_TRACE(pOp->p2, u.bi.pData); -+ assert( memIsValid(pData) ); -+ pC = p->apCsr[pOp->p1]; -+ assert( pC!=0 ); -+ assert( pC->pCursor!=0 ); -+ assert( pC->pseudoTableReg==0 ); -+ assert( pC->isTable ); -+ REGISTER_TRACE(pOp->p2, pData); - - if( pOp->opcode==OP_Insert ){ -- u.bi.pKey = &aMem[pOp->p3]; -- assert( u.bi.pKey->flags & MEM_Int ); -- assert( memIsValid(u.bi.pKey) ); -- REGISTER_TRACE(pOp->p3, u.bi.pKey); -- u.bi.iKey = u.bi.pKey->u.i; -+ pKey = &aMem[pOp->p3]; -+ assert( pKey->flags & MEM_Int ); -+ assert( memIsValid(pKey) ); -+ REGISTER_TRACE(pOp->p3, pKey); -+ iKey = pKey->u.i; - }else{ - assert( pOp->opcode==OP_InsertInt ); -- u.bi.iKey = pOp->p3; -+ iKey = pOp->p3; - } - - if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++; -- if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = lastRowid = u.bi.iKey; -- if( u.bi.pData->flags & MEM_Null ){ -- u.bi.pData->z = 0; -- u.bi.pData->n = 0; -- }else{ -- assert( u.bi.pData->flags & (MEM_Blob|MEM_Str) ); -- } -- u.bi.seekResult = ((pOp->p5 & OPFLAG_USESEEKRESULT) ? u.bi.pC->seekResult : 0); -- if( u.bi.pData->flags & MEM_Zero ){ -- u.bi.nZero = u.bi.pData->u.nZero; -- }else{ -- u.bi.nZero = 0; -- } -- sqlite3BtreeSetCachedRowid(u.bi.pC->pCursor, 0); -- rc = sqlite3BtreeInsert(u.bi.pC->pCursor, 0, u.bi.iKey, -- u.bi.pData->z, u.bi.pData->n, u.bi.nZero, -- (pOp->p5 & OPFLAG_APPEND)!=0, u.bi.seekResult -+ if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = lastRowid = iKey; -+ if( pData->flags & MEM_Null ){ -+ pData->z = 0; -+ pData->n = 0; -+ }else{ -+ assert( pData->flags & (MEM_Blob|MEM_Str) ); -+ } -+ seekResult = ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0); -+ if( pData->flags & MEM_Zero ){ -+ nZero = pData->u.nZero; -+ }else{ -+ nZero = 0; -+ } -+ sqlite3BtreeSetCachedRowid(pC->pCursor, 0); -+ rc = sqlite3BtreeInsert(pC->pCursor, 0, iKey, -+ pData->z, pData->n, nZero, -+ (pOp->p5 & OPFLAG_APPEND)!=0, seekResult - ); -- u.bi.pC->rowidIsValid = 0; -- u.bi.pC->deferredMoveto = 0; -- u.bi.pC->cacheStatus = CACHE_STALE; -+ pC->rowidIsValid = 0; -+ pC->deferredMoveto = 0; -+ pC->cacheStatus = CACHE_STALE; - - /* Invoke the update-hook if required. */ - if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z ){ -- u.bi.zDb = db->aDb[u.bi.pC->iDb].zName; -- u.bi.zTbl = pOp->p4.z; -- u.bi.op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT); -- assert( u.bi.pC->isTable ); -- db->xUpdateCallback(db->pUpdateArg, u.bi.op, u.bi.zDb, u.bi.zTbl, u.bi.iKey); -- assert( u.bi.pC->iDb>=0 ); -+ zDb = db->aDb[pC->iDb].zName; -+ zTbl = pOp->p4.z; -+ op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT); -+ assert( pC->isTable ); -+ db->xUpdateCallback(db->pUpdateArg, op, zDb, zTbl, iKey); -+ assert( pC->iDb>=0 ); - } - break; - } -@@ -70712,37 +71190,35 @@ case OP_InsertInt: { - ** using OP_NotFound prior to invoking this opcode. - */ - case OP_Delete: { --#if 0 /* local variables moved into u.bj */ - i64 iKey; - VdbeCursor *pC; --#endif /* local variables moved into u.bj */ - - assert( pOp->p1>=0 && pOp->p1nCursor ); -- u.bj.pC = p->apCsr[pOp->p1]; -- assert( u.bj.pC!=0 ); -- assert( u.bj.pC->pCursor!=0 ); /* Only valid for real tables, no pseudotables */ -- u.bj.iKey = u.bj.pC->lastRowid; /* Only used for the update hook */ -+ pC = p->apCsr[pOp->p1]; -+ assert( pC!=0 ); -+ assert( pC->pCursor!=0 ); /* Only valid for real tables, no pseudotables */ -+ iKey = pC->lastRowid; /* Only used for the update hook */ - - /* The OP_Delete opcode always follows an OP_NotExists or OP_Last or - ** OP_Column on the same table without any intervening operations that -- ** might move or invalidate the cursor. Hence cursor u.bj.pC is always pointing -+ ** might move or invalidate the cursor. Hence cursor pC is always pointing - ** to the row to be deleted and the sqlite3VdbeCursorMoveto() operation - ** below is always a no-op and cannot fail. We will run it anyhow, though, - ** to guard against future changes to the code generator. - **/ -- assert( u.bj.pC->deferredMoveto==0 ); -- rc = sqlite3VdbeCursorMoveto(u.bj.pC); -+ assert( pC->deferredMoveto==0 ); -+ rc = sqlite3VdbeCursorMoveto(pC); - if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error; - -- sqlite3BtreeSetCachedRowid(u.bj.pC->pCursor, 0); -- rc = sqlite3BtreeDelete(u.bj.pC->pCursor); -- u.bj.pC->cacheStatus = CACHE_STALE; -+ sqlite3BtreeSetCachedRowid(pC->pCursor, 0); -+ rc = sqlite3BtreeDelete(pC->pCursor); -+ pC->cacheStatus = CACHE_STALE; - - /* Invoke the update-hook if required. */ -- if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z && u.bj.pC->isTable ){ -+ if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z && pC->isTable ){ - db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE, -- db->aDb[u.bj.pC->iDb].zName, pOp->p4.z, u.bj.iKey); -- assert( u.bj.pC->iDb>=0 ); -+ db->aDb[pC->iDb].zName, pOp->p4.z, iKey); -+ assert( pC->iDb>=0 ); - } - if( pOp->p2 & OPFLAG_NCHANGE ) p->nChange++; - break; -@@ -70776,19 +71252,17 @@ case OP_ResetCount: { - ** each other. Jump to P2 if they are different. - */ - case OP_SorterCompare: { --#if 0 /* local variables moved into u.bk */ - VdbeCursor *pC; - int res; - int nIgnore; --#endif /* local variables moved into u.bk */ - -- u.bk.pC = p->apCsr[pOp->p1]; -- assert( isSorter(u.bk.pC) ); -+ pC = p->apCsr[pOp->p1]; -+ assert( isSorter(pC) ); - assert( pOp->p4type==P4_INT32 ); - pIn3 = &aMem[pOp->p3]; -- u.bk.nIgnore = pOp->p4.i; -- rc = sqlite3VdbeSorterCompare(u.bk.pC, pIn3, u.bk.nIgnore, &u.bk.res); -- if( u.bk.res ){ -+ nIgnore = pOp->p4.i; -+ rc = sqlite3VdbeSorterCompare(pC, pIn3, nIgnore, &res); -+ if( res ){ - pc = pOp->p2-1; - } - break; -@@ -70800,14 +71274,12 @@ case OP_SorterCompare: { - ** Write into register P2 the current sorter data for sorter cursor P1. - */ - case OP_SorterData: { --#if 0 /* local variables moved into u.bl */ - VdbeCursor *pC; --#endif /* local variables moved into u.bl */ - - pOut = &aMem[pOp->p2]; -- u.bl.pC = p->apCsr[pOp->p1]; -- assert( isSorter(u.bl.pC) ); -- rc = sqlite3VdbeSorterRowkey(u.bl.pC, pOut); -+ pC = p->apCsr[pOp->p1]; -+ assert( isSorter(pC) ); -+ rc = sqlite3VdbeSorterRowkey(pC, pOut); - break; - } - -@@ -70835,62 +71307,60 @@ case OP_SorterData: { - */ - case OP_RowKey: - case OP_RowData: { --#if 0 /* local variables moved into u.bm */ - VdbeCursor *pC; - BtCursor *pCrsr; - u32 n; - i64 n64; --#endif /* local variables moved into u.bm */ - - pOut = &aMem[pOp->p2]; - memAboutToChange(p, pOut); - - /* Note that RowKey and RowData are really exactly the same instruction */ - assert( pOp->p1>=0 && pOp->p1nCursor ); -- u.bm.pC = p->apCsr[pOp->p1]; -- assert( isSorter(u.bm.pC)==0 ); -- assert( u.bm.pC->isTable || pOp->opcode!=OP_RowData ); -- assert( u.bm.pC->isTable==0 || pOp->opcode==OP_RowData ); -- assert( u.bm.pC!=0 ); -- assert( u.bm.pC->nullRow==0 ); -- assert( u.bm.pC->pseudoTableReg==0 ); -- assert( u.bm.pC->pCursor!=0 ); -- u.bm.pCrsr = u.bm.pC->pCursor; -- assert( sqlite3BtreeCursorIsValid(u.bm.pCrsr) ); -+ pC = p->apCsr[pOp->p1]; -+ assert( isSorter(pC)==0 ); -+ assert( pC->isTable || pOp->opcode!=OP_RowData ); -+ assert( pC->isTable==0 || pOp->opcode==OP_RowData ); -+ assert( pC!=0 ); -+ assert( pC->nullRow==0 ); -+ assert( pC->pseudoTableReg==0 ); -+ assert( pC->pCursor!=0 ); -+ pCrsr = pC->pCursor; -+ assert( sqlite3BtreeCursorIsValid(pCrsr) ); - - /* The OP_RowKey and OP_RowData opcodes always follow OP_NotExists or - ** OP_Rewind/Op_Next with no intervening instructions that might invalidate - ** the cursor. Hence the following sqlite3VdbeCursorMoveto() call is always - ** a no-op and can never fail. But we leave it in place as a safety. - */ -- assert( u.bm.pC->deferredMoveto==0 ); -- rc = sqlite3VdbeCursorMoveto(u.bm.pC); -+ assert( pC->deferredMoveto==0 ); -+ rc = sqlite3VdbeCursorMoveto(pC); - if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error; - -- if( u.bm.pC->isTable==0 ){ -- assert( !u.bm.pC->isTable ); -- VVA_ONLY(rc =) sqlite3BtreeKeySize(u.bm.pCrsr, &u.bm.n64); -+ if( pC->isTable==0 ){ -+ assert( !pC->isTable ); -+ VVA_ONLY(rc =) sqlite3BtreeKeySize(pCrsr, &n64); - assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */ -- if( u.bm.n64>db->aLimit[SQLITE_LIMIT_LENGTH] ){ -+ if( n64>db->aLimit[SQLITE_LIMIT_LENGTH] ){ - goto too_big; - } -- u.bm.n = (u32)u.bm.n64; -+ n = (u32)n64; - }else{ -- VVA_ONLY(rc =) sqlite3BtreeDataSize(u.bm.pCrsr, &u.bm.n); -+ VVA_ONLY(rc =) sqlite3BtreeDataSize(pCrsr, &n); - assert( rc==SQLITE_OK ); /* DataSize() cannot fail */ -- if( u.bm.n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ -+ if( n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ - goto too_big; - } - } -- if( sqlite3VdbeMemGrow(pOut, u.bm.n, 0) ){ -+ if( sqlite3VdbeMemGrow(pOut, n, 0) ){ - goto no_mem; - } -- pOut->n = u.bm.n; -+ pOut->n = n; - MemSetTypeFlag(pOut, MEM_Blob); -- if( u.bm.pC->isTable==0 ){ -- rc = sqlite3BtreeKey(u.bm.pCrsr, 0, u.bm.n, pOut->z); -+ if( pC->isTable==0 ){ -+ rc = sqlite3BtreeKey(pCrsr, 0, n, pOut->z); - }else{ -- rc = sqlite3BtreeData(u.bm.pCrsr, 0, u.bm.n, pOut->z); -+ rc = sqlite3BtreeData(pCrsr, 0, n, pOut->z); - } - pOut->enc = SQLITE_UTF8; /* In case the blob is ever cast to text */ - UPDATE_MAX_BLOBSIZE(pOut); -@@ -70909,42 +71379,40 @@ case OP_RowData: { - ** one opcode now works for both table types. - */ - case OP_Rowid: { /* out2-prerelease */ --#if 0 /* local variables moved into u.bn */ - VdbeCursor *pC; - i64 v; - sqlite3_vtab *pVtab; - const sqlite3_module *pModule; --#endif /* local variables moved into u.bn */ - - assert( pOp->p1>=0 && pOp->p1nCursor ); -- u.bn.pC = p->apCsr[pOp->p1]; -- assert( u.bn.pC!=0 ); -- assert( u.bn.pC->pseudoTableReg==0 || u.bn.pC->nullRow ); -- if( u.bn.pC->nullRow ){ -+ pC = p->apCsr[pOp->p1]; -+ assert( pC!=0 ); -+ assert( pC->pseudoTableReg==0 || pC->nullRow ); -+ if( pC->nullRow ){ - pOut->flags = MEM_Null; - break; -- }else if( u.bn.pC->deferredMoveto ){ -- u.bn.v = u.bn.pC->movetoTarget; -+ }else if( pC->deferredMoveto ){ -+ v = pC->movetoTarget; - #ifndef SQLITE_OMIT_VIRTUALTABLE -- }else if( u.bn.pC->pVtabCursor ){ -- u.bn.pVtab = u.bn.pC->pVtabCursor->pVtab; -- u.bn.pModule = u.bn.pVtab->pModule; -- assert( u.bn.pModule->xRowid ); -- rc = u.bn.pModule->xRowid(u.bn.pC->pVtabCursor, &u.bn.v); -- sqlite3VtabImportErrmsg(p, u.bn.pVtab); -+ }else if( pC->pVtabCursor ){ -+ pVtab = pC->pVtabCursor->pVtab; -+ pModule = pVtab->pModule; -+ assert( pModule->xRowid ); -+ rc = pModule->xRowid(pC->pVtabCursor, &v); -+ sqlite3VtabImportErrmsg(p, pVtab); - #endif /* SQLITE_OMIT_VIRTUALTABLE */ - }else{ -- assert( u.bn.pC->pCursor!=0 ); -- rc = sqlite3VdbeCursorMoveto(u.bn.pC); -+ assert( pC->pCursor!=0 ); -+ rc = sqlite3VdbeCursorMoveto(pC); - if( rc ) goto abort_due_to_error; -- if( u.bn.pC->rowidIsValid ){ -- u.bn.v = u.bn.pC->lastRowid; -+ if( pC->rowidIsValid ){ -+ v = pC->lastRowid; - }else{ -- rc = sqlite3BtreeKeySize(u.bn.pC->pCursor, &u.bn.v); -+ rc = sqlite3BtreeKeySize(pC->pCursor, &v); - assert( rc==SQLITE_OK ); /* Always so because of CursorMoveto() above */ - } - } -- pOut->u.i = u.bn.v; -+ pOut->u.i = v; - break; - } - -@@ -70955,19 +71423,17 @@ case OP_Rowid: { /* out2 - ** write a NULL. - */ - case OP_NullRow: { --#if 0 /* local variables moved into u.bo */ - VdbeCursor *pC; --#endif /* local variables moved into u.bo */ - - assert( pOp->p1>=0 && pOp->p1nCursor ); -- u.bo.pC = p->apCsr[pOp->p1]; -- assert( u.bo.pC!=0 ); -- u.bo.pC->nullRow = 1; -- u.bo.pC->rowidIsValid = 0; -- u.bo.pC->cacheStatus = CACHE_STALE; -- assert( u.bo.pC->pCursor || u.bo.pC->pVtabCursor ); -- if( u.bo.pC->pCursor ){ -- sqlite3BtreeClearCursor(u.bo.pC->pCursor); -+ pC = p->apCsr[pOp->p1]; -+ assert( pC!=0 ); -+ pC->nullRow = 1; -+ pC->rowidIsValid = 0; -+ pC->cacheStatus = CACHE_STALE; -+ assert( pC->pCursor || pC->pVtabCursor ); -+ if( pC->pCursor ){ -+ sqlite3BtreeClearCursor(pC->pCursor); - } - break; - } -@@ -70981,24 +71447,22 @@ case OP_NullRow: { - ** to the following instruction. - */ - case OP_Last: { /* jump */ --#if 0 /* local variables moved into u.bp */ - VdbeCursor *pC; - BtCursor *pCrsr; - int res; --#endif /* local variables moved into u.bp */ - - assert( pOp->p1>=0 && pOp->p1nCursor ); -- u.bp.pC = p->apCsr[pOp->p1]; -- assert( u.bp.pC!=0 ); -- u.bp.pCrsr = u.bp.pC->pCursor; -- u.bp.res = 0; -- assert( u.bp.pCrsr!=0 ); -- rc = sqlite3BtreeLast(u.bp.pCrsr, &u.bp.res); -- u.bp.pC->nullRow = (u8)u.bp.res; -- u.bp.pC->deferredMoveto = 0; -- u.bp.pC->rowidIsValid = 0; -- u.bp.pC->cacheStatus = CACHE_STALE; -- if( pOp->p2>0 && u.bp.res ){ -+ pC = p->apCsr[pOp->p1]; -+ assert( pC!=0 ); -+ pCrsr = pC->pCursor; -+ res = 0; -+ assert( pCrsr!=0 ); -+ rc = sqlite3BtreeLast(pCrsr, &res); -+ pC->nullRow = (u8)res; -+ pC->deferredMoveto = 0; -+ pC->rowidIsValid = 0; -+ pC->cacheStatus = CACHE_STALE; -+ if( pOp->p2>0 && res ){ - pc = pOp->p2 - 1; - } - break; -@@ -71035,30 +71499,28 @@ case OP_Sort: { /* jump */ - ** to the following instruction. - */ - case OP_Rewind: { /* jump */ --#if 0 /* local variables moved into u.bq */ - VdbeCursor *pC; - BtCursor *pCrsr; - int res; --#endif /* local variables moved into u.bq */ - - assert( pOp->p1>=0 && pOp->p1nCursor ); -- u.bq.pC = p->apCsr[pOp->p1]; -- assert( u.bq.pC!=0 ); -- assert( isSorter(u.bq.pC)==(pOp->opcode==OP_SorterSort) ); -- u.bq.res = 1; -- if( isSorter(u.bq.pC) ){ -- rc = sqlite3VdbeSorterRewind(db, u.bq.pC, &u.bq.res); -- }else{ -- u.bq.pCrsr = u.bq.pC->pCursor; -- assert( u.bq.pCrsr ); -- rc = sqlite3BtreeFirst(u.bq.pCrsr, &u.bq.res); -- u.bq.pC->deferredMoveto = 0; -- u.bq.pC->cacheStatus = CACHE_STALE; -- u.bq.pC->rowidIsValid = 0; -+ pC = p->apCsr[pOp->p1]; -+ assert( pC!=0 ); -+ assert( isSorter(pC)==(pOp->opcode==OP_SorterSort) ); -+ res = 1; -+ if( isSorter(pC) ){ -+ rc = sqlite3VdbeSorterRewind(db, pC, &res); -+ }else{ -+ pCrsr = pC->pCursor; -+ assert( pCrsr ); -+ rc = sqlite3BtreeFirst(pCrsr, &res); -+ pC->deferredMoveto = 0; -+ pC->cacheStatus = CACHE_STALE; -+ pC->rowidIsValid = 0; - } -- u.bq.pC->nullRow = (u8)u.bq.res; -+ pC->nullRow = (u8)res; - assert( pOp->p2>0 && pOp->p2nOp ); -- if( u.bq.res ){ -+ if( res ){ - pc = pOp->p2 - 1; - } - break; -@@ -71109,14 +71571,12 @@ case OP_Rewind: { /* jump */ - ** open it behaves a no-op. - */ - case OP_SorterNext: { /* jump */ --#if 0 /* local variables moved into u.br */ - VdbeCursor *pC; - int res; --#endif /* local variables moved into u.br */ - -- u.br.pC = p->apCsr[pOp->p1]; -- assert( isSorter(u.br.pC) ); -- rc = sqlite3VdbeSorterNext(db, u.br.pC, &u.br.res); -+ pC = p->apCsr[pOp->p1]; -+ assert( isSorter(pC) ); -+ rc = sqlite3VdbeSorterNext(db, pC, &res); - goto next_tail; - case OP_PrevIfOpen: /* jump */ - case OP_NextIfOpen: /* jump */ -@@ -71126,28 +71586,28 @@ case OP_Prev: /* jump */ - case OP_Next: /* jump */ - assert( pOp->p1>=0 && pOp->p1nCursor ); - assert( pOp->p5aCounter) ); -- u.br.pC = p->apCsr[pOp->p1]; -- assert( u.br.pC!=0 ); -- assert( u.br.pC->deferredMoveto==0 ); -- assert( u.br.pC->pCursor ); -+ pC = p->apCsr[pOp->p1]; -+ assert( pC!=0 ); -+ assert( pC->deferredMoveto==0 ); -+ assert( pC->pCursor ); - assert( pOp->opcode!=OP_Next || pOp->p4.xAdvance==sqlite3BtreeNext ); - assert( pOp->opcode!=OP_Prev || pOp->p4.xAdvance==sqlite3BtreePrevious ); - assert( pOp->opcode!=OP_NextIfOpen || pOp->p4.xAdvance==sqlite3BtreeNext ); - assert( pOp->opcode!=OP_PrevIfOpen || pOp->p4.xAdvance==sqlite3BtreePrevious); -- rc = pOp->p4.xAdvance(u.br.pC->pCursor, &u.br.res); -+ rc = pOp->p4.xAdvance(pC->pCursor, &res); - next_tail: -- u.br.pC->cacheStatus = CACHE_STALE; -- if( u.br.res==0 ){ -- u.br.pC->nullRow = 0; -+ pC->cacheStatus = CACHE_STALE; -+ if( res==0 ){ -+ pC->nullRow = 0; - pc = pOp->p2 - 1; - p->aCounter[pOp->p5]++; - #ifdef SQLITE_TEST - sqlite3_search_count++; - #endif - }else{ -- u.br.pC->nullRow = 1; -+ pC->nullRow = 1; - } -- u.br.pC->rowidIsValid = 0; -+ pC->rowidIsValid = 0; - goto check_for_interrupt; - } - -@@ -71166,35 +71626,33 @@ next_tail: - */ - case OP_SorterInsert: /* in2 */ - case OP_IdxInsert: { /* in2 */ --#if 0 /* local variables moved into u.bs */ - VdbeCursor *pC; - BtCursor *pCrsr; - int nKey; - const char *zKey; --#endif /* local variables moved into u.bs */ - - assert( pOp->p1>=0 && pOp->p1nCursor ); -- u.bs.pC = p->apCsr[pOp->p1]; -- assert( u.bs.pC!=0 ); -- assert( isSorter(u.bs.pC)==(pOp->opcode==OP_SorterInsert) ); -+ pC = p->apCsr[pOp->p1]; -+ assert( pC!=0 ); -+ assert( isSorter(pC)==(pOp->opcode==OP_SorterInsert) ); - pIn2 = &aMem[pOp->p2]; - assert( pIn2->flags & MEM_Blob ); -- u.bs.pCrsr = u.bs.pC->pCursor; -+ pCrsr = pC->pCursor; - if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++; -- assert( u.bs.pCrsr!=0 ); -- assert( u.bs.pC->isTable==0 ); -+ assert( pCrsr!=0 ); -+ assert( pC->isTable==0 ); - rc = ExpandBlob(pIn2); - if( rc==SQLITE_OK ){ -- if( isSorter(u.bs.pC) ){ -- rc = sqlite3VdbeSorterWrite(db, u.bs.pC, pIn2); -+ if( isSorter(pC) ){ -+ rc = sqlite3VdbeSorterWrite(db, pC, pIn2); - }else{ -- u.bs.nKey = pIn2->n; -- u.bs.zKey = pIn2->z; -- rc = sqlite3BtreeInsert(u.bs.pCrsr, u.bs.zKey, u.bs.nKey, "", 0, 0, pOp->p3, -- ((pOp->p5 & OPFLAG_USESEEKRESULT) ? u.bs.pC->seekResult : 0) -+ nKey = pIn2->n; -+ zKey = pIn2->z; -+ rc = sqlite3BtreeInsert(pCrsr, zKey, nKey, "", 0, 0, pOp->p3, -+ ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0) - ); -- assert( u.bs.pC->deferredMoveto==0 ); -- u.bs.pC->cacheStatus = CACHE_STALE; -+ assert( pC->deferredMoveto==0 ); -+ pC->cacheStatus = CACHE_STALE; - } - } - break; -@@ -71208,34 +71666,32 @@ case OP_IdxInsert: { /* in2 */ - ** index opened by cursor P1. - */ - case OP_IdxDelete: { --#if 0 /* local variables moved into u.bt */ - VdbeCursor *pC; - BtCursor *pCrsr; - int res; - UnpackedRecord r; --#endif /* local variables moved into u.bt */ - - assert( pOp->p3>0 ); - assert( pOp->p2>0 && pOp->p2+pOp->p3<=(p->nMem-p->nCursor)+1 ); - assert( pOp->p1>=0 && pOp->p1nCursor ); -- u.bt.pC = p->apCsr[pOp->p1]; -- assert( u.bt.pC!=0 ); -- u.bt.pCrsr = u.bt.pC->pCursor; -- assert( u.bt.pCrsr!=0 ); -+ pC = p->apCsr[pOp->p1]; -+ assert( pC!=0 ); -+ pCrsr = pC->pCursor; -+ assert( pCrsr!=0 ); - assert( pOp->p5==0 ); -- u.bt.r.pKeyInfo = u.bt.pC->pKeyInfo; -- u.bt.r.nField = (u16)pOp->p3; -- u.bt.r.flags = UNPACKED_PREFIX_MATCH; -- u.bt.r.aMem = &aMem[pOp->p2]; -+ r.pKeyInfo = pC->pKeyInfo; -+ r.nField = (u16)pOp->p3; -+ r.flags = UNPACKED_PREFIX_MATCH; -+ r.aMem = &aMem[pOp->p2]; - #ifdef SQLITE_DEBUG -- { int i; for(i=0; ideferredMoveto==0 ); -- u.bt.pC->cacheStatus = CACHE_STALE; -+ assert( pC->deferredMoveto==0 ); -+ pC->cacheStatus = CACHE_STALE; - break; - } - -@@ -71249,28 +71705,27 @@ case OP_IdxDelete: { - ** See also: Rowid, MakeRecord. - */ - case OP_IdxRowid: { /* out2-prerelease */ --#if 0 /* local variables moved into u.bu */ - BtCursor *pCrsr; - VdbeCursor *pC; - i64 rowid; --#endif /* local variables moved into u.bu */ - - assert( pOp->p1>=0 && pOp->p1nCursor ); -- u.bu.pC = p->apCsr[pOp->p1]; -- assert( u.bu.pC!=0 ); -- u.bu.pCrsr = u.bu.pC->pCursor; -- assert( u.bu.pCrsr!=0 ); -+ pC = p->apCsr[pOp->p1]; -+ assert( pC!=0 ); -+ pCrsr = pC->pCursor; -+ assert( pCrsr!=0 ); - pOut->flags = MEM_Null; -- rc = sqlite3VdbeCursorMoveto(u.bu.pC); -+ rc = sqlite3VdbeCursorMoveto(pC); - if( NEVER(rc) ) goto abort_due_to_error; -- assert( u.bu.pC->deferredMoveto==0 ); -- assert( u.bu.pC->isTable==0 ); -- if( !u.bu.pC->nullRow ){ -- rc = sqlite3VdbeIdxRowid(db, u.bu.pCrsr, &u.bu.rowid); -+ assert( pC->deferredMoveto==0 ); -+ assert( pC->isTable==0 ); -+ if( !pC->nullRow ){ -+ rowid = 0; /* Not needed. Only used to silence a warning. */ -+ rc = sqlite3VdbeIdxRowid(db, pCrsr, &rowid); - if( rc!=SQLITE_OK ){ - goto abort_due_to_error; - } -- pOut->u.i = u.bu.rowid; -+ pOut->u.i = rowid; - pOut->flags = MEM_Int; - } - break; -@@ -71306,39 +71761,38 @@ case OP_IdxRowid: { /* out2 - */ - case OP_IdxLT: /* jump */ - case OP_IdxGE: { /* jump */ --#if 0 /* local variables moved into u.bv */ - VdbeCursor *pC; - int res; - UnpackedRecord r; --#endif /* local variables moved into u.bv */ - - assert( pOp->p1>=0 && pOp->p1nCursor ); -- u.bv.pC = p->apCsr[pOp->p1]; -- assert( u.bv.pC!=0 ); -- assert( u.bv.pC->isOrdered ); -- assert( u.bv.pC->pCursor!=0); -- assert( u.bv.pC->deferredMoveto==0 ); -+ pC = p->apCsr[pOp->p1]; -+ assert( pC!=0 ); -+ assert( pC->isOrdered ); -+ assert( pC->pCursor!=0); -+ assert( pC->deferredMoveto==0 ); - assert( pOp->p5==0 || pOp->p5==1 ); - assert( pOp->p4type==P4_INT32 ); -- u.bv.r.pKeyInfo = u.bv.pC->pKeyInfo; -- u.bv.r.nField = (u16)pOp->p4.i; -+ r.pKeyInfo = pC->pKeyInfo; -+ r.nField = (u16)pOp->p4.i; - if( pOp->p5 ){ -- u.bv.r.flags = UNPACKED_INCRKEY | UNPACKED_PREFIX_MATCH; -+ r.flags = UNPACKED_INCRKEY | UNPACKED_PREFIX_MATCH; - }else{ -- u.bv.r.flags = UNPACKED_PREFIX_MATCH; -+ r.flags = UNPACKED_PREFIX_MATCH; - } -- u.bv.r.aMem = &aMem[pOp->p3]; -+ r.aMem = &aMem[pOp->p3]; - #ifdef SQLITE_DEBUG -- { int i; for(i=0; iopcode==OP_IdxLT ){ -- u.bv.res = -u.bv.res; -+ res = -res; - }else{ - assert( pOp->opcode==OP_IdxGE ); -- u.bv.res++; -+ res++; - } -- if( u.bv.res>0 ){ -+ if( res>0 ){ - pc = pOp->p2 - 1 ; - } - break; -@@ -71365,43 +71819,42 @@ case OP_IdxGE: { /* jump */ - ** See also: Clear - */ - case OP_Destroy: { /* out2-prerelease */ --#if 0 /* local variables moved into u.bw */ - int iMoved; - int iCnt; - Vdbe *pVdbe; - int iDb; --#endif /* local variables moved into u.bw */ - - assert( p->readOnly==0 ); - #ifndef SQLITE_OMIT_VIRTUALTABLE -- u.bw.iCnt = 0; -- for(u.bw.pVdbe=db->pVdbe; u.bw.pVdbe; u.bw.pVdbe = u.bw.pVdbe->pNext){ -- if( u.bw.pVdbe->magic==VDBE_MAGIC_RUN && u.bw.pVdbe->bIsReader -- && u.bw.pVdbe->inVtabMethod<2 && u.bw.pVdbe->pc>=0 -+ iCnt = 0; -+ for(pVdbe=db->pVdbe; pVdbe; pVdbe = pVdbe->pNext){ -+ if( pVdbe->magic==VDBE_MAGIC_RUN && pVdbe->bIsReader -+ && pVdbe->inVtabMethod<2 && pVdbe->pc>=0 - ){ -- u.bw.iCnt++; -+ iCnt++; - } - } - #else -- u.bw.iCnt = db->nVdbeRead; -+ iCnt = db->nVdbeRead; - #endif - pOut->flags = MEM_Null; -- if( u.bw.iCnt>1 ){ -+ if( iCnt>1 ){ - rc = SQLITE_LOCKED; - p->errorAction = OE_Abort; - }else{ -- u.bw.iDb = pOp->p3; -- assert( u.bw.iCnt==1 ); -- assert( (p->btreeMask & (((yDbMask)1)<aDb[u.bw.iDb].pBt, pOp->p1, &u.bw.iMoved); -+ iDb = pOp->p3; -+ assert( iCnt==1 ); -+ assert( (p->btreeMask & (((yDbMask)1)<aDb[iDb].pBt, pOp->p1, &iMoved); - pOut->flags = MEM_Int; -- pOut->u.i = u.bw.iMoved; -+ pOut->u.i = iMoved; - #ifndef SQLITE_OMIT_AUTOVACUUM -- if( rc==SQLITE_OK && u.bw.iMoved!=0 ){ -- sqlite3RootPageMoved(db, u.bw.iDb, u.bw.iMoved, pOp->p1); -+ if( rc==SQLITE_OK && iMoved!=0 ){ -+ sqlite3RootPageMoved(db, iDb, iMoved, pOp->p1); - /* All OP_Destroy operations occur on the same btree */ -- assert( resetSchemaOnFault==0 || resetSchemaOnFault==u.bw.iDb+1 ); -- resetSchemaOnFault = u.bw.iDb+1; -+ assert( resetSchemaOnFault==0 || resetSchemaOnFault==iDb+1 ); -+ resetSchemaOnFault = iDb+1; - } - #endif - } -@@ -71427,23 +71880,21 @@ case OP_Destroy: { /* out2-prereleas - ** See also: Destroy - */ - case OP_Clear: { --#if 0 /* local variables moved into u.bx */ - int nChange; --#endif /* local variables moved into u.bx */ -- -- u.bx.nChange = 0; -+ -+ nChange = 0; - assert( p->readOnly==0 ); - assert( pOp->p1!=1 ); - assert( (p->btreeMask & (((yDbMask)1)<p2))!=0 ); - rc = sqlite3BtreeClearTable( -- db->aDb[pOp->p2].pBt, pOp->p1, (pOp->p3 ? &u.bx.nChange : 0) -+ db->aDb[pOp->p2].pBt, pOp->p1, (pOp->p3 ? &nChange : 0) - ); - if( pOp->p3 ){ -- p->nChange += u.bx.nChange; -+ p->nChange += nChange; - if( pOp->p3>0 ){ - assert( memIsValid(&aMem[pOp->p3]) ); - memAboutToChange(p, &aMem[pOp->p3]); -- aMem[pOp->p3].u.i += u.bx.nChange; -+ aMem[pOp->p3].u.i += nChange; - } - } - break; -@@ -71475,26 +71926,24 @@ case OP_Clear: { - */ - case OP_CreateIndex: /* out2-prerelease */ - case OP_CreateTable: { /* out2-prerelease */ --#if 0 /* local variables moved into u.by */ - int pgno; - int flags; - Db *pDb; --#endif /* local variables moved into u.by */ - -- u.by.pgno = 0; -+ pgno = 0; - assert( pOp->p1>=0 && pOp->p1nDb ); - assert( (p->btreeMask & (((yDbMask)1)<p1))!=0 ); - assert( p->readOnly==0 ); -- u.by.pDb = &db->aDb[pOp->p1]; -- assert( u.by.pDb->pBt!=0 ); -+ pDb = &db->aDb[pOp->p1]; -+ assert( pDb->pBt!=0 ); - if( pOp->opcode==OP_CreateTable ){ -- /* u.by.flags = BTREE_INTKEY; */ -- u.by.flags = BTREE_INTKEY; -+ /* flags = BTREE_INTKEY; */ -+ flags = BTREE_INTKEY; - }else{ -- u.by.flags = BTREE_BLOBKEY; -+ flags = BTREE_BLOBKEY; - } -- rc = sqlite3BtreeCreateTable(u.by.pDb->pBt, &u.by.pgno, u.by.flags); -- pOut->u.i = u.by.pgno; -+ rc = sqlite3BtreeCreateTable(pDb->pBt, &pgno, flags); -+ pOut->u.i = pgno; - break; - } - -@@ -71507,44 +71956,42 @@ case OP_CreateTable: { /* out2- - ** then runs the new virtual machine. It is thus a re-entrant opcode. - */ - case OP_ParseSchema: { --#if 0 /* local variables moved into u.bz */ - int iDb; - const char *zMaster; - char *zSql; - InitData initData; --#endif /* local variables moved into u.bz */ - - /* Any prepared statement that invokes this opcode will hold mutexes -- ** on every btree. This is a prerequisite for invoking -+ ** on every btree. This is a prerequisite for invoking - ** sqlite3InitCallback(). - */ - #ifdef SQLITE_DEBUG -- for(u.bz.iDb=0; u.bz.iDbnDb; u.bz.iDb++){ -- assert( u.bz.iDb==1 || sqlite3BtreeHoldsMutex(db->aDb[u.bz.iDb].pBt) ); -+ for(iDb=0; iDbnDb; iDb++){ -+ assert( iDb==1 || sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt) ); - } - #endif - -- u.bz.iDb = pOp->p1; -- assert( u.bz.iDb>=0 && u.bz.iDbnDb ); -- assert( DbHasProperty(db, u.bz.iDb, DB_SchemaLoaded) ); -+ iDb = pOp->p1; -+ assert( iDb>=0 && iDbnDb ); -+ assert( DbHasProperty(db, iDb, DB_SchemaLoaded) ); - /* Used to be a conditional */ { -- u.bz.zMaster = SCHEMA_TABLE(u.bz.iDb); -- u.bz.initData.db = db; -- u.bz.initData.iDb = pOp->p1; -- u.bz.initData.pzErrMsg = &p->zErrMsg; -- u.bz.zSql = sqlite3MPrintf(db, -+ zMaster = SCHEMA_TABLE(iDb); -+ initData.db = db; -+ initData.iDb = pOp->p1; -+ initData.pzErrMsg = &p->zErrMsg; -+ zSql = sqlite3MPrintf(db, - "SELECT name, rootpage, sql FROM '%q'.%s WHERE %s ORDER BY rowid", -- db->aDb[u.bz.iDb].zName, u.bz.zMaster, pOp->p4.z); -- if( u.bz.zSql==0 ){ -+ db->aDb[iDb].zName, zMaster, pOp->p4.z); -+ if( zSql==0 ){ - rc = SQLITE_NOMEM; - }else{ - assert( db->init.busy==0 ); - db->init.busy = 1; -- u.bz.initData.rc = SQLITE_OK; -+ initData.rc = SQLITE_OK; - assert( !db->mallocFailed ); -- rc = sqlite3_exec(db, u.bz.zSql, sqlite3InitCallback, &u.bz.initData, 0); -- if( rc==SQLITE_OK ) rc = u.bz.initData.rc; -- sqlite3DbFree(db, u.bz.zSql); -+ rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0); -+ if( rc==SQLITE_OK ) rc = initData.rc; -+ sqlite3DbFree(db, zSql); - db->init.busy = 0; - } - } -@@ -71552,7 +71999,7 @@ case OP_ParseSchema: { - if( rc==SQLITE_NOMEM ){ - goto no_mem; - } -- break; -+ break; - } - - #if !defined(SQLITE_OMIT_ANALYZE) -@@ -71628,42 +72075,40 @@ case OP_DropTrigger: { - ** This opcode is used to implement the integrity_check pragma. - */ - case OP_IntegrityCk: { --#if 0 /* local variables moved into u.ca */ - int nRoot; /* Number of tables to check. (Number of root pages.) */ - int *aRoot; /* Array of rootpage numbers for tables to be checked */ - int j; /* Loop counter */ - int nErr; /* Number of errors reported */ - char *z; /* Text of the error report */ - Mem *pnErr; /* Register keeping track of errors remaining */ --#endif /* local variables moved into u.ca */ - - assert( p->bIsReader ); -- u.ca.nRoot = pOp->p2; -- assert( u.ca.nRoot>0 ); -- u.ca.aRoot = sqlite3DbMallocRaw(db, sizeof(int)*(u.ca.nRoot+1) ); -- if( u.ca.aRoot==0 ) goto no_mem; -+ nRoot = pOp->p2; -+ assert( nRoot>0 ); -+ aRoot = sqlite3DbMallocRaw(db, sizeof(int)*(nRoot+1) ); -+ if( aRoot==0 ) goto no_mem; - assert( pOp->p3>0 && pOp->p3<=(p->nMem-p->nCursor) ); -- u.ca.pnErr = &aMem[pOp->p3]; -- assert( (u.ca.pnErr->flags & MEM_Int)!=0 ); -- assert( (u.ca.pnErr->flags & (MEM_Str|MEM_Blob))==0 ); -+ pnErr = &aMem[pOp->p3]; -+ assert( (pnErr->flags & MEM_Int)!=0 ); -+ assert( (pnErr->flags & (MEM_Str|MEM_Blob))==0 ); - pIn1 = &aMem[pOp->p1]; -- for(u.ca.j=0; u.ca.jp5nDb ); - assert( (p->btreeMask & (((yDbMask)1)<p5))!=0 ); -- u.ca.z = sqlite3BtreeIntegrityCheck(db->aDb[pOp->p5].pBt, u.ca.aRoot, u.ca.nRoot, -- (int)u.ca.pnErr->u.i, &u.ca.nErr); -- sqlite3DbFree(db, u.ca.aRoot); -- u.ca.pnErr->u.i -= u.ca.nErr; -+ z = sqlite3BtreeIntegrityCheck(db->aDb[pOp->p5].pBt, aRoot, nRoot, -+ (int)pnErr->u.i, &nErr); -+ sqlite3DbFree(db, aRoot); -+ pnErr->u.i -= nErr; - sqlite3VdbeMemSetNull(pIn1); -- if( u.ca.nErr==0 ){ -- assert( u.ca.z==0 ); -- }else if( u.ca.z==0 ){ -+ if( nErr==0 ){ -+ assert( z==0 ); -+ }else if( z==0 ){ - goto no_mem; - }else{ -- sqlite3VdbeMemSetStr(pIn1, u.ca.z, -1, SQLITE_UTF8, sqlite3_free); -+ sqlite3VdbeMemSetStr(pIn1, z, -1, SQLITE_UTF8, sqlite3_free); - } - UPDATE_MAX_BLOBSIZE(pIn1); - sqlite3VdbeChangeEncoding(pIn1, encoding); -@@ -71699,20 +72144,18 @@ case OP_RowSetAdd: { /* in1, in2 * - ** unchanged and jump to instruction P2. - */ - case OP_RowSetRead: { /* jump, in1, out3 */ --#if 0 /* local variables moved into u.cb */ - i64 val; --#endif /* local variables moved into u.cb */ - - pIn1 = &aMem[pOp->p1]; -- if( (pIn1->flags & MEM_RowSet)==0 -- || sqlite3RowSetNext(pIn1->u.pRowSet, &u.cb.val)==0 -+ if( (pIn1->flags & MEM_RowSet)==0 -+ || sqlite3RowSetNext(pIn1->u.pRowSet, &val)==0 - ){ - /* The boolean index is empty */ - sqlite3VdbeMemSetNull(pIn1); - pc = pOp->p2 - 1; - }else{ - /* A value was pulled from the index */ -- sqlite3VdbeMemSetInt64(&aMem[pOp->p3], u.cb.val); -+ sqlite3VdbeMemSetInt64(&aMem[pOp->p3], val); - } - goto check_for_interrupt; - } -@@ -71742,14 +72185,12 @@ case OP_RowSetRead: { /* jump, in1 - ** inserted as part of some other set). - */ - case OP_RowSetTest: { /* jump, in1, in3 */ --#if 0 /* local variables moved into u.cc */ - int iSet; - int exists; --#endif /* local variables moved into u.cc */ - - pIn1 = &aMem[pOp->p1]; - pIn3 = &aMem[pOp->p3]; -- u.cc.iSet = pOp->p4.i; -+ iSet = pOp->p4.i; - assert( pIn3->flags&MEM_Int ); - - /* If there is anything other than a rowset object in memory cell P1, -@@ -71761,17 +72202,17 @@ case OP_RowSetTest: { - } - - assert( pOp->p4type==P4_INT32 ); -- assert( u.cc.iSet==-1 || u.cc.iSet>=0 ); -- if( u.cc.iSet ){ -- u.cc.exists = sqlite3RowSetTest(pIn1->u.pRowSet, -- (u8)(u.cc.iSet>=0 ? u.cc.iSet & 0xf : 0xff), -+ assert( iSet==-1 || iSet>=0 ); -+ if( iSet ){ -+ exists = sqlite3RowSetTest(pIn1->u.pRowSet, -+ (u8)(iSet>=0 ? iSet & 0xf : 0xff), - pIn3->u.i); -- if( u.cc.exists ){ -+ if( exists ){ - pc = pOp->p2 - 1; - break; - } - } -- if( u.cc.iSet>=0 ){ -+ if( iSet>=0 ){ - sqlite3RowSetInsert(pIn1->u.pRowSet, pIn3->u.i); - } - break; -@@ -71794,7 +72235,6 @@ case OP_RowSetTest: { - ** P4 is a pointer to the VM containing the trigger program. - */ - case OP_Program: { /* jump */ --#if 0 /* local variables moved into u.cd */ - int nMem; /* Number of memory registers for sub-program */ - int nByte; /* Bytes of runtime space required for sub-program */ - Mem *pRt; /* Register to allocate runtime space */ -@@ -71803,27 +72243,26 @@ case OP_Program: { /* jump */ - VdbeFrame *pFrame; /* New vdbe frame to execute in */ - SubProgram *pProgram; /* Sub-program to execute */ - void *t; /* Token identifying trigger */ --#endif /* local variables moved into u.cd */ -- -- u.cd.pProgram = pOp->p4.pProgram; -- u.cd.pRt = &aMem[pOp->p3]; -- assert( u.cd.pProgram->nOp>0 ); - -- /* If the p5 flag is clear, then recursive invocation of triggers is -+ pProgram = pOp->p4.pProgram; -+ pRt = &aMem[pOp->p3]; -+ assert( pProgram->nOp>0 ); -+ -+ /* If the p5 flag is clear, then recursive invocation of triggers is - ** disabled for backwards compatibility (p5 is set if this sub-program - ** is really a trigger, not a foreign key action, and the flag set - ** and cleared by the "PRAGMA recursive_triggers" command is clear). -- ** -- ** It is recursive invocation of triggers, at the SQL level, that is -- ** disabled. In some cases a single trigger may generate more than one -- ** SubProgram (if the trigger may be executed with more than one different -+ ** -+ ** It is recursive invocation of triggers, at the SQL level, that is -+ ** disabled. In some cases a single trigger may generate more than one -+ ** SubProgram (if the trigger may be executed with more than one different - ** ON CONFLICT algorithm). SubProgram structures associated with a -- ** single trigger all have the same value for the SubProgram.token -+ ** single trigger all have the same value for the SubProgram.token - ** variable. */ - if( pOp->p5 ){ -- u.cd.t = u.cd.pProgram->token; -- for(u.cd.pFrame=p->pFrame; u.cd.pFrame && u.cd.pFrame->token!=u.cd.t; u.cd.pFrame=u.cd.pFrame->pParent); -- if( u.cd.pFrame ) break; -+ t = pProgram->token; -+ for(pFrame=p->pFrame; pFrame && pFrame->token!=t; pFrame=pFrame->pParent); -+ if( pFrame ) break; - } - - if( p->nFrame>=db->aLimit[SQLITE_LIMIT_TRIGGER_DEPTH] ){ -@@ -71832,69 +72271,69 @@ case OP_Program: { /* jump */ - break; - } - -- /* Register u.cd.pRt is used to store the memory required to save the state -+ /* Register pRt is used to store the memory required to save the state - ** of the current program, and the memory required at runtime to execute -- ** the trigger program. If this trigger has been fired before, then u.cd.pRt -+ ** the trigger program. If this trigger has been fired before, then pRt - ** is already allocated. Otherwise, it must be initialized. */ -- if( (u.cd.pRt->flags&MEM_Frame)==0 ){ -- /* SubProgram.nMem is set to the number of memory cells used by the -+ if( (pRt->flags&MEM_Frame)==0 ){ -+ /* SubProgram.nMem is set to the number of memory cells used by the - ** program stored in SubProgram.aOp. As well as these, one memory - ** cell is required for each cursor used by the program. Set local -- ** variable u.cd.nMem (and later, VdbeFrame.nChildMem) to this value. -+ ** variable nMem (and later, VdbeFrame.nChildMem) to this value. - */ -- u.cd.nMem = u.cd.pProgram->nMem + u.cd.pProgram->nCsr; -- u.cd.nByte = ROUND8(sizeof(VdbeFrame)) -- + u.cd.nMem * sizeof(Mem) -- + u.cd.pProgram->nCsr * sizeof(VdbeCursor *) -- + u.cd.pProgram->nOnce * sizeof(u8); -- u.cd.pFrame = sqlite3DbMallocZero(db, u.cd.nByte); -- if( !u.cd.pFrame ){ -+ nMem = pProgram->nMem + pProgram->nCsr; -+ nByte = ROUND8(sizeof(VdbeFrame)) -+ + nMem * sizeof(Mem) -+ + pProgram->nCsr * sizeof(VdbeCursor *) -+ + pProgram->nOnce * sizeof(u8); -+ pFrame = sqlite3DbMallocZero(db, nByte); -+ if( !pFrame ){ - goto no_mem; - } -- sqlite3VdbeMemRelease(u.cd.pRt); -- u.cd.pRt->flags = MEM_Frame; -- u.cd.pRt->u.pFrame = u.cd.pFrame; -- -- u.cd.pFrame->v = p; -- u.cd.pFrame->nChildMem = u.cd.nMem; -- u.cd.pFrame->nChildCsr = u.cd.pProgram->nCsr; -- u.cd.pFrame->pc = pc; -- u.cd.pFrame->aMem = p->aMem; -- u.cd.pFrame->nMem = p->nMem; -- u.cd.pFrame->apCsr = p->apCsr; -- u.cd.pFrame->nCursor = p->nCursor; -- u.cd.pFrame->aOp = p->aOp; -- u.cd.pFrame->nOp = p->nOp; -- u.cd.pFrame->token = u.cd.pProgram->token; -- u.cd.pFrame->aOnceFlag = p->aOnceFlag; -- u.cd.pFrame->nOnceFlag = p->nOnceFlag; -- -- u.cd.pEnd = &VdbeFrameMem(u.cd.pFrame)[u.cd.pFrame->nChildMem]; -- for(u.cd.pMem=VdbeFrameMem(u.cd.pFrame); u.cd.pMem!=u.cd.pEnd; u.cd.pMem++){ -- u.cd.pMem->flags = MEM_Invalid; -- u.cd.pMem->db = db; -- } -- }else{ -- u.cd.pFrame = u.cd.pRt->u.pFrame; -- assert( u.cd.pProgram->nMem+u.cd.pProgram->nCsr==u.cd.pFrame->nChildMem ); -- assert( u.cd.pProgram->nCsr==u.cd.pFrame->nChildCsr ); -- assert( pc==u.cd.pFrame->pc ); -+ sqlite3VdbeMemRelease(pRt); -+ pRt->flags = MEM_Frame; -+ pRt->u.pFrame = pFrame; -+ -+ pFrame->v = p; -+ pFrame->nChildMem = nMem; -+ pFrame->nChildCsr = pProgram->nCsr; -+ pFrame->pc = pc; -+ pFrame->aMem = p->aMem; -+ pFrame->nMem = p->nMem; -+ pFrame->apCsr = p->apCsr; -+ pFrame->nCursor = p->nCursor; -+ pFrame->aOp = p->aOp; -+ pFrame->nOp = p->nOp; -+ pFrame->token = pProgram->token; -+ pFrame->aOnceFlag = p->aOnceFlag; -+ pFrame->nOnceFlag = p->nOnceFlag; -+ -+ pEnd = &VdbeFrameMem(pFrame)[pFrame->nChildMem]; -+ for(pMem=VdbeFrameMem(pFrame); pMem!=pEnd; pMem++){ -+ pMem->flags = MEM_Invalid; -+ pMem->db = db; -+ } -+ }else{ -+ pFrame = pRt->u.pFrame; -+ assert( pProgram->nMem+pProgram->nCsr==pFrame->nChildMem ); -+ assert( pProgram->nCsr==pFrame->nChildCsr ); -+ assert( pc==pFrame->pc ); - } - - p->nFrame++; -- u.cd.pFrame->pParent = p->pFrame; -- u.cd.pFrame->lastRowid = lastRowid; -- u.cd.pFrame->nChange = p->nChange; -+ pFrame->pParent = p->pFrame; -+ pFrame->lastRowid = lastRowid; -+ pFrame->nChange = p->nChange; - p->nChange = 0; -- p->pFrame = u.cd.pFrame; -- p->aMem = aMem = &VdbeFrameMem(u.cd.pFrame)[-1]; -- p->nMem = u.cd.pFrame->nChildMem; -- p->nCursor = (u16)u.cd.pFrame->nChildCsr; -+ p->pFrame = pFrame; -+ p->aMem = aMem = &VdbeFrameMem(pFrame)[-1]; -+ p->nMem = pFrame->nChildMem; -+ p->nCursor = (u16)pFrame->nChildCsr; - p->apCsr = (VdbeCursor **)&aMem[p->nMem+1]; -- p->aOp = aOp = u.cd.pProgram->aOp; -- p->nOp = u.cd.pProgram->nOp; -+ p->aOp = aOp = pProgram->aOp; -+ p->nOp = pProgram->nOp; - p->aOnceFlag = (u8 *)&p->apCsr[p->nCursor]; -- p->nOnceFlag = u.cd.pProgram->nOnce; -+ p->nOnceFlag = pProgram->nOnce; - pc = -1; - memset(p->aOnceFlag, 0, p->nOnceFlag); - -@@ -71914,13 +72353,11 @@ case OP_Program: { /* jump */ - ** calling OP_Program instruction. - */ - case OP_Param: { /* out2-prerelease */ --#if 0 /* local variables moved into u.ce */ - VdbeFrame *pFrame; - Mem *pIn; --#endif /* local variables moved into u.ce */ -- u.ce.pFrame = p->pFrame; -- u.ce.pIn = &u.ce.pFrame->aMem[pOp->p1 + u.ce.pFrame->aOp[u.ce.pFrame->pc].p1]; -- sqlite3VdbeMemShallowCopy(pOut, u.ce.pIn, MEM_Ephem); -+ pFrame = p->pFrame; -+ pIn = &pFrame->aMem[pOp->p1 + pFrame->aOp[pFrame->pc].p1]; -+ sqlite3VdbeMemShallowCopy(pOut, pIn, MEM_Ephem); - break; - } - -@@ -71981,22 +72418,19 @@ case OP_FkIfZero: { /* jump */ - ** an integer. - */ - case OP_MemMax: { /* in2 */ --#if 0 /* local variables moved into u.cf */ -- Mem *pIn1; - VdbeFrame *pFrame; --#endif /* local variables moved into u.cf */ - if( p->pFrame ){ -- for(u.cf.pFrame=p->pFrame; u.cf.pFrame->pParent; u.cf.pFrame=u.cf.pFrame->pParent); -- u.cf.pIn1 = &u.cf.pFrame->aMem[pOp->p1]; -+ for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent); -+ pIn1 = &pFrame->aMem[pOp->p1]; - }else{ -- u.cf.pIn1 = &aMem[pOp->p1]; -+ pIn1 = &aMem[pOp->p1]; - } -- assert( memIsValid(u.cf.pIn1) ); -- sqlite3VdbeMemIntegerify(u.cf.pIn1); -+ assert( memIsValid(pIn1) ); -+ sqlite3VdbeMemIntegerify(pIn1); - pIn2 = &aMem[pOp->p2]; - sqlite3VdbeMemIntegerify(pIn2); -- if( u.cf.pIn1->u.iu.i){ -- u.cf.pIn1->u.i = pIn2->u.i; -+ if( pIn1->u.iu.i){ -+ pIn1->u.i = pIn2->u.i; - } - break; - } -@@ -72067,56 +72501,54 @@ case OP_IfZero: { /* jump, in1 */ - ** successors. - */ - case OP_AggStep: { --#if 0 /* local variables moved into u.cg */ - int n; - int i; - Mem *pMem; - Mem *pRec; - sqlite3_context ctx; - sqlite3_value **apVal; --#endif /* local variables moved into u.cg */ - -- u.cg.n = pOp->p5; -- assert( u.cg.n>=0 ); -- u.cg.pRec = &aMem[pOp->p2]; -- u.cg.apVal = p->apArg; -- assert( u.cg.apVal || u.cg.n==0 ); -- for(u.cg.i=0; u.cg.ip5; -+ assert( n>=0 ); -+ pRec = &aMem[pOp->p2]; -+ apVal = p->apArg; -+ assert( apVal || n==0 ); -+ for(i=0; ip4.pFunc; -+ ctx.pFunc = pOp->p4.pFunc; - assert( pOp->p3>0 && pOp->p3<=(p->nMem-p->nCursor) ); -- u.cg.ctx.pMem = u.cg.pMem = &aMem[pOp->p3]; -- u.cg.pMem->n++; -- u.cg.ctx.s.flags = MEM_Null; -- u.cg.ctx.s.z = 0; -- u.cg.ctx.s.zMalloc = 0; -- u.cg.ctx.s.xDel = 0; -- u.cg.ctx.s.db = db; -- u.cg.ctx.isError = 0; -- u.cg.ctx.pColl = 0; -- u.cg.ctx.skipFlag = 0; -- if( u.cg.ctx.pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ -+ ctx.pMem = pMem = &aMem[pOp->p3]; -+ pMem->n++; -+ ctx.s.flags = MEM_Null; -+ ctx.s.z = 0; -+ ctx.s.zMalloc = 0; -+ ctx.s.xDel = 0; -+ ctx.s.db = db; -+ ctx.isError = 0; -+ ctx.pColl = 0; -+ ctx.skipFlag = 0; -+ if( ctx.pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ - assert( pOp>p->aOp ); - assert( pOp[-1].p4type==P4_COLLSEQ ); - assert( pOp[-1].opcode==OP_CollSeq ); -- u.cg.ctx.pColl = pOp[-1].p4.pColl; -+ ctx.pColl = pOp[-1].p4.pColl; - } -- (u.cg.ctx.pFunc->xStep)(&u.cg.ctx, u.cg.n, u.cg.apVal); /* IMP: R-24505-23230 */ -- if( u.cg.ctx.isError ){ -- sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&u.cg.ctx.s)); -- rc = u.cg.ctx.isError; -+ (ctx.pFunc->xStep)(&ctx, n, apVal); /* IMP: R-24505-23230 */ -+ if( ctx.isError ){ -+ sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&ctx.s)); -+ rc = ctx.isError; - } -- if( u.cg.ctx.skipFlag ){ -+ if( ctx.skipFlag ){ - assert( pOp[-1].opcode==OP_CollSeq ); -- u.cg.i = pOp[-1].p1; -- if( u.cg.i ) sqlite3VdbeMemSetInt64(&aMem[u.cg.i], 1); -+ i = pOp[-1].p1; -+ if( i ) sqlite3VdbeMemSetInt64(&aMem[i], 1); - } - -- sqlite3VdbeMemRelease(&u.cg.ctx.s); -+ sqlite3VdbeMemRelease(&ctx.s); - - break; - } -@@ -72135,19 +72567,17 @@ case OP_AggStep: { - ** the step function was not previously called. - */ - case OP_AggFinal: { --#if 0 /* local variables moved into u.ch */ - Mem *pMem; --#endif /* local variables moved into u.ch */ - assert( pOp->p1>0 && pOp->p1<=(p->nMem-p->nCursor) ); -- u.ch.pMem = &aMem[pOp->p1]; -- assert( (u.ch.pMem->flags & ~(MEM_Null|MEM_Agg))==0 ); -- rc = sqlite3VdbeMemFinalize(u.ch.pMem, pOp->p4.pFunc); -+ pMem = &aMem[pOp->p1]; -+ assert( (pMem->flags & ~(MEM_Null|MEM_Agg))==0 ); -+ rc = sqlite3VdbeMemFinalize(pMem, pOp->p4.pFunc); - if( rc ){ -- sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(u.ch.pMem)); -+ sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(pMem)); - } -- sqlite3VdbeChangeEncoding(u.ch.pMem, encoding); -- UPDATE_MAX_BLOBSIZE(u.ch.pMem); -- if( sqlite3VdbeMemTooBig(u.ch.pMem) ){ -+ sqlite3VdbeChangeEncoding(pMem, encoding); -+ UPDATE_MAX_BLOBSIZE(pMem); -+ if( sqlite3VdbeMemTooBig(pMem) ){ - goto too_big; - } - break; -@@ -72166,27 +72596,25 @@ case OP_AggFinal: { - ** mem[P3+2] are initialized to -1. - */ - case OP_Checkpoint: { --#if 0 /* local variables moved into u.ci */ - int i; /* Loop counter */ - int aRes[3]; /* Results */ - Mem *pMem; /* Write results here */ --#endif /* local variables moved into u.ci */ - - assert( p->readOnly==0 ); -- u.ci.aRes[0] = 0; -- u.ci.aRes[1] = u.ci.aRes[2] = -1; -+ aRes[0] = 0; -+ aRes[1] = aRes[2] = -1; - assert( pOp->p2==SQLITE_CHECKPOINT_PASSIVE - || pOp->p2==SQLITE_CHECKPOINT_FULL - || pOp->p2==SQLITE_CHECKPOINT_RESTART - ); -- rc = sqlite3Checkpoint(db, pOp->p1, pOp->p2, &u.ci.aRes[1], &u.ci.aRes[2]); -+ rc = sqlite3Checkpoint(db, pOp->p1, pOp->p2, &aRes[1], &aRes[2]); - if( rc==SQLITE_BUSY ){ - rc = SQLITE_OK; -- u.ci.aRes[0] = 1; -- } -- for(u.ci.i=0, u.ci.pMem = &aMem[pOp->p3]; u.ci.i<3; u.ci.i++, u.ci.pMem++){ -- sqlite3VdbeMemSetInt64(u.ci.pMem, (i64)u.ci.aRes[u.ci.i]); -+ aRes[0] = 1; - } -+ for(i=0, pMem = &aMem[pOp->p3]; i<3; i++, pMem++){ -+ sqlite3VdbeMemSetInt64(pMem, (i64)aRes[i]); -+ } - break; - }; - #endif -@@ -72204,7 +72632,6 @@ case OP_Checkpoint: { - ** Write a string containing the final journal-mode to register P2. - */ - case OP_JournalMode: { /* out2-prerelease */ --#if 0 /* local variables moved into u.cj */ - Btree *pBt; /* Btree to change journal mode of */ - Pager *pPager; /* Pager associated with pBt */ - int eNew; /* New journal mode */ -@@ -72212,86 +72639,85 @@ case OP_JournalMode: { /* out2-prerel - #ifndef SQLITE_OMIT_WAL - const char *zFilename; /* Name of database file for pPager */ - #endif --#endif /* local variables moved into u.cj */ - -- u.cj.eNew = pOp->p3; -- assert( u.cj.eNew==PAGER_JOURNALMODE_DELETE -- || u.cj.eNew==PAGER_JOURNALMODE_TRUNCATE -- || u.cj.eNew==PAGER_JOURNALMODE_PERSIST -- || u.cj.eNew==PAGER_JOURNALMODE_OFF -- || u.cj.eNew==PAGER_JOURNALMODE_MEMORY -- || u.cj.eNew==PAGER_JOURNALMODE_WAL -- || u.cj.eNew==PAGER_JOURNALMODE_QUERY -+ eNew = pOp->p3; -+ assert( eNew==PAGER_JOURNALMODE_DELETE -+ || eNew==PAGER_JOURNALMODE_TRUNCATE -+ || eNew==PAGER_JOURNALMODE_PERSIST -+ || eNew==PAGER_JOURNALMODE_OFF -+ || eNew==PAGER_JOURNALMODE_MEMORY -+ || eNew==PAGER_JOURNALMODE_WAL -+ || eNew==PAGER_JOURNALMODE_QUERY - ); - assert( pOp->p1>=0 && pOp->p1nDb ); - assert( p->readOnly==0 ); - -- u.cj.pBt = db->aDb[pOp->p1].pBt; -- u.cj.pPager = sqlite3BtreePager(u.cj.pBt); -- u.cj.eOld = sqlite3PagerGetJournalMode(u.cj.pPager); -- if( u.cj.eNew==PAGER_JOURNALMODE_QUERY ) u.cj.eNew = u.cj.eOld; -- if( !sqlite3PagerOkToChangeJournalMode(u.cj.pPager) ) u.cj.eNew = u.cj.eOld; -+ pBt = db->aDb[pOp->p1].pBt; -+ pPager = sqlite3BtreePager(pBt); -+ eOld = sqlite3PagerGetJournalMode(pPager); -+ if( eNew==PAGER_JOURNALMODE_QUERY ) eNew = eOld; -+ if( !sqlite3PagerOkToChangeJournalMode(pPager) ) eNew = eOld; - - #ifndef SQLITE_OMIT_WAL -- u.cj.zFilename = sqlite3PagerFilename(u.cj.pPager, 1); -+ zFilename = sqlite3PagerFilename(pPager, 1); - - /* Do not allow a transition to journal_mode=WAL for a database -- ** in temporary storage or if the VFS does not support shared memory -+ ** in temporary storage or if the VFS does not support shared memory - */ -- if( u.cj.eNew==PAGER_JOURNALMODE_WAL -- && (sqlite3Strlen30(u.cj.zFilename)==0 /* Temp file */ -- || !sqlite3PagerWalSupported(u.cj.pPager)) /* No shared-memory support */ -+ if( eNew==PAGER_JOURNALMODE_WAL -+ && (sqlite3Strlen30(zFilename)==0 /* Temp file */ -+ || !sqlite3PagerWalSupported(pPager)) /* No shared-memory support */ - ){ -- u.cj.eNew = u.cj.eOld; -+ eNew = eOld; - } - -- if( (u.cj.eNew!=u.cj.eOld) -- && (u.cj.eOld==PAGER_JOURNALMODE_WAL || u.cj.eNew==PAGER_JOURNALMODE_WAL) -+ if( (eNew!=eOld) -+ && (eOld==PAGER_JOURNALMODE_WAL || eNew==PAGER_JOURNALMODE_WAL) - ){ - if( !db->autoCommit || db->nVdbeRead>1 ){ - rc = SQLITE_ERROR; -- sqlite3SetString(&p->zErrMsg, db, -+ sqlite3SetString(&p->zErrMsg, db, - "cannot change %s wal mode from within a transaction", -- (u.cj.eNew==PAGER_JOURNALMODE_WAL ? "into" : "out of") -+ (eNew==PAGER_JOURNALMODE_WAL ? "into" : "out of") - ); - break; - }else{ -- -- if( u.cj.eOld==PAGER_JOURNALMODE_WAL ){ -+ -+ if( eOld==PAGER_JOURNALMODE_WAL ){ - /* If leaving WAL mode, close the log file. If successful, the call -- ** to PagerCloseWal() checkpoints and deletes the write-ahead-log -- ** file. An EXCLUSIVE lock may still be held on the database file -- ** after a successful return. -+ ** to PagerCloseWal() checkpoints and deletes the write-ahead-log -+ ** file. An EXCLUSIVE lock may still be held on the database file -+ ** after a successful return. - */ -- rc = sqlite3PagerCloseWal(u.cj.pPager); -+ rc = sqlite3PagerCloseWal(pPager); - if( rc==SQLITE_OK ){ -- sqlite3PagerSetJournalMode(u.cj.pPager, u.cj.eNew); -+ sqlite3PagerSetJournalMode(pPager, eNew); - } -- }else if( u.cj.eOld==PAGER_JOURNALMODE_MEMORY ){ -+ }else if( eOld==PAGER_JOURNALMODE_MEMORY ){ - /* Cannot transition directly from MEMORY to WAL. Use mode OFF - ** as an intermediate */ -- sqlite3PagerSetJournalMode(u.cj.pPager, PAGER_JOURNALMODE_OFF); -+ sqlite3PagerSetJournalMode(pPager, PAGER_JOURNALMODE_OFF); - } -- -+ - /* Open a transaction on the database file. Regardless of the journal - ** mode, this transaction always uses a rollback journal. - */ -- assert( sqlite3BtreeIsInTrans(u.cj.pBt)==0 ); -+ assert( sqlite3BtreeIsInTrans(pBt)==0 ); - if( rc==SQLITE_OK ){ -- rc = sqlite3BtreeSetVersion(u.cj.pBt, (u.cj.eNew==PAGER_JOURNALMODE_WAL ? 2 : 1)); -+ rc = sqlite3BtreeSetVersion(pBt, (eNew==PAGER_JOURNALMODE_WAL ? 2 : 1)); - } - } - } - #endif /* ifndef SQLITE_OMIT_WAL */ - - if( rc ){ -- u.cj.eNew = u.cj.eOld; -+ eNew = eOld; - } -- u.cj.eNew = sqlite3PagerSetJournalMode(u.cj.pPager, u.cj.eNew); -+ eNew = sqlite3PagerSetJournalMode(pPager, eNew); - - pOut = &aMem[pOp->p2]; - pOut->flags = MEM_Str|MEM_Static|MEM_Term; -- pOut->z = (char *)sqlite3JournalModename(u.cj.eNew); -+ pOut->z = (char *)sqlite3JournalModename(eNew); - pOut->n = sqlite3Strlen30(pOut->z); - pOut->enc = SQLITE_UTF8; - sqlite3VdbeChangeEncoding(pOut, encoding); -@@ -72321,15 +72747,13 @@ case OP_Vacuum: { - ** P2. Otherwise, fall through to the next instruction. - */ - case OP_IncrVacuum: { /* jump */ --#if 0 /* local variables moved into u.ck */ - Btree *pBt; --#endif /* local variables moved into u.ck */ - - assert( pOp->p1>=0 && pOp->p1nDb ); - assert( (p->btreeMask & (((yDbMask)1)<p1))!=0 ); - assert( p->readOnly==0 ); -- u.ck.pBt = db->aDb[pOp->p1].pBt; -- rc = sqlite3BtreeIncrVacuum(u.ck.pBt); -+ pBt = db->aDb[pOp->p1].pBt; -+ rc = sqlite3BtreeIncrVacuum(pBt); - if( rc==SQLITE_DONE ){ - pc = pOp->p2 - 1; - rc = SQLITE_OK; -@@ -72400,12 +72824,10 @@ case OP_TableLock: { - ** code will be set to SQLITE_LOCKED. - */ - case OP_VBegin: { --#if 0 /* local variables moved into u.cl */ - VTable *pVTab; --#endif /* local variables moved into u.cl */ -- u.cl.pVTab = pOp->p4.pVtab; -- rc = sqlite3VtabBegin(db, u.cl.pVTab); -- if( u.cl.pVTab ) sqlite3VtabImportErrmsg(p, u.cl.pVTab->pVtab); -+ pVTab = pOp->p4.pVtab; -+ rc = sqlite3VtabBegin(db, pVTab); -+ if( pVTab ) sqlite3VtabImportErrmsg(p, pVTab->pVtab); - break; - } - #endif /* SQLITE_OMIT_VIRTUALTABLE */ -@@ -72444,32 +72866,30 @@ case OP_VDestroy: { - ** table and stores that cursor in P1. - */ - case OP_VOpen: { --#if 0 /* local variables moved into u.cm */ - VdbeCursor *pCur; - sqlite3_vtab_cursor *pVtabCursor; - sqlite3_vtab *pVtab; - sqlite3_module *pModule; --#endif /* local variables moved into u.cm */ - - assert( p->bIsReader ); -- u.cm.pCur = 0; -- u.cm.pVtabCursor = 0; -- u.cm.pVtab = pOp->p4.pVtab->pVtab; -- u.cm.pModule = (sqlite3_module *)u.cm.pVtab->pModule; -- assert(u.cm.pVtab && u.cm.pModule); -- rc = u.cm.pModule->xOpen(u.cm.pVtab, &u.cm.pVtabCursor); -- sqlite3VtabImportErrmsg(p, u.cm.pVtab); -+ pCur = 0; -+ pVtabCursor = 0; -+ pVtab = pOp->p4.pVtab->pVtab; -+ pModule = (sqlite3_module *)pVtab->pModule; -+ assert(pVtab && pModule); -+ rc = pModule->xOpen(pVtab, &pVtabCursor); -+ sqlite3VtabImportErrmsg(p, pVtab); - if( SQLITE_OK==rc ){ - /* Initialize sqlite3_vtab_cursor base class */ -- u.cm.pVtabCursor->pVtab = u.cm.pVtab; -+ pVtabCursor->pVtab = pVtab; - - /* Initialize vdbe cursor object */ -- u.cm.pCur = allocateCursor(p, pOp->p1, 0, -1, 0); -- if( u.cm.pCur ){ -- u.cm.pCur->pVtabCursor = u.cm.pVtabCursor; -+ pCur = allocateCursor(p, pOp->p1, 0, -1, 0); -+ if( pCur ){ -+ pCur->pVtabCursor = pVtabCursor; - }else{ - db->mallocFailed = 1; -- u.cm.pModule->xClose(u.cm.pVtabCursor); -+ pModule->xClose(pVtabCursor); - } - } - break; -@@ -72497,7 +72917,6 @@ case OP_VOpen: { - ** A jump is made to P2 if the result set after filtering would be empty. - */ - case OP_VFilter: { /* jump */ --#if 0 /* local variables moved into u.cn */ - int nArg; - int iQuery; - const sqlite3_module *pModule; -@@ -72509,45 +72928,44 @@ case OP_VFilter: { /* jump */ - int res; - int i; - Mem **apArg; --#endif /* local variables moved into u.cn */ - -- u.cn.pQuery = &aMem[pOp->p3]; -- u.cn.pArgc = &u.cn.pQuery[1]; -- u.cn.pCur = p->apCsr[pOp->p1]; -- assert( memIsValid(u.cn.pQuery) ); -- REGISTER_TRACE(pOp->p3, u.cn.pQuery); -- assert( u.cn.pCur->pVtabCursor ); -- u.cn.pVtabCursor = u.cn.pCur->pVtabCursor; -- u.cn.pVtab = u.cn.pVtabCursor->pVtab; -- u.cn.pModule = u.cn.pVtab->pModule; -+ pQuery = &aMem[pOp->p3]; -+ pArgc = &pQuery[1]; -+ pCur = p->apCsr[pOp->p1]; -+ assert( memIsValid(pQuery) ); -+ REGISTER_TRACE(pOp->p3, pQuery); -+ assert( pCur->pVtabCursor ); -+ pVtabCursor = pCur->pVtabCursor; -+ pVtab = pVtabCursor->pVtab; -+ pModule = pVtab->pModule; - - /* Grab the index number and argc parameters */ -- assert( (u.cn.pQuery->flags&MEM_Int)!=0 && u.cn.pArgc->flags==MEM_Int ); -- u.cn.nArg = (int)u.cn.pArgc->u.i; -- u.cn.iQuery = (int)u.cn.pQuery->u.i; -+ assert( (pQuery->flags&MEM_Int)!=0 && pArgc->flags==MEM_Int ); -+ nArg = (int)pArgc->u.i; -+ iQuery = (int)pQuery->u.i; - - /* Invoke the xFilter method */ - { -- u.cn.res = 0; -- u.cn.apArg = p->apArg; -- for(u.cn.i = 0; u.cn.iapArg; -+ for(i = 0; iinVtabMethod = 1; -- rc = u.cn.pModule->xFilter(u.cn.pVtabCursor, u.cn.iQuery, pOp->p4.z, u.cn.nArg, u.cn.apArg); -+ rc = pModule->xFilter(pVtabCursor, iQuery, pOp->p4.z, nArg, apArg); - p->inVtabMethod = 0; -- sqlite3VtabImportErrmsg(p, u.cn.pVtab); -+ sqlite3VtabImportErrmsg(p, pVtab); - if( rc==SQLITE_OK ){ -- u.cn.res = u.cn.pModule->xEof(u.cn.pVtabCursor); -+ res = pModule->xEof(pVtabCursor); - } - -- if( u.cn.res ){ -+ if( res ){ - pc = pOp->p2 - 1; - } - } -- u.cn.pCur->nullRow = 0; -+ pCur->nullRow = 0; - - break; - } -@@ -72562,51 +72980,49 @@ case OP_VFilter: { /* jump */ - ** P1 cursor is pointing to into register P3. - */ - case OP_VColumn: { --#if 0 /* local variables moved into u.co */ - sqlite3_vtab *pVtab; - const sqlite3_module *pModule; - Mem *pDest; - sqlite3_context sContext; --#endif /* local variables moved into u.co */ - - VdbeCursor *pCur = p->apCsr[pOp->p1]; - assert( pCur->pVtabCursor ); - assert( pOp->p3>0 && pOp->p3<=(p->nMem-p->nCursor) ); -- u.co.pDest = &aMem[pOp->p3]; -- memAboutToChange(p, u.co.pDest); -+ pDest = &aMem[pOp->p3]; -+ memAboutToChange(p, pDest); - if( pCur->nullRow ){ -- sqlite3VdbeMemSetNull(u.co.pDest); -+ sqlite3VdbeMemSetNull(pDest); - break; - } -- u.co.pVtab = pCur->pVtabCursor->pVtab; -- u.co.pModule = u.co.pVtab->pModule; -- assert( u.co.pModule->xColumn ); -- memset(&u.co.sContext, 0, sizeof(u.co.sContext)); -+ pVtab = pCur->pVtabCursor->pVtab; -+ pModule = pVtab->pModule; -+ assert( pModule->xColumn ); -+ memset(&sContext, 0, sizeof(sContext)); - - /* The output cell may already have a buffer allocated. Move -- ** the current contents to u.co.sContext.s so in case the user-function -- ** can use the already allocated buffer instead of allocating a -+ ** the current contents to sContext.s so in case the user-function -+ ** can use the already allocated buffer instead of allocating a - ** new one. - */ -- sqlite3VdbeMemMove(&u.co.sContext.s, u.co.pDest); -- MemSetTypeFlag(&u.co.sContext.s, MEM_Null); -+ sqlite3VdbeMemMove(&sContext.s, pDest); -+ MemSetTypeFlag(&sContext.s, MEM_Null); - -- rc = u.co.pModule->xColumn(pCur->pVtabCursor, &u.co.sContext, pOp->p2); -- sqlite3VtabImportErrmsg(p, u.co.pVtab); -- if( u.co.sContext.isError ){ -- rc = u.co.sContext.isError; -+ rc = pModule->xColumn(pCur->pVtabCursor, &sContext, pOp->p2); -+ sqlite3VtabImportErrmsg(p, pVtab); -+ if( sContext.isError ){ -+ rc = sContext.isError; - } - - /* Copy the result of the function to the P3 register. We - ** do this regardless of whether or not an error occurred to ensure any -- ** dynamic allocation in u.co.sContext.s (a Mem struct) is released. -+ ** dynamic allocation in sContext.s (a Mem struct) is released. - */ -- sqlite3VdbeChangeEncoding(&u.co.sContext.s, encoding); -- sqlite3VdbeMemMove(u.co.pDest, &u.co.sContext.s); -- REGISTER_TRACE(pOp->p3, u.co.pDest); -- UPDATE_MAX_BLOBSIZE(u.co.pDest); -+ sqlite3VdbeChangeEncoding(&sContext.s, encoding); -+ sqlite3VdbeMemMove(pDest, &sContext.s); -+ REGISTER_TRACE(pOp->p3, pDest); -+ UPDATE_MAX_BLOBSIZE(pDest); - -- if( sqlite3VdbeMemTooBig(u.co.pDest) ){ -+ if( sqlite3VdbeMemTooBig(pDest) ){ - goto too_big; - } - break; -@@ -72621,38 +73037,36 @@ case OP_VColumn: { - ** the end of its result set, then fall through to the next instruction. - */ - case OP_VNext: { /* jump */ --#if 0 /* local variables moved into u.cp */ - sqlite3_vtab *pVtab; - const sqlite3_module *pModule; - int res; - VdbeCursor *pCur; --#endif /* local variables moved into u.cp */ - -- u.cp.res = 0; -- u.cp.pCur = p->apCsr[pOp->p1]; -- assert( u.cp.pCur->pVtabCursor ); -- if( u.cp.pCur->nullRow ){ -+ res = 0; -+ pCur = p->apCsr[pOp->p1]; -+ assert( pCur->pVtabCursor ); -+ if( pCur->nullRow ){ - break; - } -- u.cp.pVtab = u.cp.pCur->pVtabCursor->pVtab; -- u.cp.pModule = u.cp.pVtab->pModule; -- assert( u.cp.pModule->xNext ); -+ pVtab = pCur->pVtabCursor->pVtab; -+ pModule = pVtab->pModule; -+ assert( pModule->xNext ); - - /* Invoke the xNext() method of the module. There is no way for the - ** underlying implementation to return an error if one occurs during -- ** xNext(). Instead, if an error occurs, true is returned (indicating that -+ ** xNext(). Instead, if an error occurs, true is returned (indicating that - ** data is available) and the error code returned when xColumn or - ** some other method is next invoked on the save virtual table cursor. - */ - p->inVtabMethod = 1; -- rc = u.cp.pModule->xNext(u.cp.pCur->pVtabCursor); -+ rc = pModule->xNext(pCur->pVtabCursor); - p->inVtabMethod = 0; -- sqlite3VtabImportErrmsg(p, u.cp.pVtab); -+ sqlite3VtabImportErrmsg(p, pVtab); - if( rc==SQLITE_OK ){ -- u.cp.res = u.cp.pModule->xEof(u.cp.pCur->pVtabCursor); -+ res = pModule->xEof(pCur->pVtabCursor); - } - -- if( !u.cp.res ){ -+ if( !res ){ - /* If there is data, jump to P2 */ - pc = pOp->p2 - 1; - } -@@ -72668,25 +73082,23 @@ case OP_VNext: { /* jump */ - ** in register P1 is passed as the zName argument to the xRename method. - */ - case OP_VRename: { --#if 0 /* local variables moved into u.cq */ - sqlite3_vtab *pVtab; - Mem *pName; --#endif /* local variables moved into u.cq */ - -- u.cq.pVtab = pOp->p4.pVtab->pVtab; -- u.cq.pName = &aMem[pOp->p1]; -- assert( u.cq.pVtab->pModule->xRename ); -- assert( memIsValid(u.cq.pName) ); -+ pVtab = pOp->p4.pVtab->pVtab; -+ pName = &aMem[pOp->p1]; -+ assert( pVtab->pModule->xRename ); -+ assert( memIsValid(pName) ); - assert( p->readOnly==0 ); -- REGISTER_TRACE(pOp->p1, u.cq.pName); -- assert( u.cq.pName->flags & MEM_Str ); -- testcase( u.cq.pName->enc==SQLITE_UTF8 ); -- testcase( u.cq.pName->enc==SQLITE_UTF16BE ); -- testcase( u.cq.pName->enc==SQLITE_UTF16LE ); -- rc = sqlite3VdbeChangeEncoding(u.cq.pName, SQLITE_UTF8); -+ REGISTER_TRACE(pOp->p1, pName); -+ assert( pName->flags & MEM_Str ); -+ testcase( pName->enc==SQLITE_UTF8 ); -+ testcase( pName->enc==SQLITE_UTF16BE ); -+ testcase( pName->enc==SQLITE_UTF16LE ); -+ rc = sqlite3VdbeChangeEncoding(pName, SQLITE_UTF8); - if( rc==SQLITE_OK ){ -- rc = u.cq.pVtab->pModule->xRename(u.cq.pVtab, u.cq.pName->z); -- sqlite3VtabImportErrmsg(p, u.cq.pVtab); -+ rc = pVtab->pModule->xRename(pVtab, pName->z); -+ sqlite3VtabImportErrmsg(p, pVtab); - p->expired = 0; - } - break; -@@ -72719,7 +73131,6 @@ case OP_VRename: { - ** is set to the value of the rowid for the row just inserted. - */ - case OP_VUpdate: { --#if 0 /* local variables moved into u.cr */ - sqlite3_vtab *pVtab; - sqlite3_module *pModule; - int nArg; -@@ -72727,34 +73138,33 @@ case OP_VUpdate: { - sqlite_int64 rowid; - Mem **apArg; - Mem *pX; --#endif /* local variables moved into u.cr */ - -- assert( pOp->p2==1 || pOp->p5==OE_Fail || pOp->p5==OE_Rollback -+ assert( pOp->p2==1 || pOp->p5==OE_Fail || pOp->p5==OE_Rollback - || pOp->p5==OE_Abort || pOp->p5==OE_Ignore || pOp->p5==OE_Replace - ); - assert( p->readOnly==0 ); -- u.cr.pVtab = pOp->p4.pVtab->pVtab; -- u.cr.pModule = (sqlite3_module *)u.cr.pVtab->pModule; -- u.cr.nArg = pOp->p2; -+ pVtab = pOp->p4.pVtab->pVtab; -+ pModule = (sqlite3_module *)pVtab->pModule; -+ nArg = pOp->p2; - assert( pOp->p4type==P4_VTAB ); -- if( ALWAYS(u.cr.pModule->xUpdate) ){ -+ if( ALWAYS(pModule->xUpdate) ){ - u8 vtabOnConflict = db->vtabOnConflict; -- u.cr.apArg = p->apArg; -- u.cr.pX = &aMem[pOp->p3]; -- for(u.cr.i=0; u.cr.iapArg; -+ pX = &aMem[pOp->p3]; -+ for(i=0; ivtabOnConflict = pOp->p5; -- rc = u.cr.pModule->xUpdate(u.cr.pVtab, u.cr.nArg, u.cr.apArg, &u.cr.rowid); -+ rc = pModule->xUpdate(pVtab, nArg, apArg, &rowid); - db->vtabOnConflict = vtabOnConflict; -- sqlite3VtabImportErrmsg(p, u.cr.pVtab); -+ sqlite3VtabImportErrmsg(p, pVtab); - if( rc==SQLITE_OK && pOp->p1 ){ -- assert( u.cr.nArg>1 && u.cr.apArg[0] && (u.cr.apArg[0]->flags&MEM_Null) ); -- db->lastRowid = lastRowid = u.cr.rowid; -+ assert( nArg>1 && apArg[0] && (apArg[0]->flags&MEM_Null) ); -+ db->lastRowid = lastRowid = rowid; - } - if( (rc&0xff)==SQLITE_CONSTRAINT && pOp->p4.pVtab->bConstraint ){ - if( pOp->p5==OE_Ignore ){ -@@ -72814,34 +73224,32 @@ case OP_MaxPgcnt: { /* out2-p - ** the UTF-8 string contained in P4 is emitted on the trace callback. - */ - case OP_Trace: { --#if 0 /* local variables moved into u.cs */ - char *zTrace; - char *z; --#endif /* local variables moved into u.cs */ - - if( db->xTrace - && !p->doingRerun -- && (u.cs.zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 -+ && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 - ){ -- u.cs.z = sqlite3VdbeExpandSql(p, u.cs.zTrace); -- db->xTrace(db->pTraceArg, u.cs.z); -- sqlite3DbFree(db, u.cs.z); -+ z = sqlite3VdbeExpandSql(p, zTrace); -+ db->xTrace(db->pTraceArg, z); -+ sqlite3DbFree(db, z); - } - #ifdef SQLITE_USE_FCNTL_TRACE -- u.cs.zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql); -- if( u.cs.zTrace ){ -+ zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql); -+ if( zTrace ){ - int i; - for(i=0; inDb; i++){ - if( ((1<btreeMask)==0 ) continue; -- sqlite3_file_control(db, db->aDb[i].zName, SQLITE_FCNTL_TRACE, u.cs.zTrace); -+ sqlite3_file_control(db, db->aDb[i].zName, SQLITE_FCNTL_TRACE, zTrace); - } - } - #endif /* SQLITE_USE_FCNTL_TRACE */ - #ifdef SQLITE_DEBUG - if( (db->flags & SQLITE_SqlTrace)!=0 -- && (u.cs.zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 -+ && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 - ){ -- sqlite3DebugPrintf("SQL-trace: %s\n", u.cs.zTrace); -+ sqlite3DebugPrintf("SQL-trace: %s\n", zTrace); - } - #endif /* SQLITE_DEBUG */ - break; -@@ -72971,6 +73379,7 @@ abort_due_to_interrupt: - goto vdbe_error_halt; - } - -+ - /************** End of vdbe.c ************************************************/ - /************** Begin file vdbeblob.c ****************************************/ - /* -@@ -73228,7 +73637,7 @@ SQLITE_API int sqlite3_blob_open( - } - } - -- pBlob->pStmt = (sqlite3_stmt *)sqlite3VdbeCreate(db); -+ pBlob->pStmt = (sqlite3_stmt *)sqlite3VdbeCreate(pParse); - assert( pBlob->pStmt || db->mallocFailed ); - if( pBlob->pStmt ){ - Vdbe *v = (Vdbe *)pBlob->pStmt; -@@ -75118,9 +75527,12 @@ SQLITE_PRIVATE int sqlite3WalkSelectFrom - /* - ** Call sqlite3WalkExpr() for every expression in Select statement p. - ** Invoke sqlite3WalkSelect() for subqueries in the FROM clause and --** on the compound select chain, p->pPrior. Invoke the xSelectCallback() --** either before or after the walk of expressions and FROM clause, depending --** on whether pWalker->bSelectDepthFirst is false or true, respectively. -+** on the compound select chain, p->pPrior. -+** -+** If it is not NULL, the xSelectCallback() callback is invoked before -+** the walk of the expressions and FROM clause. The xSelectCallback2() -+** method, if it is not NULL, is invoked following the walk of the -+** expressions and FROM clause. - ** - ** Return WRC_Continue under normal conditions. Return WRC_Abort if - ** there is an abort request. -@@ -75130,11 +75542,13 @@ SQLITE_PRIVATE int sqlite3WalkSelectFrom - */ - SQLITE_PRIVATE int sqlite3WalkSelect(Walker *pWalker, Select *p){ - int rc; -- if( p==0 || pWalker->xSelectCallback==0 ) return WRC_Continue; -+ if( p==0 || (pWalker->xSelectCallback==0 && pWalker->xSelectCallback2==0) ){ -+ return WRC_Continue; -+ } - rc = WRC_Continue; - pWalker->walkerDepth++; - while( p ){ -- if( !pWalker->bSelectDepthFirst ){ -+ if( pWalker->xSelectCallback ){ - rc = pWalker->xSelectCallback(pWalker, p); - if( rc ) break; - } -@@ -75144,12 +75558,8 @@ SQLITE_PRIVATE int sqlite3WalkSelect(Wal - pWalker->walkerDepth--; - return WRC_Abort; - } -- if( pWalker->bSelectDepthFirst ){ -- rc = pWalker->xSelectCallback(pWalker, p); -- /* Depth-first search is currently only used for -- ** selectAddSubqueryTypeInfo() and that routine always returns -- ** WRC_Continue (0). So the following branch is never taken. */ -- if( NEVER(rc) ) break; -+ if( pWalker->xSelectCallback2 ){ -+ pWalker->xSelectCallback2(pWalker, p); - } - p = p->pPrior; - } -@@ -75386,7 +75796,7 @@ static int lookupName( - struct SrcList_item *pMatch = 0; /* The matching pSrcList item */ - NameContext *pTopNC = pNC; /* First namecontext in the list */ - Schema *pSchema = 0; /* Schema of the expression */ -- int isTrigger = 0; /* True if resolved to a trigger column */ -+ u8 newOp = TK_COLUMN; /* pExpr->op after resolving name */ - Table *pTab = 0; /* Table hold the row */ - Column *pCol; /* A column of pTab */ - -@@ -75427,6 +75837,26 @@ static int lookupName( - ExprList *pEList; - SrcList *pSrcList = pNC->pSrcList; - -+#ifndef SQLITE_OMIT_CTE -+ /* The identifier "LEVEL", without a table or database qualifier and -+ ** within a recursive common table expression, resolves to the special -+ ** LEVEL pseudo-column. To access table names called "level", add a -+ ** table qualifier. -+ */ -+ if( (pNC->ncFlags&NC_Recursive)!=0 -+ && zTab==0 -+ && sqlite3_stricmp(zCol,"level")==0 -+ ){ -+ assert( cnt==0 ); -+ cnt = 1; -+ newOp = TK_LEVEL; -+ pExpr->iColumn = -1; -+ pExpr->affinity = SQLITE_AFF_INTEGER; -+ pNC->ncFlags |= NC_UsesLevel; -+ break; -+ } -+#endif -+ - if( pSrcList ){ - for(i=0, pItem=pSrcList->a; inSrc; i++, pItem++){ - pTab = pItem->pTab; -@@ -75531,7 +75961,7 @@ static int lookupName( - } - pExpr->iColumn = (i16)iCol; - pExpr->pTab = pTab; -- isTrigger = 1; -+ newOp = TK_TRIGGER; - } - } - } -@@ -75655,11 +76085,11 @@ static int lookupName( - pExpr->pLeft = 0; - sqlite3ExprDelete(db, pExpr->pRight); - pExpr->pRight = 0; -- pExpr->op = (isTrigger ? TK_TRIGGER : TK_COLUMN); -+ pExpr->op = newOp; - lookupname_end: - if( cnt==1 ){ - assert( pNC!=0 ); -- if( pExpr->op!=TK_AS ){ -+ if( pExpr->op!=TK_AS && pExpr->op!=TK_LEVEL ){ - sqlite3AuthRead(pParse, pExpr, pSchema, pNC->pSrcList); - } - /* Increment the nRef value on all name contexts from TopNC up to -@@ -76356,6 +76786,7 @@ static int resolveSelectStep(Walker *pWa - ** resolve the result-set expression list. - */ - sNC.ncFlags = NC_AllowAgg; -+ if( p->selFlags & SF_Recursive ) sNC.ncFlags |= NC_Recursive; - sNC.pSrcList = p->pSrc; - sNC.pNext = pOuterNC; - -@@ -76434,6 +76865,10 @@ static int resolveSelectStep(Walker *pWa - } - } - } -+ if( sNC.ncFlags & NC_UsesLevel ){ -+ p->selFlags |= SF_UsesLevel; -+ } -+ sNC.ncFlags &= ~(NC_Recursive|NC_UsesLevel); - - /* Advance to the next term of the compound - */ -@@ -77135,16 +77570,25 @@ SQLITE_PRIVATE Expr *sqlite3PExpr( - } - - /* --** Return 1 if an expression must be FALSE in all cases and 0 if the --** expression might be true. This is an optimization. If is OK to --** return 0 here even if the expression really is always false (a --** false negative). But it is a bug to return 1 if the expression --** might be true in some rare circumstances (a false positive.) -+** If the expression is always either TRUE or FALSE (respectively), -+** then return 1. If one cannot determine the truth value of the -+** expression at compile-time return 0. -+** -+** This is an optimization. If is OK to return 0 here even if -+** the expression really is always false or false (a false negative). -+** But it is a bug to return 1 if the expression might have different -+** boolean values in different circumstances (a false positive.) - ** - ** Note that if the expression is part of conditional for a - ** LEFT JOIN, then we cannot determine at compile-time whether or not - ** is it true or false, so always return 0. - */ -+static int exprAlwaysTrue(Expr *p){ -+ int v = 0; -+ if( ExprHasProperty(p, EP_FromJoin) ) return 0; -+ if( !sqlite3ExprIsInteger(p, &v) ) return 0; -+ return v!=0; -+} - static int exprAlwaysFalse(Expr *p){ - int v = 0; - if( ExprHasProperty(p, EP_FromJoin) ) return 0; -@@ -77499,6 +77943,33 @@ static Expr *exprDup(sqlite3 *db, Expr * - } - - /* -+** Create and return a deep copy of the object passed as the second -+** argument. If an OOM condition is encountered, NULL is returned -+** and the db->mallocFailed flag set. -+*/ -+#ifndef SQLITE_OMIT_CTE -+static With *withDup(sqlite3 *db, With *p){ -+ With *pRet = 0; -+ if( p ){ -+ int nByte = sizeof(*p) + sizeof(p->a[0]) * (p->nCte-1); -+ pRet = sqlite3DbMallocZero(db, nByte); -+ if( pRet ){ -+ int i; -+ pRet->nCte = p->nCte; -+ for(i=0; inCte; i++){ -+ pRet->a[i].pSelect = sqlite3SelectDup(db, p->a[i].pSelect, 0); -+ pRet->a[i].pCols = sqlite3ExprListDup(db, p->a[i].pCols, 0); -+ pRet->a[i].zName = sqlite3DbStrDup(db, p->a[i].zName); -+ } -+ } -+ } -+ return pRet; -+} -+#else -+# define withDup(x,y) 0 -+#endif -+ -+/* - ** The following group of routines make deep copies of expressions, - ** expression lists, ID lists, and select statements. The copies can - ** be deleted (by being passed to their respective ...Delete() routines) -@@ -77578,6 +78049,7 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListDu - pNewItem->regReturn = pOldItem->regReturn; - pNewItem->isCorrelated = pOldItem->isCorrelated; - pNewItem->viaCoroutine = pOldItem->viaCoroutine; -+ pNewItem->isRecursive = pOldItem->isRecursive; - pNewItem->zIndex = sqlite3DbStrDup(db, pOldItem->zIndex); - pNewItem->notIndexed = pOldItem->notIndexed; - pNewItem->pIndex = pOldItem->pIndex; -@@ -77639,6 +78111,7 @@ SQLITE_PRIVATE Select *sqlite3SelectDup( - pNew->addrOpenEphm[0] = -1; - pNew->addrOpenEphm[1] = -1; - pNew->addrOpenEphm[2] = -1; -+ pNew->pWith = withDup(db, p->pWith); - return pNew; - } - #else -@@ -78158,9 +78631,11 @@ SQLITE_PRIVATE int sqlite3FindInIndex(Pa - iCol = (i16)pExpr->iColumn; - - /* Code an OP_VerifyCookie and OP_TableLock for . */ -- iDb = sqlite3SchemaToIndex(db, pTab->pSchema); -- sqlite3CodeVerifySchema(pParse, iDb); -- sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); -+ if( ALWAYS(pTab->pSchema) ){ -+ iDb = sqlite3SchemaToIndex(db, pTab->pSchema); -+ sqlite3CodeVerifySchema(pParse, iDb); -+ sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); -+ } - - /* This function is only called from two places. In both cases the vdbe - ** has already been allocated. So assume sqlite3GetVdbe() is always -@@ -78782,6 +79257,11 @@ SQLITE_PRIVATE void sqlite3ExprCacheRemo - */ - SQLITE_PRIVATE void sqlite3ExprCachePush(Parse *pParse){ - pParse->iCacheLevel++; -+#ifdef SQLITE_DEBUG -+ if( pParse->db->flags & SQLITE_VdbeAddopTrace ){ -+ printf("PUSH to %d\n", pParse->iCacheLevel); -+ } -+#endif - } - - /* -@@ -78795,6 +79275,11 @@ SQLITE_PRIVATE void sqlite3ExprCachePop( - assert( N>0 ); - assert( pParse->iCacheLevel>=N ); - pParse->iCacheLevel -= N; -+#ifdef SQLITE_DEBUG -+ if( pParse->db->flags & SQLITE_VdbeAddopTrace ){ -+ printf("POP to %d\n", pParse->iCacheLevel); -+ } -+#endif - for(i=0, p=pParse->aColCache; iiReg && p->iLevel>pParse->iCacheLevel ){ - cacheEntryClear(pParse, p); -@@ -78889,6 +79374,11 @@ SQLITE_PRIVATE void sqlite3ExprCacheClea - int i; - struct yColCache *p; - -+#if SQLITE_DEBUG -+ if( pParse->db->flags & SQLITE_VdbeAddopTrace ){ -+ printf("CLEAR\n"); -+ } -+#endif - for(i=0, p=pParse->aColCache; iiReg ){ - cacheEntryClear(pParse, p); -@@ -79015,6 +79505,12 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget - pExpr->op2); - break; - } -+#ifndef SQLITE_OMIT_CTE -+ case TK_LEVEL: { -+ inReg = pParse->regLevel; -+ break; -+ } -+#endif - case TK_INTEGER: { - codeInteger(pParse, pExpr, 0, target); - break; -@@ -79638,6 +80134,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTemp(P - pExpr = sqlite3ExprSkipCollate(pExpr); - if( ConstFactorOk(pParse) - && pExpr->op!=TK_REGISTER -+ && pExpr->op!=TK_LEVEL - && sqlite3ExprIsConstantNotJoin(pExpr) - ){ - ExprList *p = pParse->pConstExpr; -@@ -80025,7 +80522,17 @@ SQLITE_PRIVATE int sqlite3ExprCodeExprLi - }else{ - int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i); - if( inReg!=target+i ){ -- sqlite3VdbeAddOp2(pParse->pVdbe, copyOp, inReg, target+i); -+ VdbeOp *pOp; -+ Vdbe *v = pParse->pVdbe; -+ if( copyOp==OP_Copy -+ && (pOp=sqlite3VdbeGetOp(v, -1))->opcode==OP_Copy -+ && pOp->p1+pOp->p3+1==inReg -+ && pOp->p2+pOp->p3+1==target+i -+ ){ -+ pOp->p3++; -+ }else{ -+ sqlite3VdbeAddOp2(v, copyOp, inReg, target+i); -+ } - } - } - } -@@ -80116,8 +80623,8 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Pa - case TK_AND: { - int d2 = sqlite3VdbeMakeLabel(v); - testcase( jumpIfNull==0 ); -- sqlite3ExprCachePush(pParse); - sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2,jumpIfNull^SQLITE_JUMPIFNULL); -+ sqlite3ExprCachePush(pParse); - sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); - sqlite3VdbeResolveLabel(v, d2); - sqlite3ExprCachePop(pParse, 1); -@@ -80126,7 +80633,9 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Pa - case TK_OR: { - testcase( jumpIfNull==0 ); - sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); -+ sqlite3ExprCachePush(pParse); - sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); -+ sqlite3ExprCachePop(pParse, 1); - break; - } - case TK_NOT: { -@@ -80201,10 +80710,16 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Pa - } - #endif - default: { -- r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); -- sqlite3VdbeAddOp3(v, OP_If, r1, dest, jumpIfNull!=0); -- testcase( regFree1==0 ); -- testcase( jumpIfNull==0 ); -+ if( exprAlwaysTrue(pExpr) ){ -+ sqlite3VdbeAddOp2(v, OP_Goto, 0, dest); -+ }else if( exprAlwaysFalse(pExpr) ){ -+ /* No-op */ -+ }else{ -+ r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); -+ sqlite3VdbeAddOp3(v, OP_If, r1, dest, jumpIfNull!=0); -+ testcase( regFree1==0 ); -+ testcase( jumpIfNull==0 ); -+ } - break; - } - } -@@ -80267,14 +80782,16 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(P - case TK_AND: { - testcase( jumpIfNull==0 ); - sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); -+ sqlite3ExprCachePush(pParse); - sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); -+ sqlite3ExprCachePop(pParse, 1); - break; - } - case TK_OR: { - int d2 = sqlite3VdbeMakeLabel(v); - testcase( jumpIfNull==0 ); -- sqlite3ExprCachePush(pParse); - sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, jumpIfNull^SQLITE_JUMPIFNULL); -+ sqlite3ExprCachePush(pParse); - sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); - sqlite3VdbeResolveLabel(v, d2); - sqlite3ExprCachePop(pParse, 1); -@@ -80346,10 +80863,16 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(P - } - #endif - default: { -- r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); -- sqlite3VdbeAddOp3(v, OP_IfNot, r1, dest, jumpIfNull!=0); -- testcase( regFree1==0 ); -- testcase( jumpIfNull==0 ); -+ if( exprAlwaysFalse(pExpr) ){ -+ sqlite3VdbeAddOp2(v, OP_Goto, 0, dest); -+ }else if( exprAlwaysTrue(pExpr) ){ -+ /* no-op */ -+ }else{ -+ r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); -+ sqlite3VdbeAddOp3(v, OP_IfNot, r1, dest, jumpIfNull!=0); -+ testcase( regFree1==0 ); -+ testcase( jumpIfNull==0 ); -+ } - break; - } - } -@@ -83449,10 +83972,6 @@ static int resolveAttachExpr(NameContext - if( pExpr ){ - if( pExpr->op!=TK_ID ){ - rc = sqlite3ResolveExprNames(pName, pExpr); -- if( rc==SQLITE_OK && !sqlite3ExprIsConstant(pExpr) ){ -- sqlite3ErrorMsg(pName->pParse, "invalid name: \"%s\"", pExpr->u.zToken); -- return SQLITE_ERROR; -- } - }else{ - pExpr->op = TK_STRING; - } -@@ -84382,6 +84901,7 @@ SQLITE_PRIVATE void sqlite3FinishCoding( - assert( !pParse->isMultiWrite - || sqlite3VdbeAssertMayAbort(v, pParse->mayAbort)); - if( v ){ -+ while( sqlite3VdbeDeletePriorOpcode(v, OP_Close) ){} - sqlite3VdbeAddOp0(v, OP_Halt); - - /* The cookie mask contains one bit for each database file open. -@@ -85693,10 +86213,10 @@ static void identPut(char *z, int *pIdx, - for(j=0; zIdent[j]; j++){ - if( !sqlite3Isalnum(zIdent[j]) && zIdent[j]!='_' ) break; - } -- needQuote = sqlite3Isdigit(zIdent[0]) || sqlite3KeywordCode(zIdent, j)!=TK_ID; -- if( !needQuote ){ -- needQuote = zIdent[j]; -- } -+ needQuote = sqlite3Isdigit(zIdent[0]) -+ || sqlite3KeywordCode(zIdent, j)!=TK_ID -+ || zIdent[j]!=0 -+ || j==0; - - if( needQuote ) z[i++] = '"'; - for(j=0; zIdent[j]; j++){ -@@ -86919,7 +87439,7 @@ static void sqlite3RefillIndex(Parse *pP - addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0); - regRecord = sqlite3GetTempReg(pParse); - -- sqlite3GenerateIndexKey(pParse, pIndex, iTab, regRecord, 0, &iPartIdxLabel); -+ sqlite3GenerateIndexKey(pParse,pIndex,iTab,regRecord,0,&iPartIdxLabel,0,0); - sqlite3VdbeAddOp2(v, OP_SorterInsert, iSorter, regRecord); - sqlite3VdbeResolveLabel(v, iPartIdxLabel); - sqlite3VdbeAddOp2(v, OP_Next, iTab, addr1+1); -@@ -88231,9 +88751,9 @@ SQLITE_PRIVATE void sqlite3UniqueConstra - for(j=0; jnKeyCol; j++){ - char *zCol = pTab->aCol[pIdx->aiColumn[j]].zName; - if( j ) sqlite3StrAccumAppend(&errMsg, ", ", 2); -- sqlite3StrAccumAppend(&errMsg, pTab->zName, -1); -+ sqlite3StrAccumAppendAll(&errMsg, pTab->zName); - sqlite3StrAccumAppend(&errMsg, ".", 1); -- sqlite3StrAccumAppend(&errMsg, zCol, -1); -+ sqlite3StrAccumAppendAll(&errMsg, zCol); - } - zErr = sqlite3StrAccumFinish(&errMsg); - sqlite3HaltConstraint(pParse, -@@ -88425,8 +88945,9 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOf - assert( sqlite3KeyInfoIsWriteable(pKey) ); - for(i=0; iazColl[i]; -- if( NEVER(zColl==0) ) zColl = "BINARY"; -- pKey->aColl[i] = sqlite3LocateCollSeq(pParse, zColl); -+ assert( zColl!=0 ); -+ pKey->aColl[i] = strcmp(zColl,"BINARY")==0 ? 0 : -+ sqlite3LocateCollSeq(pParse, zColl); - pKey->aSortOrder[i] = pIdx->aSortOrder[i]; - } - if( pParse->nErr ){ -@@ -88439,6 +88960,76 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOf - return sqlite3KeyInfoRef(pIdx->pKeyInfo); - } - -+#ifndef SQLITE_OMIT_CTE -+/* -+** This routine is invoked once per CTE by the parser while parsing a -+** WITH clause. -+*/ -+SQLITE_PRIVATE With *sqlite3WithAdd( -+ Parse *pParse, /* Parsing context */ -+ With *pWith, /* Existing WITH clause, or NULL */ -+ Token *pName, /* Name of the common-table */ -+ ExprList *pArglist, /* Optional column name list for the table */ -+ Select *pQuery /* Query used to initialize the table */ -+){ -+ sqlite3 *db = pParse->db; -+ With *pNew; -+ char *zName; -+ -+ /* Check that the CTE name is unique within this WITH clause. If -+ ** not, store an error in the Parse structure. */ -+ zName = sqlite3NameFromToken(pParse->db, pName); -+ if( zName && pWith ){ -+ int i; -+ for(i=0; inCte; i++){ -+ if( sqlite3StrICmp(zName, pWith->a[i].zName)==0 ){ -+ sqlite3ErrorMsg(pParse, "duplicate WITH table name: %s", zName); -+ } -+ } -+ } -+ -+ if( pWith ){ -+ int nByte = sizeof(*pWith) + (sizeof(pWith->a[1]) * pWith->nCte); -+ pNew = sqlite3DbRealloc(db, pWith, nByte); -+ }else{ -+ pNew = sqlite3DbMallocZero(db, sizeof(*pWith)); -+ } -+ assert( zName!=0 || pNew==0 ); -+ assert( db->mallocFailed==0 || pNew==0 ); -+ -+ if( pNew==0 ){ -+ sqlite3ExprListDelete(db, pArglist); -+ sqlite3SelectDelete(db, pQuery); -+ sqlite3DbFree(db, zName); -+ pNew = pWith; -+ }else{ -+ pNew->a[pNew->nCte].pSelect = pQuery; -+ pNew->a[pNew->nCte].pCols = pArglist; -+ pNew->a[pNew->nCte].zName = zName; -+ pNew->a[pNew->nCte].zErr = 0; -+ pNew->nCte++; -+ } -+ -+ return pNew; -+} -+ -+/* -+** Free the contents of the With object passed as the second argument. -+*/ -+SQLITE_PRIVATE void sqlite3WithDelete(sqlite3 *db, With *pWith){ -+ if( pWith ){ -+ int i; -+ for(i=0; inCte; i++){ -+ struct Cte *pCte = &pWith->a[i]; -+ sqlite3ExprListDelete(db, pCte->pCols); -+ sqlite3SelectDelete(db, pCte->pSelect); -+ sqlite3DbFree(db, pCte->zName); -+ } -+ sqlite3DbFree(db, pWith); -+ } -+} -+#endif /* !defined(SQLITE_OMIT_CTE) */ -+ - /************** End of build.c ***********************************************/ - /************** Begin file callback.c ****************************************/ - /* -@@ -88799,7 +89390,6 @@ SQLITE_PRIVATE FuncDef *sqlite3FindFunct - - assert( nArg>=(-2) ); - assert( nArg>=(-1) || createFlag==0 ); -- assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); - h = (sqlite3UpperToLower[(u8)zName[0]] + nName) % ArraySize(db->aFunc.a); - - /* First search for a match amongst the application-defined functions. -@@ -89638,9 +90228,10 @@ SQLITE_PRIVATE void sqlite3GenerateRowIn - int *aRegIdx /* Only delete if aRegIdx!=0 && aRegIdx[i]>0 */ - ){ - int i; /* Index loop counter */ -- int r1; /* Register holding an index key */ -+ int r1 = -1; /* Register holding an index key */ - int iPartIdxLabel; /* Jump destination for skipping partial index entries */ - Index *pIdx; /* Current index */ -+ Index *pPrior = 0; /* Prior index */ - Vdbe *v; /* The prepared statement under construction */ - Index *pPk; /* PRIMARY KEY index, or NULL for rowid tables */ - -@@ -89651,10 +90242,12 @@ SQLITE_PRIVATE void sqlite3GenerateRowIn - if( aRegIdx!=0 && aRegIdx[i]==0 ) continue; - if( pIdx==pPk ) continue; - VdbeModuleComment((v, "GenRowIdxDel for %s", pIdx->zName)); -- r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 1, &iPartIdxLabel); -+ r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 1, -+ &iPartIdxLabel, pPrior, r1); - sqlite3VdbeAddOp3(v, OP_IdxDelete, iIdxCur+i, r1, - pIdx->uniqNotNull ? pIdx->nKeyCol : pIdx->nColumn); - sqlite3VdbeResolveLabel(v, iPartIdxLabel); -+ pPrior = pIdx; - } - } - -@@ -89676,6 +90269,17 @@ SQLITE_PRIVATE void sqlite3GenerateRowIn - ** to false or null. If pIdx is not a partial index, *piPartIdxLabel - ** will be set to zero which is an empty label that is ignored by - ** sqlite3VdbeResolveLabel(). -+** -+** The pPrior and regPrior parameters are used to implement a cache to -+** avoid unnecessary register loads. If pPrior is not NULL, then it is -+** a pointer to a different index for which an index key has just been -+** computed into register regPrior. If the current pIdx index is generating -+** its key into the same sequence of registers and if pPrior and pIdx share -+** a column in common, then the register corresponding to that column already -+** holds the correct value and the loading of that register is skipped. -+** This optimization is helpful when doing a DELETE or an INTEGRITY_CHECK -+** on a table with multiple indices, and especially with the ROWID or -+** PRIMARY KEY columns of the index. - */ - SQLITE_PRIVATE int sqlite3GenerateIndexKey( - Parse *pParse, /* Parsing context */ -@@ -89683,14 +90287,15 @@ SQLITE_PRIVATE int sqlite3GenerateIndexK - int iDataCur, /* Cursor number from which to take column data */ - int regOut, /* Put the new key into this register if not 0 */ - int prefixOnly, /* Compute only a unique prefix of the key */ -- int *piPartIdxLabel /* OUT: Jump to this label to skip partial index */ -+ int *piPartIdxLabel, /* OUT: Jump to this label to skip partial index */ -+ Index *pPrior, /* Previously generated index key */ -+ int regPrior /* Register holding previous generated key */ - ){ - Vdbe *v = pParse->pVdbe; - int j; - Table *pTab = pIdx->pTable; - int regBase; - int nCol; -- Index *pPk; - - if( piPartIdxLabel ){ - if( pIdx->pPartIdxWhere ){ -@@ -89704,28 +90309,21 @@ SQLITE_PRIVATE int sqlite3GenerateIndexK - } - nCol = (prefixOnly && pIdx->uniqNotNull) ? pIdx->nKeyCol : pIdx->nColumn; - regBase = sqlite3GetTempRange(pParse, nCol); -- pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab); -+ if( pPrior && (regBase!=regPrior || pPrior->pPartIdxWhere) ) pPrior = 0; - for(j=0; jaiColumn[j]; -- if( pPk ) idx = sqlite3ColumnOfIndex(pPk, idx); -- if( idx<0 || idx==pTab->iPKey ){ -- sqlite3VdbeAddOp2(v, OP_Rowid, iDataCur, regBase+j); -- }else{ -- sqlite3VdbeAddOp3(v, OP_Column, iDataCur, idx, regBase+j); -- sqlite3ColumnDefault(v, pTab, pIdx->aiColumn[j], -1); -- } -+ if( pPrior && pPrior->aiColumn[j]==pIdx->aiColumn[j] ) continue; -+ sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, pIdx->aiColumn[j], -+ regBase+j); -+ /* If the column affinity is REAL but the number is an integer, then it -+ ** might be stored in the table as an integer (using a compact -+ ** representation) then converted to REAL by an OP_RealAffinity opcode. -+ ** But we are getting ready to store this value back into an index, where -+ ** it should be converted by to INTEGER again. So omit the OP_RealAffinity -+ ** opcode if it is present */ -+ sqlite3VdbeDeletePriorOpcode(v, OP_RealAffinity); - } - if( regOut ){ -- const char *zAff; -- if( pTab->pSelect -- || OptimizationDisabled(pParse->db, SQLITE_IdxRealAsInt) -- ){ -- zAff = 0; -- }else{ -- zAff = sqlite3IndexAffinityStr(v, pIdx); -- } - sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regOut); -- sqlite3VdbeChangeP4(v, -1, zAff, P4_TRANSIENT); - } - sqlite3ReleaseTempRange(pParse, regBase, nCol); - return regBase; -@@ -89952,6 +90550,32 @@ static void instrFunc( - } - - /* -+** Implementation of the printf() function. -+*/ -+static void printfFunc( -+ sqlite3_context *context, -+ int argc, -+ sqlite3_value **argv -+){ -+ PrintfArguments x; -+ StrAccum str; -+ const char *zFormat; -+ int n; -+ -+ if( argc>=1 && (zFormat = (const char*)sqlite3_value_text(argv[0]))!=0 ){ -+ x.nArg = argc-1; -+ x.nUsed = 0; -+ x.apArg = argv+1; -+ sqlite3StrAccumInit(&str, 0, 0, SQLITE_MAX_LENGTH); -+ str.db = sqlite3_context_db_handle(context); -+ sqlite3XPrintf(&str, SQLITE_PRINTF_SQLFUNC, zFormat, &x); -+ n = str.nChar; -+ sqlite3_result_text(context, sqlite3StrAccumFinish(&str), n, -+ SQLITE_DYNAMIC); -+ } -+} -+ -+/* - ** Implementation of the substr() function. - ** - ** substr(x,p1,p2) returns p2 characters of x[] beginning with p1. -@@ -91244,11 +91868,11 @@ static void groupConcatStep( - zSep = ","; - nSep = 1; - } -- sqlite3StrAccumAppend(pAccum, zSep, nSep); -+ if( nSep ) sqlite3StrAccumAppend(pAccum, zSep, nSep); - } - zVal = (char*)sqlite3_value_text(argv[0]); - nVal = sqlite3_value_bytes(argv[0]); -- sqlite3StrAccumAppend(pAccum, zVal, nVal); -+ if( nVal ) sqlite3StrAccumAppend(pAccum, zVal, nVal); - } - } - static void groupConcatFinalize(sqlite3_context *context){ -@@ -91381,6 +92005,7 @@ SQLITE_PRIVATE void sqlite3RegisterGloba - FUNCTION(instr, 2, 0, 0, instrFunc ), - FUNCTION(substr, 2, 0, 0, substrFunc ), - FUNCTION(substr, 3, 0, 0, substrFunc ), -+ FUNCTION(printf, -1, 0, 0, printfFunc ), - FUNCTION(unicode, 1, 0, 0, unicodeFunc ), - FUNCTION(char, -1, 0, 0, charFunc ), - FUNCTION(abs, 1, 0, 0, absFunc ), -@@ -93358,7 +93983,6 @@ static int xferOptimization( - SQLITE_PRIVATE void sqlite3Insert( - Parse *pParse, /* Parser context */ - SrcList *pTabList, /* Name of table into which we are inserting */ -- ExprList *pList, /* List of values to be inserted */ - Select *pSelect, /* A SELECT statement to use as the data source */ - IdList *pColumn, /* Column names corresponding to IDLIST. */ - int onError /* How to handle constraint errors */ -@@ -93386,6 +94010,7 @@ SQLITE_PRIVATE void sqlite3Insert( - Db *pDb; /* The database containing table being inserted into */ - int appendFlag = 0; /* True if the insert is likely to be an append */ - int withoutRowid; /* 0 for normal table. 1 for WITHOUT ROWID table */ -+ ExprList *pList = 0; /* List of VALUES() to be inserted */ - - /* Register allocations */ - int regFromSelect = 0;/* Base register for data coming from SELECT */ -@@ -93409,6 +94034,17 @@ SQLITE_PRIVATE void sqlite3Insert( - goto insert_cleanup; - } - -+ /* If the Select object is really just a simple VALUES() list with a -+ ** single row values (the common case) then keep that one row of values -+ ** and go ahead and discard the Select object -+ */ -+ if( pSelect && (pSelect->selFlags & SF_Values)!=0 && pSelect->pPrior==0 ){ -+ pList = pSelect->pEList; -+ pSelect->pEList = 0; -+ sqlite3SelectDelete(db, pSelect); -+ pSelect = 0; -+ } -+ - /* Locate the table into which we will be inserting new information. - */ - assert( pTabList->nSrc==1 ); -@@ -94051,6 +94687,7 @@ SQLITE_PRIVATE void sqlite3GenerateConst - int ipkTop = 0; /* Top of the rowid change constraint check */ - int ipkBottom = 0; /* Bottom of the rowid change constraint check */ - u8 isUpdate; /* True if this is an UPDATE operation */ -+ int regRowid = -1; /* Register holding ROWID value */ - - isUpdate = regOldData!=0; - db = pParse->db; -@@ -94281,7 +94918,9 @@ SQLITE_PRIVATE void sqlite3GenerateConst - int iField = pIdx->aiColumn[i]; - int x; - if( iField<0 || iField==pTab->iPKey ){ -+ if( regRowid==regIdx+i ) continue; /* ROWID already in regIdx+i */ - x = regNewData; -+ regRowid = pIdx->pPartIdxWhere ? -1 : regIdx+i; - }else{ - x = iField + regNewData + 1; - } -@@ -94321,47 +94960,49 @@ SQLITE_PRIVATE void sqlite3GenerateConst - - /* Generate code to handle collisions */ - regR = (pIdx==pPk) ? regIdx : sqlite3GetTempRange(pParse, nPkField); -- if( HasRowid(pTab) ){ -- sqlite3VdbeAddOp2(v, OP_IdxRowid, iThisCur, regR); -- /* Conflict only if the rowid of the existing index entry -- ** is different from old-rowid */ -- if( isUpdate ){ -- sqlite3VdbeAddOp3(v, OP_Eq, regR, addrUniqueOk, regOldData); -- } -- }else{ -- int x; -- /* Extract the PRIMARY KEY from the end of the index entry and -- ** store it in registers regR..regR+nPk-1 */ -- if( (isUpdate || onError==OE_Replace) && pIdx!=pPk ){ -- for(i=0; inKeyCol; i++){ -- x = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]); -- sqlite3VdbeAddOp3(v, OP_Column, iThisCur, x, regR+i); -- VdbeComment((v, "%s.%s", pTab->zName, -- pTab->aCol[pPk->aiColumn[i]].zName)); -- } -- } -- if( isUpdate ){ -- /* If currently processing the PRIMARY KEY of a WITHOUT ROWID -- ** table, only conflict if the new PRIMARY KEY values are actually -- ** different from the old. -- ** -- ** For a UNIQUE index, only conflict if the PRIMARY KEY values -- ** of the matched index row are different from the original PRIMARY -- ** KEY values of this row before the update. */ -- int addrJump = sqlite3VdbeCurrentAddr(v)+pPk->nKeyCol; -- int op = OP_Ne; -- int regCmp = (pIdx->autoIndex==2 ? regIdx : regR); -- -- for(i=0; inKeyCol; i++){ -- char *p4 = (char*)sqlite3LocateCollSeq(pParse, pPk->azColl[i]); -- x = pPk->aiColumn[i]; -- if( i==(pPk->nKeyCol-1) ){ -- addrJump = addrUniqueOk; -- op = OP_Eq; -+ if( isUpdate || onError==OE_Replace ){ -+ if( HasRowid(pTab) ){ -+ sqlite3VdbeAddOp2(v, OP_IdxRowid, iThisCur, regR); -+ /* Conflict only if the rowid of the existing index entry -+ ** is different from old-rowid */ -+ if( isUpdate ){ -+ sqlite3VdbeAddOp3(v, OP_Eq, regR, addrUniqueOk, regOldData); -+ } -+ }else{ -+ int x; -+ /* Extract the PRIMARY KEY from the end of the index entry and -+ ** store it in registers regR..regR+nPk-1 */ -+ if( pIdx!=pPk ){ -+ for(i=0; inKeyCol; i++){ -+ x = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]); -+ sqlite3VdbeAddOp3(v, OP_Column, iThisCur, x, regR+i); -+ VdbeComment((v, "%s.%s", pTab->zName, -+ pTab->aCol[pPk->aiColumn[i]].zName)); -+ } -+ } -+ if( isUpdate ){ -+ /* If currently processing the PRIMARY KEY of a WITHOUT ROWID -+ ** table, only conflict if the new PRIMARY KEY values are actually -+ ** different from the old. -+ ** -+ ** For a UNIQUE index, only conflict if the PRIMARY KEY values -+ ** of the matched index row are different from the original PRIMARY -+ ** KEY values of this row before the update. */ -+ int addrJump = sqlite3VdbeCurrentAddr(v)+pPk->nKeyCol; -+ int op = OP_Ne; -+ int regCmp = (pIdx->autoIndex==2 ? regIdx : regR); -+ -+ for(i=0; inKeyCol; i++){ -+ char *p4 = (char*)sqlite3LocateCollSeq(pParse, pPk->azColl[i]); -+ x = pPk->aiColumn[i]; -+ if( i==(pPk->nKeyCol-1) ){ -+ addrJump = addrUniqueOk; -+ op = OP_Eq; -+ } -+ sqlite3VdbeAddOp4(v, op, -+ regOldData+1+x, addrJump, regCmp+i, p4, P4_COLLSEQ -+ ); - } -- sqlite3VdbeAddOp4(v, op, -- regOldData+1+x, addrJump, regCmp+i, p4, P4_COLLSEQ -- ); - } - } - } -@@ -94660,6 +95301,12 @@ static int xferOptimization( - if( pSelect==0 ){ - return 0; /* Must be of the form INSERT INTO ... SELECT ... */ - } -+ if( pParse->pWith || pSelect->pWith ){ -+ /* Do not attempt to process this query if there are an WITH clauses -+ ** attached to it. Proceeding may generate a false "no such table: xxx" -+ ** error if pSelect reads from a CTE named "xxx". */ -+ return 0; -+ } - if( sqlite3TriggerList(pParse, pDest) ){ - return 0; /* tab1 must not have triggers */ - } -@@ -96013,6 +96660,13 @@ static int sqlite3LoadExtension( - for(iFile=ncFile-1; iFile>=0 && zFile[iFile]!='/'; iFile--){} - iFile++; - if( sqlite3_strnicmp(zFile+iFile, "lib", 3)==0 ) iFile += 3; -+#ifdef __CYGWIN__ -+#ifdef __MSYS__ -+ if( sqlite3_strnicmp(zFile+iFile, "msys-", 4)==0 ) iFile += 4; -+#else -+ if( sqlite3_strnicmp(zFile+iFile, "cyg", 3)==0 ) iFile += 3; -+#endif -+#endif - for(iEntry=8; (c = zFile[iFile])!=0 && c!='.'; iFile++){ - if( sqlite3Isalpha(c) ){ - zAltEntry[iEntry++] = (char)sqlite3UpperToLower[(unsigned)c]; -@@ -96291,7 +96941,7 @@ SQLITE_PRIVATE void sqlite3AutoLoadExten - */ - - #if !defined(SQLITE_ENABLE_LOCKING_STYLE) --# if defined(__APPLE__) -+# if defined(__APPLE__) || defined(__CYGWIN__) - # define SQLITE_ENABLE_LOCKING_STYLE 1 - # else - # define SQLITE_ENABLE_LOCKING_STYLE 0 -@@ -98158,8 +98808,10 @@ SQLITE_PRIVATE void sqlite3Pragma( - for(x=sqliteHashFirst(pTbls); x && !isQuick; x=sqliteHashNext(x)){ - Table *pTab = sqliteHashData(x); - Index *pIdx, *pPk; -+ Index *pPrior = 0; - int loopTop; - int iDataCur, iIdxCur; -+ int r1 = -1; - - if( pTab->pIndex==0 ) continue; - pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab); -@@ -98178,9 +98830,10 @@ SQLITE_PRIVATE void sqlite3Pragma( - loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1); - for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ - int jmp2, jmp3, jmp4; -- int r1; - if( pPk==pIdx ) continue; -- r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 0, &jmp3); -+ r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 0, &jmp3, -+ pPrior, r1); -+ pPrior = pIdx; - sqlite3VdbeAddOp2(v, OP_AddImm, 8+j, 1); /* increment entry count */ - jmp2 = sqlite3VdbeAddOp4Int(v, OP_Found, iIdxCur+j, 0, r1, - pIdx->nColumn); -@@ -99108,7 +99761,11 @@ SQLITE_PRIVATE int sqlite3SchemaToIndex( - ** Free all memory allocations in the pParse object - */ - SQLITE_PRIVATE void sqlite3ParserReset(Parse *pParse){ -- if( pParse ) sqlite3ExprListDelete(pParse->db, pParse->pConstExpr); -+ if( pParse ){ -+ sqlite3 *db = pParse->db; -+ sqlite3DbFree(db, pParse->aLabel); -+ sqlite3ExprListDelete(db, pParse->pConstExpr); -+ } - } - - /* -@@ -99492,6 +100149,7 @@ static void clearSelect(sqlite3 *db, Sel - sqlite3SelectDelete(db, p->pPrior); - sqlite3ExprDelete(db, p->pLimit); - sqlite3ExprDelete(db, p->pOffset); -+ sqlite3WithDelete(db, p->pWith); - } - - /* -@@ -100061,7 +100719,6 @@ static void selectInnerLoop( - /* If the destination is an EXISTS(...) expression, the actual - ** values returned by the SELECT are not required. - */ -- sqlite3ExprCacheClear(pParse); - sqlite3ExprCodeExprList(pParse, pEList, regResult, - (eDest==SRT_Output)?SQLITE_ECEL_DUP:0); - } -@@ -100154,12 +100811,26 @@ static void selectInnerLoop( - - /* Store the result as data using a unique key. - */ -+ case SRT_DistTable: - case SRT_Table: - case SRT_EphemTab: { - int r1 = sqlite3GetTempReg(pParse); - testcase( eDest==SRT_Table ); - testcase( eDest==SRT_EphemTab ); - sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nColumn, r1); -+#ifndef SQLITE_OMIT_CTE -+ if( eDest==SRT_DistTable ){ -+ /* If the destination is DistTable, then cursor (iParm+1) is open -+ ** on an ephemeral index. If the current row is already present -+ ** in the index, do not write it to the output. If not, add the -+ ** current row to the index and proceed with writing it to the -+ ** output table as well. */ -+ int addr = sqlite3VdbeCurrentAddr(v) + 4; -+ sqlite3VdbeAddOp4Int(v, OP_Found, iParm+1, addr, r1, 0); -+ sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm+1, r1); -+ assert( pOrderBy==0 ); -+ } -+#endif - if( pOrderBy ){ - pushOntoSorter(pParse, pOrderBy, p, r1); - }else{ -@@ -100666,7 +101337,7 @@ static const char *columnTypeImpl( - sNC.pParse = pNC->pParse; - zType = columnType(&sNC, p,&zOrigDb,&zOrigTab,&zOrigCol, &estWidth); - } -- }else if( ALWAYS(pTab->pSchema) ){ -+ }else if( pTab->pSchema ){ - /* A real table */ - assert( !pS ); - if( iCol<0 ) iCol = pTab->iPKey; -@@ -100827,8 +101498,9 @@ static void generateColumnNames( - sqlite3VdbeSetColName(v, i, COLNAME_NAME, zCol, SQLITE_TRANSIENT); - } - }else{ -- sqlite3VdbeSetColName(v, i, COLNAME_NAME, -- sqlite3DbStrDup(db, pEList->a[i].zSpan), SQLITE_DYNAMIC); -+ const char *z = pEList->a[i].zSpan; -+ z = z==0 ? sqlite3MPrintf(db, "column%d", i+1) : sqlite3DbStrDup(db, z); -+ sqlite3VdbeSetColName(v, i, COLNAME_NAME, z, SQLITE_DYNAMIC); - } - } - generateColumnTypes(pParse, pTabList, pEList); -@@ -101028,7 +101700,7 @@ SQLITE_PRIVATE Table *sqlite3ResultSetOf - SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse *pParse){ - Vdbe *v = pParse->pVdbe; - if( v==0 ){ -- v = pParse->pVdbe = sqlite3VdbeCreate(pParse->db); -+ v = pParse->pVdbe = sqlite3VdbeCreate(pParse); - #ifndef SQLITE_OMIT_TRACE - if( v ){ - sqlite3VdbeAddOp0(v, OP_Trace); -@@ -101192,6 +101864,7 @@ static int multiSelect( - ** the last (right-most) SELECT in the series may have an ORDER BY or LIMIT. - */ - assert( p && p->pPrior ); /* Calling function guarantees this much */ -+ assert( (p->selFlags & SF_Recursive)==0 || p->op==TK_ALL || p->op==TK_UNION ); - db = pParse->db; - pPrior = p->pPrior; - assert( pPrior->pRightmost!=pPrior ); -@@ -101237,11 +101910,106 @@ static int multiSelect( - goto multi_select_end; - } - -+#ifndef SQLITE_OMIT_CTE -+ if( p->selFlags & SF_Recursive ){ -+ SrcList *pSrc = p->pSrc; /* The FROM clause of the right-most SELECT */ -+ int nCol = p->pEList->nExpr; /* Number of columns in the result set */ -+ int addrNext; -+ int addrSwap; -+ int iCont, iBreak; -+ int tmp1; /* Intermediate table */ -+ int tmp2; /* Next intermediate table */ -+ int tmp3 = 0; /* To ensure unique results if UNION */ -+ int eDest = SRT_Table; -+ SelectDest tmp2dest; -+ int i; -+ int regLevel = 0; /* Register for LEVEL value */ -+ int savedRegLevel; /* Saved value of pParse->regLevel */ -+ -+ /* Check that there is no ORDER BY or LIMIT clause. Neither of these -+ ** are supported on recursive queries. */ -+ assert( p->pOffset==0 || p->pLimit ); -+ if( p->pOrderBy || p->pLimit ){ -+ sqlite3ErrorMsg(pParse, "%s in a recursive query", -+ p->pOrderBy ? "ORDER BY" : "LIMIT" -+ ); -+ goto multi_select_end; -+ } -+ -+ if( sqlite3AuthCheck(pParse, SQLITE_RECURSIVE, 0, 0, 0) ){ -+ goto multi_select_end; -+ } -+ iBreak = sqlite3VdbeMakeLabel(v); -+ iCont = sqlite3VdbeMakeLabel(v); -+ -+ for(i=0; ALWAYS(inSrc); i++){ -+ if( pSrc->a[i].isRecursive ){ -+ tmp1 = pSrc->a[i].iCursor; -+ break; -+ } -+ } -+ -+ tmp2 = pParse->nTab++; -+ if( p->op==TK_UNION ){ -+ eDest = SRT_DistTable; -+ tmp3 = pParse->nTab++; -+ } -+ sqlite3SelectDestInit(&tmp2dest, eDest, tmp2); -+ -+ sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tmp1, nCol); -+ sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tmp2, nCol); -+ if( tmp3 ){ -+ p->addrOpenEphm[0] = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tmp3, 0); -+ p->selFlags |= SF_UsesEphemeral; -+ } -+ -+ /* Store the results of the initial SELECT in tmp2. */ -+ rc = sqlite3Select(pParse, pPrior, &tmp2dest); -+ if( rc ) goto multi_select_end; -+ -+ /* Allocate and initialize a register to hold the LEVEL pseudo-column */ -+ savedRegLevel = pParse->regLevel; -+ if( p->selFlags & SF_UsesLevel ){ -+ regLevel = pParse->regLevel = ++pParse->nMem; -+ sqlite3VdbeAddOp2(v, OP_Integer, 0, regLevel); -+ VdbeComment((v, "level=0")); -+ } -+ -+ /* Clear tmp1. Then switch the contents of tmp1 and tmp2. Then return -+ ** the contents of tmp1 to the caller. Or, if tmp1 is empty at this -+ ** point, the recursive query has finished - jump to address iBreak. */ -+ addrSwap = sqlite3VdbeAddOp2(v, OP_SwapCursors, tmp1, tmp2); -+ sqlite3VdbeAddOp2(v, OP_Rewind, tmp1, iBreak); -+ addrNext = sqlite3VdbeCurrentAddr(v); -+ selectInnerLoop(pParse, p, p->pEList, tmp1, p->pEList->nExpr, -+ 0, 0, &dest, iCont, iBreak); -+ sqlite3VdbeResolveLabel(v, iCont); -+ sqlite3VdbeAddOp2(v, OP_Next, tmp1, addrNext); -+ if( regLevel ){ -+ sqlite3VdbeAddOp2(v, OP_AddImm, regLevel, 1); -+ VdbeComment((v, "level++")); -+ } -+ -+ /* Execute the recursive SELECT. Store the results in tmp2. While this -+ ** SELECT is running, the contents of tmp1 are read by recursive -+ ** references to the current CTE. */ -+ p->pPrior = 0; -+ rc = sqlite3Select(pParse, p, &tmp2dest); -+ assert( p->pPrior==0 ); -+ p->pPrior = pPrior; -+ if( rc ) goto multi_select_end; -+ -+ sqlite3VdbeAddOp2(v, OP_Goto, 0, addrSwap); -+ sqlite3VdbeResolveLabel(v, iBreak); -+ pParse->regLevel = savedRegLevel; -+ }else -+#endif -+ - /* Compound SELECTs that have an ORDER BY clause are handled separately. - */ - if( p->pOrderBy ){ - return multiSelectOrderBy(pParse, p, pDest); -- } -+ }else - - /* Generate code for the left and right SELECT statements. - */ -@@ -102305,6 +103073,14 @@ static void substSelect( - ** (21) The subquery does not use LIMIT or the outer query is not - ** DISTINCT. (See ticket [752e1646fc]). - ** -+** (22) The subquery is not a recursive CTE. -+** -+** (23) The parent is not a recursive CTE, or the sub-query is not a -+** compound query. This restriction is because transforming the -+** parent to a compound query confuses the code that handles -+** recursive queries in multiSelect(). -+** -+** - ** In this routine, the "p" parameter is a pointer to the outer query. - ** The subquery is p->pSrc->a[iFrom]. isAgg is true if the outer query - ** uses aggregates and subqueryIsAgg is true if the subquery uses aggregates. -@@ -102376,6 +103152,8 @@ static int flattenSubquery( - if( pSub->pLimit && (p->selFlags & SF_Distinct)!=0 ){ - return 0; /* Restriction (21) */ - } -+ if( pSub->selFlags & SF_Recursive ) return 0; /* Restriction (22) */ -+ if( (p->selFlags & SF_Recursive) && pSub->pPrior ) return 0; /* (23) */ - - /* OBSOLETE COMMENT 1: - ** Restriction 3: If the subquery is a join, make sure the subquery is -@@ -102857,6 +103635,197 @@ static int convertCompoundSelectToSubque - return WRC_Continue; - } - -+#ifndef SQLITE_OMIT_CTE -+/* -+** Argument pWith (which may be NULL) points to a linked list of nested -+** WITH contexts, from inner to outermost. If the table identified by -+** FROM clause element pItem is really a common-table-expression (CTE) -+** then return a pointer to the CTE definition for that table. Otherwise -+** return NULL. -+** -+** If a non-NULL value is returned, set *ppContext to point to the With -+** object that the returned CTE belongs to. -+*/ -+static struct Cte *searchWith( -+ With *pWith, /* Current outermost WITH clause */ -+ struct SrcList_item *pItem, /* FROM clause element to resolve */ -+ With **ppContext /* OUT: WITH clause return value belongs to */ -+){ -+ const char *zName; -+ if( pItem->zDatabase==0 && (zName = pItem->zName)!=0 ){ -+ With *p; -+ for(p=pWith; p; p=p->pOuter){ -+ int i; -+ for(i=0; inCte; i++){ -+ if( sqlite3StrICmp(zName, p->a[i].zName)==0 ){ -+ *ppContext = p; -+ return &p->a[i]; -+ } -+ } -+ } -+ } -+ return 0; -+} -+ -+/* The code generator maintains a stack of active WITH clauses -+** with the inner-most WITH clause being at the top of the stack. -+** -+** This routine pushes the WITH clause passed as the second argument -+** onto the top of the stack. If argument bFree is true, then this -+** WITH clause will never be popped from the stack. In this case it -+** should be freed along with the Parse object. In other cases, when -+** bFree==0, the With object will be freed along with the SELECT -+** statement with which it is associated. -+*/ -+SQLITE_PRIVATE void sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){ -+ assert( bFree==0 || pParse->pWith==0 ); -+ if( pWith ){ -+ pWith->pOuter = pParse->pWith; -+ pParse->pWith = pWith; -+ pParse->bFreeWith = bFree; -+ } -+} -+ -+/* -+** This function checks if argument pFrom refers to a CTE declared by -+** a WITH clause on the stack currently maintained by the parser. And, -+** if currently processing a CTE expression, if it is a recursive -+** reference to the current CTE. -+** -+** If pFrom falls into either of the two categories above, pFrom->pTab -+** and other fields are populated accordingly. The caller should check -+** (pFrom->pTab!=0) to determine whether or not a successful match -+** was found. -+** -+** Whether or not a match is found, SQLITE_OK is returned if no error -+** occurs. If an error does occur, an error message is stored in the -+** parser and some error code other than SQLITE_OK returned. -+*/ -+static int withExpand( -+ Walker *pWalker, -+ struct SrcList_item *pFrom -+){ -+ Parse *pParse = pWalker->pParse; -+ sqlite3 *db = pParse->db; -+ struct Cte *pCte; /* Matched CTE (or NULL if no match) */ -+ With *pWith; /* WITH clause that pCte belongs to */ -+ -+ assert( pFrom->pTab==0 ); -+ -+ pCte = searchWith(pParse->pWith, pFrom, &pWith); -+ if( pCte ){ -+ Table *pTab; -+ ExprList *pEList; -+ Select *pSel; -+ Select *pLeft; /* Left-most SELECT statement */ -+ int bMayRecursive; /* True if compound joined by UNION [ALL] */ -+ With *pSavedWith; /* Initial value of pParse->pWith */ -+ -+ /* If pCte->zErr is non-NULL at this point, then this is an illegal -+ ** recursive reference to CTE pCte. Leave an error in pParse and return -+ ** early. If pCte->zErr is NULL, then this is not a recursive reference. -+ ** In this case, proceed. */ -+ if( pCte->zErr ){ -+ sqlite3ErrorMsg(pParse, pCte->zErr, pCte->zName); -+ return SQLITE_ERROR; -+ } -+ -+ assert( pFrom->pTab==0 ); -+ pFrom->pTab = pTab = sqlite3DbMallocZero(db, sizeof(Table)); -+ if( pTab==0 ) return WRC_Abort; -+ pTab->nRef = 1; -+ pTab->zName = sqlite3DbStrDup(db, pCte->zName); -+ pTab->iPKey = -1; -+ pTab->nRowEst = 1048576; -+ pTab->tabFlags |= TF_Ephemeral; -+ pFrom->pSelect = sqlite3SelectDup(db, pCte->pSelect, 0); -+ if( db->mallocFailed ) return SQLITE_NOMEM; -+ assert( pFrom->pSelect ); -+ -+ /* Check if this is a recursive CTE. */ -+ pSel = pFrom->pSelect; -+ bMayRecursive = ( pSel->op==TK_ALL || pSel->op==TK_UNION ); -+ if( bMayRecursive ){ -+ int i; -+ SrcList *pSrc = pFrom->pSelect->pSrc; -+ for(i=0; inSrc; i++){ -+ struct SrcList_item *pItem = &pSrc->a[i]; -+ if( pItem->zDatabase==0 -+ && pItem->zName!=0 -+ && 0==sqlite3StrICmp(pItem->zName, pCte->zName) -+ ){ -+ pItem->pTab = pTab; -+ pItem->isRecursive = 1; -+ pTab->nRef++; -+ pSel->selFlags |= SF_Recursive; -+ } -+ } -+ } -+ -+ /* Only one recursive reference is permitted. */ -+ if( pTab->nRef>2 ){ -+ sqlite3ErrorMsg( -+ pParse, "multiple references to recursive table: %s", pCte->zName -+ ); -+ return SQLITE_ERROR; -+ } -+ assert( pTab->nRef==1 || ((pSel->selFlags&SF_Recursive) && pTab->nRef==2 )); -+ -+ pCte->zErr = "circular reference: %s"; -+ pSavedWith = pParse->pWith; -+ pParse->pWith = pWith; -+ sqlite3WalkSelect(pWalker, bMayRecursive ? pSel->pPrior : pSel); -+ -+ for(pLeft=pSel; pLeft->pPrior; pLeft=pLeft->pPrior); -+ pEList = pLeft->pEList; -+ if( pCte->pCols ){ -+ if( pEList->nExpr!=pCte->pCols->nExpr ){ -+ sqlite3ErrorMsg(pParse, "table %s has %d values for %d columns", -+ pCte->zName, pEList->nExpr, pCte->pCols->nExpr -+ ); -+ pParse->pWith = pSavedWith; -+ return SQLITE_ERROR; -+ } -+ pEList = pCte->pCols; -+ } -+ -+ selectColumnsFromExprList(pParse, pEList, &pTab->nCol, &pTab->aCol); -+ if( bMayRecursive ){ -+ if( pSel->selFlags & SF_Recursive ){ -+ pCte->zErr = "multiple recursive references: %s"; -+ }else{ -+ pCte->zErr = "recursive reference in a subquery: %s"; -+ } -+ sqlite3WalkSelect(pWalker, pSel); -+ } -+ pCte->zErr = 0; -+ pParse->pWith = pSavedWith; -+ } -+ -+ return SQLITE_OK; -+} -+#endif -+ -+#ifndef SQLITE_OMIT_CTE -+/* -+** If the SELECT passed as the second argument has an associated WITH -+** clause, pop it from the stack stored as part of the Parse object. -+** -+** This function is used as the xSelectCallback2() callback by -+** sqlite3SelectExpand() when walking a SELECT tree to resolve table -+** names and other FROM clause elements. -+*/ -+static void selectPopWith(Walker *pWalker, Select *p){ -+ Parse *pParse = pWalker->pParse; -+ if( p->pWith ){ -+ assert( pParse->pWith==p->pWith ); -+ pParse->pWith = p->pWith->pOuter; -+ } -+} -+#else -+#define selectPopWith 0 -+#endif -+ - /* - ** This routine is a Walker callback for "expanding" a SELECT statement. - ** "Expanding" means to do the following: -@@ -102900,6 +103869,7 @@ static int selectExpander(Walker *pWalke - } - pTabList = p->pSrc; - pEList = p->pEList; -+ sqlite3WithPush(pParse, p->pWith, 0); - - /* Make sure cursor numbers have been assigned to all entries in - ** the FROM clause of the SELECT statement. -@@ -102912,12 +103882,21 @@ static int selectExpander(Walker *pWalke - */ - for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ - Table *pTab; -+ assert( pFrom->isRecursive==0 || pFrom->pTab ); -+ if( pFrom->isRecursive ) continue; - if( pFrom->pTab!=0 ){ - /* This statement has already been prepared. There is no need - ** to go further. */ - assert( i==0 ); -+#ifndef SQLITE_OMIT_CTE -+ selectPopWith(pWalker, p); -+#endif - return WRC_Prune; - } -+#ifndef SQLITE_OMIT_CTE -+ if( withExpand(pWalker, pFrom) ) return WRC_Abort; -+ if( pFrom->pTab ) {} else -+#endif - if( pFrom->zName==0 ){ - #ifndef SQLITE_OMIT_SUBQUERY - Select *pSel = pFrom->pSelect; -@@ -103180,6 +104159,7 @@ static void sqlite3SelectExpand(Parse *p - sqlite3WalkSelect(&w, pSelect); - } - w.xSelectCallback = selectExpander; -+ w.xSelectCallback2 = selectPopWith; - sqlite3WalkSelect(&w, pSelect); - } - -@@ -103198,7 +104178,7 @@ static void sqlite3SelectExpand(Parse *p - ** at that point because identifiers had not yet been resolved. This - ** routine is called after identifier resolution. - */ --static int selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){ -+static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){ - Parse *pParse; - int i; - SrcList *pTabList; -@@ -103214,13 +104194,13 @@ static int selectAddSubqueryTypeInfo(Wal - if( ALWAYS(pTab!=0) && (pTab->tabFlags & TF_Ephemeral)!=0 ){ - /* A sub-query in the FROM clause of a SELECT */ - Select *pSel = pFrom->pSelect; -- assert( pSel ); -- while( pSel->pPrior ) pSel = pSel->pPrior; -- selectAddColumnTypeAndCollation(pParse, pTab, pSel); -+ if( pSel ){ -+ while( pSel->pPrior ) pSel = pSel->pPrior; -+ selectAddColumnTypeAndCollation(pParse, pTab, pSel); -+ } - } - } - } -- return WRC_Continue; - } - #endif - -@@ -103236,10 +104216,9 @@ static void sqlite3SelectAddTypeInfo(Par - #ifndef SQLITE_OMIT_SUBQUERY - Walker w; - memset(&w, 0, sizeof(w)); -- w.xSelectCallback = selectAddSubqueryTypeInfo; -+ w.xSelectCallback2 = selectAddSubqueryTypeInfo; - w.xExprCallback = exprWalkNoop; - w.pParse = pParse; -- w.bSelectDepthFirst = 1; - sqlite3WalkSelect(&w, pSelect); - #endif - } -@@ -103286,14 +104265,23 @@ static void resetAccumulator(Parse *pPar - Vdbe *v = pParse->pVdbe; - int i; - struct AggInfo_func *pFunc; -- if( pAggInfo->nFunc+pAggInfo->nColumn==0 ){ -- return; -- } -+ int nReg = pAggInfo->nFunc + pAggInfo->nColumn; -+ if( nReg==0 ) return; -+#ifdef SQLITE_DEBUG -+ /* Verify that all AggInfo registers are within the range specified by -+ ** AggInfo.mnReg..AggInfo.mxReg */ -+ assert( nReg==pAggInfo->mxReg-pAggInfo->mnReg+1 ); - for(i=0; inColumn; i++){ -- sqlite3VdbeAddOp2(v, OP_Null, 0, pAggInfo->aCol[i].iMem); -+ assert( pAggInfo->aCol[i].iMem>=pAggInfo->mnReg -+ && pAggInfo->aCol[i].iMem<=pAggInfo->mxReg ); - } -+ for(i=0; inFunc; i++){ -+ assert( pAggInfo->aFunc[i].iMem>=pAggInfo->mnReg -+ && pAggInfo->aFunc[i].iMem<=pAggInfo->mxReg ); -+ } -+#endif -+ sqlite3VdbeAddOp3(v, OP_Null, 0, pAggInfo->mnReg, pAggInfo->mxReg); - for(pFunc=pAggInfo->aFunc, i=0; inFunc; i++, pFunc++){ -- sqlite3VdbeAddOp2(v, OP_Null, 0, pFunc->iMem); - if( pFunc->iDistinct>=0 ){ - Expr *pE = pFunc->pExpr; - assert( !ExprHasProperty(pE, EP_xIsSelect) ); -@@ -103339,7 +104327,6 @@ static void updateAccumulator(Parse *pPa - struct AggInfo_col *pC; - - pAggInfo->directMode = 1; -- sqlite3ExprCacheClear(pParse); - for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ - int nArg; - int addrNext = 0; -@@ -103872,6 +104859,7 @@ SQLITE_PRIVATE int sqlite3Select( - sNC.pParse = pParse; - sNC.pSrcList = pTabList; - sNC.pAggInfo = &sAggInfo; -+ sAggInfo.mnReg = pParse->nMem+1; - sAggInfo.nSortingColumn = pGroupBy ? pGroupBy->nExpr+1 : 0; - sAggInfo.pGroupBy = pGroupBy; - sqlite3ExprAnalyzeAggList(&sNC, pEList); -@@ -103886,6 +104874,7 @@ SQLITE_PRIVATE int sqlite3Select( - sqlite3ExprAnalyzeAggList(&sNC, sAggInfo.aFunc[i].pExpr->x.pList); - sNC.ncFlags &= ~NC_InAggFunc; - } -+ sAggInfo.mxReg = pParse->nMem; - if( db->mallocFailed ) goto select_end; - - /* Processing for aggregates with GROUP BY is very different and -@@ -104977,25 +105966,21 @@ SQLITE_PRIVATE TriggerStep *sqlite3Trigg - sqlite3 *db, /* The database connection */ - Token *pTableName, /* Name of the table into which we insert */ - IdList *pColumn, /* List of columns in pTableName to insert into */ -- ExprList *pEList, /* The VALUE clause: a list of values to be inserted */ - Select *pSelect, /* A SELECT statement that supplies values */ - u8 orconf /* The conflict algorithm (OE_Abort, OE_Replace, etc.) */ - ){ - TriggerStep *pTriggerStep; - -- assert(pEList == 0 || pSelect == 0); -- assert(pEList != 0 || pSelect != 0 || db->mallocFailed); -+ assert(pSelect != 0 || db->mallocFailed); - - pTriggerStep = triggerStepAllocate(db, TK_INSERT, pTableName); - if( pTriggerStep ){ - pTriggerStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); - pTriggerStep->pIdList = pColumn; -- pTriggerStep->pExprList = sqlite3ExprListDup(db, pEList, EXPRDUP_REDUCE); - pTriggerStep->orconf = orconf; - }else{ - sqlite3IdListDelete(db, pColumn); - } -- sqlite3ExprListDelete(db, pEList); - sqlite3SelectDelete(db, pSelect); - - return pTriggerStep; -@@ -105333,7 +106318,6 @@ static int codeTriggerProgram( - case TK_INSERT: { - sqlite3Insert(pParse, - targetSrcList(pParse, pStep), -- sqlite3ExprListDup(db, pStep->pExprList, 0), - sqlite3SelectDup(db, pStep->pSelect, 0), - sqlite3IdListDup(db, pStep->pIdList), - pParse->eOrconf -@@ -105790,7 +106774,7 @@ SQLITE_PRIVATE void sqlite3ColumnDefault - sqlite3VdbeChangeP4(v, -1, (const char *)pValue, P4_MEM); - } - #ifndef SQLITE_OMIT_FLOATING_POINT -- if( iReg>=0 && pTab->aCol[i].affinity==SQLITE_AFF_REAL ){ -+ if( pTab->aCol[i].affinity==SQLITE_AFF_REAL ){ - sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg); - } - #endif -@@ -106214,10 +107198,10 @@ SQLITE_PRIVATE void sqlite3Update( - newmask = sqlite3TriggerColmask( - pParse, pTrigger, pChanges, 1, TRIGGER_BEFORE, pTab, onError - ); -- sqlite3VdbeAddOp3(v, OP_Null, 0, regNew, regNew+pTab->nCol-1); -+ /*sqlite3VdbeAddOp3(v, OP_Null, 0, regNew, regNew+pTab->nCol-1);*/ - for(i=0; inCol; i++){ - if( i==pTab->iPKey ){ -- /*sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i);*/ -+ sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i); - }else{ - j = aXRef[i]; - if( j>=0 ){ -@@ -106231,6 +107215,8 @@ SQLITE_PRIVATE void sqlite3Update( - testcase( i==31 ); - testcase( i==32 ); - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, regNew+i); -+ }else{ -+ sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i); - } - } - } -@@ -109082,7 +110068,7 @@ static int isLikeOrGlob( - } - assert( pLeft->iColumn!=(-1) ); /* Because IPK never has AFF_TEXT */ - -- pRight = pList->a[0].pExpr; -+ pRight = sqlite3ExprSkipCollate(pList->a[0].pExpr); - op = pRight->op; - if( op==TK_VARIABLE ){ - Vdbe *pReprepare = pParse->pReprepare; -@@ -110125,7 +111111,7 @@ static void constructAutomaticIndex( - /* Fill the automatic index with content */ - addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); - regRecord = sqlite3GetTempReg(pParse); -- sqlite3GenerateIndexKey(pParse, pIdx, pLevel->iTabCur, regRecord, 0, 0); -+ sqlite3GenerateIndexKey(pParse, pIdx, pLevel->iTabCur, regRecord, 0, 0, 0, 0); - sqlite3VdbeAddOp2(v, OP_IdxInsert, pLevel->iIdxCur, regRecord); - sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); - sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); -@@ -110166,7 +111152,8 @@ static sqlite3_index_info *allocateIndex - assert( IsPowerOfTwo(pTerm->eOperator & ~WO_EQUIV) ); - testcase( pTerm->eOperator & WO_IN ); - testcase( pTerm->eOperator & WO_ISNULL ); -- if( pTerm->eOperator & (WO_ISNULL) ) continue; -+ testcase( pTerm->eOperator & WO_ALL ); -+ if( (pTerm->eOperator & ~(WO_ISNULL|WO_EQUIV))==0 ) continue; - if( pTerm->wtFlags & TERM_VNULL ) continue; - nTerm++; - } -@@ -110218,7 +111205,8 @@ static sqlite3_index_info *allocateIndex - assert( IsPowerOfTwo(pTerm->eOperator & ~WO_EQUIV) ); - testcase( pTerm->eOperator & WO_IN ); - testcase( pTerm->eOperator & WO_ISNULL ); -- if( pTerm->eOperator & (WO_ISNULL) ) continue; -+ testcase( pTerm->eOperator & WO_ALL ); -+ if( (pTerm->eOperator & ~(WO_ISNULL|WO_EQUIV))==0 ) continue; - if( pTerm->wtFlags & TERM_VNULL ) continue; - pIdxCons[j].iColumn = pTerm->u.leftColumn; - pIdxCons[j].iTermOffset = i; -@@ -110983,7 +111971,7 @@ static void explainAppendTerm( - const char *zOp /* Name of the operator */ - ){ - if( iTerm ) sqlite3StrAccumAppend(pStr, " AND ", 5); -- sqlite3StrAccumAppend(pStr, zColumn, -1); -+ sqlite3StrAccumAppendAll(pStr, zColumn); - sqlite3StrAccumAppend(pStr, zOp, 1); - sqlite3StrAccumAppend(pStr, "?", 1); - } -@@ -111029,7 +112017,7 @@ static char *explainIndexRange(sqlite3 * - }else{ - if( i ) sqlite3StrAccumAppend(&txt, " AND ", 5); - sqlite3StrAccumAppend(&txt, "ANY(", 4); -- sqlite3StrAccumAppend(&txt, z, -1); -+ sqlite3StrAccumAppendAll(&txt, z); - sqlite3StrAccumAppend(&txt, ")", 1); - } - } -@@ -112343,6 +113331,7 @@ static int whereLoopAddBtreeIndex( - && saved_nEq==saved_nSkip - && saved_nEq+1nKeyCol - && pProbe->aiRowEst[saved_nEq+1]>=18 /* TUNING: Minimum for skip-scan */ -+ && (rc = whereLoopResize(db, pNew, pNew->nLTerm+1))==SQLITE_OK - ){ - LogEst nIter; - pNew->u.btree.nEq++; -@@ -112610,6 +113599,7 @@ static int whereLoopAddBtree( - && !pSrc->notIndexed - && HasRowid(pTab) - && !pSrc->isCorrelated -+ && !pSrc->isRecursive - ){ - /* Generate auto-index WhereLoops */ - WhereTerm *pTerm; -@@ -113844,9 +114834,12 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBe - /* Special case: a WHERE clause that is constant. Evaluate the - ** expression and either jump over all of the code or fall thru. - */ -- if( pWhere && (nTabList==0 || sqlite3ExprIsConstantNotJoin(pWhere)) ){ -- sqlite3ExprIfFalse(pParse, pWhere, pWInfo->iBreak, SQLITE_JUMPIFNULL); -- pWhere = 0; -+ for(ii=0; iinTerm; ii++){ -+ if( nTabList==0 || sqlite3ExprIsConstantNotJoin(sWLB.pWC->a[ii].pExpr) ){ -+ sqlite3ExprIfFalse(pParse, sWLB.pWC->a[ii].pExpr, pWInfo->iBreak, -+ SQLITE_JUMPIFNULL); -+ sWLB.pWC->a[ii].wtFlags |= TERM_CODED; -+ } - } - - /* Special case: No FROM clause -@@ -114377,14 +115370,6 @@ struct TrigEvent { int a; IdList * b; }; - */ - struct AttachKey { int type; Token key; }; - --/* --** One or more VALUES claues --*/ --struct ValueList { -- ExprList *pList; -- Select *pSelect; --}; -- - - /* This is a utility routine used to set the ExprSpan.zStart and - ** ExprSpan.zEnd values of pOut so that the span covers the complete -@@ -114508,28 +115493,28 @@ struct ValueList { - ** defined, then do no error processing. - */ - #define YYCODETYPE unsigned char --#define YYNOCODE 253 -+#define YYNOCODE 254 - #define YYACTIONTYPE unsigned short int --#define YYWILDCARD 68 -+#define YYWILDCARD 70 - #define sqlite3ParserTOKENTYPE Token - typedef union { - int yyinit; - sqlite3ParserTOKENTYPE yy0; -- int yy4; -- struct TrigEvent yy90; -- ExprSpan yy118; -- u16 yy177; -- TriggerStep* yy203; -- u8 yy210; -- struct {int value; int mask;} yy215; -- SrcList* yy259; -- struct ValueList yy260; -- struct LimitVal yy292; -- Expr* yy314; -- ExprList* yy322; -- struct LikeOp yy342; -- IdList* yy384; -- Select* yy387; -+ Select* yy3; -+ ExprList* yy14; -+ With* yy59; -+ SrcList* yy65; -+ struct LikeOp yy96; -+ Expr* yy132; -+ u8 yy186; -+ int yy328; -+ ExprSpan yy346; -+ struct TrigEvent yy378; -+ u16 yy381; -+ IdList* yy408; -+ struct {int value; int mask;} yy429; -+ TriggerStep* yy473; -+ struct LimitVal yy476; - } YYMINORTYPE; - #ifndef YYSTACKDEPTH - #define YYSTACKDEPTH 100 -@@ -114538,8 +115523,8 @@ typedef union { - #define sqlite3ParserARG_PDECL ,Parse *pParse - #define sqlite3ParserARG_FETCH Parse *pParse = yypParser->pParse - #define sqlite3ParserARG_STORE yypParser->pParse = pParse --#define YYNSTATE 631 --#define YYNRULE 329 -+#define YYNSTATE 642 -+#define YYNRULE 327 - #define YYFALLBACK 1 - #define YY_NO_ACTION (YYNSTATE+YYNRULE+2) - #define YY_ACCEPT_ACTION (YYNSTATE+YYNRULE+1) -@@ -114609,480 +115594,463 @@ static const YYMINORTYPE yyzerominor = { - ** shifting non-terminals after a reduce. - ** yy_default[] Default action for each state. - */ --#define YY_ACTTAB_COUNT (1582) -+#define YY_ACTTAB_COUNT (1497) - static const YYACTIONTYPE yy_action[] = { -- /* 0 */ 312, 961, 185, 420, 2, 171, 516, 515, 597, 56, -- /* 10 */ 56, 56, 56, 49, 54, 54, 54, 54, 53, 53, -- /* 20 */ 52, 52, 52, 51, 234, 197, 196, 195, 624, 623, -- /* 30 */ 301, 590, 584, 56, 56, 56, 56, 156, 54, 54, -- /* 40 */ 54, 54, 53, 53, 52, 52, 52, 51, 234, 628, -- /* 50 */ 57, 58, 48, 582, 581, 583, 583, 55, 55, 56, -- /* 60 */ 56, 56, 56, 466, 54, 54, 54, 54, 53, 53, -- /* 70 */ 52, 52, 52, 51, 234, 312, 597, 52, 52, 52, -- /* 80 */ 51, 234, 33, 54, 54, 54, 54, 53, 53, 52, -- /* 90 */ 52, 52, 51, 234, 624, 623, 621, 620, 165, 624, -- /* 100 */ 623, 383, 380, 379, 214, 328, 590, 584, 624, 623, -- /* 110 */ 467, 59, 378, 619, 618, 617, 53, 53, 52, 52, -- /* 120 */ 52, 51, 234, 506, 507, 57, 58, 48, 582, 581, -- /* 130 */ 583, 583, 55, 55, 56, 56, 56, 56, 30, 54, -- /* 140 */ 54, 54, 54, 53, 53, 52, 52, 52, 51, 234, -- /* 150 */ 312, 50, 47, 146, 233, 232, 207, 474, 256, 349, -- /* 160 */ 255, 475, 621, 620, 554, 438, 298, 621, 620, 236, -- /* 170 */ 674, 435, 440, 553, 439, 366, 621, 620, 540, 224, -- /* 180 */ 551, 590, 584, 176, 138, 282, 386, 277, 385, 168, -- /* 190 */ 600, 422, 951, 548, 622, 951, 273, 572, 572, 566, -- /* 200 */ 57, 58, 48, 582, 581, 583, 583, 55, 55, 56, -- /* 210 */ 56, 56, 56, 354, 54, 54, 54, 54, 53, 53, -- /* 220 */ 52, 52, 52, 51, 234, 312, 561, 526, 62, 675, -- /* 230 */ 132, 595, 410, 348, 579, 579, 492, 426, 577, 419, -- /* 240 */ 627, 65, 329, 560, 441, 237, 676, 123, 607, 67, -- /* 250 */ 542, 532, 622, 170, 205, 500, 590, 584, 166, 559, -- /* 260 */ 622, 403, 593, 593, 593, 442, 443, 271, 422, 950, -- /* 270 */ 166, 223, 950, 483, 190, 57, 58, 48, 582, 581, -- /* 280 */ 583, 583, 55, 55, 56, 56, 56, 56, 600, 54, -- /* 290 */ 54, 54, 54, 53, 53, 52, 52, 52, 51, 234, -- /* 300 */ 312, 441, 412, 376, 175, 165, 166, 391, 383, 380, -- /* 310 */ 379, 342, 412, 203, 426, 66, 392, 622, 415, 378, -- /* 320 */ 597, 166, 442, 338, 444, 571, 601, 74, 415, 624, -- /* 330 */ 623, 590, 584, 624, 623, 174, 601, 92, 333, 171, -- /* 340 */ 1, 410, 597, 579, 579, 624, 623, 600, 306, 425, -- /* 350 */ 57, 58, 48, 582, 581, 583, 583, 55, 55, 56, -- /* 360 */ 56, 56, 56, 580, 54, 54, 54, 54, 53, 53, -- /* 370 */ 52, 52, 52, 51, 234, 312, 472, 262, 399, 68, -- /* 380 */ 412, 339, 571, 389, 624, 623, 578, 602, 597, 589, -- /* 390 */ 588, 603, 412, 622, 423, 533, 415, 621, 620, 513, -- /* 400 */ 257, 621, 620, 166, 601, 91, 590, 584, 415, 45, -- /* 410 */ 597, 586, 585, 621, 620, 250, 601, 92, 39, 347, -- /* 420 */ 576, 336, 597, 547, 567, 57, 58, 48, 582, 581, -- /* 430 */ 583, 583, 55, 55, 56, 56, 56, 56, 587, 54, -- /* 440 */ 54, 54, 54, 53, 53, 52, 52, 52, 51, 234, -- /* 450 */ 312, 561, 621, 620, 531, 291, 470, 188, 399, 375, -- /* 460 */ 247, 492, 249, 350, 412, 476, 476, 368, 560, 299, -- /* 470 */ 334, 412, 281, 482, 67, 565, 410, 622, 579, 579, -- /* 480 */ 415, 590, 584, 280, 559, 467, 520, 415, 601, 92, -- /* 490 */ 597, 167, 544, 36, 877, 601, 16, 519, 564, 6, -- /* 500 */ 57, 58, 48, 582, 581, 583, 583, 55, 55, 56, -- /* 510 */ 56, 56, 56, 200, 54, 54, 54, 54, 53, 53, -- /* 520 */ 52, 52, 52, 51, 234, 312, 183, 412, 236, 528, -- /* 530 */ 395, 535, 358, 256, 349, 255, 397, 412, 248, 182, -- /* 540 */ 353, 359, 549, 415, 236, 317, 563, 50, 47, 146, -- /* 550 */ 273, 601, 73, 415, 7, 311, 590, 584, 568, 493, -- /* 560 */ 213, 601, 92, 233, 232, 410, 173, 579, 579, 330, -- /* 570 */ 575, 574, 631, 629, 332, 57, 58, 48, 582, 581, -- /* 580 */ 583, 583, 55, 55, 56, 56, 56, 56, 199, 54, -- /* 590 */ 54, 54, 54, 53, 53, 52, 52, 52, 51, 234, -- /* 600 */ 312, 492, 340, 320, 511, 505, 572, 572, 460, 562, -- /* 610 */ 549, 170, 145, 430, 67, 558, 410, 622, 579, 579, -- /* 620 */ 384, 236, 600, 412, 408, 575, 574, 504, 572, 572, -- /* 630 */ 571, 590, 584, 353, 198, 143, 268, 549, 316, 415, -- /* 640 */ 306, 424, 207, 50, 47, 146, 167, 601, 69, 546, -- /* 650 */ 57, 58, 48, 582, 581, 583, 583, 55, 55, 56, -- /* 660 */ 56, 56, 56, 555, 54, 54, 54, 54, 53, 53, -- /* 670 */ 52, 52, 52, 51, 234, 312, 600, 326, 412, 270, -- /* 680 */ 145, 264, 274, 266, 459, 571, 423, 35, 412, 568, -- /* 690 */ 407, 213, 428, 388, 415, 308, 212, 143, 622, 354, -- /* 700 */ 317, 12, 601, 94, 415, 549, 590, 584, 50, 47, -- /* 710 */ 146, 365, 601, 97, 552, 362, 318, 147, 602, 361, -- /* 720 */ 325, 15, 603, 187, 206, 57, 58, 48, 582, 581, -- /* 730 */ 583, 583, 55, 55, 56, 56, 56, 56, 412, 54, -- /* 740 */ 54, 54, 54, 53, 53, 52, 52, 52, 51, 234, -- /* 750 */ 312, 412, 35, 412, 415, 22, 630, 2, 600, 50, -- /* 760 */ 47, 146, 601, 95, 412, 485, 510, 415, 412, 415, -- /* 770 */ 412, 11, 235, 486, 412, 601, 104, 601, 103, 19, -- /* 780 */ 415, 590, 584, 352, 415, 40, 415, 38, 601, 105, -- /* 790 */ 415, 32, 601, 106, 601, 133, 544, 169, 601, 134, -- /* 800 */ 57, 58, 48, 582, 581, 583, 583, 55, 55, 56, -- /* 810 */ 56, 56, 56, 412, 54, 54, 54, 54, 53, 53, -- /* 820 */ 52, 52, 52, 51, 234, 312, 412, 274, 412, 415, -- /* 830 */ 412, 274, 274, 274, 201, 230, 721, 601, 98, 484, -- /* 840 */ 427, 307, 415, 622, 415, 540, 415, 622, 622, 622, -- /* 850 */ 601, 102, 601, 101, 601, 93, 590, 584, 262, 21, -- /* 860 */ 129, 622, 522, 521, 554, 222, 469, 521, 600, 324, -- /* 870 */ 323, 322, 211, 553, 622, 57, 58, 48, 582, 581, -- /* 880 */ 583, 583, 55, 55, 56, 56, 56, 56, 412, 54, -- /* 890 */ 54, 54, 54, 53, 53, 52, 52, 52, 51, 234, -- /* 900 */ 312, 412, 261, 412, 415, 412, 600, 210, 625, 367, -- /* 910 */ 51, 234, 601, 100, 538, 606, 142, 415, 355, 415, -- /* 920 */ 412, 415, 412, 496, 622, 601, 77, 601, 96, 601, -- /* 930 */ 137, 590, 584, 530, 622, 529, 415, 141, 415, 28, -- /* 940 */ 524, 600, 229, 544, 601, 136, 601, 135, 604, 204, -- /* 950 */ 57, 58, 48, 582, 581, 583, 583, 55, 55, 56, -- /* 960 */ 56, 56, 56, 412, 54, 54, 54, 54, 53, 53, -- /* 970 */ 52, 52, 52, 51, 234, 312, 412, 360, 412, 415, -- /* 980 */ 412, 360, 286, 600, 503, 220, 127, 601, 76, 629, -- /* 990 */ 332, 382, 415, 622, 415, 540, 415, 622, 412, 613, -- /* 1000 */ 601, 90, 601, 89, 601, 75, 590, 584, 341, 272, -- /* 1010 */ 377, 622, 126, 27, 415, 622, 164, 544, 125, 280, -- /* 1020 */ 373, 122, 601, 88, 480, 57, 46, 48, 582, 581, -- /* 1030 */ 583, 583, 55, 55, 56, 56, 56, 56, 412, 54, -- /* 1040 */ 54, 54, 54, 53, 53, 52, 52, 52, 51, 234, -- /* 1050 */ 312, 412, 360, 412, 415, 412, 284, 186, 369, 321, -- /* 1060 */ 477, 170, 601, 87, 121, 473, 221, 415, 622, 415, -- /* 1070 */ 254, 415, 412, 355, 412, 601, 99, 601, 86, 601, -- /* 1080 */ 17, 590, 584, 259, 612, 120, 159, 158, 415, 622, -- /* 1090 */ 415, 14, 465, 157, 462, 25, 601, 85, 601, 84, -- /* 1100 */ 622, 58, 48, 582, 581, 583, 583, 55, 55, 56, -- /* 1110 */ 56, 56, 56, 412, 54, 54, 54, 54, 53, 53, -- /* 1120 */ 52, 52, 52, 51, 234, 312, 412, 262, 412, 415, -- /* 1130 */ 412, 262, 118, 611, 117, 24, 10, 601, 83, 351, -- /* 1140 */ 216, 219, 415, 622, 415, 608, 415, 622, 412, 622, -- /* 1150 */ 601, 72, 601, 71, 601, 82, 590, 584, 262, 4, -- /* 1160 */ 605, 622, 458, 115, 415, 456, 252, 154, 452, 110, -- /* 1170 */ 108, 453, 601, 81, 622, 451, 622, 48, 582, 581, -- /* 1180 */ 583, 583, 55, 55, 56, 56, 56, 56, 412, 54, -- /* 1190 */ 54, 54, 54, 53, 53, 52, 52, 52, 51, 234, -- /* 1200 */ 44, 406, 450, 3, 415, 412, 262, 107, 416, 623, -- /* 1210 */ 446, 437, 601, 80, 436, 335, 238, 189, 411, 409, -- /* 1220 */ 594, 415, 622, 44, 406, 401, 3, 412, 557, 601, -- /* 1230 */ 70, 416, 623, 412, 622, 149, 622, 421, 404, 64, -- /* 1240 */ 412, 622, 409, 415, 622, 331, 139, 148, 566, 415, -- /* 1250 */ 449, 601, 18, 228, 124, 626, 415, 601, 79, 315, -- /* 1260 */ 181, 404, 412, 545, 601, 78, 262, 541, 41, 42, -- /* 1270 */ 534, 566, 390, 202, 262, 43, 414, 413, 415, 622, -- /* 1280 */ 595, 314, 622, 622, 180, 539, 601, 92, 415, 276, -- /* 1290 */ 622, 41, 42, 509, 616, 615, 601, 9, 43, 414, -- /* 1300 */ 413, 622, 418, 595, 262, 622, 275, 600, 614, 622, -- /* 1310 */ 218, 593, 593, 593, 592, 591, 13, 178, 217, 417, -- /* 1320 */ 622, 236, 622, 44, 406, 490, 3, 269, 399, 267, -- /* 1330 */ 609, 416, 623, 400, 593, 593, 593, 592, 591, 13, -- /* 1340 */ 265, 622, 409, 622, 263, 622, 34, 406, 244, 3, -- /* 1350 */ 258, 363, 464, 463, 416, 623, 622, 356, 251, 8, -- /* 1360 */ 622, 404, 177, 599, 455, 409, 622, 622, 622, 622, -- /* 1370 */ 445, 566, 243, 622, 622, 236, 295, 240, 31, 239, -- /* 1380 */ 622, 431, 30, 396, 404, 290, 622, 294, 622, 293, -- /* 1390 */ 144, 41, 42, 622, 566, 622, 394, 622, 43, 414, -- /* 1400 */ 413, 622, 289, 595, 398, 60, 622, 292, 37, 231, -- /* 1410 */ 598, 172, 622, 29, 41, 42, 393, 523, 622, 556, -- /* 1420 */ 184, 43, 414, 413, 287, 387, 595, 543, 285, 518, -- /* 1430 */ 537, 536, 517, 327, 593, 593, 593, 592, 591, 13, -- /* 1440 */ 215, 283, 278, 514, 513, 304, 303, 302, 179, 300, -- /* 1450 */ 512, 310, 454, 128, 227, 226, 309, 593, 593, 593, -- /* 1460 */ 592, 591, 13, 494, 489, 225, 488, 150, 487, 242, -- /* 1470 */ 163, 61, 374, 481, 162, 161, 624, 623, 241, 372, -- /* 1480 */ 209, 479, 370, 260, 26, 160, 478, 364, 468, 471, -- /* 1490 */ 140, 152, 119, 467, 131, 116, 155, 153, 345, 457, -- /* 1500 */ 151, 346, 130, 114, 113, 112, 111, 448, 319, 23, -- /* 1510 */ 109, 434, 20, 433, 432, 429, 566, 610, 573, 596, -- /* 1520 */ 63, 405, 191, 279, 510, 296, 498, 288, 570, 495, -- /* 1530 */ 499, 497, 461, 194, 5, 305, 193, 192, 381, 569, -- /* 1540 */ 357, 256, 344, 245, 526, 246, 253, 313, 595, 343, -- /* 1550 */ 447, 297, 236, 402, 550, 491, 508, 502, 501, 527, -- /* 1560 */ 234, 208, 525, 962, 962, 962, 371, 962, 962, 962, -- /* 1570 */ 962, 962, 962, 962, 962, 337, 962, 962, 962, 593, -- /* 1580 */ 593, 593, -+ /* 0 */ 306, 212, 432, 955, 639, 191, 955, 295, 559, 88, -+ /* 10 */ 88, 88, 88, 81, 86, 86, 86, 86, 85, 85, -+ /* 20 */ 84, 84, 84, 83, 330, 185, 184, 183, 635, 635, -+ /* 30 */ 292, 606, 606, 88, 88, 88, 88, 683, 86, 86, -+ /* 40 */ 86, 86, 85, 85, 84, 84, 84, 83, 330, 16, -+ /* 50 */ 436, 597, 89, 90, 80, 600, 599, 601, 601, 87, -+ /* 60 */ 87, 88, 88, 88, 88, 684, 86, 86, 86, 86, -+ /* 70 */ 85, 85, 84, 84, 84, 83, 330, 306, 559, 84, -+ /* 80 */ 84, 84, 83, 330, 65, 86, 86, 86, 86, 85, -+ /* 90 */ 85, 84, 84, 84, 83, 330, 635, 635, 634, 633, -+ /* 100 */ 182, 682, 550, 379, 376, 375, 17, 322, 606, 606, -+ /* 110 */ 371, 198, 479, 91, 374, 82, 79, 165, 85, 85, -+ /* 120 */ 84, 84, 84, 83, 330, 598, 635, 635, 107, 89, -+ /* 130 */ 90, 80, 600, 599, 601, 601, 87, 87, 88, 88, -+ /* 140 */ 88, 88, 186, 86, 86, 86, 86, 85, 85, 84, -+ /* 150 */ 84, 84, 83, 330, 306, 594, 594, 142, 328, 327, -+ /* 160 */ 484, 249, 344, 238, 635, 635, 634, 633, 585, 448, -+ /* 170 */ 526, 525, 229, 388, 1, 394, 450, 584, 449, 635, -+ /* 180 */ 635, 635, 635, 319, 395, 606, 606, 199, 157, 273, -+ /* 190 */ 382, 268, 381, 187, 635, 635, 634, 633, 311, 555, -+ /* 200 */ 266, 593, 593, 266, 347, 588, 89, 90, 80, 600, -+ /* 210 */ 599, 601, 601, 87, 87, 88, 88, 88, 88, 478, -+ /* 220 */ 86, 86, 86, 86, 85, 85, 84, 84, 84, 83, -+ /* 230 */ 330, 306, 272, 536, 634, 633, 146, 610, 197, 310, -+ /* 240 */ 575, 182, 482, 271, 379, 376, 375, 506, 21, 634, -+ /* 250 */ 633, 634, 633, 635, 635, 374, 611, 574, 548, 440, -+ /* 260 */ 111, 563, 606, 606, 634, 633, 324, 479, 608, 608, -+ /* 270 */ 608, 300, 435, 573, 119, 407, 210, 162, 562, 883, -+ /* 280 */ 592, 592, 306, 89, 90, 80, 600, 599, 601, 601, -+ /* 290 */ 87, 87, 88, 88, 88, 88, 506, 86, 86, 86, -+ /* 300 */ 86, 85, 85, 84, 84, 84, 83, 330, 620, 111, -+ /* 310 */ 635, 635, 361, 606, 606, 358, 249, 349, 248, 433, -+ /* 320 */ 243, 479, 586, 634, 633, 195, 611, 93, 119, 221, -+ /* 330 */ 575, 497, 534, 534, 89, 90, 80, 600, 599, 601, -+ /* 340 */ 601, 87, 87, 88, 88, 88, 88, 574, 86, 86, -+ /* 350 */ 86, 86, 85, 85, 84, 84, 84, 83, 330, 306, -+ /* 360 */ 77, 429, 638, 573, 589, 530, 240, 230, 242, 105, -+ /* 370 */ 249, 349, 248, 515, 588, 208, 460, 529, 564, 173, -+ /* 380 */ 634, 633, 970, 144, 430, 2, 424, 228, 380, 557, -+ /* 390 */ 606, 606, 190, 153, 159, 158, 514, 51, 632, 631, -+ /* 400 */ 630, 71, 536, 432, 954, 196, 610, 954, 614, 45, -+ /* 410 */ 18, 89, 90, 80, 600, 599, 601, 601, 87, 87, -+ /* 420 */ 88, 88, 88, 88, 261, 86, 86, 86, 86, 85, -+ /* 430 */ 85, 84, 84, 84, 83, 330, 306, 608, 608, 608, -+ /* 440 */ 542, 424, 402, 385, 241, 506, 451, 320, 211, 543, -+ /* 450 */ 164, 436, 386, 293, 451, 587, 108, 496, 111, 334, -+ /* 460 */ 391, 591, 424, 614, 27, 452, 453, 606, 606, 72, -+ /* 470 */ 257, 70, 259, 452, 339, 342, 564, 582, 68, 415, -+ /* 480 */ 469, 328, 327, 62, 614, 45, 110, 393, 89, 90, -+ /* 490 */ 80, 600, 599, 601, 601, 87, 87, 88, 88, 88, -+ /* 500 */ 88, 152, 86, 86, 86, 86, 85, 85, 84, 84, -+ /* 510 */ 84, 83, 330, 306, 110, 499, 520, 538, 402, 389, -+ /* 520 */ 424, 110, 566, 500, 593, 593, 454, 82, 79, 165, -+ /* 530 */ 424, 591, 384, 564, 340, 615, 188, 162, 424, 350, -+ /* 540 */ 616, 424, 614, 44, 606, 606, 445, 582, 300, 434, -+ /* 550 */ 151, 19, 614, 9, 568, 580, 348, 615, 469, 567, -+ /* 560 */ 614, 26, 616, 614, 45, 89, 90, 80, 600, 599, -+ /* 570 */ 601, 601, 87, 87, 88, 88, 88, 88, 411, 86, -+ /* 580 */ 86, 86, 86, 85, 85, 84, 84, 84, 83, 330, -+ /* 590 */ 306, 579, 110, 578, 521, 282, 433, 398, 400, 255, -+ /* 600 */ 486, 82, 79, 165, 487, 164, 82, 79, 165, 488, -+ /* 610 */ 488, 364, 387, 424, 544, 544, 509, 350, 362, 155, -+ /* 620 */ 191, 606, 606, 559, 642, 640, 333, 82, 79, 165, -+ /* 630 */ 305, 564, 507, 312, 357, 614, 45, 329, 596, 595, -+ /* 640 */ 194, 337, 89, 90, 80, 600, 599, 601, 601, 87, -+ /* 650 */ 87, 88, 88, 88, 88, 424, 86, 86, 86, 86, -+ /* 660 */ 85, 85, 84, 84, 84, 83, 330, 306, 20, 323, -+ /* 670 */ 150, 263, 211, 543, 421, 596, 595, 614, 22, 424, -+ /* 680 */ 193, 424, 284, 424, 391, 424, 509, 424, 577, 424, -+ /* 690 */ 186, 335, 424, 559, 424, 313, 120, 546, 606, 606, -+ /* 700 */ 67, 614, 47, 614, 50, 614, 48, 614, 100, 614, -+ /* 710 */ 99, 614, 101, 576, 614, 102, 614, 109, 326, 89, -+ /* 720 */ 90, 80, 600, 599, 601, 601, 87, 87, 88, 88, -+ /* 730 */ 88, 88, 424, 86, 86, 86, 86, 85, 85, 84, -+ /* 740 */ 84, 84, 83, 330, 306, 424, 311, 424, 585, 54, -+ /* 750 */ 424, 516, 517, 590, 614, 112, 424, 584, 424, 572, -+ /* 760 */ 424, 195, 424, 571, 424, 67, 424, 614, 94, 614, -+ /* 770 */ 98, 424, 614, 97, 264, 606, 606, 195, 614, 46, -+ /* 780 */ 614, 96, 614, 30, 614, 49, 614, 115, 614, 114, -+ /* 790 */ 418, 229, 388, 614, 113, 306, 89, 90, 80, 600, -+ /* 800 */ 599, 601, 601, 87, 87, 88, 88, 88, 88, 424, -+ /* 810 */ 86, 86, 86, 86, 85, 85, 84, 84, 84, 83, -+ /* 820 */ 330, 119, 424, 590, 110, 372, 606, 606, 195, 53, -+ /* 830 */ 250, 614, 29, 195, 472, 438, 729, 190, 302, 498, -+ /* 840 */ 14, 523, 641, 2, 614, 43, 306, 89, 90, 80, -+ /* 850 */ 600, 599, 601, 601, 87, 87, 88, 88, 88, 88, -+ /* 860 */ 424, 86, 86, 86, 86, 85, 85, 84, 84, 84, -+ /* 870 */ 83, 330, 424, 613, 964, 964, 354, 606, 606, 420, -+ /* 880 */ 312, 64, 614, 42, 391, 355, 283, 437, 301, 255, -+ /* 890 */ 414, 410, 495, 492, 614, 28, 471, 306, 89, 90, -+ /* 900 */ 80, 600, 599, 601, 601, 87, 87, 88, 88, 88, -+ /* 910 */ 88, 424, 86, 86, 86, 86, 85, 85, 84, 84, -+ /* 920 */ 84, 83, 330, 424, 110, 110, 110, 110, 606, 606, -+ /* 930 */ 110, 254, 13, 614, 41, 532, 531, 283, 481, 531, -+ /* 940 */ 457, 284, 119, 561, 356, 614, 40, 284, 306, 89, -+ /* 950 */ 78, 80, 600, 599, 601, 601, 87, 87, 88, 88, -+ /* 960 */ 88, 88, 424, 86, 86, 86, 86, 85, 85, 84, -+ /* 970 */ 84, 84, 83, 330, 110, 424, 341, 220, 555, 606, -+ /* 980 */ 606, 351, 555, 318, 614, 95, 413, 255, 83, 330, -+ /* 990 */ 284, 284, 255, 640, 333, 356, 255, 614, 39, 306, -+ /* 1000 */ 356, 90, 80, 600, 599, 601, 601, 87, 87, 88, -+ /* 1010 */ 88, 88, 88, 424, 86, 86, 86, 86, 85, 85, -+ /* 1020 */ 84, 84, 84, 83, 330, 424, 317, 316, 141, 465, -+ /* 1030 */ 606, 606, 219, 619, 463, 614, 10, 417, 462, 255, -+ /* 1040 */ 189, 510, 553, 351, 207, 363, 161, 614, 38, 315, -+ /* 1050 */ 218, 255, 255, 80, 600, 599, 601, 601, 87, 87, -+ /* 1060 */ 88, 88, 88, 88, 424, 86, 86, 86, 86, 85, -+ /* 1070 */ 85, 84, 84, 84, 83, 330, 76, 419, 255, 3, -+ /* 1080 */ 878, 461, 424, 247, 331, 331, 614, 37, 217, 76, -+ /* 1090 */ 419, 390, 3, 216, 215, 422, 4, 331, 331, 424, -+ /* 1100 */ 547, 12, 424, 545, 614, 36, 424, 541, 422, 424, -+ /* 1110 */ 540, 424, 214, 424, 408, 424, 539, 403, 605, 605, -+ /* 1120 */ 237, 614, 25, 119, 614, 24, 588, 408, 614, 45, -+ /* 1130 */ 118, 614, 35, 614, 34, 614, 33, 614, 23, 588, -+ /* 1140 */ 60, 223, 603, 602, 513, 378, 73, 74, 140, 139, -+ /* 1150 */ 424, 110, 265, 75, 426, 425, 59, 424, 610, 73, -+ /* 1160 */ 74, 549, 402, 404, 424, 373, 75, 426, 425, 604, -+ /* 1170 */ 138, 610, 614, 11, 392, 76, 419, 181, 3, 614, -+ /* 1180 */ 32, 271, 369, 331, 331, 493, 614, 31, 149, 608, -+ /* 1190 */ 608, 608, 607, 15, 422, 365, 614, 8, 137, 489, -+ /* 1200 */ 136, 190, 608, 608, 608, 607, 15, 485, 176, 135, -+ /* 1210 */ 7, 252, 477, 408, 174, 133, 175, 474, 57, 56, -+ /* 1220 */ 132, 130, 119, 76, 419, 588, 3, 468, 245, 464, -+ /* 1230 */ 171, 331, 331, 125, 123, 456, 447, 122, 446, 104, -+ /* 1240 */ 336, 231, 422, 166, 154, 73, 74, 332, 116, 431, -+ /* 1250 */ 121, 309, 75, 426, 425, 222, 106, 610, 308, 637, -+ /* 1260 */ 204, 408, 629, 627, 628, 6, 200, 428, 427, 290, -+ /* 1270 */ 203, 622, 201, 588, 62, 63, 289, 66, 419, 399, -+ /* 1280 */ 3, 401, 288, 92, 143, 331, 331, 287, 608, 608, -+ /* 1290 */ 608, 607, 15, 73, 74, 227, 422, 325, 69, 416, -+ /* 1300 */ 75, 426, 425, 612, 412, 610, 192, 61, 569, 209, -+ /* 1310 */ 396, 226, 278, 225, 383, 408, 527, 558, 276, 533, -+ /* 1320 */ 552, 528, 321, 523, 370, 508, 180, 588, 494, 179, -+ /* 1330 */ 366, 117, 253, 269, 522, 503, 608, 608, 608, 607, -+ /* 1340 */ 15, 551, 502, 58, 274, 524, 178, 73, 74, 304, -+ /* 1350 */ 501, 368, 303, 206, 75, 426, 425, 491, 360, 610, -+ /* 1360 */ 213, 177, 483, 131, 345, 298, 297, 296, 202, 294, -+ /* 1370 */ 480, 490, 466, 134, 172, 129, 444, 346, 470, 128, -+ /* 1380 */ 314, 459, 103, 127, 126, 148, 124, 167, 443, 235, -+ /* 1390 */ 608, 608, 608, 607, 15, 442, 439, 623, 234, 299, -+ /* 1400 */ 145, 583, 291, 377, 581, 160, 119, 156, 270, 636, -+ /* 1410 */ 971, 169, 279, 626, 520, 625, 473, 624, 170, 621, -+ /* 1420 */ 618, 119, 168, 55, 409, 423, 537, 609, 286, 285, -+ /* 1430 */ 405, 570, 560, 556, 5, 52, 458, 554, 147, 267, -+ /* 1440 */ 519, 504, 518, 406, 262, 239, 260, 512, 343, 511, -+ /* 1450 */ 258, 353, 565, 256, 224, 251, 359, 277, 275, 476, -+ /* 1460 */ 475, 246, 352, 244, 467, 455, 236, 233, 232, 307, -+ /* 1470 */ 441, 281, 205, 163, 397, 280, 535, 505, 330, 617, -+ /* 1480 */ 971, 971, 971, 971, 367, 971, 971, 971, 971, 971, -+ /* 1490 */ 971, 971, 971, 971, 971, 971, 338, - }; - static const YYCODETYPE yy_lookahead[] = { -- /* 0 */ 19, 143, 144, 145, 146, 24, 7, 8, 27, 78, -- /* 10 */ 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, -- /* 20 */ 89, 90, 91, 92, 93, 106, 107, 108, 27, 28, -- /* 30 */ 15, 50, 51, 78, 79, 80, 81, 26, 83, 84, -- /* 40 */ 85, 86, 87, 88, 89, 90, 91, 92, 93, 1, -- /* 50 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -- /* 60 */ 79, 80, 81, 11, 83, 84, 85, 86, 87, 88, -- /* 70 */ 89, 90, 91, 92, 93, 19, 95, 89, 90, 91, -- /* 80 */ 92, 93, 26, 83, 84, 85, 86, 87, 88, 89, -- /* 90 */ 90, 91, 92, 93, 27, 28, 95, 96, 97, 27, -- /* 100 */ 28, 100, 101, 102, 22, 19, 50, 51, 27, 28, -- /* 110 */ 58, 55, 111, 7, 8, 9, 87, 88, 89, 90, -- /* 120 */ 91, 92, 93, 98, 99, 69, 70, 71, 72, 73, -- /* 130 */ 74, 75, 76, 77, 78, 79, 80, 81, 127, 83, -- /* 140 */ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -- /* 150 */ 19, 223, 224, 225, 87, 88, 162, 31, 106, 107, -- /* 160 */ 108, 35, 95, 96, 33, 98, 23, 95, 96, 117, -- /* 170 */ 119, 243, 105, 42, 107, 49, 95, 96, 151, 93, -- /* 180 */ 26, 50, 51, 97, 98, 99, 100, 101, 102, 103, -- /* 190 */ 196, 22, 23, 121, 167, 26, 110, 130, 131, 67, -- /* 200 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -- /* 210 */ 79, 80, 81, 219, 83, 84, 85, 86, 87, 88, -- /* 220 */ 89, 90, 91, 92, 93, 19, 12, 95, 234, 119, -- /* 230 */ 24, 99, 113, 239, 115, 116, 151, 68, 23, 147, -- /* 240 */ 148, 26, 215, 29, 151, 153, 119, 155, 163, 164, -- /* 250 */ 23, 23, 167, 26, 162, 23, 50, 51, 26, 45, -- /* 260 */ 167, 47, 130, 131, 132, 172, 173, 23, 22, 23, -- /* 270 */ 26, 186, 26, 188, 120, 69, 70, 71, 72, 73, -- /* 280 */ 74, 75, 76, 77, 78, 79, 80, 81, 196, 83, -- /* 290 */ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -- /* 300 */ 19, 151, 151, 23, 119, 97, 26, 19, 100, 101, -- /* 310 */ 102, 219, 151, 162, 68, 22, 28, 167, 167, 111, -- /* 320 */ 27, 26, 172, 173, 231, 232, 175, 176, 167, 27, -- /* 330 */ 28, 50, 51, 27, 28, 119, 175, 176, 246, 24, -- /* 340 */ 22, 113, 27, 115, 116, 27, 28, 196, 22, 23, -- /* 350 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -- /* 360 */ 79, 80, 81, 114, 83, 84, 85, 86, 87, 88, -- /* 370 */ 89, 90, 91, 92, 93, 19, 21, 151, 217, 22, -- /* 380 */ 151, 231, 232, 222, 27, 28, 23, 114, 95, 50, -- /* 390 */ 51, 118, 151, 167, 68, 89, 167, 95, 96, 104, -- /* 400 */ 23, 95, 96, 26, 175, 176, 50, 51, 167, 22, -- /* 410 */ 95, 72, 73, 95, 96, 16, 175, 176, 137, 64, -- /* 420 */ 23, 195, 27, 121, 23, 69, 70, 71, 72, 73, -- /* 430 */ 74, 75, 76, 77, 78, 79, 80, 81, 99, 83, -- /* 440 */ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -- /* 450 */ 19, 12, 95, 96, 23, 226, 101, 22, 217, 19, -- /* 460 */ 61, 151, 63, 222, 151, 106, 107, 108, 29, 159, -- /* 470 */ 244, 151, 99, 163, 164, 23, 113, 167, 115, 116, -- /* 480 */ 167, 50, 51, 110, 45, 58, 47, 167, 175, 176, -- /* 490 */ 95, 51, 168, 137, 139, 175, 176, 58, 11, 22, -- /* 500 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -- /* 510 */ 79, 80, 81, 22, 83, 84, 85, 86, 87, 88, -- /* 520 */ 89, 90, 91, 92, 93, 19, 23, 151, 117, 23, -- /* 530 */ 217, 207, 19, 106, 107, 108, 216, 151, 139, 23, -- /* 540 */ 129, 28, 26, 167, 117, 105, 23, 223, 224, 225, -- /* 550 */ 110, 175, 176, 167, 77, 165, 50, 51, 168, 169, -- /* 560 */ 170, 175, 176, 87, 88, 113, 26, 115, 116, 171, -- /* 570 */ 172, 173, 0, 1, 2, 69, 70, 71, 72, 73, -- /* 580 */ 74, 75, 76, 77, 78, 79, 80, 81, 162, 83, -- /* 590 */ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -- /* 600 */ 19, 151, 98, 217, 23, 37, 130, 131, 23, 23, -- /* 610 */ 26, 26, 96, 163, 164, 23, 113, 167, 115, 116, -- /* 620 */ 52, 117, 196, 151, 171, 172, 173, 59, 130, 131, -- /* 630 */ 232, 50, 51, 129, 208, 209, 16, 121, 156, 167, -- /* 640 */ 22, 23, 162, 223, 224, 225, 51, 175, 176, 121, -- /* 650 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -- /* 660 */ 79, 80, 81, 178, 83, 84, 85, 86, 87, 88, -- /* 670 */ 89, 90, 91, 92, 93, 19, 196, 109, 151, 23, -- /* 680 */ 96, 61, 151, 63, 23, 232, 68, 26, 151, 168, -- /* 690 */ 169, 170, 23, 89, 167, 26, 208, 209, 167, 219, -- /* 700 */ 105, 36, 175, 176, 167, 121, 50, 51, 223, 224, -- /* 710 */ 225, 229, 175, 176, 178, 233, 247, 248, 114, 239, -- /* 720 */ 189, 22, 118, 24, 162, 69, 70, 71, 72, 73, -- /* 730 */ 74, 75, 76, 77, 78, 79, 80, 81, 151, 83, -- /* 740 */ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -- /* 750 */ 19, 151, 26, 151, 167, 24, 145, 146, 196, 223, -- /* 760 */ 224, 225, 175, 176, 151, 182, 183, 167, 151, 167, -- /* 770 */ 151, 36, 199, 190, 151, 175, 176, 175, 176, 206, -- /* 780 */ 167, 50, 51, 221, 167, 136, 167, 138, 175, 176, -- /* 790 */ 167, 26, 175, 176, 175, 176, 168, 36, 175, 176, -- /* 800 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -- /* 810 */ 79, 80, 81, 151, 83, 84, 85, 86, 87, 88, -- /* 820 */ 89, 90, 91, 92, 93, 19, 151, 151, 151, 167, -- /* 830 */ 151, 151, 151, 151, 162, 207, 23, 175, 176, 26, -- /* 840 */ 249, 250, 167, 167, 167, 151, 167, 167, 167, 167, -- /* 850 */ 175, 176, 175, 176, 175, 176, 50, 51, 151, 53, -- /* 860 */ 22, 167, 192, 193, 33, 189, 192, 193, 196, 189, -- /* 870 */ 189, 189, 162, 42, 167, 69, 70, 71, 72, 73, -- /* 880 */ 74, 75, 76, 77, 78, 79, 80, 81, 151, 83, -- /* 890 */ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -- /* 900 */ 19, 151, 195, 151, 167, 151, 196, 162, 151, 215, -- /* 910 */ 92, 93, 175, 176, 28, 174, 119, 167, 151, 167, -- /* 920 */ 151, 167, 151, 182, 167, 175, 176, 175, 176, 175, -- /* 930 */ 176, 50, 51, 23, 167, 23, 167, 40, 167, 22, -- /* 940 */ 167, 196, 53, 168, 175, 176, 175, 176, 175, 162, -- /* 950 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -- /* 960 */ 79, 80, 81, 151, 83, 84, 85, 86, 87, 88, -- /* 970 */ 89, 90, 91, 92, 93, 19, 151, 151, 151, 167, -- /* 980 */ 151, 151, 207, 196, 30, 218, 22, 175, 176, 1, -- /* 990 */ 2, 53, 167, 167, 167, 151, 167, 167, 151, 151, -- /* 1000 */ 175, 176, 175, 176, 175, 176, 50, 51, 221, 23, -- /* 1010 */ 53, 167, 22, 22, 167, 167, 103, 168, 22, 110, -- /* 1020 */ 19, 105, 175, 176, 20, 69, 70, 71, 72, 73, -- /* 1030 */ 74, 75, 76, 77, 78, 79, 80, 81, 151, 83, -- /* 1040 */ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -- /* 1050 */ 19, 151, 151, 151, 167, 151, 207, 24, 44, 215, -- /* 1060 */ 60, 26, 175, 176, 54, 54, 240, 167, 167, 167, -- /* 1070 */ 240, 167, 151, 151, 151, 175, 176, 175, 176, 175, -- /* 1080 */ 176, 50, 51, 139, 151, 22, 105, 119, 167, 167, -- /* 1090 */ 167, 5, 1, 36, 28, 77, 175, 176, 175, 176, -- /* 1100 */ 167, 70, 71, 72, 73, 74, 75, 76, 77, 78, -- /* 1110 */ 79, 80, 81, 151, 83, 84, 85, 86, 87, 88, -- /* 1120 */ 89, 90, 91, 92, 93, 19, 151, 151, 151, 167, -- /* 1130 */ 151, 151, 109, 151, 128, 77, 22, 175, 176, 26, -- /* 1140 */ 218, 240, 167, 167, 167, 151, 167, 167, 151, 167, -- /* 1150 */ 175, 176, 175, 176, 175, 176, 50, 51, 151, 22, -- /* 1160 */ 151, 167, 23, 120, 167, 1, 16, 122, 20, 120, -- /* 1170 */ 109, 195, 175, 176, 167, 195, 167, 71, 72, 73, -- /* 1180 */ 74, 75, 76, 77, 78, 79, 80, 81, 151, 83, -- /* 1190 */ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -- /* 1200 */ 19, 20, 195, 22, 167, 151, 151, 128, 27, 28, -- /* 1210 */ 129, 23, 175, 176, 23, 66, 141, 22, 151, 38, -- /* 1220 */ 151, 167, 167, 19, 20, 151, 22, 151, 151, 175, -- /* 1230 */ 176, 27, 28, 151, 167, 15, 167, 4, 57, 16, -- /* 1240 */ 151, 167, 38, 167, 167, 3, 166, 248, 67, 167, -- /* 1250 */ 195, 175, 176, 181, 181, 150, 167, 175, 176, 251, -- /* 1260 */ 6, 57, 151, 151, 175, 176, 151, 151, 87, 88, -- /* 1270 */ 89, 67, 151, 162, 151, 94, 95, 96, 167, 167, -- /* 1280 */ 99, 251, 167, 167, 152, 151, 175, 176, 167, 151, -- /* 1290 */ 167, 87, 88, 151, 150, 150, 175, 176, 94, 95, -- /* 1300 */ 96, 167, 150, 99, 151, 167, 151, 196, 13, 167, -- /* 1310 */ 195, 130, 131, 132, 133, 134, 135, 152, 195, 160, -- /* 1320 */ 167, 117, 167, 19, 20, 151, 22, 151, 217, 151, -- /* 1330 */ 161, 27, 28, 222, 130, 131, 132, 133, 134, 135, -- /* 1340 */ 151, 167, 38, 167, 151, 167, 19, 20, 195, 22, -- /* 1350 */ 151, 151, 151, 151, 27, 28, 167, 151, 151, 26, -- /* 1360 */ 167, 57, 25, 196, 151, 38, 167, 167, 167, 167, -- /* 1370 */ 151, 67, 151, 167, 167, 117, 201, 151, 125, 151, -- /* 1380 */ 167, 151, 127, 124, 57, 151, 167, 202, 167, 203, -- /* 1390 */ 151, 87, 88, 167, 67, 167, 151, 167, 94, 95, -- /* 1400 */ 96, 167, 151, 99, 123, 126, 167, 204, 136, 227, -- /* 1410 */ 205, 119, 167, 105, 87, 88, 122, 177, 167, 158, -- /* 1420 */ 158, 94, 95, 96, 212, 105, 99, 213, 212, 177, -- /* 1430 */ 213, 213, 185, 48, 130, 131, 132, 133, 134, 135, -- /* 1440 */ 5, 212, 177, 179, 104, 10, 11, 12, 13, 14, -- /* 1450 */ 177, 180, 17, 22, 230, 93, 180, 130, 131, 132, -- /* 1460 */ 133, 134, 135, 185, 177, 230, 177, 32, 177, 34, -- /* 1470 */ 157, 22, 18, 158, 157, 157, 27, 28, 43, 158, -- /* 1480 */ 158, 158, 46, 237, 136, 157, 238, 158, 191, 201, -- /* 1490 */ 69, 56, 191, 58, 220, 22, 157, 62, 18, 201, -- /* 1500 */ 65, 158, 220, 194, 194, 194, 194, 201, 158, 242, -- /* 1510 */ 191, 41, 242, 158, 158, 39, 67, 154, 232, 168, -- /* 1520 */ 245, 228, 198, 178, 183, 200, 168, 211, 232, 168, -- /* 1530 */ 178, 178, 201, 187, 198, 149, 87, 88, 179, 168, -- /* 1540 */ 241, 106, 107, 108, 95, 211, 241, 112, 99, 211, -- /* 1550 */ 201, 197, 117, 193, 210, 188, 184, 184, 184, 175, -- /* 1560 */ 93, 235, 175, 252, 252, 252, 236, 252, 252, 252, -- /* 1570 */ 252, 252, 252, 252, 252, 140, 252, 252, 252, 130, -- /* 1580 */ 131, 132, --}; --#define YY_SHIFT_USE_DFLT (-82) --#define YY_SHIFT_COUNT (419) --#define YY_SHIFT_MIN (-81) --#define YY_SHIFT_MAX (1480) -+ /* 0 */ 19, 22, 22, 23, 1, 24, 26, 15, 27, 80, -+ /* 10 */ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, -+ /* 20 */ 91, 92, 93, 94, 95, 108, 109, 110, 27, 28, -+ /* 30 */ 23, 50, 51, 80, 81, 82, 83, 122, 85, 86, -+ /* 40 */ 87, 88, 89, 90, 91, 92, 93, 94, 95, 22, -+ /* 50 */ 70, 23, 71, 72, 73, 74, 75, 76, 77, 78, -+ /* 60 */ 79, 80, 81, 82, 83, 122, 85, 86, 87, 88, -+ /* 70 */ 89, 90, 91, 92, 93, 94, 95, 19, 97, 91, -+ /* 80 */ 92, 93, 94, 95, 26, 85, 86, 87, 88, 89, -+ /* 90 */ 90, 91, 92, 93, 94, 95, 27, 28, 97, 98, -+ /* 100 */ 99, 122, 211, 102, 103, 104, 79, 19, 50, 51, -+ /* 110 */ 19, 122, 59, 55, 113, 224, 225, 226, 89, 90, -+ /* 120 */ 91, 92, 93, 94, 95, 23, 27, 28, 26, 71, -+ /* 130 */ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, -+ /* 140 */ 82, 83, 51, 85, 86, 87, 88, 89, 90, 91, -+ /* 150 */ 92, 93, 94, 95, 19, 132, 133, 58, 89, 90, -+ /* 160 */ 21, 108, 109, 110, 27, 28, 97, 98, 33, 100, -+ /* 170 */ 7, 8, 119, 120, 22, 19, 107, 42, 109, 27, -+ /* 180 */ 28, 27, 28, 95, 28, 50, 51, 99, 100, 101, -+ /* 190 */ 102, 103, 104, 105, 27, 28, 97, 98, 107, 152, -+ /* 200 */ 112, 132, 133, 112, 65, 69, 71, 72, 73, 74, -+ /* 210 */ 75, 76, 77, 78, 79, 80, 81, 82, 83, 11, -+ /* 220 */ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, -+ /* 230 */ 95, 19, 101, 97, 97, 98, 24, 101, 122, 157, -+ /* 240 */ 12, 99, 103, 112, 102, 103, 104, 152, 22, 97, -+ /* 250 */ 98, 97, 98, 27, 28, 113, 27, 29, 91, 164, -+ /* 260 */ 165, 124, 50, 51, 97, 98, 219, 59, 132, 133, -+ /* 270 */ 134, 22, 23, 45, 66, 47, 212, 213, 124, 140, -+ /* 280 */ 132, 133, 19, 71, 72, 73, 74, 75, 76, 77, -+ /* 290 */ 78, 79, 80, 81, 82, 83, 152, 85, 86, 87, -+ /* 300 */ 88, 89, 90, 91, 92, 93, 94, 95, 164, 165, -+ /* 310 */ 27, 28, 230, 50, 51, 233, 108, 109, 110, 70, -+ /* 320 */ 16, 59, 23, 97, 98, 26, 97, 22, 66, 185, -+ /* 330 */ 12, 187, 27, 28, 71, 72, 73, 74, 75, 76, -+ /* 340 */ 77, 78, 79, 80, 81, 82, 83, 29, 85, 86, -+ /* 350 */ 87, 88, 89, 90, 91, 92, 93, 94, 95, 19, -+ /* 360 */ 22, 148, 149, 45, 23, 47, 62, 154, 64, 156, -+ /* 370 */ 108, 109, 110, 37, 69, 23, 163, 59, 26, 26, -+ /* 380 */ 97, 98, 144, 145, 146, 147, 152, 200, 52, 23, -+ /* 390 */ 50, 51, 26, 22, 89, 90, 60, 210, 7, 8, -+ /* 400 */ 9, 138, 97, 22, 23, 26, 101, 26, 174, 175, -+ /* 410 */ 197, 71, 72, 73, 74, 75, 76, 77, 78, 79, -+ /* 420 */ 80, 81, 82, 83, 16, 85, 86, 87, 88, 89, -+ /* 430 */ 90, 91, 92, 93, 94, 95, 19, 132, 133, 134, -+ /* 440 */ 23, 152, 208, 209, 140, 152, 152, 111, 195, 196, -+ /* 450 */ 98, 70, 163, 160, 152, 23, 22, 164, 165, 246, -+ /* 460 */ 207, 27, 152, 174, 175, 171, 172, 50, 51, 137, -+ /* 470 */ 62, 139, 64, 171, 172, 222, 124, 27, 138, 24, -+ /* 480 */ 163, 89, 90, 130, 174, 175, 197, 163, 71, 72, -+ /* 490 */ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, -+ /* 500 */ 83, 22, 85, 86, 87, 88, 89, 90, 91, 92, -+ /* 510 */ 93, 94, 95, 19, 197, 181, 182, 23, 208, 209, -+ /* 520 */ 152, 197, 26, 189, 132, 133, 232, 224, 225, 226, -+ /* 530 */ 152, 97, 91, 26, 232, 116, 212, 213, 152, 222, -+ /* 540 */ 121, 152, 174, 175, 50, 51, 243, 97, 22, 23, -+ /* 550 */ 22, 234, 174, 175, 177, 23, 239, 116, 163, 177, -+ /* 560 */ 174, 175, 121, 174, 175, 71, 72, 73, 74, 75, -+ /* 570 */ 76, 77, 78, 79, 80, 81, 82, 83, 24, 85, -+ /* 580 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, -+ /* 590 */ 19, 23, 197, 11, 23, 227, 70, 208, 220, 152, -+ /* 600 */ 31, 224, 225, 226, 35, 98, 224, 225, 226, 108, -+ /* 610 */ 109, 110, 115, 152, 117, 118, 27, 222, 49, 123, -+ /* 620 */ 24, 50, 51, 27, 0, 1, 2, 224, 225, 226, -+ /* 630 */ 166, 124, 168, 169, 239, 174, 175, 170, 171, 172, -+ /* 640 */ 22, 194, 71, 72, 73, 74, 75, 76, 77, 78, -+ /* 650 */ 79, 80, 81, 82, 83, 152, 85, 86, 87, 88, -+ /* 660 */ 89, 90, 91, 92, 93, 94, 95, 19, 22, 208, -+ /* 670 */ 24, 23, 195, 196, 170, 171, 172, 174, 175, 152, -+ /* 680 */ 26, 152, 152, 152, 207, 152, 97, 152, 23, 152, -+ /* 690 */ 51, 244, 152, 97, 152, 247, 248, 23, 50, 51, -+ /* 700 */ 26, 174, 175, 174, 175, 174, 175, 174, 175, 174, -+ /* 710 */ 175, 174, 175, 23, 174, 175, 174, 175, 188, 71, -+ /* 720 */ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, -+ /* 730 */ 82, 83, 152, 85, 86, 87, 88, 89, 90, 91, -+ /* 740 */ 92, 93, 94, 95, 19, 152, 107, 152, 33, 24, -+ /* 750 */ 152, 100, 101, 27, 174, 175, 152, 42, 152, 23, -+ /* 760 */ 152, 26, 152, 23, 152, 26, 152, 174, 175, 174, -+ /* 770 */ 175, 152, 174, 175, 23, 50, 51, 26, 174, 175, -+ /* 780 */ 174, 175, 174, 175, 174, 175, 174, 175, 174, 175, -+ /* 790 */ 163, 119, 120, 174, 175, 19, 71, 72, 73, 74, -+ /* 800 */ 75, 76, 77, 78, 79, 80, 81, 82, 83, 152, -+ /* 810 */ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, -+ /* 820 */ 95, 66, 152, 97, 197, 23, 50, 51, 26, 53, -+ /* 830 */ 23, 174, 175, 26, 23, 23, 23, 26, 26, 26, -+ /* 840 */ 36, 106, 146, 147, 174, 175, 19, 71, 72, 73, -+ /* 850 */ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, -+ /* 860 */ 152, 85, 86, 87, 88, 89, 90, 91, 92, 93, -+ /* 870 */ 94, 95, 152, 196, 119, 120, 19, 50, 51, 168, -+ /* 880 */ 169, 26, 174, 175, 207, 28, 152, 249, 250, 152, -+ /* 890 */ 163, 163, 163, 163, 174, 175, 163, 19, 71, 72, -+ /* 900 */ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, -+ /* 910 */ 83, 152, 85, 86, 87, 88, 89, 90, 91, 92, -+ /* 920 */ 93, 94, 95, 152, 197, 197, 197, 197, 50, 51, -+ /* 930 */ 197, 194, 36, 174, 175, 191, 192, 152, 191, 192, -+ /* 940 */ 163, 152, 66, 124, 152, 174, 175, 152, 19, 71, -+ /* 950 */ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, -+ /* 960 */ 82, 83, 152, 85, 86, 87, 88, 89, 90, 91, -+ /* 970 */ 92, 93, 94, 95, 197, 152, 100, 188, 152, 50, -+ /* 980 */ 51, 152, 152, 188, 174, 175, 252, 152, 94, 95, -+ /* 990 */ 152, 152, 152, 1, 2, 152, 152, 174, 175, 19, -+ /* 1000 */ 152, 72, 73, 74, 75, 76, 77, 78, 79, 80, -+ /* 1010 */ 81, 82, 83, 152, 85, 86, 87, 88, 89, 90, -+ /* 1020 */ 91, 92, 93, 94, 95, 152, 188, 188, 22, 194, -+ /* 1030 */ 50, 51, 240, 173, 194, 174, 175, 252, 194, 152, -+ /* 1040 */ 36, 181, 28, 152, 23, 219, 122, 174, 175, 219, -+ /* 1050 */ 221, 152, 152, 73, 74, 75, 76, 77, 78, 79, -+ /* 1060 */ 80, 81, 82, 83, 152, 85, 86, 87, 88, 89, -+ /* 1070 */ 90, 91, 92, 93, 94, 95, 19, 20, 152, 22, -+ /* 1080 */ 23, 194, 152, 240, 27, 28, 174, 175, 240, 19, -+ /* 1090 */ 20, 26, 22, 194, 194, 38, 22, 27, 28, 152, -+ /* 1100 */ 23, 22, 152, 116, 174, 175, 152, 23, 38, 152, -+ /* 1110 */ 23, 152, 221, 152, 57, 152, 23, 163, 50, 51, -+ /* 1120 */ 194, 174, 175, 66, 174, 175, 69, 57, 174, 175, -+ /* 1130 */ 40, 174, 175, 174, 175, 174, 175, 174, 175, 69, -+ /* 1140 */ 22, 53, 74, 75, 30, 53, 89, 90, 22, 22, -+ /* 1150 */ 152, 197, 23, 96, 97, 98, 22, 152, 101, 89, -+ /* 1160 */ 90, 91, 208, 209, 152, 53, 96, 97, 98, 101, -+ /* 1170 */ 22, 101, 174, 175, 152, 19, 20, 105, 22, 174, -+ /* 1180 */ 175, 112, 19, 27, 28, 20, 174, 175, 24, 132, -+ /* 1190 */ 133, 134, 135, 136, 38, 44, 174, 175, 107, 61, -+ /* 1200 */ 54, 26, 132, 133, 134, 135, 136, 54, 107, 22, -+ /* 1210 */ 5, 140, 1, 57, 36, 111, 122, 28, 79, 79, -+ /* 1220 */ 131, 123, 66, 19, 20, 69, 22, 1, 16, 20, -+ /* 1230 */ 125, 27, 28, 123, 111, 120, 23, 131, 23, 16, -+ /* 1240 */ 68, 142, 38, 15, 22, 89, 90, 3, 167, 4, -+ /* 1250 */ 248, 251, 96, 97, 98, 180, 180, 101, 251, 151, -+ /* 1260 */ 6, 57, 151, 13, 151, 26, 25, 151, 161, 202, -+ /* 1270 */ 153, 162, 153, 69, 130, 128, 203, 19, 20, 127, -+ /* 1280 */ 22, 126, 204, 129, 22, 27, 28, 205, 132, 133, -+ /* 1290 */ 134, 135, 136, 89, 90, 231, 38, 95, 137, 179, -+ /* 1300 */ 96, 97, 98, 206, 179, 101, 122, 107, 159, 159, -+ /* 1310 */ 125, 231, 216, 228, 107, 57, 184, 217, 216, 176, -+ /* 1320 */ 217, 176, 48, 106, 18, 184, 158, 69, 159, 158, -+ /* 1330 */ 46, 71, 237, 176, 176, 176, 132, 133, 134, 135, -+ /* 1340 */ 136, 217, 176, 137, 216, 178, 158, 89, 90, 179, -+ /* 1350 */ 176, 159, 179, 159, 96, 97, 98, 159, 159, 101, -+ /* 1360 */ 5, 158, 202, 22, 18, 10, 11, 12, 13, 14, -+ /* 1370 */ 190, 238, 17, 190, 158, 193, 41, 159, 202, 193, -+ /* 1380 */ 159, 202, 245, 193, 193, 223, 190, 32, 159, 34, -+ /* 1390 */ 132, 133, 134, 135, 136, 159, 39, 155, 43, 150, -+ /* 1400 */ 223, 177, 201, 178, 177, 186, 66, 199, 177, 152, -+ /* 1410 */ 253, 56, 215, 152, 182, 152, 202, 152, 63, 152, -+ /* 1420 */ 152, 66, 67, 242, 229, 152, 174, 152, 152, 152, -+ /* 1430 */ 152, 152, 152, 152, 199, 242, 202, 152, 198, 152, -+ /* 1440 */ 152, 152, 183, 192, 152, 215, 152, 183, 215, 183, -+ /* 1450 */ 152, 241, 214, 152, 211, 152, 152, 211, 211, 152, -+ /* 1460 */ 152, 241, 152, 152, 152, 152, 152, 152, 152, 114, -+ /* 1470 */ 152, 152, 235, 152, 152, 152, 174, 187, 95, 174, -+ /* 1480 */ 253, 253, 253, 253, 236, 253, 253, 253, 253, 253, -+ /* 1490 */ 253, 253, 253, 253, 253, 253, 141, -+}; -+#define YY_SHIFT_USE_DFLT (-86) -+#define YY_SHIFT_COUNT (429) -+#define YY_SHIFT_MIN (-85) -+#define YY_SHIFT_MAX (1383) - static const short yy_shift_ofst[] = { -- /* 0 */ 988, 1204, 1435, 1204, 1304, 1304, 67, 67, 1, -19, -- /* 10 */ 1304, 1304, 1304, 1304, 427, 81, 131, 131, 806, 1181, -- /* 20 */ 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, -- /* 30 */ 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, -- /* 40 */ 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1327, 1304, -- /* 50 */ 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, -- /* 60 */ 1304, 1304, 52, 81, 81, 476, 476, 395, 1258, 56, -- /* 70 */ 731, 656, 581, 506, 431, 356, 281, 206, 881, 881, -- /* 80 */ 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, -- /* 90 */ 881, 881, 881, 956, 881, 1031, 1106, 1106, -69, -45, -- /* 100 */ -45, -45, -45, -45, 0, 29, -12, 81, 81, 81, -- /* 110 */ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, -- /* 120 */ 81, 81, 81, 355, 440, 81, 81, 81, 81, 81, -- /* 130 */ 504, 411, 395, 818, 1467, -82, -82, -82, 1449, 86, -- /* 140 */ 439, 439, 306, 357, 302, 72, 318, 246, 169, 81, -- /* 150 */ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, -- /* 160 */ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, -- /* 170 */ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, -- /* 180 */ 81, 81, 315, 315, 315, 572, 1258, 1258, 1258, -82, -- /* 190 */ -82, -82, 132, 132, 208, 568, 568, 568, 516, 503, -- /* 200 */ 214, 452, 363, 228, 119, 119, 119, 119, 359, 126, -- /* 210 */ 119, 119, 584, 293, 604, 106, 11, 288, 288, 513, -- /* 220 */ 11, 513, 295, 813, 395, 831, 395, 831, 595, 831, -- /* 230 */ 288, 649, 498, 498, 395, 154, 273, 699, 1476, 1292, -- /* 240 */ 1292, 1470, 1470, 1292, 1473, 1421, 1255, 1480, 1480, 1480, -- /* 250 */ 1480, 1292, 1454, 1255, 1473, 1421, 1421, 1255, 1292, 1454, -- /* 260 */ 1348, 1436, 1292, 1292, 1454, 1292, 1454, 1292, 1454, 1431, -- /* 270 */ 1320, 1320, 1320, 1385, 1362, 1362, 1431, 1320, 1340, 1320, -- /* 280 */ 1385, 1320, 1320, 1294, 1308, 1294, 1308, 1294, 1308, 1292, -- /* 290 */ 1292, 1272, 1279, 1281, 1253, 1259, 1255, 1258, 1337, 1333, -- /* 300 */ 1295, 1295, 1254, 1254, 1254, 1254, -82, -82, -82, -82, -- /* 310 */ -82, -82, 339, 399, 618, 326, 620, -81, 669, 477, -- /* 320 */ 661, 585, 377, 280, 244, 232, 25, -1, 373, 227, -- /* 330 */ 215, 1233, 1242, 1195, 1075, 1220, 1149, 1223, 1191, 1188, -- /* 340 */ 1081, 1113, 1079, 1061, 1049, 1148, 1045, 1150, 1164, 1043, -- /* 350 */ 1139, 1137, 1113, 1114, 1006, 1058, 1018, 1023, 1066, 1057, -- /* 360 */ 968, 1091, 1086, 1063, 981, 944, 1011, 1035, 1010, 1000, -- /* 370 */ 1014, 916, 1033, 1004, 1001, 909, 913, 996, 957, 991, -- /* 380 */ 990, 986, 964, 938, 954, 917, 889, 897, 912, 910, -- /* 390 */ 797, 886, 761, 838, 528, 726, 735, 765, 665, 726, -- /* 400 */ 592, 586, 540, 523, 491, 487, 435, 401, 397, 387, -- /* 410 */ 249, 216, 185, 127, 110, 51, 82, 143, 15, 48, --}; --#define YY_REDUCE_USE_DFLT (-143) --#define YY_REDUCE_COUNT (311) --#define YY_REDUCE_MIN (-142) --#define YY_REDUCE_MAX (1387) -+ /* 0 */ 992, 1057, 1355, 1156, 1204, 1204, 1, 262, -19, 135, -+ /* 10 */ 135, 776, 1204, 1204, 1204, 1204, 69, 69, 53, 208, -+ /* 20 */ 283, 755, 58, 725, 648, 571, 494, 417, 340, 263, -+ /* 30 */ 212, 827, 827, 827, 827, 827, 827, 827, 827, 827, -+ /* 40 */ 827, 827, 827, 827, 827, 827, 878, 827, 929, 980, -+ /* 50 */ 980, 1070, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, -+ /* 60 */ 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, -+ /* 70 */ 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, -+ /* 80 */ 1258, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, -+ /* 90 */ 1204, 1204, 1204, 1204, -71, -47, -47, -47, -47, -47, -+ /* 100 */ 0, 29, -12, 283, 283, 139, 91, 392, 392, 894, -+ /* 110 */ 672, 726, 1383, -86, -86, -86, 88, 318, 318, 99, -+ /* 120 */ 381, -20, 283, 283, 283, 283, 283, 283, 283, 283, -+ /* 130 */ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, -+ /* 140 */ 283, 283, 283, 283, 624, 876, 726, 672, 1340, 1340, -+ /* 150 */ 1340, 1340, 1340, 1340, -86, -86, -86, 305, 136, 136, -+ /* 160 */ 142, 167, 226, 154, 137, 152, 283, 283, 283, 283, -+ /* 170 */ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, -+ /* 180 */ 283, 283, 283, 336, 336, 336, 283, 283, 352, 283, -+ /* 190 */ 283, 283, 283, 283, 228, 283, 283, 283, 283, 283, -+ /* 200 */ 283, 283, 283, 283, 283, 501, 569, 596, 596, 596, -+ /* 210 */ 507, 497, 441, 391, 353, 156, 156, 857, 353, 857, -+ /* 220 */ 735, 813, 639, 715, 156, 332, 715, 715, 496, 419, -+ /* 230 */ 646, 1357, 1184, 1184, 1335, 1335, 1184, 1341, 1260, 1144, -+ /* 240 */ 1346, 1346, 1346, 1346, 1184, 1306, 1144, 1341, 1260, 1260, -+ /* 250 */ 1144, 1184, 1306, 1206, 1284, 1184, 1184, 1306, 1184, 1306, -+ /* 260 */ 1184, 1306, 1262, 1207, 1207, 1207, 1274, 1262, 1207, 1217, -+ /* 270 */ 1207, 1274, 1207, 1207, 1185, 1200, 1185, 1200, 1185, 1200, -+ /* 280 */ 1184, 1184, 1161, 1262, 1202, 1202, 1262, 1154, 1155, 1147, -+ /* 290 */ 1152, 1144, 1241, 1239, 1250, 1250, 1254, 1254, 1254, 1254, -+ /* 300 */ -86, -86, -86, -86, -86, -86, 1068, 304, 526, 249, -+ /* 310 */ 408, -83, 434, 812, 27, 811, 807, 802, 751, 589, -+ /* 320 */ 651, 163, 131, 674, 366, 450, 299, 148, 23, 102, -+ /* 330 */ 229, -21, 1245, 1244, 1222, 1099, 1228, 1172, 1223, 1215, -+ /* 340 */ 1213, 1115, 1106, 1123, 1110, 1209, 1105, 1212, 1226, 1098, -+ /* 350 */ 1089, 1140, 1139, 1104, 1189, 1178, 1094, 1211, 1205, 1187, -+ /* 360 */ 1101, 1071, 1153, 1175, 1146, 1138, 1151, 1091, 1164, 1165, -+ /* 370 */ 1163, 1069, 1072, 1148, 1112, 1134, 1127, 1129, 1126, 1092, -+ /* 380 */ 1114, 1118, 1088, 1090, 1093, 1087, 1084, 987, 1079, 1077, -+ /* 390 */ 1074, 1065, 924, 1021, 1014, 1004, 1006, 819, 739, 896, -+ /* 400 */ 855, 804, 739, 740, 736, 690, 654, 665, 618, 582, -+ /* 410 */ 568, 528, 554, 379, 532, 479, 455, 379, 432, 371, -+ /* 420 */ 341, 28, 338, 116, -11, -57, -85, 7, -8, 3, -+}; -+#define YY_REDUCE_USE_DFLT (-110) -+#define YY_REDUCE_COUNT (305) -+#define YY_REDUCE_MIN (-109) -+#define YY_REDUCE_MAX (1323) - static const short yy_reduce_ofst[] = { -- /* 0 */ -142, 1111, 92, 151, 241, 161, 150, 93, 85, 324, -- /* 10 */ 386, 313, 320, 229, -6, 310, 536, 485, -72, 1121, -- /* 20 */ 1089, 1082, 1076, 1054, 1037, 997, 979, 977, 975, 962, -- /* 30 */ 923, 921, 904, 902, 900, 887, 847, 829, 827, 825, -- /* 40 */ 812, 771, 769, 754, 752, 750, 737, 679, 677, 675, -- /* 50 */ 662, 623, 619, 617, 613, 602, 600, 587, 537, 527, -- /* 60 */ 472, 376, 480, 450, 226, 453, 398, 390, 426, 420, -- /* 70 */ 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, -- /* 80 */ 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, -- /* 90 */ 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, -- /* 100 */ 420, 420, 420, 420, 420, 420, 420, 1153, 922, 1123, -- /* 110 */ 1115, 1055, 1007, 980, 976, 901, 844, 830, 767, 826, -- /* 120 */ 682, 694, 707, 482, 583, 681, 680, 676, 531, 27, -- /* 130 */ 787, 562, 521, 420, 420, 420, 420, 420, 773, 741, -- /* 140 */ 674, 670, 1067, 1251, 1245, 1239, 1234, 591, 591, 1230, -- /* 150 */ 1228, 1226, 1221, 1219, 1213, 1207, 1206, 1202, 1201, 1200, -- /* 160 */ 1199, 1193, 1189, 1178, 1176, 1174, 1155, 1142, 1138, 1134, -- /* 170 */ 1116, 1112, 1077, 1074, 1069, 1067, 1009, 994, 982, 933, -- /* 180 */ 848, 757, 849, 775, 628, 611, 745, 710, 672, 469, -- /* 190 */ 488, 573, 1387, 1384, 1367, 1374, 1373, 1372, 1344, 1354, -- /* 200 */ 1360, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1330, 1326, -- /* 210 */ 1354, 1354, 1344, 1371, 1336, 1386, 1349, 1338, 1334, 1305, -- /* 220 */ 1331, 1299, 1359, 1346, 1361, 1353, 1358, 1352, 1341, 1345, -- /* 230 */ 1316, 1293, 1296, 1286, 1351, 1325, 1324, 1363, 1275, 1356, -- /* 240 */ 1355, 1270, 1267, 1350, 1282, 1319, 1306, 1312, 1311, 1310, -- /* 250 */ 1309, 1343, 1339, 1298, 1274, 1301, 1297, 1288, 1329, 1328, -- /* 260 */ 1248, 1246, 1323, 1322, 1318, 1321, 1317, 1315, 1313, 1276, -- /* 270 */ 1291, 1289, 1287, 1278, 1235, 1224, 1271, 1273, 1264, 1265, -- /* 280 */ 1247, 1252, 1240, 1218, 1229, 1217, 1216, 1214, 1212, 1262, -- /* 290 */ 1261, 1182, 1205, 1203, 1186, 1185, 1175, 1167, 1169, 1159, -- /* 300 */ 1165, 1132, 1152, 1145, 1144, 1105, 1030, 1008, 999, 1073, -- /* 310 */ 1072, 1080, -+ /* 0 */ 238, 954, 213, 289, 310, 234, 144, 317, -109, 382, -+ /* 10 */ 377, 303, 461, 389, 378, 368, 302, 294, 253, 395, -+ /* 20 */ 293, 324, 403, 403, 403, 403, 403, 403, 403, 403, -+ /* 30 */ 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, -+ /* 40 */ 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, -+ /* 50 */ 403, 1022, 1012, 1005, 998, 963, 961, 959, 957, 950, -+ /* 60 */ 947, 930, 912, 873, 861, 823, 810, 771, 759, 720, -+ /* 70 */ 708, 670, 657, 619, 614, 612, 610, 608, 606, 604, -+ /* 80 */ 598, 595, 593, 580, 542, 540, 537, 535, 533, 531, -+ /* 90 */ 529, 527, 503, 386, 403, 403, 403, 403, 403, 403, -+ /* 100 */ 403, 403, 403, 95, 447, 82, 334, 504, 467, 403, -+ /* 110 */ 477, 464, 403, 403, 403, 403, 860, 747, 744, 785, -+ /* 120 */ 638, 638, 926, 891, 900, 899, 887, 844, 840, 835, -+ /* 130 */ 848, 830, 843, 829, 792, 839, 826, 737, 838, 795, -+ /* 140 */ 789, 47, 734, 530, 696, 777, 711, 677, 733, 730, -+ /* 150 */ 729, 728, 727, 627, 448, 64, 187, 1305, 1302, 1252, -+ /* 160 */ 1290, 1273, 1323, 1322, 1321, 1319, 1318, 1316, 1315, 1314, -+ /* 170 */ 1313, 1312, 1311, 1310, 1308, 1307, 1304, 1303, 1301, 1298, -+ /* 180 */ 1294, 1292, 1289, 1266, 1264, 1259, 1288, 1287, 1238, 1285, -+ /* 190 */ 1281, 1280, 1279, 1278, 1251, 1277, 1276, 1275, 1273, 1268, -+ /* 200 */ 1267, 1265, 1263, 1261, 1257, 1248, 1237, 1247, 1246, 1243, -+ /* 210 */ 1238, 1240, 1235, 1249, 1234, 1233, 1230, 1220, 1214, 1210, -+ /* 220 */ 1225, 1219, 1232, 1231, 1197, 1195, 1227, 1224, 1201, 1208, -+ /* 230 */ 1242, 1137, 1236, 1229, 1193, 1181, 1221, 1177, 1196, 1179, -+ /* 240 */ 1191, 1190, 1186, 1182, 1218, 1216, 1176, 1162, 1183, 1180, -+ /* 250 */ 1160, 1199, 1203, 1133, 1095, 1198, 1194, 1188, 1192, 1171, -+ /* 260 */ 1169, 1168, 1173, 1174, 1166, 1159, 1141, 1170, 1158, 1167, -+ /* 270 */ 1157, 1132, 1145, 1143, 1124, 1128, 1103, 1102, 1100, 1096, -+ /* 280 */ 1150, 1149, 1085, 1125, 1080, 1064, 1120, 1097, 1082, 1078, -+ /* 290 */ 1073, 1067, 1109, 1107, 1119, 1117, 1116, 1113, 1111, 1108, -+ /* 300 */ 1007, 1000, 1002, 1076, 1075, 1081, - }; - static const YYACTIONTYPE yy_default[] = { -- /* 0 */ 636, 872, 960, 960, 872, 872, 960, 960, 960, 762, -- /* 10 */ 960, 960, 960, 870, 960, 960, 790, 790, 934, 960, -- /* 20 */ 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, -- /* 30 */ 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, -- /* 40 */ 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, -- /* 50 */ 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, -- /* 60 */ 960, 960, 960, 960, 960, 960, 960, 677, 766, 796, -- /* 70 */ 960, 960, 960, 960, 960, 960, 960, 960, 933, 935, -- /* 80 */ 804, 803, 913, 777, 801, 794, 798, 873, 866, 867, -- /* 90 */ 865, 869, 874, 960, 797, 833, 850, 832, 844, 849, -- /* 100 */ 856, 848, 845, 835, 834, 836, 837, 960, 960, 960, -- /* 110 */ 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, -- /* 120 */ 960, 960, 960, 662, 731, 960, 960, 960, 960, 960, -- /* 130 */ 960, 960, 960, 838, 839, 853, 852, 851, 960, 669, -- /* 140 */ 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, -- /* 150 */ 940, 938, 960, 885, 960, 960, 960, 960, 960, 960, -- /* 160 */ 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, -- /* 170 */ 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, -- /* 180 */ 960, 642, 762, 762, 762, 636, 960, 960, 960, 952, -- /* 190 */ 766, 756, 960, 960, 960, 960, 960, 960, 960, 960, -- /* 200 */ 960, 960, 960, 960, 806, 745, 923, 925, 960, 906, -- /* 210 */ 743, 664, 764, 679, 754, 644, 800, 779, 779, 918, -- /* 220 */ 800, 918, 702, 725, 960, 790, 960, 790, 699, 790, -- /* 230 */ 779, 868, 960, 960, 960, 763, 754, 960, 945, 770, -- /* 240 */ 770, 937, 937, 770, 812, 735, 800, 742, 742, 742, -- /* 250 */ 742, 770, 659, 800, 812, 735, 735, 800, 770, 659, -- /* 260 */ 912, 910, 770, 770, 659, 770, 659, 770, 659, 878, -- /* 270 */ 733, 733, 733, 717, 882, 882, 878, 733, 702, 733, -- /* 280 */ 717, 733, 733, 783, 778, 783, 778, 783, 778, 770, -- /* 290 */ 770, 960, 795, 784, 793, 791, 800, 960, 665, 720, -- /* 300 */ 652, 652, 641, 641, 641, 641, 957, 957, 952, 704, -- /* 310 */ 704, 687, 960, 960, 960, 960, 960, 960, 960, 887, -- /* 320 */ 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, -- /* 330 */ 960, 960, 637, 947, 960, 960, 944, 960, 960, 960, -- /* 340 */ 960, 805, 960, 960, 960, 960, 960, 960, 960, 960, -- /* 350 */ 960, 960, 922, 960, 960, 960, 960, 960, 960, 960, -- /* 360 */ 916, 960, 960, 960, 960, 960, 960, 909, 908, 960, -- /* 370 */ 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, -- /* 380 */ 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, -- /* 390 */ 960, 960, 960, 960, 960, 792, 960, 785, 960, 871, -- /* 400 */ 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, -- /* 410 */ 748, 821, 960, 820, 824, 819, 671, 960, 650, 960, -- /* 420 */ 633, 638, 956, 959, 958, 955, 954, 953, 948, 946, -- /* 430 */ 943, 942, 941, 939, 936, 932, 891, 889, 896, 895, -- /* 440 */ 894, 893, 892, 890, 888, 886, 807, 802, 799, 931, -- /* 450 */ 884, 744, 741, 740, 658, 949, 915, 924, 811, 810, -- /* 460 */ 813, 921, 920, 919, 917, 914, 901, 809, 808, 736, -- /* 470 */ 876, 875, 661, 905, 904, 903, 907, 911, 902, 772, -- /* 480 */ 660, 657, 668, 723, 724, 732, 730, 729, 728, 727, -- /* 490 */ 726, 722, 670, 678, 716, 701, 700, 881, 883, 880, -- /* 500 */ 879, 709, 708, 714, 713, 712, 711, 710, 707, 706, -- /* 510 */ 705, 698, 697, 703, 696, 719, 718, 715, 695, 739, -- /* 520 */ 738, 737, 734, 694, 693, 692, 824, 691, 690, 830, -- /* 530 */ 829, 817, 860, 759, 758, 757, 769, 768, 781, 780, -- /* 540 */ 815, 814, 782, 767, 761, 760, 776, 775, 774, 773, -- /* 550 */ 765, 755, 787, 789, 788, 786, 862, 771, 859, 930, -- /* 560 */ 929, 928, 927, 926, 864, 863, 831, 828, 682, 683, -- /* 570 */ 899, 898, 900, 897, 685, 684, 681, 680, 861, 750, -- /* 580 */ 749, 857, 854, 846, 842, 858, 855, 847, 843, 841, -- /* 590 */ 840, 826, 825, 823, 822, 818, 827, 673, 751, 747, -- /* 600 */ 746, 816, 753, 752, 689, 688, 686, 667, 666, 663, -- /* 610 */ 656, 654, 653, 655, 651, 649, 648, 647, 646, 645, -- /* 620 */ 676, 675, 674, 672, 671, 643, 640, 639, 635, 634, -- /* 630 */ 632, -+ /* 0 */ 647, 964, 964, 964, 878, 878, 969, 964, 774, 802, -+ /* 10 */ 802, 938, 969, 969, 969, 876, 969, 969, 969, 964, -+ /* 20 */ 969, 778, 808, 969, 969, 969, 969, 969, 969, 969, -+ /* 30 */ 969, 937, 939, 816, 815, 918, 789, 813, 806, 810, -+ /* 40 */ 879, 872, 873, 871, 875, 880, 969, 809, 841, 856, -+ /* 50 */ 840, 969, 969, 969, 969, 969, 969, 969, 969, 969, -+ /* 60 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, -+ /* 70 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, -+ /* 80 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, -+ /* 90 */ 969, 969, 969, 969, 850, 855, 862, 854, 851, 843, -+ /* 100 */ 842, 844, 845, 969, 969, 673, 739, 969, 969, 846, -+ /* 110 */ 969, 685, 847, 859, 858, 857, 680, 969, 969, 969, -+ /* 120 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, -+ /* 130 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, -+ /* 140 */ 969, 969, 969, 969, 647, 964, 969, 969, 964, 964, -+ /* 150 */ 964, 964, 964, 964, 956, 778, 768, 969, 969, 969, -+ /* 160 */ 969, 969, 969, 969, 969, 969, 969, 944, 942, 969, -+ /* 170 */ 891, 969, 969, 969, 969, 969, 969, 969, 969, 969, -+ /* 180 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, -+ /* 190 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, -+ /* 200 */ 969, 969, 969, 969, 653, 969, 911, 774, 774, 774, -+ /* 210 */ 776, 754, 766, 655, 812, 791, 791, 923, 812, 923, -+ /* 220 */ 710, 733, 707, 802, 791, 874, 802, 802, 775, 766, -+ /* 230 */ 969, 949, 782, 782, 941, 941, 782, 821, 743, 812, -+ /* 240 */ 750, 750, 750, 750, 782, 670, 812, 821, 743, 743, -+ /* 250 */ 812, 782, 670, 917, 915, 782, 782, 670, 782, 670, -+ /* 260 */ 782, 670, 884, 741, 741, 741, 725, 884, 741, 710, -+ /* 270 */ 741, 725, 741, 741, 795, 790, 795, 790, 795, 790, -+ /* 280 */ 782, 782, 969, 884, 888, 888, 884, 807, 796, 805, -+ /* 290 */ 803, 812, 676, 728, 663, 663, 652, 652, 652, 652, -+ /* 300 */ 961, 961, 956, 712, 712, 695, 969, 969, 969, 969, -+ /* 310 */ 969, 969, 687, 969, 893, 969, 969, 969, 969, 969, -+ /* 320 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, -+ /* 330 */ 969, 828, 969, 648, 951, 969, 969, 948, 969, 969, -+ /* 340 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, -+ /* 350 */ 969, 969, 969, 969, 969, 969, 921, 969, 969, 969, -+ /* 360 */ 969, 969, 969, 914, 913, 969, 969, 969, 969, 969, -+ /* 370 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, -+ /* 380 */ 969, 969, 969, 969, 969, 969, 969, 757, 969, 969, -+ /* 390 */ 969, 761, 969, 969, 969, 969, 969, 969, 804, 969, -+ /* 400 */ 797, 969, 877, 969, 969, 969, 969, 969, 969, 969, -+ /* 410 */ 969, 969, 969, 966, 969, 969, 969, 965, 969, 969, -+ /* 420 */ 969, 969, 969, 830, 969, 829, 833, 969, 661, 969, -+ /* 430 */ 644, 649, 960, 963, 962, 959, 958, 957, 952, 950, -+ /* 440 */ 947, 946, 945, 943, 940, 936, 897, 895, 902, 901, -+ /* 450 */ 900, 899, 898, 896, 894, 892, 818, 817, 814, 811, -+ /* 460 */ 753, 935, 890, 752, 749, 748, 669, 953, 920, 929, -+ /* 470 */ 928, 927, 822, 926, 925, 924, 922, 919, 906, 820, -+ /* 480 */ 819, 744, 882, 881, 672, 910, 909, 908, 912, 916, -+ /* 490 */ 907, 784, 751, 671, 668, 675, 679, 731, 732, 740, -+ /* 500 */ 738, 737, 736, 735, 734, 730, 681, 686, 724, 709, -+ /* 510 */ 708, 717, 716, 722, 721, 720, 719, 718, 715, 714, -+ /* 520 */ 713, 706, 705, 711, 704, 727, 726, 723, 703, 747, -+ /* 530 */ 746, 745, 742, 702, 701, 700, 833, 699, 698, 838, -+ /* 540 */ 837, 866, 826, 755, 759, 758, 762, 763, 771, 770, -+ /* 550 */ 769, 780, 781, 793, 792, 824, 823, 794, 779, 773, -+ /* 560 */ 772, 788, 787, 786, 785, 777, 767, 799, 798, 868, -+ /* 570 */ 783, 867, 865, 934, 933, 932, 931, 930, 870, 967, -+ /* 580 */ 968, 887, 889, 886, 801, 800, 885, 869, 839, 836, -+ /* 590 */ 690, 691, 905, 904, 903, 693, 692, 689, 688, 863, -+ /* 600 */ 860, 852, 864, 861, 853, 849, 848, 834, 832, 831, -+ /* 610 */ 827, 835, 760, 756, 825, 765, 764, 697, 696, 694, -+ /* 620 */ 678, 677, 674, 667, 665, 664, 666, 662, 660, 659, -+ /* 630 */ 658, 657, 656, 684, 683, 682, 654, 651, 650, 646, -+ /* 640 */ 645, 643, - }; - - /* The next table maps tokens into fallback tokens. If a construct -@@ -115155,6 +116123,7 @@ static const YYCODETYPE yyFallback[] = { - 27, /* OFFSET => ID */ - 27, /* PRAGMA => ID */ - 27, /* RAISE => ID */ -+ 27, /* RECURSIVE => ID */ - 27, /* REPLACE => ID */ - 27, /* RESTRICT => ID */ - 27, /* ROW => ID */ -@@ -115162,6 +116131,7 @@ static const YYCODETYPE yyFallback[] = { - 27, /* VACUUM => ID */ - 27, /* VIEW => ID */ - 27, /* VIRTUAL => ID */ -+ 27, /* WITH => ID */ - 27, /* REINDEX => ID */ - 27, /* RENAME => ID */ - 27, /* CTIME_KW => ID */ -@@ -115257,55 +116227,56 @@ static const char *const yyTokenName[] = - "EACH", "FAIL", "FOR", "IGNORE", - "INITIALLY", "INSTEAD", "LIKE_KW", "MATCH", - "NO", "KEY", "OF", "OFFSET", -- "PRAGMA", "RAISE", "REPLACE", "RESTRICT", -- "ROW", "TRIGGER", "VACUUM", "VIEW", -- "VIRTUAL", "REINDEX", "RENAME", "CTIME_KW", -- "ANY", "OR", "AND", "IS", -- "BETWEEN", "IN", "ISNULL", "NOTNULL", -- "NE", "EQ", "GT", "LE", -- "LT", "GE", "ESCAPE", "BITAND", -- "BITOR", "LSHIFT", "RSHIFT", "PLUS", -- "MINUS", "STAR", "SLASH", "REM", -- "CONCAT", "COLLATE", "BITNOT", "STRING", -- "JOIN_KW", "CONSTRAINT", "DEFAULT", "NULL", -- "PRIMARY", "UNIQUE", "CHECK", "REFERENCES", -- "AUTOINCR", "ON", "INSERT", "DELETE", -- "UPDATE", "SET", "DEFERRABLE", "FOREIGN", -- "DROP", "UNION", "ALL", "EXCEPT", -- "INTERSECT", "SELECT", "DISTINCT", "DOT", -- "FROM", "JOIN", "USING", "ORDER", -- "GROUP", "HAVING", "LIMIT", "WHERE", -- "INTO", "VALUES", "INTEGER", "FLOAT", -- "BLOB", "REGISTER", "VARIABLE", "CASE", -- "WHEN", "THEN", "ELSE", "INDEX", -- "ALTER", "ADD", "error", "input", -- "cmdlist", "ecmd", "explain", "cmdx", -- "cmd", "transtype", "trans_opt", "nm", -- "savepoint_opt", "create_table", "create_table_args", "createkw", -- "temp", "ifnotexists", "dbnm", "columnlist", -- "conslist_opt", "table_options", "select", "column", -- "columnid", "type", "carglist", "id", -- "ids", "typetoken", "typename", "signed", -- "plus_num", "minus_num", "ccons", "term", -- "expr", "onconf", "sortorder", "autoinc", -- "idxlist_opt", "refargs", "defer_subclause", "refarg", -- "refact", "init_deferred_pred_opt", "conslist", "tconscomma", -- "tcons", "idxlist", "defer_subclause_opt", "orconf", -- "resolvetype", "raisetype", "ifexists", "fullname", -- "oneselect", "multiselect_op", "distinct", "selcollist", -- "from", "where_opt", "groupby_opt", "having_opt", -- "orderby_opt", "limit_opt", "sclp", "as", -+ "PRAGMA", "RAISE", "RECURSIVE", "REPLACE", -+ "RESTRICT", "ROW", "TRIGGER", "VACUUM", -+ "VIEW", "VIRTUAL", "WITH", "REINDEX", -+ "RENAME", "CTIME_KW", "ANY", "OR", -+ "AND", "IS", "BETWEEN", "IN", -+ "ISNULL", "NOTNULL", "NE", "EQ", -+ "GT", "LE", "LT", "GE", -+ "ESCAPE", "BITAND", "BITOR", "LSHIFT", -+ "RSHIFT", "PLUS", "MINUS", "STAR", -+ "SLASH", "REM", "CONCAT", "COLLATE", -+ "BITNOT", "STRING", "JOIN_KW", "CONSTRAINT", -+ "DEFAULT", "NULL", "PRIMARY", "UNIQUE", -+ "CHECK", "REFERENCES", "AUTOINCR", "ON", -+ "INSERT", "DELETE", "UPDATE", "SET", -+ "DEFERRABLE", "FOREIGN", "DROP", "UNION", -+ "ALL", "EXCEPT", "INTERSECT", "SELECT", -+ "VALUES", "DISTINCT", "DOT", "FROM", -+ "JOIN", "USING", "ORDER", "GROUP", -+ "HAVING", "LIMIT", "WHERE", "INTO", -+ "INTEGER", "FLOAT", "BLOB", "VARIABLE", -+ "CASE", "WHEN", "THEN", "ELSE", -+ "INDEX", "ALTER", "ADD", "error", -+ "input", "cmdlist", "ecmd", "explain", -+ "cmdx", "cmd", "transtype", "trans_opt", -+ "nm", "savepoint_opt", "create_table", "create_table_args", -+ "createkw", "temp", "ifnotexists", "dbnm", -+ "columnlist", "conslist_opt", "table_options", "select", -+ "column", "columnid", "type", "carglist", -+ "typetoken", "typename", "signed", "plus_num", -+ "minus_num", "ccons", "term", "expr", -+ "onconf", "sortorder", "autoinc", "idxlist_opt", -+ "refargs", "defer_subclause", "refarg", "refact", -+ "init_deferred_pred_opt", "conslist", "tconscomma", "tcons", -+ "idxlist", "defer_subclause_opt", "orconf", "resolvetype", -+ "raisetype", "ifexists", "fullname", "selectnowith", -+ "oneselect", "with", "multiselect_op", "distinct", -+ "selcollist", "from", "where_opt", "groupby_opt", -+ "having_opt", "orderby_opt", "limit_opt", "values", -+ "nexprlist", "exprlist", "sclp", "as", - "seltablist", "stl_prefix", "joinop", "indexed_opt", - "on_opt", "using_opt", "joinop2", "idlist", -- "sortlist", "nexprlist", "setlist", "insert_cmd", -- "inscollist_opt", "valuelist", "exprlist", "likeop", -- "between_op", "in_op", "case_operand", "case_exprlist", -- "case_else", "uniqueflag", "collate", "nmnum", -- "number", "trigger_decl", "trigger_cmd_list", "trigger_time", -+ "sortlist", "setlist", "insert_cmd", "inscollist_opt", -+ "likeop", "between_op", "in_op", "case_operand", -+ "case_exprlist", "case_else", "uniqueflag", "collate", -+ "nmnum", "trigger_decl", "trigger_cmd_list", "trigger_time", - "trigger_event", "foreach_clause", "when_clause", "trigger_cmd", - "trnm", "tridxby", "database_kw_opt", "key_opt", - "add_column_fullname", "kwcolumn_opt", "create_vtab", "vtabarglist", - "vtabarg", "vtabargtoken", "lp", "anylist", -+ "wqlist", - }; - #endif /* NDEBUG */ - -@@ -115353,295 +116324,293 @@ static const char *const yyRuleName[] = - /* 37 */ "columnlist ::= column", - /* 38 */ "column ::= columnid type carglist", - /* 39 */ "columnid ::= nm", -- /* 40 */ "id ::= ID", -- /* 41 */ "id ::= INDEXED", -- /* 42 */ "ids ::= ID|STRING", -- /* 43 */ "nm ::= id", -- /* 44 */ "nm ::= STRING", -- /* 45 */ "nm ::= JOIN_KW", -- /* 46 */ "type ::=", -- /* 47 */ "type ::= typetoken", -- /* 48 */ "typetoken ::= typename", -- /* 49 */ "typetoken ::= typename LP signed RP", -- /* 50 */ "typetoken ::= typename LP signed COMMA signed RP", -- /* 51 */ "typename ::= ids", -- /* 52 */ "typename ::= typename ids", -- /* 53 */ "signed ::= plus_num", -- /* 54 */ "signed ::= minus_num", -- /* 55 */ "carglist ::= carglist ccons", -- /* 56 */ "carglist ::=", -- /* 57 */ "ccons ::= CONSTRAINT nm", -- /* 58 */ "ccons ::= DEFAULT term", -- /* 59 */ "ccons ::= DEFAULT LP expr RP", -- /* 60 */ "ccons ::= DEFAULT PLUS term", -- /* 61 */ "ccons ::= DEFAULT MINUS term", -- /* 62 */ "ccons ::= DEFAULT id", -- /* 63 */ "ccons ::= NULL onconf", -- /* 64 */ "ccons ::= NOT NULL onconf", -- /* 65 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc", -- /* 66 */ "ccons ::= UNIQUE onconf", -- /* 67 */ "ccons ::= CHECK LP expr RP", -- /* 68 */ "ccons ::= REFERENCES nm idxlist_opt refargs", -- /* 69 */ "ccons ::= defer_subclause", -- /* 70 */ "ccons ::= COLLATE ids", -- /* 71 */ "autoinc ::=", -- /* 72 */ "autoinc ::= AUTOINCR", -- /* 73 */ "refargs ::=", -- /* 74 */ "refargs ::= refargs refarg", -- /* 75 */ "refarg ::= MATCH nm", -- /* 76 */ "refarg ::= ON INSERT refact", -- /* 77 */ "refarg ::= ON DELETE refact", -- /* 78 */ "refarg ::= ON UPDATE refact", -- /* 79 */ "refact ::= SET NULL", -- /* 80 */ "refact ::= SET DEFAULT", -- /* 81 */ "refact ::= CASCADE", -- /* 82 */ "refact ::= RESTRICT", -- /* 83 */ "refact ::= NO ACTION", -- /* 84 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt", -- /* 85 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt", -- /* 86 */ "init_deferred_pred_opt ::=", -- /* 87 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED", -- /* 88 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE", -- /* 89 */ "conslist_opt ::=", -- /* 90 */ "conslist_opt ::= COMMA conslist", -- /* 91 */ "conslist ::= conslist tconscomma tcons", -- /* 92 */ "conslist ::= tcons", -- /* 93 */ "tconscomma ::= COMMA", -- /* 94 */ "tconscomma ::=", -- /* 95 */ "tcons ::= CONSTRAINT nm", -- /* 96 */ "tcons ::= PRIMARY KEY LP idxlist autoinc RP onconf", -- /* 97 */ "tcons ::= UNIQUE LP idxlist RP onconf", -- /* 98 */ "tcons ::= CHECK LP expr RP onconf", -- /* 99 */ "tcons ::= FOREIGN KEY LP idxlist RP REFERENCES nm idxlist_opt refargs defer_subclause_opt", -- /* 100 */ "defer_subclause_opt ::=", -- /* 101 */ "defer_subclause_opt ::= defer_subclause", -- /* 102 */ "onconf ::=", -- /* 103 */ "onconf ::= ON CONFLICT resolvetype", -- /* 104 */ "orconf ::=", -- /* 105 */ "orconf ::= OR resolvetype", -- /* 106 */ "resolvetype ::= raisetype", -- /* 107 */ "resolvetype ::= IGNORE", -- /* 108 */ "resolvetype ::= REPLACE", -- /* 109 */ "cmd ::= DROP TABLE ifexists fullname", -- /* 110 */ "ifexists ::= IF EXISTS", -- /* 111 */ "ifexists ::=", -- /* 112 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm AS select", -- /* 113 */ "cmd ::= DROP VIEW ifexists fullname", -- /* 114 */ "cmd ::= select", -- /* 115 */ "select ::= oneselect", -- /* 116 */ "select ::= select multiselect_op oneselect", -- /* 117 */ "multiselect_op ::= UNION", -- /* 118 */ "multiselect_op ::= UNION ALL", -- /* 119 */ "multiselect_op ::= EXCEPT|INTERSECT", -- /* 120 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt", -- /* 121 */ "distinct ::= DISTINCT", -- /* 122 */ "distinct ::= ALL", -- /* 123 */ "distinct ::=", -- /* 124 */ "sclp ::= selcollist COMMA", -- /* 125 */ "sclp ::=", -- /* 126 */ "selcollist ::= sclp expr as", -- /* 127 */ "selcollist ::= sclp STAR", -- /* 128 */ "selcollist ::= sclp nm DOT STAR", -- /* 129 */ "as ::= AS nm", -- /* 130 */ "as ::= ids", -- /* 131 */ "as ::=", -- /* 132 */ "from ::=", -- /* 133 */ "from ::= FROM seltablist", -- /* 134 */ "stl_prefix ::= seltablist joinop", -- /* 135 */ "stl_prefix ::=", -- /* 136 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt", -- /* 137 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt", -- /* 138 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt", -- /* 139 */ "dbnm ::=", -- /* 140 */ "dbnm ::= DOT nm", -- /* 141 */ "fullname ::= nm dbnm", -- /* 142 */ "joinop ::= COMMA|JOIN", -- /* 143 */ "joinop ::= JOIN_KW JOIN", -- /* 144 */ "joinop ::= JOIN_KW nm JOIN", -- /* 145 */ "joinop ::= JOIN_KW nm nm JOIN", -- /* 146 */ "on_opt ::= ON expr", -- /* 147 */ "on_opt ::=", -- /* 148 */ "indexed_opt ::=", -- /* 149 */ "indexed_opt ::= INDEXED BY nm", -- /* 150 */ "indexed_opt ::= NOT INDEXED", -- /* 151 */ "using_opt ::= USING LP idlist RP", -- /* 152 */ "using_opt ::=", -- /* 153 */ "orderby_opt ::=", -- /* 154 */ "orderby_opt ::= ORDER BY sortlist", -- /* 155 */ "sortlist ::= sortlist COMMA expr sortorder", -- /* 156 */ "sortlist ::= expr sortorder", -- /* 157 */ "sortorder ::= ASC", -- /* 158 */ "sortorder ::= DESC", -- /* 159 */ "sortorder ::=", -- /* 160 */ "groupby_opt ::=", -- /* 161 */ "groupby_opt ::= GROUP BY nexprlist", -- /* 162 */ "having_opt ::=", -- /* 163 */ "having_opt ::= HAVING expr", -- /* 164 */ "limit_opt ::=", -- /* 165 */ "limit_opt ::= LIMIT expr", -- /* 166 */ "limit_opt ::= LIMIT expr OFFSET expr", -- /* 167 */ "limit_opt ::= LIMIT expr COMMA expr", -- /* 168 */ "cmd ::= DELETE FROM fullname indexed_opt where_opt", -- /* 169 */ "where_opt ::=", -- /* 170 */ "where_opt ::= WHERE expr", -- /* 171 */ "cmd ::= UPDATE orconf fullname indexed_opt SET setlist where_opt", -- /* 172 */ "setlist ::= setlist COMMA nm EQ expr", -- /* 173 */ "setlist ::= nm EQ expr", -- /* 174 */ "cmd ::= insert_cmd INTO fullname inscollist_opt valuelist", -- /* 175 */ "cmd ::= insert_cmd INTO fullname inscollist_opt select", -- /* 176 */ "cmd ::= insert_cmd INTO fullname inscollist_opt DEFAULT VALUES", -+ /* 40 */ "nm ::= ID|INDEXED", -+ /* 41 */ "nm ::= STRING", -+ /* 42 */ "nm ::= JOIN_KW", -+ /* 43 */ "type ::=", -+ /* 44 */ "type ::= typetoken", -+ /* 45 */ "typetoken ::= typename", -+ /* 46 */ "typetoken ::= typename LP signed RP", -+ /* 47 */ "typetoken ::= typename LP signed COMMA signed RP", -+ /* 48 */ "typename ::= ID|STRING", -+ /* 49 */ "typename ::= typename ID|STRING", -+ /* 50 */ "signed ::= plus_num", -+ /* 51 */ "signed ::= minus_num", -+ /* 52 */ "carglist ::= carglist ccons", -+ /* 53 */ "carglist ::=", -+ /* 54 */ "ccons ::= CONSTRAINT nm", -+ /* 55 */ "ccons ::= DEFAULT term", -+ /* 56 */ "ccons ::= DEFAULT LP expr RP", -+ /* 57 */ "ccons ::= DEFAULT PLUS term", -+ /* 58 */ "ccons ::= DEFAULT MINUS term", -+ /* 59 */ "ccons ::= DEFAULT ID|INDEXED", -+ /* 60 */ "ccons ::= NULL onconf", -+ /* 61 */ "ccons ::= NOT NULL onconf", -+ /* 62 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc", -+ /* 63 */ "ccons ::= UNIQUE onconf", -+ /* 64 */ "ccons ::= CHECK LP expr RP", -+ /* 65 */ "ccons ::= REFERENCES nm idxlist_opt refargs", -+ /* 66 */ "ccons ::= defer_subclause", -+ /* 67 */ "ccons ::= COLLATE ID|STRING", -+ /* 68 */ "autoinc ::=", -+ /* 69 */ "autoinc ::= AUTOINCR", -+ /* 70 */ "refargs ::=", -+ /* 71 */ "refargs ::= refargs refarg", -+ /* 72 */ "refarg ::= MATCH nm", -+ /* 73 */ "refarg ::= ON INSERT refact", -+ /* 74 */ "refarg ::= ON DELETE refact", -+ /* 75 */ "refarg ::= ON UPDATE refact", -+ /* 76 */ "refact ::= SET NULL", -+ /* 77 */ "refact ::= SET DEFAULT", -+ /* 78 */ "refact ::= CASCADE", -+ /* 79 */ "refact ::= RESTRICT", -+ /* 80 */ "refact ::= NO ACTION", -+ /* 81 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt", -+ /* 82 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt", -+ /* 83 */ "init_deferred_pred_opt ::=", -+ /* 84 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED", -+ /* 85 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE", -+ /* 86 */ "conslist_opt ::=", -+ /* 87 */ "conslist_opt ::= COMMA conslist", -+ /* 88 */ "conslist ::= conslist tconscomma tcons", -+ /* 89 */ "conslist ::= tcons", -+ /* 90 */ "tconscomma ::= COMMA", -+ /* 91 */ "tconscomma ::=", -+ /* 92 */ "tcons ::= CONSTRAINT nm", -+ /* 93 */ "tcons ::= PRIMARY KEY LP idxlist autoinc RP onconf", -+ /* 94 */ "tcons ::= UNIQUE LP idxlist RP onconf", -+ /* 95 */ "tcons ::= CHECK LP expr RP onconf", -+ /* 96 */ "tcons ::= FOREIGN KEY LP idxlist RP REFERENCES nm idxlist_opt refargs defer_subclause_opt", -+ /* 97 */ "defer_subclause_opt ::=", -+ /* 98 */ "defer_subclause_opt ::= defer_subclause", -+ /* 99 */ "onconf ::=", -+ /* 100 */ "onconf ::= ON CONFLICT resolvetype", -+ /* 101 */ "orconf ::=", -+ /* 102 */ "orconf ::= OR resolvetype", -+ /* 103 */ "resolvetype ::= raisetype", -+ /* 104 */ "resolvetype ::= IGNORE", -+ /* 105 */ "resolvetype ::= REPLACE", -+ /* 106 */ "cmd ::= DROP TABLE ifexists fullname", -+ /* 107 */ "ifexists ::= IF EXISTS", -+ /* 108 */ "ifexists ::=", -+ /* 109 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm AS select", -+ /* 110 */ "cmd ::= DROP VIEW ifexists fullname", -+ /* 111 */ "cmd ::= select", -+ /* 112 */ "select ::= with selectnowith", -+ /* 113 */ "selectnowith ::= oneselect", -+ /* 114 */ "selectnowith ::= selectnowith multiselect_op oneselect", -+ /* 115 */ "multiselect_op ::= UNION", -+ /* 116 */ "multiselect_op ::= UNION ALL", -+ /* 117 */ "multiselect_op ::= EXCEPT|INTERSECT", -+ /* 118 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt", -+ /* 119 */ "oneselect ::= values", -+ /* 120 */ "values ::= VALUES LP nexprlist RP", -+ /* 121 */ "values ::= values COMMA LP exprlist RP", -+ /* 122 */ "distinct ::= DISTINCT", -+ /* 123 */ "distinct ::= ALL", -+ /* 124 */ "distinct ::=", -+ /* 125 */ "sclp ::= selcollist COMMA", -+ /* 126 */ "sclp ::=", -+ /* 127 */ "selcollist ::= sclp expr as", -+ /* 128 */ "selcollist ::= sclp STAR", -+ /* 129 */ "selcollist ::= sclp nm DOT STAR", -+ /* 130 */ "as ::= AS nm", -+ /* 131 */ "as ::= ID|STRING", -+ /* 132 */ "as ::=", -+ /* 133 */ "from ::=", -+ /* 134 */ "from ::= FROM seltablist", -+ /* 135 */ "stl_prefix ::= seltablist joinop", -+ /* 136 */ "stl_prefix ::=", -+ /* 137 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt", -+ /* 138 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt", -+ /* 139 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt", -+ /* 140 */ "dbnm ::=", -+ /* 141 */ "dbnm ::= DOT nm", -+ /* 142 */ "fullname ::= nm dbnm", -+ /* 143 */ "joinop ::= COMMA|JOIN", -+ /* 144 */ "joinop ::= JOIN_KW JOIN", -+ /* 145 */ "joinop ::= JOIN_KW nm JOIN", -+ /* 146 */ "joinop ::= JOIN_KW nm nm JOIN", -+ /* 147 */ "on_opt ::= ON expr", -+ /* 148 */ "on_opt ::=", -+ /* 149 */ "indexed_opt ::=", -+ /* 150 */ "indexed_opt ::= INDEXED BY nm", -+ /* 151 */ "indexed_opt ::= NOT INDEXED", -+ /* 152 */ "using_opt ::= USING LP idlist RP", -+ /* 153 */ "using_opt ::=", -+ /* 154 */ "orderby_opt ::=", -+ /* 155 */ "orderby_opt ::= ORDER BY sortlist", -+ /* 156 */ "sortlist ::= sortlist COMMA expr sortorder", -+ /* 157 */ "sortlist ::= expr sortorder", -+ /* 158 */ "sortorder ::= ASC", -+ /* 159 */ "sortorder ::= DESC", -+ /* 160 */ "sortorder ::=", -+ /* 161 */ "groupby_opt ::=", -+ /* 162 */ "groupby_opt ::= GROUP BY nexprlist", -+ /* 163 */ "having_opt ::=", -+ /* 164 */ "having_opt ::= HAVING expr", -+ /* 165 */ "limit_opt ::=", -+ /* 166 */ "limit_opt ::= LIMIT expr", -+ /* 167 */ "limit_opt ::= LIMIT expr OFFSET expr", -+ /* 168 */ "limit_opt ::= LIMIT expr COMMA expr", -+ /* 169 */ "cmd ::= with DELETE FROM fullname indexed_opt where_opt", -+ /* 170 */ "where_opt ::=", -+ /* 171 */ "where_opt ::= WHERE expr", -+ /* 172 */ "cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt", -+ /* 173 */ "setlist ::= setlist COMMA nm EQ expr", -+ /* 174 */ "setlist ::= nm EQ expr", -+ /* 175 */ "cmd ::= with insert_cmd INTO fullname inscollist_opt select", -+ /* 176 */ "cmd ::= with insert_cmd INTO fullname inscollist_opt DEFAULT VALUES", - /* 177 */ "insert_cmd ::= INSERT orconf", - /* 178 */ "insert_cmd ::= REPLACE", -- /* 179 */ "valuelist ::= VALUES LP nexprlist RP", -- /* 180 */ "valuelist ::= valuelist COMMA LP exprlist RP", -- /* 181 */ "inscollist_opt ::=", -- /* 182 */ "inscollist_opt ::= LP idlist RP", -- /* 183 */ "idlist ::= idlist COMMA nm", -- /* 184 */ "idlist ::= nm", -- /* 185 */ "expr ::= term", -- /* 186 */ "expr ::= LP expr RP", -- /* 187 */ "term ::= NULL", -- /* 188 */ "expr ::= id", -- /* 189 */ "expr ::= JOIN_KW", -- /* 190 */ "expr ::= nm DOT nm", -- /* 191 */ "expr ::= nm DOT nm DOT nm", -- /* 192 */ "term ::= INTEGER|FLOAT|BLOB", -- /* 193 */ "term ::= STRING", -- /* 194 */ "expr ::= REGISTER", -- /* 195 */ "expr ::= VARIABLE", -- /* 196 */ "expr ::= expr COLLATE ids", -- /* 197 */ "expr ::= CAST LP expr AS typetoken RP", -- /* 198 */ "expr ::= ID LP distinct exprlist RP", -- /* 199 */ "expr ::= ID LP STAR RP", -- /* 200 */ "term ::= CTIME_KW", -- /* 201 */ "expr ::= expr AND expr", -- /* 202 */ "expr ::= expr OR expr", -- /* 203 */ "expr ::= expr LT|GT|GE|LE expr", -- /* 204 */ "expr ::= expr EQ|NE expr", -- /* 205 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr", -- /* 206 */ "expr ::= expr PLUS|MINUS expr", -- /* 207 */ "expr ::= expr STAR|SLASH|REM expr", -- /* 208 */ "expr ::= expr CONCAT expr", -- /* 209 */ "likeop ::= LIKE_KW", -- /* 210 */ "likeop ::= NOT LIKE_KW", -- /* 211 */ "likeop ::= MATCH", -- /* 212 */ "likeop ::= NOT MATCH", -- /* 213 */ "expr ::= expr likeop expr", -- /* 214 */ "expr ::= expr likeop expr ESCAPE expr", -- /* 215 */ "expr ::= expr ISNULL|NOTNULL", -- /* 216 */ "expr ::= expr NOT NULL", -- /* 217 */ "expr ::= expr IS expr", -- /* 218 */ "expr ::= expr IS NOT expr", -- /* 219 */ "expr ::= NOT expr", -- /* 220 */ "expr ::= BITNOT expr", -- /* 221 */ "expr ::= MINUS expr", -- /* 222 */ "expr ::= PLUS expr", -- /* 223 */ "between_op ::= BETWEEN", -- /* 224 */ "between_op ::= NOT BETWEEN", -- /* 225 */ "expr ::= expr between_op expr AND expr", -- /* 226 */ "in_op ::= IN", -- /* 227 */ "in_op ::= NOT IN", -- /* 228 */ "expr ::= expr in_op LP exprlist RP", -- /* 229 */ "expr ::= LP select RP", -- /* 230 */ "expr ::= expr in_op LP select RP", -- /* 231 */ "expr ::= expr in_op nm dbnm", -- /* 232 */ "expr ::= EXISTS LP select RP", -- /* 233 */ "expr ::= CASE case_operand case_exprlist case_else END", -- /* 234 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", -- /* 235 */ "case_exprlist ::= WHEN expr THEN expr", -- /* 236 */ "case_else ::= ELSE expr", -- /* 237 */ "case_else ::=", -- /* 238 */ "case_operand ::= expr", -- /* 239 */ "case_operand ::=", -- /* 240 */ "exprlist ::= nexprlist", -- /* 241 */ "exprlist ::=", -- /* 242 */ "nexprlist ::= nexprlist COMMA expr", -- /* 243 */ "nexprlist ::= expr", -- /* 244 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP where_opt", -- /* 245 */ "uniqueflag ::= UNIQUE", -- /* 246 */ "uniqueflag ::=", -- /* 247 */ "idxlist_opt ::=", -- /* 248 */ "idxlist_opt ::= LP idxlist RP", -- /* 249 */ "idxlist ::= idxlist COMMA nm collate sortorder", -- /* 250 */ "idxlist ::= nm collate sortorder", -- /* 251 */ "collate ::=", -- /* 252 */ "collate ::= COLLATE ids", -- /* 253 */ "cmd ::= DROP INDEX ifexists fullname", -- /* 254 */ "cmd ::= VACUUM", -- /* 255 */ "cmd ::= VACUUM nm", -- /* 256 */ "cmd ::= PRAGMA nm dbnm", -- /* 257 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", -- /* 258 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", -- /* 259 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", -- /* 260 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", -- /* 261 */ "nmnum ::= plus_num", -- /* 262 */ "nmnum ::= nm", -- /* 263 */ "nmnum ::= ON", -- /* 264 */ "nmnum ::= DELETE", -- /* 265 */ "nmnum ::= DEFAULT", -- /* 266 */ "plus_num ::= PLUS number", -- /* 267 */ "plus_num ::= number", -- /* 268 */ "minus_num ::= MINUS number", -- /* 269 */ "number ::= INTEGER|FLOAT", -- /* 270 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", -- /* 271 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", -- /* 272 */ "trigger_time ::= BEFORE", -- /* 273 */ "trigger_time ::= AFTER", -- /* 274 */ "trigger_time ::= INSTEAD OF", -- /* 275 */ "trigger_time ::=", -- /* 276 */ "trigger_event ::= DELETE|INSERT", -- /* 277 */ "trigger_event ::= UPDATE", -- /* 278 */ "trigger_event ::= UPDATE OF idlist", -- /* 279 */ "foreach_clause ::=", -- /* 280 */ "foreach_clause ::= FOR EACH ROW", -- /* 281 */ "when_clause ::=", -- /* 282 */ "when_clause ::= WHEN expr", -- /* 283 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", -- /* 284 */ "trigger_cmd_list ::= trigger_cmd SEMI", -- /* 285 */ "trnm ::= nm", -- /* 286 */ "trnm ::= nm DOT nm", -- /* 287 */ "tridxby ::=", -- /* 288 */ "tridxby ::= INDEXED BY nm", -- /* 289 */ "tridxby ::= NOT INDEXED", -- /* 290 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt", -- /* 291 */ "trigger_cmd ::= insert_cmd INTO trnm inscollist_opt valuelist", -- /* 292 */ "trigger_cmd ::= insert_cmd INTO trnm inscollist_opt select", -- /* 293 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt", -- /* 294 */ "trigger_cmd ::= select", -- /* 295 */ "expr ::= RAISE LP IGNORE RP", -- /* 296 */ "expr ::= RAISE LP raisetype COMMA nm RP", -- /* 297 */ "raisetype ::= ROLLBACK", -- /* 298 */ "raisetype ::= ABORT", -- /* 299 */ "raisetype ::= FAIL", -- /* 300 */ "cmd ::= DROP TRIGGER ifexists fullname", -- /* 301 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", -- /* 302 */ "cmd ::= DETACH database_kw_opt expr", -- /* 303 */ "key_opt ::=", -- /* 304 */ "key_opt ::= KEY expr", -- /* 305 */ "database_kw_opt ::= DATABASE", -- /* 306 */ "database_kw_opt ::=", -- /* 307 */ "cmd ::= REINDEX", -- /* 308 */ "cmd ::= REINDEX nm dbnm", -- /* 309 */ "cmd ::= ANALYZE", -- /* 310 */ "cmd ::= ANALYZE nm dbnm", -- /* 311 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", -- /* 312 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column", -- /* 313 */ "add_column_fullname ::= fullname", -- /* 314 */ "kwcolumn_opt ::=", -- /* 315 */ "kwcolumn_opt ::= COLUMNKW", -- /* 316 */ "cmd ::= create_vtab", -- /* 317 */ "cmd ::= create_vtab LP vtabarglist RP", -- /* 318 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", -- /* 319 */ "vtabarglist ::= vtabarg", -- /* 320 */ "vtabarglist ::= vtabarglist COMMA vtabarg", -- /* 321 */ "vtabarg ::=", -- /* 322 */ "vtabarg ::= vtabarg vtabargtoken", -- /* 323 */ "vtabargtoken ::= ANY", -- /* 324 */ "vtabargtoken ::= lp anylist RP", -- /* 325 */ "lp ::= LP", -- /* 326 */ "anylist ::=", -- /* 327 */ "anylist ::= anylist LP anylist RP", -- /* 328 */ "anylist ::= anylist ANY", -+ /* 179 */ "inscollist_opt ::=", -+ /* 180 */ "inscollist_opt ::= LP idlist RP", -+ /* 181 */ "idlist ::= idlist COMMA nm", -+ /* 182 */ "idlist ::= nm", -+ /* 183 */ "expr ::= term", -+ /* 184 */ "expr ::= LP expr RP", -+ /* 185 */ "term ::= NULL", -+ /* 186 */ "expr ::= ID|INDEXED", -+ /* 187 */ "expr ::= JOIN_KW", -+ /* 188 */ "expr ::= nm DOT nm", -+ /* 189 */ "expr ::= nm DOT nm DOT nm", -+ /* 190 */ "term ::= INTEGER|FLOAT|BLOB", -+ /* 191 */ "term ::= STRING", -+ /* 192 */ "expr ::= VARIABLE", -+ /* 193 */ "expr ::= expr COLLATE ID|STRING", -+ /* 194 */ "expr ::= CAST LP expr AS typetoken RP", -+ /* 195 */ "expr ::= ID|INDEXED LP distinct exprlist RP", -+ /* 196 */ "expr ::= ID|INDEXED LP STAR RP", -+ /* 197 */ "term ::= CTIME_KW", -+ /* 198 */ "expr ::= expr AND expr", -+ /* 199 */ "expr ::= expr OR expr", -+ /* 200 */ "expr ::= expr LT|GT|GE|LE expr", -+ /* 201 */ "expr ::= expr EQ|NE expr", -+ /* 202 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr", -+ /* 203 */ "expr ::= expr PLUS|MINUS expr", -+ /* 204 */ "expr ::= expr STAR|SLASH|REM expr", -+ /* 205 */ "expr ::= expr CONCAT expr", -+ /* 206 */ "likeop ::= LIKE_KW|MATCH", -+ /* 207 */ "likeop ::= NOT LIKE_KW|MATCH", -+ /* 208 */ "expr ::= expr likeop expr", -+ /* 209 */ "expr ::= expr likeop expr ESCAPE expr", -+ /* 210 */ "expr ::= expr ISNULL|NOTNULL", -+ /* 211 */ "expr ::= expr NOT NULL", -+ /* 212 */ "expr ::= expr IS expr", -+ /* 213 */ "expr ::= expr IS NOT expr", -+ /* 214 */ "expr ::= NOT expr", -+ /* 215 */ "expr ::= BITNOT expr", -+ /* 216 */ "expr ::= MINUS expr", -+ /* 217 */ "expr ::= PLUS expr", -+ /* 218 */ "between_op ::= BETWEEN", -+ /* 219 */ "between_op ::= NOT BETWEEN", -+ /* 220 */ "expr ::= expr between_op expr AND expr", -+ /* 221 */ "in_op ::= IN", -+ /* 222 */ "in_op ::= NOT IN", -+ /* 223 */ "expr ::= expr in_op LP exprlist RP", -+ /* 224 */ "expr ::= LP select RP", -+ /* 225 */ "expr ::= expr in_op LP select RP", -+ /* 226 */ "expr ::= expr in_op nm dbnm", -+ /* 227 */ "expr ::= EXISTS LP select RP", -+ /* 228 */ "expr ::= CASE case_operand case_exprlist case_else END", -+ /* 229 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", -+ /* 230 */ "case_exprlist ::= WHEN expr THEN expr", -+ /* 231 */ "case_else ::= ELSE expr", -+ /* 232 */ "case_else ::=", -+ /* 233 */ "case_operand ::= expr", -+ /* 234 */ "case_operand ::=", -+ /* 235 */ "exprlist ::= nexprlist", -+ /* 236 */ "exprlist ::=", -+ /* 237 */ "nexprlist ::= nexprlist COMMA expr", -+ /* 238 */ "nexprlist ::= expr", -+ /* 239 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP where_opt", -+ /* 240 */ "uniqueflag ::= UNIQUE", -+ /* 241 */ "uniqueflag ::=", -+ /* 242 */ "idxlist_opt ::=", -+ /* 243 */ "idxlist_opt ::= LP idxlist RP", -+ /* 244 */ "idxlist ::= idxlist COMMA nm collate sortorder", -+ /* 245 */ "idxlist ::= nm collate sortorder", -+ /* 246 */ "collate ::=", -+ /* 247 */ "collate ::= COLLATE ID|STRING", -+ /* 248 */ "cmd ::= DROP INDEX ifexists fullname", -+ /* 249 */ "cmd ::= VACUUM", -+ /* 250 */ "cmd ::= VACUUM nm", -+ /* 251 */ "cmd ::= PRAGMA nm dbnm", -+ /* 252 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", -+ /* 253 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", -+ /* 254 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", -+ /* 255 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", -+ /* 256 */ "nmnum ::= plus_num", -+ /* 257 */ "nmnum ::= nm", -+ /* 258 */ "nmnum ::= ON", -+ /* 259 */ "nmnum ::= DELETE", -+ /* 260 */ "nmnum ::= DEFAULT", -+ /* 261 */ "plus_num ::= PLUS INTEGER|FLOAT", -+ /* 262 */ "plus_num ::= INTEGER|FLOAT", -+ /* 263 */ "minus_num ::= MINUS INTEGER|FLOAT", -+ /* 264 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", -+ /* 265 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", -+ /* 266 */ "trigger_time ::= BEFORE", -+ /* 267 */ "trigger_time ::= AFTER", -+ /* 268 */ "trigger_time ::= INSTEAD OF", -+ /* 269 */ "trigger_time ::=", -+ /* 270 */ "trigger_event ::= DELETE|INSERT", -+ /* 271 */ "trigger_event ::= UPDATE", -+ /* 272 */ "trigger_event ::= UPDATE OF idlist", -+ /* 273 */ "foreach_clause ::=", -+ /* 274 */ "foreach_clause ::= FOR EACH ROW", -+ /* 275 */ "when_clause ::=", -+ /* 276 */ "when_clause ::= WHEN expr", -+ /* 277 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", -+ /* 278 */ "trigger_cmd_list ::= trigger_cmd SEMI", -+ /* 279 */ "trnm ::= nm", -+ /* 280 */ "trnm ::= nm DOT nm", -+ /* 281 */ "tridxby ::=", -+ /* 282 */ "tridxby ::= INDEXED BY nm", -+ /* 283 */ "tridxby ::= NOT INDEXED", -+ /* 284 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt", -+ /* 285 */ "trigger_cmd ::= insert_cmd INTO trnm inscollist_opt select", -+ /* 286 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt", -+ /* 287 */ "trigger_cmd ::= select", -+ /* 288 */ "expr ::= RAISE LP IGNORE RP", -+ /* 289 */ "expr ::= RAISE LP raisetype COMMA nm RP", -+ /* 290 */ "raisetype ::= ROLLBACK", -+ /* 291 */ "raisetype ::= ABORT", -+ /* 292 */ "raisetype ::= FAIL", -+ /* 293 */ "cmd ::= DROP TRIGGER ifexists fullname", -+ /* 294 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", -+ /* 295 */ "cmd ::= DETACH database_kw_opt expr", -+ /* 296 */ "key_opt ::=", -+ /* 297 */ "key_opt ::= KEY expr", -+ /* 298 */ "database_kw_opt ::= DATABASE", -+ /* 299 */ "database_kw_opt ::=", -+ /* 300 */ "cmd ::= REINDEX", -+ /* 301 */ "cmd ::= REINDEX nm dbnm", -+ /* 302 */ "cmd ::= ANALYZE", -+ /* 303 */ "cmd ::= ANALYZE nm dbnm", -+ /* 304 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", -+ /* 305 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column", -+ /* 306 */ "add_column_fullname ::= fullname", -+ /* 307 */ "kwcolumn_opt ::=", -+ /* 308 */ "kwcolumn_opt ::= COLUMNKW", -+ /* 309 */ "cmd ::= create_vtab", -+ /* 310 */ "cmd ::= create_vtab LP vtabarglist RP", -+ /* 311 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", -+ /* 312 */ "vtabarglist ::= vtabarg", -+ /* 313 */ "vtabarglist ::= vtabarglist COMMA vtabarg", -+ /* 314 */ "vtabarg ::=", -+ /* 315 */ "vtabarg ::= vtabarg vtabargtoken", -+ /* 316 */ "vtabargtoken ::= ANY", -+ /* 317 */ "vtabargtoken ::= lp anylist RP", -+ /* 318 */ "lp ::= LP", -+ /* 319 */ "anylist ::=", -+ /* 320 */ "anylist ::= anylist LP anylist RP", -+ /* 321 */ "anylist ::= anylist ANY", -+ /* 322 */ "with ::=", -+ /* 323 */ "with ::= WITH wqlist", -+ /* 324 */ "with ::= WITH RECURSIVE wqlist", -+ /* 325 */ "wqlist ::= nm idxlist_opt AS LP select RP", -+ /* 326 */ "wqlist ::= wqlist COMMA nm idxlist_opt AS LP select RP", - }; - #endif /* NDEBUG */ - -@@ -115720,76 +116689,76 @@ static void yy_destructor( - ** which appear on the RHS of the rule, but which are not used - ** inside the C code. - */ -- case 162: /* select */ -+ case 163: /* select */ -+ case 195: /* selectnowith */ - case 196: /* oneselect */ -+ case 207: /* values */ - { --sqlite3SelectDelete(pParse->db, (yypminor->yy387)); -+sqlite3SelectDelete(pParse->db, (yypminor->yy3)); - } - break; -- case 175: /* term */ -- case 176: /* expr */ -+ case 174: /* term */ -+ case 175: /* expr */ - { --sqlite3ExprDelete(pParse->db, (yypminor->yy118).pExpr); -+sqlite3ExprDelete(pParse->db, (yypminor->yy346).pExpr); - } - break; -- case 180: /* idxlist_opt */ -- case 189: /* idxlist */ -- case 199: /* selcollist */ -- case 202: /* groupby_opt */ -- case 204: /* orderby_opt */ -- case 206: /* sclp */ -- case 216: /* sortlist */ -- case 217: /* nexprlist */ -- case 218: /* setlist */ -- case 222: /* exprlist */ -- case 227: /* case_exprlist */ -+ case 179: /* idxlist_opt */ -+ case 188: /* idxlist */ -+ case 200: /* selcollist */ -+ case 203: /* groupby_opt */ -+ case 205: /* orderby_opt */ -+ case 208: /* nexprlist */ -+ case 209: /* exprlist */ -+ case 210: /* sclp */ -+ case 220: /* sortlist */ -+ case 221: /* setlist */ -+ case 228: /* case_exprlist */ - { --sqlite3ExprListDelete(pParse->db, (yypminor->yy322)); -+sqlite3ExprListDelete(pParse->db, (yypminor->yy14)); - } - break; -- case 195: /* fullname */ -- case 200: /* from */ -- case 208: /* seltablist */ -- case 209: /* stl_prefix */ -+ case 194: /* fullname */ -+ case 201: /* from */ -+ case 212: /* seltablist */ -+ case 213: /* stl_prefix */ - { --sqlite3SrcListDelete(pParse->db, (yypminor->yy259)); -+sqlite3SrcListDelete(pParse->db, (yypminor->yy65)); - } - break; -- case 201: /* where_opt */ -- case 203: /* having_opt */ -- case 212: /* on_opt */ -- case 226: /* case_operand */ -- case 228: /* case_else */ -- case 238: /* when_clause */ -- case 243: /* key_opt */ -+ case 197: /* with */ -+ case 252: /* wqlist */ - { --sqlite3ExprDelete(pParse->db, (yypminor->yy314)); -+sqlite3WithDelete(pParse->db, (yypminor->yy59)); - } - break; -- case 213: /* using_opt */ -- case 215: /* idlist */ -- case 220: /* inscollist_opt */ -+ case 202: /* where_opt */ -+ case 204: /* having_opt */ -+ case 216: /* on_opt */ -+ case 227: /* case_operand */ -+ case 229: /* case_else */ -+ case 238: /* when_clause */ -+ case 243: /* key_opt */ - { --sqlite3IdListDelete(pParse->db, (yypminor->yy384)); -+sqlite3ExprDelete(pParse->db, (yypminor->yy132)); - } - break; -- case 221: /* valuelist */ -+ case 217: /* using_opt */ -+ case 219: /* idlist */ -+ case 223: /* inscollist_opt */ - { -- -- sqlite3ExprListDelete(pParse->db, (yypminor->yy260).pList); -- sqlite3SelectDelete(pParse->db, (yypminor->yy260).pSelect); -- -+sqlite3IdListDelete(pParse->db, (yypminor->yy408)); - } - break; - case 234: /* trigger_cmd_list */ - case 239: /* trigger_cmd */ - { --sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy203)); -+sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy473)); - } - break; - case 236: /* trigger_event */ - { --sqlite3IdListDelete(pParse->db, (yypminor->yy90).b); -+sqlite3IdListDelete(pParse->db, (yypminor->yy378).b); - } - break; - default: break; /* If no destructor action specified: do nothing */ -@@ -116034,277 +117003,271 @@ static const struct { - YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ - unsigned char nrhs; /* Number of right-hand side symbols in the rule */ - } yyRuleInfo[] = { -- { 143, 1 }, -- { 144, 2 }, - { 144, 1 }, -+ { 145, 2 }, - { 145, 1 }, -- { 145, 3 }, -- { 146, 0 }, - { 146, 1 }, - { 146, 3 }, -+ { 147, 0 }, - { 147, 1 }, -- { 148, 3 }, -+ { 147, 3 }, -+ { 148, 1 }, -+ { 149, 3 }, -+ { 151, 0 }, -+ { 151, 1 }, -+ { 151, 2 }, - { 150, 0 }, - { 150, 1 }, -- { 150, 2 }, -- { 149, 0 }, -- { 149, 1 }, -- { 149, 1 }, -- { 149, 1 }, -- { 148, 2 }, -- { 148, 2 }, -- { 148, 2 }, -- { 152, 1 }, -- { 152, 0 }, -- { 148, 2 }, -- { 148, 3 }, -- { 148, 5 }, -- { 148, 2 }, -- { 153, 6 }, -- { 155, 1 }, -- { 157, 0 }, -- { 157, 3 }, -+ { 150, 1 }, -+ { 150, 1 }, -+ { 149, 2 }, -+ { 149, 2 }, -+ { 149, 2 }, -+ { 153, 1 }, -+ { 153, 0 }, -+ { 149, 2 }, -+ { 149, 3 }, -+ { 149, 5 }, -+ { 149, 2 }, -+ { 154, 6 }, - { 156, 1 }, -- { 156, 0 }, -- { 154, 5 }, -- { 154, 2 }, -- { 161, 0 }, -- { 161, 2 }, -- { 159, 3 }, -- { 159, 1 }, -- { 163, 3 }, -- { 164, 1 }, -- { 167, 1 }, -- { 167, 1 }, -- { 168, 1 }, -- { 151, 1 }, -- { 151, 1 }, -- { 151, 1 }, -- { 165, 0 }, -+ { 158, 0 }, -+ { 158, 3 }, -+ { 157, 1 }, -+ { 157, 0 }, -+ { 155, 5 }, -+ { 155, 2 }, -+ { 162, 0 }, -+ { 162, 2 }, -+ { 160, 3 }, -+ { 160, 1 }, -+ { 164, 3 }, - { 165, 1 }, -+ { 152, 1 }, -+ { 152, 1 }, -+ { 152, 1 }, -+ { 166, 0 }, -+ { 166, 1 }, -+ { 168, 1 }, -+ { 168, 4 }, -+ { 168, 6 }, - { 169, 1 }, -- { 169, 4 }, -- { 169, 6 }, -+ { 169, 2 }, - { 170, 1 }, -- { 170, 2 }, -- { 171, 1 }, -- { 171, 1 }, -- { 166, 2 }, -- { 166, 0 }, -- { 174, 2 }, -- { 174, 2 }, -- { 174, 4 }, -- { 174, 3 }, -- { 174, 3 }, -- { 174, 2 }, -- { 174, 2 }, -- { 174, 3 }, -- { 174, 5 }, -- { 174, 2 }, -- { 174, 4 }, -- { 174, 4 }, -- { 174, 1 }, -- { 174, 2 }, -- { 179, 0 }, -- { 179, 1 }, -- { 181, 0 }, -- { 181, 2 }, -+ { 170, 1 }, -+ { 167, 2 }, -+ { 167, 0 }, -+ { 173, 2 }, -+ { 173, 2 }, -+ { 173, 4 }, -+ { 173, 3 }, -+ { 173, 3 }, -+ { 173, 2 }, -+ { 173, 2 }, -+ { 173, 3 }, -+ { 173, 5 }, -+ { 173, 2 }, -+ { 173, 4 }, -+ { 173, 4 }, -+ { 173, 1 }, -+ { 173, 2 }, -+ { 178, 0 }, -+ { 178, 1 }, -+ { 180, 0 }, -+ { 180, 2 }, -+ { 182, 2 }, -+ { 182, 3 }, -+ { 182, 3 }, -+ { 182, 3 }, - { 183, 2 }, -- { 183, 3 }, -- { 183, 3 }, -- { 183, 3 }, -- { 184, 2 }, -+ { 183, 2 }, -+ { 183, 1 }, -+ { 183, 1 }, -+ { 183, 2 }, -+ { 181, 3 }, -+ { 181, 2 }, -+ { 184, 0 }, - { 184, 2 }, -- { 184, 1 }, -- { 184, 1 }, - { 184, 2 }, -- { 182, 3 }, -- { 182, 2 }, -- { 185, 0 }, -- { 185, 2 }, -- { 185, 2 }, -- { 160, 0 }, -- { 160, 2 }, -- { 186, 3 }, -+ { 161, 0 }, -+ { 161, 2 }, -+ { 185, 3 }, -+ { 185, 1 }, - { 186, 1 }, -- { 187, 1 }, -- { 187, 0 }, -- { 188, 2 }, -- { 188, 7 }, -- { 188, 5 }, -- { 188, 5 }, -- { 188, 10 }, -+ { 186, 0 }, -+ { 187, 2 }, -+ { 187, 7 }, -+ { 187, 5 }, -+ { 187, 5 }, -+ { 187, 10 }, -+ { 189, 0 }, -+ { 189, 1 }, -+ { 176, 0 }, -+ { 176, 3 }, - { 190, 0 }, -- { 190, 1 }, -- { 177, 0 }, -- { 177, 3 }, -- { 191, 0 }, -- { 191, 2 }, -- { 192, 1 }, -- { 192, 1 }, -- { 192, 1 }, -- { 148, 4 }, -- { 194, 2 }, -- { 194, 0 }, -- { 148, 8 }, -- { 148, 4 }, -- { 148, 1 }, -- { 162, 1 }, -- { 162, 3 }, -- { 197, 1 }, -- { 197, 2 }, -- { 197, 1 }, -- { 196, 9 }, -+ { 190, 2 }, -+ { 191, 1 }, -+ { 191, 1 }, -+ { 191, 1 }, -+ { 149, 4 }, -+ { 193, 2 }, -+ { 193, 0 }, -+ { 149, 8 }, -+ { 149, 4 }, -+ { 149, 1 }, -+ { 163, 2 }, -+ { 195, 1 }, -+ { 195, 3 }, - { 198, 1 }, -+ { 198, 2 }, - { 198, 1 }, -- { 198, 0 }, -- { 206, 2 }, -- { 206, 0 }, -- { 199, 3 }, -- { 199, 2 }, -- { 199, 4 }, -- { 207, 2 }, -- { 207, 1 }, -- { 207, 0 }, -- { 200, 0 }, -- { 200, 2 }, -- { 209, 2 }, -- { 209, 0 }, -- { 208, 7 }, -- { 208, 7 }, -- { 208, 7 }, -- { 158, 0 }, -- { 158, 2 }, -- { 195, 2 }, -- { 210, 1 }, -+ { 196, 9 }, -+ { 196, 1 }, -+ { 207, 4 }, -+ { 207, 5 }, -+ { 199, 1 }, -+ { 199, 1 }, -+ { 199, 0 }, - { 210, 2 }, -- { 210, 3 }, -- { 210, 4 }, -- { 212, 2 }, -- { 212, 0 }, -- { 211, 0 }, -- { 211, 3 }, -+ { 210, 0 }, -+ { 200, 3 }, -+ { 200, 2 }, -+ { 200, 4 }, - { 211, 2 }, -- { 213, 4 }, -+ { 211, 1 }, -+ { 211, 0 }, -+ { 201, 0 }, -+ { 201, 2 }, -+ { 213, 2 }, - { 213, 0 }, -- { 204, 0 }, -- { 204, 3 }, -- { 216, 4 }, -+ { 212, 7 }, -+ { 212, 7 }, -+ { 212, 7 }, -+ { 159, 0 }, -+ { 159, 2 }, -+ { 194, 2 }, -+ { 214, 1 }, -+ { 214, 2 }, -+ { 214, 3 }, -+ { 214, 4 }, - { 216, 2 }, -- { 178, 1 }, -- { 178, 1 }, -- { 178, 0 }, -- { 202, 0 }, -- { 202, 3 }, -- { 203, 0 }, -- { 203, 2 }, -+ { 216, 0 }, -+ { 215, 0 }, -+ { 215, 3 }, -+ { 215, 2 }, -+ { 217, 4 }, -+ { 217, 0 }, - { 205, 0 }, -- { 205, 2 }, -- { 205, 4 }, -- { 205, 4 }, -- { 148, 5 }, -- { 201, 0 }, -- { 201, 2 }, -- { 148, 7 }, -- { 218, 5 }, -- { 218, 3 }, -- { 148, 5 }, -- { 148, 5 }, -- { 148, 6 }, -- { 219, 2 }, -- { 219, 1 }, -- { 221, 4 }, -+ { 205, 3 }, -+ { 220, 4 }, -+ { 220, 2 }, -+ { 177, 1 }, -+ { 177, 1 }, -+ { 177, 0 }, -+ { 203, 0 }, -+ { 203, 3 }, -+ { 204, 0 }, -+ { 204, 2 }, -+ { 206, 0 }, -+ { 206, 2 }, -+ { 206, 4 }, -+ { 206, 4 }, -+ { 149, 6 }, -+ { 202, 0 }, -+ { 202, 2 }, -+ { 149, 8 }, - { 221, 5 }, -- { 220, 0 }, -- { 220, 3 }, -- { 215, 3 }, -- { 215, 1 }, -- { 176, 1 }, -- { 176, 3 }, -+ { 221, 3 }, -+ { 149, 6 }, -+ { 149, 7 }, -+ { 222, 2 }, -+ { 222, 1 }, -+ { 223, 0 }, -+ { 223, 3 }, -+ { 219, 3 }, -+ { 219, 1 }, - { 175, 1 }, -- { 176, 1 }, -- { 176, 1 }, -- { 176, 3 }, -- { 176, 5 }, -+ { 175, 3 }, -+ { 174, 1 }, - { 175, 1 }, - { 175, 1 }, -- { 176, 1 }, -- { 176, 1 }, -- { 176, 3 }, -- { 176, 6 }, -- { 176, 5 }, -- { 176, 4 }, -+ { 175, 3 }, -+ { 175, 5 }, -+ { 174, 1 }, -+ { 174, 1 }, - { 175, 1 }, -- { 176, 3 }, -- { 176, 3 }, -- { 176, 3 }, -- { 176, 3 }, -- { 176, 3 }, -- { 176, 3 }, -- { 176, 3 }, -- { 176, 3 }, -- { 223, 1 }, -- { 223, 2 }, -- { 223, 1 }, -- { 223, 2 }, -- { 176, 3 }, -- { 176, 5 }, -- { 176, 2 }, -- { 176, 3 }, -- { 176, 3 }, -- { 176, 4 }, -- { 176, 2 }, -- { 176, 2 }, -- { 176, 2 }, -- { 176, 2 }, -+ { 175, 3 }, -+ { 175, 6 }, -+ { 175, 5 }, -+ { 175, 4 }, -+ { 174, 1 }, -+ { 175, 3 }, -+ { 175, 3 }, -+ { 175, 3 }, -+ { 175, 3 }, -+ { 175, 3 }, -+ { 175, 3 }, -+ { 175, 3 }, -+ { 175, 3 }, - { 224, 1 }, - { 224, 2 }, -- { 176, 5 }, -+ { 175, 3 }, -+ { 175, 5 }, -+ { 175, 2 }, -+ { 175, 3 }, -+ { 175, 3 }, -+ { 175, 4 }, -+ { 175, 2 }, -+ { 175, 2 }, -+ { 175, 2 }, -+ { 175, 2 }, - { 225, 1 }, - { 225, 2 }, -- { 176, 5 }, -- { 176, 3 }, -- { 176, 5 }, -- { 176, 4 }, -- { 176, 4 }, -- { 176, 5 }, -- { 227, 5 }, -- { 227, 4 }, -- { 228, 2 }, -- { 228, 0 }, -+ { 175, 5 }, - { 226, 1 }, -- { 226, 0 }, -- { 222, 1 }, -- { 222, 0 }, -- { 217, 3 }, -- { 217, 1 }, -- { 148, 12 }, -- { 229, 1 }, -+ { 226, 2 }, -+ { 175, 5 }, -+ { 175, 3 }, -+ { 175, 5 }, -+ { 175, 4 }, -+ { 175, 4 }, -+ { 175, 5 }, -+ { 228, 5 }, -+ { 228, 4 }, -+ { 229, 2 }, - { 229, 0 }, -- { 180, 0 }, -- { 180, 3 }, -- { 189, 5 }, -- { 189, 3 }, -+ { 227, 1 }, -+ { 227, 0 }, -+ { 209, 1 }, -+ { 209, 0 }, -+ { 208, 3 }, -+ { 208, 1 }, -+ { 149, 12 }, -+ { 230, 1 }, - { 230, 0 }, -- { 230, 2 }, -- { 148, 4 }, -- { 148, 1 }, -- { 148, 2 }, -- { 148, 3 }, -- { 148, 5 }, -- { 148, 6 }, -- { 148, 5 }, -- { 148, 6 }, -- { 231, 1 }, -- { 231, 1 }, -- { 231, 1 }, -- { 231, 1 }, -- { 231, 1 }, -- { 172, 2 }, -- { 172, 1 }, -- { 173, 2 }, -+ { 179, 0 }, -+ { 179, 3 }, -+ { 188, 5 }, -+ { 188, 3 }, -+ { 231, 0 }, -+ { 231, 2 }, -+ { 149, 4 }, -+ { 149, 1 }, -+ { 149, 2 }, -+ { 149, 3 }, -+ { 149, 5 }, -+ { 149, 6 }, -+ { 149, 5 }, -+ { 149, 6 }, -+ { 232, 1 }, -+ { 232, 1 }, -+ { 232, 1 }, -+ { 232, 1 }, - { 232, 1 }, -- { 148, 5 }, -+ { 171, 2 }, -+ { 171, 1 }, -+ { 172, 2 }, -+ { 149, 5 }, - { 233, 11 }, - { 235, 1 }, - { 235, 1 }, -@@ -116327,31 +117290,30 @@ static const struct { - { 239, 7 }, - { 239, 5 }, - { 239, 5 }, -- { 239, 5 }, - { 239, 1 }, -- { 176, 4 }, -- { 176, 6 }, -- { 193, 1 }, -- { 193, 1 }, -- { 193, 1 }, -- { 148, 4 }, -- { 148, 6 }, -- { 148, 3 }, -+ { 175, 4 }, -+ { 175, 6 }, -+ { 192, 1 }, -+ { 192, 1 }, -+ { 192, 1 }, -+ { 149, 4 }, -+ { 149, 6 }, -+ { 149, 3 }, - { 243, 0 }, - { 243, 2 }, - { 242, 1 }, - { 242, 0 }, -- { 148, 1 }, -- { 148, 3 }, -- { 148, 1 }, -- { 148, 3 }, -- { 148, 6 }, -- { 148, 6 }, -+ { 149, 1 }, -+ { 149, 3 }, -+ { 149, 1 }, -+ { 149, 3 }, -+ { 149, 6 }, -+ { 149, 6 }, - { 244, 1 }, - { 245, 0 }, - { 245, 1 }, -- { 148, 1 }, -- { 148, 4 }, -+ { 149, 1 }, -+ { 149, 4 }, - { 246, 8 }, - { 247, 1 }, - { 247, 3 }, -@@ -116363,6 +117325,11 @@ static const struct { - { 251, 0 }, - { 251, 4 }, - { 251, 2 }, -+ { 197, 0 }, -+ { 197, 2 }, -+ { 197, 3 }, -+ { 252, 6 }, -+ { 252, 8 }, - }; - - static void yy_accept(yyParser*); /* Forward Declaration */ -@@ -116430,17 +117397,17 @@ static void yy_reduce( - { sqlite3FinishCoding(pParse); } - break; - case 9: /* cmd ::= BEGIN transtype trans_opt */ --{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy4);} -+{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy328);} - break; - case 13: /* transtype ::= */ --{yygotominor.yy4 = TK_DEFERRED;} -+{yygotominor.yy328 = TK_DEFERRED;} - break; - case 14: /* transtype ::= DEFERRED */ - case 15: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==15); - case 16: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==16); -- case 117: /* multiselect_op ::= UNION */ yytestcase(yyruleno==117); -- case 119: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==119); --{yygotominor.yy4 = yymsp[0].major;} -+ case 115: /* multiselect_op ::= UNION */ yytestcase(yyruleno==115); -+ case 117: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==117); -+{yygotominor.yy328 = yymsp[0].major;} - break; - case 17: /* cmd ::= COMMIT trans_opt */ - case 18: /* cmd ::= END trans_opt */ yytestcase(yyruleno==18); -@@ -116466,7 +117433,7 @@ static void yy_reduce( - break; - case 26: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */ - { -- sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy4,0,0,yymsp[-2].minor.yy4); -+ sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy328,0,0,yymsp[-2].minor.yy328); - } - break; - case 27: /* createkw ::= CREATE */ -@@ -116477,45 +117444,45 @@ static void yy_reduce( - break; - case 28: /* ifnotexists ::= */ - case 31: /* temp ::= */ yytestcase(yyruleno==31); -- case 71: /* autoinc ::= */ yytestcase(yyruleno==71); -- case 84: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ yytestcase(yyruleno==84); -- case 86: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==86); -- case 88: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ yytestcase(yyruleno==88); -- case 100: /* defer_subclause_opt ::= */ yytestcase(yyruleno==100); -- case 111: /* ifexists ::= */ yytestcase(yyruleno==111); -- case 223: /* between_op ::= BETWEEN */ yytestcase(yyruleno==223); -- case 226: /* in_op ::= IN */ yytestcase(yyruleno==226); --{yygotominor.yy4 = 0;} -+ case 68: /* autoinc ::= */ yytestcase(yyruleno==68); -+ case 81: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ yytestcase(yyruleno==81); -+ case 83: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==83); -+ case 85: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ yytestcase(yyruleno==85); -+ case 97: /* defer_subclause_opt ::= */ yytestcase(yyruleno==97); -+ case 108: /* ifexists ::= */ yytestcase(yyruleno==108); -+ case 218: /* between_op ::= BETWEEN */ yytestcase(yyruleno==218); -+ case 221: /* in_op ::= IN */ yytestcase(yyruleno==221); -+{yygotominor.yy328 = 0;} - break; - case 29: /* ifnotexists ::= IF NOT EXISTS */ - case 30: /* temp ::= TEMP */ yytestcase(yyruleno==30); -- case 72: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==72); -- case 87: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ yytestcase(yyruleno==87); -- case 110: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==110); -- case 224: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==224); -- case 227: /* in_op ::= NOT IN */ yytestcase(yyruleno==227); --{yygotominor.yy4 = 1;} -+ case 69: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==69); -+ case 84: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ yytestcase(yyruleno==84); -+ case 107: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==107); -+ case 219: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==219); -+ case 222: /* in_op ::= NOT IN */ yytestcase(yyruleno==222); -+{yygotominor.yy328 = 1;} - break; - case 32: /* create_table_args ::= LP columnlist conslist_opt RP table_options */ - { -- sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy210,0); -+ sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy186,0); - } - break; - case 33: /* create_table_args ::= AS select */ - { -- sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy387); -- sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy387); -+ sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy3); -+ sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy3); - } - break; - case 34: /* table_options ::= */ --{yygotominor.yy210 = 0;} -+{yygotominor.yy186 = 0;} - break; - case 35: /* table_options ::= WITHOUT nm */ - { - if( yymsp[0].minor.yy0.n==5 && sqlite3_strnicmp(yymsp[0].minor.yy0.z,"rowid",5)==0 ){ -- yygotominor.yy210 = TF_WithoutRowid; -+ yygotominor.yy186 = TF_WithoutRowid; - }else{ -- yygotominor.yy210 = 0; -+ yygotominor.yy186 = 0; - sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z); - } - } -@@ -116533,650 +117500,648 @@ static void yy_reduce( - pParse->constraintName.n = 0; - } - break; -- case 40: /* id ::= ID */ -- case 41: /* id ::= INDEXED */ yytestcase(yyruleno==41); -- case 42: /* ids ::= ID|STRING */ yytestcase(yyruleno==42); -- case 43: /* nm ::= id */ yytestcase(yyruleno==43); -- case 44: /* nm ::= STRING */ yytestcase(yyruleno==44); -- case 45: /* nm ::= JOIN_KW */ yytestcase(yyruleno==45); -- case 48: /* typetoken ::= typename */ yytestcase(yyruleno==48); -- case 51: /* typename ::= ids */ yytestcase(yyruleno==51); -- case 129: /* as ::= AS nm */ yytestcase(yyruleno==129); -- case 130: /* as ::= ids */ yytestcase(yyruleno==130); -- case 140: /* dbnm ::= DOT nm */ yytestcase(yyruleno==140); -- case 149: /* indexed_opt ::= INDEXED BY nm */ yytestcase(yyruleno==149); -- case 252: /* collate ::= COLLATE ids */ yytestcase(yyruleno==252); -- case 261: /* nmnum ::= plus_num */ yytestcase(yyruleno==261); -- case 262: /* nmnum ::= nm */ yytestcase(yyruleno==262); -- case 263: /* nmnum ::= ON */ yytestcase(yyruleno==263); -- case 264: /* nmnum ::= DELETE */ yytestcase(yyruleno==264); -- case 265: /* nmnum ::= DEFAULT */ yytestcase(yyruleno==265); -- case 266: /* plus_num ::= PLUS number */ yytestcase(yyruleno==266); -- case 267: /* plus_num ::= number */ yytestcase(yyruleno==267); -- case 268: /* minus_num ::= MINUS number */ yytestcase(yyruleno==268); -- case 269: /* number ::= INTEGER|FLOAT */ yytestcase(yyruleno==269); -- case 285: /* trnm ::= nm */ yytestcase(yyruleno==285); -+ case 40: /* nm ::= ID|INDEXED */ -+ case 41: /* nm ::= STRING */ yytestcase(yyruleno==41); -+ case 42: /* nm ::= JOIN_KW */ yytestcase(yyruleno==42); -+ case 45: /* typetoken ::= typename */ yytestcase(yyruleno==45); -+ case 48: /* typename ::= ID|STRING */ yytestcase(yyruleno==48); -+ case 130: /* as ::= AS nm */ yytestcase(yyruleno==130); -+ case 131: /* as ::= ID|STRING */ yytestcase(yyruleno==131); -+ case 141: /* dbnm ::= DOT nm */ yytestcase(yyruleno==141); -+ case 150: /* indexed_opt ::= INDEXED BY nm */ yytestcase(yyruleno==150); -+ case 247: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==247); -+ case 256: /* nmnum ::= plus_num */ yytestcase(yyruleno==256); -+ case 257: /* nmnum ::= nm */ yytestcase(yyruleno==257); -+ case 258: /* nmnum ::= ON */ yytestcase(yyruleno==258); -+ case 259: /* nmnum ::= DELETE */ yytestcase(yyruleno==259); -+ case 260: /* nmnum ::= DEFAULT */ yytestcase(yyruleno==260); -+ case 261: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==261); -+ case 262: /* plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==262); -+ case 263: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==263); -+ case 279: /* trnm ::= nm */ yytestcase(yyruleno==279); - {yygotominor.yy0 = yymsp[0].minor.yy0;} - break; -- case 47: /* type ::= typetoken */ -+ case 44: /* type ::= typetoken */ - {sqlite3AddColumnType(pParse,&yymsp[0].minor.yy0);} - break; -- case 49: /* typetoken ::= typename LP signed RP */ -+ case 46: /* typetoken ::= typename LP signed RP */ - { - yygotominor.yy0.z = yymsp[-3].minor.yy0.z; - yygotominor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-3].minor.yy0.z); - } - break; -- case 50: /* typetoken ::= typename LP signed COMMA signed RP */ -+ case 47: /* typetoken ::= typename LP signed COMMA signed RP */ - { - yygotominor.yy0.z = yymsp[-5].minor.yy0.z; - yygotominor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-5].minor.yy0.z); - } - break; -- case 52: /* typename ::= typename ids */ -+ case 49: /* typename ::= typename ID|STRING */ - {yygotominor.yy0.z=yymsp[-1].minor.yy0.z; yygotominor.yy0.n=yymsp[0].minor.yy0.n+(int)(yymsp[0].minor.yy0.z-yymsp[-1].minor.yy0.z);} - break; -- case 57: /* ccons ::= CONSTRAINT nm */ -- case 95: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==95); -+ case 54: /* ccons ::= CONSTRAINT nm */ -+ case 92: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==92); - {pParse->constraintName = yymsp[0].minor.yy0;} - break; -- case 58: /* ccons ::= DEFAULT term */ -- case 60: /* ccons ::= DEFAULT PLUS term */ yytestcase(yyruleno==60); --{sqlite3AddDefaultValue(pParse,&yymsp[0].minor.yy118);} -+ case 55: /* ccons ::= DEFAULT term */ -+ case 57: /* ccons ::= DEFAULT PLUS term */ yytestcase(yyruleno==57); -+{sqlite3AddDefaultValue(pParse,&yymsp[0].minor.yy346);} - break; -- case 59: /* ccons ::= DEFAULT LP expr RP */ --{sqlite3AddDefaultValue(pParse,&yymsp[-1].minor.yy118);} -+ case 56: /* ccons ::= DEFAULT LP expr RP */ -+{sqlite3AddDefaultValue(pParse,&yymsp[-1].minor.yy346);} - break; -- case 61: /* ccons ::= DEFAULT MINUS term */ -+ case 58: /* ccons ::= DEFAULT MINUS term */ - { - ExprSpan v; -- v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy118.pExpr, 0, 0); -+ v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy346.pExpr, 0, 0); - v.zStart = yymsp[-1].minor.yy0.z; -- v.zEnd = yymsp[0].minor.yy118.zEnd; -+ v.zEnd = yymsp[0].minor.yy346.zEnd; - sqlite3AddDefaultValue(pParse,&v); - } - break; -- case 62: /* ccons ::= DEFAULT id */ -+ case 59: /* ccons ::= DEFAULT ID|INDEXED */ - { - ExprSpan v; - spanExpr(&v, pParse, TK_STRING, &yymsp[0].minor.yy0); - sqlite3AddDefaultValue(pParse,&v); - } - break; -- case 64: /* ccons ::= NOT NULL onconf */ --{sqlite3AddNotNull(pParse, yymsp[0].minor.yy4);} -+ case 61: /* ccons ::= NOT NULL onconf */ -+{sqlite3AddNotNull(pParse, yymsp[0].minor.yy328);} - break; -- case 65: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */ --{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy4,yymsp[0].minor.yy4,yymsp[-2].minor.yy4);} -+ case 62: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */ -+{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy328,yymsp[0].minor.yy328,yymsp[-2].minor.yy328);} - break; -- case 66: /* ccons ::= UNIQUE onconf */ --{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy4,0,0,0,0);} -+ case 63: /* ccons ::= UNIQUE onconf */ -+{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy328,0,0,0,0);} - break; -- case 67: /* ccons ::= CHECK LP expr RP */ --{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy118.pExpr);} -+ case 64: /* ccons ::= CHECK LP expr RP */ -+{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy346.pExpr);} - break; -- case 68: /* ccons ::= REFERENCES nm idxlist_opt refargs */ --{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy322,yymsp[0].minor.yy4);} -+ case 65: /* ccons ::= REFERENCES nm idxlist_opt refargs */ -+{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy14,yymsp[0].minor.yy328);} - break; -- case 69: /* ccons ::= defer_subclause */ --{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy4);} -+ case 66: /* ccons ::= defer_subclause */ -+{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy328);} - break; -- case 70: /* ccons ::= COLLATE ids */ -+ case 67: /* ccons ::= COLLATE ID|STRING */ - {sqlite3AddCollateType(pParse, &yymsp[0].minor.yy0);} - break; -- case 73: /* refargs ::= */ --{ yygotominor.yy4 = OE_None*0x0101; /* EV: R-19803-45884 */} -+ case 70: /* refargs ::= */ -+{ yygotominor.yy328 = OE_None*0x0101; /* EV: R-19803-45884 */} - break; -- case 74: /* refargs ::= refargs refarg */ --{ yygotominor.yy4 = (yymsp[-1].minor.yy4 & ~yymsp[0].minor.yy215.mask) | yymsp[0].minor.yy215.value; } -+ case 71: /* refargs ::= refargs refarg */ -+{ yygotominor.yy328 = (yymsp[-1].minor.yy328 & ~yymsp[0].minor.yy429.mask) | yymsp[0].minor.yy429.value; } - break; -- case 75: /* refarg ::= MATCH nm */ -- case 76: /* refarg ::= ON INSERT refact */ yytestcase(yyruleno==76); --{ yygotominor.yy215.value = 0; yygotominor.yy215.mask = 0x000000; } -+ case 72: /* refarg ::= MATCH nm */ -+ case 73: /* refarg ::= ON INSERT refact */ yytestcase(yyruleno==73); -+{ yygotominor.yy429.value = 0; yygotominor.yy429.mask = 0x000000; } - break; -- case 77: /* refarg ::= ON DELETE refact */ --{ yygotominor.yy215.value = yymsp[0].minor.yy4; yygotominor.yy215.mask = 0x0000ff; } -+ case 74: /* refarg ::= ON DELETE refact */ -+{ yygotominor.yy429.value = yymsp[0].minor.yy328; yygotominor.yy429.mask = 0x0000ff; } - break; -- case 78: /* refarg ::= ON UPDATE refact */ --{ yygotominor.yy215.value = yymsp[0].minor.yy4<<8; yygotominor.yy215.mask = 0x00ff00; } -+ case 75: /* refarg ::= ON UPDATE refact */ -+{ yygotominor.yy429.value = yymsp[0].minor.yy328<<8; yygotominor.yy429.mask = 0x00ff00; } - break; -- case 79: /* refact ::= SET NULL */ --{ yygotominor.yy4 = OE_SetNull; /* EV: R-33326-45252 */} -+ case 76: /* refact ::= SET NULL */ -+{ yygotominor.yy328 = OE_SetNull; /* EV: R-33326-45252 */} - break; -- case 80: /* refact ::= SET DEFAULT */ --{ yygotominor.yy4 = OE_SetDflt; /* EV: R-33326-45252 */} -+ case 77: /* refact ::= SET DEFAULT */ -+{ yygotominor.yy328 = OE_SetDflt; /* EV: R-33326-45252 */} - break; -- case 81: /* refact ::= CASCADE */ --{ yygotominor.yy4 = OE_Cascade; /* EV: R-33326-45252 */} -+ case 78: /* refact ::= CASCADE */ -+{ yygotominor.yy328 = OE_Cascade; /* EV: R-33326-45252 */} - break; -- case 82: /* refact ::= RESTRICT */ --{ yygotominor.yy4 = OE_Restrict; /* EV: R-33326-45252 */} -+ case 79: /* refact ::= RESTRICT */ -+{ yygotominor.yy328 = OE_Restrict; /* EV: R-33326-45252 */} - break; -- case 83: /* refact ::= NO ACTION */ --{ yygotominor.yy4 = OE_None; /* EV: R-33326-45252 */} -+ case 80: /* refact ::= NO ACTION */ -+{ yygotominor.yy328 = OE_None; /* EV: R-33326-45252 */} - break; -- case 85: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ -- case 101: /* defer_subclause_opt ::= defer_subclause */ yytestcase(yyruleno==101); -- case 103: /* onconf ::= ON CONFLICT resolvetype */ yytestcase(yyruleno==103); -- case 106: /* resolvetype ::= raisetype */ yytestcase(yyruleno==106); --{yygotominor.yy4 = yymsp[0].minor.yy4;} -+ case 82: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ -+ case 98: /* defer_subclause_opt ::= defer_subclause */ yytestcase(yyruleno==98); -+ case 100: /* onconf ::= ON CONFLICT resolvetype */ yytestcase(yyruleno==100); -+ case 103: /* resolvetype ::= raisetype */ yytestcase(yyruleno==103); -+{yygotominor.yy328 = yymsp[0].minor.yy328;} - break; -- case 89: /* conslist_opt ::= */ -+ case 86: /* conslist_opt ::= */ - {yygotominor.yy0.n = 0; yygotominor.yy0.z = 0;} - break; -- case 90: /* conslist_opt ::= COMMA conslist */ -+ case 87: /* conslist_opt ::= COMMA conslist */ - {yygotominor.yy0 = yymsp[-1].minor.yy0;} - break; -- case 93: /* tconscomma ::= COMMA */ -+ case 90: /* tconscomma ::= COMMA */ - {pParse->constraintName.n = 0;} - break; -- case 96: /* tcons ::= PRIMARY KEY LP idxlist autoinc RP onconf */ --{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy322,yymsp[0].minor.yy4,yymsp[-2].minor.yy4,0);} -+ case 93: /* tcons ::= PRIMARY KEY LP idxlist autoinc RP onconf */ -+{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy14,yymsp[0].minor.yy328,yymsp[-2].minor.yy328,0);} - break; -- case 97: /* tcons ::= UNIQUE LP idxlist RP onconf */ --{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy322,yymsp[0].minor.yy4,0,0,0,0);} -+ case 94: /* tcons ::= UNIQUE LP idxlist RP onconf */ -+{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy14,yymsp[0].minor.yy328,0,0,0,0);} - break; -- case 98: /* tcons ::= CHECK LP expr RP onconf */ --{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy118.pExpr);} -+ case 95: /* tcons ::= CHECK LP expr RP onconf */ -+{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy346.pExpr);} - break; -- case 99: /* tcons ::= FOREIGN KEY LP idxlist RP REFERENCES nm idxlist_opt refargs defer_subclause_opt */ -+ case 96: /* tcons ::= FOREIGN KEY LP idxlist RP REFERENCES nm idxlist_opt refargs defer_subclause_opt */ - { -- sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy322, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy322, yymsp[-1].minor.yy4); -- sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy4); -+ sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy14, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy14, yymsp[-1].minor.yy328); -+ sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy328); - } - break; -- case 102: /* onconf ::= */ --{yygotominor.yy4 = OE_Default;} -+ case 99: /* onconf ::= */ -+{yygotominor.yy328 = OE_Default;} - break; -- case 104: /* orconf ::= */ --{yygotominor.yy210 = OE_Default;} -+ case 101: /* orconf ::= */ -+{yygotominor.yy186 = OE_Default;} - break; -- case 105: /* orconf ::= OR resolvetype */ --{yygotominor.yy210 = (u8)yymsp[0].minor.yy4;} -+ case 102: /* orconf ::= OR resolvetype */ -+{yygotominor.yy186 = (u8)yymsp[0].minor.yy328;} - break; -- case 107: /* resolvetype ::= IGNORE */ --{yygotominor.yy4 = OE_Ignore;} -+ case 104: /* resolvetype ::= IGNORE */ -+{yygotominor.yy328 = OE_Ignore;} - break; -- case 108: /* resolvetype ::= REPLACE */ --{yygotominor.yy4 = OE_Replace;} -+ case 105: /* resolvetype ::= REPLACE */ -+{yygotominor.yy328 = OE_Replace;} - break; -- case 109: /* cmd ::= DROP TABLE ifexists fullname */ -+ case 106: /* cmd ::= DROP TABLE ifexists fullname */ - { -- sqlite3DropTable(pParse, yymsp[0].minor.yy259, 0, yymsp[-1].minor.yy4); -+ sqlite3DropTable(pParse, yymsp[0].minor.yy65, 0, yymsp[-1].minor.yy328); - } - break; -- case 112: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm AS select */ -+ case 109: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm AS select */ - { -- sqlite3CreateView(pParse, &yymsp[-7].minor.yy0, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, yymsp[0].minor.yy387, yymsp[-6].minor.yy4, yymsp[-4].minor.yy4); -+ sqlite3CreateView(pParse, &yymsp[-7].minor.yy0, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, yymsp[0].minor.yy3, yymsp[-6].minor.yy328, yymsp[-4].minor.yy328); - } - break; -- case 113: /* cmd ::= DROP VIEW ifexists fullname */ -+ case 110: /* cmd ::= DROP VIEW ifexists fullname */ - { -- sqlite3DropTable(pParse, yymsp[0].minor.yy259, 1, yymsp[-1].minor.yy4); -+ sqlite3DropTable(pParse, yymsp[0].minor.yy65, 1, yymsp[-1].minor.yy328); - } - break; -- case 114: /* cmd ::= select */ -+ case 111: /* cmd ::= select */ - { - SelectDest dest = {SRT_Output, 0, 0, 0, 0}; -- sqlite3Select(pParse, yymsp[0].minor.yy387, &dest); -+ sqlite3Select(pParse, yymsp[0].minor.yy3, &dest); - sqlite3ExplainBegin(pParse->pVdbe); -- sqlite3ExplainSelect(pParse->pVdbe, yymsp[0].minor.yy387); -+ sqlite3ExplainSelect(pParse->pVdbe, yymsp[0].minor.yy3); - sqlite3ExplainFinish(pParse->pVdbe); -- sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy387); -+ sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy3); -+} -+ break; -+ case 112: /* select ::= with selectnowith */ -+{ -+ if( yymsp[0].minor.yy3 ){ -+ yymsp[0].minor.yy3->pWith = yymsp[-1].minor.yy59; -+ }else{ -+ sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy59); -+ } -+ yygotominor.yy3 = yymsp[0].minor.yy3; - } - break; -- case 115: /* select ::= oneselect */ --{yygotominor.yy387 = yymsp[0].minor.yy387;} -+ case 113: /* selectnowith ::= oneselect */ -+ case 119: /* oneselect ::= values */ yytestcase(yyruleno==119); -+{yygotominor.yy3 = yymsp[0].minor.yy3;} - break; -- case 116: /* select ::= select multiselect_op oneselect */ -+ case 114: /* selectnowith ::= selectnowith multiselect_op oneselect */ - { -- if( yymsp[0].minor.yy387 ){ -- yymsp[0].minor.yy387->op = (u8)yymsp[-1].minor.yy4; -- yymsp[0].minor.yy387->pPrior = yymsp[-2].minor.yy387; -- if( yymsp[-1].minor.yy4!=TK_ALL ) pParse->hasCompound = 1; -+ if( yymsp[0].minor.yy3 ){ -+ yymsp[0].minor.yy3->op = (u8)yymsp[-1].minor.yy328; -+ yymsp[0].minor.yy3->pPrior = yymsp[-2].minor.yy3; -+ if( yymsp[-1].minor.yy328!=TK_ALL ) pParse->hasCompound = 1; - }else{ -- sqlite3SelectDelete(pParse->db, yymsp[-2].minor.yy387); -+ sqlite3SelectDelete(pParse->db, yymsp[-2].minor.yy3); - } -- yygotominor.yy387 = yymsp[0].minor.yy387; -+ yygotominor.yy3 = yymsp[0].minor.yy3; - } - break; -- case 118: /* multiselect_op ::= UNION ALL */ --{yygotominor.yy4 = TK_ALL;} -+ case 116: /* multiselect_op ::= UNION ALL */ -+{yygotominor.yy328 = TK_ALL;} - break; -- case 120: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ -+ case 118: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ - { -- yygotominor.yy387 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy322,yymsp[-5].minor.yy259,yymsp[-4].minor.yy314,yymsp[-3].minor.yy322,yymsp[-2].minor.yy314,yymsp[-1].minor.yy322,yymsp[-7].minor.yy177,yymsp[0].minor.yy292.pLimit,yymsp[0].minor.yy292.pOffset); -+ yygotominor.yy3 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy14,yymsp[-5].minor.yy65,yymsp[-4].minor.yy132,yymsp[-3].minor.yy14,yymsp[-2].minor.yy132,yymsp[-1].minor.yy14,yymsp[-7].minor.yy381,yymsp[0].minor.yy476.pLimit,yymsp[0].minor.yy476.pOffset); - } - break; -- case 121: /* distinct ::= DISTINCT */ --{yygotominor.yy177 = SF_Distinct;} -+ case 120: /* values ::= VALUES LP nexprlist RP */ -+{ -+ yygotominor.yy3 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy14,0,0,0,0,0,SF_Values,0,0); -+} - break; -- case 122: /* distinct ::= ALL */ -- case 123: /* distinct ::= */ yytestcase(yyruleno==123); --{yygotominor.yy177 = 0;} -+ case 121: /* values ::= values COMMA LP exprlist RP */ -+{ -+ Select *pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy14,0,0,0,0,0,SF_Values,0,0); -+ if( pRight ){ -+ pRight->op = TK_ALL; -+ pRight->pPrior = yymsp[-4].minor.yy3; -+ yygotominor.yy3 = pRight; -+ }else{ -+ yygotominor.yy3 = yymsp[-4].minor.yy3; -+ } -+} -+ break; -+ case 122: /* distinct ::= DISTINCT */ -+{yygotominor.yy381 = SF_Distinct;} - break; -- case 124: /* sclp ::= selcollist COMMA */ -- case 248: /* idxlist_opt ::= LP idxlist RP */ yytestcase(yyruleno==248); --{yygotominor.yy322 = yymsp[-1].minor.yy322;} -+ case 123: /* distinct ::= ALL */ -+ case 124: /* distinct ::= */ yytestcase(yyruleno==124); -+{yygotominor.yy381 = 0;} - break; -- case 125: /* sclp ::= */ -- case 153: /* orderby_opt ::= */ yytestcase(yyruleno==153); -- case 160: /* groupby_opt ::= */ yytestcase(yyruleno==160); -- case 241: /* exprlist ::= */ yytestcase(yyruleno==241); -- case 247: /* idxlist_opt ::= */ yytestcase(yyruleno==247); --{yygotominor.yy322 = 0;} -+ case 125: /* sclp ::= selcollist COMMA */ -+ case 243: /* idxlist_opt ::= LP idxlist RP */ yytestcase(yyruleno==243); -+{yygotominor.yy14 = yymsp[-1].minor.yy14;} - break; -- case 126: /* selcollist ::= sclp expr as */ -+ case 126: /* sclp ::= */ -+ case 154: /* orderby_opt ::= */ yytestcase(yyruleno==154); -+ case 161: /* groupby_opt ::= */ yytestcase(yyruleno==161); -+ case 236: /* exprlist ::= */ yytestcase(yyruleno==236); -+ case 242: /* idxlist_opt ::= */ yytestcase(yyruleno==242); -+{yygotominor.yy14 = 0;} -+ break; -+ case 127: /* selcollist ::= sclp expr as */ - { -- yygotominor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy322, yymsp[-1].minor.yy118.pExpr); -- if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yygotominor.yy322, &yymsp[0].minor.yy0, 1); -- sqlite3ExprListSetSpan(pParse,yygotominor.yy322,&yymsp[-1].minor.yy118); -+ yygotominor.yy14 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy14, yymsp[-1].minor.yy346.pExpr); -+ if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yygotominor.yy14, &yymsp[0].minor.yy0, 1); -+ sqlite3ExprListSetSpan(pParse,yygotominor.yy14,&yymsp[-1].minor.yy346); - } - break; -- case 127: /* selcollist ::= sclp STAR */ -+ case 128: /* selcollist ::= sclp STAR */ - { - Expr *p = sqlite3Expr(pParse->db, TK_ALL, 0); -- yygotominor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-1].minor.yy322, p); -+ yygotominor.yy14 = sqlite3ExprListAppend(pParse, yymsp[-1].minor.yy14, p); - } - break; -- case 128: /* selcollist ::= sclp nm DOT STAR */ -+ case 129: /* selcollist ::= sclp nm DOT STAR */ - { - Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &yymsp[0].minor.yy0); - Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy0); - Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); -- yygotominor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy322, pDot); -+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy14, pDot); - } - break; -- case 131: /* as ::= */ -+ case 132: /* as ::= */ - {yygotominor.yy0.n = 0;} - break; -- case 132: /* from ::= */ --{yygotominor.yy259 = sqlite3DbMallocZero(pParse->db, sizeof(*yygotominor.yy259));} -+ case 133: /* from ::= */ -+{yygotominor.yy65 = sqlite3DbMallocZero(pParse->db, sizeof(*yygotominor.yy65));} - break; -- case 133: /* from ::= FROM seltablist */ -+ case 134: /* from ::= FROM seltablist */ - { -- yygotominor.yy259 = yymsp[0].minor.yy259; -- sqlite3SrcListShiftJoinType(yygotominor.yy259); -+ yygotominor.yy65 = yymsp[0].minor.yy65; -+ sqlite3SrcListShiftJoinType(yygotominor.yy65); - } - break; -- case 134: /* stl_prefix ::= seltablist joinop */ -+ case 135: /* stl_prefix ::= seltablist joinop */ - { -- yygotominor.yy259 = yymsp[-1].minor.yy259; -- if( ALWAYS(yygotominor.yy259 && yygotominor.yy259->nSrc>0) ) yygotominor.yy259->a[yygotominor.yy259->nSrc-1].jointype = (u8)yymsp[0].minor.yy4; -+ yygotominor.yy65 = yymsp[-1].minor.yy65; -+ if( ALWAYS(yygotominor.yy65 && yygotominor.yy65->nSrc>0) ) yygotominor.yy65->a[yygotominor.yy65->nSrc-1].jointype = (u8)yymsp[0].minor.yy328; - } - break; -- case 135: /* stl_prefix ::= */ --{yygotominor.yy259 = 0;} -+ case 136: /* stl_prefix ::= */ -+{yygotominor.yy65 = 0;} - break; -- case 136: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ -+ case 137: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ - { -- yygotominor.yy259 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy259,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy314,yymsp[0].minor.yy384); -- sqlite3SrcListIndexedBy(pParse, yygotominor.yy259, &yymsp[-2].minor.yy0); -+ yygotominor.yy65 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy65,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy132,yymsp[0].minor.yy408); -+ sqlite3SrcListIndexedBy(pParse, yygotominor.yy65, &yymsp[-2].minor.yy0); - } - break; -- case 137: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */ -+ case 138: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */ - { -- yygotominor.yy259 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy259,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy387,yymsp[-1].minor.yy314,yymsp[0].minor.yy384); -+ yygotominor.yy65 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy65,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy3,yymsp[-1].minor.yy132,yymsp[0].minor.yy408); - } - break; -- case 138: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ -+ case 139: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ - { -- if( yymsp[-6].minor.yy259==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy314==0 && yymsp[0].minor.yy384==0 ){ -- yygotominor.yy259 = yymsp[-4].minor.yy259; -- }else if( yymsp[-4].minor.yy259->nSrc==1 ){ -- yygotominor.yy259 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy259,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy314,yymsp[0].minor.yy384); -- if( yygotominor.yy259 ){ -- struct SrcList_item *pNew = &yygotominor.yy259->a[yygotominor.yy259->nSrc-1]; -- struct SrcList_item *pOld = yymsp[-4].minor.yy259->a; -+ if( yymsp[-6].minor.yy65==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy132==0 && yymsp[0].minor.yy408==0 ){ -+ yygotominor.yy65 = yymsp[-4].minor.yy65; -+ }else if( yymsp[-4].minor.yy65->nSrc==1 ){ -+ yygotominor.yy65 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy65,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy132,yymsp[0].minor.yy408); -+ if( yygotominor.yy65 ){ -+ struct SrcList_item *pNew = &yygotominor.yy65->a[yygotominor.yy65->nSrc-1]; -+ struct SrcList_item *pOld = yymsp[-4].minor.yy65->a; - pNew->zName = pOld->zName; - pNew->zDatabase = pOld->zDatabase; - pNew->pSelect = pOld->pSelect; - pOld->zName = pOld->zDatabase = 0; - pOld->pSelect = 0; - } -- sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy259); -+ sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy65); - }else{ - Select *pSubquery; -- sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy259); -- pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy259,0,0,0,0,SF_NestedFrom,0,0); -- yygotominor.yy259 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy259,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy314,yymsp[0].minor.yy384); -+ sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy65); -+ pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy65,0,0,0,0,SF_NestedFrom,0,0); -+ yygotominor.yy65 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy65,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy132,yymsp[0].minor.yy408); - } - } - break; -- case 139: /* dbnm ::= */ -- case 148: /* indexed_opt ::= */ yytestcase(yyruleno==148); -+ case 140: /* dbnm ::= */ -+ case 149: /* indexed_opt ::= */ yytestcase(yyruleno==149); - {yygotominor.yy0.z=0; yygotominor.yy0.n=0;} - break; -- case 141: /* fullname ::= nm dbnm */ --{yygotominor.yy259 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);} -+ case 142: /* fullname ::= nm dbnm */ -+{yygotominor.yy65 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);} - break; -- case 142: /* joinop ::= COMMA|JOIN */ --{ yygotominor.yy4 = JT_INNER; } -+ case 143: /* joinop ::= COMMA|JOIN */ -+{ yygotominor.yy328 = JT_INNER; } - break; -- case 143: /* joinop ::= JOIN_KW JOIN */ --{ yygotominor.yy4 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); } -+ case 144: /* joinop ::= JOIN_KW JOIN */ -+{ yygotominor.yy328 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); } - break; -- case 144: /* joinop ::= JOIN_KW nm JOIN */ --{ yygotominor.yy4 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); } -- break; -- case 145: /* joinop ::= JOIN_KW nm nm JOIN */ --{ yygotominor.yy4 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); } -- break; -- case 146: /* on_opt ::= ON expr */ -- case 163: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==163); -- case 170: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==170); -- case 236: /* case_else ::= ELSE expr */ yytestcase(yyruleno==236); -- case 238: /* case_operand ::= expr */ yytestcase(yyruleno==238); --{yygotominor.yy314 = yymsp[0].minor.yy118.pExpr;} -- break; -- case 147: /* on_opt ::= */ -- case 162: /* having_opt ::= */ yytestcase(yyruleno==162); -- case 169: /* where_opt ::= */ yytestcase(yyruleno==169); -- case 237: /* case_else ::= */ yytestcase(yyruleno==237); -- case 239: /* case_operand ::= */ yytestcase(yyruleno==239); --{yygotominor.yy314 = 0;} -+ case 145: /* joinop ::= JOIN_KW nm JOIN */ -+{ yygotominor.yy328 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); } -+ break; -+ case 146: /* joinop ::= JOIN_KW nm nm JOIN */ -+{ yygotominor.yy328 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); } -+ break; -+ case 147: /* on_opt ::= ON expr */ -+ case 164: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==164); -+ case 171: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==171); -+ case 231: /* case_else ::= ELSE expr */ yytestcase(yyruleno==231); -+ case 233: /* case_operand ::= expr */ yytestcase(yyruleno==233); -+{yygotominor.yy132 = yymsp[0].minor.yy346.pExpr;} -+ break; -+ case 148: /* on_opt ::= */ -+ case 163: /* having_opt ::= */ yytestcase(yyruleno==163); -+ case 170: /* where_opt ::= */ yytestcase(yyruleno==170); -+ case 232: /* case_else ::= */ yytestcase(yyruleno==232); -+ case 234: /* case_operand ::= */ yytestcase(yyruleno==234); -+{yygotominor.yy132 = 0;} - break; -- case 150: /* indexed_opt ::= NOT INDEXED */ -+ case 151: /* indexed_opt ::= NOT INDEXED */ - {yygotominor.yy0.z=0; yygotominor.yy0.n=1;} - break; -- case 151: /* using_opt ::= USING LP idlist RP */ -- case 182: /* inscollist_opt ::= LP idlist RP */ yytestcase(yyruleno==182); --{yygotominor.yy384 = yymsp[-1].minor.yy384;} -- break; -- case 152: /* using_opt ::= */ -- case 181: /* inscollist_opt ::= */ yytestcase(yyruleno==181); --{yygotominor.yy384 = 0;} -- break; -- case 154: /* orderby_opt ::= ORDER BY sortlist */ -- case 161: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==161); -- case 240: /* exprlist ::= nexprlist */ yytestcase(yyruleno==240); --{yygotominor.yy322 = yymsp[0].minor.yy322;} -+ case 152: /* using_opt ::= USING LP idlist RP */ -+ case 180: /* inscollist_opt ::= LP idlist RP */ yytestcase(yyruleno==180); -+{yygotominor.yy408 = yymsp[-1].minor.yy408;} -+ break; -+ case 153: /* using_opt ::= */ -+ case 179: /* inscollist_opt ::= */ yytestcase(yyruleno==179); -+{yygotominor.yy408 = 0;} -+ break; -+ case 155: /* orderby_opt ::= ORDER BY sortlist */ -+ case 162: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==162); -+ case 235: /* exprlist ::= nexprlist */ yytestcase(yyruleno==235); -+{yygotominor.yy14 = yymsp[0].minor.yy14;} - break; -- case 155: /* sortlist ::= sortlist COMMA expr sortorder */ -+ case 156: /* sortlist ::= sortlist COMMA expr sortorder */ - { -- yygotominor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy322,yymsp[-1].minor.yy118.pExpr); -- if( yygotominor.yy322 ) yygotominor.yy322->a[yygotominor.yy322->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy4; -+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy14,yymsp[-1].minor.yy346.pExpr); -+ if( yygotominor.yy14 ) yygotominor.yy14->a[yygotominor.yy14->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy328; - } - break; -- case 156: /* sortlist ::= expr sortorder */ -+ case 157: /* sortlist ::= expr sortorder */ - { -- yygotominor.yy322 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy118.pExpr); -- if( yygotominor.yy322 && ALWAYS(yygotominor.yy322->a) ) yygotominor.yy322->a[0].sortOrder = (u8)yymsp[0].minor.yy4; -+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy346.pExpr); -+ if( yygotominor.yy14 && ALWAYS(yygotominor.yy14->a) ) yygotominor.yy14->a[0].sortOrder = (u8)yymsp[0].minor.yy328; - } - break; -- case 157: /* sortorder ::= ASC */ -- case 159: /* sortorder ::= */ yytestcase(yyruleno==159); --{yygotominor.yy4 = SQLITE_SO_ASC;} -+ case 158: /* sortorder ::= ASC */ -+ case 160: /* sortorder ::= */ yytestcase(yyruleno==160); -+{yygotominor.yy328 = SQLITE_SO_ASC;} - break; -- case 158: /* sortorder ::= DESC */ --{yygotominor.yy4 = SQLITE_SO_DESC;} -+ case 159: /* sortorder ::= DESC */ -+{yygotominor.yy328 = SQLITE_SO_DESC;} - break; -- case 164: /* limit_opt ::= */ --{yygotominor.yy292.pLimit = 0; yygotominor.yy292.pOffset = 0;} -+ case 165: /* limit_opt ::= */ -+{yygotominor.yy476.pLimit = 0; yygotominor.yy476.pOffset = 0;} - break; -- case 165: /* limit_opt ::= LIMIT expr */ --{yygotominor.yy292.pLimit = yymsp[0].minor.yy118.pExpr; yygotominor.yy292.pOffset = 0;} -+ case 166: /* limit_opt ::= LIMIT expr */ -+{yygotominor.yy476.pLimit = yymsp[0].minor.yy346.pExpr; yygotominor.yy476.pOffset = 0;} - break; -- case 166: /* limit_opt ::= LIMIT expr OFFSET expr */ --{yygotominor.yy292.pLimit = yymsp[-2].minor.yy118.pExpr; yygotominor.yy292.pOffset = yymsp[0].minor.yy118.pExpr;} -+ case 167: /* limit_opt ::= LIMIT expr OFFSET expr */ -+{yygotominor.yy476.pLimit = yymsp[-2].minor.yy346.pExpr; yygotominor.yy476.pOffset = yymsp[0].minor.yy346.pExpr;} - break; -- case 167: /* limit_opt ::= LIMIT expr COMMA expr */ --{yygotominor.yy292.pOffset = yymsp[-2].minor.yy118.pExpr; yygotominor.yy292.pLimit = yymsp[0].minor.yy118.pExpr;} -+ case 168: /* limit_opt ::= LIMIT expr COMMA expr */ -+{yygotominor.yy476.pOffset = yymsp[-2].minor.yy346.pExpr; yygotominor.yy476.pLimit = yymsp[0].minor.yy346.pExpr;} - break; -- case 168: /* cmd ::= DELETE FROM fullname indexed_opt where_opt */ -+ case 169: /* cmd ::= with DELETE FROM fullname indexed_opt where_opt */ - { -- sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy259, &yymsp[-1].minor.yy0); -- sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy259,yymsp[0].minor.yy314); -+ sqlite3WithPush(pParse, yymsp[-5].minor.yy59, 1); -+ sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy65, &yymsp[-1].minor.yy0); -+ sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy65,yymsp[0].minor.yy132); - } - break; -- case 171: /* cmd ::= UPDATE orconf fullname indexed_opt SET setlist where_opt */ -+ case 172: /* cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt */ - { -- sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy259, &yymsp[-3].minor.yy0); -- sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy322,"set list"); -- sqlite3Update(pParse,yymsp[-4].minor.yy259,yymsp[-1].minor.yy322,yymsp[0].minor.yy314,yymsp[-5].minor.yy210); -+ sqlite3WithPush(pParse, yymsp[-7].minor.yy59, 1); -+ sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy65, &yymsp[-3].minor.yy0); -+ sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy14,"set list"); -+ sqlite3Update(pParse,yymsp[-4].minor.yy65,yymsp[-1].minor.yy14,yymsp[0].minor.yy132,yymsp[-5].minor.yy186); - } - break; -- case 172: /* setlist ::= setlist COMMA nm EQ expr */ -+ case 173: /* setlist ::= setlist COMMA nm EQ expr */ - { -- yygotominor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy322, yymsp[0].minor.yy118.pExpr); -- sqlite3ExprListSetName(pParse, yygotominor.yy322, &yymsp[-2].minor.yy0, 1); -+ yygotominor.yy14 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy14, yymsp[0].minor.yy346.pExpr); -+ sqlite3ExprListSetName(pParse, yygotominor.yy14, &yymsp[-2].minor.yy0, 1); - } - break; -- case 173: /* setlist ::= nm EQ expr */ -+ case 174: /* setlist ::= nm EQ expr */ - { -- yygotominor.yy322 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy118.pExpr); -- sqlite3ExprListSetName(pParse, yygotominor.yy322, &yymsp[-2].minor.yy0, 1); -+ yygotominor.yy14 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy346.pExpr); -+ sqlite3ExprListSetName(pParse, yygotominor.yy14, &yymsp[-2].minor.yy0, 1); - } - break; -- case 174: /* cmd ::= insert_cmd INTO fullname inscollist_opt valuelist */ --{sqlite3Insert(pParse, yymsp[-2].minor.yy259, yymsp[0].minor.yy260.pList, yymsp[0].minor.yy260.pSelect, yymsp[-1].minor.yy384, yymsp[-4].minor.yy210);} -- break; -- case 175: /* cmd ::= insert_cmd INTO fullname inscollist_opt select */ --{sqlite3Insert(pParse, yymsp[-2].minor.yy259, 0, yymsp[0].minor.yy387, yymsp[-1].minor.yy384, yymsp[-4].minor.yy210);} -- break; -- case 176: /* cmd ::= insert_cmd INTO fullname inscollist_opt DEFAULT VALUES */ --{sqlite3Insert(pParse, yymsp[-3].minor.yy259, 0, 0, yymsp[-2].minor.yy384, yymsp[-5].minor.yy210);} -- break; -- case 177: /* insert_cmd ::= INSERT orconf */ --{yygotominor.yy210 = yymsp[0].minor.yy210;} -- break; -- case 178: /* insert_cmd ::= REPLACE */ --{yygotominor.yy210 = OE_Replace;} -- break; -- case 179: /* valuelist ::= VALUES LP nexprlist RP */ -+ case 175: /* cmd ::= with insert_cmd INTO fullname inscollist_opt select */ - { -- yygotominor.yy260.pList = yymsp[-1].minor.yy322; -- yygotominor.yy260.pSelect = 0; -+ sqlite3WithPush(pParse, yymsp[-5].minor.yy59, 1); -+ sqlite3Insert(pParse, yymsp[-2].minor.yy65, yymsp[0].minor.yy3, yymsp[-1].minor.yy408, yymsp[-4].minor.yy186); - } - break; -- case 180: /* valuelist ::= valuelist COMMA LP exprlist RP */ -+ case 176: /* cmd ::= with insert_cmd INTO fullname inscollist_opt DEFAULT VALUES */ - { -- Select *pRight = sqlite3SelectNew(pParse, yymsp[-1].minor.yy322, 0, 0, 0, 0, 0, 0, 0, 0); -- if( yymsp[-4].minor.yy260.pList ){ -- yymsp[-4].minor.yy260.pSelect = sqlite3SelectNew(pParse, yymsp[-4].minor.yy260.pList, 0, 0, 0, 0, 0, 0, 0, 0); -- yymsp[-4].minor.yy260.pList = 0; -- } -- yygotominor.yy260.pList = 0; -- if( yymsp[-4].minor.yy260.pSelect==0 || pRight==0 ){ -- sqlite3SelectDelete(pParse->db, pRight); -- sqlite3SelectDelete(pParse->db, yymsp[-4].minor.yy260.pSelect); -- yygotominor.yy260.pSelect = 0; -- }else{ -- pRight->op = TK_ALL; -- pRight->pPrior = yymsp[-4].minor.yy260.pSelect; -- pRight->selFlags |= SF_Values; -- pRight->pPrior->selFlags |= SF_Values; -- yygotominor.yy260.pSelect = pRight; -- } -+ sqlite3WithPush(pParse, yymsp[-6].minor.yy59, 1); -+ sqlite3Insert(pParse, yymsp[-3].minor.yy65, 0, yymsp[-2].minor.yy408, yymsp[-5].minor.yy186); - } - break; -- case 183: /* idlist ::= idlist COMMA nm */ --{yygotominor.yy384 = sqlite3IdListAppend(pParse->db,yymsp[-2].minor.yy384,&yymsp[0].minor.yy0);} -+ case 177: /* insert_cmd ::= INSERT orconf */ -+{yygotominor.yy186 = yymsp[0].minor.yy186;} -+ break; -+ case 178: /* insert_cmd ::= REPLACE */ -+{yygotominor.yy186 = OE_Replace;} -+ break; -+ case 181: /* idlist ::= idlist COMMA nm */ -+{yygotominor.yy408 = sqlite3IdListAppend(pParse->db,yymsp[-2].minor.yy408,&yymsp[0].minor.yy0);} - break; -- case 184: /* idlist ::= nm */ --{yygotominor.yy384 = sqlite3IdListAppend(pParse->db,0,&yymsp[0].minor.yy0);} -+ case 182: /* idlist ::= nm */ -+{yygotominor.yy408 = sqlite3IdListAppend(pParse->db,0,&yymsp[0].minor.yy0);} - break; -- case 185: /* expr ::= term */ --{yygotominor.yy118 = yymsp[0].minor.yy118;} -+ case 183: /* expr ::= term */ -+{yygotominor.yy346 = yymsp[0].minor.yy346;} - break; -- case 186: /* expr ::= LP expr RP */ --{yygotominor.yy118.pExpr = yymsp[-1].minor.yy118.pExpr; spanSet(&yygotominor.yy118,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0);} -+ case 184: /* expr ::= LP expr RP */ -+{yygotominor.yy346.pExpr = yymsp[-1].minor.yy346.pExpr; spanSet(&yygotominor.yy346,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0);} - break; -- case 187: /* term ::= NULL */ -- case 192: /* term ::= INTEGER|FLOAT|BLOB */ yytestcase(yyruleno==192); -- case 193: /* term ::= STRING */ yytestcase(yyruleno==193); --{spanExpr(&yygotominor.yy118, pParse, yymsp[0].major, &yymsp[0].minor.yy0);} -+ case 185: /* term ::= NULL */ -+ case 190: /* term ::= INTEGER|FLOAT|BLOB */ yytestcase(yyruleno==190); -+ case 191: /* term ::= STRING */ yytestcase(yyruleno==191); -+{spanExpr(&yygotominor.yy346, pParse, yymsp[0].major, &yymsp[0].minor.yy0);} - break; -- case 188: /* expr ::= id */ -- case 189: /* expr ::= JOIN_KW */ yytestcase(yyruleno==189); --{spanExpr(&yygotominor.yy118, pParse, TK_ID, &yymsp[0].minor.yy0);} -+ case 186: /* expr ::= ID|INDEXED */ -+ case 187: /* expr ::= JOIN_KW */ yytestcase(yyruleno==187); -+{spanExpr(&yygotominor.yy346, pParse, TK_ID, &yymsp[0].minor.yy0);} - break; -- case 190: /* expr ::= nm DOT nm */ -+ case 188: /* expr ::= nm DOT nm */ - { - Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy0); - Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[0].minor.yy0); -- yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0); -- spanSet(&yygotominor.yy118,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); -+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0); -+ spanSet(&yygotominor.yy346,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); - } - break; -- case 191: /* expr ::= nm DOT nm DOT nm */ -+ case 189: /* expr ::= nm DOT nm DOT nm */ - { - Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-4].minor.yy0); - Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy0); - Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[0].minor.yy0); - Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0); -- yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0); -- spanSet(&yygotominor.yy118,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0); -+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0); -+ spanSet(&yygotominor.yy346,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0); - } - break; -- case 194: /* expr ::= REGISTER */ -+ case 192: /* expr ::= VARIABLE */ - { -- /* When doing a nested parse, one can include terms in an expression -- ** that look like this: #1 #2 ... These terms refer to registers -- ** in the virtual machine. #N is the N-th register. */ -- if( pParse->nested==0 ){ -- sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &yymsp[0].minor.yy0); -- yygotominor.yy118.pExpr = 0; -+ if( yymsp[0].minor.yy0.n>=2 && yymsp[0].minor.yy0.z[0]=='#' && sqlite3Isdigit(yymsp[0].minor.yy0.z[1]) ){ -+ /* When doing a nested parse, one can include terms in an expression -+ ** that look like this: #1 #2 ... These terms refer to registers -+ ** in the virtual machine. #N is the N-th register. */ -+ if( pParse->nested==0 ){ -+ sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &yymsp[0].minor.yy0); -+ yygotominor.yy346.pExpr = 0; -+ }else{ -+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &yymsp[0].minor.yy0); -+ if( yygotominor.yy346.pExpr ) sqlite3GetInt32(&yymsp[0].minor.yy0.z[1], &yygotominor.yy346.pExpr->iTable); -+ } - }else{ -- yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &yymsp[0].minor.yy0); -- if( yygotominor.yy118.pExpr ) sqlite3GetInt32(&yymsp[0].minor.yy0.z[1], &yygotominor.yy118.pExpr->iTable); -+ spanExpr(&yygotominor.yy346, pParse, TK_VARIABLE, &yymsp[0].minor.yy0); -+ sqlite3ExprAssignVarNumber(pParse, yygotominor.yy346.pExpr); - } -- spanSet(&yygotominor.yy118, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0); --} -- break; -- case 195: /* expr ::= VARIABLE */ --{ -- spanExpr(&yygotominor.yy118, pParse, TK_VARIABLE, &yymsp[0].minor.yy0); -- sqlite3ExprAssignVarNumber(pParse, yygotominor.yy118.pExpr); -- spanSet(&yygotominor.yy118, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0); -+ spanSet(&yygotominor.yy346, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0); - } - break; -- case 196: /* expr ::= expr COLLATE ids */ -+ case 193: /* expr ::= expr COLLATE ID|STRING */ - { -- yygotominor.yy118.pExpr = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy118.pExpr, &yymsp[0].minor.yy0); -- yygotominor.yy118.zStart = yymsp[-2].minor.yy118.zStart; -- yygotominor.yy118.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; -+ yygotominor.yy346.pExpr = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy346.pExpr, &yymsp[0].minor.yy0); -+ yygotominor.yy346.zStart = yymsp[-2].minor.yy346.zStart; -+ yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; - } - break; -- case 197: /* expr ::= CAST LP expr AS typetoken RP */ -+ case 194: /* expr ::= CAST LP expr AS typetoken RP */ - { -- yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_CAST, yymsp[-3].minor.yy118.pExpr, 0, &yymsp[-1].minor.yy0); -- spanSet(&yygotominor.yy118,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0); -+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_CAST, yymsp[-3].minor.yy346.pExpr, 0, &yymsp[-1].minor.yy0); -+ spanSet(&yygotominor.yy346,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0); - } - break; -- case 198: /* expr ::= ID LP distinct exprlist RP */ -+ case 195: /* expr ::= ID|INDEXED LP distinct exprlist RP */ - { -- if( yymsp[-1].minor.yy322 && yymsp[-1].minor.yy322->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ -+ if( yymsp[-1].minor.yy14 && yymsp[-1].minor.yy14->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ - sqlite3ErrorMsg(pParse, "too many arguments on function %T", &yymsp[-4].minor.yy0); - } -- yygotominor.yy118.pExpr = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy322, &yymsp[-4].minor.yy0); -- spanSet(&yygotominor.yy118,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0); -- if( yymsp[-2].minor.yy177 && yygotominor.yy118.pExpr ){ -- yygotominor.yy118.pExpr->flags |= EP_Distinct; -+ yygotominor.yy346.pExpr = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy14, &yymsp[-4].minor.yy0); -+ spanSet(&yygotominor.yy346,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0); -+ if( yymsp[-2].minor.yy381 && yygotominor.yy346.pExpr ){ -+ yygotominor.yy346.pExpr->flags |= EP_Distinct; - } - } - break; -- case 199: /* expr ::= ID LP STAR RP */ -+ case 196: /* expr ::= ID|INDEXED LP STAR RP */ - { -- yygotominor.yy118.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0); -- spanSet(&yygotominor.yy118,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); -+ yygotominor.yy346.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0); -+ spanSet(&yygotominor.yy346,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); - } - break; -- case 200: /* term ::= CTIME_KW */ -+ case 197: /* term ::= CTIME_KW */ - { -- yygotominor.yy118.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0); -- spanSet(&yygotominor.yy118, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0); -+ yygotominor.yy346.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0); -+ spanSet(&yygotominor.yy346, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0); - } - break; -- case 201: /* expr ::= expr AND expr */ -- case 202: /* expr ::= expr OR expr */ yytestcase(yyruleno==202); -- case 203: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==203); -- case 204: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==204); -- case 205: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==205); -- case 206: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==206); -- case 207: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==207); -- case 208: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==208); --{spanBinaryExpr(&yygotominor.yy118,pParse,yymsp[-1].major,&yymsp[-2].minor.yy118,&yymsp[0].minor.yy118);} -- break; -- case 209: /* likeop ::= LIKE_KW */ -- case 211: /* likeop ::= MATCH */ yytestcase(yyruleno==211); --{yygotominor.yy342.eOperator = yymsp[0].minor.yy0; yygotominor.yy342.bNot = 0;} -- break; -- case 210: /* likeop ::= NOT LIKE_KW */ -- case 212: /* likeop ::= NOT MATCH */ yytestcase(yyruleno==212); --{yygotominor.yy342.eOperator = yymsp[0].minor.yy0; yygotominor.yy342.bNot = 1;} -+ case 198: /* expr ::= expr AND expr */ -+ case 199: /* expr ::= expr OR expr */ yytestcase(yyruleno==199); -+ case 200: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==200); -+ case 201: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==201); -+ case 202: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==202); -+ case 203: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==203); -+ case 204: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==204); -+ case 205: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==205); -+{spanBinaryExpr(&yygotominor.yy346,pParse,yymsp[-1].major,&yymsp[-2].minor.yy346,&yymsp[0].minor.yy346);} - break; -- case 213: /* expr ::= expr likeop expr */ -+ case 206: /* likeop ::= LIKE_KW|MATCH */ -+{yygotominor.yy96.eOperator = yymsp[0].minor.yy0; yygotominor.yy96.bNot = 0;} -+ break; -+ case 207: /* likeop ::= NOT LIKE_KW|MATCH */ -+{yygotominor.yy96.eOperator = yymsp[0].minor.yy0; yygotominor.yy96.bNot = 1;} -+ break; -+ case 208: /* expr ::= expr likeop expr */ - { - ExprList *pList; -- pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy118.pExpr); -- pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy118.pExpr); -- yygotominor.yy118.pExpr = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy342.eOperator); -- if( yymsp[-1].minor.yy342.bNot ) yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy118.pExpr, 0, 0); -- yygotominor.yy118.zStart = yymsp[-2].minor.yy118.zStart; -- yygotominor.yy118.zEnd = yymsp[0].minor.yy118.zEnd; -- if( yygotominor.yy118.pExpr ) yygotominor.yy118.pExpr->flags |= EP_InfixFunc; -+ pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy346.pExpr); -+ pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy346.pExpr); -+ yygotominor.yy346.pExpr = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy96.eOperator); -+ if( yymsp[-1].minor.yy96.bNot ) yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy346.pExpr, 0, 0); -+ yygotominor.yy346.zStart = yymsp[-2].minor.yy346.zStart; -+ yygotominor.yy346.zEnd = yymsp[0].minor.yy346.zEnd; -+ if( yygotominor.yy346.pExpr ) yygotominor.yy346.pExpr->flags |= EP_InfixFunc; - } - break; -- case 214: /* expr ::= expr likeop expr ESCAPE expr */ -+ case 209: /* expr ::= expr likeop expr ESCAPE expr */ - { - ExprList *pList; -- pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy118.pExpr); -- pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy118.pExpr); -- pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy118.pExpr); -- yygotominor.yy118.pExpr = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy342.eOperator); -- if( yymsp[-3].minor.yy342.bNot ) yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy118.pExpr, 0, 0); -- yygotominor.yy118.zStart = yymsp[-4].minor.yy118.zStart; -- yygotominor.yy118.zEnd = yymsp[0].minor.yy118.zEnd; -- if( yygotominor.yy118.pExpr ) yygotominor.yy118.pExpr->flags |= EP_InfixFunc; -+ pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy346.pExpr); -+ pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy346.pExpr); -+ pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy346.pExpr); -+ yygotominor.yy346.pExpr = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy96.eOperator); -+ if( yymsp[-3].minor.yy96.bNot ) yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy346.pExpr, 0, 0); -+ yygotominor.yy346.zStart = yymsp[-4].minor.yy346.zStart; -+ yygotominor.yy346.zEnd = yymsp[0].minor.yy346.zEnd; -+ if( yygotominor.yy346.pExpr ) yygotominor.yy346.pExpr->flags |= EP_InfixFunc; - } - break; -- case 215: /* expr ::= expr ISNULL|NOTNULL */ --{spanUnaryPostfix(&yygotominor.yy118,pParse,yymsp[0].major,&yymsp[-1].minor.yy118,&yymsp[0].minor.yy0);} -+ case 210: /* expr ::= expr ISNULL|NOTNULL */ -+{spanUnaryPostfix(&yygotominor.yy346,pParse,yymsp[0].major,&yymsp[-1].minor.yy346,&yymsp[0].minor.yy0);} - break; -- case 216: /* expr ::= expr NOT NULL */ --{spanUnaryPostfix(&yygotominor.yy118,pParse,TK_NOTNULL,&yymsp[-2].minor.yy118,&yymsp[0].minor.yy0);} -+ case 211: /* expr ::= expr NOT NULL */ -+{spanUnaryPostfix(&yygotominor.yy346,pParse,TK_NOTNULL,&yymsp[-2].minor.yy346,&yymsp[0].minor.yy0);} - break; -- case 217: /* expr ::= expr IS expr */ -+ case 212: /* expr ::= expr IS expr */ - { -- spanBinaryExpr(&yygotominor.yy118,pParse,TK_IS,&yymsp[-2].minor.yy118,&yymsp[0].minor.yy118); -- binaryToUnaryIfNull(pParse, yymsp[0].minor.yy118.pExpr, yygotominor.yy118.pExpr, TK_ISNULL); -+ spanBinaryExpr(&yygotominor.yy346,pParse,TK_IS,&yymsp[-2].minor.yy346,&yymsp[0].minor.yy346); -+ binaryToUnaryIfNull(pParse, yymsp[0].minor.yy346.pExpr, yygotominor.yy346.pExpr, TK_ISNULL); - } - break; -- case 218: /* expr ::= expr IS NOT expr */ -+ case 213: /* expr ::= expr IS NOT expr */ - { -- spanBinaryExpr(&yygotominor.yy118,pParse,TK_ISNOT,&yymsp[-3].minor.yy118,&yymsp[0].minor.yy118); -- binaryToUnaryIfNull(pParse, yymsp[0].minor.yy118.pExpr, yygotominor.yy118.pExpr, TK_NOTNULL); -+ spanBinaryExpr(&yygotominor.yy346,pParse,TK_ISNOT,&yymsp[-3].minor.yy346,&yymsp[0].minor.yy346); -+ binaryToUnaryIfNull(pParse, yymsp[0].minor.yy346.pExpr, yygotominor.yy346.pExpr, TK_NOTNULL); - } - break; -- case 219: /* expr ::= NOT expr */ -- case 220: /* expr ::= BITNOT expr */ yytestcase(yyruleno==220); --{spanUnaryPrefix(&yygotominor.yy118,pParse,yymsp[-1].major,&yymsp[0].minor.yy118,&yymsp[-1].minor.yy0);} -+ case 214: /* expr ::= NOT expr */ -+ case 215: /* expr ::= BITNOT expr */ yytestcase(yyruleno==215); -+{spanUnaryPrefix(&yygotominor.yy346,pParse,yymsp[-1].major,&yymsp[0].minor.yy346,&yymsp[-1].minor.yy0);} - break; -- case 221: /* expr ::= MINUS expr */ --{spanUnaryPrefix(&yygotominor.yy118,pParse,TK_UMINUS,&yymsp[0].minor.yy118,&yymsp[-1].minor.yy0);} -+ case 216: /* expr ::= MINUS expr */ -+{spanUnaryPrefix(&yygotominor.yy346,pParse,TK_UMINUS,&yymsp[0].minor.yy346,&yymsp[-1].minor.yy0);} - break; -- case 222: /* expr ::= PLUS expr */ --{spanUnaryPrefix(&yygotominor.yy118,pParse,TK_UPLUS,&yymsp[0].minor.yy118,&yymsp[-1].minor.yy0);} -+ case 217: /* expr ::= PLUS expr */ -+{spanUnaryPrefix(&yygotominor.yy346,pParse,TK_UPLUS,&yymsp[0].minor.yy346,&yymsp[-1].minor.yy0);} - break; -- case 225: /* expr ::= expr between_op expr AND expr */ -+ case 220: /* expr ::= expr between_op expr AND expr */ - { -- ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy118.pExpr); -- pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy118.pExpr); -- yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy118.pExpr, 0, 0); -- if( yygotominor.yy118.pExpr ){ -- yygotominor.yy118.pExpr->x.pList = pList; -+ ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy346.pExpr); -+ pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy346.pExpr); -+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy346.pExpr, 0, 0); -+ if( yygotominor.yy346.pExpr ){ -+ yygotominor.yy346.pExpr->x.pList = pList; - }else{ - sqlite3ExprListDelete(pParse->db, pList); - } -- if( yymsp[-3].minor.yy4 ) yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy118.pExpr, 0, 0); -- yygotominor.yy118.zStart = yymsp[-4].minor.yy118.zStart; -- yygotominor.yy118.zEnd = yymsp[0].minor.yy118.zEnd; -+ if( yymsp[-3].minor.yy328 ) yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy346.pExpr, 0, 0); -+ yygotominor.yy346.zStart = yymsp[-4].minor.yy346.zStart; -+ yygotominor.yy346.zEnd = yymsp[0].minor.yy346.zEnd; - } - break; -- case 228: /* expr ::= expr in_op LP exprlist RP */ -+ case 223: /* expr ::= expr in_op LP exprlist RP */ - { -- if( yymsp[-1].minor.yy322==0 ){ -+ if( yymsp[-1].minor.yy14==0 ){ - /* Expressions of the form - ** - ** expr1 IN () -@@ -117185,225 +118150,225 @@ static void yy_reduce( - ** simplify to constants 0 (false) and 1 (true), respectively, - ** regardless of the value of expr1. - */ -- yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &sqlite3IntTokens[yymsp[-3].minor.yy4]); -- sqlite3ExprDelete(pParse->db, yymsp[-4].minor.yy118.pExpr); -+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &sqlite3IntTokens[yymsp[-3].minor.yy328]); -+ sqlite3ExprDelete(pParse->db, yymsp[-4].minor.yy346.pExpr); - }else{ -- yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy118.pExpr, 0, 0); -- if( yygotominor.yy118.pExpr ){ -- yygotominor.yy118.pExpr->x.pList = yymsp[-1].minor.yy322; -- sqlite3ExprSetHeight(pParse, yygotominor.yy118.pExpr); -+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy346.pExpr, 0, 0); -+ if( yygotominor.yy346.pExpr ){ -+ yygotominor.yy346.pExpr->x.pList = yymsp[-1].minor.yy14; -+ sqlite3ExprSetHeight(pParse, yygotominor.yy346.pExpr); - }else{ -- sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy322); -+ sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy14); - } -- if( yymsp[-3].minor.yy4 ) yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy118.pExpr, 0, 0); -+ if( yymsp[-3].minor.yy328 ) yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy346.pExpr, 0, 0); - } -- yygotominor.yy118.zStart = yymsp[-4].minor.yy118.zStart; -- yygotominor.yy118.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; -+ yygotominor.yy346.zStart = yymsp[-4].minor.yy346.zStart; -+ yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; - } - break; -- case 229: /* expr ::= LP select RP */ -+ case 224: /* expr ::= LP select RP */ - { -- yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0); -- if( yygotominor.yy118.pExpr ){ -- yygotominor.yy118.pExpr->x.pSelect = yymsp[-1].minor.yy387; -- ExprSetProperty(yygotominor.yy118.pExpr, EP_xIsSelect); -- sqlite3ExprSetHeight(pParse, yygotominor.yy118.pExpr); -+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0); -+ if( yygotominor.yy346.pExpr ){ -+ yygotominor.yy346.pExpr->x.pSelect = yymsp[-1].minor.yy3; -+ ExprSetProperty(yygotominor.yy346.pExpr, EP_xIsSelect); -+ sqlite3ExprSetHeight(pParse, yygotominor.yy346.pExpr); - }else{ -- sqlite3SelectDelete(pParse->db, yymsp[-1].minor.yy387); -+ sqlite3SelectDelete(pParse->db, yymsp[-1].minor.yy3); - } -- yygotominor.yy118.zStart = yymsp[-2].minor.yy0.z; -- yygotominor.yy118.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; -+ yygotominor.yy346.zStart = yymsp[-2].minor.yy0.z; -+ yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; - } - break; -- case 230: /* expr ::= expr in_op LP select RP */ -+ case 225: /* expr ::= expr in_op LP select RP */ - { -- yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy118.pExpr, 0, 0); -- if( yygotominor.yy118.pExpr ){ -- yygotominor.yy118.pExpr->x.pSelect = yymsp[-1].minor.yy387; -- ExprSetProperty(yygotominor.yy118.pExpr, EP_xIsSelect); -- sqlite3ExprSetHeight(pParse, yygotominor.yy118.pExpr); -+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy346.pExpr, 0, 0); -+ if( yygotominor.yy346.pExpr ){ -+ yygotominor.yy346.pExpr->x.pSelect = yymsp[-1].minor.yy3; -+ ExprSetProperty(yygotominor.yy346.pExpr, EP_xIsSelect); -+ sqlite3ExprSetHeight(pParse, yygotominor.yy346.pExpr); - }else{ -- sqlite3SelectDelete(pParse->db, yymsp[-1].minor.yy387); -+ sqlite3SelectDelete(pParse->db, yymsp[-1].minor.yy3); - } -- if( yymsp[-3].minor.yy4 ) yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy118.pExpr, 0, 0); -- yygotominor.yy118.zStart = yymsp[-4].minor.yy118.zStart; -- yygotominor.yy118.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; -+ if( yymsp[-3].minor.yy328 ) yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy346.pExpr, 0, 0); -+ yygotominor.yy346.zStart = yymsp[-4].minor.yy346.zStart; -+ yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; - } - break; -- case 231: /* expr ::= expr in_op nm dbnm */ -+ case 226: /* expr ::= expr in_op nm dbnm */ - { - SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0); -- yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-3].minor.yy118.pExpr, 0, 0); -- if( yygotominor.yy118.pExpr ){ -- yygotominor.yy118.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); -- ExprSetProperty(yygotominor.yy118.pExpr, EP_xIsSelect); -- sqlite3ExprSetHeight(pParse, yygotominor.yy118.pExpr); -+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-3].minor.yy346.pExpr, 0, 0); -+ if( yygotominor.yy346.pExpr ){ -+ yygotominor.yy346.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); -+ ExprSetProperty(yygotominor.yy346.pExpr, EP_xIsSelect); -+ sqlite3ExprSetHeight(pParse, yygotominor.yy346.pExpr); - }else{ - sqlite3SrcListDelete(pParse->db, pSrc); - } -- if( yymsp[-2].minor.yy4 ) yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy118.pExpr, 0, 0); -- yygotominor.yy118.zStart = yymsp[-3].minor.yy118.zStart; -- yygotominor.yy118.zEnd = yymsp[0].minor.yy0.z ? &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] : &yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]; -+ if( yymsp[-2].minor.yy328 ) yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy346.pExpr, 0, 0); -+ yygotominor.yy346.zStart = yymsp[-3].minor.yy346.zStart; -+ yygotominor.yy346.zEnd = yymsp[0].minor.yy0.z ? &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] : &yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]; - } - break; -- case 232: /* expr ::= EXISTS LP select RP */ -+ case 227: /* expr ::= EXISTS LP select RP */ - { -- Expr *p = yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0); -+ Expr *p = yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0); - if( p ){ -- p->x.pSelect = yymsp[-1].minor.yy387; -+ p->x.pSelect = yymsp[-1].minor.yy3; - ExprSetProperty(p, EP_xIsSelect); - sqlite3ExprSetHeight(pParse, p); - }else{ -- sqlite3SelectDelete(pParse->db, yymsp[-1].minor.yy387); -+ sqlite3SelectDelete(pParse->db, yymsp[-1].minor.yy3); - } -- yygotominor.yy118.zStart = yymsp[-3].minor.yy0.z; -- yygotominor.yy118.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; -+ yygotominor.yy346.zStart = yymsp[-3].minor.yy0.z; -+ yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; - } - break; -- case 233: /* expr ::= CASE case_operand case_exprlist case_else END */ -+ case 228: /* expr ::= CASE case_operand case_exprlist case_else END */ - { -- yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy314, 0, 0); -- if( yygotominor.yy118.pExpr ){ -- yygotominor.yy118.pExpr->x.pList = yymsp[-1].minor.yy314 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy322,yymsp[-1].minor.yy314) : yymsp[-2].minor.yy322; -- sqlite3ExprSetHeight(pParse, yygotominor.yy118.pExpr); -+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy132, 0, 0); -+ if( yygotominor.yy346.pExpr ){ -+ yygotominor.yy346.pExpr->x.pList = yymsp[-1].minor.yy132 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy14,yymsp[-1].minor.yy132) : yymsp[-2].minor.yy14; -+ sqlite3ExprSetHeight(pParse, yygotominor.yy346.pExpr); - }else{ -- sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy322); -- sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy314); -+ sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy14); -+ sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy132); - } -- yygotominor.yy118.zStart = yymsp[-4].minor.yy0.z; -- yygotominor.yy118.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; -+ yygotominor.yy346.zStart = yymsp[-4].minor.yy0.z; -+ yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; - } - break; -- case 234: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ -+ case 229: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ - { -- yygotominor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, yymsp[-2].minor.yy118.pExpr); -- yygotominor.yy322 = sqlite3ExprListAppend(pParse,yygotominor.yy322, yymsp[0].minor.yy118.pExpr); -+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy14, yymsp[-2].minor.yy346.pExpr); -+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,yygotominor.yy14, yymsp[0].minor.yy346.pExpr); - } - break; -- case 235: /* case_exprlist ::= WHEN expr THEN expr */ -+ case 230: /* case_exprlist ::= WHEN expr THEN expr */ - { -- yygotominor.yy322 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy118.pExpr); -- yygotominor.yy322 = sqlite3ExprListAppend(pParse,yygotominor.yy322, yymsp[0].minor.yy118.pExpr); -+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy346.pExpr); -+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,yygotominor.yy14, yymsp[0].minor.yy346.pExpr); - } - break; -- case 242: /* nexprlist ::= nexprlist COMMA expr */ --{yygotominor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy322,yymsp[0].minor.yy118.pExpr);} -+ case 237: /* nexprlist ::= nexprlist COMMA expr */ -+{yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy14,yymsp[0].minor.yy346.pExpr);} - break; -- case 243: /* nexprlist ::= expr */ --{yygotominor.yy322 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy118.pExpr);} -+ case 238: /* nexprlist ::= expr */ -+{yygotominor.yy14 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy346.pExpr);} - break; -- case 244: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP where_opt */ -+ case 239: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP where_opt */ - { - sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, -- sqlite3SrcListAppend(pParse->db,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy322, yymsp[-10].minor.yy4, -- &yymsp[-11].minor.yy0, yymsp[0].minor.yy314, SQLITE_SO_ASC, yymsp[-8].minor.yy4); -+ sqlite3SrcListAppend(pParse->db,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy14, yymsp[-10].minor.yy328, -+ &yymsp[-11].minor.yy0, yymsp[0].minor.yy132, SQLITE_SO_ASC, yymsp[-8].minor.yy328); - } - break; -- case 245: /* uniqueflag ::= UNIQUE */ -- case 298: /* raisetype ::= ABORT */ yytestcase(yyruleno==298); --{yygotominor.yy4 = OE_Abort;} -+ case 240: /* uniqueflag ::= UNIQUE */ -+ case 291: /* raisetype ::= ABORT */ yytestcase(yyruleno==291); -+{yygotominor.yy328 = OE_Abort;} - break; -- case 246: /* uniqueflag ::= */ --{yygotominor.yy4 = OE_None;} -+ case 241: /* uniqueflag ::= */ -+{yygotominor.yy328 = OE_None;} - break; -- case 249: /* idxlist ::= idxlist COMMA nm collate sortorder */ -+ case 244: /* idxlist ::= idxlist COMMA nm collate sortorder */ - { - Expr *p = sqlite3ExprAddCollateToken(pParse, 0, &yymsp[-1].minor.yy0); -- yygotominor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, p); -- sqlite3ExprListSetName(pParse,yygotominor.yy322,&yymsp[-2].minor.yy0,1); -- sqlite3ExprListCheckLength(pParse, yygotominor.yy322, "index"); -- if( yygotominor.yy322 ) yygotominor.yy322->a[yygotominor.yy322->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy4; -+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy14, p); -+ sqlite3ExprListSetName(pParse,yygotominor.yy14,&yymsp[-2].minor.yy0,1); -+ sqlite3ExprListCheckLength(pParse, yygotominor.yy14, "index"); -+ if( yygotominor.yy14 ) yygotominor.yy14->a[yygotominor.yy14->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy328; - } - break; -- case 250: /* idxlist ::= nm collate sortorder */ -+ case 245: /* idxlist ::= nm collate sortorder */ - { - Expr *p = sqlite3ExprAddCollateToken(pParse, 0, &yymsp[-1].minor.yy0); -- yygotominor.yy322 = sqlite3ExprListAppend(pParse,0, p); -- sqlite3ExprListSetName(pParse, yygotominor.yy322, &yymsp[-2].minor.yy0, 1); -- sqlite3ExprListCheckLength(pParse, yygotominor.yy322, "index"); -- if( yygotominor.yy322 ) yygotominor.yy322->a[yygotominor.yy322->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy4; -+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,0, p); -+ sqlite3ExprListSetName(pParse, yygotominor.yy14, &yymsp[-2].minor.yy0, 1); -+ sqlite3ExprListCheckLength(pParse, yygotominor.yy14, "index"); -+ if( yygotominor.yy14 ) yygotominor.yy14->a[yygotominor.yy14->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy328; - } - break; -- case 251: /* collate ::= */ -+ case 246: /* collate ::= */ - {yygotominor.yy0.z = 0; yygotominor.yy0.n = 0;} - break; -- case 253: /* cmd ::= DROP INDEX ifexists fullname */ --{sqlite3DropIndex(pParse, yymsp[0].minor.yy259, yymsp[-1].minor.yy4);} -+ case 248: /* cmd ::= DROP INDEX ifexists fullname */ -+{sqlite3DropIndex(pParse, yymsp[0].minor.yy65, yymsp[-1].minor.yy328);} - break; -- case 254: /* cmd ::= VACUUM */ -- case 255: /* cmd ::= VACUUM nm */ yytestcase(yyruleno==255); -+ case 249: /* cmd ::= VACUUM */ -+ case 250: /* cmd ::= VACUUM nm */ yytestcase(yyruleno==250); - {sqlite3Vacuum(pParse);} - break; -- case 256: /* cmd ::= PRAGMA nm dbnm */ -+ case 251: /* cmd ::= PRAGMA nm dbnm */ - {sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);} - break; -- case 257: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ -+ case 252: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ - {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);} - break; -- case 258: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ -+ case 253: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ - {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);} - break; -- case 259: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ -+ case 254: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ - {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);} - break; -- case 260: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ -+ case 255: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ - {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);} - break; -- case 270: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ -+ case 264: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ - { - Token all; - all.z = yymsp[-3].minor.yy0.z; - all.n = (int)(yymsp[0].minor.yy0.z - yymsp[-3].minor.yy0.z) + yymsp[0].minor.yy0.n; -- sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy203, &all); -+ sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy473, &all); - } - break; -- case 271: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ -+ case 265: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ - { -- sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy4, yymsp[-4].minor.yy90.a, yymsp[-4].minor.yy90.b, yymsp[-2].minor.yy259, yymsp[0].minor.yy314, yymsp[-10].minor.yy4, yymsp[-8].minor.yy4); -+ sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy328, yymsp[-4].minor.yy378.a, yymsp[-4].minor.yy378.b, yymsp[-2].minor.yy65, yymsp[0].minor.yy132, yymsp[-10].minor.yy328, yymsp[-8].minor.yy328); - yygotominor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); - } - break; -- case 272: /* trigger_time ::= BEFORE */ -- case 275: /* trigger_time ::= */ yytestcase(yyruleno==275); --{ yygotominor.yy4 = TK_BEFORE; } -+ case 266: /* trigger_time ::= BEFORE */ -+ case 269: /* trigger_time ::= */ yytestcase(yyruleno==269); -+{ yygotominor.yy328 = TK_BEFORE; } - break; -- case 273: /* trigger_time ::= AFTER */ --{ yygotominor.yy4 = TK_AFTER; } -+ case 267: /* trigger_time ::= AFTER */ -+{ yygotominor.yy328 = TK_AFTER; } - break; -- case 274: /* trigger_time ::= INSTEAD OF */ --{ yygotominor.yy4 = TK_INSTEAD;} -+ case 268: /* trigger_time ::= INSTEAD OF */ -+{ yygotominor.yy328 = TK_INSTEAD;} - break; -- case 276: /* trigger_event ::= DELETE|INSERT */ -- case 277: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==277); --{yygotominor.yy90.a = yymsp[0].major; yygotominor.yy90.b = 0;} -+ case 270: /* trigger_event ::= DELETE|INSERT */ -+ case 271: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==271); -+{yygotominor.yy378.a = yymsp[0].major; yygotominor.yy378.b = 0;} - break; -- case 278: /* trigger_event ::= UPDATE OF idlist */ --{yygotominor.yy90.a = TK_UPDATE; yygotominor.yy90.b = yymsp[0].minor.yy384;} -+ case 272: /* trigger_event ::= UPDATE OF idlist */ -+{yygotominor.yy378.a = TK_UPDATE; yygotominor.yy378.b = yymsp[0].minor.yy408;} - break; -- case 281: /* when_clause ::= */ -- case 303: /* key_opt ::= */ yytestcase(yyruleno==303); --{ yygotominor.yy314 = 0; } -+ case 275: /* when_clause ::= */ -+ case 296: /* key_opt ::= */ yytestcase(yyruleno==296); -+{ yygotominor.yy132 = 0; } - break; -- case 282: /* when_clause ::= WHEN expr */ -- case 304: /* key_opt ::= KEY expr */ yytestcase(yyruleno==304); --{ yygotominor.yy314 = yymsp[0].minor.yy118.pExpr; } -+ case 276: /* when_clause ::= WHEN expr */ -+ case 297: /* key_opt ::= KEY expr */ yytestcase(yyruleno==297); -+{ yygotominor.yy132 = yymsp[0].minor.yy346.pExpr; } - break; -- case 283: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ -+ case 277: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ - { -- assert( yymsp[-2].minor.yy203!=0 ); -- yymsp[-2].minor.yy203->pLast->pNext = yymsp[-1].minor.yy203; -- yymsp[-2].minor.yy203->pLast = yymsp[-1].minor.yy203; -- yygotominor.yy203 = yymsp[-2].minor.yy203; -+ assert( yymsp[-2].minor.yy473!=0 ); -+ yymsp[-2].minor.yy473->pLast->pNext = yymsp[-1].minor.yy473; -+ yymsp[-2].minor.yy473->pLast = yymsp[-1].minor.yy473; -+ yygotominor.yy473 = yymsp[-2].minor.yy473; - } - break; -- case 284: /* trigger_cmd_list ::= trigger_cmd SEMI */ -+ case 278: /* trigger_cmd_list ::= trigger_cmd SEMI */ - { -- assert( yymsp[-1].minor.yy203!=0 ); -- yymsp[-1].minor.yy203->pLast = yymsp[-1].minor.yy203; -- yygotominor.yy203 = yymsp[-1].minor.yy203; -+ assert( yymsp[-1].minor.yy473!=0 ); -+ yymsp[-1].minor.yy473->pLast = yymsp[-1].minor.yy473; -+ yygotominor.yy473 = yymsp[-1].minor.yy473; - } - break; -- case 286: /* trnm ::= nm DOT nm */ -+ case 280: /* trnm ::= nm DOT nm */ - { - yygotominor.yy0 = yymsp[0].minor.yy0; - sqlite3ErrorMsg(pParse, -@@ -117411,123 +118376,145 @@ static void yy_reduce( - "statements within triggers"); - } - break; -- case 288: /* tridxby ::= INDEXED BY nm */ -+ case 282: /* tridxby ::= INDEXED BY nm */ - { - sqlite3ErrorMsg(pParse, - "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " - "within triggers"); - } - break; -- case 289: /* tridxby ::= NOT INDEXED */ -+ case 283: /* tridxby ::= NOT INDEXED */ - { - sqlite3ErrorMsg(pParse, - "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " - "within triggers"); - } - break; -- case 290: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt */ --{ yygotominor.yy203 = sqlite3TriggerUpdateStep(pParse->db, &yymsp[-4].minor.yy0, yymsp[-1].minor.yy322, yymsp[0].minor.yy314, yymsp[-5].minor.yy210); } -- break; -- case 291: /* trigger_cmd ::= insert_cmd INTO trnm inscollist_opt valuelist */ --{yygotominor.yy203 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy384, yymsp[0].minor.yy260.pList, yymsp[0].minor.yy260.pSelect, yymsp[-4].minor.yy210);} -+ case 284: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt */ -+{ yygotominor.yy473 = sqlite3TriggerUpdateStep(pParse->db, &yymsp[-4].minor.yy0, yymsp[-1].minor.yy14, yymsp[0].minor.yy132, yymsp[-5].minor.yy186); } - break; -- case 292: /* trigger_cmd ::= insert_cmd INTO trnm inscollist_opt select */ --{yygotominor.yy203 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy384, 0, yymsp[0].minor.yy387, yymsp[-4].minor.yy210);} -+ case 285: /* trigger_cmd ::= insert_cmd INTO trnm inscollist_opt select */ -+{yygotominor.yy473 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy408, yymsp[0].minor.yy3, yymsp[-4].minor.yy186);} - break; -- case 293: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt */ --{yygotominor.yy203 = sqlite3TriggerDeleteStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[0].minor.yy314);} -+ case 286: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt */ -+{yygotominor.yy473 = sqlite3TriggerDeleteStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[0].minor.yy132);} - break; -- case 294: /* trigger_cmd ::= select */ --{yygotominor.yy203 = sqlite3TriggerSelectStep(pParse->db, yymsp[0].minor.yy387); } -+ case 287: /* trigger_cmd ::= select */ -+{yygotominor.yy473 = sqlite3TriggerSelectStep(pParse->db, yymsp[0].minor.yy3); } - break; -- case 295: /* expr ::= RAISE LP IGNORE RP */ -+ case 288: /* expr ::= RAISE LP IGNORE RP */ - { -- yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0); -- if( yygotominor.yy118.pExpr ){ -- yygotominor.yy118.pExpr->affinity = OE_Ignore; -+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0); -+ if( yygotominor.yy346.pExpr ){ -+ yygotominor.yy346.pExpr->affinity = OE_Ignore; - } -- yygotominor.yy118.zStart = yymsp[-3].minor.yy0.z; -- yygotominor.yy118.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; -+ yygotominor.yy346.zStart = yymsp[-3].minor.yy0.z; -+ yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; - } - break; -- case 296: /* expr ::= RAISE LP raisetype COMMA nm RP */ -+ case 289: /* expr ::= RAISE LP raisetype COMMA nm RP */ - { -- yygotominor.yy118.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &yymsp[-1].minor.yy0); -- if( yygotominor.yy118.pExpr ) { -- yygotominor.yy118.pExpr->affinity = (char)yymsp[-3].minor.yy4; -+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &yymsp[-1].minor.yy0); -+ if( yygotominor.yy346.pExpr ) { -+ yygotominor.yy346.pExpr->affinity = (char)yymsp[-3].minor.yy328; - } -- yygotominor.yy118.zStart = yymsp[-5].minor.yy0.z; -- yygotominor.yy118.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; -+ yygotominor.yy346.zStart = yymsp[-5].minor.yy0.z; -+ yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; - } - break; -- case 297: /* raisetype ::= ROLLBACK */ --{yygotominor.yy4 = OE_Rollback;} -+ case 290: /* raisetype ::= ROLLBACK */ -+{yygotominor.yy328 = OE_Rollback;} - break; -- case 299: /* raisetype ::= FAIL */ --{yygotominor.yy4 = OE_Fail;} -+ case 292: /* raisetype ::= FAIL */ -+{yygotominor.yy328 = OE_Fail;} - break; -- case 300: /* cmd ::= DROP TRIGGER ifexists fullname */ -+ case 293: /* cmd ::= DROP TRIGGER ifexists fullname */ - { -- sqlite3DropTrigger(pParse,yymsp[0].minor.yy259,yymsp[-1].minor.yy4); -+ sqlite3DropTrigger(pParse,yymsp[0].minor.yy65,yymsp[-1].minor.yy328); - } - break; -- case 301: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ -+ case 294: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ - { -- sqlite3Attach(pParse, yymsp[-3].minor.yy118.pExpr, yymsp[-1].minor.yy118.pExpr, yymsp[0].minor.yy314); -+ sqlite3Attach(pParse, yymsp[-3].minor.yy346.pExpr, yymsp[-1].minor.yy346.pExpr, yymsp[0].minor.yy132); - } - break; -- case 302: /* cmd ::= DETACH database_kw_opt expr */ -+ case 295: /* cmd ::= DETACH database_kw_opt expr */ - { -- sqlite3Detach(pParse, yymsp[0].minor.yy118.pExpr); -+ sqlite3Detach(pParse, yymsp[0].minor.yy346.pExpr); - } - break; -- case 307: /* cmd ::= REINDEX */ -+ case 300: /* cmd ::= REINDEX */ - {sqlite3Reindex(pParse, 0, 0);} - break; -- case 308: /* cmd ::= REINDEX nm dbnm */ -+ case 301: /* cmd ::= REINDEX nm dbnm */ - {sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} - break; -- case 309: /* cmd ::= ANALYZE */ -+ case 302: /* cmd ::= ANALYZE */ - {sqlite3Analyze(pParse, 0, 0);} - break; -- case 310: /* cmd ::= ANALYZE nm dbnm */ -+ case 303: /* cmd ::= ANALYZE nm dbnm */ - {sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} - break; -- case 311: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ -+ case 304: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ - { -- sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy259,&yymsp[0].minor.yy0); -+ sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy65,&yymsp[0].minor.yy0); - } - break; -- case 312: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column */ -+ case 305: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column */ - { - sqlite3AlterFinishAddColumn(pParse, &yymsp[0].minor.yy0); - } - break; -- case 313: /* add_column_fullname ::= fullname */ -+ case 306: /* add_column_fullname ::= fullname */ - { - pParse->db->lookaside.bEnabled = 0; -- sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy259); -+ sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy65); - } - break; -- case 316: /* cmd ::= create_vtab */ -+ case 309: /* cmd ::= create_vtab */ - {sqlite3VtabFinishParse(pParse,0);} - break; -- case 317: /* cmd ::= create_vtab LP vtabarglist RP */ -+ case 310: /* cmd ::= create_vtab LP vtabarglist RP */ - {sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);} - break; -- case 318: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ -+ case 311: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ - { -- sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy4); -+ sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy328); - } - break; -- case 321: /* vtabarg ::= */ -+ case 314: /* vtabarg ::= */ - {sqlite3VtabArgInit(pParse);} - break; -- case 323: /* vtabargtoken ::= ANY */ -- case 324: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==324); -- case 325: /* lp ::= LP */ yytestcase(yyruleno==325); -+ case 316: /* vtabargtoken ::= ANY */ -+ case 317: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==317); -+ case 318: /* lp ::= LP */ yytestcase(yyruleno==318); - {sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);} - break; -+ case 322: /* with ::= */ -+{yygotominor.yy59 = 0;} -+ break; -+ case 323: /* with ::= WITH wqlist */ -+ case 324: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==324); -+{ yygotominor.yy59 = yymsp[0].minor.yy59; } -+ break; -+ case 325: /* wqlist ::= nm idxlist_opt AS LP select RP */ -+{ -+#ifdef SQLITE_OMIT_CTE -+ assert(0); -+#else -+ yygotominor.yy59 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy14, yymsp[-1].minor.yy3); -+#endif -+} -+ break; -+ case 326: /* wqlist ::= wqlist COMMA nm idxlist_opt AS LP select RP */ -+{ -+#ifdef SQLITE_OMIT_CTE -+ assert(0); -+#else -+ yygotominor.yy59 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy59, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy14, yymsp[-1].minor.yy3); -+#endif -+} -+ break; - default: - /* (0) input ::= cmdlist */ yytestcase(yyruleno==0); - /* (1) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==1); -@@ -117542,28 +118529,28 @@ static void yy_reduce( - /* (25) cmd ::= create_table create_table_args */ yytestcase(yyruleno==25); - /* (36) columnlist ::= columnlist COMMA column */ yytestcase(yyruleno==36); - /* (37) columnlist ::= column */ yytestcase(yyruleno==37); -- /* (46) type ::= */ yytestcase(yyruleno==46); -- /* (53) signed ::= plus_num */ yytestcase(yyruleno==53); -- /* (54) signed ::= minus_num */ yytestcase(yyruleno==54); -- /* (55) carglist ::= carglist ccons */ yytestcase(yyruleno==55); -- /* (56) carglist ::= */ yytestcase(yyruleno==56); -- /* (63) ccons ::= NULL onconf */ yytestcase(yyruleno==63); -- /* (91) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==91); -- /* (92) conslist ::= tcons */ yytestcase(yyruleno==92); -- /* (94) tconscomma ::= */ yytestcase(yyruleno==94); -- /* (279) foreach_clause ::= */ yytestcase(yyruleno==279); -- /* (280) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==280); -- /* (287) tridxby ::= */ yytestcase(yyruleno==287); -- /* (305) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==305); -- /* (306) database_kw_opt ::= */ yytestcase(yyruleno==306); -- /* (314) kwcolumn_opt ::= */ yytestcase(yyruleno==314); -- /* (315) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==315); -- /* (319) vtabarglist ::= vtabarg */ yytestcase(yyruleno==319); -- /* (320) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==320); -- /* (322) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==322); -- /* (326) anylist ::= */ yytestcase(yyruleno==326); -- /* (327) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==327); -- /* (328) anylist ::= anylist ANY */ yytestcase(yyruleno==328); -+ /* (43) type ::= */ yytestcase(yyruleno==43); -+ /* (50) signed ::= plus_num */ yytestcase(yyruleno==50); -+ /* (51) signed ::= minus_num */ yytestcase(yyruleno==51); -+ /* (52) carglist ::= carglist ccons */ yytestcase(yyruleno==52); -+ /* (53) carglist ::= */ yytestcase(yyruleno==53); -+ /* (60) ccons ::= NULL onconf */ yytestcase(yyruleno==60); -+ /* (88) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==88); -+ /* (89) conslist ::= tcons */ yytestcase(yyruleno==89); -+ /* (91) tconscomma ::= */ yytestcase(yyruleno==91); -+ /* (273) foreach_clause ::= */ yytestcase(yyruleno==273); -+ /* (274) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==274); -+ /* (281) tridxby ::= */ yytestcase(yyruleno==281); -+ /* (298) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==298); -+ /* (299) database_kw_opt ::= */ yytestcase(yyruleno==299); -+ /* (307) kwcolumn_opt ::= */ yytestcase(yyruleno==307); -+ /* (308) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==308); -+ /* (312) vtabarglist ::= vtabarg */ yytestcase(yyruleno==312); -+ /* (313) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==313); -+ /* (315) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==315); -+ /* (319) anylist ::= */ yytestcase(yyruleno==319); -+ /* (320) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==320); -+ /* (321) anylist ::= anylist ANY */ yytestcase(yyruleno==321); - break; - }; - assert( yyruleno>=0 && yyruleno1 ){ -- /* Parameters of the form #NNN (where NNN is a number) are used -- ** internally by sqlite3NestedParse. */ -- *tokenType = TK_REGISTER; -- return i; -- } -- /* Fall through into the next case if the '#' is not followed by -- ** a digit. Try to match #AAAA where AAAA is a parameter name. */ -- } - #ifndef SQLITE_OMIT_TCL_VARIABLE - case '$': - #endif - case '@': /* For compatibility with MS SQL Server */ -+ case '#': - case ':': { - int n = 0; -- testcase( z[0]=='$' ); testcase( z[0]=='@' ); testcase( z[0]==':' ); -+ testcase( z[0]=='$' ); testcase( z[0]=='@' ); -+ testcase( z[0]==':' ); testcase( z[0]=='#' ); - *tokenType = TK_VARIABLE; - for(i=1; (c=z[i])!=0; i++){ - if( IdChar(c) ){ -@@ -118604,6 +119584,7 @@ abort_parse: - sqlite3DeleteTable(db, pParse->pNewTable); - } - -+ if( pParse->bFreeWith ) sqlite3WithDelete(db, pParse->pWith); - sqlite3DeleteTrigger(db, pParse->pNewTrigger); - for(i=pParse->nzVar-1; i>=0; i--) sqlite3DbFree(db, pParse->azVar[i]); - sqlite3DbFree(db, pParse->azVar); -@@ -119024,6 +120005,39 @@ SQLITE_PRIVATE int sqlite3IcuInit(sqlite - /************** End of sqliteicu.h *******************************************/ - /************** Continuing where we left off in main.c ***********************/ - #endif -+#ifdef SQLITE_ENABLE_ZLIB -+/************** Include sqlitezlib.h in the middle of main.c *****************/ -+/************** Begin file sqlitezlib.h **************************************/ -+/* -+** 2008 May 26 -+** -+** The author disclaims copyright to this source code. In place of -+** a legal notice, here is a blessing: -+** -+** May you do good and not evil. -+** May you find forgiveness for yourself and forgive others. -+** May you share freely, never taking more than you give. -+** -+****************************************************************************** -+** -+** This header file is used by programs that want to link against the -+** zlib extension. All it does is declare the sqlite3ZlibInit() interface. -+*/ -+ -+#if 0 -+extern "C" { -+#endif /* __cplusplus */ -+ -+SQLITE_PRIVATE int sqlite3ZlibInit(sqlite3 *db); -+ -+#if 0 -+} /* extern "C" */ -+#endif /* __cplusplus */ -+ -+ -+/************** End of sqlitezlib.h ******************************************/ -+/************** Continuing where we left off in main.c ***********************/ -+#endif - - #ifndef SQLITE_AMALGAMATION - /* IMPLEMENTATION-OF: R-46656-45156 The sqlite3_version[] string constant -@@ -119134,13 +120148,6 @@ SQLITE_API int sqlite3_initialize(void){ - */ - if( sqlite3GlobalConfig.isInit ) return SQLITE_OK; - --#ifdef SQLITE_ENABLE_SQLLOG -- { -- extern void sqlite3_init_sqllog(void); -- sqlite3_init_sqllog(); -- } --#endif -- - /* Make sure the mutex subsystem is initialized. If unable to - ** initialize the mutex subsystem, return early with the error. - ** If the system is so sick that we are unable to allocate a mutex, -@@ -119587,7 +120594,8 @@ static int setupLookaside(sqlite3 *db, v - db->lookaside.bEnabled = 1; - db->lookaside.bMalloced = pBuf==0 ?1:0; - }else{ -- db->lookaside.pEnd = 0; -+ db->lookaside.pStart = db; -+ db->lookaside.pEnd = db; - db->lookaside.bEnabled = 0; - db->lookaside.bMalloced = 0; - } -@@ -119985,9 +120993,7 @@ SQLITE_PRIVATE void sqlite3LeaveMutexAnd - #endif - - sqlite3Error(db, SQLITE_OK, 0); /* Deallocates any cached error strings. */ -- if( db->pErr ){ -- sqlite3ValueFree(db->pErr); -- } -+ sqlite3ValueFree(db->pErr); - sqlite3CloseExtensions(db); - - db->magic = SQLITE_MAGIC_ERROR; -@@ -120062,8 +121068,7 @@ SQLITE_PRIVATE void sqlite3RollbackAll(s - ** Return a static string containing the name corresponding to the error code - ** specified in the argument. - */ --#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) || \ -- defined(SQLITE_DEBUG_OS_TRACE) -+#if defined(SQLITE_TEST) - SQLITE_PRIVATE const char *sqlite3ErrName(int rc){ - const char *zName = 0; - int i, origRc = rc; -@@ -120085,6 +121090,7 @@ SQLITE_PRIVATE const char *sqlite3ErrNam - case SQLITE_READONLY_RECOVERY: zName = "SQLITE_READONLY_RECOVERY"; break; - case SQLITE_READONLY_CANTLOCK: zName = "SQLITE_READONLY_CANTLOCK"; break; - case SQLITE_READONLY_ROLLBACK: zName = "SQLITE_READONLY_ROLLBACK"; break; -+ case SQLITE_READONLY_DBMOVED: zName = "SQLITE_READONLY_DBMOVED"; break; - case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break; - case SQLITE_IOERR: zName = "SQLITE_IOERR"; break; - case SQLITE_IOERR_READ: zName = "SQLITE_IOERR_READ"; break; -@@ -120369,6 +121375,7 @@ SQLITE_PRIVATE int sqlite3CreateFunc( - ){ - FuncDef *p; - int nName; -+ int extraFlags; - - assert( sqlite3_mutex_held(db->mutex) ); - if( zFunctionName==0 || -@@ -120379,6 +121386,10 @@ SQLITE_PRIVATE int sqlite3CreateFunc( - (255<(nName = sqlite3Strlen30( zFunctionName))) ){ - return SQLITE_MISUSE_BKPT; - } -+ -+ assert( SQLITE_FUNC_CONSTANT==SQLITE_DETERMINISTIC ); -+ extraFlags = enc & SQLITE_DETERMINISTIC; -+ enc &= (SQLITE_FUNC_ENCMASK|SQLITE_ANY); - - #ifndef SQLITE_OMIT_UTF16 - /* If SQLITE_UTF16 is specified as the encoding type, transform this -@@ -120392,10 +121403,10 @@ SQLITE_PRIVATE int sqlite3CreateFunc( - enc = SQLITE_UTF16NATIVE; - }else if( enc==SQLITE_ANY ){ - int rc; -- rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8, -+ rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8|extraFlags, - pUserData, xFunc, xStep, xFinal, pDestructor); - if( rc==SQLITE_OK ){ -- rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE, -+ rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE|extraFlags, - pUserData, xFunc, xStep, xFinal, pDestructor); - } - if( rc!=SQLITE_OK ){ -@@ -120438,7 +121449,8 @@ SQLITE_PRIVATE int sqlite3CreateFunc( - pDestructor->nRef++; - } - p->pDestructor = pDestructor; -- p->funcFlags &= SQLITE_FUNC_ENCMASK; -+ p->funcFlags = (p->funcFlags & SQLITE_FUNC_ENCMASK) | extraFlags; -+ testcase( p->funcFlags & SQLITE_DETERMINISTIC ); - p->xFunc = xFunc; - p->xStep = xStep; - p->xFinalize = xFinal; -@@ -120868,6 +121880,7 @@ SQLITE_API const char *sqlite3_errmsg(sq - if( db->mallocFailed ){ - z = sqlite3ErrStr(SQLITE_NOMEM); - }else{ -+ testcase( db->pErr==0 ); - z = (char*)sqlite3_value_text(db->pErr); - assert( !db->mallocFailed ); - if( z==0 ){ -@@ -120909,8 +121922,7 @@ SQLITE_API const void *sqlite3_errmsg16( - }else{ - z = sqlite3_value_text16(db->pErr); - if( z==0 ){ -- sqlite3ValueSetStr(db->pErr, -1, sqlite3ErrStr(db->errCode), -- SQLITE_UTF8, SQLITE_STATIC); -+ sqlite3Error(db, db->errCode, sqlite3ErrStr(db->errCode)); - z = sqlite3_value_text16(db->pErr); - } - /* A malloc() may have failed within the call to sqlite3_value_text16() -@@ -121618,14 +122630,18 @@ static int openDatabase( - } - #endif - -+#ifdef SQLITE_ENABLE_ZLIB -+ if( !db->mallocFailed && rc==SQLITE_OK ){ -+ rc = sqlite3ZlibInit(db); -+ } -+#endif -+ - #ifdef SQLITE_ENABLE_RTREE - if( !db->mallocFailed && rc==SQLITE_OK){ - rc = sqlite3RtreeInit(db); - } - #endif - -- sqlite3Error(db, rc, 0); -- - /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking - ** mode. -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking - ** mode. Doing nothing at all also makes NORMAL the default. -@@ -121636,6 +122652,8 @@ static int openDatabase( - SQLITE_DEFAULT_LOCKING_MODE); - #endif - -+ if( rc ) sqlite3Error(db, rc, 0); -+ - /* Enable the lookaside-malloc subsystem */ - setupLookaside(db, 0, sqlite3GlobalConfig.szLookaside, - sqlite3GlobalConfig.nLookaside); -@@ -122095,7 +123113,7 @@ SQLITE_API int sqlite3_test_control(int - ** to the xRandomness method of the default VFS. - */ - case SQLITE_TESTCTRL_PRNG_RESET: { -- sqlite3PrngResetState(); -+ sqlite3_randomness(0,0); - break; - } - -@@ -125079,6 +126097,19 @@ static int fts3CreateMethod( - return fts3InitVtab(1, db, pAux, argc, argv, ppVtab, pzErr); - } - -+/* -+** Set the pIdxInfo->estimatedRows variable to nRow. Unless this -+** extension is currently being used by a version of SQLite too old to -+** support estimatedRows. In that case this function is a no-op. -+*/ -+static void fts3SetEstimatedRows(sqlite3_index_info *pIdxInfo, i64 nRow){ -+#if SQLITE_VERSION_NUMBER>=3008002 -+ if( sqlite3_libversion_number()>=3008002 ){ -+ pIdxInfo->estimatedRows = nRow; -+ } -+#endif -+} -+ - /* - ** Implementation of the xBestIndex method for FTS3 tables. There - ** are three possible strategies, in order of preference: -@@ -125106,7 +126137,20 @@ static int fts3BestIndexMethod(sqlite3_v - for(i=0; inConstraint; i++){ - int bDocid; /* True if this constraint is on docid */ - struct sqlite3_index_constraint *pCons = &pInfo->aConstraint[i]; -- if( pCons->usable==0 ) continue; -+ if( pCons->usable==0 ){ -+ if( pCons->op==SQLITE_INDEX_CONSTRAINT_MATCH ){ -+ /* There exists an unusable MATCH constraint. This means that if -+ ** the planner does elect to use the results of this call as part -+ ** of the overall query plan the user will see an "unable to use -+ ** function MATCH in the requested context" error. To discourage -+ ** this, return a very high cost here. */ -+ pInfo->idxNum = FTS3_FULLSCAN_SEARCH; -+ pInfo->estimatedCost = 1e50; -+ fts3SetEstimatedRows(pInfo, ((sqlite3_int64)1) << 50); -+ return SQLITE_OK; -+ } -+ continue; -+ } - - bDocid = (pCons->iColumn<0 || pCons->iColumn==p->nColumn+1); - -@@ -131967,12 +133011,14 @@ static void porter_stemmer(const char *z - /* Step 2 */ - switch( z[1] ){ - case 'a': -- stem(&z, "lanoita", "ate", m_gt_0) || -- stem(&z, "lanoit", "tion", m_gt_0); -+ if( !stem(&z, "lanoita", "ate", m_gt_0) ){ -+ stem(&z, "lanoit", "tion", m_gt_0); -+ } - break; - case 'c': -- stem(&z, "icne", "ence", m_gt_0) || -- stem(&z, "icna", "ance", m_gt_0); -+ if( !stem(&z, "icne", "ence", m_gt_0) ){ -+ stem(&z, "icna", "ance", m_gt_0); -+ } - break; - case 'e': - stem(&z, "rezi", "ize", m_gt_0); -@@ -131981,43 +133027,54 @@ static void porter_stemmer(const char *z - stem(&z, "igol", "log", m_gt_0); - break; - case 'l': -- stem(&z, "ilb", "ble", m_gt_0) || -- stem(&z, "illa", "al", m_gt_0) || -- stem(&z, "iltne", "ent", m_gt_0) || -- stem(&z, "ile", "e", m_gt_0) || -- stem(&z, "ilsuo", "ous", m_gt_0); -+ if( !stem(&z, "ilb", "ble", m_gt_0) -+ && !stem(&z, "illa", "al", m_gt_0) -+ && !stem(&z, "iltne", "ent", m_gt_0) -+ && !stem(&z, "ile", "e", m_gt_0) -+ ){ -+ stem(&z, "ilsuo", "ous", m_gt_0); -+ } - break; - case 'o': -- stem(&z, "noitazi", "ize", m_gt_0) || -- stem(&z, "noita", "ate", m_gt_0) || -- stem(&z, "rota", "ate", m_gt_0); -+ if( !stem(&z, "noitazi", "ize", m_gt_0) -+ && !stem(&z, "noita", "ate", m_gt_0) -+ ){ -+ stem(&z, "rota", "ate", m_gt_0); -+ } - break; - case 's': -- stem(&z, "msila", "al", m_gt_0) || -- stem(&z, "ssenevi", "ive", m_gt_0) || -- stem(&z, "ssenluf", "ful", m_gt_0) || -- stem(&z, "ssensuo", "ous", m_gt_0); -+ if( !stem(&z, "msila", "al", m_gt_0) -+ && !stem(&z, "ssenevi", "ive", m_gt_0) -+ && !stem(&z, "ssenluf", "ful", m_gt_0) -+ ){ -+ stem(&z, "ssensuo", "ous", m_gt_0); -+ } - break; - case 't': -- stem(&z, "itila", "al", m_gt_0) || -- stem(&z, "itivi", "ive", m_gt_0) || -- stem(&z, "itilib", "ble", m_gt_0); -+ if( !stem(&z, "itila", "al", m_gt_0) -+ && !stem(&z, "itivi", "ive", m_gt_0) -+ ){ -+ stem(&z, "itilib", "ble", m_gt_0); -+ } - break; - } - - /* Step 3 */ - switch( z[0] ){ - case 'e': -- stem(&z, "etaci", "ic", m_gt_0) || -- stem(&z, "evita", "", m_gt_0) || -- stem(&z, "ezila", "al", m_gt_0); -+ if( !stem(&z, "etaci", "ic", m_gt_0) -+ && !stem(&z, "evita", "", m_gt_0) -+ ){ -+ stem(&z, "ezila", "al", m_gt_0); -+ } - break; - case 'i': - stem(&z, "itici", "ic", m_gt_0); - break; - case 'l': -- stem(&z, "laci", "ic", m_gt_0) || -- stem(&z, "luf", "", m_gt_0); -+ if( !stem(&z, "laci", "ic", m_gt_0) ){ -+ stem(&z, "luf", "", m_gt_0); -+ } - break; - case 's': - stem(&z, "ssen", "", m_gt_0); -@@ -132058,9 +133115,11 @@ static void porter_stemmer(const char *z - z += 3; - } - }else if( z[2]=='e' ){ -- stem(&z, "tneme", "", m_gt_1) || -- stem(&z, "tnem", "", m_gt_1) || -- stem(&z, "tne", "", m_gt_1); -+ if( !stem(&z, "tneme", "", m_gt_1) -+ && !stem(&z, "tnem", "", m_gt_1) -+ ){ -+ stem(&z, "tne", "", m_gt_1); -+ } - } - } - break; -@@ -132079,8 +133138,9 @@ static void porter_stemmer(const char *z - } - break; - case 't': -- stem(&z, "eta", "", m_gt_1) || -- stem(&z, "iti", "", m_gt_1); -+ if( !stem(&z, "eta", "", m_gt_1) ){ -+ stem(&z, "iti", "", m_gt_1); -+ } - break; - case 'u': - if( z[0]=='s' && z[2]=='o' && m_gt_1(z+3) ){ -@@ -145031,6 +146091,137 @@ SQLITE_API int sqlite3_icu_init( - #endif - - /************** End of icu.c *************************************************/ -+/************** Begin file zlib.c ********************************************/ -+/* -+** 2014 January 6 -+** -+** The author disclaims copyright to this source code. In place of -+** a legal notice, here is a blessing: -+** -+** May you do good and not evil. -+** May you find forgiveness for yourself and forgive others. -+** May you share freely, never taking more than you give. -+** -+************************************************************************* -+** $Id: zlib.c,v 1.0 2013/01/06 11:13:11 jan.nijtmans Exp $ -+** -+** This file implements an integration between the zlib library , -+** an open-source compression library and SQLite. The integration uses -+** zlib to provide the following to SQLite: -+** -+** * An implementation of the SQL compress() and decompress() -+** functions. -+*/ -+ -+#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ZLIB) -+ -+/* Include zlib headers */ -+#include -+ -+#ifndef SQLITE_CORE -+ SQLITE_EXTENSION_INIT1 -+#else -+#endif -+ -+ /* -+ ** Implementation of the "compress(X)" SQL function. The input X is -+ ** compressed using zLib and the output is returned. -+ */ -+ static void zlibCompressFunc( -+ sqlite3_context *context, -+ int argc, -+ sqlite3_value **argv -+ ){ -+ const unsigned char *pIn; -+ unsigned char *pOut; -+ unsigned int nIn; -+ unsigned long int nOut; -+ -+ pIn = sqlite3_value_blob(argv[0]); -+ nIn = sqlite3_value_bytes(argv[0]); -+ nOut = 13 + nIn + (nIn+999)/1000; -+ pOut = sqlite3_malloc( nOut+4 ); -+ pOut[0] = nIn>>24 & 0xff; -+ pOut[1] = nIn>>16 & 0xff; -+ pOut[2] = nIn>>8 & 0xff; -+ pOut[3] = nIn & 0xff; -+ compress(&pOut[4], &nOut, pIn, nIn); -+ sqlite3_result_blob(context, pOut, nOut+4, sqlite3_free); -+ } -+ -+ /* -+ ** Implementation of the "decompress(X)" SQL function. The argument X -+ ** is a blob which was obtained from compress(Y). The output will be -+ ** the value Y. -+ */ -+ static void zlibDecompressFunc( -+ sqlite3_context *context, -+ int argc, -+ sqlite3_value **argv -+ ){ -+ const unsigned char *pIn; -+ unsigned char *pOut; -+ unsigned int nIn; -+ unsigned long int nOut; -+ int rc; -+ -+ pIn = sqlite3_value_blob(argv[0]); -+ nIn = sqlite3_value_bytes(argv[0]); -+ nOut = (pIn[0]<<24) + (pIn[1]<<16) + (pIn[2]<<8) + pIn[3]; -+ pOut = sqlite3_malloc( nOut+1 ); -+ rc = uncompress(pOut, &nOut, &pIn[4], nIn-4); -+ if( rc==Z_OK ){ -+ sqlite3_result_blob(context, pOut, nOut, sqlite3_free); -+ }else{ -+ sqlite3_result_error(context, "input is not zlib compressed", -1); -+ } -+ } -+ -+/* -+** Register the zlib extension functions with database db. -+*/ -+SQLITE_PRIVATE int sqlite3ZlibInit(sqlite3 *db){ -+ struct ZlibScalar { -+ const char *zName; /* Function name */ -+ int nArg; /* Number of arguments */ -+ int enc; /* Optimal text encoding */ -+ void *pContext; /* sqlite3_user_data() context */ -+ void (*xFunc)(sqlite3_context*,int,sqlite3_value**); -+ } scalars[] = { -+ {"compress", 1, SQLITE_ANY, 0, zlibCompressFunc}, -+ {"decompress", 1, SQLITE_ANY, 0, zlibDecompressFunc}, -+ }; -+ -+ int rc = SQLITE_OK; -+ int i; -+ -+ for(i=0; rc==SQLITE_OK && i<(int)(sizeof(scalars)/sizeof(scalars[0])); i++){ -+ struct ZlibScalar *p = &scalars[i]; -+ rc = sqlite3_create_function( -+ db, p->zName, p->nArg, p->enc, p->pContext, p->xFunc, 0, 0 -+ ); -+ } -+ -+ return rc; -+} -+ -+#if !SQLITE_CORE -+#ifdef _WIN32 -+__declspec(dllexport) -+#endif -+SQLITE_API int sqlite3_zlib_init( -+ sqlite3 *db, -+ char **pzErrMsg, -+ const sqlite3_api_routines *pApi -+){ -+ SQLITE_EXTENSION_INIT2(pApi) -+ return sqlite3ZlibInit(db); -+} -+#endif -+ -+#endif -+ -+/************** End of zlib.c ************************************************/ - /************** Begin file fts3_icu.c ****************************************/ - /* - ** 2007 June 22 ---- origsrc/sqlite-autoconf-3080200/sqlite3.h 2013-12-06 16:05:18.000000000 +0100 -+++ src/sqlite-autoconf-3080200/sqlite3.h 2014-01-22 10:49:58.587730100 +0100 -@@ -107,9 +107,9 @@ extern "C" { - ** [sqlite3_libversion_number()], [sqlite3_sourceid()], - ** [sqlite_version()] and [sqlite_source_id()]. - */ --#define SQLITE_VERSION "3.8.2" --#define SQLITE_VERSION_NUMBER 3008002 --#define SQLITE_SOURCE_ID "2013-12-06 14:53:30 27392118af4c38c5203a04b8013e1afdb1cebd0d" -+#define SQLITE_VERSION "3.8.3" -+#define SQLITE_VERSION_NUMBER 3008003 -+#define SQLITE_SOURCE_ID "2014-01-21 15:04:47 5e43bf013253921e4dfbe71de11ee7ed4b3e7eae" - - /* - ** CAPI3REF: Run-Time Library Version Numbers -@@ -491,6 +491,7 @@ SQLITE_API int sqlite3_exec( - #define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) - #define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) - #define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) -+#define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8)) - #define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) - #define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8)) - #define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8)) -@@ -558,7 +559,8 @@ SQLITE_API int sqlite3_exec( - ** after reboot following a crash or power loss, the only bytes in a - ** file that were written at the application level might have changed - ** and that adjacent bytes, even bytes within the same sector are --** guaranteed to be unchanged. -+** guaranteed to be unchanged. The SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN -+** flag indicate that a file cannot be deleted when open. - */ - #define SQLITE_IOCAP_ATOMIC 0x00000001 - #define SQLITE_IOCAP_ATOMIC512 0x00000002 -@@ -789,15 +791,29 @@ struct sqlite3_io_methods { - ** additional information. - ** - **
  • [[SQLITE_FCNTL_SYNC_OMITTED]] --** ^(The [SQLITE_FCNTL_SYNC_OMITTED] opcode is generated internally by --** SQLite and sent to all VFSes in place of a call to the xSync method --** when the database connection has [PRAGMA synchronous] set to OFF.)^ --** Some specialized VFSes need this signal in order to operate correctly --** when [PRAGMA synchronous | PRAGMA synchronous=OFF] is set, but most --** VFSes do not need this signal and should silently ignore this opcode. --** Applications should not call [sqlite3_file_control()] with this --** opcode as doing so may disrupt the operation of the specialized VFSes --** that do require it. -+** No longer in use. -+** -+**
  • [[SQLITE_FCNTL_SYNC]] -+** The [SQLITE_FCNTL_SYNC] opcode is generated internally by SQLite and -+** sent to the VFS immediately before the xSync method is invoked on a -+** database file descriptor. Or, if the xSync method is not invoked -+** because the user has configured SQLite with -+** [PRAGMA synchronous | PRAGMA synchronous=OFF] it is invoked in place -+** of the xSync method. In most cases, the pointer argument passed with -+** this file-control is NULL. However, if the database file is being synced -+** as part of a multi-database commit, the argument points to a nul-terminated -+** string containing the transactions master-journal file name. VFSes that -+** do not need this signal should silently ignore this opcode. Applications -+** should not call [sqlite3_file_control()] with this opcode as doing so may -+** disrupt the operation of the specialized VFSes that do require it. -+** -+**
  • [[SQLITE_FCNTL_COMMIT_PHASETWO]] -+** The [SQLITE_FCNTL_COMMIT_PHASETWO] opcode is generated internally by SQLite -+** and sent to the VFS after a transaction has been committed immediately -+** but before the database is unlocked. VFSes that do not need this signal -+** should silently ignore this opcode. Applications should not call -+** [sqlite3_file_control()] with this opcode as doing so may disrupt the -+** operation of the specialized VFSes that do require it. - ** - **
  • [[SQLITE_FCNTL_WIN32_AV_RETRY]] - ** ^The [SQLITE_FCNTL_WIN32_AV_RETRY] opcode is used to configure automatic -@@ -921,6 +937,12 @@ struct sqlite3_io_methods { - ** SQLite stack may generate instances of this file control if - ** the [SQLITE_USE_FCNTL_TRACE] compile-time option is enabled. - ** -+**
  • [[SQLITE_FCNTL_HAS_MOVED]] -+** The [SQLITE_FCNTL_HAS_MOVED] file control interprets its argument as a -+** pointer to an integer and it writes a boolean into that integer depending -+** on whether or not the file has been renamed, moved, or deleted since it -+** was first opened. -+** - ** - */ - #define SQLITE_FCNTL_LOCKSTATE 1 -@@ -941,6 +963,9 @@ struct sqlite3_io_methods { - #define SQLITE_FCNTL_TEMPFILENAME 16 - #define SQLITE_FCNTL_MMAP_SIZE 18 - #define SQLITE_FCNTL_TRACE 19 -+#define SQLITE_FCNTL_HAS_MOVED 20 -+#define SQLITE_FCNTL_SYNC 21 -+#define SQLITE_FCNTL_COMMIT_PHASETWO 22 - - /* - ** CAPI3REF: Mutex Handle -@@ -2375,11 +2400,13 @@ SQLITE_API sqlite3_int64 sqlite3_memory_ - ** applications to access the same PRNG for other purposes. - ** - ** ^A call to this routine stores N bytes of randomness into buffer P. -+** ^If N is less than one, then P can be a NULL pointer. - ** --** ^The first time this routine is invoked (either internally or by --** the application) the PRNG is seeded using randomness obtained --** from the xRandomness method of the default [sqlite3_vfs] object. --** ^On all subsequent invocations, the pseudo-randomness is generated -+** ^If this routine has not been previously called or if the previous -+** call had N less than one, then the PRNG is seeded using randomness -+** obtained from the xRandomness method of the default [sqlite3_vfs] object. -+** ^If the previous call to this routine had an N of 1 or more then -+** the pseudo-randomness is generated - ** internally and without recourse to the [sqlite3_vfs] xRandomness - ** method. - */ -@@ -2539,6 +2566,7 @@ SQLITE_API int sqlite3_set_authorizer( - #define SQLITE_FUNCTION 31 /* NULL Function Name */ - #define SQLITE_SAVEPOINT 32 /* Operation Savepoint Name */ - #define SQLITE_COPY 0 /* No longer used */ -+#define SQLITE_RECURSIVE 33 /* NULL NULL */ - - /* - ** CAPI3REF: Tracing And Profiling Functions -@@ -3957,15 +3985,24 @@ SQLITE_API int sqlite3_reset(sqlite3_stm - ** - ** ^The fourth parameter, eTextRep, specifies what - ** [SQLITE_UTF8 | text encoding] this SQL function prefers for --** its parameters. Every SQL function implementation must be able to work --** with UTF-8, UTF-16le, or UTF-16be. But some implementations may be --** more efficient with one encoding than another. ^An application may --** invoke sqlite3_create_function() or sqlite3_create_function16() multiple --** times with the same function but with different values of eTextRep. -+** its parameters. The application should set this parameter to -+** [SQLITE_UTF16LE] if the function implementation invokes -+** [sqlite3_value_text16le()] on an input, or [SQLITE_UTF16BE] if the -+** implementation invokes [sqlite3_value_text16be()] on an input, or -+** [SQLITE_UTF16] if [sqlite3_value_text16()] is used, or [SQLITE_UTF8] -+** otherwise. ^The same SQL function may be registered multiple times using -+** different preferred text encodings, with different implementations for -+** each encoding. - ** ^When multiple implementations of the same function are available, SQLite - ** will pick the one that involves the least amount of data conversion. --** If there is only a single implementation which does not care what text --** encoding is used, then the fourth argument should be [SQLITE_ANY]. -+** -+** ^The fourth parameter may optionally be ORed with [SQLITE_DETERMINISTIC] -+** to signal that the function will always return the same result given -+** the same inputs within a single SQL statement. Most SQL functions are -+** deterministic. The built-in [random()] SQL function is an example of a -+** function that is not deterministic. The SQLite query planner is able to -+** perform additional optimizations on deterministic functions, so use -+** of the [SQLITE_DETERMINISTIC] flag is recommended where possible. - ** - ** ^(The fifth parameter is an arbitrary pointer. The implementation of the - ** function can gain access to this pointer using [sqlite3_user_data()].)^ -@@ -4051,10 +4088,20 @@ SQLITE_API int sqlite3_create_function_v - #define SQLITE_UTF16LE 2 - #define SQLITE_UTF16BE 3 - #define SQLITE_UTF16 4 /* Use native byte order */ --#define SQLITE_ANY 5 /* sqlite3_create_function only */ -+#define SQLITE_ANY 5 /* Deprecated */ - #define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ - - /* -+** CAPI3REF: Function Flags -+** -+** These constants may be ORed together with the -+** [SQLITE_UTF8 | preferred text encoding] as the fourth argument -+** to [sqlite3_create_function()], [sqlite3_create_function16()], or -+** [sqlite3_create_function_v2()]. -+*/ -+#define SQLITE_DETERMINISTIC 0x800 -+ -+/* - ** CAPI3REF: Deprecated Functions - ** DEPRECATED - ** ---- origsrc/sqlite-autoconf-3080200/sqliteicu.h 1970-01-01 01:00:00.000000000 +0100 -+++ src/sqlite-autoconf-3080200/sqliteicu.h 2014-01-22 10:49:58.598730700 +0100 -@@ -0,0 +1,27 @@ -+/* -+** 2008 May 26 -+** -+** The author disclaims copyright to this source code. In place of -+** a legal notice, here is a blessing: -+** -+** May you do good and not evil. -+** May you find forgiveness for yourself and forgive others. -+** May you share freely, never taking more than you give. -+** -+****************************************************************************** -+** -+** This header file is used by programs that want to link against the -+** ICU extension. All it does is declare the sqlite3IcuInit() interface. -+*/ -+#include "sqlite3.h" -+ -+#ifdef __cplusplus -+extern "C" { -+#endif /* __cplusplus */ -+ -+int sqlite3IcuInit(sqlite3 *db); -+ -+#ifdef __cplusplus -+} /* extern "C" */ -+#endif /* __cplusplus */ -+ ---- origsrc/sqlite-autoconf-3080200/sqlitezlib.h 1970-01-01 01:00:00.000000000 +0100 -+++ src/sqlite-autoconf-3080200/sqlitezlib.h 2014-01-22 10:49:58.604731100 +0100 -@@ -0,0 +1,27 @@ -+/* -+** 2008 May 26 -+** -+** The author disclaims copyright to this source code. In place of -+** a legal notice, here is a blessing: -+** -+** May you do good and not evil. -+** May you find forgiveness for yourself and forgive others. -+** May you share freely, never taking more than you give. -+** -+****************************************************************************** -+** -+** This header file is used by programs that want to link against the -+** zlib extension. All it does is declare the sqlite3ZlibInit() interface. -+*/ -+#include "sqlite3.h" -+ -+#ifdef __cplusplus -+extern "C" { -+#endif /* __cplusplus */ -+ -+int sqlite3ZlibInit(sqlite3 *db); -+ -+#ifdef __cplusplus -+} /* extern "C" */ -+#endif /* __cplusplus */ -+ ---- origsrc/sqlite-autoconf-3080200/tea/configure.in 2013-12-06 16:05:20.000000000 +0100 -+++ src/sqlite-autoconf-3080200/tea/configure.in 2014-01-22 10:49:58.610731400 +0100 -@@ -19,7 +19,7 @@ dnl to configure the system for the loca - # so you can encode the package version directly into the source files. - #----------------------------------------------------------------------- - --AC_INIT([sqlite], [3.8.2]) -+AC_INIT([sqlite], [3.8.3]) - - #-------------------------------------------------------------------- - # Call TEA_INIT as the first TEA_ macro to set up initial vars. ---- origsrc/sqlite-autoconf-3080200/tea/generic/tclsqlite3.c 2013-12-06 16:05:20.000000000 +0100 -+++ src/sqlite-autoconf-3080200/tea/generic/tclsqlite3.c 2014-01-22 10:49:58.622732100 +0100 -@@ -174,6 +174,10 @@ static int strlen30(const char *z){ - return 0x3fffffff & (int)(z2 - z); - } - -+#ifdef USE_TCL_STUBS -+# define tclStubsPtr staticTclStubsPtr -+static const TclStubs *tclStubsPtr = NULL; -+#endif - - #ifndef SQLITE_OMIT_INCRBLOB - /* -@@ -919,6 +923,7 @@ static int auth_callback( - case SQLITE_DROP_VTABLE : zCode="SQLITE_DROP_VTABLE"; break; - case SQLITE_FUNCTION : zCode="SQLITE_FUNCTION"; break; - case SQLITE_SAVEPOINT : zCode="SQLITE_SAVEPOINT"; break; -+ case SQLITE_RECURSIVE : zCode="SQLITE_RECURSIVE"; break; - default : zCode="????"; break; - } - Tcl_DStringInit(&str); -@@ -1535,9 +1540,9 @@ static int DbUseNre(void){ - */ - # define SQLITE_TCL_NRE 0 - # define DbUseNre() 0 --# define Tcl_NRAddCallback(a,b,c,d,e,f) 0 -+# define Tcl_NRAddCallback(a,b,c,d,e,f) (void)0 - # define Tcl_NREvalObj(a,b,c) 0 --# define Tcl_NRCreateCommand(a,b,c,d,e,f) 0 -+# define Tcl_NRCreateCommand(a,b,c,d,e,f) (void)0 - #endif - - /* -@@ -2775,7 +2780,7 @@ static int DbObjCmd(void *cd, Tcl_Interp - ** or savepoint. */ - if( DbUseNre() ){ - Tcl_NRAddCallback(interp, DbTransPostCmd, cd, 0, 0, 0); -- Tcl_NREvalObj(interp, pScript, 0); -+ (void)Tcl_NREvalObj(interp, pScript, 0); - }else{ - rc = DbTransPostCmd(&cd, interp, Tcl_EvalObjEx(interp, pScript, 0)); - } -@@ -2939,7 +2944,7 @@ static int DbMain(void *cd, Tcl_Interp * - if( objc==2 ){ - zArg = Tcl_GetStringFromObj(objv[1], 0); - if( strcmp(zArg,"-version")==0 ){ -- Tcl_AppendResult(interp,sqlite3_version,0); -+ Tcl_AppendResult(interp,sqlite3_libversion(),0); - return TCL_OK; - } - if( strcmp(zArg,"-has-codec")==0 ){ -@@ -3027,6 +3032,11 @@ static int DbMain(void *cd, Tcl_Interp * - memset(p, 0, sizeof(*p)); - zFile = Tcl_GetStringFromObj(objv[2], 0); - zFile = Tcl_TranslateFileName(interp, zFile, &translatedFilename); -+#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(SQLITE_WIN32_NO_WIDE) -+ if( !zVfs ){ -+ zVfs = "win32-longpath"; -+ } -+#endif - rc = sqlite3_open_v2(zFile, &p->db, flags, zVfs); - Tcl_DStringFree(&translatedFilename); - if( p->db ){ -@@ -3068,6 +3078,18 @@ static int DbMain(void *cd, Tcl_Interp * - #ifndef USE_TCL_STUBS - # undef Tcl_InitStubs - # define Tcl_InitStubs(a,b,c) TCL_VERSION -+#else -+# define Tcl_InitStubs staticTclInitStubs -+typedef struct { -+ char *result; -+ Tcl_FreeProc *freeProc; -+ int errorLine; -+ const struct TclStubs *stubTable; -+} PrivateTclInterp; -+static const char *Tcl_InitStubs(Tcl_Interp *interp, const char *version, int exact) { -+ tclStubsPtr = ((PrivateTclInterp *)interp)->stubTable; -+ return Tcl_PkgRequireEx(interp, "Tcl", version, 0, (void *)&tclStubsPtr); -+} - #endif - - /* -@@ -3376,8 +3398,7 @@ static void MD5Final(unsigned char diges - byteReverse(ctx->in, 14); - - /* Append length in bits and transform */ -- ((uint32 *)ctx->in)[ 14 ] = ctx->bits[0]; -- ((uint32 *)ctx->in)[ 15 ] = ctx->bits[1]; -+ memcpy(ctx->in + 14*4, ctx->bits, 8); - - MD5Transform(ctx->buf, (uint32 *)ctx->in); - byteReverse((unsigned char *)ctx->buf, 4); ---- origsrc/sqlite-autoconf-3080200/tea/tclconfig/tcl.m4 2013-12-06 16:05:18.000000000 +0100 -+++ src/sqlite-autoconf-3080200/tea/tclconfig/tcl.m4 2014-01-22 10:49:58.632732700 +0100 -@@ -1410,6 +1410,7 @@ dnl AC_CHECK_TOOL(AR, ar) - SHLIB_LD='${CC} -shared' - SHLIB_SUFFIX=".dll" - EXE_SUFFIX=".exe" -+ SHARED_LIB_SUFFIX='3.dll' - CC_SEARCH_FLAGS="" - LD_SEARCH_FLAGS="" - ;; -@@ -3207,7 +3208,7 @@ AC_DEFUN([TEA_MAKE_LIB], [ - if test x"${TK_BIN_DIR}" != x ; then - SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" - fi -- eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" -+ eval eval "PKG_LIB_FILE=tcl${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" - RANLIB=: - else - eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" ---- origsrc/sqlite-autoconf-3080200/zlib.c 1970-01-01 01:00:00.000000000 +0100 -+++ src/sqlite-autoconf-3080200/zlib.c 2014-01-22 10:49:58.642733200 +0100 -@@ -0,0 +1,130 @@ -+/* -+** 2014 January 6 -+** -+** The author disclaims copyright to this source code. In place of -+** a legal notice, here is a blessing: -+** -+** May you do good and not evil. -+** May you find forgiveness for yourself and forgive others. -+** May you share freely, never taking more than you give. -+** -+************************************************************************* -+** $Id: zlib.c,v 1.0 2013/01/06 11:13:11 jan.nijtmans Exp $ -+** -+** This file implements an integration between the zlib library , -+** an open-source compression library and SQLite. The integration uses -+** zlib to provide the following to SQLite: -+** -+** * An implementation of the SQL compress() and decompress() -+** functions. -+*/ -+ -+#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ZLIB) -+ -+/* Include zlib headers */ -+#include -+ -+#ifndef SQLITE_CORE -+ #include "sqlite3ext.h" -+ SQLITE_EXTENSION_INIT1 -+#else -+ #include "sqlite3.h" -+#endif -+ -+ /* -+ ** Implementation of the "compress(X)" SQL function. The input X is -+ ** compressed using zLib and the output is returned. -+ */ -+ static void zlibCompressFunc( -+ sqlite3_context *context, -+ int argc, -+ sqlite3_value **argv -+ ){ -+ const unsigned char *pIn; -+ unsigned char *pOut; -+ unsigned int nIn; -+ unsigned long int nOut; -+ -+ pIn = sqlite3_value_blob(argv[0]); -+ nIn = sqlite3_value_bytes(argv[0]); -+ nOut = 13 + nIn + (nIn+999)/1000; -+ pOut = sqlite3_malloc( nOut+4 ); -+ pOut[0] = nIn>>24 & 0xff; -+ pOut[1] = nIn>>16 & 0xff; -+ pOut[2] = nIn>>8 & 0xff; -+ pOut[3] = nIn & 0xff; -+ compress(&pOut[4], &nOut, pIn, nIn); -+ sqlite3_result_blob(context, pOut, nOut+4, sqlite3_free); -+ } -+ -+ /* -+ ** Implementation of the "decompress(X)" SQL function. The argument X -+ ** is a blob which was obtained from compress(Y). The output will be -+ ** the value Y. -+ */ -+ static void zlibDecompressFunc( -+ sqlite3_context *context, -+ int argc, -+ sqlite3_value **argv -+ ){ -+ const unsigned char *pIn; -+ unsigned char *pOut; -+ unsigned int nIn; -+ unsigned long int nOut; -+ int rc; -+ -+ pIn = sqlite3_value_blob(argv[0]); -+ nIn = sqlite3_value_bytes(argv[0]); -+ nOut = (pIn[0]<<24) + (pIn[1]<<16) + (pIn[2]<<8) + pIn[3]; -+ pOut = sqlite3_malloc( nOut+1 ); -+ rc = uncompress(pOut, &nOut, &pIn[4], nIn-4); -+ if( rc==Z_OK ){ -+ sqlite3_result_blob(context, pOut, nOut, sqlite3_free); -+ }else{ -+ sqlite3_result_error(context, "input is not zlib compressed", -1); -+ } -+ } -+ -+/* -+** Register the zlib extension functions with database db. -+*/ -+int sqlite3ZlibInit(sqlite3 *db){ -+ struct ZlibScalar { -+ const char *zName; /* Function name */ -+ int nArg; /* Number of arguments */ -+ int enc; /* Optimal text encoding */ -+ void *pContext; /* sqlite3_user_data() context */ -+ void (*xFunc)(sqlite3_context*,int,sqlite3_value**); -+ } scalars[] = { -+ {"compress", 1, SQLITE_ANY, 0, zlibCompressFunc}, -+ {"decompress", 1, SQLITE_ANY, 0, zlibDecompressFunc}, -+ }; -+ -+ int rc = SQLITE_OK; -+ int i; -+ -+ for(i=0; rc==SQLITE_OK && i<(int)(sizeof(scalars)/sizeof(scalars[0])); i++){ -+ struct ZlibScalar *p = &scalars[i]; -+ rc = sqlite3_create_function( -+ db, p->zName, p->nArg, p->enc, p->pContext, p->xFunc, 0, 0 -+ ); -+ } -+ -+ return rc; -+} -+ -+#if !SQLITE_CORE -+#ifdef _WIN32 -+__declspec(dllexport) -+#endif -+int sqlite3_zlib_init( -+ sqlite3 *db, -+ char **pzErrMsg, -+ const sqlite3_api_routines *pApi -+){ -+ SQLITE_EXTENSION_INIT2(pApi) -+ return sqlite3ZlibInit(db); -+} -+#endif -+ -+#endif diff --git a/sqlite/sqlite3-3.8.3-2.src.patch b/sqlite/sqlite3-3.8.3-2.src.patch new file mode 100644 index 00000000..b0b9043f --- /dev/null +++ b/sqlite/sqlite3-3.8.3-2.src.patch @@ -0,0 +1,3238 @@ +--- origsrc/sqlite-autoconf-3080300/Makefile.am 2014-02-03 15:04:55.000000000 +0100 ++++ src/sqlite-autoconf-3080300/Makefile.am 2014-02-04 12:53:52.195918100 +0100 +@@ -1,13 +1,13 @@ + + AM_CFLAGS = @THREADSAFE_FLAGS@ @DYNAMIC_EXTENSION_FLAGS@ -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_RTREE +- ++ + lib_LTLIBRARIES = libsqlite3.la + libsqlite3_la_SOURCES = sqlite3.c + libsqlite3_la_LDFLAGS = -no-undefined -version-info 8:6:8 + + bin_PROGRAMS = sqlite3 + sqlite3_SOURCES = shell.c sqlite3.h +-sqlite3_LDADD = $(top_builddir)/libsqlite3.la @READLINE_LIBS@ ++sqlite3_LDADD = $(top_builddir)/libsqlite3.la @READLINE_LIBS@ -licui18n -licuuc -lz + sqlite3_DEPENDENCIES = $(top_builddir)/libsqlite3.la + + include_HEADERS = sqlite3.h sqlite3ext.h +--- origsrc/sqlite-autoconf-3080300/icu.c 1970-01-01 01:00:00.000000000 +0100 ++++ src/sqlite-autoconf-3080300/icu.c 2014-02-04 12:53:52.204918600 +0100 +@@ -0,0 +1,504 @@ ++/* ++** 2007 May 6 ++** ++** The author disclaims copyright to this source code. In place of ++** a legal notice, here is a blessing: ++** ++** May you do good and not evil. ++** May you find forgiveness for yourself and forgive others. ++** May you share freely, never taking more than you give. ++** ++************************************************************************* ++** $Id: icu.c,v 1.7 2007/12/13 21:54:11 drh Exp $ ++** ++** This file implements an integration between the ICU library ++** ("International Components for Unicode", an open-source library ++** for handling unicode data) and SQLite. The integration uses ++** ICU to provide the following to SQLite: ++** ++** * An implementation of the SQL regexp() function (and hence REGEXP ++** operator) using the ICU uregex_XX() APIs. ++** ++** * Implementations of the SQL scalar upper() and lower() functions ++** for case mapping. ++** ++** * Integration of ICU and SQLite collation sequences. ++** ++** * An implementation of the LIKE operator that uses ICU to ++** provide case-independent matching. ++*/ ++ ++#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) ++ ++/* Include ICU headers */ ++#include ++#include ++#include ++#include ++ ++#include ++ ++#ifndef SQLITE_CORE ++ #include "sqlite3ext.h" ++ SQLITE_EXTENSION_INIT1 ++#else ++ #include "sqlite3.h" ++#endif ++ ++/* ++** Maximum length (in bytes) of the pattern in a LIKE or GLOB ++** operator. ++*/ ++#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH ++# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 ++#endif ++ ++/* ++** Version of sqlite3_free() that is always a function, never a macro. ++*/ ++static void xFree(void *p){ ++ sqlite3_free(p); ++} ++ ++/* ++** Compare two UTF-8 strings for equality where the first string is ++** a "LIKE" expression. Return true (1) if they are the same and ++** false (0) if they are different. ++*/ ++static int icuLikeCompare( ++ const uint8_t *zPattern, /* LIKE pattern */ ++ const uint8_t *zString, /* The UTF-8 string to compare against */ ++ const UChar32 uEsc /* The escape character */ ++){ ++ static const int MATCH_ONE = (UChar32)'_'; ++ static const int MATCH_ALL = (UChar32)'%'; ++ ++ int iPattern = 0; /* Current byte index in zPattern */ ++ int iString = 0; /* Current byte index in zString */ ++ ++ int prevEscape = 0; /* True if the previous character was uEsc */ ++ ++ while( zPattern[iPattern]!=0 ){ ++ ++ /* Read (and consume) the next character from the input pattern. */ ++ UChar32 uPattern; ++ U8_NEXT_UNSAFE(zPattern, iPattern, uPattern); ++ assert(uPattern!=0); ++ ++ /* There are now 4 possibilities: ++ ** ++ ** 1. uPattern is an unescaped match-all character "%", ++ ** 2. uPattern is an unescaped match-one character "_", ++ ** 3. uPattern is an unescaped escape character, or ++ ** 4. uPattern is to be handled as an ordinary character ++ */ ++ if( !prevEscape && uPattern==MATCH_ALL ){ ++ /* Case 1. */ ++ uint8_t c; ++ ++ /* Skip any MATCH_ALL or MATCH_ONE characters that follow a ++ ** MATCH_ALL. For each MATCH_ONE, skip one character in the ++ ** test string. ++ */ ++ while( (c=zPattern[iPattern]) == MATCH_ALL || c == MATCH_ONE ){ ++ if( c==MATCH_ONE ){ ++ if( zString[iString]==0 ) return 0; ++ U8_FWD_1_UNSAFE(zString, iString); ++ } ++ iPattern++; ++ } ++ ++ if( zPattern[iPattern]==0 ) return 1; ++ ++ while( zString[iString] ){ ++ if( icuLikeCompare(&zPattern[iPattern], &zString[iString], uEsc) ){ ++ return 1; ++ } ++ U8_FWD_1_UNSAFE(zString, iString); ++ } ++ return 0; ++ ++ }else if( !prevEscape && uPattern==MATCH_ONE ){ ++ /* Case 2. */ ++ if( zString[iString]==0 ) return 0; ++ U8_FWD_1_UNSAFE(zString, iString); ++ ++ }else if( !prevEscape && uPattern==uEsc){ ++ /* Case 3. */ ++ prevEscape = 1; ++ ++ }else{ ++ /* Case 4. */ ++ UChar32 uString; ++ U8_NEXT_UNSAFE(zString, iString, uString); ++ uString = u_foldCase(uString, U_FOLD_CASE_DEFAULT); ++ uPattern = u_foldCase(uPattern, U_FOLD_CASE_DEFAULT); ++ if( uString!=uPattern ){ ++ return 0; ++ } ++ prevEscape = 0; ++ } ++ } ++ ++ return zString[iString]==0; ++} ++ ++/* ++** Implementation of the like() SQL function. This function implements ++** the build-in LIKE operator. The first argument to the function is the ++** pattern and the second argument is the string. So, the SQL statements: ++** ++** A LIKE B ++** ++** is implemented as like(B, A). If there is an escape character E, ++** ++** A LIKE B ESCAPE E ++** ++** is mapped to like(B, A, E). ++*/ ++static void icuLikeFunc( ++ sqlite3_context *context, ++ int argc, ++ sqlite3_value **argv ++){ ++ const unsigned char *zA = sqlite3_value_text(argv[0]); ++ const unsigned char *zB = sqlite3_value_text(argv[1]); ++ UChar32 uEsc = 0; ++ ++ /* Limit the length of the LIKE or GLOB pattern to avoid problems ++ ** of deep recursion and N*N behavior in patternCompare(). ++ */ ++ if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){ ++ sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1); ++ return; ++ } ++ ++ ++ if( argc==3 ){ ++ /* The escape character string must consist of a single UTF-8 character. ++ ** Otherwise, return an error. ++ */ ++ int nE= sqlite3_value_bytes(argv[2]); ++ const unsigned char *zE = sqlite3_value_text(argv[2]); ++ int i = 0; ++ if( zE==0 ) return; ++ U8_NEXT(zE, i, nE, uEsc); ++ if( i!=nE){ ++ sqlite3_result_error(context, ++ "ESCAPE expression must be a single character", -1); ++ return; ++ } ++ } ++ ++ if( zA && zB ){ ++ sqlite3_result_int(context, icuLikeCompare(zA, zB, uEsc)); ++ } ++} ++ ++/* ++** This function is called when an ICU function called from within ++** the implementation of an SQL scalar function returns an error. ++** ++** The scalar function context passed as the first argument is ++** loaded with an error message based on the following two args. ++*/ ++static void icuFunctionError( ++ sqlite3_context *pCtx, /* SQLite scalar function context */ ++ const char *zName, /* Name of ICU function that failed */ ++ UErrorCode e /* Error code returned by ICU function */ ++){ ++ char zBuf[128]; ++ sqlite3_snprintf(128, zBuf, "ICU error: %s(): %s", zName, u_errorName(e)); ++ zBuf[127] = '\0'; ++ sqlite3_result_error(pCtx, zBuf, -1); ++} ++ ++/* ++** Function to delete compiled regexp objects. Registered as ++** a destructor function with sqlite3_set_auxdata(). ++*/ ++static void icuRegexpDelete(void *p){ ++ URegularExpression *pExpr = (URegularExpression *)p; ++ uregex_close(pExpr); ++} ++ ++/* ++** Implementation of SQLite REGEXP operator. This scalar function takes ++** two arguments. The first is a regular expression pattern to compile ++** the second is a string to match against that pattern. If either ++** argument is an SQL NULL, then NULL Is returned. Otherwise, the result ++** is 1 if the string matches the pattern, or 0 otherwise. ++** ++** SQLite maps the regexp() function to the regexp() operator such ++** that the following two are equivalent: ++** ++** zString REGEXP zPattern ++** regexp(zPattern, zString) ++** ++** Uses the following ICU regexp APIs: ++** ++** uregex_open() ++** uregex_matches() ++** uregex_close() ++*/ ++static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){ ++ UErrorCode status = U_ZERO_ERROR; ++ URegularExpression *pExpr; ++ UBool res; ++ const UChar *zString = sqlite3_value_text16(apArg[1]); ++ ++ (void)nArg; /* Unused parameter */ ++ ++ /* If the left hand side of the regexp operator is NULL, ++ ** then the result is also NULL. ++ */ ++ if( !zString ){ ++ return; ++ } ++ ++ pExpr = sqlite3_get_auxdata(p, 0); ++ if( !pExpr ){ ++ const UChar *zPattern = sqlite3_value_text16(apArg[0]); ++ if( !zPattern ){ ++ return; ++ } ++ pExpr = uregex_open(zPattern, -1, 0, 0, &status); ++ ++ if( U_SUCCESS(status) ){ ++ sqlite3_set_auxdata(p, 0, pExpr, icuRegexpDelete); ++ }else{ ++ assert(!pExpr); ++ icuFunctionError(p, "uregex_open", status); ++ return; ++ } ++ } ++ ++ /* Configure the text that the regular expression operates on. */ ++ uregex_setText(pExpr, zString, -1, &status); ++ if( !U_SUCCESS(status) ){ ++ icuFunctionError(p, "uregex_setText", status); ++ return; ++ } ++ ++ /* Attempt the match */ ++ res = uregex_matches(pExpr, 0, &status); ++ if( !U_SUCCESS(status) ){ ++ icuFunctionError(p, "uregex_matches", status); ++ return; ++ } ++ ++ /* Set the text that the regular expression operates on to a NULL ++ ** pointer. This is not really necessary, but it is tidier than ++ ** leaving the regular expression object configured with an invalid ++ ** pointer after this function returns. ++ */ ++ uregex_setText(pExpr, 0, 0, &status); ++ ++ /* Return 1 or 0. */ ++ sqlite3_result_int(p, res ? 1 : 0); ++} ++ ++/* ++** Implementations of scalar functions for case mapping - upper() and ++** lower(). Function upper() converts its input to upper-case (ABC). ++** Function lower() converts to lower-case (abc). ++** ++** ICU provides two types of case mapping, "general" case mapping and ++** "language specific". Refer to ICU documentation for the differences ++** between the two. ++** ++** To utilise "general" case mapping, the upper() or lower() scalar ++** functions are invoked with one argument: ++** ++** upper('ABC') -> 'abc' ++** lower('abc') -> 'ABC' ++** ++** To access ICU "language specific" case mapping, upper() or lower() ++** should be invoked with two arguments. The second argument is the name ++** of the locale to use. Passing an empty string ("") or SQL NULL value ++** as the second argument is the same as invoking the 1 argument version ++** of upper() or lower(). ++** ++** lower('I', 'en_us') -> 'i' ++** lower('I', 'tr_tr') -> 'ı' (small dotless i) ++** ++** http://www.icu-project.org/userguide/posix.html#case_mappings ++*/ ++static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){ ++ const UChar *zInput; ++ UChar *zOutput; ++ int nInput; ++ int nOutput; ++ ++ UErrorCode status = U_ZERO_ERROR; ++ const char *zLocale = 0; ++ ++ assert(nArg==1 || nArg==2); ++ if( nArg==2 ){ ++ zLocale = (const char *)sqlite3_value_text(apArg[1]); ++ } ++ ++ zInput = sqlite3_value_text16(apArg[0]); ++ if( !zInput ){ ++ return; ++ } ++ nInput = sqlite3_value_bytes16(apArg[0]); ++ ++ nOutput = nInput * 2 + 2; ++ zOutput = sqlite3_malloc(nOutput); ++ if( !zOutput ){ ++ return; ++ } ++ ++ if( sqlite3_user_data(p) ){ ++ u_strToUpper(zOutput, nOutput/2, zInput, nInput/2, zLocale, &status); ++ }else{ ++ u_strToLower(zOutput, nOutput/2, zInput, nInput/2, zLocale, &status); ++ } ++ ++ if( !U_SUCCESS(status) ){ ++ icuFunctionError(p, "u_strToLower()/u_strToUpper", status); ++ return; ++ } ++ ++ sqlite3_result_text16(p, zOutput, -1, xFree); ++} ++ ++/* ++** Collation sequence destructor function. The pCtx argument points to ++** a UCollator structure previously allocated using ucol_open(). ++*/ ++static void icuCollationDel(void *pCtx){ ++ UCollator *p = (UCollator *)pCtx; ++ ucol_close(p); ++} ++ ++/* ++** Collation sequence comparison function. The pCtx argument points to ++** a UCollator structure previously allocated using ucol_open(). ++*/ ++static int icuCollationColl( ++ void *pCtx, ++ int nLeft, ++ const void *zLeft, ++ int nRight, ++ const void *zRight ++){ ++ UCollationResult res; ++ UCollator *p = (UCollator *)pCtx; ++ res = ucol_strcoll(p, (UChar *)zLeft, nLeft/2, (UChar *)zRight, nRight/2); ++ switch( res ){ ++ case UCOL_LESS: return -1; ++ case UCOL_GREATER: return +1; ++ case UCOL_EQUAL: return 0; ++ } ++ assert(!"Unexpected return value from ucol_strcoll()"); ++ return 0; ++} ++ ++/* ++** Implementation of the scalar function icu_load_collation(). ++** ++** This scalar function is used to add ICU collation based collation ++** types to an SQLite database connection. It is intended to be called ++** as follows: ++** ++** SELECT icu_load_collation(, ); ++** ++** Where is a string containing an ICU locale identifier (i.e. ++** "en_AU", "tr_TR" etc.) and is the name of the ++** collation sequence to create. ++*/ ++static void icuLoadCollation( ++ sqlite3_context *p, ++ int nArg, ++ sqlite3_value **apArg ++){ ++ sqlite3 *db = (sqlite3 *)sqlite3_user_data(p); ++ UErrorCode status = U_ZERO_ERROR; ++ const char *zLocale; /* Locale identifier - (eg. "jp_JP") */ ++ const char *zName; /* SQL Collation sequence name (eg. "japanese") */ ++ UCollator *pUCollator; /* ICU library collation object */ ++ int rc; /* Return code from sqlite3_create_collation_x() */ ++ ++ assert(nArg==2); ++ zLocale = (const char *)sqlite3_value_text(apArg[0]); ++ zName = (const char *)sqlite3_value_text(apArg[1]); ++ ++ if( !zLocale || !zName ){ ++ return; ++ } ++ ++ pUCollator = ucol_open(zLocale, &status); ++ if( !U_SUCCESS(status) ){ ++ icuFunctionError(p, "ucol_open", status); ++ return; ++ } ++ assert(p); ++ ++ rc = sqlite3_create_collation_v2(db, zName, SQLITE_UTF16, (void *)pUCollator, ++ icuCollationColl, icuCollationDel ++ ); ++ if( rc!=SQLITE_OK ){ ++ ucol_close(pUCollator); ++ sqlite3_result_error(p, "Error registering collation function", -1); ++ } ++} ++ ++/* ++** Register the ICU extension functions with database db. ++*/ ++int sqlite3IcuInit(sqlite3 *db){ ++ struct IcuScalar { ++ const char *zName; /* Function name */ ++ int nArg; /* Number of arguments */ ++ int enc; /* Optimal text encoding */ ++ void *pContext; /* sqlite3_user_data() context */ ++ void (*xFunc)(sqlite3_context*,int,sqlite3_value**); ++ } scalars[] = { ++ {"regexp", 2, SQLITE_ANY, 0, icuRegexpFunc}, ++ ++ {"lower", 1, SQLITE_UTF16, 0, icuCaseFunc16}, ++ {"lower", 2, SQLITE_UTF16, 0, icuCaseFunc16}, ++ {"upper", 1, SQLITE_UTF16, (void*)1, icuCaseFunc16}, ++ {"upper", 2, SQLITE_UTF16, (void*)1, icuCaseFunc16}, ++ ++ {"lower", 1, SQLITE_UTF8, 0, icuCaseFunc16}, ++ {"lower", 2, SQLITE_UTF8, 0, icuCaseFunc16}, ++ {"upper", 1, SQLITE_UTF8, (void*)1, icuCaseFunc16}, ++ {"upper", 2, SQLITE_UTF8, (void*)1, icuCaseFunc16}, ++ ++ {"like", 2, SQLITE_UTF8, 0, icuLikeFunc}, ++ {"like", 3, SQLITE_UTF8, 0, icuLikeFunc}, ++ ++ {"icu_load_collation", 2, SQLITE_UTF8, (void*)db, icuLoadCollation}, ++ }; ++ ++ int rc = SQLITE_OK; ++ int i; ++ ++ for(i=0; rc==SQLITE_OK && i<(int)(sizeof(scalars)/sizeof(scalars[0])); i++){ ++ struct IcuScalar *p = &scalars[i]; ++ rc = sqlite3_create_function( ++ db, p->zName, p->nArg, p->enc, p->pContext, p->xFunc, 0, 0 ++ ); ++ } ++ ++ return rc; ++} ++ ++#if !SQLITE_CORE ++#ifdef _WIN32 ++__declspec(dllexport) ++#endif ++int sqlite3_icu_init( ++ sqlite3 *db, ++ char **pzErrMsg, ++ const sqlite3_api_routines *pApi ++){ ++ SQLITE_EXTENSION_INIT2(pApi) ++ return sqlite3IcuInit(db); ++} ++#endif ++ ++#endif +--- origsrc/sqlite-autoconf-3080300/shell.c 2014-02-03 15:04:55.000000000 +0100 ++++ src/sqlite-autoconf-3080300/shell.c 2014-02-04 12:53:52.214919200 +0100 +@@ -28,11 +28,24 @@ + # define _LARGEFILE_SOURCE 1 + #endif + ++#define SQLITE_CORE 1 ++#define SQLITE_ENABLE_ICU 1 ++#define SQLITE_ENABLE_ZLIB 1 ++ + #include + #include + #include + #include + #include "sqlite3.h" ++#ifndef SQLITE_CORE ++# define SQLITE_CORE 1 /* Disable the API redefinition in sqlite3ext.h */ ++#endif ++#ifdef SQLITE_ENABLE_ICU ++#include "icu.c" ++#endif ++#ifdef SQLITE_ENABLE_ZLIB ++#include "zlib.c" ++#endif + #include + #include + +@@ -482,7 +495,7 @@ struct callback_data { + #define MODE_Csv 7 /* Quote strings, numbers are plain */ + #define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */ + +-static const char *modeDescr[] = { ++static const char *const modeDescr[] = { + "line", + "column", + "list", +@@ -1156,7 +1169,7 @@ static int display_stats( + ** is equal, according to strcmp(), to any of the strings in the array. + ** Otherwise, return zero. + */ +-static int str_in_array(const char *zStr, const char **azArray){ ++static int str_in_array(const char *zStr, const char *const *azArray){ + int i; + for(i=0; azArray[i]; i++){ + if( 0==strcmp(zStr, azArray[i]) ) return 1; +@@ -1188,9 +1201,9 @@ static void explain_data_prepare(struct + int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */ + int iOp; /* Index of operation in p->aiIndent[] */ + +- const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 }; +- const char *azYield[] = { "Yield", "SeekLt", "SeekGt", "RowSetRead", "Rewind", 0 }; +- const char *azGoto[] = { "Goto", 0 }; ++ const char *const azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 }; ++ const char *const azYield[] = { "Yield", "SeekLt", "SeekGt", "RowSetRead", "Rewind", 0 }; ++ const char *const azGoto[] = { "Goto", 0 }; + + /* Try to figure out if this is really an EXPLAIN statement. If this + ** cannot be verified, return early. */ +@@ -2772,6 +2785,9 @@ static int do_meta_command(char *zLine, + { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS }, + { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD }, + { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC }, ++ { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT }, ++ { "explain_stmt", SQLITE_TESTCTRL_EXPLAIN_STMT }, ++ { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT } + }; + int testctrl = -1; + int rc = 0; +@@ -2866,6 +2882,9 @@ static int do_meta_command(char *zLine, + case SQLITE_TESTCTRL_FAULT_INSTALL: + case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: + case SQLITE_TESTCTRL_SCRATCHMALLOC: ++ case SQLITE_TESTCTRL_LOCALTIME_FAULT: ++ case SQLITE_TESTCTRL_EXPLAIN_STMT: ++ case SQLITE_TESTCTRL_NEVER_CORRUPT: + default: + fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n", + azArg[1]); +@@ -3271,6 +3290,9 @@ static void usage(int showDetail){ + ** Initialize the state information in data + */ + static void main_init(struct callback_data *data) { ++#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(SQLITE_WIN32_NO_WIDE) ++ sqlite3_vfs *pVfs; ++#endif + memset(data, 0, sizeof(*data)); + data->mode = MODE_List; + memcpy(data->separator,"|", 2); +@@ -3280,6 +3302,18 @@ static void main_init(struct callback_da + sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); + sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); + sqlite3_config(SQLITE_CONFIG_SINGLETHREAD); ++#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(SQLITE_WIN32_NO_WIDE) ++ pVfs = sqlite3_vfs_find("win32-longpath"); ++ if( pVfs ){ ++ sqlite3_vfs_register(pVfs, 1); ++ } ++#endif ++#ifdef SQLITE_ENABLE_ICU ++ sqlite3_auto_extension((void *)sqlite3IcuInit); ++#endif ++#ifdef SQLITE_ENABLE_ZLIB ++ sqlite3_auto_extension((void *)sqlite3ZlibInit); ++#endif + } + + /* +@@ -3303,9 +3337,9 @@ int main(int argc, char **argv){ + int i; + int rc = 0; + +- if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){ +- fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n", +- sqlite3_sourceid(), SQLITE_SOURCE_ID); ++ if( sqlite3_libversion_number()<3008000 ){ ++ fprintf(stderr, "Unsuitable SQLite version %s, must be at least 3.8.0", ++ sqlite3_libversion()); + exit(1); + } + Argv0 = argv[0]; +--- origsrc/sqlite-autoconf-3080300/sqlite3.c 2014-02-03 15:04:55.000000000 +0100 ++++ src/sqlite-autoconf-3080300/sqlite3.c 2014-02-04 12:53:52.284923200 +0100 +@@ -137,7 +137,7 @@ extern "C" { + */ + #define SQLITE_VERSION "3.8.3" + #define SQLITE_VERSION_NUMBER 3008003 +-#define SQLITE_SOURCE_ID "2014-02-03 14:04:11 6c643e45c274e755dc5a1a65673df79261c774be" ++#define SQLITE_SOURCE_ID "2014-02-03 13:52:03 e816dd924619db5f766de6df74ea2194f3e3b538" + + /* + ** CAPI3REF: Run-Time Library Version Numbers +@@ -9779,7 +9779,10 @@ SQLITE_PRIVATE void sqlite3PCacheSetDefa + #if !defined(SQLITE_OS_UNIX) && !defined(SQLITE_OS_OTHER) + # define SQLITE_OS_OTHER 0 + # ifndef SQLITE_OS_WIN +-# if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__) ++# if defined(__CYGWIN__) ++# define SQLITE_OS_WIN 1 ++# define SQLITE_OS_UNIX 1 ++# elif defined(_WIN32) || defined(WIN32) || defined(__MINGW32__) || defined(__BORLANDC__) + # define SQLITE_OS_WIN 1 + # define SQLITE_OS_UNIX 0 + # else +@@ -9795,7 +9798,7 @@ SQLITE_PRIVATE void sqlite3PCacheSetDefa + # endif + #endif + +-#if SQLITE_OS_WIN ++#if SQLITE_OS_WIN && !defined(__CYGWIN__) + # include + #endif + +@@ -10067,10 +10070,10 @@ SQLITE_PRIVATE int sqlite3OsCloseFree(sq + # define SQLITE_MUTEX_OMIT + #endif + #if SQLITE_THREADSAFE && !defined(SQLITE_MUTEX_NOOP) +-# if SQLITE_OS_UNIX +-# define SQLITE_MUTEX_PTHREADS +-# elif SQLITE_OS_WIN ++# if SQLITE_OS_WIN + # define SQLITE_MUTEX_W32 ++# elif SQLITE_OS_UNIX ++# define SQLITE_MUTEX_PTHREADS + # else + # define SQLITE_MUTEX_NOOP + # endif +@@ -12743,6 +12746,8 @@ SQLITE_PRIVATE void sqlite3WithPush(Pa + #else + #define sqlite3WithPush(x,y,z) + #define sqlite3WithDelete(x,y) ++#define sqlite3WithAdd(p,w,t,x,y) (sqlite3ErrorMsg((p), \ ++ "near \"%T\": syntax error", (t)),(With*)(w)) + #endif + + /* Declarations for functions in fkey.c. All of these are replaced by +@@ -18789,6 +18794,10 @@ SQLITE_PRIVATE sqlite3_mutex_methods con + ** This file contains the C functions that implement mutexes for win32 + */ + ++#ifdef __CYGWIN__ ++# include /* amalgamator: keep */ ++#endif ++ + /* + ** The code in this file is only used if we are compiling multithreaded + ** on a win32 system. +@@ -18885,6 +18894,9 @@ static int winMutex_isInit = 0; + */ + static LONG winMutex_lock = 0; + ++#if defined(__CYGWIN__) && defined(SQLITE_AMALGAMATION) ++static ++#endif + SQLITE_API void sqlite3_win32_sleep(DWORD milliseconds); /* os_win.c */ + + static int winMutexInit(void){ +@@ -23413,7 +23425,7 @@ SQLITE_PRIVATE const char *sqlite3Opcode + ** where the database is located. + */ + #if !defined(SQLITE_ENABLE_LOCKING_STYLE) +-# if defined(__APPLE__) ++# if defined(__APPLE__) || defined(__CYGWIN__) + # define SQLITE_ENABLE_LOCKING_STYLE 1 + # else + # define SQLITE_ENABLE_LOCKING_STYLE 0 +@@ -23472,13 +23484,17 @@ SQLITE_PRIVATE const char *sqlite3Opcode + #include + #endif + ++#ifdef __CYGWIN__ ++# include ++#endif + +-#if SQLITE_ENABLE_LOCKING_STYLE ++#if SQLITE_ENABLE_LOCKING_STYLE || defined(__CYGWIN__) + # include +-# if OS_VXWORKS ++# if OS_VXWORKS || defined(__CYGWIN__) + # include + # include +-# else ++# endif ++# if !OS_VXWORKS + # include + # include + # endif +@@ -23523,7 +23539,15 @@ SQLITE_PRIVATE const char *sqlite3Opcode + /* + ** Maximum supported path-length. + */ +-#define MAX_PATHNAME 512 ++#ifndef MAX_PATHNAME ++# if defined(PATH_MAX) ++# define MAX_PATHNAME PATH_MAX ++# elif defined(MAXPATHLEN) ++# define MAX_PATHNAME MAXPATHLEN ++# else ++# define MAX_PATHNAME 512 ++# endif ++#endif + + /* + ** Only set the lastErrno if the error code is a real error and not +@@ -23581,7 +23605,7 @@ struct unixFile { + #if SQLITE_ENABLE_LOCKING_STYLE + int openFlags; /* The flags specified at open() */ + #endif +-#if SQLITE_ENABLE_LOCKING_STYLE || defined(__APPLE__) ++#if SQLITE_ENABLE_LOCKING_STYLE && !defined(__CYGWIN__) || defined(__APPLE__) + unsigned fsFlags; /* cached details from statfs() */ + #endif + #if OS_VXWORKS +@@ -23913,6 +23937,7 @@ static int openDirectory(const char*, in + ** testing and sandboxing. The following array holds the names and pointers + ** to all overrideable system calls. + */ ++#define aSyscall aUnixSyscall + static struct unix_syscall { + const char *zName; /* Name of the system call */ + sqlite3_syscall_ptr pCurrent; /* Current value of the system call */ +@@ -24409,7 +24434,9 @@ struct vxworksFileId { + ** variable: + */ + static struct vxworksFileId *vxworksFileList = 0; ++#endif /* OS_VXWORKS */ + ++#if OS_VXWORKS || defined(__CYGWIN__) + /* + ** Simplify a filename into its canonical form + ** by making the following changes: +@@ -24428,7 +24455,13 @@ static int vxworksSimplifyName(char *z, + while( n>1 && z[n-1]=='/' ){ n--; } + for(i=j=0; ictrlFlags |= UNIXFILE_EXCL; ++ ioMethods = &posixIoMethods; ++ }else if( sqlite3_stricmp(strategy, "posix") == 0 ){ ++ ioMethods = &posixIoMethods; ++ }else if( sqlite3_stricmp(strategy, "bsd") == 0 ++ || sqlite3_stricmp(strategy, "flock") == 0 ){ ++ ioMethods = &flockIoMethods; ++ }else if( sqlite3_stricmp(strategy, "dotfile") == 0 ){ ++ ioMethods = &dotlockIoMethods; ++ }else if( sqlite3_stricmp(strategy, "nfs") == 0 ){ ++ ioMethods = &nfsIoMethods; ++ }else if( sqlite3_stricmp(strategy, "none") == 0 ){ ++ ioMethods = &nolockIoMethods; ++ }else if( sqlite3_strnicmp(strategy, "win", 3) == 0 ++ || sqlite3_strnicmp(strategy, "cyg", 3) == 0 ++ || sqlite3_stricmp(strategy, "proxy") == 0 ){ ++ /* Fall back to original default */ ++ ioMethods = &cygwinIoMethods; ++ } ++ } ++ } ++ return ioMethods; ++} ++static const sqlite3_io_methods ++ *(*const autolockIoFinder)(const char*,unixFile*) = autolockIoFinderImpl; ++ ++#endif /* OS_VXWORKS && SQLITE_ENABLE_LOCKING_STYLE */ ++ + /* + ** An abstract type for a pointer to a IO method finder function: + */ +@@ -28745,7 +28851,7 @@ static int fillInUnixFile( + ** exception is when opening the proxy "conch" file in builds that + ** include the special Apple locking styles. + */ +-#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE ++#if (defined(__APPLE__) || defined(__CYGWIN__)) && SQLITE_ENABLE_LOCKING_STYLE + assert( zFilename==0 || zFilename[0]=='/' + || pVfs->pAppData==(void*)&autolockIoFinder ); + #else +@@ -28792,7 +28898,7 @@ static int fillInUnixFile( + } + + if( pLockingStyle == &posixIoMethods +-#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE ++#if (defined(__APPLE__) || defined(__CYGWIN__)) && SQLITE_ENABLE_LOCKING_STYLE + || pLockingStyle == &nfsIoMethods + #endif + ){ +@@ -28868,7 +28974,7 @@ static int fillInUnixFile( + pNew->lockingContext = zLockFile; + } + +-#if OS_VXWORKS ++#if OS_VXWORKS || defined(__CYGWIN__) + else if( pLockingStyle == &semIoMethods ){ + /* Named semaphore locking uses the file path so it needs to be + ** included in the semLockingContext +@@ -28878,8 +28984,14 @@ static int fillInUnixFile( + if( (rc==SQLITE_OK) && (pNew->pInode->pSem==NULL) ){ + char *zSemName = pNew->pInode->aSemName; + int n; ++#if OS_VXWORKS + sqlite3_snprintf(MAX_PATHNAME, zSemName, "/%s.sem", + pNew->pId->zCanonicalName); ++#else ++ sqlite3_snprintf(MAX_PATHNAME, zSemName, "/%s.sem", ++ zFilename); ++ vxworksSimplifyName(zSemName, MAX_PATHNAME); ++#endif + for( n=1; zSemName[n]; n++ ) + if( zSemName[n]=='/' ) zSemName[n] = '_'; + pNew->pInode->pSem = sem_open(zSemName, O_CREAT, 0666, 1); +@@ -28891,6 +29003,15 @@ static int fillInUnixFile( + unixLeaveMutex(); + } + #endif ++ ++#if defined(__CYGWIN__) ++ else if( pLockingStyle == &cygwinIoMethods ){ ++ if ((osFcntl(h, F_LCK_MANDATORY, 1) != 0) && (errno != EINVAL)) { ++ /* The API exists but it refused to enable mandatory locking! */ ++ rc = SQLITE_IOERR_ACCESS; ++ } ++ } ++#endif + + pNew->lastErrno = 0; + #if OS_VXWORKS +@@ -28920,6 +29041,8 @@ static const char *unixTempFileDir(void) + 0, + 0, + 0, ++ 0, ++ 0, + "/var/tmp", + "/usr/tmp", + "/tmp", +@@ -28932,6 +29055,8 @@ static const char *unixTempFileDir(void) + azDirs[0] = sqlite3_temp_directory; + if( !azDirs[1] ) azDirs[1] = getenv("SQLITE_TMPDIR"); + if( !azDirs[2] ) azDirs[2] = getenv("TMPDIR"); ++ if( !azDirs[3] ) azDirs[2] = getenv("TMP"); ++ if( !azDirs[4] ) azDirs[3] = getenv("TEMP"); + for(i=0; iopenFlags = openFlags; + } +@@ -29332,7 +29457,7 @@ static int unixOpen( + noLock = eType!=SQLITE_OPEN_MAIN_DB; + + +-#if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE ++#if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE && !defined(__CYGWIN__) + if( fstatfs(fd, &fsInfo) == -1 ){ + ((unixFile*)pFile)->lastErrno = errno; + robust_close(p, fd, __LINE__); +@@ -29350,7 +29475,7 @@ static int unixOpen( + if( syncDir ) ctrlFlags |= UNIXFILE_DIRSYNC; + if( flags & SQLITE_OPEN_URI ) ctrlFlags |= UNIXFILE_URI; + +-#if SQLITE_ENABLE_LOCKING_STYLE ++#if SQLITE_ENABLE_LOCKING_STYLE && !defined(__CYGWIN__) + #if SQLITE_PREFER_PROXY_LOCKING + isAutoProxy = 1; + #endif +@@ -29492,6 +29617,13 @@ static int unixAccess( + } + + ++#if SQLITE_OS_WIN ++# if defined(SQLITE_AMALGAMATION) ++ static ++# endif ++ void winSimplifyName(char *z); ++#endif ++ + /* + ** Turn a relative pathname into a full pathname. The relative path + ** is stored as a nul-terminated string in the buffer pointed to by +@@ -29507,6 +29639,9 @@ static int unixFullPathname( + int nOut, /* Size of output buffer in bytes */ + char *zOut /* Output buffer */ + ){ ++#ifdef __CYGWIN__ ++ int i; ++#endif + + /* It's odd to simulate an io-error here, but really this is just + ** using the io-error infrastructure to test that SQLite handles this +@@ -29519,6 +29654,35 @@ static int unixFullPathname( + UNUSED_PARAMETER(pVfs); + + zOut[nOut-1] = '\0'; ++#ifdef __CYGWIN__ ++ if( sqlite3Isalpha(zPath[0]) && (zPath[1]==':') ++ && ((zPath[2]=='\\') || (zPath[2]=='/')) ){ ++ int nDrive; ++ char temp[4]; ++ temp[0] = zPath[0]; ++ memcpy(&temp[1], ":\\", 3); ++ cygwin_conv_path(CCP_WIN_A_TO_POSIX, temp, zOut, nOut); ++ nDrive = (int)strlen(zOut); ++ sqlite3_snprintf(nOut-nDrive, &zOut[nDrive], "%s", zPath+2); ++ }else if( ((zPath[0]=='\\') || (zPath[0]=='/')) && ((zPath[1]=='\\') || (zPath[1]=='/')) ++ && (zPath[2]=='?') && ((zPath[3]=='\\') || (zPath[3]=='/')) && sqlite3Isalpha(zPath[4]) ++ && (zPath[5]==':') && ((zPath[6]=='\\') || (zPath[6]=='/')) ){ ++ int nDrive; ++ char temp[4]; ++ temp[0] = zPath[4]; ++ memcpy(&temp[1], ":\\", 3); ++ cygwin_conv_path(CCP_WIN_A_TO_POSIX, temp, zOut, nOut); ++ nDrive = (int)strlen(zOut); ++ sqlite3_snprintf(nOut-nDrive, &zOut[nDrive], "%s", zPath+6); ++ }else if( ((zPath[0]=='\\') || (zPath[0]=='/')) && ((zPath[1]=='\\') || (zPath[1]=='/')) ++ && (zPath[2]=='?') && ((zPath[3]=='\\') || (zPath[3]=='/')) && sqlite3_strnicmp(zPath+4, "UNC", 3)==0 ++ && ((zPath[7]=='\\') || (zPath[7]=='/')) ){ ++ /* UNC paths in Cygwin start with "//" */ ++ sqlite3_snprintf(nOut, zOut, "//%s", zPath+8); ++ }else if( zPath[0]=='\\' ){ ++ sqlite3_snprintf(nOut, zOut, "%s", zPath); ++ }else ++#endif + if( zPath[0]=='/' ){ + sqlite3_snprintf(nOut, zOut, "%s", zPath); + }else{ +@@ -29529,6 +29693,9 @@ static int unixFullPathname( + nCwd = (int)strlen(zOut); + sqlite3_snprintf(nOut-nCwd, &zOut[nCwd], "/%s", zPath); + } ++#if SQLITE_OS_WIN && defined(__CYGWIN__) ++ winSimplifyName(zOut); ++#endif + return SQLITE_OK; + } + +@@ -29672,7 +29839,7 @@ static int unixSleep(sqlite3_vfs *NotUse + ** sqlite3OsCurrentTime() during testing. + */ + #ifdef SQLITE_TEST +-SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */ ++SQLITE_API extern int sqlite3_current_time; /* Fake system time in seconds since 1970. */ + #endif + + /* +@@ -29897,9 +30064,9 @@ static int unixGetLastError(sqlite3_vfs + */ + + /* +-** Proxy locking is only available on MacOSX ++** Proxy locking is only available on MacOSX/Cygwin + */ +-#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE ++#if (defined(__APPLE__) || defined(__CYGWIN__)) && SQLITE_ENABLE_LOCKING_STYLE + + /* + ** The proxyLockingContext has the path and file structures for the remote +@@ -29965,7 +30132,7 @@ static int proxyGetLockPath(const char * + */ + static int proxyCreateLockPath(const char *lockPath){ + int i, len; +- char buf[MAXPATHLEN]; ++ char buf[MAX_PATHNAME]; + int start = 0; + + assert(lockPath!=NULL); +@@ -30090,6 +30257,12 @@ end_create_proxy: + SQLITE_API int sqlite3_hostid_num = 0; + #endif + ++#ifdef __CYGWIN__ ++# define st_mtimespec st_mtim ++# undef uuid_t ++# define uuid_t void * ++#endif ++ + #define PROXY_HOSTIDLEN 16 /* conch file host id length */ + + /* Not always defined in the headers as it ought to be */ +@@ -30131,7 +30304,7 @@ static int proxyGetHostID(unsigned char + #define PROXY_CONCHVERSION 2 /* 1-byte header, 16-byte host id, path */ + #define PROXY_HEADERLEN 1 /* conch file header length */ + #define PROXY_PATHINDEX (PROXY_HEADERLEN+PROXY_HOSTIDLEN) +-#define PROXY_MAXCONCHLEN (PROXY_HEADERLEN+PROXY_HOSTIDLEN+MAXPATHLEN) ++#define PROXY_MAXCONCHLEN (PROXY_HEADERLEN+PROXY_HOSTIDLEN+MAX_PATHNAME) + + /* + ** Takes an open conch file, copies the contents to a new path and then moves +@@ -30142,7 +30315,7 @@ static int proxyGetHostID(unsigned char + static int proxyBreakConchLock(unixFile *pFile, uuid_t myHostID){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + unixFile *conchFile = pCtx->conchFile; +- char tPath[MAXPATHLEN]; ++ char tPath[MAX_PATHNAME]; + char buf[PROXY_MAXCONCHLEN]; + char *cPath = pCtx->conchFilePath; + size_t readLen = 0; +@@ -30153,8 +30326,8 @@ static int proxyBreakConchLock(unixFile + UNUSED_PARAMETER(myHostID); + + /* create a new path by replace the trailing '-conch' with '-break' */ +- pathLen = strlcpy(tPath, cPath, MAXPATHLEN); +- if( pathLen>MAXPATHLEN || pathLen<6 || ++ pathLen = strlcpy(tPath, cPath, MAX_PATHNAME); ++ if( pathLen>MAX_PATHNAME || pathLen<6 || + (strlcpy(&tPath[pathLen-5], "break", 6) != 5) ){ + sqlite3_snprintf(sizeof(errmsg),errmsg,"path error (len %d)",(int)pathLen); + goto end_breaklock; +@@ -30287,7 +30460,7 @@ static int proxyTakeConch(unixFile *pFil + uuid_t myHostID; + int pError = 0; + char readBuf[PROXY_MAXCONCHLEN]; +- char lockPath[MAXPATHLEN]; ++ char lockPath[MAX_PATHNAME]; + char *tempLockPath = NULL; + int rc = SQLITE_OK; + int createConch = 0; +@@ -30339,8 +30512,8 @@ static int proxyTakeConch(unixFile *pFil + if( hostIdMatch ){ + size_t pathLen = (readLen - PROXY_PATHINDEX); + +- if( pathLen>=MAXPATHLEN ){ +- pathLen=MAXPATHLEN-1; ++ if( pathLen>=MAX_PATHNAME ){ ++ pathLen=MAX_PATHNAME-1; + } + memcpy(lockPath, &readBuf[PROXY_PATHINDEX], pathLen); + lockPath[pathLen] = 0; +@@ -30366,7 +30539,7 @@ static int proxyTakeConch(unixFile *pFil + + /* either the conch didn't match or we need to create a new one */ + if( !pCtx->lockProxyPath ){ +- proxyGetLockPath(pCtx->dbPath, lockPath, MAXPATHLEN); ++ proxyGetLockPath(pCtx->dbPath, lockPath, MAX_PATHNAME); + tempLockPath = lockPath; + /* create a copy of the lock path _only_ if the conch is taken */ + } +@@ -30394,9 +30567,9 @@ static int proxyTakeConch(unixFile *pFil + writeBuffer[0] = (char)PROXY_CONCHVERSION; + memcpy(&writeBuffer[PROXY_HEADERLEN], myHostID, PROXY_HOSTIDLEN); + if( pCtx->lockProxyPath!=NULL ){ +- strlcpy(&writeBuffer[PROXY_PATHINDEX], pCtx->lockProxyPath, MAXPATHLEN); ++ strlcpy(&writeBuffer[PROXY_PATHINDEX], pCtx->lockProxyPath, MAX_PATHNAME); + }else{ +- strlcpy(&writeBuffer[PROXY_PATHINDEX], tempLockPath, MAXPATHLEN); ++ strlcpy(&writeBuffer[PROXY_PATHINDEX], tempLockPath, MAX_PATHNAME); + } + writeSize = PROXY_PATHINDEX + strlen(&writeBuffer[PROXY_PATHINDEX]); + robust_ftruncate(conchFile->h, writeSize); +@@ -30478,11 +30651,13 @@ static int proxyTakeConch(unixFile *pFil + if( rc==SQLITE_OK ){ + pCtx->conchHeld = 1; + ++#if defined(__APPLE__) + if( pCtx->lockProxy->pMethod == &afpIoMethods ){ + afpLockingContext *afpCtx; + afpCtx = (afpLockingContext *)pCtx->lockProxy->lockingContext; + afpCtx->dbPath = pCtx->lockProxyPath; + } ++#endif + } else { + conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK); + } +@@ -30575,7 +30750,7 @@ static int switchLockProxyPath(unixFile + + /* nothing to do if the path is NULL, :auto: or matches the existing path */ + if( !path || path[0]=='\0' || !strcmp(path, ":auto:") || +- (oldPath && !strncmp(oldPath, path, MAXPATHLEN)) ){ ++ (oldPath && !strncmp(oldPath, path, MAX_PATHNAME)) ){ + return SQLITE_OK; + }else{ + unixFile *lockProxy = pCtx->lockProxy; +@@ -30595,7 +30770,7 @@ static int switchLockProxyPath(unixFile + + /* + ** pFile is a file that has been opened by a prior xOpen call. dbPath +-** is a string buffer at least MAXPATHLEN+1 characters in size. ++** is a string buffer at least MAX_PATHNAME+1 characters in size. + ** + ** This routine find the filename associated with pFile and writes it + ** int dbPath. +@@ -30605,8 +30780,8 @@ static int proxyGetDbPathForUnixFile(uni + if( pFile->pMethod == &afpIoMethods ){ + /* afp style keeps a reference to the db path in the filePath field + ** of the struct */ +- assert( (int)strlen((char*)pFile->lockingContext)<=MAXPATHLEN ); +- strlcpy(dbPath, ((afpLockingContext *)pFile->lockingContext)->dbPath, MAXPATHLEN); ++ assert( (int)strlen((char*)pFile->lockingContext)<=MAX_PATHNAME ); ++ strlcpy(dbPath, ((afpLockingContext *)pFile->lockingContext)->dbPath, MAX_PATHNAME); + } else + #endif + if( pFile->pMethod == &dotlockIoMethods ){ +@@ -30616,8 +30791,8 @@ static int proxyGetDbPathForUnixFile(uni + memcpy(dbPath, (char *)pFile->lockingContext, len + 1); + }else{ + /* all other styles use the locking context to store the db file path */ +- assert( strlen((char*)pFile->lockingContext)<=MAXPATHLEN ); +- strlcpy(dbPath, (char *)pFile->lockingContext, MAXPATHLEN); ++ assert( strlen((char*)pFile->lockingContext)<=MAX_PATHNAME ); ++ strlcpy(dbPath, (char *)pFile->lockingContext, MAX_PATHNAME); + } + return SQLITE_OK; + } +@@ -30632,7 +30807,7 @@ static int proxyGetDbPathForUnixFile(uni + */ + static int proxyTransformUnixFile(unixFile *pFile, const char *path) { + proxyLockingContext *pCtx; +- char dbPath[MAXPATHLEN+1]; /* Name of the database file */ ++ char dbPath[MAX_PATHNAME+1]; /* Name of the database file */ + char *lockPath=NULL; + int rc = SQLITE_OK; + +@@ -30664,15 +30839,19 @@ static int proxyTransformUnixFile(unixFi + ** Ugh, since O_RDONLY==0x0000 we test for !O_RDWR since unixOpen asserts + ** that openFlags will have only one of O_RDONLY or O_RDWR. + */ ++#if defined(__APPLE__) + struct statfs fsInfo; ++#endif + struct stat conchInfo; + int goLockless = 0; + + if( osStat(pCtx->conchFilePath, &conchInfo) == -1 ) { + int err = errno; ++#if defined(__APPLE__) + if( (err==ENOENT) && (statfs(dbPath, &fsInfo) != -1) ){ + goLockless = (fsInfo.f_flags&MNT_RDONLY) == MNT_RDONLY; + } ++#endif + } + if( goLockless ){ + pCtx->conchHeld = -1; /* read only FS/ lockless */ +@@ -30753,7 +30932,7 @@ static int proxyFileControl(sqlite3_file + (proxyLockingContext*)pFile->lockingContext; + if( !strcmp(pArg, ":auto:") + || (pCtx->lockProxyPath && +- !strncmp(pCtx->lockProxyPath, proxyPath, MAXPATHLEN)) ++ !strncmp(pCtx->lockProxyPath, proxyPath, MAX_PATHNAME)) + ){ + rc = SQLITE_OK; + }else{ +@@ -30931,7 +31110,15 @@ static int proxyClose(sqlite3_file *id) + ** necessarily been initialized when this routine is called, and so they + ** should not be used. + */ +-SQLITE_API int sqlite3_os_init(void){ ++#if SQLITE_OS_WIN ++#if defined(SQLITE_AMALGAMATION) ++static ++#endif ++SQLITE_API int sqlite3_os_unix_init(void){ ++#else ++SQLITE_API int sqlite3_os_init(void){ ++#endif ++ + /* + ** The following macro defines an initializer for an sqlite3_vfs object. + ** The name of the VFS is NAME. The pAppData is a pointer to a pointer +@@ -30985,25 +31172,33 @@ SQLITE_API int sqlite3_os_init(void){ + ** array cannot be const. + */ + static sqlite3_vfs aVfs[] = { +-#if SQLITE_ENABLE_LOCKING_STYLE && (OS_VXWORKS || defined(__APPLE__)) ++#if SQLITE_ENABLE_LOCKING_STYLE && (OS_VXWORKS || defined(__APPLE__) || defined(__CYGWIN__)) + UNIXVFS("unix", autolockIoFinder ), + #else + UNIXVFS("unix", posixIoFinder ), + #endif ++#ifdef __CYGWIN__ ++ UNIXVFS("unix-cygwin", cygwinIoFinder ), ++#if !SQLITE_OS_WIN ++ UNIXVFS("win32-longpath", cygwinIoFinder ), ++#endif ++#endif + UNIXVFS("unix-none", nolockIoFinder ), + UNIXVFS("unix-dotfile", dotlockIoFinder ), + UNIXVFS("unix-excl", posixIoFinder ), +-#if OS_VXWORKS ++#if OS_VXWORKS || defined(__CYGWIN__) + UNIXVFS("unix-namedsem", semIoFinder ), + #endif + #if SQLITE_ENABLE_LOCKING_STYLE + UNIXVFS("unix-posix", posixIoFinder ), +-#if !OS_VXWORKS +- UNIXVFS("unix-flock", flockIoFinder ), + #endif ++#if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS || defined(__CYGWIN__) ++ UNIXVFS("unix-flock", flockIoFinder ), + #endif +-#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) ++#if SQLITE_ENABLE_LOCKING_STYLE && (defined(__APPLE__) || defined(__CYGWIN__)) ++#if defined(__APPLE__) + UNIXVFS("unix-afp", afpIoFinder ), ++#endif + UNIXVFS("unix-nfs", nfsIoFinder ), + UNIXVFS("unix-proxy", proxyIoFinder ), + #endif +@@ -31021,6 +31216,8 @@ SQLITE_API int sqlite3_os_init(void){ + return SQLITE_OK; + } + ++#undef aSyscall ++#if !SQLITE_OS_WIN + /* + ** Shutdown the operating system interface. + ** +@@ -31031,6 +31228,7 @@ SQLITE_API int sqlite3_os_init(void){ + SQLITE_API int sqlite3_os_end(void){ + return SQLITE_OK; + } ++#endif /* !SQLITE_OS_WIN */ + + #endif /* SQLITE_OS_UNIX */ + +@@ -31053,8 +31251,16 @@ SQLITE_API int sqlite3_os_end(void){ + #if SQLITE_OS_WIN /* This file is used for Windows only */ + + #ifdef __CYGWIN__ +-# include ++/* # include */ ++# include /* amalgamator: keep */ ++# include /* amalgamator: keep */ + # include /* amalgamator: keep */ ++# include /* amalgamator: keep */ ++#else ++enum { ++ CCP_POSIX_TO_WIN_W=1, ++ CCP_WIN_A_TO_POSIX ++}; + #endif + + /* +@@ -31283,7 +31489,8 @@ SQLITE_API int sqlite3_open_file_count = + ** Are most of the Win32 ANSI APIs available (i.e. with certain exceptions + ** based on the sub-platform)? + */ +-#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(SQLITE_WIN32_NO_ANSI) ++#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(_WIN64) \ ++ && !defined(__CYGWIN__) && !defined(SQLITE_WIN32_NO_ANSI) + # define SQLITE_WIN32_HAS_ANSI + #endif + +@@ -31359,7 +31566,11 @@ SQLITE_API int sqlite3_open_file_count = + ** UNICODE_STRING_MAX_CHARS. + */ + #ifndef SQLITE_WINNT_MAX_PATH_CHARS +-# define SQLITE_WINNT_MAX_PATH_CHARS (UNICODE_STRING_MAX_CHARS) ++# ifdef __CYGWIN__ ++# define SQLITE_WINNT_MAX_PATH_CHARS (PATH_MAX) ++# else ++# define SQLITE_WINNT_MAX_PATH_CHARS (UNICODE_STRING_MAX_CHARS) ++# endif + #endif + + /* +@@ -31906,7 +32117,7 @@ static struct win_syscall { + + #define osGetLastError ((DWORD(WINAPI*)(VOID))aSyscall[26].pCurrent) + +-#if !defined(SQLITE_OMIT_LOAD_EXTENSION) ++#if !defined(SQLITE_OMIT_LOAD_EXTENSION) || !defined(__CYGWIN__) + #if SQLITE_OS_WINCE + /* The GetProcAddressA() routine is only available on Windows CE. */ + { "GetProcAddressA", (SYSCALL)GetProcAddressA, 0 }, +@@ -32293,6 +32504,65 @@ static struct win_syscall { + #define osCreateFileMappingFromApp ((HANDLE(WINAPI*)(HANDLE, \ + LPSECURITY_ATTRIBUTES,ULONG,ULONG64,LPCWSTR))aSyscall[75].pCurrent) + ++#if defined(SQLITE_WIN32_HAS_ANSI) && !defined(__CYGWIN__) ++ { "GetModuleHandleA", (SYSCALL)GetModuleHandleA, 0 }, ++#else ++ { "GetModuleHandleA", (SYSCALL)0, 0 }, ++#endif ++ ++#define osGetModuleHandleA ((HMODULE(*)(LPCSTR))aSyscall[76].pCurrent) ++ ++#if defined(SQLITE_WIN32_HAS_WIDE) && !defined(__CYGWIN__) ++ { "GetModuleHandleW", (SYSCALL)GetModuleHandleW, 0 }, ++#else ++ { "GetModuleHandleW", (SYSCALL)0, 0 }, ++#endif ++ ++#define osGetModuleHandleW ((HMODULE(*)(LPCWSTR))aSyscall[77].pCurrent) ++ ++#if defined(__CYGWIN__) ++ { "getenv", (SYSCALL)getenv, 0 }, ++#else ++ { "getenv", (SYSCALL)0, 0 }, ++#endif ++ ++#define getenv ((const char *(*)(const char *))aSyscall[78].pCurrent) ++ ++#if defined(__CYGWIN__) ++ { "getcwd", (SYSCALL)getcwd, 0 }, ++#else ++ { "getcwd", (SYSCALL)0, 0 }, ++#endif ++ ++#define getcwd ((char*(*)(char*,size_t))aSyscall[79].pCurrent) ++ ++#if defined(__CYGWIN__) ++ { "__errno", (SYSCALL)__errno, 0 }, ++#else ++ { "__errno", (SYSCALL)0, 0 }, ++#endif ++ ++#define osErrno (*((int*(*)(void))aSyscall[80].pCurrent)()) ++ ++#if defined(__CYGWIN__) && defined(SQLITE_WIN32_HAS_WIDE) ++ { "cygwin_conv_path", (SYSCALL)cygwin_conv_path, 0 }, ++#else ++ { "cygwin_conv_path", (SYSCALL)0, 0 }, ++#endif ++ ++#define cygwin_conv_path ((ssize_t(*)(unsigned int, \ ++ const void *, void *, size_t))aSyscall[81].pCurrent) ++ ++ { "cygwin_conv_to_full_win32_path", (SYSCALL)0, 0 }, ++ ++#define cygwin_conv_to_full_win32_path ((void(*)(const char *, \ ++ char *))aSyscall[82].pCurrent) ++ ++ { "cygwin_conv_to_full_posix_path", (SYSCALL)0, 0 }, ++ ++#define cygwin_conv_to_full_posix_path ((void(*)(const char *, \ ++ char *))aSyscall[83].pCurrent) ++ + }; /* End of the overrideable system calls */ + + /* +@@ -32466,6 +32736,7 @@ SQLITE_API int sqlite3_win32_reset_heap( + } + #endif /* SQLITE_WIN32_MALLOC */ + ++#ifndef __CYGWIN__ + /* + ** This function outputs the specified (ANSI) string to the Win32 debugger + ** (if available). +@@ -32502,6 +32773,7 @@ SQLITE_API void sqlite3_win32_write_debu + } + #endif + } ++#endif /* !__CYGWIN__ */ + + /* + ** The following routine suspends the current thread for at least ms +@@ -32511,6 +32783,9 @@ SQLITE_API void sqlite3_win32_write_debu + static HANDLE sleepObj = NULL; + #endif + ++#if defined(__CYGWIN__) && defined(SQLITE_AMALGAMATION) ++static ++#endif + SQLITE_API void sqlite3_win32_sleep(DWORD milliseconds){ + #if SQLITE_OS_WINRT + if ( sleepObj==NULL ){ +@@ -32768,9 +33043,11 @@ SQLITE_PRIVATE void sqlite3MemSetDefault + /* + ** Convert a UTF-8 string to Microsoft Unicode (UTF-16?). + ** +-** Space to hold the returned string is obtained from malloc. ++** Space to hold the returned string is obtained from malloc, ++** unless buf is not NULL and the needed size is less than ++** SQLITE_WIN32_MAX_PATH_CHARS bytes. + */ +-static LPWSTR winUtf8ToUnicode(const char *zFilename){ ++static LPWSTR winUtf8ToUnicode(const char *zFilename, WCHAR *buf){ + int nChar; + LPWSTR zWideFilename; + +@@ -32778,9 +33055,13 @@ static LPWSTR winUtf8ToUnicode(const cha + if( nChar==0 ){ + return 0; + } +- zWideFilename = sqlite3MallocZero( nChar*sizeof(zWideFilename[0]) ); +- if( zWideFilename==0 ){ +- return 0; ++ if( buf && (nChar<=SQLITE_WIN32_MAX_PATH_CHARS/sizeof(WCHAR)) ){ ++ zWideFilename = buf; ++ }else{ ++ zWideFilename = sqlite3Malloc( nChar*sizeof(WCHAR) ); ++ if( zWideFilename==0 ){ ++ return 0; ++ } + } + nChar = osMultiByteToWideChar(CP_UTF8, 0, zFilename, -1, zWideFilename, + nChar); +@@ -32833,7 +33114,7 @@ static LPWSTR winMbcsToUnicode(const cha + if( nByte==0 ){ + return 0; + } +- zMbcsFilename = sqlite3MallocZero( nByte*sizeof(zMbcsFilename[0]) ); ++ zMbcsFilename = sqlite3Malloc( nByte*sizeof(zMbcsFilename[0]) ); + if( zMbcsFilename==0 ){ + return 0; + } +@@ -32862,7 +33143,7 @@ static char *winUnicodeToMbcs(LPCWSTR zW + if( nByte == 0 ){ + return 0; + } +- zFilename = sqlite3MallocZero( nByte ); ++ zFilename = sqlite3Malloc( nByte ); + if( zFilename==0 ){ + return 0; + } +@@ -32875,6 +33156,7 @@ static char *winUnicodeToMbcs(LPCWSTR zW + return zFilename; + } + ++#if !defined(__CYGWIN__) + /* + ** Convert multibyte character string to UTF-8. Space to hold the + ** returned string is obtained from sqlite3_malloc(). +@@ -32894,18 +33176,22 @@ SQLITE_API char *sqlite3_win32_mbcs_to_u + + /* + ** Convert UTF-8 to multibyte character string. Space to hold the +-** returned string is obtained from sqlite3_malloc(). ++** returned string is obtained from sqlite3_malloc(). If 'buf' is ++** non-zero, it points to scratch area to be used internally, ++** saving a 'malloc' call. + */ +-SQLITE_API char *sqlite3_win32_utf8_to_mbcs(const char *zFilename){ ++SQLITE_API char *sqlite3_win32_utf8_to_mbcs(const char *zFilename, WCHAR *buf){ + char *zFilenameMbcs; + LPWSTR zTmpWide; + +- zTmpWide = winUtf8ToUnicode(zFilename); ++ zTmpWide = winUtf8ToUnicode(zFilename, buf); + if( zTmpWide==0 ){ + return 0; + } + zFilenameMbcs = winUnicodeToMbcs(zTmpWide); +- sqlite3_free(zTmpWide); ++ if( zTmpWide != buf ){ ++ sqlite3_free(zTmpWide); ++ } + return zFilenameMbcs; + } + +@@ -32931,7 +33217,7 @@ SQLITE_API int sqlite3_win32_set_directo + || type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE + ); + assert( !ppDirectory || sqlite3MemdebugHasType(*ppDirectory, MEMTYPE_HEAP) ); +- if( ppDirectory ){ ++ if( !getenv && ppDirectory ){ + char *zValueUtf8 = 0; + if( zValue && zValue[0] ){ + zValueUtf8 = winUnicodeToUtf8(zValue); +@@ -32945,6 +33231,7 @@ SQLITE_API int sqlite3_win32_set_directo + } + return SQLITE_ERROR; + } ++#endif /* !__CYGWIN__*/ + + /* + ** The return value of winGetLastErrorMsg +@@ -33178,8 +33465,9 @@ static int winceCreateLock(const char *z + DWORD lastErrno; + BOOL bLogged = FALSE; + BOOL bInit = TRUE; ++ WCHAR buf[SQLITE_WIN32_MAX_PATH_CHARS/sizeof(WCHAR)]; + +- zName = winUtf8ToUnicode(zFilename); ++ zName = winUtf8ToUnicode(zFilename, buf); + if( zName==0 ){ + /* out of memory */ + return SQLITE_IOERR_NOMEM; +@@ -33199,7 +33487,9 @@ static int winceCreateLock(const char *z + pFile->hMutex = osCreateMutexW(NULL, FALSE, zName); + if (!pFile->hMutex){ + pFile->lastErrno = osGetLastError(); +- sqlite3_free(zName); ++ if( zName!=buf ){ ++ sqlite3_free(zName); ++ } + return winLogError(SQLITE_IOERR, pFile->lastErrno, + "winceCreateLock1", zFilename); + } +@@ -33223,7 +33513,9 @@ static int winceCreateLock(const char *z + bInit = FALSE; + } + +- sqlite3_free(zName); ++ if( zName!=buf ){ ++ sqlite3_free(zName); ++ } + + /* If we succeeded in making the shared memory handle, map it. */ + if( pFile->hShared ){ +@@ -33861,8 +34153,7 @@ static int winTruncate(sqlite3_file *id, + ** Count the number of fullsyncs and normal syncs. This is used to test + ** that syncs and fullsyncs are occuring at the right times. + */ +-SQLITE_API int sqlite3_sync_count = 0; +-SQLITE_API int sqlite3_fullsync_count = 0; ++extern int sqlite3_sync_count, sqlite3_fullsync_count; + #endif + + /* +@@ -34446,7 +34737,7 @@ static int winDeviceCharacteristics(sqli + ** During sqlite3_os_init() we do a GetSystemInfo() + ** to get the granularity size. + */ +-SYSTEM_INFO winSysInfo; ++static SYSTEM_INFO winSysInfo; + + #ifndef SQLITE_OMIT_WAL + +@@ -35348,7 +35639,7 @@ static const sqlite3_io_methods winIoMet + ** sqlite3_vfs object. + */ + +-#if defined(__CYGWIN__) ++#if 0 + /* + ** Convert a filename from whatever the underlying operating system + ** supports for filenames into UTF-8. Space to hold the result is +@@ -35373,16 +35664,77 @@ static char *winConvertToUtf8Filename(co + ** Convert a UTF-8 filename into whatever form the underlying + ** operating system wants filenames in. Space to hold the result + ** is obtained from malloc and must be freed by the calling +-** function. ++** function, unless buf is not NULL and the needed size is less ++** than SQLITE_WIN32_MAX_PATH_CHARS bytes. + */ +-static void *winConvertFromUtf8Filename(const char *zFilename){ ++static void *winConvertFromUtf8Filename(const char *zFilename, WCHAR *buf){ + void *zConverted = 0; + if( osIsNT() ){ +- zConverted = winUtf8ToUnicode(zFilename); ++ int nChar; ++ LPWSTR zWideFilename; ++ ++ if( (cygwin_conv_path!=NULL) && !(winIsDriveLetterAndColon(zFilename) ++ && winIsDirSep(zFilename[2]))){ ++ int nByte = cygwin_conv_path(CCP_POSIX_TO_WIN_W, zFilename, 0, 0); ++ if( nByte>0 ){ ++ if( buf && (nBytemxPathname +@@ -36204,7 +36620,73 @@ static int winFullPathname( + char *zFull /* Output buffer */ + ){ + +-#if defined(__CYGWIN__) ++#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__) ++ DWORD nByte; ++ void *zConverted; ++ char *zOut; ++ WCHAR buf[SQLITE_WIN32_MAX_PATH_CHARS/sizeof(WCHAR)]; ++#endif ++ ++ if( cygwin_conv_path || cygwin_conv_to_full_posix_path ){ ++ /* It's odd to simulate an io-error here, but really this is just ++ ** using the io-error infrastructure to test that SQLite handles this ++ ** function failing. This function could fail if, for example, the ++ ** current working directory has been unlinked. ++ */ ++ SimulateIOError( return SQLITE_ERROR ); ++ UNUSED_PARAMETER(pVfs); ++ ++ zFull[nFull-1] = '\0'; ++ if( winIsDirSep(zRelative[0]) && winIsDirSep(zRelative[1]) ++ && zRelative[2]=='?' && winIsDirSep(zRelative[3])){ ++ /* This is an extended path. Convert to non-extended form. */ ++ if( winIsDriveLetterAndColon(&zRelative[4]) && winIsDirSep(zRelative[6]) ){ ++ int nDrive; ++ char temp[4]; ++ temp[0] = zRelative[4]; ++ memcpy(&temp[1], ":\\", 3); ++ if( cygwin_conv_path ){ ++ cygwin_conv_path(CCP_WIN_A_TO_POSIX, temp, zFull, nFull); ++ }else{ ++ cygwin_conv_to_full_posix_path(temp, zFull); ++ } ++ nDrive = (int)strlen(zFull); ++ sqlite3_snprintf(nFull-nDrive, &zFull[nDrive], "%s", zRelative+4); ++ }else if( sqlite3_strnicmp(zRelative+4, "UNC", 3)==0 && winIsDirSep(zRelative[7]) ){ ++ /* UNC paths in Cygwin start with "//" */ ++ sqlite3_snprintf(nFull, zFull, "//%s", zRelative+8); ++ }else{ ++ /* Something wrong, no conversion */ ++ sqlite3_snprintf(nFull, zFull, "%s", zRelative); ++ } ++ }else if( winIsDriveLetterAndColon(zRelative) && winIsDirSep(zRelative[2]) ){ ++ int nDrive; ++ char temp[4]; ++ temp[0] = zRelative[0]; ++ memcpy(&temp[1], ":\\", 3); ++ if( cygwin_conv_path ){ ++ cygwin_conv_path(CCP_WIN_A_TO_POSIX, temp, zFull, nFull); ++ }else{ ++ cygwin_conv_to_full_posix_path(temp, zFull); ++ } ++ nDrive = (int)strlen(zFull); ++ sqlite3_snprintf(nFull-nDrive, &zFull[nDrive], "%s", zRelative+2); ++ }else if( getcwd && !winIsDirSep(zRelative[0]) ){ ++ int nCwd; ++ if( getcwd(zFull, nFull-1)==0 ){ ++ return winLogError(SQLITE_CANTOPEN_BKPT, (DWORD)osErrno, "getcwd", zRelative); ++ } ++ nCwd = (int)strlen(zFull); ++ sqlite3_snprintf(nFull-nCwd, &zFull[nCwd], "/%s", zRelative); ++ }else{ ++ sqlite3_snprintf(nFull, zFull, "%s", zRelative); ++ } ++#if defined(_WIN32) || defined(__CYGWIN__) ++ winSimplifyName(zFull); ++#endif ++ return SQLITE_OK; ++ } ++#if 0 + SimulateIOError( return SQLITE_ERROR ); + UNUSED_PARAMETER(nFull); + assert( nFull>=pVfs->mxPathname ); +@@ -36281,9 +36763,11 @@ static int winFullPathname( + #endif + + #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__) ++#if 0 + DWORD nByte; + void *zConverted; + char *zOut; ++#endif + + /* If this path name begins with "/X:", where "X" is any alphabetic + ** character, discard the initial "/" from the pathname. +@@ -36309,32 +36793,131 @@ static int winFullPathname( + sqlite3_data_directory, winGetDirSep(), zRelative); + return SQLITE_OK; + } +- zConverted = winConvertFromUtf8Filename(zRelative); +- if( zConverted==0 ){ +- return SQLITE_IOERR_NOMEM; ++ nByte = osMultiByteToWideChar(CP_UTF8, 0, zRelative, -1, NULL, 0); ++ if( nByte==0 ){ ++ return winLogError(SQLITE_IOERR_CONVPATH, (DWORD)osGetLastError(), ++ "winFullPathname", zRelative); ++ } ++ if( osIsNT() ){ ++ LPWSTR zWideFilename; ++ int i, j; ++ ++ if( nByte>SQLITE_WIN32_MAX_PATH_CHARS ){ ++ /* No Win32 API functions can handle such long paths. Let's see if ++ * we can do something about it. If not, just leave it as is. */ ++ if( winIsDirSep(zRelative[0]) && winIsDirSep(zRelative[1]) ++ && zRelative[2]!='?' ){ ++ /* It's an UNC path, convert it to an extended UNC path. */ ++ zWideFilename = sqlite3MallocZero( (nByte+6)*sizeof(WCHAR) ); ++ if( zWideFilename==0 ){ ++ return SQLITE_IOERR_NOMEM; ++ } ++ memcpy(zWideFilename, L"\\\\?\\UNC\\", 16); ++ nByte = osMultiByteToWideChar(CP_UTF8, 0, zRelative+2, -1, ++ zWideFilename+8, nByte); ++ goto finished; ++ }else if( winIsDriveLetterAndColon(zRelative) ++ && winIsDirSep(zRelative[2]) ){ ++ /* It has a correct drive prefix, convert to extended form. */ ++ zWideFilename = sqlite3MallocZero( (nByte+4)*sizeof(WCHAR) ); ++ if( zWideFilename==0 ){ ++ return SQLITE_IOERR_NOMEM; ++ } ++ memcpy(zWideFilename, L"\\\\?\\", 8); ++ nByte = osMultiByteToWideChar(CP_UTF8, 0, zRelative, -1, ++ zWideFilename+4, nByte); ++ zWideFilename[6] = '\\'; ++ goto finished; ++ } ++ /* Another form, e.g. relative path or maybe it already ++ * has the '\\?\' prefix. Just leave it as-is. */ ++ } ++ if( nByte<=SQLITE_WIN32_MAX_PATH_CHARS/sizeof(WCHAR) ){ ++ zWideFilename = buf; ++ }else{ ++ zWideFilename = sqlite3Malloc( nByte*sizeof(WCHAR) ); ++ if( zWideFilename==0 ){ ++ return SQLITE_IOERR_NOMEM; ++ } ++ } ++ /* Check whether it has the '\\?\' prefix and can be shortened. */ ++ if( nByte<=(SQLITE_WIN32_MAX_PATH_CHARS+6) ++ && winIsDirSep(zRelative[0]) && winIsDirSep(zRelative[1]) ++ && (zRelative[2]=='?') && winIsDirSep(zRelative[3]) ){ ++ if( sqlite3_strnicmp(&zRelative[4], "UNC", 3) ++ && winIsDirSep(zRelative[7]) ){ ++ memcpy(zWideFilename, L"\\\\", 4); ++ nByte = osMultiByteToWideChar(CP_UTF8, 0, zRelative+8, -1, ++ zWideFilename+2, nByte-8); ++ }else if( nByte<=(SQLITE_WIN32_MAX_PATH_CHARS+4) ){ ++ nByte = osMultiByteToWideChar(CP_UTF8, 0, zRelative+4, -1, ++ zWideFilename, nByte-4); ++ }else{ ++ nByte = osMultiByteToWideChar(CP_UTF8, 0, zRelative, -1, ++ zWideFilename, nByte); ++ } ++ }else{ ++ nByte = osMultiByteToWideChar(CP_UTF8, 0, zRelative, -1, ++ zWideFilename, nByte); ++ } ++ if( nByte==0 ){ ++ sqlite3_free(zWideFilename); ++ return SQLITE_IOERR_NOMEM; ++ } ++ finished: ++ zConverted = zWideFilename; ++ for(i=j=0; zWideFilename[i]; ++i){ ++ if( winIsDirSep(zWideFilename[i]) ){ ++ if( zWideFilename[i+1]=='.' && winIsDirSep(zWideFilename[i+2]) ){ ++ ++i; ++ continue; ++ } ++ if( !zWideFilename[i+1] || (winIsDirSep(zWideFilename[i+1]) && (i!=0)) ){ ++ continue; ++ } ++ zWideFilename[j++] = '\\'; ++ }else{ ++ zWideFilename[j++] = zWideFilename[i]; ++ } ++ } ++ while(j0 ); + assert( winSysInfo.dwPageSize>0 ); + ++#if !defined(__CYGWIN__) ++ if( osIsNT() ){ ++ module = osGetModuleHandleW(L"CYGWIN1.DLL"); ++ if( !module){ ++ module = osGetModuleHandleW(L"MSYS-1.0.DLL"); ++ } ++#ifdef SQLITE_WIN32_HAS_ANSI ++ }else{ ++ module = osGetModuleHandleA("CYGWIN1.DLL"); ++ if( !module){ ++ module = osGetModuleHandleA("MSYS-1.0.DLL"); ++ } ++#endif ++ } ++ if( module ){ ++ for( i=78; iskipNext==0 || pCur->eState!=CURSOR_VALID ); + if( pCur->eState!=CURSOR_VALID ){ + rc = restoreCursorPosition(pCur); +@@ -55546,15 +56200,6 @@ SQLITE_PRIVATE int sqlite3BtreeNext(BtCu + ** successful then set *pRes=0. If the cursor + ** was already pointing to the first entry in the database before + ** this routine was called, then set *pRes=1. +-** +-** The calling function will set *pRes to 0 or 1. The initial *pRes value +-** will be 1 if the cursor being stepped corresponds to an SQL index and +-** if this routine could have been skipped if that SQL index had been +-** a unique index. Otherwise the caller will have set *pRes to zero. +-** Zero is the common case. The btree implementation is free to use the +-** initial *pRes value as a hint to improve performance, but the current +-** SQLite btree implementation does not. (Note that the comdb2 btree +-** implementation does use this hint, however.) + */ + SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor *pCur, int *pRes){ + int rc; +@@ -55562,7 +56207,6 @@ SQLITE_PRIVATE int sqlite3BtreePrevious( + + assert( cursorHoldsMutex(pCur) ); + assert( pRes!=0 ); +- assert( *pRes==0 || *pRes==1 ); + assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); + pCur->atLast = 0; + if( pCur->eState!=CURSOR_VALID ){ +@@ -57789,7 +58433,7 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(Bt + ** sub-tree headed by the child page of the cell being deleted. This makes + ** balancing the tree following the delete operation easier. */ + if( !pPage->leaf ){ +- int notUsed = 0; ++ int notUsed; + rc = sqlite3BtreePrevious(pCur, ¬Used); + if( rc ) return rc; + } +@@ -70054,7 +70698,6 @@ case OP_SeekGt: { /* jump, in3 */ + #endif + if( oc>=OP_SeekGe ){ assert( oc==OP_SeekGe || oc==OP_SeekGt ); + if( res<0 || (res==0 && oc==OP_SeekGt) ){ +- res = 0; + rc = sqlite3BtreeNext(pC->pCursor, &res); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + pC->rowidIsValid = 0; +@@ -70064,7 +70707,6 @@ case OP_SeekGt: { /* jump, in3 */ + }else{ + assert( oc==OP_SeekLt || oc==OP_SeekLe ); + if( res>0 || (res==0 && oc==OP_SeekLt) ){ +- res = 0; + rc = sqlite3BtreePrevious(pC->pCursor, &res); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + pC->rowidIsValid = 0; +@@ -70917,7 +71559,7 @@ case OP_Rewind: { /* jump */ + break; + } + +-/* Opcode: Next P1 P2 P3 * P5 ++/* Opcode: Next P1 P2 * * P5 + ** + ** Advance cursor P1 so that it points to the next key/data pair in its + ** table or index. If there are no more key/value pairs then fall through +@@ -70927,11 +71569,6 @@ case OP_Rewind: { /* jump */ + ** The P1 cursor must be for a real table, not a pseudo-table. P1 must have + ** been opened prior to this opcode or the program will segfault. + ** +-** The P3 value is a hint to the btree implementation. If P3==1, that +-** means P1 is an SQL index and that this instruction could have been +-** omitted if that index had been unique. P3 is usually 0. P3 is +-** always either 0 or 1. +-** + ** P4 is always of type P4_ADVANCE. The function pointer points to + ** sqlite3BtreeNext(). + ** +@@ -70940,12 +71577,12 @@ case OP_Rewind: { /* jump */ + ** + ** See also: Prev, NextIfOpen + */ +-/* Opcode: NextIfOpen P1 P2 P3 * P5 ++/* Opcode: NextIfOpen P1 P2 * * P5 + ** + ** This opcode works just like OP_Next except that if cursor P1 is not + ** open it behaves a no-op. + */ +-/* Opcode: Prev P1 P2 P3 * P5 ++/* Opcode: Prev P1 P2 * * P5 + ** + ** Back up cursor P1 so that it points to the previous key/data pair in its + ** table or index. If there is no previous key/value pairs then fall through +@@ -70955,18 +71592,13 @@ case OP_Rewind: { /* jump */ + ** The P1 cursor must be for a real table, not a pseudo-table. If P1 is + ** not open then the behavior is undefined. + ** +-** The P3 value is a hint to the btree implementation. If P3==1, that +-** means P1 is an SQL index and that this instruction could have been +-** omitted if that index had been unique. P3 is usually 0. P3 is +-** always either 0 or 1. +-** + ** P4 is always of type P4_ADVANCE. The function pointer points to + ** sqlite3BtreePrevious(). + ** + ** If P5 is positive and the jump is taken, then event counter + ** number P5-1 in the prepared statement is incremented. + */ +-/* Opcode: PrevIfOpen P1 P2 P3 * P5 ++/* Opcode: PrevIfOpen P1 P2 * * P5 + ** + ** This opcode works just like OP_Prev except that if cursor P1 is not + ** open it behaves a no-op. +@@ -70988,12 +71620,9 @@ case OP_Next: /* jump */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p5aCounter) ); + pC = p->apCsr[pOp->p1]; +- res = pOp->p3; + assert( pC!=0 ); + assert( pC->deferredMoveto==0 ); + assert( pC->pCursor ); +- assert( res==0 || (res==1 && pC->isTable==0) ); +- testcase( res==1 ); + assert( pOp->opcode!=OP_Next || pOp->p4.xAdvance==sqlite3BtreeNext ); + assert( pOp->opcode!=OP_Prev || pOp->p4.xAdvance==sqlite3BtreePrevious ); + assert( pOp->opcode!=OP_NextIfOpen || pOp->p4.xAdvance==sqlite3BtreeNext ); +@@ -96034,6 +96663,9 @@ static int sqlite3LoadExtension( + for(iFile=ncFile-1; iFile>=0 && zFile[iFile]!='/'; iFile--){} + iFile++; + if( sqlite3_strnicmp(zFile+iFile, "lib", 3)==0 ) iFile += 3; ++#ifdef __CYGWIN__ ++ if( sqlite3_strnicmp(zFile+iFile, "cyg", 3)==0 ) iFile += 3; ++#endif + for(iEntry=8; (c = zFile[iFile])!=0 && c!='.'; iFile++){ + if( sqlite3Isalpha(c) ){ + zAltEntry[iEntry++] = (char)sqlite3UpperToLower[(unsigned)c]; +@@ -96312,7 +96944,7 @@ SQLITE_PRIVATE void sqlite3AutoLoadExten + */ + + #if !defined(SQLITE_ENABLE_LOCKING_STYLE) +-# if defined(__APPLE__) ++# if defined(__APPLE__) || defined(__CYGWIN__) + # define SQLITE_ENABLE_LOCKING_STYLE 1 + # else + # define SQLITE_ENABLE_LOCKING_STYLE 0 +@@ -96444,7 +97076,7 @@ static const struct sPragmaNames { + /* ePragFlag: */ 0, + /* iArg: */ SQLITE_CountRows }, + #endif +-#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN ++#if SQLITE_OS_WIN && !defined(__CYGWIN__) + { /* zName: */ "data_store_directory", + /* ePragTyp: */ PragTyp_DATA_STORE_DIRECTORY, + /* ePragFlag: */ 0, +@@ -97562,7 +98194,7 @@ SQLITE_PRIVATE void sqlite3Pragma( + break; + } + +-#if SQLITE_OS_WIN ++#if SQLITE_OS_WIN && !defined(__CYGWIN__) + /* + ** PRAGMA data_store_directory + ** PRAGMA data_store_directory = ""|"directory_name" +@@ -108490,7 +109122,7 @@ struct WhereLevel { + int addrFirst; /* First instruction of interior of the loop */ + int addrBody; /* Beginning of the body of this loop */ + u8 iFrom; /* Which entry in the FROM clause */ +- u8 op, p3, p5; /* Opcode, P3 & P5 of the opcode that ends the loop */ ++ u8 op, p5; /* Opcode and P5 of the opcode that ends the loop */ + int p1, p2; /* Operands of the opcode used to ends the loop */ + union { /* Information that depends on pWLoop->wsFlags */ + struct { +@@ -108877,7 +109509,6 @@ struct WhereInfo { + #define WHERE_MULTI_OR 0x00002000 /* OR using multiple indices */ + #define WHERE_AUTO_INDEX 0x00004000 /* Uses an ephemeral index */ + #define WHERE_SKIPSCAN 0x00008000 /* Uses the skip-scan algorithm */ +-#define WHERE_UNQ_WANTED 0x00010000 /* WHERE_ONEROW would have been helpful*/ + + /************** End of whereInt.h ********************************************/ + /************** Continuing where we left off in where.c **********************/ +@@ -112047,8 +112678,6 @@ static Bitmask codeOneLoopStart( + pLevel->op = OP_Next; + } + pLevel->p1 = iIdxCur; +- assert( (WHERE_UNQ_WANTED>>16)==1 ); +- pLevel->p3 = (pLoop->wsFlags>>16)&1; + if( (pLoop->wsFlags & WHERE_CONSTRAINT)==0 ){ + pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; + }else{ +@@ -112851,13 +113480,12 @@ static int whereLoopAddBtreeIndex( + || nInMul==0 + ); + pNew->wsFlags |= WHERE_COLUMN_EQ; +- if( iCol<0 || (nInMul==0 && pNew->u.btree.nEq==pProbe->nKeyCol-1)){ ++ if( iCol<0 ++ || (pProbe->onError!=OE_None && nInMul==0 ++ && pNew->u.btree.nEq==pProbe->nKeyCol-1) ++ ){ + assert( (pNew->wsFlags & WHERE_COLUMN_IN)==0 || iCol<0 ); +- if( iCol>=0 && pProbe->onError==OE_None ){ +- pNew->wsFlags |= WHERE_UNQ_WANTED; +- }else{ +- pNew->wsFlags |= WHERE_ONEROW; +- } ++ pNew->wsFlags |= WHERE_ONEROW; + } + pNew->u.btree.nEq++; + pNew->nOut = nRowEst + nInMul; +@@ -114651,7 +115279,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(Wher + pLoop = pLevel->pWLoop; + sqlite3VdbeResolveLabel(v, pLevel->addrCont); + if( pLevel->op!=OP_Noop ){ +- sqlite3VdbeAddOp3(v, pLevel->op, pLevel->p1, pLevel->p2, pLevel->p3); ++ sqlite3VdbeAddOp2(v, pLevel->op, pLevel->p1, pLevel->p2); + sqlite3VdbeChangeP5(v, pLevel->p5); + } + if( pLoop->wsFlags & WHERE_IN_ABLE && pLevel->u.in.nIn>0 ){ +@@ -117970,12 +118598,20 @@ static void yy_reduce( + break; + case 325: /* wqlist ::= nm idxlist_opt AS LP select RP */ + { ++#ifdef SQLITE_OMIT_CTE ++ assert(0); ++#else + yygotominor.yy59 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy14, yymsp[-1].minor.yy3); ++#endif + } + break; + case 326: /* wqlist ::= wqlist COMMA nm idxlist_opt AS LP select RP */ + { ++#ifdef SQLITE_OMIT_CTE ++ assert(0); ++#else + yygotominor.yy59 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy59, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy14, yymsp[-1].minor.yy3); ++#endif + } + break; + default: +@@ -119468,6 +120104,39 @@ SQLITE_PRIVATE int sqlite3IcuInit(sqlite + /************** End of sqliteicu.h *******************************************/ + /************** Continuing where we left off in main.c ***********************/ + #endif ++#ifdef SQLITE_ENABLE_ZLIB ++/************** Include sqlitezlib.h in the middle of main.c *****************/ ++/************** Begin file sqlitezlib.h **************************************/ ++/* ++** 2008 May 26 ++** ++** The author disclaims copyright to this source code. In place of ++** a legal notice, here is a blessing: ++** ++** May you do good and not evil. ++** May you find forgiveness for yourself and forgive others. ++** May you share freely, never taking more than you give. ++** ++****************************************************************************** ++** ++** This header file is used by programs that want to link against the ++** zlib extension. All it does is declare the sqlite3ZlibInit() interface. ++*/ ++ ++#if 0 ++extern "C" { ++#endif /* __cplusplus */ ++ ++SQLITE_PRIVATE int sqlite3ZlibInit(sqlite3 *db); ++ ++#if 0 ++} /* extern "C" */ ++#endif /* __cplusplus */ ++ ++ ++/************** End of sqlitezlib.h ******************************************/ ++/************** Continuing where we left off in main.c ***********************/ ++#endif + + #ifndef SQLITE_AMALGAMATION + /* IMPLEMENTATION-OF: R-46656-45156 The sqlite3_version[] string constant +@@ -122060,6 +122729,12 @@ static int openDatabase( + } + #endif + ++#ifdef SQLITE_ENABLE_ZLIB ++ if( !db->mallocFailed && rc==SQLITE_OK ){ ++ rc = sqlite3ZlibInit(db); ++ } ++#endif ++ + #ifdef SQLITE_ENABLE_RTREE + if( !db->mallocFailed && rc==SQLITE_OK){ + rc = sqlite3RtreeInit(db); +@@ -145515,6 +146190,137 @@ SQLITE_API int sqlite3_icu_init( + #endif + + /************** End of icu.c *************************************************/ ++/************** Begin file zlib.c ********************************************/ ++/* ++** 2014 January 6 ++** ++** The author disclaims copyright to this source code. In place of ++** a legal notice, here is a blessing: ++** ++** May you do good and not evil. ++** May you find forgiveness for yourself and forgive others. ++** May you share freely, never taking more than you give. ++** ++************************************************************************* ++** $Id: zlib.c,v 1.0 2013/01/06 11:13:11 jan.nijtmans Exp $ ++** ++** This file implements an integration between the zlib library , ++** an open-source compression library and SQLite. The integration uses ++** zlib to provide the following to SQLite: ++** ++** * An implementation of the SQL compress() and decompress() ++** functions. ++*/ ++ ++#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ZLIB) ++ ++/* Include zlib headers */ ++#include ++ ++#ifndef SQLITE_CORE ++ SQLITE_EXTENSION_INIT1 ++#else ++#endif ++ ++ /* ++ ** Implementation of the "compress(X)" SQL function. The input X is ++ ** compressed using zLib and the output is returned. ++ */ ++ static void zlibCompressFunc( ++ sqlite3_context *context, ++ int argc, ++ sqlite3_value **argv ++ ){ ++ const unsigned char *pIn; ++ unsigned char *pOut; ++ unsigned int nIn; ++ unsigned long int nOut; ++ ++ pIn = sqlite3_value_blob(argv[0]); ++ nIn = sqlite3_value_bytes(argv[0]); ++ nOut = 13 + nIn + (nIn+999)/1000; ++ pOut = sqlite3_malloc( nOut+4 ); ++ pOut[0] = nIn>>24 & 0xff; ++ pOut[1] = nIn>>16 & 0xff; ++ pOut[2] = nIn>>8 & 0xff; ++ pOut[3] = nIn & 0xff; ++ compress(&pOut[4], &nOut, pIn, nIn); ++ sqlite3_result_blob(context, pOut, nOut+4, sqlite3_free); ++ } ++ ++ /* ++ ** Implementation of the "decompress(X)" SQL function. The argument X ++ ** is a blob which was obtained from compress(Y). The output will be ++ ** the value Y. ++ */ ++ static void zlibDecompressFunc( ++ sqlite3_context *context, ++ int argc, ++ sqlite3_value **argv ++ ){ ++ const unsigned char *pIn; ++ unsigned char *pOut; ++ unsigned int nIn; ++ unsigned long int nOut; ++ int rc; ++ ++ pIn = sqlite3_value_blob(argv[0]); ++ nIn = sqlite3_value_bytes(argv[0]); ++ nOut = (pIn[0]<<24) + (pIn[1]<<16) + (pIn[2]<<8) + pIn[3]; ++ pOut = sqlite3_malloc( nOut+1 ); ++ rc = uncompress(pOut, &nOut, &pIn[4], nIn-4); ++ if( rc==Z_OK ){ ++ sqlite3_result_blob(context, pOut, nOut, sqlite3_free); ++ }else{ ++ sqlite3_result_error(context, "input is not zlib compressed", -1); ++ } ++ } ++ ++/* ++** Register the zlib extension functions with database db. ++*/ ++SQLITE_PRIVATE int sqlite3ZlibInit(sqlite3 *db){ ++ struct ZlibScalar { ++ const char *zName; /* Function name */ ++ int nArg; /* Number of arguments */ ++ int enc; /* Optimal text encoding */ ++ void *pContext; /* sqlite3_user_data() context */ ++ void (*xFunc)(sqlite3_context*,int,sqlite3_value**); ++ } scalars[] = { ++ {"compress", 1, SQLITE_ANY, 0, zlibCompressFunc}, ++ {"decompress", 1, SQLITE_ANY, 0, zlibDecompressFunc}, ++ }; ++ ++ int rc = SQLITE_OK; ++ int i; ++ ++ for(i=0; rc==SQLITE_OK && i<(int)(sizeof(scalars)/sizeof(scalars[0])); i++){ ++ struct ZlibScalar *p = &scalars[i]; ++ rc = sqlite3_create_function( ++ db, p->zName, p->nArg, p->enc, p->pContext, p->xFunc, 0, 0 ++ ); ++ } ++ ++ return rc; ++} ++ ++#if !SQLITE_CORE ++#ifdef _WIN32 ++__declspec(dllexport) ++#endif ++SQLITE_API int sqlite3_zlib_init( ++ sqlite3 *db, ++ char **pzErrMsg, ++ const sqlite3_api_routines *pApi ++){ ++ SQLITE_EXTENSION_INIT2(pApi) ++ return sqlite3ZlibInit(db); ++} ++#endif ++ ++#endif ++ ++/************** End of zlib.c ************************************************/ + /************** Begin file fts3_icu.c ****************************************/ + /* + ** 2007 June 22 +--- origsrc/sqlite-autoconf-3080300/sqlite3.h 2014-02-03 15:04:55.000000000 +0100 ++++ src/sqlite-autoconf-3080300/sqlite3.h 2014-02-04 12:53:52.297923900 +0100 +@@ -108,8 +108,8 @@ extern "C" { + ** [sqlite_version()] and [sqlite_source_id()]. + */ + #define SQLITE_VERSION "3.8.3" +-#define SQLITE_VERSION_NUMBER 3008003 +-#define SQLITE_SOURCE_ID "2014-02-03 14:04:11 6c643e45c274e755dc5a1a65673df79261c774be" ++#define SQLITE_VERSION_NUMBER 3008002 ++#define SQLITE_SOURCE_ID "2014-02-03 13:52:03 e816dd924619db5f766de6df74ea2194f3e3b538" + + /* + ** CAPI3REF: Run-Time Library Version Numbers +--- origsrc/sqlite-autoconf-3080300/sqliteicu.h 1970-01-01 01:00:00.000000000 +0100 ++++ src/sqlite-autoconf-3080300/sqliteicu.h 2014-02-04 12:53:52.307924500 +0100 +@@ -0,0 +1,27 @@ ++/* ++** 2008 May 26 ++** ++** The author disclaims copyright to this source code. In place of ++** a legal notice, here is a blessing: ++** ++** May you do good and not evil. ++** May you find forgiveness for yourself and forgive others. ++** May you share freely, never taking more than you give. ++** ++****************************************************************************** ++** ++** This header file is used by programs that want to link against the ++** ICU extension. All it does is declare the sqlite3IcuInit() interface. ++*/ ++#include "sqlite3.h" ++ ++#ifdef __cplusplus ++extern "C" { ++#endif /* __cplusplus */ ++ ++int sqlite3IcuInit(sqlite3 *db); ++ ++#ifdef __cplusplus ++} /* extern "C" */ ++#endif /* __cplusplus */ ++ +--- origsrc/sqlite-autoconf-3080300/sqlitezlib.h 1970-01-01 01:00:00.000000000 +0100 ++++ src/sqlite-autoconf-3080300/sqlitezlib.h 2014-02-04 12:53:52.313924800 +0100 +@@ -0,0 +1,27 @@ ++/* ++** 2008 May 26 ++** ++** The author disclaims copyright to this source code. In place of ++** a legal notice, here is a blessing: ++** ++** May you do good and not evil. ++** May you find forgiveness for yourself and forgive others. ++** May you share freely, never taking more than you give. ++** ++****************************************************************************** ++** ++** This header file is used by programs that want to link against the ++** zlib extension. All it does is declare the sqlite3ZlibInit() interface. ++*/ ++#include "sqlite3.h" ++ ++#ifdef __cplusplus ++extern "C" { ++#endif /* __cplusplus */ ++ ++int sqlite3ZlibInit(sqlite3 *db); ++ ++#ifdef __cplusplus ++} /* extern "C" */ ++#endif /* __cplusplus */ ++ +--- origsrc/sqlite-autoconf-3080300/tea/generic/tclsqlite3.c 2014-02-03 15:04:57.000000000 +0100 ++++ src/sqlite-autoconf-3080300/tea/generic/tclsqlite3.c 2014-02-04 12:53:52.321925300 +0100 +@@ -174,6 +174,10 @@ static int strlen30(const char *z){ + return 0x3fffffff & (int)(z2 - z); + } + ++#ifdef USE_TCL_STUBS ++# define tclStubsPtr staticTclStubsPtr ++static const TclStubs *tclStubsPtr = NULL; ++#endif + + #ifndef SQLITE_OMIT_INCRBLOB + /* +@@ -3028,6 +3032,11 @@ static int DbMain(void *cd, Tcl_Interp * + memset(p, 0, sizeof(*p)); + zFile = Tcl_GetStringFromObj(objv[2], 0); + zFile = Tcl_TranslateFileName(interp, zFile, &translatedFilename); ++#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(SQLITE_WIN32_NO_WIDE) ++ if( !zVfs ){ ++ zVfs = "win32-longpath"; ++ } ++#endif + rc = sqlite3_open_v2(zFile, &p->db, flags, zVfs); + Tcl_DStringFree(&translatedFilename); + if( p->db ){ +@@ -3069,6 +3078,18 @@ static int DbMain(void *cd, Tcl_Interp * + #ifndef USE_TCL_STUBS + # undef Tcl_InitStubs + # define Tcl_InitStubs(a,b,c) TCL_VERSION ++#else ++# define Tcl_InitStubs staticTclInitStubs ++typedef struct { ++ char *result; ++ Tcl_FreeProc *freeProc; ++ int errorLine; ++ const struct TclStubs *stubTable; ++} PrivateTclInterp; ++static const char *Tcl_InitStubs(Tcl_Interp *interp, const char *version, int exact) { ++ tclStubsPtr = ((PrivateTclInterp *)interp)->stubTable; ++ return Tcl_PkgRequireEx(interp, "Tcl", version, 0, (void *)&tclStubsPtr); ++} + #endif + + /* +--- origsrc/sqlite-autoconf-3080300/tea/tclconfig/tcl.m4 2014-02-03 15:04:55.000000000 +0100 ++++ src/sqlite-autoconf-3080300/tea/tclconfig/tcl.m4 2014-02-04 12:53:52.332925900 +0100 +@@ -1410,6 +1410,9 @@ dnl AC_CHECK_TOOL(AR, ar) + SHLIB_LD='${CC} -shared' + SHLIB_SUFFIX=".dll" + EXE_SUFFIX=".exe" ++ EXEEXT=".exe" ++ do64bit_ok=yes ++ SHARED_LIB_SUFFIX='3.dll' + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + ;; +@@ -3184,13 +3187,19 @@ AC_DEFUN([TEA_MAKE_LIB], [ + if test "${SHARED_BUILD}" = "1" ; then + # We force the unresolved linking of symbols that are really in + # the private libraries of Tcl and Tk. +- SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" + if test x"${TK_BIN_DIR}" != x ; then + SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" + fi ++ SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" ++ if test "$GCC" = "yes"; then ++ SHLIB_LD_LIBS="${SHLIB_LD_LIBS} -static-libgcc" ++ fi + eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" + else + eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" ++ if test "$GCC" = "yes"; then ++ PKG_LIB_FILE=lib${PKG_LIB_FILE} ++ fi + fi + # Some packages build their own stubs libraries + eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" +@@ -3207,7 +3216,7 @@ AC_DEFUN([TEA_MAKE_LIB], [ + if test x"${TK_BIN_DIR}" != x ; then + SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" + fi +- eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" ++ eval eval "PKG_LIB_FILE=tcl${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" + RANLIB=: + else + eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" +--- origsrc/sqlite-autoconf-3080300/zlib.c 1970-01-01 01:00:00.000000000 +0100 ++++ src/sqlite-autoconf-3080300/zlib.c 2014-02-04 12:53:52.341926400 +0100 +@@ -0,0 +1,130 @@ ++/* ++** 2014 January 6 ++** ++** The author disclaims copyright to this source code. In place of ++** a legal notice, here is a blessing: ++** ++** May you do good and not evil. ++** May you find forgiveness for yourself and forgive others. ++** May you share freely, never taking more than you give. ++** ++************************************************************************* ++** $Id: zlib.c,v 1.0 2013/01/06 11:13:11 jan.nijtmans Exp $ ++** ++** This file implements an integration between the zlib library , ++** an open-source compression library and SQLite. The integration uses ++** zlib to provide the following to SQLite: ++** ++** * An implementation of the SQL compress() and decompress() ++** functions. ++*/ ++ ++#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ZLIB) ++ ++/* Include zlib headers */ ++#include ++ ++#ifndef SQLITE_CORE ++ #include "sqlite3ext.h" ++ SQLITE_EXTENSION_INIT1 ++#else ++ #include "sqlite3.h" ++#endif ++ ++ /* ++ ** Implementation of the "compress(X)" SQL function. The input X is ++ ** compressed using zLib and the output is returned. ++ */ ++ static void zlibCompressFunc( ++ sqlite3_context *context, ++ int argc, ++ sqlite3_value **argv ++ ){ ++ const unsigned char *pIn; ++ unsigned char *pOut; ++ unsigned int nIn; ++ unsigned long int nOut; ++ ++ pIn = sqlite3_value_blob(argv[0]); ++ nIn = sqlite3_value_bytes(argv[0]); ++ nOut = 13 + nIn + (nIn+999)/1000; ++ pOut = sqlite3_malloc( nOut+4 ); ++ pOut[0] = nIn>>24 & 0xff; ++ pOut[1] = nIn>>16 & 0xff; ++ pOut[2] = nIn>>8 & 0xff; ++ pOut[3] = nIn & 0xff; ++ compress(&pOut[4], &nOut, pIn, nIn); ++ sqlite3_result_blob(context, pOut, nOut+4, sqlite3_free); ++ } ++ ++ /* ++ ** Implementation of the "decompress(X)" SQL function. The argument X ++ ** is a blob which was obtained from compress(Y). The output will be ++ ** the value Y. ++ */ ++ static void zlibDecompressFunc( ++ sqlite3_context *context, ++ int argc, ++ sqlite3_value **argv ++ ){ ++ const unsigned char *pIn; ++ unsigned char *pOut; ++ unsigned int nIn; ++ unsigned long int nOut; ++ int rc; ++ ++ pIn = sqlite3_value_blob(argv[0]); ++ nIn = sqlite3_value_bytes(argv[0]); ++ nOut = (pIn[0]<<24) + (pIn[1]<<16) + (pIn[2]<<8) + pIn[3]; ++ pOut = sqlite3_malloc( nOut+1 ); ++ rc = uncompress(pOut, &nOut, &pIn[4], nIn-4); ++ if( rc==Z_OK ){ ++ sqlite3_result_blob(context, pOut, nOut, sqlite3_free); ++ }else{ ++ sqlite3_result_error(context, "input is not zlib compressed", -1); ++ } ++ } ++ ++/* ++** Register the zlib extension functions with database db. ++*/ ++int sqlite3ZlibInit(sqlite3 *db){ ++ struct ZlibScalar { ++ const char *zName; /* Function name */ ++ int nArg; /* Number of arguments */ ++ int enc; /* Optimal text encoding */ ++ void *pContext; /* sqlite3_user_data() context */ ++ void (*xFunc)(sqlite3_context*,int,sqlite3_value**); ++ } scalars[] = { ++ {"compress", 1, SQLITE_ANY, 0, zlibCompressFunc}, ++ {"decompress", 1, SQLITE_ANY, 0, zlibDecompressFunc}, ++ }; ++ ++ int rc = SQLITE_OK; ++ int i; ++ ++ for(i=0; rc==SQLITE_OK && i<(int)(sizeof(scalars)/sizeof(scalars[0])); i++){ ++ struct ZlibScalar *p = &scalars[i]; ++ rc = sqlite3_create_function( ++ db, p->zName, p->nArg, p->enc, p->pContext, p->xFunc, 0, 0 ++ ); ++ } ++ ++ return rc; ++} ++ ++#if !SQLITE_CORE ++#ifdef _WIN32 ++__declspec(dllexport) ++#endif ++int sqlite3_zlib_init( ++ sqlite3 *db, ++ char **pzErrMsg, ++ const sqlite3_api_routines *pApi ++){ ++ SQLITE_EXTENSION_INIT2(pApi) ++ return sqlite3ZlibInit(db); ++} ++#endif ++ ++#endif