diff options
Diffstat (limited to 'ext/sqlite/libsqlite/src')
37 files changed, 10905 insertions, 7327 deletions
diff --git a/ext/sqlite/libsqlite/src/attach.c b/ext/sqlite/libsqlite/src/attach.c new file mode 100644 index 0000000000..dd94c21182 --- /dev/null +++ b/ext/sqlite/libsqlite/src/attach.c @@ -0,0 +1,130 @@ +/* +** 2003 April 6 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains code used to implement the ATTACH and DETACH commands. +** +** $Id$ +*/ +#include "sqliteInt.h" + +/* +** This routine is called by the parser to process an ATTACH statement: +** +** ATTACH DATABASE filename AS dbname +** +** The pFilename and pDbname arguments are the tokens that define the +** filename and dbname in the ATTACH statement. +*/ +void sqliteAttach(Parse *pParse, Token *pFilename, Token *pDbname){ + Db *aNew; + int rc, i; + char *zFile, *zName; + sqlite *db; + + if( pParse->explain ) return; + db = pParse->db; + if( db->file_format<4 ){ + sqliteErrorMsg(pParse, "cannot attach auxiliary databases to an " + "older format master database", 0); + pParse->rc = SQLITE_ERROR; + return; + } + if( db->nDb>=MAX_ATTACHED+2 ){ + sqliteErrorMsg(pParse, "too many attached databases - max %d", + MAX_ATTACHED); + pParse->rc = SQLITE_ERROR; + return; + } + if( db->aDb==db->aDbStatic ){ + aNew = sqliteMalloc( sizeof(db->aDb[0])*3 ); + if( aNew==0 ) return; + memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2); + }else{ + aNew = sqliteRealloc(db->aDb, sizeof(db->aDb[0])*(db->nDb+1) ); + if( aNew==0 ) return; + } + db->aDb = aNew; + aNew = &db->aDb[db->nDb++]; + memset(aNew, 0, sizeof(*aNew)); + sqliteHashInit(&aNew->tblHash, SQLITE_HASH_STRING, 0); + sqliteHashInit(&aNew->idxHash, SQLITE_HASH_STRING, 0); + sqliteHashInit(&aNew->trigHash, SQLITE_HASH_STRING, 0); + sqliteHashInit(&aNew->aFKey, SQLITE_HASH_STRING, 1); + + zName = 0; + sqliteSetNString(&zName, pDbname->z, pDbname->n, 0); + if( zName==0 ) return; + sqliteDequote(zName); + for(i=0; i<db->nDb; i++){ + if( db->aDb[i].zName && sqliteStrICmp(db->aDb[i].zName, zName)==0 ){ + sqliteErrorMsg(pParse, "database %z is already in use", zName); + db->nDb--; + pParse->rc = SQLITE_ERROR; + return; + } + } + aNew->zName = zName; + zFile = 0; + sqliteSetNString(&zFile, pFilename->z, pFilename->n, 0); + if( zFile==0 ) return; + sqliteDequote(zFile); + rc = sqliteBtreeFactory(db, zFile, 0, MAX_PAGES, &aNew->pBt); + if( rc ){ + sqliteErrorMsg(pParse, "unable to open database: %s", zFile); + } + sqliteFree(zFile); + db->flags &= ~SQLITE_Initialized; + if( pParse->nErr ) return; + rc = sqliteInit(pParse->db, &pParse->zErrMsg); + if( rc ){ + sqliteResetInternalSchema(db, 0); + pParse->nErr++; + pParse->rc = SQLITE_ERROR; + } +} + +/* +** This routine is called by the parser to process a DETACH statement: +** +** DETACH DATABASE dbname +** +** The pDbname argument is the name of the database in the DETACH statement. +*/ +void sqliteDetach(Parse *pParse, Token *pDbname){ + int i; + sqlite *db; + + if( pParse->explain ) return; + db = pParse->db; + for(i=0; i<db->nDb; i++){ + if( db->aDb[i].pBt==0 || db->aDb[i].zName==0 ) continue; + if( strlen(db->aDb[i].zName)!=pDbname->n ) continue; + if( sqliteStrNICmp(db->aDb[i].zName, pDbname->z, pDbname->n)==0 ) break; + } + if( i>=db->nDb ){ + sqliteErrorMsg(pParse, "no such database: %T", pDbname); + return; + } + if( i<2 ){ + sqliteErrorMsg(pParse, "cannot detach database %T", pDbname); + return; + } + sqliteBtreeClose(db->aDb[i].pBt); + db->aDb[i].pBt = 0; + sqliteFree(db->aDb[i].zName); + sqliteResetInternalSchema(db, i); + db->nDb--; + if( i<db->nDb ){ + db->aDb[i] = db->aDb[db->nDb]; + memset(&db->aDb[db->nDb], 0, sizeof(db->aDb[0])); + sqliteResetInternalSchema(db, i); + } +} diff --git a/ext/sqlite/libsqlite/src/auth.c b/ext/sqlite/libsqlite/src/auth.c index 76518e705b..547cd18f14 100644 --- a/ext/sqlite/libsqlite/src/auth.c +++ b/ext/sqlite/libsqlite/src/auth.c @@ -28,15 +28,35 @@ ** Set or clear the access authorization function. ** ** The access authorization function is be called during the compilation -** phase to verify that the user has read and/or write access permission +** phase to verify that the user has read and/or write access permission on ** various fields of the database. The first argument to the auth function ** is a copy of the 3rd argument to this routine. The second argument ** to the auth function is one of these constants: ** -** SQLITE_READ_COLUMN -** SQLITE_WRITE_COLUMN -** SQLITE_DELETE_ROW -** SQLITE_INSERT_ROW +** SQLITE_COPY +** SQLITE_CREATE_INDEX +** SQLITE_CREATE_TABLE +** SQLITE_CREATE_TEMP_INDEX +** SQLITE_CREATE_TEMP_TABLE +** SQLITE_CREATE_TEMP_TRIGGER +** SQLITE_CREATE_TEMP_VIEW +** SQLITE_CREATE_TRIGGER +** SQLITE_CREATE_VIEW +** SQLITE_DELETE +** SQLITE_DROP_INDEX +** SQLITE_DROP_TABLE +** SQLITE_DROP_TEMP_INDEX +** SQLITE_DROP_TEMP_TABLE +** SQLITE_DROP_TEMP_TRIGGER +** SQLITE_DROP_TEMP_VIEW +** SQLITE_DROP_TRIGGER +** SQLITE_DROP_VIEW +** SQLITE_INSERT +** SQLITE_PRAGMA +** SQLITE_READ +** SQLITE_SELECT +** SQLITE_TRANSACTION +** SQLITE_UPDATE ** ** The third and fourth arguments to the auth function are the name of ** the table and the column that are being accessed. The auth function @@ -52,7 +72,7 @@ */ int sqlite_set_authorizer( sqlite *db, - int (*xAuth)(void*,int,const char*,const char*), + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), void *pArg ){ db->xAuth = xAuth; @@ -76,8 +96,8 @@ static void sqliteAuthBadReturnCode(Parse *pParse, int rc){ /* ** The pExpr should be a TK_COLUMN expression. The table referred to -** is in pTabList with an offset of base. Check to see if it is OK to read -** this particular column. +** is in pTabList or else it is the NEW or OLD table of a trigger. +** Check to see if it is OK to read this particular column. ** ** If the auth function returns SQLITE_IGNORE, change the TK_COLUMN ** instruction into a TK_NULL. If the auth function returns SQLITE_DENY, @@ -86,17 +106,32 @@ static void sqliteAuthBadReturnCode(Parse *pParse, int rc){ void sqliteAuthRead( Parse *pParse, /* The parser context */ Expr *pExpr, /* The expression to check authorization on */ - SrcList *pTabList, /* All table that pExpr might refer to */ - int base /* Offset of pTabList relative to pExpr */ + SrcList *pTabList /* All table that pExpr might refer to */ ){ sqlite *db = pParse->db; int rc; - Table *pTab; - const char *zCol; + Table *pTab; /* The table being read */ + const char *zCol; /* Name of the column of the table */ + int iSrc; /* Index in pTabList->a[] of table being read */ + const char *zDBase; /* Name of database being accessed */ + if( db->xAuth==0 ) return; assert( pExpr->op==TK_COLUMN ); - assert( pExpr->iTable>=base && pExpr->iTable<base+pTabList->nSrc ); - pTab = pTabList->a[pExpr->iTable-base].pTab; + for(iSrc=0; iSrc<pTabList->nSrc; iSrc++){ + if( pExpr->iTable==pTabList->a[iSrc].iCursor ) break; + } + if( iSrc>=0 && iSrc<pTabList->nSrc ){ + pTab = pTabList->a[iSrc].pTab; + }else{ + /* This must be an attempt to read the NEW or OLD pseudo-tables + ** of a trigger. + */ + TriggerStack *pStack; /* The stack of current triggers */ + pStack = pParse->trigStack; + assert( pStack!=0 ); + assert( pExpr->iTable==pStack->newIdx || pExpr->iTable==pStack->oldIdx ); + pTab = pStack->pTab; + } if( pTab==0 ) return; if( pExpr->iColumn>=0 ){ assert( pExpr->iColumn<pTab->nCol ); @@ -107,12 +142,20 @@ void sqliteAuthRead( }else{ zCol = "ROWID"; } - rc = db->xAuth(db->pAuthArg, SQLITE_READ, pTab->zName, zCol); + assert( pExpr->iDb<db->nDb ); + zDBase = db->aDb[pExpr->iDb].zName; + rc = db->xAuth(db->pAuthArg, SQLITE_READ, pTab->zName, zCol, zDBase, + pParse->zAuthContext); if( rc==SQLITE_IGNORE ){ pExpr->op = TK_NULL; }else if( rc==SQLITE_DENY ){ - sqliteSetString(&pParse->zErrMsg,"access to ", - pTab->zName, ".", zCol, " is prohibited", 0); + if( db->nDb>2 || pExpr->iDb!=0 ){ + sqliteSetString(&pParse->zErrMsg,"access to ", zDBase, ".", + pTab->zName, ".", zCol, " is prohibited", 0); + }else{ + sqliteSetString(&pParse->zErrMsg,"access to ", pTab->zName, ".", + zCol, " is prohibited", 0); + } pParse->nErr++; pParse->rc = SQLITE_AUTH; }else if( rc!=SQLITE_OK ){ @@ -130,14 +173,16 @@ int sqliteAuthCheck( Parse *pParse, int code, const char *zArg1, - const char *zArg2 + const char *zArg2, + const char *zArg3 ){ sqlite *db = pParse->db; int rc; + if( db->xAuth==0 ){ return SQLITE_OK; } - rc = db->xAuth(db->pAuthArg, code, zArg1, zArg2); + rc = db->xAuth(db->pAuthArg, code, zArg1, zArg2, zArg3, pParse->zAuthContext); if( rc==SQLITE_DENY ){ sqliteSetString(&pParse->zErrMsg, "not authorized", 0); pParse->rc = SQLITE_AUTH; @@ -149,4 +194,32 @@ int sqliteAuthCheck( return rc; } +/* +** Push an authorization context. After this routine is called, the +** zArg3 argument to authorization callbacks will be zContext until +** popped. Or if pParse==0, this routine is a no-op. +*/ +void sqliteAuthContextPush( + Parse *pParse, + AuthContext *pContext, + const char *zContext +){ + pContext->pParse = pParse; + if( pParse ){ + pContext->zAuthContext = pParse->zAuthContext; + pParse->zAuthContext = zContext; + } +} + +/* +** Pop an authorization context that was previously pushed +** by sqliteAuthContextPush +*/ +void sqliteAuthContextPop(AuthContext *pContext){ + if( pContext->pParse ){ + pContext->pParse->zAuthContext = pContext->zAuthContext; + pContext->pParse = 0; + } +} + #endif /* SQLITE_OMIT_AUTHORIZATION */ diff --git a/ext/sqlite/libsqlite/src/btree.c b/ext/sqlite/libsqlite/src/btree.c index 41913fc551..30979d0e31 100644 --- a/ext/sqlite/libsqlite/src/btree.c +++ b/ext/sqlite/libsqlite/src/btree.c @@ -54,6 +54,10 @@ #include "btree.h" #include <assert.h> +/* Forward declarations */ +static BtOps sqliteBtreeOps; +static BtCursorOps sqliteBtreeCursorOps; + /* ** Macros used for byteswapping. B is a pointer to the Btree ** structure. This is needed to access the Btree.needSwab boolean @@ -61,7 +65,7 @@ ** X is an unsigned integer. SWAB16 byte swaps a 16-bit integer. ** SWAB32 byteswaps a 32-bit integer. */ -#define SWAB16(B,X) ((B)->needSwab? swab16(X) : (X)) +#define SWAB16(B,X) ((B)->needSwab? swab16((u16)X) : ((u16)X)) #define SWAB32(B,X) ((B)->needSwab? swab32(X) : (X)) #define SWAB_ADD(B,X,A) \ if((B)->needSwab){ X=swab32(swab32(X)+A); }else{ X += (A); } @@ -340,6 +344,7 @@ struct MemPage { ** Everything we need to know about an open database */ struct Btree { + BtOps *pOps; /* Function table */ Pager *pPager; /* The page cache */ BtCursor *pCursor; /* A list of all open cursors */ PageOne *page1; /* First page of the database */ @@ -356,6 +361,7 @@ typedef Btree Bt; ** MemPage.apCell[] of the entry. */ struct BtCursor { + BtCursorOps *pOps; /* Function table */ Btree *pBt; /* The Btree to which this cursor belongs */ BtCursor *pNext, *pPrev; /* Forms a linked list of all cursors */ BtCursor *pShared; /* Loop of cursors with the same root page */ @@ -375,6 +381,9 @@ struct BtCursor { #define SKIP_PREV 2 /* The next sqliteBtreePrevious() is a no-op */ #define SKIP_INVALID 3 /* Calls to Next() and Previous() are invalid */ +/* Forward declarations */ +static int fileBtreeCloseCursor(BtCursor *pCur); + /* ** Routines for byte swapping. */ @@ -527,7 +536,7 @@ static void freeSpace(Btree *pBt, MemPage *pPage, int start, int size){ if( idx + iSize + size == SWAB16(pBt, pFBlk->iNext) ){ pNext = (FreeBlk*)&pPage->u.aDisk[idx + iSize + size]; if( pBt->needSwab ){ - pFBlk->iSize = swab16(swab16(pNext->iSize)+iSize+size); + pFBlk->iSize = swab16((u16)swab16(pNext->iSize)+iSize+size); }else{ pFBlk->iSize += pNext->iSize; } @@ -709,6 +718,7 @@ int sqliteBtreeOpen( pBt->pCursor = 0; pBt->page1 = 0; pBt->readOnly = sqlitepager_isreadonly(pBt->pPager); + pBt->pOps = &sqliteBtreeOps; *ppBtree = pBt; return SQLITE_OK; } @@ -716,9 +726,9 @@ int sqliteBtreeOpen( /* ** Close an open database and invalidate all cursors. */ -int sqliteBtreeClose(Btree *pBt){ +static int fileBtreeClose(Btree *pBt){ while( pBt->pCursor ){ - sqliteBtreeCloseCursor(pBt->pCursor); + fileBtreeCloseCursor(pBt->pCursor); } sqlitepager_close(pBt->pPager); sqliteFree(pBt); @@ -740,7 +750,7 @@ int sqliteBtreeClose(Btree *pBt){ ** Synchronous is on by default so database corruption is not ** normally a worry. */ -int sqliteBtreeSetCacheSize(Btree *pBt, int mxPage){ +static int fileBtreeSetCacheSize(Btree *pBt, int mxPage){ sqlitepager_set_cachesize(pBt->pPager, mxPage); return SQLITE_OK; } @@ -753,7 +763,7 @@ int sqliteBtreeSetCacheSize(Btree *pBt, int mxPage){ ** is a very low but non-zero probability of damage. Level 3 reduces the ** probability of damage to near zero but with a write performance reduction. */ -int sqliteBtreeSetSafetyLevel(Btree *pBt, int level){ +static int fileBtreeSetSafetyLevel(Btree *pBt, int level){ sqlitepager_set_safety_level(pBt->pPager, level); return SQLITE_OK; } @@ -860,7 +870,7 @@ static int newDatabase(Btree *pBt){ ** sqliteBtreeDelete() ** sqliteBtreeUpdateMeta() */ -int sqliteBtreeBeginTrans(Btree *pBt){ +static int fileBtreeBeginTrans(Btree *pBt){ int rc; if( pBt->inTrans ) return SQLITE_ERROR; if( pBt->readOnly ) return SQLITE_READONLY; @@ -889,7 +899,7 @@ int sqliteBtreeBeginTrans(Btree *pBt){ ** This will release the write lock on the database file. If there ** are no active cursors, it also releases the read lock. */ -int sqliteBtreeCommit(Btree *pBt){ +static int fileBtreeCommit(Btree *pBt){ int rc; rc = pBt->readOnly ? SQLITE_OK : sqlitepager_commit(pBt->pPager); pBt->inTrans = 0; @@ -907,7 +917,7 @@ int sqliteBtreeCommit(Btree *pBt){ ** This will release the write lock on the database file. If there ** are no active cursors, it also releases the read lock. */ -int sqliteBtreeRollback(Btree *pBt){ +static int fileBtreeRollback(Btree *pBt){ int rc; BtCursor *pCur; if( pBt->inTrans==0 ) return SQLITE_OK; @@ -934,7 +944,7 @@ int sqliteBtreeRollback(Btree *pBt){ ** Only one checkpoint may be active at a time. It is an error to try ** to start a new checkpoint if another checkpoint is already active. */ -int sqliteBtreeBeginCkpt(Btree *pBt){ +static int fileBtreeBeginCkpt(Btree *pBt){ int rc; if( !pBt->inTrans || pBt->inCkpt ){ return pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR; @@ -949,7 +959,7 @@ int sqliteBtreeBeginCkpt(Btree *pBt){ ** Commit a checkpoint to transaction currently in progress. If no ** checkpoint is active, this is a no-op. */ -int sqliteBtreeCommitCkpt(Btree *pBt){ +static int fileBtreeCommitCkpt(Btree *pBt){ int rc; if( pBt->inCkpt && !pBt->readOnly ){ rc = sqlitepager_ckpt_commit(pBt->pPager); @@ -968,7 +978,7 @@ int sqliteBtreeCommitCkpt(Btree *pBt){ ** to use a cursor that was open at the beginning of this operation ** will result in an error. */ -int sqliteBtreeRollbackCkpt(Btree *pBt){ +static int fileBtreeRollbackCkpt(Btree *pBt){ int rc; BtCursor *pCur; if( pBt->inCkpt==0 || pBt->readOnly ) return SQLITE_OK; @@ -1019,7 +1029,7 @@ int sqliteBtreeRollbackCkpt(Btree *pBt){ ** root page of a b-tree. If it is not, then the cursor acquired ** will not work correctly. */ -int sqliteBtreeCursor(Btree *pBt, int iTable, int wrFlag, BtCursor **ppCur){ +static int fileBtreeCursor(Btree *pBt, int iTable, int wrFlag, BtCursor **ppCur){ int rc; BtCursor *pCur, *pRing; @@ -1044,6 +1054,7 @@ int sqliteBtreeCursor(Btree *pBt, int iTable, int wrFlag, BtCursor **ppCur){ if( rc!=SQLITE_OK ){ goto create_cursor_exception; } + pCur->pOps = &sqliteBtreeCursorOps; pCur->pBt = pBt; pCur->wrFlag = wrFlag; pCur->idx = 0; @@ -1079,7 +1090,7 @@ create_cursor_exception: ** Close a cursor. The read lock on the database file is released ** when the last cursor is closed. */ -int sqliteBtreeCloseCursor(BtCursor *pCur){ +static int fileBtreeCloseCursor(BtCursor *pCur){ Btree *pBt = pCur->pBt; if( pCur->pPrev ){ pCur->pPrev->pNext = pCur->pNext; @@ -1132,7 +1143,7 @@ static void releaseTempCursor(BtCursor *pCur){ ** pointing to an entry (which can happen, for example, if ** the database is empty) then *pSize is set to 0. */ -int sqliteBtreeKeySize(BtCursor *pCur, int *pSize){ +static int fileBtreeKeySize(BtCursor *pCur, int *pSize){ Cell *pCell; MemPage *pPage; @@ -1221,7 +1232,7 @@ static int getPayload(BtCursor *pCur, int offset, int amt, char *zBuf){ ** is raised. The change was made in an effort to boost performance ** by eliminating unneeded tests. */ -int sqliteBtreeKey(BtCursor *pCur, int offset, int amt, char *zBuf){ +static int fileBtreeKey(BtCursor *pCur, int offset, int amt, char *zBuf){ MemPage *pPage; assert( amt>=0 ); @@ -1243,7 +1254,7 @@ int sqliteBtreeKey(BtCursor *pCur, int offset, int amt, char *zBuf){ ** pointing to an entry (which can happen, for example, if ** the database is empty) then *pSize is set to 0. */ -int sqliteBtreeDataSize(BtCursor *pCur, int *pSize){ +static int fileBtreeDataSize(BtCursor *pCur, int *pSize){ Cell *pCell; MemPage *pPage; @@ -1266,7 +1277,7 @@ int sqliteBtreeDataSize(BtCursor *pCur, int *pSize){ ** amount requested if there are not enough bytes in the data ** to satisfy the request. */ -int sqliteBtreeData(BtCursor *pCur, int offset, int amt, char *zBuf){ +static int fileBtreeData(BtCursor *pCur, int offset, int amt, char *zBuf){ Cell *pCell; MemPage *pPage; @@ -1304,7 +1315,7 @@ int sqliteBtreeData(BtCursor *pCur, int offset, int amt, char *zBuf){ ** keys must be exactly the same length. (The length of the pCur key ** is the actual key length minus nIgnore bytes.) */ -int sqliteBtreeKeyCompare( +static int fileBtreeKeyCompare( BtCursor *pCur, /* Pointer to entry to compare against */ const void *pKey, /* Key to compare against entry that pCur points to */ int nKey, /* Number of bytes in pKey */ @@ -1389,6 +1400,7 @@ static int moveToChild(BtCursor *pCur, int newPgno){ sqlitepager_unref(pCur->pPage); pCur->pPage = pNewPage; pCur->idx = 0; + if( pNewPage->nCell<1 ) return SQLITE_CORRUPT; return SQLITE_OK; } @@ -1502,7 +1514,7 @@ static int moveToRightmost(BtCursor *pCur){ ** on success. Set *pRes to 0 if the cursor actually points to something ** or set *pRes to 1 if the table is empty. */ -int sqliteBtreeFirst(BtCursor *pCur, int *pRes){ +static int fileBtreeFirst(BtCursor *pCur, int *pRes){ int rc; if( pCur->pPage==0 ) return SQLITE_ABORT; rc = moveToRoot(pCur); @@ -1521,7 +1533,7 @@ int sqliteBtreeFirst(BtCursor *pCur, int *pRes){ ** on success. Set *pRes to 0 if the cursor actually points to something ** or set *pRes to 1 if the table is empty. */ -int sqliteBtreeLast(BtCursor *pCur, int *pRes){ +static int fileBtreeLast(BtCursor *pCur, int *pRes){ int rc; if( pCur->pPage==0 ) return SQLITE_ABORT; rc = moveToRoot(pCur); @@ -1560,7 +1572,8 @@ int sqliteBtreeLast(BtCursor *pCur, int *pRes){ ** *pRes>0 The cursor is left pointing at an entry that ** is larger than pKey. */ -int sqliteBtreeMoveto(BtCursor *pCur, const void *pKey, int nKey, int *pRes){ +static +int fileBtreeMoveto(BtCursor *pCur, const void *pKey, int nKey, int *pRes){ int rc; if( pCur->pPage==0 ) return SQLITE_ABORT; pCur->eSkip = SKIP_NONE; @@ -1575,7 +1588,7 @@ int sqliteBtreeMoveto(BtCursor *pCur, const void *pKey, int nKey, int *pRes){ upr = pPage->nCell-1; while( lwr<=upr ){ pCur->idx = (lwr+upr)/2; - rc = sqliteBtreeKeyCompare(pCur, pKey, nKey, 0, &c); + rc = fileBtreeKeyCompare(pCur, pKey, nKey, 0, &c); if( rc ) return rc; if( c==0 ){ pCur->iMatch = c; @@ -1613,7 +1626,7 @@ int sqliteBtreeMoveto(BtCursor *pCur, const void *pKey, int nKey, int *pRes){ ** was already pointing to the last entry in the database before ** this routine was called, then set *pRes=1. */ -int sqliteBtreeNext(BtCursor *pCur, int *pRes){ +static int fileBtreeNext(BtCursor *pCur, int *pRes){ int rc; MemPage *pPage = pCur->pPage; assert( pRes!=0 ); @@ -1668,7 +1681,7 @@ int sqliteBtreeNext(BtCursor *pCur, int *pRes){ ** was already pointing to the first entry in the database before ** this routine was called, then set *pRes=1. */ -int sqliteBtreePrevious(BtCursor *pCur, int *pRes){ +static int fileBtreePrevious(BtCursor *pCur, int *pRes){ int rc; Pgno pgno; MemPage *pPage; @@ -2594,7 +2607,7 @@ static int checkReadLocks(BtCursor *pCur){ ** define what database the record should be inserted into. The cursor ** is left pointing at the new record. */ -int sqliteBtreeInsert( +static int fileBtreeInsert( BtCursor *pCur, /* Insert data into the table of this cursor */ const void *pKey, int nKey, /* The key of the new record */ const void *pData, int nData /* The data of the new record */ @@ -2620,7 +2633,7 @@ int sqliteBtreeInsert( if( checkReadLocks(pCur) ){ return SQLITE_LOCKED; /* The table pCur points to has a read lock */ } - rc = sqliteBtreeMoveto(pCur, pKey, nKey, &loc); + rc = fileBtreeMoveto(pCur, pKey, nKey, &loc); if( rc ) return rc; pPage = pCur->pPage; assert( pPage->isInit ); @@ -2662,7 +2675,7 @@ int sqliteBtreeInsert( ** sqliteBtreePrevious() will always leave the cursor pointing at the ** entry immediately before the one that was deleted. */ -int sqliteBtreeDelete(BtCursor *pCur){ +static int fileBtreeDelete(BtCursor *pCur){ MemPage *pPage = pCur->pPage; Cell *pCell; int rc; @@ -2705,7 +2718,7 @@ int sqliteBtreeDelete(BtCursor *pCur){ int szNext; int notUsed; getTempCursor(pCur, &leafCur); - rc = sqliteBtreeNext(&leafCur, ¬Used); + rc = fileBtreeNext(&leafCur, ¬Used); if( rc!=SQLITE_OK ){ return SQLITE_CORRUPT; } @@ -2745,11 +2758,12 @@ int sqliteBtreeDelete(BtCursor *pCur){ ** number for the root page of the new table. ** ** In the current implementation, BTree tables and BTree indices are the -** the same. But in the future, we may change this so that BTree tables +** the same. In the future, we may change this so that BTree tables ** are restricted to having a 4-byte integer key and arbitrary data and ** BTree indices are restricted to having an arbitrary key and no data. +** But for now, this routine also serves to create indices. */ -int sqliteBtreeCreateTable(Btree *pBt, int *piTable){ +static int fileBtreeCreateTable(Btree *pBt, int *piTable){ MemPage *pRoot; Pgno pgnoRoot; int rc; @@ -2770,19 +2784,6 @@ int sqliteBtreeCreateTable(Btree *pBt, int *piTable){ } /* -** Create a new BTree index. Write into *piTable the page -** number for the root page of the new index. -** -** In the current implementation, BTree tables and BTree indices are the -** the same. But in the future, we may change this so that BTree tables -** are restricted to having a 4-byte integer key and arbitrary data and -** BTree indices are restricted to having an arbitrary key and no data. -*/ -int sqliteBtreeCreateIndex(Btree *pBt, int *piIndex){ - return sqliteBtreeCreateTable(pBt, piIndex); -} - -/* ** Erase the given database page and all its children. Return ** the page to the freelist. */ @@ -2825,7 +2826,7 @@ static int clearDatabasePage(Btree *pBt, Pgno pgno, int freePageFlag){ /* ** Delete all information from a single table in the database. */ -int sqliteBtreeClearTable(Btree *pBt, int iTable){ +static int fileBtreeClearTable(Btree *pBt, int iTable){ int rc; BtCursor *pCur; if( !pBt->inTrans ){ @@ -2839,7 +2840,7 @@ int sqliteBtreeClearTable(Btree *pBt, int iTable){ } rc = clearDatabasePage(pBt, (Pgno)iTable, 0); if( rc ){ - sqliteBtreeRollback(pBt); + fileBtreeRollback(pBt); } return rc; } @@ -2849,7 +2850,7 @@ int sqliteBtreeClearTable(Btree *pBt, int iTable){ ** the freelist. Except, the root of the principle table (the one on ** page 2) is never added to the freelist. */ -int sqliteBtreeDropTable(Btree *pBt, int iTable){ +static int fileBtreeDropTable(Btree *pBt, int iTable){ int rc; MemPage *pPage; BtCursor *pCur; @@ -2863,7 +2864,7 @@ int sqliteBtreeDropTable(Btree *pBt, int iTable){ } rc = sqlitepager_get(pBt->pPager, (Pgno)iTable, (void**)&pPage); if( rc ) return rc; - rc = sqliteBtreeClearTable(pBt, iTable); + rc = fileBtreeClearTable(pBt, iTable); if( rc ) return rc; if( iTable>2 ){ rc = freePage(pBt, pPage, iTable); @@ -2874,10 +2875,109 @@ int sqliteBtreeDropTable(Btree *pBt, int iTable){ return rc; } +#if 0 /* UNTESTED */ +/* +** Copy all cell data from one database file into another. +** pages back the freelist. +*/ +static int copyCell(Btree *pBtFrom, BTree *pBtTo, Cell *pCell){ + Pager *pFromPager = pBtFrom->pPager; + OverflowPage *pOvfl; + Pgno ovfl, nextOvfl; + Pgno *pPrev; + int rc = SQLITE_OK; + MemPage *pNew, *pPrevPg; + Pgno new; + + if( NKEY(pBtTo, pCell->h) + NDATA(pBtTo, pCell->h) <= MX_LOCAL_PAYLOAD ){ + return SQLITE_OK; + } + pPrev = &pCell->ovfl; + pPrevPg = 0; + ovfl = SWAB32(pBtTo, pCell->ovfl); + while( ovfl && rc==SQLITE_OK ){ + rc = sqlitepager_get(pFromPager, ovfl, (void**)&pOvfl); + if( rc ) return rc; + nextOvfl = SWAB32(pBtFrom, pOvfl->iNext); + rc = allocatePage(pBtTo, &pNew, &new, 0); + if( rc==SQLITE_OK ){ + rc = sqlitepager_write(pNew); + if( rc==SQLITE_OK ){ + memcpy(pNew, pOvfl, SQLITE_PAGE_SIZE); + *pPrev = SWAB32(pBtTo, new); + if( pPrevPg ){ + sqlitepager_unref(pPrevPg); + } + pPrev = &pOvfl->iNext; + pPrevPg = pNew; + } + } + sqlitepager_unref(pOvfl); + ovfl = nextOvfl; + } + if( pPrevPg ){ + sqlitepager_unref(pPrevPg); + } + return rc; +} +#endif + + +#if 0 /* UNTESTED */ +/* +** Copy a page of data from one database over to another. +*/ +static int copyDatabasePage( + Btree *pBtFrom, + Pgno pgnoFrom, + Btree *pBtTo, + Pgno *pTo +){ + MemPage *pPageFrom, *pPage; + Pgno to; + int rc; + Cell *pCell; + int idx; + + rc = sqlitepager_get(pBtFrom->pPager, pgno, (void**)&pPageFrom); + if( rc ) return rc; + rc = allocatePage(pBt, &pPage, pTo, 0); + if( rc==SQLITE_OK ){ + rc = sqlitepager_write(pPage); + } + if( rc==SQLITE_OK ){ + memcpy(pPage, pPageFrom, SQLITE_PAGE_SIZE); + idx = SWAB16(pBt, pPage->u.hdr.firstCell); + while( idx>0 ){ + pCell = (Cell*)&pPage->u.aDisk[idx]; + idx = SWAB16(pBt, pCell->h.iNext); + if( pCell->h.leftChild ){ + Pgno newChld; + rc = copyDatabasePage(pBtFrom, SWAB32(pBtFrom, pCell->h.leftChild), + pBtTo, &newChld); + if( rc ) return rc; + pCell->h.leftChild = SWAB32(pBtFrom, newChld); + } + rc = copyCell(pBtFrom, pBtTo, pCell); + if( rc ) return rc; + } + if( pPage->u.hdr.rightChild ){ + Pgno newChld; + rc = copyDatabasePage(pBtFrom, SWAB32(pBtFrom, pPage->u.hdr.rightChild), + pBtTo, &newChld); + if( rc ) return rc; + pPage->u.hdr.rightChild = SWAB32(pBtTo, newChild); + } + } + sqlitepager_unref(pPage); + return rc; +} +#endif + /* ** Read the meta-information out of a database file. */ -int sqliteBtreeGetMeta(Btree *pBt, int *aMeta){ +static int fileBtreeGetMeta(Btree *pBt, int *aMeta){ PageOne *pP1; int rc; int i; @@ -2895,7 +2995,7 @@ int sqliteBtreeGetMeta(Btree *pBt, int *aMeta){ /* ** Write meta-information back into the database. */ -int sqliteBtreeUpdateMeta(Btree *pBt, int *aMeta){ +static int fileBtreeUpdateMeta(Btree *pBt, int *aMeta){ PageOne *pP1; int rc, i; if( !pBt->inTrans ){ @@ -2921,7 +3021,7 @@ int sqliteBtreeUpdateMeta(Btree *pBt, int *aMeta){ ** is used for debugging and testing only. */ #ifdef SQLITE_TEST -int sqliteBtreePageDump(Btree *pBt, int pgno, int recursive){ +static int fileBtreePageDump(Btree *pBt, int pgno, int recursive){ int rc; MemPage *pPage; int i, j; @@ -2982,10 +3082,10 @@ int sqliteBtreePageDump(Btree *pBt, int pgno, int recursive){ idx = SWAB16(pBt, pPage->u.hdr.firstCell); while( idx>0 && idx<SQLITE_PAGE_SIZE-MIN_CELL_SIZE ){ Cell *pCell = (Cell*)&pPage->u.aDisk[idx]; - sqliteBtreePageDump(pBt, SWAB32(pBt, pCell->h.leftChild), 1); + fileBtreePageDump(pBt, SWAB32(pBt, pCell->h.leftChild), 1); idx = SWAB16(pBt, pCell->h.iNext); } - sqliteBtreePageDump(pBt, SWAB32(pBt, pPage->u.hdr.rightChild), 1); + fileBtreePageDump(pBt, SWAB32(pBt, pPage->u.hdr.rightChild), 1); } sqlitepager_unref(pPage); return SQLITE_OK; @@ -3008,7 +3108,7 @@ int sqliteBtreePageDump(Btree *pBt, int pgno, int recursive){ ** ** This routine is used for testing and debugging only. */ -int sqliteBtreeCursorDump(BtCursor *pCur, int *aResult){ +static int fileBtreeCursorDump(BtCursor *pCur, int *aResult){ int cnt, idx; MemPage *pPage = pCur->pPage; Btree *pBt = pCur->pBt; @@ -3040,7 +3140,7 @@ int sqliteBtreeCursorDump(BtCursor *pCur, int *aResult){ ** Return the pager associated with a BTree. This routine is used for ** testing and debugging only. */ -Pager *sqliteBtreePager(Btree *pBt){ +static Pager *fileBtreePager(Btree *pBt){ return pBt->pPager; } #endif @@ -3129,7 +3229,7 @@ static void checkList( FreelistInfo *pInfo = (FreelistInfo*)pOvfl->aPayload; int n = SWAB32(pCheck->pBt, pInfo->nFree); for(i=0; i<n; i++){ - checkRef(pCheck, SWAB32(pCheck->pBt, pInfo->aFree[i]), zMsg); + checkRef(pCheck, SWAB32(pCheck->pBt, pInfo->aFree[i]), zContext); } N -= n; } @@ -3320,7 +3420,7 @@ static int checkTreePage( ** and a pointer to that error message is returned. The calling function ** is responsible for freeing the error message when it is done. */ -char *sqliteBtreeIntegrityCheck(Btree *pBt, int *aRoot, int nRoot){ +char *fileBtreeIntegrityCheck(Btree *pBt, int *aRoot, int nRoot){ int i; int nRef; IntegrityCk sCheck; @@ -3380,3 +3480,104 @@ char *sqliteBtreeIntegrityCheck(Btree *pBt, int *aRoot, int nRoot){ sqliteFree(sCheck.anRef); return sCheck.zErrMsg; } + +/* +** Return the full pathname of the underlying database file. +*/ +static const char *fileBtreeGetFilename(Btree *pBt){ + assert( pBt->pPager!=0 ); + return sqlitepager_filename(pBt->pPager); +} + +/* +** Copy the complete content of pBtFrom into pBtTo. A transaction +** must be active for both files. +** +** The size of file pBtFrom may be reduced by this operation. +** If anything goes wrong, the transaction on pBtFrom is rolled back. +*/ +static int fileBtreeCopyFile(Btree *pBtTo, Btree *pBtFrom){ + int rc = SQLITE_OK; + Pgno i, nPage, nToPage; + + if( !pBtTo->inTrans || !pBtFrom->inTrans ) return SQLITE_ERROR; + if( pBtTo->needSwab!=pBtFrom->needSwab ) return SQLITE_ERROR; + if( pBtTo->pCursor ) return SQLITE_BUSY; + memcpy(pBtTo->page1, pBtFrom->page1, SQLITE_PAGE_SIZE); + rc = sqlitepager_overwrite(pBtTo->pPager, 1, pBtFrom->page1); + nToPage = sqlitepager_pagecount(pBtTo->pPager); + nPage = sqlitepager_pagecount(pBtFrom->pPager); + for(i=2; rc==SQLITE_OK && i<=nPage; i++){ + void *pPage; + rc = sqlitepager_get(pBtFrom->pPager, i, &pPage); + if( rc ) break; + rc = sqlitepager_overwrite(pBtTo->pPager, i, pPage); + if( rc ) break; + sqlitepager_unref(pPage); + } + for(i=nPage+1; rc==SQLITE_OK && i<=nToPage; i++){ + void *pPage; + rc = sqlitepager_get(pBtTo->pPager, i, &pPage); + if( rc ) break; + rc = sqlitepager_write(pPage); + sqlitepager_unref(pPage); + sqlitepager_dont_write(pBtTo->pPager, i); + } + if( !rc && nPage<nToPage ){ + rc = sqlitepager_truncate(pBtTo->pPager, nPage); + } + if( rc ){ + fileBtreeRollback(pBtTo); + } + return rc; +} + +/* +** The following tables contain pointers to all of the interface +** routines for this implementation of the B*Tree backend. To +** substitute a different implemention of the backend, one has merely +** to provide pointers to alternative functions in similar tables. +*/ +static BtOps sqliteBtreeOps = { + fileBtreeClose, + fileBtreeSetCacheSize, + fileBtreeSetSafetyLevel, + fileBtreeBeginTrans, + fileBtreeCommit, + fileBtreeRollback, + fileBtreeBeginCkpt, + fileBtreeCommitCkpt, + fileBtreeRollbackCkpt, + fileBtreeCreateTable, + fileBtreeCreateTable, /* Really sqliteBtreeCreateIndex() */ + fileBtreeDropTable, + fileBtreeClearTable, + fileBtreeCursor, + fileBtreeGetMeta, + fileBtreeUpdateMeta, + fileBtreeIntegrityCheck, + fileBtreeGetFilename, + fileBtreeCopyFile, +#ifdef SQLITE_TEST + fileBtreePageDump, + fileBtreePager +#endif +}; +static BtCursorOps sqliteBtreeCursorOps = { + fileBtreeMoveto, + fileBtreeDelete, + fileBtreeInsert, + fileBtreeFirst, + fileBtreeLast, + fileBtreeNext, + fileBtreePrevious, + fileBtreeKeySize, + fileBtreeKey, + fileBtreeKeyCompare, + fileBtreeDataSize, + fileBtreeData, + fileBtreeCloseCursor, +#ifdef SQLITE_TEST + fileBtreeCursorDump, +#endif +}; diff --git a/ext/sqlite/libsqlite/src/btree.h b/ext/sqlite/libsqlite/src/btree.h index 84c80c5eff..064b7f97dd 100644 --- a/ext/sqlite/libsqlite/src/btree.h +++ b/ext/sqlite/libsqlite/src/btree.h @@ -18,54 +18,139 @@ #ifndef _BTREE_H_ #define _BTREE_H_ +/* +** Forward declarations of structure +*/ typedef struct Btree Btree; typedef struct BtCursor BtCursor; +typedef struct BtOps BtOps; +typedef struct BtCursorOps BtCursorOps; -int sqliteBtreeOpen(const char *zFilename, int mode, int nPg, Btree **ppBtree); -int sqliteBtreeClose(Btree*); -int sqliteBtreeSetCacheSize(Btree*, int); -int sqliteBtreeSetSafetyLevel(Btree*, int); -int sqliteBtreeBeginTrans(Btree*); -int sqliteBtreeCommit(Btree*); -int sqliteBtreeRollback(Btree*); -int sqliteBtreeBeginCkpt(Btree*); -int sqliteBtreeCommitCkpt(Btree*); -int sqliteBtreeRollbackCkpt(Btree*); - -int sqliteBtreeCreateTable(Btree*, int*); -int sqliteBtreeCreateIndex(Btree*, int*); -int sqliteBtreeDropTable(Btree*, int); -int sqliteBtreeClearTable(Btree*, int); +/* +** An instance of the following structure contains pointers to all +** methods against an open BTree. Alternative BTree implementations +** (examples: file based versus in-memory) can be created by substituting +** different methods. Users of the BTree cannot tell the difference. +** +** In C++ we could do this by defining a virtual base class and then +** creating subclasses for each different implementation. But this is +** C not C++ so we have to be a little more explicit. +*/ +struct BtOps { + int (*Close)(Btree*); + int (*SetCacheSize)(Btree*, int); + int (*SetSafetyLevel)(Btree*, int); + int (*BeginTrans)(Btree*); + int (*Commit)(Btree*); + int (*Rollback)(Btree*); + int (*BeginCkpt)(Btree*); + int (*CommitCkpt)(Btree*); + int (*RollbackCkpt)(Btree*); + int (*CreateTable)(Btree*, int*); + int (*CreateIndex)(Btree*, int*); + int (*DropTable)(Btree*, int); + int (*ClearTable)(Btree*, int); + int (*Cursor)(Btree*, int iTable, int wrFlag, BtCursor **ppCur); + int (*GetMeta)(Btree*, int*); + int (*UpdateMeta)(Btree*, int*); + char *(*IntegrityCheck)(Btree*, int*, int); + const char *(*GetFilename)(Btree*); + int (*Copyfile)(Btree*,Btree*); +#ifdef SQLITE_TEST + int (*PageDump)(Btree*, int, int); + struct Pager *(*Pager)(Btree*); +#endif +}; -int sqliteBtreeCursor(Btree*, int iTable, int wrFlag, BtCursor **ppCur); -int sqliteBtreeMoveto(BtCursor*, const void *pKey, int nKey, int *pRes); -int sqliteBtreeDelete(BtCursor*); -int sqliteBtreeInsert(BtCursor*, const void *pKey, int nKey, - const void *pData, int nData); -int sqliteBtreeFirst(BtCursor*, int *pRes); -int sqliteBtreeLast(BtCursor*, int *pRes); -int sqliteBtreeNext(BtCursor*, int *pRes); -int sqliteBtreePrevious(BtCursor*, int *pRes); -int sqliteBtreeKeySize(BtCursor*, int *pSize); -int sqliteBtreeKey(BtCursor*, int offset, int amt, char *zBuf); -int sqliteBtreeKeyCompare(BtCursor*, const void *pKey, int nKey, - int nIgnore, int *pRes); -int sqliteBtreeDataSize(BtCursor*, int *pSize); -int sqliteBtreeData(BtCursor*, int offset, int amt, char *zBuf); -int sqliteBtreeCloseCursor(BtCursor*); +/* +** An instance of this structure defines all of the methods that can +** be executed against a cursor. +*/ +struct BtCursorOps { + int (*Moveto)(BtCursor*, const void *pKey, int nKey, int *pRes); + int (*Delete)(BtCursor*); + int (*Insert)(BtCursor*, const void *pKey, int nKey, + const void *pData, int nData); + int (*First)(BtCursor*, int *pRes); + int (*Last)(BtCursor*, int *pRes); + int (*Next)(BtCursor*, int *pRes); + int (*Previous)(BtCursor*, int *pRes); + int (*KeySize)(BtCursor*, int *pSize); + int (*Key)(BtCursor*, int offset, int amt, char *zBuf); + int (*KeyCompare)(BtCursor*, const void *pKey, int nKey, + int nIgnore, int *pRes); + int (*DataSize)(BtCursor*, int *pSize); + int (*Data)(BtCursor*, int offset, int amt, char *zBuf); + int (*CloseCursor)(BtCursor*); +#ifdef SQLITE_TEST + int (*CursorDump)(BtCursor*, int*); +#endif +}; +/* +** The number of 4-byte "meta" values contained on the first page of each +** database file. +*/ #define SQLITE_N_BTREE_META 10 -int sqliteBtreeGetMeta(Btree*, int*); -int sqliteBtreeUpdateMeta(Btree*, int*); -char *sqliteBtreeIntegrityCheck(Btree*, int*, int); +int sqliteBtreeOpen(const char *zFilename, int mode, int nPg, Btree **ppBtree); +int sqliteRBtreeOpen(const char *zFilename, int mode, int nPg, Btree **ppBtree); + +#define btOps(pBt) (*((BtOps **)(pBt))) +#define btCOps(pCur) (*((BtCursorOps **)(pCur))) + +#define sqliteBtreeClose(pBt) (btOps(pBt)->Close(pBt)) +#define sqliteBtreeSetCacheSize(pBt, sz) (btOps(pBt)->SetCacheSize(pBt, sz)) +#define sqliteBtreeSetSafetyLevel(pBt, sl) (btOps(pBt)->SetSafetyLevel(pBt, sl)) +#define sqliteBtreeBeginTrans(pBt) (btOps(pBt)->BeginTrans(pBt)) +#define sqliteBtreeCommit(pBt) (btOps(pBt)->Commit(pBt)) +#define sqliteBtreeRollback(pBt) (btOps(pBt)->Rollback(pBt)) +#define sqliteBtreeBeginCkpt(pBt) (btOps(pBt)->BeginCkpt(pBt)) +#define sqliteBtreeCommitCkpt(pBt) (btOps(pBt)->CommitCkpt(pBt)) +#define sqliteBtreeRollbackCkpt(pBt) (btOps(pBt)->RollbackCkpt(pBt)) +#define sqliteBtreeCreateTable(pBt,piTable)\ + (btOps(pBt)->CreateTable(pBt,piTable)) +#define sqliteBtreeCreateIndex(pBt, piIndex)\ + (btOps(pBt)->CreateIndex(pBt, piIndex)) +#define sqliteBtreeDropTable(pBt, iTable) (btOps(pBt)->DropTable(pBt, iTable)) +#define sqliteBtreeClearTable(pBt, iTable)\ + (btOps(pBt)->ClearTable(pBt, iTable)) +#define sqliteBtreeCursor(pBt, iTable, wrFlag, ppCur)\ + (btOps(pBt)->Cursor(pBt, iTable, wrFlag, ppCur)) +#define sqliteBtreeMoveto(pCur, pKey, nKey, pRes)\ + (btCOps(pCur)->Moveto(pCur, pKey, nKey, pRes)) +#define sqliteBtreeDelete(pCur) (btCOps(pCur)->Delete(pCur)) +#define sqliteBtreeInsert(pCur, pKey, nKey, pData, nData) \ + (btCOps(pCur)->Insert(pCur, pKey, nKey, pData, nData)) +#define sqliteBtreeFirst(pCur, pRes) (btCOps(pCur)->First(pCur, pRes)) +#define sqliteBtreeLast(pCur, pRes) (btCOps(pCur)->Last(pCur, pRes)) +#define sqliteBtreeNext(pCur, pRes) (btCOps(pCur)->Next(pCur, pRes)) +#define sqliteBtreePrevious(pCur, pRes) (btCOps(pCur)->Previous(pCur, pRes)) +#define sqliteBtreeKeySize(pCur, pSize) (btCOps(pCur)->KeySize(pCur, pSize) ) +#define sqliteBtreeKey(pCur, offset, amt, zBuf)\ + (btCOps(pCur)->Key(pCur, offset, amt, zBuf)) +#define sqliteBtreeKeyCompare(pCur, pKey, nKey, nIgnore, pRes)\ + (btCOps(pCur)->KeyCompare(pCur, pKey, nKey, nIgnore, pRes)) +#define sqliteBtreeDataSize(pCur, pSize) (btCOps(pCur)->DataSize(pCur, pSize)) +#define sqliteBtreeData(pCur, offset, amt, zBuf)\ + (btCOps(pCur)->Data(pCur, offset, amt, zBuf)) +#define sqliteBtreeCloseCursor(pCur) (btCOps(pCur)->CloseCursor(pCur)) +#define sqliteBtreeGetMeta(pBt, aMeta) (btOps(pBt)->GetMeta(pBt, aMeta)) +#define sqliteBtreeUpdateMeta(pBt, aMeta) (btOps(pBt)->UpdateMeta(pBt, aMeta)) +#define sqliteBtreeIntegrityCheck(pBt, aRoot, nRoot)\ + (btOps(pBt)->IntegrityCheck(pBt, aRoot, nRoot)) +#define sqliteBtreeGetFilename(pBt) (btOps(pBt)->GetFilename(pBt)) +#define sqliteBtreeCopyFile(pBt1, pBt2) (btOps(pBt1)->Copyfile(pBt1, pBt2)) #ifdef SQLITE_TEST -int sqliteBtreePageDump(Btree*, int, int); -int sqliteBtreeCursorDump(BtCursor*, int*); -struct Pager *sqliteBtreePager(Btree*); +#define sqliteBtreePageDump(pBt, pgno, recursive)\ + (btOps(pBt)->PageDump(pBt, pgno, recursive)) +#define sqliteBtreeCursorDump(pCur, aResult)\ + (btCOps(pCur)->CursorDump(pCur, aResult)) +#define sqliteBtreePager(pBt) (btOps(pBt)->Pager(pBt)) int btree_native_byte_order; -#endif +#endif /* SQLITE_TEST */ + #endif /* _BTREE_H_ */ diff --git a/ext/sqlite/libsqlite/src/btree_rb.c b/ext/sqlite/libsqlite/src/btree_rb.c new file mode 100644 index 0000000000..d4c63a5b8b --- /dev/null +++ b/ext/sqlite/libsqlite/src/btree_rb.c @@ -0,0 +1,1412 @@ +/* +** 2003 Feb 4 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** $Id$ +** +** This file implements an in-core database using Red-Black balanced +** binary trees. +** +** It was contributed to SQLite by anonymous on 2003-Feb-04 23:24:49 UTC. +*/ +#include "btree.h" +#include "sqliteInt.h" +#include <assert.h> + +/* +** Omit this whole file if the SQLITE_OMIT_INMEMORYDB macro is +** defined. This allows a lot of code to be omitted for installations +** that do not need it. +*/ +#ifndef SQLITE_OMIT_INMEMORYDB + + +typedef struct BtRbTree BtRbTree; +typedef struct BtRbNode BtRbNode; +typedef struct BtRollbackOp BtRollbackOp; +typedef struct Rbtree Rbtree; +typedef struct RbtCursor RbtCursor; + +/* Forward declarations */ +static BtOps sqliteRbtreeOps; +static BtCursorOps sqliteRbtreeCursorOps; + +/* + * During each transaction (or checkpoint), a linked-list of + * "rollback-operations" is accumulated. If the transaction is rolled back, + * then the list of operations must be executed (to restore the database to + * it's state before the transaction started). If the transaction is to be + * committed, just delete the list. + * + * Each operation is represented as follows, depending on the value of eOp: + * + * ROLLBACK_INSERT -> Need to insert (pKey, pData) into table iTab. + * ROLLBACK_DELETE -> Need to delete the record (pKey) into table iTab. + * ROLLBACK_CREATE -> Need to create table iTab. + * ROLLBACK_DROP -> Need to drop table iTab. + */ +struct BtRollbackOp { + u8 eOp; + int iTab; + int nKey; + void *pKey; + int nData; + void *pData; + BtRollbackOp *pNext; +}; + +/* +** Legal values for BtRollbackOp.eOp: +*/ +#define ROLLBACK_INSERT 1 /* Insert a record */ +#define ROLLBACK_DELETE 2 /* Delete a record */ +#define ROLLBACK_CREATE 3 /* Create a table */ +#define ROLLBACK_DROP 4 /* Drop a table */ + +struct Rbtree { + BtOps *pOps; /* Function table */ + int aMetaData[SQLITE_N_BTREE_META]; + + int next_idx; /* next available table index */ + Hash tblHash; /* All created tables, by index */ + u8 isAnonymous; /* True if this Rbtree is to be deleted when closed */ + u8 eTransState; /* State of this Rbtree wrt transactions */ + + BtRollbackOp *pTransRollback; + BtRollbackOp *pCheckRollback; + BtRollbackOp *pCheckRollbackTail; +}; + +/* +** Legal values for Rbtree.eTransState. +*/ +#define TRANS_NONE 0 /* No transaction is in progress */ +#define TRANS_INTRANSACTION 1 /* A transaction is in progress */ +#define TRANS_INCHECKPOINT 2 /* A checkpoint is in progress */ +#define TRANS_ROLLBACK 3 /* We are currently rolling back a checkpoint or + * transaction. */ + +struct RbtCursor { + BtCursorOps *pOps; /* Function table */ + Rbtree *pRbtree; + BtRbTree *pTree; + int iTree; /* Index of pTree in pRbtree */ + BtRbNode *pNode; + u8 eSkip; /* Determines if next step operation is a no-op */ +}; + +/* +** Legal values for RbtCursor.eSkip. +*/ +#define SKIP_NONE 0 /* Always step the cursor */ +#define SKIP_NEXT 1 /* The next sqliteRbtreeNext() is a no-op */ +#define SKIP_PREV 2 /* The next sqliteRbtreePrevious() is a no-op */ +#define SKIP_INVALID 3 /* Calls to Next() and Previous() are invalid */ + +struct BtRbTree { + BtRbNode *pHead; /* Head of the tree, or NULL */ +}; + +struct BtRbNode { + int nKey; + void *pKey; + int nData; + void *pData; + u8 isBlack; /* true for a black node, 0 for a red node */ + BtRbNode *pParent; /* Nodes parent node, NULL for the tree head */ + BtRbNode *pLeft; /* Nodes left child, or NULL */ + BtRbNode *pRight; /* Nodes right child, or NULL */ + + int nBlackHeight; /* Only used during the red-black integrity check */ +}; + +/* Forward declarations */ +static int memRbtreeMoveto( + RbtCursor* pCur, + const void *pKey, + int nKey, + int *pRes +); +static int memRbtreeClearTable(Rbtree* tree, int n); +static int memRbtreeNext(RbtCursor* pCur, int *pRes); +static int memRbtreeLast(RbtCursor* pCur, int *pRes); +static int memRbtreePrevious(RbtCursor* pCur, int *pRes); + +/* + * The key-compare function for the red-black trees. Returns as follows: + * + * (key1 < key2) -1 + * (key1 == key2) 0 + * (key1 > key2) 1 + * + * Keys are compared using memcmp(). If one key is an exact prefix of the + * other, then the shorter key is less than the longer key. + */ +static int key_compare(void const*pKey1, int nKey1, void const*pKey2, int nKey2) +{ + int mcmp = memcmp(pKey1, pKey2, (nKey1 <= nKey2)?nKey1:nKey2); + if( mcmp == 0){ + if( nKey1 == nKey2 ) return 0; + return ((nKey1 < nKey2)?-1:1); + } + return ((mcmp>0)?1:-1); +} + +/* + * Perform the LEFT-rotate transformation on node X of tree pTree. This + * transform is part of the red-black balancing code. + * + * | | + * X Y + * / \ / \ + * a Y X c + * / \ / \ + * b c a b + * + * BEFORE AFTER + */ +static void leftRotate(BtRbTree *pTree, BtRbNode *pX) +{ + BtRbNode *pY; + BtRbNode *pb; + pY = pX->pRight; + pb = pY->pLeft; + + pY->pParent = pX->pParent; + if( pX->pParent ){ + if( pX->pParent->pLeft == pX ) pX->pParent->pLeft = pY; + else pX->pParent->pRight = pY; + } + pY->pLeft = pX; + pX->pParent = pY; + pX->pRight = pb; + if( pb ) pb->pParent = pX; + if( pTree->pHead == pX ) pTree->pHead = pY; +} + +/* + * Perform the RIGHT-rotate transformation on node X of tree pTree. This + * transform is part of the red-black balancing code. + * + * | | + * X Y + * / \ / \ + * Y c a X + * / \ / \ + * a b b c + * + * BEFORE AFTER + */ +static void rightRotate(BtRbTree *pTree, BtRbNode *pX) +{ + BtRbNode *pY; + BtRbNode *pb; + pY = pX->pLeft; + pb = pY->pRight; + + pY->pParent = pX->pParent; + if( pX->pParent ){ + if( pX->pParent->pLeft == pX ) pX->pParent->pLeft = pY; + else pX->pParent->pRight = pY; + } + pY->pRight = pX; + pX->pParent = pY; + pX->pLeft = pb; + if( pb ) pb->pParent = pX; + if( pTree->pHead == pX ) pTree->pHead = pY; +} + +/* + * A string-manipulation helper function for check_redblack_tree(). If (orig == + * NULL) a copy of val is returned. If (orig != NULL) then a copy of the * + * concatenation of orig and val is returned. The original orig is deleted + * (using sqliteFree()). + */ +static char *append_val(char * orig, char const * val) +{ + if( !orig ){ + return sqliteStrDup( val ); + } else{ + char * ret = 0; + sqliteSetString(&ret, orig, val, 0); + sqliteFree( orig ); + return ret; + } + assert(0); +} + +/* + * Append a string representation of the entire node to orig and return it. + * This is used to produce debugging information if check_redblack_tree() finds + * a problem with a red-black binary tree. + */ +static char *append_node(char * orig, BtRbNode *pNode, int indent) +{ + char buf[128]; + int i; + + for( i=0; i<indent; i++ ){ + orig = append_val(orig, " "); + } + + sprintf(buf, "%p", pNode); + orig = append_val(orig, buf); + + if( pNode ){ + indent += 3; + if( pNode->isBlack ){ + orig = append_val(orig, " B \n"); + }else{ + orig = append_val(orig, " R \n"); + } + orig = append_node( orig, pNode->pLeft, indent ); + orig = append_node( orig, pNode->pRight, indent ); + }else{ + orig = append_val(orig, "\n"); + } + return orig; +} + +/* + * Print a representation of a node to stdout. This function is only included + * so you can call it from within a debugger if things get really bad. + */ +static void print_node(BtRbNode *pNode) +{ + char * str = append_node(0, pNode, 0); + printf(str); +} + +/* + * Check the following properties of the red-black tree: + * (1) - If a node is red, both of it's children are black + * (2) - Each path from a given node to a leaf (NULL) node passes thru the + * same number of black nodes + * + * If there is a problem, append a description (using append_val() ) to *msg. + */ +static void check_redblack_tree(BtRbTree * tree, char ** msg) +{ + BtRbNode *pNode; + + /* 0 -> came from parent + * 1 -> came from left + * 2 -> came from right */ + int prev_step = 0; + + pNode = tree->pHead; + while( pNode ){ + switch( prev_step ){ + case 0: + if( pNode->pLeft ){ + pNode = pNode->pLeft; + }else{ + prev_step = 1; + } + break; + case 1: + if( pNode->pRight ){ + pNode = pNode->pRight; + prev_step = 0; + }else{ + prev_step = 2; + } + break; + case 2: + /* Check red-black property (1) */ + if( !pNode->isBlack && + ( (pNode->pLeft && !pNode->pLeft->isBlack) || + (pNode->pRight && !pNode->pRight->isBlack) ) + ){ + char buf[128]; + sprintf(buf, "Red node with red child at %p\n", pNode); + *msg = append_val(*msg, buf); + *msg = append_node(*msg, tree->pHead, 0); + *msg = append_val(*msg, "\n"); + } + + /* Check red-black property (2) */ + { + int leftHeight = 0; + int rightHeight = 0; + if( pNode->pLeft ){ + leftHeight += pNode->pLeft->nBlackHeight; + leftHeight += (pNode->pLeft->isBlack?1:0); + } + if( pNode->pRight ){ + rightHeight += pNode->pRight->nBlackHeight; + rightHeight += (pNode->pRight->isBlack?1:0); + } + if( leftHeight != rightHeight ){ + char buf[128]; + sprintf(buf, "Different black-heights at %p\n", pNode); + *msg = append_val(*msg, buf); + *msg = append_node(*msg, tree->pHead, 0); + *msg = append_val(*msg, "\n"); + } + pNode->nBlackHeight = leftHeight; + } + + if( pNode->pParent ){ + if( pNode == pNode->pParent->pLeft ) prev_step = 1; + else prev_step = 2; + } + pNode = pNode->pParent; + break; + default: assert(0); + } + } +} + +/* + * Node pX has just been inserted into pTree (by code in sqliteRbtreeInsert()). + * It is possible that pX is a red node with a red parent, which is a violation + * of the red-black tree properties. This function performs rotations and + * color changes to rebalance the tree + */ +static void do_insert_balancing(BtRbTree *pTree, BtRbNode *pX) +{ + /* In the first iteration of this loop, pX points to the red node just + * inserted in the tree. If the parent of pX exists (pX is not the root + * node) and is red, then the properties of the red-black tree are + * violated. + * + * At the start of any subsequent iterations, pX points to a red node + * with a red parent. In all other respects the tree is a legal red-black + * binary tree. */ + while( pX != pTree->pHead && !pX->pParent->isBlack ){ + BtRbNode *pUncle; + BtRbNode *pGrandparent; + + /* Grandparent of pX must exist and must be black. */ + pGrandparent = pX->pParent->pParent; + assert( pGrandparent ); + assert( pGrandparent->isBlack ); + + /* Uncle of pX may or may not exist. */ + if( pX->pParent == pGrandparent->pLeft ) + pUncle = pGrandparent->pRight; + else + pUncle = pGrandparent->pLeft; + + /* If the uncle of pX exists and is red, we do the following: + * | | + * G(b) G(r) + * / \ / \ + * U(r) P(r) U(b) P(b) + * \ \ + * X(r) X(r) + * + * BEFORE AFTER + * pX is then set to G. If the parent of G is red, then the while loop + * will run again. */ + if( pUncle && !pUncle->isBlack ){ + pGrandparent->isBlack = 0; + pUncle->isBlack = 1; + pX->pParent->isBlack = 1; + pX = pGrandparent; + }else{ + + if( pX->pParent == pGrandparent->pLeft ){ + if( pX == pX->pParent->pRight ){ + /* If pX is a right-child, do the following transform, essentially + * to change pX into a left-child: + * | | + * G(b) G(b) + * / \ / \ + * P(r) U(b) X(r) U(b) + * \ / + * X(r) P(r) <-- new X + * + * BEFORE AFTER + */ + pX = pX->pParent; + leftRotate(pTree, pX); + } + + /* Do the following transform, which balances the tree :) + * | | + * G(b) P(b) + * / \ / \ + * P(r) U(b) X(r) G(r) + * / \ + * X(r) U(b) + * + * BEFORE AFTER + */ + assert( pGrandparent == pX->pParent->pParent ); + pGrandparent->isBlack = 0; + pX->pParent->isBlack = 1; + rightRotate( pTree, pGrandparent ); + + }else{ + /* This code is symetric to the illustrated case above. */ + if( pX == pX->pParent->pLeft ){ + pX = pX->pParent; + rightRotate(pTree, pX); + } + assert( pGrandparent == pX->pParent->pParent ); + pGrandparent->isBlack = 0; + pX->pParent->isBlack = 1; + leftRotate( pTree, pGrandparent ); + } + } + } + pTree->pHead->isBlack = 1; +} + +/* + * A child of pParent, which in turn had child pX, has just been removed from + * pTree (the figure below depicts the operation, Z is being removed). pParent + * or pX, or both may be NULL. + * | | + * P P + * / \ / \ + * Z X + * / \ + * X nil + * + * This function is only called if Z was black. In this case the red-black tree + * properties have been violated, and pX has an "extra black". This function + * performs rotations and color-changes to re-balance the tree. + */ +static +void do_delete_balancing(BtRbTree *pTree, BtRbNode *pX, BtRbNode *pParent) +{ + BtRbNode *pSib; + + /* TODO: Comment this code! */ + while( pX != pTree->pHead && (!pX || pX->isBlack) ){ + if( pX == pParent->pLeft ){ + pSib = pParent->pRight; + if( pSib && !(pSib->isBlack) ){ + pSib->isBlack = 1; + pParent->isBlack = 0; + leftRotate(pTree, pParent); + pSib = pParent->pRight; + } + if( !pSib ){ + pX = pParent; + }else if( + (!pSib->pLeft || pSib->pLeft->isBlack) && + (!pSib->pRight || pSib->pRight->isBlack) ) { + pSib->isBlack = 0; + pX = pParent; + }else{ + if( (!pSib->pRight || pSib->pRight->isBlack) ){ + if( pSib->pLeft ) pSib->pLeft->isBlack = 1; + pSib->isBlack = 0; + rightRotate( pTree, pSib ); + pSib = pParent->pRight; + } + pSib->isBlack = pParent->isBlack; + pParent->isBlack = 1; + if( pSib->pRight ) pSib->pRight->isBlack = 1; + leftRotate(pTree, pParent); + pX = pTree->pHead; + } + }else{ + pSib = pParent->pLeft; + if( pSib && !(pSib->isBlack) ){ + pSib->isBlack = 1; + pParent->isBlack = 0; + rightRotate(pTree, pParent); + pSib = pParent->pLeft; + } + if( !pSib ){ + pX = pParent; + }else if( + (!pSib->pLeft || pSib->pLeft->isBlack) && + (!pSib->pRight || pSib->pRight->isBlack) ){ + pSib->isBlack = 0; + pX = pParent; + }else{ + if( (!pSib->pLeft || pSib->pLeft->isBlack) ){ + if( pSib->pRight ) pSib->pRight->isBlack = 1; + pSib->isBlack = 0; + leftRotate( pTree, pSib ); + pSib = pParent->pLeft; + } + pSib->isBlack = pParent->isBlack; + pParent->isBlack = 1; + if( pSib->pLeft ) pSib->pLeft->isBlack = 1; + rightRotate(pTree, pParent); + pX = pTree->pHead; + } + } + pParent = pX->pParent; + } + if( pX ) pX->isBlack = 1; +} + +/* + * Create table n in tree pRbtree. Table n must not exist. + */ +static void btreeCreateTable(Rbtree* pRbtree, int n) +{ + BtRbTree *pNewTbl = sqliteMalloc(sizeof(BtRbTree)); + sqliteHashInsert(&pRbtree->tblHash, 0, n, pNewTbl); +} + +/* + * Log a single "rollback-op" for the given Rbtree. See comments for struct + * BtRollbackOp. + */ +static void btreeLogRollbackOp(Rbtree* pRbtree, BtRollbackOp *pRollbackOp) +{ + assert( pRbtree->eTransState == TRANS_INCHECKPOINT || + pRbtree->eTransState == TRANS_INTRANSACTION ); + if( pRbtree->eTransState == TRANS_INTRANSACTION ){ + pRollbackOp->pNext = pRbtree->pTransRollback; + pRbtree->pTransRollback = pRollbackOp; + } + if( pRbtree->eTransState == TRANS_INCHECKPOINT ){ + if( !pRbtree->pCheckRollback ){ + pRbtree->pCheckRollbackTail = pRollbackOp; + } + pRollbackOp->pNext = pRbtree->pCheckRollback; + pRbtree->pCheckRollback = pRollbackOp; + } +} + +int sqliteRbtreeOpen( + const char *zFilename, + int mode, + int nPg, + Rbtree **ppRbtree +){ + *ppRbtree = (Rbtree *)sqliteMalloc(sizeof(Rbtree)); + sqliteHashInit(&(*ppRbtree)->tblHash, SQLITE_HASH_INT, 0); + + /* Create a binary tree for the SQLITE_MASTER table at location 2 */ + btreeCreateTable(*ppRbtree, 2); + (*ppRbtree)->next_idx = 3; + (*ppRbtree)->pOps = &sqliteRbtreeOps; + /* Set file type to 4; this is so that "attach ':memory:' as ...." does not + ** think that the database in uninitialised and refuse to attach + */ + (*ppRbtree)->aMetaData[2] = 4; + + return SQLITE_OK; +} + +/* + * Create a new table in the supplied Rbtree. Set *n to the new table number. + * Return SQLITE_OK if the operation is a success. + */ +static int memRbtreeCreateTable(Rbtree* tree, int* n) +{ + assert( tree->eTransState != TRANS_NONE ); + + *n = tree->next_idx++; + btreeCreateTable(tree, *n); + + /* Set up the rollback structure (if we are not doing this as part of a + * rollback) */ + if( tree->eTransState != TRANS_ROLLBACK ){ + BtRollbackOp *pRollbackOp = sqliteMalloc(sizeof(BtRollbackOp)); + pRollbackOp->eOp = ROLLBACK_DROP; + pRollbackOp->iTab = *n; + btreeLogRollbackOp(tree, pRollbackOp); + } + + return SQLITE_OK; +} + +/* + * Delete table n from the supplied Rbtree. + */ +static int memRbtreeDropTable(Rbtree* tree, int n) +{ + BtRbTree *pTree; + assert( tree->eTransState != TRANS_NONE ); + + memRbtreeClearTable(tree, n); + pTree = sqliteHashInsert(&tree->tblHash, 0, n, 0); + assert(pTree); + sqliteFree(pTree); + + if( tree->eTransState != TRANS_ROLLBACK ){ + BtRollbackOp *pRollbackOp = sqliteMalloc(sizeof(BtRollbackOp)); + pRollbackOp->eOp = ROLLBACK_CREATE; + pRollbackOp->iTab = n; + btreeLogRollbackOp(tree, pRollbackOp); + } + + return SQLITE_OK; +} + +static int memRbtreeKeyCompare(RbtCursor* pCur, const void *pKey, int nKey, + int nIgnore, int *pRes) +{ + assert(pCur); + + if( !pCur->pNode ) { + *pRes = -1; + } else { + if( (pCur->pNode->nKey - nIgnore) < 0 ){ + *pRes = -1; + }else{ + *pRes = key_compare(pCur->pNode->pKey, pCur->pNode->nKey-nIgnore, + pKey, nKey); + } + } + return SQLITE_OK; +} + +/* + * Get a new cursor for table iTable of the supplied Rbtree. The wrFlag + * parameter is ignored, all cursors are capable of write-operations. + * + * Note that RbtCursor.eSkip and RbtCursor.pNode both initialize to 0. + */ +static int memRbtreeCursor( + Rbtree* tree, + int iTable, + int wrFlag, + RbtCursor **ppCur +){ + assert(tree); + *ppCur = sqliteMalloc(sizeof(RbtCursor)); + (*ppCur)->pTree = sqliteHashFind(&tree->tblHash, 0, iTable); + (*ppCur)->pRbtree = tree; + (*ppCur)->iTree = iTable; + (*ppCur)->pOps = &sqliteRbtreeCursorOps; + + assert( (*ppCur)->pTree ); + return SQLITE_OK; +} + +/* + * Insert a new record into the Rbtree. The key is given by (pKey,nKey) + * and the data is given by (pData,nData). The cursor is used only to + * define what database the record should be inserted into. The cursor + * is left pointing at the new record. + * + * If the key exists already in the tree, just replace the data. + */ +static int memRbtreeInsert( + RbtCursor* pCur, + const void *pKey, + int nKey, + const void *pDataInput, + int nData +){ + void * pData; + int match; + + /* It is illegal to call sqliteRbtreeInsert() if we are + ** not in a transaction */ + assert( pCur->pRbtree->eTransState != TRANS_NONE ); + + /* Take a copy of the input data now, in case we need it for the + * replace case */ + pData = sqliteMalloc(nData); + memcpy(pData, pDataInput, nData); + + /* Move the cursor to a node near the key to be inserted. If the key already + * exists in the table, then (match == 0). In this case we can just replace + * the data associated with the entry, we don't need to manipulate the tree. + * + * If there is no exact match, then the cursor points at what would be either + * the predecessor (match == -1) or successor (match == 1) of the + * searched-for key, were it to be inserted. The new node becomes a child of + * this node. + * + * The new node is initially red. + */ + memRbtreeMoveto( pCur, pKey, nKey, &match); + if( match ){ + BtRbNode *pNode = sqliteMalloc(sizeof(BtRbNode)); + pNode->nKey = nKey; + pNode->pKey = sqliteMalloc(nKey); + memcpy(pNode->pKey, pKey, nKey); + pNode->nData = nData; + pNode->pData = pData; + if( pCur->pNode ){ + switch( match ){ + case -1: + assert( !pCur->pNode->pRight ); + pNode->pParent = pCur->pNode; + pCur->pNode->pRight = pNode; + break; + case 1: + assert( !pCur->pNode->pLeft ); + pNode->pParent = pCur->pNode; + pCur->pNode->pLeft = pNode; + break; + default: + assert(0); + } + }else{ + pCur->pTree->pHead = pNode; + } + + /* Point the cursor at the node just inserted, as per SQLite requirements */ + pCur->pNode = pNode; + + /* A new node has just been inserted, so run the balancing code */ + do_insert_balancing(pCur->pTree, pNode); + + /* Set up a rollback-op in case we have to roll this operation back */ + if( pCur->pRbtree->eTransState != TRANS_ROLLBACK ){ + BtRollbackOp *pOp = sqliteMalloc( sizeof(BtRollbackOp) ); + pOp->eOp = ROLLBACK_DELETE; + pOp->iTab = pCur->iTree; + pOp->nKey = pNode->nKey; + pOp->pKey = sqliteMalloc( pOp->nKey ); + memcpy( pOp->pKey, pNode->pKey, pOp->nKey ); + btreeLogRollbackOp(pCur->pRbtree, pOp); + } + + }else{ + /* No need to insert a new node in the tree, as the key already exists. + * Just clobber the current nodes data. */ + + /* Set up a rollback-op in case we have to roll this operation back */ + if( pCur->pRbtree->eTransState != TRANS_ROLLBACK ){ + BtRollbackOp *pOp = sqliteMalloc( sizeof(BtRollbackOp) ); + pOp->iTab = pCur->iTree; + pOp->nKey = pCur->pNode->nKey; + pOp->pKey = sqliteMalloc( pOp->nKey ); + memcpy( pOp->pKey, pCur->pNode->pKey, pOp->nKey ); + pOp->nData = pCur->pNode->nData; + pOp->pData = pCur->pNode->pData; + pOp->eOp = ROLLBACK_INSERT; + btreeLogRollbackOp(pCur->pRbtree, pOp); + }else{ + sqliteFree( pCur->pNode->pData ); + } + + /* Actually clobber the nodes data */ + pCur->pNode->pData = pData; + pCur->pNode->nData = nData; + } + + return SQLITE_OK; +} + +/* Move the cursor so that it points to an entry near pKey. +** Return a success code. +** +** *pRes<0 The cursor is left pointing at an entry that +** is smaller than pKey or if the table is empty +** and the cursor is therefore left point to nothing. +** +** *pRes==0 The cursor is left pointing at an entry that +** exactly matches pKey. +** +** *pRes>0 The cursor is left pointing at an entry that +** is larger than pKey. +*/ +static int memRbtreeMoveto( + RbtCursor* pCur, + const void *pKey, + int nKey, + int *pRes +){ + BtRbNode *pTmp = 0; + + pCur->pNode = pCur->pTree->pHead; + *pRes = -1; + while( pCur->pNode && *pRes ) { + *pRes = key_compare(pCur->pNode->pKey, pCur->pNode->nKey, pKey, nKey); + pTmp = pCur->pNode; + switch( *pRes ){ + case 1: /* cursor > key */ + pCur->pNode = pCur->pNode->pLeft; + break; + case -1: /* cursor < key */ + pCur->pNode = pCur->pNode->pRight; + break; + } + } + + /* If (pCur->pNode == NULL), then we have failed to find a match. Set + * pCur->pNode to pTmp, which is either NULL (if the tree is empty) or the + * last node traversed in the search. In either case the relation ship + * between pTmp and the searched for key is already stored in *pRes. pTmp is + * either the successor or predecessor of the key we tried to move to. */ + if( !pCur->pNode ) pCur->pNode = pTmp; + pCur->eSkip = SKIP_NONE; + + return SQLITE_OK; +} + + +/* +** Delete the entry that the cursor is pointing to. +** +** The cursor is left pointing at either the next or the previous +** entry. If the cursor is left pointing to the next entry, then +** the pCur->eSkip flag is set to SKIP_NEXT which forces the next call to +** sqliteRbtreeNext() to be a no-op. That way, you can always call +** sqliteRbtreeNext() after a delete and the cursor will be left +** pointing to the first entry after the deleted entry. Similarly, +** pCur->eSkip is set to SKIP_PREV is the cursor is left pointing to +** the entry prior to the deleted entry so that a subsequent call to +** sqliteRbtreePrevious() will always leave the cursor pointing at the +** entry immediately before the one that was deleted. +*/ +static int memRbtreeDelete(RbtCursor* pCur) +{ + BtRbNode *pZ; /* The one being deleted */ + BtRbNode *pChild; /* The child of the spliced out node */ + + /* It is illegal to call sqliteRbtreeDelete() if we are + ** not in a transaction */ + assert( pCur->pRbtree->eTransState != TRANS_NONE ); + + pZ = pCur->pNode; + if( !pZ ){ + return SQLITE_OK; + } + + /* If we are not currently doing a rollback, set up a rollback op for this + * deletion */ + if( pCur->pRbtree->eTransState != TRANS_ROLLBACK ){ + BtRollbackOp *pOp = sqliteMalloc( sizeof(BtRollbackOp) ); + pOp->iTab = pCur->iTree; + pOp->nKey = pZ->nKey; + pOp->pKey = pZ->pKey; + pOp->nData = pZ->nData; + pOp->pData = pZ->pData; + pOp->eOp = ROLLBACK_INSERT; + btreeLogRollbackOp(pCur->pRbtree, pOp); + } + + /* First do a standard binary-tree delete (node pZ is to be deleted). How + * to do this depends on how many children pZ has: + * + * If pZ has no children or one child, then splice out pZ. If pZ has two + * children, splice out the successor of pZ and replace the key and data of + * pZ with the key and data of the spliced out successor. */ + if( pZ->pLeft && pZ->pRight ){ + BtRbNode *pTmp; + int dummy; + pCur->eSkip = SKIP_NONE; + memRbtreeNext(pCur, &dummy); + assert( dummy == 0 ); + if( pCur->pRbtree->eTransState == TRANS_ROLLBACK ){ + sqliteFree(pZ->pKey); + sqliteFree(pZ->pData); + } + pZ->pData = pCur->pNode->pData; + pZ->nData = pCur->pNode->nData; + pZ->pKey = pCur->pNode->pKey; + pZ->nKey = pCur->pNode->nKey; + pTmp = pZ; + pZ = pCur->pNode; + pCur->pNode = pTmp; + pCur->eSkip = SKIP_NEXT; + }else{ + int res; + pCur->eSkip = SKIP_NONE; + memRbtreeNext(pCur, &res); + pCur->eSkip = SKIP_NEXT; + if( res ){ + memRbtreeLast(pCur, &res); + memRbtreePrevious(pCur, &res); + pCur->eSkip = SKIP_PREV; + } + if( pCur->pRbtree->eTransState == TRANS_ROLLBACK ){ + sqliteFree(pZ->pKey); + sqliteFree(pZ->pData); + } + } + + /* pZ now points at the node to be spliced out. This block does the + * splicing. */ + { + BtRbNode **ppParentSlot = 0; + assert( !pZ->pLeft || !pZ->pRight ); /* pZ has at most one child */ + pChild = ((pZ->pLeft)?pZ->pLeft:pZ->pRight); + if( pZ->pParent ){ + assert( pZ == pZ->pParent->pLeft || pZ == pZ->pParent->pRight ); + ppParentSlot = ((pZ == pZ->pParent->pLeft) + ?&pZ->pParent->pLeft:&pZ->pParent->pRight); + *ppParentSlot = pChild; + }else{ + pCur->pTree->pHead = pChild; + } + if( pChild ) pChild->pParent = pZ->pParent; + } + + /* pZ now points at the spliced out node. pChild is the only child of pZ, or + * NULL if pZ has no children. If pZ is black, and not the tree root, then we + * will have violated the "same number of black nodes in every path to a + * leaf" property of the red-black tree. The code in do_delete_balancing() + * repairs this. */ + if( pZ->isBlack ){ + do_delete_balancing(pCur->pTree, pChild, pZ->pParent); + } + + sqliteFree(pZ); + return SQLITE_OK; +} + +/* + * Empty table n of the Rbtree. + */ +static int memRbtreeClearTable(Rbtree* tree, int n) +{ + BtRbTree *pTree; + BtRbNode *pNode; + + pTree = sqliteHashFind(&tree->tblHash, 0, n); + assert(pTree); + + pNode = pTree->pHead; + while( pNode ){ + if( pNode->pLeft ){ + pNode = pNode->pLeft; + } + else if( pNode->pRight ){ + pNode = pNode->pRight; + } + else { + BtRbNode *pTmp = pNode->pParent; + if( tree->eTransState == TRANS_ROLLBACK ){ + sqliteFree( pNode->pKey ); + sqliteFree( pNode->pData ); + }else{ + BtRollbackOp *pRollbackOp = sqliteMalloc(sizeof(BtRollbackOp)); + pRollbackOp->eOp = ROLLBACK_INSERT; + pRollbackOp->iTab = n; + pRollbackOp->nKey = pNode->nKey; + pRollbackOp->pKey = pNode->pKey; + pRollbackOp->nData = pNode->nData; + pRollbackOp->pData = pNode->pData; + btreeLogRollbackOp(tree, pRollbackOp); + } + sqliteFree( pNode ); + if( pTmp ){ + if( pTmp->pLeft == pNode ) pTmp->pLeft = 0; + else if( pTmp->pRight == pNode ) pTmp->pRight = 0; + } + pNode = pTmp; + } + } + + pTree->pHead = 0; + return SQLITE_OK; +} + +static int memRbtreeFirst(RbtCursor* pCur, int *pRes) +{ + if( pCur->pTree->pHead ){ + pCur->pNode = pCur->pTree->pHead; + while( pCur->pNode->pLeft ){ + pCur->pNode = pCur->pNode->pLeft; + } + } + if( pCur->pNode ){ + *pRes = 0; + }else{ + *pRes = 1; + } + pCur->eSkip = SKIP_NONE; + return SQLITE_OK; +} + +static int memRbtreeLast(RbtCursor* pCur, int *pRes) +{ + if( pCur->pTree->pHead ){ + pCur->pNode = pCur->pTree->pHead; + while( pCur->pNode->pRight ){ + pCur->pNode = pCur->pNode->pRight; + } + } + if( pCur->pNode ){ + *pRes = 0; + }else{ + *pRes = 1; + } + pCur->eSkip = SKIP_NONE; + return SQLITE_OK; +} + +/* +** Advance the cursor to the next entry in the database. If +** successful then set *pRes=0. If the cursor +** was already pointing to the last entry in the database before +** this routine was called, then set *pRes=1. +*/ +static int memRbtreeNext(RbtCursor* pCur, int *pRes) +{ + if( pCur->pNode && pCur->eSkip != SKIP_NEXT ){ + if( pCur->pNode->pRight ){ + pCur->pNode = pCur->pNode->pRight; + while( pCur->pNode->pLeft ) + pCur->pNode = pCur->pNode->pLeft; + }else{ + BtRbNode * pX = pCur->pNode; + pCur->pNode = pX->pParent; + while( pCur->pNode && (pCur->pNode->pRight == pX) ){ + pX = pCur->pNode; + pCur->pNode = pX->pParent; + } + } + } + pCur->eSkip = SKIP_NONE; + + if( !pCur->pNode ){ + *pRes = 1; + }else{ + *pRes = 0; + } + + return SQLITE_OK; +} + +static int memRbtreePrevious(RbtCursor* pCur, int *pRes) +{ + if( pCur->pNode && pCur->eSkip != SKIP_PREV ){ + if( pCur->pNode->pLeft ){ + pCur->pNode = pCur->pNode->pLeft; + while( pCur->pNode->pRight ) + pCur->pNode = pCur->pNode->pRight; + }else{ + BtRbNode * pX = pCur->pNode; + pCur->pNode = pX->pParent; + while( pCur->pNode && (pCur->pNode->pLeft == pX) ){ + pX = pCur->pNode; + pCur->pNode = pX->pParent; + } + } + } + pCur->eSkip = SKIP_NONE; + + if( !pCur->pNode ){ + *pRes = 1; + }else{ + *pRes = 0; + } + + return SQLITE_OK; +} + +static int memRbtreeKeySize(RbtCursor* pCur, int *pSize) +{ + if( pCur->pNode ){ + *pSize = pCur->pNode->nKey; + }else{ + *pSize = 0; + } + return SQLITE_OK; +} + +static int memRbtreeKey(RbtCursor* pCur, int offset, int amt, char *zBuf) +{ + if( !pCur->pNode ) return 0; + if( !pCur->pNode->pKey || ((amt + offset) <= pCur->pNode->nKey) ){ + memcpy(zBuf, ((char*)pCur->pNode->pKey)+offset, amt); + return amt; + }else{ + memcpy(zBuf, ((char*)pCur->pNode->pKey)+offset, pCur->pNode->nKey-offset); + return pCur->pNode->nKey-offset; + } + assert(0); +} + +static int memRbtreeDataSize(RbtCursor* pCur, int *pSize) +{ + if( pCur->pNode ){ + *pSize = pCur->pNode->nData; + }else{ + *pSize = 0; + } + return SQLITE_OK; +} + +static int memRbtreeData(RbtCursor *pCur, int offset, int amt, char *zBuf) +{ + if( !pCur->pNode ) return 0; + if( (amt + offset) <= pCur->pNode->nData ){ + memcpy(zBuf, ((char*)pCur->pNode->pData)+offset, amt); + return amt; + }else{ + memcpy(zBuf, ((char*)pCur->pNode->pData)+offset ,pCur->pNode->nData-offset); + return pCur->pNode->nData-offset; + } + assert(0); +} + +static int memRbtreeCloseCursor(RbtCursor* pCur) +{ + sqliteFree(pCur); + return SQLITE_OK; +} + +static int memRbtreeGetMeta(Rbtree* tree, int* aMeta) +{ + memcpy( aMeta, tree->aMetaData, sizeof(int) * SQLITE_N_BTREE_META ); + return SQLITE_OK; +} + +static int memRbtreeUpdateMeta(Rbtree* tree, int* aMeta) +{ + memcpy( tree->aMetaData, aMeta, sizeof(int) * SQLITE_N_BTREE_META ); + return SQLITE_OK; +} + +/* + * Check that each table in the Rbtree meets the requirements for a red-black + * binary tree. If an error is found, return an explanation of the problem in + * memory obtained from sqliteMalloc(). Parameters aRoot and nRoot are ignored. + */ +static char *memRbtreeIntegrityCheck(Rbtree* tree, int* aRoot, int nRoot) +{ + char * msg = 0; + HashElem *p; + + for(p=sqliteHashFirst(&tree->tblHash); p; p=sqliteHashNext(p)){ + BtRbTree *pTree = sqliteHashData(p); + check_redblack_tree(pTree, &msg); + } + + return msg; +} + +/* + * Close the supplied Rbtree. Delete everything associated with it. + */ +static int memRbtreeClose(Rbtree* tree) +{ + HashElem *p; + while( (p=sqliteHashFirst(&tree->tblHash))!=0 ){ + tree->eTransState = TRANS_ROLLBACK; + memRbtreeDropTable(tree, sqliteHashKeysize(p)); + } + sqliteHashClear(&tree->tblHash); + sqliteFree(tree); + return SQLITE_OK; +} + +static int memRbtreeSetCacheSize(Rbtree* tree, int sz) +{ + return SQLITE_OK; +} + +static int memRbtreeSetSafetyLevel(Rbtree *pBt, int level){ + return SQLITE_OK; +} + +static int memRbtreeBeginTrans(Rbtree* tree) +{ + if( tree->eTransState != TRANS_NONE ) + return SQLITE_ERROR; + + assert( tree->pTransRollback == 0 ); + tree->eTransState = TRANS_INTRANSACTION; + return SQLITE_OK; +} + +/* +** Delete a linked list of BtRollbackOp structures. +*/ +static void deleteRollbackList(BtRollbackOp *pOp){ + while( pOp ){ + BtRollbackOp *pTmp = pOp->pNext; + sqliteFree(pOp->pData); + sqliteFree(pOp->pKey); + sqliteFree(pOp); + pOp = pTmp; + } +} + +static int memRbtreeCommit(Rbtree* tree){ + /* Just delete pTransRollback and pCheckRollback */ + deleteRollbackList(tree->pCheckRollback); + deleteRollbackList(tree->pTransRollback); + tree->pTransRollback = 0; + tree->pCheckRollback = 0; + tree->pCheckRollbackTail = 0; + tree->eTransState = TRANS_NONE; + return SQLITE_OK; +} + +/* + * Execute and delete the supplied rollback-list on pRbtree. + */ +static void execute_rollback_list(Rbtree *pRbtree, BtRollbackOp *pList) +{ + BtRollbackOp *pTmp; + RbtCursor cur; + int res; + + cur.pRbtree = pRbtree; + while( pList ){ + switch( pList->eOp ){ + case ROLLBACK_INSERT: + cur.pTree = sqliteHashFind( &pRbtree->tblHash, 0, pList->iTab ); + assert(cur.pTree); + cur.iTree = pList->iTab; + cur.eSkip = SKIP_NONE; + memRbtreeInsert( &cur, pList->pKey, + pList->nKey, pList->pData, pList->nData ); + break; + case ROLLBACK_DELETE: + cur.pTree = sqliteHashFind( &pRbtree->tblHash, 0, pList->iTab ); + assert(cur.pTree); + cur.iTree = pList->iTab; + cur.eSkip = SKIP_NONE; + memRbtreeMoveto(&cur, pList->pKey, pList->nKey, &res); + assert(res == 0); + memRbtreeDelete( &cur ); + break; + case ROLLBACK_CREATE: + btreeCreateTable(pRbtree, pList->iTab); + break; + case ROLLBACK_DROP: + memRbtreeDropTable(pRbtree, pList->iTab); + break; + default: + assert(0); + } + sqliteFree(pList->pKey); + sqliteFree(pList->pData); + pTmp = pList->pNext; + sqliteFree(pList); + pList = pTmp; + } +} + +static int memRbtreeRollback(Rbtree* tree) +{ + tree->eTransState = TRANS_ROLLBACK; + execute_rollback_list(tree, tree->pCheckRollback); + execute_rollback_list(tree, tree->pTransRollback); + tree->pTransRollback = 0; + tree->pCheckRollback = 0; + tree->pCheckRollbackTail = 0; + tree->eTransState = TRANS_NONE; + return SQLITE_OK; +} + +static int memRbtreeBeginCkpt(Rbtree* tree) +{ + if( tree->eTransState != TRANS_INTRANSACTION ) + return SQLITE_ERROR; + + assert( tree->pCheckRollback == 0 ); + assert( tree->pCheckRollbackTail == 0 ); + tree->eTransState = TRANS_INCHECKPOINT; + return SQLITE_OK; +} + +static int memRbtreeCommitCkpt(Rbtree* tree) +{ + if( tree->eTransState == TRANS_INCHECKPOINT ){ + if( tree->pCheckRollback ){ + tree->pCheckRollbackTail->pNext = tree->pTransRollback; + tree->pTransRollback = tree->pCheckRollback; + tree->pCheckRollback = 0; + tree->pCheckRollbackTail = 0; + } + tree->eTransState = TRANS_INTRANSACTION; + } + return SQLITE_OK; +} + +static int memRbtreeRollbackCkpt(Rbtree* tree) +{ + if( tree->eTransState != TRANS_INCHECKPOINT ) return SQLITE_OK; + tree->eTransState = TRANS_ROLLBACK; + execute_rollback_list(tree, tree->pCheckRollback); + tree->pCheckRollback = 0; + tree->pCheckRollbackTail = 0; + tree->eTransState = TRANS_INTRANSACTION; + return SQLITE_OK; + return SQLITE_OK; +} + +#ifdef SQLITE_TEST +static int memRbtreePageDump(Rbtree* tree, int pgno, int rec) +{ + assert(!"Cannot call sqliteRbtreePageDump"); + return SQLITE_OK; +} + +static int memRbtreeCursorDump(RbtCursor* pCur, int* aRes) +{ + assert(!"Cannot call sqliteRbtreeCursorDump"); + return SQLITE_OK; +} + +static struct Pager *memRbtreePager(Rbtree* tree) +{ + assert(!"Cannot call sqliteRbtreePager"); + return SQLITE_OK; +} +#endif + +/* +** Return the full pathname of the underlying database file. +*/ +static const char *memRbtreeGetFilename(Rbtree *pBt){ + return 0; /* A NULL return indicates there is no underlying file */ +} + +/* +** The copy file function is not implemented for the in-memory database +*/ +static int memRbtreeCopyFile(Rbtree *pBt, Rbtree *pBt2){ + return SQLITE_INTERNAL; /* Not implemented */ +} + +static BtOps sqliteRbtreeOps = { + (int(*)(Btree*)) memRbtreeClose, + (int(*)(Btree*,int)) memRbtreeSetCacheSize, + (int(*)(Btree*,int)) memRbtreeSetSafetyLevel, + (int(*)(Btree*)) memRbtreeBeginTrans, + (int(*)(Btree*)) memRbtreeCommit, + (int(*)(Btree*)) memRbtreeRollback, + (int(*)(Btree*)) memRbtreeBeginCkpt, + (int(*)(Btree*)) memRbtreeCommitCkpt, + (int(*)(Btree*)) memRbtreeRollbackCkpt, + (int(*)(Btree*,int*)) memRbtreeCreateTable, + (int(*)(Btree*,int*)) memRbtreeCreateTable, + (int(*)(Btree*,int)) memRbtreeDropTable, + (int(*)(Btree*,int)) memRbtreeClearTable, + (int(*)(Btree*,int,int,BtCursor**)) memRbtreeCursor, + (int(*)(Btree*,int*)) memRbtreeGetMeta, + (int(*)(Btree*,int*)) memRbtreeUpdateMeta, + (char*(*)(Btree*,int*,int)) memRbtreeIntegrityCheck, + (const char*(*)(Btree*)) memRbtreeGetFilename, + (int(*)(Btree*,Btree*)) memRbtreeCopyFile, + +#ifdef SQLITE_TEST + (int(*)(Btree*,int,int)) memRbtreePageDump, + (struct Pager*(*)(Btree*)) memRbtreePager +#endif +}; + +static BtCursorOps sqliteRbtreeCursorOps = { + (int(*)(BtCursor*,const void*,int,int*)) memRbtreeMoveto, + (int(*)(BtCursor*)) memRbtreeDelete, + (int(*)(BtCursor*,const void*,int,const void*,int)) memRbtreeInsert, + (int(*)(BtCursor*,int*)) memRbtreeFirst, + (int(*)(BtCursor*,int*)) memRbtreeLast, + (int(*)(BtCursor*,int*)) memRbtreeNext, + (int(*)(BtCursor*,int*)) memRbtreePrevious, + (int(*)(BtCursor*,int*)) memRbtreeKeySize, + (int(*)(BtCursor*,int,int,char*)) memRbtreeKey, + (int(*)(BtCursor*,const void*,int,int,int*)) memRbtreeKeyCompare, + (int(*)(BtCursor*,int*)) memRbtreeDataSize, + (int(*)(BtCursor*,int,int,char*)) memRbtreeData, + (int(*)(BtCursor*)) memRbtreeCloseCursor, +#ifdef SQLITE_TEST + (int(*)(BtCursor*,int*)) memRbtreeCursorDump, +#endif + +}; + +#endif /* SQLITE_OMIT_INMEMORYDB */ diff --git a/ext/sqlite/libsqlite/src/build.c b/ext/sqlite/libsqlite/src/build.c index afa3f16025..76077ac943 100644 --- a/ext/sqlite/libsqlite/src/build.c +++ b/ext/sqlite/libsqlite/src/build.c @@ -18,8 +18,6 @@ ** CREATE INDEX ** DROP INDEX ** creating ID lists -** COPY -** VACUUM ** BEGIN TRANSACTION ** COMMIT ** ROLLBACK @@ -38,6 +36,7 @@ */ void sqliteBeginParse(Parse *pParse, int explainFlag){ sqlite *db = pParse->db; + int i; pParse->explain = explainFlag; if((db->flags & SQLITE_Initialized)==0 && pParse->initFlag==0 ){ int rc = sqliteInit(db, &pParse->zErrMsg); @@ -46,6 +45,12 @@ void sqliteBeginParse(Parse *pParse, int explainFlag){ pParse->nErr++; } } + for(i=0; i<db->nDb; i++){ + DbClearProperty(db, i, DB_Locked); + if( !db->aDb[i].inTrans ){ + DbClearProperty(db, i, DB_Cookie); + } + } } /* @@ -85,7 +90,7 @@ void sqliteExec(Parse *pParse){ if( pParse->useCallback ){ if( pParse->explain ){ rc = sqliteVdbeList(v); - db->next_cookie = db->schema_cookie; + db->next_cookie = db->aDb[0].schema_cookie; }else{ sqliteVdbeExec(v); } @@ -98,7 +103,6 @@ void sqliteExec(Parse *pParse){ pParse->rc = pParse->nErr ? SQLITE_ERROR : SQLITE_DONE; } pParse->colNamesSet = 0; - pParse->schemaVerified = 0; }else if( pParse->useCallback==0 ){ pParse->rc = SQLITE_ERROR; } @@ -111,22 +115,82 @@ void sqliteExec(Parse *pParse){ /* ** Locate the in-memory structure that describes ** a particular database table given the name -** of that table. Return NULL if not found. +** of that table and (optionally) the name of the database +** containing the table. Return NULL if not found. +** +** See also sqliteLocateTable(). */ -Table *sqliteFindTable(sqlite *db, const char *zName){ +Table *sqliteFindTable(sqlite *db, const char *zName, const char *zDatabase){ + Table *p = 0; + int i; + for(i=0; i<db->nDb; i++){ + int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ + if( zDatabase!=0 && sqliteStrICmp(zDatabase, db->aDb[j].zName) ) continue; + p = sqliteHashFind(&db->aDb[j].tblHash, zName, strlen(zName)+1); + if( p ) break; + } + return p; +} + +/* +** Locate the in-memory structure that describes +** a particular database table given the name +** of that table and (optionally) the name of the database +** containing the table. Return NULL if not found. +** +** If pParse->useDb is not negative, then the table must be +** located in that database. If a different database is specified, +** an error message is generated into pParse->zErrMsg. +*/ +Table *sqliteLocateTable(Parse *pParse, const char *zName, const char *zDbase){ + sqlite *db; + const char *zUse; Table *p; - p = sqliteHashFind(&db->tblHash, zName, strlen(zName)+1); + db = pParse->db; + if( pParse->useDb<0 ){ + p = sqliteFindTable(db, zName, zDbase); + }else { + assert( pParse->useDb<db->nDb ); + assert( db->aDb[pParse->useDb].pBt!=0 ); + zUse = db->aDb[pParse->useDb].zName; + if( zDbase && pParse->useDb!=1 && sqliteStrICmp(zDbase, zUse)!=0 ){ + sqliteErrorMsg(pParse,"cannot use database %s in this context", zDbase); + return 0; + } + p = sqliteFindTable(db, zName, zUse); + if( p==0 && pParse->useDb==1 && zDbase==0 ){ + p = sqliteFindTable(db, zName, 0); + } + } + if( p==0 ){ + if( zDbase ){ + sqliteErrorMsg(pParse, "no such table: %s.%s", zDbase, zName); + }else if( (pParse->useDb==0 || pParse->useDb>=2) + && sqliteFindTable(db, zName, 0)!=0 ){ + sqliteErrorMsg(pParse, "table \"%s\" is not in database \"%s\"", + zName, zUse); + }else{ + sqliteErrorMsg(pParse, "no such table: %s", zName); + } + } return p; } /* ** Locate the in-memory structure that describes -** a particular index given the name of that index. +** a particular index given the name of that index +** and the name of the database that contains the index. ** Return NULL if not found. */ -Index *sqliteFindIndex(sqlite *db, const char *zName){ - Index *p; - p = sqliteHashFind(&db->idxHash, zName, strlen(zName)+1); +Index *sqliteFindIndex(sqlite *db, const char *zName, const char *zDb){ + Index *p = 0; + int i; + for(i=0; i<db->nDb; i++){ + int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ + if( zDb && sqliteStrICmp(zDb, db->aDb[j].zName) ) continue; + p = sqliteHashFind(&db->aDb[j].idxHash, zName, strlen(zName)+1); + if( p ) break; + } return p; } @@ -140,10 +204,13 @@ Index *sqliteFindIndex(sqlite *db, const char *zName){ */ static void sqliteDeleteIndex(sqlite *db, Index *p){ Index *pOld; + assert( db!=0 && p->zName!=0 ); - pOld = sqliteHashInsert(&db->idxHash, p->zName, strlen(p->zName)+1, 0); + pOld = sqliteHashInsert(&db->aDb[p->iDb].idxHash, p->zName, + strlen(p->zName)+1, 0); if( pOld!=0 && pOld!=p ){ - sqliteHashInsert(&db->idxHash, pOld->zName, strlen(pOld->zName)+1, pOld); + sqliteHashInsert(&db->aDb[p->iDb].idxHash, pOld->zName, + strlen(pOld->zName)+1, pOld); } sqliteFree(p); } @@ -171,29 +238,67 @@ void sqliteUnlinkAndDeleteIndex(sqlite *db, Index *pIndex){ ** database connection. This routine is called to reclaim memory ** before the connection closes. It is also called during a rollback ** if there were schema changes during the transaction. +** +** If iDb<=0 then reset the internal schema tables for all database +** files. If iDb>=2 then reset the internal schema for only the +** single file indicates. */ -void sqliteResetInternalSchema(sqlite *db){ +void sqliteResetInternalSchema(sqlite *db, int iDb){ HashElem *pElem; Hash temp1; Hash temp2; + int i, j; + + assert( iDb>=0 && iDb<db->nDb ); + db->flags &= ~SQLITE_Initialized; + for(i=iDb; i<db->nDb; i++){ + Db *pDb = &db->aDb[i]; + temp1 = pDb->tblHash; + temp2 = pDb->trigHash; + sqliteHashInit(&pDb->trigHash, SQLITE_HASH_STRING, 0); + sqliteHashClear(&pDb->aFKey); + sqliteHashClear(&pDb->idxHash); + for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){ + Trigger *pTrigger = sqliteHashData(pElem); + sqliteDeleteTrigger(pTrigger); + } + sqliteHashClear(&temp2); + sqliteHashInit(&pDb->tblHash, SQLITE_HASH_STRING, 0); + for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){ + Table *pTab = sqliteHashData(pElem); + sqliteDeleteTable(db, pTab); + } + sqliteHashClear(&temp1); + DbClearProperty(db, i, DB_SchemaLoaded); + if( iDb>0 ) return; + } + assert( iDb==0 ); + db->flags &= ~SQLITE_InternChanges; - sqliteHashClear(&db->aFKey); - temp1 = db->tblHash; - temp2 = db->trigHash; - sqliteHashInit(&db->trigHash, SQLITE_HASH_STRING, 0); - sqliteHashClear(&db->idxHash); - for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){ - Trigger *pTrigger = sqliteHashData(pElem); - sqliteDeleteTrigger(pTrigger); - } - sqliteHashClear(&temp2); - sqliteHashInit(&db->tblHash, SQLITE_HASH_STRING, 0); - for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){ - Table *pTab = sqliteHashData(pElem); - sqliteDeleteTable(db, pTab); - } - sqliteHashClear(&temp1); - db->flags &= ~(SQLITE_Initialized|SQLITE_InternChanges); + /* If one or more of the auxiliary database files has been closed, + ** then remove then from the auxiliary database list. We take the + ** opportunity to do this here since we have just deleted all of the + ** schema hash tables and therefore do not have to make any changes + ** to any of those tables. + */ + for(i=j=2; i<db->nDb; i++){ + if( db->aDb[i].pBt==0 ){ + sqliteFree(db->aDb[i].zName); + db->aDb[i].zName = 0; + continue; + } + if( j<i ){ + db->aDb[j] = db->aDb[i]; + } + j++; + } + memset(&db->aDb[j], 0, (db->nDb-j)*sizeof(db->aDb[j])); + db->nDb = j; + if( db->nDb<=2 && db->aDb!=db->aDbStatic ){ + memcpy(db->aDbStatic, db->aDb, 2*sizeof(db->aDb[0])); + sqliteFree(db->aDb); + db->aDb = db->aDbStatic; + } } /* @@ -203,7 +308,7 @@ void sqliteResetInternalSchema(sqlite *db){ */ void sqliteRollbackInternalChanges(sqlite *db){ if( db->flags & SQLITE_InternChanges ){ - sqliteResetInternalSchema(db); + sqliteResetInternalSchema(db, 0); } } @@ -211,7 +316,7 @@ void sqliteRollbackInternalChanges(sqlite *db){ ** This routine is called when a commit occurs. */ void sqliteCommitInternalChanges(sqlite *db){ - db->schema_cookie = db->next_cookie; + db->aDb[0].schema_cookie = db->next_cookie; db->flags &= ~SQLITE_InternChanges; } @@ -241,6 +346,7 @@ void sqliteDeleteTable(sqlite *db, Table *pTable){ */ for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){ pNext = pIndex->pNext; + assert( pIndex->iDb==pTable->iDb || (pTable->iDb==0 && pIndex->iDb==1) ); sqliteDeleteIndex(db, pIndex); } @@ -249,7 +355,9 @@ void sqliteDeleteTable(sqlite *db, Table *pTable){ */ for(pFKey=pTable->pFKey; pFKey; pFKey=pNextFKey){ pNextFKey = pFKey->pNextFrom; - assert( sqliteHashFind(&db->aFKey,pFKey->zTo,strlen(pFKey->zTo)+1)!=pFKey ); + assert( pTable->iDb<db->nDb ); + assert( sqliteHashFind(&db->aDb[pTable->iDb].aFKey, + pFKey->zTo, strlen(pFKey->zTo)+1)!=pFKey ); sqliteFree(pFKey); } @@ -273,14 +381,15 @@ void sqliteDeleteTable(sqlite *db, Table *pTable){ static void sqliteUnlinkAndDeleteTable(sqlite *db, Table *p){ Table *pOld; FKey *pF1, *pF2; + int i = p->iDb; assert( db!=0 ); - pOld = sqliteHashInsert(&db->tblHash, p->zName, strlen(p->zName)+1, 0); + pOld = sqliteHashInsert(&db->aDb[i].tblHash, p->zName, strlen(p->zName)+1, 0); assert( pOld==0 || pOld==p ); for(pF1=p->pFKey; pF1; pF1=pF1->pNextFrom){ int nTo = strlen(pF1->zTo) + 1; - pF2 = sqliteHashFind(&db->aFKey, pF1->zTo, nTo); + pF2 = sqliteHashFind(&db->aDb[i].aFKey, pF1->zTo, nTo); if( pF2==pF1 ){ - sqliteHashInsert(&db->aFKey, pF1->zTo, nTo, pF1->pNextTo); + sqliteHashInsert(&db->aDb[i].aFKey, pF1->zTo, nTo, pF1->pNextTo); }else{ while( pF2 && pF2->pNextTo!=pF1 ){ pF2=pF2->pNextTo; } if( pF2 ){ @@ -310,13 +419,8 @@ char *sqliteTableNameFromToken(Token *pName){ ** on cursor 0. */ void sqliteOpenMasterTable(Vdbe *v, int isTemp){ - if( isTemp ){ - sqliteVdbeAddOp(v, OP_OpenWrAux, 0, 2); - sqliteVdbeChangeP3(v, -1, TEMP_MASTER_NAME, P3_STATIC); - }else{ - sqliteVdbeAddOp(v, OP_OpenWrite, 0, 2); - sqliteVdbeChangeP3(v, -1, MASTER_NAME, P3_STATIC); - } + sqliteVdbeAddOp(v, OP_Integer, isTemp, 0); + sqliteVdbeAddOp(v, OP_OpenWrite, 0, 2); } /* @@ -348,17 +452,21 @@ void sqliteStartTable( char *zName; sqlite *db = pParse->db; Vdbe *v; + int iDb; pParse->sFirstToken = *pStart; zName = sqliteTableNameFromToken(pName); if( zName==0 ) return; + if( pParse->iDb==1 ) isTemp = 1; #ifndef SQLITE_OMIT_AUTHORIZATION - if( sqliteAuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0) ){ - sqliteFree(zName); - return; - } + assert( (isTemp & 1)==isTemp ); { int code; + char *zDb = isTemp ? "temp" : "main"; + if( sqliteAuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0, zDb) ){ + sqliteFree(zName); + return; + } if( isView ){ if( isTemp ){ code = SQLITE_CREATE_TEMP_VIEW; @@ -372,7 +480,7 @@ void sqliteStartTable( code = SQLITE_CREATE_TABLE; } } - if( sqliteAuthCheck(pParse, code, zName, 0) ){ + if( sqliteAuthCheck(pParse, code, zName, 0, zDb) ){ sqliteFree(zName); return; } @@ -383,8 +491,8 @@ void sqliteStartTable( /* Before trying to create a temporary table, make sure the Btree for ** holding temporary tables is open. */ - if( isTemp && db->pBeTemp==0 ){ - int rc = sqliteBtreeOpen(0, 0, MAX_PAGES, &db->pBeTemp); + if( isTemp && db->aDb[1].pBt==0 && !pParse->explain ){ + int rc = sqliteBtreeFactory(db, 0, 0, MAX_PAGES, &db->aDb[1].pBt); if( rc!=SQLITE_OK ){ sqliteSetString(&pParse->zErrMsg, "unable to open a temporary database " "file for storing temporary tables", 0); @@ -392,7 +500,7 @@ void sqliteStartTable( return; } if( db->flags & SQLITE_InTrans ){ - rc = sqliteBtreeBeginTrans(db->pBeTemp); + rc = sqliteBtreeBeginTrans(db->aDb[1].pBt); if( rc!=SQLITE_OK ){ sqliteSetNString(&pParse->zErrMsg, "unable to get a write lock on " "the temporary database file", 0); @@ -407,26 +515,19 @@ void sqliteStartTable( ** ** If we are re-reading the sqlite_master table because of a schema ** change and a new permanent table is found whose name collides with - ** an existing temporary table, then ignore the new permanent table. - ** We will continue parsing, but the pParse->nameClash flag will be set - ** so we will know to discard the table record once parsing has finished. + ** an existing temporary table, that is not an error. */ - pTable = sqliteFindTable(db, zName); - if( pTable!=0 ){ - if( pTable->isTemp && pParse->initFlag ){ - pParse->nameClash = 1; - }else{ - sqliteSetNString(&pParse->zErrMsg, "table ", 0, pName->z, pName->n, - " already exists", 0, 0); - sqliteFree(zName); - pParse->nErr++; - return; - } - }else{ - pParse->nameClash = 0; + pTable = sqliteFindTable(db, zName, 0); + iDb = isTemp ? 1 : pParse->iDb; + if( pTable!=0 && (pTable->iDb==iDb || !pParse->initFlag) ){ + sqliteSetNString(&pParse->zErrMsg, "table ", 0, pName->z, pName->n, + " already exists", 0, 0); + sqliteFree(zName); + pParse->nErr++; + return; } - if( (pIdx = sqliteFindIndex(db, zName))!=0 && - (!pIdx->pTable->isTemp || !pParse->initFlag) ){ + if( (pIdx = sqliteFindIndex(db, zName, 0))!=0 && + (pIdx->iDb==0 || !pParse->initFlag) ){ sqliteSetString(&pParse->zErrMsg, "there is already an index named ", zName, 0); sqliteFree(zName); @@ -443,7 +544,7 @@ void sqliteStartTable( pTable->aCol = 0; pTable->iPKey = -1; pTable->pIndex = 0; - pTable->isTemp = isTemp; + pTable->iDb = iDb; if( pParse->pNewTable ) sqliteDeleteTable(db, pParse->pNewTable); pParse->pNewTable = pTable; @@ -606,12 +707,12 @@ void sqliteAddPrimaryKey(Parse *pParse, IdList *pList, int onError){ Table *pTab = pParse->pNewTable; char *zType = 0; int iCol = -1; - if( pTab==0 ) return; + if( pTab==0 ) goto primary_key_exit; if( pTab->hasPrimKey ){ sqliteSetString(&pParse->zErrMsg, "table \"", pTab->zName, "\" has more than one primary key", 0); pParse->nErr++; - return; + goto primary_key_exit; } pTab->hasPrimKey = 1; if( pList==0 ){ @@ -629,8 +730,13 @@ void sqliteAddPrimaryKey(Parse *pParse, IdList *pList, int onError){ pTab->iPKey = iCol; pTab->keyConf = onError; }else{ - sqliteCreateIndex(pParse, 0, 0, pList, onError, 0, 0); + sqliteCreateIndex(pParse, 0, 0, pList, onError, 0, 0, 0); + pList = 0; } + +primary_key_exit: + sqliteIdListDelete(pList); + return; } /* @@ -708,8 +814,8 @@ void sqliteAddCollateType(Parse *pParse, int collType){ ** 1 chance in 2^32. So we're safe enough. */ void sqliteChangeCookie(sqlite *db, Vdbe *v){ - if( db->next_cookie==db->schema_cookie ){ - db->next_cookie = db->schema_cookie + sqliteRandomByte() + 1; + if( db->next_cookie==db->aDb[0].schema_cookie ){ + db->next_cookie = db->aDb[0].schema_cookie + sqliteRandomByte() + 1; db->flags |= SQLITE_InternChanges; sqliteVdbeAddOp(v, OP_Integer, db->next_cookie, 0); sqliteVdbeAddOp(v, OP_SetCookie, 0, 0); @@ -778,7 +884,7 @@ static char *createTableStmt(Table *p){ n += 35 + 6*p->nCol; zStmt = sqliteMallocRaw( n ); if( zStmt==0 ) return 0; - strcpy(zStmt, p->isTemp ? "CREATE TEMP TABLE " : "CREATE TABLE "); + strcpy(zStmt, p->iDb==1 ? "CREATE TEMP TABLE " : "CREATE TABLE "); k = strlen(zStmt); identPut(zStmt, &k, p->zName); zStmt[k++] = '('; @@ -859,7 +965,7 @@ void sqliteEndTable(Parse *pParse, Token *pEnd, Select *pSelect){ if( v==0 ) return; if( p->pSelect==0 ){ /* A regular table */ - sqliteVdbeAddOp(v, OP_CreateTable, 0, p->isTemp); + sqliteVdbeAddOp(v, OP_CreateTable, 0, p->iDb); sqliteVdbeChangeP3(v, -1, (char *)&p->tnum, P3_POINTER); }else{ /* A view */ @@ -891,13 +997,13 @@ void sqliteEndTable(Parse *pParse, Token *pEnd, Select *pSelect){ } sqliteVdbeAddOp(v, OP_MakeRecord, 5, 0); sqliteVdbeAddOp(v, OP_PutIntKey, 0, 0); - if( !p->isTemp ){ + if( !p->iDb ){ sqliteChangeCookie(db, v); } sqliteVdbeAddOp(v, OP_Close, 0, 0); if( pSelect ){ - int op = p->isTemp ? OP_OpenWrAux : OP_OpenWrite; - sqliteVdbeAddOp(v, op, 1, 0); + sqliteVdbeAddOp(v, OP_Integer, p->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenWrite, 1, 0); pParse->nTab = 2; sqliteSelect(pParse, pSelect, SRT_Table, 1, 0, 0, 0); } @@ -906,19 +1012,19 @@ void sqliteEndTable(Parse *pParse, Token *pEnd, Select *pSelect){ /* Add the table to the in-memory representation of the database. */ - assert( pParse->nameClash==0 || pParse->initFlag==1 ); - if( pParse->explain==0 && pParse->nameClash==0 && pParse->nErr==0 ){ + if( pParse->explain==0 && pParse->nErr==0 ){ Table *pOld; FKey *pFKey; - pOld = sqliteHashInsert(&db->tblHash, p->zName, strlen(p->zName)+1, p); + pOld = sqliteHashInsert(&db->aDb[p->iDb].tblHash, + p->zName, strlen(p->zName)+1, p); if( pOld ){ assert( p==pOld ); /* Malloc must have failed inside HashInsert() */ return; } for(pFKey=p->pFKey; pFKey; pFKey=pFKey->pNextFrom){ int nTo = strlen(pFKey->zTo) + 1; - pFKey->pNextTo = sqliteHashFind(&db->aFKey, pFKey->zTo, nTo); - sqliteHashInsert(&db->aFKey, pFKey->zTo, nTo, pFKey); + pFKey->pNextTo = sqliteHashFind(&db->aDb[p->iDb].aFKey, pFKey->zTo, nTo); + sqliteHashInsert(&db->aDb[p->iDb].aFKey, pFKey->zTo, nTo, pFKey); } pParse->pNewTable = 0; db->nTable++; @@ -1038,7 +1144,7 @@ int sqliteViewGetColumnNames(Parse *pParse, Table *pTable){ pSelTab->nCol = 0; pSelTab->aCol = 0; sqliteDeleteTable(0, pSelTab); - pParse->db->flags |= SQLITE_UnresetViews; + DbSetProperty(pParse->db, pTable->iDb, DB_UnresetViews); }else{ pTable->nCol = 0; nErr++; @@ -1072,18 +1178,18 @@ static void sqliteViewResetColumnNames(Table *pTable){ } /* -** Clear the column names from every VIEW. +** Clear the column names from every VIEW in database idx. */ -void sqliteViewResetAll(sqlite *db){ +static void sqliteViewResetAll(sqlite *db, int idx){ HashElem *i; - if( (db->flags & SQLITE_UnresetViews)==0 ) return; - for(i=sqliteHashFirst(&db->tblHash); i; i=sqliteHashNext(i)){ + if( !DbHasProperty(db, idx, DB_UnresetViews) ) return; + for(i=sqliteHashFirst(&db->aDb[idx].tblHash); i; i=sqliteHashNext(i)){ Table *pTab = sqliteHashData(i); if( pTab->pSelect ){ sqliteViewResetColumnNames(pTab); } } - db->flags &= ~SQLITE_UnresetViews; + DbClearProperty(db, idx, DB_UnresetViews); } /* @@ -1095,7 +1201,7 @@ Table *sqliteTableFromToken(Parse *pParse, Token *pTok){ Table *pTab; zName = sqliteTableNameFromToken(pTok); if( zName==0 ) return 0; - pTab = sqliteFindTable(pParse->db, zName); + pTab = sqliteFindTable(pParse->db, zName, 0); sqliteFree(zName); if( pTab==0 ){ sqliteSetNString(&pParse->zErrMsg, "no such table: ", 0, @@ -1114,33 +1220,38 @@ void sqliteDropTable(Parse *pParse, Token *pName, int isView){ Vdbe *v; int base; sqlite *db = pParse->db; + int iDb; if( pParse->nErr || sqlite_malloc_failed ) return; pTable = sqliteTableFromToken(pParse, pName); if( pTable==0 ) return; + iDb = pTable->iDb; + assert( iDb>=0 && iDb<db->nDb ); #ifndef SQLITE_OMIT_AUTHORIZATION - if( sqliteAuthCheck(pParse, SQLITE_DELETE, SCHEMA_TABLE(pTable->isTemp),0)){ - return; - } { int code; + const char *zTab = SCHEMA_TABLE(pTable->iDb); + const char *zDb = db->aDb[pTable->iDb].zName; + if( sqliteAuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb)){ + return; + } if( isView ){ - if( pTable->isTemp ){ + if( iDb==1 ){ code = SQLITE_DROP_TEMP_VIEW; }else{ code = SQLITE_DROP_VIEW; } }else{ - if( pTable->isTemp ){ + if( iDb==1 ){ code = SQLITE_DROP_TEMP_TABLE; }else{ code = SQLITE_DROP_TABLE; } } - if( sqliteAuthCheck(pParse, code, pTable->zName, 0) ){ + if( sqliteAuthCheck(pParse, code, pTable->zName, 0, zDb) ){ return; } - if( sqliteAuthCheck(pParse, SQLITE_DELETE, pTable->zName, 0) ){ + if( sqliteAuthCheck(pParse, SQLITE_DELETE, pTable->zName, 0, zDb) ){ return; } } @@ -1181,31 +1292,44 @@ void sqliteDropTable(Parse *pParse, Token *pName, int isView){ }; Index *pIdx; Trigger *pTrigger; - sqliteBeginWriteOperation(pParse, 0, pTable->isTemp); - sqliteOpenMasterTable(v, pTable->isTemp); + sqliteBeginWriteOperation(pParse, 0, pTable->iDb); + /* Drop all triggers associated with the table being dropped */ pTrigger = pTable->pTrigger; while( pTrigger ){ - Token tt; - tt.z = pTable->pTrigger->name; - tt.n = strlen(pTable->pTrigger->name); - sqliteDropTrigger(pParse, &tt, 1); + SrcList *pNm; + assert( pTrigger->iDb==pTable->iDb || pTrigger->iDb==1 ); + pNm = sqliteSrcListAppend(0, 0, 0); + pNm->a[0].zName = sqliteStrDup(pTrigger->name); + pNm->a[0].zDatabase = sqliteStrDup(db->aDb[pTable->iDb].zName); + sqliteDropTrigger(pParse, pNm, 1); if( pParse->explain ){ pTrigger = pTrigger->pNext; }else{ pTrigger = pTable->pTrigger; } } + + /* Drop all SQLITE_MASTER entries that refer to the table */ + sqliteOpenMasterTable(v, pTable->iDb); base = sqliteVdbeAddOpList(v, ArraySize(dropTable), dropTable); sqliteVdbeChangeP3(v, base+1, pTable->zName, 0); - if( !pTable->isTemp ){ + + /* Drop all SQLITE_TEMP_MASTER entries that refer to the table */ + if( pTable->iDb!=1 ){ + sqliteOpenMasterTable(v, 1); + base = sqliteVdbeAddOpList(v, ArraySize(dropTable), dropTable); + sqliteVdbeChangeP3(v, base+1, pTable->zName, 0); + } + + if( pTable->iDb==0 ){ sqliteChangeCookie(db, v); } sqliteVdbeAddOp(v, OP_Close, 0, 0); if( !isView ){ - sqliteVdbeAddOp(v, OP_Destroy, pTable->tnum, pTable->isTemp); + sqliteVdbeAddOp(v, OP_Destroy, pTable->tnum, pTable->iDb); for(pIdx=pTable->pIndex; pIdx; pIdx=pIdx->pNext){ - sqliteVdbeAddOp(v, OP_Destroy, pIdx->tnum, pTable->isTemp); + sqliteVdbeAddOp(v, OP_Destroy, pIdx->tnum, pIdx->iDb); } } sqliteEndWriteOperation(pParse); @@ -1220,7 +1344,7 @@ void sqliteDropTable(Parse *pParse, Token *pName, int isView){ sqliteUnlinkAndDeleteTable(db, pTable); db->flags |= SQLITE_InternChanges; } - sqliteViewResetAll(db); + sqliteViewResetAll(db, iDb); } /* @@ -1403,9 +1527,10 @@ void sqliteDeferForeignKey(Parse *pParse, int isDeferred){ void sqliteCreateIndex( Parse *pParse, /* All information about this parse */ Token *pName, /* Name of the index. May be NULL */ - Token *pTable, /* Name of the table to index. Use pParse->pNewTable if 0 */ + SrcList *pTable, /* Name of the table to index. Use pParse->pNewTable if 0 */ IdList *pList, /* A list of columns to be indexed */ int onError, /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ + int isTemp, /* True if this is a temporary index */ Token *pStart, /* The CREATE token that begins a CREATE TABLE statement */ Token *pEnd /* The ")" that closes the CREATE INDEX statement */ ){ @@ -1415,7 +1540,6 @@ void sqliteCreateIndex( int i, j; Token nullId; /* Fake token for an empty ID list */ sqlite *db = pParse->db; - int hideName = 0; /* Do not put table name in the hash table */ if( pParse->nErr || sqlite_malloc_failed ) goto exit_create_index; @@ -1424,15 +1548,22 @@ void sqliteCreateIndex( */ if( pTable!=0 ){ assert( pName!=0 ); - pTab = sqliteTableFromToken(pParse, pTable); + assert( pTable->nSrc==1 ); + pTab = sqliteSrcListLookup(pParse, pTable); }else{ assert( pName==0 ); pTab = pParse->pNewTable; } if( pTab==0 || pParse->nErr ) goto exit_create_index; if( pTab->readOnly ){ + sqliteSetString(&pParse->zErrMsg, "table ", pTab->zName, + " may not be indexed", 0); + pParse->nErr++; + goto exit_create_index; + } + if( !isTemp && pTab->iDb>=2 && pParse->initFlag==0 ){ sqliteSetString(&pParse->zErrMsg, "table ", pTab->zName, - " may not have new indices added", 0); + " may not have non-temporary indices added", 0); pParse->nErr++; goto exit_create_index; } @@ -1441,16 +1572,8 @@ void sqliteCreateIndex( pParse->nErr++; goto exit_create_index; } - - /* If this index is created while re-reading the schema from sqlite_master - ** but the table associated with this index is a temporary table, it can - ** only mean that the table that this index is really associated with is - ** one whose name is hidden behind a temporary table with the same name. - ** Since its table has been suppressed, we need to also suppress the - ** index. - */ - if( pParse->initFlag && !pParse->isTemp && pTab->isTemp ){ - goto exit_create_index; + if( pTab->iDb==1 ){ + isTemp = 1; } /* @@ -1460,40 +1583,30 @@ void sqliteCreateIndex( ** Exception: If we are reading the names of permanent indices from the ** sqlite_master table (because some other process changed the schema) and ** one of the index names collides with the name of a temporary table or - ** index, then we will continue to process this index, but we will not - ** store its name in the hash table. Set the hideName flag to accomplish - ** this. + ** index, then we will continue to process this index. ** ** If pName==0 it means that we are ** dealing with a primary key or UNIQUE constraint. We have to invent our ** own name. */ - if( pName ){ + if( pName && !pParse->initFlag ){ Index *pISameName; /* Another index with the same name */ Table *pTSameName; /* A table with same name as the index */ - zName = sqliteTableNameFromToken(pName); + zName = sqliteStrNDup(pName->z, pName->n); if( zName==0 ) goto exit_create_index; - if( (pISameName = sqliteFindIndex(db, zName))!=0 ){ - if( pISameName->pTable->isTemp && pParse->initFlag ){ - hideName = 1; - }else{ - sqliteSetString(&pParse->zErrMsg, "index ", zName, - " already exists", 0); - pParse->nErr++; - goto exit_create_index; - } + if( (pISameName = sqliteFindIndex(db, zName, 0))!=0 ){ + sqliteSetString(&pParse->zErrMsg, "index ", zName, + " already exists", 0); + pParse->nErr++; + goto exit_create_index; } - if( (pTSameName = sqliteFindTable(db, zName))!=0 ){ - if( pTSameName->isTemp && pParse->initFlag ){ - hideName = 1; - }else{ - sqliteSetString(&pParse->zErrMsg, "there is already a table named ", - zName, 0); - pParse->nErr++; - goto exit_create_index; - } + if( (pTSameName = sqliteFindTable(db, zName, 0))!=0 ){ + sqliteSetString(&pParse->zErrMsg, "there is already a table named ", + zName, 0); + pParse->nErr++; + goto exit_create_index; } - }else{ + }else if( pName==0 ){ char zBuf[30]; int n; Index *pLoop; @@ -1502,19 +1615,26 @@ void sqliteCreateIndex( zName = 0; sqliteSetString(&zName, "(", pTab->zName, " autoindex ", zBuf, 0); if( zName==0 ) goto exit_create_index; - hideName = sqliteFindIndex(db, zName)!=0; + }else{ + zName = sqliteStrNDup(pName->z, pName->n); } /* Check for authorization to create an index. */ #ifndef SQLITE_OMIT_AUTHORIZATION - if( sqliteAuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(pTab->isTemp), 0) ){ - goto exit_create_index; - } - i = SQLITE_CREATE_INDEX; - if( pTab->isTemp ) i = SQLITE_CREATE_TEMP_INDEX; - if( sqliteAuthCheck(pParse, i, zName, pTab->zName) ){ - goto exit_create_index; + { + const char *zDb = db->aDb[pTab->iDb].zName; + + assert( isTemp==0 || isTemp==1 ); + assert( pTab->iDb==pParse->iDb || isTemp==1 ); + if( sqliteAuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0, zDb) ){ + goto exit_create_index; + } + i = SQLITE_CREATE_INDEX; + if( isTemp ) i = SQLITE_CREATE_TEMP_INDEX; + if( sqliteAuthCheck(pParse, i, zName, pTab->zName, zDb) ){ + goto exit_create_index; + } } #endif @@ -1540,8 +1660,9 @@ void sqliteCreateIndex( strcpy(pIndex->zName, zName); pIndex->pTable = pTab; pIndex->nColumn = pList->nId; - pIndex->onError = pIndex->isUnique = onError; + pIndex->onError = onError; pIndex->autoIndex = pName==0; + pIndex->iDb = isTemp ? 1 : pParse->iDb; /* Scan the names of the columns of the table to be indexed and ** load the column indices into the Index structure. Report an error @@ -1564,9 +1685,10 @@ void sqliteCreateIndex( /* Link the new Index structure to its table and to the other ** in-memory database structures. */ - if( !pParse->explain && !hideName ){ + if( !pParse->explain ){ Index *p; - p = sqliteHashInsert(&db->idxHash, pIndex->zName, strlen(zName)+1, pIndex); + p = sqliteHashInsert(&db->aDb[isTemp].idxHash, + pIndex->zName, strlen(zName)+1, pIndex); if( p ){ assert( p==pIndex ); /* Malloc must have failed */ sqliteFree(pIndex); @@ -1622,7 +1744,6 @@ void sqliteCreateIndex( int lbl1, lbl2; int i; int addr; - int isTemp = pTab->isTemp; v = sqliteGetVdbe(pParse); if( v==0 ) goto exit_create_index; @@ -1642,11 +1763,8 @@ void sqliteCreateIndex( pIndex->tnum = 0; if( pTable ){ sqliteVdbeAddOp(v, OP_Dup, 0, 0); - if( isTemp ){ - sqliteVdbeAddOp(v, OP_OpenWrAux, 1, 0); - }else{ - sqliteVdbeAddOp(v, OP_OpenWrite, 1, 0); - } + sqliteVdbeAddOp(v, OP_Integer, isTemp, 0); + sqliteVdbeAddOp(v, OP_OpenWrite, 1, 0); } addr = sqliteVdbeAddOp(v, OP_String, 0, 0); if( pStart && pEnd ){ @@ -1656,13 +1774,19 @@ void sqliteCreateIndex( sqliteVdbeAddOp(v, OP_MakeRecord, 5, 0); sqliteVdbeAddOp(v, OP_PutIntKey, 0, 0); if( pTable ){ - sqliteVdbeAddOp(v, isTemp ? OP_OpenAux : OP_Open, 2, pTab->tnum); + sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenRead, 2, pTab->tnum); sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC); lbl2 = sqliteVdbeMakeLabel(v); sqliteVdbeAddOp(v, OP_Rewind, 2, lbl2); lbl1 = sqliteVdbeAddOp(v, OP_Recno, 2, 0); for(i=0; i<pIndex->nColumn; i++){ - sqliteVdbeAddOp(v, OP_Column, 2, pIndex->aiColumn[i]); + int iCol = pIndex->aiColumn[i]; + if( pTab->iPKey==iCol ){ + sqliteVdbeAddOp(v, OP_Dup, i, 0); + }else{ + sqliteVdbeAddOp(v, OP_Column, 2, iCol); + } } sqliteVdbeAddOp(v, OP_MakeIdxKey, pIndex->nColumn, 0); if( db->file_format>=4 ) sqliteAddIdxKeyType(v, pIndex); @@ -1685,6 +1809,7 @@ void sqliteCreateIndex( /* Clean up before exiting */ exit_create_index: sqliteIdListDelete(pList); + sqliteSrcListDelete(pTable); sqliteFree(zName); return; } @@ -1693,39 +1818,40 @@ exit_create_index: ** This routine will drop an existing named index. This routine ** implements the DROP INDEX statement. */ -void sqliteDropIndex(Parse *pParse, Token *pName){ +void sqliteDropIndex(Parse *pParse, SrcList *pName){ Index *pIndex; - char *zName; Vdbe *v; sqlite *db = pParse->db; if( pParse->nErr || sqlite_malloc_failed ) return; - zName = sqliteTableNameFromToken(pName); - if( zName==0 ) return; - pIndex = sqliteFindIndex(db, zName); - sqliteFree(zName); + assert( pName->nSrc==1 ); + pIndex = sqliteFindIndex(db, pName->a[0].zName, pName->a[0].zDatabase); if( pIndex==0 ){ - sqliteSetNString(&pParse->zErrMsg, "no such index: ", 0, - pName->z, pName->n, 0); - pParse->nErr++; - return; + sqliteErrorMsg(pParse, "no such index: %S", pName, 0); + goto exit_drop_index; } if( pIndex->autoIndex ){ - sqliteSetString(&pParse->zErrMsg, "index associated with UNIQUE " + sqliteErrorMsg(pParse, "index associated with UNIQUE " "or PRIMARY KEY constraint cannot be dropped", 0); - pParse->nErr++; - return; + goto exit_drop_index; + } + if( pIndex->iDb>1 ){ + sqliteErrorMsg(pParse, "cannot alter schema of attached " + "databases", 0); + goto exit_drop_index; } #ifndef SQLITE_OMIT_AUTHORIZATION { int code = SQLITE_DROP_INDEX; Table *pTab = pIndex->pTable; - if( sqliteAuthCheck(pParse, SQLITE_DELETE, SCHEMA_TABLE(pTab->isTemp), 0) ){ - return; + const char *zDb = db->aDb[pIndex->iDb].zName; + const char *zTab = SCHEMA_TABLE(pIndex->iDb); + if( sqliteAuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){ + goto exit_drop_index; } - if( pTab->isTemp ) code = SQLITE_DROP_TEMP_INDEX; - if( sqliteAuthCheck(pParse, code, pIndex->zName, pTab->zName) ){ - return; + if( pIndex->iDb ) code = SQLITE_DROP_TEMP_INDEX; + if( sqliteAuthCheck(pParse, code, pIndex->zName, pTab->zName, zDb) ){ + goto exit_drop_index; } } #endif @@ -1745,17 +1871,16 @@ void sqliteDropIndex(Parse *pParse, Token *pName){ { OP_Delete, 0, 0, 0}, /* 8 */ }; int base; - Table *pTab = pIndex->pTable; - sqliteBeginWriteOperation(pParse, 0, pTab->isTemp); - sqliteOpenMasterTable(v, pTab->isTemp); + sqliteBeginWriteOperation(pParse, 0, pIndex->iDb); + sqliteOpenMasterTable(v, pIndex->iDb); base = sqliteVdbeAddOpList(v, ArraySize(dropIndex), dropIndex); sqliteVdbeChangeP3(v, base+1, pIndex->zName, 0); - if( !pTab->isTemp ){ + if( pIndex->iDb==0 ){ sqliteChangeCookie(db, v); } sqliteVdbeAddOp(v, OP_Close, 0, 0); - sqliteVdbeAddOp(v, OP_Destroy, pIndex->tnum, pTab->isTemp); + sqliteVdbeAddOp(v, OP_Destroy, pIndex->tnum, pIndex->iDb); sqliteEndWriteOperation(pParse); } @@ -1765,6 +1890,9 @@ void sqliteDropIndex(Parse *pParse, Token *pName){ sqliteUnlinkAndDeleteIndex(db, pIndex); db->flags |= SQLITE_InternChanges; } + +exit_drop_index: + sqliteSrcListDelete(pName); } /* @@ -1807,25 +1935,53 @@ IdList *sqliteIdListAppend(IdList *pList, Token *pToken){ ** need be. A new entry is created in the SrcList even if pToken is NULL. ** ** A new SrcList is returned, or NULL if malloc() fails. +** +** If pDatabase is not null, it means that the table has an optional +** database name prefix. Like this: "database.table". The pDatabase +** points to the table name and the pTable points to the database name. +** The SrcList.a[].zName field is filled with the table name which might +** come from pTable (if pDatabase is NULL) or from pDatabase. +** SrcList.a[].zDatabase is filled with the database name from pTable, +** or with NULL if no database is specified. +** +** In other words, if call like this: +** +** sqliteSrcListAppend(A,B,0); +** +** Then B is a table name and the database name is unspecified. If called +** like this: +** +** sqliteSrcListAppend(A,B,C); +** +** Then C is the table name and B is the database name. */ -SrcList *sqliteSrcListAppend(SrcList *pList, Token *pToken){ +SrcList *sqliteSrcListAppend(SrcList *pList, Token *pTable, Token *pDatabase){ if( pList==0 ){ - pList = sqliteMalloc( sizeof(IdList) ); + pList = sqliteMalloc( sizeof(SrcList) ); if( pList==0 ) return 0; } - if( (pList->nSrc & 7)==0 ){ - struct SrcList_item *a; - a = sqliteRealloc(pList->a, (pList->nSrc+8)*sizeof(pList->a[0]) ); - if( a==0 ){ + if( (pList->nSrc & 7)==1 ){ + SrcList *pNew; + pNew = sqliteRealloc(pList, + sizeof(*pList) + (pList->nSrc+8)*sizeof(pList->a[0]) ); + if( pNew==0 ){ sqliteSrcListDelete(pList); return 0; } - pList->a = a; + pList = pNew; } memset(&pList->a[pList->nSrc], 0, sizeof(pList->a[0])); - if( pToken ){ + if( pDatabase && pDatabase->z==0 ){ + pDatabase = 0; + } + if( pDatabase && pTable ){ + Token *pTemp = pDatabase; + pDatabase = pTable; + pTable = pTemp; + } + if( pTable ){ char **pz = &pList->a[pList->nSrc].zName; - sqliteSetNString(pz, pToken->z, pToken->n, 0); + sqliteSetNString(pz, pTable->z, pTable->n, 0); if( *pz==0 ){ sqliteSrcListDelete(pList); return 0; @@ -1833,11 +1989,34 @@ SrcList *sqliteSrcListAppend(SrcList *pList, Token *pToken){ sqliteDequote(*pz); } } + if( pDatabase ){ + char **pz = &pList->a[pList->nSrc].zDatabase; + sqliteSetNString(pz, pDatabase->z, pDatabase->n, 0); + if( *pz==0 ){ + sqliteSrcListDelete(pList); + return 0; + }else{ + sqliteDequote(*pz); + } + } + pList->a[pList->nSrc].iCursor = -1; pList->nSrc++; return pList; } /* +** Assign cursors to all tables in a SrcList +*/ +void sqliteSrcListAssignCursors(Parse *pParse, SrcList *pList){ + int i; + for(i=0; i<pList->nSrc; i++){ + if( pList->a[i].iCursor<0 ){ + pList->a[i].iCursor = pParse->nTab++; + } + } +} + +/* ** Add an alias to the last identifier on the given identifier list. */ void sqliteSrcListAddAlias(SrcList *pList, Token *pToken){ @@ -1881,6 +2060,7 @@ void sqliteSrcListDelete(SrcList *pList){ int i; if( pList==0 ) return; for(i=0; i<pList->nSrc; i++){ + sqliteFree(pList->a[i].zDatabase); sqliteFree(pList->a[i].zName); sqliteFree(pList->a[i].zAlias); if( pList->a[i].pTab && pList->a[i].pTab->isTransient ){ @@ -1890,137 +2070,20 @@ void sqliteSrcListDelete(SrcList *pList){ sqliteExprDelete(pList->a[i].pOn); sqliteIdListDelete(pList->a[i].pUsing); } - sqliteFree(pList->a); sqliteFree(pList); } /* -** The COPY command is for compatibility with PostgreSQL and specificially -** for the ability to read the output of pg_dump. The format is as -** follows: -** -** COPY table FROM file [USING DELIMITERS string] -** -** "table" is an existing table name. We will read lines of code from -** file to fill this table with data. File might be "stdin". The optional -** delimiter string identifies the field separators. The default is a tab. -*/ -void sqliteCopy( - Parse *pParse, /* The parser context */ - Token *pTableName, /* The name of the table into which we will insert */ - Token *pFilename, /* The file from which to obtain information */ - Token *pDelimiter, /* Use this as the field delimiter */ - int onError /* What to do if a constraint fails */ -){ - Table *pTab; - char *zTab; - int i; - Vdbe *v; - int addr, end; - Index *pIdx; - char *zFile = 0; - sqlite *db = pParse->db; - - - zTab = sqliteTableNameFromToken(pTableName); - if( sqlite_malloc_failed || zTab==0 ) goto copy_cleanup; - pTab = sqliteTableNameToTable(pParse, zTab); - sqliteFree(zTab); - if( pTab==0 ) goto copy_cleanup; - zFile = sqliteStrNDup(pFilename->z, pFilename->n); - sqliteDequote(zFile); - if( sqliteAuthCheck(pParse, SQLITE_INSERT, pTab->zName, zFile) - || sqliteAuthCheck(pParse, SQLITE_COPY, pTab->zName, zFile) ){ - goto copy_cleanup; - } - v = sqliteGetVdbe(pParse); - if( v ){ - int openOp; - sqliteBeginWriteOperation(pParse, 1, pTab->isTemp); - addr = sqliteVdbeAddOp(v, OP_FileOpen, 0, 0); - sqliteVdbeChangeP3(v, addr, pFilename->z, pFilename->n); - sqliteVdbeDequoteP3(v, addr); - openOp = pTab->isTemp ? OP_OpenWrAux : OP_OpenWrite; - sqliteVdbeAddOp(v, openOp, 0, pTab->tnum); - sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC); - for(i=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ - sqliteVdbeAddOp(v, openOp, i, pIdx->tnum); - sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC); - } - if( db->flags & SQLITE_CountRows ){ - sqliteVdbeAddOp(v, OP_Integer, 0, 0); /* Initialize the row count */ - } - end = sqliteVdbeMakeLabel(v); - addr = sqliteVdbeAddOp(v, OP_FileRead, pTab->nCol, end); - if( pDelimiter ){ - sqliteVdbeChangeP3(v, addr, pDelimiter->z, pDelimiter->n); - sqliteVdbeDequoteP3(v, addr); - }else{ - sqliteVdbeChangeP3(v, addr, "\t", 1); - } - if( pTab->iPKey>=0 ){ - sqliteVdbeAddOp(v, OP_FileColumn, pTab->iPKey, 0); - sqliteVdbeAddOp(v, OP_MustBeInt, 0, 0); - }else{ - sqliteVdbeAddOp(v, OP_NewRecno, 0, 0); - } - for(i=0; i<pTab->nCol; i++){ - if( i==pTab->iPKey ){ - /* The integer primary key column is filled with NULL since its - ** value is always pulled from the record number */ - sqliteVdbeAddOp(v, OP_String, 0, 0); - }else{ - sqliteVdbeAddOp(v, OP_FileColumn, i, 0); - } - } - sqliteGenerateConstraintChecks(pParse, pTab, 0, 0, 0, 0, onError, addr); - sqliteCompleteInsertion(pParse, pTab, 0, 0, 0, 0); - if( (db->flags & SQLITE_CountRows)!=0 ){ - sqliteVdbeAddOp(v, OP_AddImm, 1, 0); /* Increment row count */ - } - sqliteVdbeAddOp(v, OP_Goto, 0, addr); - sqliteVdbeResolveLabel(v, end); - sqliteVdbeAddOp(v, OP_Noop, 0, 0); - sqliteEndWriteOperation(pParse); - if( db->flags & SQLITE_CountRows ){ - sqliteVdbeAddOp(v, OP_ColumnName, 0, 0); - sqliteVdbeChangeP3(v, -1, "rows inserted", P3_STATIC); - sqliteVdbeAddOp(v, OP_Callback, 1, 0); - } - } - -copy_cleanup: - sqliteFree(zFile); - return; -} - -/* -** The non-standard VACUUM command is used to clean up the database, -** collapse free space, etc. It is modelled after the VACUUM command -** in PostgreSQL. -** -** In version 1.0.x of SQLite, the VACUUM command would call -** gdbm_reorganize() on all the database tables. But beginning -** with 2.0.0, SQLite no longer uses GDBM so this command has -** become a no-op. -*/ -void sqliteVacuum(Parse *pParse, Token *pTableName){ - /* Do nothing */ -} - -/* ** Begin a transaction */ void sqliteBeginTransaction(Parse *pParse, int onError){ sqlite *db; - if( pParse==0 || (db=pParse->db)==0 || db->pBe==0 ) return; + if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return; if( pParse->nErr || sqlite_malloc_failed ) return; - if( sqliteAuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0) ) return; + if( sqliteAuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0, 0) ) return; if( db->flags & SQLITE_InTrans ){ - pParse->nErr++; - sqliteSetString(&pParse->zErrMsg, "cannot start a transaction " - "within a transaction", 0); + sqliteErrorMsg(pParse, "cannot start a transaction within a transaction"); return; } sqliteBeginWriteOperation(pParse, 0, 0); @@ -2034,13 +2097,11 @@ void sqliteBeginTransaction(Parse *pParse, int onError){ void sqliteCommitTransaction(Parse *pParse){ sqlite *db; - if( pParse==0 || (db=pParse->db)==0 || db->pBe==0 ) return; + if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return; if( pParse->nErr || sqlite_malloc_failed ) return; - if( sqliteAuthCheck(pParse, SQLITE_TRANSACTION, "COMMIT", 0) ) return; + if( sqliteAuthCheck(pParse, SQLITE_TRANSACTION, "COMMIT", 0, 0) ) return; if( (db->flags & SQLITE_InTrans)==0 ){ - pParse->nErr++; - sqliteSetString(&pParse->zErrMsg, - "cannot commit - no transaction is active", 0); + sqliteErrorMsg(pParse, "cannot commit - no transaction is active"); return; } db->flags &= ~SQLITE_InTrans; @@ -2055,13 +2116,11 @@ void sqliteRollbackTransaction(Parse *pParse){ sqlite *db; Vdbe *v; - if( pParse==0 || (db=pParse->db)==0 || db->pBe==0 ) return; + if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return; if( pParse->nErr || sqlite_malloc_failed ) return; - if( sqliteAuthCheck(pParse, SQLITE_TRANSACTION, "ROLLBACK", 0) ) return; + if( sqliteAuthCheck(pParse, SQLITE_TRANSACTION, "ROLLBACK", 0, 0) ) return; if( (db->flags & SQLITE_InTrans)==0 ){ - pParse->nErr++; - sqliteSetString(&pParse->zErrMsg, - "cannot rollback - no transaction is active", 0); + sqliteErrorMsg(pParse, "cannot rollback - no transaction is active"); return; } v = sqliteGetVdbe(pParse); @@ -2073,6 +2132,21 @@ void sqliteRollbackTransaction(Parse *pParse){ } /* +** Generate VDBE code that will verify the schema cookie for all +** named database files. +*/ +void sqliteCodeVerifySchema(Parse *pParse, int iDb){ + sqlite *db = pParse->db; + Vdbe *v = sqliteGetVdbe(pParse); + assert( iDb>=0 && iDb<db->nDb ); + assert( db->aDb[iDb].pBt!=0 ); + if( iDb!=1 && !DbHasProperty(db, iDb, DB_Cookie) ){ + sqliteVdbeAddOp(v, OP_VerifyCookie, iDb, db->aDb[iDb].schema_cookie); + DbSetProperty(db, iDb, DB_Cookie); + } +} + +/* ** Generate VDBE code that prepares for doing an operation that ** might change the database. ** @@ -2085,485 +2159,50 @@ void sqliteRollbackTransaction(Parse *pParse){ ** can be checked before any changes are made to the database, it is never ** necessary to undo a write and the checkpoint should not be set. ** -** The tempOnly flag indicates that only temporary tables will be changed -** during this write operation. The primary database table is not -** write-locked. Only the temporary database file gets a write lock. -** Other processes can continue to read or write the primary database file. +** Only database iDb and the temp database are made writable by this call. +** If iDb==0, then the main and temp databases are made writable. If +** iDb==1 then only the temp database is made writable. If iDb>1 then the +** specified auxiliary database and the temp database are made writable. */ -void sqliteBeginWriteOperation(Parse *pParse, int setCheckpoint, int tempOnly){ +void sqliteBeginWriteOperation(Parse *pParse, int setCheckpoint, int iDb){ Vdbe *v; + sqlite *db = pParse->db; + if( DbHasProperty(db, iDb, DB_Locked) ) return; v = sqliteGetVdbe(pParse); if( v==0 ) return; - if( pParse->trigStack ) return; /* if this is in a trigger */ - if( (pParse->db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Transaction, tempOnly, 0); - if( !tempOnly ){ - sqliteVdbeAddOp(v, OP_VerifyCookie, pParse->db->schema_cookie, 0); - pParse->schemaVerified = 1; + if( !db->aDb[iDb].inTrans ){ + sqliteVdbeAddOp(v, OP_Transaction, iDb, 0); + DbSetProperty(db, iDb, DB_Locked); + sqliteCodeVerifySchema(pParse, iDb); + if( iDb!=1 ){ + sqliteBeginWriteOperation(pParse, setCheckpoint, 1); } }else if( setCheckpoint ){ - sqliteVdbeAddOp(v, OP_Checkpoint, 0, 0); + sqliteVdbeAddOp(v, OP_Checkpoint, iDb, 0); + DbSetProperty(db, iDb, DB_Locked); } } /* ** Generate code that concludes an operation that may have changed -** the database. This is a companion function to BeginWriteOperation(). -** If a transaction was started, then commit it. If a checkpoint was -** started then commit that. +** the database. If a statement transaction was started, then emit +** an OP_Commit that will cause the changes to be committed to disk. +** +** Note that checkpoints are automatically committed at the end of +** a statement. Note also that there can be multiple calls to +** sqliteBeginWriteOperation() but there should only be a single +** call to sqliteEndWriteOperation() at the conclusion of the statement. */ void sqliteEndWriteOperation(Parse *pParse){ Vdbe *v; + sqlite *db = pParse->db; if( pParse->trigStack ) return; /* if this is in a trigger */ v = sqliteGetVdbe(pParse); if( v==0 ) return; - if( pParse->db->flags & SQLITE_InTrans ){ - /* Do Nothing */ + if( db->flags & SQLITE_InTrans ){ + /* A BEGIN has executed. Do not commit until we see an explicit + ** COMMIT statement. */ }else{ sqliteVdbeAddOp(v, OP_Commit, 0, 0); } } - - -/* -** Interpret the given string as a boolean value. -*/ -static int getBoolean(char *z){ - static char *azTrue[] = { "yes", "on", "true" }; - int i; - if( z[0]==0 ) return 0; - if( isdigit(z[0]) || (z[0]=='-' && isdigit(z[1])) ){ - return atoi(z); - } - for(i=0; i<sizeof(azTrue)/sizeof(azTrue[0]); i++){ - if( sqliteStrICmp(z,azTrue[i])==0 ) return 1; - } - return 0; -} - -/* -** Interpret the given string as a safety level. Return 0 for OFF, -** 1 for ON or NORMAL and 2 for FULL. -** -** Note that the values returned are one less that the values that -** should be passed into sqliteBtreeSetSafetyLevel(). The is done -** to support legacy SQL code. The safety level used to be boolean -** and older scripts may have used numbers 0 for OFF and 1 for ON. -*/ -static int getSafetyLevel(char *z){ - static const struct { - const char *zWord; - int val; - } aKey[] = { - { "no", 0 }, - { "off", 0 }, - { "false", 0 }, - { "yes", 1 }, - { "on", 1 }, - { "true", 1 }, - { "full", 2 }, - }; - int i; - if( z[0]==0 ) return 1; - if( isdigit(z[0]) || (z[0]=='-' && isdigit(z[1])) ){ - return atoi(z); - } - for(i=0; i<sizeof(aKey)/sizeof(aKey[0]); i++){ - if( sqliteStrICmp(z,aKey[i].zWord)==0 ) return aKey[i].val; - } - return 1; -} - -/* -** Process a pragma statement. -** -** Pragmas are of this form: -** -** PRAGMA id = value -** -** The identifier might also be a string. The value is a string, and -** identifier, or a number. If minusFlag is true, then the value is -** a number that was preceded by a minus sign. -*/ -void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){ - char *zLeft = 0; - char *zRight = 0; - sqlite *db = pParse->db; - - zLeft = sqliteStrNDup(pLeft->z, pLeft->n); - sqliteDequote(zLeft); - if( minusFlag ){ - zRight = 0; - sqliteSetNString(&zRight, "-", 1, pRight->z, pRight->n, 0); - }else{ - zRight = sqliteStrNDup(pRight->z, pRight->n); - sqliteDequote(zRight); - } - if( sqliteAuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight) ){ - sqliteFree(zLeft); - sqliteFree(zRight); - return; - } - - /* - ** PRAGMA default_cache_size - ** PRAGMA default_cache_size=N - ** - ** The first form reports the current persistent setting for the - ** page cache size. The value returned is the maximum number of - ** pages in the page cache. The second form sets both the current - ** page cache size value and the persistent page cache size value - ** stored in the database file. - ** - ** The default cache size is stored in meta-value 2 of page 1 of the - ** database file. The cache size is actually the absolute value of - ** this memory location. The sign of meta-value 2 determines the - ** synchronous setting. A negative value means synchronous is off - ** and a positive value means synchronous is on. - */ - if( sqliteStrICmp(zLeft,"default_cache_size")==0 ){ - static VdbeOp getCacheSize[] = { - { OP_ReadCookie, 0, 2, 0}, - { OP_AbsValue, 0, 0, 0}, - { OP_Dup, 0, 0, 0}, - { OP_Integer, 0, 0, 0}, - { OP_Ne, 0, 6, 0}, - { OP_Integer, MAX_PAGES,0, 0}, - { OP_ColumnName, 0, 0, "cache_size"}, - { OP_Callback, 1, 0, 0}, - }; - Vdbe *v = sqliteGetVdbe(pParse); - if( v==0 ) return; - if( pRight->z==pLeft->z ){ - sqliteVdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize); - }else{ - int addr; - int size = atoi(zRight); - if( size<0 ) size = -size; - sqliteBeginWriteOperation(pParse, 0, 0); - sqliteVdbeAddOp(v, OP_Integer, size, 0); - sqliteVdbeAddOp(v, OP_ReadCookie, 0, 2); - addr = sqliteVdbeAddOp(v, OP_Integer, 0, 0); - sqliteVdbeAddOp(v, OP_Ge, 0, addr+3); - sqliteVdbeAddOp(v, OP_Negative, 0, 0); - sqliteVdbeAddOp(v, OP_SetCookie, 0, 2); - sqliteEndWriteOperation(pParse); - db->cache_size = db->cache_size<0 ? -size : size; - sqliteBtreeSetCacheSize(db->pBe, db->cache_size); - } - }else - - /* - ** PRAGMA cache_size - ** PRAGMA cache_size=N - ** - ** The first form reports the current local setting for the - ** page cache size. The local setting can be different from - ** the persistent cache size value that is stored in the database - ** file itself. The value returned is the maximum number of - ** pages in the page cache. The second form sets the local - ** page cache size value. It does not change the persistent - ** cache size stored on the disk so the cache size will revert - ** to its default value when the database is closed and reopened. - ** N should be a positive integer. - */ - if( sqliteStrICmp(zLeft,"cache_size")==0 ){ - static VdbeOp getCacheSize[] = { - { OP_ColumnName, 0, 0, "cache_size"}, - { OP_Callback, 1, 0, 0}, - }; - Vdbe *v = sqliteGetVdbe(pParse); - if( v==0 ) return; - if( pRight->z==pLeft->z ){ - int size = db->cache_size;; - if( size<0 ) size = -size; - sqliteVdbeAddOp(v, OP_Integer, size, 0); - sqliteVdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize); - }else{ - int size = atoi(zRight); - if( size<0 ) size = -size; - if( db->cache_size<0 ) size = -size; - db->cache_size = size; - sqliteBtreeSetCacheSize(db->pBe, db->cache_size); - } - }else - - /* - ** PRAGMA default_synchronous - ** PRAGMA default_synchronous=ON|OFF|NORMAL|FULL - ** - ** The first form returns the persistent value of the "synchronous" setting - ** that is stored in the database. This is the synchronous setting that - ** is used whenever the database is opened unless overridden by a separate - ** "synchronous" pragma. The second form changes the persistent and the - ** local synchronous setting to the value given. - ** - ** If synchronous is OFF, SQLite does not attempt any fsync() systems calls - ** to make sure data is committed to disk. Write operations are very fast, - ** but a power failure can leave the database in an inconsistent state. - ** If synchronous is ON or NORMAL, SQLite will do an fsync() system call to - ** make sure data is being written to disk. The risk of corruption due to - ** a power loss in this mode is negligible but non-zero. If synchronous - ** is FULL, extra fsync()s occur to reduce the risk of corruption to near - ** zero, but with a write performance penalty. The default mode is NORMAL. - */ - if( sqliteStrICmp(zLeft,"default_synchronous")==0 ){ - static VdbeOp getSync[] = { - { OP_ColumnName, 0, 0, "synchronous"}, - { OP_ReadCookie, 0, 3, 0}, - { OP_Dup, 0, 0, 0}, - { OP_If, 0, 0, 0}, /* 3 */ - { OP_ReadCookie, 0, 2, 0}, - { OP_Integer, 0, 0, 0}, - { OP_Lt, 0, 5, 0}, - { OP_AddImm, 1, 0, 0}, - { OP_Callback, 1, 0, 0}, - { OP_Halt, 0, 0, 0}, - { OP_AddImm, -1, 0, 0}, /* 10 */ - { OP_Callback, 1, 0, 0} - }; - Vdbe *v = sqliteGetVdbe(pParse); - if( v==0 ) return; - if( pRight->z==pLeft->z ){ - int addr = sqliteVdbeAddOpList(v, ArraySize(getSync), getSync); - sqliteVdbeChangeP2(v, addr+3, addr+10); - }else{ - int addr; - int size = db->cache_size; - if( size<0 ) size = -size; - sqliteBeginWriteOperation(pParse, 0, 0); - sqliteVdbeAddOp(v, OP_ReadCookie, 0, 2); - sqliteVdbeAddOp(v, OP_Dup, 0, 0); - addr = sqliteVdbeAddOp(v, OP_Integer, 0, 0); - sqliteVdbeAddOp(v, OP_Ne, 0, addr+3); - sqliteVdbeAddOp(v, OP_AddImm, MAX_PAGES, 0); - sqliteVdbeAddOp(v, OP_AbsValue, 0, 0); - db->safety_level = getSafetyLevel(zRight)+1; - if( db->safety_level==1 ){ - sqliteVdbeAddOp(v, OP_Negative, 0, 0); - size = -size; - } - sqliteVdbeAddOp(v, OP_SetCookie, 0, 2); - sqliteVdbeAddOp(v, OP_Integer, db->safety_level, 0); - sqliteVdbeAddOp(v, OP_SetCookie, 0, 3); - sqliteEndWriteOperation(pParse); - db->cache_size = size; - sqliteBtreeSetCacheSize(db->pBe, db->cache_size); - sqliteBtreeSetSafetyLevel(db->pBe, db->safety_level); - } - }else - - /* - ** PRAGMA synchronous - ** PRAGMA synchronous=OFF|ON|NORMAL|FULL - ** - ** Return or set the local value of the synchronous flag. Changing - ** the local value does not make changes to the disk file and the - ** default value will be restored the next time the database is - ** opened. - */ - if( sqliteStrICmp(zLeft,"synchronous")==0 ){ - static VdbeOp getSync[] = { - { OP_ColumnName, 0, 0, "synchronous"}, - { OP_Callback, 1, 0, 0}, - }; - Vdbe *v = sqliteGetVdbe(pParse); - if( v==0 ) return; - if( pRight->z==pLeft->z ){ - sqliteVdbeAddOp(v, OP_Integer, db->safety_level-1, 0); - sqliteVdbeAddOpList(v, ArraySize(getSync), getSync); - }else{ - int size = db->cache_size; - if( size<0 ) size = -size; - db->safety_level = getSafetyLevel(zRight)+1; - if( db->safety_level==1 ) size = -size; - db->cache_size = size; - sqliteBtreeSetCacheSize(db->pBe, db->cache_size); - sqliteBtreeSetSafetyLevel(db->pBe, db->safety_level); - } - }else - - if( sqliteStrICmp(zLeft, "trigger_overhead_test")==0 ){ - if( getBoolean(zRight) ){ - always_code_trigger_setup = 1; - }else{ - always_code_trigger_setup = 0; - } - }else - - if( sqliteStrICmp(zLeft, "vdbe_trace")==0 ){ - if( getBoolean(zRight) ){ - db->flags |= SQLITE_VdbeTrace; - }else{ - db->flags &= ~SQLITE_VdbeTrace; - } - }else - - if( sqliteStrICmp(zLeft, "full_column_names")==0 ){ - if( getBoolean(zRight) ){ - db->flags |= SQLITE_FullColNames; - }else{ - db->flags &= ~SQLITE_FullColNames; - } - }else - - if( sqliteStrICmp(zLeft, "show_datatypes")==0 ){ - if( getBoolean(zRight) ){ - db->flags |= SQLITE_ReportTypes; - }else{ - db->flags &= ~SQLITE_ReportTypes; - } - }else - - if( sqliteStrICmp(zLeft, "result_set_details")==0 ){ - if( getBoolean(zRight) ){ - db->flags |= SQLITE_ResultDetails; - }else{ - db->flags &= ~SQLITE_ResultDetails; - } - }else - - if( sqliteStrICmp(zLeft, "count_changes")==0 ){ - if( getBoolean(zRight) ){ - db->flags |= SQLITE_CountRows; - }else{ - db->flags &= ~SQLITE_CountRows; - } - }else - - if( sqliteStrICmp(zLeft, "empty_result_callbacks")==0 ){ - if( getBoolean(zRight) ){ - db->flags |= SQLITE_NullCallback; - }else{ - db->flags &= ~SQLITE_NullCallback; - } - }else - - if( sqliteStrICmp(zLeft, "table_info")==0 ){ - Table *pTab; - Vdbe *v; - pTab = sqliteFindTable(db, zRight); - if( pTab ) v = sqliteGetVdbe(pParse); - if( pTab && v ){ - static VdbeOp tableInfoPreface[] = { - { OP_ColumnName, 0, 0, "cid"}, - { OP_ColumnName, 1, 0, "name"}, - { OP_ColumnName, 2, 0, "type"}, - { OP_ColumnName, 3, 0, "notnull"}, - { OP_ColumnName, 4, 0, "dflt_value"}, - }; - int i; - sqliteVdbeAddOpList(v, ArraySize(tableInfoPreface), tableInfoPreface); - sqliteViewGetColumnNames(pParse, pTab); - for(i=0; i<pTab->nCol; i++){ - sqliteVdbeAddOp(v, OP_Integer, i, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0); - sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zName, P3_STATIC); - sqliteVdbeAddOp(v, OP_String, 0, 0); - sqliteVdbeChangeP3(v, -1, - pTab->aCol[i].zType ? pTab->aCol[i].zType : "numeric", P3_STATIC); - sqliteVdbeAddOp(v, OP_Integer, pTab->aCol[i].notNull, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0); - sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zDflt, P3_STATIC); - sqliteVdbeAddOp(v, OP_Callback, 5, 0); - } - } - }else - - if( sqliteStrICmp(zLeft, "index_info")==0 ){ - Index *pIdx; - Table *pTab; - Vdbe *v; - pIdx = sqliteFindIndex(db, zRight); - if( pIdx ) v = sqliteGetVdbe(pParse); - if( pIdx && v ){ - static VdbeOp tableInfoPreface[] = { - { OP_ColumnName, 0, 0, "seqno"}, - { OP_ColumnName, 1, 0, "cid"}, - { OP_ColumnName, 2, 0, "name"}, - }; - int i; - pTab = pIdx->pTable; - sqliteVdbeAddOpList(v, ArraySize(tableInfoPreface), tableInfoPreface); - for(i=0; i<pIdx->nColumn; i++){ - int cnum = pIdx->aiColumn[i]; - sqliteVdbeAddOp(v, OP_Integer, i, 0); - sqliteVdbeAddOp(v, OP_Integer, cnum, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0); - assert( pTab->nCol>cnum ); - sqliteVdbeChangeP3(v, -1, pTab->aCol[cnum].zName, P3_STATIC); - sqliteVdbeAddOp(v, OP_Callback, 3, 0); - } - } - }else - - if( sqliteStrICmp(zLeft, "index_list")==0 ){ - Index *pIdx; - Table *pTab; - Vdbe *v; - pTab = sqliteFindTable(db, zRight); - if( pTab ){ - v = sqliteGetVdbe(pParse); - pIdx = pTab->pIndex; - } - if( pTab && pIdx && v ){ - int i = 0; - static VdbeOp indexListPreface[] = { - { OP_ColumnName, 0, 0, "seq"}, - { OP_ColumnName, 1, 0, "name"}, - { OP_ColumnName, 2, 0, "unique"}, - }; - - sqliteVdbeAddOpList(v, ArraySize(indexListPreface), indexListPreface); - while(pIdx){ - sqliteVdbeAddOp(v, OP_Integer, i, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0); - sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC); - sqliteVdbeAddOp(v, OP_Integer, pIdx->onError!=OE_None, 0); - sqliteVdbeAddOp(v, OP_Callback, 3, 0); - ++i; - pIdx = pIdx->pNext; - } - } - }else - -#ifndef NDEBUG - if( sqliteStrICmp(zLeft, "parser_trace")==0 ){ - extern void sqliteParserTrace(FILE*, char *); - if( getBoolean(zRight) ){ - sqliteParserTrace(stdout, "parser: "); - }else{ - sqliteParserTrace(0, 0); - } - }else -#endif - - if( sqliteStrICmp(zLeft, "integrity_check")==0 ){ - static VdbeOp checkDb[] = { - { OP_SetInsert, 0, 0, "2"}, - { OP_Open, 0, 2, 0}, - { OP_Rewind, 0, 6, 0}, - { OP_Column, 0, 3, 0}, /* 3 */ - { OP_SetInsert, 0, 0, 0}, - { OP_Next, 0, 3, 0}, - { OP_IntegrityCk, 0, 0, 0}, /* 6 */ - { OP_ColumnName, 0, 0, "integrity_check"}, - { OP_Callback, 1, 0, 0}, - { OP_SetInsert, 1, 0, "2"}, - { OP_OpenAux, 1, 2, 0}, - { OP_Rewind, 1, 15, 0}, - { OP_Column, 1, 3, 0}, /* 12 */ - { OP_SetInsert, 1, 0, 0}, - { OP_Next, 1, 12, 0}, - { OP_IntegrityCk, 1, 1, 0}, /* 15 */ - { OP_Callback, 1, 0, 0}, - }; - Vdbe *v = sqliteGetVdbe(pParse); - if( v==0 ) return; - sqliteVdbeAddOpList(v, ArraySize(checkDb), checkDb); - }else - - {} - sqliteFree(zLeft); - sqliteFree(zRight); -} diff --git a/ext/sqlite/libsqlite/src/copy.c b/ext/sqlite/libsqlite/src/copy.c new file mode 100644 index 0000000000..ac2d8ecd37 --- /dev/null +++ b/ext/sqlite/libsqlite/src/copy.c @@ -0,0 +1,119 @@ +/* +** 2003 April 6 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains code used to implement the COPY command. +** +** $Id$ +*/ +#include "sqliteInt.h" + +/* +** The COPY command is for compatibility with PostgreSQL and specificially +** for the ability to read the output of pg_dump. The format is as +** follows: +** +** COPY table FROM file [USING DELIMITERS string] +** +** "table" is an existing table name. We will read lines of code from +** file to fill this table with data. File might be "stdin". The optional +** delimiter string identifies the field separators. The default is a tab. +*/ +void sqliteCopy( + Parse *pParse, /* The parser context */ + SrcList *pTableName, /* The name of the table into which we will insert */ + Token *pFilename, /* The file from which to obtain information */ + Token *pDelimiter, /* Use this as the field delimiter */ + int onError /* What to do if a constraint fails */ +){ + Table *pTab; + int i; + Vdbe *v; + int addr, end; + Index *pIdx; + char *zFile = 0; + const char *zDb; + sqlite *db = pParse->db; + + + if( sqlite_malloc_failed ) goto copy_cleanup; + assert( pTableName->nSrc==1 ); + pTab = sqliteSrcListLookup(pParse, pTableName); + if( pTab==0 || sqliteIsReadOnly(pParse, pTab, 0) ) goto copy_cleanup; + zFile = sqliteStrNDup(pFilename->z, pFilename->n); + sqliteDequote(zFile); + assert( pTab->iDb<db->nDb ); + zDb = db->aDb[pTab->iDb].zName; + if( sqliteAuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0, zDb) + || sqliteAuthCheck(pParse, SQLITE_COPY, pTab->zName, zFile, zDb) ){ + goto copy_cleanup; + } + v = sqliteGetVdbe(pParse); + if( v ){ + sqliteBeginWriteOperation(pParse, 1, pTab->iDb); + addr = sqliteVdbeAddOp(v, OP_FileOpen, 0, 0); + sqliteVdbeChangeP3(v, addr, pFilename->z, pFilename->n); + sqliteVdbeDequoteP3(v, addr); + sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenWrite, 0, pTab->tnum); + sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC); + for(i=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ + assert( pIdx->iDb==1 || pIdx->iDb==pTab->iDb ); + sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenWrite, i, pIdx->tnum); + sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC); + } + if( db->flags & SQLITE_CountRows ){ + sqliteVdbeAddOp(v, OP_Integer, 0, 0); /* Initialize the row count */ + } + end = sqliteVdbeMakeLabel(v); + addr = sqliteVdbeAddOp(v, OP_FileRead, pTab->nCol, end); + if( pDelimiter ){ + sqliteVdbeChangeP3(v, addr, pDelimiter->z, pDelimiter->n); + sqliteVdbeDequoteP3(v, addr); + }else{ + sqliteVdbeChangeP3(v, addr, "\t", 1); + } + if( pTab->iPKey>=0 ){ + sqliteVdbeAddOp(v, OP_FileColumn, pTab->iPKey, 0); + sqliteVdbeAddOp(v, OP_MustBeInt, 0, 0); + }else{ + sqliteVdbeAddOp(v, OP_NewRecno, 0, 0); + } + for(i=0; i<pTab->nCol; i++){ + if( i==pTab->iPKey ){ + /* The integer primary key column is filled with NULL since its + ** value is always pulled from the record number */ + sqliteVdbeAddOp(v, OP_String, 0, 0); + }else{ + sqliteVdbeAddOp(v, OP_FileColumn, i, 0); + } + } + sqliteGenerateConstraintChecks(pParse, pTab, 0, 0, 0, 0, onError, addr); + sqliteCompleteInsertion(pParse, pTab, 0, 0, 0, 0, -1); + if( (db->flags & SQLITE_CountRows)!=0 ){ + sqliteVdbeAddOp(v, OP_AddImm, 1, 0); /* Increment row count */ + } + sqliteVdbeAddOp(v, OP_Goto, 0, addr); + sqliteVdbeResolveLabel(v, end); + sqliteVdbeAddOp(v, OP_Noop, 0, 0); + sqliteEndWriteOperation(pParse); + if( db->flags & SQLITE_CountRows ){ + sqliteVdbeAddOp(v, OP_ColumnName, 0, 0); + sqliteVdbeChangeP3(v, -1, "rows inserted", P3_STATIC); + sqliteVdbeAddOp(v, OP_Callback, 1, 0); + } + } + +copy_cleanup: + sqliteSrcListDelete(pTableName); + sqliteFree(zFile); + return; +} diff --git a/ext/sqlite/libsqlite/src/delete.c b/ext/sqlite/libsqlite/src/delete.c index a235b6c589..20c07be47e 100644 --- a/ext/sqlite/libsqlite/src/delete.c +++ b/ext/sqlite/libsqlite/src/delete.c @@ -16,53 +16,38 @@ */ #include "sqliteInt.h" - /* -** Given a table name, find the corresponding table and make sure the -** table is writeable. Generate an error and return NULL if not. If -** everything checks out, return a pointer to the Table structure. +** Look up every table that is named in pSrc. If any table is not found, +** add an error message to pParse->zErrMsg and return NULL. If all tables +** are found, return a pointer to the last table. */ -Table *sqliteTableNameToTable(Parse *pParse, const char *zTab){ - Table *pTab; - pTab = sqliteFindTable(pParse->db, zTab); - if( pTab==0 ){ - sqliteSetString(&pParse->zErrMsg, "no such table: ", zTab, 0); - pParse->nErr++; - return 0; - } - if( pTab->readOnly || pTab->pSelect ){ - sqliteSetString(&pParse->zErrMsg, - pTab->pSelect ? "view " : "table ", - zTab, - " may not be modified", 0); - pParse->nErr++; - return 0; +Table *sqliteSrcListLookup(Parse *pParse, SrcList *pSrc){ + Table *pTab = 0; + int i; + for(i=0; i<pSrc->nSrc; i++){ + const char *zTab = pSrc->a[i].zName; + const char *zDb = pSrc->a[i].zDatabase; + pTab = sqliteLocateTable(pParse, zTab, zDb); + pSrc->a[i].pTab = pTab; } return pTab; } /* -** Given a table name, check to make sure the table exists, is writable -** and is not a view. If everything is OK, construct an SrcList holding -** the table and return a pointer to the SrcList. The calling function -** is responsible for freeing the SrcList when it has finished with it. -** If there is an error, leave a message on pParse->zErrMsg and return -** NULL. +** Check to make sure the given table is writable. If it is not +** writable, generate an error message and return 1. If it is +** writable return 0; */ -SrcList *sqliteTableTokenToSrcList(Parse *pParse, Token *pTableName){ - Table *pTab; - SrcList *pTabList; - - pTabList = sqliteSrcListAppend(0, pTableName); - if( pTabList==0 ) return 0; - assert( pTabList->nSrc==1 ); - pTab = sqliteTableNameToTable(pParse, pTabList->a[0].zName); - if( pTab==0 ){ - sqliteSrcListDelete(pTabList); - return 0; +int sqliteIsReadOnly(Parse *pParse, Table *pTab, int viewOk){ + if( pTab->readOnly ){ + sqliteErrorMsg(pParse, "table %s may not be modified", pTab->zName); + return 1; + } + if( !viewOk && pTab->pSelect ){ + sqliteErrorMsg(pParse, "cannot modify %s because it is a view",pTab->zName); + return 1; } - pTabList->a[0].pTab = pTab; - return pTabList; + return 0; } /* @@ -70,62 +55,59 @@ SrcList *sqliteTableTokenToSrcList(Parse *pParse, Token *pTableName){ */ void sqliteDeleteFrom( Parse *pParse, /* The parser context */ - Token *pTableName, /* The table from which we should delete things */ + SrcList *pTabList, /* The table from which we should delete things */ Expr *pWhere /* The WHERE clause. May be null */ ){ Vdbe *v; /* The virtual database engine */ Table *pTab; /* The table from which records will be deleted */ - char *zTab; /* Name of the table from which we are deleting */ - SrcList *pTabList; /* A fake FROM clause holding just pTab */ + const char *zDb; /* Name of database holding pTab */ int end, addr; /* A couple addresses of generated code */ int i; /* Loop counter */ WhereInfo *pWInfo; /* Information about the WHERE clause */ Index *pIdx; /* For looping over indices of the table */ - int base; /* Index of the first available table cursor */ + int iCur; /* VDBE Cursor number for pTab */ sqlite *db; /* Main database structure */ - int openOp; /* Opcode used to open a cursor to the table */ + int isView; /* True if attempting to delete from a view */ + AuthContext sContext; /* Authorization context */ - int row_triggers_exist = 0; - int oldIdx = -1; + int row_triggers_exist = 0; /* True if any triggers exist */ + int before_triggers; /* True if there are BEFORE triggers */ + int after_triggers; /* True if there are AFTER triggers */ + int oldIdx = -1; /* Cursor for the OLD table of AFTER triggers */ + sContext.pParse = 0; if( pParse->nErr || sqlite_malloc_failed ){ pTabList = 0; goto delete_from_cleanup; } db = pParse->db; - - /* Check for the special case of a VIEW with one or more ON DELETE triggers - ** defined - */ - zTab = sqliteTableNameFromToken(pTableName); - if( zTab != 0 ){ - pTab = sqliteFindTable(pParse->db, zTab); - if( pTab ){ - row_triggers_exist = - sqliteTriggersExist(pParse, pTab->pTrigger, - TK_DELETE, TK_BEFORE, TK_ROW, 0) || - sqliteTriggersExist(pParse, pTab->pTrigger, - TK_DELETE, TK_AFTER, TK_ROW, 0); - } - sqliteFree(zTab); - if( row_triggers_exist && pTab->pSelect ){ - /* Just fire VIEW triggers */ - sqliteViewTriggers(pParse, pTab, pWhere, OE_Replace, 0); - return; - } - } + assert( pTabList->nSrc==1 ); /* Locate the table which we want to delete. This table has to be ** put in an SrcList structure because some of the subroutines we ** will be calling are designed to work with multiple tables and expect ** an SrcList* parameter instead of just a Table* parameter. */ - pTabList = sqliteTableTokenToSrcList(pParse, pTableName); - if( pTabList==0 ) goto delete_from_cleanup; - assert( pTabList->nSrc==1 ); - pTab = pTabList->a[0].pTab; - assert( pTab->pSelect==0 ); /* This table is not a view */ - if( sqliteAuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0) ){ + pTab = sqliteSrcListLookup(pParse, pTabList); + if( pTab==0 ) goto delete_from_cleanup; + before_triggers = sqliteTriggersExist(pParse, pTab->pTrigger, + TK_DELETE, TK_BEFORE, TK_ROW, 0); + after_triggers = sqliteTriggersExist(pParse, pTab->pTrigger, + TK_DELETE, TK_AFTER, TK_ROW, 0); + row_triggers_exist = before_triggers || after_triggers; + isView = pTab->pSelect!=0; + if( sqliteIsReadOnly(pParse, pTab, before_triggers) ){ + goto delete_from_cleanup; + } + assert( pTab->iDb<db->nDb ); + zDb = db->aDb[pTab->iDb].zName; + if( sqliteAuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb) ){ + goto delete_from_cleanup; + } + + /* If pTab is really a view, make sure it has been initialized. + */ + if( isView && sqliteViewGetColumnNames(pParse, pTab) ){ goto delete_from_cleanup; } @@ -137,9 +119,10 @@ void sqliteDeleteFrom( /* Resolve the column names in all the expressions. */ - base = pParse->nTab++; + assert( pTabList->nSrc==1 ); + iCur = pTabList->a[0].iCursor = pParse->nTab++; if( pWhere ){ - if( sqliteExprResolveIds(pParse, base, pTabList, 0, pWhere) ){ + if( sqliteExprResolveIds(pParse, pTabList, 0, pWhere) ){ goto delete_from_cleanup; } if( sqliteExprCheck(pParse, pWhere, 0, 0) ){ @@ -147,14 +130,28 @@ void sqliteDeleteFrom( } } + /* Start the view context + */ + if( isView ){ + sqliteAuthContextPush(pParse, &sContext, pTab->zName); + } + /* Begin generating code. */ v = sqliteGetVdbe(pParse); if( v==0 ){ goto delete_from_cleanup; } - sqliteBeginWriteOperation(pParse, row_triggers_exist, - !row_triggers_exist && pTab->isTemp); + sqliteBeginWriteOperation(pParse, row_triggers_exist, pTab->iDb); + + /* If we are trying to delete from a view, construct that view into + ** a temporary table. + */ + if( isView ){ + Select *pView = sqliteSelectDup(pTab->pSelect); + sqliteSelect(pParse, pView, SRT_TempTable, iCur, 0, 0, 0); + sqliteSelectDelete(pView); + } /* Initialize the counter of the number of rows deleted, if ** we are counting rows. @@ -173,17 +170,21 @@ void sqliteDeleteFrom( ** entries in the table. */ int endOfLoop = sqliteVdbeMakeLabel(v); int addr; - openOp = pTab->isTemp ? OP_OpenAux : OP_Open; - sqliteVdbeAddOp(v, openOp, base, pTab->tnum); - sqliteVdbeAddOp(v, OP_Rewind, base, sqliteVdbeCurrentAddr(v)+2); + if( !isView ){ + sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenRead, iCur, pTab->tnum); + } + sqliteVdbeAddOp(v, OP_Rewind, iCur, sqliteVdbeCurrentAddr(v)+2); addr = sqliteVdbeAddOp(v, OP_AddImm, 1, 0); - sqliteVdbeAddOp(v, OP_Next, base, addr); + sqliteVdbeAddOp(v, OP_Next, iCur, addr); sqliteVdbeResolveLabel(v, endOfLoop); - sqliteVdbeAddOp(v, OP_Close, base, 0); + sqliteVdbeAddOp(v, OP_Close, iCur, 0); } - sqliteVdbeAddOp(v, OP_Clear, pTab->tnum, pTab->isTemp); - for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ - sqliteVdbeAddOp(v, OP_Clear, pIdx->tnum, pTab->isTemp); + if( !isView ){ + sqliteVdbeAddOp(v, OP_Clear, pTab->tnum, pTab->iDb); + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + sqliteVdbeAddOp(v, OP_Clear, pIdx->tnum, pIdx->iDb); + } } } @@ -193,7 +194,7 @@ void sqliteDeleteFrom( else{ /* Begin the database scan */ - pWInfo = sqliteWhereBegin(pParse, base, pTabList, pWhere, 1, 0); + pWInfo = sqliteWhereBegin(pParse, pTabList, pWhere, 1, 0); if( pWInfo==0 ) goto delete_from_cleanup; /* Remember the key of every item to be deleted. @@ -207,6 +208,12 @@ void sqliteDeleteFrom( */ sqliteWhereEnd(pWInfo); + /* Open the pseudo-table used to store OLD if there are triggers. + */ + if( row_triggers_exist ){ + sqliteVdbeAddOp(v, OP_OpenPseudo, oldIdx, 0); + } + /* Delete every item whose key was written to the list during the ** database scan. We have to delete items after the scan is complete ** because deleting an item can change the scan order. @@ -220,60 +227,59 @@ void sqliteDeleteFrom( if( row_triggers_exist ){ addr = sqliteVdbeAddOp(v, OP_ListRead, 0, end); sqliteVdbeAddOp(v, OP_Dup, 0, 0); - - openOp = pTab->isTemp ? OP_OpenAux : OP_Open; - sqliteVdbeAddOp(v, openOp, base, pTab->tnum); - sqliteVdbeAddOp(v, OP_MoveTo, base, 0); - sqliteVdbeAddOp(v, OP_OpenTemp, oldIdx, 0); - - sqliteVdbeAddOp(v, OP_Integer, 13, 0); - for(i = 0; i<pTab->nCol; i++){ - if( i==pTab->iPKey ){ - sqliteVdbeAddOp(v, OP_Recno, base, 0); - } else { - sqliteVdbeAddOp(v, OP_Column, base, i); - } + if( !isView ){ + sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenRead, iCur, pTab->tnum); } - sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0); + sqliteVdbeAddOp(v, OP_MoveTo, iCur, 0); + + sqliteVdbeAddOp(v, OP_Recno, iCur, 0); + sqliteVdbeAddOp(v, OP_RowData, iCur, 0); sqliteVdbeAddOp(v, OP_PutIntKey, oldIdx, 0); - sqliteVdbeAddOp(v, OP_Close, base, 0); - sqliteVdbeAddOp(v, OP_Rewind, oldIdx, 0); + if( !isView ){ + sqliteVdbeAddOp(v, OP_Close, iCur, 0); + } sqliteCodeRowTrigger(pParse, TK_DELETE, 0, TK_BEFORE, pTab, -1, oldIdx, (pParse->trigStack)?pParse->trigStack->orconf:OE_Default, addr); } - /* Open cursors for the table we are deleting from and all its - ** indices. If there are row triggers, this happens inside the - ** OP_ListRead loop because the cursor have to all be closed - ** before the trigger fires. If there are no row triggers, the - ** cursors are opened only once on the outside the loop. - */ - pParse->nTab = base + 1; - openOp = pTab->isTemp ? OP_OpenWrAux : OP_OpenWrite; - sqliteVdbeAddOp(v, openOp, base, pTab->tnum); - for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ - sqliteVdbeAddOp(v, openOp, pParse->nTab++, pIdx->tnum); - } + if( !isView ){ + /* Open cursors for the table we are deleting from and all its + ** indices. If there are row triggers, this happens inside the + ** OP_ListRead loop because the cursor have to all be closed + ** before the trigger fires. If there are no row triggers, the + ** cursors are opened only once on the outside the loop. + */ + pParse->nTab = iCur + 1; + sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenWrite, iCur, pTab->tnum); + for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ + sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenWrite, pParse->nTab++, pIdx->tnum); + } - /* This is the beginning of the delete loop when there are no - ** row triggers */ - if( !row_triggers_exist ){ - addr = sqliteVdbeAddOp(v, OP_ListRead, 0, end); - } + /* This is the beginning of the delete loop when there are no + ** row triggers */ + if( !row_triggers_exist ){ + addr = sqliteVdbeAddOp(v, OP_ListRead, 0, end); + } - /* Delete the row */ - sqliteGenerateRowDelete(db, v, pTab, base, pParse->trigStack==0); + /* Delete the row */ + sqliteGenerateRowDelete(db, v, pTab, iCur, pParse->trigStack==0); + } /* If there are row triggers, close all cursors then invoke ** the AFTER triggers */ if( row_triggers_exist ){ - for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ - sqliteVdbeAddOp(v, OP_Close, base + i, pIdx->tnum); + if( !isView ){ + for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ + sqliteVdbeAddOp(v, OP_Close, iCur + i, pIdx->tnum); + } + sqliteVdbeAddOp(v, OP_Close, iCur, 0); } - sqliteVdbeAddOp(v, OP_Close, base, 0); sqliteCodeRowTrigger(pParse, TK_DELETE, 0, TK_AFTER, pTab, -1, oldIdx, (pParse->trigStack)?pParse->trigStack->orconf:OE_Default, addr); @@ -287,10 +293,10 @@ void sqliteDeleteFrom( /* Close the cursors after the loop if there are no row triggers */ if( !row_triggers_exist ){ for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ - sqliteVdbeAddOp(v, OP_Close, base + i, pIdx->tnum); + sqliteVdbeAddOp(v, OP_Close, iCur + i, pIdx->tnum); } - sqliteVdbeAddOp(v, OP_Close, base, 0); - pParse->nTab = base; + sqliteVdbeAddOp(v, OP_Close, iCur, 0); + pParse->nTab = iCur; } } sqliteEndWriteOperation(pParse); @@ -305,6 +311,7 @@ void sqliteDeleteFrom( } delete_from_cleanup: + sqliteAuthContextPop(&sContext); sqliteSrcListDelete(pTabList); sqliteExprDelete(pWhere); return; @@ -334,13 +341,13 @@ void sqliteGenerateRowDelete( sqlite *db, /* The database containing the index */ Vdbe *v, /* Generate code into this VDBE */ Table *pTab, /* Table containing the row to be deleted */ - int base, /* Cursor number for the table */ + int iCur, /* Cursor number for the table */ int count /* Increment the row change counter */ ){ int addr; - addr = sqliteVdbeAddOp(v, OP_NotExists, base, 0); - sqliteGenerateRowIndexDelete(db, v, pTab, base, 0); - sqliteVdbeAddOp(v, OP_Delete, base, count); + addr = sqliteVdbeAddOp(v, OP_NotExists, iCur, 0); + sqliteGenerateRowIndexDelete(db, v, pTab, iCur, 0); + sqliteVdbeAddOp(v, OP_Delete, iCur, count); sqliteVdbeChangeP2(v, addr, sqliteVdbeCurrentAddr(v)); } @@ -352,19 +359,19 @@ void sqliteGenerateRowDelete( ** These are the requirements: ** ** 1. A read/write cursor pointing to pTab, the table containing the row -** to be deleted, must be opened as cursor number "base". +** to be deleted, must be opened as cursor number "iCur". ** ** 2. Read/write cursors for all indices of pTab must be open as -** cursor number base+i for the i-th index. +** cursor number iCur+i for the i-th index. ** -** 3. The "base" cursor must be pointing to the row that is to be +** 3. The "iCur" cursor must be pointing to the row that is to be ** deleted. */ void sqliteGenerateRowIndexDelete( sqlite *db, /* The database containing the index */ Vdbe *v, /* Generate code into this VDBE */ Table *pTab, /* Table containing the row to be deleted */ - int base, /* Cursor number for the table */ + int iCur, /* Cursor number for the table */ char *aIdxUsed /* Only delete if aIdxUsed!=0 && aIdxUsed[i]!=0 */ ){ int i; @@ -373,17 +380,17 @@ void sqliteGenerateRowIndexDelete( for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ int j; if( aIdxUsed!=0 && aIdxUsed[i-1]==0 ) continue; - sqliteVdbeAddOp(v, OP_Recno, base, 0); + sqliteVdbeAddOp(v, OP_Recno, iCur, 0); for(j=0; j<pIdx->nColumn; j++){ int idx = pIdx->aiColumn[j]; if( idx==pTab->iPKey ){ sqliteVdbeAddOp(v, OP_Dup, j, 0); }else{ - sqliteVdbeAddOp(v, OP_Column, base, idx); + sqliteVdbeAddOp(v, OP_Column, iCur, idx); } } sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0); if( db->file_format>=4 ) sqliteAddIdxKeyType(v, pIdx); - sqliteVdbeAddOp(v, OP_IdxDelete, base+i, 0); + sqliteVdbeAddOp(v, OP_IdxDelete, iCur+i, 0); } } diff --git a/ext/sqlite/libsqlite/src/encode.c b/ext/sqlite/libsqlite/src/encode.c index 6ad100ce5b..71dfe71741 100644 --- a/ext/sqlite/libsqlite/src/encode.c +++ b/ext/sqlite/libsqlite/src/encode.c @@ -20,6 +20,86 @@ #include <string.h> /* +** How This Encoder Works +** +** The output is allowed to contain any character except 0x27 (') and +** 0x00. This is accomplished by using an escape character to encode +** 0x27 and 0x00 as a two-byte sequence. The escape character is always +** 0x01. An 0x00 is encoded as the two byte sequence 0x01 0x01. The +** 0x27 character is encoded as the two byte sequence 0x01 0x03. Finally, +** the escape character itself is encoded as the two-character sequence +** 0x01 0x02. +** +** To summarize, the encoder works by using an escape sequences as follows: +** +** 0x00 -> 0x01 0x01 +** 0x01 -> 0x01 0x02 +** 0x27 -> 0x01 0x03 +** +** If that were all the encoder did, it would work, but in certain cases +** it could double the size of the encoded string. For example, to +** encode a string of 100 0x27 character would require 100 instances of +** the 0x01 0x03 escape sequence resulting in a 200-character output. +** We would prefer to keep the size of the encoded string smaller than +** this. +** +** To minimize the encoding size, we first add a fixed offset value to each +** byte in the sequence. The addition is module 256. (That is to say, if +** the sum of the original character value and the offset exceeds 256, then +** the higher order bits are truncated.) The offset is chosen to minimize +** the number of characters in the string that need to be escaped. For +** example, in the case above where the string was composed of 100 0x27 +** characters, the offset might be 0x01. Each of the 0x27 characters would +** then be converted into an 0x28 character which would not need to be +** escaped at all and so the 100 character input string would be converted +** into just 100 characters of output. Actually 101 characters of output - +** we have to record the offset used as the first byte in the sequence so +** that the string can be decoded. Since the offset value is stored as +** part of the output string and the output string is not allowed to contain +** characters 0x00 or 0x27, the offset cannot be 0x00 or 0x27. +** +** Here, then, are the encoding steps: +** +** (1) Choose an offset value and make it the first character of +** output. +** +** (2) Copy each input character into the output buffer, one by +** one, adding the offset value as you copy. +** +** (3) If the value of an input character plus offset is 0x00, replace +** that one character by the two-character sequence 0x01 0x01. +** If the sum is 0x01, replace it with 0x01 0x02. If the sum +** is 0x27, replace it with 0x01 0x03. +** +** (4) Put a 0x00 terminator at the end of the output. +** +** Decoding is obvious: +** +** (5) Copy encoded characters except the first into the decode +** buffer. Set the first encoded character aside for use as +** the offset in step 7 below. +** +** (6) Convert each 0x01 0x01 sequence into a single character 0x00. +** Convert 0x01 0x02 into 0x01. Convert 0x01 0x03 into 0x27. +** +** (7) Subtract the offset value that was the first character of +** the encoded buffer from all characters in the output buffer. +** +** The only tricky part is step (1) - how to compute an offset value to +** minimize the size of the output buffer. This is accomplished to testing +** all offset values and picking the one that results in the fewest number +** of escapes. To do that, we first scan the entire input and count the +** number of occurances of each character value in the input. Suppose +** the number of 0x00 characters is N(0), the number of occurances of 0x01 +** is N(1), and so forth up to the number of occurances of 0xff is N(256). +** An offset of 0 is not allowed so we don't have to test it. The number +** of escapes required for an offset of 1 is N(1)+N(2)+N(40). The number +** of escapes required for an offset of 2 is N(2)+N(3)+N(41). And so forth. +** In this way we find the offset that gives the minimum number of escapes, +** and thus minimizes the length of the output string. +*/ + +/* ** Encode a binary buffer "in" of size n bytes so that it contains ** no instances of characters '\'' or '\000'. The output is ** null-terminated and can be used as a string value in an INSERT diff --git a/ext/sqlite/libsqlite/src/expr.c b/ext/sqlite/libsqlite/src/expr.c index 478bfebb0a..2a380dd538 100644 --- a/ext/sqlite/libsqlite/src/expr.c +++ b/ext/sqlite/libsqlite/src/expr.c @@ -184,16 +184,17 @@ ExprList *sqliteExprListDup(ExprList *p){ SrcList *sqliteSrcListDup(SrcList *p){ SrcList *pNew; int i; + int nByte; if( p==0 ) return 0; - pNew = sqliteMalloc( sizeof(*pNew) ); + nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0); + pNew = sqliteMalloc( nByte ); if( pNew==0 ) return 0; pNew->nSrc = p->nSrc; - pNew->a = sqliteMalloc( p->nSrc*sizeof(p->a[0]) ); - if( pNew->a==0 && p->nSrc != 0 ) return 0; for(i=0; i<p->nSrc; i++){ pNew->a[i].zName = sqliteStrDup(p->a[i].zName); pNew->a[i].zAlias = sqliteStrDup(p->a[i].zAlias); pNew->a[i].jointype = p->a[i].jointype; + pNew->a[i].iCursor = p->a[i].iCursor; pNew->a[i].pTab = 0; pNew->a[i].pSelect = sqliteSelectDup(p->a[i].pSelect); pNew->a[i].pOn = sqliteExprDup(p->a[i].pOn); @@ -299,7 +300,9 @@ int sqliteExprIsConstant(Expr *p){ case TK_ID: case TK_COLUMN: case TK_DOT: + case TK_FUNCTION: return 0; + case TK_NULL: case TK_STRING: case TK_INTEGER: case TK_FLOAT: @@ -400,13 +403,16 @@ int sqliteIsRowid(const char *z){ */ int sqliteExprResolveIds( Parse *pParse, /* The parser context */ - int base, /* VDBE cursor number for first entry in pTabList */ SrcList *pTabList, /* List of tables used to resolve column names */ ExprList *pEList, /* List of expressions used to resolve "AS" */ Expr *pExpr /* The expression to be analyzed. */ ){ + int i; + if( pExpr==0 || pTabList==0 ) return 0; - assert( base+pTabList->nSrc<=pParse->nTab ); + for(i=0; i<pTabList->nSrc; i++){ + assert( pTabList->a[i].iCursor>=0 && pTabList->a[i].iCursor<pParse->nTab ); + } switch( pExpr->op ){ /* Double-quoted strings (ex: "abc") are used as identifiers if ** possible. Otherwise they remain as strings. Single-quoted @@ -428,8 +434,9 @@ int sqliteExprResolveIds( */ case TK_ID: { int cnt = 0; /* Number of matches */ - int i; /* Loop counter */ char *z; + int iDb = -1; + assert( pExpr->token.z ); z = sqliteStrNDup(pExpr->token.z, pExpr->token.n); sqliteDequote(z); @@ -438,11 +445,13 @@ int sqliteExprResolveIds( int j; Table *pTab = pTabList->a[i].pTab; if( pTab==0 ) continue; + iDb = pTab->iDb; assert( pTab->nCol>0 ); for(j=0; j<pTab->nCol; j++){ if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){ cnt++; - pExpr->iTable = i + base; + pExpr->iTable = pTabList->a[i].iCursor; + pExpr->iDb = pTab->iDb; if( j==pTab->iPKey ){ /* Substitute the record number for the INTEGER PRIMARY KEY */ pExpr->iColumn = -1; @@ -468,41 +477,51 @@ int sqliteExprResolveIds( } } } - if( cnt==0 && sqliteIsRowid(z) ){ + if( cnt==0 && iDb>=0 && sqliteIsRowid(z) ){ pExpr->iColumn = -1; - pExpr->iTable = base; + pExpr->iTable = pTabList->a[0].iCursor; + pExpr->iDb = iDb; cnt = 1 + (pTabList->nSrc>1); pExpr->op = TK_COLUMN; pExpr->dataType = SQLITE_SO_NUM; } sqliteFree(z); if( cnt==0 && pExpr->token.z[0]!='"' ){ - sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, - pExpr->token.z, pExpr->token.n, 0); - pParse->nErr++; + sqliteErrorMsg(pParse, "no such column: %T", &pExpr->token); return 1; }else if( cnt>1 ){ - sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, - pExpr->token.z, pExpr->token.n, 0); - pParse->nErr++; + sqliteErrorMsg(pParse, "ambiguous column name: %T", &pExpr->token); return 1; } if( pExpr->op==TK_COLUMN ){ - sqliteAuthRead(pParse, pExpr, pTabList, base); + sqliteAuthRead(pParse, pExpr, pTabList); } break; } - /* A table name and column name: ID.ID */ + /* A table name and column name: ID.ID + ** Or a database, table and column: ID.ID.ID + */ case TK_DOT: { int cnt = 0; /* Number of matches */ int cntTab = 0; /* Number of matching tables */ int i; /* Loop counter */ Expr *pLeft, *pRight; /* Left and right subbranches of the expr */ char *zLeft, *zRight; /* Text of an identifier */ + char *zDb; /* Name of database holding table */ + sqlite *db = pParse->db; - pLeft = pExpr->pLeft; pRight = pExpr->pRight; + if( pRight->op==TK_ID ){ + pLeft = pExpr->pLeft; + zDb = 0; + }else{ + Expr *pDb = pExpr->pLeft; + assert( pDb && pDb->op==TK_ID && pDb->token.z ); + zDb = sqliteStrNDup(pDb->token.z, pDb->token.n); + pLeft = pRight->pLeft; + pRight = pRight->pRight; + } assert( pLeft && pLeft->op==TK_ID && pLeft->token.z ); assert( pRight && pRight->op==TK_ID && pRight->token.z ); zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n); @@ -510,8 +529,10 @@ int sqliteExprResolveIds( if( zLeft==0 || zRight==0 ){ sqliteFree(zLeft); sqliteFree(zRight); + sqliteFree(zDb); return 1; } + sqliteDequote(zDb); sqliteDequote(zLeft); sqliteDequote(zRight); pExpr->iTable = -1; @@ -523,21 +544,25 @@ int sqliteExprResolveIds( assert( pTab->nCol>0 ); if( pTabList->a[i].zAlias ){ zTab = pTabList->a[i].zAlias; + if( sqliteStrICmp(zTab, zLeft)!=0 ) continue; }else{ zTab = pTab->zName; + if( zTab==0 || sqliteStrICmp(zTab, zLeft)!=0 ) continue; + if( zDb!=0 && sqliteStrICmp(db->aDb[pTab->iDb].zName, zDb)!=0 ){ + continue; + } + } + if( 0==(cntTab++) ){ + pExpr->iTable = pTabList->a[i].iCursor; + pExpr->iDb = pTab->iDb; } - if( zTab==0 || sqliteStrICmp(zTab, zLeft)!=0 ) continue; - if( 0==(cntTab++) ) pExpr->iTable = i + base; for(j=0; j<pTab->nCol; j++){ if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ cnt++; - pExpr->iTable = i + base; - if( j==pTab->iPKey ){ - /* Substitute the record number for the INTEGER PRIMARY KEY */ - pExpr->iColumn = -1; - }else{ - pExpr->iColumn = j; - } + pExpr->iTable = pTabList->a[i].iCursor; + pExpr->iDb = pTab->iDb; + /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */ + pExpr->iColumn = j==pTab->iPKey ? -1 : j; pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK; } } @@ -550,11 +575,15 @@ int sqliteExprResolveIds( int t = 0; if( pTriggerStack->newIdx != -1 && sqliteStrICmp("new", zLeft) == 0 ){ pExpr->iTable = pTriggerStack->newIdx; + assert( pTriggerStack->pTab ); + pExpr->iDb = pTriggerStack->pTab->iDb; cntTab++; t = 1; } if( pTriggerStack->oldIdx != -1 && sqliteStrICmp("old", zLeft) == 0 ){ pExpr->iTable = pTriggerStack->oldIdx; + assert( pTriggerStack->pTab ); + pExpr->iDb = pTriggerStack->pTab->iDb; cntTab++; t = 1; } @@ -565,7 +594,7 @@ int sqliteExprResolveIds( for(j=0; j < pTab->nCol; j++) { if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ cnt++; - pExpr->iColumn = j; + pExpr->iColumn = j==pTab->iPKey ? -1 : j; pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK; } } @@ -577,34 +606,31 @@ int sqliteExprResolveIds( pExpr->iColumn = -1; pExpr->dataType = SQLITE_SO_NUM; } + sqliteFree(zDb); sqliteFree(zLeft); sqliteFree(zRight); if( cnt==0 ){ - sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, - pLeft->token.z, pLeft->token.n, ".", 1, - pRight->token.z, pRight->token.n, 0); - pParse->nErr++; + sqliteErrorMsg(pParse, "no such column: %T.%T", + &pLeft->token, &pRight->token); return 1; }else if( cnt>1 ){ - sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, - pLeft->token.z, pLeft->token.n, ".", 1, - pRight->token.z, pRight->token.n, 0); - pParse->nErr++; + sqliteErrorMsg(pParse, "ambiguous column name: %T.%T", + &pLeft->token, &pRight->token); return 1; } - sqliteExprDelete(pLeft); + sqliteExprDelete(pExpr->pLeft); pExpr->pLeft = 0; - sqliteExprDelete(pRight); + sqliteExprDelete(pExpr->pRight); pExpr->pRight = 0; pExpr->op = TK_COLUMN; - sqliteAuthRead(pParse, pExpr, pTabList, base); + sqliteAuthRead(pParse, pExpr, pTabList); break; } case TK_IN: { Vdbe *v = sqliteGetVdbe(pParse); if( v==0 ) return 1; - if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){ + if( sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){ return 1; } if( pExpr->pSelect ){ @@ -627,9 +653,8 @@ int sqliteExprResolveIds( for(i=0; i<pExpr->pList->nExpr; i++){ Expr *pE2 = pExpr->pList->a[i].pExpr; if( !sqliteExprIsConstant(pE2) ){ - sqliteSetString(&pParse->zErrMsg, - "right-hand side of IN operator must be constant", 0); - pParse->nErr++; + sqliteErrorMsg(pParse, + "right-hand side of IN operator must be constant"); return 1; } if( sqliteExprCheck(pParse, pE2, 0, 0) ){ @@ -675,11 +700,11 @@ int sqliteExprResolveIds( /* For all else, just recursively walk the tree */ default: { if( pExpr->pLeft - && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){ + && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){ return 1; } if( pExpr->pRight - && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pRight) ){ + && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pRight) ){ return 1; } if( pExpr->pList ){ @@ -687,7 +712,7 @@ int sqliteExprResolveIds( ExprList *pList = pExpr->pList; for(i=0; i<pList->nExpr; i++){ Expr *pArg = pList->a[i].pExpr; - if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pArg) ){ + if( sqliteExprResolveIds(pParse, pTabList, pEList, pArg) ){ return 1; } } @@ -1199,8 +1224,8 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){ } case TK_RAISE: { if( !pParse->trigStack ){ - sqliteSetNString(&pParse->zErrMsg, - "RAISE() may only be used within a trigger-program", -1, 0); + sqliteErrorMsg(pParse, + "RAISE() may only be used within a trigger-program"); pParse->nErr++; return; } diff --git a/ext/sqlite/libsqlite/src/func.c b/ext/sqlite/libsqlite/src/func.c index a865de0873..a1662abae2 100644 --- a/ext/sqlite/libsqlite/src/func.c +++ b/ext/sqlite/libsqlite/src/func.c @@ -255,6 +255,46 @@ static void versionFunc(sqlite_func *context, int argc, const char **argv){ sqlite_set_result_string(context, sqlite_version, -1); } +#ifdef SQLITE_SOUNDEX +/* +** Compute the soundex encoding of a word. +*/ +static void soundexFunc(sqlite_func *context, int argc, const char **argv){ + char zResult[8]; + const char *zIn; + int i, j; + static const unsigned char iCode[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, + 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, + 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, + }; + assert( argc==1 ); + zIn = argv[0]; + for(i=0; zIn[i] && !isalpha(zIn[i]); i++){} + if( zIn[i] ){ + zResult[0] = toupper(zIn[i]); + for(j=1; j<4 && zIn[i]; i++){ + int code = iCode[zIn[i]&0x7f]; + if( code>0 ){ + zResult[j++] = code + '0'; + } + } + while( j<4 ){ + zResult[j++] = '0'; + } + zResult[j] = 0; + sqlite_set_result_string(context, zResult, 4); + }else{ + sqlite_set_result_string(context, zResult, "?000", 4); + } +} +#endif + #ifdef SQLITE_TEST /* ** This function generates a string of random characters. Used for @@ -284,8 +324,7 @@ static void randStr(sqlite_func *context, int argc, const char **argv){ } n = iMin; if( iMax>iMin ){ - r = sqliteRandomInteger(); - if( r<0 ) r = -r; + r = sqliteRandomInteger() & 0x7fffffff; n += r%(iMax + 1 - iMin); } r = 0; @@ -490,6 +529,9 @@ void sqliteRegisterBuiltinFunctions(sqlite *db){ { "glob", 2, SQLITE_NUMERIC, globFunc }, { "nullif", 2, SQLITE_ARGS, nullifFunc }, { "sqlite_version",0,SQLITE_TEXT, versionFunc}, +#ifdef SQLITE_SOUNDEX + { "soundex", 1, SQLITE_TEXT, soundexFunc}, +#endif #ifdef SQLITE_TEST { "randstr", 2, SQLITE_TEXT, randStr }, #endif diff --git a/ext/sqlite/libsqlite/src/hash.c b/ext/sqlite/libsqlite/src/hash.c index 60de7aa1e2..aa3bb81c44 100644 --- a/ext/sqlite/libsqlite/src/hash.c +++ b/ext/sqlite/libsqlite/src/hash.c @@ -108,8 +108,7 @@ static int binHash(const void *pKey, int nKey){ while( nKey-- > 0 ){ h = (h<<3) ^ h ^ *(z++); } - if( h<0 ) h = -h; - return h; + return h & 0x7fffffff; } static int binCompare(const void *pKey1, int n1, const void *pKey2, int n2){ if( n1!=n2 ) return n2-n1; diff --git a/ext/sqlite/libsqlite/src/insert.c b/ext/sqlite/libsqlite/src/insert.c index f625ffc942..313764f51e 100644 --- a/ext/sqlite/libsqlite/src/insert.c +++ b/ext/sqlite/libsqlite/src/insert.c @@ -85,22 +85,22 @@ */ void sqliteInsert( Parse *pParse, /* Parser context */ - Token *pTableName, /* Name of table into which we are inserting */ + SrcList *pTabList, /* Name of table into which we are inserting */ ExprList *pList, /* List of values to be inserted */ Select *pSelect, /* A SELECT statement to use as the data source */ IdList *pColumn, /* Column names corresponding to IDLIST. */ int onError /* How to handle constraint errors */ ){ Table *pTab; /* The table to insert into */ - char *zTab = 0; /* Name of the table into which we are inserting */ + char *zTab; /* Name of the table into which we are inserting */ + const char *zDb; /* Name of the database holding this table */ int i, j, idx; /* Loop counters */ Vdbe *v; /* Generate code into this virtual machine */ Index *pIdx; /* For looping over indices of the table */ int nColumn; /* Number of columns in the data */ - int base; /* First available cursor */ + int base; /* VDBE Cursor number for pTab */ int iCont, iBreak; /* Beginning and end of the loop over srcTab */ sqlite *db; /* The main database structure */ - int openOp; /* Opcode used to open cursors */ int keyColumn = -1; /* Column that is the INTEGER PRIMARY KEY */ int endOfLoop; /* Label for the end of the insertion loop */ int useTempTable; /* Store SELECT results in intermediate table */ @@ -109,24 +109,28 @@ void sqliteInsert( int iCleanup; /* Address of the cleanup code */ int iInsertBlock; /* Address of the subroutine used to insert data */ int iCntMem; /* Memory cell used for the row counter */ + int isView; /* True if attempting to insert into a view */ int row_triggers_exist = 0; /* True if there are FOR EACH ROW triggers */ - int newIdx = -1; + int before_triggers; /* True if there are BEFORE triggers */ + int after_triggers; /* True if there are AFTER triggers */ + int newIdx = -1; /* Cursor for the NEW table */ if( pParse->nErr || sqlite_malloc_failed ) goto insert_cleanup; db = pParse->db; /* Locate the table into which we will be inserting new information. */ - zTab = sqliteTableNameFromToken(pTableName); + assert( pTabList->nSrc==1 ); + zTab = pTabList->a[0].zName; if( zTab==0 ) goto insert_cleanup; - pTab = sqliteFindTable(pParse->db, zTab); + pTab = sqliteSrcListLookup(pParse, pTabList); if( pTab==0 ){ - sqliteSetString(&pParse->zErrMsg, "no such table: ", zTab, 0); - pParse->nErr++; goto insert_cleanup; } - if( sqliteAuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0) ){ + assert( pTab->iDb<db->nDb ); + zDb = db->aDb[pTab->iDb].zName; + if( sqliteAuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0, zDb) ){ goto insert_cleanup; } @@ -134,37 +138,28 @@ void sqliteInsert( * (a) the table is not read-only, * (b) that if it is a view then ON INSERT triggers exist */ - row_triggers_exist = - sqliteTriggersExist(pParse, pTab->pTrigger, TK_INSERT, - TK_BEFORE, TK_ROW, 0) || - sqliteTriggersExist(pParse, pTab->pTrigger, TK_INSERT, TK_AFTER, TK_ROW, 0); - if( pTab->readOnly || (pTab->pSelect && !row_triggers_exist) ){ - sqliteSetString(&pParse->zErrMsg, - pTab->pSelect ? "view " : "table ", - zTab, - " may not be modified", 0); - pParse->nErr++; + before_triggers = sqliteTriggersExist(pParse, pTab->pTrigger, TK_INSERT, + TK_BEFORE, TK_ROW, 0); + after_triggers = sqliteTriggersExist(pParse, pTab->pTrigger, TK_INSERT, + TK_AFTER, TK_ROW, 0); + row_triggers_exist = before_triggers || after_triggers; + isView = pTab->pSelect!=0; + if( sqliteIsReadOnly(pParse, pTab, before_triggers) ){ goto insert_cleanup; } - sqliteFree(zTab); - zTab = 0; - if( pTab==0 ) goto insert_cleanup; /* If pTab is really a view, make sure it has been initialized. */ - if( pTab->pSelect ){ - if( sqliteViewGetColumnNames(pParse, pTab) ){ - goto insert_cleanup; - } + if( isView && sqliteViewGetColumnNames(pParse, pTab) ){ + goto insert_cleanup; } /* Allocate a VDBE */ v = sqliteGetVdbe(pParse); if( v==0 ) goto insert_cleanup; - sqliteBeginWriteOperation(pParse, pSelect || row_triggers_exist, - !row_triggers_exist && pTab->isTemp); + sqliteBeginWriteOperation(pParse, pSelect || row_triggers_exist, pTab->iDb); /* if there are row triggers, allocate a temp table for new.* references. */ if( row_triggers_exist ){ @@ -183,7 +178,6 @@ void sqliteInsert( /* Data is coming from a SELECT. Generate code to implement that SELECT */ int rc, iInitCode; - int opCode; iInitCode = sqliteVdbeAddOp(v, OP_Goto, 0, 0); iSelectLoop = sqliteVdbeCurrentAddr(v); iInsertBlock = sqliteVdbeMakeLabel(v); @@ -197,9 +191,23 @@ void sqliteInsert( /* Set useTempTable to TRUE if the result of the SELECT statement ** should be written into a temporary table. Set to FALSE if each ** row of the SELECT can be written directly into the result table. + ** + ** A temp table must be used if the table being updated is also one + ** of the tables being read by the SELECT statement. Also use a + ** temp table in the case of row triggers. */ - opCode = pTab->isTemp ? OP_OpenTemp : OP_Open; - useTempTable = row_triggers_exist || sqliteVdbeFindOp(v,opCode,pTab->tnum); + if( row_triggers_exist ){ + useTempTable = 1; + }else{ + int addr = sqliteVdbeFindOp(v, OP_OpenRead, pTab->tnum); + useTempTable = 0; + if( addr>0 ){ + VdbeOp *pOp = sqliteVdbeGetOp(v, addr-2); + if( pOp->opcode==OP_Integer && pOp->p1==pTab->iDb ){ + useTempTable = 1; + } + } + } if( useTempTable ){ /* Generate the subroutine that SELECT calls to process each row of @@ -236,7 +244,7 @@ void sqliteInsert( nColumn = pList->nExpr; dummy.nSrc = 0; for(i=0; i<nColumn; i++){ - if( sqliteExprResolveIds(pParse, 0, &dummy, 0, pList->a[i].pExpr) ){ + if( sqliteExprResolveIds(pParse, &dummy, 0, pList->a[i].pExpr) ){ goto insert_cleanup; } if( sqliteExprCheck(pParse, pList->a[i].pExpr, 0, 0) ){ @@ -249,24 +257,13 @@ void sqliteInsert( ** of columns to be inserted into the table. */ if( pColumn==0 && nColumn!=pTab->nCol ){ - char zNum1[30]; - char zNum2[30]; - sprintf(zNum1,"%d", nColumn); - sprintf(zNum2,"%d", pTab->nCol); - sqliteSetString(&pParse->zErrMsg, "table ", pTab->zName, - " has ", zNum2, " columns but ", - zNum1, " values were supplied", 0); - pParse->nErr++; + sqliteErrorMsg(pParse, + "table %S has %d columns but %d values were supplied", + pTabList, 0, pTab->nCol, nColumn); goto insert_cleanup; } if( pColumn!=0 && nColumn!=pColumn->nId ){ - char zNum1[30]; - char zNum2[30]; - sprintf(zNum1,"%d", nColumn); - sprintf(zNum2,"%d", pColumn->nId); - sqliteSetString(&pParse->zErrMsg, zNum1, " values for ", - zNum2, " columns", 0); - pParse->nErr++; + sqliteErrorMsg(pParse, "%d values for %d columns", nColumn, pColumn->nId); goto insert_cleanup; } @@ -296,8 +293,8 @@ void sqliteInsert( } } if( j>=pTab->nCol ){ - sqliteSetString(&pParse->zErrMsg, "table ", pTab->zName, - " has no column named ", pColumn->a[i].zName, 0); + sqliteErrorMsg(pParse, "table %S has no column named %s", + pTabList, 0, pColumn->a[i].zName); pParse->nErr++; goto insert_cleanup; } @@ -315,7 +312,7 @@ void sqliteInsert( /* Open the temp table for FOR EACH ROW triggers */ if( row_triggers_exist ){ - sqliteVdbeAddOp(v, OP_OpenTemp, newIdx, 0); + sqliteVdbeAddOp(v, OP_OpenPseudo, newIdx, 0); } /* Initialize the count of rows to be inserted @@ -329,11 +326,12 @@ void sqliteInsert( /* Open tables and indices if there are no row triggers */ if( !row_triggers_exist ){ base = pParse->nTab; - openOp = pTab->isTemp ? OP_OpenWrAux : OP_OpenWrite; - sqliteVdbeAddOp(v, openOp, base, pTab->tnum); + sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenWrite, base, pTab->tnum); sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC); for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){ - sqliteVdbeAddOp(v, openOp, idx+base, pIdx->tnum); + sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenWrite, idx+base, pIdx->tnum); sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC); } pParse->nTab += idx; @@ -353,11 +351,33 @@ void sqliteInsert( sqliteVdbeResolveLabel(v, iInsertBlock); } + /* Run the BEFORE and INSTEAD OF triggers, if there are any + */ endOfLoop = sqliteVdbeMakeLabel(v); - if( row_triggers_exist ){ + if( before_triggers ){ + + /* build the NEW.* reference row. Note that if there is an INTEGER + ** PRIMARY KEY into which a NULL is being inserted, that NULL will be + ** translated into a unique ID for the row. But on a BEFORE trigger, + ** we do not know what the unique ID will be (because the insert has + ** not happened yet) so we substitute a rowid of -1 + */ + if( keyColumn<0 ){ + sqliteVdbeAddOp(v, OP_Integer, -1, 0); + }else if( useTempTable ){ + sqliteVdbeAddOp(v, OP_Column, srcTab, keyColumn); + }else if( pSelect ){ + sqliteVdbeAddOp(v, OP_Dup, nColumn - keyColumn - 1, 1); + }else{ + sqliteExprCode(pParse, pList->a[keyColumn].pExpr); + sqliteVdbeAddOp(v, OP_NotNull, -1, sqliteVdbeCurrentAddr(v)+3); + sqliteVdbeAddOp(v, OP_Pop, 1, 0); + sqliteVdbeAddOp(v, OP_Integer, -1, 0); + sqliteVdbeAddOp(v, OP_MustBeInt, 0, 0); + } - /* build the new.* reference row */ - sqliteVdbeAddOp(v, OP_Integer, 13, 0); + /* Create the new column data + */ for(i=0; i<pTab->nCol; i++){ if( pColumn==0 ){ j = i; @@ -379,26 +399,28 @@ void sqliteInsert( } sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0); sqliteVdbeAddOp(v, OP_PutIntKey, newIdx, 0); - sqliteVdbeAddOp(v, OP_Rewind, newIdx, 0); - /* Fire BEFORE triggers */ - if( sqliteCodeRowTrigger(pParse, TK_INSERT, 0, TK_BEFORE, pTab, newIdx, -1, - onError, endOfLoop) ){ + /* Fire BEFORE or INSTEAD OF triggers */ + if( sqliteCodeRowTrigger(pParse, TK_INSERT, 0, TK_BEFORE, pTab, + newIdx, -1, onError, endOfLoop) ){ goto insert_cleanup; } + } - /* Open the tables and indices for the INSERT */ - if( !pTab->pSelect ){ - base = pParse->nTab; - openOp = pTab->isTemp ? OP_OpenWrAux : OP_OpenWrite; - sqliteVdbeAddOp(v, openOp, base, pTab->tnum); - sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC); - for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){ - sqliteVdbeAddOp(v, openOp, idx+base, pIdx->tnum); - sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC); - } - pParse->nTab += idx; + /* If any triggers exists, the opening of tables and indices is deferred + ** until now. + */ + if( row_triggers_exist && !isView ){ + base = pParse->nTab; + sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenWrite, base, pTab->tnum); + sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC); + for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){ + sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenWrite, idx+base, pIdx->tnum); + sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC); } + pParse->nTab += idx; } /* Push the record number for the new entry onto the stack. The @@ -406,7 +428,7 @@ void sqliteInsert( ** except when the table has an INTEGER PRIMARY KEY column, in which ** case the record number is the same as that column. */ - if( !pTab->pSelect ){ + if( !isView ){ if( keyColumn>=0 ){ if( useTempTable ){ sqliteVdbeAddOp(v, OP_Column, srcTab, keyColumn); @@ -461,18 +483,19 @@ void sqliteInsert( ** do the insertion. */ sqliteGenerateConstraintChecks(pParse, pTab, base, 0,0,0,onError,endOfLoop); - sqliteCompleteInsertion(pParse, pTab, base, 0,0,0); + sqliteCompleteInsertion(pParse, pTab, base, 0,0,0, + after_triggers ? newIdx : -1); + } - /* Update the count of rows that are inserted - */ - if( (db->flags & SQLITE_CountRows)!=0 ){ - sqliteVdbeAddOp(v, OP_MemIncr, iCntMem, 0); - } + /* Update the count of rows that are inserted + */ + if( (db->flags & SQLITE_CountRows)!=0 ){ + sqliteVdbeAddOp(v, OP_MemIncr, iCntMem, 0); } if( row_triggers_exist ){ /* Close all tables opened */ - if( !pTab->pSelect ){ + if( !isView ){ sqliteVdbeAddOp(v, OP_Close, base, 0); for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){ sqliteVdbeAddOp(v, OP_Close, idx+base, 0); @@ -520,9 +543,9 @@ void sqliteInsert( } insert_cleanup: + sqliteSrcListDelete(pTabList); if( pList ) sqliteExprListDelete(pList); if( pSelect ) sqliteSelectDelete(pSelect); - if ( zTab ) sqliteFree(zTab); sqliteIdListDelete(pColumn); } @@ -532,7 +555,7 @@ insert_cleanup: ** When this routine is called, the stack contains (from bottom to top) ** the following values: ** -** 1. The recno of the row to be updated before it is updated. This +** 1. The recno of the row to be updated before the update. This ** value is omitted unless we are doing an UPDATE that involves a ** change to the record number. ** @@ -644,9 +667,10 @@ void sqliteGenerateConstraintChecks( if( onError==OE_None ) continue; if( overrideError!=OE_Default ){ onError = overrideError; - }else if( onError==OE_Default ){ + }else if( pParse->db->onError!=OE_Default ){ onError = pParse->db->onError; - if( onError==OE_Default ) onError = OE_Abort; + }else if( onError==OE_Default ){ + onError = OE_Abort; } if( onError==OE_Replace && pTab->aCol[i].zDflt==0 ){ onError = OE_Abort; @@ -694,9 +718,10 @@ void sqliteGenerateConstraintChecks( onError = pTab->keyConf; if( overrideError!=OE_Default ){ onError = overrideError; - }else if( onError==OE_Default ){ + }else if( pParse->db->onError!=OE_Default ){ onError = pParse->db->onError; - if( onError==OE_Default ) onError = OE_Abort; + }else if( onError==OE_Default ){ + onError = OE_Abort; } if( onError!=OE_Replace ){ if( isUpdate ){ @@ -735,10 +760,12 @@ void sqliteGenerateConstraintChecks( ** index and making sure that duplicate entries do not already exist. ** Add the new records to the indices as we go. */ - extra = 0; - for(extra=(-1), iCur=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, iCur++){ - if( aIdxUsed && aIdxUsed[iCur]==0 ) continue; - extra++; + extra = -1; + for(iCur=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, iCur++){ + if( aIdxUsed && aIdxUsed[iCur]==0 ) continue; /* Skip unused indices */ + extra++; + + /* Create a key for accessing the index entry */ sqliteVdbeAddOp(v, OP_Dup, nCol+extra, 1); for(i=0; i<pIdx->nColumn; i++){ int idx = pIdx->aiColumn[i]; @@ -750,16 +777,23 @@ void sqliteGenerateConstraintChecks( } jumpInst1 = sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0); if( pParse->db->file_format>=4 ) sqliteAddIdxKeyType(v, pIdx); + + /* Find out what action to take in case there is an indexing conflict */ onError = pIdx->onError; - if( onError==OE_None ) continue; + if( onError==OE_None ) continue; /* pIdx is not a UNIQUE index */ if( overrideError!=OE_Default ){ onError = overrideError; - }else if( onError==OE_Default ){ + }else if( pParse->db->onError!=OE_Default ){ onError = pParse->db->onError; - if( onError==OE_Default ) onError = OE_Abort; + }else if( onError==OE_Default ){ + onError = OE_Abort; } + + /* Check to see if the new index entry will be unique */ sqliteVdbeAddOp(v, OP_Dup, extra+nCol+1+hasTwoRecnos, 1); jumpInst2 = sqliteVdbeAddOp(v, OP_IsUnique, base+iCur+1, 0); + + /* Generate code that executes if the new index entry is not unique */ switch( onError ){ case OE_Rollback: case OE_Abort: @@ -809,7 +843,8 @@ void sqliteCompleteInsertion( int base, /* Index of a read/write cursor pointing at pTab */ char *aIdxUsed, /* Which indices are used. NULL means all are used */ int recnoChng, /* True if the record number will change */ - int isUpdate /* True for UPDATE, False for INSERT */ + int isUpdate, /* True for UPDATE, False for INSERT */ + int newIdx /* Index of NEW table for triggers. -1 if none */ ){ int i; Vdbe *v; @@ -825,6 +860,11 @@ void sqliteCompleteInsertion( sqliteVdbeAddOp(v, OP_IdxPut, base+i+1, 0); } sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0); + if( newIdx>=0 ){ + sqliteVdbeAddOp(v, OP_Dup, 1, 0); + sqliteVdbeAddOp(v, OP_Dup, 1, 0); + sqliteVdbeAddOp(v, OP_PutIntKey, newIdx, 0); + } sqliteVdbeAddOp(v, OP_PutIntKey, base, pParse->trigStack?0:1); if( isUpdate && recnoChng ){ sqliteVdbeAddOp(v, OP_Pop, 1, 0); diff --git a/ext/sqlite/libsqlite/src/main.c b/ext/sqlite/libsqlite/src/main.c index b708b00c2a..ebba7cbc57 100644 --- a/ext/sqlite/libsqlite/src/main.c +++ b/ext/sqlite/libsqlite/src/main.c @@ -29,6 +29,13 @@ typedef struct { char **pzErrMsg; /* Error message stored here */ } InitData; +/* +** Fill the InitData structure with an error message that indicates +** that the database is corrupt. +*/ +static void corruptSchema(InitData *pData){ + sqliteSetString(pData->pzErrMsg, "malformed database schema", 0); +} /* ** This is the callback routine for the code that initializes the @@ -40,7 +47,8 @@ typedef struct { ** argv[1] = table or index name or meta statement type. ** argv[2] = root page number for table or index. NULL for meta. ** argv[3] = SQL text for a CREATE TABLE or CREATE INDEX statement. -** argv[4] = "1" for temporary files, "0" for main database +** argv[4] = "1" for temporary files, "0" for main database, "2" or more +** for auxiliary database files. ** */ static @@ -49,15 +57,19 @@ int sqliteInitCallback(void *pInit, int argc, char **argv, char **azColName){ Parse sParse; int nErr = 0; - /* TODO: Do some validity checks on all fields. In particular, - ** make sure fields do not contain NULLs. Otherwise we might core - ** when attempting to initialize from a corrupt database file. */ - assert( argc==5 ); + if( argv[0]==0 ){ + corruptSchema(pData); + return 1; + } switch( argv[0][0] ){ case 'v': case 'i': case 't': { /* CREATE TABLE, CREATE INDEX, or CREATE VIEW statements */ + if( argv[2]==0 || argv[4]==0 ){ + corruptSchema(pData); + return 1; + } if( argv[3] && argv[3][0] ){ /* Call the parser to process a CREATE TABLE, INDEX or VIEW. ** But because sParse.initFlag is set to 1, no VDBE code is generated @@ -67,7 +79,8 @@ int sqliteInitCallback(void *pInit, int argc, char **argv, char **azColName){ memset(&sParse, 0, sizeof(sParse)); sParse.db = pData->db; sParse.initFlag = 1; - sParse.isTemp = argv[4][0] - '0'; + sParse.iDb = atoi(argv[4]); + sParse.useDb = -1; sParse.newTnum = atoi(argv[2]); sParse.useCallback = 1; sqliteRunParser(&sParse, argv[3], pData->pzErrMsg); @@ -78,7 +91,12 @@ int sqliteInitCallback(void *pInit, int argc, char **argv, char **azColName){ ** been created when we processed the CREATE TABLE. All we have ** to do here is record the root page number for that index. */ - Index *pIndex = sqliteFindIndex(pData->db, argv[1]); + int iDb; + Index *pIndex; + + iDb = atoi(argv[4]); + assert( iDb>=0 && iDb<pData->db->nDb ); + pIndex = sqliteFindIndex(pData->db, argv[1], pData->db->aDb[iDb].zName); if( pIndex==0 || pIndex->tnum!=0 ){ /* This can occur if there exists an index on a TEMP table which ** has the same name as another index on a permanent index. Since @@ -118,7 +136,7 @@ int upgrade_3_callback(void *pInit, int argc, char **argv, char **NotUsed){ Trigger *pTrig; char *zErr = 0; - pTab = sqliteFindTable(pData->db, argv[0]); + pTab = sqliteFindTable(pData->db, argv[0], 0); assert( pTab!=0 ); assert( sqliteStrICmp(pTab->zName, argv[0])==0 ); if( pTab ){ @@ -141,7 +159,7 @@ int upgrade_3_callback(void *pInit, int argc, char **argv, char **NotUsed){ ** cause the structure that pTab points to be deleted. In case that ** happened, we need to refetch pTab. */ - pTab = sqliteFindTable(pData->db, argv[0]); + pTab = sqliteFindTable(pData->db, argv[0], 0); if( pTab ){ assert( sqliteStrICmp(pTab->zName, argv[0])==0 ); pTab->pTrigger = pTrig; /* Re-enable triggers */ @@ -153,22 +171,19 @@ int upgrade_3_callback(void *pInit, int argc, char **argv, char **NotUsed){ /* ** Attempt to read the database schema and initialize internal -** data structures. Return one of the SQLITE_ error codes to +** data structures for a single database file. The index of the +** database file is given by iDb. iDb==0 is used for the main +** database. iDb==1 should never be used. iDb>=2 is used for +** auxiliary databases. Return one of the SQLITE_ error codes to ** indicate success or failure. -** -** After the database is initialized, the SQLITE_Initialized -** bit is set in the flags field of the sqlite structure. An -** attempt is made to initialize the database as soon as it -** is opened. If that fails (perhaps because another process -** has the sqlite_master table locked) than another attempt -** is made the first time the database is accessed. */ -int sqliteInit(sqlite *db, char **pzErrMsg){ +static int sqliteInitOne(sqlite *db, int iDb, char **pzErrMsg){ int rc; BtCursor *curMain; int size; Table *pTab; char *azArg[6]; + char zDbNum[30]; int meta[SQLITE_N_BTREE_META]; Parse sParse; InitData initData; @@ -223,103 +238,161 @@ int sqliteInit(sqlite *db, char **pzErrMsg){ "WHERE type='index'"; + assert( iDb>=0 && iDb!=1 && iDb<db->nDb ); + /* Construct the schema tables: sqlite_master and sqlite_temp_master */ azArg[0] = "table"; azArg[1] = MASTER_NAME; azArg[2] = "2"; azArg[3] = master_schema; - azArg[4] = "0"; + sprintf(zDbNum, "%d", iDb); + azArg[4] = zDbNum; azArg[5] = 0; initData.db = db; initData.pzErrMsg = pzErrMsg; sqliteInitCallback(&initData, 5, azArg, 0); - pTab = sqliteFindTable(db, MASTER_NAME); + pTab = sqliteFindTable(db, MASTER_NAME, "main"); if( pTab ){ pTab->readOnly = 1; } - azArg[1] = TEMP_MASTER_NAME; - azArg[3] = temp_master_schema; - azArg[4] = "1"; - sqliteInitCallback(&initData, 5, azArg, 0); - pTab = sqliteFindTable(db, TEMP_MASTER_NAME); - if( pTab ){ - pTab->readOnly = 1; + if( iDb==0 ){ + azArg[1] = TEMP_MASTER_NAME; + azArg[3] = temp_master_schema; + azArg[4] = "1"; + sqliteInitCallback(&initData, 5, azArg, 0); + pTab = sqliteFindTable(db, TEMP_MASTER_NAME, "temp"); + if( pTab ){ + pTab->readOnly = 1; + } } /* Create a cursor to hold the database open */ - if( db->pBe==0 ) return SQLITE_OK; - rc = sqliteBtreeCursor(db->pBe, 2, 0, &curMain); + if( db->aDb[iDb].pBt==0 ) return SQLITE_OK; + rc = sqliteBtreeCursor(db->aDb[iDb].pBt, 2, 0, &curMain); if( rc ){ sqliteSetString(pzErrMsg, sqlite_error_string(rc), 0); - sqliteResetInternalSchema(db); return rc; } /* Get the database meta information */ - rc = sqliteBtreeGetMeta(db->pBe, meta); + rc = sqliteBtreeGetMeta(db->aDb[iDb].pBt, meta); if( rc ){ sqliteSetString(pzErrMsg, sqlite_error_string(rc), 0); - sqliteResetInternalSchema(db); sqliteBtreeCloseCursor(curMain); return rc; } - db->schema_cookie = meta[1]; - db->next_cookie = db->schema_cookie; - db->file_format = meta[2]; - size = meta[3]; - if( size==0 ){ size = MAX_PAGES; } - db->cache_size = size; - sqliteBtreeSetCacheSize(db->pBe, size); - db->safety_level = meta[4]; - if( db->safety_level==0 ) db->safety_level = 2; - sqliteBtreeSetSafetyLevel(db->pBe, db->safety_level); - - /* - ** file_format==1 Version 2.1.0. - ** file_format==2 Version 2.2.0. Add support for INTEGER PRIMARY KEY. - ** file_format==3 Version 2.6.0. Fix empty-string index bug. - ** file_format==4 Version 2.7.0. Add support for separate numeric and - ** text datatypes. - */ - if( db->file_format==0 ){ - /* This happens if the database was initially empty */ - db->file_format = 4; - }else if( db->file_format>4 ){ - sqliteBtreeCloseCursor(curMain); - sqliteSetString(pzErrMsg, "unsupported file format", 0); - return SQLITE_ERROR; + db->aDb[iDb].schema_cookie = meta[1]; + if( iDb==0 ){ + db->next_cookie = meta[1]; + db->file_format = meta[2]; + size = meta[3]; + if( size==0 ){ size = MAX_PAGES; } + db->cache_size = size; + db->safety_level = meta[4]; + if( db->safety_level==0 ) db->safety_level = 2; + + /* + ** file_format==1 Version 2.1.0. + ** file_format==2 Version 2.2.0. Add support for INTEGER PRIMARY KEY. + ** file_format==3 Version 2.6.0. Fix empty-string index bug. + ** file_format==4 Version 2.7.0. Add support for separate numeric and + ** text datatypes. + */ + if( db->file_format==0 ){ + /* This happens if the database was initially empty */ + db->file_format = 4; + }else if( db->file_format>4 ){ + sqliteBtreeCloseCursor(curMain); + sqliteSetString(pzErrMsg, "unsupported file format", 0); + return SQLITE_ERROR; + } + }else if( db->file_format!=meta[2] || db->file_format<4 ){ + assert( db->file_format>=4 ); + if( meta[2]==0 ){ + sqliteSetString(pzErrMsg, "cannot attach empty database: ", + db->aDb[iDb].zName, 0); + }else{ + sqliteSetString(pzErrMsg, "incompatible file format in auxiliary " + "database: ", db->aDb[iDb].zName, 0); + } + sqliteBtreeClose(db->aDb[iDb].pBt); + db->aDb[iDb].pBt = 0; + return SQLITE_FORMAT; } + sqliteBtreeSetCacheSize(db->aDb[iDb].pBt, size); + sqliteBtreeSetSafetyLevel(db->aDb[iDb].pBt, meta[4]==0 ? 2 : meta[4]); /* Read the schema information out of the schema tables */ memset(&sParse, 0, sizeof(sParse)); sParse.db = db; - sParse.pBe = db->pBe; sParse.xCallback = sqliteInitCallback; sParse.pArg = (void*)&initData; sParse.initFlag = 1; + sParse.useDb = -1; sParse.useCallback = 1; - sqliteRunParser(&sParse, - db->file_format>=2 ? init_script : older_init_script, - pzErrMsg); + if( iDb==0 ){ + sqliteRunParser(&sParse, + db->file_format>=2 ? init_script : older_init_script, + pzErrMsg); + }else{ + char *zSql = 0; + sqliteSetString(&zSql, + "SELECT type, name, rootpage, sql, ", zDbNum, " FROM \"", + db->aDb[iDb].zName, "\".sqlite_master", 0); + sqliteRunParser(&sParse, zSql, pzErrMsg); + sqliteFree(zSql); + } + sqliteBtreeCloseCursor(curMain); if( sqlite_malloc_failed ){ sqliteSetString(pzErrMsg, "out of memory", 0); sParse.rc = SQLITE_NOMEM; - sqliteBtreeRollback(db->pBe); - sqliteResetInternalSchema(db); + sqliteResetInternalSchema(db, 0); } if( sParse.rc==SQLITE_OK ){ + DbSetProperty(db, iDb, DB_SchemaLoaded); + if( iDb==0 ){ + DbSetProperty(db, 1, DB_SchemaLoaded); + } + }else{ + sqliteResetInternalSchema(db, iDb); + } + return sParse.rc; +} + +/* +** Initialize all database files - the main database file, the file +** used to store temporary tables, and any additional database files +** created using ATTACH statements. Return a success code. If an +** error occurs, write an error message into *pzErrMsg. +** +** After the database is initialized, the SQLITE_Initialized +** bit is set in the flags field of the sqlite structure. An +** attempt is made to initialize the database as soon as it +** is opened. If that fails (perhaps because another process +** has the sqlite_master table locked) than another attempt +** is made the first time the database is accessed. +*/ +int sqliteInit(sqlite *db, char **pzErrMsg){ + int i, rc; + + assert( (db->flags & SQLITE_Initialized)==0 ); + rc = SQLITE_OK; + for(i=0; rc==SQLITE_OK && i<db->nDb; i++){ + if( DbHasProperty(db, i, DB_SchemaLoaded) ) continue; + assert( i!=1 ); /* Should have been initialized together with 0 */ + rc = sqliteInitOne(db, i, pzErrMsg); + } + if( rc==SQLITE_OK ){ db->flags |= SQLITE_Initialized; sqliteCommitInternalChanges(db); }else{ db->flags &= ~SQLITE_Initialized; - sqliteResetInternalSchema(db); } - sqliteBtreeCloseCursor(curMain); - return sParse.rc; + return rc; } /* @@ -349,23 +422,27 @@ const char sqlite_encoding[] = "iso8859"; */ sqlite *sqlite_open(const char *zFilename, int mode, char **pzErrMsg){ sqlite *db; - int rc; + int rc, i; /* Allocate the sqlite data structure */ db = sqliteMalloc( sizeof(sqlite) ); if( pzErrMsg ) *pzErrMsg = 0; if( db==0 ) goto no_mem_on_open; - sqliteHashInit(&db->tblHash, SQLITE_HASH_STRING, 0); - sqliteHashInit(&db->idxHash, SQLITE_HASH_STRING, 0); - sqliteHashInit(&db->trigHash, SQLITE_HASH_STRING, 0); - sqliteHashInit(&db->aFunc, SQLITE_HASH_STRING, 1); - sqliteHashInit(&db->aFKey, SQLITE_HASH_STRING, 1); db->onError = OE_Default; db->priorNewRowid = 0; db->magic = SQLITE_MAGIC_BUSY; + db->nDb = 2; + db->aDb = db->aDbStatic; + sqliteHashInit(&db->aFunc, SQLITE_HASH_STRING, 1); + for(i=0; i<db->nDb; i++){ + sqliteHashInit(&db->aDb[i].tblHash, SQLITE_HASH_STRING, 0); + sqliteHashInit(&db->aDb[i].idxHash, SQLITE_HASH_STRING, 0); + sqliteHashInit(&db->aDb[i].trigHash, SQLITE_HASH_STRING, 0); + sqliteHashInit(&db->aDb[i].aFKey, SQLITE_HASH_STRING, 1); + } /* Open the backend database driver */ - rc = sqliteBtreeOpen(zFilename, 0, MAX_PAGES, &db->pBe); + rc = sqliteBtreeFactory(db, zFilename, 0, MAX_PAGES, &db->aDb[0].pBt); if( rc!=SQLITE_OK ){ switch( rc ){ default: { @@ -376,6 +453,8 @@ sqlite *sqlite_open(const char *zFilename, int mode, char **pzErrMsg){ sqliteStrRealloc(pzErrMsg); return 0; } + db->aDb[0].zName = "main"; + db->aDb[1].zName = "temp"; /* Attempt to read the schema */ sqliteRegisterBuiltinFunctions(db); @@ -412,9 +491,9 @@ sqlite *sqlite_open(const char *zFilename, int mode, char **pzErrMsg){ &initData, &zErr); if( rc==SQLITE_OK ){ - sqliteBtreeGetMeta(db->pBe, meta); + sqliteBtreeGetMeta(db->aDb[0].pBt, meta); meta[2] = 4; - sqliteBtreeUpdateMeta(db->pBe, meta); + sqliteBtreeUpdateMeta(db->aDb[0].pBt, meta); sqlite_exec(db, "COMMIT", 0, 0, 0); } if( rc!=SQLITE_OK ){ @@ -457,17 +536,26 @@ int sqlite_changes(sqlite *db){ */ void sqlite_close(sqlite *db){ HashElem *i; + int j; db->want_to_close = 1; if( sqliteSafetyCheck(db) || sqliteSafetyOn(db) ){ /* printf("DID NOT CLOSE\n"); fflush(stdout); */ return; } db->magic = SQLITE_MAGIC_CLOSED; - sqliteBtreeClose(db->pBe); - sqliteResetInternalSchema(db); - if( db->pBeTemp ){ - sqliteBtreeClose(db->pBeTemp); + for(j=0; j<db->nDb; j++){ + if( db->aDb[j].pBt ){ + sqliteBtreeClose(db->aDb[j].pBt); + db->aDb[j].pBt = 0; + } + if( j>=2 ){ + sqliteFree(db->aDb[j].zName); + db->aDb[j].zName = 0; + } } + sqliteResetInternalSchema(db, 0); + assert( db->nDb<=2 ); + assert( db->aDb==db->aDbStatic ); for(i=sqliteHashFirst(&db->aFunc); i; i=sqliteHashNext(i)){ FuncDef *pFunc, *pNext; for(pFunc = (FuncDef*)sqliteHashData(i); pFunc; pFunc=pNext){ @@ -476,120 +564,21 @@ void sqlite_close(sqlite *db){ } } sqliteHashClear(&db->aFunc); - sqliteHashClear(&db->aFKey); sqliteFree(db); } /* -** Return TRUE if the given SQL string ends in a semicolon. -** -** Special handling is require for CREATE TRIGGER statements. -** Whenever the CREATE TRIGGER keywords are seen, the statement -** must end with ";END;". +** Rollback all database files. */ -int sqlite_complete(const char *zSql){ - int isComplete = 1; - int requireEnd = 0; - int seenText = 0; - int seenCreate = 0; - while( *zSql ){ - switch( *zSql ){ - case ';': { - isComplete = 1; - seenText = 1; - seenCreate = 0; - break; - } - case ' ': - case '\t': - case '\n': - case '\f': { - break; - } - case '[': { - isComplete = 0; - seenText = 1; - seenCreate = 0; - zSql++; - while( *zSql && *zSql!=']' ){ zSql++; } - if( *zSql==0 ) return 0; - break; - } - case '"': - case '\'': { - int c = *zSql; - isComplete = 0; - seenText = 1; - seenCreate = 0; - zSql++; - while( *zSql && *zSql!=c ){ zSql++; } - if( *zSql==0 ) return 0; - break; - } - case '-': { - if( zSql[1]!='-' ){ - isComplete = 0; - seenCreate = 0; - break; - } - while( *zSql && *zSql!='\n' ){ zSql++; } - if( *zSql==0 ) return seenText && isComplete && requireEnd==0; - break; - } - case 'c': - case 'C': { - seenText = 1; - if( !isComplete ) break; - isComplete = 0; - if( sqliteStrNICmp(zSql, "create", 6)!=0 ) break; - if( !isspace(zSql[6]) ) break; - zSql += 5; - seenCreate = 1; - while( isspace(zSql[1]) ) zSql++; - if( sqliteStrNICmp(&zSql[1],"trigger", 7)!=0 ) break; - zSql += 7; - requireEnd++; - break; - } - case 't': - case 'T': { - seenText = 1; - if( !seenCreate ) break; - seenCreate = 0; - isComplete = 0; - if( sqliteStrNICmp(zSql, "trigger", 7)!=0 ) break; - if( !isspace(zSql[7]) ) break; - zSql += 6; - requireEnd++; - break; - } - case 'e': - case 'E': { - seenCreate = 0; - seenText = 1; - if( !isComplete ) break; - isComplete = 0; - if( requireEnd==0 ) break; - if( sqliteStrNICmp(zSql, "end", 3)!=0 ) break; - zSql += 2; - while( isspace(zSql[1]) ) zSql++; - if( zSql[1]==';' ){ - zSql++; - isComplete = 1; - requireEnd--; - } - break; - } - default: { - seenCreate = 0; - seenText = 1; - isComplete = 0; - break; - } +void sqliteRollbackAll(sqlite *db){ + int i; + for(i=0; i<db->nDb; i++){ + if( db->aDb[i].pBt ){ + sqliteBtreeRollback(db->aDb[i].pBt); + db->aDb[i].inTrans = 0; } - zSql++; } - return seenText && isComplete && requireEnd==0; + sqliteRollbackInternalChanges(db); } /* @@ -632,21 +621,18 @@ static int sqliteMain( if( db->pVdbe==0 ){ db->nChange = 0; } memset(&sParse, 0, sizeof(sParse)); sParse.db = db; - sParse.pBe = db->pBe; sParse.xCallback = xCallback; sParse.pArg = pArg; + sParse.useDb = -1; sParse.useCallback = ppVm==0; -#ifndef SQLITE_OMIT_TRACE if( db->xTrace ) db->xTrace(db->pTraceArg, zSql); -#endif sqliteRunParser(&sParse, zSql, pzErrMsg); if( sqlite_malloc_failed ){ sqliteSetString(pzErrMsg, "out of memory", 0); sParse.rc = SQLITE_NOMEM; - sqliteBtreeRollback(db->pBe); - if( db->pBeTemp ) sqliteBtreeRollback(db->pBeTemp); + sqliteRollbackAll(db); + sqliteResetInternalSchema(db, 0); db->flags &= ~SQLITE_InTrans; - sqliteResetInternalSchema(db); } if( sParse.rc==SQLITE_DONE ) sParse.rc = SQLITE_OK; if( sParse.rc!=SQLITE_OK && pzErrMsg && *pzErrMsg==0 ){ @@ -654,7 +640,7 @@ static int sqliteMain( } sqliteStrRealloc(pzErrMsg); if( sParse.rc==SQLITE_SCHEMA ){ - sqliteResetInternalSchema(db); + sqliteResetInternalSchema(db, 0); } if( sParse.useCallback==0 ){ assert( ppVm ); @@ -937,53 +923,69 @@ int sqlite_function_type(sqlite *db, const char *zName, int dataType){ ** sqlite_exec(). */ void *sqlite_trace(sqlite *db, void (*xTrace)(void*,const char*), void *pArg){ -#ifndef SQLITE_OMIT_TRACE void *pOld = db->pTraceArg; db->xTrace = xTrace; db->pTraceArg = pArg; return pOld; -#else - return 0; -#endif } - /* -** Attempt to open the file named in the argument as the auxiliary database -** file. The auxiliary database file is used to store TEMP tables. But -** by using this API, it is possible to trick SQLite into opening two -** separate databases and acting on them as if they were one. +** This routine is called to create a connection to a database BTree +** driver. If zFilename is the name of a file, then that file is +** opened and used. If zFilename is the magic name ":memory:" then +** the database is stored in memory (and is thus forgotten as soon as +** the connection is closed.) If zFilename is NULL then the database +** is for temporary use only and is deleted as soon as the connection +** is closed. ** -** This routine closes the existing auxiliary database file, which will -** cause any previously created TEMP tables to be dropped. +** A temporary database can be either a disk file (that is automatically +** deleted when the file is closed) or a set of red-black trees held in memory, +** depending on the values of the TEMP_STORE compile-time macro and the +** db->temp_store variable, according to the following chart: ** -** The zName parameter can be a NULL pointer or an empty string to cause -** a temporary file to be opened and automatically deleted when closed. +** TEMP_STORE db->temp_store Location of temporary database +** ---------- -------------- ------------------------------ +** 0 any file +** 1 1 file +** 1 2 memory +** 1 0 file +** 2 1 file +** 2 2 memory +** 2 0 memory +** 3 any memory */ -int sqlite_open_aux_file(sqlite *db, const char *zName, char **pzErrMsg){ - int rc; - if( zName && zName[0]==0 ) zName = 0; - if( sqliteSafetyOn(db) ) goto openaux_misuse; - sqliteResetInternalSchema(db); - if( db->pBeTemp!=0 ){ - sqliteBtreeClose(db->pBeTemp); - } - rc = sqliteBtreeOpen(zName, 0, MAX_PAGES, &db->pBeTemp); - if( rc ){ - if( zName==0 ) zName = "a temporary file"; - sqliteSetString(pzErrMsg, "unable to open ", zName, - ": ", sqlite_error_string(rc), 0); - sqliteStrRealloc(pzErrMsg); - sqliteSafetyOff(db); - return rc; +int sqliteBtreeFactory( + const sqlite *db, /* Main database when opening aux otherwise 0 */ + const char *zFilename, /* Name of the file containing the BTree database */ + int omitJournal, /* if TRUE then do not journal this file */ + int nCache, /* How many pages in the page cache */ + Btree **ppBtree){ /* Pointer to new Btree object written here */ + + assert( ppBtree != 0); + +#ifndef SQLITE_OMIT_INMEMORYDB + if( zFilename==0 ){ + if (TEMP_STORE == 0) { + /* Always use file based temporary DB */ + return sqliteBtreeOpen(0, omitJournal, nCache, ppBtree); + } else if (TEMP_STORE == 1 || TEMP_STORE == 2) { + /* Switch depending on compile-time and/or runtime settings. */ + int location = db->temp_store==0 ? TEMP_STORE : db->temp_store; + + if (location == 1) { + return sqliteBtreeOpen(zFilename, omitJournal, nCache, ppBtree); + } else { + return sqliteRbtreeOpen(0, 0, 0, ppBtree); + } + } else { + /* Always use in-core DB */ + return sqliteRbtreeOpen(0, 0, 0, ppBtree); + } + }else if( zFilename[0]==':' && strcmp(zFilename,":memory:")==0 ){ + return sqliteRbtreeOpen(0, 0, 0, ppBtree); + }else +#endif + { + return sqliteBtreeOpen(zFilename, omitJournal, nCache, ppBtree); } - rc = sqliteInit(db, pzErrMsg); - if( sqliteSafetyOff(db) ) goto openaux_misuse; - sqliteStrRealloc(pzErrMsg); - return rc; - -openaux_misuse: - sqliteSetString(pzErrMsg, sqlite_error_string(SQLITE_MISUSE), 0); - sqliteStrRealloc(pzErrMsg); - return SQLITE_MISUSE; } diff --git a/ext/sqlite/libsqlite/src/opcodes.c b/ext/sqlite/libsqlite/src/opcodes.c index 0e611abcd3..1363a0fa31 100644 --- a/ext/sqlite/libsqlite/src/opcodes.c +++ b/ext/sqlite/libsqlite/src/opcodes.c @@ -60,12 +60,10 @@ char *sqliteOpcodeNames[] = { "???", "ReadCookie", "SetCookie", "VerifyCookie", - "OpenAux", - "OpenWrAux", + "OpenRead", "OpenWrite", - "Open", "OpenTemp", - "RenameCursor", + "OpenPseudo", "Close", "MoveLt", "MoveTo", @@ -79,6 +77,7 @@ char *sqliteOpcodeNames[] = { "???", "PutStrKey", "Delete", "KeyAsData", + "RowData", "Column", "Recno", "FullKey", diff --git a/ext/sqlite/libsqlite/src/opcodes.h b/ext/sqlite/libsqlite/src/opcodes.h index 5e0a9f8056..ccd7da4ae3 100644 --- a/ext/sqlite/libsqlite/src/opcodes.h +++ b/ext/sqlite/libsqlite/src/opcodes.h @@ -59,72 +59,71 @@ #define OP_ReadCookie 58 #define OP_SetCookie 59 #define OP_VerifyCookie 60 -#define OP_OpenAux 61 -#define OP_OpenWrAux 62 -#define OP_OpenWrite 63 -#define OP_Open 64 -#define OP_OpenTemp 65 -#define OP_RenameCursor 66 -#define OP_Close 67 -#define OP_MoveLt 68 -#define OP_MoveTo 69 -#define OP_Distinct 70 -#define OP_NotFound 71 -#define OP_Found 72 -#define OP_IsUnique 73 -#define OP_NotExists 74 -#define OP_NewRecno 75 -#define OP_PutIntKey 76 -#define OP_PutStrKey 77 -#define OP_Delete 78 -#define OP_KeyAsData 79 -#define OP_Column 80 -#define OP_Recno 81 -#define OP_FullKey 82 -#define OP_NullRow 83 -#define OP_Last 84 -#define OP_Rewind 85 -#define OP_Prev 86 -#define OP_Next 87 -#define OP_IdxPut 88 -#define OP_IdxDelete 89 -#define OP_IdxRecno 90 -#define OP_IdxLT 91 -#define OP_IdxGT 92 -#define OP_IdxGE 93 -#define OP_Destroy 94 -#define OP_Clear 95 -#define OP_CreateIndex 96 -#define OP_CreateTable 97 -#define OP_IntegrityCk 98 -#define OP_ListWrite 99 -#define OP_ListRewind 100 -#define OP_ListRead 101 -#define OP_ListReset 102 -#define OP_ListPush 103 -#define OP_ListPop 104 -#define OP_SortPut 105 -#define OP_SortMakeRec 106 -#define OP_SortMakeKey 107 -#define OP_Sort 108 -#define OP_SortNext 109 -#define OP_SortCallback 110 -#define OP_SortReset 111 -#define OP_FileOpen 112 -#define OP_FileRead 113 -#define OP_FileColumn 114 -#define OP_MemStore 115 -#define OP_MemLoad 116 -#define OP_MemIncr 117 -#define OP_AggReset 118 -#define OP_AggInit 119 -#define OP_AggFunc 120 -#define OP_AggFocus 121 -#define OP_AggSet 122 -#define OP_AggGet 123 -#define OP_AggNext 124 -#define OP_SetInsert 125 -#define OP_SetFound 126 -#define OP_SetNotFound 127 -#define OP_SetFirst 128 -#define OP_SetNext 129 +#define OP_OpenRead 61 +#define OP_OpenWrite 62 +#define OP_OpenTemp 63 +#define OP_OpenPseudo 64 +#define OP_Close 65 +#define OP_MoveLt 66 +#define OP_MoveTo 67 +#define OP_Distinct 68 +#define OP_NotFound 69 +#define OP_Found 70 +#define OP_IsUnique 71 +#define OP_NotExists 72 +#define OP_NewRecno 73 +#define OP_PutIntKey 74 +#define OP_PutStrKey 75 +#define OP_Delete 76 +#define OP_KeyAsData 77 +#define OP_RowData 78 +#define OP_Column 79 +#define OP_Recno 80 +#define OP_FullKey 81 +#define OP_NullRow 82 +#define OP_Last 83 +#define OP_Rewind 84 +#define OP_Prev 85 +#define OP_Next 86 +#define OP_IdxPut 87 +#define OP_IdxDelete 88 +#define OP_IdxRecno 89 +#define OP_IdxLT 90 +#define OP_IdxGT 91 +#define OP_IdxGE 92 +#define OP_Destroy 93 +#define OP_Clear 94 +#define OP_CreateIndex 95 +#define OP_CreateTable 96 +#define OP_IntegrityCk 97 +#define OP_ListWrite 98 +#define OP_ListRewind 99 +#define OP_ListRead 100 +#define OP_ListReset 101 +#define OP_ListPush 102 +#define OP_ListPop 103 +#define OP_SortPut 104 +#define OP_SortMakeRec 105 +#define OP_SortMakeKey 106 +#define OP_Sort 107 +#define OP_SortNext 108 +#define OP_SortCallback 109 +#define OP_SortReset 110 +#define OP_FileOpen 111 +#define OP_FileRead 112 +#define OP_FileColumn 113 +#define OP_MemStore 114 +#define OP_MemLoad 115 +#define OP_MemIncr 116 +#define OP_AggReset 117 +#define OP_AggInit 118 +#define OP_AggFunc 119 +#define OP_AggFocus 120 +#define OP_AggSet 121 +#define OP_AggGet 122 +#define OP_AggNext 123 +#define OP_SetInsert 124 +#define OP_SetFound 125 +#define OP_SetNotFound 126 +#define OP_SetFirst 127 +#define OP_SetNext 128 diff --git a/ext/sqlite/libsqlite/src/os.c b/ext/sqlite/libsqlite/src/os.c index d0b50dc4f1..46f22a4341 100644 --- a/ext/sqlite/libsqlite/src/os.c +++ b/ext/sqlite/libsqlite/src/os.c @@ -31,8 +31,12 @@ # ifndef O_NOFOLLOW # define O_NOFOLLOW 0 # endif +# ifndef O_BINARY +# define O_BINARY 0 +# endif #endif + #if OS_WIN # include <winbase.h> #endif @@ -48,6 +52,16 @@ #endif /* +** The DJGPP compiler environment looks mostly like Unix, but it +** lacks the fcntl() system call. So redefine fcntl() to be something +** that always succeeds. This means that locking does not occur under +** DJGPP. But its DOS - what did you expect? +*/ +#ifdef __DJGPP__ +# define fcntl(A,B,C) 0 +#endif + +/* ** Macros for performance tracing. Normally turned off */ #if 0 @@ -268,6 +282,31 @@ int sqliteOsFileExists(const char *zFilename){ } +#if 0 /* NOT USED */ +/* +** Change the name of an existing file. +*/ +int sqliteOsFileRename(const char *zOldName, const char *zNewName){ +#if OS_UNIX + if( link(zOldName, zNewName) ){ + return SQLITE_ERROR; + } + unlink(zOldName); + return SQLITE_OK; +#endif +#if OS_WIN + if( !MoveFile(zOldName, zNewName) ){ + return SQLITE_ERROR; + } + return SQLITE_OK; +#endif +#if OS_MAC + /**** FIX ME ***/ + return SQLITE_ERROR; +#endif +} +#endif /* NOT USED */ + /* ** Attempt to open a file for both reading and writing. If that ** fails, try opening it read-only. If the file does not exist, @@ -287,9 +326,9 @@ int sqliteOsOpenReadWrite( int *pReadonly ){ #if OS_UNIX - id->fd = open(zFilename, O_RDWR|O_CREAT|O_LARGEFILE, 0644); + id->fd = open(zFilename, O_RDWR|O_CREAT|O_LARGEFILE|O_BINARY, 0644); if( id->fd<0 ){ - id->fd = open(zFilename, O_RDONLY|O_LARGEFILE); + id->fd = open(zFilename, O_RDONLY|O_LARGEFILE|O_BINARY); if( id->fd<0 ){ return SQLITE_CANTOPEN; } @@ -411,7 +450,8 @@ int sqliteOsOpenExclusive(const char *zFilename, OsFile *id, int delFlag){ if( access(zFilename, 0)==0 ){ return SQLITE_CANTOPEN; } - id->fd = open(zFilename, O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW|O_LARGEFILE, 0600); + id->fd = open(zFilename, + O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW|O_LARGEFILE|O_BINARY, 0600); if( id->fd<0 ){ return SQLITE_CANTOPEN; } @@ -496,7 +536,7 @@ int sqliteOsOpenExclusive(const char *zFilename, OsFile *id, int delFlag){ */ int sqliteOsOpenReadOnly(const char *zFilename, OsFile *id){ #if OS_UNIX - id->fd = open(zFilename, O_RDONLY|O_LARGEFILE); + id->fd = open(zFilename, O_RDONLY|O_LARGEFILE|O_BINARY); if( id->fd<0 ){ return SQLITE_CANTOPEN; } @@ -1036,7 +1076,7 @@ int sqliteOsReadLock(OsFile *id){ lock.l_start = lock.l_len = 0L; s = fcntl(id->fd, F_SETLK, &lock); if( s!=0 ){ - rc = (s==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY; + rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY; }else{ rc = SQLITE_OK; id->pLock->cnt = 1; @@ -1132,7 +1172,7 @@ int sqliteOsWriteLock(OsFile *id){ lock.l_start = lock.l_len = 0L; s = fcntl(id->fd, F_SETLK, &lock); if( s!=0 ){ - rc = (s==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY; + rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY; }else{ rc = SQLITE_OK; id->pLock->cnt = -1; @@ -1239,7 +1279,7 @@ int sqliteOsUnlock(OsFile *id){ lock.l_start = lock.l_len = 0L; s = fcntl(id->fd, F_SETLK, &lock); if( s!=0 ){ - rc = (s==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY; + rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY; }else{ rc = SQLITE_OK; id->pLock->cnt = 0; diff --git a/ext/sqlite/libsqlite/src/os.h b/ext/sqlite/libsqlite/src/os.h index 8491d90dfe..d7674267d7 100644 --- a/ext/sqlite/libsqlite/src/os.h +++ b/ext/sqlite/libsqlite/src/os.h @@ -18,6 +18,11 @@ #define _SQLITE_OS_H_ /* +** Helpful hint: To get this to compile on HP/UX, add -D_INCLUDE_POSIX_SOURCE +** to the compiler command line. +*/ + +/* ** These #defines should enable >2GB file support on Posix if the ** underlying operating system supports it. If the OS lacks ** large file support, or if the OS is windows, these should be no-ops. @@ -147,6 +152,7 @@ int sqliteOsDelete(const char*); int sqliteOsFileExists(const char*); +int sqliteOsFileRename(const char*, const char*); int sqliteOsOpenReadWrite(const char*, OsFile*, int*); int sqliteOsOpenExclusive(const char*, OsFile*, int); int sqliteOsOpenReadOnly(const char*, OsFile*); diff --git a/ext/sqlite/libsqlite/src/pager.c b/ext/sqlite/libsqlite/src/pager.c index 7b32f6e089..e133a3cad0 100644 --- a/ext/sqlite/libsqlite/src/pager.c +++ b/ext/sqlite/libsqlite/src/pager.c @@ -928,6 +928,34 @@ int sqlitepager_pagecount(Pager *pPager){ } /* +** Forward declaration +*/ +static int syncAllPages(Pager*); + +/* +** Truncate the file to the number of pages specified. +*/ +int sqlitepager_truncate(Pager *pPager, Pgno nPage){ + int rc; + if( pPager->dbSize<0 ){ + sqlitepager_pagecount(pPager); + } + if( pPager->errMask!=0 ){ + rc = pager_errcode(pPager); + return rc; + } + if( nPage>=pPager->dbSize ){ + return SQLITE_OK; + } + syncAllPages(pPager); + rc = sqliteOsTruncate(&pPager->fd, SQLITE_PAGE_SIZE*(off_t)nPage); + if( rc==SQLITE_OK ){ + pPager->dbSize = nPage; + } + return rc; +} + +/* ** Shutdown the page cache. Free all memory and close all files. ** ** If a transaction was in progress when this routine is called, that @@ -966,6 +994,10 @@ int sqlitepager_close(Pager *pPager){ ** } */ CLR_PAGER(pPager); + if( pPager->zFilename!=(char*)&pPager[1] ){ + sqliteFree(pPager->zFilename); + sqliteFree(pPager->zJournal); + } sqliteFree(pPager); return SQLITE_OK; } @@ -1171,6 +1203,7 @@ int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){ */ assert( pPager!=0 ); assert( pgno!=0 ); + *ppPage = 0; if( pPager->errMask & ~(PAGER_ERR_FULL) ){ return pager_errcode(pPager); } @@ -1181,7 +1214,6 @@ int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){ if( pPager->nRef==0 ){ rc = sqliteOsReadLock(&pPager->fd); if( rc!=SQLITE_OK ){ - *ppPage = 0; return rc; } pPager->state = SQLITE_READLOCK; @@ -1199,7 +1231,6 @@ int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){ /* This should never happen! */ rc = SQLITE_INTERNAL; } - *ppPage = 0; return rc; } pPager->state = SQLITE_WRITELOCK; @@ -1215,7 +1246,6 @@ int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){ if( rc!=SQLITE_OK ){ rc = sqliteOsUnlock(&pPager->fd); assert( rc==SQLITE_OK ); - *ppPage = 0; return SQLITE_BUSY; } pPager->journalOpen = 1; @@ -1243,7 +1273,6 @@ int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){ pPg = sqliteMallocRaw( sizeof(*pPg) + SQLITE_PAGE_SIZE + sizeof(u32) + pPager->nExtra ); if( pPg==0 ){ - *ppPage = 0; pager_unwritelock(pPager); pPager->errMask |= PAGER_ERR_MEM; return SQLITE_NOMEM; @@ -1272,7 +1301,6 @@ int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){ int rc = syncAllPages(pPager); if( rc!=0 ){ sqlitepager_rollback(pPager); - *ppPage = 0; return SQLITE_IOERR; } pPg = pPager->pFirst; @@ -1287,7 +1315,6 @@ int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){ rc = pager_write_pagelist( pPg ); if( rc!=SQLITE_OK ){ sqlitepager_rollback(pPager); - *ppPage = 0; return SQLITE_IOERR; } } @@ -1365,7 +1392,15 @@ int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){ assert( pPg->pNextHash->pPrevHash==0 ); pPg->pNextHash->pPrevHash = pPg; } + if( pPager->nExtra>0 ){ + memset(PGHDR_TO_EXTRA(pPg), 0, pPager->nExtra); + } if( pPager->dbSize<0 ) sqlitepager_pagecount(pPager); + if( pPager->errMask!=0 ){ + sqlitepager_unref(PGHDR_TO_DATA(pPg)); + rc = pager_errcode(pPager); + return rc; + } if( pPager->dbSize<(int)pgno ){ memset(PGHDR_TO_DATA(pPg), 0, SQLITE_PAGE_SIZE); }else{ @@ -1376,15 +1411,13 @@ int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){ off_t fileSize; if( sqliteOsFileSize(&pPager->fd,&fileSize)!=SQLITE_OK || fileSize>=pgno*SQLITE_PAGE_SIZE ){ + sqlitepager_unref(PGHDR_TO_DATA(pPg)); return rc; }else{ memset(PGHDR_TO_DATA(pPg), 0, SQLITE_PAGE_SIZE); } } } - if( pPager->nExtra>0 ){ - memset(PGHDR_TO_EXTRA(pPg), 0, pPager->nExtra); - } }else{ /* The requested page is in the page cache. */ pPager->nHit++; @@ -1506,6 +1539,10 @@ static int pager_open_journal(Pager *pPager){ pPager->alwaysRollback = 0; pPager->nRec = 0; sqlitepager_pagecount(pPager); + if( pPager->errMask!=0 ){ + rc = pager_errcode(pPager); + return rc; + } pPager->origDbSize = pPager->dbSize; if( journal_format==JOURNAL_FORMAT_3 ){ rc = sqliteOsWrite(&pPager->jfd, aJournalMagic3, sizeof(aJournalMagic3)); @@ -1723,6 +1760,25 @@ int sqlitepager_iswriteable(void *pData){ } /* +** Replace the content of a single page with the information in the third +** argument. +*/ +int sqlitepager_overwrite(Pager *pPager, Pgno pgno, void *pData){ + void *pPage; + int rc; + + rc = sqlitepager_get(pPager, pgno, &pPage); + if( rc==SQLITE_OK ){ + rc = sqlitepager_write(pPage); + if( rc==SQLITE_OK ){ + memcpy(pPage, pData, SQLITE_PAGE_SIZE); + } + sqlitepager_unref(pPage); + } + return rc; +} + +/* ** A call to this routine tells the pager that it is not necessary to ** write the information on page "pgno" back to the disk, even though ** that page might be marked as dirty. @@ -2007,6 +2063,13 @@ int sqlitepager_ckpt_rollback(Pager *pPager){ return rc; } +/* +** Return the full pathname of the database file. +*/ +const char *sqlitepager_filename(Pager *pPager){ + return pPager->zFilename; +} + #ifdef SQLITE_TEST /* ** Print a listing of all referenced pages and their ref count. diff --git a/ext/sqlite/libsqlite/src/pager.h b/ext/sqlite/libsqlite/src/pager.h index a2f08d3ac9..42fa3dc378 100644 --- a/ext/sqlite/libsqlite/src/pager.h +++ b/ext/sqlite/libsqlite/src/pager.h @@ -59,7 +59,9 @@ int sqlitepager_unref(void*); Pgno sqlitepager_pagenumber(void*); int sqlitepager_write(void*); int sqlitepager_iswriteable(void*); +int sqlitepager_overwrite(Pager *pPager, Pgno pgno, void*); int sqlitepager_pagecount(Pager*); +int sqlitepager_truncate(Pager*,Pgno); int sqlitepager_begin(void*); int sqlitepager_commit(Pager*); int sqlitepager_rollback(Pager*); @@ -71,6 +73,8 @@ void sqlitepager_dont_rollback(void*); void sqlitepager_dont_write(Pager*, Pgno); int *sqlitepager_stats(Pager*); void sqlitepager_set_safety_level(Pager*,int); +const char *sqlitepager_filename(Pager*); +int sqlitepager_rename(Pager*, const char *zNewName); #ifdef SQLITE_TEST void sqlitepager_refdump(Pager*); diff --git a/ext/sqlite/libsqlite/src/parse.c b/ext/sqlite/libsqlite/src/parse.c index 60468f79fa..da1a6f0461 100644 --- a/ext/sqlite/libsqlite/src/parse.c +++ b/ext/sqlite/libsqlite/src/parse.c @@ -81,34 +81,34 @@ struct TrigEvent { int a; IdList * b; }; */ /* */ #define YYCODETYPE unsigned char -#define YYNOCODE 214 +#define YYNOCODE 219 #define YYACTIONTYPE unsigned short int #define sqliteParserTOKENTYPE Token typedef union { sqliteParserTOKENTYPE yy0; - struct TrigEvent yy72; - struct {int value; int mask;} yy83; - int yy136; - ExprList* yy168; - Expr * yy176; - Select* yy207; - TriggerStep * yy209; - IdList* yy268; - Expr* yy272; - SrcList* yy289; - Token yy324; - struct LimitVal yy336; - int yy427; + Select* yy11; + int yy52; + ExprList* yy62; + IdList* yy92; + Token yy210; + struct TrigEvent yy234; + Expr * yy270; + struct {int value; int mask;} yy279; + struct LimitVal yy280; + Expr* yy334; + SrcList* yy335; + TriggerStep * yy347; + int yy437; } YYMINORTYPE; #define YYSTACKDEPTH 100 #define sqliteParserARG_SDECL Parse *pParse; #define sqliteParserARG_PDECL ,Parse *pParse #define sqliteParserARG_FETCH Parse *pParse = yypParser->pParse #define sqliteParserARG_STORE yypParser->pParse = pParse -#define YYNSTATE 531 -#define YYNRULE 280 -#define YYERRORSYMBOL 150 -#define YYERRSYMDT yy427 +#define YYNSTATE 555 +#define YYNRULE 287 +#define YYERRORSYMBOL 155 +#define YYERRSYMDT yy437 #define YYFALLBACK 1 #define YY_NO_ACTION (YYNSTATE+YYNRULE+2) #define YY_ACCEPT_ACTION (YYNSTATE+YYNRULE+1) @@ -140,2967 +140,3043 @@ struct yyActionEntry { typedef struct yyActionEntry yyActionEntry; static const yyActionEntry yyActionTable[] = { /* State 0 */ - { 44, 0, 529}, /* 1: EXPLAIN shift 529 */ - { 151, 0, 3}, /* 2: explain shift 3 */ - { 104, 1, 528}, /* 3: SEMI shift 528 */ - { 165, 0, 812}, /* 4: input accept */ - { 136, 0, 1}, /* 5: cmdlist shift 1 */ - { 149, 0, 530}, /* 6: ecmd shift 530 */ + { 156, 0, 3}, /* 1: explain shift 3 */ + { 139, 0, 1}, /* 2: cmdlist shift 1 */ + { 170, 0, 843}, /* 3: input accept */ + { 47, 0, 553}, /* 4: EXPLAIN shift 553 */ + { 154, 0, 554}, /* 5: ecmd shift 554 */ + { 107, 4, 552}, /* 6: SEMI shift 552 */ /* State 1 */ - { 0, 0, 531}, /* 1: $ reduce 0 */ - { 151, 0, 3}, /* 2: explain shift 3 */ - { 104, 4, 528}, /* 3: SEMI shift 528 */ - { 44, 0, 529}, /* 4: EXPLAIN shift 529 */ - { 149, 3, 2}, /* 5: ecmd shift 2 */ + { 0, 0, 555}, /* 1: $ reduce 0 */ + { 156, 0, 3}, /* 2: explain shift 3 */ + { 107, 4, 552}, /* 3: SEMI shift 552 */ + { 47, 0, 553}, /* 4: EXPLAIN shift 553 */ + { 154, 0, 2}, /* 5: ecmd shift 2 */ /* State 3 */ - { 120, 3, 483}, /* 1: UPDATE shift 483 */ - { 181, 0, 69}, /* 2: oneselect shift 69 */ - { 40, 0, 25}, /* 3: END shift 25 */ - { 123, 6, 509}, /* 4: VACUUM shift 509 */ - { 144, 0, 29}, /* 5: create_table shift 29 */ - { 103, 7, 73}, /* 6: SELECT shift 73 */ - { 63, 11, 498}, /* 7: INSERT shift 498 */ - { 27, 0, 501}, /* 8: COPY shift 501 */ - { 168, 12, 489}, /* 9: insert_cmd shift 489 */ - { 9, 0, 7}, /* 10: BEGIN shift 7 */ - { 23, 0, 23}, /* 11: COMMIT shift 23 */ - { 28, 0, 382}, /* 12: CREATE shift 382 */ - { 192, 14, 478}, /* 13: select shift 478 */ - { 92, 15, 511}, /* 14: PRAGMA shift 511 */ - { 32, 0, 479}, /* 15: DELETE shift 479 */ - { 135, 0, 6}, /* 16: cmd shift 6 */ - { 97, 19, 500}, /* 17: REPLACE shift 500 */ - { 137, 17, 4}, /* 18: cmdx shift 4 */ - { 37, 0, 469}, /* 19: DROP shift 469 */ - { 99, 0, 27}, /* 20: ROLLBACK shift 27 */ + { 66, 0, 512}, /* 1: INSERT shift 512 */ + { 28, 0, 515}, /* 2: COPY shift 515 */ + { 24, 0, 23}, /* 3: COMMIT shift 23 */ + { 29, 0, 388}, /* 4: CREATE shift 388 */ + { 8, 0, 543}, /* 5: ATTACH shift 543 */ + { 34, 0, 490}, /* 6: DELETE shift 490 */ + { 138, 2, 6}, /* 7: cmd shift 6 */ + { 95, 4, 526}, /* 8: PRAGMA shift 526 */ + { 140, 5, 4}, /* 9: cmdx shift 4 */ + { 185, 0, 69}, /* 10: oneselect shift 69 */ + { 10, 0, 7}, /* 11: BEGIN shift 7 */ + { 37, 0, 549}, /* 12: DETACH shift 549 */ + { 100, 6, 514}, /* 13: REPLACE shift 514 */ + { 123, 0, 495}, /* 14: UPDATE shift 495 */ + { 102, 0, 27}, /* 15: ROLLBACK shift 27 */ + { 147, 12, 29}, /* 16: create_table shift 29 */ + { 126, 0, 524}, /* 17: VACUUM shift 524 */ + { 40, 0, 478}, /* 18: DROP shift 478 */ + { 106, 18, 73}, /* 19: SELECT shift 73 */ + { 173, 0, 502}, /* 20: insert_cmd shift 502 */ + { 196, 0, 489}, /* 21: select shift 489 */ + { 43, 0, 25}, /* 22: END shift 25 */ /* State 4 */ - { 104, 0, 5}, /* 1: SEMI shift 5 */ + { 107, 0, 5}, /* 1: SEMI shift 5 */ /* State 6 */ - { 104, 0, 536}, /* 1: SEMI reduce 5 */ + { 107, 0, 560}, /* 1: SEMI reduce 5 */ /* State 7 */ - { 202, 2, 8}, /* 1: trans_opt shift 8 */ - { 114, 0, 18}, /* 2: TRANSACTION shift 18 */ + { 206, 0, 8}, /* 1: trans_opt shift 8 */ + { 117, 0, 18}, /* 2: TRANSACTION shift 18 */ /* State 8 */ - { 180, 2, 9}, /* 1: onconf shift 9 */ - { 87, 0, 10}, /* 2: ON shift 10 */ - { 104, 0, 619}, /* 3: SEMI reduce 88 */ + { 90, 0, 10}, /* 1: ON shift 10 */ + { 184, 0, 9}, /* 2: onconf shift 9 */ + { 107, 0, 643}, /* 3: SEMI reduce 88 */ /* State 9 */ - { 104, 0, 539}, /* 1: SEMI reduce 8 */ + { 107, 0, 563}, /* 1: SEMI reduce 8 */ /* State 10 */ - { 25, 0, 11}, /* 1: CONFLICT shift 11 */ + { 26, 0, 11}, /* 1: CONFLICT shift 11 */ /* State 11 */ - { 1, 0, 14}, /* 1: ABORT shift 14 */ - { 97, 1, 17}, /* 2: REPLACE shift 17 */ - { 99, 5, 13}, /* 3: ROLLBACK shift 13 */ - { 189, 3, 12}, /* 4: resolvetype shift 12 */ - { 57, 6, 16}, /* 5: IGNORE shift 16 */ - { 45, 0, 15}, /* 6: FAIL shift 15 */ + { 102, 3, 13}, /* 1: ROLLBACK shift 13 */ + { 193, 4, 12}, /* 2: resolvetype shift 12 */ + { 60, 6, 16}, /* 3: IGNORE shift 16 */ + { 1, 0, 14}, /* 4: ABORT shift 14 */ + { 100, 0, 17}, /* 5: REPLACE shift 17 */ + { 48, 0, 15}, /* 6: FAIL shift 15 */ /* State 18 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 19}, /* 2: nm shift 19 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 19}, /* 2: nm shift 19 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 23 */ - { 114, 0, 18}, /* 1: TRANSACTION shift 18 */ - { 202, 0, 24}, /* 2: trans_opt shift 24 */ - { 104, 0, 540}, /* 3: SEMI reduce 9 */ + { 117, 0, 18}, /* 1: TRANSACTION shift 18 */ + { 107, 0, 564}, /* 2: SEMI reduce 9 */ + { 206, 2, 24}, /* 3: trans_opt shift 24 */ /* State 24 */ - { 104, 0, 543}, /* 1: SEMI reduce 12 */ + { 107, 0, 567}, /* 1: SEMI reduce 12 */ /* State 25 */ - { 114, 0, 18}, /* 1: TRANSACTION shift 18 */ - { 202, 0, 26}, /* 2: trans_opt shift 26 */ - { 104, 0, 540}, /* 3: SEMI reduce 9 */ + { 117, 0, 18}, /* 1: TRANSACTION shift 18 */ + { 107, 0, 564}, /* 2: SEMI reduce 9 */ + { 206, 2, 26}, /* 3: trans_opt shift 26 */ /* State 26 */ - { 104, 0, 544}, /* 1: SEMI reduce 13 */ + { 107, 0, 568}, /* 1: SEMI reduce 13 */ /* State 27 */ - { 114, 0, 18}, /* 1: TRANSACTION shift 18 */ - { 202, 0, 28}, /* 2: trans_opt shift 28 */ - { 104, 0, 540}, /* 3: SEMI reduce 9 */ + { 117, 0, 18}, /* 1: TRANSACTION shift 18 */ + { 107, 0, 564}, /* 2: SEMI reduce 9 */ + { 206, 2, 28}, /* 3: trans_opt shift 28 */ /* State 28 */ - { 104, 0, 545}, /* 1: SEMI reduce 14 */ + { 107, 0, 569}, /* 1: SEMI reduce 14 */ /* State 29 */ - { 6, 0, 380}, /* 1: AS shift 380 */ - { 145, 3, 30}, /* 2: create_table_args shift 30 */ - { 76, 0, 31}, /* 3: LP shift 31 */ + { 6, 0, 386}, /* 1: AS shift 386 */ + { 148, 3, 30}, /* 2: create_table_args shift 30 */ + { 79, 0, 31}, /* 3: LP shift 31 */ /* State 30 */ - { 104, 0, 546}, /* 1: SEMI reduce 15 */ + { 107, 0, 570}, /* 1: SEMI reduce 15 */ /* State 31 */ - { 140, 4, 37}, /* 1: columnid shift 37 */ - { 141, 5, 32}, /* 2: columnlist shift 32 */ - { 177, 0, 345}, /* 3: nm shift 345 */ - { 56, 0, 20}, /* 4: ID shift 20 */ - { 71, 0, 22}, /* 5: JOIN_KW shift 22 */ - { 110, 0, 21}, /* 6: STRING shift 21 */ - { 139, 0, 379}, /* 7: column shift 379 */ + { 59, 0, 20}, /* 1: ID shift 20 */ + { 113, 0, 21}, /* 2: STRING shift 21 */ + { 142, 0, 385}, /* 3: column shift 385 */ + { 143, 1, 37}, /* 4: columnid shift 37 */ + { 144, 6, 32}, /* 5: columnlist shift 32 */ + { 74, 0, 22}, /* 6: JOIN_KW shift 22 */ + { 181, 0, 351}, /* 7: nm shift 351 */ /* State 32 */ - { 21, 0, 35}, /* 1: COMMA shift 35 */ - { 101, 0, 607}, /* 2: RP reduce 76 */ - { 143, 2, 33}, /* 3: conslist_opt shift 33 */ + { 104, 0, 631}, /* 1: RP reduce 76 */ + { 22, 0, 35}, /* 2: COMMA shift 35 */ + { 146, 1, 33}, /* 3: conslist_opt shift 33 */ /* State 33 */ - { 101, 0, 34}, /* 1: RP shift 34 */ + { 104, 0, 34}, /* 1: RP shift 34 */ /* State 34 */ - { 104, 0, 550}, /* 1: SEMI reduce 19 */ + { 107, 0, 574}, /* 1: SEMI reduce 19 */ /* State 35 */ - { 26, 0, 349}, /* 1: CONSTRAINT shift 349 */ - { 93, 0, 351}, /* 2: PRIMARY shift 351 */ - { 119, 2, 357}, /* 3: UNIQUE shift 357 */ - { 17, 0, 362}, /* 4: CHECK shift 362 */ - { 56, 4, 20}, /* 5: ID shift 20 */ - { 200, 0, 378}, /* 6: tcons shift 378 */ - { 110, 8, 21}, /* 7: STRING shift 21 */ - { 71, 0, 22}, /* 8: JOIN_KW shift 22 */ - { 177, 0, 345}, /* 9: nm shift 345 */ - { 139, 12, 36}, /* 10: column shift 36 */ - { 140, 0, 37}, /* 11: columnid shift 37 */ - { 48, 0, 365}, /* 12: FOREIGN shift 365 */ - { 142, 0, 346}, /* 13: conslist shift 346 */ + { 143, 0, 37}, /* 1: columnid shift 37 */ + { 27, 0, 355}, /* 2: CONSTRAINT shift 355 */ + { 145, 0, 352}, /* 3: conslist shift 352 */ + { 96, 5, 357}, /* 4: PRIMARY shift 357 */ + { 18, 0, 368}, /* 5: CHECK shift 368 */ + { 122, 4, 363}, /* 6: UNIQUE shift 363 */ + { 113, 9, 21}, /* 7: STRING shift 21 */ + { 59, 0, 20}, /* 8: ID shift 20 */ + { 74, 0, 22}, /* 9: JOIN_KW shift 22 */ + { 204, 7, 384}, /* 10: tcons shift 384 */ + { 142, 12, 36}, /* 11: column shift 36 */ + { 51, 0, 371}, /* 12: FOREIGN shift 371 */ + { 181, 11, 351}, /* 13: nm shift 351 */ /* State 37 */ - { 160, 5, 344}, /* 1: ids shift 344 */ - { 56, 0, 248}, /* 2: ID shift 248 */ - { 207, 0, 38}, /* 3: type shift 38 */ - { 208, 0, 331}, /* 4: typename shift 331 */ - { 110, 0, 249}, /* 5: STRING shift 249 */ + { 165, 0, 350}, /* 1: ids shift 350 */ + { 113, 0, 252}, /* 2: STRING shift 252 */ + { 212, 0, 38}, /* 3: type shift 38 */ + { 213, 2, 337}, /* 4: typename shift 337 */ + { 59, 0, 251}, /* 5: ID shift 251 */ /* State 38 */ - { 130, 0, 39}, /* 1: carglist shift 39 */ + { 133, 0, 39}, /* 1: carglist shift 39 */ /* State 39 */ - { 26, 0, 41}, /* 1: CONSTRAINT shift 41 */ - { 93, 0, 54}, /* 2: PRIMARY shift 54 */ - { 119, 2, 60}, /* 3: UNIQUE shift 60 */ - { 146, 6, 313}, /* 4: defer_subclause shift 313 */ - { 134, 8, 318}, /* 5: ccons shift 318 */ - { 29, 0, 319}, /* 6: DEFAULT shift 319 */ - { 84, 9, 44}, /* 7: NULL shift 44 */ - { 95, 10, 291}, /* 8: REFERENCES shift 291 */ - { 19, 0, 314}, /* 9: COLLATE shift 314 */ - { 82, 11, 46}, /* 10: NOT shift 46 */ - { 30, 12, 316}, /* 11: DEFERRABLE shift 316 */ - { 17, 0, 62}, /* 12: CHECK shift 62 */ - { 129, 0, 40}, /* 13: carg shift 40 */ + { 96, 4, 54}, /* 1: PRIMARY shift 54 */ + { 27, 0, 41}, /* 2: CONSTRAINT shift 41 */ + { 132, 0, 40}, /* 3: carg shift 40 */ + { 31, 5, 325}, /* 4: DEFAULT shift 325 */ + { 18, 0, 62}, /* 5: CHECK shift 62 */ + { 122, 1, 60}, /* 6: UNIQUE shift 60 */ + { 32, 0, 322}, /* 7: DEFERRABLE shift 322 */ + { 137, 11, 324}, /* 8: ccons shift 324 */ + { 151, 0, 319}, /* 9: defer_subclause shift 319 */ + { 87, 0, 44}, /* 10: NULL shift 44 */ + { 98, 12, 297}, /* 11: REFERENCES shift 297 */ + { 85, 13, 46}, /* 12: NOT shift 46 */ + { 20, 0, 320}, /* 13: COLLATE shift 320 */ /* State 41 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 42}, /* 2: nm shift 42 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 42}, /* 2: nm shift 42 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 42 */ - { 30, 0, 316}, /* 1: DEFERRABLE shift 316 */ - { 84, 0, 44}, /* 2: NULL shift 44 */ - { 82, 0, 46}, /* 3: NOT shift 46 */ - { 93, 0, 54}, /* 4: PRIMARY shift 54 */ - { 134, 2, 43}, /* 5: ccons shift 43 */ - { 95, 0, 291}, /* 6: REFERENCES shift 291 */ - { 146, 0, 313}, /* 7: defer_subclause shift 313 */ - { 17, 0, 62}, /* 8: CHECK shift 62 */ - { 19, 0, 314}, /* 9: COLLATE shift 314 */ - { 119, 9, 60}, /* 10: UNIQUE shift 60 */ + { 20, 0, 320}, /* 1: COLLATE shift 320 */ + { 151, 0, 319}, /* 2: defer_subclause shift 319 */ + { 122, 4, 60}, /* 3: UNIQUE shift 60 */ + { 32, 0, 322}, /* 4: DEFERRABLE shift 322 */ + { 87, 0, 44}, /* 5: NULL shift 44 */ + { 85, 0, 46}, /* 6: NOT shift 46 */ + { 96, 0, 54}, /* 7: PRIMARY shift 54 */ + { 137, 5, 43}, /* 8: ccons shift 43 */ + { 98, 10, 297}, /* 9: REFERENCES shift 297 */ + { 18, 0, 62}, /* 10: CHECK shift 62 */ /* State 44 */ - { 180, 0, 45}, /* 1: onconf shift 45 */ - { 87, 0, 10}, /* 2: ON shift 10 */ + { 184, 2, 45}, /* 1: onconf shift 45 */ + { 90, 0, 10}, /* 2: ON shift 10 */ /* State 46 */ - { 84, 2, 47}, /* 1: NULL shift 47 */ - { 30, 0, 49}, /* 2: DEFERRABLE shift 49 */ + { 32, 0, 49}, /* 1: DEFERRABLE shift 49 */ + { 87, 0, 47}, /* 2: NULL shift 47 */ /* State 47 */ - { 180, 0, 48}, /* 1: onconf shift 48 */ - { 87, 0, 10}, /* 2: ON shift 10 */ + { 184, 2, 48}, /* 1: onconf shift 48 */ + { 90, 0, 10}, /* 2: ON shift 10 */ /* State 49 */ - { 164, 2, 50}, /* 1: init_deferred_pred_opt shift 50 */ - { 62, 0, 51}, /* 2: INITIALLY shift 51 */ + { 65, 0, 51}, /* 1: INITIALLY shift 51 */ + { 169, 1, 50}, /* 2: init_deferred_pred_opt shift 50 */ /* State 51 */ - { 31, 0, 52}, /* 1: DEFERRED shift 52 */ - { 59, 1, 53}, /* 2: IMMEDIATE shift 53 */ + { 62, 0, 53}, /* 1: IMMEDIATE shift 53 */ + { 33, 0, 52}, /* 2: DEFERRED shift 52 */ /* State 54 */ - { 72, 0, 55}, /* 1: KEY shift 55 */ + { 75, 0, 55}, /* 1: KEY shift 55 */ /* State 55 */ - { 198, 0, 56}, /* 1: sortorder shift 56 */ - { 34, 3, 59}, /* 2: DESC shift 59 */ + { 36, 0, 59}, /* 1: DESC shift 59 */ + { 202, 3, 56}, /* 2: sortorder shift 56 */ { 7, 0, 58}, /* 3: ASC shift 58 */ /* State 56 */ - { 180, 0, 57}, /* 1: onconf shift 57 */ - { 87, 0, 10}, /* 2: ON shift 10 */ + { 184, 2, 57}, /* 1: onconf shift 57 */ + { 90, 0, 10}, /* 2: ON shift 10 */ /* State 60 */ - { 180, 0, 61}, /* 1: onconf shift 61 */ - { 87, 0, 10}, /* 2: ON shift 10 */ + { 184, 2, 61}, /* 1: onconf shift 61 */ + { 90, 0, 10}, /* 2: ON shift 10 */ /* State 62 */ - { 76, 0, 63}, /* 1: LP shift 63 */ + { 79, 0, 63}, /* 1: LP shift 63 */ /* State 63 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 288}, /* 3: expr shift 288 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 294}, /* 8: expr shift 294 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 64 */ - { 76, 2, 65}, /* 1: LP shift 65 */ - { 36, 0, 559}, /* 2: DOT reduce 28 */ + { 39, 0, 583}, /* 1: DOT reduce 28 */ + { 79, 1, 65}, /* 2: LP shift 65 */ /* State 65 */ - { 108, 0, 286}, /* 1: STAR shift 286 */ - { 91, 0, 174}, /* 2: PLUS shift 174 */ - { 110, 4, 66}, /* 3: STRING shift 66 */ - { 56, 0, 64}, /* 4: ID shift 64 */ - { 94, 6, 186}, /* 5: RAISE shift 186 */ - { 76, 0, 68}, /* 6: LP shift 68 */ - { 80, 0, 172}, /* 7: MINUS shift 172 */ - { 82, 14, 168}, /* 8: NOT shift 168 */ - { 152, 7, 165}, /* 9: expr shift 165 */ - { 153, 0, 212}, /* 10: expritem shift 212 */ - { 154, 8, 284}, /* 11: exprlist shift 284 */ - { 65, 0, 166}, /* 12: INTEGER shift 166 */ - { 84, 15, 101}, /* 13: NULL shift 101 */ - { 46, 0, 167}, /* 14: FLOAT shift 167 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ - { 177, 0, 102}, /* 16: nm shift 102 */ - { 16, 0, 176}, /* 17: CASE shift 176 */ - { 71, 0, 67}, /* 18: JOIN_KW shift 67 */ + { 59, 0, 64}, /* 1: ID shift 64 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 74, 0, 67}, /* 3: JOIN_KW shift 67 */ + { 111, 0, 292}, /* 4: STAR shift 292 */ + { 94, 0, 176}, /* 5: PLUS shift 176 */ + { 113, 1, 66}, /* 6: STRING shift 66 */ + { 79, 0, 68}, /* 7: LP shift 68 */ + { 97, 7, 188}, /* 8: RAISE shift 188 */ + { 85, 10, 170}, /* 9: NOT shift 170 */ + { 49, 11, 169}, /* 10: FLOAT shift 169 */ + { 13, 0, 172}, /* 11: BITNOT shift 172 */ + { 83, 0, 174}, /* 12: MINUS shift 174 */ + { 68, 0, 168}, /* 13: INTEGER shift 168 */ + { 157, 9, 167}, /* 14: expr shift 167 */ + { 158, 13, 214}, /* 15: expritem shift 214 */ + { 159, 17, 290}, /* 16: exprlist shift 290 */ + { 87, 0, 101}, /* 17: NULL shift 101 */ + { 17, 0, 178}, /* 18: CASE shift 178 */ /* State 66 */ - { 36, 0, 560}, /* 1: DOT reduce 29 */ + { 39, 0, 584}, /* 1: DOT reduce 29 */ /* State 67 */ - { 36, 0, 561}, /* 1: DOT reduce 30 */ + { 39, 0, 585}, /* 1: DOT reduce 30 */ /* State 68 */ - { 91, 0, 174}, /* 1: PLUS shift 174 */ - { 181, 1, 69}, /* 2: oneselect shift 69 */ - { 110, 4, 66}, /* 3: STRING shift 66 */ - { 56, 0, 64}, /* 4: ID shift 64 */ - { 94, 6, 186}, /* 5: RAISE shift 186 */ - { 76, 0, 68}, /* 6: LP shift 68 */ - { 80, 0, 172}, /* 7: MINUS shift 172 */ - { 46, 0, 167}, /* 8: FLOAT shift 167 */ - { 152, 7, 282}, /* 9: expr shift 282 */ - { 84, 15, 101}, /* 10: NULL shift 101 */ - { 82, 8, 168}, /* 11: NOT shift 168 */ - { 65, 0, 166}, /* 12: INTEGER shift 166 */ - { 192, 10, 70}, /* 13: select shift 70 */ - { 103, 0, 73}, /* 14: SELECT shift 73 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ - { 177, 0, 102}, /* 16: nm shift 102 */ - { 16, 0, 176}, /* 17: CASE shift 176 */ - { 71, 0, 67}, /* 18: JOIN_KW shift 67 */ + { 113, 4, 66}, /* 1: STRING shift 66 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 74, 0, 67}, /* 3: JOIN_KW shift 67 */ + { 59, 0, 64}, /* 4: ID shift 64 */ + { 94, 0, 176}, /* 5: PLUS shift 176 */ + { 185, 1, 69}, /* 6: oneselect shift 69 */ + { 79, 0, 68}, /* 7: LP shift 68 */ + { 97, 7, 188}, /* 8: RAISE shift 188 */ + { 85, 10, 170}, /* 9: NOT shift 170 */ + { 49, 11, 169}, /* 10: FLOAT shift 169 */ + { 13, 0, 172}, /* 11: BITNOT shift 172 */ + { 83, 0, 174}, /* 12: MINUS shift 174 */ + { 106, 0, 73}, /* 13: SELECT shift 73 */ + { 157, 9, 288}, /* 14: expr shift 288 */ + { 68, 0, 168}, /* 15: INTEGER shift 168 */ + { 87, 0, 101}, /* 16: NULL shift 101 */ + { 196, 13, 70}, /* 17: select shift 70 */ + { 17, 0, 178}, /* 18: CASE shift 178 */ /* State 70 */ - { 101, 3, 281}, /* 1: RP shift 281 */ - { 176, 1, 71}, /* 2: multiselect_op shift 71 */ - { 66, 0, 162}, /* 3: INTERSECT shift 162 */ - { 118, 5, 160}, /* 4: UNION shift 160 */ - { 43, 0, 163}, /* 5: EXCEPT shift 163 */ + { 180, 0, 71}, /* 1: multiselect_op shift 71 */ + { 121, 3, 162}, /* 2: UNION shift 162 */ + { 46, 0, 165}, /* 3: EXCEPT shift 165 */ + { 69, 0, 164}, /* 4: INTERSECT shift 164 */ + { 104, 4, 287}, /* 5: RP shift 287 */ /* State 71 */ - { 103, 0, 73}, /* 1: SELECT shift 73 */ - { 181, 1, 72}, /* 2: oneselect shift 72 */ + { 106, 0, 73}, /* 1: SELECT shift 73 */ + { 185, 0, 72}, /* 2: oneselect shift 72 */ /* State 73 */ - { 4, 0, 280}, /* 1: ALL shift 280 */ - { 148, 1, 74}, /* 2: distinct shift 74 */ - { 35, 0, 279}, /* 3: DISTINCT shift 279 */ + { 153, 0, 74}, /* 1: distinct shift 74 */ + { 4, 0, 286}, /* 2: ALL shift 286 */ + { 38, 0, 285}, /* 3: DISTINCT shift 285 */ /* State 74 */ - { 190, 0, 272}, /* 1: sclp shift 272 */ - { 191, 0, 75}, /* 2: selcollist shift 75 */ + { 194, 0, 278}, /* 1: sclp shift 278 */ + { 195, 0, 75}, /* 2: selcollist shift 75 */ /* State 75 */ - { 156, 3, 76}, /* 1: from shift 76 */ - { 49, 0, 235}, /* 2: FROM shift 235 */ - { 21, 0, 234}, /* 3: COMMA shift 234 */ + { 22, 0, 236}, /* 1: COMMA shift 236 */ + { 52, 1, 237}, /* 2: FROM shift 237 */ + { 161, 0, 76}, /* 3: from shift 76 */ /* State 76 */ - { 212, 0, 77}, /* 1: where_opt shift 77 */ - { 127, 0, 232}, /* 2: WHERE shift 232 */ + { 130, 0, 234}, /* 1: WHERE shift 234 */ + { 217, 0, 77}, /* 2: where_opt shift 77 */ /* State 77 */ - { 53, 0, 229}, /* 1: GROUP shift 229 */ - { 157, 1, 78}, /* 2: groupby_opt shift 78 */ + { 162, 2, 78}, /* 1: groupby_opt shift 78 */ + { 56, 0, 231}, /* 2: GROUP shift 231 */ /* State 78 */ - { 158, 0, 79}, /* 1: having_opt shift 79 */ - { 55, 0, 227}, /* 2: HAVING shift 227 */ + { 58, 0, 229}, /* 1: HAVING shift 229 */ + { 163, 0, 79}, /* 2: having_opt shift 79 */ /* State 79 */ - { 90, 0, 88}, /* 1: ORDER shift 88 */ - { 183, 0, 80}, /* 2: orderby_opt shift 80 */ + { 93, 0, 88}, /* 1: ORDER shift 88 */ + { 187, 1, 80}, /* 2: orderby_opt shift 80 */ /* State 80 */ - { 75, 0, 82}, /* 1: LIMIT shift 82 */ - { 173, 1, 81}, /* 2: limit_opt shift 81 */ + { 178, 2, 81}, /* 1: limit_opt shift 81 */ + { 78, 0, 82}, /* 2: LIMIT shift 82 */ /* State 82 */ - { 65, 0, 83}, /* 1: INTEGER shift 83 */ + { 68, 0, 83}, /* 1: INTEGER shift 83 */ /* State 83 */ - { 174, 2, 84}, /* 1: limit_sep shift 84 */ - { 21, 0, 87}, /* 2: COMMA shift 87 */ - { 86, 0, 86}, /* 3: OFFSET shift 86 */ + { 22, 0, 86}, /* 1: COMMA shift 86 */ + { 89, 0, 84}, /* 2: OFFSET shift 84 */ /* State 84 */ - { 65, 0, 85}, /* 1: INTEGER shift 85 */ + { 68, 0, 85}, /* 1: INTEGER shift 85 */ /* State 86 */ - { 65, 0, 682}, /* 1: INTEGER reduce 151 */ -/* State 87 */ - { 65, 0, 683}, /* 1: INTEGER reduce 152 */ + { 68, 0, 87}, /* 1: INTEGER shift 87 */ /* State 88 */ - { 14, 0, 89}, /* 1: BY shift 89 */ + { 15, 0, 89}, /* 1: BY shift 89 */ /* State 89 */ - { 76, 0, 68}, /* 1: LP shift 68 */ - { 94, 0, 186}, /* 2: RAISE shift 186 */ - { 46, 5, 167}, /* 3: FLOAT shift 167 */ - { 71, 0, 67}, /* 4: JOIN_KW shift 67 */ - { 12, 0, 170}, /* 5: BITNOT shift 170 */ - { 56, 0, 64}, /* 6: ID shift 64 */ - { 91, 0, 174}, /* 7: PLUS shift 174 */ - { 177, 0, 102}, /* 8: nm shift 102 */ - { 110, 1, 66}, /* 9: STRING shift 66 */ - { 196, 2, 224}, /* 10: sortitem shift 224 */ - { 197, 0, 90}, /* 11: sortlist shift 90 */ - { 65, 0, 166}, /* 12: INTEGER shift 166 */ - { 80, 3, 172}, /* 13: MINUS shift 172 */ - { 84, 16, 101}, /* 14: NULL shift 101 */ - { 82, 12, 168}, /* 15: NOT shift 168 */ - { 16, 0, 176}, /* 16: CASE shift 176 */ - { 152, 14, 98}, /* 17: expr shift 98 */ + { 85, 2, 170}, /* 1: NOT shift 170 */ + { 68, 4, 168}, /* 2: INTEGER shift 168 */ + { 87, 0, 101}, /* 3: NULL shift 101 */ + { 17, 0, 178}, /* 4: CASE shift 178 */ + { 157, 0, 98}, /* 5: expr shift 98 */ + { 113, 8, 66}, /* 6: STRING shift 66 */ + { 74, 0, 67}, /* 7: JOIN_KW shift 67 */ + { 79, 0, 68}, /* 8: LP shift 68 */ + { 59, 0, 64}, /* 9: ID shift 64 */ + { 94, 0, 176}, /* 10: PLUS shift 176 */ + { 13, 0, 172}, /* 11: BITNOT shift 172 */ + { 181, 6, 102}, /* 12: nm shift 102 */ + { 97, 0, 188}, /* 13: RAISE shift 188 */ + { 200, 11, 226}, /* 14: sortitem shift 226 */ + { 201, 0, 90}, /* 15: sortlist shift 90 */ + { 83, 17, 174}, /* 16: MINUS shift 174 */ + { 49, 0, 169}, /* 17: FLOAT shift 169 */ /* State 90 */ - { 21, 0, 91}, /* 1: COMMA shift 91 */ + { 22, 0, 91}, /* 1: COMMA shift 91 */ /* State 91 */ - { 80, 4, 172}, /* 1: MINUS shift 172 */ - { 177, 6, 102}, /* 2: nm shift 102 */ - { 82, 0, 168}, /* 3: NOT shift 168 */ - { 16, 0, 176}, /* 4: CASE shift 176 */ - { 196, 7, 92}, /* 5: sortitem shift 92 */ - { 65, 0, 166}, /* 6: INTEGER shift 166 */ - { 84, 0, 101}, /* 7: NULL shift 101 */ - { 71, 0, 67}, /* 8: JOIN_KW shift 67 */ - { 152, 10, 98}, /* 9: expr shift 98 */ - { 56, 0, 64}, /* 10: ID shift 64 */ - { 12, 0, 170}, /* 11: BITNOT shift 170 */ - { 91, 0, 174}, /* 12: PLUS shift 174 */ - { 76, 11, 68}, /* 13: LP shift 68 */ - { 94, 16, 186}, /* 14: RAISE shift 186 */ - { 110, 14, 66}, /* 15: STRING shift 66 */ - { 46, 0, 167}, /* 16: FLOAT shift 167 */ + { 97, 3, 188}, /* 1: RAISE shift 188 */ + { 113, 1, 66}, /* 2: STRING shift 66 */ + { 49, 7, 169}, /* 3: FLOAT shift 169 */ + { 83, 0, 174}, /* 4: MINUS shift 174 */ + { 68, 0, 168}, /* 5: INTEGER shift 168 */ + { 181, 10, 102}, /* 6: nm shift 102 */ + { 17, 0, 178}, /* 7: CASE shift 178 */ + { 87, 0, 101}, /* 8: NULL shift 101 */ + { 200, 0, 92}, /* 9: sortitem shift 92 */ + { 85, 0, 170}, /* 10: NOT shift 170 */ + { 74, 0, 67}, /* 11: JOIN_KW shift 67 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 13, 0, 172}, /* 13: BITNOT shift 172 */ + { 157, 13, 98}, /* 14: expr shift 98 */ + { 94, 0, 176}, /* 15: PLUS shift 176 */ + { 79, 0, 68}, /* 16: LP shift 68 */ /* State 92 */ - { 138, 0, 93}, /* 1: collate shift 93 */ - { 19, 0, 95}, /* 2: COLLATE shift 95 */ + { 20, 0, 95}, /* 1: COLLATE shift 95 */ + { 141, 0, 93}, /* 2: collate shift 93 */ /* State 93 */ - { 198, 0, 94}, /* 1: sortorder shift 94 */ - { 34, 3, 59}, /* 2: DESC shift 59 */ + { 36, 0, 59}, /* 1: DESC shift 59 */ + { 202, 3, 94}, /* 2: sortorder shift 94 */ { 7, 0, 58}, /* 3: ASC shift 58 */ /* State 95 */ - { 56, 0, 96}, /* 1: ID shift 96 */ - { 159, 0, 97}, /* 2: id shift 97 */ + { 164, 0, 97}, /* 1: id shift 97 */ + { 59, 0, 96}, /* 2: ID shift 96 */ /* State 98 */ - { 88, 2, 106}, /* 1: OR shift 106 */ - { 60, 0, 157}, /* 2: IN shift 157 */ - { 5, 0, 100}, /* 3: AND shift 100 */ - { 68, 0, 148}, /* 4: IS shift 148 */ - { 172, 1, 128}, /* 5: likeop shift 128 */ - { 89, 3, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ - { 13, 0, 122}, /* 7: BITOR shift 122 */ - { 91, 0, 135}, /* 8: PLUS shift 135 */ - { 74, 0, 133}, /* 9: LIKE shift 133 */ - { 78, 0, 108}, /* 10: LT shift 108 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ - { 96, 4, 143}, /* 13: REM shift 143 */ - { 69, 7, 147}, /* 14: ISNULL shift 147 */ - { 42, 0, 118}, /* 15: EQ shift 118 */ - { 80, 17, 137}, /* 16: MINUS shift 137 */ - { 52, 20, 134}, /* 17: GLOB shift 134 */ - { 73, 0, 112}, /* 18: LE shift 112 */ - { 102, 9, 126}, /* 19: RSHIFT shift 126 */ - { 24, 0, 145}, /* 20: CONCAT shift 145 */ - { 54, 0, 110}, /* 21: GT shift 110 */ - { 77, 0, 124}, /* 22: LSHIFT shift 124 */ - { 106, 10, 141}, /* 23: SLASH shift 141 */ - { 51, 0, 114}, /* 24: GE shift 114 */ - { 108, 16, 139}, /* 25: STAR shift 139 */ - { 81, 0, 116}, /* 26: NE shift 116 */ - { 82, 21, 130}, /* 27: NOT shift 130 */ - { 83, 0, 152}, /* 28: NOTNULL shift 152 */ + { 84, 0, 118}, /* 1: NE shift 118 */ + { 85, 4, 132}, /* 2: NOT shift 132 */ + { 86, 0, 154}, /* 3: NOTNULL shift 154 */ + { 57, 0, 112}, /* 4: GT shift 112 */ + { 63, 0, 159}, /* 5: IN shift 159 */ + { 5, 0, 100}, /* 6: AND shift 100 */ + { 71, 0, 150}, /* 7: IS shift 150 */ + { 91, 5, 108}, /* 8: OR shift 108 */ + { 92, 0, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 10: likeop shift 130 */ + { 94, 0, 137}, /* 11: PLUS shift 137 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 12, 0, 122}, /* 13: BITAND shift 122 */ + { 77, 0, 135}, /* 14: LIKE shift 135 */ + { 14, 0, 124}, /* 15: BITOR shift 124 */ + { 99, 7, 145}, /* 16: REM shift 145 */ + { 72, 0, 149}, /* 17: ISNULL shift 149 */ + { 45, 0, 120}, /* 18: EQ shift 120 */ + { 81, 20, 110}, /* 19: LT shift 110 */ + { 25, 0, 147}, /* 20: CONCAT shift 147 */ + { 76, 0, 114}, /* 21: LE shift 114 */ + { 105, 14, 128}, /* 22: RSHIFT shift 128 */ + { 83, 24, 139}, /* 23: MINUS shift 139 */ + { 55, 0, 136}, /* 24: GLOB shift 136 */ + { 80, 0, 126}, /* 25: LSHIFT shift 126 */ + { 109, 19, 143}, /* 26: SLASH shift 143 */ + { 54, 0, 116}, /* 27: GE shift 116 */ + { 111, 23, 141}, /* 28: STAR shift 141 */ /* State 100 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 105}, /* 3: expr shift 105 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 107}, /* 8: expr shift 107 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 102 */ - { 36, 0, 103}, /* 1: DOT shift 103 */ + { 39, 0, 103}, /* 1: DOT shift 103 */ /* State 103 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 104}, /* 2: nm shift 104 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 104}, /* 2: nm shift 104 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ +/* State 104 */ + { 39, 0, 105}, /* 1: DOT shift 105 */ /* State 105 */ - { 78, 2, 108}, /* 1: LT shift 108 */ - { 52, 0, 134}, /* 2: GLOB shift 134 */ - { 106, 7, 141}, /* 3: SLASH shift 141 */ - { 81, 0, 116}, /* 4: NE shift 116 */ - { 108, 8, 139}, /* 5: STAR shift 139 */ - { 83, 0, 152}, /* 6: NOTNULL shift 152 */ - { 80, 10, 137}, /* 7: MINUS shift 137 */ - { 82, 0, 130}, /* 8: NOT shift 130 */ - { 60, 0, 157}, /* 9: IN shift 157 */ - { 54, 0, 110}, /* 10: GT shift 110 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 89, 13, 99}, /* 12: ORACLE_OUTER_JOIN shift 99 */ - { 11, 0, 120}, /* 13: BITAND shift 120 */ - { 91, 15, 135}, /* 14: PLUS shift 135 */ - { 13, 0, 122}, /* 15: BITOR shift 122 */ - { 68, 20, 148}, /* 16: IS shift 148 */ - { 172, 16, 128}, /* 17: likeop shift 128 */ - { 69, 0, 147}, /* 18: ISNULL shift 147 */ - { 96, 0, 143}, /* 19: REM shift 143 */ - { 42, 0, 118}, /* 20: EQ shift 118 */ - { 24, 0, 145}, /* 21: CONCAT shift 145 */ - { 73, 0, 112}, /* 22: LE shift 112 */ - { 74, 0, 133}, /* 23: LIKE shift 133 */ - { 51, 0, 114}, /* 24: GE shift 114 */ - { 102, 21, 126}, /* 25: RSHIFT shift 126 */ - { 77, 24, 124}, /* 26: LSHIFT shift 124 */ -/* State 106 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 107}, /* 3: expr shift 107 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 106}, /* 2: nm shift 106 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 107 */ - { 108, 4, 139}, /* 1: STAR shift 139 */ - { 82, 0, 130}, /* 2: NOT shift 130 */ - { 83, 0, 152}, /* 3: NOTNULL shift 152 */ - { 81, 5, 116}, /* 4: NE shift 116 */ - { 54, 0, 110}, /* 5: GT shift 110 */ - { 5, 0, 100}, /* 6: AND shift 100 */ - { 60, 0, 157}, /* 7: IN shift 157 */ - { 91, 10, 135}, /* 8: PLUS shift 135 */ - { 89, 0, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ - { 10, 0, 153}, /* 10: BETWEEN shift 153 */ - { 172, 8, 128}, /* 11: likeop shift 128 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ - { 69, 17, 147}, /* 13: ISNULL shift 147 */ - { 13, 0, 122}, /* 14: BITOR shift 122 */ - { 68, 0, 148}, /* 15: IS shift 148 */ - { 96, 13, 143}, /* 16: REM shift 143 */ - { 42, 0, 118}, /* 17: EQ shift 118 */ - { 51, 19, 114}, /* 18: GE shift 114 */ - { 24, 0, 145}, /* 19: CONCAT shift 145 */ - { 73, 0, 112}, /* 20: LE shift 112 */ - { 74, 0, 133}, /* 21: LIKE shift 133 */ - { 102, 0, 126}, /* 22: RSHIFT shift 126 */ - { 52, 0, 134}, /* 23: GLOB shift 134 */ - { 77, 0, 124}, /* 24: LSHIFT shift 124 */ - { 78, 18, 108}, /* 25: LT shift 108 */ - { 106, 23, 141}, /* 26: SLASH shift 141 */ - { 80, 0, 137}, /* 27: MINUS shift 137 */ + { 54, 0, 116}, /* 1: GE shift 116 */ + { 105, 0, 128}, /* 2: RSHIFT shift 128 */ + { 80, 1, 126}, /* 3: LSHIFT shift 126 */ + { 81, 5, 110}, /* 4: LT shift 110 */ + { 55, 0, 136}, /* 5: GLOB shift 136 */ + { 109, 10, 143}, /* 6: SLASH shift 143 */ + { 84, 0, 118}, /* 7: NE shift 118 */ + { 111, 11, 141}, /* 8: STAR shift 141 */ + { 86, 0, 154}, /* 9: NOTNULL shift 154 */ + { 83, 14, 139}, /* 10: MINUS shift 139 */ + { 85, 0, 132}, /* 11: NOT shift 132 */ + { 63, 16, 159}, /* 12: IN shift 159 */ + { 12, 0, 122}, /* 13: BITAND shift 122 */ + { 57, 0, 112}, /* 14: GT shift 112 */ + { 92, 18, 99}, /* 15: ORACLE_OUTER_JOIN shift 99 */ + { 11, 0, 155}, /* 16: BETWEEN shift 155 */ + { 94, 0, 137}, /* 17: PLUS shift 137 */ + { 14, 0, 124}, /* 18: BITOR shift 124 */ + { 45, 0, 120}, /* 19: EQ shift 120 */ + { 71, 19, 150}, /* 20: IS shift 150 */ + { 72, 0, 149}, /* 21: ISNULL shift 149 */ + { 177, 23, 130}, /* 22: likeop shift 130 */ + { 99, 0, 145}, /* 23: REM shift 145 */ + { 25, 0, 147}, /* 24: CONCAT shift 147 */ + { 76, 0, 114}, /* 25: LE shift 114 */ + { 77, 24, 135}, /* 26: LIKE shift 135 */ /* State 108 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 109}, /* 3: expr shift 109 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 109}, /* 8: expr shift 109 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 109 */ - { 108, 3, 139}, /* 1: STAR shift 139 */ - { 13, 0, 122}, /* 2: BITOR shift 122 */ - { 96, 4, 143}, /* 3: REM shift 143 */ - { 24, 0, 145}, /* 4: CONCAT shift 145 */ - { 172, 0, 128}, /* 5: likeop shift 128 */ - { 89, 10, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ - { 102, 0, 126}, /* 7: RSHIFT shift 126 */ - { 91, 0, 135}, /* 8: PLUS shift 135 */ - { 80, 0, 137}, /* 9: MINUS shift 137 */ - { 77, 0, 124}, /* 10: LSHIFT shift 124 */ - { 106, 0, 141}, /* 11: SLASH shift 141 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ + { 81, 7, 110}, /* 1: LT shift 110 */ + { 109, 8, 143}, /* 2: SLASH shift 143 */ + { 83, 0, 139}, /* 3: MINUS shift 139 */ + { 111, 9, 141}, /* 4: STAR shift 141 */ + { 85, 0, 132}, /* 5: NOT shift 132 */ + { 86, 11, 154}, /* 6: NOTNULL shift 154 */ + { 54, 0, 116}, /* 7: GE shift 116 */ + { 55, 0, 136}, /* 8: GLOB shift 136 */ + { 84, 17, 118}, /* 9: NE shift 118 */ + { 63, 0, 159}, /* 10: IN shift 159 */ + { 5, 0, 100}, /* 11: AND shift 100 */ + { 92, 20, 99}, /* 12: ORACLE_OUTER_JOIN shift 99 */ + { 12, 0, 122}, /* 13: BITAND shift 122 */ + { 94, 0, 137}, /* 14: PLUS shift 137 */ + { 14, 0, 124}, /* 15: BITOR shift 124 */ + { 177, 0, 130}, /* 16: likeop shift 130 */ + { 57, 0, 112}, /* 17: GT shift 112 */ + { 71, 0, 150}, /* 18: IS shift 150 */ + { 99, 21, 145}, /* 19: REM shift 145 */ + { 11, 0, 155}, /* 20: BETWEEN shift 155 */ + { 72, 22, 149}, /* 21: ISNULL shift 149 */ + { 45, 0, 120}, /* 22: EQ shift 120 */ + { 76, 0, 114}, /* 23: LE shift 114 */ + { 77, 0, 135}, /* 24: LIKE shift 135 */ + { 105, 0, 128}, /* 25: RSHIFT shift 128 */ + { 25, 0, 147}, /* 26: CONCAT shift 147 */ + { 80, 0, 126}, /* 27: LSHIFT shift 126 */ /* State 110 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 111}, /* 3: expr shift 111 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 111}, /* 8: expr shift 111 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 111 */ - { 108, 3, 139}, /* 1: STAR shift 139 */ - { 13, 0, 122}, /* 2: BITOR shift 122 */ - { 96, 4, 143}, /* 3: REM shift 143 */ - { 24, 0, 145}, /* 4: CONCAT shift 145 */ - { 172, 0, 128}, /* 5: likeop shift 128 */ - { 89, 10, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ - { 102, 0, 126}, /* 7: RSHIFT shift 126 */ - { 91, 0, 135}, /* 8: PLUS shift 135 */ - { 80, 0, 137}, /* 9: MINUS shift 137 */ - { 77, 0, 124}, /* 10: LSHIFT shift 124 */ - { 106, 0, 141}, /* 11: SLASH shift 141 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ + { 12, 0, 122}, /* 1: BITAND shift 122 */ + { 109, 5, 143}, /* 2: SLASH shift 143 */ + { 14, 0, 124}, /* 3: BITOR shift 124 */ + { 111, 6, 141}, /* 4: STAR shift 141 */ + { 25, 0, 147}, /* 5: CONCAT shift 147 */ + { 99, 0, 145}, /* 6: REM shift 145 */ + { 80, 0, 126}, /* 7: LSHIFT shift 126 */ + { 105, 0, 128}, /* 8: RSHIFT shift 128 */ + { 92, 7, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ + { 177, 8, 130}, /* 10: likeop shift 130 */ + { 94, 0, 137}, /* 11: PLUS shift 137 */ + { 83, 0, 139}, /* 12: MINUS shift 139 */ /* State 112 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 113}, /* 3: expr shift 113 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 113}, /* 8: expr shift 113 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 113 */ - { 108, 3, 139}, /* 1: STAR shift 139 */ - { 13, 0, 122}, /* 2: BITOR shift 122 */ - { 96, 4, 143}, /* 3: REM shift 143 */ - { 24, 0, 145}, /* 4: CONCAT shift 145 */ - { 172, 0, 128}, /* 5: likeop shift 128 */ - { 89, 10, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ - { 102, 0, 126}, /* 7: RSHIFT shift 126 */ - { 91, 0, 135}, /* 8: PLUS shift 135 */ - { 80, 0, 137}, /* 9: MINUS shift 137 */ - { 77, 0, 124}, /* 10: LSHIFT shift 124 */ - { 106, 0, 141}, /* 11: SLASH shift 141 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ + { 12, 0, 122}, /* 1: BITAND shift 122 */ + { 109, 5, 143}, /* 2: SLASH shift 143 */ + { 14, 0, 124}, /* 3: BITOR shift 124 */ + { 111, 6, 141}, /* 4: STAR shift 141 */ + { 25, 0, 147}, /* 5: CONCAT shift 147 */ + { 99, 0, 145}, /* 6: REM shift 145 */ + { 80, 0, 126}, /* 7: LSHIFT shift 126 */ + { 105, 0, 128}, /* 8: RSHIFT shift 128 */ + { 92, 7, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ + { 177, 8, 130}, /* 10: likeop shift 130 */ + { 94, 0, 137}, /* 11: PLUS shift 137 */ + { 83, 0, 139}, /* 12: MINUS shift 139 */ /* State 114 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 115}, /* 3: expr shift 115 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 115}, /* 8: expr shift 115 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 115 */ - { 108, 3, 139}, /* 1: STAR shift 139 */ - { 13, 0, 122}, /* 2: BITOR shift 122 */ - { 96, 4, 143}, /* 3: REM shift 143 */ - { 24, 0, 145}, /* 4: CONCAT shift 145 */ - { 172, 0, 128}, /* 5: likeop shift 128 */ - { 89, 10, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ - { 102, 0, 126}, /* 7: RSHIFT shift 126 */ - { 91, 0, 135}, /* 8: PLUS shift 135 */ - { 80, 0, 137}, /* 9: MINUS shift 137 */ - { 77, 0, 124}, /* 10: LSHIFT shift 124 */ - { 106, 0, 141}, /* 11: SLASH shift 141 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ + { 12, 0, 122}, /* 1: BITAND shift 122 */ + { 109, 5, 143}, /* 2: SLASH shift 143 */ + { 14, 0, 124}, /* 3: BITOR shift 124 */ + { 111, 6, 141}, /* 4: STAR shift 141 */ + { 25, 0, 147}, /* 5: CONCAT shift 147 */ + { 99, 0, 145}, /* 6: REM shift 145 */ + { 80, 0, 126}, /* 7: LSHIFT shift 126 */ + { 105, 0, 128}, /* 8: RSHIFT shift 128 */ + { 92, 7, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ + { 177, 8, 130}, /* 10: likeop shift 130 */ + { 94, 0, 137}, /* 11: PLUS shift 137 */ + { 83, 0, 139}, /* 12: MINUS shift 139 */ /* State 116 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 117}, /* 3: expr shift 117 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 117}, /* 8: expr shift 117 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 117 */ - { 96, 2, 143}, /* 1: REM shift 143 */ - { 80, 0, 137}, /* 2: MINUS shift 137 */ - { 54, 0, 110}, /* 3: GT shift 110 */ - { 51, 0, 114}, /* 4: GE shift 114 */ - { 73, 0, 112}, /* 5: LE shift 112 */ - { 11, 0, 120}, /* 6: BITAND shift 120 */ - { 102, 3, 126}, /* 7: RSHIFT shift 126 */ - { 108, 0, 139}, /* 8: STAR shift 139 */ - { 24, 0, 145}, /* 9: CONCAT shift 145 */ - { 89, 5, 99}, /* 10: ORACLE_OUTER_JOIN shift 99 */ - { 106, 0, 141}, /* 11: SLASH shift 141 */ - { 91, 6, 135}, /* 12: PLUS shift 135 */ - { 172, 8, 128}, /* 13: likeop shift 128 */ - { 77, 16, 124}, /* 14: LSHIFT shift 124 */ - { 78, 0, 108}, /* 15: LT shift 108 */ - { 13, 0, 122}, /* 16: BITOR shift 122 */ + { 12, 0, 122}, /* 1: BITAND shift 122 */ + { 109, 5, 143}, /* 2: SLASH shift 143 */ + { 14, 0, 124}, /* 3: BITOR shift 124 */ + { 111, 6, 141}, /* 4: STAR shift 141 */ + { 25, 0, 147}, /* 5: CONCAT shift 147 */ + { 99, 0, 145}, /* 6: REM shift 145 */ + { 80, 0, 126}, /* 7: LSHIFT shift 126 */ + { 105, 0, 128}, /* 8: RSHIFT shift 128 */ + { 92, 7, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ + { 177, 8, 130}, /* 10: likeop shift 130 */ + { 94, 0, 137}, /* 11: PLUS shift 137 */ + { 83, 0, 139}, /* 12: MINUS shift 139 */ /* State 118 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 119}, /* 3: expr shift 119 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 119}, /* 8: expr shift 119 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 119 */ - { 96, 2, 143}, /* 1: REM shift 143 */ - { 80, 0, 137}, /* 2: MINUS shift 137 */ - { 54, 0, 110}, /* 3: GT shift 110 */ - { 51, 0, 114}, /* 4: GE shift 114 */ - { 73, 0, 112}, /* 5: LE shift 112 */ - { 11, 0, 120}, /* 6: BITAND shift 120 */ - { 102, 3, 126}, /* 7: RSHIFT shift 126 */ - { 108, 0, 139}, /* 8: STAR shift 139 */ - { 24, 0, 145}, /* 9: CONCAT shift 145 */ - { 89, 5, 99}, /* 10: ORACLE_OUTER_JOIN shift 99 */ - { 106, 0, 141}, /* 11: SLASH shift 141 */ - { 91, 6, 135}, /* 12: PLUS shift 135 */ - { 172, 8, 128}, /* 13: likeop shift 128 */ - { 77, 16, 124}, /* 14: LSHIFT shift 124 */ - { 78, 0, 108}, /* 15: LT shift 108 */ - { 13, 0, 122}, /* 16: BITOR shift 122 */ + { 80, 0, 126}, /* 1: LSHIFT shift 126 */ + { 177, 3, 130}, /* 2: likeop shift 130 */ + { 81, 0, 110}, /* 3: LT shift 110 */ + { 99, 5, 145}, /* 4: REM shift 145 */ + { 83, 0, 139}, /* 5: MINUS shift 139 */ + { 57, 8, 112}, /* 6: GT shift 112 */ + { 54, 0, 116}, /* 7: GE shift 116 */ + { 25, 0, 147}, /* 8: CONCAT shift 147 */ + { 76, 11, 114}, /* 9: LE shift 114 */ + { 105, 6, 128}, /* 10: RSHIFT shift 128 */ + { 12, 0, 122}, /* 11: BITAND shift 122 */ + { 14, 0, 124}, /* 12: BITOR shift 124 */ + { 92, 9, 99}, /* 13: ORACLE_OUTER_JOIN shift 99 */ + { 109, 0, 143}, /* 14: SLASH shift 143 */ + { 94, 12, 137}, /* 15: PLUS shift 137 */ + { 111, 0, 141}, /* 16: STAR shift 141 */ /* State 120 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 121}, /* 3: expr shift 121 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 121}, /* 8: expr shift 121 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 121 */ - { 96, 6, 143}, /* 1: REM shift 143 */ - { 89, 0, 99}, /* 2: ORACLE_OUTER_JOIN shift 99 */ - { 106, 0, 141}, /* 3: SLASH shift 141 */ - { 91, 0, 135}, /* 4: PLUS shift 135 */ - { 172, 7, 128}, /* 5: likeop shift 128 */ - { 80, 8, 137}, /* 6: MINUS shift 137 */ - { 108, 0, 139}, /* 7: STAR shift 139 */ - { 24, 0, 145}, /* 8: CONCAT shift 145 */ + { 80, 0, 126}, /* 1: LSHIFT shift 126 */ + { 177, 3, 130}, /* 2: likeop shift 130 */ + { 81, 0, 110}, /* 3: LT shift 110 */ + { 99, 5, 145}, /* 4: REM shift 145 */ + { 83, 0, 139}, /* 5: MINUS shift 139 */ + { 57, 8, 112}, /* 6: GT shift 112 */ + { 54, 0, 116}, /* 7: GE shift 116 */ + { 25, 0, 147}, /* 8: CONCAT shift 147 */ + { 76, 11, 114}, /* 9: LE shift 114 */ + { 105, 6, 128}, /* 10: RSHIFT shift 128 */ + { 12, 0, 122}, /* 11: BITAND shift 122 */ + { 14, 0, 124}, /* 12: BITOR shift 124 */ + { 92, 9, 99}, /* 13: ORACLE_OUTER_JOIN shift 99 */ + { 109, 0, 143}, /* 14: SLASH shift 143 */ + { 94, 12, 137}, /* 15: PLUS shift 137 */ + { 111, 0, 141}, /* 16: STAR shift 141 */ /* State 122 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 123}, /* 3: expr shift 123 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 123}, /* 8: expr shift 123 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 123 */ - { 96, 6, 143}, /* 1: REM shift 143 */ - { 89, 0, 99}, /* 2: ORACLE_OUTER_JOIN shift 99 */ - { 106, 0, 141}, /* 3: SLASH shift 141 */ - { 91, 0, 135}, /* 4: PLUS shift 135 */ - { 172, 7, 128}, /* 5: likeop shift 128 */ - { 80, 8, 137}, /* 6: MINUS shift 137 */ - { 108, 0, 139}, /* 7: STAR shift 139 */ - { 24, 0, 145}, /* 8: CONCAT shift 145 */ + { 25, 0, 147}, /* 1: CONCAT shift 147 */ + { 177, 1, 130}, /* 2: likeop shift 130 */ + { 83, 0, 139}, /* 3: MINUS shift 139 */ + { 99, 3, 145}, /* 4: REM shift 145 */ + { 92, 0, 99}, /* 5: ORACLE_OUTER_JOIN shift 99 */ + { 109, 0, 143}, /* 6: SLASH shift 143 */ + { 94, 0, 137}, /* 7: PLUS shift 137 */ + { 111, 0, 141}, /* 8: STAR shift 141 */ /* State 124 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 125}, /* 3: expr shift 125 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 125}, /* 8: expr shift 125 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 125 */ - { 96, 6, 143}, /* 1: REM shift 143 */ - { 89, 0, 99}, /* 2: ORACLE_OUTER_JOIN shift 99 */ - { 106, 0, 141}, /* 3: SLASH shift 141 */ - { 91, 0, 135}, /* 4: PLUS shift 135 */ - { 172, 7, 128}, /* 5: likeop shift 128 */ - { 80, 8, 137}, /* 6: MINUS shift 137 */ - { 108, 0, 139}, /* 7: STAR shift 139 */ - { 24, 0, 145}, /* 8: CONCAT shift 145 */ + { 25, 0, 147}, /* 1: CONCAT shift 147 */ + { 177, 1, 130}, /* 2: likeop shift 130 */ + { 83, 0, 139}, /* 3: MINUS shift 139 */ + { 99, 3, 145}, /* 4: REM shift 145 */ + { 92, 0, 99}, /* 5: ORACLE_OUTER_JOIN shift 99 */ + { 109, 0, 143}, /* 6: SLASH shift 143 */ + { 94, 0, 137}, /* 7: PLUS shift 137 */ + { 111, 0, 141}, /* 8: STAR shift 141 */ /* State 126 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 127}, /* 3: expr shift 127 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 127}, /* 8: expr shift 127 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 127 */ - { 96, 6, 143}, /* 1: REM shift 143 */ - { 89, 0, 99}, /* 2: ORACLE_OUTER_JOIN shift 99 */ - { 106, 0, 141}, /* 3: SLASH shift 141 */ - { 91, 0, 135}, /* 4: PLUS shift 135 */ - { 172, 7, 128}, /* 5: likeop shift 128 */ - { 80, 8, 137}, /* 6: MINUS shift 137 */ - { 108, 0, 139}, /* 7: STAR shift 139 */ - { 24, 0, 145}, /* 8: CONCAT shift 145 */ + { 25, 0, 147}, /* 1: CONCAT shift 147 */ + { 177, 1, 130}, /* 2: likeop shift 130 */ + { 83, 0, 139}, /* 3: MINUS shift 139 */ + { 99, 3, 145}, /* 4: REM shift 145 */ + { 92, 0, 99}, /* 5: ORACLE_OUTER_JOIN shift 99 */ + { 109, 0, 143}, /* 6: SLASH shift 143 */ + { 94, 0, 137}, /* 7: PLUS shift 137 */ + { 111, 0, 141}, /* 8: STAR shift 141 */ /* State 128 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 129}, /* 3: expr shift 129 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 129}, /* 8: expr shift 129 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 129 */ - { 96, 2, 143}, /* 1: REM shift 143 */ - { 80, 0, 137}, /* 2: MINUS shift 137 */ - { 54, 0, 110}, /* 3: GT shift 110 */ - { 51, 0, 114}, /* 4: GE shift 114 */ - { 73, 0, 112}, /* 5: LE shift 112 */ - { 11, 0, 120}, /* 6: BITAND shift 120 */ - { 102, 3, 126}, /* 7: RSHIFT shift 126 */ - { 108, 0, 139}, /* 8: STAR shift 139 */ - { 24, 0, 145}, /* 9: CONCAT shift 145 */ - { 89, 5, 99}, /* 10: ORACLE_OUTER_JOIN shift 99 */ - { 106, 0, 141}, /* 11: SLASH shift 141 */ - { 91, 6, 135}, /* 12: PLUS shift 135 */ - { 172, 8, 128}, /* 13: likeop shift 128 */ - { 77, 16, 124}, /* 14: LSHIFT shift 124 */ - { 78, 0, 108}, /* 15: LT shift 108 */ - { 13, 0, 122}, /* 16: BITOR shift 122 */ + { 25, 0, 147}, /* 1: CONCAT shift 147 */ + { 177, 1, 130}, /* 2: likeop shift 130 */ + { 83, 0, 139}, /* 3: MINUS shift 139 */ + { 99, 3, 145}, /* 4: REM shift 145 */ + { 92, 0, 99}, /* 5: ORACLE_OUTER_JOIN shift 99 */ + { 109, 0, 143}, /* 6: SLASH shift 143 */ + { 94, 0, 137}, /* 7: PLUS shift 137 */ + { 111, 0, 141}, /* 8: STAR shift 141 */ /* State 130 */ - { 84, 2, 213}, /* 1: NULL shift 213 */ - { 60, 0, 218}, /* 2: IN shift 218 */ - { 74, 0, 133}, /* 3: LIKE shift 133 */ - { 52, 6, 134}, /* 4: GLOB shift 134 */ - { 172, 4, 131}, /* 5: likeop shift 131 */ - { 10, 0, 214}, /* 6: BETWEEN shift 214 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 131}, /* 8: expr shift 131 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 131 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 132}, /* 3: expr shift 132 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 80, 0, 126}, /* 1: LSHIFT shift 126 */ + { 177, 3, 130}, /* 2: likeop shift 130 */ + { 81, 0, 110}, /* 3: LT shift 110 */ + { 99, 5, 145}, /* 4: REM shift 145 */ + { 83, 0, 139}, /* 5: MINUS shift 139 */ + { 57, 8, 112}, /* 6: GT shift 112 */ + { 54, 0, 116}, /* 7: GE shift 116 */ + { 25, 0, 147}, /* 8: CONCAT shift 147 */ + { 76, 11, 114}, /* 9: LE shift 114 */ + { 105, 6, 128}, /* 10: RSHIFT shift 128 */ + { 12, 0, 122}, /* 11: BITAND shift 122 */ + { 14, 0, 124}, /* 12: BITOR shift 124 */ + { 92, 9, 99}, /* 13: ORACLE_OUTER_JOIN shift 99 */ + { 109, 0, 143}, /* 14: SLASH shift 143 */ + { 94, 12, 137}, /* 15: PLUS shift 137 */ + { 111, 0, 141}, /* 16: STAR shift 141 */ /* State 132 */ - { 96, 2, 143}, /* 1: REM shift 143 */ - { 80, 0, 137}, /* 2: MINUS shift 137 */ - { 54, 0, 110}, /* 3: GT shift 110 */ - { 51, 0, 114}, /* 4: GE shift 114 */ - { 73, 0, 112}, /* 5: LE shift 112 */ - { 11, 0, 120}, /* 6: BITAND shift 120 */ - { 102, 3, 126}, /* 7: RSHIFT shift 126 */ - { 108, 0, 139}, /* 8: STAR shift 139 */ - { 24, 0, 145}, /* 9: CONCAT shift 145 */ - { 89, 5, 99}, /* 10: ORACLE_OUTER_JOIN shift 99 */ - { 106, 0, 141}, /* 11: SLASH shift 141 */ - { 91, 6, 135}, /* 12: PLUS shift 135 */ - { 172, 8, 128}, /* 13: likeop shift 128 */ - { 77, 16, 124}, /* 14: LSHIFT shift 124 */ - { 78, 0, 108}, /* 15: LT shift 108 */ - { 13, 0, 122}, /* 16: BITOR shift 122 */ -/* State 135 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 136}, /* 3: expr shift 136 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ -/* State 136 */ - { 108, 2, 139}, /* 1: STAR shift 139 */ - { 96, 3, 143}, /* 2: REM shift 143 */ - { 24, 0, 145}, /* 3: CONCAT shift 145 */ - { 106, 0, 141}, /* 4: SLASH shift 141 */ - { 172, 4, 128}, /* 5: likeop shift 128 */ - { 89, 0, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ + { 87, 3, 215}, /* 1: NULL shift 215 */ + { 55, 0, 136}, /* 2: GLOB shift 136 */ + { 63, 0, 220}, /* 3: IN shift 220 */ + { 177, 1, 133}, /* 4: likeop shift 133 */ + { 11, 0, 216}, /* 5: BETWEEN shift 216 */ + { 77, 5, 135}, /* 6: LIKE shift 135 */ +/* State 133 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 134}, /* 8: expr shift 134 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ +/* State 134 */ + { 80, 0, 126}, /* 1: LSHIFT shift 126 */ + { 177, 3, 130}, /* 2: likeop shift 130 */ + { 81, 0, 110}, /* 3: LT shift 110 */ + { 99, 5, 145}, /* 4: REM shift 145 */ + { 83, 0, 139}, /* 5: MINUS shift 139 */ + { 57, 8, 112}, /* 6: GT shift 112 */ + { 54, 0, 116}, /* 7: GE shift 116 */ + { 25, 0, 147}, /* 8: CONCAT shift 147 */ + { 76, 11, 114}, /* 9: LE shift 114 */ + { 105, 6, 128}, /* 10: RSHIFT shift 128 */ + { 12, 0, 122}, /* 11: BITAND shift 122 */ + { 14, 0, 124}, /* 12: BITOR shift 124 */ + { 92, 9, 99}, /* 13: ORACLE_OUTER_JOIN shift 99 */ + { 109, 0, 143}, /* 14: SLASH shift 143 */ + { 94, 12, 137}, /* 15: PLUS shift 137 */ + { 111, 0, 141}, /* 16: STAR shift 141 */ /* State 137 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 138}, /* 3: expr shift 138 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 138}, /* 8: expr shift 138 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 138 */ - { 108, 2, 139}, /* 1: STAR shift 139 */ - { 96, 3, 143}, /* 2: REM shift 143 */ - { 24, 0, 145}, /* 3: CONCAT shift 145 */ - { 106, 0, 141}, /* 4: SLASH shift 141 */ - { 172, 4, 128}, /* 5: likeop shift 128 */ - { 89, 0, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ + { 25, 0, 147}, /* 1: CONCAT shift 147 */ + { 109, 1, 143}, /* 2: SLASH shift 143 */ + { 92, 0, 99}, /* 3: ORACLE_OUTER_JOIN shift 99 */ + { 177, 5, 130}, /* 4: likeop shift 130 */ + { 111, 6, 141}, /* 5: STAR shift 141 */ + { 99, 0, 145}, /* 6: REM shift 145 */ /* State 139 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 140}, /* 3: expr shift 140 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 140}, /* 8: expr shift 140 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 140 */ - { 24, 0, 145}, /* 1: CONCAT shift 145 */ - { 172, 0, 128}, /* 2: likeop shift 128 */ - { 89, 0, 99}, /* 3: ORACLE_OUTER_JOIN shift 99 */ + { 25, 0, 147}, /* 1: CONCAT shift 147 */ + { 109, 1, 143}, /* 2: SLASH shift 143 */ + { 92, 0, 99}, /* 3: ORACLE_OUTER_JOIN shift 99 */ + { 177, 5, 130}, /* 4: likeop shift 130 */ + { 111, 6, 141}, /* 5: STAR shift 141 */ + { 99, 0, 145}, /* 6: REM shift 145 */ /* State 141 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 142}, /* 3: expr shift 142 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 142}, /* 8: expr shift 142 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 142 */ - { 24, 0, 145}, /* 1: CONCAT shift 145 */ - { 172, 0, 128}, /* 2: likeop shift 128 */ - { 89, 0, 99}, /* 3: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 1: likeop shift 130 */ + { 25, 0, 147}, /* 2: CONCAT shift 147 */ + { 92, 0, 99}, /* 3: ORACLE_OUTER_JOIN shift 99 */ /* State 143 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 144}, /* 3: expr shift 144 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 144}, /* 8: expr shift 144 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 144 */ - { 24, 0, 145}, /* 1: CONCAT shift 145 */ - { 172, 0, 128}, /* 2: likeop shift 128 */ - { 89, 0, 99}, /* 3: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 1: likeop shift 130 */ + { 25, 0, 147}, /* 2: CONCAT shift 147 */ + { 92, 0, 99}, /* 3: ORACLE_OUTER_JOIN shift 99 */ /* State 145 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 146}, /* 3: expr shift 146 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 146}, /* 8: expr shift 146 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 146 */ - { 172, 0, 128}, /* 1: likeop shift 128 */ - { 89, 0, 99}, /* 2: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 1: likeop shift 130 */ + { 25, 0, 147}, /* 2: CONCAT shift 147 */ + { 92, 0, 99}, /* 3: ORACLE_OUTER_JOIN shift 99 */ +/* State 147 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 148}, /* 8: expr shift 148 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 148 */ - { 84, 2, 149}, /* 1: NULL shift 149 */ - { 82, 0, 150}, /* 2: NOT shift 150 */ + { 92, 0, 99}, /* 1: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 2: likeop shift 130 */ /* State 150 */ - { 84, 0, 151}, /* 1: NULL shift 151 */ -/* State 153 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 154}, /* 3: expr shift 154 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ -/* State 154 */ - { 88, 2, 106}, /* 1: OR shift 106 */ - { 60, 0, 157}, /* 2: IN shift 157 */ - { 5, 0, 155}, /* 3: AND shift 155 */ - { 68, 0, 148}, /* 4: IS shift 148 */ - { 172, 1, 128}, /* 5: likeop shift 128 */ - { 89, 3, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ - { 13, 0, 122}, /* 7: BITOR shift 122 */ - { 91, 0, 135}, /* 8: PLUS shift 135 */ - { 74, 0, 133}, /* 9: LIKE shift 133 */ - { 78, 0, 108}, /* 10: LT shift 108 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ - { 96, 4, 143}, /* 13: REM shift 143 */ - { 69, 7, 147}, /* 14: ISNULL shift 147 */ - { 42, 0, 118}, /* 15: EQ shift 118 */ - { 80, 17, 137}, /* 16: MINUS shift 137 */ - { 52, 20, 134}, /* 17: GLOB shift 134 */ - { 73, 0, 112}, /* 18: LE shift 112 */ - { 102, 9, 126}, /* 19: RSHIFT shift 126 */ - { 24, 0, 145}, /* 20: CONCAT shift 145 */ - { 54, 0, 110}, /* 21: GT shift 110 */ - { 77, 0, 124}, /* 22: LSHIFT shift 124 */ - { 106, 10, 141}, /* 23: SLASH shift 141 */ - { 51, 0, 114}, /* 24: GE shift 114 */ - { 108, 16, 139}, /* 25: STAR shift 139 */ - { 81, 0, 116}, /* 26: NE shift 116 */ - { 82, 21, 130}, /* 27: NOT shift 130 */ - { 83, 0, 152}, /* 28: NOTNULL shift 152 */ + { 85, 0, 152}, /* 1: NOT shift 152 */ + { 87, 1, 151}, /* 2: NULL shift 151 */ +/* State 152 */ + { 87, 0, 153}, /* 1: NULL shift 153 */ /* State 155 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 156}, /* 3: expr shift 156 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 156}, /* 8: expr shift 156 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 156 */ - { 96, 2, 143}, /* 1: REM shift 143 */ - { 80, 0, 137}, /* 2: MINUS shift 137 */ - { 54, 0, 110}, /* 3: GT shift 110 */ - { 51, 0, 114}, /* 4: GE shift 114 */ - { 73, 0, 112}, /* 5: LE shift 112 */ - { 11, 0, 120}, /* 6: BITAND shift 120 */ - { 102, 3, 126}, /* 7: RSHIFT shift 126 */ - { 108, 0, 139}, /* 8: STAR shift 139 */ - { 24, 0, 145}, /* 9: CONCAT shift 145 */ - { 89, 5, 99}, /* 10: ORACLE_OUTER_JOIN shift 99 */ - { 106, 0, 141}, /* 11: SLASH shift 141 */ - { 91, 6, 135}, /* 12: PLUS shift 135 */ - { 172, 8, 128}, /* 13: likeop shift 128 */ - { 77, 16, 124}, /* 14: LSHIFT shift 124 */ - { 78, 0, 108}, /* 15: LT shift 108 */ - { 13, 0, 122}, /* 16: BITOR shift 122 */ + { 84, 0, 118}, /* 1: NE shift 118 */ + { 85, 4, 132}, /* 2: NOT shift 132 */ + { 86, 0, 154}, /* 3: NOTNULL shift 154 */ + { 57, 0, 112}, /* 4: GT shift 112 */ + { 63, 0, 159}, /* 5: IN shift 159 */ + { 5, 0, 157}, /* 6: AND shift 157 */ + { 71, 0, 150}, /* 7: IS shift 150 */ + { 91, 5, 108}, /* 8: OR shift 108 */ + { 92, 0, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 10: likeop shift 130 */ + { 94, 0, 137}, /* 11: PLUS shift 137 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 12, 0, 122}, /* 13: BITAND shift 122 */ + { 77, 0, 135}, /* 14: LIKE shift 135 */ + { 14, 0, 124}, /* 15: BITOR shift 124 */ + { 99, 7, 145}, /* 16: REM shift 145 */ + { 72, 0, 149}, /* 17: ISNULL shift 149 */ + { 45, 0, 120}, /* 18: EQ shift 120 */ + { 81, 20, 110}, /* 19: LT shift 110 */ + { 25, 0, 147}, /* 20: CONCAT shift 147 */ + { 76, 0, 114}, /* 21: LE shift 114 */ + { 105, 14, 128}, /* 22: RSHIFT shift 128 */ + { 83, 24, 139}, /* 23: MINUS shift 139 */ + { 55, 0, 136}, /* 24: GLOB shift 136 */ + { 80, 0, 126}, /* 25: LSHIFT shift 126 */ + { 109, 19, 143}, /* 26: SLASH shift 143 */ + { 54, 0, 116}, /* 27: GE shift 116 */ + { 111, 23, 141}, /* 28: STAR shift 141 */ /* State 157 */ - { 76, 0, 158}, /* 1: LP shift 158 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 158}, /* 8: expr shift 158 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 158 */ - { 80, 0, 172}, /* 1: MINUS shift 172 */ - { 181, 0, 69}, /* 2: oneselect shift 69 */ - { 82, 0, 168}, /* 3: NOT shift 168 */ - { 103, 0, 73}, /* 4: SELECT shift 73 */ - { 84, 0, 101}, /* 5: NULL shift 101 */ - { 65, 0, 166}, /* 6: INTEGER shift 166 */ - { 46, 0, 167}, /* 7: FLOAT shift 167 */ - { 71, 0, 67}, /* 8: JOIN_KW shift 67 */ - { 152, 10, 165}, /* 9: expr shift 165 */ - { 12, 0, 170}, /* 10: BITNOT shift 170 */ - { 110, 0, 66}, /* 11: STRING shift 66 */ - { 91, 8, 174}, /* 12: PLUS shift 174 */ - { 192, 9, 159}, /* 13: select shift 159 */ - { 153, 0, 212}, /* 14: expritem shift 212 */ - { 154, 16, 208}, /* 15: exprlist shift 208 */ - { 94, 0, 186}, /* 16: RAISE shift 186 */ - { 76, 19, 68}, /* 17: LP shift 68 */ - { 177, 0, 102}, /* 18: nm shift 102 */ - { 56, 20, 64}, /* 19: ID shift 64 */ - { 16, 0, 176}, /* 20: CASE shift 176 */ + { 80, 0, 126}, /* 1: LSHIFT shift 126 */ + { 177, 3, 130}, /* 2: likeop shift 130 */ + { 81, 0, 110}, /* 3: LT shift 110 */ + { 99, 5, 145}, /* 4: REM shift 145 */ + { 83, 0, 139}, /* 5: MINUS shift 139 */ + { 57, 8, 112}, /* 6: GT shift 112 */ + { 54, 0, 116}, /* 7: GE shift 116 */ + { 25, 0, 147}, /* 8: CONCAT shift 147 */ + { 76, 11, 114}, /* 9: LE shift 114 */ + { 105, 6, 128}, /* 10: RSHIFT shift 128 */ + { 12, 0, 122}, /* 11: BITAND shift 122 */ + { 14, 0, 124}, /* 12: BITOR shift 124 */ + { 92, 9, 99}, /* 13: ORACLE_OUTER_JOIN shift 99 */ + { 109, 0, 143}, /* 14: SLASH shift 143 */ + { 94, 12, 137}, /* 15: PLUS shift 137 */ + { 111, 0, 141}, /* 16: STAR shift 141 */ /* State 159 */ - { 101, 3, 164}, /* 1: RP shift 164 */ - { 176, 1, 71}, /* 2: multiselect_op shift 71 */ - { 66, 0, 162}, /* 3: INTERSECT shift 162 */ - { 118, 5, 160}, /* 4: UNION shift 160 */ - { 43, 0, 163}, /* 5: EXCEPT shift 163 */ + { 79, 0, 160}, /* 1: LP shift 160 */ /* State 160 */ - { 4, 0, 161}, /* 1: ALL shift 161 */ - { 103, 0, 634}, /* 2: SELECT reduce 103 */ + { 85, 0, 170}, /* 1: NOT shift 170 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 13, 0, 172}, /* 3: BITNOT shift 172 */ + { 83, 0, 174}, /* 4: MINUS shift 174 */ + { 74, 0, 67}, /* 5: JOIN_KW shift 67 */ + { 185, 1, 69}, /* 6: oneselect shift 69 */ + { 106, 0, 73}, /* 7: SELECT shift 73 */ + { 87, 0, 101}, /* 8: NULL shift 101 */ + { 68, 0, 168}, /* 9: INTEGER shift 168 */ + { 49, 0, 169}, /* 10: FLOAT shift 169 */ + { 97, 12, 188}, /* 11: RAISE shift 188 */ + { 17, 0, 178}, /* 12: CASE shift 178 */ + { 79, 16, 68}, /* 13: LP shift 68 */ + { 113, 3, 66}, /* 14: STRING shift 66 */ + { 94, 5, 176}, /* 15: PLUS shift 176 */ + { 59, 0, 64}, /* 16: ID shift 64 */ + { 196, 0, 161}, /* 17: select shift 161 */ + { 157, 11, 167}, /* 18: expr shift 167 */ + { 158, 0, 214}, /* 19: expritem shift 214 */ + { 159, 13, 210}, /* 20: exprlist shift 210 */ /* State 161 */ - { 103, 0, 635}, /* 1: SELECT reduce 104 */ + { 180, 0, 71}, /* 1: multiselect_op shift 71 */ + { 121, 3, 162}, /* 2: UNION shift 162 */ + { 46, 0, 165}, /* 3: EXCEPT shift 165 */ + { 69, 0, 164}, /* 4: INTERSECT shift 164 */ + { 104, 4, 166}, /* 5: RP shift 166 */ /* State 162 */ - { 103, 0, 636}, /* 1: SELECT reduce 105 */ + { 106, 2, 658}, /* 1: SELECT reduce 103 */ + { 4, 0, 163}, /* 2: ALL shift 163 */ /* State 163 */ - { 103, 0, 637}, /* 1: SELECT reduce 106 */ + { 106, 0, 659}, /* 1: SELECT reduce 104 */ +/* State 164 */ + { 106, 0, 660}, /* 1: SELECT reduce 105 */ /* State 165 */ - { 88, 2, 106}, /* 1: OR shift 106 */ - { 60, 0, 157}, /* 2: IN shift 157 */ - { 5, 0, 100}, /* 3: AND shift 100 */ - { 68, 0, 148}, /* 4: IS shift 148 */ - { 172, 1, 128}, /* 5: likeop shift 128 */ - { 89, 3, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ - { 13, 0, 122}, /* 7: BITOR shift 122 */ - { 91, 0, 135}, /* 8: PLUS shift 135 */ - { 74, 0, 133}, /* 9: LIKE shift 133 */ - { 78, 0, 108}, /* 10: LT shift 108 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ - { 96, 4, 143}, /* 13: REM shift 143 */ - { 69, 7, 147}, /* 14: ISNULL shift 147 */ - { 42, 0, 118}, /* 15: EQ shift 118 */ - { 80, 17, 137}, /* 16: MINUS shift 137 */ - { 52, 20, 134}, /* 17: GLOB shift 134 */ - { 73, 0, 112}, /* 18: LE shift 112 */ - { 102, 9, 126}, /* 19: RSHIFT shift 126 */ - { 24, 0, 145}, /* 20: CONCAT shift 145 */ - { 54, 0, 110}, /* 21: GT shift 110 */ - { 77, 0, 124}, /* 22: LSHIFT shift 124 */ - { 106, 10, 141}, /* 23: SLASH shift 141 */ - { 51, 0, 114}, /* 24: GE shift 114 */ - { 108, 16, 139}, /* 25: STAR shift 139 */ - { 81, 0, 116}, /* 26: NE shift 116 */ - { 82, 21, 130}, /* 27: NOT shift 130 */ - { 83, 0, 152}, /* 28: NOTNULL shift 152 */ -/* State 168 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 169}, /* 3: expr shift 169 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ -/* State 169 */ - { 78, 2, 108}, /* 1: LT shift 108 */ - { 52, 0, 134}, /* 2: GLOB shift 134 */ - { 106, 7, 141}, /* 3: SLASH shift 141 */ - { 81, 0, 116}, /* 4: NE shift 116 */ - { 108, 8, 139}, /* 5: STAR shift 139 */ - { 83, 0, 152}, /* 6: NOTNULL shift 152 */ - { 80, 10, 137}, /* 7: MINUS shift 137 */ - { 82, 0, 130}, /* 8: NOT shift 130 */ - { 60, 0, 157}, /* 9: IN shift 157 */ - { 54, 0, 110}, /* 10: GT shift 110 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 89, 13, 99}, /* 12: ORACLE_OUTER_JOIN shift 99 */ - { 11, 0, 120}, /* 13: BITAND shift 120 */ - { 91, 15, 135}, /* 14: PLUS shift 135 */ - { 13, 0, 122}, /* 15: BITOR shift 122 */ - { 68, 20, 148}, /* 16: IS shift 148 */ - { 172, 16, 128}, /* 17: likeop shift 128 */ - { 69, 0, 147}, /* 18: ISNULL shift 147 */ - { 96, 0, 143}, /* 19: REM shift 143 */ - { 42, 0, 118}, /* 20: EQ shift 118 */ - { 24, 0, 145}, /* 21: CONCAT shift 145 */ - { 73, 0, 112}, /* 22: LE shift 112 */ - { 74, 0, 133}, /* 23: LIKE shift 133 */ - { 51, 0, 114}, /* 24: GE shift 114 */ - { 102, 21, 126}, /* 25: RSHIFT shift 126 */ - { 77, 24, 124}, /* 26: LSHIFT shift 124 */ + { 106, 0, 661}, /* 1: SELECT reduce 106 */ +/* State 167 */ + { 84, 0, 118}, /* 1: NE shift 118 */ + { 85, 4, 132}, /* 2: NOT shift 132 */ + { 86, 0, 154}, /* 3: NOTNULL shift 154 */ + { 57, 0, 112}, /* 4: GT shift 112 */ + { 63, 0, 159}, /* 5: IN shift 159 */ + { 5, 0, 100}, /* 6: AND shift 100 */ + { 71, 0, 150}, /* 7: IS shift 150 */ + { 91, 5, 108}, /* 8: OR shift 108 */ + { 92, 0, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 10: likeop shift 130 */ + { 94, 0, 137}, /* 11: PLUS shift 137 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 12, 0, 122}, /* 13: BITAND shift 122 */ + { 77, 0, 135}, /* 14: LIKE shift 135 */ + { 14, 0, 124}, /* 15: BITOR shift 124 */ + { 99, 7, 145}, /* 16: REM shift 145 */ + { 72, 0, 149}, /* 17: ISNULL shift 149 */ + { 45, 0, 120}, /* 18: EQ shift 120 */ + { 81, 20, 110}, /* 19: LT shift 110 */ + { 25, 0, 147}, /* 20: CONCAT shift 147 */ + { 76, 0, 114}, /* 21: LE shift 114 */ + { 105, 14, 128}, /* 22: RSHIFT shift 128 */ + { 83, 24, 139}, /* 23: MINUS shift 139 */ + { 55, 0, 136}, /* 24: GLOB shift 136 */ + { 80, 0, 126}, /* 25: LSHIFT shift 126 */ + { 109, 19, 143}, /* 26: SLASH shift 143 */ + { 54, 0, 116}, /* 27: GE shift 116 */ + { 111, 23, 141}, /* 28: STAR shift 141 */ /* State 170 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 171}, /* 3: expr shift 171 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 171}, /* 8: expr shift 171 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 171 */ - { 172, 0, 128}, /* 1: likeop shift 128 */ - { 89, 0, 99}, /* 2: ORACLE_OUTER_JOIN shift 99 */ + { 54, 0, 116}, /* 1: GE shift 116 */ + { 105, 0, 128}, /* 2: RSHIFT shift 128 */ + { 80, 1, 126}, /* 3: LSHIFT shift 126 */ + { 81, 5, 110}, /* 4: LT shift 110 */ + { 55, 0, 136}, /* 5: GLOB shift 136 */ + { 109, 10, 143}, /* 6: SLASH shift 143 */ + { 84, 0, 118}, /* 7: NE shift 118 */ + { 111, 11, 141}, /* 8: STAR shift 141 */ + { 86, 0, 154}, /* 9: NOTNULL shift 154 */ + { 83, 14, 139}, /* 10: MINUS shift 139 */ + { 85, 0, 132}, /* 11: NOT shift 132 */ + { 63, 16, 159}, /* 12: IN shift 159 */ + { 12, 0, 122}, /* 13: BITAND shift 122 */ + { 57, 0, 112}, /* 14: GT shift 112 */ + { 92, 18, 99}, /* 15: ORACLE_OUTER_JOIN shift 99 */ + { 11, 0, 155}, /* 16: BETWEEN shift 155 */ + { 94, 0, 137}, /* 17: PLUS shift 137 */ + { 14, 0, 124}, /* 18: BITOR shift 124 */ + { 45, 0, 120}, /* 19: EQ shift 120 */ + { 71, 19, 150}, /* 20: IS shift 150 */ + { 72, 0, 149}, /* 21: ISNULL shift 149 */ + { 177, 23, 130}, /* 22: likeop shift 130 */ + { 99, 0, 145}, /* 23: REM shift 145 */ + { 25, 0, 147}, /* 24: CONCAT shift 147 */ + { 76, 0, 114}, /* 25: LE shift 114 */ + { 77, 24, 135}, /* 26: LIKE shift 135 */ /* State 172 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 173}, /* 3: expr shift 173 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 173}, /* 8: expr shift 173 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 173 */ - { 172, 0, 128}, /* 1: likeop shift 128 */ - { 89, 0, 99}, /* 2: ORACLE_OUTER_JOIN shift 99 */ + { 92, 0, 99}, /* 1: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 2: likeop shift 130 */ /* State 174 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 175}, /* 3: expr shift 175 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 175}, /* 8: expr shift 175 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 175 */ - { 172, 0, 128}, /* 1: likeop shift 128 */ - { 89, 0, 99}, /* 2: ORACLE_OUTER_JOIN shift 99 */ + { 92, 0, 99}, /* 1: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 2: likeop shift 130 */ /* State 176 */ - { 126, 0, 755}, /* 1: WHEN reduce 224 */ - { 76, 0, 68}, /* 2: LP shift 68 */ - { 46, 5, 167}, /* 3: FLOAT shift 167 */ - { 71, 0, 67}, /* 4: JOIN_KW shift 67 */ - { 12, 0, 170}, /* 5: BITNOT shift 170 */ - { 56, 0, 64}, /* 6: ID shift 64 */ - { 91, 0, 174}, /* 7: PLUS shift 174 */ - { 177, 1, 102}, /* 8: nm shift 102 */ - { 110, 2, 66}, /* 9: STRING shift 66 */ - { 94, 0, 186}, /* 10: RAISE shift 186 */ - { 82, 12, 168}, /* 11: NOT shift 168 */ - { 65, 0, 166}, /* 12: INTEGER shift 166 */ - { 80, 3, 172}, /* 13: MINUS shift 172 */ - { 84, 16, 101}, /* 14: NULL shift 101 */ - { 133, 11, 178}, /* 15: case_operand shift 178 */ - { 16, 0, 176}, /* 16: CASE shift 176 */ - { 152, 14, 177}, /* 17: expr shift 177 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 177}, /* 8: expr shift 177 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 177 */ - { 60, 0, 157}, /* 1: IN shift 157 */ - { 88, 0, 106}, /* 2: OR shift 106 */ - { 89, 1, 99}, /* 3: ORACLE_OUTER_JOIN shift 99 */ - { 68, 7, 148}, /* 4: IS shift 148 */ - { 91, 0, 135}, /* 5: PLUS shift 135 */ - { 5, 0, 100}, /* 6: AND shift 100 */ - { 10, 0, 153}, /* 7: BETWEEN shift 153 */ - { 11, 0, 120}, /* 8: BITAND shift 120 */ - { 13, 0, 122}, /* 9: BITOR shift 122 */ - { 96, 0, 143}, /* 10: REM shift 143 */ - { 126, 4, 754}, /* 11: WHEN reduce 223 */ - { 69, 8, 147}, /* 12: ISNULL shift 147 */ - { 73, 0, 112}, /* 13: LE shift 112 */ - { 42, 9, 118}, /* 14: EQ shift 118 */ - { 77, 0, 124}, /* 15: LSHIFT shift 124 */ - { 102, 13, 126}, /* 16: RSHIFT shift 126 */ - { 74, 0, 133}, /* 17: LIKE shift 133 */ - { 51, 0, 114}, /* 18: GE shift 114 */ - { 52, 0, 134}, /* 19: GLOB shift 134 */ - { 106, 15, 141}, /* 20: SLASH shift 141 */ - { 78, 0, 108}, /* 21: LT shift 108 */ - { 108, 0, 139}, /* 22: STAR shift 139 */ - { 80, 18, 137}, /* 23: MINUS shift 137 */ - { 81, 19, 116}, /* 24: NE shift 116 */ - { 82, 27, 130}, /* 25: NOT shift 130 */ - { 83, 29, 152}, /* 26: NOTNULL shift 152 */ - { 24, 0, 145}, /* 27: CONCAT shift 145 */ - { 172, 0, 128}, /* 28: likeop shift 128 */ - { 54, 0, 110}, /* 29: GT shift 110 */ + { 92, 0, 99}, /* 1: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 2: likeop shift 130 */ /* State 178 */ - { 132, 2, 179}, /* 1: case_exprlist shift 179 */ - { 126, 0, 204}, /* 2: WHEN shift 204 */ + { 136, 2, 180}, /* 1: case_operand shift 180 */ + { 85, 4, 170}, /* 2: NOT shift 170 */ + { 87, 0, 101}, /* 3: NULL shift 101 */ + { 68, 6, 168}, /* 4: INTEGER shift 168 */ + { 157, 0, 179}, /* 5: expr shift 179 */ + { 17, 0, 178}, /* 6: CASE shift 178 */ + { 74, 0, 67}, /* 7: JOIN_KW shift 67 */ + { 113, 15, 66}, /* 8: STRING shift 66 */ + { 59, 0, 64}, /* 9: ID shift 64 */ + { 94, 0, 176}, /* 10: PLUS shift 176 */ + { 129, 0, 781}, /* 11: WHEN reduce 226 */ + { 181, 8, 102}, /* 12: nm shift 102 */ + { 97, 0, 188}, /* 13: RAISE shift 188 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 79, 0, 68}, /* 15: LP shift 68 */ + { 83, 17, 174}, /* 16: MINUS shift 174 */ + { 49, 0, 169}, /* 17: FLOAT shift 169 */ /* State 179 */ - { 40, 0, 753}, /* 1: END reduce 222 */ - { 39, 0, 202}, /* 2: ELSE shift 202 */ - { 126, 0, 182}, /* 3: WHEN shift 182 */ - { 131, 2, 180}, /* 4: case_else shift 180 */ + { 63, 2, 159}, /* 1: IN shift 159 */ + { 5, 0, 100}, /* 2: AND shift 100 */ + { 12, 0, 122}, /* 3: BITAND shift 122 */ + { 177, 0, 130}, /* 4: likeop shift 130 */ + { 91, 0, 108}, /* 5: OR shift 108 */ + { 92, 1, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ + { 71, 0, 150}, /* 7: IS shift 150 */ + { 94, 0, 137}, /* 8: PLUS shift 137 */ + { 14, 0, 124}, /* 9: BITOR shift 124 */ + { 76, 0, 114}, /* 10: LE shift 114 */ + { 80, 0, 126}, /* 11: LSHIFT shift 126 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 99, 3, 145}, /* 13: REM shift 145 */ + { 129, 7, 780}, /* 14: WHEN reduce 225 */ + { 72, 9, 149}, /* 15: ISNULL shift 149 */ + { 54, 18, 116}, /* 16: GE shift 116 */ + { 45, 0, 120}, /* 17: EQ shift 120 */ + { 25, 0, 147}, /* 18: CONCAT shift 147 */ + { 105, 10, 128}, /* 19: RSHIFT shift 128 */ + { 77, 0, 135}, /* 20: LIKE shift 135 */ + { 55, 0, 136}, /* 21: GLOB shift 136 */ + { 57, 0, 112}, /* 22: GT shift 112 */ + { 109, 11, 143}, /* 23: SLASH shift 143 */ + { 81, 0, 110}, /* 24: LT shift 110 */ + { 111, 0, 141}, /* 25: STAR shift 141 */ + { 83, 16, 139}, /* 26: MINUS shift 139 */ + { 84, 21, 118}, /* 27: NE shift 118 */ + { 85, 0, 132}, /* 28: NOT shift 132 */ + { 86, 22, 154}, /* 29: NOTNULL shift 154 */ /* State 180 */ - { 40, 0, 181}, /* 1: END shift 181 */ + { 129, 0, 206}, /* 1: WHEN shift 206 */ + { 135, 1, 181}, /* 2: case_exprlist shift 181 */ +/* State 181 */ + { 42, 0, 204}, /* 1: ELSE shift 204 */ + { 129, 0, 184}, /* 2: WHEN shift 184 */ + { 134, 1, 182}, /* 3: case_else shift 182 */ + { 43, 0, 779}, /* 4: END reduce 224 */ /* State 182 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 183}, /* 3: expr shift 183 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ -/* State 183 */ - { 60, 0, 157}, /* 1: IN shift 157 */ - { 88, 0, 106}, /* 2: OR shift 106 */ - { 89, 1, 99}, /* 3: ORACLE_OUTER_JOIN shift 99 */ - { 10, 0, 153}, /* 4: BETWEEN shift 153 */ - { 91, 0, 135}, /* 5: PLUS shift 135 */ - { 5, 0, 100}, /* 6: AND shift 100 */ - { 11, 0, 120}, /* 7: BITAND shift 120 */ - { 13, 0, 122}, /* 8: BITOR shift 122 */ - { 73, 0, 112}, /* 9: LE shift 112 */ - { 96, 0, 143}, /* 10: REM shift 143 */ - { 68, 4, 148}, /* 11: IS shift 148 */ - { 69, 7, 147}, /* 12: ISNULL shift 147 */ - { 77, 0, 124}, /* 13: LSHIFT shift 124 */ - { 42, 8, 118}, /* 14: EQ shift 118 */ - { 51, 0, 114}, /* 15: GE shift 114 */ - { 102, 9, 126}, /* 16: RSHIFT shift 126 */ - { 74, 0, 133}, /* 17: LIKE shift 133 */ - { 52, 0, 134}, /* 18: GLOB shift 134 */ - { 24, 0, 145}, /* 19: CONCAT shift 145 */ - { 106, 13, 141}, /* 20: SLASH shift 141 */ - { 78, 0, 108}, /* 21: LT shift 108 */ - { 108, 0, 139}, /* 22: STAR shift 139 */ - { 80, 15, 137}, /* 23: MINUS shift 137 */ - { 81, 18, 116}, /* 24: NE shift 116 */ - { 82, 19, 130}, /* 25: NOT shift 130 */ - { 83, 29, 152}, /* 26: NOTNULL shift 152 */ - { 113, 0, 184}, /* 27: THEN shift 184 */ - { 172, 0, 128}, /* 28: likeop shift 128 */ - { 54, 0, 110}, /* 29: GT shift 110 */ + { 43, 0, 183}, /* 1: END shift 183 */ /* State 184 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 185}, /* 3: expr shift 185 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 185}, /* 8: expr shift 185 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 185 */ - { 88, 2, 106}, /* 1: OR shift 106 */ - { 60, 0, 157}, /* 2: IN shift 157 */ + { 116, 0, 186}, /* 1: THEN shift 186 */ + { 63, 3, 159}, /* 2: IN shift 159 */ { 5, 0, 100}, /* 3: AND shift 100 */ - { 68, 0, 148}, /* 4: IS shift 148 */ - { 172, 1, 128}, /* 5: likeop shift 128 */ - { 89, 3, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ - { 13, 0, 122}, /* 7: BITOR shift 122 */ - { 91, 0, 135}, /* 8: PLUS shift 135 */ - { 74, 0, 133}, /* 9: LIKE shift 133 */ - { 78, 0, 108}, /* 10: LT shift 108 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ - { 96, 4, 143}, /* 13: REM shift 143 */ - { 69, 7, 147}, /* 14: ISNULL shift 147 */ - { 42, 0, 118}, /* 15: EQ shift 118 */ - { 80, 17, 137}, /* 16: MINUS shift 137 */ - { 52, 20, 134}, /* 17: GLOB shift 134 */ - { 73, 0, 112}, /* 18: LE shift 112 */ - { 102, 9, 126}, /* 19: RSHIFT shift 126 */ - { 24, 0, 145}, /* 20: CONCAT shift 145 */ - { 54, 0, 110}, /* 21: GT shift 110 */ - { 77, 0, 124}, /* 22: LSHIFT shift 124 */ - { 106, 10, 141}, /* 23: SLASH shift 141 */ - { 51, 0, 114}, /* 24: GE shift 114 */ - { 108, 16, 139}, /* 25: STAR shift 139 */ - { 81, 0, 116}, /* 26: NE shift 116 */ - { 82, 21, 130}, /* 27: NOT shift 130 */ - { 83, 0, 152}, /* 28: NOTNULL shift 152 */ + { 177, 0, 130}, /* 4: likeop shift 130 */ + { 91, 0, 108}, /* 5: OR shift 108 */ + { 92, 2, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ + { 12, 0, 122}, /* 7: BITAND shift 122 */ + { 94, 0, 137}, /* 8: PLUS shift 137 */ + { 14, 0, 124}, /* 9: BITOR shift 124 */ + { 76, 0, 114}, /* 10: LE shift 114 */ + { 80, 0, 126}, /* 11: LSHIFT shift 126 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 99, 7, 145}, /* 13: REM shift 145 */ + { 71, 0, 150}, /* 14: IS shift 150 */ + { 72, 9, 149}, /* 15: ISNULL shift 149 */ + { 54, 18, 116}, /* 16: GE shift 116 */ + { 45, 0, 120}, /* 17: EQ shift 120 */ + { 25, 0, 147}, /* 18: CONCAT shift 147 */ + { 105, 10, 128}, /* 19: RSHIFT shift 128 */ + { 77, 0, 135}, /* 20: LIKE shift 135 */ + { 55, 0, 136}, /* 21: GLOB shift 136 */ + { 57, 0, 112}, /* 22: GT shift 112 */ + { 109, 11, 143}, /* 23: SLASH shift 143 */ + { 81, 0, 110}, /* 24: LT shift 110 */ + { 111, 0, 141}, /* 25: STAR shift 141 */ + { 83, 16, 139}, /* 26: MINUS shift 139 */ + { 84, 21, 118}, /* 27: NE shift 118 */ + { 85, 0, 132}, /* 28: NOT shift 132 */ + { 86, 22, 154}, /* 29: NOTNULL shift 154 */ /* State 186 */ - { 76, 0, 187}, /* 1: LP shift 187 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 187}, /* 8: expr shift 187 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 187 */ - { 45, 3, 198}, /* 1: FAIL shift 198 */ - { 57, 1, 188}, /* 2: IGNORE shift 188 */ - { 1, 0, 194}, /* 3: ABORT shift 194 */ - { 99, 0, 190}, /* 4: ROLLBACK shift 190 */ + { 84, 0, 118}, /* 1: NE shift 118 */ + { 85, 4, 132}, /* 2: NOT shift 132 */ + { 86, 0, 154}, /* 3: NOTNULL shift 154 */ + { 57, 0, 112}, /* 4: GT shift 112 */ + { 63, 0, 159}, /* 5: IN shift 159 */ + { 5, 0, 100}, /* 6: AND shift 100 */ + { 71, 0, 150}, /* 7: IS shift 150 */ + { 91, 5, 108}, /* 8: OR shift 108 */ + { 92, 0, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 10: likeop shift 130 */ + { 94, 0, 137}, /* 11: PLUS shift 137 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 12, 0, 122}, /* 13: BITAND shift 122 */ + { 77, 0, 135}, /* 14: LIKE shift 135 */ + { 14, 0, 124}, /* 15: BITOR shift 124 */ + { 99, 7, 145}, /* 16: REM shift 145 */ + { 72, 0, 149}, /* 17: ISNULL shift 149 */ + { 45, 0, 120}, /* 18: EQ shift 120 */ + { 81, 20, 110}, /* 19: LT shift 110 */ + { 25, 0, 147}, /* 20: CONCAT shift 147 */ + { 76, 0, 114}, /* 21: LE shift 114 */ + { 105, 14, 128}, /* 22: RSHIFT shift 128 */ + { 83, 24, 139}, /* 23: MINUS shift 139 */ + { 55, 0, 136}, /* 24: GLOB shift 136 */ + { 80, 0, 126}, /* 25: LSHIFT shift 126 */ + { 109, 19, 143}, /* 26: SLASH shift 143 */ + { 54, 0, 116}, /* 27: GE shift 116 */ + { 111, 23, 141}, /* 28: STAR shift 141 */ /* State 188 */ - { 101, 0, 189}, /* 1: RP shift 189 */ + { 79, 0, 189}, /* 1: LP shift 189 */ +/* State 189 */ + { 60, 4, 190}, /* 1: IGNORE shift 190 */ + { 1, 0, 196}, /* 2: ABORT shift 196 */ + { 102, 0, 192}, /* 3: ROLLBACK shift 192 */ + { 48, 0, 200}, /* 4: FAIL shift 200 */ /* State 190 */ - { 21, 0, 191}, /* 1: COMMA shift 191 */ -/* State 191 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 192}, /* 2: nm shift 192 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 104, 0, 191}, /* 1: RP shift 191 */ /* State 192 */ - { 101, 0, 193}, /* 1: RP shift 193 */ + { 22, 0, 193}, /* 1: COMMA shift 193 */ +/* State 193 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 194}, /* 2: nm shift 194 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 194 */ - { 21, 0, 195}, /* 1: COMMA shift 195 */ -/* State 195 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 196}, /* 2: nm shift 196 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 104, 0, 195}, /* 1: RP shift 195 */ /* State 196 */ - { 101, 0, 197}, /* 1: RP shift 197 */ + { 22, 0, 197}, /* 1: COMMA shift 197 */ +/* State 197 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 198}, /* 2: nm shift 198 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 198 */ - { 21, 0, 199}, /* 1: COMMA shift 199 */ -/* State 199 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 200}, /* 2: nm shift 200 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 104, 0, 199}, /* 1: RP shift 199 */ /* State 200 */ - { 101, 0, 201}, /* 1: RP shift 201 */ + { 22, 0, 201}, /* 1: COMMA shift 201 */ +/* State 201 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 202}, /* 2: nm shift 202 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 202 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 203}, /* 3: expr shift 203 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ -/* State 203 */ - { 60, 0, 157}, /* 1: IN shift 157 */ - { 88, 0, 106}, /* 2: OR shift 106 */ - { 89, 1, 99}, /* 3: ORACLE_OUTER_JOIN shift 99 */ - { 10, 0, 153}, /* 4: BETWEEN shift 153 */ - { 91, 0, 135}, /* 5: PLUS shift 135 */ - { 5, 0, 100}, /* 6: AND shift 100 */ - { 40, 8, 752}, /* 7: END reduce 221 */ - { 11, 0, 120}, /* 8: BITAND shift 120 */ - { 13, 0, 122}, /* 9: BITOR shift 122 */ - { 96, 0, 143}, /* 10: REM shift 143 */ - { 68, 4, 148}, /* 11: IS shift 148 */ - { 69, 7, 147}, /* 12: ISNULL shift 147 */ - { 73, 0, 112}, /* 13: LE shift 112 */ - { 42, 9, 118}, /* 14: EQ shift 118 */ - { 77, 0, 124}, /* 15: LSHIFT shift 124 */ - { 102, 13, 126}, /* 16: RSHIFT shift 126 */ - { 74, 0, 133}, /* 17: LIKE shift 133 */ - { 51, 0, 114}, /* 18: GE shift 114 */ - { 52, 0, 134}, /* 19: GLOB shift 134 */ - { 106, 15, 141}, /* 20: SLASH shift 141 */ - { 78, 0, 108}, /* 21: LT shift 108 */ - { 108, 0, 139}, /* 22: STAR shift 139 */ - { 80, 18, 137}, /* 23: MINUS shift 137 */ - { 81, 19, 116}, /* 24: NE shift 116 */ - { 82, 27, 130}, /* 25: NOT shift 130 */ - { 83, 29, 152}, /* 26: NOTNULL shift 152 */ - { 24, 0, 145}, /* 27: CONCAT shift 145 */ - { 172, 0, 128}, /* 28: likeop shift 128 */ - { 54, 0, 110}, /* 29: GT shift 110 */ + { 104, 0, 203}, /* 1: RP shift 203 */ /* State 204 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 205}, /* 3: expr shift 205 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 205}, /* 8: expr shift 205 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 205 */ - { 60, 0, 157}, /* 1: IN shift 157 */ - { 88, 0, 106}, /* 2: OR shift 106 */ - { 89, 1, 99}, /* 3: ORACLE_OUTER_JOIN shift 99 */ - { 10, 0, 153}, /* 4: BETWEEN shift 153 */ - { 91, 0, 135}, /* 5: PLUS shift 135 */ - { 5, 0, 100}, /* 6: AND shift 100 */ - { 11, 0, 120}, /* 7: BITAND shift 120 */ - { 13, 0, 122}, /* 8: BITOR shift 122 */ - { 73, 0, 112}, /* 9: LE shift 112 */ - { 96, 0, 143}, /* 10: REM shift 143 */ - { 68, 4, 148}, /* 11: IS shift 148 */ - { 69, 7, 147}, /* 12: ISNULL shift 147 */ - { 77, 0, 124}, /* 13: LSHIFT shift 124 */ - { 42, 8, 118}, /* 14: EQ shift 118 */ - { 51, 0, 114}, /* 15: GE shift 114 */ - { 102, 9, 126}, /* 16: RSHIFT shift 126 */ - { 74, 0, 133}, /* 17: LIKE shift 133 */ - { 52, 0, 134}, /* 18: GLOB shift 134 */ - { 24, 0, 145}, /* 19: CONCAT shift 145 */ - { 106, 13, 141}, /* 20: SLASH shift 141 */ - { 78, 0, 108}, /* 21: LT shift 108 */ - { 108, 0, 139}, /* 22: STAR shift 139 */ - { 80, 15, 137}, /* 23: MINUS shift 137 */ - { 81, 18, 116}, /* 24: NE shift 116 */ - { 82, 19, 130}, /* 25: NOT shift 130 */ - { 83, 29, 152}, /* 26: NOTNULL shift 152 */ - { 113, 0, 206}, /* 27: THEN shift 206 */ - { 172, 0, 128}, /* 28: likeop shift 128 */ - { 54, 0, 110}, /* 29: GT shift 110 */ + { 63, 2, 159}, /* 1: IN shift 159 */ + { 5, 0, 100}, /* 2: AND shift 100 */ + { 12, 0, 122}, /* 3: BITAND shift 122 */ + { 177, 0, 130}, /* 4: likeop shift 130 */ + { 91, 0, 108}, /* 5: OR shift 108 */ + { 92, 1, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ + { 43, 9, 778}, /* 7: END reduce 223 */ + { 94, 0, 137}, /* 8: PLUS shift 137 */ + { 14, 0, 124}, /* 9: BITOR shift 124 */ + { 76, 0, 114}, /* 10: LE shift 114 */ + { 80, 0, 126}, /* 11: LSHIFT shift 126 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 99, 3, 145}, /* 13: REM shift 145 */ + { 71, 0, 150}, /* 14: IS shift 150 */ + { 72, 7, 149}, /* 15: ISNULL shift 149 */ + { 54, 18, 116}, /* 16: GE shift 116 */ + { 45, 0, 120}, /* 17: EQ shift 120 */ + { 25, 0, 147}, /* 18: CONCAT shift 147 */ + { 105, 10, 128}, /* 19: RSHIFT shift 128 */ + { 77, 0, 135}, /* 20: LIKE shift 135 */ + { 55, 0, 136}, /* 21: GLOB shift 136 */ + { 57, 0, 112}, /* 22: GT shift 112 */ + { 109, 11, 143}, /* 23: SLASH shift 143 */ + { 81, 0, 110}, /* 24: LT shift 110 */ + { 111, 0, 141}, /* 25: STAR shift 141 */ + { 83, 16, 139}, /* 26: MINUS shift 139 */ + { 84, 21, 118}, /* 27: NE shift 118 */ + { 85, 0, 132}, /* 28: NOT shift 132 */ + { 86, 22, 154}, /* 29: NOTNULL shift 154 */ /* State 206 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 207}, /* 3: expr shift 207 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 207}, /* 8: expr shift 207 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 207 */ - { 88, 2, 106}, /* 1: OR shift 106 */ - { 60, 0, 157}, /* 2: IN shift 157 */ + { 116, 0, 208}, /* 1: THEN shift 208 */ + { 63, 3, 159}, /* 2: IN shift 159 */ { 5, 0, 100}, /* 3: AND shift 100 */ - { 68, 0, 148}, /* 4: IS shift 148 */ - { 172, 1, 128}, /* 5: likeop shift 128 */ - { 89, 3, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ - { 13, 0, 122}, /* 7: BITOR shift 122 */ - { 91, 0, 135}, /* 8: PLUS shift 135 */ - { 74, 0, 133}, /* 9: LIKE shift 133 */ - { 78, 0, 108}, /* 10: LT shift 108 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ - { 96, 4, 143}, /* 13: REM shift 143 */ - { 69, 7, 147}, /* 14: ISNULL shift 147 */ - { 42, 0, 118}, /* 15: EQ shift 118 */ - { 80, 17, 137}, /* 16: MINUS shift 137 */ - { 52, 20, 134}, /* 17: GLOB shift 134 */ - { 73, 0, 112}, /* 18: LE shift 112 */ - { 102, 9, 126}, /* 19: RSHIFT shift 126 */ - { 24, 0, 145}, /* 20: CONCAT shift 145 */ - { 54, 0, 110}, /* 21: GT shift 110 */ - { 77, 0, 124}, /* 22: LSHIFT shift 124 */ - { 106, 10, 141}, /* 23: SLASH shift 141 */ - { 51, 0, 114}, /* 24: GE shift 114 */ - { 108, 16, 139}, /* 25: STAR shift 139 */ - { 81, 0, 116}, /* 26: NE shift 116 */ - { 82, 21, 130}, /* 27: NOT shift 130 */ - { 83, 0, 152}, /* 28: NOTNULL shift 152 */ + { 177, 0, 130}, /* 4: likeop shift 130 */ + { 91, 0, 108}, /* 5: OR shift 108 */ + { 92, 2, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ + { 12, 0, 122}, /* 7: BITAND shift 122 */ + { 94, 0, 137}, /* 8: PLUS shift 137 */ + { 14, 0, 124}, /* 9: BITOR shift 124 */ + { 76, 0, 114}, /* 10: LE shift 114 */ + { 80, 0, 126}, /* 11: LSHIFT shift 126 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 99, 7, 145}, /* 13: REM shift 145 */ + { 71, 0, 150}, /* 14: IS shift 150 */ + { 72, 9, 149}, /* 15: ISNULL shift 149 */ + { 54, 18, 116}, /* 16: GE shift 116 */ + { 45, 0, 120}, /* 17: EQ shift 120 */ + { 25, 0, 147}, /* 18: CONCAT shift 147 */ + { 105, 10, 128}, /* 19: RSHIFT shift 128 */ + { 77, 0, 135}, /* 20: LIKE shift 135 */ + { 55, 0, 136}, /* 21: GLOB shift 136 */ + { 57, 0, 112}, /* 22: GT shift 112 */ + { 109, 11, 143}, /* 23: SLASH shift 143 */ + { 81, 0, 110}, /* 24: LT shift 110 */ + { 111, 0, 141}, /* 25: STAR shift 141 */ + { 83, 16, 139}, /* 26: MINUS shift 139 */ + { 84, 21, 118}, /* 27: NE shift 118 */ + { 85, 0, 132}, /* 28: NOT shift 132 */ + { 86, 22, 154}, /* 29: NOTNULL shift 154 */ /* State 208 */ - { 21, 0, 210}, /* 1: COMMA shift 210 */ - { 101, 1, 209}, /* 2: RP shift 209 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 209}, /* 8: expr shift 209 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ +/* State 209 */ + { 84, 0, 118}, /* 1: NE shift 118 */ + { 85, 4, 132}, /* 2: NOT shift 132 */ + { 86, 0, 154}, /* 3: NOTNULL shift 154 */ + { 57, 0, 112}, /* 4: GT shift 112 */ + { 63, 0, 159}, /* 5: IN shift 159 */ + { 5, 0, 100}, /* 6: AND shift 100 */ + { 71, 0, 150}, /* 7: IS shift 150 */ + { 91, 5, 108}, /* 8: OR shift 108 */ + { 92, 0, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 10: likeop shift 130 */ + { 94, 0, 137}, /* 11: PLUS shift 137 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 12, 0, 122}, /* 13: BITAND shift 122 */ + { 77, 0, 135}, /* 14: LIKE shift 135 */ + { 14, 0, 124}, /* 15: BITOR shift 124 */ + { 99, 7, 145}, /* 16: REM shift 145 */ + { 72, 0, 149}, /* 17: ISNULL shift 149 */ + { 45, 0, 120}, /* 18: EQ shift 120 */ + { 81, 20, 110}, /* 19: LT shift 110 */ + { 25, 0, 147}, /* 20: CONCAT shift 147 */ + { 76, 0, 114}, /* 21: LE shift 114 */ + { 105, 14, 128}, /* 22: RSHIFT shift 128 */ + { 83, 24, 139}, /* 23: MINUS shift 139 */ + { 55, 0, 136}, /* 24: GLOB shift 136 */ + { 80, 0, 126}, /* 25: LSHIFT shift 126 */ + { 109, 19, 143}, /* 26: SLASH shift 143 */ + { 54, 0, 116}, /* 27: GE shift 116 */ + { 111, 23, 141}, /* 28: STAR shift 141 */ /* State 210 */ - { 80, 4, 172}, /* 1: MINUS shift 172 */ - { 177, 6, 102}, /* 2: nm shift 102 */ - { 82, 0, 168}, /* 3: NOT shift 168 */ - { 16, 0, 176}, /* 4: CASE shift 176 */ - { 84, 0, 101}, /* 5: NULL shift 101 */ - { 65, 0, 166}, /* 6: INTEGER shift 166 */ - { 56, 0, 64}, /* 7: ID shift 64 */ - { 71, 0, 67}, /* 8: JOIN_KW shift 67 */ - { 152, 7, 165}, /* 9: expr shift 165 */ - { 153, 0, 211}, /* 10: expritem shift 211 */ - { 12, 0, 170}, /* 11: BITNOT shift 170 */ - { 91, 0, 174}, /* 12: PLUS shift 174 */ - { 76, 11, 68}, /* 13: LP shift 68 */ - { 94, 16, 186}, /* 14: RAISE shift 186 */ - { 110, 14, 66}, /* 15: STRING shift 66 */ - { 46, 0, 167}, /* 16: FLOAT shift 167 */ -/* State 214 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 215}, /* 3: expr shift 215 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ -/* State 215 */ - { 88, 2, 106}, /* 1: OR shift 106 */ - { 60, 0, 157}, /* 2: IN shift 157 */ - { 5, 0, 216}, /* 3: AND shift 216 */ - { 68, 0, 148}, /* 4: IS shift 148 */ - { 172, 1, 128}, /* 5: likeop shift 128 */ - { 89, 3, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ - { 13, 0, 122}, /* 7: BITOR shift 122 */ - { 91, 0, 135}, /* 8: PLUS shift 135 */ - { 74, 0, 133}, /* 9: LIKE shift 133 */ - { 78, 0, 108}, /* 10: LT shift 108 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ - { 96, 4, 143}, /* 13: REM shift 143 */ - { 69, 7, 147}, /* 14: ISNULL shift 147 */ - { 42, 0, 118}, /* 15: EQ shift 118 */ - { 80, 17, 137}, /* 16: MINUS shift 137 */ - { 52, 20, 134}, /* 17: GLOB shift 134 */ - { 73, 0, 112}, /* 18: LE shift 112 */ - { 102, 9, 126}, /* 19: RSHIFT shift 126 */ - { 24, 0, 145}, /* 20: CONCAT shift 145 */ - { 54, 0, 110}, /* 21: GT shift 110 */ - { 77, 0, 124}, /* 22: LSHIFT shift 124 */ - { 106, 10, 141}, /* 23: SLASH shift 141 */ - { 51, 0, 114}, /* 24: GE shift 114 */ - { 108, 16, 139}, /* 25: STAR shift 139 */ - { 81, 0, 116}, /* 26: NE shift 116 */ - { 82, 21, 130}, /* 27: NOT shift 130 */ - { 83, 0, 152}, /* 28: NOTNULL shift 152 */ + { 104, 2, 211}, /* 1: RP shift 211 */ + { 22, 0, 212}, /* 2: COMMA shift 212 */ +/* State 212 */ + { 97, 3, 188}, /* 1: RAISE shift 188 */ + { 113, 1, 66}, /* 2: STRING shift 66 */ + { 49, 7, 169}, /* 3: FLOAT shift 169 */ + { 83, 0, 174}, /* 4: MINUS shift 174 */ + { 68, 0, 168}, /* 5: INTEGER shift 168 */ + { 181, 9, 102}, /* 6: nm shift 102 */ + { 17, 0, 178}, /* 7: CASE shift 178 */ + { 87, 0, 101}, /* 8: NULL shift 101 */ + { 85, 0, 170}, /* 9: NOT shift 170 */ + { 13, 0, 172}, /* 10: BITNOT shift 172 */ + { 74, 0, 67}, /* 11: JOIN_KW shift 67 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 94, 0, 176}, /* 13: PLUS shift 176 */ + { 157, 10, 167}, /* 14: expr shift 167 */ + { 158, 13, 213}, /* 15: expritem shift 213 */ + { 79, 0, 68}, /* 16: LP shift 68 */ /* State 216 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 217}, /* 3: expr shift 217 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 217}, /* 8: expr shift 217 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 217 */ - { 78, 2, 108}, /* 1: LT shift 108 */ - { 52, 0, 134}, /* 2: GLOB shift 134 */ - { 106, 7, 141}, /* 3: SLASH shift 141 */ - { 81, 0, 116}, /* 4: NE shift 116 */ - { 108, 8, 139}, /* 5: STAR shift 139 */ - { 83, 0, 152}, /* 6: NOTNULL shift 152 */ - { 80, 10, 137}, /* 7: MINUS shift 137 */ - { 82, 0, 130}, /* 8: NOT shift 130 */ - { 60, 0, 157}, /* 9: IN shift 157 */ - { 54, 0, 110}, /* 10: GT shift 110 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 89, 13, 99}, /* 12: ORACLE_OUTER_JOIN shift 99 */ - { 11, 0, 120}, /* 13: BITAND shift 120 */ - { 91, 15, 135}, /* 14: PLUS shift 135 */ - { 13, 0, 122}, /* 15: BITOR shift 122 */ - { 68, 20, 148}, /* 16: IS shift 148 */ - { 172, 16, 128}, /* 17: likeop shift 128 */ - { 69, 0, 147}, /* 18: ISNULL shift 147 */ - { 96, 0, 143}, /* 19: REM shift 143 */ - { 42, 0, 118}, /* 20: EQ shift 118 */ - { 24, 0, 145}, /* 21: CONCAT shift 145 */ - { 73, 0, 112}, /* 22: LE shift 112 */ - { 74, 0, 133}, /* 23: LIKE shift 133 */ - { 51, 0, 114}, /* 24: GE shift 114 */ - { 102, 21, 126}, /* 25: RSHIFT shift 126 */ - { 77, 24, 124}, /* 26: LSHIFT shift 124 */ + { 84, 0, 118}, /* 1: NE shift 118 */ + { 85, 4, 132}, /* 2: NOT shift 132 */ + { 86, 0, 154}, /* 3: NOTNULL shift 154 */ + { 57, 0, 112}, /* 4: GT shift 112 */ + { 63, 0, 159}, /* 5: IN shift 159 */ + { 5, 0, 218}, /* 6: AND shift 218 */ + { 71, 0, 150}, /* 7: IS shift 150 */ + { 91, 5, 108}, /* 8: OR shift 108 */ + { 92, 0, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 10: likeop shift 130 */ + { 94, 0, 137}, /* 11: PLUS shift 137 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 12, 0, 122}, /* 13: BITAND shift 122 */ + { 77, 0, 135}, /* 14: LIKE shift 135 */ + { 14, 0, 124}, /* 15: BITOR shift 124 */ + { 99, 7, 145}, /* 16: REM shift 145 */ + { 72, 0, 149}, /* 17: ISNULL shift 149 */ + { 45, 0, 120}, /* 18: EQ shift 120 */ + { 81, 20, 110}, /* 19: LT shift 110 */ + { 25, 0, 147}, /* 20: CONCAT shift 147 */ + { 76, 0, 114}, /* 21: LE shift 114 */ + { 105, 14, 128}, /* 22: RSHIFT shift 128 */ + { 83, 24, 139}, /* 23: MINUS shift 139 */ + { 55, 0, 136}, /* 24: GLOB shift 136 */ + { 80, 0, 126}, /* 25: LSHIFT shift 126 */ + { 109, 19, 143}, /* 26: SLASH shift 143 */ + { 54, 0, 116}, /* 27: GE shift 116 */ + { 111, 23, 141}, /* 28: STAR shift 141 */ /* State 218 */ - { 76, 0, 219}, /* 1: LP shift 219 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 219}, /* 8: expr shift 219 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 219 */ - { 80, 0, 172}, /* 1: MINUS shift 172 */ - { 181, 0, 69}, /* 2: oneselect shift 69 */ - { 82, 0, 168}, /* 3: NOT shift 168 */ - { 103, 0, 73}, /* 4: SELECT shift 73 */ - { 84, 0, 101}, /* 5: NULL shift 101 */ - { 65, 0, 166}, /* 6: INTEGER shift 166 */ - { 46, 0, 167}, /* 7: FLOAT shift 167 */ - { 71, 0, 67}, /* 8: JOIN_KW shift 67 */ - { 152, 10, 165}, /* 9: expr shift 165 */ - { 12, 0, 170}, /* 10: BITNOT shift 170 */ - { 110, 0, 66}, /* 11: STRING shift 66 */ - { 91, 8, 174}, /* 12: PLUS shift 174 */ - { 192, 9, 220}, /* 13: select shift 220 */ - { 153, 0, 212}, /* 14: expritem shift 212 */ - { 154, 16, 222}, /* 15: exprlist shift 222 */ - { 94, 0, 186}, /* 16: RAISE shift 186 */ - { 76, 19, 68}, /* 17: LP shift 68 */ - { 177, 0, 102}, /* 18: nm shift 102 */ - { 56, 20, 64}, /* 19: ID shift 64 */ - { 16, 0, 176}, /* 20: CASE shift 176 */ + { 54, 0, 116}, /* 1: GE shift 116 */ + { 105, 0, 128}, /* 2: RSHIFT shift 128 */ + { 80, 1, 126}, /* 3: LSHIFT shift 126 */ + { 81, 5, 110}, /* 4: LT shift 110 */ + { 55, 0, 136}, /* 5: GLOB shift 136 */ + { 109, 10, 143}, /* 6: SLASH shift 143 */ + { 84, 0, 118}, /* 7: NE shift 118 */ + { 111, 11, 141}, /* 8: STAR shift 141 */ + { 86, 0, 154}, /* 9: NOTNULL shift 154 */ + { 83, 14, 139}, /* 10: MINUS shift 139 */ + { 85, 0, 132}, /* 11: NOT shift 132 */ + { 63, 16, 159}, /* 12: IN shift 159 */ + { 12, 0, 122}, /* 13: BITAND shift 122 */ + { 57, 0, 112}, /* 14: GT shift 112 */ + { 92, 18, 99}, /* 15: ORACLE_OUTER_JOIN shift 99 */ + { 11, 0, 155}, /* 16: BETWEEN shift 155 */ + { 94, 0, 137}, /* 17: PLUS shift 137 */ + { 14, 0, 124}, /* 18: BITOR shift 124 */ + { 45, 0, 120}, /* 19: EQ shift 120 */ + { 71, 19, 150}, /* 20: IS shift 150 */ + { 72, 0, 149}, /* 21: ISNULL shift 149 */ + { 177, 23, 130}, /* 22: likeop shift 130 */ + { 99, 0, 145}, /* 23: REM shift 145 */ + { 25, 0, 147}, /* 24: CONCAT shift 147 */ + { 76, 0, 114}, /* 25: LE shift 114 */ + { 77, 24, 135}, /* 26: LIKE shift 135 */ /* State 220 */ - { 101, 3, 221}, /* 1: RP shift 221 */ - { 176, 1, 71}, /* 2: multiselect_op shift 71 */ - { 66, 0, 162}, /* 3: INTERSECT shift 162 */ - { 118, 5, 160}, /* 4: UNION shift 160 */ - { 43, 0, 163}, /* 5: EXCEPT shift 163 */ + { 79, 0, 221}, /* 1: LP shift 221 */ +/* State 221 */ + { 85, 0, 170}, /* 1: NOT shift 170 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 13, 0, 172}, /* 3: BITNOT shift 172 */ + { 83, 0, 174}, /* 4: MINUS shift 174 */ + { 74, 0, 67}, /* 5: JOIN_KW shift 67 */ + { 185, 1, 69}, /* 6: oneselect shift 69 */ + { 106, 0, 73}, /* 7: SELECT shift 73 */ + { 87, 0, 101}, /* 8: NULL shift 101 */ + { 68, 0, 168}, /* 9: INTEGER shift 168 */ + { 49, 0, 169}, /* 10: FLOAT shift 169 */ + { 97, 12, 188}, /* 11: RAISE shift 188 */ + { 17, 0, 178}, /* 12: CASE shift 178 */ + { 79, 16, 68}, /* 13: LP shift 68 */ + { 113, 3, 66}, /* 14: STRING shift 66 */ + { 94, 5, 176}, /* 15: PLUS shift 176 */ + { 59, 0, 64}, /* 16: ID shift 64 */ + { 196, 0, 222}, /* 17: select shift 222 */ + { 157, 11, 167}, /* 18: expr shift 167 */ + { 158, 0, 214}, /* 19: expritem shift 214 */ + { 159, 13, 224}, /* 20: exprlist shift 224 */ /* State 222 */ - { 21, 0, 210}, /* 1: COMMA shift 210 */ - { 101, 1, 223}, /* 2: RP shift 223 */ + { 180, 0, 71}, /* 1: multiselect_op shift 71 */ + { 121, 3, 162}, /* 2: UNION shift 162 */ + { 46, 0, 165}, /* 3: EXCEPT shift 165 */ + { 69, 0, 164}, /* 4: INTERSECT shift 164 */ + { 104, 4, 223}, /* 5: RP shift 223 */ /* State 224 */ - { 138, 0, 225}, /* 1: collate shift 225 */ - { 19, 0, 95}, /* 2: COLLATE shift 95 */ -/* State 225 */ - { 198, 0, 226}, /* 1: sortorder shift 226 */ - { 34, 3, 59}, /* 2: DESC shift 59 */ - { 7, 0, 58}, /* 3: ASC shift 58 */ + { 104, 2, 225}, /* 1: RP shift 225 */ + { 22, 0, 212}, /* 2: COMMA shift 212 */ +/* State 226 */ + { 20, 0, 95}, /* 1: COLLATE shift 95 */ + { 141, 0, 227}, /* 2: collate shift 227 */ /* State 227 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 228}, /* 3: expr shift 228 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ -/* State 228 */ - { 88, 2, 106}, /* 1: OR shift 106 */ - { 60, 0, 157}, /* 2: IN shift 157 */ - { 5, 0, 100}, /* 3: AND shift 100 */ - { 68, 0, 148}, /* 4: IS shift 148 */ - { 172, 1, 128}, /* 5: likeop shift 128 */ - { 89, 3, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ - { 13, 0, 122}, /* 7: BITOR shift 122 */ - { 91, 0, 135}, /* 8: PLUS shift 135 */ - { 74, 0, 133}, /* 9: LIKE shift 133 */ - { 78, 0, 108}, /* 10: LT shift 108 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ - { 96, 4, 143}, /* 13: REM shift 143 */ - { 69, 7, 147}, /* 14: ISNULL shift 147 */ - { 42, 0, 118}, /* 15: EQ shift 118 */ - { 80, 17, 137}, /* 16: MINUS shift 137 */ - { 52, 20, 134}, /* 17: GLOB shift 134 */ - { 73, 0, 112}, /* 18: LE shift 112 */ - { 102, 9, 126}, /* 19: RSHIFT shift 126 */ - { 24, 0, 145}, /* 20: CONCAT shift 145 */ - { 54, 0, 110}, /* 21: GT shift 110 */ - { 77, 0, 124}, /* 22: LSHIFT shift 124 */ - { 106, 10, 141}, /* 23: SLASH shift 141 */ - { 51, 0, 114}, /* 24: GE shift 114 */ - { 108, 16, 139}, /* 25: STAR shift 139 */ - { 81, 0, 116}, /* 26: NE shift 116 */ - { 82, 21, 130}, /* 27: NOT shift 130 */ - { 83, 0, 152}, /* 28: NOTNULL shift 152 */ + { 36, 0, 59}, /* 1: DESC shift 59 */ + { 202, 3, 228}, /* 2: sortorder shift 228 */ + { 7, 0, 58}, /* 3: ASC shift 58 */ /* State 229 */ - { 14, 0, 230}, /* 1: BY shift 230 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 230}, /* 8: expr shift 230 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 230 */ - { 153, 0, 212}, /* 1: expritem shift 212 */ - { 154, 0, 231}, /* 2: exprlist shift 231 */ - { 76, 0, 68}, /* 3: LP shift 68 */ - { 71, 0, 67}, /* 4: JOIN_KW shift 67 */ - { 46, 11, 167}, /* 5: FLOAT shift 167 */ - { 56, 0, 64}, /* 6: ID shift 64 */ - { 91, 0, 174}, /* 7: PLUS shift 174 */ - { 177, 0, 102}, /* 8: nm shift 102 */ - { 110, 3, 66}, /* 9: STRING shift 66 */ - { 94, 0, 186}, /* 10: RAISE shift 186 */ - { 12, 0, 170}, /* 11: BITNOT shift 170 */ - { 65, 0, 166}, /* 12: INTEGER shift 166 */ - { 80, 5, 172}, /* 13: MINUS shift 172 */ - { 84, 16, 101}, /* 14: NULL shift 101 */ - { 82, 12, 168}, /* 15: NOT shift 168 */ - { 16, 0, 176}, /* 16: CASE shift 176 */ - { 152, 14, 165}, /* 17: expr shift 165 */ + { 84, 0, 118}, /* 1: NE shift 118 */ + { 85, 4, 132}, /* 2: NOT shift 132 */ + { 86, 0, 154}, /* 3: NOTNULL shift 154 */ + { 57, 0, 112}, /* 4: GT shift 112 */ + { 63, 0, 159}, /* 5: IN shift 159 */ + { 5, 0, 100}, /* 6: AND shift 100 */ + { 71, 0, 150}, /* 7: IS shift 150 */ + { 91, 5, 108}, /* 8: OR shift 108 */ + { 92, 0, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 10: likeop shift 130 */ + { 94, 0, 137}, /* 11: PLUS shift 137 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 12, 0, 122}, /* 13: BITAND shift 122 */ + { 77, 0, 135}, /* 14: LIKE shift 135 */ + { 14, 0, 124}, /* 15: BITOR shift 124 */ + { 99, 7, 145}, /* 16: REM shift 145 */ + { 72, 0, 149}, /* 17: ISNULL shift 149 */ + { 45, 0, 120}, /* 18: EQ shift 120 */ + { 81, 20, 110}, /* 19: LT shift 110 */ + { 25, 0, 147}, /* 20: CONCAT shift 147 */ + { 76, 0, 114}, /* 21: LE shift 114 */ + { 105, 14, 128}, /* 22: RSHIFT shift 128 */ + { 83, 24, 139}, /* 23: MINUS shift 139 */ + { 55, 0, 136}, /* 24: GLOB shift 136 */ + { 80, 0, 126}, /* 25: LSHIFT shift 126 */ + { 109, 19, 143}, /* 26: SLASH shift 143 */ + { 54, 0, 116}, /* 27: GE shift 116 */ + { 111, 23, 141}, /* 28: STAR shift 141 */ /* State 231 */ - { 21, 0, 210}, /* 1: COMMA shift 210 */ + { 15, 0, 232}, /* 1: BY shift 232 */ /* State 232 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 233}, /* 3: expr shift 233 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 85, 2, 170}, /* 1: NOT shift 170 */ + { 68, 4, 168}, /* 2: INTEGER shift 168 */ + { 87, 0, 101}, /* 3: NULL shift 101 */ + { 17, 0, 178}, /* 4: CASE shift 178 */ + { 157, 0, 167}, /* 5: expr shift 167 */ + { 158, 0, 214}, /* 6: expritem shift 214 */ + { 159, 8, 233}, /* 7: exprlist shift 233 */ + { 74, 0, 67}, /* 8: JOIN_KW shift 67 */ + { 59, 0, 64}, /* 9: ID shift 64 */ + { 94, 0, 176}, /* 10: PLUS shift 176 */ + { 113, 15, 66}, /* 11: STRING shift 66 */ + { 181, 11, 102}, /* 12: nm shift 102 */ + { 97, 0, 188}, /* 13: RAISE shift 188 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 79, 0, 68}, /* 15: LP shift 68 */ + { 83, 17, 174}, /* 16: MINUS shift 174 */ + { 49, 0, 169}, /* 17: FLOAT shift 169 */ /* State 233 */ - { 88, 2, 106}, /* 1: OR shift 106 */ - { 60, 0, 157}, /* 2: IN shift 157 */ - { 5, 0, 100}, /* 3: AND shift 100 */ - { 68, 0, 148}, /* 4: IS shift 148 */ - { 172, 1, 128}, /* 5: likeop shift 128 */ - { 89, 3, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ - { 13, 0, 122}, /* 7: BITOR shift 122 */ - { 91, 0, 135}, /* 8: PLUS shift 135 */ - { 74, 0, 133}, /* 9: LIKE shift 133 */ - { 78, 0, 108}, /* 10: LT shift 108 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ - { 96, 4, 143}, /* 13: REM shift 143 */ - { 69, 7, 147}, /* 14: ISNULL shift 147 */ - { 42, 0, 118}, /* 15: EQ shift 118 */ - { 80, 17, 137}, /* 16: MINUS shift 137 */ - { 52, 20, 134}, /* 17: GLOB shift 134 */ - { 73, 0, 112}, /* 18: LE shift 112 */ - { 102, 9, 126}, /* 19: RSHIFT shift 126 */ - { 24, 0, 145}, /* 20: CONCAT shift 145 */ - { 54, 0, 110}, /* 21: GT shift 110 */ - { 77, 0, 124}, /* 22: LSHIFT shift 124 */ - { 106, 10, 141}, /* 23: SLASH shift 141 */ - { 51, 0, 114}, /* 24: GE shift 114 */ - { 108, 16, 139}, /* 25: STAR shift 139 */ - { 81, 0, 116}, /* 26: NE shift 116 */ - { 82, 21, 130}, /* 27: NOT shift 130 */ - { 83, 0, 152}, /* 28: NOTNULL shift 152 */ + { 22, 0, 212}, /* 1: COMMA shift 212 */ +/* State 234 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 235}, /* 8: expr shift 235 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 235 */ - { 193, 0, 236}, /* 1: seltablist shift 236 */ - { 199, 1, 246}, /* 2: stl_prefix shift 246 */ -/* State 236 */ - { 70, 0, 239}, /* 1: JOIN shift 239 */ - { 21, 0, 238}, /* 2: COMMA shift 238 */ - { 170, 1, 237}, /* 3: joinop shift 237 */ - { 71, 0, 240}, /* 4: JOIN_KW shift 240 */ -/* State 240 */ - { 110, 4, 21}, /* 1: STRING shift 21 */ - { 71, 5, 22}, /* 2: JOIN_KW shift 22 */ - { 177, 0, 242}, /* 3: nm shift 242 */ - { 70, 0, 241}, /* 4: JOIN shift 241 */ - { 56, 0, 20}, /* 5: ID shift 20 */ + { 84, 0, 118}, /* 1: NE shift 118 */ + { 85, 4, 132}, /* 2: NOT shift 132 */ + { 86, 0, 154}, /* 3: NOTNULL shift 154 */ + { 57, 0, 112}, /* 4: GT shift 112 */ + { 63, 0, 159}, /* 5: IN shift 159 */ + { 5, 0, 100}, /* 6: AND shift 100 */ + { 71, 0, 150}, /* 7: IS shift 150 */ + { 91, 5, 108}, /* 8: OR shift 108 */ + { 92, 0, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 10: likeop shift 130 */ + { 94, 0, 137}, /* 11: PLUS shift 137 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 12, 0, 122}, /* 13: BITAND shift 122 */ + { 77, 0, 135}, /* 14: LIKE shift 135 */ + { 14, 0, 124}, /* 15: BITOR shift 124 */ + { 99, 7, 145}, /* 16: REM shift 145 */ + { 72, 0, 149}, /* 17: ISNULL shift 149 */ + { 45, 0, 120}, /* 18: EQ shift 120 */ + { 81, 20, 110}, /* 19: LT shift 110 */ + { 25, 0, 147}, /* 20: CONCAT shift 147 */ + { 76, 0, 114}, /* 21: LE shift 114 */ + { 105, 14, 128}, /* 22: RSHIFT shift 128 */ + { 83, 24, 139}, /* 23: MINUS shift 139 */ + { 55, 0, 136}, /* 24: GLOB shift 136 */ + { 80, 0, 126}, /* 25: LSHIFT shift 126 */ + { 109, 19, 143}, /* 26: SLASH shift 143 */ + { 54, 0, 116}, /* 27: GE shift 116 */ + { 111, 23, 141}, /* 28: STAR shift 141 */ +/* State 237 */ + { 197, 0, 238}, /* 1: seltablist shift 238 */ + { 203, 1, 248}, /* 2: stl_prefix shift 248 */ +/* State 238 */ + { 22, 0, 240}, /* 1: COMMA shift 240 */ + { 73, 0, 241}, /* 2: JOIN shift 241 */ + { 74, 1, 242}, /* 3: JOIN_KW shift 242 */ + { 175, 0, 239}, /* 4: joinop shift 239 */ /* State 242 */ - { 110, 4, 21}, /* 1: STRING shift 21 */ - { 71, 5, 22}, /* 2: JOIN_KW shift 22 */ - { 177, 0, 244}, /* 3: nm shift 244 */ - { 70, 0, 243}, /* 4: JOIN shift 243 */ - { 56, 0, 20}, /* 5: ID shift 20 */ + { 73, 0, 243}, /* 1: JOIN shift 243 */ + { 181, 0, 244}, /* 2: nm shift 244 */ + { 59, 0, 20}, /* 3: ID shift 20 */ + { 113, 1, 21}, /* 4: STRING shift 21 */ + { 74, 3, 22}, /* 5: JOIN_KW shift 22 */ /* State 244 */ - { 70, 0, 245}, /* 1: JOIN shift 245 */ + { 73, 0, 245}, /* 1: JOIN shift 245 */ + { 181, 0, 246}, /* 2: nm shift 246 */ + { 59, 0, 20}, /* 3: ID shift 20 */ + { 113, 1, 21}, /* 4: STRING shift 21 */ + { 74, 3, 22}, /* 5: JOIN_KW shift 22 */ /* State 246 */ - { 110, 0, 21}, /* 1: STRING shift 21 */ - { 76, 4, 266}, /* 2: LP shift 266 */ - { 177, 0, 247}, /* 3: nm shift 247 */ - { 71, 5, 22}, /* 4: JOIN_KW shift 22 */ - { 56, 0, 20}, /* 5: ID shift 20 */ -/* State 247 */ - { 160, 3, 252}, /* 1: ids shift 252 */ - { 56, 5, 248}, /* 2: ID shift 248 */ - { 110, 0, 249}, /* 3: STRING shift 249 */ - { 128, 0, 253}, /* 4: as shift 253 */ - { 6, 0, 250}, /* 5: AS shift 250 */ + { 73, 0, 247}, /* 1: JOIN shift 247 */ +/* State 248 */ + { 74, 3, 22}, /* 1: JOIN_KW shift 22 */ + { 181, 0, 249}, /* 2: nm shift 249 */ + { 59, 0, 20}, /* 3: ID shift 20 */ + { 113, 0, 21}, /* 4: STRING shift 21 */ + { 79, 1, 272}, /* 5: LP shift 272 */ +/* State 249 */ + { 150, 0, 250}, /* 1: dbnm shift 250 */ + { 39, 0, 270}, /* 2: DOT shift 270 */ /* State 250 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 251}, /* 2: nm shift 251 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 165, 0, 255}, /* 1: ids shift 255 */ + { 131, 3, 256}, /* 2: as shift 256 */ + { 6, 0, 253}, /* 3: AS shift 253 */ + { 113, 0, 252}, /* 4: STRING shift 252 */ + { 59, 0, 251}, /* 5: ID shift 251 */ /* State 253 */ - { 87, 0, 264}, /* 1: ON shift 264 */ - { 179, 1, 254}, /* 2: on_opt shift 254 */ -/* State 254 */ - { 210, 2, 255}, /* 1: using_opt shift 255 */ - { 122, 0, 256}, /* 2: USING shift 256 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 254}, /* 2: nm shift 254 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 256 */ - { 76, 0, 257}, /* 1: LP shift 257 */ + { 90, 0, 268}, /* 1: ON shift 268 */ + { 183, 0, 257}, /* 2: on_opt shift 257 */ /* State 257 */ - { 162, 0, 258}, /* 1: idxlist shift 258 */ - { 56, 0, 20}, /* 2: ID shift 20 */ - { 110, 2, 21}, /* 3: STRING shift 21 */ - { 177, 0, 262}, /* 4: nm shift 262 */ - { 71, 0, 22}, /* 5: JOIN_KW shift 22 */ - { 161, 5, 263}, /* 6: idxitem shift 263 */ -/* State 258 */ - { 21, 0, 260}, /* 1: COMMA shift 260 */ - { 101, 1, 259}, /* 2: RP shift 259 */ + { 125, 0, 259}, /* 1: USING shift 259 */ + { 215, 1, 258}, /* 2: using_opt shift 258 */ +/* State 259 */ + { 79, 0, 260}, /* 1: LP shift 260 */ /* State 260 */ - { 110, 0, 21}, /* 1: STRING shift 21 */ - { 161, 4, 261}, /* 2: idxitem shift 261 */ - { 177, 0, 262}, /* 3: nm shift 262 */ - { 71, 5, 22}, /* 4: JOIN_KW shift 22 */ - { 56, 0, 20}, /* 5: ID shift 20 */ -/* State 264 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 265}, /* 3: expr shift 265 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 113, 4, 21}, /* 1: STRING shift 21 */ + { 181, 0, 265}, /* 2: nm shift 265 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ + { 166, 0, 267}, /* 5: idxitem shift 267 */ + { 167, 1, 261}, /* 6: idxlist shift 261 */ +/* State 261 */ + { 104, 2, 262}, /* 1: RP shift 262 */ + { 22, 0, 263}, /* 2: COMMA shift 263 */ +/* State 263 */ + { 166, 0, 264}, /* 1: idxitem shift 264 */ + { 181, 1, 265}, /* 2: nm shift 265 */ + { 59, 0, 20}, /* 3: ID shift 20 */ + { 113, 0, 21}, /* 4: STRING shift 21 */ + { 74, 3, 22}, /* 5: JOIN_KW shift 22 */ /* State 265 */ - { 88, 2, 106}, /* 1: OR shift 106 */ - { 60, 0, 157}, /* 2: IN shift 157 */ - { 5, 0, 100}, /* 3: AND shift 100 */ - { 68, 0, 148}, /* 4: IS shift 148 */ - { 172, 1, 128}, /* 5: likeop shift 128 */ - { 89, 3, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ - { 13, 0, 122}, /* 7: BITOR shift 122 */ - { 91, 0, 135}, /* 8: PLUS shift 135 */ - { 74, 0, 133}, /* 9: LIKE shift 133 */ - { 78, 0, 108}, /* 10: LT shift 108 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ - { 96, 4, 143}, /* 13: REM shift 143 */ - { 69, 7, 147}, /* 14: ISNULL shift 147 */ - { 42, 0, 118}, /* 15: EQ shift 118 */ - { 80, 17, 137}, /* 16: MINUS shift 137 */ - { 52, 20, 134}, /* 17: GLOB shift 134 */ - { 73, 0, 112}, /* 18: LE shift 112 */ - { 102, 9, 126}, /* 19: RSHIFT shift 126 */ - { 24, 0, 145}, /* 20: CONCAT shift 145 */ - { 54, 0, 110}, /* 21: GT shift 110 */ - { 77, 0, 124}, /* 22: LSHIFT shift 124 */ - { 106, 10, 141}, /* 23: SLASH shift 141 */ - { 51, 0, 114}, /* 24: GE shift 114 */ - { 108, 16, 139}, /* 25: STAR shift 139 */ - { 81, 0, 116}, /* 26: NE shift 116 */ - { 82, 21, 130}, /* 27: NOT shift 130 */ - { 83, 0, 152}, /* 28: NOTNULL shift 152 */ -/* State 266 */ - { 192, 0, 267}, /* 1: select shift 267 */ - { 181, 3, 69}, /* 2: oneselect shift 69 */ - { 103, 0, 73}, /* 3: SELECT shift 73 */ -/* State 267 */ - { 101, 3, 268}, /* 1: RP shift 268 */ - { 176, 1, 71}, /* 2: multiselect_op shift 71 */ - { 66, 0, 162}, /* 3: INTERSECT shift 162 */ - { 118, 5, 160}, /* 4: UNION shift 160 */ - { 43, 0, 163}, /* 5: EXCEPT shift 163 */ + { 36, 0, 59}, /* 1: DESC shift 59 */ + { 202, 3, 266}, /* 2: sortorder shift 266 */ + { 7, 0, 58}, /* 3: ASC shift 58 */ /* State 268 */ - { 160, 3, 252}, /* 1: ids shift 252 */ - { 56, 5, 248}, /* 2: ID shift 248 */ - { 110, 0, 249}, /* 3: STRING shift 249 */ - { 128, 0, 269}, /* 4: as shift 269 */ - { 6, 0, 250}, /* 5: AS shift 250 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 269}, /* 8: expr shift 269 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 269 */ - { 87, 0, 264}, /* 1: ON shift 264 */ - { 179, 1, 270}, /* 2: on_opt shift 270 */ + { 84, 0, 118}, /* 1: NE shift 118 */ + { 85, 4, 132}, /* 2: NOT shift 132 */ + { 86, 0, 154}, /* 3: NOTNULL shift 154 */ + { 57, 0, 112}, /* 4: GT shift 112 */ + { 63, 0, 159}, /* 5: IN shift 159 */ + { 5, 0, 100}, /* 6: AND shift 100 */ + { 71, 0, 150}, /* 7: IS shift 150 */ + { 91, 5, 108}, /* 8: OR shift 108 */ + { 92, 0, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 10: likeop shift 130 */ + { 94, 0, 137}, /* 11: PLUS shift 137 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 12, 0, 122}, /* 13: BITAND shift 122 */ + { 77, 0, 135}, /* 14: LIKE shift 135 */ + { 14, 0, 124}, /* 15: BITOR shift 124 */ + { 99, 7, 145}, /* 16: REM shift 145 */ + { 72, 0, 149}, /* 17: ISNULL shift 149 */ + { 45, 0, 120}, /* 18: EQ shift 120 */ + { 81, 20, 110}, /* 19: LT shift 110 */ + { 25, 0, 147}, /* 20: CONCAT shift 147 */ + { 76, 0, 114}, /* 21: LE shift 114 */ + { 105, 14, 128}, /* 22: RSHIFT shift 128 */ + { 83, 24, 139}, /* 23: MINUS shift 139 */ + { 55, 0, 136}, /* 24: GLOB shift 136 */ + { 80, 0, 126}, /* 25: LSHIFT shift 126 */ + { 109, 19, 143}, /* 26: SLASH shift 143 */ + { 54, 0, 116}, /* 27: GE shift 116 */ + { 111, 23, 141}, /* 28: STAR shift 141 */ /* State 270 */ - { 210, 2, 271}, /* 1: using_opt shift 271 */ - { 122, 0, 256}, /* 2: USING shift 256 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 271}, /* 2: nm shift 271 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 272 */ - { 80, 4, 172}, /* 1: MINUS shift 172 */ - { 177, 6, 276}, /* 2: nm shift 276 */ - { 82, 0, 168}, /* 3: NOT shift 168 */ - { 16, 0, 176}, /* 4: CASE shift 176 */ - { 84, 0, 101}, /* 5: NULL shift 101 */ - { 65, 0, 166}, /* 6: INTEGER shift 166 */ - { 56, 0, 64}, /* 7: ID shift 64 */ - { 71, 0, 67}, /* 8: JOIN_KW shift 67 */ - { 152, 7, 273}, /* 9: expr shift 273 */ - { 76, 11, 68}, /* 10: LP shift 68 */ - { 12, 0, 170}, /* 11: BITNOT shift 170 */ - { 91, 0, 174}, /* 12: PLUS shift 174 */ - { 108, 10, 275}, /* 13: STAR shift 275 */ - { 94, 16, 186}, /* 14: RAISE shift 186 */ - { 110, 14, 66}, /* 15: STRING shift 66 */ - { 46, 0, 167}, /* 16: FLOAT shift 167 */ + { 106, 0, 73}, /* 1: SELECT shift 73 */ + { 196, 1, 273}, /* 2: select shift 273 */ + { 185, 0, 69}, /* 3: oneselect shift 69 */ /* State 273 */ - { 69, 0, 147}, /* 1: ISNULL shift 147 */ - { 106, 5, 141}, /* 2: SLASH shift 141 */ - { 68, 0, 148}, /* 3: IS shift 148 */ - { 102, 1, 126}, /* 4: RSHIFT shift 126 */ - { 73, 0, 112}, /* 5: LE shift 112 */ - { 5, 0, 100}, /* 6: AND shift 100 */ - { 6, 0, 250}, /* 7: AS shift 250 */ - { 172, 2, 128}, /* 8: likeop shift 128 */ - { 74, 0, 133}, /* 9: LIKE shift 133 */ - { 108, 21, 139}, /* 10: STAR shift 139 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 110, 27, 249}, /* 12: STRING shift 249 */ - { 78, 0, 108}, /* 13: LT shift 108 */ - { 13, 0, 122}, /* 14: BITOR shift 122 */ - { 80, 0, 137}, /* 15: MINUS shift 137 */ - { 81, 0, 116}, /* 16: NE shift 116 */ - { 82, 0, 130}, /* 17: NOT shift 130 */ - { 83, 0, 152}, /* 18: NOTNULL shift 152 */ - { 51, 0, 114}, /* 19: GE shift 114 */ - { 52, 0, 134}, /* 20: GLOB shift 134 */ - { 42, 0, 118}, /* 21: EQ shift 118 */ - { 54, 0, 110}, /* 22: GT shift 110 */ - { 88, 0, 106}, /* 23: OR shift 106 */ - { 89, 32, 99}, /* 24: ORACLE_OUTER_JOIN shift 99 */ - { 24, 0, 145}, /* 25: CONCAT shift 145 */ - { 91, 0, 135}, /* 26: PLUS shift 135 */ - { 77, 33, 124}, /* 27: LSHIFT shift 124 */ - { 60, 0, 157}, /* 28: IN shift 157 */ - { 160, 0, 252}, /* 29: ids shift 252 */ - { 128, 0, 274}, /* 30: as shift 274 */ - { 96, 0, 143}, /* 31: REM shift 143 */ - { 56, 0, 248}, /* 32: ID shift 248 */ - { 11, 0, 120}, /* 33: BITAND shift 120 */ + { 180, 0, 71}, /* 1: multiselect_op shift 71 */ + { 121, 3, 162}, /* 2: UNION shift 162 */ + { 46, 0, 165}, /* 3: EXCEPT shift 165 */ + { 69, 0, 164}, /* 4: INTERSECT shift 164 */ + { 104, 4, 274}, /* 5: RP shift 274 */ +/* State 274 */ + { 165, 0, 255}, /* 1: ids shift 255 */ + { 131, 3, 275}, /* 2: as shift 275 */ + { 6, 0, 253}, /* 3: AS shift 253 */ + { 113, 0, 252}, /* 4: STRING shift 252 */ + { 59, 0, 251}, /* 5: ID shift 251 */ +/* State 275 */ + { 90, 0, 268}, /* 1: ON shift 268 */ + { 183, 0, 276}, /* 2: on_opt shift 276 */ /* State 276 */ - { 36, 0, 277}, /* 1: DOT shift 277 */ -/* State 277 */ - { 110, 0, 21}, /* 1: STRING shift 21 */ - { 71, 5, 22}, /* 2: JOIN_KW shift 22 */ - { 177, 0, 104}, /* 3: nm shift 104 */ - { 108, 0, 278}, /* 4: STAR shift 278 */ - { 56, 0, 20}, /* 5: ID shift 20 */ + { 125, 0, 259}, /* 1: USING shift 259 */ + { 215, 1, 277}, /* 2: using_opt shift 277 */ +/* State 278 */ + { 97, 3, 188}, /* 1: RAISE shift 188 */ + { 113, 1, 66}, /* 2: STRING shift 66 */ + { 49, 7, 169}, /* 3: FLOAT shift 169 */ + { 83, 0, 174}, /* 4: MINUS shift 174 */ + { 68, 0, 168}, /* 5: INTEGER shift 168 */ + { 181, 9, 282}, /* 6: nm shift 282 */ + { 17, 0, 178}, /* 7: CASE shift 178 */ + { 87, 0, 101}, /* 8: NULL shift 101 */ + { 85, 0, 170}, /* 9: NOT shift 170 */ + { 13, 0, 172}, /* 10: BITNOT shift 172 */ + { 74, 0, 67}, /* 11: JOIN_KW shift 67 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 79, 0, 68}, /* 13: LP shift 68 */ + { 157, 10, 279}, /* 14: expr shift 279 */ + { 94, 0, 176}, /* 15: PLUS shift 176 */ + { 111, 13, 281}, /* 16: STAR shift 281 */ +/* State 279 */ + { 165, 2, 255}, /* 1: ids shift 255 */ + { 99, 0, 145}, /* 2: REM shift 145 */ + { 5, 0, 100}, /* 3: AND shift 100 */ + { 72, 5, 149}, /* 4: ISNULL shift 149 */ + { 6, 0, 253}, /* 5: AS shift 253 */ + { 71, 3, 150}, /* 6: IS shift 150 */ + { 105, 4, 128}, /* 7: RSHIFT shift 128 */ + { 76, 0, 114}, /* 8: LE shift 114 */ + { 11, 0, 155}, /* 9: BETWEEN shift 155 */ + { 111, 14, 141}, /* 10: STAR shift 141 */ + { 109, 8, 143}, /* 11: SLASH shift 143 */ + { 77, 9, 135}, /* 12: LIKE shift 135 */ + { 177, 10, 130}, /* 13: likeop shift 130 */ + { 45, 17, 120}, /* 14: EQ shift 120 */ + { 113, 24, 252}, /* 15: STRING shift 252 */ + { 81, 0, 110}, /* 16: LT shift 110 */ + { 12, 0, 122}, /* 17: BITAND shift 122 */ + { 83, 0, 139}, /* 18: MINUS shift 139 */ + { 84, 0, 118}, /* 19: NE shift 118 */ + { 85, 0, 132}, /* 20: NOT shift 132 */ + { 86, 0, 154}, /* 21: NOTNULL shift 154 */ + { 54, 0, 116}, /* 22: GE shift 116 */ + { 55, 0, 136}, /* 23: GLOB shift 136 */ + { 80, 28, 126}, /* 24: LSHIFT shift 126 */ + { 57, 0, 112}, /* 25: GT shift 112 */ + { 91, 30, 108}, /* 26: OR shift 108 */ + { 92, 32, 99}, /* 27: ORACLE_OUTER_JOIN shift 99 */ + { 14, 0, 124}, /* 28: BITOR shift 124 */ + { 94, 0, 137}, /* 29: PLUS shift 137 */ + { 25, 0, 147}, /* 30: CONCAT shift 147 */ + { 63, 0, 159}, /* 31: IN shift 159 */ + { 59, 0, 251}, /* 32: ID shift 251 */ + { 131, 0, 280}, /* 33: as shift 280 */ /* State 282 */ - { 60, 0, 157}, /* 1: IN shift 157 */ - { 88, 0, 106}, /* 2: OR shift 106 */ - { 89, 1, 99}, /* 3: ORACLE_OUTER_JOIN shift 99 */ - { 10, 0, 153}, /* 4: BETWEEN shift 153 */ - { 91, 0, 135}, /* 5: PLUS shift 135 */ - { 5, 0, 100}, /* 6: AND shift 100 */ - { 11, 0, 120}, /* 7: BITAND shift 120 */ - { 13, 0, 122}, /* 8: BITOR shift 122 */ - { 73, 0, 112}, /* 9: LE shift 112 */ - { 96, 0, 143}, /* 10: REM shift 143 */ - { 68, 4, 148}, /* 11: IS shift 148 */ - { 69, 7, 147}, /* 12: ISNULL shift 147 */ - { 77, 0, 124}, /* 13: LSHIFT shift 124 */ - { 42, 8, 118}, /* 14: EQ shift 118 */ - { 101, 0, 283}, /* 15: RP shift 283 */ - { 102, 9, 126}, /* 16: RSHIFT shift 126 */ - { 74, 0, 133}, /* 17: LIKE shift 133 */ - { 51, 0, 114}, /* 18: GE shift 114 */ - { 52, 0, 134}, /* 19: GLOB shift 134 */ - { 106, 13, 141}, /* 20: SLASH shift 141 */ - { 78, 0, 108}, /* 21: LT shift 108 */ - { 108, 0, 139}, /* 22: STAR shift 139 */ - { 80, 18, 137}, /* 23: MINUS shift 137 */ - { 81, 19, 116}, /* 24: NE shift 116 */ - { 82, 27, 130}, /* 25: NOT shift 130 */ - { 83, 29, 152}, /* 26: NOTNULL shift 152 */ - { 24, 0, 145}, /* 27: CONCAT shift 145 */ - { 172, 0, 128}, /* 28: likeop shift 128 */ - { 54, 0, 110}, /* 29: GT shift 110 */ -/* State 284 */ - { 21, 0, 210}, /* 1: COMMA shift 210 */ - { 101, 1, 285}, /* 2: RP shift 285 */ -/* State 286 */ - { 101, 0, 287}, /* 1: RP shift 287 */ + { 39, 0, 283}, /* 1: DOT shift 283 */ +/* State 283 */ + { 111, 0, 284}, /* 1: STAR shift 284 */ + { 181, 1, 104}, /* 2: nm shift 104 */ + { 59, 0, 20}, /* 3: ID shift 20 */ + { 113, 0, 21}, /* 4: STRING shift 21 */ + { 74, 3, 22}, /* 5: JOIN_KW shift 22 */ /* State 288 */ - { 60, 0, 157}, /* 1: IN shift 157 */ - { 88, 0, 106}, /* 2: OR shift 106 */ - { 89, 1, 99}, /* 3: ORACLE_OUTER_JOIN shift 99 */ - { 10, 0, 153}, /* 4: BETWEEN shift 153 */ - { 91, 0, 135}, /* 5: PLUS shift 135 */ - { 5, 0, 100}, /* 6: AND shift 100 */ - { 11, 0, 120}, /* 7: BITAND shift 120 */ - { 13, 0, 122}, /* 8: BITOR shift 122 */ - { 73, 0, 112}, /* 9: LE shift 112 */ - { 96, 0, 143}, /* 10: REM shift 143 */ - { 68, 4, 148}, /* 11: IS shift 148 */ - { 69, 7, 147}, /* 12: ISNULL shift 147 */ - { 77, 0, 124}, /* 13: LSHIFT shift 124 */ - { 42, 8, 118}, /* 14: EQ shift 118 */ - { 101, 0, 289}, /* 15: RP shift 289 */ - { 102, 9, 126}, /* 16: RSHIFT shift 126 */ - { 74, 0, 133}, /* 17: LIKE shift 133 */ - { 51, 0, 114}, /* 18: GE shift 114 */ - { 52, 0, 134}, /* 19: GLOB shift 134 */ - { 106, 13, 141}, /* 20: SLASH shift 141 */ - { 78, 0, 108}, /* 21: LT shift 108 */ - { 108, 0, 139}, /* 22: STAR shift 139 */ - { 80, 18, 137}, /* 23: MINUS shift 137 */ - { 81, 19, 116}, /* 24: NE shift 116 */ - { 82, 27, 130}, /* 25: NOT shift 130 */ - { 83, 29, 152}, /* 26: NOTNULL shift 152 */ - { 24, 0, 145}, /* 27: CONCAT shift 145 */ - { 172, 0, 128}, /* 28: likeop shift 128 */ - { 54, 0, 110}, /* 29: GT shift 110 */ -/* State 289 */ - { 180, 0, 290}, /* 1: onconf shift 290 */ - { 87, 0, 10}, /* 2: ON shift 10 */ -/* State 291 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 292}, /* 2: nm shift 292 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 63, 2, 159}, /* 1: IN shift 159 */ + { 5, 0, 100}, /* 2: AND shift 100 */ + { 12, 0, 122}, /* 3: BITAND shift 122 */ + { 177, 0, 130}, /* 4: likeop shift 130 */ + { 91, 0, 108}, /* 5: OR shift 108 */ + { 92, 1, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ + { 14, 0, 124}, /* 7: BITOR shift 124 */ + { 94, 0, 137}, /* 8: PLUS shift 137 */ + { 76, 0, 114}, /* 9: LE shift 114 */ + { 80, 0, 126}, /* 10: LSHIFT shift 126 */ + { 54, 16, 116}, /* 11: GE shift 116 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 99, 3, 145}, /* 13: REM shift 145 */ + { 71, 0, 150}, /* 14: IS shift 150 */ + { 72, 7, 149}, /* 15: ISNULL shift 149 */ + { 25, 0, 147}, /* 16: CONCAT shift 147 */ + { 45, 0, 120}, /* 17: EQ shift 120 */ + { 104, 0, 289}, /* 18: RP shift 289 */ + { 105, 9, 128}, /* 19: RSHIFT shift 128 */ + { 77, 0, 135}, /* 20: LIKE shift 135 */ + { 55, 0, 136}, /* 21: GLOB shift 136 */ + { 57, 0, 112}, /* 22: GT shift 112 */ + { 109, 10, 143}, /* 23: SLASH shift 143 */ + { 81, 0, 110}, /* 24: LT shift 110 */ + { 111, 0, 141}, /* 25: STAR shift 141 */ + { 83, 11, 139}, /* 26: MINUS shift 139 */ + { 84, 21, 118}, /* 27: NE shift 118 */ + { 85, 0, 132}, /* 28: NOT shift 132 */ + { 86, 22, 154}, /* 29: NOTNULL shift 154 */ +/* State 290 */ + { 104, 2, 291}, /* 1: RP shift 291 */ + { 22, 0, 212}, /* 2: COMMA shift 212 */ /* State 292 */ - { 76, 0, 310}, /* 1: LP shift 310 */ - { 163, 0, 293}, /* 2: idxlist_opt shift 293 */ -/* State 293 */ - { 188, 0, 294}, /* 1: refargs shift 294 */ + { 104, 0, 293}, /* 1: RP shift 293 */ /* State 294 */ - { 87, 0, 298}, /* 1: ON shift 298 */ - { 187, 3, 295}, /* 2: refarg shift 295 */ - { 79, 0, 296}, /* 3: MATCH shift 296 */ -/* State 296 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 297}, /* 2: nm shift 297 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 63, 2, 159}, /* 1: IN shift 159 */ + { 5, 0, 100}, /* 2: AND shift 100 */ + { 12, 0, 122}, /* 3: BITAND shift 122 */ + { 177, 0, 130}, /* 4: likeop shift 130 */ + { 91, 0, 108}, /* 5: OR shift 108 */ + { 92, 1, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ + { 14, 0, 124}, /* 7: BITOR shift 124 */ + { 94, 0, 137}, /* 8: PLUS shift 137 */ + { 76, 0, 114}, /* 9: LE shift 114 */ + { 80, 0, 126}, /* 10: LSHIFT shift 126 */ + { 54, 16, 116}, /* 11: GE shift 116 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 99, 3, 145}, /* 13: REM shift 145 */ + { 71, 0, 150}, /* 14: IS shift 150 */ + { 72, 7, 149}, /* 15: ISNULL shift 149 */ + { 25, 0, 147}, /* 16: CONCAT shift 147 */ + { 45, 0, 120}, /* 17: EQ shift 120 */ + { 104, 0, 295}, /* 18: RP shift 295 */ + { 105, 9, 128}, /* 19: RSHIFT shift 128 */ + { 77, 0, 135}, /* 20: LIKE shift 135 */ + { 55, 0, 136}, /* 21: GLOB shift 136 */ + { 57, 0, 112}, /* 22: GT shift 112 */ + { 109, 10, 143}, /* 23: SLASH shift 143 */ + { 81, 0, 110}, /* 24: LT shift 110 */ + { 111, 0, 141}, /* 25: STAR shift 141 */ + { 83, 11, 139}, /* 26: MINUS shift 139 */ + { 84, 21, 118}, /* 27: NE shift 118 */ + { 85, 0, 132}, /* 28: NOT shift 132 */ + { 86, 22, 154}, /* 29: NOTNULL shift 154 */ +/* State 295 */ + { 184, 2, 296}, /* 1: onconf shift 296 */ + { 90, 0, 10}, /* 2: ON shift 10 */ +/* State 297 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 298}, /* 2: nm shift 298 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 298 */ - { 120, 2, 306}, /* 1: UPDATE shift 306 */ - { 63, 0, 308}, /* 2: INSERT shift 308 */ - { 32, 0, 299}, /* 3: DELETE shift 299 */ + { 168, 0, 299}, /* 1: idxlist_opt shift 299 */ + { 79, 0, 316}, /* 2: LP shift 316 */ /* State 299 */ - { 98, 0, 305}, /* 1: RESTRICT shift 305 */ - { 105, 0, 301}, /* 2: SET shift 301 */ - { 186, 1, 300}, /* 3: refact shift 300 */ - { 15, 0, 304}, /* 4: CASCADE shift 304 */ -/* State 301 */ - { 84, 0, 302}, /* 1: NULL shift 302 */ - { 29, 0, 303}, /* 2: DEFAULT shift 303 */ -/* State 306 */ - { 98, 0, 305}, /* 1: RESTRICT shift 305 */ - { 105, 0, 301}, /* 2: SET shift 301 */ - { 186, 1, 307}, /* 3: refact shift 307 */ - { 15, 0, 304}, /* 4: CASCADE shift 304 */ -/* State 308 */ - { 98, 0, 305}, /* 1: RESTRICT shift 305 */ - { 105, 0, 301}, /* 2: SET shift 301 */ - { 186, 1, 309}, /* 3: refact shift 309 */ - { 15, 0, 304}, /* 4: CASCADE shift 304 */ -/* State 310 */ - { 162, 0, 311}, /* 1: idxlist shift 311 */ - { 56, 0, 20}, /* 2: ID shift 20 */ - { 110, 2, 21}, /* 3: STRING shift 21 */ - { 177, 0, 262}, /* 4: nm shift 262 */ - { 71, 0, 22}, /* 5: JOIN_KW shift 22 */ - { 161, 5, 263}, /* 6: idxitem shift 263 */ -/* State 311 */ - { 21, 0, 260}, /* 1: COMMA shift 260 */ - { 101, 1, 312}, /* 2: RP shift 312 */ + { 192, 0, 300}, /* 1: refargs shift 300 */ +/* State 300 */ + { 90, 0, 304}, /* 1: ON shift 304 */ + { 82, 0, 302}, /* 2: MATCH shift 302 */ + { 191, 0, 301}, /* 3: refarg shift 301 */ +/* State 302 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 303}, /* 2: nm shift 303 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ +/* State 304 */ + { 123, 3, 312}, /* 1: UPDATE shift 312 */ + { 34, 0, 305}, /* 2: DELETE shift 305 */ + { 66, 0, 314}, /* 3: INSERT shift 314 */ +/* State 305 */ + { 108, 4, 307}, /* 1: SET shift 307 */ + { 101, 0, 311}, /* 2: RESTRICT shift 311 */ + { 190, 0, 306}, /* 3: refact shift 306 */ + { 16, 0, 310}, /* 4: CASCADE shift 310 */ +/* State 307 */ + { 31, 0, 309}, /* 1: DEFAULT shift 309 */ + { 87, 1, 308}, /* 2: NULL shift 308 */ +/* State 312 */ + { 108, 4, 307}, /* 1: SET shift 307 */ + { 101, 0, 311}, /* 2: RESTRICT shift 311 */ + { 190, 0, 313}, /* 3: refact shift 313 */ + { 16, 0, 310}, /* 4: CASCADE shift 310 */ /* State 314 */ - { 56, 0, 96}, /* 1: ID shift 96 */ - { 159, 0, 315}, /* 2: id shift 315 */ + { 108, 4, 307}, /* 1: SET shift 307 */ + { 101, 0, 311}, /* 2: RESTRICT shift 311 */ + { 190, 0, 315}, /* 3: refact shift 315 */ + { 16, 0, 310}, /* 4: CASCADE shift 310 */ /* State 316 */ - { 164, 2, 317}, /* 1: init_deferred_pred_opt shift 317 */ - { 62, 0, 51}, /* 2: INITIALLY shift 51 */ -/* State 319 */ - { 91, 2, 323}, /* 1: PLUS shift 323 */ - { 84, 7, 330}, /* 2: NULL shift 330 */ - { 65, 0, 322}, /* 3: INTEGER shift 322 */ - { 80, 0, 326}, /* 4: MINUS shift 326 */ - { 46, 0, 329}, /* 5: FLOAT shift 329 */ - { 110, 0, 320}, /* 6: STRING shift 320 */ - { 56, 0, 321}, /* 7: ID shift 321 */ -/* State 323 */ - { 46, 0, 325}, /* 1: FLOAT shift 325 */ - { 65, 0, 324}, /* 2: INTEGER shift 324 */ -/* State 326 */ - { 46, 0, 328}, /* 1: FLOAT shift 328 */ - { 65, 0, 327}, /* 2: INTEGER shift 327 */ -/* State 331 */ - { 160, 2, 343}, /* 1: ids shift 343 */ - { 76, 4, 332}, /* 2: LP shift 332 */ - { 110, 0, 249}, /* 3: STRING shift 249 */ - { 56, 0, 248}, /* 4: ID shift 248 */ + { 113, 4, 21}, /* 1: STRING shift 21 */ + { 181, 0, 265}, /* 2: nm shift 265 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ + { 166, 0, 267}, /* 5: idxitem shift 267 */ + { 167, 1, 317}, /* 6: idxlist shift 317 */ +/* State 317 */ + { 104, 2, 318}, /* 1: RP shift 318 */ + { 22, 0, 263}, /* 2: COMMA shift 263 */ +/* State 320 */ + { 164, 0, 321}, /* 1: id shift 321 */ + { 59, 0, 96}, /* 2: ID shift 96 */ +/* State 322 */ + { 65, 0, 51}, /* 1: INITIALLY shift 51 */ + { 169, 1, 323}, /* 2: init_deferred_pred_opt shift 323 */ +/* State 325 */ + { 49, 0, 335}, /* 1: FLOAT shift 335 */ + { 113, 0, 326}, /* 2: STRING shift 326 */ + { 87, 5, 336}, /* 3: NULL shift 336 */ + { 94, 3, 329}, /* 4: PLUS shift 329 */ + { 59, 0, 327}, /* 5: ID shift 327 */ + { 68, 0, 328}, /* 6: INTEGER shift 328 */ + { 83, 0, 332}, /* 7: MINUS shift 332 */ +/* State 329 */ + { 68, 0, 330}, /* 1: INTEGER shift 330 */ + { 49, 0, 331}, /* 2: FLOAT shift 331 */ /* State 332 */ - { 80, 0, 341}, /* 1: MINUS shift 341 */ - { 65, 0, 338}, /* 2: INTEGER shift 338 */ - { 91, 0, 339}, /* 3: PLUS shift 339 */ - { 195, 3, 333}, /* 4: signed shift 333 */ -/* State 333 */ - { 21, 0, 335}, /* 1: COMMA shift 335 */ - { 101, 1, 334}, /* 2: RP shift 334 */ -/* State 335 */ - { 80, 0, 341}, /* 1: MINUS shift 341 */ - { 65, 0, 338}, /* 2: INTEGER shift 338 */ - { 91, 0, 339}, /* 3: PLUS shift 339 */ - { 195, 3, 336}, /* 4: signed shift 336 */ -/* State 336 */ - { 101, 0, 337}, /* 1: RP shift 337 */ + { 68, 0, 333}, /* 1: INTEGER shift 333 */ + { 49, 0, 334}, /* 2: FLOAT shift 334 */ +/* State 337 */ + { 113, 0, 252}, /* 1: STRING shift 252 */ + { 165, 1, 349}, /* 2: ids shift 349 */ + { 59, 0, 251}, /* 3: ID shift 251 */ + { 79, 3, 338}, /* 4: LP shift 338 */ +/* State 338 */ + { 68, 0, 344}, /* 1: INTEGER shift 344 */ + { 83, 0, 347}, /* 2: MINUS shift 347 */ + { 94, 0, 345}, /* 3: PLUS shift 345 */ + { 199, 2, 339}, /* 4: signed shift 339 */ /* State 339 */ - { 65, 0, 340}, /* 1: INTEGER shift 340 */ + { 104, 2, 340}, /* 1: RP shift 340 */ + { 22, 0, 341}, /* 2: COMMA shift 341 */ /* State 341 */ - { 65, 0, 342}, /* 1: INTEGER shift 342 */ -/* State 346 */ - { 200, 4, 377}, /* 1: tcons shift 377 */ - { 17, 0, 362}, /* 2: CHECK shift 362 */ - { 26, 0, 349}, /* 3: CONSTRAINT shift 349 */ - { 48, 0, 365}, /* 4: FOREIGN shift 365 */ - { 93, 7, 351}, /* 5: PRIMARY shift 351 */ - { 101, 5, 608}, /* 6: RP reduce 77 */ - { 21, 0, 347}, /* 7: COMMA shift 347 */ - { 119, 0, 357}, /* 8: UNIQUE shift 357 */ + { 68, 0, 344}, /* 1: INTEGER shift 344 */ + { 83, 0, 347}, /* 2: MINUS shift 347 */ + { 94, 0, 345}, /* 3: PLUS shift 345 */ + { 199, 2, 342}, /* 4: signed shift 342 */ +/* State 342 */ + { 104, 0, 343}, /* 1: RP shift 343 */ +/* State 345 */ + { 68, 0, 346}, /* 1: INTEGER shift 346 */ /* State 347 */ - { 48, 0, 365}, /* 1: FOREIGN shift 365 */ - { 26, 0, 349}, /* 2: CONSTRAINT shift 349 */ - { 200, 2, 348}, /* 3: tcons shift 348 */ - { 93, 0, 351}, /* 4: PRIMARY shift 351 */ - { 17, 0, 362}, /* 5: CHECK shift 362 */ - { 119, 5, 357}, /* 6: UNIQUE shift 357 */ -/* State 349 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 350}, /* 2: nm shift 350 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ -/* State 351 */ - { 72, 0, 352}, /* 1: KEY shift 352 */ + { 68, 0, 348}, /* 1: INTEGER shift 348 */ /* State 352 */ - { 76, 0, 353}, /* 1: LP shift 353 */ + { 104, 2, 632}, /* 1: RP reduce 77 */ + { 96, 0, 357}, /* 2: PRIMARY shift 357 */ + { 122, 6, 363}, /* 3: UNIQUE shift 363 */ + { 51, 8, 371}, /* 4: FOREIGN shift 371 */ + { 204, 0, 383}, /* 5: tcons shift 383 */ + { 18, 0, 368}, /* 6: CHECK shift 368 */ + { 22, 0, 353}, /* 7: COMMA shift 353 */ + { 27, 0, 355}, /* 8: CONSTRAINT shift 355 */ /* State 353 */ - { 162, 0, 354}, /* 1: idxlist shift 354 */ - { 56, 0, 20}, /* 2: ID shift 20 */ - { 110, 2, 21}, /* 3: STRING shift 21 */ - { 177, 0, 262}, /* 4: nm shift 262 */ - { 71, 0, 22}, /* 5: JOIN_KW shift 22 */ - { 161, 5, 263}, /* 6: idxitem shift 263 */ -/* State 354 */ - { 21, 0, 260}, /* 1: COMMA shift 260 */ - { 101, 1, 355}, /* 2: RP shift 355 */ + { 204, 2, 354}, /* 1: tcons shift 354 */ + { 96, 5, 357}, /* 2: PRIMARY shift 357 */ + { 122, 0, 363}, /* 3: UNIQUE shift 363 */ + { 51, 6, 371}, /* 4: FOREIGN shift 371 */ + { 18, 0, 368}, /* 5: CHECK shift 368 */ + { 27, 0, 355}, /* 6: CONSTRAINT shift 355 */ /* State 355 */ - { 180, 0, 356}, /* 1: onconf shift 356 */ - { 87, 0, 10}, /* 2: ON shift 10 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 356}, /* 2: nm shift 356 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 357 */ - { 76, 0, 358}, /* 1: LP shift 358 */ + { 75, 0, 358}, /* 1: KEY shift 358 */ /* State 358 */ - { 162, 0, 359}, /* 1: idxlist shift 359 */ - { 56, 0, 20}, /* 2: ID shift 20 */ - { 110, 2, 21}, /* 3: STRING shift 21 */ - { 177, 0, 262}, /* 4: nm shift 262 */ - { 71, 0, 22}, /* 5: JOIN_KW shift 22 */ - { 161, 5, 263}, /* 6: idxitem shift 263 */ + { 79, 0, 359}, /* 1: LP shift 359 */ /* State 359 */ - { 21, 0, 260}, /* 1: COMMA shift 260 */ - { 101, 1, 360}, /* 2: RP shift 360 */ + { 113, 4, 21}, /* 1: STRING shift 21 */ + { 181, 0, 265}, /* 2: nm shift 265 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ + { 166, 0, 267}, /* 5: idxitem shift 267 */ + { 167, 1, 360}, /* 6: idxlist shift 360 */ /* State 360 */ - { 180, 0, 361}, /* 1: onconf shift 361 */ - { 87, 0, 10}, /* 2: ON shift 10 */ -/* State 362 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 363}, /* 3: expr shift 363 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 104, 2, 361}, /* 1: RP shift 361 */ + { 22, 0, 263}, /* 2: COMMA shift 263 */ +/* State 361 */ + { 184, 2, 362}, /* 1: onconf shift 362 */ + { 90, 0, 10}, /* 2: ON shift 10 */ /* State 363 */ - { 180, 3, 364}, /* 1: onconf shift 364 */ - { 91, 0, 135}, /* 2: PLUS shift 135 */ - { 60, 0, 157}, /* 3: IN shift 157 */ - { 42, 0, 118}, /* 4: EQ shift 118 */ - { 13, 0, 122}, /* 5: BITOR shift 122 */ - { 5, 0, 100}, /* 6: AND shift 100 */ - { 96, 0, 143}, /* 7: REM shift 143 */ - { 78, 0, 108}, /* 8: LT shift 108 */ - { 68, 0, 148}, /* 9: IS shift 148 */ - { 69, 0, 147}, /* 10: ISNULL shift 147 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ - { 102, 4, 126}, /* 13: RSHIFT shift 126 */ - { 73, 5, 112}, /* 14: LE shift 112 */ - { 74, 0, 133}, /* 15: LIKE shift 133 */ - { 51, 0, 114}, /* 16: GE shift 114 */ - { 106, 0, 141}, /* 17: SLASH shift 141 */ - { 77, 0, 124}, /* 18: LSHIFT shift 124 */ - { 108, 8, 139}, /* 19: STAR shift 139 */ - { 82, 26, 130}, /* 20: NOT shift 130 */ - { 80, 0, 137}, /* 21: MINUS shift 137 */ - { 81, 16, 116}, /* 22: NE shift 116 */ - { 172, 20, 128}, /* 23: likeop shift 128 */ - { 83, 0, 152}, /* 24: NOTNULL shift 152 */ - { 54, 27, 110}, /* 25: GT shift 110 */ - { 52, 0, 134}, /* 26: GLOB shift 134 */ - { 24, 0, 145}, /* 27: CONCAT shift 145 */ - { 87, 0, 10}, /* 28: ON shift 10 */ - { 88, 0, 106}, /* 29: OR shift 106 */ - { 89, 0, 99}, /* 30: ORACLE_OUTER_JOIN shift 99 */ + { 79, 0, 364}, /* 1: LP shift 364 */ +/* State 364 */ + { 113, 4, 21}, /* 1: STRING shift 21 */ + { 181, 0, 265}, /* 2: nm shift 265 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ + { 166, 0, 267}, /* 5: idxitem shift 267 */ + { 167, 1, 365}, /* 6: idxlist shift 365 */ /* State 365 */ - { 72, 0, 366}, /* 1: KEY shift 366 */ + { 104, 2, 366}, /* 1: RP shift 366 */ + { 22, 0, 263}, /* 2: COMMA shift 263 */ /* State 366 */ - { 76, 0, 367}, /* 1: LP shift 367 */ -/* State 367 */ - { 162, 0, 368}, /* 1: idxlist shift 368 */ - { 56, 0, 20}, /* 2: ID shift 20 */ - { 110, 2, 21}, /* 3: STRING shift 21 */ - { 177, 0, 262}, /* 4: nm shift 262 */ - { 71, 0, 22}, /* 5: JOIN_KW shift 22 */ - { 161, 5, 263}, /* 6: idxitem shift 263 */ + { 184, 2, 367}, /* 1: onconf shift 367 */ + { 90, 0, 10}, /* 2: ON shift 10 */ /* State 368 */ - { 21, 0, 260}, /* 1: COMMA shift 260 */ - { 101, 1, 369}, /* 2: RP shift 369 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 369}, /* 8: expr shift 369 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 369 */ - { 95, 0, 370}, /* 1: REFERENCES shift 370 */ -/* State 370 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 371}, /* 2: nm shift 371 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 90, 0, 10}, /* 1: ON shift 10 */ + { 91, 0, 108}, /* 2: OR shift 108 */ + { 92, 0, 99}, /* 3: ORACLE_OUTER_JOIN shift 99 */ + { 63, 0, 159}, /* 4: IN shift 159 */ + { 184, 7, 370}, /* 5: onconf shift 370 */ + { 5, 0, 100}, /* 6: AND shift 100 */ + { 94, 0, 137}, /* 7: PLUS shift 137 */ + { 11, 0, 155}, /* 8: BETWEEN shift 155 */ + { 12, 0, 122}, /* 9: BITAND shift 122 */ + { 99, 0, 145}, /* 10: REM shift 145 */ + { 45, 0, 120}, /* 11: EQ shift 120 */ + { 71, 8, 150}, /* 12: IS shift 150 */ + { 72, 9, 149}, /* 13: ISNULL shift 149 */ + { 81, 0, 110}, /* 14: LT shift 110 */ + { 14, 0, 124}, /* 15: BITOR shift 124 */ + { 105, 11, 128}, /* 16: RSHIFT shift 128 */ + { 76, 0, 114}, /* 17: LE shift 114 */ + { 77, 0, 135}, /* 18: LIKE shift 135 */ + { 54, 0, 116}, /* 19: GE shift 116 */ + { 109, 0, 143}, /* 20: SLASH shift 143 */ + { 80, 0, 126}, /* 21: LSHIFT shift 126 */ + { 111, 14, 141}, /* 22: STAR shift 141 */ + { 55, 29, 136}, /* 23: GLOB shift 136 */ + { 83, 0, 139}, /* 24: MINUS shift 139 */ + { 84, 19, 118}, /* 25: NE shift 118 */ + { 85, 23, 132}, /* 26: NOT shift 132 */ + { 86, 0, 154}, /* 27: NOTNULL shift 154 */ + { 177, 30, 130}, /* 28: likeop shift 130 */ + { 25, 0, 147}, /* 29: CONCAT shift 147 */ + { 57, 0, 112}, /* 30: GT shift 112 */ /* State 371 */ - { 76, 0, 310}, /* 1: LP shift 310 */ - { 163, 0, 372}, /* 2: idxlist_opt shift 372 */ + { 75, 0, 372}, /* 1: KEY shift 372 */ /* State 372 */ - { 188, 0, 373}, /* 1: refargs shift 373 */ + { 79, 0, 373}, /* 1: LP shift 373 */ /* State 373 */ - { 147, 0, 375}, /* 1: defer_subclause_opt shift 375 */ - { 30, 0, 316}, /* 2: DEFERRABLE shift 316 */ - { 79, 2, 296}, /* 3: MATCH shift 296 */ - { 87, 0, 298}, /* 4: ON shift 298 */ - { 82, 0, 374}, /* 5: NOT shift 374 */ - { 187, 5, 295}, /* 6: refarg shift 295 */ - { 146, 0, 376}, /* 7: defer_subclause shift 376 */ + { 113, 4, 21}, /* 1: STRING shift 21 */ + { 181, 0, 265}, /* 2: nm shift 265 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ + { 166, 0, 267}, /* 5: idxitem shift 267 */ + { 167, 1, 374}, /* 6: idxlist shift 374 */ /* State 374 */ - { 30, 0, 49}, /* 1: DEFERRABLE shift 49 */ + { 104, 2, 375}, /* 1: RP shift 375 */ + { 22, 0, 263}, /* 2: COMMA shift 263 */ +/* State 375 */ + { 98, 0, 376}, /* 1: REFERENCES shift 376 */ +/* State 376 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 377}, /* 2: nm shift 377 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ +/* State 377 */ + { 168, 0, 378}, /* 1: idxlist_opt shift 378 */ + { 79, 0, 316}, /* 2: LP shift 316 */ +/* State 378 */ + { 192, 0, 379}, /* 1: refargs shift 379 */ +/* State 379 */ + { 32, 0, 322}, /* 1: DEFERRABLE shift 322 */ + { 85, 0, 380}, /* 2: NOT shift 380 */ + { 191, 0, 301}, /* 3: refarg shift 301 */ + { 82, 0, 302}, /* 4: MATCH shift 302 */ + { 151, 1, 382}, /* 5: defer_subclause shift 382 */ + { 152, 4, 381}, /* 6: defer_subclause_opt shift 381 */ + { 90, 0, 304}, /* 7: ON shift 304 */ /* State 380 */ - { 192, 0, 381}, /* 1: select shift 381 */ - { 181, 3, 69}, /* 2: oneselect shift 69 */ - { 103, 0, 73}, /* 3: SELECT shift 73 */ -/* State 381 */ - { 66, 0, 162}, /* 1: INTERSECT shift 162 */ - { 176, 1, 71}, /* 2: multiselect_op shift 71 */ - { 43, 0, 163}, /* 3: EXCEPT shift 163 */ - { 118, 3, 160}, /* 4: UNION shift 160 */ - { 104, 0, 551}, /* 5: SEMI reduce 20 */ -/* State 382 */ - { 61, 0, 762}, /* 1: INDEX reduce 231 */ - { 115, 1, 401}, /* 2: TRIGGER shift 401 */ - { 119, 0, 400}, /* 3: UNIQUE shift 400 */ - { 201, 0, 383}, /* 4: temp shift 383 */ - { 112, 0, 390}, /* 5: TEMP shift 390 */ - { 209, 3, 391}, /* 6: uniqueflag shift 391 */ -/* State 383 */ - { 111, 0, 384}, /* 1: TABLE shift 384 */ - { 125, 1, 386}, /* 2: VIEW shift 386 */ -/* State 384 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 385}, /* 2: nm shift 385 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 32, 0, 49}, /* 1: DEFERRABLE shift 49 */ /* State 386 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 387}, /* 2: nm shift 387 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 106, 0, 73}, /* 1: SELECT shift 73 */ + { 196, 1, 387}, /* 2: select shift 387 */ + { 185, 0, 69}, /* 3: oneselect shift 69 */ /* State 387 */ - { 6, 0, 388}, /* 1: AS shift 388 */ + { 180, 0, 71}, /* 1: multiselect_op shift 71 */ + { 121, 4, 162}, /* 2: UNION shift 162 */ + { 107, 0, 575}, /* 3: SEMI reduce 20 */ + { 46, 0, 165}, /* 4: EXCEPT shift 165 */ + { 69, 0, 164}, /* 5: INTERSECT shift 164 */ /* State 388 */ - { 192, 0, 389}, /* 1: select shift 389 */ - { 181, 3, 69}, /* 2: oneselect shift 69 */ - { 103, 0, 73}, /* 3: SELECT shift 73 */ + { 115, 0, 434}, /* 1: TEMP shift 434 */ + { 205, 1, 389}, /* 2: temp shift 389 */ + { 209, 0, 435}, /* 3: trigger_decl shift 435 */ /* State 389 */ - { 66, 0, 162}, /* 1: INTERSECT shift 162 */ - { 176, 1, 71}, /* 2: multiselect_op shift 71 */ - { 43, 0, 163}, /* 3: EXCEPT shift 163 */ - { 118, 3, 160}, /* 4: UNION shift 160 */ - { 104, 0, 629}, /* 5: SEMI reduce 98 */ -/* State 391 */ - { 61, 0, 392}, /* 1: INDEX shift 392 */ + { 114, 0, 390}, /* 1: TABLE shift 390 */ + { 122, 0, 406}, /* 2: UNIQUE shift 406 */ + { 128, 2, 392}, /* 3: VIEW shift 392 */ + { 118, 6, 407}, /* 4: TRIGGER shift 407 */ + { 214, 4, 396}, /* 5: uniqueflag shift 396 */ + { 64, 0, 788}, /* 6: INDEX reduce 233 */ +/* State 390 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 391}, /* 2: nm shift 391 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 392 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 393}, /* 2: nm shift 393 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 393}, /* 2: nm shift 393 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 393 */ - { 87, 0, 394}, /* 1: ON shift 394 */ + { 6, 0, 394}, /* 1: AS shift 394 */ /* State 394 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 395}, /* 2: nm shift 395 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 106, 0, 73}, /* 1: SELECT shift 73 */ + { 196, 1, 395}, /* 2: select shift 395 */ + { 185, 0, 69}, /* 3: oneselect shift 69 */ /* State 395 */ - { 76, 0, 396}, /* 1: LP shift 396 */ + { 180, 0, 71}, /* 1: multiselect_op shift 71 */ + { 121, 4, 162}, /* 2: UNION shift 162 */ + { 107, 0, 653}, /* 3: SEMI reduce 98 */ + { 46, 0, 165}, /* 4: EXCEPT shift 165 */ + { 69, 0, 164}, /* 5: INTERSECT shift 164 */ /* State 396 */ - { 162, 0, 397}, /* 1: idxlist shift 397 */ - { 56, 0, 20}, /* 2: ID shift 20 */ - { 110, 2, 21}, /* 3: STRING shift 21 */ - { 177, 0, 262}, /* 4: nm shift 262 */ - { 71, 0, 22}, /* 5: JOIN_KW shift 22 */ - { 161, 5, 263}, /* 6: idxitem shift 263 */ + { 64, 0, 397}, /* 1: INDEX shift 397 */ /* State 397 */ - { 21, 0, 260}, /* 1: COMMA shift 260 */ - { 101, 1, 398}, /* 2: RP shift 398 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 398}, /* 2: nm shift 398 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 398 */ - { 180, 2, 399}, /* 1: onconf shift 399 */ - { 87, 0, 10}, /* 2: ON shift 10 */ - { 104, 0, 619}, /* 3: SEMI reduce 88 */ + { 90, 0, 399}, /* 1: ON shift 399 */ /* State 399 */ - { 104, 0, 760}, /* 1: SEMI reduce 229 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 400}, /* 2: nm shift 400 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 400 */ - { 61, 0, 761}, /* 1: INDEX reduce 230 */ + { 150, 3, 401}, /* 1: dbnm shift 401 */ + { 79, 0, 680}, /* 2: LP reduce 125 */ + { 39, 0, 270}, /* 3: DOT shift 270 */ /* State 401 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 402}, /* 2: nm shift 402 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 79, 0, 402}, /* 1: LP shift 402 */ /* State 402 */ - { 64, 2, 467}, /* 1: INSTEAD shift 467 */ - { 8, 0, 465}, /* 2: BEFORE shift 465 */ - { 206, 4, 403}, /* 3: trigger_time shift 403 */ - { 2, 0, 466}, /* 4: AFTER shift 466 */ + { 113, 4, 21}, /* 1: STRING shift 21 */ + { 181, 0, 265}, /* 2: nm shift 265 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ + { 166, 0, 267}, /* 5: idxitem shift 267 */ + { 167, 1, 403}, /* 6: idxlist shift 403 */ /* State 403 */ - { 120, 3, 462}, /* 1: UPDATE shift 462 */ - { 205, 0, 404}, /* 2: trigger_event shift 404 */ - { 32, 0, 460}, /* 3: DELETE shift 460 */ - { 63, 0, 461}, /* 4: INSERT shift 461 */ + { 104, 2, 404}, /* 1: RP shift 404 */ + { 22, 0, 263}, /* 2: COMMA shift 263 */ /* State 404 */ - { 87, 0, 405}, /* 1: ON shift 405 */ + { 90, 0, 10}, /* 1: ON shift 10 */ + { 184, 0, 405}, /* 2: onconf shift 405 */ + { 107, 0, 643}, /* 3: SEMI reduce 88 */ /* State 405 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 406}, /* 2: nm shift 406 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 107, 0, 786}, /* 1: SEMI reduce 231 */ /* State 406 */ - { 47, 0, 456}, /* 1: FOR shift 456 */ - { 155, 1, 407}, /* 2: foreach_clause shift 407 */ + { 64, 0, 787}, /* 1: INDEX reduce 232 */ /* State 407 */ - { 126, 3, 454}, /* 1: WHEN shift 454 */ - { 211, 0, 408}, /* 2: when_clause shift 408 */ - { 9, 0, 797}, /* 3: BEGIN reduce 266 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 408}, /* 2: nm shift 408 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 408 */ - { 9, 0, 409}, /* 1: BEGIN shift 409 */ + { 67, 0, 432}, /* 1: INSTEAD shift 432 */ + { 9, 0, 430}, /* 2: BEFORE shift 430 */ + { 2, 0, 431}, /* 3: AFTER shift 431 */ + { 211, 1, 409}, /* 4: trigger_time shift 409 */ /* State 409 */ - { 63, 0, 431}, /* 1: INSERT shift 431 */ - { 181, 0, 69}, /* 2: oneselect shift 69 */ - { 120, 0, 416}, /* 3: UPDATE shift 416 */ - { 192, 3, 410}, /* 4: select shift 410 */ - { 103, 8, 73}, /* 5: SELECT shift 73 */ - { 203, 9, 413}, /* 6: trigger_cmd shift 413 */ - { 204, 0, 411}, /* 7: trigger_cmd_list shift 411 */ - { 40, 0, 800}, /* 8: END reduce 269 */ - { 32, 0, 450}, /* 9: DELETE shift 450 */ + { 66, 2, 423}, /* 1: INSERT shift 423 */ + { 34, 0, 422}, /* 2: DELETE shift 422 */ + { 210, 1, 410}, /* 3: trigger_event shift 410 */ + { 123, 0, 424}, /* 4: UPDATE shift 424 */ /* State 410 */ - { 66, 0, 162}, /* 1: INTERSECT shift 162 */ - { 176, 1, 71}, /* 2: multiselect_op shift 71 */ - { 43, 0, 163}, /* 3: EXCEPT shift 163 */ - { 118, 3, 160}, /* 4: UNION shift 160 */ - { 104, 0, 805}, /* 5: SEMI reduce 274 */ + { 90, 0, 411}, /* 1: ON shift 411 */ /* State 411 */ - { 40, 0, 412}, /* 1: END shift 412 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 412}, /* 2: nm shift 412 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 412 */ - { 104, 0, 785}, /* 1: SEMI reduce 254 */ + { 150, 0, 413}, /* 1: dbnm shift 413 */ + { 39, 0, 270}, /* 2: DOT shift 270 */ /* State 413 */ - { 104, 0, 414}, /* 1: SEMI shift 414 */ + { 160, 2, 414}, /* 1: foreach_clause shift 414 */ + { 50, 0, 418}, /* 2: FOR shift 418 */ /* State 414 */ - { 63, 0, 431}, /* 1: INSERT shift 431 */ - { 181, 0, 69}, /* 2: oneselect shift 69 */ - { 120, 0, 416}, /* 3: UPDATE shift 416 */ - { 192, 3, 410}, /* 4: select shift 410 */ - { 103, 8, 73}, /* 5: SELECT shift 73 */ - { 203, 9, 413}, /* 6: trigger_cmd shift 413 */ - { 204, 0, 415}, /* 7: trigger_cmd_list shift 415 */ - { 40, 0, 800}, /* 8: END reduce 269 */ - { 32, 0, 450}, /* 9: DELETE shift 450 */ + { 216, 3, 415}, /* 1: when_clause shift 415 */ + { 10, 0, 824}, /* 2: BEGIN reduce 269 */ + { 129, 0, 416}, /* 3: WHEN shift 416 */ /* State 415 */ - { 40, 0, 799}, /* 1: END reduce 268 */ + { 10, 0, 812}, /* 1: BEGIN reduce 257 */ /* State 416 */ - { 182, 2, 419}, /* 1: orconf shift 419 */ - { 88, 0, 417}, /* 2: OR shift 417 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 417}, /* 8: expr shift 417 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 417 */ - { 1, 0, 14}, /* 1: ABORT shift 14 */ - { 97, 1, 17}, /* 2: REPLACE shift 17 */ - { 99, 5, 13}, /* 3: ROLLBACK shift 13 */ - { 189, 3, 418}, /* 4: resolvetype shift 418 */ - { 57, 6, 16}, /* 5: IGNORE shift 16 */ - { 45, 0, 15}, /* 6: FAIL shift 15 */ + { 63, 2, 159}, /* 1: IN shift 159 */ + { 5, 0, 100}, /* 2: AND shift 100 */ + { 12, 0, 122}, /* 3: BITAND shift 122 */ + { 177, 0, 130}, /* 4: likeop shift 130 */ + { 91, 0, 108}, /* 5: OR shift 108 */ + { 92, 1, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ + { 14, 0, 124}, /* 7: BITOR shift 124 */ + { 94, 0, 137}, /* 8: PLUS shift 137 */ + { 76, 0, 114}, /* 9: LE shift 114 */ + { 80, 0, 126}, /* 10: LSHIFT shift 126 */ + { 10, 0, 825}, /* 11: BEGIN reduce 270 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 99, 3, 145}, /* 13: REM shift 145 */ + { 71, 0, 150}, /* 14: IS shift 150 */ + { 72, 7, 149}, /* 15: ISNULL shift 149 */ + { 54, 18, 116}, /* 16: GE shift 116 */ + { 45, 0, 120}, /* 17: EQ shift 120 */ + { 25, 0, 147}, /* 18: CONCAT shift 147 */ + { 105, 9, 128}, /* 19: RSHIFT shift 128 */ + { 77, 0, 135}, /* 20: LIKE shift 135 */ + { 55, 0, 136}, /* 21: GLOB shift 136 */ + { 57, 0, 112}, /* 22: GT shift 112 */ + { 109, 10, 143}, /* 23: SLASH shift 143 */ + { 81, 0, 110}, /* 24: LT shift 110 */ + { 111, 0, 141}, /* 25: STAR shift 141 */ + { 83, 16, 139}, /* 26: MINUS shift 139 */ + { 84, 21, 118}, /* 27: NE shift 118 */ + { 85, 0, 132}, /* 28: NOT shift 132 */ + { 86, 22, 154}, /* 29: NOTNULL shift 154 */ +/* State 418 */ + { 41, 0, 419}, /* 1: EACH shift 419 */ /* State 419 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 420}, /* 2: nm shift 420 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ -/* State 420 */ - { 105, 0, 421}, /* 1: SET shift 421 */ -/* State 421 */ - { 110, 0, 21}, /* 1: STRING shift 21 */ - { 71, 4, 22}, /* 2: JOIN_KW shift 22 */ - { 177, 0, 428}, /* 3: nm shift 428 */ - { 56, 0, 20}, /* 4: ID shift 20 */ - { 194, 0, 422}, /* 5: setlist shift 422 */ + { 112, 0, 421}, /* 1: STATEMENT shift 421 */ + { 103, 0, 420}, /* 2: ROW shift 420 */ /* State 422 */ - { 212, 3, 427}, /* 1: where_opt shift 427 */ - { 21, 0, 423}, /* 2: COMMA shift 423 */ - { 104, 0, 685}, /* 3: SEMI reduce 154 */ - { 127, 0, 232}, /* 4: WHERE shift 232 */ + { 90, 0, 817}, /* 1: ON reduce 262 */ /* State 423 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 424}, /* 2: nm shift 424 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 90, 0, 818}, /* 1: ON reduce 263 */ /* State 424 */ - { 42, 0, 425}, /* 1: EQ shift 425 */ + { 90, 2, 819}, /* 1: ON reduce 264 */ + { 88, 0, 425}, /* 2: OF shift 425 */ /* State 425 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 426}, /* 3: expr shift 426 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 171, 0, 426}, /* 1: inscollist shift 426 */ + { 181, 1, 429}, /* 2: nm shift 429 */ + { 59, 0, 20}, /* 3: ID shift 20 */ + { 113, 0, 21}, /* 4: STRING shift 21 */ + { 74, 3, 22}, /* 5: JOIN_KW shift 22 */ /* State 426 */ - { 88, 2, 106}, /* 1: OR shift 106 */ - { 60, 0, 157}, /* 2: IN shift 157 */ - { 5, 0, 100}, /* 3: AND shift 100 */ - { 68, 0, 148}, /* 4: IS shift 148 */ - { 172, 1, 128}, /* 5: likeop shift 128 */ - { 89, 3, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ - { 13, 0, 122}, /* 7: BITOR shift 122 */ - { 91, 0, 135}, /* 8: PLUS shift 135 */ - { 74, 0, 133}, /* 9: LIKE shift 133 */ - { 78, 0, 108}, /* 10: LT shift 108 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ - { 96, 4, 143}, /* 13: REM shift 143 */ - { 69, 7, 147}, /* 14: ISNULL shift 147 */ - { 42, 0, 118}, /* 15: EQ shift 118 */ - { 80, 17, 137}, /* 16: MINUS shift 137 */ - { 52, 20, 134}, /* 17: GLOB shift 134 */ - { 73, 0, 112}, /* 18: LE shift 112 */ - { 102, 9, 126}, /* 19: RSHIFT shift 126 */ - { 24, 0, 145}, /* 20: CONCAT shift 145 */ - { 54, 0, 110}, /* 21: GT shift 110 */ - { 77, 0, 124}, /* 22: LSHIFT shift 124 */ - { 106, 10, 141}, /* 23: SLASH shift 141 */ - { 51, 0, 114}, /* 24: GE shift 114 */ - { 108, 16, 139}, /* 25: STAR shift 139 */ - { 81, 0, 116}, /* 26: NE shift 116 */ - { 82, 21, 130}, /* 27: NOT shift 130 */ - { 83, 0, 152}, /* 28: NOTNULL shift 152 */ + { 90, 2, 820}, /* 1: ON reduce 265 */ + { 22, 0, 427}, /* 2: COMMA shift 427 */ /* State 427 */ - { 104, 0, 801}, /* 1: SEMI reduce 270 */ -/* State 428 */ - { 42, 0, 429}, /* 1: EQ shift 429 */ -/* State 429 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 430}, /* 3: expr shift 430 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ -/* State 430 */ - { 88, 2, 106}, /* 1: OR shift 106 */ - { 60, 0, 157}, /* 2: IN shift 157 */ - { 5, 0, 100}, /* 3: AND shift 100 */ - { 68, 0, 148}, /* 4: IS shift 148 */ - { 172, 1, 128}, /* 5: likeop shift 128 */ - { 89, 3, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ - { 13, 0, 122}, /* 7: BITOR shift 122 */ - { 91, 0, 135}, /* 8: PLUS shift 135 */ - { 74, 0, 133}, /* 9: LIKE shift 133 */ - { 78, 0, 108}, /* 10: LT shift 108 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ - { 96, 4, 143}, /* 13: REM shift 143 */ - { 69, 7, 147}, /* 14: ISNULL shift 147 */ - { 42, 0, 118}, /* 15: EQ shift 118 */ - { 80, 17, 137}, /* 16: MINUS shift 137 */ - { 52, 20, 134}, /* 17: GLOB shift 134 */ - { 73, 0, 112}, /* 18: LE shift 112 */ - { 102, 9, 126}, /* 19: RSHIFT shift 126 */ - { 24, 0, 145}, /* 20: CONCAT shift 145 */ - { 54, 0, 110}, /* 21: GT shift 110 */ - { 77, 0, 124}, /* 22: LSHIFT shift 124 */ - { 106, 10, 141}, /* 23: SLASH shift 141 */ - { 51, 0, 114}, /* 24: GE shift 114 */ - { 108, 16, 139}, /* 25: STAR shift 139 */ - { 81, 0, 116}, /* 26: NE shift 116 */ - { 82, 21, 130}, /* 27: NOT shift 130 */ - { 83, 0, 152}, /* 28: NOTNULL shift 152 */ -/* State 431 */ - { 67, 0, 621}, /* 1: INTO reduce 90 */ - { 88, 1, 417}, /* 2: OR shift 417 */ - { 182, 0, 432}, /* 3: orconf shift 432 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 428}, /* 2: nm shift 428 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 432 */ - { 67, 0, 433}, /* 1: INTO shift 433 */ -/* State 433 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 434}, /* 2: nm shift 434 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ -/* State 434 */ - { 76, 0, 435}, /* 1: LP shift 435 */ - { 167, 0, 441}, /* 2: inscollist_opt shift 441 */ + { 88, 0, 433}, /* 1: OF shift 433 */ /* State 435 */ - { 110, 0, 21}, /* 1: STRING shift 21 */ - { 166, 4, 436}, /* 2: inscollist shift 436 */ - { 177, 0, 440}, /* 3: nm shift 440 */ - { 71, 5, 22}, /* 4: JOIN_KW shift 22 */ - { 56, 0, 20}, /* 5: ID shift 20 */ + { 10, 0, 436}, /* 1: BEGIN shift 436 */ /* State 436 */ - { 21, 0, 438}, /* 1: COMMA shift 438 */ - { 101, 1, 437}, /* 2: RP shift 437 */ + { 207, 0, 440}, /* 1: trigger_cmd shift 440 */ + { 208, 0, 438}, /* 2: trigger_cmd_list shift 438 */ + { 106, 5, 73}, /* 3: SELECT shift 73 */ + { 66, 0, 458}, /* 4: INSERT shift 458 */ + { 43, 9, 827}, /* 5: END reduce 272 */ + { 185, 0, 69}, /* 6: oneselect shift 69 */ + { 123, 0, 443}, /* 7: UPDATE shift 443 */ + { 196, 3, 437}, /* 8: select shift 437 */ + { 34, 0, 474}, /* 9: DELETE shift 474 */ +/* State 437 */ + { 180, 0, 71}, /* 1: multiselect_op shift 71 */ + { 121, 4, 162}, /* 2: UNION shift 162 */ + { 107, 0, 832}, /* 3: SEMI reduce 277 */ + { 46, 0, 165}, /* 4: EXCEPT shift 165 */ + { 69, 0, 164}, /* 5: INTERSECT shift 164 */ /* State 438 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 439}, /* 2: nm shift 439 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 43, 0, 439}, /* 1: END shift 439 */ +/* State 439 */ + { 107, 0, 811}, /* 1: SEMI reduce 256 */ +/* State 440 */ + { 107, 0, 441}, /* 1: SEMI shift 441 */ /* State 441 */ - { 192, 3, 442}, /* 1: select shift 442 */ - { 181, 0, 69}, /* 2: oneselect shift 69 */ - { 124, 0, 443}, /* 3: VALUES shift 443 */ - { 103, 0, 73}, /* 4: SELECT shift 73 */ + { 207, 0, 440}, /* 1: trigger_cmd shift 440 */ + { 208, 0, 442}, /* 2: trigger_cmd_list shift 442 */ + { 106, 5, 73}, /* 3: SELECT shift 73 */ + { 66, 0, 458}, /* 4: INSERT shift 458 */ + { 43, 9, 827}, /* 5: END reduce 272 */ + { 185, 0, 69}, /* 6: oneselect shift 69 */ + { 123, 0, 443}, /* 7: UPDATE shift 443 */ + { 196, 3, 437}, /* 8: select shift 437 */ + { 34, 0, 474}, /* 9: DELETE shift 474 */ /* State 442 */ - { 66, 0, 162}, /* 1: INTERSECT shift 162 */ - { 176, 1, 71}, /* 2: multiselect_op shift 71 */ - { 43, 0, 163}, /* 3: EXCEPT shift 163 */ - { 118, 3, 160}, /* 4: UNION shift 160 */ - { 104, 0, 803}, /* 5: SEMI reduce 272 */ + { 43, 0, 826}, /* 1: END reduce 271 */ /* State 443 */ - { 76, 0, 444}, /* 1: LP shift 444 */ + { 186, 0, 446}, /* 1: orconf shift 446 */ + { 91, 0, 444}, /* 2: OR shift 444 */ /* State 444 */ - { 80, 4, 172}, /* 1: MINUS shift 172 */ - { 177, 6, 102}, /* 2: nm shift 102 */ - { 82, 0, 168}, /* 3: NOT shift 168 */ - { 16, 0, 176}, /* 4: CASE shift 176 */ - { 84, 0, 101}, /* 5: NULL shift 101 */ - { 65, 0, 166}, /* 6: INTEGER shift 166 */ - { 56, 0, 64}, /* 7: ID shift 64 */ - { 71, 0, 67}, /* 8: JOIN_KW shift 67 */ - { 152, 7, 449}, /* 9: expr shift 449 */ - { 169, 0, 445}, /* 10: itemlist shift 445 */ - { 12, 0, 170}, /* 11: BITNOT shift 170 */ - { 91, 0, 174}, /* 12: PLUS shift 174 */ - { 76, 11, 68}, /* 13: LP shift 68 */ - { 94, 16, 186}, /* 14: RAISE shift 186 */ - { 110, 14, 66}, /* 15: STRING shift 66 */ - { 46, 0, 167}, /* 16: FLOAT shift 167 */ -/* State 445 */ - { 21, 0, 446}, /* 1: COMMA shift 446 */ - { 101, 1, 448}, /* 2: RP shift 448 */ + { 102, 3, 13}, /* 1: ROLLBACK shift 13 */ + { 193, 4, 445}, /* 2: resolvetype shift 445 */ + { 60, 6, 16}, /* 3: IGNORE shift 16 */ + { 1, 0, 14}, /* 4: ABORT shift 14 */ + { 100, 0, 17}, /* 5: REPLACE shift 17 */ + { 48, 0, 15}, /* 6: FAIL shift 15 */ /* State 446 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 447}, /* 3: expr shift 447 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 447}, /* 2: nm shift 447 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 447 */ - { 88, 2, 106}, /* 1: OR shift 106 */ - { 60, 0, 157}, /* 2: IN shift 157 */ - { 5, 0, 100}, /* 3: AND shift 100 */ - { 68, 0, 148}, /* 4: IS shift 148 */ - { 172, 1, 128}, /* 5: likeop shift 128 */ - { 89, 3, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ - { 13, 0, 122}, /* 7: BITOR shift 122 */ - { 91, 0, 135}, /* 8: PLUS shift 135 */ - { 74, 0, 133}, /* 9: LIKE shift 133 */ - { 78, 0, 108}, /* 10: LT shift 108 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ - { 96, 4, 143}, /* 13: REM shift 143 */ - { 69, 7, 147}, /* 14: ISNULL shift 147 */ - { 42, 0, 118}, /* 15: EQ shift 118 */ - { 80, 17, 137}, /* 16: MINUS shift 137 */ - { 52, 20, 134}, /* 17: GLOB shift 134 */ - { 73, 0, 112}, /* 18: LE shift 112 */ - { 102, 9, 126}, /* 19: RSHIFT shift 126 */ - { 24, 0, 145}, /* 20: CONCAT shift 145 */ - { 54, 0, 110}, /* 21: GT shift 110 */ - { 77, 0, 124}, /* 22: LSHIFT shift 124 */ - { 106, 10, 141}, /* 23: SLASH shift 141 */ - { 51, 0, 114}, /* 24: GE shift 114 */ - { 108, 16, 139}, /* 25: STAR shift 139 */ - { 81, 0, 116}, /* 26: NE shift 116 */ - { 82, 21, 130}, /* 27: NOT shift 130 */ - { 83, 0, 152}, /* 28: NOTNULL shift 152 */ + { 108, 0, 448}, /* 1: SET shift 448 */ /* State 448 */ - { 104, 0, 802}, /* 1: SEMI reduce 271 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 0, 455}, /* 2: nm shift 455 */ + { 59, 0, 20}, /* 3: ID shift 20 */ + { 198, 1, 449}, /* 4: setlist shift 449 */ + { 74, 3, 22}, /* 5: JOIN_KW shift 22 */ /* State 449 */ - { 88, 2, 106}, /* 1: OR shift 106 */ - { 60, 0, 157}, /* 2: IN shift 157 */ - { 5, 0, 100}, /* 3: AND shift 100 */ - { 68, 0, 148}, /* 4: IS shift 148 */ - { 172, 1, 128}, /* 5: likeop shift 128 */ - { 89, 3, 99}, /* 6: ORACLE_OUTER_JOIN shift 99 */ - { 13, 0, 122}, /* 7: BITOR shift 122 */ - { 91, 0, 135}, /* 8: PLUS shift 135 */ - { 74, 0, 133}, /* 9: LIKE shift 133 */ - { 78, 0, 108}, /* 10: LT shift 108 */ - { 10, 0, 153}, /* 11: BETWEEN shift 153 */ - { 11, 0, 120}, /* 12: BITAND shift 120 */ - { 96, 4, 143}, /* 13: REM shift 143 */ - { 69, 7, 147}, /* 14: ISNULL shift 147 */ - { 42, 0, 118}, /* 15: EQ shift 118 */ - { 80, 17, 137}, /* 16: MINUS shift 137 */ - { 52, 20, 134}, /* 17: GLOB shift 134 */ - { 73, 0, 112}, /* 18: LE shift 112 */ - { 102, 9, 126}, /* 19: RSHIFT shift 126 */ - { 24, 0, 145}, /* 20: CONCAT shift 145 */ - { 54, 0, 110}, /* 21: GT shift 110 */ - { 77, 0, 124}, /* 22: LSHIFT shift 124 */ - { 106, 10, 141}, /* 23: SLASH shift 141 */ - { 51, 0, 114}, /* 24: GE shift 114 */ - { 108, 16, 139}, /* 25: STAR shift 139 */ - { 81, 0, 116}, /* 26: NE shift 116 */ - { 82, 21, 130}, /* 27: NOT shift 130 */ - { 83, 0, 152}, /* 28: NOTNULL shift 152 */ + { 22, 0, 450}, /* 1: COMMA shift 450 */ + { 217, 0, 454}, /* 2: where_opt shift 454 */ + { 130, 1, 234}, /* 3: WHERE shift 234 */ + { 107, 0, 710}, /* 4: SEMI reduce 155 */ /* State 450 */ - { 49, 0, 451}, /* 1: FROM shift 451 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 451}, /* 2: nm shift 451 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 451 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 452}, /* 2: nm shift 452 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 45, 0, 452}, /* 1: EQ shift 452 */ /* State 452 */ - { 104, 0, 685}, /* 1: SEMI reduce 154 */ - { 127, 0, 232}, /* 2: WHERE shift 232 */ - { 212, 1, 453}, /* 3: where_opt shift 453 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 453}, /* 8: expr shift 453 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 453 */ - { 104, 0, 804}, /* 1: SEMI reduce 273 */ + { 84, 0, 118}, /* 1: NE shift 118 */ + { 85, 4, 132}, /* 2: NOT shift 132 */ + { 86, 0, 154}, /* 3: NOTNULL shift 154 */ + { 57, 0, 112}, /* 4: GT shift 112 */ + { 63, 0, 159}, /* 5: IN shift 159 */ + { 5, 0, 100}, /* 6: AND shift 100 */ + { 71, 0, 150}, /* 7: IS shift 150 */ + { 91, 5, 108}, /* 8: OR shift 108 */ + { 92, 0, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 10: likeop shift 130 */ + { 94, 0, 137}, /* 11: PLUS shift 137 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 12, 0, 122}, /* 13: BITAND shift 122 */ + { 77, 0, 135}, /* 14: LIKE shift 135 */ + { 14, 0, 124}, /* 15: BITOR shift 124 */ + { 99, 7, 145}, /* 16: REM shift 145 */ + { 72, 0, 149}, /* 17: ISNULL shift 149 */ + { 45, 0, 120}, /* 18: EQ shift 120 */ + { 81, 20, 110}, /* 19: LT shift 110 */ + { 25, 0, 147}, /* 20: CONCAT shift 147 */ + { 76, 0, 114}, /* 21: LE shift 114 */ + { 105, 14, 128}, /* 22: RSHIFT shift 128 */ + { 83, 24, 139}, /* 23: MINUS shift 139 */ + { 55, 0, 136}, /* 24: GLOB shift 136 */ + { 80, 0, 126}, /* 25: LSHIFT shift 126 */ + { 109, 19, 143}, /* 26: SLASH shift 143 */ + { 54, 0, 116}, /* 27: GE shift 116 */ + { 111, 23, 141}, /* 28: STAR shift 141 */ /* State 454 */ - { 76, 4, 68}, /* 1: LP shift 68 */ - { 91, 1, 174}, /* 2: PLUS shift 174 */ - { 152, 0, 455}, /* 3: expr shift 455 */ - { 46, 7, 167}, /* 4: FLOAT shift 167 */ - { 94, 0, 186}, /* 5: RAISE shift 186 */ - { 110, 9, 66}, /* 6: STRING shift 66 */ - { 16, 0, 176}, /* 7: CASE shift 176 */ - { 82, 0, 168}, /* 8: NOT shift 168 */ - { 80, 11, 172}, /* 9: MINUS shift 172 */ - { 84, 0, 101}, /* 10: NULL shift 101 */ - { 65, 0, 166}, /* 11: INTEGER shift 166 */ - { 71, 14, 67}, /* 12: JOIN_KW shift 67 */ - { 177, 15, 102}, /* 13: nm shift 102 */ - { 56, 0, 64}, /* 14: ID shift 64 */ - { 12, 0, 170}, /* 15: BITNOT shift 170 */ + { 107, 0, 828}, /* 1: SEMI reduce 273 */ /* State 455 */ - { 60, 0, 157}, /* 1: IN shift 157 */ - { 88, 0, 106}, /* 2: OR shift 106 */ - { 89, 1, 99}, /* 3: ORACLE_OUTER_JOIN shift 99 */ - { 9, 0, 798}, /* 4: BEGIN reduce 267 */ - { 91, 0, 135}, /* 5: PLUS shift 135 */ - { 5, 0, 100}, /* 6: AND shift 100 */ - { 10, 0, 153}, /* 7: BETWEEN shift 153 */ - { 11, 0, 120}, /* 8: BITAND shift 120 */ - { 13, 0, 122}, /* 9: BITOR shift 122 */ - { 96, 4, 143}, /* 10: REM shift 143 */ - { 68, 7, 148}, /* 11: IS shift 148 */ - { 69, 8, 147}, /* 12: ISNULL shift 147 */ - { 73, 0, 112}, /* 13: LE shift 112 */ - { 42, 9, 118}, /* 14: EQ shift 118 */ - { 77, 0, 124}, /* 15: LSHIFT shift 124 */ - { 102, 13, 126}, /* 16: RSHIFT shift 126 */ - { 74, 0, 133}, /* 17: LIKE shift 133 */ - { 51, 0, 114}, /* 18: GE shift 114 */ - { 52, 0, 134}, /* 19: GLOB shift 134 */ - { 106, 15, 141}, /* 20: SLASH shift 141 */ - { 78, 0, 108}, /* 21: LT shift 108 */ - { 108, 0, 139}, /* 22: STAR shift 139 */ - { 80, 18, 137}, /* 23: MINUS shift 137 */ - { 81, 19, 116}, /* 24: NE shift 116 */ - { 82, 27, 130}, /* 25: NOT shift 130 */ - { 83, 29, 152}, /* 26: NOTNULL shift 152 */ - { 24, 0, 145}, /* 27: CONCAT shift 145 */ - { 172, 0, 128}, /* 28: likeop shift 128 */ - { 54, 0, 110}, /* 29: GT shift 110 */ + { 45, 0, 456}, /* 1: EQ shift 456 */ /* State 456 */ - { 38, 0, 457}, /* 1: EACH shift 457 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 457}, /* 8: expr shift 457 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 457 */ - { 100, 0, 458}, /* 1: ROW shift 458 */ - { 109, 0, 459}, /* 2: STATEMENT shift 459 */ + { 84, 0, 118}, /* 1: NE shift 118 */ + { 85, 4, 132}, /* 2: NOT shift 132 */ + { 86, 0, 154}, /* 3: NOTNULL shift 154 */ + { 57, 0, 112}, /* 4: GT shift 112 */ + { 63, 0, 159}, /* 5: IN shift 159 */ + { 5, 0, 100}, /* 6: AND shift 100 */ + { 71, 0, 150}, /* 7: IS shift 150 */ + { 91, 5, 108}, /* 8: OR shift 108 */ + { 92, 0, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 10: likeop shift 130 */ + { 94, 0, 137}, /* 11: PLUS shift 137 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 12, 0, 122}, /* 13: BITAND shift 122 */ + { 77, 0, 135}, /* 14: LIKE shift 135 */ + { 14, 0, 124}, /* 15: BITOR shift 124 */ + { 99, 7, 145}, /* 16: REM shift 145 */ + { 72, 0, 149}, /* 17: ISNULL shift 149 */ + { 45, 0, 120}, /* 18: EQ shift 120 */ + { 81, 20, 110}, /* 19: LT shift 110 */ + { 25, 0, 147}, /* 20: CONCAT shift 147 */ + { 76, 0, 114}, /* 21: LE shift 114 */ + { 105, 14, 128}, /* 22: RSHIFT shift 128 */ + { 83, 24, 139}, /* 23: MINUS shift 139 */ + { 55, 0, 136}, /* 24: GLOB shift 136 */ + { 80, 0, 126}, /* 25: LSHIFT shift 126 */ + { 109, 19, 143}, /* 26: SLASH shift 143 */ + { 54, 0, 116}, /* 27: GE shift 116 */ + { 111, 23, 141}, /* 28: STAR shift 141 */ +/* State 458 */ + { 186, 0, 459}, /* 1: orconf shift 459 */ + { 91, 3, 444}, /* 2: OR shift 444 */ + { 70, 0, 645}, /* 3: INTO reduce 90 */ +/* State 459 */ + { 70, 0, 460}, /* 1: INTO shift 460 */ /* State 460 */ - { 87, 0, 790}, /* 1: ON reduce 259 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 461}, /* 2: nm shift 461 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 461 */ - { 87, 0, 791}, /* 1: ON reduce 260 */ + { 172, 0, 465}, /* 1: inscollist_opt shift 465 */ + { 79, 0, 462}, /* 2: LP shift 462 */ /* State 462 */ - { 85, 0, 463}, /* 1: OF shift 463 */ - { 87, 1, 792}, /* 2: ON reduce 261 */ + { 171, 0, 463}, /* 1: inscollist shift 463 */ + { 181, 1, 429}, /* 2: nm shift 429 */ + { 59, 0, 20}, /* 3: ID shift 20 */ + { 113, 0, 21}, /* 4: STRING shift 21 */ + { 74, 3, 22}, /* 5: JOIN_KW shift 22 */ /* State 463 */ - { 110, 0, 21}, /* 1: STRING shift 21 */ - { 166, 4, 464}, /* 2: inscollist shift 464 */ - { 177, 0, 440}, /* 3: nm shift 440 */ - { 71, 5, 22}, /* 4: JOIN_KW shift 22 */ - { 56, 0, 20}, /* 5: ID shift 20 */ -/* State 464 */ - { 21, 0, 438}, /* 1: COMMA shift 438 */ - { 87, 1, 793}, /* 2: ON reduce 262 */ + { 104, 2, 464}, /* 1: RP shift 464 */ + { 22, 0, 427}, /* 2: COMMA shift 427 */ +/* State 465 */ + { 196, 0, 466}, /* 1: select shift 466 */ + { 185, 0, 69}, /* 2: oneselect shift 69 */ + { 106, 0, 73}, /* 3: SELECT shift 73 */ + { 127, 0, 467}, /* 4: VALUES shift 467 */ +/* State 466 */ + { 180, 0, 71}, /* 1: multiselect_op shift 71 */ + { 121, 4, 162}, /* 2: UNION shift 162 */ + { 107, 0, 830}, /* 3: SEMI reduce 275 */ + { 46, 0, 165}, /* 4: EXCEPT shift 165 */ + { 69, 0, 164}, /* 5: INTERSECT shift 164 */ /* State 467 */ - { 85, 0, 468}, /* 1: OF shift 468 */ + { 79, 0, 468}, /* 1: LP shift 468 */ +/* State 468 */ + { 97, 3, 188}, /* 1: RAISE shift 188 */ + { 113, 1, 66}, /* 2: STRING shift 66 */ + { 49, 7, 169}, /* 3: FLOAT shift 169 */ + { 83, 0, 174}, /* 4: MINUS shift 174 */ + { 68, 0, 168}, /* 5: INTEGER shift 168 */ + { 181, 9, 102}, /* 6: nm shift 102 */ + { 17, 0, 178}, /* 7: CASE shift 178 */ + { 87, 0, 101}, /* 8: NULL shift 101 */ + { 85, 0, 170}, /* 9: NOT shift 170 */ + { 13, 0, 172}, /* 10: BITNOT shift 172 */ + { 74, 0, 67}, /* 11: JOIN_KW shift 67 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 94, 0, 176}, /* 13: PLUS shift 176 */ + { 157, 10, 473}, /* 14: expr shift 473 */ + { 174, 13, 469}, /* 15: itemlist shift 469 */ + { 79, 0, 68}, /* 16: LP shift 68 */ /* State 469 */ - { 61, 0, 474}, /* 1: INDEX shift 474 */ - { 125, 1, 472}, /* 2: VIEW shift 472 */ - { 111, 0, 470}, /* 3: TABLE shift 470 */ - { 115, 3, 476}, /* 4: TRIGGER shift 476 */ + { 104, 2, 472}, /* 1: RP shift 472 */ + { 22, 0, 470}, /* 2: COMMA shift 470 */ /* State 470 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 471}, /* 2: nm shift 471 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 79, 4, 68}, /* 1: LP shift 68 */ + { 181, 0, 102}, /* 2: nm shift 102 */ + { 17, 0, 178}, /* 3: CASE shift 178 */ + { 49, 0, 169}, /* 4: FLOAT shift 169 */ + { 94, 1, 176}, /* 5: PLUS shift 176 */ + { 97, 0, 188}, /* 6: RAISE shift 188 */ + { 83, 10, 174}, /* 7: MINUS shift 174 */ + { 157, 6, 471}, /* 8: expr shift 471 */ + { 113, 7, 66}, /* 9: STRING shift 66 */ + { 68, 0, 168}, /* 10: INTEGER shift 168 */ + { 85, 0, 170}, /* 11: NOT shift 170 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 87, 0, 101}, /* 13: NULL shift 101 */ + { 13, 0, 172}, /* 14: BITNOT shift 172 */ + { 74, 12, 67}, /* 15: JOIN_KW shift 67 */ /* State 471 */ - { 104, 0, 628}, /* 1: SEMI reduce 97 */ + { 84, 0, 118}, /* 1: NE shift 118 */ + { 85, 4, 132}, /* 2: NOT shift 132 */ + { 86, 0, 154}, /* 3: NOTNULL shift 154 */ + { 57, 0, 112}, /* 4: GT shift 112 */ + { 63, 0, 159}, /* 5: IN shift 159 */ + { 5, 0, 100}, /* 6: AND shift 100 */ + { 71, 0, 150}, /* 7: IS shift 150 */ + { 91, 5, 108}, /* 8: OR shift 108 */ + { 92, 0, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 10: likeop shift 130 */ + { 94, 0, 137}, /* 11: PLUS shift 137 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 12, 0, 122}, /* 13: BITAND shift 122 */ + { 77, 0, 135}, /* 14: LIKE shift 135 */ + { 14, 0, 124}, /* 15: BITOR shift 124 */ + { 99, 7, 145}, /* 16: REM shift 145 */ + { 72, 0, 149}, /* 17: ISNULL shift 149 */ + { 45, 0, 120}, /* 18: EQ shift 120 */ + { 81, 20, 110}, /* 19: LT shift 110 */ + { 25, 0, 147}, /* 20: CONCAT shift 147 */ + { 76, 0, 114}, /* 21: LE shift 114 */ + { 105, 14, 128}, /* 22: RSHIFT shift 128 */ + { 83, 24, 139}, /* 23: MINUS shift 139 */ + { 55, 0, 136}, /* 24: GLOB shift 136 */ + { 80, 0, 126}, /* 25: LSHIFT shift 126 */ + { 109, 19, 143}, /* 26: SLASH shift 143 */ + { 54, 0, 116}, /* 27: GE shift 116 */ + { 111, 23, 141}, /* 28: STAR shift 141 */ /* State 472 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 473}, /* 2: nm shift 473 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 107, 0, 829}, /* 1: SEMI reduce 274 */ /* State 473 */ - { 104, 0, 630}, /* 1: SEMI reduce 99 */ + { 84, 0, 118}, /* 1: NE shift 118 */ + { 85, 4, 132}, /* 2: NOT shift 132 */ + { 86, 0, 154}, /* 3: NOTNULL shift 154 */ + { 57, 0, 112}, /* 4: GT shift 112 */ + { 63, 0, 159}, /* 5: IN shift 159 */ + { 5, 0, 100}, /* 6: AND shift 100 */ + { 71, 0, 150}, /* 7: IS shift 150 */ + { 91, 5, 108}, /* 8: OR shift 108 */ + { 92, 0, 99}, /* 9: ORACLE_OUTER_JOIN shift 99 */ + { 177, 0, 130}, /* 10: likeop shift 130 */ + { 94, 0, 137}, /* 11: PLUS shift 137 */ + { 11, 0, 155}, /* 12: BETWEEN shift 155 */ + { 12, 0, 122}, /* 13: BITAND shift 122 */ + { 77, 0, 135}, /* 14: LIKE shift 135 */ + { 14, 0, 124}, /* 15: BITOR shift 124 */ + { 99, 7, 145}, /* 16: REM shift 145 */ + { 72, 0, 149}, /* 17: ISNULL shift 149 */ + { 45, 0, 120}, /* 18: EQ shift 120 */ + { 81, 20, 110}, /* 19: LT shift 110 */ + { 25, 0, 147}, /* 20: CONCAT shift 147 */ + { 76, 0, 114}, /* 21: LE shift 114 */ + { 105, 14, 128}, /* 22: RSHIFT shift 128 */ + { 83, 24, 139}, /* 23: MINUS shift 139 */ + { 55, 0, 136}, /* 24: GLOB shift 136 */ + { 80, 0, 126}, /* 25: LSHIFT shift 126 */ + { 109, 19, 143}, /* 26: SLASH shift 143 */ + { 54, 0, 116}, /* 27: GE shift 116 */ + { 111, 23, 141}, /* 28: STAR shift 141 */ /* State 474 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 475}, /* 2: nm shift 475 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 52, 0, 475}, /* 1: FROM shift 475 */ /* State 475 */ - { 104, 0, 768}, /* 1: SEMI reduce 237 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 476}, /* 2: nm shift 476 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 476 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 477}, /* 2: nm shift 477 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 130, 0, 234}, /* 1: WHERE shift 234 */ + { 217, 1, 477}, /* 2: where_opt shift 477 */ + { 107, 0, 710}, /* 3: SEMI reduce 155 */ /* State 477 */ - { 104, 0, 810}, /* 1: SEMI reduce 279 */ + { 107, 0, 831}, /* 1: SEMI reduce 276 */ /* State 478 */ - { 66, 0, 162}, /* 1: INTERSECT shift 162 */ - { 176, 1, 71}, /* 2: multiselect_op shift 71 */ - { 43, 0, 163}, /* 3: EXCEPT shift 163 */ - { 118, 3, 160}, /* 4: UNION shift 160 */ - { 104, 0, 631}, /* 5: SEMI reduce 100 */ + { 128, 2, 481}, /* 1: VIEW shift 481 */ + { 64, 0, 483}, /* 2: INDEX shift 483 */ + { 118, 4, 486}, /* 3: TRIGGER shift 486 */ + { 114, 0, 479}, /* 4: TABLE shift 479 */ /* State 479 */ - { 49, 0, 480}, /* 1: FROM shift 480 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 480}, /* 2: nm shift 480 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 480 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 481}, /* 2: nm shift 481 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 107, 0, 652}, /* 1: SEMI reduce 97 */ /* State 481 */ - { 104, 0, 685}, /* 1: SEMI reduce 154 */ - { 127, 0, 232}, /* 2: WHERE shift 232 */ - { 212, 1, 482}, /* 3: where_opt shift 482 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 482}, /* 2: nm shift 482 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 482 */ - { 104, 0, 684}, /* 1: SEMI reduce 153 */ + { 107, 0, 654}, /* 1: SEMI reduce 99 */ /* State 483 */ - { 182, 2, 484}, /* 1: orconf shift 484 */ - { 88, 0, 417}, /* 2: OR shift 417 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 484}, /* 2: nm shift 484 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 484 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 485}, /* 2: nm shift 485 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 150, 2, 485}, /* 1: dbnm shift 485 */ + { 39, 0, 270}, /* 2: DOT shift 270 */ + { 107, 0, 680}, /* 3: SEMI reduce 125 */ /* State 485 */ - { 105, 0, 486}, /* 1: SET shift 486 */ + { 107, 0, 794}, /* 1: SEMI reduce 239 */ /* State 486 */ - { 110, 0, 21}, /* 1: STRING shift 21 */ - { 71, 4, 22}, /* 2: JOIN_KW shift 22 */ - { 177, 0, 428}, /* 3: nm shift 428 */ - { 56, 0, 20}, /* 4: ID shift 20 */ - { 194, 0, 487}, /* 5: setlist shift 487 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 487}, /* 2: nm shift 487 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 487 */ - { 212, 3, 488}, /* 1: where_opt shift 488 */ - { 21, 0, 423}, /* 2: COMMA shift 423 */ - { 104, 0, 685}, /* 3: SEMI reduce 154 */ - { 127, 0, 232}, /* 4: WHERE shift 232 */ + { 150, 2, 488}, /* 1: dbnm shift 488 */ + { 39, 0, 270}, /* 2: DOT shift 270 */ + { 107, 0, 680}, /* 3: SEMI reduce 125 */ /* State 488 */ - { 104, 0, 687}, /* 1: SEMI reduce 156 */ + { 107, 0, 837}, /* 1: SEMI reduce 282 */ /* State 489 */ - { 67, 0, 490}, /* 1: INTO shift 490 */ + { 180, 0, 71}, /* 1: multiselect_op shift 71 */ + { 121, 4, 162}, /* 2: UNION shift 162 */ + { 107, 0, 655}, /* 3: SEMI reduce 100 */ + { 46, 0, 165}, /* 4: EXCEPT shift 165 */ + { 69, 0, 164}, /* 5: INTERSECT shift 164 */ /* State 490 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 491}, /* 2: nm shift 491 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 52, 0, 491}, /* 1: FROM shift 491 */ /* State 491 */ - { 76, 0, 435}, /* 1: LP shift 435 */ - { 167, 0, 492}, /* 2: inscollist_opt shift 492 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 492}, /* 2: nm shift 492 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 492 */ - { 192, 3, 493}, /* 1: select shift 493 */ - { 181, 0, 69}, /* 2: oneselect shift 69 */ - { 124, 0, 494}, /* 3: VALUES shift 494 */ - { 103, 0, 73}, /* 4: SELECT shift 73 */ + { 150, 0, 493}, /* 1: dbnm shift 493 */ + { 39, 0, 270}, /* 2: DOT shift 270 */ /* State 493 */ - { 66, 0, 162}, /* 1: INTERSECT shift 162 */ - { 176, 1, 71}, /* 2: multiselect_op shift 71 */ - { 43, 0, 163}, /* 3: EXCEPT shift 163 */ - { 118, 3, 160}, /* 4: UNION shift 160 */ - { 104, 0, 691}, /* 5: SEMI reduce 160 */ + { 130, 0, 234}, /* 1: WHERE shift 234 */ + { 217, 1, 494}, /* 2: where_opt shift 494 */ + { 107, 0, 710}, /* 3: SEMI reduce 155 */ /* State 494 */ - { 76, 0, 495}, /* 1: LP shift 495 */ + { 107, 0, 709}, /* 1: SEMI reduce 154 */ /* State 495 */ - { 80, 4, 172}, /* 1: MINUS shift 172 */ - { 177, 6, 102}, /* 2: nm shift 102 */ - { 82, 0, 168}, /* 3: NOT shift 168 */ - { 16, 0, 176}, /* 4: CASE shift 176 */ - { 84, 0, 101}, /* 5: NULL shift 101 */ - { 65, 0, 166}, /* 6: INTEGER shift 166 */ - { 56, 0, 64}, /* 7: ID shift 64 */ - { 71, 0, 67}, /* 8: JOIN_KW shift 67 */ - { 152, 7, 449}, /* 9: expr shift 449 */ - { 169, 0, 496}, /* 10: itemlist shift 496 */ - { 12, 0, 170}, /* 11: BITNOT shift 170 */ - { 91, 0, 174}, /* 12: PLUS shift 174 */ - { 76, 11, 68}, /* 13: LP shift 68 */ - { 94, 16, 186}, /* 14: RAISE shift 186 */ - { 110, 14, 66}, /* 15: STRING shift 66 */ - { 46, 0, 167}, /* 16: FLOAT shift 167 */ + { 186, 0, 496}, /* 1: orconf shift 496 */ + { 91, 0, 444}, /* 2: OR shift 444 */ /* State 496 */ - { 21, 0, 446}, /* 1: COMMA shift 446 */ - { 101, 1, 497}, /* 2: RP shift 497 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 497}, /* 2: nm shift 497 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 497 */ - { 104, 0, 690}, /* 1: SEMI reduce 159 */ + { 150, 2, 498}, /* 1: dbnm shift 498 */ + { 108, 3, 680}, /* 2: SET reduce 125 */ + { 39, 0, 270}, /* 3: DOT shift 270 */ /* State 498 */ - { 67, 0, 621}, /* 1: INTO reduce 90 */ - { 88, 1, 417}, /* 2: OR shift 417 */ - { 182, 0, 499}, /* 3: orconf shift 499 */ + { 108, 0, 499}, /* 1: SET shift 499 */ /* State 499 */ - { 67, 0, 692}, /* 1: INTO reduce 161 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 0, 455}, /* 2: nm shift 455 */ + { 59, 0, 20}, /* 3: ID shift 20 */ + { 198, 1, 500}, /* 4: setlist shift 500 */ + { 74, 3, 22}, /* 5: JOIN_KW shift 22 */ /* State 500 */ - { 67, 0, 693}, /* 1: INTO reduce 162 */ + { 22, 0, 450}, /* 1: COMMA shift 450 */ + { 217, 0, 501}, /* 2: where_opt shift 501 */ + { 130, 1, 234}, /* 3: WHERE shift 234 */ + { 107, 0, 710}, /* 4: SEMI reduce 155 */ /* State 501 */ - { 182, 2, 502}, /* 1: orconf shift 502 */ - { 88, 0, 417}, /* 2: OR shift 417 */ + { 107, 0, 712}, /* 1: SEMI reduce 157 */ /* State 502 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 503}, /* 2: nm shift 503 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 70, 0, 503}, /* 1: INTO shift 503 */ /* State 503 */ - { 49, 0, 504}, /* 1: FROM shift 504 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 504}, /* 2: nm shift 504 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 504 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 505}, /* 2: nm shift 505 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 150, 0, 505}, /* 1: dbnm shift 505 */ + { 39, 0, 270}, /* 2: DOT shift 270 */ /* State 505 */ - { 122, 2, 506}, /* 1: USING shift 506 */ - { 104, 0, 770}, /* 2: SEMI reduce 239 */ + { 172, 0, 506}, /* 1: inscollist_opt shift 506 */ + { 79, 0, 462}, /* 2: LP shift 462 */ /* State 506 */ - { 33, 0, 507}, /* 1: DELIMITERS shift 507 */ + { 196, 0, 507}, /* 1: select shift 507 */ + { 185, 0, 69}, /* 2: oneselect shift 69 */ + { 106, 0, 73}, /* 3: SELECT shift 73 */ + { 127, 0, 508}, /* 4: VALUES shift 508 */ /* State 507 */ - { 110, 0, 508}, /* 1: STRING shift 508 */ + { 180, 0, 71}, /* 1: multiselect_op shift 71 */ + { 121, 4, 162}, /* 2: UNION shift 162 */ + { 107, 0, 716}, /* 3: SEMI reduce 161 */ + { 46, 0, 165}, /* 4: EXCEPT shift 165 */ + { 69, 0, 164}, /* 5: INTERSECT shift 164 */ /* State 508 */ - { 104, 0, 769}, /* 1: SEMI reduce 238 */ + { 79, 0, 509}, /* 1: LP shift 509 */ /* State 509 */ - { 110, 0, 21}, /* 1: STRING shift 21 */ - { 71, 4, 22}, /* 2: JOIN_KW shift 22 */ - { 177, 0, 510}, /* 3: nm shift 510 */ - { 56, 0, 20}, /* 4: ID shift 20 */ - { 104, 0, 771}, /* 5: SEMI reduce 240 */ + { 97, 3, 188}, /* 1: RAISE shift 188 */ + { 113, 1, 66}, /* 2: STRING shift 66 */ + { 49, 7, 169}, /* 3: FLOAT shift 169 */ + { 83, 0, 174}, /* 4: MINUS shift 174 */ + { 68, 0, 168}, /* 5: INTEGER shift 168 */ + { 181, 9, 102}, /* 6: nm shift 102 */ + { 17, 0, 178}, /* 7: CASE shift 178 */ + { 87, 0, 101}, /* 8: NULL shift 101 */ + { 85, 0, 170}, /* 9: NOT shift 170 */ + { 13, 0, 172}, /* 10: BITNOT shift 172 */ + { 74, 0, 67}, /* 11: JOIN_KW shift 67 */ + { 59, 0, 64}, /* 12: ID shift 64 */ + { 94, 0, 176}, /* 13: PLUS shift 176 */ + { 157, 10, 473}, /* 14: expr shift 473 */ + { 174, 13, 510}, /* 15: itemlist shift 510 */ + { 79, 0, 68}, /* 16: LP shift 68 */ /* State 510 */ - { 104, 0, 772}, /* 1: SEMI reduce 241 */ + { 104, 2, 511}, /* 1: RP shift 511 */ + { 22, 0, 470}, /* 2: COMMA shift 470 */ /* State 511 */ - { 56, 0, 248}, /* 1: ID shift 248 */ - { 160, 0, 512}, /* 2: ids shift 512 */ - { 110, 1, 249}, /* 3: STRING shift 249 */ + { 107, 0, 715}, /* 1: SEMI reduce 160 */ /* State 512 */ - { 42, 0, 513}, /* 1: EQ shift 513 */ - { 76, 0, 525}, /* 2: LP shift 525 */ - { 104, 0, 778}, /* 3: SEMI reduce 247 */ + { 186, 0, 513}, /* 1: orconf shift 513 */ + { 91, 3, 444}, /* 2: OR shift 444 */ + { 70, 0, 645}, /* 3: INTO reduce 90 */ /* State 513 */ - { 110, 3, 21}, /* 1: STRING shift 21 */ - { 91, 4, 524}, /* 2: PLUS shift 524 */ - { 80, 0, 522}, /* 3: MINUS shift 522 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ - { 184, 0, 516}, /* 5: plus_num shift 516 */ - { 185, 9, 518}, /* 6: plus_opt shift 518 */ - { 56, 0, 20}, /* 7: ID shift 20 */ - { 177, 10, 514}, /* 8: nm shift 514 */ - { 175, 0, 517}, /* 9: minus_num shift 517 */ - { 87, 0, 515}, /* 10: ON shift 515 */ + { 70, 0, 717}, /* 1: INTO reduce 162 */ /* State 514 */ - { 104, 0, 773}, /* 1: SEMI reduce 242 */ + { 70, 0, 718}, /* 1: INTO reduce 163 */ /* State 515 */ - { 104, 0, 774}, /* 1: SEMI reduce 243 */ + { 186, 0, 516}, /* 1: orconf shift 516 */ + { 91, 0, 444}, /* 2: OR shift 444 */ /* State 516 */ - { 104, 0, 775}, /* 1: SEMI reduce 244 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 517}, /* 2: nm shift 517 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 517 */ - { 104, 0, 776}, /* 1: SEMI reduce 245 */ + { 150, 3, 518}, /* 1: dbnm shift 518 */ + { 52, 0, 680}, /* 2: FROM reduce 125 */ + { 39, 0, 270}, /* 3: DOT shift 270 */ /* State 518 */ - { 46, 0, 521}, /* 1: FLOAT shift 521 */ - { 178, 1, 519}, /* 2: number shift 519 */ - { 65, 0, 520}, /* 3: INTEGER shift 520 */ + { 52, 0, 519}, /* 1: FROM shift 519 */ /* State 519 */ - { 104, 0, 779}, /* 1: SEMI reduce 248 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 520}, /* 2: nm shift 520 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ /* State 520 */ - { 104, 0, 781}, /* 1: SEMI reduce 250 */ + { 107, 0, 796}, /* 1: SEMI reduce 241 */ + { 125, 1, 521}, /* 2: USING shift 521 */ /* State 521 */ - { 104, 0, 782}, /* 1: SEMI reduce 251 */ + { 35, 0, 522}, /* 1: DELIMITERS shift 522 */ /* State 522 */ - { 46, 0, 521}, /* 1: FLOAT shift 521 */ - { 178, 1, 523}, /* 2: number shift 523 */ - { 65, 0, 520}, /* 3: INTEGER shift 520 */ + { 113, 0, 523}, /* 1: STRING shift 523 */ /* State 523 */ - { 104, 0, 780}, /* 1: SEMI reduce 249 */ + { 107, 0, 795}, /* 1: SEMI reduce 240 */ +/* State 524 */ + { 59, 0, 20}, /* 1: ID shift 20 */ + { 181, 0, 525}, /* 2: nm shift 525 */ + { 107, 0, 797}, /* 3: SEMI reduce 242 */ + { 113, 0, 21}, /* 4: STRING shift 21 */ + { 74, 1, 22}, /* 5: JOIN_KW shift 22 */ /* State 525 */ - { 56, 0, 20}, /* 1: ID shift 20 */ - { 177, 0, 526}, /* 2: nm shift 526 */ - { 110, 0, 21}, /* 3: STRING shift 21 */ - { 71, 0, 22}, /* 4: JOIN_KW shift 22 */ + { 107, 0, 798}, /* 1: SEMI reduce 243 */ /* State 526 */ - { 101, 0, 527}, /* 1: RP shift 527 */ + { 165, 0, 527}, /* 1: ids shift 527 */ + { 59, 0, 251}, /* 2: ID shift 251 */ + { 113, 2, 252}, /* 3: STRING shift 252 */ /* State 527 */ - { 104, 0, 777}, /* 1: SEMI reduce 246 */ + { 45, 0, 528}, /* 1: EQ shift 528 */ + { 79, 0, 540}, /* 2: LP shift 540 */ + { 107, 0, 804}, /* 3: SEMI reduce 249 */ +/* State 528 */ + { 90, 0, 530}, /* 1: ON shift 530 */ + { 181, 0, 529}, /* 2: nm shift 529 */ + { 83, 0, 537}, /* 3: MINUS shift 537 */ + { 113, 3, 21}, /* 4: STRING shift 21 */ + { 94, 6, 539}, /* 5: PLUS shift 539 */ + { 74, 0, 22}, /* 6: JOIN_KW shift 22 */ + { 179, 8, 532}, /* 7: minus_num shift 532 */ + { 59, 0, 20}, /* 8: ID shift 20 */ + { 188, 0, 531}, /* 9: plus_num shift 531 */ + { 189, 7, 533}, /* 10: plus_opt shift 533 */ +/* State 529 */ + { 107, 0, 799}, /* 1: SEMI reduce 244 */ +/* State 530 */ + { 107, 0, 800}, /* 1: SEMI reduce 245 */ +/* State 531 */ + { 107, 0, 801}, /* 1: SEMI reduce 246 */ +/* State 532 */ + { 107, 0, 802}, /* 1: SEMI reduce 247 */ +/* State 533 */ + { 68, 0, 535}, /* 1: INTEGER shift 535 */ + { 49, 0, 536}, /* 2: FLOAT shift 536 */ + { 182, 1, 534}, /* 3: number shift 534 */ +/* State 534 */ + { 107, 0, 805}, /* 1: SEMI reduce 250 */ +/* State 535 */ + { 107, 0, 807}, /* 1: SEMI reduce 252 */ +/* State 536 */ + { 107, 0, 808}, /* 1: SEMI reduce 253 */ +/* State 537 */ + { 68, 0, 535}, /* 1: INTEGER shift 535 */ + { 49, 0, 536}, /* 2: FLOAT shift 536 */ + { 182, 1, 538}, /* 3: number shift 538 */ +/* State 538 */ + { 107, 0, 806}, /* 1: SEMI reduce 251 */ +/* State 540 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 541}, /* 2: nm shift 541 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ +/* State 541 */ + { 104, 0, 542}, /* 1: RP shift 542 */ +/* State 542 */ + { 107, 0, 803}, /* 1: SEMI reduce 248 */ +/* State 543 */ + { 30, 0, 548}, /* 1: DATABASE shift 548 */ + { 149, 0, 544}, /* 2: database_kw_opt shift 544 */ +/* State 544 */ + { 165, 0, 545}, /* 1: ids shift 545 */ + { 59, 0, 251}, /* 2: ID shift 251 */ + { 113, 2, 252}, /* 3: STRING shift 252 */ +/* State 545 */ + { 6, 0, 546}, /* 1: AS shift 546 */ +/* State 546 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 547}, /* 2: nm shift 547 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ +/* State 547 */ + { 107, 0, 838}, /* 1: SEMI reduce 283 */ +/* State 549 */ + { 30, 0, 548}, /* 1: DATABASE shift 548 */ + { 149, 0, 550}, /* 2: database_kw_opt shift 550 */ +/* State 550 */ + { 113, 0, 21}, /* 1: STRING shift 21 */ + { 181, 1, 551}, /* 2: nm shift 551 */ + { 74, 0, 22}, /* 3: JOIN_KW shift 22 */ + { 59, 0, 20}, /* 4: ID shift 20 */ +/* State 551 */ + { 107, 0, 841}, /* 1: SEMI reduce 286 */ }; /* The state table contains information needed to look up the correct @@ -3121,537 +3197,561 @@ struct yyStateEntry { }; typedef struct yyStateEntry yyStateEntry; static const yyStateEntry yyStateTable[] = { - { &yyActionTable[0], 6, 538 }, - { &yyActionTable[6], 5, 538 }, - { &yyActionTable[11], 0, 533 }, - { &yyActionTable[11], 20, 811 }, - { &yyActionTable[31], 1, 811 }, - { &yyActionTable[32], 0, 534 }, - { &yyActionTable[32], 1, 811 }, - { &yyActionTable[33], 2, 540 }, - { &yyActionTable[35], 3, 811 }, - { &yyActionTable[38], 1, 811 }, - { &yyActionTable[39], 1, 811 }, - { &yyActionTable[40], 6, 811 }, - { &yyActionTable[46], 0, 620 }, - { &yyActionTable[46], 0, 623 }, - { &yyActionTable[46], 0, 624 }, - { &yyActionTable[46], 0, 625 }, - { &yyActionTable[46], 0, 626 }, - { &yyActionTable[46], 0, 627 }, - { &yyActionTable[46], 4, 541 }, - { &yyActionTable[50], 0, 542 }, - { &yyActionTable[50], 0, 559 }, - { &yyActionTable[50], 0, 560 }, - { &yyActionTable[50], 0, 561 }, - { &yyActionTable[50], 3, 811 }, - { &yyActionTable[53], 1, 811 }, - { &yyActionTable[54], 3, 811 }, - { &yyActionTable[57], 1, 811 }, - { &yyActionTable[58], 3, 811 }, - { &yyActionTable[61], 1, 811 }, - { &yyActionTable[62], 3, 811 }, - { &yyActionTable[65], 1, 811 }, - { &yyActionTable[66], 7, 811 }, - { &yyActionTable[73], 3, 811 }, - { &yyActionTable[76], 1, 811 }, - { &yyActionTable[77], 1, 811 }, - { &yyActionTable[78], 13, 811 }, - { &yyActionTable[91], 0, 552 }, - { &yyActionTable[91], 5, 562 }, - { &yyActionTable[96], 1, 572 }, - { &yyActionTable[97], 13, 554 }, - { &yyActionTable[110], 0, 571 }, - { &yyActionTable[110], 4, 811 }, - { &yyActionTable[114], 10, 811 }, - { &yyActionTable[124], 0, 573 }, - { &yyActionTable[124], 2, 619 }, - { &yyActionTable[126], 0, 584 }, - { &yyActionTable[126], 2, 811 }, - { &yyActionTable[128], 2, 619 }, - { &yyActionTable[130], 0, 585 }, - { &yyActionTable[130], 2, 604 }, - { &yyActionTable[132], 0, 602 }, - { &yyActionTable[132], 2, 811 }, - { &yyActionTable[134], 0, 605 }, - { &yyActionTable[134], 0, 606 }, - { &yyActionTable[134], 1, 811 }, - { &yyActionTable[135], 3, 672 }, - { &yyActionTable[138], 2, 619 }, - { &yyActionTable[140], 0, 586 }, - { &yyActionTable[140], 0, 670 }, - { &yyActionTable[140], 0, 671 }, - { &yyActionTable[140], 2, 619 }, - { &yyActionTable[142], 0, 587 }, - { &yyActionTable[142], 1, 811 }, - { &yyActionTable[143], 15, 811 }, - { &yyActionTable[158], 2, 702 }, - { &yyActionTable[160], 18, 759 }, - { &yyActionTable[178], 1, 708 }, - { &yyActionTable[179], 1, 703 }, - { &yyActionTable[180], 18, 811 }, - { &yyActionTable[198], 0, 632 }, - { &yyActionTable[198], 5, 811 }, - { &yyActionTable[203], 2, 811 }, - { &yyActionTable[205], 0, 633 }, - { &yyActionTable[205], 3, 641 }, - { &yyActionTable[208], 2, 643 }, - { &yyActionTable[210], 3, 650 }, - { &yyActionTable[213], 2, 685 }, - { &yyActionTable[215], 2, 675 }, - { &yyActionTable[217], 2, 677 }, - { &yyActionTable[219], 2, 665 }, - { &yyActionTable[221], 2, 679 }, - { &yyActionTable[223], 0, 638 }, - { &yyActionTable[223], 1, 811 }, - { &yyActionTable[224], 3, 680 }, - { &yyActionTable[227], 1, 811 }, - { &yyActionTable[228], 0, 681 }, - { &yyActionTable[228], 1, 811 }, - { &yyActionTable[229], 1, 811 }, - { &yyActionTable[230], 1, 811 }, - { &yyActionTable[231], 17, 811 }, - { &yyActionTable[248], 1, 666 }, - { &yyActionTable[249], 16, 811 }, - { &yyActionTable[265], 2, 673 }, - { &yyActionTable[267], 3, 672 }, - { &yyActionTable[270], 0, 667 }, - { &yyActionTable[270], 2, 811 }, - { &yyActionTable[272], 0, 556 }, - { &yyActionTable[272], 0, 674 }, - { &yyActionTable[272], 28, 669 }, - { &yyActionTable[300], 0, 705 }, - { &yyActionTable[300], 15, 811 }, - { &yyActionTable[315], 0, 701 }, - { &yyActionTable[315], 1, 811 }, - { &yyActionTable[316], 4, 811 }, - { &yyActionTable[320], 0, 704 }, - { &yyActionTable[320], 26, 711 }, - { &yyActionTable[346], 15, 811 }, - { &yyActionTable[361], 27, 712 }, - { &yyActionTable[388], 15, 811 }, - { &yyActionTable[403], 12, 713 }, - { &yyActionTable[415], 15, 811 }, - { &yyActionTable[430], 12, 714 }, - { &yyActionTable[442], 15, 811 }, - { &yyActionTable[457], 12, 715 }, - { &yyActionTable[469], 15, 811 }, - { &yyActionTable[484], 12, 716 }, - { &yyActionTable[496], 15, 811 }, - { &yyActionTable[511], 16, 717 }, - { &yyActionTable[527], 15, 811 }, - { &yyActionTable[542], 16, 718 }, - { &yyActionTable[558], 15, 811 }, - { &yyActionTable[573], 8, 719 }, - { &yyActionTable[581], 15, 811 }, - { &yyActionTable[596], 8, 720 }, - { &yyActionTable[604], 15, 811 }, - { &yyActionTable[619], 8, 721 }, - { &yyActionTable[627], 15, 811 }, - { &yyActionTable[642], 8, 722 }, - { &yyActionTable[650], 15, 811 }, - { &yyActionTable[665], 16, 723 }, - { &yyActionTable[681], 6, 811 }, - { &yyActionTable[687], 15, 811 }, - { &yyActionTable[702], 16, 724 }, - { &yyActionTable[718], 0, 725 }, - { &yyActionTable[718], 0, 726 }, - { &yyActionTable[718], 15, 811 }, - { &yyActionTable[733], 6, 727 }, - { &yyActionTable[739], 15, 811 }, - { &yyActionTable[754], 6, 728 }, - { &yyActionTable[760], 15, 811 }, - { &yyActionTable[775], 3, 729 }, - { &yyActionTable[778], 15, 811 }, - { &yyActionTable[793], 3, 730 }, - { &yyActionTable[796], 15, 811 }, - { &yyActionTable[811], 3, 731 }, - { &yyActionTable[814], 15, 811 }, - { &yyActionTable[829], 2, 732 }, - { &yyActionTable[831], 0, 733 }, - { &yyActionTable[831], 2, 811 }, - { &yyActionTable[833], 0, 734 }, - { &yyActionTable[833], 1, 811 }, - { &yyActionTable[834], 0, 737 }, - { &yyActionTable[834], 0, 735 }, - { &yyActionTable[834], 15, 811 }, - { &yyActionTable[849], 28, 811 }, - { &yyActionTable[877], 15, 811 }, - { &yyActionTable[892], 16, 743 }, - { &yyActionTable[908], 1, 811 }, - { &yyActionTable[909], 20, 759 }, - { &yyActionTable[929], 5, 811 }, - { &yyActionTable[934], 2, 811 }, - { &yyActionTable[936], 1, 811 }, - { &yyActionTable[937], 1, 811 }, - { &yyActionTable[938], 1, 811 }, - { &yyActionTable[939], 0, 746 }, - { &yyActionTable[939], 28, 758 }, - { &yyActionTable[967], 0, 706 }, - { &yyActionTable[967], 0, 707 }, - { &yyActionTable[967], 15, 811 }, - { &yyActionTable[982], 26, 738 }, - { &yyActionTable[1008], 15, 811 }, - { &yyActionTable[1023], 2, 739 }, - { &yyActionTable[1025], 15, 811 }, - { &yyActionTable[1040], 2, 740 }, - { &yyActionTable[1042], 15, 811 }, - { &yyActionTable[1057], 2, 741 }, - { &yyActionTable[1059], 17, 811 }, - { &yyActionTable[1076], 29, 811 }, - { &yyActionTable[1105], 2, 811 }, - { &yyActionTable[1107], 4, 811 }, - { &yyActionTable[1111], 1, 811 }, - { &yyActionTable[1112], 0, 749 }, - { &yyActionTable[1112], 15, 811 }, - { &yyActionTable[1127], 29, 811 }, - { &yyActionTable[1156], 15, 811 }, - { &yyActionTable[1171], 28, 750 }, - { &yyActionTable[1199], 1, 811 }, - { &yyActionTable[1200], 4, 811 }, - { &yyActionTable[1204], 1, 811 }, - { &yyActionTable[1205], 0, 806 }, - { &yyActionTable[1205], 1, 811 }, - { &yyActionTable[1206], 4, 811 }, - { &yyActionTable[1210], 1, 811 }, - { &yyActionTable[1211], 0, 807 }, - { &yyActionTable[1211], 1, 811 }, - { &yyActionTable[1212], 4, 811 }, - { &yyActionTable[1216], 1, 811 }, - { &yyActionTable[1217], 0, 808 }, - { &yyActionTable[1217], 1, 811 }, - { &yyActionTable[1218], 4, 811 }, - { &yyActionTable[1222], 1, 811 }, - { &yyActionTable[1223], 0, 809 }, - { &yyActionTable[1223], 15, 811 }, - { &yyActionTable[1238], 29, 811 }, - { &yyActionTable[1267], 15, 811 }, - { &yyActionTable[1282], 29, 811 }, - { &yyActionTable[1311], 15, 811 }, - { &yyActionTable[1326], 28, 751 }, - { &yyActionTable[1354], 2, 811 }, - { &yyActionTable[1356], 0, 745 }, - { &yyActionTable[1356], 16, 759 }, - { &yyActionTable[1372], 0, 756 }, - { &yyActionTable[1372], 0, 757 }, - { &yyActionTable[1372], 0, 736 }, - { &yyActionTable[1372], 15, 811 }, - { &yyActionTable[1387], 28, 811 }, - { &yyActionTable[1415], 15, 811 }, - { &yyActionTable[1430], 26, 744 }, - { &yyActionTable[1456], 1, 811 }, - { &yyActionTable[1457], 20, 759 }, - { &yyActionTable[1477], 5, 811 }, - { &yyActionTable[1482], 0, 748 }, - { &yyActionTable[1482], 2, 811 }, - { &yyActionTable[1484], 0, 747 }, - { &yyActionTable[1484], 2, 673 }, - { &yyActionTable[1486], 3, 672 }, - { &yyActionTable[1489], 0, 668 }, - { &yyActionTable[1489], 15, 811 }, - { &yyActionTable[1504], 28, 678 }, - { &yyActionTable[1532], 1, 811 }, - { &yyActionTable[1533], 17, 759 }, - { &yyActionTable[1550], 1, 676 }, - { &yyActionTable[1551], 15, 811 }, - { &yyActionTable[1566], 28, 686 }, - { &yyActionTable[1594], 0, 642 }, - { &yyActionTable[1594], 2, 653 }, - { &yyActionTable[1596], 4, 651 }, - { &yyActionTable[1600], 0, 652 }, - { &yyActionTable[1600], 0, 656 }, - { &yyActionTable[1600], 0, 657 }, - { &yyActionTable[1600], 5, 811 }, - { &yyActionTable[1605], 0, 658 }, - { &yyActionTable[1605], 5, 811 }, - { &yyActionTable[1610], 0, 659 }, - { &yyActionTable[1610], 1, 811 }, - { &yyActionTable[1611], 0, 660 }, - { &yyActionTable[1611], 5, 811 }, - { &yyActionTable[1616], 5, 649 }, - { &yyActionTable[1621], 0, 557 }, - { &yyActionTable[1621], 0, 558 }, - { &yyActionTable[1621], 4, 811 }, - { &yyActionTable[1625], 0, 647 }, - { &yyActionTable[1625], 0, 648 }, - { &yyActionTable[1625], 2, 662 }, - { &yyActionTable[1627], 2, 664 }, - { &yyActionTable[1629], 0, 654 }, - { &yyActionTable[1629], 1, 811 }, - { &yyActionTable[1630], 6, 811 }, - { &yyActionTable[1636], 2, 811 }, - { &yyActionTable[1638], 0, 663 }, - { &yyActionTable[1638], 5, 811 }, - { &yyActionTable[1643], 0, 765 }, - { &yyActionTable[1643], 0, 767 }, - { &yyActionTable[1643], 0, 766 }, - { &yyActionTable[1643], 15, 811 }, - { &yyActionTable[1658], 28, 661 }, - { &yyActionTable[1686], 3, 811 }, - { &yyActionTable[1689], 5, 811 }, - { &yyActionTable[1694], 5, 649 }, - { &yyActionTable[1699], 2, 662 }, - { &yyActionTable[1701], 2, 664 }, - { &yyActionTable[1703], 0, 655 }, - { &yyActionTable[1703], 16, 811 }, - { &yyActionTable[1719], 33, 649 }, - { &yyActionTable[1752], 0, 644 }, - { &yyActionTable[1752], 0, 645 }, - { &yyActionTable[1752], 1, 811 }, - { &yyActionTable[1753], 5, 811 }, - { &yyActionTable[1758], 0, 646 }, - { &yyActionTable[1758], 0, 639 }, - { &yyActionTable[1758], 0, 640 }, - { &yyActionTable[1758], 0, 742 }, - { &yyActionTable[1758], 29, 811 }, - { &yyActionTable[1787], 0, 700 }, - { &yyActionTable[1787], 2, 811 }, - { &yyActionTable[1789], 0, 709 }, - { &yyActionTable[1789], 1, 811 }, - { &yyActionTable[1790], 0, 710 }, - { &yyActionTable[1790], 29, 811 }, - { &yyActionTable[1819], 2, 619 }, - { &yyActionTable[1821], 0, 588 }, - { &yyActionTable[1821], 4, 811 }, - { &yyActionTable[1825], 2, 763 }, - { &yyActionTable[1827], 1, 592 }, - { &yyActionTable[1828], 3, 589 }, - { &yyActionTable[1831], 0, 593 }, - { &yyActionTable[1831], 4, 811 }, - { &yyActionTable[1835], 0, 594 }, - { &yyActionTable[1835], 3, 811 }, - { &yyActionTable[1838], 4, 811 }, - { &yyActionTable[1842], 0, 595 }, - { &yyActionTable[1842], 2, 811 }, - { &yyActionTable[1844], 0, 598 }, - { &yyActionTable[1844], 0, 599 }, - { &yyActionTable[1844], 0, 600 }, - { &yyActionTable[1844], 0, 601 }, - { &yyActionTable[1844], 4, 811 }, - { &yyActionTable[1848], 0, 596 }, - { &yyActionTable[1848], 4, 811 }, - { &yyActionTable[1852], 0, 597 }, - { &yyActionTable[1852], 6, 811 }, - { &yyActionTable[1858], 2, 811 }, - { &yyActionTable[1860], 0, 764 }, - { &yyActionTable[1860], 0, 590 }, - { &yyActionTable[1860], 2, 811 }, - { &yyActionTable[1862], 0, 591 }, - { &yyActionTable[1862], 2, 604 }, - { &yyActionTable[1864], 0, 603 }, - { &yyActionTable[1864], 0, 574 }, - { &yyActionTable[1864], 7, 811 }, - { &yyActionTable[1871], 0, 575 }, - { &yyActionTable[1871], 0, 576 }, - { &yyActionTable[1871], 0, 577 }, - { &yyActionTable[1871], 2, 811 }, - { &yyActionTable[1873], 0, 578 }, - { &yyActionTable[1873], 0, 581 }, - { &yyActionTable[1873], 2, 811 }, - { &yyActionTable[1875], 0, 579 }, - { &yyActionTable[1875], 0, 582 }, - { &yyActionTable[1875], 0, 580 }, - { &yyActionTable[1875], 0, 583 }, - { &yyActionTable[1875], 4, 563 }, - { &yyActionTable[1879], 4, 811 }, - { &yyActionTable[1883], 2, 811 }, - { &yyActionTable[1885], 0, 564 }, - { &yyActionTable[1885], 4, 811 }, - { &yyActionTable[1889], 1, 811 }, - { &yyActionTable[1890], 0, 565 }, - { &yyActionTable[1890], 0, 568 }, - { &yyActionTable[1890], 1, 811 }, - { &yyActionTable[1891], 0, 569 }, - { &yyActionTable[1891], 1, 811 }, - { &yyActionTable[1892], 0, 570 }, - { &yyActionTable[1892], 0, 567 }, - { &yyActionTable[1892], 0, 566 }, - { &yyActionTable[1892], 0, 555 }, - { &yyActionTable[1892], 8, 811 }, - { &yyActionTable[1900], 6, 811 }, - { &yyActionTable[1906], 0, 609 }, - { &yyActionTable[1906], 4, 811 }, - { &yyActionTable[1910], 0, 612 }, - { &yyActionTable[1910], 1, 811 }, - { &yyActionTable[1911], 1, 811 }, - { &yyActionTable[1912], 6, 811 }, - { &yyActionTable[1918], 2, 811 }, - { &yyActionTable[1920], 2, 619 }, - { &yyActionTable[1922], 0, 613 }, - { &yyActionTable[1922], 1, 811 }, - { &yyActionTable[1923], 6, 811 }, - { &yyActionTable[1929], 2, 811 }, - { &yyActionTable[1931], 2, 619 }, - { &yyActionTable[1933], 0, 614 }, - { &yyActionTable[1933], 15, 811 }, - { &yyActionTable[1948], 30, 619 }, - { &yyActionTable[1978], 0, 615 }, - { &yyActionTable[1978], 1, 811 }, - { &yyActionTable[1979], 1, 811 }, - { &yyActionTable[1980], 6, 811 }, - { &yyActionTable[1986], 2, 811 }, - { &yyActionTable[1988], 1, 811 }, - { &yyActionTable[1989], 4, 811 }, - { &yyActionTable[1993], 2, 763 }, - { &yyActionTable[1995], 1, 592 }, - { &yyActionTable[1996], 7, 617 }, - { &yyActionTable[2003], 1, 811 }, - { &yyActionTable[2004], 0, 616 }, - { &yyActionTable[2004], 0, 618 }, - { &yyActionTable[2004], 0, 610 }, - { &yyActionTable[2004], 0, 611 }, - { &yyActionTable[2004], 0, 553 }, - { &yyActionTable[2004], 3, 811 }, - { &yyActionTable[2007], 5, 811 }, - { &yyActionTable[2012], 6, 549 }, - { &yyActionTable[2018], 2, 811 }, - { &yyActionTable[2020], 4, 811 }, - { &yyActionTable[2024], 0, 547 }, - { &yyActionTable[2024], 4, 811 }, - { &yyActionTable[2028], 1, 811 }, - { &yyActionTable[2029], 3, 811 }, - { &yyActionTable[2032], 5, 811 }, - { &yyActionTable[2037], 0, 548 }, - { &yyActionTable[2037], 1, 811 }, - { &yyActionTable[2038], 4, 811 }, - { &yyActionTable[2042], 1, 811 }, - { &yyActionTable[2043], 4, 811 }, - { &yyActionTable[2047], 1, 811 }, - { &yyActionTable[2048], 6, 811 }, - { &yyActionTable[2054], 2, 811 }, - { &yyActionTable[2056], 3, 811 }, - { &yyActionTable[2059], 1, 811 }, - { &yyActionTable[2060], 1, 811 }, - { &yyActionTable[2061], 4, 811 }, - { &yyActionTable[2065], 4, 789 }, - { &yyActionTable[2069], 4, 811 }, - { &yyActionTable[2073], 1, 811 }, - { &yyActionTable[2074], 4, 811 }, - { &yyActionTable[2078], 2, 794 }, - { &yyActionTable[2080], 3, 811 }, - { &yyActionTable[2083], 1, 811 }, - { &yyActionTable[2084], 9, 811 }, - { &yyActionTable[2093], 5, 811 }, - { &yyActionTable[2098], 1, 811 }, - { &yyActionTable[2099], 1, 811 }, - { &yyActionTable[2100], 1, 811 }, - { &yyActionTable[2101], 9, 811 }, - { &yyActionTable[2110], 1, 811 }, - { &yyActionTable[2111], 2, 621 }, - { &yyActionTable[2113], 6, 811 }, - { &yyActionTable[2119], 0, 622 }, - { &yyActionTable[2119], 4, 811 }, - { &yyActionTable[2123], 1, 811 }, - { &yyActionTable[2124], 5, 811 }, - { &yyActionTable[2129], 4, 811 }, - { &yyActionTable[2133], 4, 811 }, - { &yyActionTable[2137], 1, 811 }, - { &yyActionTable[2138], 15, 811 }, - { &yyActionTable[2153], 28, 688 }, - { &yyActionTable[2181], 1, 811 }, - { &yyActionTable[2182], 1, 811 }, - { &yyActionTable[2183], 15, 811 }, - { &yyActionTable[2198], 28, 689 }, - { &yyActionTable[2226], 3, 811 }, - { &yyActionTable[2229], 1, 811 }, - { &yyActionTable[2230], 4, 811 }, - { &yyActionTable[2234], 2, 696 }, - { &yyActionTable[2236], 5, 811 }, - { &yyActionTable[2241], 2, 811 }, - { &yyActionTable[2243], 0, 697 }, - { &yyActionTable[2243], 4, 811 }, - { &yyActionTable[2247], 0, 698 }, - { &yyActionTable[2247], 0, 699 }, - { &yyActionTable[2247], 4, 811 }, - { &yyActionTable[2251], 5, 811 }, - { &yyActionTable[2256], 1, 811 }, - { &yyActionTable[2257], 16, 811 }, - { &yyActionTable[2273], 2, 811 }, - { &yyActionTable[2275], 15, 811 }, - { &yyActionTable[2290], 28, 694 }, - { &yyActionTable[2318], 1, 811 }, - { &yyActionTable[2319], 28, 695 }, - { &yyActionTable[2347], 1, 811 }, - { &yyActionTable[2348], 4, 811 }, - { &yyActionTable[2352], 3, 811 }, - { &yyActionTable[2355], 1, 811 }, - { &yyActionTable[2356], 15, 811 }, - { &yyActionTable[2371], 29, 811 }, - { &yyActionTable[2400], 1, 811 }, - { &yyActionTable[2401], 2, 811 }, - { &yyActionTable[2403], 0, 795 }, - { &yyActionTable[2403], 0, 796 }, - { &yyActionTable[2403], 1, 811 }, - { &yyActionTable[2404], 1, 811 }, - { &yyActionTable[2405], 2, 811 }, - { &yyActionTable[2407], 5, 811 }, - { &yyActionTable[2412], 2, 811 }, - { &yyActionTable[2414], 0, 786 }, - { &yyActionTable[2414], 0, 787 }, - { &yyActionTable[2414], 1, 811 }, - { &yyActionTable[2415], 0, 788 }, - { &yyActionTable[2415], 4, 811 }, - { &yyActionTable[2419], 4, 811 }, - { &yyActionTable[2423], 1, 811 }, - { &yyActionTable[2424], 4, 811 }, - { &yyActionTable[2428], 1, 811 }, - { &yyActionTable[2429], 4, 811 }, - { &yyActionTable[2433], 1, 811 }, - { &yyActionTable[2434], 4, 811 }, - { &yyActionTable[2438], 1, 811 }, - { &yyActionTable[2439], 5, 811 }, - { &yyActionTable[2444], 1, 811 }, - { &yyActionTable[2445], 4, 811 }, - { &yyActionTable[2449], 3, 811 }, - { &yyActionTable[2452], 1, 811 }, - { &yyActionTable[2453], 2, 621 }, - { &yyActionTable[2455], 4, 811 }, - { &yyActionTable[2459], 1, 811 }, - { &yyActionTable[2460], 5, 811 }, - { &yyActionTable[2465], 4, 811 }, - { &yyActionTable[2469], 1, 811 }, - { &yyActionTable[2470], 1, 811 }, - { &yyActionTable[2471], 4, 811 }, - { &yyActionTable[2475], 2, 696 }, - { &yyActionTable[2477], 4, 811 }, - { &yyActionTable[2481], 5, 811 }, - { &yyActionTable[2486], 1, 811 }, - { &yyActionTable[2487], 16, 811 }, - { &yyActionTable[2503], 2, 811 }, - { &yyActionTable[2505], 1, 811 }, - { &yyActionTable[2506], 3, 811 }, - { &yyActionTable[2509], 1, 811 }, - { &yyActionTable[2510], 1, 811 }, - { &yyActionTable[2511], 2, 621 }, - { &yyActionTable[2513], 4, 811 }, - { &yyActionTable[2517], 1, 811 }, - { &yyActionTable[2518], 4, 811 }, - { &yyActionTable[2522], 2, 811 }, - { &yyActionTable[2524], 1, 811 }, - { &yyActionTable[2525], 1, 811 }, - { &yyActionTable[2526], 1, 811 }, - { &yyActionTable[2527], 5, 811 }, - { &yyActionTable[2532], 1, 811 }, - { &yyActionTable[2533], 3, 811 }, - { &yyActionTable[2536], 3, 811 }, - { &yyActionTable[2539], 10, 784 }, - { &yyActionTable[2549], 1, 811 }, - { &yyActionTable[2550], 1, 811 }, - { &yyActionTable[2551], 1, 811 }, - { &yyActionTable[2552], 1, 811 }, - { &yyActionTable[2553], 3, 811 }, - { &yyActionTable[2556], 1, 811 }, - { &yyActionTable[2557], 1, 811 }, - { &yyActionTable[2558], 1, 811 }, - { &yyActionTable[2559], 3, 811 }, - { &yyActionTable[2562], 1, 811 }, - { &yyActionTable[2563], 0, 783 }, - { &yyActionTable[2563], 4, 811 }, - { &yyActionTable[2567], 1, 811 }, - { &yyActionTable[2568], 1, 811 }, - { &yyActionTable[2569], 0, 535 }, - { &yyActionTable[2569], 0, 537 }, - { &yyActionTable[2569], 0, 532 }, + { &yyActionTable[0], 6, 562 }, + { &yyActionTable[6], 5, 562 }, + { &yyActionTable[11], 0, 557 }, + { &yyActionTable[11], 22, 842 }, + { &yyActionTable[33], 1, 842 }, + { &yyActionTable[34], 0, 558 }, + { &yyActionTable[34], 1, 842 }, + { &yyActionTable[35], 2, 564 }, + { &yyActionTable[37], 3, 842 }, + { &yyActionTable[40], 1, 842 }, + { &yyActionTable[41], 1, 842 }, + { &yyActionTable[42], 6, 842 }, + { &yyActionTable[48], 0, 644 }, + { &yyActionTable[48], 0, 647 }, + { &yyActionTable[48], 0, 648 }, + { &yyActionTable[48], 0, 649 }, + { &yyActionTable[48], 0, 650 }, + { &yyActionTable[48], 0, 651 }, + { &yyActionTable[48], 4, 565 }, + { &yyActionTable[52], 0, 566 }, + { &yyActionTable[52], 0, 583 }, + { &yyActionTable[52], 0, 584 }, + { &yyActionTable[52], 0, 585 }, + { &yyActionTable[52], 3, 842 }, + { &yyActionTable[55], 1, 842 }, + { &yyActionTable[56], 3, 842 }, + { &yyActionTable[59], 1, 842 }, + { &yyActionTable[60], 3, 842 }, + { &yyActionTable[63], 1, 842 }, + { &yyActionTable[64], 3, 842 }, + { &yyActionTable[67], 1, 842 }, + { &yyActionTable[68], 7, 842 }, + { &yyActionTable[75], 3, 842 }, + { &yyActionTable[78], 1, 842 }, + { &yyActionTable[79], 1, 842 }, + { &yyActionTable[80], 13, 842 }, + { &yyActionTable[93], 0, 576 }, + { &yyActionTable[93], 5, 586 }, + { &yyActionTable[98], 1, 596 }, + { &yyActionTable[99], 13, 578 }, + { &yyActionTable[112], 0, 595 }, + { &yyActionTable[112], 4, 842 }, + { &yyActionTable[116], 10, 842 }, + { &yyActionTable[126], 0, 597 }, + { &yyActionTable[126], 2, 643 }, + { &yyActionTable[128], 0, 608 }, + { &yyActionTable[128], 2, 842 }, + { &yyActionTable[130], 2, 643 }, + { &yyActionTable[132], 0, 609 }, + { &yyActionTable[132], 2, 628 }, + { &yyActionTable[134], 0, 626 }, + { &yyActionTable[134], 2, 842 }, + { &yyActionTable[136], 0, 629 }, + { &yyActionTable[136], 0, 630 }, + { &yyActionTable[136], 1, 842 }, + { &yyActionTable[137], 3, 698 }, + { &yyActionTable[140], 2, 643 }, + { &yyActionTable[142], 0, 610 }, + { &yyActionTable[142], 0, 696 }, + { &yyActionTable[142], 0, 697 }, + { &yyActionTable[142], 2, 643 }, + { &yyActionTable[144], 0, 611 }, + { &yyActionTable[144], 1, 842 }, + { &yyActionTable[145], 15, 842 }, + { &yyActionTable[160], 2, 727 }, + { &yyActionTable[162], 18, 785 }, + { &yyActionTable[180], 1, 734 }, + { &yyActionTable[181], 1, 728 }, + { &yyActionTable[182], 18, 842 }, + { &yyActionTable[200], 0, 656 }, + { &yyActionTable[200], 5, 842 }, + { &yyActionTable[205], 2, 842 }, + { &yyActionTable[207], 0, 657 }, + { &yyActionTable[207], 3, 665 }, + { &yyActionTable[210], 2, 667 }, + { &yyActionTable[212], 3, 674 }, + { &yyActionTable[215], 2, 710 }, + { &yyActionTable[217], 2, 701 }, + { &yyActionTable[219], 2, 703 }, + { &yyActionTable[221], 2, 691 }, + { &yyActionTable[223], 2, 705 }, + { &yyActionTable[225], 0, 662 }, + { &yyActionTable[225], 1, 842 }, + { &yyActionTable[226], 2, 706 }, + { &yyActionTable[228], 1, 842 }, + { &yyActionTable[229], 0, 707 }, + { &yyActionTable[229], 1, 842 }, + { &yyActionTable[230], 0, 708 }, + { &yyActionTable[230], 1, 842 }, + { &yyActionTable[231], 17, 842 }, + { &yyActionTable[248], 1, 692 }, + { &yyActionTable[249], 16, 842 }, + { &yyActionTable[265], 2, 699 }, + { &yyActionTable[267], 3, 698 }, + { &yyActionTable[270], 0, 693 }, + { &yyActionTable[270], 2, 842 }, + { &yyActionTable[272], 0, 580 }, + { &yyActionTable[272], 0, 700 }, + { &yyActionTable[272], 28, 695 }, + { &yyActionTable[300], 0, 731 }, + { &yyActionTable[300], 15, 842 }, + { &yyActionTable[315], 0, 726 }, + { &yyActionTable[315], 1, 842 }, + { &yyActionTable[316], 4, 842 }, + { &yyActionTable[320], 1, 729 }, + { &yyActionTable[321], 4, 842 }, + { &yyActionTable[325], 0, 730 }, + { &yyActionTable[325], 26, 737 }, + { &yyActionTable[351], 15, 842 }, + { &yyActionTable[366], 27, 738 }, + { &yyActionTable[393], 15, 842 }, + { &yyActionTable[408], 12, 739 }, + { &yyActionTable[420], 15, 842 }, + { &yyActionTable[435], 12, 740 }, + { &yyActionTable[447], 15, 842 }, + { &yyActionTable[462], 12, 741 }, + { &yyActionTable[474], 15, 842 }, + { &yyActionTable[489], 12, 742 }, + { &yyActionTable[501], 15, 842 }, + { &yyActionTable[516], 16, 743 }, + { &yyActionTable[532], 15, 842 }, + { &yyActionTable[547], 16, 744 }, + { &yyActionTable[563], 15, 842 }, + { &yyActionTable[578], 8, 745 }, + { &yyActionTable[586], 15, 842 }, + { &yyActionTable[601], 8, 746 }, + { &yyActionTable[609], 15, 842 }, + { &yyActionTable[624], 8, 747 }, + { &yyActionTable[632], 15, 842 }, + { &yyActionTable[647], 8, 748 }, + { &yyActionTable[655], 15, 842 }, + { &yyActionTable[670], 16, 749 }, + { &yyActionTable[686], 6, 842 }, + { &yyActionTable[692], 15, 842 }, + { &yyActionTable[707], 16, 750 }, + { &yyActionTable[723], 0, 751 }, + { &yyActionTable[723], 0, 752 }, + { &yyActionTable[723], 15, 842 }, + { &yyActionTable[738], 6, 753 }, + { &yyActionTable[744], 15, 842 }, + { &yyActionTable[759], 6, 754 }, + { &yyActionTable[765], 15, 842 }, + { &yyActionTable[780], 3, 755 }, + { &yyActionTable[783], 15, 842 }, + { &yyActionTable[798], 3, 756 }, + { &yyActionTable[801], 15, 842 }, + { &yyActionTable[816], 3, 757 }, + { &yyActionTable[819], 15, 842 }, + { &yyActionTable[834], 2, 758 }, + { &yyActionTable[836], 0, 759 }, + { &yyActionTable[836], 2, 842 }, + { &yyActionTable[838], 0, 760 }, + { &yyActionTable[838], 1, 842 }, + { &yyActionTable[839], 0, 763 }, + { &yyActionTable[839], 0, 761 }, + { &yyActionTable[839], 15, 842 }, + { &yyActionTable[854], 28, 842 }, + { &yyActionTable[882], 15, 842 }, + { &yyActionTable[897], 16, 769 }, + { &yyActionTable[913], 1, 842 }, + { &yyActionTable[914], 20, 785 }, + { &yyActionTable[934], 5, 842 }, + { &yyActionTable[939], 2, 842 }, + { &yyActionTable[941], 1, 842 }, + { &yyActionTable[942], 1, 842 }, + { &yyActionTable[943], 1, 842 }, + { &yyActionTable[944], 0, 772 }, + { &yyActionTable[944], 28, 784 }, + { &yyActionTable[972], 0, 732 }, + { &yyActionTable[972], 0, 733 }, + { &yyActionTable[972], 15, 842 }, + { &yyActionTable[987], 26, 764 }, + { &yyActionTable[1013], 15, 842 }, + { &yyActionTable[1028], 2, 765 }, + { &yyActionTable[1030], 15, 842 }, + { &yyActionTable[1045], 2, 766 }, + { &yyActionTable[1047], 15, 842 }, + { &yyActionTable[1062], 2, 767 }, + { &yyActionTable[1064], 17, 842 }, + { &yyActionTable[1081], 29, 842 }, + { &yyActionTable[1110], 2, 842 }, + { &yyActionTable[1112], 4, 842 }, + { &yyActionTable[1116], 1, 842 }, + { &yyActionTable[1117], 0, 775 }, + { &yyActionTable[1117], 15, 842 }, + { &yyActionTable[1132], 29, 842 }, + { &yyActionTable[1161], 15, 842 }, + { &yyActionTable[1176], 28, 776 }, + { &yyActionTable[1204], 1, 842 }, + { &yyActionTable[1205], 4, 842 }, + { &yyActionTable[1209], 1, 842 }, + { &yyActionTable[1210], 0, 833 }, + { &yyActionTable[1210], 1, 842 }, + { &yyActionTable[1211], 4, 842 }, + { &yyActionTable[1215], 1, 842 }, + { &yyActionTable[1216], 0, 834 }, + { &yyActionTable[1216], 1, 842 }, + { &yyActionTable[1217], 4, 842 }, + { &yyActionTable[1221], 1, 842 }, + { &yyActionTable[1222], 0, 835 }, + { &yyActionTable[1222], 1, 842 }, + { &yyActionTable[1223], 4, 842 }, + { &yyActionTable[1227], 1, 842 }, + { &yyActionTable[1228], 0, 836 }, + { &yyActionTable[1228], 15, 842 }, + { &yyActionTable[1243], 29, 842 }, + { &yyActionTable[1272], 15, 842 }, + { &yyActionTable[1287], 29, 842 }, + { &yyActionTable[1316], 15, 842 }, + { &yyActionTable[1331], 28, 777 }, + { &yyActionTable[1359], 2, 842 }, + { &yyActionTable[1361], 0, 771 }, + { &yyActionTable[1361], 16, 785 }, + { &yyActionTable[1377], 0, 782 }, + { &yyActionTable[1377], 0, 783 }, + { &yyActionTable[1377], 0, 762 }, + { &yyActionTable[1377], 15, 842 }, + { &yyActionTable[1392], 28, 842 }, + { &yyActionTable[1420], 15, 842 }, + { &yyActionTable[1435], 26, 770 }, + { &yyActionTable[1461], 1, 842 }, + { &yyActionTable[1462], 20, 785 }, + { &yyActionTable[1482], 5, 842 }, + { &yyActionTable[1487], 0, 774 }, + { &yyActionTable[1487], 2, 842 }, + { &yyActionTable[1489], 0, 773 }, + { &yyActionTable[1489], 2, 699 }, + { &yyActionTable[1491], 3, 698 }, + { &yyActionTable[1494], 0, 694 }, + { &yyActionTable[1494], 15, 842 }, + { &yyActionTable[1509], 28, 704 }, + { &yyActionTable[1537], 1, 842 }, + { &yyActionTable[1538], 17, 785 }, + { &yyActionTable[1555], 1, 702 }, + { &yyActionTable[1556], 15, 842 }, + { &yyActionTable[1571], 28, 711 }, + { &yyActionTable[1599], 0, 666 }, + { &yyActionTable[1599], 2, 677 }, + { &yyActionTable[1601], 4, 675 }, + { &yyActionTable[1605], 0, 676 }, + { &yyActionTable[1605], 0, 682 }, + { &yyActionTable[1605], 0, 683 }, + { &yyActionTable[1605], 5, 842 }, + { &yyActionTable[1610], 0, 684 }, + { &yyActionTable[1610], 5, 842 }, + { &yyActionTable[1615], 0, 685 }, + { &yyActionTable[1615], 1, 842 }, + { &yyActionTable[1616], 0, 686 }, + { &yyActionTable[1616], 5, 842 }, + { &yyActionTable[1621], 2, 680 }, + { &yyActionTable[1623], 5, 673 }, + { &yyActionTable[1628], 0, 581 }, + { &yyActionTable[1628], 0, 582 }, + { &yyActionTable[1628], 4, 842 }, + { &yyActionTable[1632], 0, 671 }, + { &yyActionTable[1632], 0, 672 }, + { &yyActionTable[1632], 2, 688 }, + { &yyActionTable[1634], 2, 690 }, + { &yyActionTable[1636], 0, 678 }, + { &yyActionTable[1636], 1, 842 }, + { &yyActionTable[1637], 6, 842 }, + { &yyActionTable[1643], 2, 842 }, + { &yyActionTable[1645], 0, 689 }, + { &yyActionTable[1645], 5, 842 }, + { &yyActionTable[1650], 0, 791 }, + { &yyActionTable[1650], 3, 698 }, + { &yyActionTable[1653], 0, 793 }, + { &yyActionTable[1653], 0, 792 }, + { &yyActionTable[1653], 15, 842 }, + { &yyActionTable[1668], 28, 687 }, + { &yyActionTable[1696], 4, 842 }, + { &yyActionTable[1700], 0, 681 }, + { &yyActionTable[1700], 3, 842 }, + { &yyActionTable[1703], 5, 842 }, + { &yyActionTable[1708], 5, 673 }, + { &yyActionTable[1713], 2, 688 }, + { &yyActionTable[1715], 2, 690 }, + { &yyActionTable[1717], 0, 679 }, + { &yyActionTable[1717], 16, 842 }, + { &yyActionTable[1733], 33, 673 }, + { &yyActionTable[1766], 0, 668 }, + { &yyActionTable[1766], 0, 669 }, + { &yyActionTable[1766], 1, 842 }, + { &yyActionTable[1767], 5, 842 }, + { &yyActionTable[1772], 0, 670 }, + { &yyActionTable[1772], 0, 663 }, + { &yyActionTable[1772], 0, 664 }, + { &yyActionTable[1772], 0, 768 }, + { &yyActionTable[1772], 29, 842 }, + { &yyActionTable[1801], 0, 725 }, + { &yyActionTable[1801], 2, 842 }, + { &yyActionTable[1803], 0, 735 }, + { &yyActionTable[1803], 1, 842 }, + { &yyActionTable[1804], 0, 736 }, + { &yyActionTable[1804], 29, 842 }, + { &yyActionTable[1833], 2, 643 }, + { &yyActionTable[1835], 0, 612 }, + { &yyActionTable[1835], 4, 842 }, + { &yyActionTable[1839], 2, 789 }, + { &yyActionTable[1841], 1, 616 }, + { &yyActionTable[1842], 3, 613 }, + { &yyActionTable[1845], 0, 617 }, + { &yyActionTable[1845], 4, 842 }, + { &yyActionTable[1849], 0, 618 }, + { &yyActionTable[1849], 3, 842 }, + { &yyActionTable[1852], 4, 842 }, + { &yyActionTable[1856], 0, 619 }, + { &yyActionTable[1856], 2, 842 }, + { &yyActionTable[1858], 0, 622 }, + { &yyActionTable[1858], 0, 623 }, + { &yyActionTable[1858], 0, 624 }, + { &yyActionTable[1858], 0, 625 }, + { &yyActionTable[1858], 4, 842 }, + { &yyActionTable[1862], 0, 620 }, + { &yyActionTable[1862], 4, 842 }, + { &yyActionTable[1866], 0, 621 }, + { &yyActionTable[1866], 6, 842 }, + { &yyActionTable[1872], 2, 842 }, + { &yyActionTable[1874], 0, 790 }, + { &yyActionTable[1874], 0, 614 }, + { &yyActionTable[1874], 2, 842 }, + { &yyActionTable[1876], 0, 615 }, + { &yyActionTable[1876], 2, 628 }, + { &yyActionTable[1878], 0, 627 }, + { &yyActionTable[1878], 0, 598 }, + { &yyActionTable[1878], 7, 842 }, + { &yyActionTable[1885], 0, 599 }, + { &yyActionTable[1885], 0, 600 }, + { &yyActionTable[1885], 0, 601 }, + { &yyActionTable[1885], 2, 842 }, + { &yyActionTable[1887], 0, 602 }, + { &yyActionTable[1887], 0, 605 }, + { &yyActionTable[1887], 2, 842 }, + { &yyActionTable[1889], 0, 603 }, + { &yyActionTable[1889], 0, 606 }, + { &yyActionTable[1889], 0, 604 }, + { &yyActionTable[1889], 0, 607 }, + { &yyActionTable[1889], 4, 587 }, + { &yyActionTable[1893], 4, 842 }, + { &yyActionTable[1897], 2, 842 }, + { &yyActionTable[1899], 0, 588 }, + { &yyActionTable[1899], 4, 842 }, + { &yyActionTable[1903], 1, 842 }, + { &yyActionTable[1904], 0, 589 }, + { &yyActionTable[1904], 0, 592 }, + { &yyActionTable[1904], 1, 842 }, + { &yyActionTable[1905], 0, 593 }, + { &yyActionTable[1905], 1, 842 }, + { &yyActionTable[1906], 0, 594 }, + { &yyActionTable[1906], 0, 591 }, + { &yyActionTable[1906], 0, 590 }, + { &yyActionTable[1906], 0, 579 }, + { &yyActionTable[1906], 8, 842 }, + { &yyActionTable[1914], 6, 842 }, + { &yyActionTable[1920], 0, 633 }, + { &yyActionTable[1920], 4, 842 }, + { &yyActionTable[1924], 0, 636 }, + { &yyActionTable[1924], 1, 842 }, + { &yyActionTable[1925], 1, 842 }, + { &yyActionTable[1926], 6, 842 }, + { &yyActionTable[1932], 2, 842 }, + { &yyActionTable[1934], 2, 643 }, + { &yyActionTable[1936], 0, 637 }, + { &yyActionTable[1936], 1, 842 }, + { &yyActionTable[1937], 6, 842 }, + { &yyActionTable[1943], 2, 842 }, + { &yyActionTable[1945], 2, 643 }, + { &yyActionTable[1947], 0, 638 }, + { &yyActionTable[1947], 15, 842 }, + { &yyActionTable[1962], 30, 643 }, + { &yyActionTable[1992], 0, 639 }, + { &yyActionTable[1992], 1, 842 }, + { &yyActionTable[1993], 1, 842 }, + { &yyActionTable[1994], 6, 842 }, + { &yyActionTable[2000], 2, 842 }, + { &yyActionTable[2002], 1, 842 }, + { &yyActionTable[2003], 4, 842 }, + { &yyActionTable[2007], 2, 789 }, + { &yyActionTable[2009], 1, 616 }, + { &yyActionTable[2010], 7, 641 }, + { &yyActionTable[2017], 1, 842 }, + { &yyActionTable[2018], 0, 640 }, + { &yyActionTable[2018], 0, 642 }, + { &yyActionTable[2018], 0, 634 }, + { &yyActionTable[2018], 0, 635 }, + { &yyActionTable[2018], 0, 577 }, + { &yyActionTable[2018], 3, 842 }, + { &yyActionTable[2021], 5, 842 }, + { &yyActionTable[2026], 3, 573 }, + { &yyActionTable[2029], 6, 842 }, + { &yyActionTable[2035], 4, 842 }, + { &yyActionTable[2039], 0, 571 }, + { &yyActionTable[2039], 4, 842 }, + { &yyActionTable[2043], 1, 842 }, + { &yyActionTable[2044], 3, 842 }, + { &yyActionTable[2047], 5, 842 }, + { &yyActionTable[2052], 1, 842 }, + { &yyActionTable[2053], 4, 842 }, + { &yyActionTable[2057], 1, 842 }, + { &yyActionTable[2058], 4, 842 }, + { &yyActionTable[2062], 3, 842 }, + { &yyActionTable[2065], 1, 842 }, + { &yyActionTable[2066], 6, 842 }, + { &yyActionTable[2072], 2, 842 }, + { &yyActionTable[2074], 3, 842 }, + { &yyActionTable[2077], 1, 842 }, + { &yyActionTable[2078], 1, 842 }, + { &yyActionTable[2079], 4, 842 }, + { &yyActionTable[2083], 4, 816 }, + { &yyActionTable[2087], 4, 842 }, + { &yyActionTable[2091], 1, 842 }, + { &yyActionTable[2092], 4, 842 }, + { &yyActionTable[2096], 2, 680 }, + { &yyActionTable[2098], 2, 821 }, + { &yyActionTable[2100], 3, 842 }, + { &yyActionTable[2103], 1, 842 }, + { &yyActionTable[2104], 15, 842 }, + { &yyActionTable[2119], 29, 842 }, + { &yyActionTable[2148], 1, 842 }, + { &yyActionTable[2149], 2, 842 }, + { &yyActionTable[2151], 0, 822 }, + { &yyActionTable[2151], 0, 823 }, + { &yyActionTable[2151], 1, 842 }, + { &yyActionTable[2152], 1, 842 }, + { &yyActionTable[2153], 2, 842 }, + { &yyActionTable[2155], 5, 842 }, + { &yyActionTable[2160], 2, 842 }, + { &yyActionTable[2162], 4, 842 }, + { &yyActionTable[2166], 0, 723 }, + { &yyActionTable[2166], 0, 724 }, + { &yyActionTable[2166], 0, 813 }, + { &yyActionTable[2166], 0, 814 }, + { &yyActionTable[2166], 1, 842 }, + { &yyActionTable[2167], 0, 815 }, + { &yyActionTable[2167], 0, 572 }, + { &yyActionTable[2167], 1, 842 }, + { &yyActionTable[2168], 9, 842 }, + { &yyActionTable[2177], 5, 842 }, + { &yyActionTable[2182], 1, 842 }, + { &yyActionTable[2183], 1, 842 }, + { &yyActionTable[2184], 1, 842 }, + { &yyActionTable[2185], 9, 842 }, + { &yyActionTable[2194], 1, 842 }, + { &yyActionTable[2195], 2, 645 }, + { &yyActionTable[2197], 6, 842 }, + { &yyActionTable[2203], 0, 646 }, + { &yyActionTable[2203], 4, 842 }, + { &yyActionTable[2207], 1, 842 }, + { &yyActionTable[2208], 5, 842 }, + { &yyActionTable[2213], 4, 842 }, + { &yyActionTable[2217], 4, 842 }, + { &yyActionTable[2221], 1, 842 }, + { &yyActionTable[2222], 15, 842 }, + { &yyActionTable[2237], 28, 713 }, + { &yyActionTable[2265], 1, 842 }, + { &yyActionTable[2266], 1, 842 }, + { &yyActionTable[2267], 15, 842 }, + { &yyActionTable[2282], 28, 714 }, + { &yyActionTable[2310], 3, 842 }, + { &yyActionTable[2313], 1, 842 }, + { &yyActionTable[2314], 4, 842 }, + { &yyActionTable[2318], 2, 721 }, + { &yyActionTable[2320], 5, 842 }, + { &yyActionTable[2325], 2, 842 }, + { &yyActionTable[2327], 0, 722 }, + { &yyActionTable[2327], 4, 842 }, + { &yyActionTable[2331], 5, 842 }, + { &yyActionTable[2336], 1, 842 }, + { &yyActionTable[2337], 16, 842 }, + { &yyActionTable[2353], 2, 842 }, + { &yyActionTable[2355], 15, 842 }, + { &yyActionTable[2370], 28, 719 }, + { &yyActionTable[2398], 1, 842 }, + { &yyActionTable[2399], 28, 720 }, + { &yyActionTable[2427], 1, 842 }, + { &yyActionTable[2428], 4, 842 }, + { &yyActionTable[2432], 3, 842 }, + { &yyActionTable[2435], 1, 842 }, + { &yyActionTable[2436], 4, 842 }, + { &yyActionTable[2440], 4, 842 }, + { &yyActionTable[2444], 1, 842 }, + { &yyActionTable[2445], 4, 842 }, + { &yyActionTable[2449], 1, 842 }, + { &yyActionTable[2450], 4, 842 }, + { &yyActionTable[2454], 3, 842 }, + { &yyActionTable[2457], 1, 842 }, + { &yyActionTable[2458], 4, 842 }, + { &yyActionTable[2462], 3, 842 }, + { &yyActionTable[2465], 1, 842 }, + { &yyActionTable[2466], 5, 842 }, + { &yyActionTable[2471], 1, 842 }, + { &yyActionTable[2472], 4, 842 }, + { &yyActionTable[2476], 2, 680 }, + { &yyActionTable[2478], 3, 842 }, + { &yyActionTable[2481], 1, 842 }, + { &yyActionTable[2482], 2, 645 }, + { &yyActionTable[2484], 4, 842 }, + { &yyActionTable[2488], 3, 842 }, + { &yyActionTable[2491], 1, 842 }, + { &yyActionTable[2492], 5, 842 }, + { &yyActionTable[2497], 4, 842 }, + { &yyActionTable[2501], 1, 842 }, + { &yyActionTable[2502], 1, 842 }, + { &yyActionTable[2503], 4, 842 }, + { &yyActionTable[2507], 2, 680 }, + { &yyActionTable[2509], 2, 721 }, + { &yyActionTable[2511], 4, 842 }, + { &yyActionTable[2515], 5, 842 }, + { &yyActionTable[2520], 1, 842 }, + { &yyActionTable[2521], 16, 842 }, + { &yyActionTable[2537], 2, 842 }, + { &yyActionTable[2539], 1, 842 }, + { &yyActionTable[2540], 3, 842 }, + { &yyActionTable[2543], 1, 842 }, + { &yyActionTable[2544], 1, 842 }, + { &yyActionTable[2545], 2, 645 }, + { &yyActionTable[2547], 4, 842 }, + { &yyActionTable[2551], 3, 842 }, + { &yyActionTable[2554], 1, 842 }, + { &yyActionTable[2555], 4, 842 }, + { &yyActionTable[2559], 2, 842 }, + { &yyActionTable[2561], 1, 842 }, + { &yyActionTable[2562], 1, 842 }, + { &yyActionTable[2563], 1, 842 }, + { &yyActionTable[2564], 5, 842 }, + { &yyActionTable[2569], 1, 842 }, + { &yyActionTable[2570], 3, 842 }, + { &yyActionTable[2573], 3, 842 }, + { &yyActionTable[2576], 10, 810 }, + { &yyActionTable[2586], 1, 842 }, + { &yyActionTable[2587], 1, 842 }, + { &yyActionTable[2588], 1, 842 }, + { &yyActionTable[2589], 1, 842 }, + { &yyActionTable[2590], 3, 842 }, + { &yyActionTable[2593], 1, 842 }, + { &yyActionTable[2594], 1, 842 }, + { &yyActionTable[2595], 1, 842 }, + { &yyActionTable[2596], 3, 842 }, + { &yyActionTable[2599], 1, 842 }, + { &yyActionTable[2600], 0, 809 }, + { &yyActionTable[2600], 4, 842 }, + { &yyActionTable[2604], 1, 842 }, + { &yyActionTable[2605], 1, 842 }, + { &yyActionTable[2606], 2, 840 }, + { &yyActionTable[2608], 3, 842 }, + { &yyActionTable[2611], 1, 842 }, + { &yyActionTable[2612], 4, 842 }, + { &yyActionTable[2616], 1, 842 }, + { &yyActionTable[2617], 0, 839 }, + { &yyActionTable[2617], 2, 840 }, + { &yyActionTable[2619], 4, 842 }, + { &yyActionTable[2623], 1, 842 }, + { &yyActionTable[2624], 0, 559 }, + { &yyActionTable[2624], 0, 561 }, + { &yyActionTable[2624], 0, 556 }, }; /* The next table maps tokens into fallback tokens. If a construct @@ -3667,53 +3767,56 @@ static const yyStateEntry yyStateTable[] = { #ifdef YYFALLBACK static const YYCODETYPE yyFallback[] = { 0, /* $ => nothing */ - 56, /* ABORT => ID */ - 56, /* AFTER => ID */ + 59, /* ABORT => ID */ + 59, /* AFTER => ID */ 0, /* AGG_FUNCTION => nothing */ 0, /* ALL => nothing */ 0, /* AND => nothing */ 0, /* AS => nothing */ - 56, /* ASC => ID */ - 56, /* BEFORE => ID */ - 56, /* BEGIN => ID */ + 59, /* ASC => ID */ + 59, /* ATTACH => ID */ + 59, /* BEFORE => ID */ + 59, /* BEGIN => ID */ 0, /* BETWEEN => nothing */ 0, /* BITAND => nothing */ 0, /* BITNOT => nothing */ 0, /* BITOR => nothing */ 0, /* BY => nothing */ - 56, /* CASCADE => ID */ + 59, /* CASCADE => ID */ 0, /* CASE => nothing */ 0, /* CHECK => nothing */ - 56, /* CLUSTER => ID */ + 59, /* CLUSTER => ID */ 0, /* COLLATE => nothing */ 0, /* COLUMN => nothing */ 0, /* COMMA => nothing */ 0, /* COMMENT => nothing */ 0, /* COMMIT => nothing */ 0, /* CONCAT => nothing */ - 56, /* CONFLICT => ID */ + 59, /* CONFLICT => ID */ 0, /* CONSTRAINT => nothing */ - 56, /* COPY => ID */ + 59, /* COPY => ID */ 0, /* CREATE => nothing */ + 59, /* DATABASE => ID */ 0, /* DEFAULT => nothing */ 0, /* DEFERRABLE => nothing */ - 56, /* DEFERRED => ID */ + 59, /* DEFERRED => ID */ 0, /* DELETE => nothing */ - 56, /* DELIMITERS => ID */ - 56, /* DESC => ID */ + 59, /* DELIMITERS => ID */ + 59, /* DESC => ID */ + 59, /* DETACH => ID */ 0, /* DISTINCT => nothing */ 0, /* DOT => nothing */ 0, /* DROP => nothing */ - 56, /* EACH => ID */ + 59, /* EACH => ID */ 0, /* ELSE => nothing */ - 56, /* END => ID */ + 59, /* END => ID */ 0, /* END_OF_FILE => nothing */ 0, /* EQ => nothing */ 0, /* EXCEPT => nothing */ - 56, /* EXPLAIN => ID */ - 56, /* FAIL => ID */ + 59, /* EXPLAIN => ID */ + 59, /* FAIL => ID */ 0, /* FLOAT => nothing */ - 56, /* FOR => ID */ + 59, /* FOR => ID */ 0, /* FOREIGN => nothing */ 0, /* FROM => nothing */ 0, /* FUNCTION => nothing */ @@ -3723,14 +3826,14 @@ static const YYCODETYPE yyFallback[] = { 0, /* GT => nothing */ 0, /* HAVING => nothing */ 0, /* ID => nothing */ - 56, /* IGNORE => ID */ + 59, /* IGNORE => ID */ 0, /* ILLEGAL => nothing */ - 56, /* IMMEDIATE => ID */ + 59, /* IMMEDIATE => ID */ 0, /* IN => nothing */ 0, /* INDEX => nothing */ - 56, /* INITIALLY => ID */ + 59, /* INITIALLY => ID */ 0, /* INSERT => nothing */ - 56, /* INSTEAD => ID */ + 59, /* INSTEAD => ID */ 0, /* INTEGER => nothing */ 0, /* INTERSECT => nothing */ 0, /* INTO => nothing */ @@ -3738,35 +3841,35 @@ static const YYCODETYPE yyFallback[] = { 0, /* ISNULL => nothing */ 0, /* JOIN => nothing */ 0, /* JOIN_KW => nothing */ - 56, /* KEY => ID */ + 59, /* KEY => ID */ 0, /* LE => nothing */ 0, /* LIKE => nothing */ 0, /* LIMIT => nothing */ 0, /* LP => nothing */ 0, /* LSHIFT => nothing */ 0, /* LT => nothing */ - 56, /* MATCH => ID */ + 59, /* MATCH => ID */ 0, /* MINUS => nothing */ 0, /* NE => nothing */ 0, /* NOT => nothing */ 0, /* NOTNULL => nothing */ 0, /* NULL => nothing */ - 56, /* OF => ID */ - 56, /* OFFSET => ID */ + 59, /* OF => ID */ + 59, /* OFFSET => ID */ 0, /* ON => nothing */ 0, /* OR => nothing */ 0, /* ORACLE_OUTER_JOIN => nothing */ 0, /* ORDER => nothing */ 0, /* PLUS => nothing */ - 56, /* PRAGMA => ID */ + 59, /* PRAGMA => ID */ 0, /* PRIMARY => nothing */ - 56, /* RAISE => ID */ + 59, /* RAISE => ID */ 0, /* REFERENCES => nothing */ 0, /* REM => nothing */ - 56, /* REPLACE => ID */ - 56, /* RESTRICT => ID */ + 59, /* REPLACE => ID */ + 59, /* RESTRICT => ID */ 0, /* ROLLBACK => nothing */ - 56, /* ROW => ID */ + 59, /* ROW => ID */ 0, /* RP => nothing */ 0, /* RSHIFT => nothing */ 0, /* SELECT => nothing */ @@ -3775,13 +3878,13 @@ static const YYCODETYPE yyFallback[] = { 0, /* SLASH => nothing */ 0, /* SPACE => nothing */ 0, /* STAR => nothing */ - 56, /* STATEMENT => ID */ + 59, /* STATEMENT => ID */ 0, /* STRING => nothing */ 0, /* TABLE => nothing */ - 56, /* TEMP => ID */ + 59, /* TEMP => ID */ 0, /* THEN => nothing */ 0, /* TRANSACTION => nothing */ - 56, /* TRIGGER => ID */ + 59, /* TRIGGER => ID */ 0, /* UMINUS => nothing */ 0, /* UNCLOSED_STRING => nothing */ 0, /* UNION => nothing */ @@ -3789,9 +3892,9 @@ static const YYCODETYPE yyFallback[] = { 0, /* UPDATE => nothing */ 0, /* UPLUS => nothing */ 0, /* USING => nothing */ - 56, /* VACUUM => ID */ + 59, /* VACUUM => ID */ 0, /* VALUES => nothing */ - 56, /* VIEW => ID */ + 59, /* VIEW => ID */ 0, /* WHEN => nothing */ 0, /* WHERE => nothing */ }; @@ -3867,48 +3970,49 @@ void sqliteParserTrace(FILE *TraceFILE, char *zTracePrompt){ static const char *yyTokenName[] = { "$", "ABORT", "AFTER", "AGG_FUNCTION", "ALL", "AND", "AS", "ASC", - "BEFORE", "BEGIN", "BETWEEN", "BITAND", - "BITNOT", "BITOR", "BY", "CASCADE", - "CASE", "CHECK", "CLUSTER", "COLLATE", - "COLUMN", "COMMA", "COMMENT", "COMMIT", - "CONCAT", "CONFLICT", "CONSTRAINT", "COPY", - "CREATE", "DEFAULT", "DEFERRABLE", "DEFERRED", - "DELETE", "DELIMITERS", "DESC", "DISTINCT", - "DOT", "DROP", "EACH", "ELSE", - "END", "END_OF_FILE", "EQ", "EXCEPT", - "EXPLAIN", "FAIL", "FLOAT", "FOR", - "FOREIGN", "FROM", "FUNCTION", "GE", - "GLOB", "GROUP", "GT", "HAVING", - "ID", "IGNORE", "ILLEGAL", "IMMEDIATE", - "IN", "INDEX", "INITIALLY", "INSERT", - "INSTEAD", "INTEGER", "INTERSECT", "INTO", - "IS", "ISNULL", "JOIN", "JOIN_KW", - "KEY", "LE", "LIKE", "LIMIT", - "LP", "LSHIFT", "LT", "MATCH", - "MINUS", "NE", "NOT", "NOTNULL", - "NULL", "OF", "OFFSET", "ON", - "OR", "ORACLE_OUTER_JOIN", "ORDER", "PLUS", - "PRAGMA", "PRIMARY", "RAISE", "REFERENCES", - "REM", "REPLACE", "RESTRICT", "ROLLBACK", - "ROW", "RP", "RSHIFT", "SELECT", - "SEMI", "SET", "SLASH", "SPACE", - "STAR", "STATEMENT", "STRING", "TABLE", - "TEMP", "THEN", "TRANSACTION", "TRIGGER", - "UMINUS", "UNCLOSED_STRING", "UNION", "UNIQUE", - "UPDATE", "UPLUS", "USING", "VACUUM", - "VALUES", "VIEW", "WHEN", "WHERE", - "as", "carg", "carglist", "case_else", - "case_exprlist", "case_operand", "ccons", "cmd", - "cmdlist", "cmdx", "collate", "column", - "columnid", "columnlist", "conslist", "conslist_opt", - "create_table", "create_table_args", "defer_subclause", "defer_subclause_opt", - "distinct", "ecmd", "error", "explain", - "expr", "expritem", "exprlist", "foreach_clause", - "from", "groupby_opt", "having_opt", "id", - "ids", "idxitem", "idxlist", "idxlist_opt", - "init_deferred_pred_opt", "input", "inscollist", "inscollist_opt", - "insert_cmd", "itemlist", "joinop", "joinop2", - "likeop", "limit_opt", "limit_sep", "minus_num", + "ATTACH", "BEFORE", "BEGIN", "BETWEEN", + "BITAND", "BITNOT", "BITOR", "BY", + "CASCADE", "CASE", "CHECK", "CLUSTER", + "COLLATE", "COLUMN", "COMMA", "COMMENT", + "COMMIT", "CONCAT", "CONFLICT", "CONSTRAINT", + "COPY", "CREATE", "DATABASE", "DEFAULT", + "DEFERRABLE", "DEFERRED", "DELETE", "DELIMITERS", + "DESC", "DETACH", "DISTINCT", "DOT", + "DROP", "EACH", "ELSE", "END", + "END_OF_FILE", "EQ", "EXCEPT", "EXPLAIN", + "FAIL", "FLOAT", "FOR", "FOREIGN", + "FROM", "FUNCTION", "GE", "GLOB", + "GROUP", "GT", "HAVING", "ID", + "IGNORE", "ILLEGAL", "IMMEDIATE", "IN", + "INDEX", "INITIALLY", "INSERT", "INSTEAD", + "INTEGER", "INTERSECT", "INTO", "IS", + "ISNULL", "JOIN", "JOIN_KW", "KEY", + "LE", "LIKE", "LIMIT", "LP", + "LSHIFT", "LT", "MATCH", "MINUS", + "NE", "NOT", "NOTNULL", "NULL", + "OF", "OFFSET", "ON", "OR", + "ORACLE_OUTER_JOIN", "ORDER", "PLUS", "PRAGMA", + "PRIMARY", "RAISE", "REFERENCES", "REM", + "REPLACE", "RESTRICT", "ROLLBACK", "ROW", + "RP", "RSHIFT", "SELECT", "SEMI", + "SET", "SLASH", "SPACE", "STAR", + "STATEMENT", "STRING", "TABLE", "TEMP", + "THEN", "TRANSACTION", "TRIGGER", "UMINUS", + "UNCLOSED_STRING", "UNION", "UNIQUE", "UPDATE", + "UPLUS", "USING", "VACUUM", "VALUES", + "VIEW", "WHEN", "WHERE", "as", + "carg", "carglist", "case_else", "case_exprlist", + "case_operand", "ccons", "cmd", "cmdlist", + "cmdx", "collate", "column", "columnid", + "columnlist", "conslist", "conslist_opt", "create_table", + "create_table_args", "database_kw_opt", "dbnm", "defer_subclause", + "defer_subclause_opt", "distinct", "ecmd", "error", + "explain", "expr", "expritem", "exprlist", + "foreach_clause", "from", "groupby_opt", "having_opt", + "id", "ids", "idxitem", "idxlist", + "idxlist_opt", "init_deferred_pred_opt", "input", "inscollist", + "inscollist_opt", "insert_cmd", "itemlist", "joinop", + "joinop2", "likeop", "limit_opt", "minus_num", "multiselect_op", "nm", "number", "on_opt", "onconf", "oneselect", "orconf", "orderby_opt", "plus_num", "plus_opt", "refact", "refarg", @@ -3916,9 +4020,9 @@ static const char *yyTokenName[] = { "select", "seltablist", "setlist", "signed", "sortitem", "sortlist", "sortorder", "stl_prefix", "tcons", "temp", "trans_opt", "trigger_cmd", - "trigger_cmd_list", "trigger_event", "trigger_time", "type", - "typename", "uniqueflag", "using_opt", "when_clause", - "where_opt", + "trigger_cmd_list", "trigger_decl", "trigger_event", "trigger_time", + "type", "typename", "uniqueflag", "using_opt", + "when_clause", "where_opt", }; #endif /* NDEBUG */ @@ -4049,163 +4153,170 @@ static const char *yyRuleName[] = { /* 120 */ "from ::= FROM seltablist", /* 121 */ "stl_prefix ::= seltablist joinop", /* 122 */ "stl_prefix ::=", - /* 123 */ "seltablist ::= stl_prefix nm as on_opt using_opt", + /* 123 */ "seltablist ::= stl_prefix nm dbnm as on_opt using_opt", /* 124 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt", - /* 125 */ "joinop ::= COMMA", - /* 126 */ "joinop ::= JOIN", - /* 127 */ "joinop ::= JOIN_KW JOIN", - /* 128 */ "joinop ::= JOIN_KW nm JOIN", - /* 129 */ "joinop ::= JOIN_KW nm nm JOIN", - /* 130 */ "on_opt ::= ON expr", - /* 131 */ "on_opt ::=", - /* 132 */ "using_opt ::= USING LP idxlist RP", - /* 133 */ "using_opt ::=", - /* 134 */ "orderby_opt ::=", - /* 135 */ "orderby_opt ::= ORDER BY sortlist", - /* 136 */ "sortlist ::= sortlist COMMA sortitem collate sortorder", - /* 137 */ "sortlist ::= sortitem collate sortorder", - /* 138 */ "sortitem ::= expr", - /* 139 */ "sortorder ::= ASC", - /* 140 */ "sortorder ::= DESC", - /* 141 */ "sortorder ::=", - /* 142 */ "collate ::=", - /* 143 */ "collate ::= COLLATE id", - /* 144 */ "groupby_opt ::=", - /* 145 */ "groupby_opt ::= GROUP BY exprlist", - /* 146 */ "having_opt ::=", - /* 147 */ "having_opt ::= HAVING expr", - /* 148 */ "limit_opt ::=", - /* 149 */ "limit_opt ::= LIMIT INTEGER", - /* 150 */ "limit_opt ::= LIMIT INTEGER limit_sep INTEGER", - /* 151 */ "limit_sep ::= OFFSET", - /* 152 */ "limit_sep ::= COMMA", - /* 153 */ "cmd ::= DELETE FROM nm where_opt", - /* 154 */ "where_opt ::=", - /* 155 */ "where_opt ::= WHERE expr", - /* 156 */ "cmd ::= UPDATE orconf nm SET setlist where_opt", - /* 157 */ "setlist ::= setlist COMMA nm EQ expr", - /* 158 */ "setlist ::= nm EQ expr", - /* 159 */ "cmd ::= insert_cmd INTO nm inscollist_opt VALUES LP itemlist RP", - /* 160 */ "cmd ::= insert_cmd INTO nm inscollist_opt select", - /* 161 */ "insert_cmd ::= INSERT orconf", - /* 162 */ "insert_cmd ::= REPLACE", - /* 163 */ "itemlist ::= itemlist COMMA expr", - /* 164 */ "itemlist ::= expr", - /* 165 */ "inscollist_opt ::=", - /* 166 */ "inscollist_opt ::= LP inscollist RP", - /* 167 */ "inscollist ::= inscollist COMMA nm", - /* 168 */ "inscollist ::= nm", - /* 169 */ "expr ::= LP expr RP", - /* 170 */ "expr ::= NULL", - /* 171 */ "expr ::= ID", - /* 172 */ "expr ::= JOIN_KW", - /* 173 */ "expr ::= nm DOT nm", - /* 174 */ "expr ::= expr ORACLE_OUTER_JOIN", - /* 175 */ "expr ::= INTEGER", - /* 176 */ "expr ::= FLOAT", - /* 177 */ "expr ::= STRING", - /* 178 */ "expr ::= ID LP exprlist RP", - /* 179 */ "expr ::= ID LP STAR RP", - /* 180 */ "expr ::= expr AND expr", - /* 181 */ "expr ::= expr OR expr", - /* 182 */ "expr ::= expr LT expr", - /* 183 */ "expr ::= expr GT expr", - /* 184 */ "expr ::= expr LE expr", - /* 185 */ "expr ::= expr GE expr", - /* 186 */ "expr ::= expr NE expr", - /* 187 */ "expr ::= expr EQ expr", - /* 188 */ "expr ::= expr BITAND expr", - /* 189 */ "expr ::= expr BITOR expr", - /* 190 */ "expr ::= expr LSHIFT expr", - /* 191 */ "expr ::= expr RSHIFT expr", - /* 192 */ "expr ::= expr likeop expr", - /* 193 */ "expr ::= expr NOT likeop expr", - /* 194 */ "likeop ::= LIKE", - /* 195 */ "likeop ::= GLOB", - /* 196 */ "expr ::= expr PLUS expr", - /* 197 */ "expr ::= expr MINUS expr", - /* 198 */ "expr ::= expr STAR expr", - /* 199 */ "expr ::= expr SLASH expr", - /* 200 */ "expr ::= expr REM expr", - /* 201 */ "expr ::= expr CONCAT expr", - /* 202 */ "expr ::= expr ISNULL", - /* 203 */ "expr ::= expr IS NULL", - /* 204 */ "expr ::= expr NOTNULL", - /* 205 */ "expr ::= expr NOT NULL", - /* 206 */ "expr ::= expr IS NOT NULL", - /* 207 */ "expr ::= NOT expr", - /* 208 */ "expr ::= BITNOT expr", - /* 209 */ "expr ::= MINUS expr", - /* 210 */ "expr ::= PLUS expr", - /* 211 */ "expr ::= LP select RP", - /* 212 */ "expr ::= expr BETWEEN expr AND expr", - /* 213 */ "expr ::= expr NOT BETWEEN expr AND expr", - /* 214 */ "expr ::= expr IN LP exprlist RP", - /* 215 */ "expr ::= expr IN LP select RP", - /* 216 */ "expr ::= expr NOT IN LP exprlist RP", - /* 217 */ "expr ::= expr NOT IN LP select RP", - /* 218 */ "expr ::= CASE case_operand case_exprlist case_else END", - /* 219 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", - /* 220 */ "case_exprlist ::= WHEN expr THEN expr", - /* 221 */ "case_else ::= ELSE expr", - /* 222 */ "case_else ::=", - /* 223 */ "case_operand ::= expr", - /* 224 */ "case_operand ::=", - /* 225 */ "exprlist ::= exprlist COMMA expritem", - /* 226 */ "exprlist ::= expritem", - /* 227 */ "expritem ::= expr", - /* 228 */ "expritem ::=", - /* 229 */ "cmd ::= CREATE uniqueflag INDEX nm ON nm LP idxlist RP onconf", - /* 230 */ "uniqueflag ::= UNIQUE", - /* 231 */ "uniqueflag ::=", - /* 232 */ "idxlist_opt ::=", - /* 233 */ "idxlist_opt ::= LP idxlist RP", - /* 234 */ "idxlist ::= idxlist COMMA idxitem", - /* 235 */ "idxlist ::= idxitem", - /* 236 */ "idxitem ::= nm", - /* 237 */ "cmd ::= DROP INDEX nm", - /* 238 */ "cmd ::= COPY orconf nm FROM nm USING DELIMITERS STRING", - /* 239 */ "cmd ::= COPY orconf nm FROM nm", - /* 240 */ "cmd ::= VACUUM", - /* 241 */ "cmd ::= VACUUM nm", - /* 242 */ "cmd ::= PRAGMA ids EQ nm", - /* 243 */ "cmd ::= PRAGMA ids EQ ON", - /* 244 */ "cmd ::= PRAGMA ids EQ plus_num", - /* 245 */ "cmd ::= PRAGMA ids EQ minus_num", - /* 246 */ "cmd ::= PRAGMA ids LP nm RP", - /* 247 */ "cmd ::= PRAGMA ids", - /* 248 */ "plus_num ::= plus_opt number", - /* 249 */ "minus_num ::= MINUS number", - /* 250 */ "number ::= INTEGER", - /* 251 */ "number ::= FLOAT", - /* 252 */ "plus_opt ::= PLUS", - /* 253 */ "plus_opt ::=", - /* 254 */ "cmd ::= CREATE TRIGGER nm trigger_time trigger_event ON nm foreach_clause when_clause BEGIN trigger_cmd_list END", - /* 255 */ "trigger_time ::= BEFORE", - /* 256 */ "trigger_time ::= AFTER", - /* 257 */ "trigger_time ::= INSTEAD OF", - /* 258 */ "trigger_time ::=", - /* 259 */ "trigger_event ::= DELETE", - /* 260 */ "trigger_event ::= INSERT", - /* 261 */ "trigger_event ::= UPDATE", - /* 262 */ "trigger_event ::= UPDATE OF inscollist", - /* 263 */ "foreach_clause ::=", - /* 264 */ "foreach_clause ::= FOR EACH ROW", - /* 265 */ "foreach_clause ::= FOR EACH STATEMENT", - /* 266 */ "when_clause ::=", - /* 267 */ "when_clause ::= WHEN expr", - /* 268 */ "trigger_cmd_list ::= trigger_cmd SEMI trigger_cmd_list", - /* 269 */ "trigger_cmd_list ::=", - /* 270 */ "trigger_cmd ::= UPDATE orconf nm SET setlist where_opt", - /* 271 */ "trigger_cmd ::= INSERT orconf INTO nm inscollist_opt VALUES LP itemlist RP", - /* 272 */ "trigger_cmd ::= INSERT orconf INTO nm inscollist_opt select", - /* 273 */ "trigger_cmd ::= DELETE FROM nm where_opt", - /* 274 */ "trigger_cmd ::= select", - /* 275 */ "expr ::= RAISE LP IGNORE RP", - /* 276 */ "expr ::= RAISE LP ROLLBACK COMMA nm RP", - /* 277 */ "expr ::= RAISE LP ABORT COMMA nm RP", - /* 278 */ "expr ::= RAISE LP FAIL COMMA nm RP", - /* 279 */ "cmd ::= DROP TRIGGER nm", + /* 125 */ "dbnm ::=", + /* 126 */ "dbnm ::= DOT nm", + /* 127 */ "joinop ::= COMMA", + /* 128 */ "joinop ::= JOIN", + /* 129 */ "joinop ::= JOIN_KW JOIN", + /* 130 */ "joinop ::= JOIN_KW nm JOIN", + /* 131 */ "joinop ::= JOIN_KW nm nm JOIN", + /* 132 */ "on_opt ::= ON expr", + /* 133 */ "on_opt ::=", + /* 134 */ "using_opt ::= USING LP idxlist RP", + /* 135 */ "using_opt ::=", + /* 136 */ "orderby_opt ::=", + /* 137 */ "orderby_opt ::= ORDER BY sortlist", + /* 138 */ "sortlist ::= sortlist COMMA sortitem collate sortorder", + /* 139 */ "sortlist ::= sortitem collate sortorder", + /* 140 */ "sortitem ::= expr", + /* 141 */ "sortorder ::= ASC", + /* 142 */ "sortorder ::= DESC", + /* 143 */ "sortorder ::=", + /* 144 */ "collate ::=", + /* 145 */ "collate ::= COLLATE id", + /* 146 */ "groupby_opt ::=", + /* 147 */ "groupby_opt ::= GROUP BY exprlist", + /* 148 */ "having_opt ::=", + /* 149 */ "having_opt ::= HAVING expr", + /* 150 */ "limit_opt ::=", + /* 151 */ "limit_opt ::= LIMIT INTEGER", + /* 152 */ "limit_opt ::= LIMIT INTEGER OFFSET INTEGER", + /* 153 */ "limit_opt ::= LIMIT INTEGER COMMA INTEGER", + /* 154 */ "cmd ::= DELETE FROM nm dbnm where_opt", + /* 155 */ "where_opt ::=", + /* 156 */ "where_opt ::= WHERE expr", + /* 157 */ "cmd ::= UPDATE orconf nm dbnm SET setlist where_opt", + /* 158 */ "setlist ::= setlist COMMA nm EQ expr", + /* 159 */ "setlist ::= nm EQ expr", + /* 160 */ "cmd ::= insert_cmd INTO nm dbnm inscollist_opt VALUES LP itemlist RP", + /* 161 */ "cmd ::= insert_cmd INTO nm dbnm inscollist_opt select", + /* 162 */ "insert_cmd ::= INSERT orconf", + /* 163 */ "insert_cmd ::= REPLACE", + /* 164 */ "itemlist ::= itemlist COMMA expr", + /* 165 */ "itemlist ::= expr", + /* 166 */ "inscollist_opt ::=", + /* 167 */ "inscollist_opt ::= LP inscollist RP", + /* 168 */ "inscollist ::= inscollist COMMA nm", + /* 169 */ "inscollist ::= nm", + /* 170 */ "expr ::= LP expr RP", + /* 171 */ "expr ::= NULL", + /* 172 */ "expr ::= ID", + /* 173 */ "expr ::= JOIN_KW", + /* 174 */ "expr ::= nm DOT nm", + /* 175 */ "expr ::= nm DOT nm DOT nm", + /* 176 */ "expr ::= expr ORACLE_OUTER_JOIN", + /* 177 */ "expr ::= INTEGER", + /* 178 */ "expr ::= FLOAT", + /* 179 */ "expr ::= STRING", + /* 180 */ "expr ::= ID LP exprlist RP", + /* 181 */ "expr ::= ID LP STAR RP", + /* 182 */ "expr ::= expr AND expr", + /* 183 */ "expr ::= expr OR expr", + /* 184 */ "expr ::= expr LT expr", + /* 185 */ "expr ::= expr GT expr", + /* 186 */ "expr ::= expr LE expr", + /* 187 */ "expr ::= expr GE expr", + /* 188 */ "expr ::= expr NE expr", + /* 189 */ "expr ::= expr EQ expr", + /* 190 */ "expr ::= expr BITAND expr", + /* 191 */ "expr ::= expr BITOR expr", + /* 192 */ "expr ::= expr LSHIFT expr", + /* 193 */ "expr ::= expr RSHIFT expr", + /* 194 */ "expr ::= expr likeop expr", + /* 195 */ "expr ::= expr NOT likeop expr", + /* 196 */ "likeop ::= LIKE", + /* 197 */ "likeop ::= GLOB", + /* 198 */ "expr ::= expr PLUS expr", + /* 199 */ "expr ::= expr MINUS expr", + /* 200 */ "expr ::= expr STAR expr", + /* 201 */ "expr ::= expr SLASH expr", + /* 202 */ "expr ::= expr REM expr", + /* 203 */ "expr ::= expr CONCAT expr", + /* 204 */ "expr ::= expr ISNULL", + /* 205 */ "expr ::= expr IS NULL", + /* 206 */ "expr ::= expr NOTNULL", + /* 207 */ "expr ::= expr NOT NULL", + /* 208 */ "expr ::= expr IS NOT NULL", + /* 209 */ "expr ::= NOT expr", + /* 210 */ "expr ::= BITNOT expr", + /* 211 */ "expr ::= MINUS expr", + /* 212 */ "expr ::= PLUS expr", + /* 213 */ "expr ::= LP select RP", + /* 214 */ "expr ::= expr BETWEEN expr AND expr", + /* 215 */ "expr ::= expr NOT BETWEEN expr AND expr", + /* 216 */ "expr ::= expr IN LP exprlist RP", + /* 217 */ "expr ::= expr IN LP select RP", + /* 218 */ "expr ::= expr NOT IN LP exprlist RP", + /* 219 */ "expr ::= expr NOT IN LP select RP", + /* 220 */ "expr ::= CASE case_operand case_exprlist case_else END", + /* 221 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", + /* 222 */ "case_exprlist ::= WHEN expr THEN expr", + /* 223 */ "case_else ::= ELSE expr", + /* 224 */ "case_else ::=", + /* 225 */ "case_operand ::= expr", + /* 226 */ "case_operand ::=", + /* 227 */ "exprlist ::= exprlist COMMA expritem", + /* 228 */ "exprlist ::= expritem", + /* 229 */ "expritem ::= expr", + /* 230 */ "expritem ::=", + /* 231 */ "cmd ::= CREATE temp uniqueflag INDEX nm ON nm dbnm LP idxlist RP onconf", + /* 232 */ "uniqueflag ::= UNIQUE", + /* 233 */ "uniqueflag ::=", + /* 234 */ "idxlist_opt ::=", + /* 235 */ "idxlist_opt ::= LP idxlist RP", + /* 236 */ "idxlist ::= idxlist COMMA idxitem", + /* 237 */ "idxlist ::= idxitem", + /* 238 */ "idxitem ::= nm sortorder", + /* 239 */ "cmd ::= DROP INDEX nm dbnm", + /* 240 */ "cmd ::= COPY orconf nm dbnm FROM nm USING DELIMITERS STRING", + /* 241 */ "cmd ::= COPY orconf nm dbnm FROM nm", + /* 242 */ "cmd ::= VACUUM", + /* 243 */ "cmd ::= VACUUM nm", + /* 244 */ "cmd ::= PRAGMA ids EQ nm", + /* 245 */ "cmd ::= PRAGMA ids EQ ON", + /* 246 */ "cmd ::= PRAGMA ids EQ plus_num", + /* 247 */ "cmd ::= PRAGMA ids EQ minus_num", + /* 248 */ "cmd ::= PRAGMA ids LP nm RP", + /* 249 */ "cmd ::= PRAGMA ids", + /* 250 */ "plus_num ::= plus_opt number", + /* 251 */ "minus_num ::= MINUS number", + /* 252 */ "number ::= INTEGER", + /* 253 */ "number ::= FLOAT", + /* 254 */ "plus_opt ::= PLUS", + /* 255 */ "plus_opt ::=", + /* 256 */ "cmd ::= CREATE trigger_decl BEGIN trigger_cmd_list END", + /* 257 */ "trigger_decl ::= temp TRIGGER nm trigger_time trigger_event ON nm dbnm foreach_clause when_clause", + /* 258 */ "trigger_time ::= BEFORE", + /* 259 */ "trigger_time ::= AFTER", + /* 260 */ "trigger_time ::= INSTEAD OF", + /* 261 */ "trigger_time ::=", + /* 262 */ "trigger_event ::= DELETE", + /* 263 */ "trigger_event ::= INSERT", + /* 264 */ "trigger_event ::= UPDATE", + /* 265 */ "trigger_event ::= UPDATE OF inscollist", + /* 266 */ "foreach_clause ::=", + /* 267 */ "foreach_clause ::= FOR EACH ROW", + /* 268 */ "foreach_clause ::= FOR EACH STATEMENT", + /* 269 */ "when_clause ::=", + /* 270 */ "when_clause ::= WHEN expr", + /* 271 */ "trigger_cmd_list ::= trigger_cmd SEMI trigger_cmd_list", + /* 272 */ "trigger_cmd_list ::=", + /* 273 */ "trigger_cmd ::= UPDATE orconf nm SET setlist where_opt", + /* 274 */ "trigger_cmd ::= INSERT orconf INTO nm inscollist_opt VALUES LP itemlist RP", + /* 275 */ "trigger_cmd ::= INSERT orconf INTO nm inscollist_opt select", + /* 276 */ "trigger_cmd ::= DELETE FROM nm where_opt", + /* 277 */ "trigger_cmd ::= select", + /* 278 */ "expr ::= RAISE LP IGNORE RP", + /* 279 */ "expr ::= RAISE LP ROLLBACK COMMA nm RP", + /* 280 */ "expr ::= RAISE LP ABORT COMMA nm RP", + /* 281 */ "expr ::= RAISE LP FAIL COMMA nm RP", + /* 282 */ "cmd ::= DROP TRIGGER nm dbnm", + /* 283 */ "cmd ::= ATTACH database_kw_opt ids AS nm", + /* 284 */ "database_kw_opt ::= DATABASE", + /* 285 */ "database_kw_opt ::=", + /* 286 */ "cmd ::= DETACH database_kw_opt nm", }; #endif /* NDEBUG */ @@ -4263,135 +4374,145 @@ static void yy_destructor(YYCODETYPE yymajor, YYMINORTYPE *yypminor){ ** which appear on the RHS of the rule, but which are not used ** inside the C code. */ - case 132: -#line 660 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteExprListDelete((yypminor->yy168));} -#line 4269 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 135: +#line 673 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteExprListDelete((yypminor->yy62));} +#line 4380 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 152: -#line 514 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteExprDelete((yypminor->yy272));} -#line 4274 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 157: +#line 520 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteExprDelete((yypminor->yy334));} +#line 4385 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 153: -#line 679 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteExprDelete((yypminor->yy272));} -#line 4279 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 158: +#line 692 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteExprDelete((yypminor->yy334));} +#line 4390 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 154: -#line 677 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteExprListDelete((yypminor->yy168));} -#line 4284 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 159: +#line 690 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteExprListDelete((yypminor->yy62));} +#line 4395 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 156: + case 161: #line 341 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteSrcListDelete((yypminor->yy289));} -#line 4289 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - break; - case 157: -#line 431 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteExprListDelete((yypminor->yy168));} -#line 4294 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - break; - case 158: -#line 436 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteExprDelete((yypminor->yy272));} -#line 4299 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteSrcListDelete((yypminor->yy335));} +#line 4400 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 162: -#line 701 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteIdListDelete((yypminor->yy268));} -#line 4304 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 435 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteExprListDelete((yypminor->yy62));} +#line 4405 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 163: -#line 703 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteIdListDelete((yypminor->yy268));} -#line 4309 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - break; - case 166: -#line 492 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteIdListDelete((yypminor->yy268));} -#line 4314 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 440 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteExprDelete((yypminor->yy334));} +#line 4410 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 167: -#line 490 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteIdListDelete((yypminor->yy268));} -#line 4319 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 715 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteIdListDelete((yypminor->yy92));} +#line 4415 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 169: -#line 484 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteExprListDelete((yypminor->yy168));} -#line 4324 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 168: +#line 717 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteIdListDelete((yypminor->yy92));} +#line 4420 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 179: -#line 392 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteExprDelete((yypminor->yy272));} -#line 4329 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 171: +#line 498 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteIdListDelete((yypminor->yy92));} +#line 4425 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 181: -#line 276 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteSelectDelete((yypminor->yy207));} -#line 4334 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 172: +#line 496 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteIdListDelete((yypminor->yy92));} +#line 4430 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + break; + case 174: +#line 490 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteExprListDelete((yypminor->yy62));} +#line 4435 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 183: -#line 403 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteExprListDelete((yypminor->yy168));} -#line 4339 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 396 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteExprDelete((yypminor->yy334));} +#line 4440 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + break; + case 185: +#line 276 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteSelectDelete((yypminor->yy11));} +#line 4445 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 190: + case 187: +#line 407 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteExprListDelete((yypminor->yy62));} +#line 4450 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + break; + case 194: #line 312 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteExprListDelete((yypminor->yy168));} -#line 4344 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteExprListDelete((yypminor->yy62));} +#line 4455 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 191: + case 195: #line 310 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteExprListDelete((yypminor->yy168));} -#line 4349 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteExprListDelete((yypminor->yy62));} +#line 4460 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 192: + case 196: #line 274 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteSelectDelete((yypminor->yy207));} -#line 4354 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteSelectDelete((yypminor->yy11));} +#line 4465 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 193: + case 197: #line 337 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteSrcListDelete((yypminor->yy289));} -#line 4359 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteSrcListDelete((yypminor->yy335));} +#line 4470 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 194: -#line 460 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteExprListDelete((yypminor->yy168));} -#line 4364 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 198: +#line 465 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteExprListDelete((yypminor->yy62));} +#line 4475 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 196: -#line 407 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteExprDelete((yypminor->yy272));} -#line 4369 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 200: +#line 411 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteExprDelete((yypminor->yy334));} +#line 4480 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 197: -#line 405 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteExprListDelete((yypminor->yy168));} -#line 4374 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 201: +#line 409 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteExprListDelete((yypminor->yy62));} +#line 4485 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 199: + case 203: #line 339 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteSrcListDelete((yypminor->yy289));} -#line 4379 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteSrcListDelete((yypminor->yy335));} +#line 4490 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + break; + case 207: +#line 807 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteDeleteTriggerStep((yypminor->yy347));} +#line 4495 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 205: -#line 762 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteIdListDelete((yypminor->yy72).b);} -#line 4384 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 208: +#line 799 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteDeleteTriggerStep((yypminor->yy347));} +#line 4500 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 210: -#line 397 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteIdListDelete((yypminor->yy268));} -#line 4389 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 783 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteIdListDelete((yypminor->yy234).b);} +#line 4505 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 212: -#line 454 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteExprDelete((yypminor->yy272));} -#line 4394 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 215: +#line 401 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteIdListDelete((yypminor->yy92));} +#line 4510 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + break; + case 217: +#line 459 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteExprDelete((yypminor->yy334));} +#line 4515 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; default: break; /* If no destructor action specified: do nothing */ } @@ -4537,286 +4658,293 @@ static struct { YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ unsigned char nrhs; /* Number of right-hand side symbols in the rule */ } yyRuleInfo[] = { - { 165, 1 }, - { 136, 1 }, - { 136, 2 }, - { 149, 3 }, - { 149, 1 }, - { 137, 1 }, - { 151, 1 }, - { 151, 0 }, - { 135, 3 }, - { 202, 0 }, - { 202, 1 }, - { 202, 2 }, - { 135, 2 }, - { 135, 2 }, - { 135, 2 }, - { 135, 2 }, - { 144, 4 }, - { 201, 1 }, - { 201, 0 }, - { 145, 4 }, - { 145, 2 }, - { 141, 3 }, - { 141, 1 }, - { 139, 3 }, + { 170, 1 }, + { 139, 1 }, + { 139, 2 }, + { 154, 3 }, + { 154, 1 }, { 140, 1 }, - { 159, 1 }, - { 160, 1 }, - { 160, 1 }, - { 177, 1 }, - { 177, 1 }, - { 177, 1 }, - { 207, 0 }, - { 207, 1 }, - { 207, 4 }, - { 207, 6 }, - { 208, 1 }, - { 208, 2 }, - { 195, 1 }, - { 195, 2 }, - { 195, 2 }, - { 130, 2 }, - { 130, 0 }, - { 129, 3 }, - { 129, 1 }, - { 129, 2 }, - { 129, 2 }, - { 129, 2 }, - { 129, 3 }, - { 129, 3 }, - { 129, 2 }, - { 129, 3 }, - { 129, 3 }, - { 129, 2 }, - { 134, 2 }, - { 134, 3 }, - { 134, 4 }, - { 134, 2 }, - { 134, 5 }, - { 134, 4 }, - { 134, 1 }, - { 134, 2 }, - { 188, 0 }, - { 188, 2 }, - { 187, 2 }, - { 187, 3 }, - { 187, 3 }, - { 187, 3 }, - { 186, 2 }, - { 186, 2 }, - { 186, 1 }, - { 186, 1 }, - { 146, 3 }, - { 146, 2 }, - { 164, 0 }, - { 164, 2 }, - { 164, 2 }, - { 143, 0 }, - { 143, 2 }, - { 142, 3 }, - { 142, 2 }, - { 142, 1 }, - { 200, 2 }, - { 200, 6 }, - { 200, 5 }, - { 200, 3 }, - { 200, 10 }, - { 147, 0 }, - { 147, 1 }, - { 180, 0 }, - { 180, 3 }, - { 182, 0 }, - { 182, 2 }, - { 189, 1 }, - { 189, 1 }, - { 189, 1 }, - { 189, 1 }, - { 189, 1 }, - { 135, 3 }, - { 135, 6 }, - { 135, 3 }, - { 135, 1 }, - { 192, 1 }, - { 192, 3 }, - { 176, 1 }, - { 176, 2 }, - { 176, 1 }, - { 176, 1 }, - { 181, 9 }, - { 148, 1 }, - { 148, 1 }, - { 148, 0 }, - { 190, 2 }, - { 190, 0 }, - { 191, 3 }, - { 191, 2 }, - { 191, 4 }, - { 128, 2 }, - { 128, 1 }, - { 128, 0 }, + { 156, 1 }, { 156, 0 }, - { 156, 2 }, - { 199, 2 }, - { 199, 0 }, - { 193, 5 }, - { 193, 7 }, - { 170, 1 }, - { 170, 1 }, - { 170, 2 }, - { 170, 3 }, - { 170, 4 }, - { 179, 2 }, - { 179, 0 }, - { 210, 4 }, - { 210, 0 }, - { 183, 0 }, - { 183, 3 }, - { 197, 5 }, - { 197, 3 }, - { 196, 1 }, - { 198, 1 }, - { 198, 1 }, - { 198, 0 }, - { 138, 0 }, + { 138, 3 }, + { 206, 0 }, + { 206, 1 }, + { 206, 2 }, { 138, 2 }, - { 157, 0 }, - { 157, 3 }, - { 158, 0 }, - { 158, 2 }, - { 173, 0 }, - { 173, 2 }, - { 173, 4 }, - { 174, 1 }, - { 174, 1 }, - { 135, 4 }, + { 138, 2 }, + { 138, 2 }, + { 138, 2 }, + { 147, 4 }, + { 205, 1 }, + { 205, 0 }, + { 148, 4 }, + { 148, 2 }, + { 144, 3 }, + { 144, 1 }, + { 142, 3 }, + { 143, 1 }, + { 164, 1 }, + { 165, 1 }, + { 165, 1 }, + { 181, 1 }, + { 181, 1 }, + { 181, 1 }, { 212, 0 }, - { 212, 2 }, - { 135, 6 }, - { 194, 5 }, - { 194, 3 }, - { 135, 8 }, - { 135, 5 }, - { 168, 2 }, - { 168, 1 }, - { 169, 3 }, - { 169, 1 }, - { 167, 0 }, - { 167, 3 }, - { 166, 3 }, - { 166, 1 }, - { 152, 3 }, - { 152, 1 }, - { 152, 1 }, - { 152, 1 }, - { 152, 3 }, - { 152, 2 }, - { 152, 1 }, - { 152, 1 }, - { 152, 1 }, - { 152, 4 }, - { 152, 4 }, - { 152, 3 }, - { 152, 3 }, - { 152, 3 }, - { 152, 3 }, - { 152, 3 }, - { 152, 3 }, - { 152, 3 }, - { 152, 3 }, - { 152, 3 }, - { 152, 3 }, - { 152, 3 }, - { 152, 3 }, - { 152, 3 }, - { 152, 4 }, - { 172, 1 }, - { 172, 1 }, - { 152, 3 }, - { 152, 3 }, - { 152, 3 }, - { 152, 3 }, - { 152, 3 }, - { 152, 3 }, - { 152, 2 }, - { 152, 3 }, - { 152, 2 }, - { 152, 3 }, - { 152, 4 }, - { 152, 2 }, - { 152, 2 }, - { 152, 2 }, - { 152, 2 }, - { 152, 3 }, - { 152, 5 }, - { 152, 6 }, - { 152, 5 }, - { 152, 5 }, - { 152, 6 }, - { 152, 6 }, - { 152, 5 }, - { 132, 5 }, - { 132, 4 }, - { 131, 2 }, - { 131, 0 }, - { 133, 1 }, + { 212, 1 }, + { 212, 4 }, + { 212, 6 }, + { 213, 1 }, + { 213, 2 }, + { 199, 1 }, + { 199, 2 }, + { 199, 2 }, + { 133, 2 }, { 133, 0 }, - { 154, 3 }, - { 154, 1 }, + { 132, 3 }, + { 132, 1 }, + { 132, 2 }, + { 132, 2 }, + { 132, 2 }, + { 132, 3 }, + { 132, 3 }, + { 132, 2 }, + { 132, 3 }, + { 132, 3 }, + { 132, 2 }, + { 137, 2 }, + { 137, 3 }, + { 137, 4 }, + { 137, 2 }, + { 137, 5 }, + { 137, 4 }, + { 137, 1 }, + { 137, 2 }, + { 192, 0 }, + { 192, 2 }, + { 191, 2 }, + { 191, 3 }, + { 191, 3 }, + { 191, 3 }, + { 190, 2 }, + { 190, 2 }, + { 190, 1 }, + { 190, 1 }, + { 151, 3 }, + { 151, 2 }, + { 169, 0 }, + { 169, 2 }, + { 169, 2 }, + { 146, 0 }, + { 146, 2 }, + { 145, 3 }, + { 145, 2 }, + { 145, 1 }, + { 204, 2 }, + { 204, 6 }, + { 204, 5 }, + { 204, 3 }, + { 204, 10 }, + { 152, 0 }, + { 152, 1 }, + { 184, 0 }, + { 184, 3 }, + { 186, 0 }, + { 186, 2 }, + { 193, 1 }, + { 193, 1 }, + { 193, 1 }, + { 193, 1 }, + { 193, 1 }, + { 138, 3 }, + { 138, 6 }, + { 138, 3 }, + { 138, 1 }, + { 196, 1 }, + { 196, 3 }, + { 180, 1 }, + { 180, 2 }, + { 180, 1 }, + { 180, 1 }, + { 185, 9 }, + { 153, 1 }, { 153, 1 }, { 153, 0 }, - { 135, 10 }, - { 209, 1 }, - { 209, 0 }, - { 163, 0 }, - { 163, 3 }, + { 194, 2 }, + { 194, 0 }, + { 195, 3 }, + { 195, 2 }, + { 195, 4 }, + { 131, 2 }, + { 131, 1 }, + { 131, 0 }, + { 161, 0 }, + { 161, 2 }, + { 203, 2 }, + { 203, 0 }, + { 197, 6 }, + { 197, 7 }, + { 150, 0 }, + { 150, 2 }, + { 175, 1 }, + { 175, 1 }, + { 175, 2 }, + { 175, 3 }, + { 175, 4 }, + { 183, 2 }, + { 183, 0 }, + { 215, 4 }, + { 215, 0 }, + { 187, 0 }, + { 187, 3 }, + { 201, 5 }, + { 201, 3 }, + { 200, 1 }, + { 202, 1 }, + { 202, 1 }, + { 202, 0 }, + { 141, 0 }, + { 141, 2 }, + { 162, 0 }, { 162, 3 }, - { 162, 1 }, - { 161, 1 }, - { 135, 3 }, - { 135, 8 }, + { 163, 0 }, + { 163, 2 }, + { 178, 0 }, + { 178, 2 }, + { 178, 4 }, + { 178, 4 }, + { 138, 5 }, + { 217, 0 }, + { 217, 2 }, + { 138, 7 }, + { 198, 5 }, + { 198, 3 }, + { 138, 9 }, + { 138, 6 }, + { 173, 2 }, + { 173, 1 }, + { 174, 3 }, + { 174, 1 }, + { 172, 0 }, + { 172, 3 }, + { 171, 3 }, + { 171, 1 }, + { 157, 3 }, + { 157, 1 }, + { 157, 1 }, + { 157, 1 }, + { 157, 3 }, + { 157, 5 }, + { 157, 2 }, + { 157, 1 }, + { 157, 1 }, + { 157, 1 }, + { 157, 4 }, + { 157, 4 }, + { 157, 3 }, + { 157, 3 }, + { 157, 3 }, + { 157, 3 }, + { 157, 3 }, + { 157, 3 }, + { 157, 3 }, + { 157, 3 }, + { 157, 3 }, + { 157, 3 }, + { 157, 3 }, + { 157, 3 }, + { 157, 3 }, + { 157, 4 }, + { 177, 1 }, + { 177, 1 }, + { 157, 3 }, + { 157, 3 }, + { 157, 3 }, + { 157, 3 }, + { 157, 3 }, + { 157, 3 }, + { 157, 2 }, + { 157, 3 }, + { 157, 2 }, + { 157, 3 }, + { 157, 4 }, + { 157, 2 }, + { 157, 2 }, + { 157, 2 }, + { 157, 2 }, + { 157, 3 }, + { 157, 5 }, + { 157, 6 }, + { 157, 5 }, + { 157, 5 }, + { 157, 6 }, + { 157, 6 }, + { 157, 5 }, { 135, 5 }, - { 135, 1 }, - { 135, 2 }, - { 135, 4 }, - { 135, 4 }, { 135, 4 }, - { 135, 4 }, - { 135, 5 }, - { 135, 2 }, - { 184, 2 }, - { 175, 2 }, - { 178, 1 }, - { 178, 1 }, - { 185, 1 }, - { 185, 0 }, - { 135, 12 }, - { 206, 1 }, - { 206, 1 }, - { 206, 2 }, - { 206, 0 }, - { 205, 1 }, - { 205, 1 }, - { 205, 1 }, - { 205, 3 }, - { 155, 0 }, - { 155, 3 }, - { 155, 3 }, - { 211, 0 }, + { 134, 2 }, + { 134, 0 }, + { 136, 1 }, + { 136, 0 }, + { 159, 3 }, + { 159, 1 }, + { 158, 1 }, + { 158, 0 }, + { 138, 12 }, + { 214, 1 }, + { 214, 0 }, + { 168, 0 }, + { 168, 3 }, + { 167, 3 }, + { 167, 1 }, + { 166, 2 }, + { 138, 4 }, + { 138, 9 }, + { 138, 6 }, + { 138, 1 }, + { 138, 2 }, + { 138, 4 }, + { 138, 4 }, + { 138, 4 }, + { 138, 4 }, + { 138, 5 }, + { 138, 2 }, + { 188, 2 }, + { 179, 2 }, + { 182, 1 }, + { 182, 1 }, + { 189, 1 }, + { 189, 0 }, + { 138, 5 }, + { 209, 10 }, + { 211, 1 }, + { 211, 1 }, { 211, 2 }, - { 204, 3 }, - { 204, 0 }, - { 203, 6 }, - { 203, 9 }, - { 203, 6 }, - { 203, 4 }, - { 203, 1 }, - { 152, 4 }, - { 152, 6 }, - { 152, 6 }, - { 152, 6 }, - { 135, 3 }, + { 211, 0 }, + { 210, 1 }, + { 210, 1 }, + { 210, 1 }, + { 210, 3 }, + { 160, 0 }, + { 160, 3 }, + { 160, 3 }, + { 216, 0 }, + { 216, 2 }, + { 208, 3 }, + { 208, 0 }, + { 207, 6 }, + { 207, 9 }, + { 207, 6 }, + { 207, 4 }, + { 207, 1 }, + { 157, 4 }, + { 157, 6 }, + { 157, 6 }, + { 157, 6 }, + { 138, 4 }, + { 138, 5 }, + { 149, 1 }, + { 149, 0 }, + { 138, 3 }, }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -4874,24 +5002,24 @@ static void yy_reduce( case 5: #line 77 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { sqliteExec(pParse); } -#line 4877 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5005 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for cmd */ break; case 6: #line 78 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { sqliteBeginParse(pParse, 1); } -#line 4883 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5011 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for EXPLAIN */ break; case 7: #line 79 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { sqliteBeginParse(pParse, 0); } -#line 4889 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5017 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 8: #line 84 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteBeginTransaction(pParse,yymsp[0].minor.yy136);} -#line 4894 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteBeginTransaction(pParse,yymsp[0].minor.yy52);} +#line 5022 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for BEGIN */ /* No destructor defined for trans_opt */ break; @@ -4907,21 +5035,21 @@ static void yy_reduce( case 12: #line 88 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" {sqliteCommitTransaction(pParse);} -#line 4910 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5038 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for COMMIT */ /* No destructor defined for trans_opt */ break; case 13: #line 89 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" {sqliteCommitTransaction(pParse);} -#line 4917 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5045 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for END */ /* No destructor defined for trans_opt */ break; case 14: #line 90 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" {sqliteRollbackTransaction(pParse);} -#line 4924 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5052 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for ROLLBACK */ /* No destructor defined for trans_opt */ break; @@ -4932,28 +5060,28 @@ static void yy_reduce( case 16: #line 95 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - sqliteStartTable(pParse,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy324,yymsp[-2].minor.yy136,0); + sqliteStartTable(pParse,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy210,yymsp[-2].minor.yy52,0); } -#line 4937 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5065 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for TABLE */ break; case 17: #line 99 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = pParse->isTemp || !pParse->initFlag;} -#line 4943 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy52 = 1;} +#line 5071 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for TEMP */ break; case 18: #line 100 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = pParse->isTemp;} -#line 4949 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy52 = 0;} +#line 5077 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 19: #line 101 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { sqliteEndTable(pParse,&yymsp[0].minor.yy0,0); } -#line 4956 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5084 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for LP */ /* No destructor defined for columnlist */ /* No destructor defined for conslist_opt */ @@ -4961,10 +5089,10 @@ static void yy_reduce( case 20: #line 104 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - sqliteEndTable(pParse,0,yymsp[0].minor.yy207); - sqliteSelectDelete(yymsp[0].minor.yy207); + sqliteEndTable(pParse,0,yymsp[0].minor.yy11); + sqliteSelectDelete(yymsp[0].minor.yy11); } -#line 4967 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5095 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for AS */ break; case 21: @@ -4982,57 +5110,57 @@ static void yy_reduce( break; case 24: #line 116 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteAddColumn(pParse,&yymsp[0].minor.yy324);} -#line 4986 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteAddColumn(pParse,&yymsp[0].minor.yy210);} +#line 5114 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 25: #line 122 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy324 = yymsp[0].minor.yy0;} -#line 4991 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy210 = yymsp[0].minor.yy0;} +#line 5119 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 26: #line 138 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy324 = yymsp[0].minor.yy0;} -#line 4996 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy210 = yymsp[0].minor.yy0;} +#line 5124 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 27: #line 139 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy324 = yymsp[0].minor.yy0;} -#line 5001 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy210 = yymsp[0].minor.yy0;} +#line 5129 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 28: #line 144 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy324 = yymsp[0].minor.yy0;} -#line 5006 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy210 = yymsp[0].minor.yy0;} +#line 5134 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 29: #line 145 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy324 = yymsp[0].minor.yy0;} -#line 5011 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy210 = yymsp[0].minor.yy0;} +#line 5139 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 30: #line 146 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy324 = yymsp[0].minor.yy0;} -#line 5016 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy210 = yymsp[0].minor.yy0;} +#line 5144 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 31: break; case 32: #line 149 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteAddColumnType(pParse,&yymsp[0].minor.yy324,&yymsp[0].minor.yy324);} -#line 5023 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteAddColumnType(pParse,&yymsp[0].minor.yy210,&yymsp[0].minor.yy210);} +#line 5151 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 33: #line 150 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteAddColumnType(pParse,&yymsp[-3].minor.yy324,&yymsp[0].minor.yy0);} -#line 5028 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteAddColumnType(pParse,&yymsp[-3].minor.yy210,&yymsp[0].minor.yy0);} +#line 5156 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for LP */ /* No destructor defined for signed */ break; case 34: #line 152 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteAddColumnType(pParse,&yymsp[-5].minor.yy324,&yymsp[0].minor.yy0);} -#line 5035 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteAddColumnType(pParse,&yymsp[-5].minor.yy210,&yymsp[0].minor.yy0);} +#line 5163 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for LP */ /* No destructor defined for signed */ /* No destructor defined for COMMA */ @@ -5040,13 +5168,13 @@ static void yy_reduce( break; case 35: #line 154 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy324 = yymsp[0].minor.yy324;} -#line 5044 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy210 = yymsp[0].minor.yy210;} +#line 5172 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 36: #line 155 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy324 = yymsp[-1].minor.yy324;} -#line 5049 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy210 = yymsp[-1].minor.yy210;} +#line 5177 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for ids */ break; case 37: @@ -5077,52 +5205,52 @@ static void yy_reduce( case 44: #line 163 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" {sqliteAddDefaultValue(pParse,&yymsp[0].minor.yy0,0);} -#line 5080 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5208 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for DEFAULT */ break; case 45: #line 164 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" {sqliteAddDefaultValue(pParse,&yymsp[0].minor.yy0,0);} -#line 5086 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5214 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for DEFAULT */ break; case 46: #line 165 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" {sqliteAddDefaultValue(pParse,&yymsp[0].minor.yy0,0);} -#line 5092 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5220 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for DEFAULT */ break; case 47: #line 166 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" {sqliteAddDefaultValue(pParse,&yymsp[0].minor.yy0,0);} -#line 5098 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5226 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for DEFAULT */ /* No destructor defined for PLUS */ break; case 48: #line 167 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" {sqliteAddDefaultValue(pParse,&yymsp[0].minor.yy0,1);} -#line 5105 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5233 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for DEFAULT */ /* No destructor defined for MINUS */ break; case 49: #line 168 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" {sqliteAddDefaultValue(pParse,&yymsp[0].minor.yy0,0);} -#line 5112 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5240 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for DEFAULT */ break; case 50: #line 169 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" {sqliteAddDefaultValue(pParse,&yymsp[0].minor.yy0,0);} -#line 5118 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5246 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for DEFAULT */ /* No destructor defined for PLUS */ break; case 51: #line 170 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" {sqliteAddDefaultValue(pParse,&yymsp[0].minor.yy0,1);} -#line 5125 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5253 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for DEFAULT */ /* No destructor defined for MINUS */ break; @@ -5136,144 +5264,144 @@ static void yy_reduce( break; case 54: #line 177 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteAddNotNull(pParse, yymsp[0].minor.yy136);} -#line 5140 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteAddNotNull(pParse, yymsp[0].minor.yy52);} +#line 5268 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for NOT */ /* No destructor defined for NULL */ break; case 55: #line 178 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteAddPrimaryKey(pParse,0,yymsp[0].minor.yy136);} -#line 5147 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteAddPrimaryKey(pParse,0,yymsp[0].minor.yy52);} +#line 5275 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for PRIMARY */ /* No destructor defined for KEY */ /* No destructor defined for sortorder */ break; case 56: #line 179 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteCreateIndex(pParse,0,0,0,yymsp[0].minor.yy136,0,0);} -#line 5155 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteCreateIndex(pParse,0,0,0,yymsp[0].minor.yy52,0,0,0);} +#line 5283 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for UNIQUE */ break; case 57: /* No destructor defined for CHECK */ /* No destructor defined for LP */ - yy_destructor(152,&yymsp[-2].minor); + yy_destructor(157,&yymsp[-2].minor); /* No destructor defined for RP */ /* No destructor defined for onconf */ break; case 58: #line 182 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteCreateForeignKey(pParse,0,&yymsp[-2].minor.yy324,yymsp[-1].minor.yy268,yymsp[0].minor.yy136);} -#line 5168 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteCreateForeignKey(pParse,0,&yymsp[-2].minor.yy210,yymsp[-1].minor.yy92,yymsp[0].minor.yy52);} +#line 5296 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for REFERENCES */ break; case 59: #line 183 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteDeferForeignKey(pParse,yymsp[0].minor.yy136);} -#line 5174 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteDeferForeignKey(pParse,yymsp[0].minor.yy52);} +#line 5302 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 60: #line 184 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - sqliteAddCollateType(pParse, sqliteCollateType(yymsp[0].minor.yy324.z, yymsp[0].minor.yy324.n)); + sqliteAddCollateType(pParse, sqliteCollateType(yymsp[0].minor.yy210.z, yymsp[0].minor.yy210.n)); } -#line 5181 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5309 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for COLLATE */ break; case 61: #line 194 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = OE_Restrict * 0x010101; } -#line 5187 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy52 = OE_Restrict * 0x010101; } +#line 5315 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 62: #line 195 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = (yymsp[-1].minor.yy136 & yymsp[0].minor.yy83.mask) | yymsp[0].minor.yy83.value; } -#line 5192 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy52 = (yymsp[-1].minor.yy52 & yymsp[0].minor.yy279.mask) | yymsp[0].minor.yy279.value; } +#line 5320 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 63: #line 197 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy83.value = 0; yygotominor.yy83.mask = 0x000000; } -#line 5197 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy279.value = 0; yygotominor.yy279.mask = 0x000000; } +#line 5325 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for MATCH */ /* No destructor defined for nm */ break; case 64: #line 198 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy83.value = yymsp[0].minor.yy136; yygotominor.yy83.mask = 0x0000ff; } -#line 5204 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy279.value = yymsp[0].minor.yy52; yygotominor.yy279.mask = 0x0000ff; } +#line 5332 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for ON */ /* No destructor defined for DELETE */ break; case 65: #line 199 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy83.value = yymsp[0].minor.yy136<<8; yygotominor.yy83.mask = 0x00ff00; } -#line 5211 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy279.value = yymsp[0].minor.yy52<<8; yygotominor.yy279.mask = 0x00ff00; } +#line 5339 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for ON */ /* No destructor defined for UPDATE */ break; case 66: #line 200 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy83.value = yymsp[0].minor.yy136<<16; yygotominor.yy83.mask = 0xff0000; } -#line 5218 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy279.value = yymsp[0].minor.yy52<<16; yygotominor.yy279.mask = 0xff0000; } +#line 5346 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for ON */ /* No destructor defined for INSERT */ break; case 67: #line 202 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = OE_SetNull; } -#line 5225 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy52 = OE_SetNull; } +#line 5353 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for SET */ /* No destructor defined for NULL */ break; case 68: #line 203 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = OE_SetDflt; } -#line 5232 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy52 = OE_SetDflt; } +#line 5360 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for SET */ /* No destructor defined for DEFAULT */ break; case 69: #line 204 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = OE_Cascade; } -#line 5239 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy52 = OE_Cascade; } +#line 5367 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for CASCADE */ break; case 70: #line 205 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = OE_Restrict; } -#line 5245 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy52 = OE_Restrict; } +#line 5373 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for RESTRICT */ break; case 71: #line 207 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = yymsp[0].minor.yy136;} -#line 5251 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy52 = yymsp[0].minor.yy52;} +#line 5379 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for NOT */ /* No destructor defined for DEFERRABLE */ break; case 72: #line 208 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = yymsp[0].minor.yy136;} -#line 5258 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy52 = yymsp[0].minor.yy52;} +#line 5386 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for DEFERRABLE */ break; case 73: #line 210 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = 0;} -#line 5264 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy52 = 0;} +#line 5392 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 74: #line 211 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = 1;} -#line 5269 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy52 = 1;} +#line 5397 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for INITIALLY */ /* No destructor defined for DEFERRED */ break; case 75: #line 212 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = 0;} -#line 5276 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy52 = 0;} +#line 5404 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for INITIALLY */ /* No destructor defined for IMMEDIATE */ break; @@ -5301,8 +5429,8 @@ static void yy_reduce( break; case 82: #line 224 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteAddPrimaryKey(pParse,yymsp[-2].minor.yy268,yymsp[0].minor.yy136);} -#line 5305 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteAddPrimaryKey(pParse,yymsp[-2].minor.yy92,yymsp[0].minor.yy52);} +#line 5433 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for PRIMARY */ /* No destructor defined for KEY */ /* No destructor defined for LP */ @@ -5310,24 +5438,24 @@ static void yy_reduce( break; case 83: #line 226 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteCreateIndex(pParse,0,0,yymsp[-2].minor.yy268,yymsp[0].minor.yy136,0,0);} -#line 5314 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteCreateIndex(pParse,0,0,yymsp[-2].minor.yy92,yymsp[0].minor.yy52,0,0,0);} +#line 5442 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for UNIQUE */ /* No destructor defined for LP */ /* No destructor defined for RP */ break; case 84: /* No destructor defined for CHECK */ - yy_destructor(152,&yymsp[-1].minor); + yy_destructor(157,&yymsp[-1].minor); /* No destructor defined for onconf */ break; case 85: #line 229 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - sqliteCreateForeignKey(pParse, yymsp[-6].minor.yy268, &yymsp[-3].minor.yy324, yymsp[-2].minor.yy268, yymsp[-1].minor.yy136); - sqliteDeferForeignKey(pParse, yymsp[0].minor.yy136); + sqliteCreateForeignKey(pParse, yymsp[-6].minor.yy92, &yymsp[-3].minor.yy210, yymsp[-2].minor.yy92, yymsp[-1].minor.yy52); + sqliteDeferForeignKey(pParse, yymsp[0].minor.yy52); } -#line 5330 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5458 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for FOREIGN */ /* No destructor defined for KEY */ /* No destructor defined for LP */ @@ -5336,1339 +5464,1405 @@ static void yy_reduce( break; case 86: #line 234 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = 0;} -#line 5340 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy52 = 0;} +#line 5468 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 87: #line 235 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = yymsp[0].minor.yy136;} -#line 5345 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy52 = yymsp[0].minor.yy52;} +#line 5473 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 88: #line 243 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = OE_Default; } -#line 5350 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy52 = OE_Default; } +#line 5478 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 89: #line 244 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = yymsp[0].minor.yy136; } -#line 5355 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy52 = yymsp[0].minor.yy52; } +#line 5483 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for ON */ /* No destructor defined for CONFLICT */ break; case 90: #line 245 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = OE_Default; } -#line 5362 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy52 = OE_Default; } +#line 5490 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 91: #line 246 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = yymsp[0].minor.yy136; } -#line 5367 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy52 = yymsp[0].minor.yy52; } +#line 5495 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for OR */ break; case 92: #line 247 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = OE_Rollback; } -#line 5373 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy52 = OE_Rollback; } +#line 5501 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for ROLLBACK */ break; case 93: #line 248 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = OE_Abort; } -#line 5379 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy52 = OE_Abort; } +#line 5507 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for ABORT */ break; case 94: #line 249 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = OE_Fail; } -#line 5385 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy52 = OE_Fail; } +#line 5513 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for FAIL */ break; case 95: #line 250 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = OE_Ignore; } -#line 5391 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy52 = OE_Ignore; } +#line 5519 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for IGNORE */ break; case 96: #line 251 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = OE_Replace; } -#line 5397 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy52 = OE_Replace; } +#line 5525 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for REPLACE */ break; case 97: #line 255 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteDropTable(pParse,&yymsp[0].minor.yy324,0);} -#line 5403 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{sqliteDropTable(pParse,&yymsp[0].minor.yy210,0);} +#line 5531 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for DROP */ /* No destructor defined for TABLE */ break; case 98: #line 259 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - sqliteCreateView(pParse, &yymsp[-5].minor.yy0, &yymsp[-2].minor.yy324, yymsp[0].minor.yy207, yymsp[-4].minor.yy136); + sqliteCreateView(pParse, &yymsp[-5].minor.yy0, &yymsp[-2].minor.yy210, yymsp[0].minor.yy11, yymsp[-4].minor.yy52); } -#line 5412 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5540 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for VIEW */ /* No destructor defined for AS */ break; case 99: #line 262 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - sqliteDropTable(pParse, &yymsp[0].minor.yy324, 1); + sqliteDropTable(pParse, &yymsp[0].minor.yy210, 1); } -#line 5421 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5549 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for DROP */ /* No destructor defined for VIEW */ break; case 100: #line 268 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - sqliteSelect(pParse, yymsp[0].minor.yy207, SRT_Callback, 0, 0, 0, 0); - sqliteSelectDelete(yymsp[0].minor.yy207); + sqliteSelect(pParse, yymsp[0].minor.yy11, SRT_Callback, 0, 0, 0, 0); + sqliteSelectDelete(yymsp[0].minor.yy11); } -#line 5431 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5559 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 101: #line 278 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy207 = yymsp[0].minor.yy207;} -#line 5436 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy11 = yymsp[0].minor.yy11;} +#line 5564 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 102: #line 279 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - if( yymsp[0].minor.yy207 ){ - yymsp[0].minor.yy207->op = yymsp[-1].minor.yy136; - yymsp[0].minor.yy207->pPrior = yymsp[-2].minor.yy207; + if( yymsp[0].minor.yy11 ){ + yymsp[0].minor.yy11->op = yymsp[-1].minor.yy52; + yymsp[0].minor.yy11->pPrior = yymsp[-2].minor.yy11; } - yygotominor.yy207 = yymsp[0].minor.yy207; + yygotominor.yy11 = yymsp[0].minor.yy11; } -#line 5447 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5575 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 103: #line 287 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = TK_UNION;} -#line 5452 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy52 = TK_UNION;} +#line 5580 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for UNION */ break; case 104: #line 288 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = TK_ALL;} -#line 5458 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy52 = TK_ALL;} +#line 5586 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for UNION */ /* No destructor defined for ALL */ break; case 105: #line 289 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = TK_INTERSECT;} -#line 5465 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy52 = TK_INTERSECT;} +#line 5593 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for INTERSECT */ break; case 106: #line 290 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = TK_EXCEPT;} -#line 5471 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy52 = TK_EXCEPT;} +#line 5599 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for EXCEPT */ break; case 107: #line 292 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy207 = sqliteSelectNew(yymsp[-6].minor.yy168,yymsp[-5].minor.yy289,yymsp[-4].minor.yy272,yymsp[-3].minor.yy168,yymsp[-2].minor.yy272,yymsp[-1].minor.yy168,yymsp[-7].minor.yy136,yymsp[0].minor.yy336.limit,yymsp[0].minor.yy336.offset); + yygotominor.yy11 = sqliteSelectNew(yymsp[-6].minor.yy62,yymsp[-5].minor.yy335,yymsp[-4].minor.yy334,yymsp[-3].minor.yy62,yymsp[-2].minor.yy334,yymsp[-1].minor.yy62,yymsp[-7].minor.yy52,yymsp[0].minor.yy280.limit,yymsp[0].minor.yy280.offset); } -#line 5479 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5607 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for SELECT */ break; case 108: #line 300 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = 1;} -#line 5485 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy52 = 1;} +#line 5613 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for DISTINCT */ break; case 109: #line 301 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = 0;} -#line 5491 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy52 = 0;} +#line 5619 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for ALL */ break; case 110: #line 302 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = 0;} -#line 5497 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy52 = 0;} +#line 5625 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 111: #line 313 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy168 = yymsp[-1].minor.yy168;} -#line 5502 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy62 = yymsp[-1].minor.yy62;} +#line 5630 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for COMMA */ break; case 112: #line 314 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy168 = 0;} -#line 5508 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy62 = 0;} +#line 5636 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 113: #line 315 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy168 = sqliteExprListAppend(yymsp[-2].minor.yy168,yymsp[-1].minor.yy272,yymsp[0].minor.yy324.n?&yymsp[0].minor.yy324:0); + yygotominor.yy62 = sqliteExprListAppend(yymsp[-2].minor.yy62,yymsp[-1].minor.yy334,yymsp[0].minor.yy210.n?&yymsp[0].minor.yy210:0); } -#line 5515 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5643 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 114: #line 318 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy168 = sqliteExprListAppend(yymsp[-1].minor.yy168, sqliteExpr(TK_ALL, 0, 0, 0), 0); + yygotominor.yy62 = sqliteExprListAppend(yymsp[-1].minor.yy62, sqliteExpr(TK_ALL, 0, 0, 0), 0); } -#line 5522 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5650 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for STAR */ break; case 115: #line 321 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { Expr *pRight = sqliteExpr(TK_ALL, 0, 0, 0); - Expr *pLeft = sqliteExpr(TK_ID, 0, 0, &yymsp[-2].minor.yy324); - yygotominor.yy168 = sqliteExprListAppend(yymsp[-3].minor.yy168, sqliteExpr(TK_DOT, pLeft, pRight, 0), 0); + Expr *pLeft = sqliteExpr(TK_ID, 0, 0, &yymsp[-2].minor.yy210); + yygotominor.yy62 = sqliteExprListAppend(yymsp[-3].minor.yy62, sqliteExpr(TK_DOT, pLeft, pRight, 0), 0); } -#line 5532 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5660 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for DOT */ /* No destructor defined for STAR */ break; case 116: #line 331 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy324 = yymsp[0].minor.yy324; } -#line 5539 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy210 = yymsp[0].minor.yy210; } +#line 5667 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for AS */ break; case 117: #line 332 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy324 = yymsp[0].minor.yy324; } -#line 5545 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy210 = yymsp[0].minor.yy210; } +#line 5673 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 118: #line 333 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy324.n = 0; } -#line 5550 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{ yygotominor.yy210.n = 0; } +#line 5678 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 119: #line 345 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy289 = sqliteMalloc(sizeof(*yygotominor.yy289));} -#line 5555 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy335 = sqliteMalloc(sizeof(*yygotominor.yy335));} +#line 5683 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 120: #line 346 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy289 = yymsp[0].minor.yy289;} -#line 5560 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy335 = yymsp[0].minor.yy335;} +#line 5688 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for FROM */ break; case 121: #line 351 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy289 = yymsp[-1].minor.yy289; - if( yygotominor.yy289 && yygotominor.yy289->nSrc>0 ) yygotominor.yy289->a[yygotominor.yy289->nSrc-1].jointype = yymsp[0].minor.yy136; + yygotominor.yy335 = yymsp[-1].minor.yy335; + if( yygotominor.yy335 && yygotominor.yy335->nSrc>0 ) yygotominor.yy335->a[yygotominor.yy335->nSrc-1].jointype = yymsp[0].minor.yy52; } -#line 5569 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5697 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 122: #line 355 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy289 = 0;} -#line 5574 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy335 = 0;} +#line 5702 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 123: #line 356 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy289 = sqliteSrcListAppend(yymsp[-4].minor.yy289,&yymsp[-3].minor.yy324); - if( yymsp[-2].minor.yy324.n ) sqliteSrcListAddAlias(yygotominor.yy289,&yymsp[-2].minor.yy324); - if( yymsp[-1].minor.yy272 ){ - if( yygotominor.yy289 && yygotominor.yy289->nSrc>1 ){ yygotominor.yy289->a[yygotominor.yy289->nSrc-2].pOn = yymsp[-1].minor.yy272; } - else { sqliteExprDelete(yymsp[-1].minor.yy272); } + yygotominor.yy335 = sqliteSrcListAppend(yymsp[-5].minor.yy335,&yymsp[-4].minor.yy210,&yymsp[-3].minor.yy210); + if( yymsp[-2].minor.yy210.n ) sqliteSrcListAddAlias(yygotominor.yy335,&yymsp[-2].minor.yy210); + if( yymsp[-1].minor.yy334 ){ + if( yygotominor.yy335 && yygotominor.yy335->nSrc>1 ){ yygotominor.yy335->a[yygotominor.yy335->nSrc-2].pOn = yymsp[-1].minor.yy334; } + else { sqliteExprDelete(yymsp[-1].minor.yy334); } } - if( yymsp[0].minor.yy268 ){ - if( yygotominor.yy289 && yygotominor.yy289->nSrc>1 ){ yygotominor.yy289->a[yygotominor.yy289->nSrc-2].pUsing = yymsp[0].minor.yy268; } - else { sqliteIdListDelete(yymsp[0].minor.yy268); } + if( yymsp[0].minor.yy92 ){ + if( yygotominor.yy335 && yygotominor.yy335->nSrc>1 ){ yygotominor.yy335->a[yygotominor.yy335->nSrc-2].pUsing = yymsp[0].minor.yy92; } + else { sqliteIdListDelete(yymsp[0].minor.yy92); } } } -#line 5590 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5718 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 124: #line 368 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy289 = sqliteSrcListAppend(yymsp[-6].minor.yy289,0); - yygotominor.yy289->a[yygotominor.yy289->nSrc-1].pSelect = yymsp[-4].minor.yy207; - if( yymsp[-2].minor.yy324.n ) sqliteSrcListAddAlias(yygotominor.yy289,&yymsp[-2].minor.yy324); - if( yymsp[-1].minor.yy272 ){ - if( yygotominor.yy289 && yygotominor.yy289->nSrc>1 ){ yygotominor.yy289->a[yygotominor.yy289->nSrc-2].pOn = yymsp[-1].minor.yy272; } - else { sqliteExprDelete(yymsp[-1].minor.yy272); } + yygotominor.yy335 = sqliteSrcListAppend(yymsp[-6].minor.yy335,0,0); + yygotominor.yy335->a[yygotominor.yy335->nSrc-1].pSelect = yymsp[-4].minor.yy11; + if( yymsp[-2].minor.yy210.n ) sqliteSrcListAddAlias(yygotominor.yy335,&yymsp[-2].minor.yy210); + if( yymsp[-1].minor.yy334 ){ + if( yygotominor.yy335 && yygotominor.yy335->nSrc>1 ){ yygotominor.yy335->a[yygotominor.yy335->nSrc-2].pOn = yymsp[-1].minor.yy334; } + else { sqliteExprDelete(yymsp[-1].minor.yy334); } } - if( yymsp[0].minor.yy268 ){ - if( yygotominor.yy289 && yygotominor.yy289->nSrc>1 ){ yygotominor.yy289->a[yygotominor.yy289->nSrc-2].pUsing = yymsp[0].minor.yy268; } - else { sqliteIdListDelete(yymsp[0].minor.yy268); } + if( yymsp[0].minor.yy92 ){ + if( yygotominor.yy335 && yygotominor.yy335->nSrc>1 ){ yygotominor.yy335->a[yygotominor.yy335->nSrc-2].pUsing = yymsp[0].minor.yy92; } + else { sqliteIdListDelete(yymsp[0].minor.yy92); } } } -#line 5607 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5735 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for LP */ /* No destructor defined for RP */ break; case 125: -#line 384 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = JT_INNER; } -#line 5614 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for COMMA */ +#line 383 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy210.z=0; yygotominor.yy210.n=0;} +#line 5742 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 126: -#line 385 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = JT_INNER; } -#line 5620 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for JOIN */ +#line 384 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy210 = yymsp[0].minor.yy210;} +#line 5747 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for DOT */ break; case 127: -#line 386 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = sqliteJoinType(pParse,&yymsp[-1].minor.yy0,0,0); } -#line 5626 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for JOIN */ +#line 388 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy52 = JT_INNER; } +#line 5753 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for COMMA */ break; case 128: -#line 387 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = sqliteJoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy324,0); } -#line 5632 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 389 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy52 = JT_INNER; } +#line 5759 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for JOIN */ break; case 129: -#line 389 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = sqliteJoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy324,&yymsp[-1].minor.yy324); } -#line 5638 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 390 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy52 = sqliteJoinType(pParse,&yymsp[-1].minor.yy0,0,0); } +#line 5765 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for JOIN */ break; case 130: -#line 393 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = yymsp[0].minor.yy272;} -#line 5644 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for ON */ +#line 391 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy52 = sqliteJoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy210,0); } +#line 5771 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for JOIN */ break; case 131: -#line 394 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = 0;} -#line 5650 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 393 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy52 = sqliteJoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy210,&yymsp[-1].minor.yy210); } +#line 5777 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for JOIN */ break; case 132: +#line 397 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = yymsp[0].minor.yy334;} +#line 5783 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for ON */ + break; + case 133: #line 398 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy268 = yymsp[-1].minor.yy268;} -#line 5655 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy334 = 0;} +#line 5789 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + break; + case 134: +#line 402 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy92 = yymsp[-1].minor.yy92;} +#line 5794 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for USING */ /* No destructor defined for LP */ /* No destructor defined for RP */ break; - case 133: -#line 399 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy268 = 0;} -#line 5663 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 135: +#line 403 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy92 = 0;} +#line 5802 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 134: -#line 409 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy168 = 0;} -#line 5668 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 136: +#line 413 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy62 = 0;} +#line 5807 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 135: -#line 410 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy168 = yymsp[0].minor.yy168;} -#line 5673 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 137: +#line 414 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy62 = yymsp[0].minor.yy62;} +#line 5812 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for ORDER */ /* No destructor defined for BY */ break; - case 136: -#line 411 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 138: +#line 415 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy168 = sqliteExprListAppend(yymsp[-4].minor.yy168,yymsp[-2].minor.yy272,0); - if( yygotominor.yy168 ) yygotominor.yy168->a[yygotominor.yy168->nExpr-1].sortOrder = yymsp[-1].minor.yy136+yymsp[0].minor.yy136; + yygotominor.yy62 = sqliteExprListAppend(yymsp[-4].minor.yy62,yymsp[-2].minor.yy334,0); + if( yygotominor.yy62 ) yygotominor.yy62->a[yygotominor.yy62->nExpr-1].sortOrder = yymsp[-1].minor.yy52+yymsp[0].minor.yy52; } -#line 5683 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 5822 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for COMMA */ break; - case 137: -#line 415 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 139: +#line 419 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy168 = sqliteExprListAppend(0,yymsp[-2].minor.yy272,0); - if( yygotominor.yy168 ) yygotominor.yy168->a[0].sortOrder = yymsp[-1].minor.yy136+yymsp[0].minor.yy136; + yygotominor.yy62 = sqliteExprListAppend(0,yymsp[-2].minor.yy334,0); + if( yygotominor.yy62 ) yygotominor.yy62->a[0].sortOrder = yymsp[-1].minor.yy52+yymsp[0].minor.yy52; } -#line 5692 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - break; - case 138: -#line 419 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = yymsp[0].minor.yy272;} -#line 5697 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - break; - case 139: -#line 424 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = SQLITE_SO_ASC;} -#line 5702 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for ASC */ +#line 5831 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 140: -#line 425 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = SQLITE_SO_DESC;} -#line 5708 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for DESC */ +#line 423 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = yymsp[0].minor.yy334;} +#line 5836 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 141: -#line 426 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = SQLITE_SO_ASC;} -#line 5714 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 428 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy52 = SQLITE_SO_ASC;} +#line 5841 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for ASC */ break; case 142: -#line 427 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = SQLITE_SO_UNK;} -#line 5719 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 429 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy52 = SQLITE_SO_DESC;} +#line 5847 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for DESC */ break; case 143: -#line 428 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = sqliteCollateType(yymsp[0].minor.yy324.z, yymsp[0].minor.yy324.n);} -#line 5724 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for COLLATE */ +#line 430 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy52 = SQLITE_SO_ASC;} +#line 5853 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 144: -#line 432 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy168 = 0;} -#line 5730 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 431 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy52 = SQLITE_SO_UNK;} +#line 5858 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 145: -#line 433 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy168 = yymsp[0].minor.yy168;} -#line 5735 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for GROUP */ - /* No destructor defined for BY */ +#line 432 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy52 = sqliteCollateType(yymsp[0].minor.yy210.z, yymsp[0].minor.yy210.n);} +#line 5863 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for COLLATE */ break; case 146: -#line 437 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = 0;} -#line 5742 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 436 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy62 = 0;} +#line 5869 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 147: -#line 438 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = yymsp[0].minor.yy272;} -#line 5747 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for HAVING */ +#line 437 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy62 = yymsp[0].minor.yy62;} +#line 5874 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for GROUP */ + /* No destructor defined for BY */ break; case 148: #line 441 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy336.limit = -1; yygotominor.yy336.offset = 0;} -#line 5753 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy334 = 0;} +#line 5881 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 149: #line 442 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy336.limit = atoi(yymsp[0].minor.yy0.z); yygotominor.yy336.offset = 0;} -#line 5758 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for LIMIT */ +{yygotominor.yy334 = yymsp[0].minor.yy334;} +#line 5886 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for HAVING */ break; case 150: -#line 444 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy336.limit = atoi(yymsp[-2].minor.yy0.z); yygotominor.yy336.offset = atoi(yymsp[0].minor.yy0.z);} -#line 5764 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for LIMIT */ - /* No destructor defined for limit_sep */ +#line 445 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy280.limit = -1; yygotominor.yy280.offset = 0;} +#line 5892 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 151: - /* No destructor defined for OFFSET */ +#line 446 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy280.limit = atoi(yymsp[0].minor.yy0.z); yygotominor.yy280.offset = 0;} +#line 5897 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for LIMIT */ break; case 152: - /* No destructor defined for COMMA */ +#line 448 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy280.limit = atoi(yymsp[-2].minor.yy0.z); yygotominor.yy280.offset = atoi(yymsp[0].minor.yy0.z);} +#line 5903 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for LIMIT */ + /* No destructor defined for OFFSET */ break; case 153: -#line 451 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteDeleteFrom(pParse, &yymsp[-1].minor.yy324, yymsp[0].minor.yy272);} -#line 5777 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for DELETE */ - /* No destructor defined for FROM */ +#line 450 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy280.limit = atoi(yymsp[0].minor.yy0.z); yygotominor.yy280.offset = atoi(yymsp[-2].minor.yy0.z);} +#line 5910 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for LIMIT */ + /* No destructor defined for COMMA */ break; case 154: -#line 456 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = 0;} -#line 5784 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 454 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ + sqliteDeleteFrom(pParse, sqliteSrcListAppend(0,&yymsp[-2].minor.yy210,&yymsp[-1].minor.yy210), yymsp[0].minor.yy334); +} +#line 5919 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for DELETE */ + /* No destructor defined for FROM */ break; case 155: -#line 457 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = yymsp[0].minor.yy272;} -#line 5789 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for WHERE */ +#line 461 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = 0;} +#line 5926 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 156: -#line 465 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteUpdate(pParse,&yymsp[-3].minor.yy324,yymsp[-1].minor.yy168,yymsp[0].minor.yy272,yymsp[-4].minor.yy136);} -#line 5795 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for UPDATE */ - /* No destructor defined for SET */ +#line 462 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = yymsp[0].minor.yy334;} +#line 5931 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for WHERE */ break; case 157: -#line 468 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy168 = sqliteExprListAppend(yymsp[-4].minor.yy168,yymsp[0].minor.yy272,&yymsp[-2].minor.yy324);} -#line 5802 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for COMMA */ - /* No destructor defined for EQ */ +#line 470 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteUpdate(pParse,sqliteSrcListAppend(0,&yymsp[-4].minor.yy210,&yymsp[-3].minor.yy210),yymsp[-1].minor.yy62,yymsp[0].minor.yy334,yymsp[-5].minor.yy52);} +#line 5937 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for UPDATE */ + /* No destructor defined for SET */ break; case 158: -#line 469 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy168 = sqliteExprListAppend(0,yymsp[0].minor.yy272,&yymsp[-2].minor.yy324);} -#line 5809 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 473 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy62 = sqliteExprListAppend(yymsp[-4].minor.yy62,yymsp[0].minor.yy334,&yymsp[-2].minor.yy210);} +#line 5944 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for COMMA */ /* No destructor defined for EQ */ break; case 159: #line 474 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteInsert(pParse, &yymsp[-5].minor.yy324, yymsp[-1].minor.yy168, 0, yymsp[-4].minor.yy268, yymsp[-7].minor.yy136);} -#line 5815 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +{yygotominor.yy62 = sqliteExprListAppend(0,yymsp[0].minor.yy334,&yymsp[-2].minor.yy210);} +#line 5951 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for EQ */ + break; + case 160: +#line 480 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteInsert(pParse, sqliteSrcListAppend(0,&yymsp[-6].minor.yy210,&yymsp[-5].minor.yy210), yymsp[-1].minor.yy62, 0, yymsp[-4].minor.yy92, yymsp[-8].minor.yy52);} +#line 5957 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for INTO */ /* No destructor defined for VALUES */ /* No destructor defined for LP */ /* No destructor defined for RP */ break; - case 160: -#line 476 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteInsert(pParse, &yymsp[-2].minor.yy324, 0, yymsp[0].minor.yy207, yymsp[-1].minor.yy268, yymsp[-4].minor.yy136);} -#line 5824 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for INTO */ - break; case 161: -#line 479 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = yymsp[0].minor.yy136;} -#line 5830 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for INSERT */ +#line 482 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteInsert(pParse, sqliteSrcListAppend(0,&yymsp[-3].minor.yy210,&yymsp[-2].minor.yy210), 0, yymsp[0].minor.yy11, yymsp[-1].minor.yy92, yymsp[-5].minor.yy52);} +#line 5966 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for INTO */ break; case 162: -#line 480 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = OE_Replace;} -#line 5836 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for REPLACE */ +#line 485 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy52 = yymsp[0].minor.yy52;} +#line 5972 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for INSERT */ break; case 163: #line 486 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy168 = sqliteExprListAppend(yymsp[-2].minor.yy168,yymsp[0].minor.yy272,0);} -#line 5842 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for COMMA */ +{yygotominor.yy52 = OE_Replace;} +#line 5978 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for REPLACE */ break; case 164: -#line 487 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy168 = sqliteExprListAppend(0,yymsp[0].minor.yy272,0);} -#line 5848 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 492 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy62 = sqliteExprListAppend(yymsp[-2].minor.yy62,yymsp[0].minor.yy334,0);} +#line 5984 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for COMMA */ break; case 165: -#line 494 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy268 = 0;} -#line 5853 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 493 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy62 = sqliteExprListAppend(0,yymsp[0].minor.yy334,0);} +#line 5990 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 166: -#line 495 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy268 = yymsp[-1].minor.yy268;} -#line 5858 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for LP */ - /* No destructor defined for RP */ +#line 500 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy92 = 0;} +#line 5995 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 167: -#line 496 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy268 = sqliteIdListAppend(yymsp[-2].minor.yy268,&yymsp[0].minor.yy324);} -#line 5865 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for COMMA */ +#line 501 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy92 = yymsp[-1].minor.yy92;} +#line 6000 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for LP */ + /* No destructor defined for RP */ break; case 168: -#line 497 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy268 = sqliteIdListAppend(0,&yymsp[0].minor.yy324);} -#line 5871 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 502 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy92 = sqliteIdListAppend(yymsp[-2].minor.yy92,&yymsp[0].minor.yy210);} +#line 6007 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for COMMA */ break; case 169: -#line 516 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = yymsp[-1].minor.yy272; sqliteExprSpan(yygotominor.yy272,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); } -#line 5876 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 503 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy92 = sqliteIdListAppend(0,&yymsp[0].minor.yy210);} +#line 6013 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 170: -#line 517 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_NULL, 0, 0, &yymsp[0].minor.yy0);} -#line 5881 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 522 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = yymsp[-1].minor.yy334; sqliteExprSpan(yygotominor.yy334,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); } +#line 6018 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 171: -#line 518 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_ID, 0, 0, &yymsp[0].minor.yy0);} -#line 5886 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 523 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_NULL, 0, 0, &yymsp[0].minor.yy0);} +#line 6023 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 172: -#line 519 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_ID, 0, 0, &yymsp[0].minor.yy0);} -#line 5891 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 524 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_ID, 0, 0, &yymsp[0].minor.yy0);} +#line 6028 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 173: -#line 520 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ - Expr *temp1 = sqliteExpr(TK_ID, 0, 0, &yymsp[-2].minor.yy324); - Expr *temp2 = sqliteExpr(TK_ID, 0, 0, &yymsp[0].minor.yy324); - yygotominor.yy272 = sqliteExpr(TK_DOT, temp1, temp2, 0); -} -#line 5900 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for DOT */ +#line 525 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_ID, 0, 0, &yymsp[0].minor.yy0);} +#line 6033 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 174: #line 526 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = yymsp[-1].minor.yy272; ExprSetProperty(yygotominor.yy272,EP_Oracle8Join);} -#line 5906 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for ORACLE_OUTER_JOIN */ +{ + Expr *temp1 = sqliteExpr(TK_ID, 0, 0, &yymsp[-2].minor.yy210); + Expr *temp2 = sqliteExpr(TK_ID, 0, 0, &yymsp[0].minor.yy210); + yygotominor.yy334 = sqliteExpr(TK_DOT, temp1, temp2, 0); +} +#line 6042 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for DOT */ break; case 175: -#line 527 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_INTEGER, 0, 0, &yymsp[0].minor.yy0);} -#line 5912 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 531 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ + Expr *temp1 = sqliteExpr(TK_ID, 0, 0, &yymsp[-4].minor.yy210); + Expr *temp2 = sqliteExpr(TK_ID, 0, 0, &yymsp[-2].minor.yy210); + Expr *temp3 = sqliteExpr(TK_ID, 0, 0, &yymsp[0].minor.yy210); + Expr *temp4 = sqliteExpr(TK_DOT, temp2, temp3, 0); + yygotominor.yy334 = sqliteExpr(TK_DOT, temp1, temp4, 0); +} +#line 6054 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for DOT */ + /* No destructor defined for DOT */ break; case 176: -#line 528 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_FLOAT, 0, 0, &yymsp[0].minor.yy0);} -#line 5917 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 539 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = yymsp[-1].minor.yy334; ExprSetProperty(yygotominor.yy334,EP_Oracle8Join);} +#line 6061 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for ORACLE_OUTER_JOIN */ break; case 177: -#line 529 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_STRING, 0, 0, &yymsp[0].minor.yy0);} -#line 5922 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 540 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_INTEGER, 0, 0, &yymsp[0].minor.yy0);} +#line 6067 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 178: -#line 530 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +#line 541 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_FLOAT, 0, 0, &yymsp[0].minor.yy0);} +#line 6072 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + break; + case 179: +#line 542 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_STRING, 0, 0, &yymsp[0].minor.yy0);} +#line 6077 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + break; + case 180: +#line 543 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExprFunction(yymsp[-1].minor.yy168, &yymsp[-3].minor.yy0); - sqliteExprSpan(yygotominor.yy272,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); + yygotominor.yy334 = sqliteExprFunction(yymsp[-1].minor.yy62, &yymsp[-3].minor.yy0); + sqliteExprSpan(yygotominor.yy334,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); } -#line 5930 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6085 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for LP */ break; - case 179: -#line 534 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 181: +#line 547 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExprFunction(0, &yymsp[-3].minor.yy0); - sqliteExprSpan(yygotominor.yy272,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); + yygotominor.yy334 = sqliteExprFunction(0, &yymsp[-3].minor.yy0); + sqliteExprSpan(yygotominor.yy334,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); } -#line 5939 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6094 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for LP */ /* No destructor defined for STAR */ break; - case 180: -#line 538 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_AND, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 5946 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 182: +#line 551 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_AND, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6101 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for AND */ break; - case 181: -#line 539 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_OR, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 5952 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 183: +#line 552 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_OR, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6107 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for OR */ break; - case 182: -#line 540 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_LT, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 5958 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 184: +#line 553 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_LT, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6113 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for LT */ break; - case 183: -#line 541 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_GT, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 5964 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 185: +#line 554 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_GT, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6119 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for GT */ break; - case 184: -#line 542 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_LE, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 5970 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 186: +#line 555 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_LE, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6125 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for LE */ break; - case 185: -#line 543 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_GE, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 5976 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 187: +#line 556 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_GE, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6131 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for GE */ break; - case 186: -#line 544 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_NE, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 5982 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 188: +#line 557 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_NE, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6137 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for NE */ break; - case 187: -#line 545 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_EQ, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 5988 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 189: +#line 558 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_EQ, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6143 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for EQ */ break; - case 188: -#line 546 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_BITAND, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 5994 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 190: +#line 559 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_BITAND, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6149 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for BITAND */ break; - case 189: -#line 547 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_BITOR, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 6000 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 191: +#line 560 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_BITOR, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6155 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for BITOR */ break; - case 190: -#line 548 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_LSHIFT, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 6006 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 192: +#line 561 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_LSHIFT, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6161 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for LSHIFT */ break; - case 191: -#line 549 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_RSHIFT, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 6012 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 193: +#line 562 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_RSHIFT, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6167 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for RSHIFT */ break; - case 192: -#line 550 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 194: +#line 563 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - ExprList *pList = sqliteExprListAppend(0, yymsp[0].minor.yy272, 0); - pList = sqliteExprListAppend(pList, yymsp[-2].minor.yy272, 0); - yygotominor.yy272 = sqliteExprFunction(pList, 0); - if( yygotominor.yy272 ) yygotominor.yy272->op = yymsp[-1].minor.yy136; - sqliteExprSpan(yygotominor.yy272, &yymsp[-2].minor.yy272->span, &yymsp[0].minor.yy272->span); + ExprList *pList = sqliteExprListAppend(0, yymsp[0].minor.yy334, 0); + pList = sqliteExprListAppend(pList, yymsp[-2].minor.yy334, 0); + yygotominor.yy334 = sqliteExprFunction(pList, 0); + if( yygotominor.yy334 ) yygotominor.yy334->op = yymsp[-1].minor.yy52; + sqliteExprSpan(yygotominor.yy334, &yymsp[-2].minor.yy334->span, &yymsp[0].minor.yy334->span); } -#line 6024 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6179 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 193: -#line 557 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 195: +#line 570 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - ExprList *pList = sqliteExprListAppend(0, yymsp[0].minor.yy272, 0); - pList = sqliteExprListAppend(pList, yymsp[-3].minor.yy272, 0); - yygotominor.yy272 = sqliteExprFunction(pList, 0); - if( yygotominor.yy272 ) yygotominor.yy272->op = yymsp[-1].minor.yy136; - yygotominor.yy272 = sqliteExpr(TK_NOT, yygotominor.yy272, 0, 0); - sqliteExprSpan(yygotominor.yy272,&yymsp[-3].minor.yy272->span,&yymsp[0].minor.yy272->span); + ExprList *pList = sqliteExprListAppend(0, yymsp[0].minor.yy334, 0); + pList = sqliteExprListAppend(pList, yymsp[-3].minor.yy334, 0); + yygotominor.yy334 = sqliteExprFunction(pList, 0); + if( yygotominor.yy334 ) yygotominor.yy334->op = yymsp[-1].minor.yy52; + yygotominor.yy334 = sqliteExpr(TK_NOT, yygotominor.yy334, 0, 0); + sqliteExprSpan(yygotominor.yy334,&yymsp[-3].minor.yy334->span,&yymsp[0].minor.yy334->span); } -#line 6036 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6191 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for NOT */ break; - case 194: -#line 566 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = TK_LIKE;} -#line 6042 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 196: +#line 579 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy52 = TK_LIKE;} +#line 6197 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for LIKE */ break; - case 195: -#line 567 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy136 = TK_GLOB;} -#line 6048 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 197: +#line 580 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy52 = TK_GLOB;} +#line 6203 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for GLOB */ break; - case 196: -#line 568 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_PLUS, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 6054 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 198: +#line 581 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_PLUS, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6209 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for PLUS */ break; - case 197: -#line 569 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_MINUS, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 6060 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 199: +#line 582 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_MINUS, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6215 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for MINUS */ break; - case 198: -#line 570 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_STAR, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 6066 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 200: +#line 583 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_STAR, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6221 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for STAR */ break; - case 199: -#line 571 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_SLASH, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 6072 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 201: +#line 584 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_SLASH, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6227 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for SLASH */ break; - case 200: -#line 572 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_REM, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 6078 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 202: +#line 585 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_REM, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6233 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for REM */ break; - case 201: -#line 573 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = sqliteExpr(TK_CONCAT, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, 0);} -#line 6084 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 203: +#line 586 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = sqliteExpr(TK_CONCAT, yymsp[-2].minor.yy334, yymsp[0].minor.yy334, 0);} +#line 6239 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for CONCAT */ break; - case 202: -#line 574 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 204: +#line 587 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_ISNULL, yymsp[-1].minor.yy272, 0, 0); - sqliteExprSpan(yygotominor.yy272,&yymsp[-1].minor.yy272->span,&yymsp[0].minor.yy0); + yygotominor.yy334 = sqliteExpr(TK_ISNULL, yymsp[-1].minor.yy334, 0, 0); + sqliteExprSpan(yygotominor.yy334,&yymsp[-1].minor.yy334->span,&yymsp[0].minor.yy0); } -#line 6093 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6248 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 203: -#line 578 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 205: +#line 591 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_ISNULL, yymsp[-2].minor.yy272, 0, 0); - sqliteExprSpan(yygotominor.yy272,&yymsp[-2].minor.yy272->span,&yymsp[0].minor.yy0); + yygotominor.yy334 = sqliteExpr(TK_ISNULL, yymsp[-2].minor.yy334, 0, 0); + sqliteExprSpan(yygotominor.yy334,&yymsp[-2].minor.yy334->span,&yymsp[0].minor.yy0); } -#line 6101 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6256 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for IS */ break; - case 204: -#line 582 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 206: +#line 595 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_NOTNULL, yymsp[-1].minor.yy272, 0, 0); - sqliteExprSpan(yygotominor.yy272,&yymsp[-1].minor.yy272->span,&yymsp[0].minor.yy0); + yygotominor.yy334 = sqliteExpr(TK_NOTNULL, yymsp[-1].minor.yy334, 0, 0); + sqliteExprSpan(yygotominor.yy334,&yymsp[-1].minor.yy334->span,&yymsp[0].minor.yy0); } -#line 6110 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6265 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 205: -#line 586 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 207: +#line 599 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_NOTNULL, yymsp[-2].minor.yy272, 0, 0); - sqliteExprSpan(yygotominor.yy272,&yymsp[-2].minor.yy272->span,&yymsp[0].minor.yy0); + yygotominor.yy334 = sqliteExpr(TK_NOTNULL, yymsp[-2].minor.yy334, 0, 0); + sqliteExprSpan(yygotominor.yy334,&yymsp[-2].minor.yy334->span,&yymsp[0].minor.yy0); } -#line 6118 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6273 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for NOT */ break; - case 206: -#line 590 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 208: +#line 603 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_NOTNULL, yymsp[-3].minor.yy272, 0, 0); - sqliteExprSpan(yygotominor.yy272,&yymsp[-3].minor.yy272->span,&yymsp[0].minor.yy0); + yygotominor.yy334 = sqliteExpr(TK_NOTNULL, yymsp[-3].minor.yy334, 0, 0); + sqliteExprSpan(yygotominor.yy334,&yymsp[-3].minor.yy334->span,&yymsp[0].minor.yy0); } -#line 6127 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6282 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for IS */ /* No destructor defined for NOT */ break; - case 207: -#line 594 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 209: +#line 607 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_NOT, yymsp[0].minor.yy272, 0, 0); - sqliteExprSpan(yygotominor.yy272,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy272->span); + yygotominor.yy334 = sqliteExpr(TK_NOT, yymsp[0].minor.yy334, 0, 0); + sqliteExprSpan(yygotominor.yy334,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy334->span); } -#line 6137 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6292 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 208: -#line 598 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 210: +#line 611 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_BITNOT, yymsp[0].minor.yy272, 0, 0); - sqliteExprSpan(yygotominor.yy272,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy272->span); + yygotominor.yy334 = sqliteExpr(TK_BITNOT, yymsp[0].minor.yy334, 0, 0); + sqliteExprSpan(yygotominor.yy334,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy334->span); } -#line 6145 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6300 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 209: -#line 602 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 211: +#line 615 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_UMINUS, yymsp[0].minor.yy272, 0, 0); - sqliteExprSpan(yygotominor.yy272,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy272->span); + yygotominor.yy334 = sqliteExpr(TK_UMINUS, yymsp[0].minor.yy334, 0, 0); + sqliteExprSpan(yygotominor.yy334,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy334->span); } -#line 6153 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6308 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 210: -#line 606 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 212: +#line 619 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_UPLUS, yymsp[0].minor.yy272, 0, 0); - sqliteExprSpan(yygotominor.yy272,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy272->span); + yygotominor.yy334 = sqliteExpr(TK_UPLUS, yymsp[0].minor.yy334, 0, 0); + sqliteExprSpan(yygotominor.yy334,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy334->span); } -#line 6161 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6316 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 211: -#line 610 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 213: +#line 623 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_SELECT, 0, 0, 0); - if( yygotominor.yy272 ) yygotominor.yy272->pSelect = yymsp[-1].minor.yy207; - sqliteExprSpan(yygotominor.yy272,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); + yygotominor.yy334 = sqliteExpr(TK_SELECT, 0, 0, 0); + if( yygotominor.yy334 ) yygotominor.yy334->pSelect = yymsp[-1].minor.yy11; + sqliteExprSpan(yygotominor.yy334,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); } -#line 6170 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6325 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 212: -#line 615 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 214: +#line 628 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - ExprList *pList = sqliteExprListAppend(0, yymsp[-2].minor.yy272, 0); - pList = sqliteExprListAppend(pList, yymsp[0].minor.yy272, 0); - yygotominor.yy272 = sqliteExpr(TK_BETWEEN, yymsp[-4].minor.yy272, 0, 0); - if( yygotominor.yy272 ) yygotominor.yy272->pList = pList; - sqliteExprSpan(yygotominor.yy272,&yymsp[-4].minor.yy272->span,&yymsp[0].minor.yy272->span); + ExprList *pList = sqliteExprListAppend(0, yymsp[-2].minor.yy334, 0); + pList = sqliteExprListAppend(pList, yymsp[0].minor.yy334, 0); + yygotominor.yy334 = sqliteExpr(TK_BETWEEN, yymsp[-4].minor.yy334, 0, 0); + if( yygotominor.yy334 ) yygotominor.yy334->pList = pList; + sqliteExprSpan(yygotominor.yy334,&yymsp[-4].minor.yy334->span,&yymsp[0].minor.yy334->span); } -#line 6181 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6336 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for BETWEEN */ /* No destructor defined for AND */ break; - case 213: -#line 622 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 215: +#line 635 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - ExprList *pList = sqliteExprListAppend(0, yymsp[-2].minor.yy272, 0); - pList = sqliteExprListAppend(pList, yymsp[0].minor.yy272, 0); - yygotominor.yy272 = sqliteExpr(TK_BETWEEN, yymsp[-5].minor.yy272, 0, 0); - if( yygotominor.yy272 ) yygotominor.yy272->pList = pList; - yygotominor.yy272 = sqliteExpr(TK_NOT, yygotominor.yy272, 0, 0); - sqliteExprSpan(yygotominor.yy272,&yymsp[-5].minor.yy272->span,&yymsp[0].minor.yy272->span); + ExprList *pList = sqliteExprListAppend(0, yymsp[-2].minor.yy334, 0); + pList = sqliteExprListAppend(pList, yymsp[0].minor.yy334, 0); + yygotominor.yy334 = sqliteExpr(TK_BETWEEN, yymsp[-5].minor.yy334, 0, 0); + if( yygotominor.yy334 ) yygotominor.yy334->pList = pList; + yygotominor.yy334 = sqliteExpr(TK_NOT, yygotominor.yy334, 0, 0); + sqliteExprSpan(yygotominor.yy334,&yymsp[-5].minor.yy334->span,&yymsp[0].minor.yy334->span); } -#line 6195 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6350 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for NOT */ /* No destructor defined for BETWEEN */ /* No destructor defined for AND */ break; - case 214: -#line 630 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 216: +#line 643 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_IN, yymsp[-4].minor.yy272, 0, 0); - if( yygotominor.yy272 ) yygotominor.yy272->pList = yymsp[-1].minor.yy168; - sqliteExprSpan(yygotominor.yy272,&yymsp[-4].minor.yy272->span,&yymsp[0].minor.yy0); + yygotominor.yy334 = sqliteExpr(TK_IN, yymsp[-4].minor.yy334, 0, 0); + if( yygotominor.yy334 ) yygotominor.yy334->pList = yymsp[-1].minor.yy62; + sqliteExprSpan(yygotominor.yy334,&yymsp[-4].minor.yy334->span,&yymsp[0].minor.yy0); } -#line 6207 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6362 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for IN */ /* No destructor defined for LP */ break; - case 215: -#line 635 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 217: +#line 648 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_IN, yymsp[-4].minor.yy272, 0, 0); - if( yygotominor.yy272 ) yygotominor.yy272->pSelect = yymsp[-1].minor.yy207; - sqliteExprSpan(yygotominor.yy272,&yymsp[-4].minor.yy272->span,&yymsp[0].minor.yy0); + yygotominor.yy334 = sqliteExpr(TK_IN, yymsp[-4].minor.yy334, 0, 0); + if( yygotominor.yy334 ) yygotominor.yy334->pSelect = yymsp[-1].minor.yy11; + sqliteExprSpan(yygotominor.yy334,&yymsp[-4].minor.yy334->span,&yymsp[0].minor.yy0); } -#line 6218 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6373 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for IN */ /* No destructor defined for LP */ break; - case 216: -#line 640 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 218: +#line 653 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_IN, yymsp[-5].minor.yy272, 0, 0); - if( yygotominor.yy272 ) yygotominor.yy272->pList = yymsp[-1].minor.yy168; - yygotominor.yy272 = sqliteExpr(TK_NOT, yygotominor.yy272, 0, 0); - sqliteExprSpan(yygotominor.yy272,&yymsp[-5].minor.yy272->span,&yymsp[0].minor.yy0); + yygotominor.yy334 = sqliteExpr(TK_IN, yymsp[-5].minor.yy334, 0, 0); + if( yygotominor.yy334 ) yygotominor.yy334->pList = yymsp[-1].minor.yy62; + yygotominor.yy334 = sqliteExpr(TK_NOT, yygotominor.yy334, 0, 0); + sqliteExprSpan(yygotominor.yy334,&yymsp[-5].minor.yy334->span,&yymsp[0].minor.yy0); } -#line 6230 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6385 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for NOT */ /* No destructor defined for IN */ /* No destructor defined for LP */ break; - case 217: -#line 646 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 219: +#line 659 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_IN, yymsp[-5].minor.yy272, 0, 0); - if( yygotominor.yy272 ) yygotominor.yy272->pSelect = yymsp[-1].minor.yy207; - yygotominor.yy272 = sqliteExpr(TK_NOT, yygotominor.yy272, 0, 0); - sqliteExprSpan(yygotominor.yy272,&yymsp[-5].minor.yy272->span,&yymsp[0].minor.yy0); + yygotominor.yy334 = sqliteExpr(TK_IN, yymsp[-5].minor.yy334, 0, 0); + if( yygotominor.yy334 ) yygotominor.yy334->pSelect = yymsp[-1].minor.yy11; + yygotominor.yy334 = sqliteExpr(TK_NOT, yygotominor.yy334, 0, 0); + sqliteExprSpan(yygotominor.yy334,&yymsp[-5].minor.yy334->span,&yymsp[0].minor.yy0); } -#line 6243 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6398 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for NOT */ /* No destructor defined for IN */ /* No destructor defined for LP */ break; - case 218: -#line 654 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 220: +#line 667 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_CASE, yymsp[-3].minor.yy272, yymsp[-1].minor.yy272, 0); - if( yygotominor.yy272 ) yygotominor.yy272->pList = yymsp[-2].minor.yy168; - sqliteExprSpan(yygotominor.yy272, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0); + yygotominor.yy334 = sqliteExpr(TK_CASE, yymsp[-3].minor.yy334, yymsp[-1].minor.yy334, 0); + if( yygotominor.yy334 ) yygotominor.yy334->pList = yymsp[-2].minor.yy62; + sqliteExprSpan(yygotominor.yy334, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0); } -#line 6255 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6410 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 219: -#line 661 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 221: +#line 674 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy168 = sqliteExprListAppend(yymsp[-4].minor.yy168, yymsp[-2].minor.yy272, 0); - yygotominor.yy168 = sqliteExprListAppend(yygotominor.yy168, yymsp[0].minor.yy272, 0); + yygotominor.yy62 = sqliteExprListAppend(yymsp[-4].minor.yy62, yymsp[-2].minor.yy334, 0); + yygotominor.yy62 = sqliteExprListAppend(yygotominor.yy62, yymsp[0].minor.yy334, 0); } -#line 6263 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6418 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for WHEN */ /* No destructor defined for THEN */ break; - case 220: -#line 665 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 222: +#line 678 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy168 = sqliteExprListAppend(0, yymsp[-2].minor.yy272, 0); - yygotominor.yy168 = sqliteExprListAppend(yygotominor.yy168, yymsp[0].minor.yy272, 0); + yygotominor.yy62 = sqliteExprListAppend(0, yymsp[-2].minor.yy334, 0); + yygotominor.yy62 = sqliteExprListAppend(yygotominor.yy62, yymsp[0].minor.yy334, 0); } -#line 6273 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6428 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for WHEN */ /* No destructor defined for THEN */ break; - case 221: -#line 670 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = yymsp[0].minor.yy272;} -#line 6280 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for ELSE */ - break; - case 222: -#line 671 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = 0;} -#line 6286 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - break; case 223: -#line 673 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = yymsp[0].minor.yy272;} -#line 6291 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 683 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = yymsp[0].minor.yy334;} +#line 6435 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for ELSE */ break; case 224: -#line 674 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = 0;} -#line 6296 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 684 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = 0;} +#line 6441 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 225: -#line 682 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy168 = sqliteExprListAppend(yymsp[-2].minor.yy168,yymsp[0].minor.yy272,0);} -#line 6301 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for COMMA */ +#line 686 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = yymsp[0].minor.yy334;} +#line 6446 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 226: -#line 683 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy168 = sqliteExprListAppend(0,yymsp[0].minor.yy272,0);} -#line 6307 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 687 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = 0;} +#line 6451 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 227: -#line 684 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = yymsp[0].minor.yy272;} -#line 6312 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 695 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy62 = sqliteExprListAppend(yymsp[-2].minor.yy62,yymsp[0].minor.yy334,0);} +#line 6456 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for COMMA */ break; case 228: -#line 685 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy272 = 0;} -#line 6317 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 696 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy62 = sqliteExprListAppend(0,yymsp[0].minor.yy334,0);} +#line 6462 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 229: -#line 690 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +#line 697 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = yymsp[0].minor.yy334;} +#line 6467 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + break; + case 230: +#line 698 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy334 = 0;} +#line 6472 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + break; + case 231: +#line 703 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - if( yymsp[-8].minor.yy136!=OE_None ) yymsp[-8].minor.yy136 = yymsp[0].minor.yy136; - if( yymsp[-8].minor.yy136==OE_Default) yymsp[-8].minor.yy136 = OE_Abort; - sqliteCreateIndex(pParse, &yymsp[-6].minor.yy324, &yymsp[-4].minor.yy324, yymsp[-2].minor.yy268, yymsp[-8].minor.yy136, &yymsp[-9].minor.yy0, &yymsp[-1].minor.yy0); + SrcList *pSrc = sqliteSrcListAppend(0, &yymsp[-5].minor.yy210, &yymsp[-4].minor.yy210); + if( yymsp[-9].minor.yy52!=OE_None ) yymsp[-9].minor.yy52 = yymsp[0].minor.yy52; + if( yymsp[-9].minor.yy52==OE_Default) yymsp[-9].minor.yy52 = OE_Abort; + sqliteCreateIndex(pParse, &yymsp[-7].minor.yy210, pSrc, yymsp[-2].minor.yy92, yymsp[-9].minor.yy52, yymsp[-10].minor.yy52, &yymsp[-11].minor.yy0, &yymsp[-1].minor.yy0); } -#line 6326 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6482 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for INDEX */ /* No destructor defined for ON */ /* No destructor defined for LP */ break; - case 230: -#line 697 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = OE_Abort; } -#line 6334 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for UNIQUE */ - break; - case 231: -#line 698 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = OE_None; } -#line 6340 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - break; case 232: -#line 706 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy268 = 0;} -#line 6345 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 711 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy52 = OE_Abort; } +#line 6490 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for UNIQUE */ break; case 233: -#line 707 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy268 = yymsp[-1].minor.yy268;} -#line 6350 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for LP */ - /* No destructor defined for RP */ +#line 712 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy52 = OE_None; } +#line 6496 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 234: -#line 708 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy268 = sqliteIdListAppend(yymsp[-2].minor.yy268,&yymsp[0].minor.yy324);} -#line 6357 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for COMMA */ +#line 720 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy92 = 0;} +#line 6501 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 235: -#line 709 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy268 = sqliteIdListAppend(0,&yymsp[0].minor.yy324);} -#line 6363 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 721 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy92 = yymsp[-1].minor.yy92;} +#line 6506 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for LP */ + /* No destructor defined for RP */ break; case 236: -#line 710 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy324 = yymsp[0].minor.yy324;} -#line 6368 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 722 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy92 = sqliteIdListAppend(yymsp[-2].minor.yy92,&yymsp[0].minor.yy210);} +#line 6513 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for COMMA */ break; case 237: -#line 715 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteDropIndex(pParse, &yymsp[0].minor.yy324);} -#line 6373 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 723 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy92 = sqliteIdListAppend(0,&yymsp[0].minor.yy210);} +#line 6519 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + break; + case 238: +#line 724 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy210 = yymsp[-1].minor.yy210;} +#line 6524 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for sortorder */ + break; + case 239: +#line 729 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ + sqliteDropIndex(pParse, sqliteSrcListAppend(0,&yymsp[-1].minor.yy210,&yymsp[0].minor.yy210)); +} +#line 6532 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for DROP */ /* No destructor defined for INDEX */ break; - case 238: -#line 721 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteCopy(pParse,&yymsp[-5].minor.yy324,&yymsp[-3].minor.yy324,&yymsp[0].minor.yy0,yymsp[-6].minor.yy136);} -#line 6380 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 240: +#line 737 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteCopy(pParse,sqliteSrcListAppend(0,&yymsp[-6].minor.yy210,&yymsp[-5].minor.yy210),&yymsp[-3].minor.yy210,&yymsp[0].minor.yy0,yymsp[-7].minor.yy52);} +#line 6539 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for COPY */ /* No destructor defined for FROM */ /* No destructor defined for USING */ /* No destructor defined for DELIMITERS */ break; - case 239: -#line 723 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteCopy(pParse,&yymsp[-2].minor.yy324,&yymsp[0].minor.yy324,0,yymsp[-3].minor.yy136);} -#line 6389 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 241: +#line 739 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteCopy(pParse,sqliteSrcListAppend(0,&yymsp[-3].minor.yy210,&yymsp[-2].minor.yy210),&yymsp[0].minor.yy210,0,yymsp[-4].minor.yy52);} +#line 6548 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for COPY */ /* No destructor defined for FROM */ break; - case 240: -#line 727 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 242: +#line 743 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" {sqliteVacuum(pParse,0);} -#line 6396 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for VACUUM */ - break; - case 241: -#line 728 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqliteVacuum(pParse,&yymsp[0].minor.yy324);} -#line 6402 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6555 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for VACUUM */ break; - case 242: -#line 732 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqlitePragma(pParse,&yymsp[-2].minor.yy324,&yymsp[0].minor.yy324,0);} -#line 6408 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for PRAGMA */ - /* No destructor defined for EQ */ - break; case 243: -#line 733 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqlitePragma(pParse,&yymsp[-2].minor.yy324,&yymsp[0].minor.yy0,0);} -#line 6415 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for PRAGMA */ - /* No destructor defined for EQ */ +#line 744 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqliteVacuum(pParse,&yymsp[0].minor.yy210);} +#line 6561 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for VACUUM */ break; case 244: -#line 734 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqlitePragma(pParse,&yymsp[-2].minor.yy324,&yymsp[0].minor.yy324,0);} -#line 6422 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 748 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqlitePragma(pParse,&yymsp[-2].minor.yy210,&yymsp[0].minor.yy210,0);} +#line 6567 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for PRAGMA */ /* No destructor defined for EQ */ break; case 245: -#line 735 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqlitePragma(pParse,&yymsp[-2].minor.yy324,&yymsp[0].minor.yy324,1);} -#line 6429 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 749 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqlitePragma(pParse,&yymsp[-2].minor.yy210,&yymsp[0].minor.yy0,0);} +#line 6574 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for PRAGMA */ /* No destructor defined for EQ */ break; case 246: -#line 736 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqlitePragma(pParse,&yymsp[-3].minor.yy324,&yymsp[-1].minor.yy324,0);} -#line 6436 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 750 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqlitePragma(pParse,&yymsp[-2].minor.yy210,&yymsp[0].minor.yy210,0);} +#line 6581 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for PRAGMA */ - /* No destructor defined for LP */ - /* No destructor defined for RP */ + /* No destructor defined for EQ */ break; case 247: -#line 737 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{sqlitePragma(pParse,&yymsp[0].minor.yy324,&yymsp[0].minor.yy324,0);} -#line 6444 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 751 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqlitePragma(pParse,&yymsp[-2].minor.yy210,&yymsp[0].minor.yy210,1);} +#line 6588 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for PRAGMA */ + /* No destructor defined for EQ */ break; case 248: -#line 738 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy324 = yymsp[0].minor.yy324;} -#line 6450 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for plus_opt */ +#line 752 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqlitePragma(pParse,&yymsp[-3].minor.yy210,&yymsp[-1].minor.yy210,0);} +#line 6595 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for PRAGMA */ + /* No destructor defined for LP */ + /* No destructor defined for RP */ break; case 249: -#line 739 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy324 = yymsp[0].minor.yy324;} -#line 6456 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" - /* No destructor defined for MINUS */ +#line 753 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{sqlitePragma(pParse,&yymsp[0].minor.yy210,&yymsp[0].minor.yy210,0);} +#line 6603 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for PRAGMA */ break; case 250: -#line 740 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy324 = yymsp[0].minor.yy0;} -#line 6462 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 754 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy210 = yymsp[0].minor.yy210;} +#line 6609 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for plus_opt */ break; case 251: -#line 741 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy324 = yymsp[0].minor.yy0;} -#line 6467 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 755 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy210 = yymsp[0].minor.yy210;} +#line 6615 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for MINUS */ break; case 252: - /* No destructor defined for PLUS */ +#line 756 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy210 = yymsp[0].minor.yy0;} +#line 6621 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 253: +#line 757 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy210 = yymsp[0].minor.yy0;} +#line 6626 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; case 254: -#line 748 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + /* No destructor defined for PLUS */ + break; + case 255: + break; + case 256: +#line 763 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { Token all; - all.z = yymsp[-11].minor.yy0.z; - all.n = (yymsp[0].minor.yy0.z - yymsp[-11].minor.yy0.z) + yymsp[0].minor.yy0.n; - sqliteCreateTrigger(pParse, &yymsp[-9].minor.yy324, yymsp[-8].minor.yy136, yymsp[-7].minor.yy72.a, yymsp[-7].minor.yy72.b, &yymsp[-5].minor.yy324, yymsp[-4].minor.yy136, yymsp[-3].minor.yy176, yymsp[-1].minor.yy209, &all); + all.z = yymsp[-4].minor.yy0.z; + all.n = (yymsp[0].minor.yy0.z - yymsp[-4].minor.yy0.z) + yymsp[0].minor.yy0.n; + sqliteFinishTrigger(pParse, yymsp[-1].minor.yy347, &all); } -#line 6482 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6641 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for trigger_decl */ + /* No destructor defined for BEGIN */ + break; + case 257: +#line 771 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ + SrcList *pTab = sqliteSrcListAppend(0, &yymsp[-3].minor.yy210, &yymsp[-2].minor.yy210); + sqliteBeginTrigger(pParse, &yymsp[-7].minor.yy210, yymsp[-6].minor.yy52, yymsp[-5].minor.yy234.a, yymsp[-5].minor.yy234.b, pTab, yymsp[-1].minor.yy52, yymsp[0].minor.yy270, yymsp[-9].minor.yy52); +} +#line 6651 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for TRIGGER */ /* No destructor defined for ON */ - /* No destructor defined for BEGIN */ break; - case 255: -#line 756 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = TK_BEFORE; } -#line 6490 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 258: +#line 777 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy52 = TK_BEFORE; } +#line 6658 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for BEFORE */ break; - case 256: -#line 757 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = TK_AFTER; } -#line 6496 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 259: +#line 778 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy52 = TK_AFTER; } +#line 6664 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for AFTER */ break; - case 257: -#line 758 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = TK_INSTEAD;} -#line 6502 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 260: +#line 779 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy52 = TK_INSTEAD;} +#line 6670 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for INSTEAD */ /* No destructor defined for OF */ break; - case 258: -#line 759 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = TK_BEFORE; } -#line 6509 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 261: +#line 780 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy52 = TK_BEFORE; } +#line 6677 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 259: -#line 763 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy72.a = TK_DELETE; yygotominor.yy72.b = 0; } -#line 6514 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 262: +#line 784 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy234.a = TK_DELETE; yygotominor.yy234.b = 0; } +#line 6682 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for DELETE */ break; - case 260: -#line 764 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy72.a = TK_INSERT; yygotominor.yy72.b = 0; } -#line 6520 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 263: +#line 785 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy234.a = TK_INSERT; yygotominor.yy234.b = 0; } +#line 6688 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for INSERT */ break; - case 261: -#line 765 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy72.a = TK_UPDATE; yygotominor.yy72.b = 0;} -#line 6526 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 264: +#line 786 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy234.a = TK_UPDATE; yygotominor.yy234.b = 0;} +#line 6694 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for UPDATE */ break; - case 262: -#line 766 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy72.a = TK_UPDATE; yygotominor.yy72.b = yymsp[0].minor.yy268; } -#line 6532 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 265: +#line 787 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy234.a = TK_UPDATE; yygotominor.yy234.b = yymsp[0].minor.yy92; } +#line 6700 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for UPDATE */ /* No destructor defined for OF */ break; - case 263: -#line 769 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = TK_ROW; } -#line 6539 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 266: +#line 790 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy52 = TK_ROW; } +#line 6707 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 264: -#line 770 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = TK_ROW; } -#line 6544 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 267: +#line 791 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy52 = TK_ROW; } +#line 6712 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for FOR */ /* No destructor defined for EACH */ /* No destructor defined for ROW */ break; - case 265: -#line 771 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy136 = TK_STATEMENT; } -#line 6552 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 268: +#line 792 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy52 = TK_STATEMENT; } +#line 6720 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for FOR */ /* No destructor defined for EACH */ /* No destructor defined for STATEMENT */ break; - case 266: -#line 774 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy176 = 0; } -#line 6560 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 269: +#line 795 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy270 = 0; } +#line 6728 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 267: -#line 775 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy176 = yymsp[0].minor.yy272; } -#line 6565 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 270: +#line 796 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy270 = yymsp[0].minor.yy334; } +#line 6733 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for WHEN */ break; - case 268: -#line 778 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 271: +#line 800 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yymsp[-2].minor.yy209->pNext = yymsp[0].minor.yy209 ; yygotominor.yy209 = yymsp[-2].minor.yy209; } -#line 6572 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + yymsp[-2].minor.yy347->pNext = yymsp[0].minor.yy347; + yygotominor.yy347 = yymsp[-2].minor.yy347; +} +#line 6742 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for SEMI */ break; - case 269: -#line 780 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy209 = 0; } -#line 6578 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 272: +#line 804 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy347 = 0; } +#line 6748 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 270: -#line 785 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{ yygotominor.yy209 = sqliteTriggerUpdateStep(&yymsp[-3].minor.yy324, yymsp[-1].minor.yy168, yymsp[0].minor.yy272, yymsp[-4].minor.yy136); } -#line 6583 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 273: +#line 810 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ yygotominor.yy347 = sqliteTriggerUpdateStep(&yymsp[-3].minor.yy210, yymsp[-1].minor.yy62, yymsp[0].minor.yy334, yymsp[-4].minor.yy52); } +#line 6753 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for UPDATE */ /* No destructor defined for SET */ break; - case 271: -#line 790 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy209 = sqliteTriggerInsertStep(&yymsp[-5].minor.yy324, yymsp[-4].minor.yy268, yymsp[-1].minor.yy168, 0, yymsp[-7].minor.yy136);} -#line 6590 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 274: +#line 815 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy347 = sqliteTriggerInsertStep(&yymsp[-5].minor.yy210, yymsp[-4].minor.yy92, yymsp[-1].minor.yy62, 0, yymsp[-7].minor.yy52);} +#line 6760 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for INSERT */ /* No destructor defined for INTO */ /* No destructor defined for VALUES */ /* No destructor defined for LP */ /* No destructor defined for RP */ break; - case 272: -#line 793 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy209 = sqliteTriggerInsertStep(&yymsp[-2].minor.yy324, yymsp[-1].minor.yy268, 0, yymsp[0].minor.yy207, yymsp[-4].minor.yy136);} -#line 6600 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 275: +#line 818 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy347 = sqliteTriggerInsertStep(&yymsp[-2].minor.yy210, yymsp[-1].minor.yy92, 0, yymsp[0].minor.yy11, yymsp[-4].minor.yy52);} +#line 6770 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for INSERT */ /* No destructor defined for INTO */ break; - case 273: -#line 797 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy209 = sqliteTriggerDeleteStep(&yymsp[-1].minor.yy324, yymsp[0].minor.yy272);} -#line 6607 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 276: +#line 822 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy347 = sqliteTriggerDeleteStep(&yymsp[-1].minor.yy210, yymsp[0].minor.yy334);} +#line 6777 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for DELETE */ /* No destructor defined for FROM */ break; - case 274: -#line 800 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" -{yygotominor.yy209 = sqliteTriggerSelectStep(yymsp[0].minor.yy207); } -#line 6614 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + case 277: +#line 825 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{yygotominor.yy347 = sqliteTriggerSelectStep(yymsp[0].minor.yy11); } +#line 6784 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" break; - case 275: -#line 803 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 278: +#line 828 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_RAISE, 0, 0, 0); - yygotominor.yy272->iColumn = OE_Ignore; - sqliteExprSpan(yygotominor.yy272, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0); + yygotominor.yy334 = sqliteExpr(TK_RAISE, 0, 0, 0); + yygotominor.yy334->iColumn = OE_Ignore; + sqliteExprSpan(yygotominor.yy334, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0); } -#line 6623 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6793 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for LP */ /* No destructor defined for IGNORE */ break; - case 276: -#line 808 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 279: +#line 833 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_RAISE, 0, 0, &yymsp[-1].minor.yy324); - yygotominor.yy272->iColumn = OE_Rollback; - sqliteExprSpan(yygotominor.yy272, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0); + yygotominor.yy334 = sqliteExpr(TK_RAISE, 0, 0, &yymsp[-1].minor.yy210); + yygotominor.yy334->iColumn = OE_Rollback; + sqliteExprSpan(yygotominor.yy334, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0); } -#line 6634 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6804 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for LP */ /* No destructor defined for ROLLBACK */ /* No destructor defined for COMMA */ break; - case 277: -#line 813 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 280: +#line 838 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_RAISE, 0, 0, &yymsp[-1].minor.yy324); - yygotominor.yy272->iColumn = OE_Abort; - sqliteExprSpan(yygotominor.yy272, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0); + yygotominor.yy334 = sqliteExpr(TK_RAISE, 0, 0, &yymsp[-1].minor.yy210); + yygotominor.yy334->iColumn = OE_Abort; + sqliteExprSpan(yygotominor.yy334, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0); } -#line 6646 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6816 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for LP */ /* No destructor defined for ABORT */ /* No destructor defined for COMMA */ break; - case 278: -#line 818 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 281: +#line 843 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - yygotominor.yy272 = sqliteExpr(TK_RAISE, 0, 0, &yymsp[-1].minor.yy324); - yygotominor.yy272->iColumn = OE_Fail; - sqliteExprSpan(yygotominor.yy272, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0); + yygotominor.yy334 = sqliteExpr(TK_RAISE, 0, 0, &yymsp[-1].minor.yy210); + yygotominor.yy334->iColumn = OE_Fail; + sqliteExprSpan(yygotominor.yy334, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0); } -#line 6658 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6828 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for LP */ /* No destructor defined for FAIL */ /* No destructor defined for COMMA */ break; - case 279: -#line 825 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" + case 282: +#line 850 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" { - sqliteDropTrigger(pParse,&yymsp[0].minor.yy324,0); + sqliteDropTrigger(pParse,sqliteSrcListAppend(0,&yymsp[-1].minor.yy210,&yymsp[0].minor.yy210),0); } -#line 6668 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6838 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" /* No destructor defined for DROP */ /* No destructor defined for TRIGGER */ break; + case 283: +#line 855 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ + sqliteAttach(pParse, &yymsp[-2].minor.yy210, &yymsp[0].minor.yy210); +} +#line 6847 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for ATTACH */ + /* No destructor defined for database_kw_opt */ + /* No destructor defined for AS */ + break; + case 284: + /* No destructor defined for DATABASE */ + break; + case 285: + break; + case 286: +#line 863 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.y" +{ + sqliteDetach(pParse, &yymsp[0].minor.yy210); +} +#line 6862 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" + /* No destructor defined for DETACH */ + /* No destructor defined for database_kw_opt */ + break; }; yygoto = yyRuleInfo[yyruleno].lhs; yysize = yyRuleInfo[yyruleno].nrhs; @@ -6722,7 +6916,7 @@ static void yy_syntax_error( } pParse->nErr++; -#line 6725 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" +#line 6919 "/home/wez/src/php/pear/PECL/sqlite/libsqlite/src/parse.c" sqliteParserARG_STORE; /* Suppress warning about unused %extra_argument variable */ } diff --git a/ext/sqlite/libsqlite/src/parse.h b/ext/sqlite/libsqlite/src/parse.h index 16dd234c6d..aba9766596 100644 --- a/ext/sqlite/libsqlite/src/parse.h +++ b/ext/sqlite/libsqlite/src/parse.h @@ -5,123 +5,126 @@ #define TK_AND 5 #define TK_AS 6 #define TK_ASC 7 -#define TK_BEFORE 8 -#define TK_BEGIN 9 -#define TK_BETWEEN 10 -#define TK_BITAND 11 -#define TK_BITNOT 12 -#define TK_BITOR 13 -#define TK_BY 14 -#define TK_CASCADE 15 -#define TK_CASE 16 -#define TK_CHECK 17 -#define TK_CLUSTER 18 -#define TK_COLLATE 19 -#define TK_COLUMN 20 -#define TK_COMMA 21 -#define TK_COMMENT 22 -#define TK_COMMIT 23 -#define TK_CONCAT 24 -#define TK_CONFLICT 25 -#define TK_CONSTRAINT 26 -#define TK_COPY 27 -#define TK_CREATE 28 -#define TK_DEFAULT 29 -#define TK_DEFERRABLE 30 -#define TK_DEFERRED 31 -#define TK_DELETE 32 -#define TK_DELIMITERS 33 -#define TK_DESC 34 -#define TK_DISTINCT 35 -#define TK_DOT 36 -#define TK_DROP 37 -#define TK_EACH 38 -#define TK_ELSE 39 -#define TK_END 40 -#define TK_END_OF_FILE 41 -#define TK_EQ 42 -#define TK_EXCEPT 43 -#define TK_EXPLAIN 44 -#define TK_FAIL 45 -#define TK_FLOAT 46 -#define TK_FOR 47 -#define TK_FOREIGN 48 -#define TK_FROM 49 -#define TK_FUNCTION 50 -#define TK_GE 51 -#define TK_GLOB 52 -#define TK_GROUP 53 -#define TK_GT 54 -#define TK_HAVING 55 -#define TK_ID 56 -#define TK_IGNORE 57 -#define TK_ILLEGAL 58 -#define TK_IMMEDIATE 59 -#define TK_IN 60 -#define TK_INDEX 61 -#define TK_INITIALLY 62 -#define TK_INSERT 63 -#define TK_INSTEAD 64 -#define TK_INTEGER 65 -#define TK_INTERSECT 66 -#define TK_INTO 67 -#define TK_IS 68 -#define TK_ISNULL 69 -#define TK_JOIN 70 -#define TK_JOIN_KW 71 -#define TK_KEY 72 -#define TK_LE 73 -#define TK_LIKE 74 -#define TK_LIMIT 75 -#define TK_LP 76 -#define TK_LSHIFT 77 -#define TK_LT 78 -#define TK_MATCH 79 -#define TK_MINUS 80 -#define TK_NE 81 -#define TK_NOT 82 -#define TK_NOTNULL 83 -#define TK_NULL 84 -#define TK_OF 85 -#define TK_OFFSET 86 -#define TK_ON 87 -#define TK_OR 88 -#define TK_ORACLE_OUTER_JOIN 89 -#define TK_ORDER 90 -#define TK_PLUS 91 -#define TK_PRAGMA 92 -#define TK_PRIMARY 93 -#define TK_RAISE 94 -#define TK_REFERENCES 95 -#define TK_REM 96 -#define TK_REPLACE 97 -#define TK_RESTRICT 98 -#define TK_ROLLBACK 99 -#define TK_ROW 100 -#define TK_RP 101 -#define TK_RSHIFT 102 -#define TK_SELECT 103 -#define TK_SEMI 104 -#define TK_SET 105 -#define TK_SLASH 106 -#define TK_SPACE 107 -#define TK_STAR 108 -#define TK_STATEMENT 109 -#define TK_STRING 110 -#define TK_TABLE 111 -#define TK_TEMP 112 -#define TK_THEN 113 -#define TK_TRANSACTION 114 -#define TK_TRIGGER 115 -#define TK_UMINUS 116 -#define TK_UNCLOSED_STRING 117 -#define TK_UNION 118 -#define TK_UNIQUE 119 -#define TK_UPDATE 120 -#define TK_UPLUS 121 -#define TK_USING 122 -#define TK_VACUUM 123 -#define TK_VALUES 124 -#define TK_VIEW 125 -#define TK_WHEN 126 -#define TK_WHERE 127 +#define TK_ATTACH 8 +#define TK_BEFORE 9 +#define TK_BEGIN 10 +#define TK_BETWEEN 11 +#define TK_BITAND 12 +#define TK_BITNOT 13 +#define TK_BITOR 14 +#define TK_BY 15 +#define TK_CASCADE 16 +#define TK_CASE 17 +#define TK_CHECK 18 +#define TK_CLUSTER 19 +#define TK_COLLATE 20 +#define TK_COLUMN 21 +#define TK_COMMA 22 +#define TK_COMMENT 23 +#define TK_COMMIT 24 +#define TK_CONCAT 25 +#define TK_CONFLICT 26 +#define TK_CONSTRAINT 27 +#define TK_COPY 28 +#define TK_CREATE 29 +#define TK_DATABASE 30 +#define TK_DEFAULT 31 +#define TK_DEFERRABLE 32 +#define TK_DEFERRED 33 +#define TK_DELETE 34 +#define TK_DELIMITERS 35 +#define TK_DESC 36 +#define TK_DETACH 37 +#define TK_DISTINCT 38 +#define TK_DOT 39 +#define TK_DROP 40 +#define TK_EACH 41 +#define TK_ELSE 42 +#define TK_END 43 +#define TK_END_OF_FILE 44 +#define TK_EQ 45 +#define TK_EXCEPT 46 +#define TK_EXPLAIN 47 +#define TK_FAIL 48 +#define TK_FLOAT 49 +#define TK_FOR 50 +#define TK_FOREIGN 51 +#define TK_FROM 52 +#define TK_FUNCTION 53 +#define TK_GE 54 +#define TK_GLOB 55 +#define TK_GROUP 56 +#define TK_GT 57 +#define TK_HAVING 58 +#define TK_ID 59 +#define TK_IGNORE 60 +#define TK_ILLEGAL 61 +#define TK_IMMEDIATE 62 +#define TK_IN 63 +#define TK_INDEX 64 +#define TK_INITIALLY 65 +#define TK_INSERT 66 +#define TK_INSTEAD 67 +#define TK_INTEGER 68 +#define TK_INTERSECT 69 +#define TK_INTO 70 +#define TK_IS 71 +#define TK_ISNULL 72 +#define TK_JOIN 73 +#define TK_JOIN_KW 74 +#define TK_KEY 75 +#define TK_LE 76 +#define TK_LIKE 77 +#define TK_LIMIT 78 +#define TK_LP 79 +#define TK_LSHIFT 80 +#define TK_LT 81 +#define TK_MATCH 82 +#define TK_MINUS 83 +#define TK_NE 84 +#define TK_NOT 85 +#define TK_NOTNULL 86 +#define TK_NULL 87 +#define TK_OF 88 +#define TK_OFFSET 89 +#define TK_ON 90 +#define TK_OR 91 +#define TK_ORACLE_OUTER_JOIN 92 +#define TK_ORDER 93 +#define TK_PLUS 94 +#define TK_PRAGMA 95 +#define TK_PRIMARY 96 +#define TK_RAISE 97 +#define TK_REFERENCES 98 +#define TK_REM 99 +#define TK_REPLACE 100 +#define TK_RESTRICT 101 +#define TK_ROLLBACK 102 +#define TK_ROW 103 +#define TK_RP 104 +#define TK_RSHIFT 105 +#define TK_SELECT 106 +#define TK_SEMI 107 +#define TK_SET 108 +#define TK_SLASH 109 +#define TK_SPACE 110 +#define TK_STAR 111 +#define TK_STATEMENT 112 +#define TK_STRING 113 +#define TK_TABLE 114 +#define TK_TEMP 115 +#define TK_THEN 116 +#define TK_TRANSACTION 117 +#define TK_TRIGGER 118 +#define TK_UMINUS 119 +#define TK_UNCLOSED_STRING 120 +#define TK_UNION 121 +#define TK_UNIQUE 122 +#define TK_UPDATE 123 +#define TK_UPLUS 124 +#define TK_USING 125 +#define TK_VACUUM 126 +#define TK_VALUES 127 +#define TK_VIEW 128 +#define TK_WHEN 129 +#define TK_WHERE 130 diff --git a/ext/sqlite/libsqlite/src/parse.y b/ext/sqlite/libsqlite/src/parse.y index 598dc37309..f319cc3922 100644 --- a/ext/sqlite/libsqlite/src/parse.y +++ b/ext/sqlite/libsqlite/src/parse.y @@ -96,8 +96,8 @@ create_table ::= CREATE(X) temp(T) TABLE nm(Y). { sqliteStartTable(pParse,&X,&Y,T,0); } %type temp {int} -temp(A) ::= TEMP. {A = pParse->isTemp || !pParse->initFlag;} -temp(A) ::= . {A = pParse->isTemp;} +temp(A) ::= TEMP. {A = 1;} +temp(A) ::= . {A = 0;} create_table_args ::= LP columnlist conslist_opt RP(X). { sqliteEndTable(pParse,&X,0); } @@ -126,8 +126,8 @@ id(A) ::= ID(X). {A = X;} // This obviates the need for the "id" nonterminal. // %fallback ID - ABORT AFTER ASC BEFORE BEGIN CASCADE CLUSTER CONFLICT - COPY DEFERRED DELIMITERS DESC EACH END EXPLAIN FAIL FOR + ABORT AFTER ASC ATTACH BEFORE BEGIN CASCADE CLUSTER CONFLICT + COPY DATABASE DEFERRED DELIMITERS DESC DETACH EACH END EXPLAIN FAIL FOR IGNORE IMMEDIATE INITIALLY INSTEAD MATCH KEY OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW STATEMENT TEMP TRIGGER VACUUM VIEW. @@ -176,7 +176,7 @@ carg ::= DEFAULT NULL. ccons ::= NULL onconf. ccons ::= NOT NULL onconf(R). {sqliteAddNotNull(pParse, R);} ccons ::= PRIMARY KEY sortorder onconf(R). {sqliteAddPrimaryKey(pParse,0,R);} -ccons ::= UNIQUE onconf(R). {sqliteCreateIndex(pParse,0,0,0,R,0,0);} +ccons ::= UNIQUE onconf(R). {sqliteCreateIndex(pParse,0,0,0,R,0,0,0);} ccons ::= CHECK LP expr RP onconf. ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R). {sqliteCreateForeignKey(pParse,0,&T,TA,R);} @@ -223,7 +223,7 @@ tcons ::= CONSTRAINT nm. tcons ::= PRIMARY KEY LP idxlist(X) RP onconf(R). {sqliteAddPrimaryKey(pParse,X,R);} tcons ::= UNIQUE LP idxlist(X) RP onconf(R). - {sqliteCreateIndex(pParse,0,0,X,R,0,0);} + {sqliteCreateIndex(pParse,0,0,X,R,0,0,0);} tcons ::= CHECK expr onconf. tcons ::= FOREIGN KEY LP idxlist(FA) RP REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { @@ -353,8 +353,8 @@ stl_prefix(A) ::= seltablist(X) joinop(Y). { if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y; } stl_prefix(A) ::= . {A = 0;} -seltablist(A) ::= stl_prefix(X) nm(Y) as(Z) on_opt(N) using_opt(U). { - A = sqliteSrcListAppend(X,&Y); +seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) on_opt(N) using_opt(U). { + A = sqliteSrcListAppend(X,&Y,&D); if( Z.n ) sqliteSrcListAddAlias(A,&Z); if( N ){ if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; } @@ -366,7 +366,7 @@ seltablist(A) ::= stl_prefix(X) nm(Y) as(Z) on_opt(N) using_opt(U). { } } seltablist(A) ::= stl_prefix(X) LP select(S) RP as(Z) on_opt(N) using_opt(U). { - A = sqliteSrcListAppend(X,0); + A = sqliteSrcListAppend(X,0,0); A->a[A->nSrc-1].pSelect = S; if( Z.n ) sqliteSrcListAddAlias(A,&Z); if( N ){ @@ -379,6 +379,10 @@ seltablist(A) ::= stl_prefix(X) LP select(S) RP as(Z) on_opt(N) using_opt(U). { } } +%type dbnm {Token} +dbnm(A) ::= . {A.z=0; A.n=0;} +dbnm(A) ::= DOT nm(X). {A = X;} + %type joinop {int} %type joinop2 {int} joinop(X) ::= COMMA. { X = JT_INNER; } @@ -440,15 +444,16 @@ having_opt(A) ::= HAVING expr(X). {A = X;} %type limit_opt {struct LimitVal} limit_opt(A) ::= . {A.limit = -1; A.offset = 0;} limit_opt(A) ::= LIMIT INTEGER(X). {A.limit = atoi(X.z); A.offset = 0;} -limit_opt(A) ::= LIMIT INTEGER(X) limit_sep INTEGER(Y). +limit_opt(A) ::= LIMIT INTEGER(X) OFFSET INTEGER(Y). {A.limit = atoi(X.z); A.offset = atoi(Y.z);} -limit_sep ::= OFFSET. -limit_sep ::= COMMA. +limit_opt(A) ::= LIMIT INTEGER(X) COMMA INTEGER(Y). + {A.limit = atoi(Y.z); A.offset = atoi(X.z);} /////////////////////////// The DELETE statement ///////////////////////////// // -cmd ::= DELETE FROM nm(X) where_opt(Y). - {sqliteDeleteFrom(pParse, &X, Y);} +cmd ::= DELETE FROM nm(X) dbnm(D) where_opt(Y). { + sqliteDeleteFrom(pParse, sqliteSrcListAppend(0,&X,&D), Y); +} %type where_opt {Expr*} %destructor where_opt {sqliteExprDelete($$);} @@ -461,8 +466,8 @@ where_opt(A) ::= WHERE expr(X). {A = X;} ////////////////////////// The UPDATE command //////////////////////////////// // -cmd ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z). - {sqliteUpdate(pParse,&X,Y,Z,R);} +cmd ::= UPDATE orconf(R) nm(X) dbnm(D) SET setlist(Y) where_opt(Z). + {sqliteUpdate(pParse,sqliteSrcListAppend(0,&X,&D),Y,Z,R);} setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). {A = sqliteExprListAppend(Z,Y,&X);} @@ -470,10 +475,11 @@ setlist(A) ::= nm(X) EQ expr(Y). {A = sqliteExprListAppend(0,Y,&X);} ////////////////////////// The INSERT command ///////////////////////////////// // -cmd ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) VALUES LP itemlist(Y) RP. - {sqliteInsert(pParse, &X, Y, 0, F, R);} -cmd ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S). - {sqliteInsert(pParse, &X, 0, S, F, R);} +cmd ::= insert_cmd(R) INTO nm(X) dbnm(D) inscollist_opt(F) + VALUES LP itemlist(Y) RP. + {sqliteInsert(pParse, sqliteSrcListAppend(0,&X,&D), Y, 0, F, R);} +cmd ::= insert_cmd(R) INTO nm(X) dbnm(D) inscollist_opt(F) select(S). + {sqliteInsert(pParse, sqliteSrcListAppend(0,&X,&D), 0, S, F, R);} %type insert_cmd {int} insert_cmd(A) ::= INSERT orconf(R). {A = R;} @@ -522,6 +528,13 @@ expr(A) ::= nm(X) DOT nm(Y). { Expr *temp2 = sqliteExpr(TK_ID, 0, 0, &Y); A = sqliteExpr(TK_DOT, temp1, temp2, 0); } +expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { + Expr *temp1 = sqliteExpr(TK_ID, 0, 0, &X); + Expr *temp2 = sqliteExpr(TK_ID, 0, 0, &Y); + Expr *temp3 = sqliteExpr(TK_ID, 0, 0, &Z); + Expr *temp4 = sqliteExpr(TK_DOT, temp2, temp3, 0); + A = sqliteExpr(TK_DOT, temp1, temp4, 0); +} expr(A) ::= expr(B) ORACLE_OUTER_JOIN. {A = B; ExprSetProperty(A,EP_Oracle8Join);} expr(A) ::= INTEGER(X). {A = sqliteExpr(TK_INTEGER, 0, 0, &X);} @@ -686,11 +699,12 @@ expritem(A) ::= . {A = 0;} ///////////////////////////// The CREATE INDEX command /////////////////////// // -cmd ::= CREATE(S) uniqueflag(U) INDEX nm(X) - ON nm(Y) LP idxlist(Z) RP(E) onconf(R). { +cmd ::= CREATE(S) temp(T) uniqueflag(U) INDEX nm(X) + ON nm(Y) dbnm(D) LP idxlist(Z) RP(E) onconf(R). { + SrcList *pSrc = sqliteSrcListAppend(0, &Y, &D); if( U!=OE_None ) U = R; if( U==OE_Default) U = OE_Abort; - sqliteCreateIndex(pParse, &X, &Y, Z, U, &S, &E); + sqliteCreateIndex(pParse, &X, pSrc, Z, U, T, &S, &E); } %type uniqueflag {int} @@ -707,20 +721,22 @@ idxlist_opt(A) ::= . {A = 0;} idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} idxlist(A) ::= idxlist(X) COMMA idxitem(Y). {A = sqliteIdListAppend(X,&Y);} idxlist(A) ::= idxitem(Y). {A = sqliteIdListAppend(0,&Y);} -idxitem(A) ::= nm(X). {A = X;} +idxitem(A) ::= nm(X) sortorder. {A = X;} ///////////////////////////// The DROP INDEX command ///////////////////////// // -cmd ::= DROP INDEX nm(X). {sqliteDropIndex(pParse, &X);} +cmd ::= DROP INDEX nm(X) dbnm(Y). { + sqliteDropIndex(pParse, sqliteSrcListAppend(0,&X,&Y)); +} ///////////////////////////// The COPY command /////////////////////////////// // -cmd ::= COPY orconf(R) nm(X) FROM nm(Y) USING DELIMITERS STRING(Z). - {sqliteCopy(pParse,&X,&Y,&Z,R);} -cmd ::= COPY orconf(R) nm(X) FROM nm(Y). - {sqliteCopy(pParse,&X,&Y,0,R);} +cmd ::= COPY orconf(R) nm(X) dbnm(D) FROM nm(Y) USING DELIMITERS STRING(Z). + {sqliteCopy(pParse,sqliteSrcListAppend(0,&X,&D),&Y,&Z,R);} +cmd ::= COPY orconf(R) nm(X) dbnm(D) FROM nm(Y). + {sqliteCopy(pParse,sqliteSrcListAppend(0,&X,&D),&Y,0,R);} ///////////////////////////// The VACUUM command ///////////////////////////// // @@ -743,13 +759,18 @@ plus_opt ::= PLUS. plus_opt ::= . //////////////////////////// The CREATE TRIGGER command ///////////////////// -cmd ::= CREATE(A) TRIGGER nm(B) trigger_time(C) trigger_event(D) ON nm(E) - foreach_clause(F) when_clause(G) - BEGIN trigger_cmd_list(S) END(Z). { + +cmd ::= CREATE(A) trigger_decl BEGIN trigger_cmd_list(S) END(Z). { Token all; all.z = A.z; all.n = (Z.z - A.z) + Z.n; - sqliteCreateTrigger(pParse, &B, C, D.a, D.b, &E, F, G, S, &all); + sqliteFinishTrigger(pParse, S, &all); +} + +trigger_decl ::= temp(T) TRIGGER nm(B) trigger_time(C) trigger_event(D) + ON nm(E) dbnm(DB) foreach_clause(F) when_clause(G). { + SrcList *pTab = sqliteSrcListAppend(0, &E, &DB); + sqliteBeginTrigger(pParse, &B, C, D.a, D.b, pTab, F, G, T); } %type trigger_time {int} @@ -775,11 +796,15 @@ when_clause(A) ::= . { A = 0; } when_clause(A) ::= WHEN expr(X). { A = X; } %type trigger_cmd_list {TriggerStep *} +%destructor trigger_cmd_list {sqliteDeleteTriggerStep($$);} trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). { - X->pNext = Y ; A = X; } + X->pNext = Y; + A = X; +} trigger_cmd_list(A) ::= . { A = 0; } %type trigger_cmd {TriggerStep *} +%destructor trigger_cmd {sqliteDeleteTriggerStep($$);} // UPDATE trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z). { A = sqliteTriggerUpdateStep(&X, Y, Z, R); } @@ -822,6 +847,19 @@ expr(A) ::= RAISE(X) LP FAIL COMMA nm(Z) RP(Y). { } //////////////////////// DROP TRIGGER statement ////////////////////////////// -cmd ::= DROP TRIGGER nm(X). { - sqliteDropTrigger(pParse,&X,0); +cmd ::= DROP TRIGGER nm(X) dbnm(D). { + sqliteDropTrigger(pParse,sqliteSrcListAppend(0,&X,&D),0); +} + +//////////////////////// ATTACH DATABASE file AS name ///////////////////////// +cmd ::= ATTACH database_kw_opt ids(F) AS nm(D). { + sqliteAttach(pParse, &F, &D); +} + +database_kw_opt ::= DATABASE. +database_kw_opt ::= . + +//////////////////////// DETACH DATABASE name ///////////////////////////////// +cmd ::= DETACH database_kw_opt nm(D). { + sqliteDetach(pParse, &D); } diff --git a/ext/sqlite/libsqlite/src/pragma.c b/ext/sqlite/libsqlite/src/pragma.c new file mode 100644 index 0000000000..13f2bf71c4 --- /dev/null +++ b/ext/sqlite/libsqlite/src/pragma.c @@ -0,0 +1,535 @@ +/* +** 2003 April 6 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains code used to implement the PRAGMA command. +** +** $Id$ +*/ +#include "sqliteInt.h" +#include <ctype.h> + +/* +** Interpret the given string as a boolean value. +*/ +static int getBoolean(char *z){ + static char *azTrue[] = { "yes", "on", "true" }; + int i; + if( z[0]==0 ) return 0; + if( isdigit(z[0]) || (z[0]=='-' && isdigit(z[1])) ){ + return atoi(z); + } + for(i=0; i<sizeof(azTrue)/sizeof(azTrue[0]); i++){ + if( sqliteStrICmp(z,azTrue[i])==0 ) return 1; + } + return 0; +} + +/* +** Interpret the given string as a safety level. Return 0 for OFF, +** 1 for ON or NORMAL and 2 for FULL. +** +** Note that the values returned are one less that the values that +** should be passed into sqliteBtreeSetSafetyLevel(). The is done +** to support legacy SQL code. The safety level used to be boolean +** and older scripts may have used numbers 0 for OFF and 1 for ON. +*/ +static int getSafetyLevel(char *z){ + static const struct { + const char *zWord; + int val; + } aKey[] = { + { "no", 0 }, + { "off", 0 }, + { "false", 0 }, + { "yes", 1 }, + { "on", 1 }, + { "true", 1 }, + { "full", 2 }, + }; + int i; + if( z[0]==0 ) return 1; + if( isdigit(z[0]) || (z[0]=='-' && isdigit(z[1])) ){ + return atoi(z); + } + for(i=0; i<sizeof(aKey)/sizeof(aKey[0]); i++){ + if( sqliteStrICmp(z,aKey[i].zWord)==0 ) return aKey[i].val; + } + return 1; +} + +/* +** Interpret the given string as a temp db location. Return 1 for file +** backed temporary databases, 2 for the Red-Black tree in memory database +** and 0 to use the compile-time default. +*/ +static int getTempStore(char *z){ + if( z[0]>='0' || z[0]<='2' ){ + return z[0] - '0'; + }else if( sqliteStrICmp(z, "file")==0 ){ + return 1; + }else if( sqliteStrICmp(z, "memory")==0 ){ + return 2; + }else{ + return 0; + } +} + +/* +** Process a pragma statement. +** +** Pragmas are of this form: +** +** PRAGMA id = value +** +** The identifier might also be a string. The value is a string, and +** identifier, or a number. If minusFlag is true, then the value is +** a number that was preceded by a minus sign. +*/ +void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){ + char *zLeft = 0; + char *zRight = 0; + sqlite *db = pParse->db; + Vdbe *v = sqliteGetVdbe(pParse); + if( v==0 ) return; + + zLeft = sqliteStrNDup(pLeft->z, pLeft->n); + sqliteDequote(zLeft); + if( minusFlag ){ + zRight = 0; + sqliteSetNString(&zRight, "-", 1, pRight->z, pRight->n, 0); + }else{ + zRight = sqliteStrNDup(pRight->z, pRight->n); + sqliteDequote(zRight); + } + if( sqliteAuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight, 0) ){ + sqliteFree(zLeft); + sqliteFree(zRight); + return; + } + + /* + ** PRAGMA default_cache_size + ** PRAGMA default_cache_size=N + ** + ** The first form reports the current persistent setting for the + ** page cache size. The value returned is the maximum number of + ** pages in the page cache. The second form sets both the current + ** page cache size value and the persistent page cache size value + ** stored in the database file. + ** + ** The default cache size is stored in meta-value 2 of page 1 of the + ** database file. The cache size is actually the absolute value of + ** this memory location. The sign of meta-value 2 determines the + ** synchronous setting. A negative value means synchronous is off + ** and a positive value means synchronous is on. + */ + if( sqliteStrICmp(zLeft,"default_cache_size")==0 ){ + static VdbeOp getCacheSize[] = { + { OP_ReadCookie, 0, 2, 0}, + { OP_AbsValue, 0, 0, 0}, + { OP_Dup, 0, 0, 0}, + { OP_Integer, 0, 0, 0}, + { OP_Ne, 0, 6, 0}, + { OP_Integer, MAX_PAGES,0, 0}, + { OP_ColumnName, 0, 0, "cache_size"}, + { OP_Callback, 1, 0, 0}, + }; + if( pRight->z==pLeft->z ){ + sqliteVdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize); + }else{ + int addr; + int size = atoi(zRight); + if( size<0 ) size = -size; + sqliteBeginWriteOperation(pParse, 0, 0); + sqliteVdbeAddOp(v, OP_Integer, size, 0); + sqliteVdbeAddOp(v, OP_ReadCookie, 0, 2); + addr = sqliteVdbeAddOp(v, OP_Integer, 0, 0); + sqliteVdbeAddOp(v, OP_Ge, 0, addr+3); + sqliteVdbeAddOp(v, OP_Negative, 0, 0); + sqliteVdbeAddOp(v, OP_SetCookie, 0, 2); + sqliteEndWriteOperation(pParse); + db->cache_size = db->cache_size<0 ? -size : size; + sqliteBtreeSetCacheSize(db->aDb[0].pBt, db->cache_size); + } + }else + + /* + ** PRAGMA cache_size + ** PRAGMA cache_size=N + ** + ** The first form reports the current local setting for the + ** page cache size. The local setting can be different from + ** the persistent cache size value that is stored in the database + ** file itself. The value returned is the maximum number of + ** pages in the page cache. The second form sets the local + ** page cache size value. It does not change the persistent + ** cache size stored on the disk so the cache size will revert + ** to its default value when the database is closed and reopened. + ** N should be a positive integer. + */ + if( sqliteStrICmp(zLeft,"cache_size")==0 ){ + static VdbeOp getCacheSize[] = { + { OP_ColumnName, 0, 0, "cache_size"}, + { OP_Callback, 1, 0, 0}, + }; + if( pRight->z==pLeft->z ){ + int size = db->cache_size;; + if( size<0 ) size = -size; + sqliteVdbeAddOp(v, OP_Integer, size, 0); + sqliteVdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize); + }else{ + int size = atoi(zRight); + if( size<0 ) size = -size; + if( db->cache_size<0 ) size = -size; + db->cache_size = size; + sqliteBtreeSetCacheSize(db->aDb[0].pBt, db->cache_size); + } + }else + + /* + ** PRAGMA default_synchronous + ** PRAGMA default_synchronous=ON|OFF|NORMAL|FULL + ** + ** The first form returns the persistent value of the "synchronous" setting + ** that is stored in the database. This is the synchronous setting that + ** is used whenever the database is opened unless overridden by a separate + ** "synchronous" pragma. The second form changes the persistent and the + ** local synchronous setting to the value given. + ** + ** If synchronous is OFF, SQLite does not attempt any fsync() systems calls + ** to make sure data is committed to disk. Write operations are very fast, + ** but a power failure can leave the database in an inconsistent state. + ** If synchronous is ON or NORMAL, SQLite will do an fsync() system call to + ** make sure data is being written to disk. The risk of corruption due to + ** a power loss in this mode is negligible but non-zero. If synchronous + ** is FULL, extra fsync()s occur to reduce the risk of corruption to near + ** zero, but with a write performance penalty. The default mode is NORMAL. + */ + if( sqliteStrICmp(zLeft,"default_synchronous")==0 ){ + static VdbeOp getSync[] = { + { OP_ColumnName, 0, 0, "synchronous"}, + { OP_ReadCookie, 0, 3, 0}, + { OP_Dup, 0, 0, 0}, + { OP_If, 0, 0, 0}, /* 3 */ + { OP_ReadCookie, 0, 2, 0}, + { OP_Integer, 0, 0, 0}, + { OP_Lt, 0, 5, 0}, + { OP_AddImm, 1, 0, 0}, + { OP_Callback, 1, 0, 0}, + { OP_Halt, 0, 0, 0}, + { OP_AddImm, -1, 0, 0}, /* 10 */ + { OP_Callback, 1, 0, 0} + }; + if( pRight->z==pLeft->z ){ + int addr = sqliteVdbeAddOpList(v, ArraySize(getSync), getSync); + sqliteVdbeChangeP2(v, addr+3, addr+10); + }else{ + int addr; + int size = db->cache_size; + if( size<0 ) size = -size; + sqliteBeginWriteOperation(pParse, 0, 0); + sqliteVdbeAddOp(v, OP_ReadCookie, 0, 2); + sqliteVdbeAddOp(v, OP_Dup, 0, 0); + addr = sqliteVdbeAddOp(v, OP_Integer, 0, 0); + sqliteVdbeAddOp(v, OP_Ne, 0, addr+3); + sqliteVdbeAddOp(v, OP_AddImm, MAX_PAGES, 0); + sqliteVdbeAddOp(v, OP_AbsValue, 0, 0); + db->safety_level = getSafetyLevel(zRight)+1; + if( db->safety_level==1 ){ + sqliteVdbeAddOp(v, OP_Negative, 0, 0); + size = -size; + } + sqliteVdbeAddOp(v, OP_SetCookie, 0, 2); + sqliteVdbeAddOp(v, OP_Integer, db->safety_level, 0); + sqliteVdbeAddOp(v, OP_SetCookie, 0, 3); + sqliteEndWriteOperation(pParse); + db->cache_size = size; + sqliteBtreeSetCacheSize(db->aDb[0].pBt, db->cache_size); + sqliteBtreeSetSafetyLevel(db->aDb[0].pBt, db->safety_level); + } + }else + + /* + ** PRAGMA synchronous + ** PRAGMA synchronous=OFF|ON|NORMAL|FULL + ** + ** Return or set the local value of the synchronous flag. Changing + ** the local value does not make changes to the disk file and the + ** default value will be restored the next time the database is + ** opened. + */ + if( sqliteStrICmp(zLeft,"synchronous")==0 ){ + static VdbeOp getSync[] = { + { OP_ColumnName, 0, 0, "synchronous"}, + { OP_Callback, 1, 0, 0}, + }; + if( pRight->z==pLeft->z ){ + sqliteVdbeAddOp(v, OP_Integer, db->safety_level-1, 0); + sqliteVdbeAddOpList(v, ArraySize(getSync), getSync); + }else{ + int size = db->cache_size; + if( size<0 ) size = -size; + db->safety_level = getSafetyLevel(zRight)+1; + if( db->safety_level==1 ) size = -size; + db->cache_size = size; + sqliteBtreeSetCacheSize(db->aDb[0].pBt, db->cache_size); + sqliteBtreeSetSafetyLevel(db->aDb[0].pBt, db->safety_level); + } + }else + + if( sqliteStrICmp(zLeft, "trigger_overhead_test")==0 ){ + if( getBoolean(zRight) ){ + always_code_trigger_setup = 1; + }else{ + always_code_trigger_setup = 0; + } + }else + + if( sqliteStrICmp(zLeft, "vdbe_trace")==0 ){ + if( getBoolean(zRight) ){ + db->flags |= SQLITE_VdbeTrace; + }else{ + db->flags &= ~SQLITE_VdbeTrace; + } + }else + + if( sqliteStrICmp(zLeft, "full_column_names")==0 ){ + if( getBoolean(zRight) ){ + db->flags |= SQLITE_FullColNames; + }else{ + db->flags &= ~SQLITE_FullColNames; + } + }else + + if( sqliteStrICmp(zLeft, "show_datatypes")==0 ){ + if( getBoolean(zRight) ){ + db->flags |= SQLITE_ReportTypes; + }else{ + db->flags &= ~SQLITE_ReportTypes; + } + }else + + if( sqliteStrICmp(zLeft, "count_changes")==0 ){ + if( getBoolean(zRight) ){ + db->flags |= SQLITE_CountRows; + }else{ + db->flags &= ~SQLITE_CountRows; + } + }else + + if( sqliteStrICmp(zLeft, "empty_result_callbacks")==0 ){ + if( getBoolean(zRight) ){ + db->flags |= SQLITE_NullCallback; + }else{ + db->flags &= ~SQLITE_NullCallback; + } + }else + + if( sqliteStrICmp(zLeft, "table_info")==0 ){ + Table *pTab; + pTab = sqliteFindTable(db, zRight, 0); + if( pTab ){ + static VdbeOp tableInfoPreface[] = { + { OP_ColumnName, 0, 0, "cid"}, + { OP_ColumnName, 1, 0, "name"}, + { OP_ColumnName, 2, 0, "type"}, + { OP_ColumnName, 3, 0, "notnull"}, + { OP_ColumnName, 4, 0, "dflt_value"}, + }; + int i; + sqliteVdbeAddOpList(v, ArraySize(tableInfoPreface), tableInfoPreface); + sqliteViewGetColumnNames(pParse, pTab); + for(i=0; i<pTab->nCol; i++){ + sqliteVdbeAddOp(v, OP_Integer, i, 0); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zName, P3_STATIC); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, + pTab->aCol[i].zType ? pTab->aCol[i].zType : "numeric", P3_STATIC); + sqliteVdbeAddOp(v, OP_Integer, pTab->aCol[i].notNull, 0); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zDflt, P3_STATIC); + sqliteVdbeAddOp(v, OP_Callback, 5, 0); + } + } + }else + + if( sqliteStrICmp(zLeft, "index_info")==0 ){ + Index *pIdx; + Table *pTab; + pIdx = sqliteFindIndex(db, zRight, 0); + if( pIdx ){ + static VdbeOp tableInfoPreface[] = { + { OP_ColumnName, 0, 0, "seqno"}, + { OP_ColumnName, 1, 0, "cid"}, + { OP_ColumnName, 2, 0, "name"}, + }; + int i; + pTab = pIdx->pTable; + sqliteVdbeAddOpList(v, ArraySize(tableInfoPreface), tableInfoPreface); + for(i=0; i<pIdx->nColumn; i++){ + int cnum = pIdx->aiColumn[i]; + sqliteVdbeAddOp(v, OP_Integer, i, 0); + sqliteVdbeAddOp(v, OP_Integer, cnum, 0); + sqliteVdbeAddOp(v, OP_String, 0, 0); + assert( pTab->nCol>cnum ); + sqliteVdbeChangeP3(v, -1, pTab->aCol[cnum].zName, P3_STATIC); + sqliteVdbeAddOp(v, OP_Callback, 3, 0); + } + } + }else + + if( sqliteStrICmp(zLeft, "index_list")==0 ){ + Index *pIdx; + Table *pTab; + pTab = sqliteFindTable(db, zRight, 0); + if( pTab ){ + v = sqliteGetVdbe(pParse); + pIdx = pTab->pIndex; + } + if( pTab && pIdx ){ + int i = 0; + static VdbeOp indexListPreface[] = { + { OP_ColumnName, 0, 0, "seq"}, + { OP_ColumnName, 1, 0, "name"}, + { OP_ColumnName, 2, 0, "unique"}, + }; + + sqliteVdbeAddOpList(v, ArraySize(indexListPreface), indexListPreface); + while(pIdx){ + sqliteVdbeAddOp(v, OP_Integer, i, 0); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC); + sqliteVdbeAddOp(v, OP_Integer, pIdx->onError!=OE_None, 0); + sqliteVdbeAddOp(v, OP_Callback, 3, 0); + ++i; + pIdx = pIdx->pNext; + } + } + }else + + if( sqliteStrICmp(zLeft, "database_list")==0 ){ + int i; + static VdbeOp indexListPreface[] = { + { OP_ColumnName, 0, 0, "seq"}, + { OP_ColumnName, 1, 0, "name"}, + }; + + sqliteVdbeAddOpList(v, ArraySize(indexListPreface), indexListPreface); + for(i=0; i<db->nDb; i++){ + if( db->aDb[i].pBt==0 ) continue; + assert( db->aDb[i].zName!=0 ); + sqliteVdbeAddOp(v, OP_Integer, i, 0); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, db->aDb[i].zName, P3_STATIC); + sqliteVdbeAddOp(v, OP_Callback, 2, 0); + } + }else + /* + ** PRAGMA temp_store + ** PRAGMA temp_store = "default"|"memory"|"file" + ** + ** Return or set the local value of the temp_store flag. Changing + ** the local value does not make changes to the disk file and the default + ** value will be restored the next time the database is opened. + ** + ** Note that it is possible for the library compile-time options to + ** override this setting + */ + if( sqliteStrICmp(zLeft, "temp_store")==0 ){ + static VdbeOp getTmpDbLoc[] = { + { OP_ColumnName, 0, 0, "temp_store"}, + { OP_Callback, 1, 0, 0}, + }; + if( pRight->z==pLeft->z ){ + sqliteVdbeAddOp(v, OP_Integer, db->temp_store, 0); + sqliteVdbeAddOpList(v, ArraySize(getTmpDbLoc), getTmpDbLoc); + }else{ + if (&db->aDb[1].pBt != 0) { + sqliteErrorMsg(pParse, "The temporary database already exists - " + "its location cannot now be changed"); + } else { + db->temp_store = getTempStore(zRight); + } + } + }else + + /* + ** PRAGMA default_temp_store + ** PRAGMA default_temp_store = "default"|"memory"|"file" + ** + ** Return or set the value of the persistent temp_store flag (as + ** well as the value currently in force). + ** + ** Note that it is possible for the library compile-time options to + ** override this setting + */ + if( sqliteStrICmp(zLeft, "default_temp_store")==0 ){ + static VdbeOp getTmpDbLoc[] = { + { OP_ColumnName, 0, 0, "temp_store"}, + { OP_ReadCookie, 0, 5, 0}, + { OP_Callback, 1, 0, 0}}; + if( pRight->z==pLeft->z ){ + sqliteVdbeAddOpList(v, ArraySize(getTmpDbLoc), getTmpDbLoc); + }else{ + if (&db->aDb[1].pBt != 0) { + sqliteErrorMsg(pParse, "The temporary database already exists - " + "its location cannot now be changed"); + } else { + sqliteBeginWriteOperation(pParse, 0, 0); + db->temp_store = getTempStore(zRight); + sqliteVdbeAddOp(v, OP_Integer, db->temp_store, 0); + sqliteVdbeAddOp(v, OP_SetCookie, 0, 5); + sqliteEndWriteOperation(pParse); + } + } + }else + +#ifndef NDEBUG + if( sqliteStrICmp(zLeft, "parser_trace")==0 ){ + extern void sqliteParserTrace(FILE*, char *); + if( getBoolean(zRight) ){ + sqliteParserTrace(stdout, "parser: "); + }else{ + sqliteParserTrace(0, 0); + } + }else +#endif + + if( sqliteStrICmp(zLeft, "integrity_check")==0 ){ + static VdbeOp checkDb[] = { + { OP_SetInsert, 0, 0, "2"}, + { OP_Integer, 0, 0, 0}, + { OP_OpenRead, 0, 2, 0}, + { OP_Rewind, 0, 7, 0}, + { OP_Column, 0, 3, 0}, /* 4 */ + { OP_SetInsert, 0, 0, 0}, + { OP_Next, 0, 4, 0}, + { OP_IntegrityCk, 0, 0, 0}, /* 7 */ + { OP_ColumnName, 0, 0, "integrity_check"}, + { OP_Callback, 1, 0, 0}, + { OP_SetInsert, 1, 0, "2"}, + { OP_Integer, 1, 0, 0}, + { OP_OpenRead, 1, 2, 0}, + { OP_Rewind, 1, 17, 0}, + { OP_Column, 1, 3, 0}, /* 14 */ + { OP_SetInsert, 1, 0, 0}, + { OP_Next, 1, 14, 0}, + { OP_IntegrityCk, 1, 1, 0}, /* 17 */ + { OP_Callback, 1, 0, 0}, + }; + sqliteVdbeAddOpList(v, ArraySize(checkDb), checkDb); + }else + + {} + sqliteFree(zLeft); + sqliteFree(zRight); +} diff --git a/ext/sqlite/libsqlite/src/printf.c b/ext/sqlite/libsqlite/src/printf.c index 387ea1c2da..8587f80d28 100644 --- a/ext/sqlite/libsqlite/src/printf.c +++ b/ext/sqlite/libsqlite/src/printf.c @@ -687,7 +687,6 @@ static void mout(void *arg, char *zNewText, int nNewChar){ char *sqliteMPrintf(const char *zFormat, ...){ va_list ap; struct sgMprintf sMprintf; - char *zNew; char zBuf[200]; sMprintf.nChar = 0; diff --git a/ext/sqlite/libsqlite/src/select.c b/ext/sqlite/libsqlite/src/select.c index 03eb861c9e..9bed641be7 100644 --- a/ext/sqlite/libsqlite/src/select.c +++ b/ext/sqlite/libsqlite/src/select.c @@ -120,9 +120,8 @@ int sqliteJoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){ pParse->nErr++; jointype = JT_INNER; }else if( jointype & JT_RIGHT ){ - sqliteSetString(&pParse->zErrMsg, - "RIGHT and FULL OUTER JOINs are not currently supported", 0); - pParse->nErr++; + sqliteErrorMsg(pParse, + "RIGHT and FULL OUTER JOINs are not currently supported"); jointype = JT_INNER; } return jointype; @@ -218,9 +217,8 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ if( pTerm->jointype & JT_NATURAL ){ Table *pTab; if( pTerm->pOn || pTerm->pUsing ){ - sqliteSetString(&pParse->zErrMsg, "a NATURAL join may not have " + sqliteErrorMsg(pParse, "a NATURAL join may not have " "an ON or USING clause", 0); - pParse->nErr++; return 1; } pTab = pTerm->pTab; @@ -234,9 +232,8 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ /* Disallow both ON and USING clauses in the same join */ if( pTerm->pOn && pTerm->pUsing ){ - sqliteSetString(&pParse->zErrMsg, "cannot have both ON and USING " - "clauses in the same join", 0); - pParse->nErr++; + sqliteErrorMsg(pParse, "cannot have both ON and USING " + "clauses in the same join"); return 1; } @@ -268,9 +265,8 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ for(j=0; j<pList->nId; j++){ if( columnIndex(pTerm->pTab, pList->a[j].zName)<0 || columnIndex(pOther->pTab, pList->a[j].zName)<0 ){ - sqliteSetString(&pParse->zErrMsg, "cannot join using column ", - pList->a[j].zName, " - column not present in both tables", 0); - pParse->nErr++; + sqliteErrorMsg(pParse, "cannot join using column %s - column " + "not present in both tables", pList->a[j].zName); return 1; } addWhereTerm(pList->a[j].zName, pTerm->pTab, pOther->pTab, &p->pWhere); @@ -300,13 +296,15 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ ** will work correctly for both SQLite and Oracle8. */ static int sqliteOracle8JoinFixup( - int base, /* VDBE cursor number for first table in pSrc */ SrcList *pSrc, /* List of tables being joined */ Expr *pWhere /* The WHERE clause of the SELECT statement */ ){ int rc = 0; if( ExprHasProperty(pWhere, EP_Oracle8Join) && pWhere->op==TK_COLUMN ){ - int idx = pWhere->iTable - base; + int idx; + for(idx=0; idx<pSrc->nSrc; idx++){ + if( pSrc->a[idx].iCursor==pWhere->iTable ) break; + } assert( idx>=0 && idx<pSrc->nSrc ); if( idx>0 ){ pSrc->a[idx-1].jointype &= ~JT_INNER; @@ -315,16 +313,16 @@ static int sqliteOracle8JoinFixup( } } if( pWhere->pRight ){ - rc = sqliteOracle8JoinFixup(base, pSrc, pWhere->pRight); + rc = sqliteOracle8JoinFixup(pSrc, pWhere->pRight); } if( pWhere->pLeft ){ - rc |= sqliteOracle8JoinFixup(base, pSrc, pWhere->pLeft); + rc |= sqliteOracle8JoinFixup(pSrc, pWhere->pLeft); } if( pWhere->pList ){ int i; ExprList *pList = pWhere->pList; for(i=0; i<pList->nExpr && rc==0; i++){ - rc |= sqliteOracle8JoinFixup(base, pSrc, pList->a[i].pExpr); + rc |= sqliteOracle8JoinFixup(pSrc, pList->a[i].pExpr); } } if( rc==1 && (pWhere->op==TK_AND || pWhere->op==TK_EQ) ){ @@ -691,12 +689,11 @@ static void generateSortTail( */ static void generateColumnTypes( Parse *pParse, /* Parser context */ - int base, /* VDBE cursor corresponding to first entry in pTabList */ SrcList *pTabList, /* List of tables */ ExprList *pEList /* Expressions defining the result set */ ){ Vdbe *v = pParse->pVdbe; - int i; + int i, j; if( pParse->useCallback && (pParse->db->flags & SQLITE_ReportTypes)==0 ){ return; } @@ -705,8 +702,11 @@ static void generateColumnTypes( char *zType = 0; if( p==0 ) continue; if( p->op==TK_COLUMN && pTabList ){ - Table *pTab = pTabList->a[p->iTable - base].pTab; + Table *pTab; int iCol = p->iColumn; + for(j=0; j<pTabList->nSrc && pTabList->a[j].iCursor!=p->iTable; j++){} + assert( j<pTabList->nSrc ); + pTab = pTabList->a[j].pTab; if( iCol<0 ) iCol = pTab->iPKey; assert( iCol==-1 || (iCol>=0 && iCol<pTab->nCol) ); if( iCol<0 ){ @@ -733,12 +733,11 @@ static void generateColumnTypes( */ static void generateColumnNames( Parse *pParse, /* Parser context */ - int base, /* VDBE cursor corresponding to first entry in pTabList */ SrcList *pTabList, /* List of tables */ ExprList *pEList /* Expressions defining the result set */ ){ Vdbe *v = pParse->pVdbe; - int i; + int i, j; if( pParse->colNamesSet || v==0 || sqlite_malloc_failed ) return; pParse->colNamesSet = 1; for(i=0; i<pEList->nExpr; i++){ @@ -755,9 +754,12 @@ static void generateColumnNames( } showFullNames = (pParse->db->flags & SQLITE_FullColNames)!=0; if( p->op==TK_COLUMN && pTabList ){ - Table *pTab = pTabList->a[p->iTable - base].pTab; + Table *pTab; char *zCol; int iCol = p->iColumn; + for(j=0; j<pTabList->nSrc && pTabList->a[j].iCursor!=p->iTable; j++){} + assert( j<pTabList->nSrc ); + pTab = pTabList->a[j].pTab; if( iCol<0 ) iCol = pTab->iPKey; assert( iCol==-1 || (iCol>=0 && iCol<pTab->nCol) ); if( iCol<0 ){ @@ -775,7 +777,7 @@ static void generateColumnNames( char *zName = 0; char *zTab; - zTab = pTabList->a[p->iTable - base].zAlias; + zTab = pTabList->a[j].zAlias; if( showFullNames || zTab==0 ) zTab = pTab->zName; sqliteSetString(&zName, zTab, ".", zCol, 0); sqliteVdbeAddOp(v, OP_ColumnName, i, 0); @@ -863,7 +865,12 @@ Table *sqliteResultSetOfSelect(Parse *pParse, char *zTabName, Select *pSelect){ ** For the given SELECT statement, do three things. ** ** (1) Fill in the pTabList->a[].pTab fields in the SrcList that -** defines the set of tables that should be scanned. +** defines the set of tables that should be scanned. For views, +** fill pTabList->a[].pSelect with a copy of the SELECT statement +** that implements the view. A copy is made of the view's SELECT +** statement so that we can freely modify or delete that statement +** without worrying about messing up the presistent representation +** of the view. ** ** (2) Add terms to the WHERE clause to accomodate the NATURAL keyword ** on joins and the ON and USING clause of joins. @@ -908,23 +915,31 @@ static int fillInColumnList(Parse *pParse, Select *p){ if( pTab==0 ){ return 1; } + /* The isTransient flag indicates that the Table structure has been + ** dynamically allocated and may be freed at any time. In other words, + ** pTab is not pointing to a persistent table structure that defines + ** part of the schema. */ pTab->isTransient = 1; }else{ /* An ordinary table or view name in the FROM clause */ pTabList->a[i].pTab = pTab = - sqliteFindTable(pParse->db, pTabList->a[i].zName); + sqliteLocateTable(pParse,pTabList->a[i].zName,pTabList->a[i].zDatabase); if( pTab==0 ){ - sqliteSetString(&pParse->zErrMsg, "no such table: ", - pTabList->a[i].zName, 0); - pParse->nErr++; return 1; } if( pTab->pSelect ){ + /* We reach here if the named table is a really a view */ if( sqliteViewGetColumnNames(pParse, pTab) ){ return 1; } - sqliteSelectDelete(pTabList->a[i].pSelect); - pTabList->a[i].pSelect = sqliteSelectDup(pTab->pSelect); + /* If pTabList->a[i].pSelect!=0 it means we are dealing with a + ** view within a view. The SELECT structure has already been + ** copied by the outer view so we can skip the copy step here + ** in the inner view. + */ + if( pTabList->a[i].pSelect==0 ){ + pTabList->a[i].pSelect = sqliteSelectDup(pTab->pSelect); + } } } } @@ -1032,10 +1047,9 @@ static int fillInColumnList(Parse *pParse, Select *p){ } if( !tableSeen ){ if( pName ){ - sqliteSetNString(&pParse->zErrMsg, "no such table: ", -1, - pName->z, pName->n, 0); + sqliteErrorMsg(pParse, "no such table: %T", pName); }else{ - sqliteSetString(&pParse->zErrMsg, "no tables specified", 0); + sqliteErrorMsg(pParse, "no tables specified"); } rc = 1; } @@ -1056,6 +1070,9 @@ static int fillInColumnList(Parse *pParse, Select *p){ ** This routine is called on the Select structure that defines a ** VIEW in order to undo any bindings to tables. This is necessary ** because those tables might be DROPed by a subsequent SQL command. +** If the bindings are not removed, then the Select.pSrc->a[].pTab field +** will be left pointing to a deallocated Table structure after the +** DROP and a coredump will occur the next time the VIEW is used. */ void sqliteSelectUnbind(Select *p){ int i; @@ -1066,10 +1083,6 @@ void sqliteSelectUnbind(Select *p){ if( (pTab = pSrc->a[i].pTab)!=0 ){ if( pTab->isTransient ){ sqliteDeleteTable(0, pTab); -#if 0 - sqliteSelectDelete(pSrc->a[i].pSelect); - pSrc->a[i].pSelect = 0; -#endif } pSrc->a[i].pTab = 0; if( pSrc->a[i].pSelect ){ @@ -1129,11 +1142,9 @@ static int matchOrderbyToColumn( if( pOrderBy->a[i].done ) continue; if( sqliteExprIsInteger(pE, &iCol) ){ if( iCol<=0 || iCol>pEList->nExpr ){ - char zBuf[200]; - sprintf(zBuf,"ORDER BY position %d should be between 1 and %d", - iCol, pEList->nExpr); - sqliteSetString(&pParse->zErrMsg, zBuf, 0); - pParse->nErr++; + sqliteErrorMsg(pParse, + "ORDER BY position %d should be between 1 and %d", + iCol, pEList->nExpr); nErr++; break; } @@ -1163,11 +1174,8 @@ static int matchOrderbyToColumn( pOrderBy->a[i].done = 1; } if( iCol<0 && mustComplete ){ - char zBuf[30]; - sprintf(zBuf,"%d",i+1); - sqliteSetString(&pParse->zErrMsg, "ORDER BY term number ", zBuf, - " does not match any result column", 0); - pParse->nErr++; + sqliteErrorMsg(pParse, + "ORDER BY term number %d does not match any result column", i+1); nErr++; break; } @@ -1277,9 +1285,8 @@ static int multiSelect(Parse *pParse, Select *p, int eDest, int iParm){ if( p==0 || p->pPrior==0 ) return 1; pPrior = p->pPrior; if( pPrior->pOrderBy ){ - sqliteSetString(&pParse->zErrMsg,"ORDER BY clause should come after ", - selectOpName(p->op), " not before", 0); - pParse->nErr++; + sqliteErrorMsg(pParse,"ORDER BY clause should come after %s not before", + selectOpName(p->op)); return 1; } @@ -1367,8 +1374,8 @@ static int multiSelect(Parse *pParse, Select *p, int eDest, int iParm){ int iCont, iBreak, iStart; assert( p->pEList ); if( eDest==SRT_Callback ){ - generateColumnNames(pParse, p->base, 0, p->pEList); - generateColumnTypes(pParse, p->base, p->pSrc, p->pEList); + generateColumnNames(pParse, 0, p->pEList); + generateColumnTypes(pParse, p->pSrc, p->pEList); } iBreak = sqliteVdbeMakeLabel(v); iCont = sqliteVdbeMakeLabel(v); @@ -1424,8 +1431,8 @@ static int multiSelect(Parse *pParse, Select *p, int eDest, int iParm){ */ assert( p->pEList ); if( eDest==SRT_Callback ){ - generateColumnNames(pParse, p->base, 0, p->pEList); - generateColumnTypes(pParse, p->base, p->pSrc, p->pEList); + generateColumnNames(pParse, 0, p->pEList); + generateColumnTypes(pParse, p->pSrc, p->pEList); } iBreak = sqliteVdbeMakeLabel(v); iCont = sqliteVdbeMakeLabel(v); @@ -1450,9 +1457,8 @@ static int multiSelect(Parse *pParse, Select *p, int eDest, int iParm){ } assert( p->pEList && pPrior->pEList ); if( p->pEList->nExpr!=pPrior->pEList->nExpr ){ - sqliteSetString(&pParse->zErrMsg, "SELECTs to the left and right of ", - selectOpName(p->op), " do not have the same number of result columns", 0); - pParse->nErr++; + sqliteErrorMsg(pParse, "SELECTs to the left and right of %s" + " do not have the same number of result columns", selectOpName(p->op)); return 1; } @@ -1467,36 +1473,10 @@ static int multiSelect(Parse *pParse, Select *p, int eDest, int iParm){ } /* -** Recursively scan through an expression tree. For every reference -** to a column in table number iFrom, change that reference to the -** same column in table number iTo. -*/ -static void changeTablesInList(ExprList*, int, int); /* Forward Declaration */ -static void changeTables(Expr *pExpr, int iFrom, int iTo){ - if( pExpr==0 ) return; - if( pExpr->op==TK_COLUMN && pExpr->iTable==iFrom ){ - pExpr->iTable = iTo; - }else{ - changeTables(pExpr->pLeft, iFrom, iTo); - changeTables(pExpr->pRight, iFrom, iTo); - changeTablesInList(pExpr->pList, iFrom, iTo); - } -} -static void changeTablesInList(ExprList *pList, int iFrom, int iTo){ - if( pList ){ - int i; - for(i=0; i<pList->nExpr; i++){ - changeTables(pList->a[i].pExpr, iFrom, iTo); - } - } -} - -/* ** Scan through the expression pExpr. Replace every reference to -** a column in table number iTable with a copy of the corresponding +** a column in table number iTable with a copy of the iColumn-th ** entry in pEList. (But leave references to the ROWID column -** unchanged.) When making a copy of an expression in pEList, change -** references to columns in table iSub into references to table iTable. +** unchanged.) ** ** This routine is part of the flattening procedure. A subquery ** whose result set is defined by pEList appears as entry in the @@ -1505,8 +1485,8 @@ static void changeTablesInList(ExprList *pList, int iFrom, int iTo){ ** changes to pExpr so that it refers directly to the source table ** of the subquery rather the result set of the subquery. */ -static void substExprList(ExprList*,int,ExprList*,int); /* Forward Decl */ -static void substExpr(Expr *pExpr, int iTable, ExprList *pEList, int iSub){ +static void substExprList(ExprList*,int,ExprList*); /* Forward Decl */ +static void substExpr(Expr *pExpr, int iTable, ExprList *pEList){ if( pExpr==0 ) return; if( pExpr->op==TK_COLUMN && pExpr->iTable==iTable && pExpr->iColumn>=0 ){ Expr *pNew; @@ -1527,21 +1507,18 @@ static void substExpr(Expr *pExpr, int iTable, ExprList *pEList, int iSub){ pExpr->iAgg = pNew->iAgg; sqliteTokenCopy(&pExpr->token, &pNew->token); sqliteTokenCopy(&pExpr->span, &pNew->span); - if( iSub!=iTable ){ - changeTables(pExpr, iSub, iTable); - } }else{ - substExpr(pExpr->pLeft, iTable, pEList, iSub); - substExpr(pExpr->pRight, iTable, pEList, iSub); - substExprList(pExpr->pList, iTable, pEList, iSub); + substExpr(pExpr->pLeft, iTable, pEList); + substExpr(pExpr->pRight, iTable, pEList); + substExprList(pExpr->pList, iTable, pEList); } } static void -substExprList(ExprList *pList, int iTable, ExprList *pEList, int iSub){ +substExprList(ExprList *pList, int iTable, ExprList *pEList){ int i; if( pList==0 ) return; for(i=0; i<pList->nExpr; i++){ - substExpr(pList->a[i].pExpr, iTable, pEList, iSub); + substExpr(pList->a[i].pExpr, iTable, pEList); } } @@ -1578,7 +1555,8 @@ substExprList(ExprList *pList, int iTable, ExprList *pEList, int iSub){ ** ** (2) The subquery is not an aggregate or the outer query is not a join. ** -** (3) The subquery is not a join. +** (3) The subquery is not the right operand of a left outer join, or +** the subquery is not itself a join. (Ticket #306) ** ** (4) The subquery is not DISTINCT or the outer query is not a join. ** @@ -1604,7 +1582,7 @@ substExprList(ExprList *pList, int iTable, ExprList *pEList, int iSub){ ** 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 return 0. +** If flattening is not attempted, this routine is a no-op and returns 0. ** If flattening is attempted this routine returns 1. ** ** All of the expression analysis must occur on both the outer query and @@ -1621,8 +1599,8 @@ static int flattenSubquery( SrcList *pSrc; /* The FROM clause of the outer query */ SrcList *pSubSrc; /* The FROM clause of the subquery */ ExprList *pList; /* The result set of the outer query */ + int iParent; /* VDBE cursor number of the pSub result set temp table */ int i; - int iParent, iSub; Expr *pWhere; /* Check to see if flattening is permitted. Return 0 if not. @@ -1636,19 +1614,81 @@ static int flattenSubquery( if( subqueryIsAgg && pSrc->nSrc>1 ) return 0; pSubSrc = pSub->pSrc; assert( pSubSrc ); - if( pSubSrc->nSrc!=1 ) return 0; + if( pSubSrc->nSrc==0 ) return 0; if( (pSub->isDistinct || pSub->nLimit>=0) && (pSrc->nSrc>1 || isAgg) ){ return 0; } if( (p->isDistinct || p->nLimit>=0) && subqueryIsAgg ) return 0; if( p->pOrderBy && pSub->pOrderBy ) return 0; + /* Restriction 3: If the subquery is a join, make sure the subquery is + ** not used as the right operand of an outer join. Examples of why this + ** is not allowed: + ** + ** t1 LEFT OUTER JOIN (t2 JOIN t3) + ** + ** If we flatten the above, we would get + ** + ** (t1 LEFT OUTER JOIN t2) JOIN t3 + ** + ** which is not at all the same thing. + */ + if( pSubSrc->nSrc>1 && iFrom>0 && (pSrc->a[iFrom-1].jointype & JT_OUTER)!=0 ){ + return 0; + } + /* If we reach this point, it means flattening is permitted for the - ** i-th entry of the FROM clause in the outer query. + ** iFrom-th entry of the FROM clause in the outer query. + */ + + /* Move all of the FROM elements of the subquery into the + ** the FROM clause of the outer query. Before doing this, remember + ** the cursor number for the original outer query FROM element in + ** iParent. The iParent cursor will never be used. Subsequent code + ** will scan expressions looking for iParent references and replace + ** those references with expressions that resolve to the subquery FROM + ** elements we are now copying in. + */ + iParent = pSrc->a[iFrom].iCursor; + { + int nSubSrc = pSubSrc->nSrc; + int jointype = pSrc->a[iFrom].jointype; + + if( pSrc->a[iFrom].pTab && pSrc->a[iFrom].pTab->isTransient ){ + sqliteDeleteTable(0, pSrc->a[iFrom].pTab); + } + sqliteFree(pSrc->a[iFrom].zName); + sqliteFree(pSrc->a[iFrom].zAlias); + if( nSubSrc>1 ){ + int extra = nSubSrc - 1; + for(i=1; i<nSubSrc; i++){ + pSrc = sqliteSrcListAppend(pSrc, 0, 0); + } + p->pSrc = pSrc; + for(i=pSrc->nSrc-1; i-extra>=iFrom; i--){ + pSrc->a[i] = pSrc->a[i-extra]; + } + } + for(i=0; i<nSubSrc; i++){ + pSrc->a[i+iFrom] = pSubSrc->a[i]; + memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i])); + } + pSrc->a[iFrom+nSubSrc-1].jointype = jointype; + } + + /* Now begin substituting subquery result set expressions for + ** references to the iParent in the outer query. + ** + ** Example: + ** + ** SELECT a+5, b*10 FROM (SELECT x*3 AS a, y+10 AS b FROM t1) WHERE a>b; + ** \ \_____________ subquery __________/ / + ** \_____________________ outer query ______________________________/ + ** + ** We look at every expression in the outer query and every place we see + ** "a" we substitute "x*3" and every place we see "b" we substitute "y+10". */ - iParent = p->base + iFrom; - iSub = pSub->base; - substExprList(p->pEList, iParent, pSub->pEList, iSub); + substExprList(p->pEList, iParent, pSub->pEList); pList = p->pEList; for(i=0; i<pList->nExpr; i++){ Expr *pExpr; @@ -1657,22 +1697,18 @@ static int flattenSubquery( } } if( isAgg ){ - substExprList(p->pGroupBy, iParent, pSub->pEList, iSub); - substExpr(p->pHaving, iParent, pSub->pEList, iSub); + substExprList(p->pGroupBy, iParent, pSub->pEList); + substExpr(p->pHaving, iParent, pSub->pEList); } if( pSub->pOrderBy ){ assert( p->pOrderBy==0 ); p->pOrderBy = pSub->pOrderBy; pSub->pOrderBy = 0; - changeTablesInList(p->pOrderBy, iSub, iParent); }else if( p->pOrderBy ){ - substExprList(p->pOrderBy, iParent, pSub->pEList, iSub); + substExprList(p->pOrderBy, iParent, pSub->pEList); } if( pSub->pWhere ){ pWhere = sqliteExprDup(pSub->pWhere); - if( iParent!=iSub ){ - changeTables(pWhere, iSub, iParent); - } }else{ pWhere = 0; } @@ -1680,12 +1716,9 @@ static int flattenSubquery( assert( p->pHaving==0 ); p->pHaving = p->pWhere; p->pWhere = pWhere; - substExpr(p->pHaving, iParent, pSub->pEList, iSub); + substExpr(p->pHaving, iParent, pSub->pEList); if( pSub->pHaving ){ Expr *pHaving = sqliteExprDup(pSub->pHaving); - if( iParent!=iSub ){ - changeTables(pHaving, iSub, iParent); - } if( p->pHaving ){ p->pHaving = sqliteExpr(TK_AND, p->pHaving, pHaving, 0); }else{ @@ -1694,19 +1727,23 @@ static int flattenSubquery( } assert( p->pGroupBy==0 ); p->pGroupBy = sqliteExprListDup(pSub->pGroupBy); - if( iParent!=iSub ){ - changeTablesInList(p->pGroupBy, iSub, iParent); - } }else if( p->pWhere==0 ){ p->pWhere = pWhere; }else{ - substExpr(p->pWhere, iParent, pSub->pEList, iSub); + substExpr(p->pWhere, iParent, pSub->pEList); if( pWhere ){ p->pWhere = sqliteExpr(TK_AND, p->pWhere, pWhere, 0); } } + + /* The flattened query is distinct if either the inner or the + ** outer query is distinct. + */ p->isDistinct = p->isDistinct || pSub->isDistinct; + /* Transfer the limit expression from the subquery to the outer + ** query. + */ if( pSub->nLimit>=0 ){ if( p->nLimit<0 ){ p->nLimit = pSub->nLimit; @@ -1716,27 +1753,9 @@ static int flattenSubquery( } p->nOffset += pSub->nOffset; - /* If the subquery contains subqueries of its own, that were not - ** flattened, then code will have already been generated to put - ** the results of those sub-subqueries into VDBE cursors relative - ** to the subquery. We must translate the cursor number into values - ** suitable for use by the outer query. + /* Finially, delete what is left of the subquery and return + ** success. */ - for(i=0; i<pSubSrc->nSrc; i++){ - Vdbe *v; - if( pSubSrc->a[i].pSelect==0 ) continue; - v = sqliteGetVdbe(pParse); - sqliteVdbeAddOp(v, OP_RenameCursor, pSub->base+i, p->base+i); - } - - if( pSrc->a[iFrom].pTab && pSrc->a[iFrom].pTab->isTransient ){ - sqliteDeleteTable(0, pSrc->a[iFrom].pTab); - } - pSrc->a[iFrom].pTab = pSubSrc->a[0].pTab; - pSubSrc->a[0].pTab = 0; - assert( pSrc->a[iFrom].pSelect==pSub ); - pSrc->a[iFrom].pSelect = pSubSrc->a[0].pSelect; - pSubSrc->a[0].pSelect = 0; sqliteSelectDelete(pSub); return 1; } @@ -1768,7 +1787,6 @@ static int simpleMinMaxQuery(Parse *pParse, Select *p, int eDest, int iParm){ Index *pIdx; int base; Vdbe *v; - int openOp; int seekOp; int cont; ExprList eList; @@ -1818,8 +1836,8 @@ static int simpleMinMaxQuery(Parse *pParse, Select *p, int eDest, int iParm){ v = sqliteGetVdbe(pParse); if( v==0 ) return 0; if( eDest==SRT_Callback ){ - generateColumnNames(pParse, p->base, p->pSrc, p->pEList); - generateColumnTypes(pParse, p->base, p->pSrc, p->pEList); + generateColumnNames(pParse, p->pSrc, p->pEList); + generateColumnTypes(pParse, p->pSrc, p->pEList); } /* Generating code to find the min or the max. Basically all we have @@ -1827,18 +1845,17 @@ static int simpleMinMaxQuery(Parse *pParse, Select *p, int eDest, int iParm){ ** the min() or max() is on the INTEGER PRIMARY KEY, then find the first ** or last entry in the main table. */ - if( !pParse->schemaVerified && (pParse->db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_VerifyCookie, pParse->db->schema_cookie, 0); - pParse->schemaVerified = 1; - } - openOp = pTab->isTemp ? OP_OpenAux : OP_Open; - base = p->base; - sqliteVdbeAddOp(v, openOp, base, pTab->tnum); + sqliteCodeVerifySchema(pParse, pTab->iDb); + base = p->pSrc->a[0].iCursor; + sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenRead, base, pTab->tnum); sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC); + cont = sqliteVdbeMakeLabel(v); if( pIdx==0 ){ sqliteVdbeAddOp(v, seekOp, base, 0); }else{ - sqliteVdbeAddOp(v, openOp, base+1, pIdx->tnum); + sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenRead, base+1, pIdx->tnum); sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC); sqliteVdbeAddOp(v, seekOp, base+1, 0); sqliteVdbeAddOp(v, OP_IdxRecno, base+1, 0); @@ -1849,7 +1866,6 @@ static int simpleMinMaxQuery(Parse *pParse, Select *p, int eDest, int iParm){ memset(&eListItem, 0, sizeof(eListItem)); eList.a = &eListItem; eList.a[0].pExpr = pExpr; - cont = sqliteVdbeMakeLabel(v); selectInnerLoop(pParse, p, &eList, 0, 0, 0, -1, eDest, iParm, cont, cont); sqliteVdbeResolveLabel(v, cont); sqliteVdbeAddOp(v, OP_Close, base, 0); @@ -1929,11 +1945,10 @@ int sqliteSelect( Expr *pHaving; /* The HAVING clause. May be NULL */ int isDistinct; /* True if the DISTINCT keyword is present */ int distinct; /* Table to use for the distinct set */ - int base; /* First cursor available for use */ int rc = 1; /* Value to return from this function */ if( sqlite_malloc_failed || pParse->nErr || p==0 ) return 1; - if( sqliteAuthCheck(pParse, SQLITE_SELECT, 0, 0) ) return 1; + if( sqliteAuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1; /* If there is are a sequence of queries, do the earlier ones first. */ @@ -1950,12 +1965,9 @@ int sqliteSelect( pHaving = p->pHaving; isDistinct = p->isDistinct; - /* Allocate a block of VDBE cursors, one for each table in the FROM clause. - ** The WHERE processing requires that the cursors for the tables in the - ** FROM clause be consecutive. + /* Allocate VDBE cursors for each table in the FROM clause */ - base = p->base = pParse->nTab; - pParse->nTab += pTabList->nSrc; + sqliteSrcListAssignCursors(pParse, pTabList); /* ** Do not even attempt to generate any code if we have already seen @@ -1978,9 +1990,8 @@ int sqliteSelect( ** only a single column may be output. */ if( (eDest==SRT_Mem || eDest==SRT_Set) && pEList->nExpr>1 ){ - sqliteSetString(&pParse->zErrMsg, "only a single result allowed for " - "a SELECT that is part of an expression", 0); - pParse->nErr++; + sqliteErrorMsg(pParse, "only a single result allowed for " + "a SELECT that is part of an expression"); goto select_end; } @@ -2002,7 +2013,7 @@ int sqliteSelect( ** Resolve the column names and do a semantics check on all the expressions. */ for(i=0; i<pEList->nExpr; i++){ - if( sqliteExprResolveIds(pParse, base, pTabList, 0, pEList->a[i].pExpr) ){ + if( sqliteExprResolveIds(pParse, pTabList, 0, pEList->a[i].pExpr) ){ goto select_end; } if( sqliteExprCheck(pParse, pEList->a[i].pExpr, 1, &isAgg) ){ @@ -2010,22 +2021,20 @@ int sqliteSelect( } } if( pWhere ){ - if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pWhere) ){ + if( sqliteExprResolveIds(pParse, pTabList, pEList, pWhere) ){ goto select_end; } if( sqliteExprCheck(pParse, pWhere, 0, 0) ){ goto select_end; } - sqliteOracle8JoinFixup(base, pTabList, pWhere); + sqliteOracle8JoinFixup(pTabList, pWhere); } if( pHaving ){ if( pGroupBy==0 ){ - sqliteSetString(&pParse->zErrMsg, "a GROUP BY clause is required " - "before HAVING", 0); - pParse->nErr++; + sqliteErrorMsg(pParse, "a GROUP BY clause is required before HAVING"); goto select_end; } - if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pHaving) ){ + if( sqliteExprResolveIds(pParse, pTabList, pEList, pHaving) ){ goto select_end; } if( sqliteExprCheck(pParse, pHaving, 1, &isAgg) ){ @@ -2040,7 +2049,7 @@ int sqliteSelect( sqliteExprDelete(pE); pE = pOrderBy->a[i].pExpr = sqliteExprDup(pEList->a[iCol-1].pExpr); } - if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pE) ){ + if( sqliteExprResolveIds(pParse, pTabList, pEList, pE) ){ goto select_end; } if( sqliteExprCheck(pParse, pE, isAgg, 0) ){ @@ -2048,16 +2057,13 @@ int sqliteSelect( } if( sqliteExprIsConstant(pE) ){ if( sqliteExprIsInteger(pE, &iCol)==0 ){ - sqliteSetString(&pParse->zErrMsg, - "ORDER BY terms must not be non-integer constants", 0); - pParse->nErr++; + sqliteErrorMsg(pParse, + "ORDER BY terms must not be non-integer constants"); goto select_end; }else if( iCol<=0 || iCol>pEList->nExpr ){ - char zBuf[2000]; - sprintf(zBuf,"ORDER BY column number %d out of range - should be " + sqliteErrorMsg(pParse, + "ORDER BY column number %d out of range - should be " "between 1 and %d", iCol, pEList->nExpr); - sqliteSetString(&pParse->zErrMsg, zBuf, 0); - pParse->nErr++; goto select_end; } } @@ -2071,7 +2077,7 @@ int sqliteSelect( sqliteExprDelete(pE); pE = pGroupBy->a[i].pExpr = sqliteExprDup(pEList->a[iCol-1].pExpr); } - if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pE) ){ + if( sqliteExprResolveIds(pParse, pTabList, pEList, pE) ){ goto select_end; } if( sqliteExprCheck(pParse, pE, isAgg, 0) ){ @@ -2079,16 +2085,13 @@ int sqliteSelect( } if( sqliteExprIsConstant(pE) ){ if( sqliteExprIsInteger(pE, &iCol)==0 ){ - sqliteSetString(&pParse->zErrMsg, - "GROUP BY terms must not be non-integer constants", 0); - pParse->nErr++; + sqliteErrorMsg(pParse, + "GROUP BY terms must not be non-integer constants"); goto select_end; }else if( iCol<=0 || iCol>pEList->nExpr ){ - char zBuf[2000]; - sprintf(zBuf,"GROUP BY column number %d out of range - should be " + sqliteErrorMsg(pParse, + "GROUP BY column number %d out of range - should be " "between 1 and %d", iCol, pEList->nExpr); - sqliteSetString(&pParse->zErrMsg, zBuf, 0); - pParse->nErr++; goto select_end; } } @@ -2112,7 +2115,7 @@ int sqliteSelect( ** step is skipped if the output is going to some other destination. */ if( eDest==SRT_Callback ){ - generateColumnNames(pParse, p->base, pTabList, pEList); + generateColumnNames(pParse, pTabList, pEList); } /* Set the limiter @@ -2138,12 +2141,25 @@ int sqliteSelect( /* Generate code for all sub-queries in the FROM clause */ for(i=0; i<pTabList->nSrc; i++){ + const char *zSavedAuthContext; + int needRestoreContext; + if( pTabList->a[i].pSelect==0 ) continue; - sqliteSelect(pParse, pTabList->a[i].pSelect, SRT_TempTable, base+i, - p, i, &isAgg); + if( pTabList->a[i].zName!=0 ){ + zSavedAuthContext = pParse->zAuthContext; + pParse->zAuthContext = pTabList->a[i].zName; + needRestoreContext = 1; + }else{ + needRestoreContext = 0; + } + sqliteSelect(pParse, pTabList->a[i].pSelect, SRT_TempTable, + pTabList->a[i].iCursor, p, i, &isAgg); + if( needRestoreContext ){ + pParse->zAuthContext = zSavedAuthContext; + } pTabList = p->pSrc; pWhere = p->pWhere; - if( eDest==SRT_Callback ){ + if( eDest!=SRT_Union && eDest!=SRT_Except && eDest!=SRT_Discard ){ pOrderBy = p->pOrderBy; } pGroupBy = p->pGroupBy; @@ -2165,7 +2181,7 @@ int sqliteSelect( ** than a callback. */ if( eDest==SRT_Callback ){ - generateColumnTypes(pParse, p->base, pTabList, pEList); + generateColumnTypes(pParse, pTabList, pEList); } /* If the output is destined for a temporary table, open that table. @@ -2239,7 +2255,7 @@ int sqliteSelect( /* Begin the database scan */ - pWInfo = sqliteWhereBegin(pParse, p->base, pTabList, pWhere, 0, + pWInfo = sqliteWhereBegin(pParse, pTabList, pWhere, 0, pGroupBy ? 0 : &pOrderBy); if( pWInfo==0 ) goto select_end; diff --git a/ext/sqlite/libsqlite/src/sqlite.h.in b/ext/sqlite/libsqlite/src/sqlite.h.in index b567a1a6fb..c3980043f0 100644 --- a/ext/sqlite/libsqlite/src/sqlite.h.in +++ b/ext/sqlite/libsqlite/src/sqlite.h.in @@ -165,6 +165,7 @@ int sqlite_exec( #define SQLITE_MISUSE 21 /* Library used incorrectly */ #define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ #define SQLITE_AUTH 23 /* Authorization denied */ +#define SQLITE_FORMAT 24 /* Auxiliary database format error */ #define SQLITE_ROW 100 /* sqlite_step() has another row ready */ #define SQLITE_DONE 101 /* sqlite_step() has finished executing */ @@ -512,7 +513,7 @@ int sqlite_aggregate_count(sqlite_func*); */ int sqlite_set_authorizer( sqlite*, - int (*xAuth)(void*,int,const char*,const char*), + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), void *pUserData ); @@ -521,7 +522,11 @@ int sqlite_set_authorizer( ** be one of the values below. These values signify what kind of operation ** is to be authorized. The 3rd and 4th parameters to the authorization ** function will be parameters or NULL depending on which of the following -** codes is used as the second parameter. +** codes is used as the second parameter. The 5th parameter is the name +** of the database ("main", "temp", etc.) if applicable. The 6th parameter +** is the name of the inner-most trigger or view that is responsible for +** the access attempt or NULL if this access attempt is directly from +** input SQL code. ** ** Arg-3 Arg-4 */ @@ -675,16 +680,6 @@ int sqlite_step( */ int sqlite_finalize(sqlite_vm*, char **pzErrMsg); -/* -** Attempt to open the file named in the argument as the auxiliary database -** file. The auxiliary database file is used to store TEMP tables. But -** by using this API, it is possible to trick SQLite into opening two -** separate databases and acting on them as if they were one. -** -****** THIS IS AN EXPERIMENTAL API AND IS SUBJECT TO CHANGE. ****** -*/ -int sqlite_open_aux_file(sqlite *db, const char *zName, char **pzErrMsg); - #ifdef __cplusplus } /* End of the 'extern "C"' block */ #endif diff --git a/ext/sqlite/libsqlite/src/sqliteInt.h b/ext/sqlite/libsqlite/src/sqliteInt.h index 17fa4787de..6c0713d96b 100644 --- a/ext/sqlite/libsqlite/src/sqliteInt.h +++ b/ext/sqlite/libsqlite/src/sqliteInt.h @@ -58,6 +58,37 @@ #define NULL_DISTINCT_FOR_UNIQUE 1 /* +** The maximum number of attached databases. This must be at least 2 +** in order to support the main database file (0) and the file used to +** hold temporary tables (1). And it must be less than 256 because +** an unsigned character is used to stored the database index. +*/ +#define MAX_ATTACHED 10 + +/* +** The next macro is used to determine where TEMP tables and indices +** are stored. Possible values: +** +** 0 Always use a temporary files +** 1 Use a file unless overridden by "PRAGMA temp_store" +** 2 Use memory unless overridden by "PRAGMA temp_store" +** 3 Always use memory +*/ +#ifndef TEMP_STORE +# define TEMP_STORE 1 +#endif + +/* +** When building SQLite for embedded systems where memory is scarce, +** you can define one or more of the following macros to omit extra +** features of the library and thus keep the size of the library to +** a minimum. +*/ +/* #define SQLITE_OMIT_AUTHORIZATION 1 */ +/* #define SQLITE_OMIT_INMEMORYDB 1 */ +/* #define SQLITE_OMIT_VACUUM 1 */ + +/* ** Integers of known sizes. These typedefs might change for architectures ** where the sizes very. Preprocessor macros are available so that the ** types can be conveniently redefined at compile-type. Like this: @@ -187,6 +218,59 @@ typedef struct Trigger Trigger; typedef struct TriggerStep TriggerStep; typedef struct TriggerStack TriggerStack; typedef struct FKey FKey; +typedef struct Db Db; +typedef struct AuthContext AuthContext; + +/* +** Each database file to be accessed by the system is an instance +** of the following structure. There are normally two of these structures +** in the sqlite.aDb[] array. aDb[0] is the main database file and +** aDb[1] is the database file used to hold temporary tables. Additional +** databases may be attached. +*/ +struct Db { + char *zName; /* Name of this database */ + Btree *pBt; /* The B*Tree structure for this database file */ + int schema_cookie; /* Database schema version number for this file */ + Hash tblHash; /* All tables indexed by name */ + Hash idxHash; /* All (named) indices indexed by name */ + Hash trigHash; /* All triggers indexed by name */ + Hash aFKey; /* Foreign keys indexed by to-table */ + u8 inTrans; /* True if a transaction is underway for this backend */ + u16 flags; /* Flags associated with this database */ +}; + +/* +** These macros can be used to test, set, or clear bits in the +** Db.flags field. +*/ +#define DbHasProperty(D,I,P) (((D)->aDb[I].flags&(P))==(P)) +#define DbHasAnyProperty(D,I,P) (((D)->aDb[I].flags&(P))!=0) +#define DbSetProperty(D,I,P) (D)->aDb[I].flags|=(P) +#define DbClearProperty(D,I,P) (D)->aDb[I].flags&=~(P) + +/* +** Allowed values for the DB.flags field. +** +** The DB_Locked flag is set when the first OP_Transaction or OP_Checkpoint +** opcode is emitted for a database. This prevents multiple occurances +** of those opcodes for the same database in the same program. Similarly, +** the DB_Cookie flag is set when the OP_VerifyCookie opcode is emitted, +** and prevents duplicate OP_VerifyCookies from taking up space and slowing +** down execution. +** +** The DB_SchemaLoaded flag is set after the database schema has been +** read into internal hash tables. +** +** DB_UnresetViews means that one or more views have column names that +** have been filled out. If the schema changes, these column names might +** changes and so the view will need to be reset. +*/ +#define DB_Locked 0x0001 /* OP_Transaction opcode has been emitted */ +#define DB_Cookie 0x0002 /* OP_VerifyCookie opcode has been emiited */ +#define DB_SchemaLoaded 0x0004 /* The schema has been loaded */ +#define DB_UnresetViews 0x0008 /* Some views have defined column names */ + /* ** Each database is an instance of the following structure. @@ -202,25 +286,27 @@ typedef struct FKey FKey; ** file_format==3 Version 2.6.0. Fix empty-string index bug. ** file_format==4 Version 2.7.0. Add support for separate numeric and ** text datatypes. +** +** The sqlite.temp_store determines where temporary database files +** are stored. If 1, then a file is created to hold those tables. If +** 2, then they are held in memory. 0 means use the default value in +** the TEMP_STORE macro. */ struct sqlite { - Btree *pBe; /* The B*Tree backend */ - Btree *pBeTemp; /* Backend for session temporary tables */ + int nDb; /* Number of backends currently in use */ + Db *aDb; /* All backends */ + Db aDbStatic[2]; /* Static space for the 2 default backends */ int flags; /* Miscellanous flags. See below */ u8 file_format; /* What file format version is this database? */ u8 safety_level; /* How aggressive at synching data to disk */ u8 want_to_close; /* Close after all VDBEs are deallocated */ - int schema_cookie; /* Magic number that changes with the schema */ - int next_cookie; /* Value of schema_cookie after commit */ + int next_cookie; /* Next value of aDb[0].schema_cookie */ int cache_size; /* Number of pages to use in the cache */ + int temp_store; /* 1=file, 2=memory, 0=compile-time default */ int nTable; /* Number of tables in the database */ void *pBusyArg; /* 1st Argument to the busy callback */ int (*xBusyCallback)(void *,const char*,int); /* The busy callback */ - Hash tblHash; /* All tables indexed by name */ - Hash idxHash; /* All (named) indices indexed by name */ - Hash trigHash; /* All triggers indexed by name */ Hash aFunc; /* All functions that can be in SQL exprs */ - Hash aFKey; /* Foreign keys indexed by to-table */ int lastRowid; /* ROWID of most recent insert */ int priorNewRowid; /* Last randomly generated ROWID */ int onError; /* Default conflict algorithm */ @@ -232,13 +318,18 @@ struct sqlite { void *pTraceArg; /* Argument to the trace function */ #endif #ifndef SQLITE_OMIT_AUTHORIZATION - int (*xAuth)(void*,int,const char*,const char*); /* Access Auth function */ + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*); + /* Access authorization function */ void *pAuthArg; /* 1st argument to the access auth function */ #endif }; /* -** Possible values for the sqlite.flags. +** Possible values for the sqlite.flags and or Db.flags fields. +** +** On sqlite.flags, the SQLITE_InTrans value means that we have +** executed a BEGIN. On Db.flags, SQLITE_InTrans means a statement +** transaction is active on that particular database file. */ #define SQLITE_VdbeTrace 0x00000001 /* True to trace VDBE execution */ #define SQLITE_Initialized 0x00000002 /* True after initialization */ @@ -251,10 +342,7 @@ struct sqlite { /* the count using a callback. */ #define SQLITE_NullCallback 0x00000080 /* Invoke the callback once if the */ /* result set is empty */ -#define SQLITE_ResultDetails 0x00000100 /* Details added to result set */ -#define SQLITE_UnresetViews 0x00000200 /* True if one or more views have */ - /* defined column names */ -#define SQLITE_ReportTypes 0x00000400 /* Include information on datatypes */ +#define SQLITE_ReportTypes 0x00000200 /* Include information on datatypes */ /* in 4th argument of callback */ /* @@ -314,26 +402,27 @@ struct Column { ** Each SQL table is represented in memory by an instance of the ** following structure. ** -** Expr.zName is the name of the table. The case of the original +** Table.zName is the name of the table. The case of the original ** CREATE TABLE statement is stored, but case is not significant for ** comparisons. ** -** Expr.nCol is the number of columns in this table. Expr.aCol is a +** Table.nCol is the number of columns in this table. Table.aCol is a ** pointer to an array of Column structures, one for each column. ** -** If the table has an INTEGER PRIMARY KEY, then Expr.iPKey is the index of -** the column that is that key. Otherwise Expr.iPKey is negative. Note +** If the table has an INTEGER PRIMARY KEY, then Table.iPKey is the index of +** the column that is that key. Otherwise Table.iPKey is negative. Note ** that the datatype of the PRIMARY KEY must be INTEGER for this field to ** be set. An INTEGER PRIMARY KEY is used as the rowid for each row of ** the table. If a table has no INTEGER PRIMARY KEY, then a random rowid -** is generated for each row of the table. Expr.hasPrimKey is true if +** is generated for each row of the table. Table.hasPrimKey is true if ** the table has any PRIMARY KEY, INTEGER or otherwise. ** -** Expr.tnum is the page number for the root BTree page of the table in the -** database file. If Expr.isTemp is true, then this page occurs in the -** auxiliary database file, not the main database file. If Expr.isTransient +** Table.tnum is the page number for the root BTree page of the table in the +** database file. If Table.iDb is the index of the database table backend +** in sqlite.aDb[]. 0 is for the main database and 1 is for the file that +** holds temporary tables and indices. If Table.isTransient ** is true, then the table is stored in a file that is automatically deleted -** when the VDBE cursor to the table is closed. In this case Expr.tnum +** when the VDBE cursor to the table is closed. In this case Table.tnum ** refers VDBE cursor number that holds the table open, not to the root ** page number. Transient tables are used to hold the results of a ** sub-query that appears instead of a real table name in the FROM clause @@ -348,7 +437,7 @@ struct Table { int tnum; /* Root BTree node for this table (see note above) */ Select *pSelect; /* NULL for tables. Points to definition if a view. */ u8 readOnly; /* True if this table should not be written by the user */ - u8 isTemp; /* True if stored in db->pBeTemp instead of db->pBe */ + u8 iDb; /* Index into sqlite.aDb[] of the backend for this table */ u8 isTransient; /* True if automatically deleted when VDBE finishes */ u8 hasPrimKey; /* True if there exists a primary key */ u8 keyConf; /* What to do in case of uniqueness conflict on iPKey */ @@ -376,7 +465,7 @@ struct Table { ** the from-table is created. The existance of the to-table is not checked ** until an attempt is made to insert data into the from-table. ** -** The sqlite.aFKey hash table stores pointers to to this structure +** The sqlite.aFKey hash table stores pointers to this structure ** given the name of a to-table. For each to-table, all foreign keys ** associated with that table are on a linked list using the FKey.pNextTo ** field. @@ -454,6 +543,13 @@ struct FKey { ** first column to be indexed (c3) has an index of 2 in Ex1.aCol[]. ** The second column to be indexed (c1) has an index of 0 in ** Ex1.aCol[], hence Ex2.aiColumn[1]==0. +** +** The Index.onError field determines whether or not the indexed columns +** must be unique and what to do if they are not. When Index.onError=OE_None, +** it means this is not a unique index. Otherwise it is a unique index +** and the value of Index.onError indicate the which conflict resolution +** algorithm to employ whenever an attempt is made to insert a non-unique +** element. */ struct Index { char *zName; /* Name of this index */ @@ -461,9 +557,9 @@ struct Index { int *aiColumn; /* Which columns are used by this index. 1st is 0 */ Table *pTable; /* The SQL table being indexed */ int tnum; /* Page containing root of this index in database file */ - u8 isUnique; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ u8 onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ u8 autoIndex; /* True if is automatically created (ex: by UNIQUE) */ + u8 iDb; /* Index in sqlite.aDb[] of where this index is stored */ Index *pNext; /* The next index associated with the same table */ }; @@ -514,7 +610,8 @@ struct Token { struct Expr { u8 op; /* Operation performed by this node */ u8 dataType; /* Either SQLITE_SO_TEXT or SQLITE_SO_NUM */ - u16 flags; /* Various flags. See below */ + u8 iDb; /* Database referenced by this expression */ + u8 flags; /* Various flags. See below */ Expr *pLeft, *pRight; /* Left and right subnodes */ ExprList *pList; /* A list of expressions used as function arguments ** or in "<expr> IN (<expr-list)" */ @@ -589,18 +686,26 @@ struct IdList { ** The following structure describes the FROM clause of a SELECT statement. ** Each table or subquery in the FROM clause is a separate element of ** the SrcList.a[] array. +** +** With the addition of multiple database support, the following structure +** can also be used to describe a particular table such as the table that +** is modified by an INSERT, DELETE, or UPDATE statement. In standard SQL, +** such a table must be a simple name: ID. But in SQLite, the table can +** now be identified by a database name, a dot, then the table name: ID.ID. */ struct SrcList { int nSrc; /* Number of tables or subqueries in the FROM clause */ struct SrcList_item { + char *zDatabase; /* Name of database holding this table */ char *zName; /* Name of the table */ char *zAlias; /* The "B" part of a "A AS B" phrase. zName is the "A" */ Table *pTab; /* An SQL table corresponding to zName */ Select *pSelect; /* A SELECT statement used in place of a table name */ int jointype; /* Type of join between this table and the next */ + int iCursor; /* The VDBE cursor number used to access this table */ Expr *pOn; /* The ON clause of a join */ IdList *pUsing; /* The USING clause of a join */ - } *a; /* One entry for each identifier on the list */ + } a[1]; /* One entry for each identifier on the list */ }; /* @@ -645,7 +750,6 @@ struct WhereInfo { SrcList *pTabList; /* List of tables in the join */ int iContinue; /* Jump here to continue with next record */ int iBreak; /* Jump here to break out of the loop */ - int base; /* Index of first Open opcode */ int nLevel; /* Number of nested loop */ int savedNTab; /* Value of pParse->nTab before WhereBegin() */ int peakNTab; /* Value of pParse->nTab after WhereBegin() */ @@ -682,7 +786,6 @@ struct Select { Select *pPrior; /* Prior select in a compound select statement */ int nLimit, nOffset; /* LIMIT and OFFSET values. -1 means not used */ char *zSelect; /* Complete text of the SELECT command */ - int base; /* Index of VDBE cursor for left-most FROM table */ }; /* @@ -731,7 +834,6 @@ struct AggExpr { */ struct Parse { sqlite *db; /* The main database structure */ - Btree *pBe; /* The database backend */ int rc; /* Return code from execution */ sqlite_callback xCallback; /* The callback function */ void *pArg; /* First argument to the callback function */ @@ -748,10 +850,9 @@ struct Parse { u8 nameClash; /* A permanent table name clashes with temp table name */ u8 useAgg; /* If true, extract field values from the aggregator ** while generating expressions. Normally false */ - u8 schemaVerified; /* True if an OP_VerifySchema has been coded someplace - ** other than after an OP_Transaction */ - u8 isTemp; /* True if parsing temporary tables */ + u8 iDb; /* Index of database whose schema is being parsed */ u8 useCallback; /* True if callbacks should be used to report results */ + int useDb; /* Restrict references to tables in this database */ int newTnum; /* Table number to use when reparsing CREATE TABLEs */ int nErr; /* Number of errors seen */ int nTab; /* Number of previously allocated VDBE cursors */ @@ -759,7 +860,18 @@ struct Parse { int nSet; /* Number of sets used so far */ int nAgg; /* Number of aggregate expressions */ AggExpr *aAgg; /* An array of aggregate expressions */ - TriggerStack *trigStack; + const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */ + Trigger *pNewTrigger; /* Trigger under construct by a CREATE TRIGGER */ + TriggerStack *trigStack; /* Trigger actions being coded */ +}; + +/* +** An instance of the following structure can be declared on a stack and used +** to save the Parse.zAuthContext value so that it can be restored later. +*/ +struct AuthContext { + const char *zAuthContext; /* Put saved Parse.zAuthContext here */ + Parse *pParse; /* The Parse structure */ }; /* @@ -776,24 +888,13 @@ struct Parse { * * The "step_list" member points to the first element of a linked list * containing the SQL statements specified as the trigger program. - * - * When a trigger is initially created, the "isCommit" member is set to FALSE. - * When a transaction is rolled back, any Trigger structures with "isCommit" set - * to FALSE are deleted by the logic in sqliteRollbackInternalChanges(). When - * a transaction is commited, the "isCommit" member is set to TRUE for any - * Trigger structures for which it is FALSE. - * - * When a trigger is dropped, using the sqliteDropTrigger() interfaced, it is - * removed from the trigHash hash table and added to the trigDrop hash table. - * If the transaction is rolled back, the trigger is re-added into the trigHash - * hash table (and hence the database schema). If the transaction is commited, - * then the Trigger structure is deleted permanently. */ struct Trigger { char *name; /* The name of the trigger */ char *table; /* The table or view to which the trigger applies */ - int op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT */ - int tr_tm; /* One of TK_BEFORE, TK_AFTER */ + u8 iDb; /* Database containing this trigger */ + u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT */ + u8 tr_tm; /* One of TK_BEFORE, TK_AFTER */ Expr *pWhen; /* The WHEN clause of the expresion (may be NULL) */ IdList *pColumns; /* If this is an UPDATE OF <column-list> trigger, the <column-list> is stored here */ @@ -844,6 +945,7 @@ struct Trigger { struct TriggerStep { int op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT, TK_SELECT */ int orconf; /* OE_Rollback etc. */ + Trigger *pTrig; /* The trigger that this step is a part of */ Select *pSelect; /* Valid for SELECT and sometimes INSERT steps (when pExprList == 0) */ @@ -889,9 +991,8 @@ struct TriggerStack { int oldIdx; /* Index of vdbe cursor to "old" temp table */ int orconf; /* Current orconf policy */ int ignoreJump; /* where to jump to for a RAISE(IGNORE) */ - Trigger *pTrigger; - - TriggerStack *pNext; + Trigger *pTrigger; /* The trigger currently being coded */ + TriggerStack *pNext; /* Next trigger down on the trigger stack */ }; /* @@ -907,6 +1008,7 @@ extern int always_code_trigger_setup; int sqliteStrICmp(const char *, const char *); int sqliteStrNICmp(const char *, const char *, int); int sqliteHashNoCase(const char *, int); +int sqliteIsNumber(const char*); int sqliteCompare(const char *, const char *); int sqliteSortCompare(const char *, const char *); void sqliteRealToSortable(double r, char *); @@ -929,6 +1031,7 @@ void sqliteRealToSortable(double r, char *); char *sqliteMPrintf(const char *,...); void sqliteSetString(char **, const char *, ...); void sqliteSetNString(char **, ...); +void sqliteErrorMsg(Parse*, const char*, ...); void sqliteDequote(char*); int sqliteKeywordCode(const char*, int); int sqliteRunParser(Parse*, const char*, char **); @@ -939,9 +1042,9 @@ Expr *sqliteExprFunction(ExprList*, Token*); void sqliteExprDelete(Expr*); ExprList *sqliteExprListAppend(ExprList*,Expr*,Token*); void sqliteExprListDelete(ExprList*); -void sqlitePragma(Parse*,Token*,Token*,int); -void sqliteResetInternalSchema(sqlite*); int sqliteInit(sqlite*, char**); +void sqlitePragma(Parse*,Token*,Token*,int); +void sqliteResetInternalSchema(sqlite*, int); void sqliteBeginParse(Parse*,int); void sqliteRollbackInternalChanges(sqlite*); void sqliteCommitInternalChanges(sqlite*); @@ -958,18 +1061,18 @@ void sqliteAddCollateType(Parse*, int); void sqliteEndTable(Parse*,Token*,Select*); void sqliteCreateView(Parse*,Token*,Token*,Select*,int); int sqliteViewGetColumnNames(Parse*,Table*); -void sqliteViewResetAll(sqlite*); void sqliteDropTable(Parse*, Token*, int); void sqliteDeleteTable(sqlite*, Table*); -void sqliteInsert(Parse*, Token*, ExprList*, Select*, IdList*, int); +void sqliteInsert(Parse*, SrcList*, ExprList*, Select*, IdList*, int); IdList *sqliteIdListAppend(IdList*, Token*); int sqliteIdListIndex(IdList*,const char*); -SrcList *sqliteSrcListAppend(SrcList*, Token*); +SrcList *sqliteSrcListAppend(SrcList*, Token*, Token*); void sqliteSrcListAddAlias(SrcList*, Token*); +void sqliteSrcListAssignCursors(Parse*, SrcList*); void sqliteIdListDelete(IdList*); void sqliteSrcListDelete(SrcList*); -void sqliteCreateIndex(Parse*, Token*, Token*, IdList*, int, Token*, Token*); -void sqliteDropIndex(Parse*, Token*); +void sqliteCreateIndex(Parse*,Token*,SrcList*,IdList*,int,int,Token*,Token*); +void sqliteDropIndex(Parse*, SrcList*); void sqliteAddKeyType(Vdbe*, ExprList*); void sqliteAddIdxKeyType(Vdbe*, Index*); int sqliteSelect(Parse*, Select*, int, int, Select*, int, int*); @@ -977,19 +1080,20 @@ Select *sqliteSelectNew(ExprList*,SrcList*,Expr*,ExprList*,Expr*,ExprList*, int,int,int); void sqliteSelectDelete(Select*); void sqliteSelectUnbind(Select*); -Table *sqliteTableNameToTable(Parse*, const char*); -SrcList *sqliteTableTokenToSrcList(Parse*, Token*); -void sqliteDeleteFrom(Parse*, Token*, Expr*); -void sqliteUpdate(Parse*, Token*, ExprList*, Expr*, int); -WhereInfo *sqliteWhereBegin(Parse*, int, SrcList*, Expr*, int, ExprList**); +Table *sqliteSrcListLookup(Parse*, SrcList*); +int sqliteIsReadOnly(Parse*, Table*, int); +void sqliteDeleteFrom(Parse*, SrcList*, Expr*); +void sqliteUpdate(Parse*, SrcList*, ExprList*, Expr*, int); +WhereInfo *sqliteWhereBegin(Parse*, SrcList*, Expr*, int, ExprList**); void sqliteWhereEnd(WhereInfo*); void sqliteExprCode(Parse*, Expr*); void sqliteExprIfTrue(Parse*, Expr*, int, int); void sqliteExprIfFalse(Parse*, Expr*, int, int); -Table *sqliteFindTable(sqlite*,const char*); -Index *sqliteFindIndex(sqlite*,const char*); +Table *sqliteFindTable(sqlite*,const char*, const char*); +Table *sqliteLocateTable(Parse*,const char*, const char*); +Index *sqliteFindIndex(sqlite*,const char*, const char*); void sqliteUnlinkAndDeleteIndex(sqlite*,Index*); -void sqliteCopy(Parse*, Token*, Token*, Token*, int); +void sqliteCopy(Parse*, SrcList*, Token*, Token*, int); void sqliteVacuum(Parse*, Token*); int sqliteGlobCompare(const unsigned char*,const unsigned char*); int sqliteLikeCompare(const unsigned char*,const unsigned char*); @@ -998,11 +1102,13 @@ int sqliteExprCheck(Parse*, Expr*, int, int*); int sqliteExprType(Expr*); int sqliteExprCompare(Expr*, Expr*); int sqliteFuncId(Token*); -int sqliteExprResolveIds(Parse*, int, SrcList*, ExprList*, Expr*); +int sqliteExprResolveIds(Parse*, SrcList*, ExprList*, Expr*); int sqliteExprAnalyzeAggregates(Parse*, Expr*); Vdbe *sqliteGetVdbe(Parse*); int sqliteRandomByte(void); int sqliteRandomInteger(void); +void sqliteRollbackAll(sqlite*); +void sqliteCodeVerifySchema(Parse*, int); void sqliteBeginTransaction(Parse*, int); void sqliteCommitTransaction(Parse*); void sqliteRollbackTransaction(Parse*); @@ -1012,7 +1118,7 @@ int sqliteIsRowid(const char*); void sqliteGenerateRowDelete(sqlite*, Vdbe*, Table*, int, int); void sqliteGenerateRowIndexDelete(sqlite*, Vdbe*, Table*, int, char*); void sqliteGenerateConstraintChecks(Parse*,Table*,int,char*,int,int,int,int); -void sqliteCompleteInsertion(Parse*, Table*, int, char*, int, int); +void sqliteCompleteInsertion(Parse*, Table*, int, char*, int, int, int); void sqliteBeginWriteOperation(Parse*, int, int); void sqliteEndWriteOperation(Parse*); Expr *sqliteExprDup(Expr*); @@ -1027,13 +1133,14 @@ int sqliteSafetyOn(sqlite*); int sqliteSafetyOff(sqlite*); int sqliteSafetyCheck(sqlite*); void sqliteChangeCookie(sqlite*, Vdbe*); -void sqliteCreateTrigger(Parse*, Token*, int, int, IdList*, Token*, - int, Expr*, TriggerStep*, Token*); -void sqliteDropTrigger(Parse*, Token*, int); +void sqliteBeginTrigger(Parse*, Token*,int,int,IdList*,SrcList*,int,Expr*,int); +void sqliteFinishTrigger(Parse*, TriggerStep*, Token*); +void sqliteDropTrigger(Parse*, SrcList*, int); int sqliteTriggersExist(Parse* , Trigger* , int , int , int, ExprList*); int sqliteCodeRowTrigger(Parse*, int, ExprList*, int, Table *, int, int, int, int); void sqliteViewTriggers(Parse*, Table*, Expr*, int, ExprList*); +void sqliteDeleteTriggerStep(TriggerStep*); TriggerStep *sqliteTriggerSelectStep(Select*); TriggerStep *sqliteTriggerInsertStep(Token*, IdList*, ExprList*, Select*, int); TriggerStep *sqliteTriggerUpdateStep(Token*, ExprList*, Expr*, int); @@ -1043,9 +1150,17 @@ int sqliteJoinType(Parse*, Token*, Token*, Token*); void sqliteCreateForeignKey(Parse*, IdList*, Token*, IdList*, int); void sqliteDeferForeignKey(Parse*, int); #ifndef SQLITE_OMIT_AUTHORIZATION - void sqliteAuthRead(Parse*,Expr*,SrcList*,int); - int sqliteAuthCheck(Parse*,int, const char*, const char*); + void sqliteAuthRead(Parse*,Expr*,SrcList*); + int sqliteAuthCheck(Parse*,int, const char*, const char*, const char*); + void sqliteAuthContextPush(Parse*, AuthContext*, const char*); + void sqliteAuthContextPop(AuthContext*); #else -# define sqliteAuthRead(a,b,c,d) +# define sqliteAuthRead(a,b,c) # define sqliteAuthCheck(a,b,c,d) SQLITE_OK +# define sqliteAuthContextPush(a,b,c) +# define sqliteAuthContextPop(a) #endif +void sqliteAttach(Parse*, Token*, Token*); +void sqliteDetach(Parse*, Token*); +int sqliteBtreeFactory(const sqlite *db, const char *zFilename, + int mode, int nPg, Btree **ppBtree); diff --git a/ext/sqlite/libsqlite/src/table.c b/ext/sqlite/libsqlite/src/table.c index eb3118fcc3..71f0b59a3a 100644 --- a/ext/sqlite/libsqlite/src/table.c +++ b/ext/sqlite/libsqlite/src/table.c @@ -172,10 +172,11 @@ int sqlite_get_table( if( res.nAlloc>res.nData ){ char **azNew; azNew = realloc( res.azResult, sizeof(char*)*(res.nData+1) ); - if( res.azResult==0 ){ + if( azNew==0 ){ sqlite_free_table(&res.azResult[1]); return SQLITE_NOMEM; } + res.nAlloc = res.nData+1; res.azResult = azNew; } *pazResult = &res.azResult[1]; @@ -193,6 +194,7 @@ void sqlite_free_table( if( azResult ){ int i, n; azResult--; + if( azResult==0 ) return; n = (int)azResult[0]; for(i=1; i<n; i++){ if( azResult[i] ) free(azResult[i]); } free(azResult); diff --git a/ext/sqlite/libsqlite/src/tokenize.c b/ext/sqlite/libsqlite/src/tokenize.c index f24da9e181..f053a75934 100644 --- a/ext/sqlite/libsqlite/src/tokenize.c +++ b/ext/sqlite/libsqlite/src/tokenize.c @@ -44,6 +44,7 @@ static Keyword aKeywordTable[] = { { "AND", 0, TK_AND, 0 }, { "AS", 0, TK_AS, 0 }, { "ASC", 0, TK_ASC, 0 }, + { "ATTACH", 0, TK_ATTACH, 0 }, { "BEFORE", 0, TK_BEFORE, 0 }, { "BEGIN", 0, TK_BEGIN, 0 }, { "BETWEEN", 0, TK_BETWEEN, 0 }, @@ -59,12 +60,14 @@ static Keyword aKeywordTable[] = { { "COPY", 0, TK_COPY, 0 }, { "CREATE", 0, TK_CREATE, 0 }, { "CROSS", 0, TK_JOIN_KW, 0 }, + { "DATABASE", 0, TK_DATABASE, 0 }, { "DEFAULT", 0, TK_DEFAULT, 0 }, { "DEFERRED", 0, TK_DEFERRED, 0 }, { "DEFERRABLE", 0, TK_DEFERRABLE, 0 }, { "DELETE", 0, TK_DELETE, 0 }, { "DELIMITERS", 0, TK_DELIMITERS, 0 }, { "DESC", 0, TK_DESC, 0 }, + { "DETACH", 0, TK_DETACH, 0 }, { "DISTINCT", 0, TK_DISTINCT, 0 }, { "DROP", 0, TK_DROP, 0 }, { "END", 0, TK_END, 0 }, @@ -349,18 +352,15 @@ static int sqliteGetToken(const unsigned char *z, int *tokenType){ return i; } case '.': { - if( !isdigit(z[1]) ){ - *tokenType = TK_DOT; - return 1; - } - /* Fall thru into the next case */ + *tokenType = TK_DOT; + return 1; } case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { *tokenType = TK_INTEGER; for(i=1; isdigit(z[i]); i++){} - if( z[i]=='.' ){ - i++; + if( z[i]=='.' && isdigit(z[i+1]) ){ + i += 2; while( isdigit(z[i]) ){ i++; } *tokenType = TK_FLOAT; } @@ -372,8 +372,6 @@ static int sqliteGetToken(const unsigned char *z, int *tokenType){ i += 2; while( isdigit(z[i]) ){ i++; } *tokenType = TK_FLOAT; - }else if( z[0]=='.' ){ - *tokenType = TK_FLOAT; } return i; } @@ -489,8 +487,198 @@ abort_parse: sqliteDeleteTable(pParse->db, pParse->pNewTable); pParse->pNewTable = 0; } + if( pParse->pNewTrigger ){ + sqliteDeleteTrigger(pParse->pNewTrigger); + pParse->pNewTrigger = 0; + } if( nErr>0 && (pParse->rc==SQLITE_OK || pParse->rc==SQLITE_DONE) ){ pParse->rc = SQLITE_ERROR; } return nErr; } + +/* +** Token types used by the sqlite_complete() routine. See the header +** comments on that procedure for additional information. +*/ +#define tkEXPLAIN 0 +#define tkCREATE 1 +#define tkTEMP 2 +#define tkTRIGGER 3 +#define tkEND 4 +#define tkSEMI 5 +#define tkWS 6 +#define tkOTHER 7 + +/* +** Return TRUE if the given SQL string ends in a semicolon. +** +** Special handling is require for CREATE TRIGGER statements. +** Whenever the CREATE TRIGGER keywords are seen, the statement +** must end with ";END;". +** +** This implementation uses a state machine with 7 states: +** +** (0) START At the beginning or end of an SQL statement. This routine +** returns 1 if it ends in the START state and 0 if it ends +** in any other state. +** +** (1) EXPLAIN The keyword EXPLAIN has been seen at the beginning of +** a statement. +** +** (2) CREATE The keyword CREATE has been seen at the beginning of a +** statement, possibly preceeded by EXPLAIN and/or followed by +** TEMP or TEMPORARY +** +** (3) NORMAL We are in the middle of statement which ends with a single +** semicolon. +** +** (4) TRIGGER We are in the middle of a trigger definition that must be +** ended by a semicolon, the keyword END, and another semicolon. +** +** (5) SEMI We've seen the first semicolon in the ";END;" that occurs at +** the end of a trigger definition. +** +** (6) END We've seen the ";END" of the ";END;" that occurs at the end +** of a trigger difinition. +** +** Transitions between states above are determined by tokens extracted +** from the input. The following tokens are significant: +** +** (0) tkEXPLAIN The "explain" keyword. +** (1) tkCREATE The "create" keyword. +** (2) tkTEMP The "temp" or "temporary" keyword. +** (3) tkTRIGGER The "trigger" keyword. +** (4) tkEND The "end" keyword. +** (5) tkSEMI A semicolon. +** (6) tkWS Whitespace +** (7) tkOTHER Any other SQL token. +** +** Whitespace never causes a state transition and is always ignored. +*/ +int sqlite_complete(const char *zSql){ + u8 state = 0; /* Current state, using numbers defined in header comment */ + u8 token; /* Value of the next token */ + + /* The following matrix defines the transition from one state to another + ** according to what token is seen. trans[state][token] returns the + ** next state. + */ + static const u8 trans[7][8] = { + /* Token: */ + /* State: ** EXPLAIN CREATE TEMP TRIGGER END SEMI WS OTHER */ + /* 0 START: */ { 1, 2, 3, 3, 3, 0, 0, 3, }, + /* 1 EXPLAIN: */ { 3, 2, 3, 3, 3, 0, 1, 3, }, + /* 2 CREATE: */ { 3, 3, 2, 4, 3, 0, 2, 3, }, + /* 3 NORMAL: */ { 3, 3, 3, 3, 3, 0, 3, 3, }, + /* 4 TRIGGER: */ { 4, 4, 4, 4, 4, 5, 4, 4, }, + /* 5 SEMI: */ { 4, 4, 4, 4, 6, 5, 5, 4, }, + /* 6 END: */ { 4, 4, 4, 4, 4, 0, 6, 4, }, + }; + + while( *zSql ){ + switch( *zSql ){ + case ';': { /* A semicolon */ + token = tkSEMI; + break; + } + case ' ': + case '\r': + case '\t': + case '\n': + case '\f': { /* White space is ignored */ + token = tkWS; + break; + } + case '/': { /* C-style comments */ + if( zSql[1]!='*' ){ + token = tkOTHER; + break; + } + zSql += 2; + while( zSql[0] && (zSql[0]!='*' || zSql[1]!='/') ){ zSql++; } + if( zSql[0]==0 ) return 0; + zSql++; + token = tkWS; + break; + } + case '-': { /* SQL-style comments from "--" to end of line */ + if( zSql[1]!='-' ){ + token = tkOTHER; + break; + } + while( *zSql && *zSql!='\n' ){ zSql++; } + if( *zSql==0 ) return state==0; + token = tkWS; + break; + } + case '[': { /* Microsoft-style identifiers in [...] */ + zSql++; + while( *zSql && *zSql!=']' ){ zSql++; } + if( *zSql==0 ) return 0; + token = tkOTHER; + break; + } + case '"': /* single- and double-quoted strings */ + case '\'': { + int c = *zSql; + zSql++; + while( *zSql && *zSql!=c ){ zSql++; } + if( *zSql==0 ) return 0; + token = tkOTHER; + break; + } + default: { + if( isIdChar[(u8)*zSql] ){ + /* Keywords and unquoted identifiers */ + int nId; + for(nId=1; isIdChar[(u8)zSql[nId]]; nId++){} + switch( *zSql ){ + case 'c': case 'C': { + if( nId==6 && sqliteStrNICmp(zSql, "create", 6)==0 ){ + token = tkCREATE; + }else{ + token = tkOTHER; + } + break; + } + case 't': case 'T': { + if( nId==7 && sqliteStrNICmp(zSql, "trigger", 7)==0 ){ + token = tkTRIGGER; + }else if( nId==4 && sqliteStrNICmp(zSql, "temp", 4)==0 ){ + token = tkTEMP; + }else if( nId==9 && sqliteStrNICmp(zSql, "temporary", 9)==0 ){ + token = tkTEMP; + }else{ + token = tkOTHER; + } + break; + } + case 'e': case 'E': { + if( nId==3 && sqliteStrNICmp(zSql, "end", 3)==0 ){ + token = tkEND; + }else if( nId==7 && sqliteStrNICmp(zSql, "explain", 7)==0 ){ + token = tkEXPLAIN; + }else{ + token = tkOTHER; + } + break; + } + default: { + token = tkOTHER; + break; + } + } + zSql += nId-1; + }else{ + /* Operators and special symbols */ + token = tkOTHER; + } + break; + } + } + state = trans[state][token]; + zSql++; + } + return state==0; +} diff --git a/ext/sqlite/libsqlite/src/trigger.c b/ext/sqlite/libsqlite/src/trigger.c index 03032fe259..227e471534 100644 --- a/ext/sqlite/libsqlite/src/trigger.c +++ b/ext/sqlite/libsqlite/src/trigger.c @@ -15,7 +15,7 @@ /* ** Delete a linked list of TriggerStep structures. */ -static void sqliteDeleteTriggerStep(TriggerStep *pTriggerStep){ +void sqliteDeleteTriggerStep(TriggerStep *pTriggerStep){ while( pTriggerStep ){ TriggerStep * pTmp = pTriggerStep; pTriggerStep = pTriggerStep->pNext; @@ -31,88 +31,90 @@ static void sqliteDeleteTriggerStep(TriggerStep *pTriggerStep){ } /* -** This is called by the parser when it sees a CREATE TRIGGER statement. See -** comments surrounding struct Trigger in sqliteInt.h for a description of -** how triggers are stored. +** This is called by the parser when it sees a CREATE TRIGGER statement +** up to the point of the BEGIN before the trigger actions. A Trigger +** structure is generated based on the information available and stored +** in pParse->pNewTrigger. After the trigger actions have been parsed, the +** sqliteFinishTrigger() function is called to complete the trigger +** construction process. */ -void sqliteCreateTrigger( +void sqliteBeginTrigger( Parse *pParse, /* The parse context of the CREATE TRIGGER statement */ Token *pName, /* The name of the trigger */ - int tr_tm, /* One of TK_BEFORE, TK_AFTER , TK_INSTEAD */ + int tr_tm, /* One of TK_BEFORE, TK_AFTER, TK_INSTEAD */ int op, /* One of TK_INSERT, TK_UPDATE, TK_DELETE */ IdList *pColumns, /* column list if this is an UPDATE OF trigger */ - Token *pTableName, /* The name of the table/view the trigger applies to */ + SrcList *pTableName,/* The name of the table/view the trigger applies to */ int foreach, /* One of TK_ROW or TK_STATEMENT */ Expr *pWhen, /* WHEN clause */ - TriggerStep *pStepList, /* The triggered program */ - Token *pAll /* Token that describes the complete CREATE TRIGGER */ + int isTemp /* True if the TEMPORARY keyword is present */ ){ Trigger *nt; Table *tab; - char *zName = 0; /* Name of the trigger */ + char *zName = 0; /* Name of the trigger */ + sqlite *db = pParse->db; + int iDb; /* When database to store the trigger in */ /* Check that: ** 1. the trigger name does not already exist. - ** 2. the table (or view) does exist. + ** 2. the table (or view) does exist in the same database as the trigger. ** 3. that we are not trying to create a trigger on the sqlite_master table ** 4. That we are not trying to create an INSTEAD OF trigger on a table. ** 5. That we are not trying to create a BEFORE or AFTER trigger on a view. */ + if( sqlite_malloc_failed ) goto trigger_cleanup; + assert( pTableName->nSrc==1 ); + tab = sqliteSrcListLookup(pParse, pTableName); + if( !tab ){ + goto trigger_cleanup; + } + iDb = isTemp ? 1 : tab->iDb; + if( iDb>=2 && !pParse->initFlag ){ + sqliteErrorMsg(pParse, "triggers may not be added to auxiliary " + "database %s", db->aDb[tab->iDb].zName); + goto trigger_cleanup; + } + zName = sqliteStrNDup(pName->z, pName->n); - if( sqliteHashFind(&(pParse->db->trigHash), zName, pName->n + 1) ){ - sqliteSetNString(&pParse->zErrMsg, "trigger ", -1, - pName->z, pName->n, " already exists", -1, 0); + if( sqliteHashFind(&(db->aDb[iDb].trigHash), zName,pName->n+1) ){ + sqliteErrorMsg(pParse, "trigger %T already exists", pName); + goto trigger_cleanup; + } + if( sqliteStrNICmp(tab->zName, "sqlite_", 7)==0 ){ + sqliteErrorMsg(pParse, "cannot create trigger on system table"); pParse->nErr++; goto trigger_cleanup; } + if( tab->pSelect && tr_tm != TK_INSTEAD ){ + sqliteErrorMsg(pParse, "cannot create %s trigger on view: %S", + (tr_tm == TK_BEFORE)?"BEFORE":"AFTER", pTableName, 0); + goto trigger_cleanup; + } + if( !tab->pSelect && tr_tm == TK_INSTEAD ){ + sqliteErrorMsg(pParse, "cannot create INSTEAD OF" + " trigger on table: %S", pTableName, 0); + goto trigger_cleanup; + } +#ifndef SQLITE_OMIT_AUTHORIZATION { - char *tmp_str = sqliteStrNDup(pTableName->z, pTableName->n); - if( tmp_str==0 ) goto trigger_cleanup; - tab = sqliteFindTable(pParse->db, tmp_str); - sqliteFree(tmp_str); - if( !tab ){ - sqliteSetNString(&pParse->zErrMsg, "no such table: ", -1, - pTableName->z, pTableName->n, 0); - pParse->nErr++; - goto trigger_cleanup; - } - if( sqliteStrICmp(tab->zName, MASTER_NAME)==0 ){ - sqliteSetString(&pParse->zErrMsg, "cannot create trigger on system " - "table: " MASTER_NAME, 0); - pParse->nErr++; + int code = SQLITE_CREATE_TRIGGER; + const char *zDb = db->aDb[tab->iDb].zName; + const char *zDbTrig = isTemp ? db->aDb[1].zName : zDb; + if( tab->iDb==1 || isTemp ) code = SQLITE_CREATE_TEMP_TRIGGER; + if( sqliteAuthCheck(pParse, code, zName, tab->zName, zDbTrig) ){ goto trigger_cleanup; } - if( sqliteStrICmp(tab->zName, TEMP_MASTER_NAME)==0 ){ - sqliteSetString(&pParse->zErrMsg, "cannot create trigger on system " - "table: " TEMP_MASTER_NAME, 0); - pParse->nErr++; + if( sqliteAuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(tab->iDb), 0, zDb)){ goto trigger_cleanup; } - if( tab->pSelect && tr_tm != TK_INSTEAD ){ - sqliteSetNString(&pParse->zErrMsg, "cannot create ", -1, - (tr_tm == TK_BEFORE)?"BEFORE":"AFTER", -1, " trigger on view: ", -1 - , pTableName->z, pTableName->n, 0); - goto trigger_cleanup; - } - if( !tab->pSelect && tr_tm == TK_INSTEAD ){ - sqliteSetNString(&pParse->zErrMsg, "cannot create INSTEAD OF", -1, - " trigger on table: ", -1, pTableName->z, pTableName->n, 0); - goto trigger_cleanup; - } -#ifndef SQLITE_OMIT_AUTHORIZATION - { - int code = SQLITE_CREATE_TRIGGER; - if( tab->isTemp ) code = SQLITE_CREATE_TEMP_TRIGGER; - if( sqliteAuthCheck(pParse, code, zName, tab->zName) ){ - goto trigger_cleanup; - } - if( sqliteAuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(tab->isTemp), 0)){ - goto trigger_cleanup; - } - } -#endif } +#endif + /* INSTEAD OF triggers can only appear on views and BEGIN triggers + ** cannot appear on views. So we might as well translate every + ** INSTEAD OF trigger into a BEFORE trigger. It simplifies code + ** elsewhere. + */ if (tr_tm == TK_INSTEAD){ tr_tm = TK_BEFORE; } @@ -122,16 +124,44 @@ void sqliteCreateTrigger( if( nt==0 ) goto trigger_cleanup; nt->name = zName; zName = 0; - nt->table = sqliteStrNDup(pTableName->z, pTableName->n); + nt->table = sqliteStrDup(pTableName->a[0].zName); if( sqlite_malloc_failed ) goto trigger_cleanup; + nt->iDb = iDb; nt->op = op; nt->tr_tm = tr_tm; nt->pWhen = sqliteExprDup(pWhen); - sqliteExprDelete(pWhen); nt->pColumns = sqliteIdListDup(pColumns); - sqliteIdListDelete(pColumns); nt->foreach = foreach; + assert( pParse->pNewTrigger==0 ); + pParse->pNewTrigger = nt; + +trigger_cleanup: + sqliteFree(zName); + sqliteSrcListDelete(pTableName); + sqliteIdListDelete(pColumns); + sqliteExprDelete(pWhen); +} + +/* +** This routine is called after all of the trigger actions have been parsed +** in order to complete the process of building the trigger. +*/ +void sqliteFinishTrigger( + Parse *pParse, /* Parser context */ + TriggerStep *pStepList, /* The triggered program */ + Token *pAll /* Token that describes the complete CREATE TRIGGER */ +){ + Trigger *nt; /* The trigger whose construction is finishing up */ + sqlite *db = pParse->db; /* The database */ + + if( pParse->nErr || pParse->pNewTrigger==0 ) goto triggerfinish_cleanup; + nt = pParse->pNewTrigger; + pParse->pNewTrigger = 0; nt->step_list = pStepList; + while( pStepList ){ + pStepList->pTrig = nt; + pStepList = pStepList->pNext; + } /* if we are not initializing, and this trigger is not on a TEMP table, ** build the sqlite_master entry @@ -152,41 +182,35 @@ void sqliteCreateTrigger( /* Make an entry in the sqlite_master table */ v = sqliteGetVdbe(pParse); - if( v==0 ) goto trigger_cleanup; + if( v==0 ) goto triggerfinish_cleanup; sqliteBeginWriteOperation(pParse, 0, 0); - sqliteOpenMasterTable(v, tab->isTemp); + sqliteOpenMasterTable(v, nt->iDb==1); addr = sqliteVdbeAddOpList(v, ArraySize(insertTrig), insertTrig); - sqliteVdbeChangeP3(v, addr, tab->isTemp ? TEMP_MASTER_NAME : MASTER_NAME, - P3_STATIC); sqliteVdbeChangeP3(v, addr+2, nt->name, 0); sqliteVdbeChangeP3(v, addr+3, nt->table, 0); sqliteVdbeChangeP3(v, addr+5, pAll->z, pAll->n); - if( !tab->isTemp ){ - sqliteChangeCookie(pParse->db, v); + if( nt->iDb==0 ){ + sqliteChangeCookie(db, v); } sqliteVdbeAddOp(v, OP_Close, 0, 0); sqliteEndWriteOperation(pParse); } if( !pParse->explain ){ - /* Stick it in the hash-table */ - sqliteHashInsert(&(pParse->db->trigHash), nt->name, pName->n + 1, nt); - - /* Attach it to the table object */ - nt->pNext = tab->pTrigger; - tab->pTrigger = nt; - return; + Table *pTab; + sqliteHashInsert(&db->aDb[nt->iDb].trigHash, + nt->name, strlen(nt->name)+1, nt); + pTab = sqliteLocateTable(pParse, nt->table, 0); + assert( pTab!=0 ); + nt->pNext = pTab->pTrigger; + pTab->pTrigger = nt; }else{ - sqliteFree(nt->name); - sqliteFree(nt->table); - sqliteFree(nt); + sqliteDeleteTrigger(nt); } -trigger_cleanup: - - sqliteFree(zName); - sqliteIdListDelete(pColumns); - sqliteExprDelete(pWhen); +triggerfinish_cleanup: + sqliteDeleteTrigger(pParse->pNewTrigger); + pParse->pNewTrigger = 0; sqliteDeleteTriggerStep(pStepList); } @@ -323,6 +347,7 @@ TriggerStep *sqliteTriggerDeleteStep(Token *pTableName, Expr *pWhere){ ** Recursively delete a Trigger structure */ void sqliteDeleteTrigger(Trigger *pTrigger){ + if( pTrigger==0 ) return; sqliteDeleteTriggerStep(pTrigger->step_list); sqliteFree(pTrigger->name); sqliteFree(pTrigger->table); @@ -342,57 +367,53 @@ void sqliteDeleteTrigger(Trigger *pTrigger){ * table. This is so that the trigger can be restored into the database schema * if the transaction is rolled back. */ -void sqliteDropTrigger(Parse *pParse, Token *pName, int nested){ - char *zName; +void sqliteDropTrigger(Parse *pParse, SrcList *pName, int nested){ Trigger *pTrigger; Table *pTable; Vdbe *v; - - zName = sqliteStrNDup(pName->z, pName->n); - - /* ensure that the trigger being dropped exists */ - pTrigger = sqliteHashFind(&(pParse->db->trigHash), zName, pName->n + 1); + int i; + const char *zDb; + const char *zName; + int nName; + sqlite *db = pParse->db; + + if( sqlite_malloc_failed ) goto drop_trigger_cleanup; + assert( pName->nSrc==1 ); + zDb = pName->a[0].zDatabase; + zName = pName->a[0].zName; + nName = strlen(zName); + for(i=0; i<db->nDb; i++){ + int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ + if( zDb && sqliteStrICmp(db->aDb[j].zName, zDb) ) continue; + pTrigger = sqliteHashFind(&(db->aDb[j].trigHash), zName, nName+1); + if( pTrigger ) break; + } if( !pTrigger ){ - sqliteSetNString(&pParse->zErrMsg, "no such trigger: ", -1, - zName, -1, 0); - sqliteFree(zName); - return; + sqliteErrorMsg(pParse, "no such trigger: %S", pName, 0); + goto drop_trigger_cleanup; + } + assert( pTrigger->iDb<db->nDb ); + if( pTrigger->iDb>=2 ){ + sqliteErrorMsg(pParse, "triggers may not be removed from " + "auxiliary database %s", db->aDb[pTrigger->iDb].zName); + goto drop_trigger_cleanup; } - pTable = sqliteFindTable(pParse->db, pTrigger->table); + pTable = sqliteFindTable(db, pTrigger->table, db->aDb[pTrigger->iDb].zName); assert(pTable); + assert( pTable->iDb==pTrigger->iDb || pTrigger->iDb==1 ); #ifndef SQLITE_OMIT_AUTHORIZATION { int code = SQLITE_DROP_TRIGGER; - if( pTable->isTemp ) code = SQLITE_DROP_TEMP_TRIGGER; - if( sqliteAuthCheck(pParse, code, pTrigger->name, pTable->zName) || - sqliteAuthCheck(pParse, SQLITE_DELETE, SCHEMA_TABLE(pTable->isTemp),0) ){ - sqliteFree(zName); - return; + const char *zDb = db->aDb[pTrigger->iDb].zName; + const char *zTab = SCHEMA_TABLE(pTrigger->iDb); + if( pTrigger->iDb ) code = SQLITE_DROP_TEMP_TRIGGER; + if( sqliteAuthCheck(pParse, code, pTrigger->name, pTable->zName, zDb) || + sqliteAuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){ + goto drop_trigger_cleanup; } } #endif - /* - * If this is not an "explain", then delete the trigger structure. - */ - if( !pParse->explain ){ - if( pTable->pTrigger == pTrigger ){ - pTable->pTrigger = pTrigger->pNext; - }else{ - Trigger *cc = pTable->pTrigger; - while( cc ){ - if( cc->pNext == pTrigger ){ - cc->pNext = cc->pNext->pNext; - break; - } - cc = cc->pNext; - } - assert(cc); - } - sqliteHashInsert(&(pParse->db->trigHash), zName, pName->n + 1, NULL); - sqliteDeleteTrigger(pTrigger); - } - /* Generate code to destroy the database record of the trigger. */ if( pTable!=0 && !nested && (v = sqliteGetVdbe(pParse))!=0 ){ @@ -409,17 +430,39 @@ void sqliteDropTrigger(Parse *pParse, Token *pName, int nested){ }; sqliteBeginWriteOperation(pParse, 0, 0); - sqliteOpenMasterTable(v, pTable->isTemp); + sqliteOpenMasterTable(v, pTrigger->iDb); base = sqliteVdbeAddOpList(v, ArraySize(dropTrigger), dropTrigger); sqliteVdbeChangeP3(v, base+1, zName, 0); - if( !pTable->isTemp ){ - sqliteChangeCookie(pParse->db, v); + if( pTrigger->iDb==0 ){ + sqliteChangeCookie(db, v); } sqliteVdbeAddOp(v, OP_Close, 0, 0); sqliteEndWriteOperation(pParse); } - sqliteFree(zName); + /* + * If this is not an "explain", then delete the trigger structure. + */ + if( !pParse->explain ){ + if( pTable->pTrigger == pTrigger ){ + pTable->pTrigger = pTrigger->pNext; + }else{ + Trigger *cc = pTable->pTrigger; + while( cc ){ + if( cc->pNext == pTrigger ){ + cc->pNext = cc->pNext->pNext; + break; + } + cc = cc->pNext; + } + assert(cc); + } + sqliteHashInsert(&(db->aDb[pTrigger->iDb].trigHash), zName, nName+1, 0); + sqliteDeleteTrigger(pTrigger); + } + +drop_trigger_cleanup: + sqliteSrcListDelete(pName); } /* @@ -502,8 +545,11 @@ static int codeTriggerProgram( while( pTriggerStep ){ int saveNTab = pParse->nTab; + int saveUseDb = pParse->useDb; orconf = (orconfin == OE_Default)?pTriggerStep->orconf:orconfin; pParse->trigStack->orconf = orconf; + pParse->useDb = pTriggerStep->pTrig->iDb; + if( pParse->useDb==1 ) pParse->useDb = -1; switch( pTriggerStep->op ){ case TK_SELECT: { Select * ss = sqliteSelectDup(pTriggerStep->pSelect); @@ -514,24 +560,29 @@ static int codeTriggerProgram( break; } case TK_UPDATE: { + SrcList *pSrc; + pSrc = sqliteSrcListAppend(0, &pTriggerStep->target, 0); sqliteVdbeAddOp(pParse->pVdbe, OP_ListPush, 0, 0); - sqliteUpdate(pParse, &pTriggerStep->target, + sqliteUpdate(pParse, pSrc, sqliteExprListDup(pTriggerStep->pExprList), sqliteExprDup(pTriggerStep->pWhere), orconf); sqliteVdbeAddOp(pParse->pVdbe, OP_ListPop, 0, 0); break; } case TK_INSERT: { - sqliteInsert(pParse, &pTriggerStep->target, - sqliteExprListDup(pTriggerStep->pExprList), - sqliteSelectDup(pTriggerStep->pSelect), - sqliteIdListDup(pTriggerStep->pIdList), orconf); + SrcList *pSrc; + pSrc = sqliteSrcListAppend(0, &pTriggerStep->target, 0); + sqliteInsert(pParse, pSrc, + sqliteExprListDup(pTriggerStep->pExprList), + sqliteSelectDup(pTriggerStep->pSelect), + sqliteIdListDup(pTriggerStep->pIdList), orconf); break; } case TK_DELETE: { + SrcList *pSrc; sqliteVdbeAddOp(pParse->pVdbe, OP_ListPush, 0, 0); - sqliteDeleteFrom(pParse, &pTriggerStep->target, - sqliteExprDup(pTriggerStep->pWhere)); + pSrc = sqliteSrcListAppend(0, &pTriggerStep->target, 0); + sqliteDeleteFrom(pParse, pSrc, sqliteExprDup(pTriggerStep->pWhere)); sqliteVdbeAddOp(pParse->pVdbe, OP_ListPop, 0, 0); break; } @@ -539,6 +590,7 @@ static int codeTriggerProgram( assert(0); } pParse->nTab = saveNTab; + pParse->useDb = saveUseDb; pTriggerStep = pTriggerStep->pNext; } @@ -580,7 +632,7 @@ int sqliteCodeRowTrigger( TriggerStack * pTriggerStack; assert(op == TK_UPDATE || op == TK_INSERT || op == TK_DELETE); - assert(tr_tm == TK_BEFORE || tr_tm == TK_AFTER); + assert(tr_tm == TK_BEFORE || tr_tm == TK_AFTER ); assert(newIdx != -1 || oldIdx != -1); @@ -609,9 +661,9 @@ int sqliteCodeRowTrigger( int endTrigger; SrcList dummyTablist; Expr * whenExpr; + AuthContext sContext; dummyTablist.nSrc = 0; - dummyTablist.a = 0; /* Push an entry on to the trigger stack */ pTriggerStack->pTrigger = pTrigger; @@ -621,11 +673,12 @@ int sqliteCodeRowTrigger( pTriggerStack->pNext = pParse->trigStack; pTriggerStack->ignoreJump = ignoreJump; pParse->trigStack = pTriggerStack; + sqliteAuthContextPush(pParse, &sContext, pTrigger->name); /* code the WHEN clause */ endTrigger = sqliteVdbeMakeLabel(pParse->pVdbe); whenExpr = sqliteExprDup(pTrigger->pWhen); - if( sqliteExprResolveIds(pParse, 0, &dummyTablist, 0, whenExpr) ){ + if( sqliteExprResolveIds(pParse, &dummyTablist, 0, whenExpr) ){ pParse->trigStack = pParse->trigStack->pNext; sqliteFree(pTriggerStack); sqliteExprDelete(whenExpr); @@ -638,6 +691,7 @@ int sqliteCodeRowTrigger( /* Pop the entry off the trigger stack */ pParse->trigStack = pParse->trigStack->pNext; + sqliteAuthContextPop(&sContext); sqliteFree(pTriggerStack); sqliteVdbeResolveLabel(pParse->pVdbe, endTrigger); @@ -647,147 +701,3 @@ int sqliteCodeRowTrigger( return 0; } - -/* - * This function is called to code ON UPDATE and ON DELETE triggers on - * views. - * - * This function deletes the data pointed at by the pWhere and pChanges - * arguments before it completes. - */ -void sqliteViewTriggers( - Parse *pParse, - Table *pTab, /* The view to code triggers on */ - Expr *pWhere, /* The WHERE clause of the statement causing triggers*/ - int orconf, /* The ON CONFLICT policy specified as part of the - statement causing these triggers */ - ExprList *pChanges /* If this is an statement causing triggers to fire - is an UPDATE, then this list holds the columns - to update and the expressions to update them to. - See comments for sqliteUpdate(). */ -){ - int oldIdx = -1; - int newIdx = -1; - int *aXRef = 0; - Vdbe *v; - int endOfLoop; - int startOfLoop; - Select theSelect; - Token tblNameToken; - - assert(pTab->pSelect); - - tblNameToken.z = pTab->zName; - tblNameToken.n = strlen(pTab->zName); - - theSelect.isDistinct = 0; - theSelect.pEList = sqliteExprListAppend(0, sqliteExpr(TK_ALL, 0, 0, 0), 0); - theSelect.pSrc = sqliteSrcListAppend(0, &tblNameToken); - theSelect.pWhere = pWhere; pWhere = 0; - theSelect.pGroupBy = 0; - theSelect.pHaving = 0; - theSelect.pOrderBy = 0; - theSelect.op = TK_SELECT; /* ?? */ - theSelect.pPrior = 0; - theSelect.nLimit = -1; - theSelect.nOffset = -1; - theSelect.zSelect = 0; - theSelect.base = 0; - - v = sqliteGetVdbe(pParse); - assert(v); - sqliteBeginWriteOperation(pParse, 1, 0); - - /* Allocate temp tables */ - oldIdx = pParse->nTab++; - sqliteVdbeAddOp(v, OP_OpenTemp, oldIdx, 0); - if( pChanges ){ - newIdx = pParse->nTab++; - sqliteVdbeAddOp(v, OP_OpenTemp, newIdx, 0); - } - - /* Snapshot the view */ - if( sqliteSelect(pParse, &theSelect, SRT_Table, oldIdx, 0, 0, 0) ){ - goto trigger_cleanup; - } - - /* loop thru the view snapshot, executing triggers for each row */ - endOfLoop = sqliteVdbeMakeLabel(v); - sqliteVdbeAddOp(v, OP_Rewind, oldIdx, endOfLoop); - - /* Loop thru the view snapshot, executing triggers for each row */ - startOfLoop = sqliteVdbeCurrentAddr(v); - - /* Build the updated row if required */ - if( pChanges ){ - int ii; - - aXRef = sqliteMalloc( sizeof(int) * pTab->nCol ); - if( aXRef==0 ) goto trigger_cleanup; - for(ii = 0; ii < pTab->nCol; ii++){ - aXRef[ii] = -1; - } - - for(ii=0; ii<pChanges->nExpr; ii++){ - int jj; - if( sqliteExprResolveIds(pParse, oldIdx, theSelect.pSrc , 0, - pChanges->a[ii].pExpr) ){ - goto trigger_cleanup; - } - - if( sqliteExprCheck(pParse, pChanges->a[ii].pExpr, 0, 0) ) - goto trigger_cleanup; - - for(jj=0; jj<pTab->nCol; jj++){ - if( sqliteStrICmp(pTab->aCol[jj].zName, pChanges->a[ii].zName)==0 ){ - aXRef[jj] = ii; - break; - } - } - if( jj>=pTab->nCol ){ - sqliteSetString(&pParse->zErrMsg, "no such column: ", - pChanges->a[ii].zName, 0); - pParse->nErr++; - goto trigger_cleanup; - } - } - - sqliteVdbeAddOp(v, OP_Integer, 13, 0); - - for(ii = 0; ii<pTab->nCol; ii++){ - if( aXRef[ii] < 0 ){ - sqliteVdbeAddOp(v, OP_Column, oldIdx, ii); - }else{ - sqliteExprCode(pParse, pChanges->a[aXRef[ii]].pExpr); - } - } - - sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0); - sqliteVdbeAddOp(v, OP_PutIntKey, newIdx, 0); - sqliteVdbeAddOp(v, OP_Rewind, newIdx, 0); - - sqliteCodeRowTrigger(pParse, TK_UPDATE, pChanges, TK_BEFORE, - pTab, newIdx, oldIdx, orconf, endOfLoop); - sqliteCodeRowTrigger(pParse, TK_UPDATE, pChanges, TK_AFTER, - pTab, newIdx, oldIdx, orconf, endOfLoop); - }else{ - sqliteCodeRowTrigger(pParse, TK_DELETE, 0, TK_BEFORE, pTab, -1, oldIdx, - orconf, endOfLoop); - sqliteCodeRowTrigger(pParse, TK_DELETE, 0, TK_AFTER, pTab, -1, oldIdx, - orconf, endOfLoop); - } - - sqliteVdbeAddOp(v, OP_Next, oldIdx, startOfLoop); - - sqliteVdbeResolveLabel(v, endOfLoop); - sqliteEndWriteOperation(pParse); - -trigger_cleanup: - sqliteFree(aXRef); - sqliteExprListDelete(pChanges); - sqliteExprDelete(pWhere); - sqliteExprListDelete(theSelect.pEList); - sqliteSrcListDelete(theSelect.pSrc); - sqliteExprDelete(theSelect.pWhere); - return; -} diff --git a/ext/sqlite/libsqlite/src/update.c b/ext/sqlite/libsqlite/src/update.c index b5825dd12e..95a49590dc 100644 --- a/ext/sqlite/libsqlite/src/update.c +++ b/ext/sqlite/libsqlite/src/update.c @@ -18,81 +18,76 @@ /* ** Process an UPDATE statement. +** +** UPDATE OR IGNORE table_wxyz SET a=b, c=d WHERE e<5 AND f NOT NULL; +** \_______/ \________/ \______/ \________________/ +* onError pTabList pChanges pWhere */ void sqliteUpdate( Parse *pParse, /* The parser context */ - Token *pTableName, /* The table in which we should change things */ + SrcList *pTabList, /* The table in which we should change things */ ExprList *pChanges, /* Things to be changed */ Expr *pWhere, /* The WHERE clause. May be null */ int onError /* How to handle constraint errors */ ){ int i, j; /* Loop counters */ Table *pTab; /* The table to be updated */ - SrcList *pTabList = 0; /* Fake FROM clause containing only pTab */ int addr; /* VDBE instruction address of the start of the loop */ WhereInfo *pWInfo; /* Information about the WHERE clause */ Vdbe *v; /* The virtual database engine */ Index *pIdx; /* For looping over indices */ int nIdx; /* Number of indices that need updating */ int nIdxTotal; /* Total number of indices */ - int base; /* Index of first available table cursor */ + int iCur; /* VDBE Cursor number of pTab */ sqlite *db; /* The database structure */ Index **apIdx = 0; /* An array of indices that need updating too */ - char *aIdxUsed = 0; /* aIdxUsed[i] if the i-th index is used */ + char *aIdxUsed = 0; /* aIdxUsed[i]==1 if the i-th index is used */ int *aXRef = 0; /* aXRef[i] is the index in pChanges->a[] of the ** an expression for the i-th column of the table. ** aXRef[i]==-1 if the i-th column is not changed. */ - int openOp; /* Opcode used to open tables */ int chngRecno; /* True if the record number is being changed */ Expr *pRecnoExpr; /* Expression defining the new record number */ int openAll; /* True if all indices need to be opened */ + int isView; /* Trying to update a view */ + AuthContext sContext; /* The authorization context */ - int row_triggers_exist = 0; + int before_triggers; /* True if there are any BEFORE triggers */ + int after_triggers; /* True if there are any AFTER triggers */ + int row_triggers_exist = 0; /* True if any row triggers exist */ int newIdx = -1; /* index of trigger "new" temp table */ int oldIdx = -1; /* index of trigger "old" temp table */ + sContext.pParse = 0; if( pParse->nErr || sqlite_malloc_failed ) goto update_cleanup; db = pParse->db; + assert( pTabList->nSrc==1 ); - /* Check for the special case of a VIEW with one or more ON UPDATE triggers - * defined - */ - { - char *zTab = sqliteTableNameFromToken(pTableName); - - if( zTab != 0 ){ - pTab = sqliteFindTable(pParse->db, zTab); - if( pTab ){ - row_triggers_exist = - sqliteTriggersExist(pParse, pTab->pTrigger, - TK_UPDATE, TK_BEFORE, TK_ROW, pChanges) || - sqliteTriggersExist(pParse, pTab->pTrigger, - TK_UPDATE, TK_AFTER, TK_ROW, pChanges); - } - sqliteFree(zTab); - if( row_triggers_exist && pTab->pSelect ){ - /* Just fire VIEW triggers */ - sqliteViewTriggers(pParse, pTab, pWhere, onError, pChanges); - return; - } + /* Locate the table which we want to update. + */ + pTab = sqliteSrcListLookup(pParse, pTabList); + if( pTab==0 ) goto update_cleanup; + before_triggers = sqliteTriggersExist(pParse, pTab->pTrigger, + TK_UPDATE, TK_BEFORE, TK_ROW, pChanges); + after_triggers = sqliteTriggersExist(pParse, pTab->pTrigger, + TK_UPDATE, TK_AFTER, TK_ROW, pChanges); + row_triggers_exist = before_triggers || after_triggers; + isView = pTab->pSelect!=0; + if( sqliteIsReadOnly(pParse, pTab, before_triggers) ){ + goto update_cleanup; + } + if( isView ){ + if( sqliteViewGetColumnNames(pParse, pTab) ){ + goto update_cleanup; } } - - /* Locate the table which we want to update. This table has to be - ** put in an SrcList structure because some of the subroutines we - ** will be calling are designed to work with multiple tables and expect - ** an SrcList* parameter instead of just a Table* parameter. - */ - pTabList = sqliteTableTokenToSrcList(pParse, pTableName); - if( pTabList==0 ) goto update_cleanup; - pTab = pTabList->a[0].pTab; - assert( pTab->pSelect==0 ); /* This table is not a VIEW */ aXRef = sqliteMalloc( sizeof(int) * pTab->nCol ); if( aXRef==0 ) goto update_cleanup; for(i=0; i<pTab->nCol; i++) aXRef[i] = -1; - /* If there are FOR EACH ROW triggers, allocate temp tables */ + /* If there are FOR EACH ROW triggers, allocate cursors for the + ** special OLD and NEW tables + */ if( row_triggers_exist ){ newIdx = pParse->nTab++; oldIdx = pParse->nTab++; @@ -103,28 +98,20 @@ void sqliteUpdate( ** need to occur right after the database cursor. So go ahead and ** allocate enough space, just in case. */ - base = pParse->nTab++; + pTabList->a[0].iCursor = iCur = pParse->nTab++; for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ pParse->nTab++; } - /* Resolve the column names in all the expressions in both the - ** WHERE clause and in the new values. Also find the column index + /* Resolve the column names in all the expressions of the + ** of the UPDATE statement. Also find the column index ** for each column to be updated in the pChanges array. For each ** column to be updated, make sure we have authorization to change ** that column. */ - if( pWhere ){ - if( sqliteExprResolveIds(pParse, base, pTabList, 0, pWhere) ){ - goto update_cleanup; - } - if( sqliteExprCheck(pParse, pWhere, 0, 0) ){ - goto update_cleanup; - } - } chngRecno = 0; for(i=0; i<pChanges->nExpr; i++){ - if( sqliteExprResolveIds(pParse, base, pTabList, 0, pChanges->a[i].pExpr) ){ + if( sqliteExprResolveIds(pParse, pTabList, 0, pChanges->a[i].pExpr) ){ goto update_cleanup; } if( sqliteExprCheck(pParse, pChanges->a[i].pExpr, 0, 0) ){ @@ -141,16 +128,14 @@ void sqliteUpdate( } } if( j>=pTab->nCol ){ - sqliteSetString(&pParse->zErrMsg, "no such column: ", - pChanges->a[i].zName, 0); - pParse->nErr++; + sqliteErrorMsg(pParse, "no such column: %s", pChanges->a[i].zName); goto update_cleanup; } #ifndef SQLITE_OMIT_AUTHORIZATION { int rc; rc = sqliteAuthCheck(pParse, SQLITE_UPDATE, pTab->zName, - pTab->aCol[j].zName); + pTab->aCol[j].zName, db->aDb[pTab->iDb].zName); if( rc==SQLITE_DENY ){ goto update_cleanup; }else if( rc==SQLITE_IGNORE ){ @@ -196,15 +181,43 @@ void sqliteUpdate( } } + /* Resolve the column names in all the expressions in the + ** WHERE clause. + */ + if( pWhere ){ + if( sqliteExprResolveIds(pParse, pTabList, 0, pWhere) ){ + goto update_cleanup; + } + if( sqliteExprCheck(pParse, pWhere, 0, 0) ){ + goto update_cleanup; + } + } + + /* Start the view context + */ + if( isView ){ + sqliteAuthContextPush(pParse, &sContext, pTab->zName); + } + /* Begin generating code. */ v = sqliteGetVdbe(pParse); if( v==0 ) goto update_cleanup; - sqliteBeginWriteOperation(pParse, 1, !row_triggers_exist && pTab->isTemp); + sqliteBeginWriteOperation(pParse, 1, pTab->iDb); + + /* If we are trying to update a view, construct that view into + ** a temporary table. + */ + if( isView ){ + Select *pView; + pView = sqliteSelectDup(pTab->pSelect); + sqliteSelect(pParse, pView, SRT_TempTable, iCur, 0, 0, 0); + sqliteSelectDelete(pView); + } /* Begin the database scan */ - pWInfo = sqliteWhereBegin(pParse, base, pTabList, pWhere, 1, 0); + pWInfo = sqliteWhereBegin(pParse, pTabList, pWhere, 1, 0); if( pWInfo==0 ) goto update_cleanup; /* Remember the index of every item to be updated. @@ -222,136 +235,150 @@ void sqliteUpdate( } if( row_triggers_exist ){ - int ii; - - sqliteVdbeAddOp(v, OP_OpenTemp, oldIdx, 0); - sqliteVdbeAddOp(v, OP_OpenTemp, newIdx, 0); + /* Create pseudo-tables for NEW and OLD + */ + sqliteVdbeAddOp(v, OP_OpenPseudo, oldIdx, 0); + sqliteVdbeAddOp(v, OP_OpenPseudo, newIdx, 0); + /* The top of the update loop for when there are triggers. + */ sqliteVdbeAddOp(v, OP_ListRewind, 0, 0); addr = sqliteVdbeAddOp(v, OP_ListRead, 0, 0); sqliteVdbeAddOp(v, OP_Dup, 0, 0); + /* Open a cursor and make it point to the record that is + ** being updated. + */ sqliteVdbeAddOp(v, OP_Dup, 0, 0); - sqliteVdbeAddOp(v, (pTab->isTemp?OP_OpenAux:OP_Open), base, pTab->tnum); - sqliteVdbeAddOp(v, OP_MoveTo, base, 0); - - sqliteVdbeAddOp(v, OP_Integer, 13, 0); - for(ii = 0; ii < pTab->nCol; ii++){ - if( ii == pTab->iPKey ){ - sqliteVdbeAddOp(v, OP_Recno, base, 0); - }else{ - sqliteVdbeAddOp(v, OP_Column, base, ii); - } + if( !isView ){ + sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenRead, iCur, pTab->tnum); } - sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0); + sqliteVdbeAddOp(v, OP_MoveTo, iCur, 0); + + /* Generate the OLD table + */ + sqliteVdbeAddOp(v, OP_Recno, iCur, 0); + sqliteVdbeAddOp(v, OP_RowData, iCur, 0); sqliteVdbeAddOp(v, OP_PutIntKey, oldIdx, 0); - sqliteVdbeAddOp(v, OP_Integer, 13, 0); - for(ii = 0; ii < pTab->nCol; ii++){ - if( aXRef[ii] < 0 ){ - if( ii == pTab->iPKey ){ - sqliteVdbeAddOp(v, OP_Recno, base, 0); - }else{ - sqliteVdbeAddOp(v, OP_Column, base, ii); - } + /* Generate the NEW table + */ + if( chngRecno ){ + sqliteExprCode(pParse, pRecnoExpr); + }else{ + sqliteVdbeAddOp(v, OP_Recno, iCur, 0); + } + for(i=0; i<pTab->nCol; i++){ + if( i==pTab->iPKey ){ + sqliteVdbeAddOp(v, OP_String, 0, 0); + continue; + } + j = aXRef[i]; + if( j<0 ){ + sqliteVdbeAddOp(v, OP_Column, iCur, i); }else{ - sqliteExprCode(pParse, pChanges->a[aXRef[ii]].pExpr); + sqliteExprCode(pParse, pChanges->a[j].pExpr); } } sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0); sqliteVdbeAddOp(v, OP_PutIntKey, newIdx, 0); - sqliteVdbeAddOp(v, OP_Close, base, 0); - - sqliteVdbeAddOp(v, OP_Rewind, oldIdx, 0); - sqliteVdbeAddOp(v, OP_Rewind, newIdx, 0); + if( !isView ){ + sqliteVdbeAddOp(v, OP_Close, iCur, 0); + } + /* Fire the BEFORE and INSTEAD OF triggers + */ if( sqliteCodeRowTrigger(pParse, TK_UPDATE, pChanges, TK_BEFORE, pTab, newIdx, oldIdx, onError, addr) ){ goto update_cleanup; } } - /* Rewind the list of records that need to be updated and - ** open every index that needs updating. Note that if any - ** index could potentially invoke a REPLACE conflict resolution - ** action, then we need to open all indices because we might need - ** to be deleting some records. - */ - openOp = pTab->isTemp ? OP_OpenWrAux : OP_OpenWrite; - sqliteVdbeAddOp(v, openOp, base, pTab->tnum); - if( onError==OE_Replace ){ - openAll = 1; - }else{ - openAll = 0; - for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ - if( pIdx->onError==OE_Replace ){ - openAll = 1; - break; + if( !isView ){ + /* + ** Open every index that needs updating. Note that if any + ** index could potentially invoke a REPLACE conflict resolution + ** action, then we need to open all indices because we might need + ** to be deleting some records. + */ + sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenWrite, iCur, pTab->tnum); + if( onError==OE_Replace ){ + openAll = 1; + }else{ + openAll = 0; + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( pIdx->onError==OE_Replace ){ + openAll = 1; + break; + } } } - } - for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ - if( openAll || aIdxUsed[i] ){ - sqliteVdbeAddOp(v, openOp, base+i+1, pIdx->tnum); - assert( pParse->nTab>base+i+1 ); + for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ + if( openAll || aIdxUsed[i] ){ + sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenWrite, iCur+i+1, pIdx->tnum); + assert( pParse->nTab>iCur+i+1 ); + } } - } - /* Loop over every record that needs updating. We have to load - ** the old data for each record to be updated because some columns - ** might not change and we will need to copy the old value. - ** Also, the old data is needed to delete the old index entires. - ** So make the cursor point at the old record. - */ - if( !row_triggers_exist ){ - sqliteVdbeAddOp(v, OP_ListRewind, 0, 0); - addr = sqliteVdbeAddOp(v, OP_ListRead, 0, 0); - sqliteVdbeAddOp(v, OP_Dup, 0, 0); - } - sqliteVdbeAddOp(v, OP_NotExists, base, addr); - - /* If the record number will change, push the record number as it - ** will be after the update. (The old record number is currently - ** on top of the stack.) - */ - if( chngRecno ){ - sqliteExprCode(pParse, pRecnoExpr); - sqliteVdbeAddOp(v, OP_MustBeInt, 0, 0); - } + /* Loop over every record that needs updating. We have to load + ** the old data for each record to be updated because some columns + ** might not change and we will need to copy the old value. + ** Also, the old data is needed to delete the old index entires. + ** So make the cursor point at the old record. + */ + if( !row_triggers_exist ){ + sqliteVdbeAddOp(v, OP_ListRewind, 0, 0); + addr = sqliteVdbeAddOp(v, OP_ListRead, 0, 0); + sqliteVdbeAddOp(v, OP_Dup, 0, 0); + } + sqliteVdbeAddOp(v, OP_NotExists, iCur, addr); - /* Compute new data for this record. - */ - for(i=0; i<pTab->nCol; i++){ - if( i==pTab->iPKey ){ - sqliteVdbeAddOp(v, OP_String, 0, 0); - continue; + /* If the record number will change, push the record number as it + ** will be after the update. (The old record number is currently + ** on top of the stack.) + */ + if( chngRecno ){ + sqliteExprCode(pParse, pRecnoExpr); + sqliteVdbeAddOp(v, OP_MustBeInt, 0, 0); } - j = aXRef[i]; - if( j<0 ){ - sqliteVdbeAddOp(v, OP_Column, base, i); - }else{ - sqliteExprCode(pParse, pChanges->a[j].pExpr); + + /* Compute new data for this record. + */ + for(i=0; i<pTab->nCol; i++){ + if( i==pTab->iPKey ){ + sqliteVdbeAddOp(v, OP_String, 0, 0); + continue; + } + j = aXRef[i]; + if( j<0 ){ + sqliteVdbeAddOp(v, OP_Column, iCur, i); + }else{ + sqliteExprCode(pParse, pChanges->a[j].pExpr); + } } - } - /* Do constraint checks - */ - sqliteGenerateConstraintChecks(pParse, pTab, base, aIdxUsed, chngRecno, 1, - onError, addr); + /* Do constraint checks + */ + sqliteGenerateConstraintChecks(pParse, pTab, iCur, aIdxUsed, chngRecno, 1, + onError, addr); - /* Delete the old indices for the current record. - */ - sqliteGenerateRowIndexDelete(db, v, pTab, base, aIdxUsed); + /* Delete the old indices for the current record. + */ + sqliteGenerateRowIndexDelete(db, v, pTab, iCur, aIdxUsed); - /* If changing the record number, delete the old record. - */ - if( chngRecno ){ - sqliteVdbeAddOp(v, OP_Delete, base, 0); - } + /* If changing the record number, delete the old record. + */ + if( chngRecno ){ + sqliteVdbeAddOp(v, OP_Delete, iCur, 0); + } - /* Create the new index entries and the new record. - */ - sqliteCompleteInsertion(pParse, pTab, base, aIdxUsed, chngRecno, 1); + /* Create the new index entries and the new record. + */ + sqliteCompleteInsertion(pParse, pTab, iCur, aIdxUsed, chngRecno, 1, -1); + } /* Increment the row counter */ @@ -359,14 +386,18 @@ void sqliteUpdate( sqliteVdbeAddOp(v, OP_AddImm, 1, 0); } + /* If there are triggers, close all the cursors after each iteration + ** through the loop. The fire the after triggers. + */ if( row_triggers_exist ){ - for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ - if( openAll || aIdxUsed[i] ) - sqliteVdbeAddOp(v, OP_Close, base+i+1, 0); + if( !isView ){ + for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ + if( openAll || aIdxUsed[i] ) + sqliteVdbeAddOp(v, OP_Close, iCur+i+1, 0); + } + sqliteVdbeAddOp(v, OP_Close, iCur, 0); + pParse->nTab = iCur; } - sqliteVdbeAddOp(v, OP_Close, base, 0); - pParse->nTab = base; - if( sqliteCodeRowTrigger(pParse, TK_UPDATE, pChanges, TK_AFTER, pTab, newIdx, oldIdx, onError, addr) ){ goto update_cleanup; @@ -384,11 +415,11 @@ void sqliteUpdate( if( !row_triggers_exist ){ for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ if( openAll || aIdxUsed[i] ){ - sqliteVdbeAddOp(v, OP_Close, base+i+1, 0); + sqliteVdbeAddOp(v, OP_Close, iCur+i+1, 0); } } - sqliteVdbeAddOp(v, OP_Close, base, 0); - pParse->nTab = base; + sqliteVdbeAddOp(v, OP_Close, iCur, 0); + pParse->nTab = iCur; }else{ sqliteVdbeAddOp(v, OP_Close, newIdx, 0); sqliteVdbeAddOp(v, OP_Close, oldIdx, 0); @@ -406,6 +437,7 @@ void sqliteUpdate( } update_cleanup: + sqliteAuthContextPop(&sContext); sqliteFree(apIdx); sqliteFree(aXRef); sqliteSrcListDelete(pTabList); diff --git a/ext/sqlite/libsqlite/src/util.c b/ext/sqlite/libsqlite/src/util.c index 292df5d977..8520704ea6 100644 --- a/ext/sqlite/libsqlite/src/util.c +++ b/ext/sqlite/libsqlite/src/util.c @@ -393,6 +393,134 @@ void sqliteSetNString(char **pz, ...){ } /* +** Add an error message to pParse->zErrMsg and increment pParse->nErr. +** The following formatting characters are allowed: +** +** %s Insert a string +** %z A string that should be freed after use +** %d Insert an integer +** %T Insert a token +** %S Insert the first element of a SrcList +*/ +void sqliteErrorMsg(Parse *pParse, const char *zFormat, ...){ + va_list ap; + int nByte; + int i, j; + char *z; + static char zNull[] = "NULL"; + + pParse->nErr++; + nByte = 1 + strlen(zFormat); + va_start(ap, zFormat); + for(i=0; zFormat[i]; i++){ + if( zFormat[i]!='%' || zFormat[i+1]==0 ) continue; + i++; + switch( zFormat[i] ){ + case 'd': { + (void)va_arg(ap, int); + nByte += 20; + break; + } + case 'z': + case 's': { + char *z2 = va_arg(ap, char*); + if( z2==0 ) z2 = zNull; + nByte += strlen(z2); + break; + } + case 'T': { + Token *p = va_arg(ap, Token*); + nByte += p->n; + break; + } + case 'S': { + SrcList *p = va_arg(ap, SrcList*); + int k = va_arg(ap, int); + assert( p->nSrc>k && k>=0 ); + nByte += strlen(p->a[k].zName); + if( p->a[k].zDatabase && p->a[k].zDatabase[0] ){ + nByte += strlen(p->a[k].zDatabase)+1; + } + break; + } + default: { + nByte++; + break; + } + } + } + va_end(ap); + z = sqliteMalloc( nByte ); + if( z==0 ) return; + sqliteFree(pParse->zErrMsg); + pParse->zErrMsg = z; + va_start(ap, zFormat); + for(i=j=0; zFormat[i]; i++){ + if( zFormat[i]!='%' || zFormat[i+1]==0 ) continue; + if( i>j ){ + memcpy(z, &zFormat[j], i-j); + z += i-j; + } + j = i+2; + i++; + switch( zFormat[i] ){ + case 'd': { + int x = va_arg(ap, int); + sprintf(z, "%d", x); + z += strlen(z); + break; + } + case 'z': + case 's': { + int len; + char *z2 = va_arg(ap, char*); + if( z2==0 ) z2 = zNull; + len = strlen(z2); + memcpy(z, z2, len); + z += len; + if( zFormat[i]=='z' && z2!=zNull ){ + sqliteFree(z2); + } + break; + } + case 'T': { + Token *p = va_arg(ap, Token*); + memcpy(z, p->z, p->n); + z += p->n; + break; + } + case 'S': { + int len; + SrcList *p = va_arg(ap, SrcList*); + int k = va_arg(ap, int); + assert( p->nSrc>k && k>=0 ); + if( p->a[k].zDatabase && p->a[k].zDatabase[0] ){ + len = strlen(p->a[k].zDatabase); + memcpy(z, p->a[k].zDatabase, len); + z += len; + *(z++) = '.'; + } + len = strlen(p->a[k].zName); + memcpy(z, p->a[k].zName, len); + z += len; + break; + } + default: { + *(z++) = zFormat[i]; + break; + } + } + } + va_end(ap); + if( i>j ){ + memcpy(z, &zFormat[j], i-j); + z += i-j; + } + assert( (z - pParse->zErrMsg) < nByte ); + *z = 0; +} + +/* ** Convert an SQL-style quoted string into a normal string by removing ** the quote characters. The conversion is done in-place. If the ** input does not begin with a quote character, then this routine @@ -460,8 +588,7 @@ int sqliteHashNoCase(const char *z, int n){ h = (h<<3) ^ h ^ UpperToLower[(unsigned char)*z++]; n--; } - if( h<0 ) h = -h; - return h; + return h & 0x7fffffff; } /* @@ -669,12 +796,12 @@ static int sortStrCmp(const char *atext, const char *btext, int useCase){ ** Return TRUE if z is a pure numeric string. Return FALSE if the ** string contains any character which is not part of a number. ** -** Am empty string is considered numeric. +** Am empty string is considered non-numeric. */ -static int sqliteIsNumber(const char *z){ +int sqliteIsNumber(const char *z){ if( *z=='-' || *z=='+' ) z++; if( !isdigit(*z) ){ - return *z==0; + return 0; } z++; while( isdigit(*z) ){ z++; } @@ -682,12 +809,12 @@ static int sqliteIsNumber(const char *z){ z++; if( !isdigit(*z) ) return 0; while( isdigit(*z) ){ z++; } - if( *z=='e' || *z=='E' ){ - z++; - if( *z=='+' || *z=='-' ) z++; - if( !isdigit(*z) ) return 0; - while( isdigit(*z) ){ z++; } - } + } + if( *z=='e' || *z=='E' ){ + z++; + if( *z=='+' || *z=='-' ) z++; + if( !isdigit(*z) ) return 0; + while( isdigit(*z) ){ z++; } } return *z==0; } @@ -780,7 +907,6 @@ int sqliteCompare(const char *atext, const char *btext){ ** 2.6.3 and earlier. */ int sqliteSortCompare(const char *a, const char *b){ - int len; int res = 0; int isNumA, isNumB; int dir = 0; @@ -832,9 +958,8 @@ int sqliteSortCompare(const char *a, const char *b){ if( res ) break; } } - len = strlen(&a[1]) + 2; - a += len; - b += len; + a += strlen(&a[1]) + 2; + b += strlen(&b[1]) + 2; } if( dir=='-' || dir=='D' ) res = -res; return res; diff --git a/ext/sqlite/libsqlite/src/vacuum.c b/ext/sqlite/libsqlite/src/vacuum.c new file mode 100644 index 0000000000..145b368508 --- /dev/null +++ b/ext/sqlite/libsqlite/src/vacuum.c @@ -0,0 +1,316 @@ +/* +** 2003 April 6 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** 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$ +*/ +#include "sqliteInt.h" +#include "os.h" + +/* +** A structure for holding a dynamic string - a string that can grow +** without bound. +*/ +typedef struct dynStr dynStr; +struct dynStr { + char *z; /* Text of the string in space obtained from sqliteMalloc() */ + int nAlloc; /* Amount of space allocated to z[] */ + int nUsed; /* Next unused slot in z[] */ +}; + +/* +** A structure that holds the vacuum context +*/ +typedef struct vacuumStruct vacuumStruct; +struct vacuumStruct { + sqlite *dbOld; /* Original database */ + sqlite *dbNew; /* New database */ + Parse *pParse; /* The parser context */ + const char *zTable; /* Name of a table being copied */ + const char *zPragma; /* Pragma to execute with results */ + dynStr s1, s2; /* Two dynamic strings */ +}; + +#if !defined(SQLITE_OMIT_VACUUM) || SQLITE_OMIT_VACUUM +/* +** Append text to a dynamic string +*/ +static void appendText(dynStr *p, const char *zText, int nText){ + if( nText<0 ) nText = strlen(zText); + if( p->z==0 || p->nUsed + nText + 1 >= p->nAlloc ){ + char *zNew; + p->nAlloc = p->nUsed + nText + 1000; + zNew = sqliteRealloc(p->z, p->nAlloc); + if( zNew==0 ){ + sqliteFree(p->z); + memset(p, 0, sizeof(*p)); + return; + } + p->z = zNew; + } + memcpy(&p->z[p->nUsed], zText, nText+1); + p->nUsed += nText; +} + +/* +** Append text to a dynamic string, having first put the text in quotes. +*/ +static void appendQuoted(dynStr *p, const char *zText){ + int i, j; + appendText(p, "'", 1); + for(i=j=0; zText[i]; i++){ + if( zText[i]=='\'' ){ + appendText(p, &zText[j], i-j+1); + j = i + 1; + appendText(p, "'", 1); + } + } + if( j<i ){ + appendText(p, &zText[j], i-j); + } + appendText(p, "'", 1); +} + +/* +** Execute statements of SQL. If an error occurs, write the error +** message into pParse->zErrMsg and return non-zero. +*/ +static int execsql(Parse *pParse, sqlite *db, const char *zSql){ + int rc; + char *zErrMsg = 0; + + /* printf("***** executing *****\n%s\n", zSql); */ + rc = sqlite_exec(db, zSql, 0, 0, &zErrMsg); + if( rc ){ + sqliteErrorMsg(pParse, "%s", zErrMsg); + sqlite_freemem(zErrMsg); + } + return rc; +} + +/* +** This is the second stage callback. Each invocation contains all the +** data for a single row of a single table in the original database. This +** routine must write that information into the new database. +*/ +static int vacuumCallback2(void *pArg, int argc, char **argv, char **NotUsed){ + vacuumStruct *p = (vacuumStruct*)pArg; + int rc = 0; + const char *zSep = "("; + int i; + + p->s2.nUsed = 0; + appendText(&p->s2, "INSERT INTO ", -1); + appendQuoted(&p->s2, p->zTable); + appendText(&p->s2, " VALUES", -1); + for(i=0; i<argc; i++){ + appendText(&p->s2, zSep, 1); + zSep = ","; + if( argv[i]==0 ){ + appendText(&p->s2, "NULL", 4); + }else{ + appendQuoted(&p->s2, argv[i]); + } + } + appendText(&p->s2,")", 1); + rc = execsql(p->pParse, p->dbNew, p->s2.z); + return rc; +} + +/* +** This is the first stage callback. Each invocation contains three +** arguments where are taken from the SQLITE_MASTER table of the original +** database: (1) the entry type, (2) the entry name, and (3) the SQL for +** the entry. In all cases, execute the SQL of the third argument. +** For tables, run a query to select all entries in that table and +** transfer them to the second-stage callback. +*/ +static int vacuumCallback1(void *pArg, int argc, char **argv, char **NotUsed){ + vacuumStruct *p = (vacuumStruct*)pArg; + int rc = 0; + assert( argc==3 ); + assert( argv[0]!=0 ); + assert( argv[1]!=0 ); + assert( argv[2]!=0 ); + rc = execsql(p->pParse, p->dbNew, argv[2]); + if( rc==SQLITE_OK && strcmp(argv[0],"table")==0 ){ + char *zErrMsg = 0; + p->s1.nUsed = 0; + appendText(&p->s1, "SELECT * FROM ", -1); + appendQuoted(&p->s1, argv[1]); + p->zTable = argv[1]; + rc = sqlite_exec(p->dbOld, p->s1.z, vacuumCallback2, p, &zErrMsg); + if( rc && p->pParse->zErrMsg==0 ){ + sqliteErrorMsg(p->pParse, "%s", zErrMsg); + } + } + return rc; +} + +/* +** This callback is used to transfer PRAGMA settings from one database +** to the other. The value in argv[0] should be passed to a pragma +** identified by ((vacuumStruct*)pArg)->zPragma. +*/ +static int vacuumCallback3(void *pArg, int argc, char **argv, char **NotUsed){ + vacuumStruct *p = (vacuumStruct*)pArg; + int rc = 0; + char zBuf[200]; + assert( argc==1 ); + assert( argv[0]!=0 ); + assert( strlen(p->zPragma)<100 ); + assert( strlen(argv[0])<30 ); + sprintf(zBuf,"PRAGMA %s=%s;", p->zPragma, argv[0]); + rc = execsql(p->pParse, p->dbNew, zBuf); + return rc; +} + +/* +** Generate a random name of 20 character in length. +*/ +static void randomName(char *zBuf){ + static const char zChars[] = + "abcdefghijklmnopqrstuvwxyz" + "0123456789"; + int i; + for(i=0; i<20; i++){ + int n = sqliteRandomByte() % (sizeof(zChars)-1); + zBuf[i] = zChars[n]; + } +} +#endif + +/* +** The non-standard VACUUM command is used to clean up the database, +** collapse free space, etc. It is modelled after the VACUUM command +** in PostgreSQL. +** +** In version 1.0.x of SQLite, the VACUUM command would call +** gdbm_reorganize() on all the database tables. But beginning +** with 2.0.0, SQLite no longer uses GDBM so this command has +** become a no-op. +*/ +void sqliteVacuum(Parse *pParse, Token *pTableName){ +#if !defined(SQLITE_OMIT_VACUUM) || SQLITE_OMIT_VACUUM + const char *zFilename; /* full pathname of the database file */ + int nFilename; /* number of characters in zFilename[] */ + char *zTemp = 0; /* a temporary file in same directory as zFilename */ + sqlite *dbNew = 0; /* The new vacuumed database */ + sqlite *db; /* The original database */ + int rc = SQLITE_OK; /* Return code from service routines */ + int i; /* Loop counter */ + char *zErrMsg = 0; /* Error messages stored here */ + int safety = 0; /* TRUE if safety is off */ + vacuumStruct sVac; /* Information passed to callbacks */ + + /* These are all of the pragmas that need to be transferred over + ** to the new database */ + static const char *zPragma[] = { + "default_synchronous", + "default_cache_size", + /* "default_temp_store", */ + }; + + /* Initial error checks + */ + if( pParse->explain ){ + return; + } + db = pParse->db; + if( db->flags & SQLITE_InTrans ){ + sqliteErrorMsg(pParse, "cannot VACUUM from within a transaction"); + return; + } + memset(&sVac, 0, sizeof(sVac)); + + /* Get the full pathname of the database file and create two + ** temporary filenames in the same directory as the original file. + */ + zFilename = sqliteBtreeGetFilename(db->aDb[0].pBt); + if( zFilename==0 ){ + /* This only happens with the in-memory database. VACUUM is a no-op + ** there, so just return */ + return; + } + nFilename = strlen(zFilename); + zTemp = sqliteMalloc( nFilename+100 ); + if( zTemp==0 ) return; + strcpy(zTemp, zFilename); + for(i=0; i<10; i++){ + zTemp[nFilename] = '-'; + randomName(&zTemp[nFilename+1]); + if( !sqliteOsFileExists(zTemp) ) break; + } + if( i>=10 ){ + sqliteErrorMsg(pParse, "unable to create a temporary database file " + "in the same directory as the original database"); + goto end_of_vacuum; + } + + + dbNew = sqlite_open(zTemp, 0, &zErrMsg); + if( dbNew==0 ){ + sqliteErrorMsg(pParse, "unable to open a temporary database at %s - %s", + zTemp, zErrMsg); + goto end_of_vacuum; + } + if( sqliteSafetyOff(db) ){ + sqliteErrorMsg(pParse, "library routines called out of sequence"); + goto end_of_vacuum; + } + safety = 1; + if( execsql(pParse, db, "BEGIN") ) goto end_of_vacuum; + if( execsql(pParse, dbNew, "PRAGMA synchronous=off; BEGIN") ){ + goto end_of_vacuum; + } + sVac.dbOld = db; + sVac.dbNew = dbNew; + sVac.pParse = pParse; + for(i=0; rc==SQLITE_OK && i<sizeof(zPragma)/sizeof(zPragma[0]); i++){ + char zBuf[200]; + assert( strlen(zPragma[i])<100 ); + sprintf(zBuf, "PRAGMA %s;", zPragma[i]); + sVac.zPragma = zPragma[i]; + rc = sqlite_exec(db, zBuf, vacuumCallback3, &sVac, &zErrMsg); + } + if( !rc ){ + rc = sqlite_exec(db, "SELECT type, name, sql FROM sqlite_master " + "WHERE sql NOT NULL", vacuumCallback1, &sVac, &zErrMsg); + } + if( !rc ){ + rc = sqliteBtreeCopyFile(db->aDb[0].pBt, dbNew->aDb[0].pBt); + sqlite_exec(db, "COMMIT", 0, 0, 0); + sqlite_exec(db, "ROLLBACK", 0, 0, 0); /* In case the COMMIT failed */ + sqliteResetInternalSchema(db, 0); + } + +end_of_vacuum: + if( rc && pParse->zErrMsg==0 && zErrMsg!=0 ){ + sqliteErrorMsg(pParse, "unable to vacuum database - %s", zErrMsg); + } + if( safety ) { + sqlite_exec(db, "COMMIT", 0, 0, 0); + sqlite_exec(db, "ROLLBACK", 0, 0, 0); /* In case the COMMIT failed */ + sqliteSafetyOn(db); + } + if( dbNew ) sqlite_close(dbNew); + sqliteOsDelete(zTemp); + sqliteFree(zTemp); + sqliteFree(sVac.s1.z); + sqliteFree(sVac.s2.z); + if( zErrMsg ) sqlite_freemem(zErrMsg); + return; +#endif +} diff --git a/ext/sqlite/libsqlite/src/vdbe.c b/ext/sqlite/libsqlite/src/vdbe.c index f9b94824c4..3ac4a3acc8 100644 --- a/ext/sqlite/libsqlite/src/vdbe.c +++ b/ext/sqlite/libsqlite/src/vdbe.c @@ -79,6 +79,11 @@ typedef unsigned char Bool; ** ** Every cursor that the virtual machine has open is represented by an ** instance of the following structure. +** +** If the Cursor.isTriggerRow flag is set it means that this cursor is +** really a single row that represents the NEW or OLD pseudo-table of +** a row trigger. The data for the row is stored in Cursor.pData and +** the rowid is in Cursor.iKey. */ struct Cursor { BtCursor *pCursor; /* The cursor structure of the backend */ @@ -90,7 +95,11 @@ struct Cursor { Bool useRandomRowid; /* Generate new record numbers semi-randomly */ Bool nullRow; /* True if pointing to a row with no data */ Bool nextRowidValid; /* True if the nextRowid field is valid */ + Bool pseudoTable; /* This is a NEW or OLD pseudo-tables of a trigger */ Btree *pBt; /* Separate file holding temporary table */ + int nData; /* Number of bytes in pData */ + char *pData; /* Data for a NEW or OLD pseudo-table */ + int iKey; /* Key for the NEW or OLD pseudo-table row */ }; typedef struct Cursor Cursor; @@ -243,7 +252,6 @@ struct Keylist { struct Vdbe { sqlite *db; /* The whole database */ Vdbe *pPrev,*pNext; /* Linked list of VDBEs with the same Vdbe.db */ - Btree *pBt; /* Opaque context structure used by DB backend */ FILE *trace; /* Write an execution trace here, if not NULL */ int nOp; /* Number of instructions in the program */ int nOpAlloc; /* Number of slots allocated for aOp[] */ @@ -315,7 +323,6 @@ Vdbe *sqliteVdbeCreate(sqlite *db){ Vdbe *p; p = sqliteMalloc( sizeof(Vdbe) ); if( p==0 ) return 0; - p->pBt = db->pBe; p->db = db; if( db->pVdbe ){ db->pVdbe->pPrev = p; @@ -478,6 +485,7 @@ int sqliteVdbeAddOpList(Vdbe *p, int nOp, VdbeOp const *aOp){ return addr; } +#if 0 /* NOT USED */ /* ** Change the value of the P1 operand for a specific instruction. ** This routine is useful when a large program is loaded from a @@ -490,6 +498,7 @@ void sqliteVdbeChangeP1(Vdbe *p, int addr, int val){ p->aOp[addr].p1 = val; } } +#endif /* NOT USED */ /* ** Change the value of the P2 operand for a specific instruction. @@ -605,18 +614,27 @@ void sqliteVdbeCompressSpace(Vdbe *p, int addr){ /* ** Search for the current program for the given opcode and P2 -** value. Return 1 if found and 0 if not found. +** value. Return the address plus 1 if found and 0 if not found. */ int sqliteVdbeFindOp(Vdbe *p, int op, int p2){ int i; assert( p->magic==VDBE_MAGIC_INIT ); for(i=0; i<p->nOp; i++){ - if( p->aOp[i].opcode==op && p->aOp[i].p2==p2 ) return 1; + if( p->aOp[i].opcode==op && p->aOp[i].p2==p2 ) return i+1; } return 0; } /* +** Return the opcode for a given address. +*/ +VdbeOp *sqliteVdbeGetOp(Vdbe *p, int addr){ + assert( p->magic==VDBE_MAGIC_INIT ); + assert( addr>=0 && addr<p->nOp ); + return &p->aOp[addr]; +} + +/* ** The following group or routines are employed by installable functions ** to return their results. ** @@ -994,6 +1012,7 @@ static int toInt(const char *zNum, int *pNum){ }else{ neg = 0; } + if( *zNum==0 ) return 0; while( isdigit(*zNum) ){ v = v*10 + *zNum - '0'; zNum++; @@ -1073,27 +1092,6 @@ static void PopStack(Vdbe *p, int N){ p->tos--; /* -** Return TRUE if zNum is a floating-point or integer number. -*/ -static int isNumber(const char *zNum){ - if( *zNum=='-' || *zNum=='+' ) zNum++; - if( !isdigit(*zNum) ) return 0; - while( isdigit(*zNum) ) zNum++; - if( *zNum==0 ) return 1; - if( *zNum!='.' ) return 0; - zNum++; - if( !isdigit(*zNum) ) return 0; - while( isdigit(*zNum) ) zNum++; - if( *zNum==0 ) return 1; - if( *zNum!='e' && *zNum!='E' ) return 0; - zNum++; - if( *zNum=='-' || *zNum=='+' ) zNum++; - if( !isdigit(*zNum) ) return 0; - while( isdigit(*zNum) ) zNum++; - return *zNum==0; -} - -/* ** Delete a keylist */ static void KeylistFree(Keylist *p){ @@ -1115,6 +1113,7 @@ static void cleanupCursor(Cursor *pCx){ if( pCx->pBt ){ sqliteBtreeClose(pCx->pBt); } + sqliteFree(pCx->pData); memset(pCx, 0, sizeof(Cursor)); } @@ -1300,7 +1299,7 @@ int sqliteVdbeList( p->rc = SQLITE_MISUSE; } } - return p->rc==SQLITE_OK ? SQLITE_OK : SQLITE_ERROR; + return p->rc==SQLITE_OK ? SQLITE_DONE : SQLITE_ERROR; } /* @@ -1498,6 +1497,9 @@ void sqliteVdbeMakeReady( int isExplain /* True if the EXPLAIN keywords is present */ ){ int n; +#ifdef MEMORY_DEBUG + extern int access(const char*,int); +#endif assert( p!=0 ); assert( p->aStack==0 ); @@ -1569,8 +1571,8 @@ void sqliteVdbeMakeReady( ** immediately. There will be no error message but the p->rc field is ** set to SQLITE_ABORT and this routine will return SQLITE_ERROR. ** -** A memory allocation error causes p->rc to be set SQLITE_NOMEM and this -** routien to return SQLITE_ERROR. +** A memory allocation error causes p->rc to be set to SQLITE_NOMEM and this +** routine to return SQLITE_ERROR. ** ** Other fatal errors return SQLITE_ERROR. ** @@ -1583,7 +1585,6 @@ int sqliteVdbeExec( int pc; /* The program counter */ Op *pOp; /* Current operation */ int rc = SQLITE_OK; /* Value to return */ - Btree *pBt = p->pBt; /* The backend driver */ sqlite *db = p->db; /* The database */ char **zStack = p->zStack; /* Text stack */ Stack *aStack = p->aStack; /* Additional stack information */ @@ -1893,6 +1894,7 @@ case OP_Push: { ** to all column names is passed as the 4th parameter to the callback. */ case OP_ColumnName: { + assert( pOp->p1>=0 && pOp->p1<p->nOp ); p->azColName[pOp->p1] = pOp->p3; p->nCallback = 0; break; @@ -3061,7 +3063,7 @@ case OP_MakeKey: { Stringify(p, i); aStack[i].flags &= ~(STK_Int|STK_Real); nByte += aStack[i].n+1; - }else if( (flags & (STK_Real|STK_Int))!=0 || isNumber(zStack[i]) ){ + }else if( (flags & (STK_Real|STK_Int))!=0 || sqliteIsNumber(zStack[i]) ){ if( (flags & (STK_Real|STK_Int))==STK_Int ){ aStack[i].r = aStack[i].i; }else if( (flags & (STK_Real|STK_Int))==0 ){ @@ -3153,17 +3155,21 @@ case OP_IncrKey: { break; } -/* Opcode: Checkpoint * * * +/* Opcode: Checkpoint P1 * * ** ** Begin a checkpoint. A checkpoint is the beginning of a operation that ** is part of a larger transaction but which might need to be rolled back ** itself without effecting the containing transaction. A checkpoint will ** be automatically committed or rollback when the VDBE halts. +** +** The checkpoint is begun on the database file with index P1. The main +** database file has an index of 0 and the file used for temporary tables +** has an index of 1. */ case OP_Checkpoint: { - rc = sqliteBtreeBeginCkpt(pBt); - if( rc==SQLITE_OK && db->pBeTemp ){ - rc = sqliteBtreeBeginCkpt(db->pBeTemp); + int i = pOp->p1; + if( i>=0 && i<db->nDb && db->aDb[i].pBt ){ + rc = sqliteBtreeBeginCkpt(db->aDb[i].pBt); } break; } @@ -3174,10 +3180,9 @@ case OP_Checkpoint: { ** opcode is encountered. Depending on the ON CONFLICT setting, the ** transaction might also be rolled back if an error is encountered. ** -** If P1 is true, then the transaction is started on the temporary -** tables of the database only. The main database file is not write -** locked and other processes can continue to read the main database -** file. +** P1 is the index of the database file on which the transaction is +** started. Index 0 is the main database file and index 1 is the +** file used for temporary tables. ** ** A write lock is obtained on the database file when a transaction is ** started. No other process can read or write the file while the @@ -3187,15 +3192,11 @@ case OP_Checkpoint: { */ case OP_Transaction: { int busy = 1; - if( db->pBeTemp && !p->inTempTrans ){ - rc = sqliteBtreeBeginTrans(db->pBeTemp); - if( rc!=SQLITE_OK ){ - goto abort_due_to_error; - } - p->inTempTrans = 1; - } - while( pOp->p1==0 && busy ){ - rc = sqliteBtreeBeginTrans(pBt); + int i = pOp->p1; + assert( i>=0 && i<db->nDb ); + if( db->aDb[i].inTrans ) break; + while( db->aDb[i].pBt!=0 && busy ){ + rc = sqliteBtreeBeginTrans(db->aDb[i].pBt); switch( rc ){ case SQLITE_BUSY: { if( db->xBusyCallback==0 ){ @@ -3223,6 +3224,7 @@ case OP_Transaction: { } } } + db->aDb[i].inTrans = 1; p->undoTransOnError = 1; break; } @@ -3236,53 +3238,47 @@ case OP_Transaction: { ** A read lock continues to be held if there are still cursors open. */ case OP_Commit: { - if( db->pBeTemp==0 || (rc = sqliteBtreeCommit(db->pBeTemp))==SQLITE_OK ){ - rc = p->inTempTrans ? SQLITE_OK : sqliteBtreeCommit(pBt); + int i; + for(i=0; rc==SQLITE_OK && i<db->nDb; i++){ + if( db->aDb[i].inTrans ){ + rc = sqliteBtreeCommit(db->aDb[i].pBt); + db->aDb[i].inTrans = 0; + } } if( rc==SQLITE_OK ){ sqliteCommitInternalChanges(db); }else{ - if( db->pBeTemp ) sqliteBtreeRollback(db->pBeTemp); - sqliteBtreeRollback(pBt); - sqliteRollbackInternalChanges(db); + sqliteRollbackAll(db); } - p->inTempTrans = 0; break; } -/* Opcode: Rollback * * * +/* Opcode: Rollback P1 * * ** ** Cause all modifications to the database that have been made since the ** last Transaction to be undone. The database is restored to its state ** before the Transaction opcode was executed. No additional modifications ** are allowed until another transaction is started. ** +** P1 is the index of the database file that is committed. An index of 0 +** is used for the main database and an index of 1 is used for the file used +** to hold temporary tables. +** ** This instruction automatically closes all cursors and releases both -** the read and write locks on the database. +** the read and write locks on the indicated database. */ case OP_Rollback: { - if( db->pBeTemp ){ - sqliteBtreeRollback(db->pBeTemp); - } - rc = sqliteBtreeRollback(pBt); - sqliteRollbackInternalChanges(db); + sqliteRollbackAll(db); break; } -/* Opcode: ReadCookie * P2 * -** -** When P2==0, -** read the schema cookie from the database file and push it onto the -** stack. The schema cookie is an integer that is used like a version -** number for the database schema. Everytime the schema changes, the -** cookie changes to a new random value. This opcode is used during -** initialization to read the initial cookie value so that subsequent -** database accesses can verify that the cookie has not changed. +/* Opcode: ReadCookie P1 P2 * ** -** If P2>0, then read global database parameter number P2. There is -** a small fixed number of global database parameters. P2==1 is the -** database version number. P2==2 is the recommended pager cache size. -** Other parameters are currently unused. +** Read cookie number P2 from database P1 and push it onto the stack. +** P2==0 is the schema version. P2==1 is the database format. +** P2==2 is the recommended pager cache size, and so forth. P1==0 is +** the main database file and P1==1 is the database file used to store +** temporary tables. ** ** There must be a read-lock on the database (either a transaction ** must be started or there must be an open cursor) before @@ -3292,36 +3288,35 @@ case OP_ReadCookie: { int i = ++p->tos; int aMeta[SQLITE_N_BTREE_META]; assert( pOp->p2<SQLITE_N_BTREE_META ); - rc = sqliteBtreeGetMeta(pBt, aMeta); + assert( pOp->p1>=0 && pOp->p1<db->nDb ); + assert( db->aDb[pOp->p1].pBt!=0 ); + rc = sqliteBtreeGetMeta(db->aDb[pOp->p1].pBt, aMeta); aStack[i].i = aMeta[1+pOp->p2]; aStack[i].flags = STK_Int; break; } -/* Opcode: SetCookie * P2 * +/* Opcode: SetCookie P1 P2 * ** -** When P2==0, -** this operation changes the value of the schema cookie on the database. -** The new value is top of the stack. -** When P2>0, the value of global database parameter -** number P2 is changed. See ReadCookie for more information about -** global database parametes. -** -** The schema cookie changes its value whenever the database schema changes. -** That way, other processes can recognize when the schema has changed -** and reread it. +** Write the top of the stack into cookie number P2 of database P1. +** P2==0 is the schema version. P2==1 is the database format. +** P2==2 is the recommended pager cache size, and so forth. P1==0 is +** the main database file and P1==1 is the database file used to store +** temporary tables. ** ** A transaction must be started before executing this opcode. */ case OP_SetCookie: { int aMeta[SQLITE_N_BTREE_META]; assert( pOp->p2<SQLITE_N_BTREE_META ); + assert( pOp->p1>=0 && pOp->p1<db->nDb ); + assert( db->aDb[pOp->p1].pBt!=0 ); VERIFY( if( p->tos<0 ) goto not_enough_stack; ) Integerify(p, p->tos) - rc = sqliteBtreeGetMeta(pBt, aMeta); + rc = sqliteBtreeGetMeta(db->aDb[pOp->p1].pBt, aMeta); if( rc==SQLITE_OK ){ aMeta[1+pOp->p2] = aStack[p->tos].i; - rc = sqliteBtreeUpdateMeta(pBt, aMeta); + rc = sqliteBtreeUpdateMeta(db->aDb[pOp->p1].pBt, aMeta); } POPSTACK; break; @@ -3329,10 +3324,11 @@ case OP_SetCookie: { /* Opcode: VerifyCookie P1 P2 * ** -** Check the value of global database parameter number P2 and make -** sure it is equal to P1. P2==0 is the schema cookie. P1==1 is -** the database version. If the values do not match, abort with -** an SQLITE_SCHEMA error. +** Check the value of global database parameter number 0 (the +** schema version) and make sure it is equal to P2. +** P1 is the database number which is 0 for the main database file +** and 1 for the file holding temporary tables and some higher number +** for auxiliary databases. ** ** The cookie changes its value whenever the database schema changes. ** This operation is used to detect when that the cookie has changed @@ -3344,23 +3340,26 @@ case OP_SetCookie: { */ case OP_VerifyCookie: { int aMeta[SQLITE_N_BTREE_META]; - assert( pOp->p2<SQLITE_N_BTREE_META ); - rc = sqliteBtreeGetMeta(pBt, aMeta); - if( rc==SQLITE_OK && aMeta[1+pOp->p2]!=pOp->p1 ){ + assert( pOp->p1>=0 && pOp->p1<db->nDb ); + rc = sqliteBtreeGetMeta(db->aDb[pOp->p1].pBt, aMeta); + if( rc==SQLITE_OK && aMeta[1]!=pOp->p2 ){ sqliteSetString(&p->zErrMsg, "database schema has changed", 0); rc = SQLITE_SCHEMA; } break; } -/* Opcode: Open P1 P2 P3 +/* Opcode: OpenRead P1 P2 P3 ** ** Open a read-only cursor for the database table whose root page is -** P2 in the main database file. Give the new cursor an identifier -** of P1. The P1 values need not be contiguous but all P1 values -** should be small integers. It is an error for P1 to be negative. +** P2 in a database file. The database file is determined by an +** integer from the top of the stack. 0 means the main database and +** 1 means the database used for temporary tables. Give the new +** cursor an identifier of P1. The P1 values need not be contiguous +** but all P1 values should be small integers. It is an error for +** P1 to be negative. ** -** If P2==0 then take the root page number from the top of the stack. +** If P2==0 then take the root page number from the next of the stack. ** ** There will be a read lock on the database whenever there is an ** open cursor. If the database was unlocked prior to this instruction @@ -3376,52 +3375,39 @@ case OP_VerifyCookie: { ** omitted. But the code generator usually inserts the index or ** table name into P3 to make the code easier to read. ** -** See also OpenAux and OpenWrite. -*/ -/* Opcode: OpenAux P1 P2 P3 -** -** Open a read-only cursor in the auxiliary table set. This opcode -** works exactly like OP_Open except that it opens the cursor on the -** auxiliary table set (the file used to store tables created using -** CREATE TEMPORARY TABLE) instead of in the main database file. -** See OP_Open for additional information. +** See also OpenWrite. */ /* Opcode: OpenWrite P1 P2 P3 ** ** Open a read/write cursor named P1 on the table or index whose root ** page is P2. If P2==0 then take the root page number from the stack. ** -** This instruction works just like Open except that it opens the cursor +** This instruction works just like OpenRead except that it opens the cursor ** in read/write mode. For a given table, there can be one or more read-only ** cursors or a single read/write cursor but not both. ** -** See also OpWrAux. +** See also OpenRead. */ -/* Opcode: OpenWrAux P1 P2 P3 -** -** Open a read/write cursor in the auxiliary table set. This opcode works -** just like OpenWrite except that the auxiliary table set (the file used -** to store tables created using CREATE TEMPORARY TABLE) is used in place -** of the main database file. -*/ -case OP_OpenAux: -case OP_OpenWrAux: -case OP_OpenWrite: -case OP_Open: { +case OP_OpenRead: +case OP_OpenWrite: { int busy = 0; int i = pOp->p1; int tos = p->tos; int p2 = pOp->p2; int wrFlag; Btree *pX; - switch( pOp->opcode ){ - case OP_Open: wrFlag = 0; pX = pBt; break; - case OP_OpenWrite: wrFlag = 1; pX = pBt; break; - case OP_OpenAux: wrFlag = 0; pX = db->pBeTemp; break; - case OP_OpenWrAux: wrFlag = 1; pX = db->pBeTemp; break; - } + int iDb; + + VERIFY( if( tos<0 ) goto not_enough_stack; ); + Integerify(p, tos); + iDb = p->aStack[tos].i; + tos--; + VERIFY( if( iDb<0 || iDb>=db->nDb ) goto bad_instruction; ); + VERIFY( if( db->aDb[iDb].pBt==0 ) goto bad_instruction; ); + pX = db->aDb[iDb].pBt; + wrFlag = pOp->opcode==OP_OpenWrite; if( p2<=0 ){ - if( tos<0 ) goto not_enough_stack; + VERIFY( if( tos<0 ) goto not_enough_stack; ); Integerify(p, tos); p2 = p->aStack[tos].i; POPSTACK; @@ -3463,15 +3449,16 @@ case OP_Open: { if( p2<=0 ){ POPSTACK; } + POPSTACK; break; } /* Opcode: OpenTemp P1 P2 * ** -** Open a new cursor that points to a table or index in a temporary -** database file. The temporary file is opened read/write even if -** the main database is read-only. The temporary file is deleted -** when the cursor is closed. +** Open a new cursor to a transient table. +** The transient cursor is always opened read/write even if +** the main database is read-only. The transient table is deleted +** automatically when the cursor is closed. ** ** The cursor points to a BTree table if P2==0 and to a BTree index ** if P2==1. A BTree table must have an integer key and can have arbitrary @@ -3479,7 +3466,7 @@ case OP_Open: { ** ** This opcode is used for tables that exist for the duration of a single ** SQL statement only. Tables created using CREATE TEMPORARY TABLE -** are opened using OP_OpenAux or OP_OpenWrAux. "Temporary" in the +** are opened using OP_OpenRead or OP_OpenWrite. "Temporary" in the ** context of this opcode means for the duration of a single SQL statement ** whereas "Temporary" in the context of CREATE TABLE means for the duration ** of the connection to the database. Same word; different meanings. @@ -3493,7 +3480,8 @@ case OP_OpenTemp: { cleanupCursor(pCx); memset(pCx, 0, sizeof(*pCx)); pCx->nullRow = 1; - rc = sqliteBtreeOpen(0, 1, TEMP_PAGES, &pCx->pBt); + rc = sqliteBtreeFactory(db, 0, 1, TEMP_PAGES, &pCx->pBt); + if( rc==SQLITE_OK ){ rc = sqliteBtreeBeginTrans(pCx->pBt); } @@ -3511,24 +3499,26 @@ case OP_OpenTemp: { break; } -/* -** Opcode: RenameCursor P1 P2 * +/* Opcode: OpenPseudo P1 * * ** -** Rename cursor number P1 as cursor number P2. If P2 was previously -** opened is is closed before the renaming occurs. +** Open a new cursor that points to a fake table that contains a single +** row of data. Any attempt to write a second row of data causes the +** first row to be deleted. All data is deleted when the cursor is +** closed. +** +** A pseudo-table created by this opcode is useful for holding the +** NEW or OLD tables in a trigger. */ -case OP_RenameCursor: { - int from = pOp->p1; - int to = pOp->p2; - VERIFY( if( from<0 || to<0 ) goto bad_instruction; ) - if( to<p->nCursor && p->aCsr[to].pCursor ){ - cleanupCursor(&p->aCsr[to]); - } - expandCursorArraySize(p, to); - if( from<p->nCursor ){ - memcpy(&p->aCsr[to], &p->aCsr[from], sizeof(p->aCsr[0])); - memset(&p->aCsr[from], 0, sizeof(p->aCsr[0])); - } +case OP_OpenPseudo: { + int i = pOp->p1; + Cursor *pCx; + VERIFY( if( i<0 ) goto bad_instruction; ) + if( expandCursorArraySize(p, i) ) goto no_mem; + pCx = &p->aCsr[i]; + cleanupCursor(pCx); + memset(pCx, 0, sizeof(*pCx)); + pCx->nullRow = 1; + pCx->pseudoTable = 1; break; } @@ -3539,7 +3529,7 @@ case OP_RenameCursor: { */ case OP_Close: { int i = pOp->p1; - if( i>=0 && i<p->nCursor && p->aCsr[i].pCursor ){ + if( i>=0 && i<p->nCursor ){ cleanupCursor(&p->aCsr[i]); } break; @@ -3573,7 +3563,9 @@ case OP_MoveTo: { Cursor *pC; VERIFY( if( tos<0 ) goto not_enough_stack; ) - if( i>=0 && i<p->nCursor && (pC = &p->aCsr[i])->pCursor!=0 ){ + assert( i>=0 && i<p->nCursor ); + pC = &p->aCsr[i]; + if( pC->pCursor!=0 ){ int res, oc; if( aStack[tos].flags & STK_Int ){ int iKey = intToKey(aStack[tos].i); @@ -3905,7 +3897,8 @@ case OP_NewRecno: { ** be an integer. The stack is popped twice by this instruction. ** ** If P2==1 then the row change count is incremented. If P2==0 the -** row change count is unmodified. +** row change count is unmodified. The rowid is stored for subsequent +** return by the sqlite_last_insert_rowid() function if P2 is 1. */ /* Opcode: PutStrKey P1 * * ** @@ -3914,6 +3907,8 @@ case OP_NewRecno: { ** entry is overwritten. The data is the value on the top of the ** stack. The key is the next value down on the stack. The key must ** be a string. The stack is popped twice by this instruction. +** +** P1 may not be a pseudo-table opened using the OpenPseudo opcode. */ case OP_PutIntKey: case OP_PutStrKey: { @@ -3922,7 +3917,8 @@ case OP_PutStrKey: { int i = pOp->p1; Cursor *pC; VERIFY( if( nos<0 ) goto not_enough_stack; ) - if( VERIFY( i>=0 && i<p->nCursor && ) (pC = &p->aCsr[i])->pCursor!=0 ){ + if( VERIFY( i>=0 && i<p->nCursor && ) + ((pC = &p->aCsr[i])->pCursor!=0 || pC->pseudoTable) ){ char *zKey; int nKey, iKey; if( pOp->opcode==OP_PutStrKey ){ @@ -3934,14 +3930,38 @@ case OP_PutStrKey: { nKey = sizeof(int); iKey = intToKey(aStack[nos].i); zKey = (char*)&iKey; - db->lastRowid = aStack[nos].i; - if( pOp->p2 ) db->nChange++; + if( pOp->p2 ){ + db->nChange++; + db->lastRowid = aStack[nos].i; + } if( pC->nextRowidValid && aStack[nos].i>=pC->nextRowid ){ pC->nextRowidValid = 0; } } - rc = sqliteBtreeInsert(pC->pCursor, zKey, nKey, - zStack[tos], aStack[tos].n); + if( pC->pseudoTable ){ + /* PutStrKey does not work for pseudo-tables. + ** The following assert makes sure we are not trying to use + ** PutStrKey on a pseudo-table + */ + assert( pOp->opcode==OP_PutIntKey ); + sqliteFree(pC->pData); + pC->iKey = iKey; + pC->nData = aStack[tos].n; + if( aStack[tos].flags & STK_Dyn ){ + pC->pData = zStack[tos]; + zStack[tos] = 0; + aStack[tos].flags = STK_Null; + }else{ + pC->pData = sqliteMallocRaw( pC->nData ); + if( pC->pData ){ + memcpy(pC->pData, zStack[tos], pC->nData); + } + } + pC->nullRow = 0; + }else{ + rc = sqliteBtreeInsert(pC->pCursor, zKey, nKey, + zStack[tos], aStack[tos].n); + } pC->recnoIsValid = 0; } POPSTACK; @@ -3960,11 +3980,15 @@ case OP_PutStrKey: { ** ** The row change counter is incremented if P2==1 and is unmodified ** if P2==0. +** +** If P1 is a pseudo-table, then this instruction is a no-op. */ case OP_Delete: { int i = pOp->p1; Cursor *pC; - if( VERIFY( i>=0 && i<p->nCursor && ) (pC = &p->aCsr[i])->pCursor!=0 ){ + assert( i>=0 && i<p->nCursor ); + pC = &p->aCsr[i]; + if( pC->pCursor!=0 ){ rc = sqliteBtreeDelete(pC->pCursor); pC->nextRowidValid = 0; } @@ -3975,14 +3999,67 @@ case OP_Delete: { /* Opcode: KeyAsData P1 P2 * ** ** Turn the key-as-data mode for cursor P1 either on (if P2==1) or -** off (if P2==0). In key-as-data mode, the Field opcode pulls -** data off of the key rather than the data. This is useful for +** off (if P2==0). In key-as-data mode, the OP_Column opcode pulls +** data off of the key rather than the data. This is used for ** processing compound selects. */ case OP_KeyAsData: { int i = pOp->p1; - if( VERIFY( i>=0 && i<p->nCursor && ) p->aCsr[i].pCursor!=0 ){ - p->aCsr[i].keyAsData = pOp->p2; + assert( i>=0 && i<p->nCursor ); + p->aCsr[i].keyAsData = pOp->p2; + break; +} + +/* Opcode: RowData P1 * * +** +** Push onto the stack the complete row data for cursor P1. +** There is no interpretation of the data. It is just copied +** onto the stack exactly as it is found in the database file. +** +** If the cursor is not pointing to a valid row, a NULL is pushed +** onto the stack. +*/ +case OP_RowData: { + int i = pOp->p1; + int tos = ++p->tos; + Cursor *pC; + int n; + + assert( i>=0 && i<p->nCursor ); + pC = &p->aCsr[i]; + if( pC->nullRow ){ + aStack[tos].flags = STK_Null; + }else if( pC->pCursor!=0 ){ + BtCursor *pCrsr = pC->pCursor; + if( pC->nullRow ){ + aStack[tos].flags = STK_Null; + break; + }else if( pC->keyAsData ){ + sqliteBtreeKeySize(pCrsr, &n); + }else{ + sqliteBtreeDataSize(pCrsr, &n); + } + aStack[tos].n = n; + if( n<=NBFS ){ + aStack[tos].flags = STK_Str; + zStack[tos] = aStack[tos].z; + }else{ + char *z = sqliteMallocRaw( n ); + if( z==0 ) goto no_mem; + aStack[tos].flags = STK_Str | STK_Dyn; + zStack[tos] = z; + } + if( pC->keyAsData ){ + sqliteBtreeKey(pCrsr, 0, n, zStack[tos]); + }else{ + sqliteBtreeData(pCrsr, 0, n, zStack[tos]); + } + }else if( pC->pseudoTable ){ + aStack[tos].n = pC->nData; + zStack[tos] = pC->pData; + aStack[tos].flags = STK_Str|STK_Ephem; + }else{ + aStack[tos].flags = STK_Null; } break; } @@ -4017,12 +4094,13 @@ case OP_Column: { int idxWidth; unsigned char aHdr[10]; + assert( i<p->nCursor ); if( i<0 ){ VERIFY( if( tos+i<0 ) goto bad_instruction; ) VERIFY( if( (aStack[tos+i].flags & STK_Str)==0 ) goto bad_instruction; ) zRec = zStack[tos+i]; payloadSize = aStack[tos+i].n; - }else if( VERIFY( i>=0 && i<p->nCursor && ) (pC = &p->aCsr[i])->pCursor!=0 ){ + }else if( (pC = &p->aCsr[i])->pCursor!=0 ){ zRec = 0; pCrsr = pC->pCursor; if( pC->nullRow ){ @@ -4032,6 +4110,10 @@ case OP_Column: { }else{ sqliteBtreeDataSize(pCrsr, &payloadSize); } + }else if( pC->pseudoTable ){ + payloadSize = pC->nData; + zRec = pC->pData; + assert( payloadSize==0 || zRec!=0 ); }else{ payloadSize = 0; } @@ -4121,22 +4203,24 @@ case OP_Column: { case OP_Recno: { int i = pOp->p1; int tos = ++p->tos; - BtCursor *pCrsr; + Cursor *pC; + int v; - if( VERIFY( i>=0 && i<p->nCursor && ) (pCrsr = p->aCsr[i].pCursor)!=0 ){ - int v; - if( p->aCsr[i].recnoIsValid ){ - v = p->aCsr[i].lastRecno; - }else if( p->aCsr[i].nullRow ){ - aStack[tos].flags = STK_Null; - break; - }else{ - sqliteBtreeKey(pCrsr, 0, sizeof(u32), (char*)&v); - v = keyToInt(v); - } - aStack[tos].i = v; - aStack[tos].flags = STK_Int; + assert( i>=0 && i<p->nCursor ); + if( (pC = &p->aCsr[i])->recnoIsValid ){ + v = pC->lastRecno; + }else if( pC->nullRow ){ + aStack[tos].flags = STK_Null; + break; + }else if( pC->pseudoTable ){ + v = keyToInt(pC->iKey); + }else{ + assert( pC->pCursor!=0 ); + sqliteBtreeKey(pC->pCursor, 0, sizeof(u32), (char*)&v); + v = keyToInt(v); } + aStack[tos].i = v; + aStack[tos].flags = STK_Int; break; } @@ -4148,6 +4232,8 @@ case OP_Recno: { ** Compare this opcode to Recno. The Recno opcode extracts the first ** 4 bytes of the key and pushes those bytes onto the stack as an ** integer. This instruction pushes the entire key as a string. +** +** This opcode may not be used on a pseudo-table. */ case OP_FullKey: { int i = pOp->p1; @@ -4155,6 +4241,7 @@ case OP_FullKey: { BtCursor *pCrsr; VERIFY( if( !p->aCsr[i].keyAsData ) goto bad_instruction; ) + VERIFY( if( p->aCsr[i].pseudoTable ) goto bad_instruction; ) if( VERIFY( i>=0 && i<p->nCursor && ) (pCrsr = p->aCsr[i].pCursor)!=0 ){ int amt; char *z; @@ -4187,11 +4274,10 @@ case OP_FullKey: { */ case OP_NullRow: { int i = pOp->p1; - BtCursor *pCrsr; - if( VERIFY( i>=0 && i<p->nCursor && ) (pCrsr = p->aCsr[i].pCursor)!=0 ){ - p->aCsr[i].nullRow = 1; - } + assert( i>=0 && i<p->nCursor ); + p->aCsr[i].nullRow = 1; + p->aCsr[i].recnoIsValid = 0; break; } @@ -4205,15 +4291,20 @@ case OP_NullRow: { */ case OP_Last: { int i = pOp->p1; + Cursor *pC; BtCursor *pCrsr; - if( VERIFY( i>=0 && i<p->nCursor && ) (pCrsr = p->aCsr[i].pCursor)!=0 ){ + assert( i>=0 && i<p->nCursor ); + pC = &p->aCsr[i]; + if( (pCrsr = pC->pCursor)!=0 ){ int res; - sqliteBtreeLast(pCrsr, &res); + rc = sqliteBtreeLast(pCrsr, &res); p->aCsr[i].nullRow = res; if( res && pOp->p2>0 ){ pc = pOp->p2 - 1; } + }else{ + pC->nullRow = 0; } break; } @@ -4228,16 +4319,21 @@ case OP_Last: { */ case OP_Rewind: { int i = pOp->p1; + Cursor *pC; BtCursor *pCrsr; - if( VERIFY( i>=0 && i<p->nCursor && ) (pCrsr = p->aCsr[i].pCursor)!=0 ){ + assert( i>=0 && i<p->nCursor ); + pC = &p->aCsr[i]; + if( (pCrsr = pC->pCursor)!=0 ){ int res; - sqliteBtreeFirst(pCrsr, &res); - p->aCsr[i].atFirst = res==0; - p->aCsr[i].nullRow = res; + rc = sqliteBtreeFirst(pCrsr, &res); + pC->atFirst = res==0; + pC->nullRow = res; if( res && pOp->p2>0 ){ pc = pOp->p2 - 1; } + }else{ + pC->nullRow = 0; } break; } @@ -4264,8 +4360,9 @@ case OP_Next: { BtCursor *pCrsr; CHECK_FOR_INTERRUPT; - if( VERIFY( pOp->p1>=0 && pOp->p1<p->nCursor && ) - (pCrsr = (pC = &p->aCsr[pOp->p1])->pCursor)!=0 ){ + assert( pOp->p1>=0 && pOp->p1<p->nCursor ); + pC = &p->aCsr[pOp->p1]; + if( (pCrsr = pC->pCursor)!=0 ){ int res; if( pC->nullRow ){ res = 1; @@ -4278,8 +4375,10 @@ case OP_Next: { pc = pOp->p2 - 1; sqlite_search_count++; } - pC->recnoIsValid = 0; + }else{ + pC->nullRow = 1; } + pC->recnoIsValid = 0; break; } @@ -4373,10 +4472,14 @@ case OP_IdxRecno: { int v; int sz; sqliteBtreeKeySize(pCrsr, &sz); - sqliteBtreeKey(pCrsr, sz - sizeof(u32), sizeof(u32), (char*)&v); - v = keyToInt(v); - aStack[tos].i = v; - aStack[tos].flags = STK_Int; + if( sz<sizeof(u32) ){ + aStack[tos].flags = STK_Null; + }else{ + sqliteBtreeKey(pCrsr, sz - sizeof(u32), sizeof(u32), (char*)&v); + v = keyToInt(v); + aStack[tos].i = v; + aStack[tos].flags = STK_Int; + } } break; } @@ -4446,7 +4549,7 @@ case OP_IdxGE: { ** See also: Clear */ case OP_Destroy: { - sqliteBtreeDropTable(pOp->p2 ? db->pBeTemp : pBt, pOp->p1); + rc = sqliteBtreeDropTable(db->aDb[pOp->p2].pBt, pOp->p1); break; } @@ -4463,7 +4566,7 @@ case OP_Destroy: { ** See also: Destroy */ case OP_Clear: { - sqliteBtreeClearTable(pOp->p2 ? db->pBeTemp : pBt, pOp->p1); + rc = sqliteBtreeClearTable(db->aDb[pOp->p2].pBt, pOp->p1); break; } @@ -4497,10 +4600,12 @@ case OP_CreateTable: { int i = ++p->tos; int pgno; assert( pOp->p3!=0 && pOp->p3type==P3_POINTER ); + assert( pOp->p2>=0 && pOp->p2<db->nDb ); + assert( db->aDb[pOp->p2].pBt!=0 ); if( pOp->opcode==OP_CreateTable ){ - rc = sqliteBtreeCreateTable(pOp->p2 ? db->pBeTemp : pBt, &pgno); + rc = sqliteBtreeCreateTable(db->aDb[pOp->p2].pBt, &pgno); }else{ - rc = sqliteBtreeCreateIndex(pOp->p2 ? db->pBeTemp : pBt, &pgno); + rc = sqliteBtreeCreateIndex(db->aDb[pOp->p2].pBt, &pgno); } if( rc==SQLITE_OK ){ aStack[i].i = pgno; @@ -4544,7 +4649,7 @@ case OP_IntegrityCk: { toInt((char*)sqliteHashKey(i), &aRoot[j]); } aRoot[j] = 0; - z = sqliteBtreeIntegrityCheck(pOp->p2 ? db->pBeTemp : pBt, aRoot, nRoot); + z = sqliteBtreeIntegrityCheck(db->aDb[pOp->p2].pBt, aRoot, nRoot); if( z==0 || z[0]==0 ){ if( z ) sqliteFree(z); zStack[tos] = "ok"; @@ -5669,8 +5774,7 @@ bad_instruction: */ int sqliteVdbeFinalize(Vdbe *p, char **pzErrMsg){ sqlite *db = p->db; - Btree *pBt = p->pBt; - int rc; + int i, rc; if( p->magic!=VDBE_MAGIC_RUN && p->magic!=VDBE_MAGIC_HALT ){ sqliteSetString(pzErrMsg, sqlite_error_string(SQLITE_MISUSE), 0); @@ -5689,23 +5793,24 @@ int sqliteVdbeFinalize(Vdbe *p, char **pzErrMsg){ switch( p->errorAction ){ case OE_Abort: { if( !p->undoTransOnError ){ - sqliteBtreeRollbackCkpt(pBt); - if( db->pBeTemp ) sqliteBtreeRollbackCkpt(db->pBeTemp); + for(i=0; i<db->nDb; i++){ + if( db->aDb[i].pBt ){ + sqliteBtreeRollbackCkpt(db->aDb[i].pBt); + } + } break; } /* Fall through to ROLLBACK */ } case OE_Rollback: { - sqliteBtreeRollback(pBt); - if( db->pBeTemp ) sqliteBtreeRollback(db->pBeTemp); + sqliteRollbackAll(db); db->flags &= ~SQLITE_InTrans; db->onError = OE_Default; break; } default: { if( p->undoTransOnError ){ - sqliteBtreeCommit(pBt); - if( db->pBeTemp ) sqliteBtreeCommit(db->pBeTemp); + sqliteRollbackAll(db); db->flags &= ~SQLITE_InTrans; db->onError = OE_Default; } @@ -5714,8 +5819,11 @@ int sqliteVdbeFinalize(Vdbe *p, char **pzErrMsg){ } sqliteRollbackInternalChanges(db); } - sqliteBtreeCommitCkpt(pBt); - if( db->pBeTemp ) sqliteBtreeCommitCkpt(db->pBeTemp); + for(i=0; i<db->nDb; i++){ + if( db->aDb[i].pBt ){ + sqliteBtreeCommitCkpt(db->aDb[i].pBt); + } + } assert( p->tos<p->pc || sqlite_malloc_failed==1 ); #ifdef VDBE_PROFILE { diff --git a/ext/sqlite/libsqlite/src/vdbe.h b/ext/sqlite/libsqlite/src/vdbe.h index 0a885e42d4..fa8ad54d4a 100644 --- a/ext/sqlite/libsqlite/src/vdbe.h +++ b/ext/sqlite/libsqlite/src/vdbe.h @@ -81,6 +81,7 @@ void sqliteVdbeChangeP2(Vdbe*, int addr, int P2); void sqliteVdbeChangeP3(Vdbe*, int addr, const char *zP1, int N); void sqliteVdbeDequoteP3(Vdbe*, int addr); int sqliteVdbeFindOp(Vdbe*, int, int); +VdbeOp *sqliteVdbeGetOp(Vdbe*, int); int sqliteVdbeMakeLabel(Vdbe*); void sqliteVdbeDelete(Vdbe*); void sqliteVdbeMakeReady(Vdbe*,sqlite_callback,void*,int); diff --git a/ext/sqlite/libsqlite/src/where.c b/ext/sqlite/libsqlite/src/where.c index 682b33c79f..7f95dc78c3 100644 --- a/ext/sqlite/libsqlite/src/where.c +++ b/ext/sqlite/libsqlite/src/where.c @@ -10,8 +10,7 @@ ** ************************************************************************* ** This module contains C code that generates VDBE code used to process -** the WHERE clause of SQL statements. Also found here are subroutines -** to generate VDBE code to evaluate expressions. +** the WHERE clause of SQL statements. ** ** $Id$ */ @@ -38,6 +37,21 @@ struct ExprInfo { }; /* +** An instance of the following structure keeps track of a mapping +** between VDBE cursor numbers and bitmasks. The VDBE cursor numbers +** are small integers contained in SrcList_item.iCursor and Expr.iTable +** fields. For any given WHERE clause, we want to track which cursors +** are being used, so we assign a single bit in a 32-bit word to track +** that cursor. Then a 32-bit integer is able to show the set of all +** cursors being used. +*/ +typedef struct ExprMaskSet ExprMaskSet; +struct ExprMaskSet { + int n; /* Number of assigned cursor values */ + int ix[32]; /* Cursor assigned to each bit */ +}; + +/* ** Determine the number of elements in an array. */ #define ARRAYSIZE(X) (sizeof(X)/sizeof(X[0])) @@ -69,36 +83,60 @@ static int exprSplit(int nSlot, ExprInfo *aSlot, Expr *pExpr){ } /* +** Initialize an expression mask set +*/ +#define initMaskSet(P) memset(P, 0, sizeof(*P)) + +/* +** Return the bitmask for the given cursor. Assign a new bitmask +** if this is the first time the cursor has been seen. +*/ +static int getMask(ExprMaskSet *pMaskSet, int iCursor){ + int i; + for(i=0; i<pMaskSet->n; i++){ + if( pMaskSet->ix[i]==iCursor ) return 1<<i; + } + if( i==pMaskSet->n && i<ARRAYSIZE(pMaskSet->ix) ){ + pMaskSet->n++; + pMaskSet->ix[i] = iCursor; + return 1<<i; + } + return 0; +} + +/* +** Destroy an expression mask set +*/ +#define freeMaskSet(P) /* NO-OP */ + +/* ** This routine walks (recursively) an expression tree and generates ** a bitmask indicating which tables are used in that expression -** tree. Bit 0 of the mask is set if table base+0 is used. Bit 1 -** is set if table base+1 is used. And so forth. +** tree. ** ** In order for this routine to work, the calling function must have ** previously invoked sqliteExprResolveIds() on the expression. See ** the header comment on that routine for additional information. -** -** "base" is the cursor number (the value of the iTable field) that -** corresponds to the first entry in the list of tables that appear -** in the FROM clause of a SELECT. For UPDATE and DELETE statements -** there is just a single table with "base" as the cursor number. +** The sqliteExprResolveIds() routines looks for column names and +** sets their opcodes to TK_COLUMN and their Expr.iTable fields to +** the VDBE cursor number of the table. */ -static int exprTableUsage(int base, Expr *p){ +static int exprTableUsage(ExprMaskSet *pMaskSet, Expr *p){ unsigned int mask = 0; if( p==0 ) return 0; if( p->op==TK_COLUMN ){ - return 1<< (p->iTable - base); + return getMask(pMaskSet, p->iTable); } if( p->pRight ){ - mask = exprTableUsage(base, p->pRight); + mask = exprTableUsage(pMaskSet, p->pRight); } if( p->pLeft ){ - mask |= exprTableUsage(base, p->pLeft); + mask |= exprTableUsage(pMaskSet, p->pLeft); } if( p->pList ){ int i; for(i=0; i<p->pList->nExpr; i++){ - mask |= exprTableUsage(base, p->pList->a[i].pExpr); + mask |= exprTableUsage(pMaskSet, p->pList->a[i].pExpr); } } return mask; @@ -128,25 +166,22 @@ static int allowedOp(int op){ ** "p" field filled in. The job of this routine is to analyze the ** subexpression and populate all the other fields of the ExprInfo ** structure. -** -** "base" is the cursor number (the value of the iTable field) that -** corresponds to the first entry in the table list. */ -static void exprAnalyze(int base, ExprInfo *pInfo){ +static void exprAnalyze(ExprMaskSet *pMaskSet, ExprInfo *pInfo){ Expr *pExpr = pInfo->p; - pInfo->prereqLeft = exprTableUsage(base, pExpr->pLeft); - pInfo->prereqRight = exprTableUsage(base, pExpr->pRight); - pInfo->prereqAll = exprTableUsage(base, pExpr); + pInfo->prereqLeft = exprTableUsage(pMaskSet, pExpr->pLeft); + pInfo->prereqRight = exprTableUsage(pMaskSet, pExpr->pRight); + pInfo->prereqAll = exprTableUsage(pMaskSet, pExpr); pInfo->indexable = 0; pInfo->idxLeft = -1; pInfo->idxRight = -1; if( allowedOp(pExpr->op) && (pInfo->prereqRight & pInfo->prereqLeft)==0 ){ if( pExpr->pRight && pExpr->pRight->op==TK_COLUMN ){ - pInfo->idxRight = pExpr->pRight->iTable - base; + pInfo->idxRight = pExpr->pRight->iTable; pInfo->indexable = 1; } if( pExpr->pLeft->op==TK_COLUMN ){ - pInfo->idxLeft = pExpr->pLeft->iTable - base; + pInfo->idxLeft = pExpr->pLeft->iTable; pInfo->indexable = 1; } } @@ -263,9 +298,9 @@ static Index *findSortingIndex( ** end / ** ** There are Btree cursors associated with each table. t1 uses cursor -** "base". t2 uses cursor "base+1". And so forth. This routine generates -** the code to open those cursors. sqliteWhereEnd() generates the code -** to close them. +** number pTabList->a[0].iCursor. t2 uses the cursor pTabList->a[1].iCursor. +** And so forth. This routine generates code to open those VDBE cursors +** and sqliteWhereEnd() generates the code to close them. ** ** If the WHERE clause is empty, the foreach loops must each scan their ** entire tables. Thus a three-way join is an O(N^3) operation. But if @@ -315,7 +350,6 @@ static Index *findSortingIndex( */ WhereInfo *sqliteWhereBegin( Parse *pParse, /* The parser context */ - int base, /* VDBE cursor index for left-most table in pTabList */ SrcList *pTabList, /* A list of all tables to be scanned */ Expr *pWhere, /* The WHERE clause */ int pushKey, /* If TRUE, leave the table key on the stack */ @@ -328,6 +362,7 @@ WhereInfo *sqliteWhereBegin( int nExpr; /* Number of subexpressions in the WHERE clause */ int loopMask; /* One bit set for each outer loop */ int haveKey; /* True if KEY is on the stack */ + ExprMaskSet maskSet; /* The expression mask set */ int iDirectEq[32]; /* Term of the form ROWID==X for the N-th table */ int iDirectLt[32]; /* Term of the form ROWID<X or ROWID<=X */ int iDirectGt[32]; /* Term of the form ROWID>X or ROWID>=X */ @@ -343,6 +378,7 @@ WhereInfo *sqliteWhereBegin( ** array fills up, the last entry might point to an expression which ** contains additional unfactored AND operators. */ + initMaskSet(&maskSet); memset(aExpr, 0, sizeof(aExpr)); nExpr = exprSplit(ARRAYSIZE(aExpr), aExpr, pWhere); if( nExpr==ARRAYSIZE(aExpr) ){ @@ -364,14 +400,13 @@ WhereInfo *sqliteWhereBegin( } pWInfo->pParse = pParse; pWInfo->pTabList = pTabList; - pWInfo->base = base; pWInfo->peakNTab = pWInfo->savedNTab = pParse->nTab; pWInfo->iBreak = sqliteVdbeMakeLabel(v); /* Special case: a WHERE clause that is constant. Evaluate the ** expression and either jump over all of the code or fall thru. */ - if( pWhere && sqliteExprIsConstant(pWhere) ){ + if( pWhere && (pTabList->nSrc==0 || sqliteExprIsConstant(pWhere)) ){ sqliteExprIfFalse(pParse, pWhere, pWInfo->iBreak, 1); pWhere = 0; } @@ -379,7 +414,7 @@ WhereInfo *sqliteWhereBegin( /* Analyze all of the subexpressions. */ for(i=0; i<nExpr; i++){ - exprAnalyze(base, &aExpr[i]); + exprAnalyze(&maskSet, &aExpr[i]); /* If we are executing a trigger body, remove all references to ** new.* and old.* tables from the prerequisite masks. @@ -387,13 +422,13 @@ WhereInfo *sqliteWhereBegin( if( pParse->trigStack ){ int x; if( (x = pParse->trigStack->newIdx) >= 0 ){ - int mask = ~(1 << (x - base)); + int mask = ~getMask(&maskSet, x); aExpr[i].prereqRight &= mask; aExpr[i].prereqLeft &= mask; aExpr[i].prereqAll &= mask; } if( (x = pParse->trigStack->oldIdx) >= 0 ){ - int mask = ~(1 << (x - base)); + int mask = ~getMask(&maskSet, x); aExpr[i].prereqRight &= mask; aExpr[i].prereqLeft &= mask; aExpr[i].prereqAll &= mask; @@ -420,8 +455,9 @@ WhereInfo *sqliteWhereBegin( loopMask = 0; for(i=0; i<pTabList->nSrc && i<ARRAYSIZE(iDirectEq); i++){ int j; - int idx = i; - Table *pTab = pTabList->a[idx].pTab; + int iCur = pTabList->a[i].iCursor; /* The cursor for this table */ + int mask = getMask(&maskSet, iCur); /* Cursor mask for this table */ + Table *pTab = pTabList->a[i].pTab; Index *pIdx; Index *pBestIdx = 0; int bestScore = 0; @@ -439,7 +475,7 @@ WhereInfo *sqliteWhereBegin( iDirectLt[i] = -1; iDirectGt[i] = -1; for(j=0; j<nExpr; j++){ - if( aExpr[j].idxLeft==idx && aExpr[j].p->pLeft->iColumn<0 + if( aExpr[j].idxLeft==iCur && aExpr[j].p->pLeft->iColumn<0 && (aExpr[j].prereqRight & loopMask)==aExpr[j].prereqRight ){ switch( aExpr[j].p->op ){ case TK_IN: @@ -450,7 +486,7 @@ WhereInfo *sqliteWhereBegin( case TK_GT: iDirectGt[i] = j; break; } } - if( aExpr[j].idxRight==idx && aExpr[j].p->pRight->iColumn<0 + if( aExpr[j].idxRight==iCur && aExpr[j].p->pRight->iColumn<0 && (aExpr[j].prereqLeft & loopMask)==aExpr[j].prereqLeft ){ switch( aExpr[j].p->op ){ case TK_EQ: iDirectEq[i] = j; break; @@ -462,7 +498,7 @@ WhereInfo *sqliteWhereBegin( } } if( iDirectEq[i]>=0 ){ - loopMask |= 1<<idx; + loopMask |= mask; pWInfo->a[i].pIdx = 0; continue; } @@ -501,7 +537,7 @@ WhereInfo *sqliteWhereBegin( if( pIdx->nColumn>32 ) continue; /* Ignore indices too many columns */ for(j=0; j<nExpr; j++){ - if( aExpr[j].idxLeft==idx + if( aExpr[j].idxLeft==iCur && (aExpr[j].prereqRight & loopMask)==aExpr[j].prereqRight ){ int iColumn = aExpr[j].p->pLeft->iColumn; int k; @@ -536,7 +572,7 @@ WhereInfo *sqliteWhereBegin( } } } - if( aExpr[j].idxRight==idx + if( aExpr[j].idxRight==iCur && (aExpr[j].prereqLeft & loopMask)==aExpr[j].prereqLeft ){ int iColumn = aExpr[j].p->pRight->iColumn; int k; @@ -589,7 +625,7 @@ WhereInfo *sqliteWhereBegin( pWInfo->a[i].pIdx = pBestIdx; pWInfo->a[i].score = bestScore; pWInfo->a[i].bRev = 0; - loopMask |= 1<<idx; + loopMask |= mask; if( pBestIdx ){ pWInfo->a[i].iCur = pParse->nTab++; pWInfo->peakNTab = pParse->nTab; @@ -620,7 +656,8 @@ WhereInfo *sqliteWhereBegin( pSortIdx = 0; }else{ int nEqCol = (pWInfo->a[0].score+4)/8; - pSortIdx = findSortingIndex(pTab, base, *ppOrderBy, pIdx, nEqCol, &bRev); + pSortIdx = findSortingIndex(pTab, pTabList->a[0].iCursor, + *ppOrderBy, pIdx, nEqCol, &bRev); } if( pSortIdx && (pIdx==0 || pIdx==pSortIdx) ){ if( pIdx==0 ){ @@ -636,21 +673,18 @@ WhereInfo *sqliteWhereBegin( /* Open all tables in the pTabList and all indices used by those tables. */ for(i=0; i<pTabList->nSrc; i++){ - int openOp; Table *pTab; pTab = pTabList->a[i].pTab; if( pTab->isTransient || pTab->pSelect ) continue; - openOp = pTab->isTemp ? OP_OpenAux : OP_Open; - sqliteVdbeAddOp(v, openOp, base+i, pTab->tnum); + sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenRead, pTabList->a[i].iCursor, pTab->tnum); sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC); - if( i==0 && !pParse->schemaVerified && - (pParse->db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_VerifyCookie, pParse->db->schema_cookie, 0); - pParse->schemaVerified = 1; - } + sqliteCodeVerifySchema(pParse, pTab->iDb); if( pWInfo->a[i].pIdx!=0 ){ - sqliteVdbeAddOp(v, openOp, pWInfo->a[i].iCur, pWInfo->a[i].pIdx->tnum); + sqliteVdbeAddOp(v, OP_Integer, pWInfo->a[i].pIdx->iDb, 0); + sqliteVdbeAddOp(v, OP_OpenRead, + pWInfo->a[i].iCur, pWInfo->a[i].pIdx->tnum); sqliteVdbeChangeP3(v, -1, pWInfo->a[i].pIdx->zName, P3_STATIC); } } @@ -660,7 +694,7 @@ WhereInfo *sqliteWhereBegin( loopMask = 0; for(i=0; i<pTabList->nSrc; i++){ int j, k; - int idx = i; + int iCur = pTabList->a[i].iCursor; Index *pIdx; WhereLevel *pLevel = &pWInfo->a[i]; @@ -686,9 +720,9 @@ WhereInfo *sqliteWhereBegin( k = iDirectEq[i]; assert( k<nExpr ); assert( aExpr[k].p!=0 ); - assert( aExpr[k].idxLeft==idx || aExpr[k].idxRight==idx ); + assert( aExpr[k].idxLeft==iCur || aExpr[k].idxRight==iCur ); brk = pLevel->brk = sqliteVdbeMakeLabel(v); - if( aExpr[k].idxLeft==idx ){ + if( aExpr[k].idxLeft==iCur ){ Expr *pX = aExpr[k].p; if( pX->op!=TK_IN ){ sqliteExprCode(pParse, aExpr[k].p->pRight); @@ -712,7 +746,7 @@ WhereInfo *sqliteWhereBegin( cont = pLevel->cont = sqliteVdbeMakeLabel(v); sqliteVdbeAddOp(v, OP_MustBeInt, 1, brk); haveKey = 0; - sqliteVdbeAddOp(v, OP_NotExists, base+idx, brk); + sqliteVdbeAddOp(v, OP_NotExists, iCur, brk); pLevel->op = OP_Noop; }else if( pIdx!=0 && pLevel->score>0 && pLevel->score%4==0 ){ /* Case 2: There is an index and all terms of the WHERE clause that @@ -726,7 +760,7 @@ WhereInfo *sqliteWhereBegin( for(k=0; k<nExpr; k++){ Expr *pX = aExpr[k].p; if( pX==0 ) continue; - if( aExpr[k].idxLeft==idx + if( aExpr[k].idxLeft==iCur && (aExpr[k].prereqRight & loopMask)==aExpr[k].prereqRight && pX->pLeft->iColumn==pIdx->aiColumn[j] ){ @@ -753,7 +787,7 @@ WhereInfo *sqliteWhereBegin( break; } } - if( aExpr[k].idxRight==idx + if( aExpr[k].idxRight==iCur && aExpr[k].p->op==TK_EQ && (aExpr[k].prereqLeft & loopMask)==aExpr[k].prereqLeft && aExpr[k].p->pRight->iColumn==pIdx->aiColumn[j] @@ -796,7 +830,7 @@ WhereInfo *sqliteWhereBegin( if( i==pTabList->nSrc-1 && pushKey ){ haveKey = 1; }else{ - sqliteVdbeAddOp(v, OP_MoveTo, base+idx, 0); + sqliteVdbeAddOp(v, OP_MoveTo, iCur, 0); haveKey = 0; } pLevel->p1 = pLevel->iCur; @@ -813,8 +847,8 @@ WhereInfo *sqliteWhereBegin( k = iDirectGt[i]; assert( k<nExpr ); assert( aExpr[k].p!=0 ); - assert( aExpr[k].idxLeft==idx || aExpr[k].idxRight==idx ); - if( aExpr[k].idxLeft==idx ){ + assert( aExpr[k].idxLeft==iCur || aExpr[k].idxRight==iCur ); + if( aExpr[k].idxLeft==iCur ){ sqliteExprCode(pParse, aExpr[k].p->pRight); }else{ sqliteExprCode(pParse, aExpr[k].p->pLeft); @@ -823,17 +857,17 @@ WhereInfo *sqliteWhereBegin( if( aExpr[k].p->op==TK_LT || aExpr[k].p->op==TK_GT ){ sqliteVdbeAddOp(v, OP_AddImm, 1, 0); } - sqliteVdbeAddOp(v, OP_MoveTo, base+idx, brk); + sqliteVdbeAddOp(v, OP_MoveTo, iCur, brk); aExpr[k].p = 0; }else{ - sqliteVdbeAddOp(v, OP_Rewind, base+idx, brk); + sqliteVdbeAddOp(v, OP_Rewind, iCur, brk); } if( iDirectLt[i]>=0 ){ k = iDirectLt[i]; assert( k<nExpr ); assert( aExpr[k].p!=0 ); - assert( aExpr[k].idxLeft==idx || aExpr[k].idxRight==idx ); - if( aExpr[k].idxLeft==idx ){ + assert( aExpr[k].idxLeft==iCur || aExpr[k].idxRight==iCur ); + if( aExpr[k].idxLeft==iCur ){ sqliteExprCode(pParse, aExpr[k].p->pRight); }else{ sqliteExprCode(pParse, aExpr[k].p->pLeft); @@ -850,10 +884,10 @@ WhereInfo *sqliteWhereBegin( } start = sqliteVdbeCurrentAddr(v); pLevel->op = OP_Next; - pLevel->p1 = base+idx; + pLevel->p1 = iCur; pLevel->p2 = start; if( testOp!=OP_Noop ){ - sqliteVdbeAddOp(v, OP_Recno, base+idx, 0); + sqliteVdbeAddOp(v, OP_Recno, iCur, 0); sqliteVdbeAddOp(v, OP_MemLoad, pLevel->iMem, 0); sqliteVdbeAddOp(v, testOp, 0, brk); } @@ -866,10 +900,10 @@ WhereInfo *sqliteWhereBegin( brk = pLevel->brk = sqliteVdbeMakeLabel(v); cont = pLevel->cont = sqliteVdbeMakeLabel(v); - sqliteVdbeAddOp(v, OP_Rewind, base+idx, brk); + sqliteVdbeAddOp(v, OP_Rewind, iCur, brk); start = sqliteVdbeCurrentAddr(v); pLevel->op = OP_Next; - pLevel->p1 = base+idx; + pLevel->p1 = iCur; pLevel->p2 = start; haveKey = 0; }else{ @@ -895,7 +929,7 @@ WhereInfo *sqliteWhereBegin( for(j=0; j<nEqColumn; j++){ for(k=0; k<nExpr; k++){ if( aExpr[k].p==0 ) continue; - if( aExpr[k].idxLeft==idx + if( aExpr[k].idxLeft==iCur && aExpr[k].p->op==TK_EQ && (aExpr[k].prereqRight & loopMask)==aExpr[k].prereqRight && aExpr[k].p->pLeft->iColumn==pIdx->aiColumn[j] @@ -904,7 +938,7 @@ WhereInfo *sqliteWhereBegin( aExpr[k].p = 0; break; } - if( aExpr[k].idxRight==idx + if( aExpr[k].idxRight==iCur && aExpr[k].p->op==TK_EQ && (aExpr[k].prereqLeft & loopMask)==aExpr[k].prereqLeft && aExpr[k].p->pRight->iColumn==pIdx->aiColumn[j] @@ -940,7 +974,7 @@ WhereInfo *sqliteWhereBegin( for(k=0; k<nExpr; k++){ Expr *pExpr = aExpr[k].p; if( pExpr==0 ) continue; - if( aExpr[k].idxLeft==idx + if( aExpr[k].idxLeft==iCur && (pExpr->op==TK_LT || pExpr->op==TK_LE) && (aExpr[k].prereqRight & loopMask)==aExpr[k].prereqRight && pExpr->pLeft->iColumn==pIdx->aiColumn[j] @@ -950,7 +984,7 @@ WhereInfo *sqliteWhereBegin( aExpr[k].p = 0; break; } - if( aExpr[k].idxRight==idx + if( aExpr[k].idxRight==iCur && (pExpr->op==TK_GT || pExpr->op==TK_GE) && (aExpr[k].prereqLeft & loopMask)==aExpr[k].prereqLeft && pExpr->pRight->iColumn==pIdx->aiColumn[j] @@ -995,7 +1029,7 @@ WhereInfo *sqliteWhereBegin( for(k=0; k<nExpr; k++){ Expr *pExpr = aExpr[k].p; if( pExpr==0 ) continue; - if( aExpr[k].idxLeft==idx + if( aExpr[k].idxLeft==iCur && (pExpr->op==TK_GT || pExpr->op==TK_GE) && (aExpr[k].prereqRight & loopMask)==aExpr[k].prereqRight && pExpr->pLeft->iColumn==pIdx->aiColumn[j] @@ -1005,7 +1039,7 @@ WhereInfo *sqliteWhereBegin( aExpr[k].p = 0; break; } - if( aExpr[k].idxRight==idx + if( aExpr[k].idxRight==iCur && (pExpr->op==TK_LT || pExpr->op==TK_LE) && (aExpr[k].prereqLeft & loopMask)==aExpr[k].prereqLeft && pExpr->pRight->iColumn==pIdx->aiColumn[j] @@ -1051,7 +1085,7 @@ WhereInfo *sqliteWhereBegin( if( i==pTabList->nSrc-1 && pushKey ){ haveKey = 1; }else{ - sqliteVdbeAddOp(v, OP_MoveTo, base+idx, 0); + sqliteVdbeAddOp(v, OP_MoveTo, iCur, 0); haveKey = 0; } @@ -1061,7 +1095,7 @@ WhereInfo *sqliteWhereBegin( pLevel->p1 = pLevel->iCur; pLevel->p2 = start; } - loopMask |= 1<<idx; + loopMask |= getMask(&maskSet, iCur); /* Insert code to test every subexpression that can be completely ** computed using the current set of tables. @@ -1074,7 +1108,7 @@ WhereInfo *sqliteWhereBegin( } if( haveKey ){ haveKey = 0; - sqliteVdbeAddOp(v, OP_MoveTo, base+idx, 0); + sqliteVdbeAddOp(v, OP_MoveTo, iCur, 0); } sqliteExprIfFalse(pParse, aExpr[j].p, cont, 1); aExpr[j].p = 0; @@ -1097,7 +1131,7 @@ WhereInfo *sqliteWhereBegin( ** no outer joins with DELETE and UPDATE. */ haveKey = 0; - sqliteVdbeAddOp(v, OP_MoveTo, base+idx, 0); + sqliteVdbeAddOp(v, OP_MoveTo, iCur, 0); } sqliteExprIfFalse(pParse, aExpr[j].p, cont, 1); aExpr[j].p = 0; @@ -1106,8 +1140,9 @@ WhereInfo *sqliteWhereBegin( } pWInfo->iContinue = cont; if( pushKey && !haveKey ){ - sqliteVdbeAddOp(v, OP_Recno, base, 0); + sqliteVdbeAddOp(v, OP_Recno, pTabList->a[0].iCursor, 0); } + freeMaskSet(&maskSet); return pWInfo; } @@ -1118,7 +1153,6 @@ WhereInfo *sqliteWhereBegin( void sqliteWhereEnd(WhereInfo *pWInfo){ Vdbe *v = pWInfo->pParse->pVdbe; int i; - int base = pWInfo->base; WhereLevel *pLevel; SrcList *pTabList = pWInfo->pTabList; @@ -1136,7 +1170,7 @@ void sqliteWhereEnd(WhereInfo *pWInfo){ int addr; addr = sqliteVdbeAddOp(v, OP_MemLoad, pLevel->iLeftJoin, 0); sqliteVdbeAddOp(v, OP_NotNull, 1, addr+4 + (pLevel->iCur>=0)); - sqliteVdbeAddOp(v, OP_NullRow, base+i, 0); + sqliteVdbeAddOp(v, OP_NullRow, pTabList->a[i].iCursor, 0); if( pLevel->iCur>=0 ){ sqliteVdbeAddOp(v, OP_NullRow, pLevel->iCur, 0); } @@ -1145,9 +1179,11 @@ void sqliteWhereEnd(WhereInfo *pWInfo){ } sqliteVdbeResolveLabel(v, pWInfo->iBreak); for(i=0; i<pTabList->nSrc; i++){ - if( pTabList->a[i].pTab->isTransient ) continue; + Table *pTab = pTabList->a[i].pTab; + assert( pTab!=0 ); + if( pTab->isTransient || pTab->pSelect ) continue; pLevel = &pWInfo->a[i]; - sqliteVdbeAddOp(v, OP_Close, base+i, 0); + sqliteVdbeAddOp(v, OP_Close, pTabList->a[i].iCursor, 0); if( pLevel->pIdx!=0 ){ sqliteVdbeAddOp(v, OP_Close, pLevel->iCur, 0); } |