Overview
SHA1 Hash: | 879e8c5f32be016d3c9cd7fb3f98e787aa823424 |
---|---|
Date: | 2009-04-13 09:50:42 |
User: | drh |
Comment: | Update to version SQLite 3.6.13 |
Timelines: | ancestors | descendants | both | trunk |
Other Links: | files | ZIP archive | manifest |
Tags And Properties
- branch=trunk inherited from [a28c83647d]
- sym-trunk inherited from [a28c83647d]
Changes
[hide diffs]Modified src/sqlite3.c from [baf46b9bdd] to [dfe6236892].
@@ -1,8 +1,8 @@ /****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite -** version 3.6.12. By combining all the individual C code files into this +** version 3.6.13. By combining all the individual C code files into this ** single large file, the entire code can be compiled as a one translation ** unit. This allows many compilers to do optimizations that would not be ** possible if the files were compiled separately. Performance improvements ** of 5% are more are commonly seen when SQLite is compiled as a single ** translation unit. @@ -9,17 +9,17 @@ ** ** This file is all you need to compile SQLite. To use SQLite in other ** programs, you need this file and the "sqlite3.h" header file that defines ** the programming interface to the SQLite library. (If you do not have ** the "sqlite3.h" header file at hand, you will find a copy in the first -** 5487 lines past this header comment.) Additional code files may be +** 5503 lines past this header comment.) Additional code files may be ** needed if you want a wrapper to interface SQLite with your choice of ** programming language. The code for the "sqlite3" command-line shell ** is also in a separate file. This file contains only code for the core ** SQLite library. ** -** This amalgamation was generated on 2009-03-31 12:19:59 UTC. +** This amalgamation was generated on 2009-04-13 09:47:15 UTC. */ #define SQLITE_CORE 1 #define SQLITE_AMALGAMATION 1 #ifndef SQLITE_PRIVATE # define SQLITE_PRIVATE static @@ -39,11 +39,11 @@ ** May you share freely, never taking more than you give. ** ************************************************************************* ** Internal interface definitions for SQLite. ** -** @(#) $Id: sqliteInt.h,v 1.848 2009/03/25 16:51:43 drh Exp $ +** @(#) $Id: sqliteInt.h,v 1.854 2009/04/08 13:51:51 drh Exp $ */ #ifndef _SQLITEINT_H_ #define _SQLITEINT_H_ /* @@ -530,11 +530,11 @@ ** The name of this file under configuration management is "sqlite.h.in". ** The makefile makes some minor changes to this file (such as inserting ** the version number) and changes its name to "sqlite3.h" as ** part of the build process. ** -** @(#) $Id: sqlite.h.in,v 1.436 2009/03/20 13:15:30 drh Exp $ +** @(#) $Id: sqlite.h.in,v 1.440 2009/04/06 15:55:04 drh Exp $ */ #ifndef _SQLITE3_H_ #define _SQLITE3_H_ #include <stdarg.h> /* Needed for the definition of va_list */ @@ -599,12 +599,12 @@ ** ** See also: [sqlite3_libversion()] and [sqlite3_libversion_number()]. ** ** Requirements: [H10011] [H10014] */ -#define SQLITE_VERSION "3.6.12" -#define SQLITE_VERSION_NUMBER 3006012 +#define SQLITE_VERSION "3.6.13" +#define SQLITE_VERSION_NUMBER 3006013 /* ** CAPI3REF: Run-Time Library Version Numbers {H10020} <S60100> ** KEYWORDS: sqlite3_version ** @@ -882,11 +882,10 @@ #define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8)) #define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8)) #define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8)) #define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8)) #define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8)) - #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8) ) /* ** CAPI3REF: Flags For File Open Operations {H10230} <H11120> <H12700> ** @@ -962,12 +961,13 @@ ** [sqlite3_io_methods] object it uses a combination of ** these integer values as the second argument. ** ** When the SQLITE_SYNC_DATAONLY flag is used, it means that the ** sync operation only needs to flush data to mass storage. Inode -** information need not be flushed. The SQLITE_SYNC_NORMAL flag means -** to use normal fsync() semantics. The SQLITE_SYNC_FULL flag means +** information need not be flushed. If the lower four bits of the flag +** equal SQLITE_SYNC_NORMAL, that means to use normal fsync() semantics. +** If the lower four bits equal SQLITE_SYNC_FULL, that means ** to use Mac OS X style fullsync instead of fsync(). */ #define SQLITE_SYNC_NORMAL 0x00002 #define SQLITE_SYNC_FULL 0x00003 #define SQLITE_SYNC_DATAONLY 0x00010 @@ -2729,11 +2729,12 @@ ** ** To execute an SQL query, it must first be compiled into a byte-code ** program using one of these routines. ** ** The first argument, "db", is a [database connection] obtained from a -** prior call to [sqlite3_open()], [sqlite3_open_v2()] or [sqlite3_open16()]. +** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or +** [sqlite3_open16()]. The database connection must not have been closed. ** ** The second argument, "zSql", is the statement to be compiled, encoded ** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2() ** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2() ** use UTF-16. @@ -2746,21 +2747,22 @@ ** that the supplied string is nul-terminated, then there is a small ** performance advantage to be gained by passing an nByte parameter that ** is equal to the number of bytes in the input string <i>including</i> ** the nul-terminator bytes. ** -** *pzTail is made to point to the first byte past the end of the -** first SQL statement in zSql. These routines only compile the first -** statement in zSql, so *pzTail is left pointing to what remains -** uncompiled. +** If pzTail is not NULL then *pzTail is made to point to the first byte +** past the end of the first SQL statement in zSql. These routines only +** compile the first statement in zSql, so *pzTail is left pointing to +** what remains uncompiled. ** ** *ppStmt is left pointing to a compiled [prepared statement] that can be ** executed using [sqlite3_step()]. If there is an error, *ppStmt is set ** to NULL. If the input text contains no SQL (if the input is an empty ** string or a comment) then *ppStmt is set to NULL. -** {A13018} The calling procedure is responsible for deleting the compiled +** The calling procedure is responsible for deleting the compiled ** SQL statement using [sqlite3_finalize()] after it has finished with it. +** ppStmt may not be NULL. ** ** On success, [SQLITE_OK] is returned, otherwise an [error code] is returned. ** ** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are ** recommended for all new programs. The two older interfaces are retained @@ -4130,14 +4132,28 @@ ** the name of a folder (a.k.a. directory), then all temporary files ** created by SQLite will be placed in that directory. If this variable ** is a NULL pointer, then SQLite performs a search for an appropriate ** temporary file directory. ** -** It is not safe to modify this variable once a [database connection] -** has been opened. It is intended that this variable be set once +** It is not safe to read or modify this variable in more than one +** thread at a time. It is not safe to read or modify this variable +** if a [database connection] is being used at the same time in a separate +** thread. +** It is intended that this variable be set once ** as part of process initialization and before any SQLite interface -** routines have been call and remain unchanged thereafter. +** routines have been called and that this variable remain unchanged +** thereafter. +** +** The [temp_store_directory pragma] may modify this variable and cause +** it to point to memory obtained from [sqlite3_malloc]. Furthermore, +** the [temp_store_directory pragma] always assumes that any string +** that this variable points to is held in memory obtained from +** [sqlite3_malloc] and the pragma may attempt to free that memory +** using [sqlite3_free]. +** Hence, if this variable is modified directly, either it should be +** made NULL or made to point to memory obtained from [sqlite3_malloc] +** or else the use of the [temp_store_directory pragma] should be avoided. */ SQLITE_API char *sqlite3_temp_directory; /* ** CAPI3REF: Test For Auto-Commit Mode {H12930} <S60200> @@ -6418,10 +6434,15 @@ ** Round down to the nearest multiple of 8 */ #define ROUNDDOWN8(x) ((x)&~7) /* +** Assert that the pointer X is aligned to an 8-byte boundary. +*/ +#define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&7)==0) + +/* ** An instance of the following structure is used to store the busy-handler ** callback for a given sqlite handle. ** ** The sqlite.busyHandler member of the sqlite struct contains the busy ** callback for the database handle. Each pager opened via the sqlite @@ -6571,11 +6592,11 @@ ************************************************************************* ** This header file defines the interface that the sqlite B-Tree file ** subsystem. See comments in the source code for a detailed description ** of what each interface routine does. ** -** @(#) $Id: btree.h,v 1.111 2009/03/18 10:33:01 danielk1977 Exp $ +** @(#) $Id: btree.h,v 1.113 2009/04/10 12:55:17 danielk1977 Exp $ */ #ifndef _BTREE_H_ #define _BTREE_H_ /* TODO: This definition is just included so other modules compile. It @@ -6638,11 +6659,11 @@ SQLITE_PRIVATE int sqlite3BtreeClose(Btree*); SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree*,int); SQLITE_PRIVATE int sqlite3BtreeSetSafetyLevel(Btree*,int,int); SQLITE_PRIVATE int sqlite3BtreeSyncDisabled(Btree*); -SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree*,int,int); +SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree*,int,int,int); SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree*); SQLITE_PRIVATE int sqlite3BtreeMaxPageCount(Btree*,int); SQLITE_PRIVATE int sqlite3BtreeGetReserve(Btree*); SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *, int); SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *); @@ -6744,46 +6765,43 @@ /* ** If we are not using shared cache, then there is no need to ** use mutexes to access the BtShared structures. So make the ** Enter and Leave procedures no-ops. */ -#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE +#ifndef SQLITE_OMIT_SHARED_CACHE SQLITE_PRIVATE void sqlite3BtreeEnter(Btree*); -SQLITE_PRIVATE void sqlite3BtreeLeave(Btree*); -#ifndef NDEBUG - /* This routine is used inside assert() statements only. */ -SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree*); -#endif +SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3*); +#else +# define sqlite3BtreeEnter(X) +# define sqlite3BtreeEnterAll(X) +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE +SQLITE_PRIVATE void sqlite3BtreeLeave(Btree*); SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor*); SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor*); -SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3*); -SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3*); -#ifndef NDEBUG - /* This routine is used inside assert() statements only. */ -SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3*); -#endif +SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3*); SQLITE_PRIVATE void sqlite3BtreeMutexArrayEnter(BtreeMutexArray*); SQLITE_PRIVATE void sqlite3BtreeMutexArrayLeave(BtreeMutexArray*); SQLITE_PRIVATE void sqlite3BtreeMutexArrayInsert(BtreeMutexArray*, Btree*); -#else -# define sqlite3BtreeEnter(X) -# define sqlite3BtreeLeave(X) -#ifndef NDEBUG - /* This routine is used inside assert() statements only. */ -# define sqlite3BtreeHoldsMutex(X) 1 -#endif +#ifndef NDEBUG + /* These routines are used inside assert() statements only. */ +SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree*); +SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3*); +#endif +#else + +# define sqlite3BtreeLeave(X) # define sqlite3BtreeEnterCursor(X) # define sqlite3BtreeLeaveCursor(X) -# define sqlite3BtreeEnterAll(X) -# define sqlite3BtreeLeaveAll(X) -#ifndef NDEBUG - /* This routine is used inside assert() statements only. */ -# define sqlite3BtreeHoldsAllMutexes(X) 1 -#endif +# define sqlite3BtreeLeaveAll(X) # define sqlite3BtreeMutexArrayEnter(X) # define sqlite3BtreeMutexArrayLeave(X) # define sqlite3BtreeMutexArrayInsert(X,Y) + +# define sqlite3BtreeHoldsMutex(X) 1 +# define sqlite3BtreeHoldsAllMutexes(X) 1 #endif #endif /* _BTREE_H_ */ @@ -6806,11 +6824,11 @@ ** ** This header defines the interface to the virtual database engine ** or VDBE. The VDBE implements an abstract machine that runs a ** simple program to access and modify the underlying database. ** -** $Id: vdbe.h,v 1.140 2009/02/19 14:39:25 danielk1977 Exp $ +** $Id: vdbe.h,v 1.141 2009/04/10 00:56:29 drh Exp $ */ #ifndef _SQLITE_VDBE_H_ #define _SQLITE_VDBE_H_ /* @@ -7162,12 +7180,11 @@ SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe*,Vdbe*); #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT SQLITE_PRIVATE int sqlite3VdbeReleaseMemory(int); #endif -SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*, - UnpackedRecord*,int); +SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,char*,int); SQLITE_PRIVATE void sqlite3VdbeDeleteUnpackedRecord(UnpackedRecord*); SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*); #ifndef NDEBUG @@ -8097,10 +8114,17 @@ u8 isTransactionSavepoint; /* True if the outermost savepoint is a TS */ #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY /* The following variables are all protected by the STATIC_MASTER ** mutex, not by sqlite3.mutex. They are used by code in notify.c. + ** + ** When X.pUnlockConnection==Y, that means that X is waiting for Y to + ** unlock so that it can proceed. + ** + ** When X.pBlockingConnection==Y, that means that something that X tried + ** tried to do recently failed with an SQLITE_LOCKED error due to locks + ** held by Y. */ sqlite3 *pBlockingConnection; /* Connection that caused SQLITE_LOCKED */ sqlite3 *pUnlockConnection; /* Connection to watch for unlock */ void *pUnlockArg; /* Argument to xUnlockNotify */ void (*xUnlockNotify)(void **, int); /* Unlock notify callback */ @@ -8141,11 +8165,10 @@ #define SQLITE_FullFSync 0x00010000 /* Use full fsync on the backend */ #define SQLITE_LoadExtension 0x00020000 /* Enable load_extension */ #define SQLITE_RecoveryMode 0x00040000 /* Ignore schema errors */ #define SQLITE_SharedCache 0x00080000 /* Cache sharing is enabled */ -#define SQLITE_Vtab 0x00100000 /* There exists a virtual table */ #define SQLITE_CommitBusy 0x00200000 /* In the process of committing */ #define SQLITE_ReverseOrder 0x00400000 /* Reverse unordered SELECTs */ /* ** Possible values for the sqlite.magic field. @@ -8707,23 +8730,22 @@ ** is a disk table or the "old.*" pseudo-table, then pTab points to the ** corresponding table definition. ** ** ALLOCATION NOTES: ** -** Expr structures may be stored as part of the in-memory database schema, -** for example as part of trigger, view or table definitions. In this case, -** the amount of memory consumed by complex expressions may be significant. -** For this reason, less than sizeof(Expr) bytes may be allocated for some -** Expr structs stored as part of the in-memory database schema. -** -** If the EP_Reduced flag is set in Expr.flags, then only EXPR_REDUCEDSIZE -** bytes of space are allocated for the expression structure. This is enough -** space to store all fields up to and including the "Token span;" field. -** -** If the EP_TokenOnly flag is set in Expr.flags, then only EXPR_TOKENONLYSIZE -** bytes of space are allocated for the expression structure. This is enough -** space to store all fields up to and including the "Token token;" field. +** Expr objects can use a lot of memory space in database schema. To +** help reduce memory requirements, sometimes an Expr object will be +** truncated. And to reduce the number of memory allocations, sometimes +** two or more Expr objects will be stored in a single memory allocation, +** together with Expr.token and/or Expr.span strings. +** +** If the EP_Reduced, EP_SpanToken, and EP_TokenOnly flags are set when +** an Expr object is truncated. When EP_Reduced is set, then all +** the child Expr objects in the Expr.pLeft and Expr.pRight subtrees +** are contained within the same memory allocation. Note, however, that +** the subtrees in Expr.x.pList or Expr.x.pSelect are always separately +** allocated, regardless of whether or not EP_Reduced is set. */ struct Expr { u8 op; /* Operation performed by this node */ char affinity; /* The affinity of the column or 0 if not a column */ VVA_ONLY(u8 vvaFlags;) /* Flags used for VV&A only. EVVA_* below. */ @@ -8735,11 +8757,11 @@ ** access them will result in a segfault or malfunction. *********************************************************************/ Token span; /* Complete text of the expression */ - /* If the EP_SpanOnly flag is set in the Expr.flags mask, then no + /* If the EP_SpanToken flag is set in the Expr.flags mask, then no ** space is allocated for the fields below this point. An attempt to ** access them will result in a segfault or malfunction. *********************************************************************/ Expr *pLeft; /* Left subnode */ @@ -8783,11 +8805,11 @@ #define EP_IntValue 0x0800 /* Integer value contained in iTable */ #define EP_xIsSelect 0x1000 /* x.pSelect is valid (otherwise x.pList is) */ #define EP_Reduced 0x2000 /* Expr struct is EXPR_REDUCEDSIZE bytes only */ #define EP_TokenOnly 0x4000 /* Expr struct is EXPR_TOKENONLYSIZE bytes only */ -#define EP_SpanOnly 0x8000 /* Expr struct is EXPR_SPANONLYSIZE bytes only */ +#define EP_SpanToken 0x8000 /* Expr size is EXPR_SPANTOKENSIZE bytes */ /* ** The following are the meanings of bits in the Expr.vvaFlags field. ** This information is only used when SQLite is compiled with ** SQLITE_DEBUG defined. @@ -8808,22 +8830,21 @@ /* ** Macros to determine the number of bytes required by a normal Expr ** struct, an Expr struct with the EP_Reduced flag set in Expr.flags ** and an Expr struct with the EP_TokenOnly flag set. */ -#define EXPR_FULLSIZE sizeof(Expr) -#define EXPR_REDUCEDSIZE offsetof(Expr,iTable) -#define EXPR_TOKENONLYSIZE offsetof(Expr,span) -#define EXPR_SPANONLYSIZE offsetof(Expr,pLeft) +#define EXPR_FULLSIZE sizeof(Expr) /* Full size */ +#define EXPR_REDUCEDSIZE offsetof(Expr,iTable) /* Common features */ +#define EXPR_SPANTOKENSIZE offsetof(Expr,pLeft) /* Fewer features */ +#define EXPR_TOKENONLYSIZE offsetof(Expr,span) /* Smallest possible */ /* ** Flags passed to the sqlite3ExprDup() function. See the header comment ** above sqlite3ExprDup() for details. */ -#define EXPRDUP_REDUCE 0x0001 -#define EXPRDUP_SPAN 0x0002 -#define EXPRDUP_DISTINCTSPAN 0x0004 +#define EXPRDUP_REDUCE 0x0001 /* Used reduced-size Expr nodes */ +#define EXPRDUP_SPAN 0x0002 /* Make a copy of Expr.span */ /* ** A list of expressions. Each expression may optionally have a ** name. An expr/name combination can be used in several ways, such ** as the list of "expr AS ID" fields following a "SELECT" or in the @@ -9799,10 +9820,11 @@ # define sqlite3TriggersExist(B,C,D,E,F) 0 # define sqlite3DeleteTrigger(A,B) # define sqlite3DropTriggerPtr(A,B) # define sqlite3UnlinkAndDeleteTrigger(A,B,C) # define sqlite3CodeRowTrigger(A,B,C,D,E,F,G,H,I,J,K,L) 0 +# define sqlite3TriggerList(X, Y) 0 #endif SQLITE_PRIVATE int sqlite3JoinType(Parse*, Token*, Token*, Token*); SQLITE_PRIVATE void sqlite3CreateForeignKey(Parse*, ExprList*, Token*, ExprList*, int); SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse*, int); @@ -9830,11 +9852,11 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double*); SQLITE_PRIVATE int sqlite3GetInt32(const char *, int*); SQLITE_PRIVATE int sqlite3FitsIn64Bits(const char *, int); SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *pData, int nChar); SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *pData, int nByte); -SQLITE_PRIVATE int sqlite3Utf8Read(const u8*, const u8*, const u8**); +SQLITE_PRIVATE int sqlite3Utf8Read(const u8*, const u8**); /* ** Routines to read and write variable-length integers. These used to ** be defined locally, but now we use the varint routines in the util.c ** file. Code should use the MACRO forms below, as the Varint32 versions @@ -10427,11 +10449,11 @@ ** ** There is only one exported symbol in this file - the function ** sqlite3RegisterDateTimeFunctions() found at the bottom of the file. ** All other code has file scope. ** -** $Id: date.c,v 1.103 2009/02/04 03:59:25 shane Exp $ +** $Id: date.c,v 1.105 2009/04/03 12:04:37 drh Exp $ ** ** SQLite processes all times and dates as Julian Day numbers. The ** dates and times are stored as the number of days since noon ** in Greenwich on November 24, 4714 B.C. according to the Gregorian ** calendar system. @@ -11361,12 +11383,12 @@ break; } case 'm': sqlite3_snprintf(3, &z[j],"%02d",x.M); j+=2; break; case 'M': sqlite3_snprintf(3, &z[j],"%02d",x.m); j+=2; break; case 's': { - sqlite3_snprintf(30,&z[j],"%d", - (int)(x.iJD/1000.0 - 210866760000.0)); + sqlite3_snprintf(30,&z[j],"%lld", + (i64)(x.iJD/1000 - 21086676*(i64)10000)); j += sqlite3Strlen30(&z[j]); break; } case 'S': sqlite3_snprintf(3,&z[j],"%02d",(int)x.s); j+=2; break; case 'w': { @@ -15655,11 +15677,11 @@ ** the public domain. The original comments are included here for ** completeness. They are very out-of-date but might be useful as ** an historical reference. Most of the "enhancements" have been backed ** out so that the functionality is now the same as standard printf(). ** -** $Id: printf.c,v 1.99 2008/12/10 19:26:24 drh Exp $ +** $Id: printf.c,v 1.102 2009/04/08 16:10:04 drh Exp $ ** ************************************************************************** ** ** The following modules is an enhanced replacement for the "printf" subroutines ** found in the standard C library. The following enhancements are @@ -15726,10 +15748,12 @@ #define etSRCLIST 13 /* a pointer to a SrcList */ #define etPOINTER 14 /* The %p conversion */ #define etSQLESCAPE3 15 /* %w -> Strings with '\"' doubled */ #define etORDINAL 16 /* %r -> 1st, 2nd, 3rd, 4th, etc. English only */ +#define etINVALID 0 /* Any unrecognized conversion type */ + /* ** An "etByte" is an 8-bit unsigned value. */ typedef unsigned char etByte; @@ -15782,10 +15806,13 @@ #endif { 'i', 10, 1, etRADIX, 0, 0 }, { 'n', 0, 0, etSIZE, 0, 0 }, { '%', 0, 0, etPERCENT, 0, 0 }, { 'p', 16, 0, etPOINTER, 0, 1 }, + +/* All the rest have the FLAG_INTERN bit set and are thus for internal +** use only */ { 'T', 0, 2, etTOKEN, 0, 0 }, { 'S', 0, 2, etSRCLIST, 0, 0 }, { 'r', 10, 3, etORDINAL, 0, 0 }, }; @@ -15984,11 +16011,12 @@ } }else{ flag_long = flag_longlong = 0; } /* Fetch the info entry for the field */ - infop = 0; + infop = &fmtinfo[0]; + xtype = etINVALID; for(idx=0; idx<ArraySize(fmtinfo); idx++){ if( c==fmtinfo[idx].fmttype ){ infop = &fmtinfo[idx]; if( useExtended || (infop->flags & FLAG_INTERN)==0 ){ xtype = infop->type; @@ -15997,13 +16025,10 @@ } break; } } zExtra = 0; - if( infop==0 ){ - return; - } /* Limit the precision to prevent overflowing buf[] during conversion */ if( precision>etBUFSIZE-40 && (infop->flags & FLAG_STRING)==0 ){ precision = etBUFSIZE-40; @@ -16337,10 +16362,14 @@ } sqlite3StrAccumAppend(pAccum, pItem->zName, -1); length = width = 0; break; } + default: { + assert( xtype==etINVALID ); + return; + } }/* End switch over the format type */ /* ** The text of the conversion is pointed to by "bufpt" and is ** "length" characters long. The field width is "width". Do ** the output. @@ -16370,17 +16399,20 @@ /* ** 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->tooBig | p->mallocFailed ){ + testcase(p->tooBig); + testcase(p->mallocFailed); return; } if( N<0 ){ N = sqlite3Strlen30(z); } - if( N==0 || z==0 ){ + if( N==0 || NEVER(z==0) ){ return; } if( p->nChar+N >= p->nAlloc ){ char *zNew; if( !p->useMalloc ){ @@ -16465,16 +16497,17 @@ */ SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3 *db, const char *zFormat, va_list ap){ char *z; char zBase[SQLITE_PRINT_BUF_SIZE]; StrAccum acc; + assert( db!=0 ); sqlite3StrAccumInit(&acc, zBase, sizeof(zBase), - db ? db->aLimit[SQLITE_LIMIT_LENGTH] : SQLITE_MAX_LENGTH); + db->aLimit[SQLITE_LIMIT_LENGTH]); acc.db = db; sqlite3VXPrintf(&acc, 1, zFormat, ap); z = sqlite3StrAccumFinish(&acc); - if( acc.mallocFailed && db ){ + if( acc.mallocFailed ){ db->mallocFailed = 1; } return z; } @@ -16749,11 +16782,11 @@ ** ************************************************************************* ** This file contains routines used to translate between UTF-8, ** UTF-16, UTF-16BE, and UTF-16LE. ** -** $Id: utf.c,v 1.71 2009/03/31 03:41:57 shane Exp $ +** $Id: utf.c,v 1.73 2009/04/01 18:40:32 drh Exp $ ** ** Notes on UTF-8: ** ** Byte-0 Byte-1 Byte-2 Byte-3 Value ** 0xxxxxxx 00000000 00000000 0xxxxxxx @@ -16791,11 +16824,11 @@ ** VDBE. This information used to all be at the top of the single ** source code file "vdbe.c". When that file became too big (over ** 6000 lines long) it was split up into several smaller files and ** this header information was factored out. ** -** $Id: vdbeInt.h,v 1.166 2009/03/18 10:33:02 danielk1977 Exp $ +** $Id: vdbeInt.h,v 1.167 2009/04/10 12:55:17 danielk1977 Exp $ */ #ifndef _VDBEINT_H_ #define _VDBEINT_H_ /* @@ -17155,10 +17188,16 @@ SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *, int); #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT SQLITE_PRIVATE int sqlite3VdbeReleaseBuffers(Vdbe *p); #endif +#ifndef SQLITE_OMIT_SHARED_CACHE +SQLITE_PRIVATE void sqlite3VdbeMutexArrayEnter(Vdbe *p); +#else +# define sqlite3VdbeMutexArrayEnter(p) +#endif + SQLITE_PRIVATE int sqlite3VdbeMemTranslate(Mem*, u8); #ifdef SQLITE_DEBUG SQLITE_PRIVATE void sqlite3VdbePrintSql(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf); #endif @@ -17244,26 +17283,24 @@ } #define READ_UTF16LE(zIn, c){ \ c = (*zIn++); \ c += ((*zIn++)<<8); \ - if( c>=0xD800 && c<0xE000 ){ \ + if( c>=0xD800 && c<0xE000 ){ \ int c2 = (*zIn++); \ c2 += ((*zIn++)<<8); \ c = (c2&0x03FF) + ((c&0x003F)<<10) + (((c&0x03C0)+0x0040)<<10); \ - if( (c & 0xFFFF0000)==0 ) c = 0xFFFD; \ } \ } #define READ_UTF16BE(zIn, c){ \ c = ((*zIn++)<<8); \ c += (*zIn++); \ - if( c>=0xD800 && c<0xE000 ){ \ + if( c>=0xD800 && c<0xE000 ){ \ int c2 = ((*zIn++)<<8); \ c2 += (*zIn++); \ c = (c2&0x03FF) + ((c&0x003F)<<10) + (((c&0x03C0)+0x0040)<<10); \ - if( (c & 0xFFFF0000)==0 ) c = 0xFFFD; \ } \ } /* ** Translate a single UTF-8 character. Return the unicode value. @@ -17302,17 +17339,29 @@ if( c<0x80 \ || (c&0xFFFFF800)==0xD800 \ || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } \ } SQLITE_PRIVATE int sqlite3Utf8Read( - const unsigned char *z, /* First byte of UTF-8 character */ - const unsigned char *zTerm, /* Pretend this byte is 0x00 */ + const unsigned char *zIn, /* First byte of UTF-8 character */ const unsigned char **pzNext /* Write first byte past UTF-8 char here */ ){ int c; - READ_UTF8(z, zTerm, c); - *pzNext = z; + + /* Same as READ_UTF8() above but without the zTerm parameter. + ** For this routine, we assume the UTF8 string is always zero-terminated. + */ + c = *(zIn++); + if( c>=0xc0 ){ + c = sqlite3Utf8Trans1[c-0xc0]; + while( (*zIn & 0xc0)==0x80 ){ + c = (c<<6) + (0x3f & *(zIn++)); + } + if( c<0x80 + || (c&0xFFFFF800)==0xD800 + || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } + } + *pzNext = zIn; return c; } @@ -17475,11 +17524,12 @@ */ SQLITE_PRIVATE int sqlite3VdbeMemHandleBom(Mem *pMem){ int rc = SQLITE_OK; u8 bom = 0; - if( pMem->n<0 || pMem->n>1 ){ + assert( pMem->n>=0 ); + if( pMem->n>1 ){ u8 b1 = *(u8 *)pMem->z; u8 b2 = *(((u8 *)pMem->z) + 1); if( b1==0xFE && b2==0xFF ){ bom = SQLITE_UTF16BE; } @@ -17541,15 +17591,14 @@ ** correct UTF-8 encoding to be longer than a malformed encoding). */ SQLITE_PRIVATE int sqlite3Utf8To8(unsigned char *zIn){ unsigned char *zOut = zIn; unsigned char *zStart = zIn; - unsigned char *zTerm = &zIn[sqlite3Strlen30((char *)zIn)]; u32 c; while( zIn[0] ){ - c = sqlite3Utf8Read(zIn, zTerm, (const u8**)&zIn); + c = sqlite3Utf8Read(zIn, (const u8**)&zIn); if( c!=0xfffd ){ WRITE_UTF8(zOut, c); } } *zOut = 0; @@ -17579,19 +17628,17 @@ assert( (m.flags & MEM_Str)!=0 || db->mallocFailed ); return (m.flags & MEM_Dyn)!=0 ? m.z : sqlite3DbStrDup(db, m.z); } /* -** pZ is a UTF-16 encoded unicode string. If nChar is less than zero, -** return the number of bytes up to (but not including), the first pair -** of consecutive 0x00 bytes in pZ. If nChar is not less than zero, -** then return the number of bytes in the first nChar unicode characters -** in pZ (or up until the first pair of 0x00 bytes, whichever comes first). +** pZ is a UTF-16 encoded unicode string at least nChar characters long. +** Return the number of bytes in the first nChar unicode characters +** in pZ. nChar must be non-negative. */ SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *zIn, int nChar){ - unsigned int c = 1; - char const *z = zIn; + int c; + unsigned char const *z = zIn; int n = 0; if( SQLITE_UTF16NATIVE==SQLITE_UTF16BE ){ /* Using an "if (SQLITE_UTF16NATIVE==SQLITE_UTF16BE)" construct here ** and in other parts of this file means that at one branch will ** not be covered by coverage testing on any single host. But coverage @@ -17599,21 +17646,21 @@ ** big-endian host. Because both the UTF16NATIVE and SQLITE_UTF16BE ** macros are constant at compile time the compiler can determine ** which branch will be followed. It is therefore assumed that no runtime ** penalty is paid for this "if" statement. */ - while( c && ((nChar<0) || n<nChar) ){ + while( n<nChar ){ READ_UTF16BE(z, c); n++; } }else{ - while( c && ((nChar<0) || n<nChar) ){ + while( n<nChar ){ READ_UTF16LE(z, c); n++; } } - return (int)(z-(char const *)zIn)-((c==0)?2:0); + return (int)(z-(unsigned char const *)zIn); } #if defined(SQLITE_TEST) /* ** This routine is called from the TCL test function "translate_selftest". @@ -17622,23 +17669,21 @@ */ SQLITE_PRIVATE void sqlite3UtfSelfTest(void){ unsigned int i, t; unsigned char zBuf[20]; unsigned char *z; - unsigned char *zTerm; int n; unsigned int c; for(i=0; i<0x00110000; i++){ z = zBuf; WRITE_UTF8(z, i); n = (int)(z-zBuf); assert( n>0 && n<=4 ); z[0] = 0; - zTerm = z; z = zBuf; - c = sqlite3Utf8Read(z, zTerm, (const u8**)&z); + c = sqlite3Utf8Read(z, (const u8**)&z); t = i; if( i>=0xD800 && i<=0xDFFF ) t = 0xFFFD; if( (i&0xFFFFFFFE)==0xFFFE ) t = 0xFFFD; assert( c==t ); assert( (z-zBuf)==n ); @@ -20521,11 +20566,11 @@ ** * sqlite3_vfs method implementations. ** * Locking primitives for the proxy uber-locking-method. (MacOSX only) ** * Definitions of sqlite3_vfs objects for all locking methods ** plus implementations of sqlite3_os_init() and sqlite3_os_end(). ** -** $Id: os_unix.c,v 1.248 2009/03/30 07:39:35 danielk1977 Exp $ +** $Id: os_unix.c,v 1.250 2009/04/07 05:35:04 chw Exp $ */ #if SQLITE_OS_UNIX /* This file is used on unix only */ /* ** There are various methods for file locking used for concurrency @@ -22911,12 +22956,12 @@ semUnlock(id, NO_LOCK); assert( pFile ); unixEnterMutex(); releaseLockInfo(pFile->pLock); releaseOpenCnt(pFile->pOpen); - closeUnixFile(id); unixLeaveMutex(); + closeUnixFile(id); } return SQLITE_OK; } #endif /* OS_VXWORKS */ @@ -23905,11 +23950,11 @@ dotlockLock, /* xLock method */ dotlockUnlock, /* xUnlock method */ dotlockCheckReservedLock /* xCheckReservedLock method */ ) -#if SQLITE_ENABLE_LOCKING_STYLE +#if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS IOMETHODS( flockIoFinder, /* Finder function name */ flockIoMethods, /* sqlite3_io_methods object name */ flockClose, /* xClose method */ flockLock, /* xLock method */ @@ -24028,10 +24073,48 @@ } static const sqlite3_io_methods *(*const autolockIoFinder)(const char*,int) = autolockIoFinderImpl; #endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ + +#if OS_VXWORKS && 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 VXWorks only. +*/ +static const sqlite3_io_methods *autolockIoFinderImpl( + const char *filePath, /* name of the database file */ + int fd /* file descriptor open on the database file */ +){ + struct flock lockInfo; + + if( !filePath ){ + /* If filePath==NULL that means we are dealing with a transient file + ** that does not need to be locked. */ + return &nolockIoMethods; + } + + /* Test if fcntl() is supported and use POSIX style locks. + ** Otherwise fall back to the named semaphore method. + */ + lockInfo.l_len = 1; + lockInfo.l_start = 0; + lockInfo.l_whence = SEEK_SET; + lockInfo.l_type = F_RDLCK; + if( fcntl(fd, F_GETLK, &lockInfo)!=-1 ) { + return &posixIoMethods; + }else{ + return &semIoMethods; + } +} +static const sqlite3_io_methods *(*const autolockIoFinder)(const char*,int) + = autolockIoFinderImpl; + +#endif /* OS_VXWORKS && SQLITE_ENABLE_LOCKING_STYLE */ /* ** An abstract type for a pointer to a IO method finder function: */ typedef const sqlite3_io_methods *(*finder_type)(const char*,int); @@ -24311,11 +24394,11 @@ const char *zPath, /* Pathname of file to be opened */ sqlite3_file *pFile, /* The file descriptor to be filled in */ int flags, /* Input flags to control the opening */ int *pOutFlags /* Output flags returned to SQLite core */ ){ - int fd = 0; /* File descriptor returned by open() */ + int fd = -1; /* File descriptor returned by open() */ int dirfd = -1; /* Directory file descriptor */ int openFlags = 0; /* Flags to pass to open() */ int eType = flags&0xFFFFFF00; /* Type of file to open */ int noLock; /* True to omit locking primitives */ int rc = SQLITE_OK; @@ -24414,11 +24497,11 @@ if( (flags & SQLITE_OPEN_MAIN_DB)!=0 ){ ((unixFile*)pFile)->isLockable = 1; } #endif - assert(fd!=0); + assert( fd>=0 ); if( isOpenDirectory ){ rc = openDirectory(zPath, &dirfd); if( rc!=SQLITE_OK ){ close(fd); /* silently leak if fail, already in error */ return rc; @@ -25759,11 +25842,11 @@ ** Note that the sqlite3_vfs.pNext field of the VFS object is modified ** by the SQLite core when the VFS is registered. So the following ** array cannot be const. */ static sqlite3_vfs aVfs[] = { -#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) +#if SQLITE_ENABLE_LOCKING_STYLE && (OS_VXWORKS || defined(__APPLE__)) UNIXVFS("unix", autolockIoFinder ), #else UNIXVFS("unix", posixIoFinder ), #endif UNIXVFS("unix-none", nolockIoFinder ), @@ -25771,11 +25854,13 @@ #if OS_VXWORKS UNIXVFS("unix-namedsem", semIoFinder ), #endif #if SQLITE_ENABLE_LOCKING_STYLE UNIXVFS("unix-posix", posixIoFinder ), +#if !OS_VXWORKS UNIXVFS("unix-flock", flockIoFinder ), +#endif #endif #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) UNIXVFS("unix-afp", afpIoFinder ), UNIXVFS("unix-proxy", proxyIoFinder ), #endif @@ -25816,11 +25901,11 @@ ** ****************************************************************************** ** ** This file contains code that is specific to windows. ** -** $Id: os_win.c,v 1.153 2009/03/31 03:41:57 shane Exp $ +** $Id: os_win.c,v 1.154 2009/04/09 14:27:07 chw Exp $ */ #if SQLITE_OS_WIN /* This file is used for windows only */ /* @@ -27612,11 +27697,11 @@ const char *zRelative /* UTF-8 file name */ ){ DWORD bytesPerSector = SQLITE_DEFAULT_SECTOR_SIZE; char zFullpath[MAX_PATH+1]; int rc; - DWORD dwRet = 0; + DWORD dwRet = 0, dwDummy; /* ** We need to get the full path name of the file ** to get the drive letter to look up the sector ** size. @@ -27636,14 +27721,14 @@ p[i] = '\0'; break; } } dwRet = GetDiskFreeSpaceW((WCHAR*)zConverted, - NULL, + &dwDummy, &bytesPerSector, - NULL, - NULL); + &dwDummy, + &dwDummy); #if SQLITE_OS_WINCE==0 }else{ int i; /* trim path to just drive reference */ CHAR *p = (CHAR *)zConverted; @@ -27653,14 +27738,14 @@ p[i] = '\0'; break; } } dwRet = GetDiskFreeSpaceA((CHAR*)zConverted, - NULL, + &dwDummy, &bytesPerSector, - NULL, - NULL); + &dwDummy, + &dwDummy); #endif } free(zConverted); } if( !dwRet ){ @@ -27938,11 +28023,11 @@ ** sometimes grow into tens of thousands or larger. The size of the ** Bitvec object is the number of pages in the database file at the ** start of a transaction, and is thus usually less than a few thousand, ** but can be as large as 2 billion for a really big database. ** -** @(#) $Id: bitvec.c,v 1.13 2009/01/20 17:06:27 danielk1977 Exp $ +** @(#) $Id: bitvec.c,v 1.14 2009/04/01 23:49:04 drh Exp $ */ /* Size of the Bitvec structure in bytes. */ #define BITVEC_SZ 512 @@ -27997,12 +28082,13 @@ ** N*iDivisor+1 and (N+1)*iDivisor. Each subbitmap is normalized ** to hold deal with values between 1 and iDivisor. */ struct Bitvec { u32 iSize; /* Maximum bit index. Max iSize is 4,294,967,296. */ - u32 nSet; /* Number of bits that are set - only valid for aHash element */ - /* Max nSet is BITVEC_NINT. For BITVEC_SZ of 512, this would be 125. */ + u32 nSet; /* Number of bits that are set - only valid for aHash + ** element. Max is BITVEC_NINT. For BITVEC_SZ of 512, + ** this would be 125. */ u32 iDivisor; /* Number of bits handled by each apSub[] entry. */ /* Should >=0 for apSub element. */ /* Max iDivisor is max(u32) / BITVEC_NPTR + 1. */ /* For a BITVEC_SZ of 512, this would be 34,359,739. */ union { @@ -28280,11 +28366,12 @@ ** Bitvec object. Start with the assumption that they do ** match (rc==0). Change rc to non-zero if a discrepancy ** is found. */ rc = sqlite3BitvecTest(0,0) + sqlite3BitvecTest(pBitvec, sz+1) - + sqlite3BitvecTest(pBitvec, 0); + + sqlite3BitvecTest(pBitvec, 0) + + (sqlite3BitvecSize(pBitvec) - sz); for(i=1; i<=sz; i++){ if( (TESTBIT(pV,i))!=sqlite3BitvecTest(pBitvec,i) ){ rc = i; break; } @@ -29663,11 +29750,11 @@ ** the sort) then returns elements one by one by walking the list. ** ** Big chunks of rowid/next-ptr pairs are allocated at a time, to ** reduce the malloc overhead. ** -** $Id: rowset.c,v 1.3 2009/01/13 20:14:16 drh Exp $ +** $Id: rowset.c,v 1.4 2009/04/01 19:35:55 drh Exp $ */ /* ** The number of rowset entries per allocation chunk. */ @@ -29757,11 +29844,11 @@ ** memory allocation fails. */ SQLITE_PRIVATE void sqlite3RowSetInsert(RowSet *p, i64 rowid){ struct RowSetEntry *pEntry; struct RowSetEntry *pLast; - if( p==0 ) return; /* Must have been a malloc failure */ + assert( p!=0 ); if( p->nFresh==0 ){ struct RowSetChunk *pNew; pNew = sqlite3DbMallocRaw(p->db, sizeof(*pNew)); if( pNew==0 ){ return; @@ -29896,11 +29983,11 @@ ** is separate from the database file. The pager also implements file ** locking to prevent two processes from writing the same database ** file simultaneously, or one process from reading the database while ** another is writing. ** -** @(#) $Id: pager.c,v 1.576 2009/03/31 02:54:40 drh Exp $ +** @(#) $Id: pager.c,v 1.580 2009/04/11 16:27:50 drh Exp $ */ #ifndef SQLITE_OMIT_DISKIO /* ** Macros for troubleshooting. Normally turned off @@ -31901,15 +31988,15 @@ if( rc==SQLITE_DONE ){ rc = SQLITE_OK; pPager->journalOff = szJ; break; }else{ - /* If we are unable to rollback, then the database is probably - ** going to end up being corrupt. It is corrupt to us, anyhow. - ** Perhaps the next process to come along can fix it.... - */ - rc = SQLITE_CORRUPT_BKPT; + /* If we are unable to rollback, quit and return the error + ** code. This will cause the pager to enter the error state + ** so that no further harm will be done. Perhaps the next + ** process to come along will be able to rollback the database. + */ goto end_playback; } } } } @@ -32991,13 +33078,13 @@ ** may be a wrapper capable of caching the first portion of the journal ** file in memory to implement the atomic-write optimization (see ** source file journal.c). */ if( sqlite3JournalSize(pVfs)>sqlite3MemJournalSize() ){ - journalFileSize = sqlite3JournalSize(pVfs); - }else{ - journalFileSize = sqlite3MemJournalSize(); + journalFileSize = ROUND8(sqlite3JournalSize(pVfs)); + }else{ + journalFileSize = ROUND8(sqlite3MemJournalSize()); } /* Set the output variable to NULL in case an error occurs. */ *ppPager = 0; @@ -33049,27 +33136,29 @@ ** Main journal file handle (journalFileSize bytes) ** Database file name (nPathname+1 bytes) ** Journal file name (nPathname+8+1 bytes) */ pPtr = (u8 *)sqlite3MallocZero( - sizeof(*pPager) + /* Pager structure */ - pcacheSize + /* PCache object */ - pVfs->szOsFile + /* The main db file */ - journalFileSize * 2 + /* The two journal files */ - nPathname + 1 + /* zFilename */ - nPathname + 8 + 1 /* zJournal */ - ); + ROUND8(sizeof(*pPager)) + /* Pager structure */ + ROUND8(pcacheSize) + /* PCache object */ + ROUND8(pVfs->szOsFile) + /* The main db file */ + journalFileSize * 2 + /* The two journal files */ + nPathname + 1 + /* zFilename */ + nPathname + 8 + 1 /* zJournal */ + ); + assert( EIGHT_BYTE_ALIGNMENT(journalFileSize) ); if( !pPtr ){ sqlite3_free(zPathname); return SQLITE_NOMEM; } pPager = (Pager*)(pPtr); - pPager->pPCache = (PCache*)(pPtr += sizeof(*pPager)); - pPager->fd = (sqlite3_file*)(pPtr += pcacheSize); - pPager->sjfd = (sqlite3_file*)(pPtr += pVfs->szOsFile); + pPager->pPCache = (PCache*)(pPtr += ROUND8(sizeof(*pPager))); + pPager->fd = (sqlite3_file*)(pPtr += ROUND8(pcacheSize)); + pPager->sjfd = (sqlite3_file*)(pPtr += ROUND8(pVfs->szOsFile)); pPager->jfd = (sqlite3_file*)(pPtr += journalFileSize); pPager->zFilename = (char*)(pPtr += journalFileSize); + assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) ); /* Fill in the Pager.zFilename and Pager.zJournal buffers, if required. */ if( zPathname ){ pPager->zJournal = (char*)(pPtr += nPathname + 1); memcpy(pPager->zFilename, zPathname, nPathname); @@ -34951,18 +35040,15 @@ pPg->flags &= ~PGHDR_NEED_SYNC; pPgOld = pager_lookup(pPager, pgno); assert( !pPgOld || pPgOld->nRef==1 ); if( pPgOld ){ pPg->flags |= (pPgOld->flags&PGHDR_NEED_SYNC); + sqlite3PcacheDrop(pPgOld); } origPgno = pPg->pgno; sqlite3PcacheMove(pPg, pgno); - if( pPgOld ){ - sqlite3PcacheDrop(pPgOld); - } - sqlite3PcacheMakeDirty(pPg); pPager->dbModified = 1; if( needSyncPgno ){ /* If needSyncPgno is non-zero, then the journal file needs to be @@ -35063,34 +35149,37 @@ ** PAGER_JOURNALMODE_PERSIST ** PAGER_JOURNALMODE_OFF ** PAGER_JOURNALMODE_MEMORY ** ** If the parameter is not _QUERY, then the journal-mode is set to the -** value specified. +** value specified. Except, an in-memory database can only have its +** journal mode set to _OFF or _MEMORY. Attempts to change the journal +** mode of an in-memory database to something other than _OFF or _MEMORY +** are silently ignored. ** ** The returned indicate the current (possibly updated) journal-mode. */ SQLITE_PRIVATE int sqlite3PagerJournalMode(Pager *pPager, int eMode){ - if( !MEMDB ){ - assert( eMode==PAGER_JOURNALMODE_QUERY - || eMode==PAGER_JOURNALMODE_DELETE - || eMode==PAGER_JOURNALMODE_TRUNCATE - || eMode==PAGER_JOURNALMODE_PERSIST - || eMode==PAGER_JOURNALMODE_OFF - || eMode==PAGER_JOURNALMODE_MEMORY ); - assert( PAGER_JOURNALMODE_QUERY<0 ); - if( eMode>=0 ){ - pPager->journalMode = (u8)eMode; - }else{ - assert( eMode==PAGER_JOURNALMODE_QUERY ); - } + assert( eMode==PAGER_JOURNALMODE_QUERY + || eMode==PAGER_JOURNALMODE_DELETE + || eMode==PAGER_JOURNALMODE_TRUNCATE + || eMode==PAGER_JOURNALMODE_PERSIST + || eMode==PAGER_JOURNALMODE_OFF + || eMode==PAGER_JOURNALMODE_MEMORY ); + assert( PAGER_JOURNALMODE_QUERY<0 ); + if( eMode>=0 && (!MEMDB || eMode==PAGER_JOURNALMODE_MEMORY + || eMode==PAGER_JOURNALMODE_OFF) ){ + pPager->journalMode = (u8)eMode; } return (int)pPager->journalMode; } /* ** Get/set the size-limit used for persistent journal files. +** +** Setting the size limit to -1 means no limit is enforced. +** An attempt to set a limit smaller than -1 is a no-op. */ SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *pPager, i64 iLimit){ if( iLimit>=-1 ){ pPager->journalSizeLimit = iLimit; } @@ -35121,11 +35210,11 @@ ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** -** $Id: btmutex.c,v 1.13 2009/03/05 04:20:32 shane Exp $ +** $Id: btmutex.c,v 1.15 2009/04/10 12:55:17 danielk1977 Exp $ ** ** This file contains code used to implement mutexes on Btree objects. ** This code really belongs in btree.c. But btree.c is getting too ** big and we want to break it down some. This packaged seemed like ** a good breakout. @@ -35773,12 +35862,41 @@ SQLITE_PRIVATE void sqlite3BtreeReleaseTempCursor(BtCursor *pCur); SQLITE_PRIVATE void sqlite3BtreeMoveToParent(BtCursor *pCur); /************** End of btreeInt.h ********************************************/ /************** Continuing where we left off in btmutex.c ********************/ -#if SQLITE_THREADSAFE && !defined(SQLITE_OMIT_SHARED_CACHE) - +#ifndef SQLITE_OMIT_SHARED_CACHE +#if SQLITE_THREADSAFE + +/* +** Obtain the BtShared mutex associated with B-Tree handle p. Also, +** set BtShared.db to the database handle associated with p and the +** p->locked boolean to true. +*/ +static void lockBtreeMutex(Btree *p){ + assert( p->locked==0 ); + assert( sqlite3_mutex_notheld(p->pBt->mutex) ); + assert( sqlite3_mutex_held(p->db->mutex) ); + + sqlite3_mutex_enter(p->pBt->mutex); + p->pBt->db = p->db; + p->locked = 1; +} + +/* +** Release the BtShared mutex associated with B-Tree handle p and +** clear the p->locked boolean. +*/ +static void unlockBtreeMutex(Btree *p){ + assert( p->locked==1 ); + assert( sqlite3_mutex_held(p->pBt->mutex) ); + assert( sqlite3_mutex_held(p->db->mutex) ); + assert( p->db==p->pBt->db ); + + sqlite3_mutex_leave(p->pBt->mutex); + p->locked = 0; +} /* ** Enter a mutex on the given BTree object. ** ** If the object is not sharable, then no mutex is ever required @@ -35812,19 +35930,24 @@ assert( p->sharable || p->wantToLock==0 ); /* We should already hold a lock on the database connection */ assert( sqlite3_mutex_held(p->db->mutex) ); + /* Unless the database is sharable and unlocked, then BtShared.db + ** should already be set correctly. */ + assert( (p->locked==0 && p->sharable) || p->pBt->db==p->db ); + if( !p->sharable ) return; p->wantToLock++; if( p->locked ) return; /* In most cases, we should be able to acquire the lock we ** want without having to go throught the ascending lock ** procedure that follows. Just be sure not to block. */ if( sqlite3_mutex_try(p->pBt->mutex)==SQLITE_OK ){ + p->pBt->db = p->db; p->locked = 1; return; } /* To avoid deadlock, first release all locks with a larger @@ -35835,20 +35958,17 @@ for(pLater=p->pNext; pLater; pLater=pLater->pNext){ assert( pLater->sharable ); assert( pLater->pNext==0 || pLater->pNext->pBt>pLater->pBt ); assert( !pLater->locked || pLater->wantToLock>0 ); if( pLater->locked ){ - sqlite3_mutex_leave(pLater->pBt->mutex); - pLater->locked = 0; - } - } - sqlite3_mutex_enter(p->pBt->mutex); - p->locked = 1; + unlockBtreeMutex(pLater); + } + } + lockBtreeMutex(p); for(pLater=p->pNext; pLater; pLater=pLater->pNext){ if( pLater->wantToLock ){ - sqlite3_mutex_enter(pLater->pBt->mutex); - pLater->locked = 1; + lockBtreeMutex(pLater); } } } /* @@ -35857,29 +35977,29 @@ SQLITE_PRIVATE void sqlite3BtreeLeave(Btree *p){ if( p->sharable ){ assert( p->wantToLock>0 ); p->wantToLock--; if( p->wantToLock==0 ){ - assert( p->locked ); - sqlite3_mutex_leave(p->pBt->mutex); - p->locked = 0; - } - } -} - -#ifndef NDEBUG -/* -** Return true if the BtShared mutex is held on the btree. -** -** This routine makes no determination one way or another if the -** database connection mutex is held. + unlockBtreeMutex(p); + } + } +} + +#ifndef NDEBUG +/* +** Return true if the BtShared mutex is held on the btree, or if the +** B-Tree is not marked as sharable. ** ** This routine is used only from within assert() statements. */ SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree *p){ - return (p->sharable==0 || - (p->locked && p->wantToLock && sqlite3_mutex_held(p->pBt->mutex))); + assert( p->sharable==0 || p->locked==0 || p->wantToLock>0 ); + assert( p->sharable==0 || p->locked==0 || p->db==p->pBt->db ); + assert( p->sharable==0 || p->locked==0 || sqlite3_mutex_held(p->pBt->mutex) ); + assert( p->sharable==0 || p->locked==0 || sqlite3_mutex_held(p->db->mutex) ); + + return (p->sharable==0 || p->locked); } #endif #ifndef SQLITE_OMIT_INCRBLOB @@ -35915,25 +36035,24 @@ int i; Btree *p, *pLater; assert( sqlite3_mutex_held(db->mutex) ); for(i=0; i<db->nDb; i++){ p = db->aDb[i].pBt; + assert( !p || (p->locked==0 && p->sharable) || p->pBt->db==p->db ); if( p && p->sharable ){ p->wantToLock++; if( !p->locked ){ assert( p->wantToLock==1 ); while( p->pPrev ) p = p->pPrev; while( p->locked && p->pNext ) p = p->pNext; for(pLater = p->pNext; pLater; pLater=pLater->pNext){ if( pLater->locked ){ - sqlite3_mutex_leave(pLater->pBt->mutex); - pLater->locked = 0; + unlockBtreeMutex(pLater); } } while( p ){ - sqlite3_mutex_enter(p->pBt->mutex); - p->locked++; + lockBtreeMutex(p); p = p->pNext; } } } } @@ -35946,13 +36065,11 @@ p = db->aDb[i].pBt; if( p && p->sharable ){ assert( p->wantToLock>0 ); p->wantToLock--; if( p->wantToLock==0 ){ - assert( p->locked ); - sqlite3_mutex_leave(p->pBt->mutex); - p->locked = 0; + unlockBtreeMutex(p); } } } } @@ -36037,12 +36154,11 @@ /* We should already hold a lock on the database connection */ assert( sqlite3_mutex_held(p->db->mutex) ); p->wantToLock++; if( !p->locked && p->sharable ){ - sqlite3_mutex_enter(p->pBt->mutex); - p->locked = 1; + lockBtreeMutex(p); } } } /* @@ -36060,18 +36176,30 @@ /* We should already hold a lock on the database connection */ assert( sqlite3_mutex_held(p->db->mutex) ); p->wantToLock--; if( p->wantToLock==0 && p->locked ){ - sqlite3_mutex_leave(p->pBt->mutex); - p->locked = 0; - } - } -} - - -#endif /* SQLITE_THREADSAFE && !SQLITE_OMIT_SHARED_CACHE */ + unlockBtreeMutex(p); + } + } +} + +#else +SQLITE_PRIVATE void sqlite3BtreeEnter(Btree *p){ + p->pBt->db = p->db; +} +SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){ + int i; + for(i=0; i<db->nDb; i++){ + Btree *p = db->aDb[i].pBt; + if( p ){ + p->pBt->db = p->db; + } + } +} +#endif /* if SQLITE_THREADSAFE */ +#endif /* ifndef SQLITE_OMIT_SHARED_CACHE */ /************** End of btmutex.c *********************************************/ /************** Begin file btree.c *******************************************/ /* ** 2004 April 6 @@ -36082,11 +36210,11 @@ ** 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: btree.c,v 1.582 2009/03/30 18:50:05 danielk1977 Exp $ +** $Id: btree.c,v 1.595 2009/04/11 16:06:15 danielk1977 Exp $ ** ** This file implements a external (disk-based) database using BTrees. ** See the header comment on "btreeInt.h" for additional information. ** Including a description of file format and an overview of operation. */ @@ -36175,10 +36303,17 @@ assert( sqlite3BtreeHoldsMutex(p) ); assert( eLock==READ_LOCK || eLock==WRITE_LOCK ); assert( p->db!=0 ); + /* If requesting a write-lock, then the Btree must have an open write + ** transaction on this file. And, obviously, for this to be so there + ** must be an open write transaction on the file itself. + */ + assert( eLock==READ_LOCK || (p==pBt->pWriter && p->inTrans==TRANS_WRITE) ); + assert( eLock==READ_LOCK || pBt->inTransaction==TRANS_WRITE ); + /* This is a no-op if the shared-cache is not enabled */ if( !p->sharable ){ return SQLITE_OK; } @@ -36210,12 +36345,22 @@ 0==(p->db->flags&SQLITE_ReadUncommitted) || eLock==WRITE_LOCK || iTab==MASTER_ROOT ){ for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){ - if( pIter->pBtree!=p && pIter->iTable==iTab && - (pIter->eLock!=eLock || eLock!=READ_LOCK) ){ + /* The condition (pIter->eLock!=eLock) in the following if(...) + ** statement is a simplification of: + ** + ** (eLock==WRITE_LOCK || pIter->eLock==WRITE_LOCK) + ** + ** since we know that if eLock==WRITE_LOCK, then no other connection + ** may hold a WRITE_LOCK on any table in this file (since there can + ** only be a single writer). + */ + assert( pIter->eLock==READ_LOCK || pIter->eLock==WRITE_LOCK ); + assert( eLock==READ_LOCK || pIter->pBtree==p || pIter->eLock==READ_LOCK); + if( pIter->pBtree!=p && pIter->iTable==iTab && pIter->eLock!=eLock ){ sqlite3ConnectionBlocked(p->db, pIter->pBtree->db); if( eLock==WRITE_LOCK ){ assert( p==pBt->pWriter ); pBt->isPending = 1; } @@ -36303,21 +36448,27 @@ #ifndef SQLITE_OMIT_SHARED_CACHE /* ** Release all the table locks (locks obtained via calls to ** the setSharedCacheTableLock() procedure) held by Btree handle p. +** +** This function assumes that handle p has an open read or write +** transaction. If it does not, then the BtShared.isPending variable +** may be incorrectly cleared. */ static void clearAllSharedCacheTableLocks(Btree *p){ BtShared *pBt = p->pBt; BtLock **ppIter = &pBt->pLock; assert( sqlite3BtreeHoldsMutex(p) ); assert( p->sharable || 0==*ppIter ); + assert( p->inTrans>0 ); while( *ppIter ){ BtLock *pLock = *ppIter; assert( pBt->isExclusive==0 || pBt->pWriter==pLock->pBtree ); + assert( pLock->pBtree->inTrans>=pLock->eLock ); if( pLock->pBtree==p ){ *ppIter = pLock->pNext; sqlite3_free(pLock); }else{ ppIter = &pLock->pNext; @@ -36920,76 +37071,78 @@ } return SQLITE_OK; } /* -** Allocate nByte bytes of space on a page. -** -** Return the index into pPage->aData[] of the first byte of -** the new allocation. The caller guarantees that there is enough -** space. This routine will never fail. -** -** If the page contains nBytes of free space but does not contain -** nBytes of contiguous free space, then this routine automatically -** calls defragmentPage() to consolidate all free space before -** allocating the new chunk. +** Allocate nByte bytes of space from within the B-Tree page passed +** as the first argument. Return the index into pPage->aData[] of the +** first byte of allocated space. +** +** The caller guarantees that the space between the end of the cell-offset +** array and the start of the cell-content area is at least nByte bytes +** in size. So this routine can never fail. +** +** If there are already 60 or more bytes of fragments within the page, +** the page is defragmented before returning. If this were not done there +** is a chance that the number of fragmented bytes could eventually +** overflow the single-byte field of the page-header in which this value +** is stored. */ static int allocateSpace(MemPage *pPage, int nByte){ - int addr, pc, hdr; - int size; - int nFrag; + const int hdr = pPage->hdrOffset; /* Local cache of pPage->hdrOffset */ + u8 * const data = pPage->aData; /* Local cache of pPage->aData */ + int nFrag; /* Number of fragmented bytes on pPage */ int top; - int nCell; - int cellOffset; - unsigned char *data; - - data = pPage->aData; + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); assert( pPage->pBt ); assert( sqlite3_mutex_held(pPage->pBt->mutex) ); assert( nByte>=0 ); /* Minimum cell size is 4 */ assert( pPage->nFree>=nByte ); assert( pPage->nOverflow==0 ); - pPage->nFree -= (u16)nByte; - hdr = pPage->hdrOffset; - + + /* Assert that the space between the cell-offset array and the + ** cell-content area is greater than nByte bytes. + */ + assert( nByte <= ( + get2byte(&data[hdr+5])-(hdr+8+(pPage->leaf?0:4)+2*get2byte(&data[hdr+3])) + )); + + pPage->nFree -= (u16)nByte; nFrag = data[hdr+7]; - if( nFrag<60 ){ - /* Search the freelist looking for a slot big enough to satisfy the - ** space request. */ - addr = hdr+1; - while( (pc = get2byte(&data[addr]))>0 ){ - size = get2byte(&data[pc+2]); + if( nFrag>=60 ){ + defragmentPage(pPage); + }else{ + /* Search the freelist looking for a free slot big enough to satisfy + ** the request. The allocation is made from the first free slot in + ** the list that is large enough to accomadate it. + */ + int pc, addr; + for(addr=hdr+1; (pc = get2byte(&data[addr]))>0; addr=pc){ + int size = get2byte(&data[pc+2]); /* Size of free slot */ if( size>=nByte ){ int x = size - nByte; - if( size<nByte+4 ){ + if( x<4 ){ + /* Remove the slot from the free-list. Update the number of + ** fragmented bytes within the page. */ memcpy(&data[addr], &data[pc], 2); data[hdr+7] = (u8)(nFrag + x); - return pc; - }else{ + }else{ + /* The slot remains on the free-list. Reduce its size to account + ** for the portion used by the new allocation. */ put2byte(&data[pc+2], x); - return pc + x; - } - } - addr = pc; + } + return pc + x; + } } } /* Allocate memory from the gap in between the cell pointer array ** and the cell content area. */ - top = get2byte(&data[hdr+5]); - nCell = get2byte(&data[hdr+3]); - cellOffset = pPage->cellOffset; - if( nFrag>=60 || cellOffset + 2*nCell > top - nByte ){ - defragmentPage(pPage); - top = get2byte(&data[hdr+5]); - } - top -= nByte; - assert( cellOffset + 2*nCell <= top ); - put2byte(&data[hdr+5], top); - assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + top = get2byte(&data[hdr+5]) - nByte; + put2byte(&data[hdr+5], top); return top; } /* ** Return a section of the pPage->aData to the freelist. @@ -37373,14 +37526,15 @@ ** page to agree with the restored data. */ static void pageReinit(DbPage *pData){ MemPage *pPage; pPage = (MemPage *)sqlite3PagerGetExtra(pData); + assert( sqlite3PagerPageRefcount(pData)>0 ); if( pPage->isInit ){ assert( sqlite3_mutex_held(pPage->pBt->mutex) ); pPage->isInit = 0; - if( sqlite3PagerPageRefcount(pData)>0 ){ + if( sqlite3PagerPageRefcount(pData)>1 ){ /* pPage might not be a btree page; it might be an overflow page ** or ptrmap page or a free page. In those cases, the following ** call to sqlite3BtreeInitPage() will likely return SQLITE_CORRUPT. ** But no harm is done by this. And it is very important that ** sqlite3BtreeInitPage() be called on every btree page so we make @@ -37451,14 +37605,11 @@ #if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) /* ** If this Btree is a candidate for shared cache, try to find an ** existing BtShared object that we can share with */ - if( isMemdb==0 - && (db->flags & SQLITE_Vtab)==0 - && zFilename && zFilename[0] - ){ + if( isMemdb==0 && zFilename && zFilename[0] ){ if( sqlite3GlobalConfig.sharedCacheEnabled ){ int nFullPathname = pVfs->mxPathname+1; char *zFullPathname = sqlite3Malloc(nFullPathname); sqlite3_mutex *mutexShared; p->sharable = 1; @@ -37519,10 +37670,11 @@ rc = sqlite3PagerReadFileheader(pBt->pPager,sizeof(zDbHeader),zDbHeader); } if( rc!=SQLITE_OK ){ goto btree_open_out; } + pBt->db = db; sqlite3PagerSetBusyhandler(pBt->pPager, btreeInvokeBusyHandler, pBt); p->pBt = pBt; sqlite3PagerSetReiniter(pBt->pPager, pageReinit); pBt->pCursor = 0; @@ -37696,11 +37848,10 @@ BtCursor *pCur; /* Close all cursors opened via this handle. */ assert( sqlite3_mutex_held(p->db->mutex) ); sqlite3BtreeEnter(p); - pBt->db = p->db; pCur = pBt->pCursor; while( pCur ){ BtCursor *pTmp = pCur; pCur = pCur->pNext; if( pTmp->pBtree==p ){ @@ -37806,10 +37957,12 @@ } #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) || !defined(SQLITE_OMIT_VACUUM) /* ** Change the default pages size and the number of reserved bytes per page. +** Or, if the page size has already been fixed, return SQLITE_READONLY +** without changing anything. ** ** The page size must be a power of 2 between 512 and 65536. If the page ** size supplied does not meet this constraint then the page size is not ** changed. ** @@ -37818,12 +37971,15 @@ ** the first byte past the 1GB boundary, 0x40000000) needs to occur ** at the beginning of a page. ** ** If parameter nReserve is less than zero, then the number of reserved ** bytes per page is left unchanged. -*/ -SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve){ +** +** If the iFix!=0 then the pageSizeFixed flag is set so that the page size +** and autovacuum mode can no longer be changed. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, int iFix){ int rc = SQLITE_OK; BtShared *pBt = p->pBt; assert( nReserve>=-1 && nReserve<=255 ); sqlite3BtreeEnter(p); if( pBt->pageSizeFixed ){ @@ -37841,10 +37997,11 @@ pBt->pageSize = (u16)pageSize; freeTempSpace(pBt); rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize); } pBt->usableSize = pBt->pageSize - (u16)nReserve; + if( iFix ) pBt->pageSizeFixed = 1; sqlite3BtreeLeave(p); return rc; } /* @@ -37941,11 +38098,11 @@ int rc; MemPage *pPage1; int nPage; assert( sqlite3_mutex_held(pBt->mutex) ); - if( pBt->pPage1 ) return SQLITE_OK; + assert( pBt->pPage1==0 ); rc = sqlite3BtreeGetPage(pBt, 1, &pPage1, 0); if( rc!=SQLITE_OK ) return rc; /* Do some checking to help insure the file we opened really is ** a valid database file. @@ -38169,11 +38326,10 @@ sqlite3 *pBlock = 0; BtShared *pBt = p->pBt; int rc = SQLITE_OK; sqlite3BtreeEnter(p); - pBt->db = p->db; btreeIntegrity(p); /* If the btree is already in a write-transaction, or it ** is already in a read-transaction and a read-transaction ** is requested, this is a no-op. @@ -38210,15 +38366,18 @@ goto trans_begun; } #endif do { - if( pBt->pPage1==0 ){ - do{ - rc = lockBtree(pBt); - }while( pBt->pPage1==0 && rc==SQLITE_OK ); - } + /* Call lockBtree() until either pBt->pPage1 is populated or + ** lockBtree() returns something other than SQLITE_OK. lockBtree() + ** may return SQLITE_OK but leave pBt->pPage1 set to 0 if after + ** reading page 1 it discovers that the page-size of the database + ** file is not pBt->pageSize. In this case lockBtree() will update + ** pBt->pageSize to the page-size of the file on disk. + */ + while( pBt->pPage1==0 && SQLITE_OK==(rc = lockBtree(pBt)) ); if( rc==SQLITE_OK && wrflag ){ if( pBt->readOnly ){ rc = SQLITE_READONLY; }else{ @@ -38313,11 +38472,11 @@ pPage->isInit = isInitOrig; return rc; } /* -** Somewhere on pPage, which is guarenteed to be a btree page, not an overflow +** Somewhere on pPage, which is guaranteed to be a btree page, not an overflow ** page, is a pointer to page iFrom. Modify this pointer so that it points to ** iTo. Parameter eType describes the type of pointer to be modified, as ** follows: ** ** PTRMAP_BTREE: pPage is a btree-page. The pointer points at a child @@ -38476,18 +38635,19 @@ */ static int incrVacuumStep(BtShared *pBt, Pgno nFin, Pgno iLastPg){ Pgno nFreeList; /* Number of pages still on the free-list */ assert( sqlite3_mutex_held(pBt->mutex) ); + assert( iLastPg>nFin ); if( !PTRMAP_ISPAGE(pBt, iLastPg) && iLastPg!=PENDING_BYTE_PAGE(pBt) ){ int rc; u8 eType; Pgno iPtrPage; nFreeList = get4byte(&pBt->pPage1->aData[36]); - if( nFreeList==0 || nFin==iLastPg ){ + if( nFreeList==0 ){ return SQLITE_DONE; } rc = ptrmapGet(pBt, iLastPg, &eType, &iPtrPage); if( rc!=SQLITE_OK ){ @@ -38584,11 +38744,10 @@ SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *p){ int rc; BtShared *pBt = p->pBt; sqlite3BtreeEnter(p); - pBt->db = p->db; assert( pBt->inTransaction==TRANS_WRITE && p->inTrans==TRANS_WRITE ); if( !pBt->autoVacuum ){ rc = SQLITE_DONE; }else{ invalidateAllOverflowCache(pBt); @@ -38621,20 +38780,22 @@ Pgno nPtrmap; Pgno iFree; const int pgsz = pBt->pageSize; Pgno nOrig = pagerPagecount(pBt); - if( PTRMAP_ISPAGE(pBt, nOrig) ){ + if( PTRMAP_ISPAGE(pBt, nOrig) || nOrig==PENDING_BYTE_PAGE(pBt) ){ + /* It is not possible to create a database for which the final page + ** is either a pointer-map page or the pending-byte page. If one + ** is encountered, this indicates corruption. + */ return SQLITE_CORRUPT_BKPT; } - if( nOrig==PENDING_BYTE_PAGE(pBt) ){ - nOrig--; - } + nFree = get4byte(&pBt->pPage1->aData[36]); nPtrmap = (nFree-nOrig+PTRMAP_PAGENO(pBt, nOrig)+pgsz/5)/(pgsz/5); nFin = nOrig - nFree - nPtrmap; - if( nOrig>PENDING_BYTE_PAGE(pBt) && nFin<=PENDING_BYTE_PAGE(pBt) ){ + if( nOrig>PENDING_BYTE_PAGE(pBt) && nFin<PENDING_BYTE_PAGE(pBt) ){ nFin--; } while( PTRMAP_ISPAGE(pBt, nFin) || nFin==PENDING_BYTE_PAGE(pBt) ){ nFin--; } @@ -38689,11 +38850,10 @@ SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){ int rc = SQLITE_OK; if( p->inTrans==TRANS_WRITE ){ BtShared *pBt = p->pBt; sqlite3BtreeEnter(p); - pBt->db = p->db; #ifndef SQLITE_OMIT_AUTOVACUUM if( pBt->autoVacuum ){ rc = autoVacuumCommit(pBt); if( rc!=SQLITE_OK ){ sqlite3BtreeLeave(p); @@ -38723,11 +38883,10 @@ */ SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree *p){ BtShared *pBt = p->pBt; sqlite3BtreeEnter(p); - pBt->db = p->db; btreeIntegrity(p); /* If the handle has a write-transaction open, commit the shared-btrees ** transaction and set the shared state to TRANS_READ. */ @@ -38740,18 +38899,18 @@ sqlite3BtreeLeave(p); return rc; } pBt->inTransaction = TRANS_READ; } - clearAllSharedCacheTableLocks(p); /* If the handle has any kind of transaction open, decrement the transaction ** count of the shared btree. If the transaction count reaches 0, set ** the shared state to TRANS_NONE. The unlockBtreeIfUnused() call below ** will unlock the pager. */ if( p->inTrans!=TRANS_NONE ){ + clearAllSharedCacheTableLocks(p); pBt->nTransaction--; if( 0==pBt->nTransaction ){ pBt->inTransaction = TRANS_NONE; } } @@ -38849,11 +39008,10 @@ int rc; BtShared *pBt = p->pBt; MemPage *pPage1; sqlite3BtreeEnter(p); - pBt->db = p->db; rc = saveAllCursors(pBt, 0, 0); #ifndef SQLITE_OMIT_SHARED_CACHE if( rc!=SQLITE_OK ){ /* This is a horrible situation. An IO or malloc() error occurred whilst ** trying to save cursor positions. If this is an automatic rollback (as @@ -38864,11 +39022,10 @@ */ sqlite3BtreeTripAllCursors(p, rc); } #endif btreeIntegrity(p); - clearAllSharedCacheTableLocks(p); if( p->inTrans==TRANS_WRITE ){ int rc2; assert( TRANS_WRITE==pBt->inTransaction ); @@ -38886,10 +39043,11 @@ assert( countWriteCursors(pBt)==0 ); pBt->inTransaction = TRANS_READ; } if( p->inTrans!=TRANS_NONE ){ + clearAllSharedCacheTableLocks(p); assert( pBt->nTransaction>0 ); pBt->nTransaction--; if( 0==pBt->nTransaction ){ pBt->inTransaction = TRANS_NONE; } @@ -38924,11 +39082,10 @@ */ SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree *p, int iStatement){ int rc; BtShared *pBt = p->pBt; sqlite3BtreeEnter(p); - pBt->db = p->db; assert( p->inTrans==TRANS_WRITE ); assert( pBt->readOnly==0 ); assert( iStatement>0 ); assert( iStatement>p->db->nSavepoint ); if( NEVER(p->inTrans!=TRANS_WRITE || pBt->readOnly) ){ @@ -38963,11 +39120,10 @@ if( p && p->inTrans==TRANS_WRITE ){ BtShared *pBt = p->pBt; assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK ); assert( iSavepoint>=0 || (iSavepoint==-1 && op==SAVEPOINT_ROLLBACK) ); sqlite3BtreeEnter(p); - pBt->db = p->db; rc = sqlite3PagerSavepoint(pBt->pPager, op, iSavepoint); if( rc==SQLITE_OK ){ rc = newDatabase(pBt); } sqlite3BtreeLeave(p); @@ -39080,11 +39236,10 @@ struct KeyInfo *pKeyInfo, /* First arg to xCompare() */ BtCursor *pCur /* Write new cursor here */ ){ int rc; sqlite3BtreeEnter(p); - p->pBt->db = p->db; rc = btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur); sqlite3BtreeLeave(p); return rc; } @@ -39138,11 +39293,10 @@ Btree *pBtree = pCur->pBtree; if( pBtree ){ int i; BtShared *pBt = pCur->pBt; sqlite3BtreeEnter(pBtree); - pBt->db = pBtree->db; sqlite3BtreeClearCursor(pCur); if( pCur->pPrev ){ pCur->pPrev->pNext = pCur->pNext; }else{ pBt->pCursor = pCur->pNext; @@ -40116,11 +40270,12 @@ int bias, /* Bias search to the high end */ int *pRes /* Write search results here */ ){ int rc; /* Status code */ UnpackedRecord *pIdxKey; /* Unpacked index key */ - UnpackedRecord aSpace[16]; /* Temp space for pIdxKey - to avoid a malloc */ + char aSpace[150]; /* Temp space for pIdxKey - to avoid a malloc */ + if( pKey ){ assert( nKey==(i64)(int)nKey ); pIdxKey = sqlite3VdbeRecordUnpack(pCur->pKeyInfo, (int)nKey, pKey, aSpace, sizeof(aSpace)); @@ -40717,11 +40872,14 @@ nOvfl = (info.nPayload - info.nLocal + ovflPageSize - 1)/ovflPageSize; assert( ovflPgno==0 || nOvfl>0 ); while( nOvfl-- ){ Pgno iNext = 0; MemPage *pOvfl = 0; - if( ovflPgno==0 || ovflPgno>pagerPagecount(pBt) ){ + if( ovflPgno<2 || ovflPgno>pagerPagecount(pBt) ){ + /* 0 is not a legal page number and page 1 cannot be an + ** overflow page. Therefore if ovflPgno<2 or past the end of the + ** file the database must be corrupt. */ return SQLITE_CORRUPT_BKPT; } if( nOvfl ){ rc = getOverflowPage(pBt, ovflPgno, &pOvfl, &iNext); if( rc ) return rc; @@ -41396,17 +41554,17 @@ rc = SQLITE_NOMEM; goto balance_cleanup; } szCell = (u16*)&apCell[nMaxCells]; aCopy[0] = (u8*)&szCell[nMaxCells]; - assert( ((aCopy[0] - (u8*)0) & 7)==0 ); /* 8-byte alignment required */ + assert( EIGHT_BYTE_ALIGNMENT(aCopy[0]) ); for(i=1; i<NB; i++){ aCopy[i] = &aCopy[i-1][pBt->pageSize+ROUND8(sizeof(MemPage))]; assert( ((aCopy[i] - (u8*)0) & 7)==0 ); /* 8-byte alignment required */ } aSpace1 = &aCopy[NB-1][pBt->pageSize+ROUND8(sizeof(MemPage))]; - assert( ((aSpace1 - (u8*)0) & 7)==0 ); /* 8-byte alignment required */ + assert( EIGHT_BYTE_ALIGNMENT(aSpace1) ); if( ISAUTOVACUUM ){ aFrom = &aSpace1[pBt->pageSize]; } aSpace2 = sqlite3PageMalloc(pBt->pageSize); if( aSpace2==0 ){ @@ -42388,12 +42546,12 @@ rc = saveCursorPosition(&leafCur); if( rc==SQLITE_OK ){ rc = sqlite3BtreeNext(&leafCur, ¬Used); } pLeafPage = leafCur.apPage[leafCur.iPage]; - assert( pLeafPage->pgno==leafPgno ); - assert( leafCur.aiIdx[leafCur.iPage]==0 ); + assert( rc!=SQLITE_OK || pLeafPage->pgno==leafPgno ); + assert( rc!=SQLITE_OK || leafCur.aiIdx[leafCur.iPage]==0 ); } if( SQLITE_OK==rc && SQLITE_OK==(rc = sqlite3PagerWrite(pLeafPage->pDbPage)) ){ @@ -42553,11 +42711,10 @@ return SQLITE_OK; } SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree *p, int *piTable, int flags){ int rc; sqlite3BtreeEnter(p); - p->pBt->db = p->db; rc = btreeCreateTable(p, piTable, flags); sqlite3BtreeLeave(p); return rc; } @@ -42625,11 +42782,10 @@ */ SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree *p, int iTable, int *pnChange){ int rc; BtShared *pBt = p->pBt; sqlite3BtreeEnter(p); - pBt->db = p->db; assert( p->inTrans==TRANS_WRITE ); if( (rc = checkForReadConflicts(p, iTable, 0, 1))!=SQLITE_OK ){ /* nothing to do */ }else if( SQLITE_OK!=(rc = saveAllCursors(pBt, iTable, 0)) ){ /* nothing to do */ @@ -42767,11 +42923,10 @@ return rc; } SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree *p, int iTable, int *piMoved){ int rc; sqlite3BtreeEnter(p); - p->pBt->db = p->db; rc = btreeDropTable(p, iTable, piMoved); sqlite3BtreeLeave(p); return rc; } @@ -42791,11 +42946,10 @@ int rc; unsigned char *pP1; BtShared *pBt = p->pBt; sqlite3BtreeEnter(p); - pBt->db = p->db; /* Reading a meta-data value requires a read-lock on page 1 (and hence ** the sqlite_master table. We grab this lock regardless of whether or ** not the SQLITE_ReadUncommitted flag is set (the table rooted at page ** 1 is treated as a special case by querySharedCacheTableLock() @@ -42840,12 +42994,18 @@ */ #ifdef SQLITE_OMIT_AUTOVACUUM if( idx==4 && *pMeta>0 ) pBt->readOnly = 1; #endif - /* Grab the read-lock on page 1. */ - rc = setSharedCacheTableLock(p, 1, READ_LOCK); + /* If there is currently an open transaction, grab a read-lock + ** on page 1 of the database file. This is done to make sure that + ** no other connection can modify the meta value just read from + ** the database until the transaction is concluded. + */ + if( p->inTrans>0 ){ + rc = setSharedCacheTableLock(p, 1, READ_LOCK); + } sqlite3BtreeLeave(p); return rc; } /* @@ -42856,11 +43016,10 @@ BtShared *pBt = p->pBt; unsigned char *pP1; int rc; assert( idx>=1 && idx<=15 ); sqlite3BtreeEnter(p); - pBt->db = p->db; assert( p->inTrans==TRANS_WRITE ); assert( pBt->pPage1!=0 ); pP1 = pBt->pPage1->aData; rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); if( rc==SQLITE_OK ){ @@ -43330,11 +43489,10 @@ IntegrityCk sCheck; BtShared *pBt = p->pBt; char zErr[100]; sqlite3BtreeEnter(p); - pBt->db = p->db; nRef = sqlite3PagerRefcount(pBt->pPager); if( lockBtreeWithRetry(p)!=SQLITE_OK ){ *pnErr = 1; sqlite3BtreeLeave(p); return sqlite3DbStrDup(0, "cannot acquire a read lock on the database"); @@ -44240,11 +44398,11 @@ ** This file contains code use to manipulate "Mem" structure. A "Mem" ** stores a single value in the VDBE. Mem is an opaque structure visible ** only within the VDBE. Interface routines refer to a Mem using the ** name sqlite_value ** -** $Id: vdbemem.c,v 1.139 2009/03/29 15:12:10 drh Exp $ +** $Id: vdbemem.c,v 1.140 2009/04/05 12:22:09 drh Exp $ */ /* ** Call sqlite3VdbeMemExpandBlob() on the supplied value (type Mem*) ** P if required. @@ -44432,10 +44590,11 @@ assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); assert( !(fg&MEM_Zero) ); assert( !(fg&(MEM_Str|MEM_Blob)) ); assert( fg&(MEM_Int|MEM_Real) ); assert( (pMem->flags&MEM_RowSet)==0 ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); if( sqlite3VdbeMemGrow(pMem, nByte, 0) ){ return SQLITE_NOMEM; } @@ -44568,10 +44727,11 @@ ** If pMem represents a string value, its encoding might be changed. */ SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem *pMem){ int flags; assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); flags = pMem->flags; if( flags & MEM_Int ){ return pMem->u.i; }else if( flags & MEM_Real ){ return doubleToInt64(pMem->r); @@ -44596,10 +44756,11 @@ ** value. If it is a string or blob, try to convert it to a double. ** If it is a NULL, return 0.0. */ SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem *pMem){ assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); if( pMem->flags & MEM_Real ){ return pMem->r; }else if( pMem->flags & MEM_Int ){ return (double)pMem->u.i; }else if( pMem->flags & (MEM_Str|MEM_Blob) ){ @@ -44626,10 +44787,11 @@ */ SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem *pMem){ assert( pMem->flags & MEM_Real ); assert( (pMem->flags & MEM_RowSet)==0 ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); pMem->u.i = doubleToInt64(pMem->r); if( pMem->r==(double)pMem->u.i ){ pMem->flags |= MEM_Int; } @@ -44639,10 +44801,12 @@ ** Convert pMem to type integer. Invalidate any prior representations. */ SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem *pMem){ assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); assert( (pMem->flags & MEM_RowSet)==0 ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + pMem->u.i = sqlite3VdbeIntValue(pMem); MemSetTypeFlag(pMem, MEM_Int); return SQLITE_OK; } @@ -44650,10 +44814,12 @@ ** Convert pMem so that it is of type MEM_Real. ** Invalidate any prior representations. */ SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem *pMem){ assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + pMem->r = sqlite3VdbeRealValue(pMem); MemSetTypeFlag(pMem, MEM_Real); return SQLITE_OK; } @@ -45287,11 +45453,11 @@ ** This file contains code used for creating, destroying, and populating ** a VDBE (or an "sqlite3_stmt" as it is known to the outside world.) Prior ** to version 2.8.7, all this code was combined into the vdbe.c source file. ** But that file was getting too big so this subroutines were split out. ** -** $Id: vdbeaux.c,v 1.446 2009/03/25 15:43:09 danielk1977 Exp $ +** $Id: vdbeaux.c,v 1.451 2009/04/10 15:42:36 shane Exp $ */ /* @@ -46294,10 +46460,11 @@ int nByte, /* Number of bytes to allocate */ u8 **ppFrom, /* IN/OUT: Allocate from *ppFrom */ u8 *pEnd, /* Pointer to 1 byte past the end of *ppFrom buffer */ int *pnByte /* If allocation cannot be made, increment *pnByte */ ){ + assert( EIGHT_BYTE_ALIGNMENT(*ppFrom) ); if( (*(void**)pp)==0 ){ nByte = ROUND8(nByte); if( (pEnd - *ppFrom)>=nByte ){ *(void**)pp = (void *)*ppFrom; *ppFrom += nByte; @@ -46367,10 +46534,13 @@ int nArg; /* Maximum number of args passed to a user function. */ resolveP2Values(p, &nArg); if( isExplain && nMem<10 ){ nMem = 10; } + zCsr += (zCsr - (u8*)0)&7; + assert( EIGHT_BYTE_ALIGNMENT(zCsr) ); + if( zEnd<zCsr ) zEnd = zCsr; do { memset(zCsr, 0, zEnd-zCsr); nByte = 0; allocSpace((char*)&p->aMem, nMem*sizeof(Mem), &zCsr, zEnd, &nByte); @@ -46878,10 +47048,37 @@ } return rc; } /* +** If SQLite is compiled to support shared-cache mode and to be threadsafe, +** this routine obtains the mutex associated with each BtShared structure +** that may be accessed by the VM passed as an argument. In doing so it +** sets the BtShared.db member of each of the BtShared structures, ensuring +** that the correct busy-handler callback is invoked if required. +** +** If SQLite is not threadsafe but does support shared-cache mode, then +** sqlite3BtreeEnterAll() is invoked to set the BtShared.db variables +** of all of BtShared structures accessible via the database handle +** associated with the VM. Of course only a subset of these structures +** will be accessed by the VM, and we could use Vdbe.btreeMask to figure +** that subset out, but there is no advantage to doing so. +** +** If SQLite is not threadsafe and does not support shared-cache mode, this +** function is a no-op. +*/ +#ifndef SQLITE_OMIT_SHARED_CACHE +SQLITE_PRIVATE void sqlite3VdbeMutexArrayEnter(Vdbe *p){ +#if SQLITE_THREADSAFE + sqlite3BtreeMutexArrayEnter(&p->aMutex); +#else + sqlite3BtreeEnterAll(p->db); +#endif +} +#endif + +/* ** This routine is called the when a VDBE tries to halt. If the VDBE ** has made changes and is in autocommit mode, then commit those ** changes. If a rollback is needed, then do the rollback. ** ** This routine is the only way to move the state of a VM from @@ -46926,11 +47123,11 @@ int mrc; /* Primary error code from p->rc */ int eStatementOp = 0; int isSpecialError; /* Set to true if a 'special' error */ /* Lock all btrees used by the statement */ - sqlite3BtreeMutexArrayEnter(&p->aMutex); + sqlite3VdbeMutexArrayEnter(p); /* Check for one of the special errors */ mrc = p->rc & 0xff; isSpecialError = mrc==SQLITE_NOMEM || mrc==SQLITE_IOERR || mrc==SQLITE_INTERRUPT || mrc==SQLITE_FULL; @@ -47587,34 +47784,44 @@ */ SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeRecordUnpack( KeyInfo *pKeyInfo, /* Information about the record format */ int nKey, /* Size of the binary record */ const void *pKey, /* The binary record */ - UnpackedRecord *pSpace,/* Space available to hold resulting object */ + char *pSpace, /* Unaligned space available to hold the object */ int szSpace /* Size of pSpace[] in bytes */ ){ const unsigned char *aKey = (const unsigned char *)pKey; - UnpackedRecord *p; - int nByte, d; + UnpackedRecord *p; /* The unpacked record that we will return */ + int nByte; /* Memory space needed to hold p, in bytes */ + int d; u32 idx; - u16 u; /* Unsigned loop counter */ + u16 u; /* Unsigned loop counter */ u32 szHdr; Mem *pMem; - - assert( sizeof(Mem)>sizeof(*p) ); - nByte = sizeof(Mem)*(pKeyInfo->nField+2); + int nOff; /* Increase pSpace by this much to 8-byte align it */ + + /* + ** We want to shift the pointer pSpace up such that it is 8-byte aligned. + ** Thus, we need to calculate a value, nOff, between 0 and 7, to shift + ** it by. If pSpace is already 8-byte aligned, nOff should be zero. + */ + nOff = (8 - (SQLITE_PTR_TO_INT(pSpace) & 7)) & 7; + pSpace += nOff; + szSpace -= nOff; + nByte = ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nField+1); if( nByte>szSpace ){ p = sqlite3DbMallocRaw(pKeyInfo->db, nByte); if( p==0 ) return 0; p->flags = UNPACKED_NEED_FREE | UNPACKED_NEED_DESTROY; }else{ - p = pSpace; + p = (UnpackedRecord*)pSpace; p->flags = UNPACKED_NEED_DESTROY; } p->pKeyInfo = pKeyInfo; p->nField = pKeyInfo->nField + 1; - p->aMem = pMem = &((Mem*)p)[1]; + p->aMem = pMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))]; + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); idx = getVarint32(aKey, szHdr); d = szHdr; u = 0; while( idx<szHdr && u<p->nField ){ u32 serial_type; @@ -47926,11 +48133,11 @@ ************************************************************************* ** ** This file contains code use to implement APIs that are part of the ** VDBE. ** -** $Id: vdbeapi.c,v 1.156 2009/03/25 15:43:09 danielk1977 Exp $ +** $Id: vdbeapi.c,v 1.161 2009/04/10 23:11:31 drh Exp $ */ #if 0 && defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) /* ** The following structure contains pointers to the end points of a @@ -48354,11 +48561,11 @@ if( db->mallocFailed ){ return SQLITE_NOMEM; } if( p->pc<=0 && p->expired ){ - if( p->rc==SQLITE_OK ){ + if( ALWAYS(p->rc==SQLITE_OK) ){ p->rc = SQLITE_SCHEMA; } rc = SQLITE_ERROR; goto end_of_step; } @@ -48470,11 +48677,11 @@ && cnt++ < 5 && (rc = vdbeReprepare(v))==SQLITE_OK ){ sqlite3_reset(pStmt); v->expired = 0; } - if( rc==SQLITE_SCHEMA && v->isPrepareV2 && db->pErr ){ + if( rc==SQLITE_SCHEMA && ALWAYS(v->isPrepareV2) && ALWAYS(db->pErr) ){ /* 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 ** from the database handle into the statement and sets the statement ** program counter to 0 to ensure that when the statement is @@ -48529,11 +48736,11 @@ sqlite3_value **NotUsed2 /* Value of each argument */ ){ const char *zName = context->pFunc->zName; char *zErr; UNUSED_PARAMETER2(NotUsed, NotUsed2); - zErr = sqlite3MPrintf(0, + zErr = sqlite3_mprintf( "unable to use function %s in the requested context", zName); sqlite3_result_error(context, zErr, -1); sqlite3_free(zErr); } @@ -48675,11 +48882,11 @@ vals = sqlite3_data_count(pStmt); pOut = &pVm->pResultSet[i]; }else{ /* ((double)0) In case of SQLITE_OMIT_FLOATING_POINT... */ static const Mem nullMem = {{0}, (double)0, 0, "", 0, MEM_Null, SQLITE_NULL, 0, 0, 0 }; - if( pVm && pVm->db ){ + if( pVm && ALWAYS(pVm->db) ){ sqlite3_mutex_enter(pVm->db->mutex); sqlite3Error(pVm->db, SQLITE_RANGE, 0); } pOut = (Mem*)&nullMem; } @@ -48815,28 +49022,27 @@ int useType ){ const void *ret = 0; Vdbe *p = (Vdbe *)pStmt; int n; - - - if( p!=0 ){ - n = sqlite3_column_count(pStmt); - if( N<n && N>=0 ){ - N += useType*n; - sqlite3_mutex_enter(p->db->mutex); - ret = xFunc(&p->aColName[N]); - - /* A malloc may have failed inside of the xFunc() call. If this - ** is the case, clear the mallocFailed flag and return NULL. - */ - if( p->db && p->db->mallocFailed ){ - p->db->mallocFailed = 0; - ret = 0; - } - sqlite3_mutex_leave(p->db->mutex); - } + sqlite3 *db = p->db; + + assert( db!=0 ); + n = sqlite3_column_count(pStmt); + if( N<n && N>=0 ){ + N += useType*n; + sqlite3_mutex_enter(db->mutex); + assert( db->mallocFailed==0 ); + ret = xFunc(&p->aColName[N]); + /* A malloc may have failed inside of the xFunc() call. If this + ** is the case, clear the mallocFailed flag and return NULL. + */ + if( db->mallocFailed ){ + db->mallocFailed = 0; + ret = 0; + } + sqlite3_mutex_leave(db->mutex); } return ret; } /* @@ -49072,12 +49278,12 @@ rc = sqlite3VdbeMemCopy(&p->aVar[i-1], pValue); if( rc==SQLITE_OK ){ rc = sqlite3VdbeChangeEncoding(&p->aVar[i-1], ENC(p->db)); } sqlite3_mutex_leave(p->db->mutex); - } - rc = sqlite3ApiExit(p->db, rc); + rc = sqlite3ApiExit(p->db, rc); + } return rc; } SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){ int rc; Vdbe *p = (Vdbe *)pStmt; @@ -49103,22 +49309,25 @@ ** in the Vdbe.azVar[] array, if such a mapping does not already ** exist. */ static void createVarMap(Vdbe *p){ if( !p->okVar ){ + int j; + Op *pOp; sqlite3_mutex_enter(p->db->mutex); - if( !p->okVar ){ - int j; - Op *pOp; - for(j=0, pOp=p->aOp; j<p->nOp; j++, pOp++){ - if( pOp->opcode==OP_Variable ){ - assert( pOp->p1>0 && pOp->p1<=p->nVar ); - p->azVar[pOp->p1-1] = pOp->p4.z; - } - } - p->okVar = 1; - } + /* The race condition here is harmless. If two threads call this + ** routine on the same Vdbe at the same time, they both might end + ** up initializing the Vdbe.azVar[] array. That is a little extra + ** work but it results in the same answer. + */ + for(j=0, pOp=p->aOp; j<p->nOp; j++, pOp++){ + if( pOp->opcode==OP_Variable ){ + assert( pOp->p1>0 && pOp->p1<=p->nVar ); + p->azVar[pOp->p1-1] = pOp->p4.z; + } + } + p->okVar = 1; sqlite3_mutex_leave(p->db->mutex); } } /* @@ -49159,40 +49368,44 @@ return 0; } /* ** Transfer all bindings from the first statement over to the second. -** If the two statements contain a different number of bindings, then -** an SQLITE_ERROR is returned. */ SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){ Vdbe *pFrom = (Vdbe*)pFromStmt; Vdbe *pTo = (Vdbe*)pToStmt; - int i, rc = SQLITE_OK; - if( (pFrom->magic!=VDBE_MAGIC_RUN && pFrom->magic!=VDBE_MAGIC_HALT) - || (pTo->magic!=VDBE_MAGIC_RUN && pTo->magic!=VDBE_MAGIC_HALT) - || pTo->db!=pFrom->db ){ - return SQLITE_MISUSE; - } - if( pFrom->nVar!=pTo->nVar ){ - return SQLITE_ERROR; - } + int i; + assert( pTo->db==pFrom->db ); + assert( pTo->nVar==pFrom->nVar ); sqlite3_mutex_enter(pTo->db->mutex); - for(i=0; rc==SQLITE_OK && i<pFrom->nVar; i++){ + for(i=0; i<pFrom->nVar; i++){ sqlite3VdbeMemMove(&pTo->aVar[i], &pFrom->aVar[i]); } sqlite3_mutex_leave(pTo->db->mutex); - assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); - return rc; + return SQLITE_OK; } #ifndef SQLITE_OMIT_DEPRECATED /* ** Deprecated external interface. Internal/core SQLite code ** should call sqlite3TransferBindings. +** +** Is is misuse to call this routine with statements from different +** database connections. But as this is a deprecated interface, we +** will not bother to check for that condition. +** +** If the two statements contain a different number of bindings, then +** an SQLITE_ERROR is returned. Nothing else can go wrong, so otherwise +** SQLITE_OK is returned. */ SQLITE_API int sqlite3_transfer_bindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){ + Vdbe *pFrom = (Vdbe*)pFromStmt; + Vdbe *pTo = (Vdbe*)pToStmt; + if( pFrom->nVar!=pTo->nVar ){ + return SQLITE_ERROR; + } return sqlite3TransferBindings(pFromStmt, pToStmt); } #endif /* @@ -49278,11 +49491,11 @@ ** documentation, headers files, or other derived files. The formatting ** of the code in this file is, therefore, important. See other comments ** in this file for details. If in doubt, do not deviate from existing ** commenting and indentation practices when changing or adding code. ** -** $Id: vdbe.c,v 1.828 2009/03/23 17:11:27 danielk1977 Exp $ +** $Id: vdbe.c,v 1.832 2009/04/10 12:55:17 danielk1977 Exp $ */ /* ** The following global variable is incremented every time a cursor ** moves, either by the OP_SeekXX, OP_Next, or OP_Prev opcodes. The test @@ -49886,15 +50099,17 @@ int origPc; /* Program counter at start of opcode */ #endif #ifndef SQLITE_OMIT_PROGRESS_CALLBACK int nProgressOps = 0; /* Opcodes executed since progress callback. */ #endif - UnpackedRecord aTempRec[16]; /* Space to hold a transient UnpackedRecord */ + + /* Temporary space into which to unpack a record. */ + char aTempRec[ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*3 + 7]; assert( p->magic==VDBE_MAGIC_RUN ); /* sqlite3_step() verifies this */ assert( db->magic==SQLITE_MAGIC_BUSY ); - sqlite3BtreeMutexArrayEnter(&p->aMutex); + sqlite3VdbeMutexArrayEnter(p); if( p->rc==SQLITE_NOMEM ){ /* This happens if a malloc() inside a call to sqlite3_column_text() or ** sqlite3_column_text16() failed. */ goto no_mem; } @@ -51689,11 +51904,15 @@ */ #ifndef SQLITE_OMIT_BTREECOUNT case OP_Count: { /* out2-prerelease */ i64 nEntry; BtCursor *pCrsr = p->apCsr[pOp->p1]->pCursor; - rc = sqlite3BtreeCount(pCrsr, &nEntry); + if( pCrsr ){ + rc = sqlite3BtreeCount(pCrsr, &nEntry); + }else{ + nEntry = 0; + } pOut->flags = MEM_Int; pOut->u.i = nEntry; break; } #endif @@ -53473,15 +53692,17 @@ case OP_IdxRowid: { /* out2-prerelease */ int i = pOp->p1; BtCursor *pCrsr; VdbeCursor *pC; + assert( i>=0 && i<p->nCursor ); assert( p->apCsr[i]!=0 ); if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){ i64 rowid; - + rc = sqlite3VdbeCursorMoveto(pC); + if( rc ) goto abort_due_to_error; assert( pC->deferredMoveto==0 ); assert( pC->isTable==0 ); if( !pC->nullRow ){ rc = sqlite3VdbeIdxRowid(pCrsr, &rowid); if( rc!=SQLITE_OK ){ @@ -55348,22 +55569,27 @@ ** ** This file contains code use to implement an in-memory rollback journal. ** The in-memory rollback journal is used to journal transactions for ** ":memory:" databases and when the journal_mode=MEMORY pragma is used. ** -** @(#) $Id: memjournal.c,v 1.8 2008/12/20 02:14:40 drh Exp $ +** @(#) $Id: memjournal.c,v 1.11 2009/04/05 12:22:09 drh Exp $ */ /* Forward references to internal structures */ typedef struct MemJournal MemJournal; typedef struct FilePoint FilePoint; typedef struct FileChunk FileChunk; /* Space to hold the rollback journal is allocated in increments of ** this many bytes. -*/ -#define JOURNAL_CHUNKSIZE 1024 +** +** The size chosen is a little less than a power of two. That way, +** the FileChunk object will have a size that almost exactly fills +** a power-of-two allocation. This mimimizes wasted space in power-of-two +** memory allocators. +*/ +#define JOURNAL_CHUNKSIZE ((int)(1024-sizeof(FileChunk*))) /* Macro to find the minimum of two numeric values. */ #ifndef MIN # define MIN(x,y) ((x)<(y)?(x):(y)) @@ -55396,11 +55622,12 @@ FilePoint endpoint; /* Pointer to the end of the file */ FilePoint readpoint; /* Pointer to the end of the last xRead() */ }; /* -** Read data from the file. +** Read data from the in-memory journal file. This is the implementation +** of the sqlite3_vfs.xRead method. */ static int memjrnlRead( sqlite3_file *pJfd, /* The journal file from which to read */ void *zBuf, /* Put the results here */ int iAmt, /* Number of bytes to read */ @@ -55410,16 +55637,17 @@ u8 *zOut = zBuf; int nRead = iAmt; int iChunkOffset; FileChunk *pChunk; + /* SQLite never tries to read past the end of a rollback journal file */ assert( iOfst+iAmt<=p->endpoint.iOffset ); if( p->readpoint.iOffset!=iOfst || iOfst==0 ){ sqlite3_int64 iOff = 0; for(pChunk=p->pFirst; - pChunk && (iOff+JOURNAL_CHUNKSIZE)<=iOfst; + ALWAYS(pChunk) && (iOff+JOURNAL_CHUNKSIZE)<=iOfst; pChunk=pChunk->pNext ){ iOff += JOURNAL_CHUNKSIZE; } }else{ @@ -55518,15 +55746,21 @@ } /* ** Sync the file. -*/ -static int memjrnlSync(sqlite3_file *NotUsed, int NotUsed2){ - UNUSED_PARAMETER2(NotUsed, NotUsed2); - return SQLITE_OK; -} +** +** Syncing an in-memory journal is a no-op. And, in fact, this routine +** is never called in a working implementation. This implementation +** exists purely as a contingency, in case some malfunction in some other +** part of SQLite causes Sync to be called by mistake. +*/ +static int memjrnlSync(sqlite3_file *NotUsed, int NotUsed2){ /*NO_TEST*/ + UNUSED_PARAMETER2(NotUsed, NotUsed2); /*NO_TEST*/ + assert( 0 ); /*NO_TEST*/ + return SQLITE_OK; /*NO_TEST*/ +} /*NO_TEST*/ /* ** Query the size of the file in bytes. */ static int memjrnlFileSize(sqlite3_file *pJfd, sqlite_int64 *pSize){ @@ -55557,10 +55791,11 @@ /* ** Open a journal file. */ SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *pJfd){ MemJournal *p = (MemJournal *)pJfd; + assert( EIGHT_BYTE_ALIGNMENT(p) ); memset(p, 0, sqlite3MemJournalSize()); p->pMethod = &MemJournalMethods; } /* @@ -55593,11 +55828,11 @@ ** ************************************************************************* ** This file contains routines used for walking the parser tree for ** an SQL statement. ** -** $Id: walker.c,v 1.2 2009/02/19 14:39:25 danielk1977 Exp $ +** $Id: walker.c,v 1.4 2009/04/08 13:51:52 drh Exp $ */ /* ** Walk an expression tree. Invoke the callback once for each node @@ -55619,12 +55854,16 @@ ** and WRC_Continue to continue. */ SQLITE_PRIVATE int sqlite3WalkExpr(Walker *pWalker, Expr *pExpr){ int rc; if( pExpr==0 ) return WRC_Continue; + testcase( ExprHasProperty(pExpr, EP_TokenOnly) ); + testcase( ExprHasProperty(pExpr, EP_SpanToken) ); + testcase( ExprHasProperty(pExpr, EP_Reduced) ); rc = pWalker->xExprCallback(pWalker, pExpr); - if( rc==WRC_Continue ){ + if( rc==WRC_Continue + && !ExprHasAnyProperty(pExpr,EP_TokenOnly|EP_SpanToken) ){ if( sqlite3WalkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort; if( sqlite3WalkExpr(pWalker, pExpr->pRight) ) return WRC_Abort; if( ExprHasProperty(pExpr, EP_xIsSelect) ){ if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort; }else{ @@ -56900,11 +57139,11 @@ ** ************************************************************************* ** This file contains routines used for analyzing expressions and ** for generating VDBE code that evaluates expressions in SQLite. ** -** $Id: expr.c,v 1.424 2009/03/25 16:51:43 drh Exp $ +** $Id: expr.c,v 1.426 2009/04/08 13:51:51 drh Exp $ */ /* ** Return the 'affinity' of the expression pExpr if any. ** @@ -57516,19 +57755,22 @@ ** Clear an expression structure without deleting the structure itself. ** Substructure is deleted. */ SQLITE_PRIVATE void sqlite3ExprClear(sqlite3 *db, Expr *p){ if( p->token.dyn ) sqlite3DbFree(db, (char*)p->token.z); - if( !ExprHasAnyProperty(p, EP_TokenOnly|EP_SpanOnly) ){ + if( !ExprHasAnyProperty(p, EP_TokenOnly|EP_SpanToken) ){ if( p->span.dyn ) sqlite3DbFree(db, (char*)p->span.z); if( ExprHasProperty(p, EP_Reduced) ){ + /* Subtrees are part of the same memory allocation when EP_Reduced set */ if( p->pLeft ) sqlite3ExprClear(db, p->pLeft); if( p->pRight ) sqlite3ExprClear(db, p->pRight); }else{ + /* Subtrees are separate allocations when EP_Reduced is clear */ sqlite3ExprDelete(db, p->pLeft); sqlite3ExprDelete(db, p->pRight); } + /* x.pSelect and x.pList are always separately allocated */ if( ExprHasProperty(p, EP_xIsSelect) ){ sqlite3SelectDelete(db, p->x.pSelect); }else{ sqlite3ExprListDelete(db, p->x.pList); } @@ -57561,11 +57803,11 @@ ** passed as the first argument. This is always one of EXPR_FULLSIZE, ** EXPR_REDUCEDSIZE or EXPR_TOKENONLYSIZE. */ static int exprStructSize(Expr *p){ if( ExprHasProperty(p, EP_TokenOnly) ) return EXPR_TOKENONLYSIZE; - if( ExprHasProperty(p, EP_SpanOnly) ) return EXPR_SPANONLYSIZE; + if( ExprHasProperty(p, EP_SpanToken) ) return EXPR_SPANTOKENSIZE; if( ExprHasProperty(p, EP_Reduced) ) return EXPR_REDUCEDSIZE; return EXPR_FULLSIZE; } /* @@ -57578,12 +57820,12 @@ int nSize; if( 0==(flags&EXPRDUP_REDUCE) ){ nSize = EXPR_FULLSIZE; }else if( p->pLeft || p->pRight || p->pColl || p->x.pList ){ nSize = EXPR_REDUCEDSIZE; - }else if( flags&(EXPRDUP_SPAN|EXPRDUP_DISTINCTSPAN) ){ - nSize = EXPR_SPANONLYSIZE; + }else if( flags&EXPRDUP_SPAN ){ + nSize = EXPR_SPANTOKENSIZE; }else{ nSize = EXPR_TOKENONLYSIZE; } return nSize; } @@ -57595,12 +57837,12 @@ ** and the copies of the Expr.token.z and Expr.span.z (if applicable) ** string buffers. */ static int dupedExprNodeSize(Expr *p, int flags){ int nByte = dupedExprStructSize(p, flags) + (p->token.z ? p->token.n + 1 : 0); - if( (flags&EXPRDUP_DISTINCTSPAN) - || (flags&EXPRDUP_SPAN && (p->token.z!=p->span.z || p->token.n!=p->span.n)) + if( (flags&EXPRDUP_SPAN)!=0 + && (p->token.z!=p->span.z || p->token.n!=p->span.n) ){ nByte += p->span.n; } return ROUND8(nByte); } @@ -57623,11 +57865,11 @@ static int dupedExprSize(Expr *p, int flags){ int nByte = 0; if( p ){ nByte = dupedExprNodeSize(p, flags); if( flags&EXPRDUP_REDUCE ){ - int f = flags&(~(EXPRDUP_SPAN|EXPRDUP_DISTINCTSPAN)); + int f = flags&(~EXPRDUP_SPAN); nByte += dupedExprSize(p->pLeft, f) + dupedExprSize(p->pRight, f); } } return nByte; } @@ -57641,12 +57883,11 @@ ** portion of the buffer copied into by this function. */ static Expr *exprDup(sqlite3 *db, Expr *p, int flags, u8 **pzBuffer){ Expr *pNew = 0; /* Value to return */ if( p ){ - const int isRequireDistinctSpan = (flags&EXPRDUP_DISTINCTSPAN); - const int isRequireSpan = (flags&(EXPRDUP_SPAN|EXPRDUP_DISTINCTSPAN)); + const int isRequireSpan = (flags&EXPRDUP_SPAN); const int isReduced = (flags&EXPRDUP_REDUCE); u8 *zAlloc; assert( pzBuffer==0 || isReduced ); @@ -57674,15 +57915,15 @@ memcpy(zAlloc, p, nSize); memset(&zAlloc[nSize], 0, EXPR_FULLSIZE-nSize); } /* Set the EP_Reduced and EP_TokenOnly flags appropriately. */ - pNew->flags &= ~(EP_Reduced|EP_TokenOnly|EP_SpanOnly); + pNew->flags &= ~(EP_Reduced|EP_TokenOnly|EP_SpanToken); switch( nNewSize ){ case EXPR_REDUCEDSIZE: pNew->flags |= EP_Reduced; break; case EXPR_TOKENONLYSIZE: pNew->flags |= EP_TokenOnly; break; - case EXPR_SPANONLYSIZE: pNew->flags |= EP_SpanOnly; break; + case EXPR_SPANTOKENSIZE: pNew->flags |= EP_SpanToken; break; } /* Copy the p->token string, if any. */ if( nToken ){ unsigned char *zToken = &zAlloc[nNewSize]; @@ -57693,13 +57934,11 @@ } if( 0==((p->flags|pNew->flags) & EP_TokenOnly) ){ /* Fill in the pNew->span token, if required. */ if( isRequireSpan ){ - if( isRequireDistinctSpan - || p->token.z!=p->span.z || p->token.n!=p->span.n - ){ + if( p->token.z!=p->span.z || p->token.n!=p->span.n ){ pNew->span.z = &zAlloc[nNewSize+nToken]; memcpy((char *)pNew->span.z, p->span.z, p->span.n); pNew->span.dyn = 0; }else{ pNew->span.z = pNew->token.z; @@ -57709,30 +57948,30 @@ pNew->span.z = 0; pNew->span.n = 0; } } - if( 0==((p->flags|pNew->flags) & (EP_TokenOnly|EP_SpanOnly)) ){ + if( 0==((p->flags|pNew->flags) & (EP_TokenOnly|EP_SpanToken)) ){ /* Fill in the pNew->x.pSelect or pNew->x.pList member. */ if( ExprHasProperty(p, EP_xIsSelect) ){ pNew->x.pSelect = sqlite3SelectDup(db, p->x.pSelect, isReduced); }else{ pNew->x.pList = sqlite3ExprListDup(db, p->x.pList, isReduced); } } /* Fill in pNew->pLeft and pNew->pRight. */ - if( ExprHasAnyProperty(pNew, EP_Reduced|EP_TokenOnly|EP_SpanOnly) ){ + if( ExprHasAnyProperty(pNew, EP_Reduced|EP_TokenOnly|EP_SpanToken) ){ zAlloc += dupedExprNodeSize(p, flags); if( ExprHasProperty(pNew, EP_Reduced) ){ pNew->pLeft = exprDup(db, p->pLeft, EXPRDUP_REDUCE, &zAlloc); pNew->pRight = exprDup(db, p->pRight, EXPRDUP_REDUCE, &zAlloc); } if( pzBuffer ){ *pzBuffer = zAlloc; } - }else if( !ExprHasAnyProperty(p, EP_TokenOnly|EP_SpanOnly) ){ + }else if( !ExprHasAnyProperty(p, EP_TokenOnly|EP_SpanToken) ){ pNew->pLeft = sqlite3ExprDup(db, p->pLeft, 0); pNew->pRight = sqlite3ExprDup(db, p->pRight, 0); } } } @@ -58232,26 +58471,30 @@ ** If this is the case, it may be possible to use an existing table ** or index instead of generating an epheremal table. */ p = (ExprHasProperty(pX, EP_xIsSelect) ? pX->x.pSelect : 0); if( isCandidateForInOpt(p) ){ - sqlite3 *db = pParse->db; - Index *pIdx; - Expr *pExpr = p->pEList->a[0].pExpr; - int iCol = pExpr->iColumn; - Vdbe *v = sqlite3GetVdbe(pParse); + sqlite3 *db = pParse->db; /* Database connection */ + Expr *pExpr = p->pEList->a[0].pExpr; /* Expression <column> */ + int iCol = pExpr->iColumn; /* Index of column <column> */ + Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */ + Table *pTab = p->pSrc->a[0].pTab; /* Table <table>. */ + int iDb; /* Database idx for pTab */ + + /* Code an OP_VerifyCookie and OP_TableLock for <table>. */ + 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 ** successful here. */ assert(v); if( iCol<0 ){ int iMem = ++pParse->nMem; int iAddr; - Table *pTab = p->pSrc->a[0].pTab; - int iDb = sqlite3SchemaToIndex(db, pTab->pSchema); sqlite3VdbeUsesBtree(v, iDb); iAddr = sqlite3VdbeAddOp1(v, OP_If, iMem); sqlite3VdbeAddOp2(v, OP_Integer, 1, iMem); @@ -58258,30 +58501,29 @@ sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead); eType = IN_INDEX_ROWID; sqlite3VdbeJumpHere(v, iAddr); }else{ + Index *pIdx; /* Iterator variable */ + /* The collation sequence used by the comparison. If an index is to ** be used in place of a temp-table, it must be ordered according - ** to this collation sequence. - */ + ** to this collation sequence. */ CollSeq *pReq = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pExpr); /* Check that the affinity that will be used to perform the ** comparison is the same as the affinity of the column. If ** it is not, it is not possible to use any index. */ - Table *pTab = p->pSrc->a[0].pTab; char aff = comparisonAffinity(pX); int affinity_ok = (pTab->aCol[iCol].affinity==aff||aff==SQLITE_AFF_NONE); for(pIdx=pTab->pIndex; pIdx && eType==0 && affinity_ok; pIdx=pIdx->pNext){ if( (pIdx->aiColumn[0]==iCol) && (pReq==sqlite3FindCollSeq(db, ENC(db), pIdx->azColl[0], -1, 0)) && (!mustBeUnique || (pIdx->nColumn==1 && pIdx->onError!=OE_None)) ){ - int iDb; int iMem = ++pParse->nMem; int iAddr; char *pKey; pKey = (char *)sqlite3IndexKeyinfo(pParse, pIdx); @@ -59089,35 +59331,38 @@ } break; } case TK_CONST_FUNC: case TK_FUNCTION: { - ExprList *pList = ( - ExprHasAnyProperty(pExpr, EP_TokenOnly|EP_SpanOnly) ? 0 : pExpr->x.pList - ); - int nExpr = pList ? pList->nExpr : 0; - FuncDef *pDef; - int nId; - const char *zId; - int constMask = 0; - int i; - u8 enc = ENC(db); - CollSeq *pColl = 0; + ExprList *pFarg; /* List of function arguments */ + int nFarg; /* Number of function arguments */ + FuncDef *pDef; /* The function definition object */ + int nId; /* Length of the function name in bytes */ + const char *zId; /* The function name */ + int constMask = 0; /* Mask of function arguments that are constant */ + int i; /* Loop counter */ + u8 enc = ENC(db); /* The text encoding used by this database */ + CollSeq *pColl = 0; /* A collating sequence */ assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); testcase( op==TK_CONST_FUNC ); testcase( op==TK_FUNCTION ); + if( ExprHasAnyProperty(pExpr, EP_TokenOnly|EP_SpanToken) ){ + pFarg = 0; + }else{ + pFarg = pExpr->x.pList; + } + nFarg = pFarg ? pFarg->nExpr : 0; zId = (char*)pExpr->token.z; nId = pExpr->token.n; - pDef = sqlite3FindFunction(db, zId, nId, nExpr, enc, 0); + pDef = sqlite3FindFunction(db, zId, nId, nFarg, enc, 0); assert( pDef!=0 ); - if( pList ){ - nExpr = pList->nExpr; - r1 = sqlite3GetTempRange(pParse, nExpr); - sqlite3ExprCodeExprList(pParse, pList, r1, 1); - }else{ - nExpr = r1 = 0; + if( pFarg ){ + r1 = sqlite3GetTempRange(pParse, nFarg); + sqlite3ExprCodeExprList(pParse, pFarg, r1, 1); + }else{ + r1 = 0; } #ifndef SQLITE_OMIT_VIRTUALTABLE /* Possibly overload the function if the first argument is ** a virtual table column. ** @@ -59128,35 +59373,35 @@ ** control overloading) ends up as the second argument to the ** function. The expression "A glob B" is equivalent to ** "glob(B,A). We want to use the A in "A glob B" to test ** for function overloading. But we use the B term in "glob(B,A)". */ - if( nExpr>=2 && (pExpr->flags & EP_InfixFunc) ){ - pDef = sqlite3VtabOverloadFunction(db, pDef, nExpr, pList->a[1].pExpr); - }else if( nExpr>0 ){ - pDef = sqlite3VtabOverloadFunction(db, pDef, nExpr, pList->a[0].pExpr); - } -#endif - for(i=0; i<nExpr && i<32; i++){ - if( sqlite3ExprIsConstant(pList->a[i].pExpr) ){ + if( nFarg>=2 && (pExpr->flags & EP_InfixFunc) ){ + pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[1].pExpr); + }else if( nFarg>0 ){ + pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[0].pExpr); + } +#endif + for(i=0; i<nFarg && i<32; i++){ + if( sqlite3ExprIsConstant(pFarg->a[i].pExpr) ){ constMask |= (1<<i); } if( (pDef->flags & SQLITE_FUNC_NEEDCOLL)!=0 && !pColl ){ - pColl = sqlite3ExprCollSeq(pParse, pList->a[i].pExpr); + pColl = sqlite3ExprCollSeq(pParse, pFarg->a[i].pExpr); } } if( pDef->flags & SQLITE_FUNC_NEEDCOLL ){ if( !pColl ) pColl = db->pDfltColl; sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ); } sqlite3VdbeAddOp4(v, OP_Function, constMask, r1, target, (char*)pDef, P4_FUNCDEF); - sqlite3VdbeChangeP5(v, (u8)nExpr); - if( nExpr ){ - sqlite3ReleaseTempRange(pParse, r1, nExpr); - } - sqlite3ExprCacheAffinityChange(pParse, r1, nExpr); + sqlite3VdbeChangeP5(v, (u8)nFarg); + if( nFarg ){ + sqlite3ReleaseTempRange(pParse, r1, nFarg); + } + sqlite3ExprCacheAffinityChange(pParse, r1, nFarg); break; } #ifndef SQLITE_OMIT_SUBQUERY case TK_EXISTS: case TK_SELECT: { @@ -61275,11 +61520,11 @@ ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains code used to implement the ATTACH and DETACH commands. ** -** $Id: attach.c,v 1.83 2009/02/19 14:39:25 danielk1977 Exp $ +** $Id: attach.c,v 1.84 2009/04/08 13:51:51 drh Exp $ */ #ifndef SQLITE_OMIT_ATTACH /* ** Resolve an expression that was part of an ATTACH or DETACH statement. This @@ -61751,11 +61996,11 @@ SQLITE_PRIVATE int sqlite3FixExpr( DbFixer *pFix, /* Context of the fixation */ Expr *pExpr /* The expression to be fixed to one database */ ){ while( pExpr ){ - if( ExprHasAnyProperty(pExpr, EP_TokenOnly|EP_SpanOnly) ) break; + if( ExprHasAnyProperty(pExpr, EP_TokenOnly|EP_SpanToken) ) break; if( ExprHasProperty(pExpr, EP_xIsSelect) ){ if( sqlite3FixSelect(pFix, pExpr->x.pSelect) ) return 1; }else{ if( sqlite3FixExprList(pFix, pExpr->x.pList) ) return 1; } @@ -62063,11 +62308,11 @@ ** creating ID lists ** BEGIN TRANSACTION ** COMMIT ** ROLLBACK ** -** $Id: build.c,v 1.527 2009/03/31 03:41:57 shane Exp $ +** $Id: build.c,v 1.528 2009/04/08 13:51:51 drh Exp $ */ /* ** This routine is called when a new SQL statement is beginning to ** be parsed. Initialize the pParse structure as needed. @@ -63152,13 +63397,11 @@ /* A copy of pExpr is used instead of the original, as pExpr contains ** tokens that point to volatile memory. The 'span' of the expression ** is required by pragma table_info. */ sqlite3ExprDelete(db, pCol->pDflt); - pCol->pDflt = sqlite3ExprDup( - db, pExpr, EXPRDUP_REDUCE|EXPRDUP_DISTINCTSPAN - ); + pCol->pDflt = sqlite3ExprDup(db, pExpr, EXPRDUP_REDUCE|EXPRDUP_SPAN); } } sqlite3ExprDelete(db, pExpr); } @@ -66831,11 +67074,11 @@ ** ** There is only one exported symbol in this file - the function ** sqliteRegisterBuildinFunctions() found at the bottom of the file. ** All other code has file scope. ** -** $Id: func.c,v 1.225 2009/03/27 15:26:03 danielk1977 Exp $ +** $Id: func.c,v 1.231 2009/04/08 23:04:14 drh Exp $ */ /* ** Return the collating function associated with a function. */ @@ -67077,20 +67320,26 @@ #endif /* ** Allocate nByte bytes of space using sqlite3_malloc(). If the ** allocation fails, call sqlite3_result_error_nomem() to notify -** the database handle that malloc() has failed. +** the database handle that malloc() has failed and return NULL. +** If nByte is larger than the maximum string or blob length, then +** raise an SQLITE_TOOBIG exception and return NULL. */ static void *contextMalloc(sqlite3_context *context, i64 nByte){ char *z; - if( nByte>sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH] ){ + sqlite3 *db = sqlite3_context_db_handle(context); + assert( nByte>0 ); + testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH] ); + testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH]+1 ); + if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ sqlite3_result_error_toobig(context); z = 0; }else{ z = sqlite3Malloc((int)nByte); - if( !z && nByte>0 ){ + if( !z ){ sqlite3_result_error_nomem(context); } } return z; } @@ -67167,12 +67416,21 @@ sqlite3_value **NotUsed2 ){ sqlite_int64 r; UNUSED_PARAMETER2(NotUsed, NotUsed2); sqlite3_randomness(sizeof(r), &r); - if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */ - /* can always do abs() of the result */ + if( r<0 ){ + /* We need to prevent a random number of 0x8000000000000000 + ** (or -9223372036854775808) since when you do abs() of that + ** number of you get the same value back again. To do this + ** in a way that is testable, mask the sign bit off of negative + ** values, resulting in a positive value. Then take the + ** 2s complement of that positive value. The end result can + ** therefore be no less than -9223372036854775807. + */ + r = -(r ^ (((sqlite3_int64)1)<<63)); + } sqlite3_result_int64(context, r); } /* ** Implementation of randomblob(N). Return a random blob @@ -67255,11 +67513,11 @@ ** character is exactly one byte in size. Also, all characters are ** able to participate in upper-case-to-lower-case mappings in EBCDIC ** whereas only characters less than 0x80 do in ASCII. */ #if defined(SQLITE_EBCDIC) -# define sqlite3Utf8Read(A,B,C) (*(A++)) +# define sqlite3Utf8Read(A,C) (*(A++)) # define GlogUpperToLower(A) A = sqlite3UpperToLower[A] #else # define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; } #endif @@ -67312,22 +67570,22 @@ u8 matchAll = pInfo->matchAll; u8 matchSet = pInfo->matchSet; u8 noCase = pInfo->noCase; int prevEscape = 0; /* True if the previous character was 'escape' */ - while( (c = sqlite3Utf8Read(zPattern,0,&zPattern))!=0 ){ + while( (c = sqlite3Utf8Read(zPattern,&zPattern))!=0 ){ if( !prevEscape && c==matchAll ){ - while( (c=sqlite3Utf8Read(zPattern,0,&zPattern)) == matchAll + while( (c=sqlite3Utf8Read(zPattern,&zPattern)) == matchAll || c == matchOne ){ - if( c==matchOne && sqlite3Utf8Read(zString, 0, &zString)==0 ){ + if( c==matchOne && sqlite3Utf8Read(zString, &zString)==0 ){ return 0; } } if( c==0 ){ return 1; }else if( c==esc ){ - c = sqlite3Utf8Read(zPattern, 0, &zPattern); + c = sqlite3Utf8Read(zPattern, &zPattern); if( c==0 ){ return 0; } }else if( c==matchSet ){ assert( esc==0 ); /* This is GLOB, not LIKE */ @@ -67335,67 +67593,67 @@ while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){ SQLITE_SKIP_UTF8(zString); } return *zString!=0; } - while( (c2 = sqlite3Utf8Read(zString,0,&zString))!=0 ){ + while( (c2 = sqlite3Utf8Read(zString,&zString))!=0 ){ if( noCase ){ GlogUpperToLower(c2); GlogUpperToLower(c); while( c2 != 0 && c2 != c ){ - c2 = sqlite3Utf8Read(zString, 0, &zString); + c2 = sqlite3Utf8Read(zString, &zString); GlogUpperToLower(c2); } }else{ while( c2 != 0 && c2 != c ){ - c2 = sqlite3Utf8Read(zString, 0, &zString); + c2 = sqlite3Utf8Read(zString, &zString); } } if( c2==0 ) return 0; if( patternCompare(zPattern,zString,pInfo,esc) ) return 1; } return 0; }else if( !prevEscape && c==matchOne ){ - if( sqlite3Utf8Read(zString, 0, &zString)==0 ){ + if( sqlite3Utf8Read(zString, &zString)==0 ){ return 0; } }else if( c==matchSet ){ int prior_c = 0; assert( esc==0 ); /* This only occurs for GLOB, not LIKE */ seen = 0; invert = 0; - c = sqlite3Utf8Read(zString, 0, &zString); + c = sqlite3Utf8Read(zString, &zString); if( c==0 ) return 0; - c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); + c2 = sqlite3Utf8Read(zPattern, &zPattern); if( c2=='^' ){ invert = 1; - c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); + c2 = sqlite3Utf8Read(zPattern, &zPattern); } if( c2==']' ){ if( c==']' ) seen = 1; - c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); + c2 = sqlite3Utf8Read(zPattern, &zPattern); } while( c2 && c2!=']' ){ if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){ - c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); + c2 = sqlite3Utf8Read(zPattern, &zPattern); if( c>=prior_c && c<=c2 ) seen = 1; prior_c = 0; }else{ if( c==c2 ){ seen = 1; } prior_c = c2; } - c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); + c2 = sqlite3Utf8Read(zPattern, &zPattern); } if( c2==0 || (seen ^ invert)==0 ){ return 0; } }else if( esc==c && !prevEscape ){ prevEscape = 1; }else{ - c2 = sqlite3Utf8Read(zString, 0, &zString); + c2 = sqlite3Utf8Read(zString, &zString); if( noCase ){ GlogUpperToLower(c); GlogUpperToLower(c2); } if( c!=c2 ){ @@ -67434,20 +67692,23 @@ int argc, sqlite3_value **argv ){ const unsigned char *zA, *zB; int escape = 0; + int nPat; sqlite3 *db = sqlite3_context_db_handle(context); zB = sqlite3_value_text(argv[0]); zA = sqlite3_value_text(argv[1]); /* Limit the length of the LIKE or GLOB pattern to avoid problems ** of deep recursion and N*N behavior in patternCompare(). */ - if( sqlite3_value_bytes(argv[0]) > - db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){ + nPat = sqlite3_value_bytes(argv[0]); + testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ); + testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]+1 ); + if( nPat > db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){ sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1); return; } assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */ @@ -67460,11 +67721,11 @@ if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){ sqlite3_result_error(context, "ESCAPE expression must be a single character", -1); return; } - escape = sqlite3Utf8Read(zEsc, 0, &zEsc); + escape = sqlite3Utf8Read(zEsc, &zEsc); } if( zA && zB ){ struct compareInfo *pInfo = sqlite3_user_data(context); #ifdef SQLITE_TEST sqlite3_like_count++; @@ -67619,14 +67880,17 @@ sqlite3_context *context, int argc, sqlite3_value **argv ){ i64 n; + sqlite3 *db = sqlite3_context_db_handle(context); assert( argc==1 ); UNUSED_PARAMETER(argc); n = sqlite3_value_int64(argv[0]); - if( n>SQLITE_MAX_LENGTH ){ + testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH] ); + testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH]+1 ); + if( n>db->aLimit[SQLITE_LIMIT_LENGTH] ){ sqlite3_result_error_toobig(context); }else{ sqlite3_result_zeroblob(context, (int)n); } } @@ -67688,11 +67952,13 @@ zOut[j++] = zStr[i]; }else{ u8 *zOld; sqlite3 *db = sqlite3_context_db_handle(context); nOut += nRep - nPattern; - if( nOut>=db->aLimit[SQLITE_LIMIT_LENGTH] ){ + testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] ); + testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] ); + if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){ sqlite3_result_error_toobig(context); sqlite3DbFree(db, zOut); return; } zOld = zOut; @@ -67772,11 +68038,11 @@ if( flags & 1 ){ while( nIn>0 ){ int len = 0; for(i=0; i<nChar; i++){ len = aLen[i]; - if( memcmp(zIn, azChar[i], len)==0 ) break; + if( len<=nIn && memcmp(zIn, azChar[i], len)==0 ) break; } if( i>=nChar ) break; zIn += len; nIn -= len; } @@ -67966,10 +68232,17 @@ CountCtx *p; p = sqlite3_aggregate_context(context, sizeof(*p)); if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){ p->n++; } + + /* The sqlite3_aggregate_count() function is deprecated. But just to make + ** sure it still operates correctly, verify that its count agrees with our + ** internal count when using count(*) and when the total count can be + ** expressed as a 32-bit integer. */ + assert( argc==1 || p==0 || p->n>0x7fffffff + || p->n==sqlite3_aggregate_count(context) ); } static void countFinalize(sqlite3_context *context){ CountCtx *p; p = sqlite3_aggregate_context(context, 0); sqlite3_result_int64(context, p ? p->n : 0); @@ -68014,11 +68287,11 @@ } static void minMaxFinalize(sqlite3_context *context){ sqlite3_value *pRes; pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0); if( pRes ){ - if( pRes->flags ){ + if( ALWAYS(pRes->flags) ){ sqlite3_result_value(context, pRes); } sqlite3VdbeMemRelease(pRes); } } @@ -68099,11 +68372,11 @@ */ static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){ FuncDef *pDef; pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName), 2, SQLITE_UTF8, 0); - if( pDef ){ + if( ALWAYS(pDef) ){ pDef->flags = flagVal; } } /* @@ -68143,11 +68416,11 @@ return 0; } assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2, SQLITE_UTF8, 0); - if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){ + if( NEVER(pDef==0) || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){ return 0; } /* The memcpy() statement assumes that the wildcard characters are ** the first three statements in the compareInfo structure. The @@ -71141,11 +71414,11 @@ ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains code used to implement the PRAGMA command. ** -** $Id: pragma.c,v 1.204 2009/02/23 16:52:08 drh Exp $ +** $Id: pragma.c,v 1.209 2009/04/07 22:05:43 drh Exp $ */ /* Ignore this whole file if pragmas are disabled */ #if !defined(SQLITE_OMIT_PRAGMA) && !defined(SQLITE_OMIT_PARSER) @@ -71273,18 +71546,20 @@ #endif /* SQLITE_PAGER_PRAGMAS */ /* ** Generate code to return a single integer value. */ -static void returnSingleInt(Parse *pParse, const char *zLabel, int value){ +static void returnSingleInt(Parse *pParse, const char *zLabel, i64 value){ Vdbe *v = sqlite3GetVdbe(pParse); int mem = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_Integer, value, mem); - if( pParse->explain==0 ){ - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLabel, SQLITE_STATIC); - } + i64 *pI64 = sqlite3DbMallocRaw(pParse->db, sizeof(value)); + if( pI64 ){ + memcpy(pI64, &value, sizeof(value)); + } + sqlite3VdbeAddOp4(v, OP_Int64, 0, mem, 0, (char*)pI64, P4_INT64); + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLabel, SQLITE_STATIC); sqlite3VdbeAddOp2(v, OP_ResultRow, mem, 1); } #ifndef SQLITE_OMIT_FLAG_PRAGMAS /* @@ -71498,11 +71773,11 @@ }else{ /* Malloc may fail when setting the page-size, as there is an internal ** buffer that the pager module resizes using sqlite3_realloc(). */ db->nextPagesize = atoi(zRight); - if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, -1) ){ + if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, -1, 0) ){ db->mallocFailed = 1; } } }else @@ -71660,18 +71935,15 @@ */ if( sqlite3StrICmp(zLeft,"journal_size_limit")==0 ){ Pager *pPager = sqlite3BtreePager(pDb->pBt); i64 iLimit = -2; if( zRight ){ - int iLimit32 = atoi(zRight); - if( iLimit32<-1 ){ - iLimit32 = -1; - } - iLimit = iLimit32; + sqlite3Atoi64(zRight, &iLimit); + if( iLimit<-1 ) iLimit = -1; } iLimit = sqlite3PagerJournalSizeLimit(pPager, iLimit); - returnSingleInt(pParse, "journal_size_limit", (int)iLimit); + returnSingleInt(pParse, "journal_size_limit", iLimit); }else #endif /* SQLITE_OMIT_PAGER_PRAGMAS */ /* @@ -72208,11 +72480,10 @@ for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ sqlite3VdbeAddOp2(v, OP_Integer, pIdx->tnum, 2+cnt); cnt++; } } - if( cnt==0 ) continue; /* Make sure sufficient number of registers have been allocated */ if( pParse->nMem < cnt+4 ){ pParse->nMem = cnt+4; } @@ -72281,11 +72552,10 @@ { OP_String8, 0, 2, 0}, /* 6 */ { OP_String8, 0, 3, 0}, /* 7 */ { OP_Concat, 3, 2, 2}, { OP_ResultRow, 2, 1, 0}, }; - if( pIdx->tnum==0 ) continue; addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); sqlite3VdbeJumpHere(v, addr); addr = sqlite3VdbeAddOpList(v, ArraySize(cntIdx), cntIdx); sqlite3VdbeChangeP1(v, addr+1, j+2); @@ -72578,11 +72848,11 @@ ************************************************************************* ** This file contains the implementation of the sqlite3_prepare() ** interface, and routines that contribute to loading the database schema ** from disk. ** -** $Id: prepare.c,v 1.114 2009/03/24 15:08:10 drh Exp $ +** $Id: prepare.c,v 1.116 2009/04/02 18:32:27 drh Exp $ */ /* ** Fill the InitData structure with an error message that indicates ** that the database is corrupt. @@ -73092,15 +73362,12 @@ Parse sParse; char *zErrMsg = 0; int rc = SQLITE_OK; int i; - assert( ppStmt ); - *ppStmt = 0; - if( sqlite3SafetyOn(db) ){ - return SQLITE_MISUSE; - } + if( sqlite3SafetyOn(db) ) return SQLITE_MISUSE; + assert( ppStmt && *ppStmt==0 ); assert( !db->mallocFailed ); assert( sqlite3_mutex_held(db->mutex) ); /* Check to verify that it is possible to get a read lock on all ** database schemas. The inability to get a read lock indicates that @@ -73235,10 +73502,12 @@ int saveSqlFlag, /* True to copy SQL text into the sqlite3_stmt */ sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ const char **pzTail /* OUT: End of parsed string */ ){ int rc; + assert( ppStmt!=0 ); + *ppStmt = 0; if( !sqlite3SafetyCheckOk(db) ){ return SQLITE_MISUSE; } sqlite3_mutex_enter(db->mutex); sqlite3BtreeEnterAll(db); @@ -73337,10 +73606,12 @@ */ char *zSql8; const char *zTail8 = 0; int rc = SQLITE_OK; + assert( ppStmt ); + *ppStmt = 0; if( !sqlite3SafetyCheckOk(db) ){ return SQLITE_MISUSE; } sqlite3_mutex_enter(db->mutex); zSql8 = sqlite3Utf16to8(db, zSql, nBytes); @@ -73412,11 +73683,11 @@ ** ************************************************************************* ** This file contains C code routines that are called by the parser ** to handle SELECT statements in SQLite. ** -** $Id: select.c,v 1.506 2009/03/31 03:41:57 shane Exp $ +** $Id: select.c,v 1.507 2009/04/02 16:59:47 drh Exp $ */ /* ** Delete all the content of a Select structure but do not deallocate @@ -75954,10 +76225,16 @@ ** columns of the sub-query. ** ** (19) The subquery does not use LIMIT or the outer query does not ** have a WHERE clause. ** +** (20) If the sub-query is a compound select, then it must not use +** an ORDER BY clause. Ticket #3773. We could relax this constraint +** somewhat by saying that the terms of the ORDER BY clause must +** appear as unmodified result columns in the outer query. But +** have other optimizations in mind to deal with that case. +** ** 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. ** ** If flattening is not attempted, this routine is a no-op and returns 0. @@ -76064,10 +76341,13 @@ ** use only the UNION ALL operator. And none of the simple select queries ** that make up the compound SELECT are allowed to be aggregate or distinct ** queries. */ if( pSub->pPrior ){ + if( pSub->pOrderBy ){ + return 0; /* Restriction 20 */ + } if( isAgg || (p->selFlags & SF_Distinct)!=0 || pSrc->nSrc!=1 ){ return 0; } for(pSub1=pSub; pSub1; pSub1=pSub1->pPrior){ if( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))!=0 @@ -77706,52 +77986,51 @@ ** interface routine of sqlite3_exec(). ** ** These routines are in a separate files so that they will not be linked ** if they are not used. ** -** $Id: table.c,v 1.39 2009/01/19 20:49:10 drh Exp $ +** $Id: table.c,v 1.40 2009/04/10 14:28:00 drh Exp $ */ #ifndef SQLITE_OMIT_GET_TABLE /* ** This structure is used to pass data from sqlite3_get_table() through ** to the callback function is uses to build the result. */ typedef struct TabResult { - char **azResult; - char *zErrMsg; - int nResult; - int nAlloc; - int nRow; - int nColumn; - int nData; - int rc; + char **azResult; /* Accumulated output */ + char *zErrMsg; /* Error message text, if an error occurs */ + int nAlloc; /* Slots allocated for azResult[] */ + int nRow; /* Number of rows in the result */ + int nColumn; /* Number of columns in the result */ + int nData; /* Slots used in azResult[]. (nRow+1)*nColumn */ + int rc; /* Return code from sqlite3_exec() */ } TabResult; /* ** This routine is called once for each row in the result table. Its job ** is to fill in the TabResult structure appropriately, allocating new ** memory as necessary. */ static int sqlite3_get_table_cb(void *pArg, int nCol, char **argv, char **colv){ - TabResult *p = (TabResult*)pArg; - int need; - int i; - char *z; + TabResult *p = (TabResult*)pArg; /* Result accumulator */ + int need; /* Slots needed in p->azResult[] */ + int i; /* Loop counter */ + char *z; /* A single column of result */ /* Make sure there is enough space in p->azResult to hold everything ** we need to remember from this invocation of the callback. */ if( p->nRow==0 && argv!=0 ){ need = nCol*2; }else{ need = nCol; } - if( p->nData + need >= p->nAlloc ){ + if( p->nData + need > p->nAlloc ){ char **azNew; - p->nAlloc = p->nAlloc*2 + need + 1; + p->nAlloc = p->nAlloc*2 + need; azNew = sqlite3_realloc( p->azResult, sizeof(char*)*p->nAlloc ); if( azNew==0 ) goto malloc_failed; p->azResult = azNew; } @@ -77821,11 +78100,10 @@ *pazResult = 0; if( pnColumn ) *pnColumn = 0; if( pnRow ) *pnRow = 0; if( pzErrMsg ) *pzErrMsg = 0; res.zErrMsg = 0; - res.nResult = 0; res.nRow = 0; res.nColumn = 0; res.nData = 1; res.nAlloc = 20; res.rc = SQLITE_OK; @@ -77855,17 +78133,16 @@ sqlite3_free_table(&res.azResult[1]); return rc; } if( res.nAlloc>res.nData ){ char **azNew; - azNew = sqlite3_realloc( res.azResult, sizeof(char*)*(res.nData+1) ); + azNew = sqlite3_realloc( res.azResult, sizeof(char*)*res.nData ); if( azNew==0 ){ sqlite3_free_table(&res.azResult[1]); db->errCode = SQLITE_NOMEM; return SQLITE_NOMEM; } - res.nAlloc = res.nData+1; res.azResult = azNew; } *pazResult = &res.azResult[1]; if( pnColumn ) *pnColumn = res.nColumn; if( pnRow ) *pnRow = res.nRow; @@ -79468,11 +79745,11 @@ ** This file contains code used to implement the VACUUM command. ** ** Most of the code in this file may be omitted by defining the ** SQLITE_OMIT_VACUUM macro. ** -** $Id: vacuum.c,v 1.86 2009/02/03 16:51:25 danielk1977 Exp $ +** $Id: vacuum.c,v 1.87 2009/04/02 20:16:59 drh Exp $ */ #if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH) /* ** Execute zSql on database db. Return an error code. @@ -79592,12 +79869,12 @@ sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey); if( nKey ) db->nextPagesize = 0; } #endif - if( sqlite3BtreeSetPageSize(pTemp, sqlite3BtreeGetPageSize(pMain), nRes) - || (!isMemDb && sqlite3BtreeSetPageSize(pTemp, db->nextPagesize, nRes)) + if( sqlite3BtreeSetPageSize(pTemp, sqlite3BtreeGetPageSize(pMain), nRes, 0) + || (!isMemDb && sqlite3BtreeSetPageSize(pTemp, db->nextPagesize, nRes, 0)) || db->mallocFailed ){ rc = SQLITE_NOMEM; goto end_of_vacuum; } @@ -79720,11 +79997,11 @@ sqlite3BtreeSetAutoVacuum(pMain, sqlite3BtreeGetAutoVacuum(pTemp)); #endif } if( rc==SQLITE_OK ){ - rc = sqlite3BtreeSetPageSize(pMain, sqlite3BtreeGetPageSize(pTemp), nRes); + rc = sqlite3BtreeSetPageSize(pMain, sqlite3BtreeGetPageSize(pTemp), nRes,1); } end_of_vacuum: /* Restore the original value of db->flags */ db->flags = saved_flags; @@ -79765,14 +80042,19 @@ ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains code used to help implement virtual tables. ** -** $Id: vtab.c,v 1.84 2009/03/24 15:08:10 drh Exp $ -*/ -#ifndef SQLITE_OMIT_VIRTUALTABLE - +** $Id: vtab.c,v 1.85 2009/04/11 16:27:20 drh Exp $ +*/ +#ifndef SQLITE_OMIT_VIRTUALTABLE + +/* +** The actual function that does the work of creating a new module. +** This function implements the sqlite3_create_module() and +** sqlite3_create_module_v2() interfaces. +*/ static int createModule( sqlite3 *db, /* Database in which module is registered */ const char *zName, /* Name assigned to this module */ const sqlite3_module *pModule, /* The definition of the module */ void *pAux, /* Context pointer for xCreate/xConnect */ @@ -79850,10 +80132,11 @@ /* ** Unlock a virtual table. When the last lock is removed, ** disconnect the virtual table. */ SQLITE_PRIVATE void sqlite3VtabUnlock(sqlite3 *db, sqlite3_vtab *pVtab){ + assert( pVtab->nRef>0 ); pVtab->nRef--; assert(db); assert( sqlite3SafetyCheckOk(db) ); if( pVtab->nRef==0 ){ if( db->magic==SQLITE_MAGIC_BUSY ){ @@ -80618,20 +80901,20 @@ ** generating the code that loops through a table looking for applicable ** rows. Indices are selected and used to speed the search when doing ** so is applicable. Because this module is responsible for selecting ** indices, you might also think of this module as the "query optimizer". ** -** $Id: where.c,v 1.379 2009/03/29 00:15:54 drh Exp $ +** $Id: where.c,v 1.382 2009/04/07 13:48:12 drh Exp $ */ /* ** Trace output macros */ #if defined(SQLITE_TEST) || defined(SQLITE_DEBUG) SQLITE_PRIVATE int sqlite3WhereTrace = 0; #endif -#if 0 +#if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) # define WHERETRACE(X) if(sqlite3WhereTrace) sqlite3DebugPrintf X #else # define WHERETRACE(X) #endif @@ -82363,10 +82646,17 @@ */ memset(pCost, 0, sizeof(*pCost)); if( pProbe==0 && findTerm(pWC, iCur, -1, 0, WO_EQ|WO_IN|WO_LT|WO_LE|WO_GT|WO_GE,0)==0 && (pOrderBy==0 || !sortableByRowid(iCur, pOrderBy, pWC->pMaskSet, &rev)) ){ + if( pParse->db->flags & SQLITE_ReverseOrder ){ + /* For application testing, randomly reverse the output order for + ** SELECT statements that omit the ORDER BY clause. This will help + ** to find cases where + */ + pCost->plan.wsFlags |= WHERE_REVERSE; + } return; } pCost->rCost = SQLITE_BIG_DBL; /* Check for a rowid=EXPR or rowid IN (...) constraints. If there was @@ -84205,12 +84495,12 @@ #endif #define sqlite3ParserARG_SDECL Parse *pParse; #define sqlite3ParserARG_PDECL ,Parse *pParse #define sqlite3ParserARG_FETCH Parse *pParse = yypParser->pParse #define sqlite3ParserARG_STORE yypParser->pParse = pParse -#define YYNSTATE 613 -#define YYNRULE 321 +#define YYNSTATE 616 +#define YYNRULE 323 #define YYFALLBACK 1 #define YY_NO_ACTION (YYNSTATE+YYNRULE+2) #define YY_ACCEPT_ACTION (YYNSTATE+YYNRULE+1) #define YY_ERROR_ACTION (YYNSTATE+YYNRULE) @@ -84265,161 +84555,160 @@ ** yy_reduce_ofst[] For each state, the offset into yy_action for ** shifting non-terminals after a reduce. ** yy_default[] Default action for each state. */ static const YYACTIONTYPE yy_action[] = { - /* 0 */ 304, 935, 176, 612, 2, 150, 214, 438, 24, 24, - /* 10 */ 24, 24, 487, 26, 26, 26, 26, 27, 27, 28, - /* 20 */ 28, 28, 29, 216, 412, 413, 212, 412, 413, 445, - /* 30 */ 451, 31, 26, 26, 26, 26, 27, 27, 28, 28, - /* 40 */ 28, 29, 216, 30, 482, 32, 134, 23, 22, 308, - /* 50 */ 455, 456, 452, 452, 25, 25, 24, 24, 24, 24, - /* 60 */ 435, 26, 26, 26, 26, 27, 27, 28, 28, 28, - /* 70 */ 29, 216, 304, 216, 311, 438, 511, 489, 45, 26, + /* 0 */ 304, 940, 176, 615, 2, 150, 214, 439, 24, 24, + /* 10 */ 24, 24, 488, 26, 26, 26, 26, 27, 27, 28, + /* 20 */ 28, 28, 29, 216, 413, 414, 212, 413, 414, 446, + /* 30 */ 452, 31, 26, 26, 26, 26, 27, 27, 28, 28, + /* 40 */ 28, 29, 216, 30, 483, 32, 134, 23, 22, 308, + /* 50 */ 456, 457, 453, 453, 25, 25, 24, 24, 24, 24, + /* 60 */ 436, 26, 26, 26, 26, 27, 27, 28, 28, 28, + /* 70 */ 29, 216, 304, 216, 311, 439, 512, 490, 45, 26, /* 80 */ 26, 26, 26, 27, 27, 28, 28, 28, 29, 216, - /* 90 */ 412, 413, 415, 416, 156, 415, 416, 360, 363, 364, - /* 100 */ 311, 445, 451, 385, 513, 21, 186, 494, 365, 27, - /* 110 */ 27, 28, 28, 28, 29, 216, 412, 413, 414, 23, - /* 120 */ 22, 308, 455, 456, 452, 452, 25, 25, 24, 24, - /* 130 */ 24, 24, 554, 26, 26, 26, 26, 27, 27, 28, - /* 140 */ 28, 28, 29, 216, 304, 228, 503, 135, 467, 218, - /* 150 */ 438, 145, 132, 256, 358, 261, 359, 153, 415, 416, - /* 160 */ 553, 528, 331, 30, 265, 32, 134, 552, 592, 593, - /* 170 */ 230, 228, 489, 445, 451, 57, 505, 328, 132, 256, - /* 180 */ 358, 261, 359, 153, 415, 416, 434, 78, 407, 404, - /* 190 */ 265, 23, 22, 308, 455, 456, 452, 452, 25, 25, - /* 200 */ 24, 24, 24, 24, 476, 26, 26, 26, 26, 27, - /* 210 */ 27, 28, 28, 28, 29, 216, 304, 572, 438, 546, - /* 220 */ 477, 127, 547, 596, 30, 331, 32, 134, 345, 214, - /* 230 */ 428, 63, 331, 355, 414, 478, 241, 341, 414, 342, - /* 240 */ 328, 387, 193, 595, 594, 445, 451, 328, 299, 434, - /* 250 */ 85, 469, 545, 200, 190, 555, 434, 78, 309, 462, - /* 260 */ 463, 571, 471, 23, 22, 308, 455, 456, 452, 452, - /* 270 */ 25, 25, 24, 24, 24, 24, 435, 26, 26, 26, + /* 90 */ 413, 414, 416, 417, 156, 416, 417, 360, 363, 364, + /* 100 */ 311, 446, 452, 385, 514, 21, 186, 495, 365, 27, + /* 110 */ 27, 28, 28, 28, 29, 216, 413, 414, 415, 23, + /* 120 */ 22, 308, 456, 457, 453, 453, 25, 25, 24, 24, + /* 130 */ 24, 24, 555, 26, 26, 26, 26, 27, 27, 28, + /* 140 */ 28, 28, 29, 216, 304, 228, 504, 135, 468, 218, + /* 150 */ 548, 145, 132, 256, 358, 261, 359, 153, 416, 417, + /* 160 */ 241, 598, 331, 30, 265, 32, 134, 439, 596, 597, + /* 170 */ 230, 228, 490, 446, 452, 57, 506, 328, 132, 256, + /* 180 */ 358, 261, 359, 153, 416, 417, 435, 78, 408, 405, + /* 190 */ 265, 23, 22, 308, 456, 457, 453, 453, 25, 25, + /* 200 */ 24, 24, 24, 24, 342, 26, 26, 26, 26, 27, + /* 210 */ 27, 28, 28, 28, 29, 216, 304, 214, 534, 547, + /* 220 */ 307, 127, 489, 595, 30, 331, 32, 134, 345, 387, + /* 230 */ 429, 63, 331, 355, 415, 439, 507, 331, 415, 535, + /* 240 */ 328, 215, 193, 594, 593, 446, 452, 328, 18, 435, + /* 250 */ 85, 16, 328, 183, 190, 556, 435, 78, 309, 463, + /* 260 */ 464, 435, 85, 23, 22, 308, 456, 457, 453, 453, + /* 270 */ 25, 25, 24, 24, 24, 24, 436, 26, 26, 26, /* 280 */ 26, 27, 27, 28, 28, 28, 29, 216, 304, 347, - /* 290 */ 221, 191, 512, 429, 544, 331, 440, 234, 345, 430, - /* 300 */ 324, 409, 541, 344, 591, 217, 213, 541, 112, 331, - /* 310 */ 328, 388, 282, 281, 211, 29, 216, 445, 451, 434, - /* 320 */ 79, 217, 214, 334, 328, 458, 458, 442, 442, 442, - /* 330 */ 571, 270, 4, 434, 85, 23, 22, 308, 455, 456, - /* 340 */ 452, 452, 25, 25, 24, 24, 24, 24, 435, 26, + /* 290 */ 221, 313, 595, 191, 378, 331, 472, 234, 345, 381, + /* 300 */ 324, 410, 220, 344, 592, 217, 213, 415, 112, 331, + /* 310 */ 328, 4, 594, 399, 211, 554, 529, 446, 452, 435, + /* 320 */ 79, 217, 553, 515, 328, 334, 513, 459, 459, 469, + /* 330 */ 441, 572, 432, 435, 78, 23, 22, 308, 456, 457, + /* 340 */ 453, 453, 25, 25, 24, 24, 24, 24, 436, 26, /* 350 */ 26, 26, 26, 27, 27, 28, 28, 28, 29, 216, - /* 360 */ 304, 514, 156, 331, 488, 360, 363, 364, 331, 353, - /* 370 */ 431, 247, 395, 274, 220, 272, 365, 352, 328, 331, - /* 380 */ 388, 282, 281, 328, 412, 413, 307, 434, 93, 445, - /* 390 */ 451, 214, 434, 93, 328, 530, 150, 1, 438, 403, - /* 400 */ 468, 412, 413, 434, 78, 40, 210, 23, 22, 308, - /* 410 */ 455, 456, 452, 452, 25, 25, 24, 24, 24, 24, - /* 420 */ 194, 26, 26, 26, 26, 27, 27, 28, 28, 28, - /* 430 */ 29, 216, 304, 319, 331, 596, 507, 535, 320, 179, - /* 440 */ 435, 489, 467, 156, 192, 349, 360, 363, 364, 328, - /* 450 */ 414, 536, 415, 416, 435, 595, 546, 365, 434, 71, - /* 460 */ 378, 445, 451, 208, 240, 381, 438, 556, 63, 415, - /* 470 */ 416, 414, 28, 28, 28, 29, 216, 43, 435, 23, - /* 480 */ 22, 308, 455, 456, 452, 452, 25, 25, 24, 24, - /* 490 */ 24, 24, 276, 26, 26, 26, 26, 27, 27, 28, - /* 500 */ 28, 28, 29, 216, 304, 354, 209, 414, 510, 412, - /* 510 */ 413, 135, 426, 331, 412, 413, 398, 217, 66, 333, - /* 520 */ 328, 564, 412, 413, 30, 563, 32, 134, 328, 434, - /* 530 */ 8, 546, 484, 445, 451, 400, 489, 434, 72, 377, - /* 540 */ 435, 485, 603, 63, 598, 494, 414, 372, 469, 337, - /* 550 */ 200, 23, 22, 308, 455, 456, 452, 452, 25, 25, + /* 360 */ 304, 443, 443, 443, 156, 468, 218, 360, 363, 364, + /* 370 */ 331, 247, 395, 398, 217, 349, 331, 30, 365, 32, + /* 380 */ 134, 388, 282, 281, 39, 328, 41, 430, 545, 446, + /* 390 */ 452, 328, 214, 531, 435, 93, 542, 601, 1, 404, + /* 400 */ 435, 93, 413, 414, 495, 40, 536, 23, 22, 308, + /* 410 */ 456, 457, 453, 453, 25, 25, 24, 24, 24, 24, + /* 420 */ 573, 26, 26, 26, 26, 27, 27, 28, 28, 28, + /* 430 */ 29, 216, 304, 276, 331, 179, 508, 490, 210, 547, + /* 440 */ 319, 413, 414, 222, 192, 385, 320, 240, 415, 328, + /* 450 */ 557, 63, 413, 414, 415, 616, 408, 405, 435, 71, + /* 460 */ 415, 446, 452, 611, 572, 28, 28, 28, 29, 216, + /* 470 */ 416, 417, 436, 336, 463, 464, 401, 43, 436, 23, + /* 480 */ 22, 308, 456, 457, 453, 453, 25, 25, 24, 24, + /* 490 */ 24, 24, 495, 26, 26, 26, 26, 27, 27, 28, + /* 500 */ 28, 28, 29, 216, 304, 612, 209, 135, 511, 416, + /* 510 */ 417, 431, 233, 64, 388, 282, 281, 439, 66, 542, + /* 520 */ 416, 417, 413, 414, 156, 214, 403, 360, 363, 364, + /* 530 */ 547, 252, 490, 446, 452, 491, 217, 8, 365, 495, + /* 540 */ 436, 606, 63, 537, 299, 415, 492, 470, 546, 200, + /* 550 */ 196, 23, 22, 308, 456, 457, 453, 453, 25, 25, /* 560 */ 24, 24, 24, 24, 386, 26, 26, 26, 26, 27, - /* 570 */ 27, 28, 28, 28, 29, 216, 304, 415, 416, 476, - /* 580 */ 527, 60, 415, 416, 222, 402, 389, 498, 185, 331, - /* 590 */ 415, 416, 385, 242, 331, 477, 331, 506, 453, 336, - /* 600 */ 462, 463, 414, 490, 328, 445, 451, 414, 491, 328, - /* 610 */ 478, 328, 518, 434, 67, 613, 407, 404, 434, 76, - /* 620 */ 434, 97, 519, 23, 22, 308, 455, 456, 452, 452, + /* 570 */ 27, 28, 28, 28, 29, 216, 304, 477, 254, 354, + /* 580 */ 528, 60, 517, 518, 436, 439, 389, 331, 356, 7, + /* 590 */ 416, 417, 331, 478, 328, 208, 197, 137, 460, 499, + /* 600 */ 447, 448, 328, 435, 9, 446, 452, 328, 479, 485, + /* 610 */ 519, 435, 72, 567, 415, 434, 435, 67, 486, 433, + /* 620 */ 520, 450, 451, 23, 22, 308, 456, 457, 453, 453, /* 630 */ 25, 25, 24, 24, 24, 24, 331, 26, 26, 26, /* 640 */ 26, 27, 27, 28, 28, 28, 29, 216, 304, 331, - /* 650 */ 310, 328, 268, 368, 64, 331, 397, 439, 438, 233, - /* 660 */ 434, 96, 217, 16, 328, 183, 331, 459, 467, 218, - /* 670 */ 328, 446, 447, 434, 101, 214, 154, 445, 451, 434, - /* 680 */ 99, 328, 464, 154, 566, 466, 334, 396, 458, 458, - /* 690 */ 434, 104, 449, 450, 205, 23, 22, 308, 455, 456, - /* 700 */ 452, 452, 25, 25, 24, 24, 24, 24, 331, 26, + /* 650 */ 449, 328, 268, 390, 461, 331, 65, 331, 368, 434, + /* 660 */ 435, 76, 310, 433, 328, 150, 427, 439, 473, 331, + /* 670 */ 328, 499, 328, 435, 97, 29, 216, 446, 452, 435, + /* 680 */ 96, 435, 101, 353, 328, 372, 415, 334, 154, 459, + /* 690 */ 459, 352, 569, 435, 99, 23, 22, 308, 456, 457, + /* 700 */ 453, 453, 25, 25, 24, 24, 24, 24, 331, 26, /* 710 */ 26, 26, 26, 27, 27, 28, 28, 28, 29, 216, - /* 720 */ 304, 448, 331, 328, 390, 56, 438, 331, 435, 331, - /* 730 */ 248, 306, 434, 105, 516, 517, 472, 328, 306, 39, - /* 740 */ 331, 41, 328, 265, 328, 414, 434, 126, 339, 445, - /* 750 */ 451, 434, 128, 434, 59, 328, 334, 250, 458, 458, - /* 760 */ 196, 569, 517, 568, 434, 102, 483, 23, 22, 308, - /* 770 */ 455, 456, 452, 452, 25, 25, 24, 24, 24, 24, + /* 720 */ 304, 331, 248, 328, 264, 56, 334, 331, 459, 459, + /* 730 */ 861, 333, 435, 104, 376, 439, 328, 415, 331, 415, + /* 740 */ 565, 331, 328, 306, 564, 435, 105, 185, 265, 446, + /* 750 */ 452, 435, 126, 328, 570, 518, 328, 334, 377, 459, + /* 760 */ 459, 314, 435, 128, 194, 435, 59, 23, 22, 308, + /* 770 */ 456, 457, 453, 453, 25, 25, 24, 24, 24, 24, /* 780 */ 331, 26, 26, 26, 26, 27, 27, 28, 28, 28, - /* 790 */ 29, 216, 304, 331, 435, 328, 562, 375, 562, 331, - /* 800 */ 264, 858, 606, 303, 434, 77, 197, 137, 328, 406, - /* 810 */ 2, 331, 178, 215, 328, 414, 486, 434, 100, 136, - /* 820 */ 18, 445, 451, 434, 68, 334, 328, 458, 458, 610, - /* 830 */ 926, 460, 926, 65, 414, 434, 98, 314, 528, 23, - /* 840 */ 22, 308, 455, 456, 452, 452, 25, 25, 24, 24, + /* 790 */ 29, 216, 304, 331, 136, 328, 242, 477, 436, 331, + /* 800 */ 350, 331, 609, 303, 435, 102, 201, 137, 328, 415, + /* 810 */ 454, 178, 331, 478, 328, 415, 328, 435, 77, 440, + /* 820 */ 249, 446, 452, 435, 100, 435, 68, 328, 479, 465, + /* 830 */ 341, 613, 931, 484, 931, 415, 435, 98, 467, 23, + /* 840 */ 22, 308, 456, 457, 453, 453, 25, 25, 24, 24, /* 850 */ 24, 24, 331, 26, 26, 26, 26, 27, 27, 28, - /* 860 */ 28, 28, 29, 216, 304, 331, 350, 328, 264, 155, - /* 870 */ 264, 331, 607, 331, 201, 137, 434, 129, 433, 574, - /* 880 */ 328, 414, 432, 414, 331, 414, 328, 498, 328, 434, - /* 890 */ 130, 498, 539, 445, 451, 434, 131, 434, 69, 328, - /* 900 */ 362, 334, 414, 458, 458, 229, 414, 315, 434, 80, - /* 910 */ 259, 23, 33, 308, 455, 456, 452, 452, 25, 25, + /* 860 */ 28, 28, 29, 216, 304, 331, 397, 328, 164, 264, + /* 870 */ 205, 331, 264, 332, 610, 339, 435, 129, 407, 2, + /* 880 */ 328, 322, 175, 331, 415, 214, 328, 415, 415, 435, + /* 890 */ 130, 466, 466, 446, 452, 435, 131, 396, 328, 257, + /* 900 */ 334, 487, 459, 459, 436, 154, 229, 435, 69, 315, + /* 910 */ 258, 23, 33, 308, 456, 457, 453, 453, 25, 25, /* 920 */ 24, 24, 24, 24, 331, 26, 26, 26, 26, 27, - /* 930 */ 27, 28, 28, 28, 29, 216, 304, 331, 264, 328, - /* 940 */ 164, 264, 356, 331, 417, 418, 419, 525, 434, 81, - /* 950 */ 376, 542, 328, 414, 318, 331, 414, 538, 328, 465, - /* 960 */ 465, 434, 70, 322, 175, 445, 451, 434, 82, 433, - /* 970 */ 328, 610, 925, 432, 925, 316, 540, 494, 317, 434, - /* 980 */ 83, 522, 523, 587, 22, 308, 455, 456, 452, 452, + /* 930 */ 27, 28, 28, 28, 29, 216, 304, 331, 497, 328, + /* 940 */ 151, 264, 412, 331, 264, 470, 337, 200, 435, 80, + /* 950 */ 250, 155, 328, 523, 524, 331, 415, 415, 328, 415, + /* 960 */ 306, 435, 81, 533, 532, 446, 452, 435, 70, 47, + /* 970 */ 328, 613, 930, 259, 930, 418, 419, 420, 316, 435, + /* 980 */ 82, 317, 206, 539, 22, 308, 456, 457, 453, 453, /* 990 */ 25, 25, 24, 24, 24, 24, 331, 26, 26, 26, /* 1000 */ 26, 27, 27, 28, 28, 28, 29, 216, 304, 331, - /* 1010 */ 209, 328, 257, 249, 607, 331, 252, 202, 203, 204, - /* 1020 */ 434, 84, 290, 258, 328, 532, 531, 331, 414, 394, - /* 1030 */ 328, 331, 533, 434, 86, 332, 141, 445, 451, 434, - /* 1040 */ 87, 47, 328, 496, 435, 151, 328, 537, 410, 155, - /* 1050 */ 414, 434, 88, 534, 494, 434, 73, 308, 455, 456, - /* 1060 */ 452, 452, 25, 25, 24, 24, 24, 24, 386, 26, + /* 1010 */ 209, 328, 529, 540, 610, 331, 436, 563, 375, 563, + /* 1020 */ 435, 83, 362, 538, 328, 155, 541, 331, 499, 526, + /* 1030 */ 328, 331, 575, 435, 84, 424, 543, 446, 452, 435, + /* 1040 */ 86, 290, 328, 415, 436, 267, 328, 155, 394, 141, + /* 1050 */ 415, 435, 87, 588, 411, 435, 88, 308, 456, 457, + /* 1060 */ 453, 453, 25, 25, 24, 24, 24, 24, 386, 26, /* 1070 */ 26, 26, 26, 27, 27, 28, 28, 28, 29, 216, - /* 1080 */ 35, 338, 286, 3, 331, 411, 331, 327, 413, 423, - /* 1090 */ 382, 422, 276, 254, 420, 35, 338, 335, 3, 328, - /* 1100 */ 414, 328, 327, 413, 414, 313, 276, 414, 434, 74, - /* 1110 */ 434, 89, 335, 331, 421, 340, 424, 331, 425, 331, - /* 1120 */ 267, 414, 155, 142, 289, 471, 287, 325, 328, 326, - /* 1130 */ 340, 414, 328, 414, 328, 581, 276, 434, 90, 144, - /* 1140 */ 471, 434, 91, 434, 92, 38, 37, 15, 331, 277, - /* 1150 */ 133, 414, 441, 276, 36, 329, 330, 6, 436, 440, - /* 1160 */ 38, 37, 504, 328, 206, 414, 47, 414, 414, 36, - /* 1170 */ 329, 330, 434, 75, 440, 198, 367, 214, 155, 583, - /* 1180 */ 235, 236, 237, 143, 239, 348, 343, 580, 46, 243, - /* 1190 */ 442, 442, 442, 443, 444, 9, 584, 276, 435, 7, - /* 1200 */ 172, 414, 294, 331, 288, 442, 442, 442, 443, 444, - /* 1210 */ 9, 295, 414, 35, 338, 567, 3, 155, 328, 480, - /* 1220 */ 327, 413, 331, 170, 276, 571, 244, 434, 17, 169, - /* 1230 */ 335, 19, 171, 245, 414, 412, 413, 328, 331, 414, - /* 1240 */ 585, 276, 575, 576, 151, 54, 434, 94, 340, 493, - /* 1250 */ 497, 499, 346, 328, 276, 262, 414, 529, 471, 263, - /* 1260 */ 246, 20, 434, 95, 414, 414, 414, 231, 548, 414, - /* 1270 */ 414, 437, 414, 471, 414, 393, 291, 281, 38, 37, - /* 1280 */ 588, 305, 54, 414, 232, 269, 214, 36, 329, 330, - /* 1290 */ 219, 271, 440, 188, 189, 273, 275, 292, 42, 280, - /* 1300 */ 414, 380, 383, 512, 384, 283, 414, 440, 149, 399, - /* 1310 */ 414, 414, 608, 605, 414, 302, 414, 414, 284, 414, - /* 1320 */ 414, 285, 579, 442, 442, 442, 443, 444, 9, 48, - /* 1330 */ 590, 293, 296, 414, 297, 602, 414, 414, 442, 442, - /* 1340 */ 442, 251, 351, 481, 177, 414, 414, 414, 495, 414, - /* 1350 */ 414, 501, 253, 255, 609, 502, 357, 312, 521, 515, - /* 1360 */ 107, 525, 226, 225, 520, 260, 369, 158, 227, 524, - /* 1370 */ 557, 526, 300, 549, 550, 551, 373, 278, 159, 301, - /* 1380 */ 543, 371, 160, 51, 207, 559, 560, 161, 140, 379, - /* 1390 */ 570, 163, 117, 391, 181, 392, 118, 119, 120, 121, - /* 1400 */ 321, 123, 577, 599, 600, 55, 58, 586, 601, 604, - /* 1410 */ 62, 323, 408, 103, 224, 111, 174, 238, 427, 199, - /* 1420 */ 654, 655, 656, 146, 147, 454, 457, 34, 182, 180, - /* 1430 */ 461, 470, 473, 474, 195, 5, 492, 475, 148, 479, - /* 1440 */ 44, 106, 10, 11, 138, 508, 509, 500, 223, 49, - /* 1450 */ 361, 108, 152, 266, 109, 50, 110, 157, 258, 370, - /* 1460 */ 184, 558, 139, 113, 151, 162, 279, 115, 374, 14, - /* 1470 */ 573, 116, 165, 52, 12, 366, 166, 53, 578, 167, - /* 1480 */ 582, 168, 114, 124, 122, 561, 565, 13, 61, 125, - /* 1490 */ 597, 173, 298, 187, 589, 405, 936, 611, 936, 936, - /* 1500 */ 401, + /* 1080 */ 35, 338, 286, 3, 331, 270, 331, 327, 414, 421, + /* 1090 */ 382, 318, 276, 422, 325, 35, 338, 335, 3, 328, + /* 1100 */ 423, 328, 327, 414, 142, 144, 276, 415, 435, 73, + /* 1110 */ 435, 74, 335, 331, 6, 340, 425, 331, 326, 331, + /* 1120 */ 367, 415, 155, 437, 289, 472, 287, 274, 328, 272, + /* 1130 */ 340, 415, 328, 47, 328, 277, 276, 435, 89, 348, + /* 1140 */ 472, 435, 90, 435, 91, 38, 37, 243, 331, 582, + /* 1150 */ 244, 415, 426, 276, 36, 329, 330, 46, 245, 441, + /* 1160 */ 38, 37, 505, 328, 202, 203, 204, 415, 415, 36, + /* 1170 */ 329, 330, 435, 92, 441, 198, 568, 214, 155, 584, + /* 1180 */ 235, 236, 237, 143, 239, 346, 133, 581, 438, 246, + /* 1190 */ 443, 443, 443, 444, 445, 10, 585, 276, 20, 42, + /* 1200 */ 172, 415, 294, 331, 288, 443, 443, 443, 444, 445, + /* 1210 */ 10, 295, 415, 35, 338, 219, 3, 149, 328, 482, + /* 1220 */ 327, 414, 331, 170, 276, 572, 48, 435, 75, 169, + /* 1230 */ 335, 19, 171, 251, 442, 413, 414, 328, 331, 415, + /* 1240 */ 586, 343, 276, 177, 351, 496, 435, 17, 340, 415, + /* 1250 */ 481, 253, 255, 328, 276, 502, 415, 415, 472, 331, + /* 1260 */ 503, 357, 435, 94, 576, 415, 151, 231, 312, 415, + /* 1270 */ 577, 516, 54, 472, 328, 393, 291, 281, 38, 37, + /* 1280 */ 494, 305, 521, 435, 95, 232, 214, 36, 329, 330, + /* 1290 */ 526, 498, 441, 188, 189, 415, 500, 292, 522, 262, + /* 1300 */ 530, 260, 263, 513, 549, 269, 415, 441, 589, 400, + /* 1310 */ 54, 415, 525, 527, 415, 415, 271, 415, 273, 415, + /* 1320 */ 415, 275, 280, 443, 443, 443, 444, 445, 10, 107, + /* 1330 */ 380, 415, 383, 415, 384, 283, 415, 415, 443, 443, + /* 1340 */ 443, 284, 285, 580, 300, 415, 591, 415, 293, 415, + /* 1350 */ 415, 296, 297, 605, 226, 550, 415, 415, 415, 225, + /* 1360 */ 608, 415, 302, 415, 551, 227, 415, 415, 415, 301, + /* 1370 */ 544, 552, 369, 158, 373, 558, 159, 278, 371, 160, + /* 1380 */ 51, 207, 560, 561, 161, 140, 379, 117, 571, 163, + /* 1390 */ 391, 392, 181, 180, 321, 602, 578, 118, 119, 120, + /* 1400 */ 121, 123, 55, 587, 58, 603, 604, 607, 62, 174, + /* 1410 */ 103, 224, 111, 409, 238, 428, 199, 323, 657, 658, + /* 1420 */ 659, 146, 147, 455, 458, 34, 474, 462, 471, 182, + /* 1430 */ 195, 148, 475, 476, 480, 5, 12, 493, 44, 11, + /* 1440 */ 106, 138, 509, 510, 501, 223, 49, 361, 108, 109, + /* 1450 */ 152, 266, 50, 110, 157, 258, 370, 184, 559, 139, + /* 1460 */ 151, 113, 279, 162, 115, 374, 15, 574, 116, 165, + /* 1470 */ 52, 13, 366, 579, 53, 167, 168, 166, 583, 124, + /* 1480 */ 114, 122, 562, 566, 14, 61, 599, 600, 125, 173, + /* 1490 */ 298, 590, 187, 406, 941, 614, 941, 402, }; static const YYCODETYPE yy_lookahead[] = { /* 0 */ 19, 142, 143, 144, 145, 24, 116, 26, 75, 76, /* 10 */ 77, 78, 25, 80, 81, 82, 83, 84, 85, 86, /* 20 */ 87, 88, 89, 90, 26, 27, 160, 26, 27, 48, @@ -84433,290 +84722,289 @@ /* 100 */ 19, 48, 49, 150, 174, 52, 119, 166, 110, 84, /* 110 */ 85, 86, 87, 88, 89, 90, 26, 27, 165, 66, /* 120 */ 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, /* 130 */ 77, 78, 186, 80, 81, 82, 83, 84, 85, 86, /* 140 */ 87, 88, 89, 90, 19, 90, 205, 95, 84, 85, - /* 150 */ 26, 96, 97, 98, 99, 100, 101, 102, 94, 95, - /* 160 */ 181, 182, 150, 222, 109, 224, 225, 188, 104, 105, + /* 150 */ 186, 96, 97, 98, 99, 100, 101, 102, 94, 95, + /* 160 */ 195, 97, 150, 222, 109, 224, 225, 26, 104, 105, /* 170 */ 217, 90, 120, 48, 49, 50, 86, 165, 97, 98, /* 180 */ 99, 100, 101, 102, 94, 95, 174, 175, 1, 2, /* 190 */ 109, 66, 67, 68, 69, 70, 71, 72, 73, 74, - /* 200 */ 75, 76, 77, 78, 12, 80, 81, 82, 83, 84, - /* 210 */ 85, 86, 87, 88, 89, 90, 19, 11, 94, 150, - /* 220 */ 28, 24, 186, 150, 222, 150, 224, 225, 216, 116, - /* 230 */ 161, 162, 150, 221, 165, 43, 195, 45, 165, 191, - /* 240 */ 165, 128, 160, 170, 171, 48, 49, 165, 163, 174, - /* 250 */ 175, 166, 167, 168, 185, 186, 174, 175, 169, 170, - /* 260 */ 171, 55, 64, 66, 67, 68, 69, 70, 71, 72, + /* 200 */ 75, 76, 77, 78, 191, 80, 81, 82, 83, 84, + /* 210 */ 85, 86, 87, 88, 89, 90, 19, 116, 35, 150, + /* 220 */ 155, 24, 208, 150, 222, 150, 224, 225, 216, 128, + /* 230 */ 161, 162, 150, 221, 165, 94, 23, 150, 165, 56, + /* 240 */ 165, 197, 160, 170, 171, 48, 49, 165, 204, 174, + /* 250 */ 175, 22, 165, 24, 185, 186, 174, 175, 169, 170, + /* 260 */ 171, 174, 175, 66, 67, 68, 69, 70, 71, 72, /* 270 */ 73, 74, 75, 76, 77, 78, 194, 80, 81, 82, /* 280 */ 83, 84, 85, 86, 87, 88, 89, 90, 19, 214, - /* 290 */ 215, 25, 94, 172, 173, 150, 98, 148, 216, 173, - /* 300 */ 146, 147, 181, 221, 231, 232, 152, 181, 154, 150, - /* 310 */ 165, 105, 106, 107, 160, 89, 90, 48, 49, 174, - /* 320 */ 175, 232, 116, 112, 165, 114, 115, 129, 130, 131, - /* 330 */ 55, 16, 196, 174, 175, 66, 67, 68, 69, 70, + /* 290 */ 215, 108, 150, 25, 229, 150, 64, 148, 216, 234, + /* 300 */ 146, 147, 215, 221, 231, 232, 152, 165, 154, 150, + /* 310 */ 165, 196, 170, 171, 160, 181, 182, 48, 49, 174, + /* 320 */ 175, 232, 188, 165, 165, 112, 94, 114, 115, 166, + /* 330 */ 98, 55, 174, 174, 175, 66, 67, 68, 69, 70, /* 340 */ 71, 72, 73, 74, 75, 76, 77, 78, 194, 80, /* 350 */ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - /* 360 */ 19, 165, 96, 150, 208, 99, 100, 101, 150, 19, - /* 370 */ 174, 226, 218, 58, 215, 60, 110, 27, 165, 150, - /* 380 */ 105, 106, 107, 165, 26, 27, 155, 174, 175, 48, - /* 390 */ 49, 116, 174, 175, 165, 183, 24, 22, 26, 245, - /* 400 */ 166, 26, 27, 174, 175, 136, 160, 66, 67, 68, + /* 360 */ 19, 129, 130, 131, 96, 84, 85, 99, 100, 101, + /* 370 */ 150, 226, 218, 231, 232, 216, 150, 222, 110, 224, + /* 380 */ 225, 105, 106, 107, 135, 165, 137, 172, 173, 48, + /* 390 */ 49, 165, 116, 183, 174, 175, 181, 242, 22, 245, + /* 400 */ 174, 175, 26, 27, 166, 136, 183, 66, 67, 68, /* 410 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - /* 420 */ 160, 80, 81, 82, 83, 84, 85, 86, 87, 88, - /* 430 */ 89, 90, 19, 220, 150, 150, 23, 183, 220, 23, - /* 440 */ 194, 25, 84, 96, 160, 216, 99, 100, 101, 165, - /* 450 */ 165, 183, 94, 95, 194, 170, 150, 110, 174, 175, - /* 460 */ 229, 48, 49, 236, 158, 234, 94, 161, 162, 94, - /* 470 */ 95, 165, 86, 87, 88, 89, 90, 136, 194, 66, + /* 420 */ 11, 80, 81, 82, 83, 84, 85, 86, 87, 88, + /* 430 */ 89, 90, 19, 150, 150, 23, 23, 25, 160, 150, + /* 440 */ 220, 26, 27, 205, 160, 150, 220, 158, 165, 165, + /* 450 */ 161, 162, 26, 27, 165, 0, 1, 2, 174, 175, + /* 460 */ 165, 48, 49, 23, 55, 86, 87, 88, 89, 90, + /* 470 */ 94, 95, 194, 169, 170, 171, 193, 136, 194, 66, /* 480 */ 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - /* 490 */ 77, 78, 150, 80, 81, 82, 83, 84, 85, 86, - /* 500 */ 87, 88, 89, 90, 19, 150, 160, 165, 23, 26, - /* 510 */ 27, 95, 153, 150, 26, 27, 231, 232, 22, 19, - /* 520 */ 165, 29, 26, 27, 222, 33, 224, 225, 165, 174, - /* 530 */ 175, 150, 31, 48, 49, 193, 120, 174, 175, 47, - /* 540 */ 194, 40, 161, 162, 242, 166, 165, 237, 166, 167, - /* 550 */ 168, 66, 67, 68, 69, 70, 71, 72, 73, 74, + /* 490 */ 77, 78, 166, 80, 81, 82, 83, 84, 85, 86, + /* 500 */ 87, 88, 89, 90, 19, 65, 160, 95, 23, 94, + /* 510 */ 95, 173, 217, 22, 105, 106, 107, 26, 22, 181, + /* 520 */ 94, 95, 26, 27, 96, 116, 243, 99, 100, 101, + /* 530 */ 150, 205, 120, 48, 49, 120, 232, 22, 110, 166, + /* 540 */ 194, 161, 162, 183, 163, 165, 120, 166, 167, 168, + /* 550 */ 160, 66, 67, 68, 69, 70, 71, 72, 73, 74, /* 560 */ 75, 76, 77, 78, 218, 80, 81, 82, 83, 84, - /* 570 */ 85, 86, 87, 88, 89, 90, 19, 94, 95, 12, - /* 580 */ 23, 235, 94, 95, 205, 243, 240, 150, 196, 150, - /* 590 */ 94, 95, 150, 198, 150, 28, 150, 23, 98, 169, - /* 600 */ 170, 171, 165, 120, 165, 48, 49, 165, 120, 165, - /* 610 */ 43, 165, 45, 174, 175, 0, 1, 2, 174, 175, - /* 620 */ 174, 175, 55, 66, 67, 68, 69, 70, 71, 72, + /* 570 */ 85, 86, 87, 88, 89, 90, 19, 12, 205, 150, + /* 580 */ 23, 235, 190, 191, 194, 94, 240, 150, 86, 74, + /* 590 */ 94, 95, 150, 28, 165, 236, 206, 207, 23, 150, + /* 600 */ 48, 49, 165, 174, 175, 48, 49, 165, 43, 31, + /* 610 */ 45, 174, 175, 21, 165, 113, 174, 175, 40, 117, + /* 620 */ 55, 69, 70, 66, 67, 68, 69, 70, 71, 72, /* 630 */ 73, 74, 75, 76, 77, 78, 150, 80, 81, 82, /* 640 */ 83, 84, 85, 86, 87, 88, 89, 90, 19, 150, - /* 650 */ 213, 165, 23, 19, 22, 150, 97, 166, 26, 217, - /* 660 */ 174, 175, 232, 22, 165, 24, 150, 23, 84, 85, - /* 670 */ 165, 48, 49, 174, 175, 116, 49, 48, 49, 174, - /* 680 */ 175, 165, 233, 49, 21, 233, 112, 128, 114, 115, - /* 690 */ 174, 175, 69, 70, 160, 66, 67, 68, 69, 70, + /* 650 */ 98, 165, 23, 61, 23, 150, 25, 150, 19, 113, + /* 660 */ 174, 175, 213, 117, 165, 24, 153, 26, 23, 150, + /* 670 */ 165, 150, 165, 174, 175, 89, 90, 48, 49, 174, + /* 680 */ 175, 174, 175, 19, 165, 237, 165, 112, 49, 114, + /* 690 */ 115, 27, 100, 174, 175, 66, 67, 68, 69, 70, /* 700 */ 71, 72, 73, 74, 75, 76, 77, 78, 150, 80, /* 710 */ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - /* 720 */ 19, 98, 150, 165, 61, 24, 94, 150, 194, 150, - /* 730 */ 150, 104, 174, 175, 190, 191, 23, 165, 104, 135, - /* 740 */ 150, 137, 165, 109, 165, 165, 174, 175, 228, 48, - /* 750 */ 49, 174, 175, 174, 175, 165, 112, 209, 114, 115, - /* 760 */ 160, 190, 191, 100, 174, 175, 177, 66, 67, 68, + /* 720 */ 19, 150, 150, 165, 150, 24, 112, 150, 114, 115, + /* 730 */ 138, 19, 174, 175, 213, 94, 165, 165, 150, 165, + /* 740 */ 29, 150, 165, 104, 33, 174, 175, 196, 109, 48, + /* 750 */ 49, 174, 175, 165, 190, 191, 165, 112, 47, 114, + /* 760 */ 115, 187, 174, 175, 160, 174, 175, 66, 67, 68, /* 770 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, /* 780 */ 150, 80, 81, 82, 83, 84, 85, 86, 87, 88, - /* 790 */ 89, 90, 19, 150, 194, 165, 105, 106, 107, 150, - /* 800 */ 150, 138, 248, 249, 174, 175, 206, 207, 165, 144, - /* 810 */ 145, 150, 23, 197, 165, 165, 177, 174, 175, 150, - /* 820 */ 204, 48, 49, 174, 175, 112, 165, 114, 115, 22, - /* 830 */ 23, 23, 25, 25, 165, 174, 175, 187, 182, 66, + /* 790 */ 89, 90, 19, 150, 150, 165, 198, 12, 194, 150, + /* 800 */ 150, 150, 248, 249, 174, 175, 206, 207, 165, 165, + /* 810 */ 98, 23, 150, 28, 165, 165, 165, 174, 175, 166, + /* 820 */ 150, 48, 49, 174, 175, 174, 175, 165, 43, 233, + /* 830 */ 45, 22, 23, 177, 25, 165, 174, 175, 233, 66, /* 840 */ 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, /* 850 */ 77, 78, 150, 80, 81, 82, 83, 84, 85, 86, - /* 860 */ 87, 88, 89, 90, 19, 150, 150, 165, 150, 25, - /* 870 */ 150, 150, 65, 150, 206, 207, 174, 175, 113, 199, - /* 880 */ 165, 165, 117, 165, 150, 165, 165, 150, 165, 174, - /* 890 */ 175, 150, 166, 48, 49, 174, 175, 174, 175, 165, - /* 900 */ 178, 112, 165, 114, 115, 187, 165, 187, 174, 175, - /* 910 */ 177, 66, 67, 68, 69, 70, 71, 72, 73, 74, + /* 860 */ 87, 88, 89, 90, 19, 150, 97, 165, 25, 150, + /* 870 */ 160, 150, 150, 150, 65, 228, 174, 175, 144, 145, + /* 880 */ 165, 246, 247, 150, 165, 116, 165, 165, 165, 174, + /* 890 */ 175, 129, 130, 48, 49, 174, 175, 128, 165, 98, + /* 900 */ 112, 177, 114, 115, 194, 49, 187, 174, 175, 187, + /* 910 */ 109, 66, 67, 68, 69, 70, 71, 72, 73, 74, /* 920 */ 75, 76, 77, 78, 150, 80, 81, 82, 83, 84, - /* 930 */ 85, 86, 87, 88, 89, 90, 19, 150, 150, 165, - /* 940 */ 25, 150, 86, 150, 7, 8, 9, 103, 174, 175, - /* 950 */ 213, 166, 165, 165, 213, 150, 165, 177, 165, 129, - /* 960 */ 130, 174, 175, 246, 247, 48, 49, 174, 175, 113, - /* 970 */ 165, 22, 23, 117, 25, 187, 177, 166, 187, 174, - /* 980 */ 175, 7, 8, 199, 67, 68, 69, 70, 71, 72, + /* 930 */ 85, 86, 87, 88, 89, 90, 19, 150, 23, 165, + /* 940 */ 25, 150, 150, 150, 150, 166, 167, 168, 174, 175, + /* 950 */ 209, 25, 165, 7, 8, 150, 165, 165, 165, 165, + /* 960 */ 104, 174, 175, 97, 98, 48, 49, 174, 175, 126, + /* 970 */ 165, 22, 23, 177, 25, 7, 8, 9, 187, 174, + /* 980 */ 175, 187, 160, 177, 67, 68, 69, 70, 71, 72, /* 990 */ 73, 74, 75, 76, 77, 78, 150, 80, 81, 82, /* 1000 */ 83, 84, 85, 86, 87, 88, 89, 90, 19, 150, - /* 1010 */ 160, 165, 98, 150, 65, 150, 205, 105, 106, 107, - /* 1020 */ 174, 175, 209, 109, 165, 97, 98, 150, 165, 209, - /* 1030 */ 165, 150, 35, 174, 175, 150, 6, 48, 49, 174, - /* 1040 */ 175, 126, 165, 23, 194, 25, 165, 23, 149, 25, - /* 1050 */ 165, 174, 175, 56, 166, 174, 175, 68, 69, 70, + /* 1010 */ 160, 165, 182, 166, 65, 150, 194, 105, 106, 107, + /* 1020 */ 174, 175, 178, 23, 165, 25, 177, 150, 150, 103, + /* 1030 */ 165, 150, 199, 174, 175, 150, 166, 48, 49, 174, + /* 1040 */ 175, 209, 165, 165, 194, 23, 165, 25, 209, 6, + /* 1050 */ 165, 174, 175, 199, 149, 174, 175, 68, 69, 70, /* 1060 */ 71, 72, 73, 74, 75, 76, 77, 78, 218, 80, /* 1070 */ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - /* 1080 */ 19, 20, 16, 22, 150, 150, 150, 26, 27, 150, - /* 1090 */ 240, 13, 150, 205, 149, 19, 20, 36, 22, 165, - /* 1100 */ 165, 165, 26, 27, 165, 108, 150, 165, 174, 175, - /* 1110 */ 174, 175, 36, 150, 149, 54, 150, 150, 150, 150, - /* 1120 */ 23, 165, 25, 151, 58, 64, 60, 149, 165, 159, - /* 1130 */ 54, 165, 165, 165, 165, 193, 150, 174, 175, 151, - /* 1140 */ 64, 174, 175, 174, 175, 84, 85, 22, 150, 193, - /* 1150 */ 150, 165, 150, 150, 93, 94, 95, 25, 194, 98, - /* 1160 */ 84, 85, 86, 165, 160, 165, 126, 165, 165, 93, + /* 1080 */ 19, 20, 16, 22, 150, 16, 150, 26, 27, 149, + /* 1090 */ 240, 213, 150, 149, 149, 19, 20, 36, 22, 165, + /* 1100 */ 13, 165, 26, 27, 151, 151, 150, 165, 174, 175, + /* 1110 */ 174, 175, 36, 150, 25, 54, 150, 150, 159, 150, + /* 1120 */ 23, 165, 25, 194, 58, 64, 60, 58, 165, 60, + /* 1130 */ 54, 165, 165, 126, 165, 193, 150, 174, 175, 123, + /* 1140 */ 64, 174, 175, 174, 175, 84, 85, 199, 150, 193, + /* 1150 */ 200, 165, 150, 150, 93, 94, 95, 124, 201, 98, + /* 1160 */ 84, 85, 86, 165, 105, 106, 107, 165, 165, 93, /* 1170 */ 94, 95, 174, 175, 98, 5, 23, 116, 25, 193, - /* 1180 */ 10, 11, 12, 13, 14, 123, 150, 17, 124, 199, - /* 1190 */ 129, 130, 131, 132, 133, 134, 193, 150, 194, 74, + /* 1180 */ 10, 11, 12, 13, 14, 122, 150, 17, 203, 202, + /* 1190 */ 129, 130, 131, 132, 133, 134, 193, 150, 125, 135, /* 1200 */ 30, 165, 32, 150, 138, 129, 130, 131, 132, 133, - /* 1210 */ 134, 41, 165, 19, 20, 23, 22, 25, 165, 150, - /* 1220 */ 26, 27, 150, 53, 150, 55, 200, 174, 175, 59, - /* 1230 */ 36, 22, 62, 201, 165, 26, 27, 165, 150, 165, - /* 1240 */ 193, 150, 23, 23, 25, 25, 174, 175, 54, 150, - /* 1250 */ 150, 150, 122, 165, 150, 150, 165, 150, 64, 150, - /* 1260 */ 202, 125, 174, 175, 165, 165, 165, 193, 150, 165, - /* 1270 */ 165, 203, 165, 64, 165, 105, 106, 107, 84, 85, - /* 1280 */ 23, 111, 25, 165, 193, 150, 116, 93, 94, 95, - /* 1290 */ 227, 150, 98, 84, 85, 150, 150, 193, 135, 150, - /* 1300 */ 165, 150, 150, 94, 150, 150, 165, 98, 118, 139, - /* 1310 */ 165, 165, 23, 23, 165, 25, 165, 165, 150, 165, - /* 1320 */ 165, 150, 150, 129, 130, 131, 132, 133, 134, 104, - /* 1330 */ 150, 150, 150, 165, 150, 150, 165, 165, 129, 130, - /* 1340 */ 131, 210, 121, 157, 157, 165, 165, 165, 211, 165, - /* 1350 */ 165, 211, 210, 210, 65, 211, 104, 46, 184, 176, - /* 1360 */ 22, 103, 90, 230, 176, 176, 18, 156, 230, 178, - /* 1370 */ 157, 176, 179, 176, 176, 176, 44, 238, 156, 179, - /* 1380 */ 184, 157, 156, 135, 157, 157, 239, 156, 66, 157, - /* 1390 */ 189, 189, 22, 157, 219, 18, 192, 192, 192, 192, - /* 1400 */ 157, 189, 199, 39, 157, 241, 241, 199, 157, 37, - /* 1410 */ 244, 250, 1, 164, 180, 180, 247, 15, 23, 22, - /* 1420 */ 118, 118, 118, 118, 118, 98, 113, 22, 22, 219, - /* 1430 */ 23, 23, 11, 23, 22, 34, 120, 23, 25, 23, - /* 1440 */ 25, 22, 25, 34, 118, 23, 23, 27, 50, 22, - /* 1450 */ 50, 22, 34, 23, 22, 22, 22, 102, 109, 19, - /* 1460 */ 24, 20, 38, 104, 25, 104, 138, 22, 42, 5, - /* 1470 */ 1, 108, 127, 74, 22, 50, 119, 74, 1, 16, - /* 1480 */ 20, 121, 51, 108, 119, 57, 51, 22, 16, 127, - /* 1490 */ 23, 15, 140, 22, 128, 3, 251, 4, 251, 251, - /* 1500 */ 63, + /* 1210 */ 134, 41, 165, 19, 20, 227, 22, 118, 165, 157, + /* 1220 */ 26, 27, 150, 53, 150, 55, 104, 174, 175, 59, + /* 1230 */ 36, 22, 62, 210, 150, 26, 27, 165, 150, 165, + /* 1240 */ 193, 150, 150, 157, 121, 211, 174, 175, 54, 165, + /* 1250 */ 150, 210, 210, 165, 150, 211, 165, 165, 64, 150, + /* 1260 */ 211, 104, 174, 175, 23, 165, 25, 193, 46, 165, + /* 1270 */ 23, 176, 25, 64, 165, 105, 106, 107, 84, 85, + /* 1280 */ 150, 111, 176, 174, 175, 193, 116, 93, 94, 95, + /* 1290 */ 103, 150, 98, 84, 85, 165, 150, 193, 184, 150, + /* 1300 */ 150, 176, 150, 94, 150, 150, 165, 98, 23, 139, + /* 1310 */ 25, 165, 178, 176, 165, 165, 150, 165, 150, 165, + /* 1320 */ 165, 150, 150, 129, 130, 131, 132, 133, 134, 22, + /* 1330 */ 150, 165, 150, 165, 150, 150, 165, 165, 129, 130, + /* 1340 */ 131, 150, 150, 150, 179, 165, 150, 165, 150, 165, + /* 1350 */ 165, 150, 150, 150, 90, 176, 165, 165, 165, 230, + /* 1360 */ 23, 165, 25, 165, 176, 230, 165, 165, 165, 179, + /* 1370 */ 184, 176, 18, 156, 44, 157, 156, 238, 157, 156, + /* 1380 */ 135, 157, 157, 239, 156, 66, 157, 22, 189, 189, + /* 1390 */ 157, 18, 219, 219, 157, 39, 199, 192, 192, 192, + /* 1400 */ 192, 189, 241, 199, 241, 157, 157, 37, 244, 247, + /* 1410 */ 164, 180, 180, 1, 15, 23, 22, 250, 118, 118, + /* 1420 */ 118, 118, 118, 98, 113, 22, 11, 23, 23, 22, + /* 1430 */ 22, 25, 23, 23, 23, 34, 34, 120, 25, 25, + /* 1440 */ 22, 118, 23, 23, 27, 50, 22, 50, 22, 22, + /* 1450 */ 34, 23, 22, 22, 102, 109, 19, 24, 20, 38, + /* 1460 */ 25, 104, 138, 104, 22, 42, 5, 1, 108, 127, + /* 1470 */ 74, 22, 50, 1, 74, 16, 121, 119, 20, 108, + /* 1480 */ 51, 119, 57, 51, 22, 16, 23, 23, 127, 15, + /* 1490 */ 140, 128, 22, 3, 251, 4, 251, 63, }; #define YY_SHIFT_USE_DFLT (-111) -#define YY_SHIFT_MAX 405 +#define YY_SHIFT_MAX 406 static const short yy_shift_ofst[] = { - /* 0 */ 187, 1061, 1170, 1061, 1194, 1194, -2, 64, -19, 1194, - /* 10 */ 1194, 1194, 1194, 1194, 275, 358, 1, 125, 1076, 1194, + /* 0 */ 187, 1061, 1170, 1061, 1194, 1194, -2, 64, 64, -19, + /* 10 */ 1194, 1194, 1194, 1194, 1194, 276, 1, 125, 1076, 1194, /* 20 */ 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, /* 30 */ 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, /* 40 */ 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, /* 50 */ 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, -48, - /* 60 */ 206, 1, 1, 124, 584, 584, -110, 53, 197, 269, + /* 60 */ 409, 1, 1, 141, 281, 281, -110, 53, 197, 269, /* 70 */ 341, 413, 485, 557, 629, 701, 773, 845, 773, 773, /* 80 */ 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, /* 90 */ 773, 773, 773, 773, 773, 773, 917, 989, 989, -67, - /* 100 */ -67, -1, -1, 55, 25, 386, 1, 1, 1, 1, - /* 110 */ 1, 634, 663, 1, 1, 1, 1, 1, 1, 1, - /* 120 */ 1, 1, 1, 1, 1, 1, 226, 124, -17, -111, - /* 130 */ -111, -111, 1209, 81, 375, 483, 488, 496, 90, 567, - /* 140 */ 567, 1, 1, 1, 1, 1, 1, 1, 1, 1, + /* 100 */ -67, -1, -1, 55, 25, 379, 1, 1, 1, 1, + /* 110 */ 1, 639, 592, 1, 1, 1, 1, 1, 1, 1, + /* 120 */ 1, 1, 1, 1, 1, 1, 586, 141, -17, -111, + /* 130 */ -111, -111, 1209, 81, 376, 415, 426, 496, 90, 565, + /* 140 */ 565, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 150 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 160 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - /* 170 */ 1, 1, 1, 1, 807, 949, 615, 372, 372, 372, - /* 180 */ 559, 113, -110, -110, -110, -111, -111, -111, 198, 198, - /* 190 */ 266, 347, 574, 644, 713, 192, 789, 416, 937, 856, - /* 200 */ 632, 52, 997, 997, 997, 211, 211, 492, 691, 211, - /* 210 */ 211, 211, 211, 641, 765, -13, 124, 830, 830, 604, - /* 220 */ 501, 501, 350, 501, 627, 501, 124, 501, 124, 844, - /* 230 */ 915, 350, 350, 915, 1030, 1030, 1030, 1030, 1078, 1078, - /* 240 */ 1132, -110, 1040, 1062, 1064, 1130, 1136, 1163, 1190, 1190, - /* 250 */ 1225, 1221, 1225, 1221, 1225, 1221, 1252, 1252, 1311, 1252, - /* 260 */ 1258, 1252, 1338, 1272, 1272, 1311, 1252, 1252, 1252, 1338, - /* 270 */ 1348, 1190, 1348, 1190, 1348, 1190, 1190, 1332, 1248, 1348, - /* 280 */ 1190, 1322, 1322, 1370, 1040, 1190, 1377, 1377, 1377, 1377, - /* 290 */ 1040, 1322, 1370, 1190, 1364, 1364, 1190, 1190, 1372, -111, - /* 300 */ -111, -111, -111, -111, 623, 1066, 912, 315, 500, 808, - /* 310 */ 1020, 914, 974, 928, 1024, 1097, 1153, 1192, 1219, 1220, - /* 320 */ 1257, 1125, 1290, 1289, 1411, 1402, 1395, 1397, 1302, 1303, - /* 330 */ 1304, 1305, 1306, 1327, 1313, 1405, 1407, 1408, 1406, 1421, - /* 340 */ 1412, 1410, 1413, 1414, 1416, 1415, 1401, 1417, 1409, 1415, - /* 350 */ 1316, 1419, 1418, 1420, 1326, 1422, 1423, 1424, 1398, 1427, - /* 360 */ 1400, 1429, 1430, 1432, 1433, 1425, 1434, 1355, 1349, 1440, - /* 370 */ 1441, 1436, 1359, 1426, 1428, 1431, 1439, 1435, 1328, 1361, - /* 380 */ 1445, 1464, 1469, 1363, 1399, 1403, 1345, 1452, 1357, 1477, - /* 390 */ 1463, 1360, 1460, 1365, 1375, 1362, 1465, 1366, 1467, 1472, - /* 400 */ 1437, 1476, 1352, 1471, 1492, 1493, + /* 170 */ 1, 1, 1, 1, 809, 949, 455, 641, 641, 641, + /* 180 */ 769, 101, -110, -110, -110, -111, -111, -111, 232, 232, + /* 190 */ 268, 428, 213, 575, 645, 785, 788, 412, 968, 502, + /* 200 */ 491, 52, 183, 183, 183, 614, 614, 711, 912, 614, + /* 210 */ 614, 614, 614, 229, 546, -13, 141, 762, 762, 249, + /* 220 */ 578, 578, 664, 578, 856, 578, 141, 578, 141, 926, + /* 230 */ 843, 664, 664, 843, 1043, 1043, 1043, 1043, 1087, 1087, + /* 240 */ 1089, -110, 1007, 1016, 1033, 1063, 1073, 1064, 1099, 1099, + /* 250 */ 1122, 1123, 1122, 1123, 1122, 1123, 1157, 1157, 1222, 1157, + /* 260 */ 1187, 1157, 1307, 1264, 1264, 1222, 1157, 1157, 1157, 1307, + /* 270 */ 1354, 1099, 1354, 1099, 1354, 1099, 1099, 1330, 1245, 1354, + /* 280 */ 1099, 1319, 1319, 1365, 1007, 1099, 1373, 1373, 1373, 1373, + /* 290 */ 1007, 1319, 1365, 1099, 1356, 1356, 1099, 1099, 1370, -111, + /* 300 */ -111, -111, -111, -111, 552, 1066, 1059, 1069, 712, 631, + /* 310 */ 915, 801, 946, 866, 1000, 1022, 1097, 1153, 1241, 1247, + /* 320 */ 1285, 515, 1337, 440, 1412, 1399, 1392, 1394, 1300, 1301, + /* 330 */ 1302, 1303, 1304, 1325, 1311, 1403, 1404, 1405, 1407, 1415, + /* 340 */ 1408, 1409, 1406, 1410, 1411, 1413, 1401, 1414, 1402, 1413, + /* 350 */ 1317, 1418, 1416, 1417, 1323, 1419, 1420, 1421, 1395, 1424, + /* 360 */ 1397, 1426, 1428, 1427, 1430, 1422, 1431, 1352, 1346, 1437, + /* 370 */ 1438, 1433, 1357, 1423, 1425, 1429, 1435, 1432, 1324, 1359, + /* 380 */ 1442, 1461, 1466, 1360, 1396, 1400, 1342, 1449, 1358, 1472, + /* 390 */ 1459, 1355, 1458, 1362, 1371, 1361, 1462, 1363, 1463, 1464, + /* 400 */ 1469, 1434, 1474, 1350, 1470, 1490, 1491, }; #define YY_REDUCE_USE_DFLT (-180) #define YY_REDUCE_MAX 303 static const short yy_reduce_ofst[] = { - /* 0 */ -141, 82, 154, 284, 12, 75, 69, 73, -59, 145, - /* 10 */ 159, 229, 213, 218, 346, 285, 306, 302, 355, 363, - /* 20 */ 439, 444, 446, 486, 499, 505, 516, 558, 572, 577, - /* 30 */ 579, 590, 630, 643, 649, 661, 702, 715, 721, 723, - /* 40 */ 734, 774, 787, 793, 805, 846, 859, 865, 877, 881, - /* 50 */ 934, 936, 963, 967, 969, 998, 1053, 1072, 1088, -179, - /* 60 */ 850, 342, 381, 85, 89, 430, 600, 2, 2, 2, + /* 0 */ -141, 82, 154, 284, 12, 75, 69, 73, 142, -59, + /* 10 */ 145, 87, 159, 220, 226, 346, 289, 155, 429, 437, + /* 20 */ 442, 486, 499, 505, 507, 519, 558, 571, 577, 588, + /* 30 */ 591, 630, 643, 649, 651, 662, 702, 715, 721, 733, + /* 40 */ 774, 787, 793, 805, 846, 859, 865, 877, 881, 934, + /* 50 */ 936, 963, 967, 969, 998, 1053, 1072, 1088, 1109, -179, + /* 60 */ 850, 283, 380, 381, 89, 304, 390, 2, 2, 2, /* 70 */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 80 */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 90 */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - /* 100 */ 2, 2, 2, 121, 2, 2, 437, 650, 718, 720, - /* 110 */ 788, -21, 231, 956, 737, 791, -47, 741, 942, 986, - /* 120 */ 1003, 1047, 1074, 1091, 442, 1104, 2, 382, 2, 2, - /* 130 */ 2, 2, 196, 126, 580, 669, 716, 863, 885, 544, - /* 140 */ 571, 935, 939, 966, 968, 1000, 885, 1002, 1036, 1069, - /* 150 */ 1099, 1100, 1101, 1105, 1107, 1109, 1118, 1135, 1141, 1145, - /* 160 */ 1146, 1149, 1151, 1152, 1154, 1155, 1168, 1171, 1172, 1180, - /* 170 */ 1181, 1182, 1184, 1185, 554, 554, 665, 379, 811, 888, - /* 180 */ -134, 246, 260, 534, 1004, 616, 668, 717, -98, -70, - /* 190 */ -54, 36, 41, 41, 41, 48, 41, 156, 149, 136, - /* 200 */ 234, 156, 212, 254, 268, 41, 41, 227, 310, 41, - /* 210 */ 41, 41, 41, 359, 392, 395, 491, 449, 452, 520, - /* 220 */ 589, 639, 548, 733, 656, 780, 726, 799, 785, 722, - /* 230 */ 680, 813, 820, 784, 899, 945, 965, 978, 972, 988, - /* 240 */ 970, 964, 990, 1026, 1032, 1058, 1068, 1063, 1186, 1187, - /* 250 */ 1131, 1137, 1142, 1140, 1143, 1144, 1183, 1188, 1174, 1189, - /* 260 */ 1191, 1195, 1193, 1133, 1138, 1196, 1197, 1198, 1199, 1200, - /* 270 */ 1211, 1213, 1222, 1224, 1226, 1227, 1228, 1139, 1147, 1231, - /* 280 */ 1232, 1201, 1202, 1175, 1203, 1236, 1204, 1205, 1206, 1207, - /* 290 */ 1208, 1212, 1210, 1243, 1164, 1165, 1247, 1251, 1166, 1249, - /* 300 */ 1234, 1235, 1169, 1161, + /* 100 */ 2, 2, 2, 215, 2, 2, 449, 574, 719, 722, + /* 110 */ 791, 134, 65, 942, 521, 794, -47, 878, 956, 986, + /* 120 */ 1003, 1047, 1074, 1092, 295, 1104, 2, 779, 2, 2, + /* 130 */ 2, 2, 158, 338, 572, 644, 650, 670, 723, 392, + /* 140 */ 564, 792, 885, 966, 1002, 1036, 723, 1084, 1091, 1100, + /* 150 */ 1130, 1141, 1146, 1149, 1150, 1152, 1154, 1155, 1166, 1168, + /* 160 */ 1171, 1172, 1180, 1182, 1184, 1185, 1191, 1192, 1193, 1196, + /* 170 */ 1198, 1201, 1202, 1203, 554, 554, 734, 238, 326, 373, + /* 180 */ -134, 278, 604, 710, 822, 44, 600, 635, -98, -70, + /* 190 */ -54, -36, -35, -35, -35, 13, -35, 14, 149, 115, + /* 200 */ 163, 14, 210, 223, 360, -35, -35, 359, 448, -35, + /* 210 */ -35, -35, -35, 513, 551, 598, 653, 596, 605, 647, + /* 220 */ 656, 724, 741, 796, 830, 806, 847, 849, 870, 844, + /* 230 */ 833, 832, 839, 854, 905, 940, 944, 945, 953, 954, + /* 240 */ 959, 929, 948, 950, 957, 987, 985, 988, 1062, 1086, + /* 250 */ 1023, 1034, 1041, 1044, 1042, 1049, 1095, 1106, 1114, 1125, + /* 260 */ 1134, 1137, 1165, 1129, 1135, 1186, 1179, 1188, 1195, 1190, + /* 270 */ 1217, 1218, 1220, 1221, 1223, 1224, 1225, 1139, 1144, 1228, + /* 280 */ 1229, 1199, 1200, 1173, 1197, 1233, 1205, 1206, 1207, 1208, + /* 290 */ 1204, 1212, 1174, 1237, 1161, 1163, 1248, 1249, 1164, 1246, + /* 300 */ 1231, 1232, 1162, 1167, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 618, 853, 934, 934, 853, 934, 934, 880, 741, 851, - /* 10 */ 934, 934, 934, 934, 934, 880, 934, 909, 934, 934, - /* 20 */ 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, - /* 30 */ 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, - /* 40 */ 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, - /* 50 */ 934, 934, 934, 934, 934, 934, 934, 934, 934, 825, - /* 60 */ 934, 934, 934, 657, 880, 880, 745, 776, 934, 934, - /* 70 */ 934, 934, 934, 934, 934, 934, 777, 934, 855, 850, - /* 80 */ 846, 848, 847, 854, 778, 767, 774, 781, 756, 893, - /* 90 */ 783, 784, 790, 791, 910, 908, 813, 812, 831, 815, - /* 100 */ 837, 814, 824, 649, 816, 817, 934, 934, 934, 934, - /* 110 */ 934, 710, 644, 934, 934, 934, 934, 934, 934, 934, - /* 120 */ 934, 934, 934, 934, 934, 934, 818, 934, 819, 832, - /* 130 */ 833, 834, 934, 934, 934, 934, 934, 934, 934, 934, - /* 140 */ 934, 624, 934, 934, 934, 934, 934, 934, 934, 934, - /* 150 */ 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, - /* 160 */ 934, 934, 934, 934, 934, 934, 934, 934, 934, 866, - /* 170 */ 934, 913, 915, 934, 934, 934, 618, 741, 741, 741, - /* 180 */ 934, 934, 934, 934, 934, 735, 745, 927, 934, 934, - /* 190 */ 701, 934, 934, 934, 934, 934, 934, 934, 626, 733, - /* 200 */ 659, 743, 934, 934, 934, 646, 722, 886, 934, 900, - /* 210 */ 898, 724, 786, 934, 733, 742, 934, 934, 934, 849, - /* 220 */ 770, 770, 758, 770, 680, 770, 934, 770, 934, 683, - /* 230 */ 780, 758, 758, 780, 623, 623, 623, 623, 634, 634, - /* 240 */ 700, 934, 780, 771, 773, 763, 775, 934, 749, 749, - /* 250 */ 757, 762, 757, 762, 757, 762, 712, 712, 697, 712, - /* 260 */ 683, 712, 859, 863, 863, 697, 712, 712, 712, 859, - /* 270 */ 641, 749, 641, 749, 641, 749, 749, 890, 892, 641, - /* 280 */ 749, 714, 714, 792, 780, 749, 721, 721, 721, 721, - /* 290 */ 780, 714, 792, 749, 912, 912, 749, 749, 920, 667, - /* 300 */ 685, 685, 927, 932, 934, 934, 934, 934, 934, 934, - /* 310 */ 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, - /* 320 */ 934, 873, 934, 934, 934, 632, 934, 651, 799, 804, - /* 330 */ 800, 934, 801, 934, 727, 934, 934, 934, 934, 934, - /* 340 */ 934, 934, 934, 934, 934, 852, 934, 764, 934, 772, - /* 350 */ 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, - /* 360 */ 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, - /* 370 */ 934, 934, 934, 934, 934, 888, 889, 934, 934, 934, - /* 380 */ 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, - /* 390 */ 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, - /* 400 */ 919, 934, 934, 922, 619, 934, 614, 616, 617, 621, - /* 410 */ 622, 625, 651, 652, 654, 655, 656, 627, 628, 629, - /* 420 */ 630, 631, 633, 637, 635, 636, 638, 645, 647, 666, - /* 430 */ 668, 670, 731, 732, 796, 725, 726, 730, 653, 807, - /* 440 */ 798, 802, 803, 805, 806, 820, 821, 823, 829, 836, - /* 450 */ 839, 822, 827, 828, 830, 835, 838, 728, 729, 842, - /* 460 */ 660, 661, 664, 665, 876, 878, 877, 879, 663, 662, - /* 470 */ 808, 811, 844, 845, 901, 902, 903, 904, 905, 840, - /* 480 */ 750, 843, 826, 765, 768, 769, 766, 734, 744, 752, - /* 490 */ 753, 754, 755, 739, 740, 746, 761, 794, 795, 759, - /* 500 */ 760, 747, 748, 736, 737, 738, 841, 797, 809, 810, - /* 510 */ 671, 672, 804, 673, 674, 675, 713, 716, 717, 718, - /* 520 */ 676, 695, 698, 699, 677, 684, 678, 679, 686, 687, - /* 530 */ 688, 691, 692, 693, 694, 689, 690, 860, 861, 864, - /* 540 */ 862, 681, 682, 696, 669, 658, 650, 702, 705, 706, - /* 550 */ 707, 708, 709, 711, 703, 704, 648, 639, 642, 751, - /* 560 */ 882, 891, 887, 883, 884, 885, 643, 856, 857, 715, - /* 570 */ 788, 789, 881, 894, 896, 793, 897, 899, 895, 924, - /* 580 */ 640, 719, 720, 723, 865, 906, 779, 782, 785, 787, - /* 590 */ 867, 868, 869, 870, 871, 874, 875, 872, 907, 911, - /* 600 */ 914, 916, 917, 918, 921, 923, 928, 929, 930, 933, - /* 610 */ 931, 620, 615, + /* 0 */ 621, 856, 939, 939, 856, 939, 939, 885, 885, 744, + /* 10 */ 854, 939, 939, 939, 939, 939, 939, 914, 939, 939, + /* 20 */ 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, + /* 30 */ 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, + /* 40 */ 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, + /* 50 */ 939, 939, 939, 939, 939, 939, 939, 939, 939, 828, + /* 60 */ 939, 939, 939, 660, 885, 885, 748, 779, 939, 939, + /* 70 */ 939, 939, 939, 939, 939, 939, 780, 939, 858, 853, + /* 80 */ 849, 851, 850, 857, 781, 770, 777, 784, 759, 898, + /* 90 */ 786, 787, 793, 794, 915, 913, 816, 815, 834, 818, + /* 100 */ 840, 817, 827, 652, 819, 820, 939, 939, 939, 939, + /* 110 */ 939, 713, 647, 939, 939, 939, 939, 939, 939, 939, + /* 120 */ 939, 939, 939, 939, 939, 939, 821, 939, 822, 835, + /* 130 */ 836, 837, 939, 939, 939, 939, 939, 939, 939, 939, + /* 140 */ 939, 627, 939, 939, 939, 939, 939, 939, 939, 939, + /* 150 */ 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, + /* 160 */ 939, 939, 939, 939, 939, 939, 939, 939, 939, 869, + /* 170 */ 939, 918, 920, 939, 939, 939, 621, 744, 744, 744, + /* 180 */ 939, 939, 939, 939, 939, 738, 748, 932, 939, 939, + /* 190 */ 704, 939, 939, 939, 939, 939, 939, 939, 629, 736, + /* 200 */ 662, 746, 939, 939, 939, 649, 725, 891, 939, 905, + /* 210 */ 903, 727, 789, 939, 736, 745, 939, 939, 939, 852, + /* 220 */ 773, 773, 761, 773, 683, 773, 939, 773, 939, 686, + /* 230 */ 783, 761, 761, 783, 626, 626, 626, 626, 637, 637, + /* 240 */ 703, 939, 783, 774, 776, 766, 778, 939, 752, 752, + /* 250 */ 760, 765, 760, 765, 760, 765, 715, 715, 700, 715, + /* 260 */ 686, 715, 862, 866, 866, 700, 715, 715, 715, 862, + /* 270 */ 644, 752, 644, 752, 644, 752, 752, 895, 897, 644, + /* 280 */ 752, 717, 717, 795, 783, 752, 724, 724, 724, 724, + /* 290 */ 783, 717, 795, 752, 917, 917, 752, 752, 925, 670, + /* 300 */ 688, 688, 932, 937, 939, 939, 939, 939, 939, 939, + /* 310 */ 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, + /* 320 */ 939, 871, 939, 939, 939, 635, 939, 654, 802, 807, + /* 330 */ 803, 939, 804, 939, 730, 939, 939, 939, 939, 939, + /* 340 */ 939, 939, 939, 939, 939, 855, 939, 767, 939, 775, + /* 350 */ 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, + /* 360 */ 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, + /* 370 */ 939, 939, 939, 939, 939, 893, 894, 939, 939, 939, + /* 380 */ 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, + /* 390 */ 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, + /* 400 */ 939, 924, 939, 939, 927, 622, 939, 617, 619, 620, + /* 410 */ 624, 625, 628, 654, 655, 657, 658, 659, 630, 631, + /* 420 */ 632, 633, 634, 636, 640, 638, 639, 641, 648, 650, + /* 430 */ 669, 671, 673, 734, 735, 799, 728, 729, 733, 656, + /* 440 */ 810, 801, 805, 806, 808, 809, 823, 824, 826, 832, + /* 450 */ 839, 842, 825, 830, 831, 833, 838, 841, 731, 732, + /* 460 */ 845, 663, 664, 667, 668, 881, 883, 882, 884, 666, + /* 470 */ 665, 811, 814, 847, 848, 906, 907, 908, 909, 910, + /* 480 */ 843, 753, 846, 829, 768, 771, 772, 769, 737, 747, + /* 490 */ 755, 756, 757, 758, 742, 743, 749, 764, 797, 798, + /* 500 */ 762, 763, 750, 751, 739, 740, 741, 844, 800, 812, + /* 510 */ 813, 674, 675, 807, 676, 677, 678, 716, 719, 720, + /* 520 */ 721, 679, 698, 701, 702, 680, 687, 681, 682, 689, + /* 530 */ 690, 691, 694, 695, 696, 697, 692, 693, 863, 864, + /* 540 */ 867, 865, 684, 685, 699, 672, 661, 653, 705, 708, + /* 550 */ 709, 710, 711, 712, 714, 706, 707, 651, 642, 645, + /* 560 */ 754, 887, 896, 892, 888, 889, 890, 646, 859, 860, + /* 570 */ 718, 791, 792, 886, 899, 901, 796, 902, 904, 900, + /* 580 */ 929, 643, 722, 723, 726, 868, 911, 782, 785, 788, + /* 590 */ 790, 870, 872, 874, 876, 877, 878, 879, 880, 873, + /* 600 */ 875, 912, 916, 919, 921, 922, 923, 926, 928, 933, + /* 610 */ 934, 935, 938, 936, 623, 618, }; #define YY_SZ_ACTTAB (int)(sizeof(yy_action)/sizeof(yy_action[0])) /* The next table maps tokens into fallback tokens. If a construct ** like the following: @@ -85271,76 +85559,78 @@ /* 250 */ "collate ::=", /* 251 */ "collate ::= COLLATE ids", /* 252 */ "cmd ::= DROP INDEX ifexists fullname", /* 253 */ "cmd ::= VACUUM", /* 254 */ "cmd ::= VACUUM nm", - /* 255 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", - /* 256 */ "cmd ::= PRAGMA nm dbnm EQ ON", - /* 257 */ "cmd ::= PRAGMA nm dbnm EQ DELETE", + /* 255 */ "cmd ::= PRAGMA nm dbnm", + /* 256 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", + /* 257 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", /* 258 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", - /* 259 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", - /* 260 */ "cmd ::= PRAGMA nm dbnm", - /* 261 */ "nmnum ::= plus_num", - /* 262 */ "nmnum ::= nm", - /* 263 */ "plus_num ::= plus_opt number", - /* 264 */ "minus_num ::= MINUS number", - /* 265 */ "number ::= INTEGER|FLOAT", - /* 266 */ "plus_opt ::= PLUS", - /* 267 */ "plus_opt ::=", - /* 268 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", - /* 269 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", - /* 270 */ "trigger_time ::= BEFORE", - /* 271 */ "trigger_time ::= AFTER", - /* 272 */ "trigger_time ::= INSTEAD OF", - /* 273 */ "trigger_time ::=", - /* 274 */ "trigger_event ::= DELETE|INSERT", - /* 275 */ "trigger_event ::= UPDATE", - /* 276 */ "trigger_event ::= UPDATE OF inscollist", - /* 277 */ "foreach_clause ::=", - /* 278 */ "foreach_clause ::= FOR EACH ROW", - /* 279 */ "when_clause ::=", - /* 280 */ "when_clause ::= WHEN expr", - /* 281 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", - /* 282 */ "trigger_cmd_list ::= trigger_cmd SEMI", - /* 283 */ "trigger_cmd ::= UPDATE orconf nm SET setlist where_opt", - /* 284 */ "trigger_cmd ::= insert_cmd INTO nm inscollist_opt VALUES LP itemlist RP", - /* 285 */ "trigger_cmd ::= insert_cmd INTO nm inscollist_opt select", - /* 286 */ "trigger_cmd ::= DELETE FROM nm 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 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 ANY", + /* 259 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", + /* 260 */ "nmnum ::= plus_num", + /* 261 */ "nmnum ::= nm", + /* 262 */ "nmnum ::= ON", + /* 263 */ "nmnum ::= DELETE", + /* 264 */ "nmnum ::= DEFAULT", + /* 265 */ "plus_num ::= plus_opt number", + /* 266 */ "minus_num ::= MINUS number", + /* 267 */ "number ::= INTEGER|FLOAT", + /* 268 */ "plus_opt ::= PLUS", + /* 269 */ "plus_opt ::=", + /* 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 inscollist", + /* 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 */ "trigger_cmd ::= UPDATE orconf nm SET setlist where_opt", + /* 286 */ "trigger_cmd ::= insert_cmd INTO nm inscollist_opt VALUES LP itemlist RP", + /* 287 */ "trigger_cmd ::= insert_cmd INTO nm inscollist_opt select", + /* 288 */ "trigger_cmd ::= DELETE FROM nm where_opt", + /* 289 */ "trigger_cmd ::= select", + /* 290 */ "expr ::= RAISE LP IGNORE RP", + /* 291 */ "expr ::= RAISE LP raisetype COMMA nm RP", + /* 292 */ "raisetype ::= ROLLBACK", + /* 293 */ "raisetype ::= ABORT", + /* 294 */ "raisetype ::= FAIL", + /* 295 */ "cmd ::= DROP TRIGGER ifexists fullname", + /* 296 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", + /* 297 */ "cmd ::= DETACH database_kw_opt expr", + /* 298 */ "key_opt ::=", + /* 299 */ "key_opt ::= KEY expr", + /* 300 */ "database_kw_opt ::= DATABASE", + /* 301 */ "database_kw_opt ::=", + /* 302 */ "cmd ::= REINDEX", + /* 303 */ "cmd ::= REINDEX nm dbnm", + /* 304 */ "cmd ::= ANALYZE", + /* 305 */ "cmd ::= ANALYZE nm dbnm", + /* 306 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", + /* 307 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column", + /* 308 */ "add_column_fullname ::= fullname", + /* 309 */ "kwcolumn_opt ::=", + /* 310 */ "kwcolumn_opt ::= COLUMNKW", + /* 311 */ "cmd ::= create_vtab", + /* 312 */ "cmd ::= create_vtab LP vtabarglist RP", + /* 313 */ "create_vtab ::= createkw VIRTUAL TABLE nm dbnm USING nm", + /* 314 */ "vtabarglist ::= vtabarg", + /* 315 */ "vtabarglist ::= vtabarglist COMMA vtabarg", + /* 316 */ "vtabarg ::=", + /* 317 */ "vtabarg ::= vtabarg vtabargtoken", + /* 318 */ "vtabargtoken ::= ANY", + /* 319 */ "vtabargtoken ::= lp anylist RP", + /* 320 */ "lp ::= LP", + /* 321 */ "anylist ::=", + /* 322 */ "anylist ::= anylist ANY", }; #endif /* NDEBUG */ #if YYSTACKDEPTH<=0 @@ -85963,16 +86253,18 @@ { 230, 0 }, { 230, 2 }, { 147, 4 }, { 147, 1 }, { 147, 2 }, - { 147, 5 }, + { 147, 3 }, { 147, 5 }, - { 147, 5 }, + { 147, 6 }, { 147, 5 }, { 147, 6 }, - { 147, 3 }, + { 231, 1 }, + { 231, 1 }, + { 231, 1 }, { 231, 1 }, { 231, 1 }, { 170, 2 }, { 171, 2 }, { 233, 1 }, @@ -86108,22 +86400,22 @@ case 62: /* ccons ::= NULL onconf */ case 89: /* conslist ::= conslist COMMA tcons */ case 90: /* conslist ::= conslist tcons */ case 91: /* conslist ::= tcons */ case 92: /* tcons ::= CONSTRAINT nm */ - case 266: /* plus_opt ::= PLUS */ - case 267: /* plus_opt ::= */ - case 277: /* foreach_clause ::= */ - case 278: /* foreach_clause ::= FOR EACH ROW */ - case 298: /* database_kw_opt ::= DATABASE */ - case 299: /* database_kw_opt ::= */ - case 307: /* kwcolumn_opt ::= */ - case 308: /* kwcolumn_opt ::= COLUMNKW */ - case 312: /* vtabarglist ::= vtabarg */ - case 313: /* vtabarglist ::= vtabarglist COMMA vtabarg */ - case 315: /* vtabarg ::= vtabarg vtabargtoken */ - case 319: /* anylist ::= */ + case 268: /* plus_opt ::= PLUS */ + case 269: /* plus_opt ::= */ + case 279: /* foreach_clause ::= */ + case 280: /* foreach_clause ::= FOR EACH ROW */ + case 300: /* database_kw_opt ::= DATABASE */ + case 301: /* database_kw_opt ::= */ + case 309: /* kwcolumn_opt ::= */ + case 310: /* kwcolumn_opt ::= COLUMNKW */ + case 314: /* vtabarglist ::= vtabarg */ + case 315: /* vtabarglist ::= vtabarglist COMMA vtabarg */ + case 317: /* vtabarg ::= vtabarg vtabargtoken */ + case 321: /* anylist ::= */ { } break; case 5: /* explain ::= */ { sqlite3BeginParse(pParse, 0); } @@ -86240,15 +86532,18 @@ case 126: /* as ::= AS nm */ case 127: /* as ::= ids */ case 137: /* dbnm ::= DOT nm */ case 146: /* indexed_opt ::= INDEXED BY nm */ case 251: /* collate ::= COLLATE ids */ - case 261: /* nmnum ::= plus_num */ - case 262: /* nmnum ::= nm */ - case 263: /* plus_num ::= plus_opt number */ - case 264: /* minus_num ::= MINUS number */ - case 265: /* number ::= INTEGER|FLOAT */ + case 260: /* nmnum ::= plus_num */ + case 261: /* nmnum ::= nm */ + case 262: /* nmnum ::= ON */ + case 263: /* nmnum ::= DELETE */ + case 264: /* nmnum ::= DEFAULT */ + case 265: /* plus_num ::= plus_opt number */ + case 266: /* minus_num ::= MINUS number */ + case 267: /* number ::= INTEGER|FLOAT */ {yygotominor.yy0 = yymsp[0].minor.yy0;} break; case 45: /* type ::= typetoken */ {sqlite3AddColumnType(pParse,&yymsp[0].minor.yy0);} break; @@ -86888,11 +87183,11 @@ sqlite3SrcListAppend(pParse->db,0,&yymsp[-3].minor.yy0,0), yymsp[-1].minor.yy148, yymsp[-9].minor.yy194, &yymsp[-10].minor.yy0, &yymsp[0].minor.yy0, SQLITE_SO_ASC, yymsp[-7].minor.yy194); } break; case 244: /* uniqueflag ::= UNIQUE */ - case 291: /* raisetype ::= ABORT */ + case 293: /* raisetype ::= ABORT */ {yygotominor.yy194 = OE_Abort;} break; case 245: /* uniqueflag ::= */ {yygotominor.yy194 = OE_None;} break; @@ -86928,66 +87223,65 @@ break; case 253: /* cmd ::= VACUUM */ case 254: /* cmd ::= VACUUM nm */ {sqlite3Vacuum(pParse);} break; - case 255: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ - case 256: /* cmd ::= PRAGMA nm dbnm EQ ON */ - case 257: /* cmd ::= PRAGMA nm dbnm EQ DELETE */ + case 255: /* cmd ::= PRAGMA nm dbnm */ +{sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);} + break; + case 256: /* 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 EQ minus_num */ -{ - sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1); -} - break; - case 259: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ + case 257: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);} break; - case 260: /* cmd ::= PRAGMA nm dbnm */ -{sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);} - break; - case 268: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + case 258: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ +{sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);} + break; + case 259: /* 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 */ { 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.yy145, &all); } break; - case 269: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + case 271: /* 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.yy194, yymsp[-4].minor.yy332.a, yymsp[-4].minor.yy332.b, yymsp[-2].minor.yy185, yymsp[0].minor.yy72, yymsp[-10].minor.yy194, yymsp[-8].minor.yy194); yygotominor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); } break; - case 270: /* trigger_time ::= BEFORE */ - case 273: /* trigger_time ::= */ + case 272: /* trigger_time ::= BEFORE */ + case 275: /* trigger_time ::= */ { yygotominor.yy194 = TK_BEFORE; } break; - case 271: /* trigger_time ::= AFTER */ + case 273: /* trigger_time ::= AFTER */ { yygotominor.yy194 = TK_AFTER; } break; - case 272: /* trigger_time ::= INSTEAD OF */ + case 274: /* trigger_time ::= INSTEAD OF */ { yygotominor.yy194 = TK_INSTEAD;} break; - case 274: /* trigger_event ::= DELETE|INSERT */ - case 275: /* trigger_event ::= UPDATE */ + case 276: /* trigger_event ::= DELETE|INSERT */ + case 277: /* trigger_event ::= UPDATE */ {yygotominor.yy332.a = yymsp[0].major; yygotominor.yy332.b = 0;} break; - case 276: /* trigger_event ::= UPDATE OF inscollist */ + case 278: /* trigger_event ::= UPDATE OF inscollist */ {yygotominor.yy332.a = TK_UPDATE; yygotominor.yy332.b = yymsp[0].minor.yy254;} break; - case 279: /* when_clause ::= */ - case 296: /* key_opt ::= */ + case 281: /* when_clause ::= */ + case 298: /* key_opt ::= */ { yygotominor.yy72 = 0; } break; - case 280: /* when_clause ::= WHEN expr */ - case 297: /* key_opt ::= KEY expr */ + case 282: /* when_clause ::= WHEN expr */ + case 299: /* key_opt ::= KEY expr */ { yygotominor.yy72 = yymsp[0].minor.yy72; } break; - case 281: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + case 283: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ { /* if( yymsp[-2].minor.yy145 ){ yymsp[-2].minor.yy145->pLast->pNext = yymsp[-1].minor.yy145; }else{ @@ -86998,118 +87292,118 @@ yymsp[-2].minor.yy145->pLast->pNext = yymsp[-1].minor.yy145; yymsp[-2].minor.yy145->pLast = yymsp[-1].minor.yy145; yygotominor.yy145 = yymsp[-2].minor.yy145; } break; - case 282: /* trigger_cmd_list ::= trigger_cmd SEMI */ + case 284: /* trigger_cmd_list ::= trigger_cmd SEMI */ { /* if( yymsp[-1].minor.yy145 ) */ assert( yymsp[-1].minor.yy145!=0 ); yymsp[-1].minor.yy145->pLast = yymsp[-1].minor.yy145; yygotominor.yy145 = yymsp[-1].minor.yy145; } break; - case 283: /* trigger_cmd ::= UPDATE orconf nm SET setlist where_opt */ + case 285: /* trigger_cmd ::= UPDATE orconf nm SET setlist where_opt */ { yygotominor.yy145 = sqlite3TriggerUpdateStep(pParse->db, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy148, yymsp[0].minor.yy72, yymsp[-4].minor.yy194); } break; - case 284: /* trigger_cmd ::= insert_cmd INTO nm inscollist_opt VALUES LP itemlist RP */ + case 286: /* trigger_cmd ::= insert_cmd INTO nm inscollist_opt VALUES LP itemlist RP */ {yygotominor.yy145 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy254, yymsp[-1].minor.yy148, 0, yymsp[-7].minor.yy194);} break; - case 285: /* trigger_cmd ::= insert_cmd INTO nm inscollist_opt select */ + case 287: /* trigger_cmd ::= insert_cmd INTO nm inscollist_opt select */ {yygotominor.yy145 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy254, 0, yymsp[0].minor.yy243, yymsp[-4].minor.yy194);} break; - case 286: /* trigger_cmd ::= DELETE FROM nm where_opt */ + case 288: /* trigger_cmd ::= DELETE FROM nm where_opt */ {yygotominor.yy145 = sqlite3TriggerDeleteStep(pParse->db, &yymsp[-1].minor.yy0, yymsp[0].minor.yy72);} break; - case 287: /* trigger_cmd ::= select */ + case 289: /* trigger_cmd ::= select */ {yygotominor.yy145 = sqlite3TriggerSelectStep(pParse->db, yymsp[0].minor.yy243); } break; - case 288: /* expr ::= RAISE LP IGNORE RP */ + case 290: /* expr ::= RAISE LP IGNORE RP */ { yygotominor.yy72 = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0); if( yygotominor.yy72 ){ yygotominor.yy72->affinity = OE_Ignore; sqlite3ExprSpan(yygotominor.yy72, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0); } } break; - case 289: /* expr ::= RAISE LP raisetype COMMA nm RP */ + case 291: /* expr ::= RAISE LP raisetype COMMA nm RP */ { yygotominor.yy72 = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &yymsp[-1].minor.yy0); if( yygotominor.yy72 ) { yygotominor.yy72->affinity = (char)yymsp[-3].minor.yy194; sqlite3ExprSpan(yygotominor.yy72, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0); } } break; - case 290: /* raisetype ::= ROLLBACK */ + case 292: /* raisetype ::= ROLLBACK */ {yygotominor.yy194 = OE_Rollback;} break; - case 292: /* raisetype ::= FAIL */ + case 294: /* raisetype ::= FAIL */ {yygotominor.yy194 = OE_Fail;} break; - case 293: /* cmd ::= DROP TRIGGER ifexists fullname */ + case 295: /* cmd ::= DROP TRIGGER ifexists fullname */ { sqlite3DropTrigger(pParse,yymsp[0].minor.yy185,yymsp[-1].minor.yy194); } break; - case 294: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + case 296: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ { sqlite3Attach(pParse, yymsp[-3].minor.yy72, yymsp[-1].minor.yy72, yymsp[0].minor.yy72); } break; - case 295: /* cmd ::= DETACH database_kw_opt expr */ + case 297: /* cmd ::= DETACH database_kw_opt expr */ { sqlite3Detach(pParse, yymsp[0].minor.yy72); } break; - case 300: /* cmd ::= REINDEX */ + case 302: /* cmd ::= REINDEX */ {sqlite3Reindex(pParse, 0, 0);} break; - case 301: /* cmd ::= REINDEX nm dbnm */ + case 303: /* cmd ::= REINDEX nm dbnm */ {sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 302: /* cmd ::= ANALYZE */ + case 304: /* cmd ::= ANALYZE */ {sqlite3Analyze(pParse, 0, 0);} break; - case 303: /* cmd ::= ANALYZE nm dbnm */ + case 305: /* cmd ::= ANALYZE nm dbnm */ {sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 304: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ + case 306: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ { sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy185,&yymsp[0].minor.yy0); } break; - case 305: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column */ + case 307: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column */ { sqlite3AlterFinishAddColumn(pParse, &yymsp[0].minor.yy0); } break; - case 306: /* add_column_fullname ::= fullname */ + case 308: /* add_column_fullname ::= fullname */ { pParse->db->lookaside.bEnabled = 0; sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy185); } break; - case 309: /* cmd ::= create_vtab */ + case 311: /* cmd ::= create_vtab */ {sqlite3VtabFinishParse(pParse,0);} break; - case 310: /* cmd ::= create_vtab LP vtabarglist RP */ + case 312: /* cmd ::= create_vtab LP vtabarglist RP */ {sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);} break; - case 311: /* create_vtab ::= createkw VIRTUAL TABLE nm dbnm USING nm */ + case 313: /* create_vtab ::= createkw VIRTUAL TABLE nm dbnm USING nm */ { sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 314: /* vtabarg ::= */ + case 316: /* vtabarg ::= */ {sqlite3VtabArgInit(pParse);} break; - case 316: /* vtabargtoken ::= ANY */ - case 317: /* vtabargtoken ::= lp anylist RP */ - case 318: /* lp ::= LP */ - case 320: /* anylist ::= anylist ANY */ + case 318: /* vtabargtoken ::= ANY */ + case 319: /* vtabargtoken ::= lp anylist RP */ + case 320: /* lp ::= LP */ + case 322: /* anylist ::= anylist ANY */ {sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);} break; }; yygoto = yyRuleInfo[yyruleno].lhs; yysize = yyRuleInfo[yyruleno].nrhs; @@ -88437,11 +88731,11 @@ ** Main file for the SQLite library. The routines in this file ** implement the programmer interface to the library. Routines in ** other files are for internal use by SQLite and should not be ** accessed by users of the library. ** -** $Id: main.c,v 1.534 2009/03/23 04:33:32 danielk1977 Exp $ +** $Id: main.c,v 1.536 2009/04/09 01:23:49 drh Exp $ */ #ifdef SQLITE_ENABLE_FTS3 /************** Include fts3.h in the middle of main.c ***********************/ /************** Begin file fts3.h ********************************************/ @@ -88729,10 +89023,11 @@ sqlite3GlobalConfig.isMallocInit = 0; sqlite3PcacheShutdown(); if( sqlite3GlobalConfig.isInit ){ sqlite3_os_end(); } + sqlite3_reset_auto_extension(); sqlite3MallocEnd(); sqlite3MutexEnd(); sqlite3GlobalConfig.isInit = 0; return SQLITE_OK; } @@ -88928,11 +89223,11 @@ db->lookaside.pFree = 0; db->lookaside.sz = (u16)sz; if( pStart ){ int i; LookasideSlot *p; - assert( sz > sizeof(LookasideSlot*) ); + assert( sz > (int)sizeof(LookasideSlot*) ); p = (LookasideSlot*)pStart; for(i=cnt-1; i>=0; i--){ p->pNext = db->lookaside.pFree; db->lookaside.pFree = p; p = (LookasideSlot*)&((u8*)p)[sz]; @@ -90705,11 +91000,11 @@ ************************************************************************* ** ** This file contains the implementation of the sqlite3_unlock_notify() ** API method and its associated functionality. ** -** $Id: notify.c,v 1.2 2009/03/25 16:51:43 drh Exp $ +** $Id: notify.c,v 1.4 2009/04/07 22:06:57 drh Exp $ */ /* Omit this entire file if SQLITE_ENABLE_UNLOCK_NOTIFY is not defined. */ #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY @@ -90802,26 +91097,44 @@ } /* ** Obtain the STATIC_MASTER mutex. */ -static void enterMutex(){ +static void enterMutex(void){ sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); checkListProperties(0); } /* ** Release the STATIC_MASTER mutex. */ -static void leaveMutex(){ +static void leaveMutex(void){ assertMutexHeld(); checkListProperties(0); sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); } /* ** Register an unlock-notify callback. +** +** This is called after connection "db" has attempted some operation +** but has received an SQLITE_LOCKED error because another connection +** (call it pOther) in the same process was busy using the same shared +** cache. pOther is found by looking at db->pBlockingConnection. +** +** If there is no blocking connection, the callback is invoked immediately, +** before this routine returns. +** +** If pOther is already blocked on db, then report SQLITE_LOCKED, to indicate +** a deadlock. +** +** Otherwise, make arrangements to invoke xNotify when pOther drops +** its locks. +** +** Each call to this routine overrides any prior callbacks registered +** on the same "db". If xNotify==0 then any prior callbacks are immediately +** cancelled. */ SQLITE_API int sqlite3_unlock_notify( sqlite3 *db, void (*xNotify)(void **, int), void *pArg @@ -90829,20 +91142,25 @@ int rc = SQLITE_OK; sqlite3_mutex_enter(db->mutex); enterMutex(); - if( 0==db->pBlockingConnection ){ + if( xNotify==0 ){ + removeFromBlockedList(db); + db->pUnlockConnection = 0; + db->xUnlockNotify = 0; + db->pUnlockArg = 0; + }else if( 0==db->pBlockingConnection ){ /* The blocking transaction has been concluded. Or there never was a ** blocking transaction. In either case, invoke the notify callback ** immediately. */ xNotify(&pArg, 1); }else{ sqlite3 *p; - for(p=db->pBlockingConnection; p && p!=db; p=p->pUnlockConnection); + for(p=db->pBlockingConnection; p && p!=db; p=p->pUnlockConnection){} if( p ){ rc = SQLITE_LOCKED; /* Deadlock detected. */ }else{ db->pUnlockConnection = db->pBlockingConnection; db->xUnlockNotify = xNotify; @@ -90873,11 +91191,12 @@ db->pBlockingConnection = pBlocker; leaveMutex(); } /* -** The transaction opened by database db has just finished. Locks held +** This function is called when +** the transaction opened by database db has just finished. Locks held ** by database connection db have been released. ** ** This function loops through each entry in the blocked connections ** list and does the following: ** @@ -90894,15 +91213,15 @@ */ SQLITE_PRIVATE void sqlite3ConnectionUnlocked(sqlite3 *db){ void (*xUnlockNotify)(void **, int) = 0; /* Unlock-notify cb to invoke */ int nArg = 0; /* Number of entries in aArg[] */ sqlite3 **pp; /* Iterator variable */ - - void *aStatic[16]; - void **aArg = aStatic; - void **aDyn = 0; - + void **aArg; /* Arguments to the unlock callback */ + void **aDyn = 0; /* Dynamically allocated space for aArg[] */ + void *aStatic[16]; /* Starter space for aArg[]. No malloc required */ + + aArg = aStatic; enterMutex(); /* Enter STATIC_MASTER mutex */ /* This loop runs once for each entry in the blocked-connections list. */ for(pp=&sqlite3BlockedList; *pp; /* no-op */ ){ sqlite3 *p = *pp;
Modified src/sqlite3.h from [fd279dabba] to [45a47b096b].
@@ -28,11 +28,11 @@ ** The name of this file under configuration management is "sqlite.h.in". ** The makefile makes some minor changes to this file (such as inserting ** the version number) and changes its name to "sqlite3.h" as ** part of the build process. ** -** @(#) $Id: sqlite.h.in,v 1.436 2009/03/20 13:15:30 drh Exp $ +** @(#) $Id: sqlite.h.in,v 1.440 2009/04/06 15:55:04 drh Exp $ */ #ifndef _SQLITE3_H_ #define _SQLITE3_H_ #include <stdarg.h> /* Needed for the definition of va_list */ @@ -97,12 +97,12 @@ ** ** See also: [sqlite3_libversion()] and [sqlite3_libversion_number()]. ** ** Requirements: [H10011] [H10014] */ -#define SQLITE_VERSION "3.6.12" -#define SQLITE_VERSION_NUMBER 3006012 +#define SQLITE_VERSION "3.6.13" +#define SQLITE_VERSION_NUMBER 3006013 /* ** CAPI3REF: Run-Time Library Version Numbers {H10020} <S60100> ** KEYWORDS: sqlite3_version ** @@ -380,11 +380,10 @@ #define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8)) #define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8)) #define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8)) #define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8)) #define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8)) - #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8) ) /* ** CAPI3REF: Flags For File Open Operations {H10230} <H11120> <H12700> ** @@ -460,12 +459,13 @@ ** [sqlite3_io_methods] object it uses a combination of ** these integer values as the second argument. ** ** When the SQLITE_SYNC_DATAONLY flag is used, it means that the ** sync operation only needs to flush data to mass storage. Inode -** information need not be flushed. The SQLITE_SYNC_NORMAL flag means -** to use normal fsync() semantics. The SQLITE_SYNC_FULL flag means +** information need not be flushed. If the lower four bits of the flag +** equal SQLITE_SYNC_NORMAL, that means to use normal fsync() semantics. +** If the lower four bits equal SQLITE_SYNC_FULL, that means ** to use Mac OS X style fullsync instead of fsync(). */ #define SQLITE_SYNC_NORMAL 0x00002 #define SQLITE_SYNC_FULL 0x00003 #define SQLITE_SYNC_DATAONLY 0x00010 @@ -2227,11 +2227,12 @@ ** ** To execute an SQL query, it must first be compiled into a byte-code ** program using one of these routines. ** ** The first argument, "db", is a [database connection] obtained from a -** prior call to [sqlite3_open()], [sqlite3_open_v2()] or [sqlite3_open16()]. +** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or +** [sqlite3_open16()]. The database connection must not have been closed. ** ** The second argument, "zSql", is the statement to be compiled, encoded ** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2() ** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2() ** use UTF-16. @@ -2244,21 +2245,22 @@ ** that the supplied string is nul-terminated, then there is a small ** performance advantage to be gained by passing an nByte parameter that ** is equal to the number of bytes in the input string <i>including</i> ** the nul-terminator bytes. ** -** *pzTail is made to point to the first byte past the end of the -** first SQL statement in zSql. These routines only compile the first -** statement in zSql, so *pzTail is left pointing to what remains -** uncompiled. +** If pzTail is not NULL then *pzTail is made to point to the first byte +** past the end of the first SQL statement in zSql. These routines only +** compile the first statement in zSql, so *pzTail is left pointing to +** what remains uncompiled. ** ** *ppStmt is left pointing to a compiled [prepared statement] that can be ** executed using [sqlite3_step()]. If there is an error, *ppStmt is set ** to NULL. If the input text contains no SQL (if the input is an empty ** string or a comment) then *ppStmt is set to NULL. -** {A13018} The calling procedure is responsible for deleting the compiled +** The calling procedure is responsible for deleting the compiled ** SQL statement using [sqlite3_finalize()] after it has finished with it. +** ppStmt may not be NULL. ** ** On success, [SQLITE_OK] is returned, otherwise an [error code] is returned. ** ** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are ** recommended for all new programs. The two older interfaces are retained @@ -3628,14 +3630,28 @@ ** the name of a folder (a.k.a. directory), then all temporary files ** created by SQLite will be placed in that directory. If this variable ** is a NULL pointer, then SQLite performs a search for an appropriate ** temporary file directory. ** -** It is not safe to modify this variable once a [database connection] -** has been opened. It is intended that this variable be set once +** It is not safe to read or modify this variable in more than one +** thread at a time. It is not safe to read or modify this variable +** if a [database connection] is being used at the same time in a separate +** thread. +** It is intended that this variable be set once ** as part of process initialization and before any SQLite interface -** routines have been call and remain unchanged thereafter. +** routines have been called and that this variable remain unchanged +** thereafter. +** +** The [temp_store_directory pragma] may modify this variable and cause +** it to point to memory obtained from [sqlite3_malloc]. Furthermore, +** the [temp_store_directory pragma] always assumes that any string +** that this variable points to is held in memory obtained from +** [sqlite3_malloc] and the pragma may attempt to free that memory +** using [sqlite3_free]. +** Hence, if this variable is modified directly, either it should be +** made NULL or made to point to memory obtained from [sqlite3_malloc] +** or else the use of the [temp_store_directory pragma] should be avoided. */ SQLITE_EXTERN char *sqlite3_temp_directory; /* ** CAPI3REF: Test For Auto-Commit Mode {H12930} <S60200>