diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/build.c | 223 | ||||
-rw-r--r-- | src/delete.c | 41 | ||||
-rw-r--r-- | src/expr.c | 118 | ||||
-rw-r--r-- | src/insert.c | 49 | ||||
-rw-r--r-- | src/select.c | 163 | ||||
-rw-r--r-- | src/update.c | 51 | ||||
-rw-r--r-- | src/vdbe.c | 98 | ||||
-rw-r--r-- | src/vdbe.h | 14 | ||||
-rw-r--r-- | src/where.c | 43 |
9 files changed, 429 insertions, 371 deletions
diff --git a/src/build.c b/src/build.c index 59b993b47..8d428865c 100644 --- a/src/build.c +++ b/src/build.c @@ -25,7 +25,7 @@ ** ROLLBACK ** PRAGMA ** -** $Id: build.c,v 1.47 2001/10/12 17:30:05 drh Exp $ +** $Id: build.c,v 1.48 2001/10/13 01:06:48 drh Exp $ */ #include "sqliteInt.h" #include <ctype.h> @@ -421,12 +421,13 @@ void sqliteStartTable(Parse *pParse, Token *pStart, Token *pName, int isTemp){ pParse->pNewTable = pTable; if( !pParse->initFlag && (v = sqliteGetVdbe(pParse))!=0 ){ if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0); - sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Transaction, 0, 0); + sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0); pParse->schemaVerified = 1; } if( !isTemp ){ - sqliteVdbeAddOp(v, OP_OpenWrite, 0, 2, MASTER_NAME, 0); + sqliteVdbeAddOp(v, OP_OpenWrite, 0, 2); + sqliteVdbeChangeP3(v, -1, MASTER_NAME, P3_STATIC); } } } @@ -605,25 +606,28 @@ void sqliteEndTable(Parse *pParse, Token *pEnd){ if( v==0 ) return; n = (int)pEnd->z - (int)pParse->sFirstToken.z + 1; if( !p->isTemp ){ - sqliteVdbeAddOp(v, OP_NewRecno, 0, 0, 0, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0, "table", 0); - sqliteVdbeAddOp(v, OP_String, 0, 0, p->zName, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0, p->zName, 0); + sqliteVdbeAddOp(v, OP_NewRecno, 0, 0); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, "table", P3_STATIC); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, p->zName, P3_STATIC); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, p->zName, P3_STATIC); } - addr = sqliteVdbeAddOp(v, OP_CreateTable, 0, 0, 0, 0); - sqliteVdbeChangeP3(v, addr, (char *)&p->tnum, -1); + addr = sqliteVdbeAddOp(v, OP_CreateTable, 0, 0); + sqliteVdbeChangeP3(v, addr, (char *)&p->tnum, P3_POINTER); p->tnum = 0; if( !p->isTemp ){ - addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0); + addr = sqliteVdbeAddOp(v, OP_String, 0, 0); sqliteVdbeChangeP3(v, addr, pParse->sFirstToken.z, n); - sqliteVdbeAddOp(v, OP_MakeRecord, 5, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Put, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_MakeRecord, 5, 0); + sqliteVdbeAddOp(v, OP_Put, 0, 0); changeCookie(db); - sqliteVdbeAddOp(v, OP_SetCookie, db->next_cookie, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Close, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_SetCookie, db->next_cookie, 0); + sqliteVdbeAddOp(v, OP_Close, 0, 0); } if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Commit, 0, 0); } } } @@ -687,22 +691,22 @@ void sqliteDropTable(Parse *pParse, Token *pName){ }; Index *pIdx; if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0); - sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Transaction, 0, 0); + sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0); pParse->schemaVerified = 1; } if( !pTable->isTemp ){ base = sqliteVdbeAddOpList(v, ArraySize(dropTable), dropTable); - sqliteVdbeChangeP3(v, base+2, pTable->zName, 0); + sqliteVdbeChangeP3(v, base+2, pTable->zName, P3_STATIC); changeCookie(db); sqliteVdbeChangeP1(v, base+9, db->next_cookie); } - sqliteVdbeAddOp(v, OP_Destroy, pTable->tnum, pTable->isTemp, 0, 0); + sqliteVdbeAddOp(v, OP_Destroy, pTable->tnum, pTable->isTemp); for(pIdx=pTable->pIndex; pIdx; pIdx=pIdx->pNext){ - sqliteVdbeAddOp(v, OP_Destroy, pIdx->tnum, pTable->isTemp, 0, 0); + sqliteVdbeAddOp(v, OP_Destroy, pIdx->tnum, pTable->isTemp); } if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Commit, 0, 0); } } @@ -916,66 +920,72 @@ void sqliteCreateIndex( if( v==0 ) goto exit_create_index; if( pTable!=0 ){ if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0); - sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Transaction, 0, 0); + sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0); pParse->schemaVerified = 1; } if( !isTemp ){ - sqliteVdbeAddOp(v, OP_OpenWrite, 0, 2, MASTER_NAME, 0); + sqliteVdbeAddOp(v, OP_OpenWrite, 0, 2); + sqliteVdbeChangeP3(v, -1, MASTER_NAME, P3_STATIC); } } if( !isTemp ){ - sqliteVdbeAddOp(v, OP_NewRecno, 0, 0, 0, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0, "index", 0); - sqliteVdbeAddOp(v, OP_String, 0, 0, pIndex->zName, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0, pTab->zName, 0); + sqliteVdbeAddOp(v, OP_NewRecno, 0, 0); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, "index", P3_STATIC); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, pIndex->zName, P3_STATIC); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC); } - addr = sqliteVdbeAddOp(v, OP_CreateIndex, 0, isTemp, 0, 0); - sqliteVdbeChangeP3(v, addr, (char*)&pIndex->tnum, -1); + addr = sqliteVdbeAddOp(v, OP_CreateIndex, 0, isTemp); + sqliteVdbeChangeP3(v, addr, (char*)&pIndex->tnum, P3_POINTER); pIndex->tnum = 0; if( pTable ){ if( isTemp ){ - sqliteVdbeAddOp(v, OP_OpenWrAux, 1, 0, 0, 0); + sqliteVdbeAddOp(v, OP_OpenWrAux, 1, 0); }else{ - sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0); - sqliteVdbeAddOp(v, OP_OpenWrite, 1, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Dup, 0, 0); + sqliteVdbeAddOp(v, OP_OpenWrite, 1, 0); } } if( !isTemp ){ - addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0); + addr = sqliteVdbeAddOp(v, OP_String, 0, 0); if( pStart && pEnd ){ n = (int)pEnd->z - (int)pStart->z + 1; sqliteVdbeChangeP3(v, addr, pStart->z, n); } - sqliteVdbeAddOp(v, OP_MakeRecord, 5, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Put, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_MakeRecord, 5, 0); + sqliteVdbeAddOp(v, OP_Put, 0, 0); } if( pTable ){ - sqliteVdbeAddOp(v, isTemp ? OP_OpenAux : OP_Open, - 2, pTab->tnum, pTab->zName, 0); + sqliteVdbeAddOp(v, isTemp ? OP_OpenAux : OP_Open, 2, pTab->tnum); + sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC); lbl1 = sqliteVdbeMakeLabel(v); lbl2 = sqliteVdbeMakeLabel(v); - sqliteVdbeAddOp(v, OP_Rewind, 2, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Next, 2, lbl2, 0, lbl1); - sqliteVdbeAddOp(v, OP_Recno, 2, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Rewind, 2, 0); + sqliteVdbeResolveLabel(v, lbl1); + sqliteVdbeAddOp(v, OP_Next, 2, lbl2); + sqliteVdbeAddOp(v, OP_Recno, 2, 0); for(i=0; i<pIndex->nColumn; i++){ - sqliteVdbeAddOp(v, OP_Column, 2, pIndex->aiColumn[i], 0, 0); + sqliteVdbeAddOp(v, OP_Column, 2, pIndex->aiColumn[i]); } - sqliteVdbeAddOp(v, OP_MakeIdxKey, pIndex->nColumn, 0, 0, 0); - sqliteVdbeAddOp(v, OP_PutIdx, 1, pIndex->isUnique, 0, 0); - sqliteVdbeAddOp(v, OP_Goto, 0, lbl1, 0, 0); - sqliteVdbeAddOp(v, OP_Noop, 0, 0, 0, lbl2); - sqliteVdbeAddOp(v, OP_Close, 2, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Close, 1, 0, 0, 0); + sqliteVdbeAddOp(v, OP_MakeIdxKey, pIndex->nColumn, 0); + sqliteVdbeAddOp(v, OP_PutIdx, 1, pIndex->isUnique); + sqliteVdbeAddOp(v, OP_Goto, 0, lbl1); + sqliteVdbeResolveLabel(v, lbl2); + sqliteVdbeAddOp(v, OP_Noop, 0, 0); + sqliteVdbeAddOp(v, OP_Close, 2, 0); + sqliteVdbeAddOp(v, OP_Close, 1, 0); } if( pTable!=0 ){ if( !isTemp ){ changeCookie(db); - sqliteVdbeAddOp(v, OP_SetCookie, db->next_cookie, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Close, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_SetCookie, db->next_cookie, 0); + sqliteVdbeAddOp(v, OP_Close, 0, 0); } if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Commit, 0, 0); } } } @@ -1028,19 +1038,19 @@ void sqliteDropIndex(Parse *pParse, Token *pName){ Table *pTab = pIndex->pTable; if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0); - sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Transaction, 0, 0); + sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0); pParse->schemaVerified = 1; } if( !pTab->isTemp ){ base = sqliteVdbeAddOpList(v, ArraySize(dropIndex), dropIndex); - sqliteVdbeChangeP3(v, base+2, pIndex->zName, 0); + sqliteVdbeChangeP3(v, base+2, pIndex->zName, P3_STATIC); changeCookie(db); sqliteVdbeChangeP1(v, base+9, db->next_cookie); } - sqliteVdbeAddOp(v, OP_Destroy, pIndex->tnum, pTab->isTemp, 0, 0); + sqliteVdbeAddOp(v, OP_Destroy, pIndex->tnum, pTab->isTemp); if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Commit, 0, 0); } } @@ -1205,49 +1215,52 @@ void sqliteCopy( if( v ){ int openOp; if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0); - sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Transaction, 0, 0); + sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0); pParse->schemaVerified = 1; } - addr = sqliteVdbeAddOp(v, OP_FileOpen, 0, 0, 0, 0); + 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, pTab->zName, 0); + 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, pIdx->zName, 0); + sqliteVdbeAddOp(v, openOp, i, pIdx->tnum); + sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC); } end = sqliteVdbeMakeLabel(v); - addr = sqliteVdbeAddOp(v, OP_FileRead, pTab->nCol, end, 0, 0); + 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); } - sqliteVdbeAddOp(v, OP_NewRecno, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_NewRecno, 0, 0); if( pTab->pIndex ){ - sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Dup, 0, 0); } for(i=0; i<pTab->nCol; i++){ - sqliteVdbeAddOp(v, OP_FileColumn, i, 0, 0, 0); + sqliteVdbeAddOp(v, OP_FileColumn, i, 0); } - sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Put, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0); + sqliteVdbeAddOp(v, OP_Put, 0, 0); for(i=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ if( pIdx->pNext ){ - sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Dup, 0, 0); } for(j=0; j<pIdx->nColumn; j++){ - sqliteVdbeAddOp(v, OP_FileColumn, pIdx->aiColumn[j], 0, 0, 0); + sqliteVdbeAddOp(v, OP_FileColumn, pIdx->aiColumn[j], 0); } - sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0, 0, 0); - sqliteVdbeAddOp(v, OP_PutIdx, i, pIdx->isUnique, 0, 0); + sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0); + sqliteVdbeAddOp(v, OP_PutIdx, i, pIdx->isUnique); } - sqliteVdbeAddOp(v, OP_Goto, 0, addr, 0, 0); - sqliteVdbeAddOp(v, OP_Noop, 0, 0, 0, end); + sqliteVdbeAddOp(v, OP_Goto, 0, addr); + sqliteVdbeResolveLabel(v, end); + sqliteVdbeAddOp(v, OP_Noop, 0, 0); if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Commit, 0, 0); } } @@ -1280,26 +1293,29 @@ void sqliteVacuum(Parse *pParse, Token *pTableName){ v = sqliteGetVdbe(pParse); if( v==0 ) goto vacuum_cleanup; if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0); - sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Transaction, 0, 0); + sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0); pParse->schemaVerified = 1; } if( zName ){ - sqliteVdbeAddOp(v, OP_Reorganize, 0, 0, zName, 0); + sqliteVdbeAddOp(v, OP_Reorganize, 0, 0); + sqliteVdbeChangeP3(v, -1, zName, strlen(zName)); }else{ Table *pTab; Index *pIdx; HashElem *pE; for(pE=sqliteHashFirst(&db->tblHash); pE; pE=sqliteHashNext(pE)){ pTab = sqliteHashData(pE); - sqliteVdbeAddOp(v, OP_Reorganize, 0, 0, pTab->zName, 0); + sqliteVdbeAddOp(v, OP_Reorganize, 0, 0); + sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC); for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ - sqliteVdbeAddOp(v, OP_Reorganize, 0, 0, pIdx->zName, 0); + sqliteVdbeAddOp(v, OP_Reorganize, 0, 0); + sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC); } } } if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Commit, 0, 0); } vacuum_cleanup: @@ -1319,8 +1335,8 @@ void sqliteBeginTransaction(Parse *pParse){ if( db->flags & SQLITE_InTrans ) return; v = sqliteGetVdbe(pParse); if( v ){ - sqliteVdbeAddOp(v, OP_Transaction, 1, 0, 0, 0); - sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Transaction, 1, 0); + sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0); pParse->schemaVerified = 1; } db->flags |= SQLITE_InTrans; @@ -1338,7 +1354,7 @@ void sqliteCommitTransaction(Parse *pParse){ if( (db->flags & SQLITE_InTrans)==0 ) return; v = sqliteGetVdbe(pParse); if( v ){ - sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Commit, 0, 0); } db->flags &= ~SQLITE_InTrans; } @@ -1355,7 +1371,7 @@ void sqliteRollbackTransaction(Parse *pParse){ if( (db->flags & SQLITE_InTrans)==0 ) return; v = sqliteGetVdbe(pParse); if( v ){ - sqliteVdbeAddOp(v, OP_Rollback, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Rollback, 0, 0); } db->flags &= ~SQLITE_InTrans; } @@ -1440,13 +1456,16 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){ int i; sqliteVdbeAddOpList(v, ArraySize(tableInfoPreface), tableInfoPreface); for(i=0; i<pTab->nCol; i++){ - sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0, pTab->aCol[i].zName, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0, - pTab->aCol[i].zType ? pTab->aCol[i].zType : "text", 0); - sqliteVdbeAddOp(v, OP_Integer, pTab->aCol[i].notNull, 0, 0, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0, pTab->aCol[i].zDflt, 0); - sqliteVdbeAddOp(v, OP_Callback, 5, 0, 0, 0); + 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 : "text", 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 @@ -1468,11 +1487,12 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){ pTab = pIdx->pTable; sqliteVdbeAddOpList(v, ArraySize(tableInfoPreface), tableInfoPreface); for(i=0; i<pIdx->nColumn; i++){ - sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Integer, pIdx->aiColumn[i], 0, 0, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0, - pTab->aCol[pIdx->aiColumn[i]].zName, 0); - sqliteVdbeAddOp(v, OP_Callback, 3, 0, 0, 0); + int cnum = pIdx->aiColumn[i]; + sqliteVdbeAddOp(v, OP_Integer, i, 0); + sqliteVdbeAddOp(v, OP_Integer, cnum, 0); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, pTab->aCol[cnum].zName, P3_STATIC); + sqliteVdbeAddOp(v, OP_Callback, 3, 0); } } }else @@ -1497,10 +1517,11 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){ sqliteVdbeAddOpList(v, ArraySize(indexListPreface), indexListPreface); while(pIdx){ - sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0, pIdx->zName, 0); - sqliteVdbeAddOp(v, OP_Integer, pIdx->isUnique, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Callback, 3, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Integer, i, 0); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC); + sqliteVdbeAddOp(v, OP_Integer, pIdx->isUnique, 0); + sqliteVdbeAddOp(v, OP_Callback, 3, 0); ++i; pIdx = pIdx->pNext; } diff --git a/src/delete.c b/src/delete.c index 6b02eb59a..6534f3070 100644 --- a/src/delete.c +++ b/src/delete.c @@ -12,7 +12,7 @@ ** This file contains C code routines that are called by the parser ** to handle DELETE FROM statements. ** -** $Id: delete.c,v 1.16 2001/10/08 13:22:32 drh Exp $ +** $Id: delete.c,v 1.17 2001/10/13 01:06:48 drh Exp $ */ #include "sqliteInt.h" @@ -81,8 +81,8 @@ void sqliteDeleteFrom( v = sqliteGetVdbe(pParse); if( v==0 ) goto delete_from_cleanup; if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0); - sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Transaction, 0, 0); + sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0); pParse->schemaVerified = 1; } @@ -91,9 +91,9 @@ void sqliteDeleteFrom( ** It is easier just to erase the whole table. */ if( pWhere==0 ){ - sqliteVdbeAddOp(v, OP_Clear, pTab->tnum, pTab->isTemp, 0, 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, 0, 0); + sqliteVdbeAddOp(v, OP_Clear, pIdx->tnum, pTab->isTemp); } } @@ -105,13 +105,13 @@ void sqliteDeleteFrom( /* Begin the database scan */ - sqliteVdbeAddOp(v, OP_ListOpen, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_ListOpen, 0, 0); pWInfo = sqliteWhereBegin(pParse, pTabList, pWhere, 1); if( pWInfo==0 ) goto delete_from_cleanup; /* Remember the key of every item to be deleted. */ - sqliteVdbeAddOp(v, OP_ListWrite, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_ListWrite, 0, 0); /* End the database scan loop. */ @@ -122,32 +122,33 @@ void sqliteDeleteFrom( ** because deleting an item can change the scan order. */ base = pParse->nTab; - sqliteVdbeAddOp(v, OP_ListRewind, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_ListRewind, 0, 0); openOp = pTab->isTemp ? OP_OpenWrAux : OP_OpenWrite; - sqliteVdbeAddOp(v, openOp, base, pTab->tnum, 0, 0); + sqliteVdbeAddOp(v, openOp, base, pTab->tnum); for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ - sqliteVdbeAddOp(v, openOp, base+i, pIdx->tnum, 0, 0); + sqliteVdbeAddOp(v, openOp, base+i, pIdx->tnum); } end = sqliteVdbeMakeLabel(v); - addr = sqliteVdbeAddOp(v, OP_ListRead, 0, end, 0, 0); - sqliteVdbeAddOp(v, OP_MoveTo, base, 0, 0, 0); + addr = sqliteVdbeAddOp(v, OP_ListRead, 0, end); + sqliteVdbeAddOp(v, OP_MoveTo, base, 0); if( pTab->pIndex ){ for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ int j; - sqliteVdbeAddOp(v, OP_Recno, base, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Recno, base, 0); for(j=0; j<pIdx->nColumn; j++){ - sqliteVdbeAddOp(v, OP_Column, base, pIdx->aiColumn[j], 0, 0); + sqliteVdbeAddOp(v, OP_Column, base, pIdx->aiColumn[j]); } - sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0, 0, 0); - sqliteVdbeAddOp(v, OP_DeleteIdx, base+i, 0, 0, 0); + sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0); + sqliteVdbeAddOp(v, OP_DeleteIdx, base+i, 0); } } - sqliteVdbeAddOp(v, OP_Delete, base, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Goto, 0, addr, 0, 0); - sqliteVdbeAddOp(v, OP_ListClose, 0, 0, 0, end); + sqliteVdbeAddOp(v, OP_Delete, base, 0); + sqliteVdbeAddOp(v, OP_Goto, 0, addr); + sqliteVdbeResolveLabel(v, end); + sqliteVdbeAddOp(v, OP_ListClose, 0, 0); } if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Commit, 0, 0); } diff --git a/src/expr.c b/src/expr.c index 0bf74727a..5ace17836 100644 --- a/src/expr.c +++ b/src/expr.c @@ -12,7 +12,7 @@ ** This file contains routines used for analyzing expressions and ** for generating VDBE code that evaluates expressions in SQLite. ** -** $Id: expr.c,v 1.29 2001/10/06 16:33:03 drh Exp $ +** $Id: expr.c,v 1.30 2001/10/13 01:06:48 drh Exp $ */ #include "sqliteInt.h" @@ -234,7 +234,7 @@ int sqliteExprResolveIds(Parse *pParse, IdList *pTabList, Expr *pExpr){ ** table. The cursor number of the temporary table has already ** been put in iTable by sqliteExprResolveInSelect(). */ - sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 0, 0, 0); + sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 0); if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) ); }else if( pExpr->pList ){ /* Case 2: expr IN (exprlist) @@ -262,14 +262,14 @@ int sqliteExprResolveIds(Parse *pParse, IdList *pTabList, Expr *pExpr){ case TK_FLOAT: case TK_INTEGER: case TK_STRING: { - int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0); + int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n); sqliteVdbeDequoteP3(v, addr); break; } default: { sqliteExprCode(pParse, pE2); - sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0); + sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); break; } } @@ -501,32 +501,32 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){ switch( pExpr->op ){ case TK_COLUMN: { if( pParse->useAgg ){ - sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg, 0, 0); + sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); }else if( pExpr->iColumn>=0 ){ - sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn, 0, 0); + sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn); }else{ - sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0); } break; } case TK_INTEGER: { int i = atoi(pExpr->token.z); - sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Integer, i, 0); break; } case TK_FLOAT: { - int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0); + int addr = sqliteVdbeAddOp(v, OP_String, 0, 0); sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); break; } case TK_STRING: { - int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0); + int addr = sqliteVdbeAddOp(v, OP_String, 0, 0); sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); sqliteVdbeDequoteP3(v, addr); break; } case TK_NULL: { - sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_String, 0, 0); break; } case TK_AND: @@ -537,13 +537,13 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){ case TK_SLASH: { sqliteExprCode(pParse, pExpr->pLeft); sqliteExprCode(pParse, pExpr->pRight); - sqliteVdbeAddOp(v, op, 0, 0, 0, 0); + sqliteVdbeAddOp(v, op, 0, 0); break; } case TK_CONCAT: { sqliteExprCode(pParse, pExpr->pLeft); sqliteExprCode(pParse, pExpr->pRight); - sqliteVdbeAddOp(v, OP_Concat, 2, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Concat, 2, 0); break; } case TK_LT: @@ -555,25 +555,26 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){ case TK_LIKE: case TK_GLOB: { int dest; - sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Integer, 1, 0); sqliteExprCode(pParse, pExpr->pLeft); sqliteExprCode(pParse, pExpr->pRight); dest = sqliteVdbeCurrentAddr(v) + 2; - sqliteVdbeAddOp(v, op, 0, dest, 0, 0); - sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0); + sqliteVdbeAddOp(v, op, 0, dest); + sqliteVdbeAddOp(v, OP_AddImm, -1, 0); break; } case TK_UMINUS: { assert( pExpr->pLeft ); if( pExpr->pLeft->op==TK_INTEGER ){ int i = atoi(pExpr->pLeft->token.z); - sqliteVdbeAddOp(v, OP_Integer, -i, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Integer, -i, 0); break; }else if( pExpr->pLeft->op==TK_FLOAT ){ Token *p = &pExpr->pLeft->token; char *z = sqliteMalloc( p->n + 2 ); sprintf(z, "-%.*s", p->n, p->z); - sqliteVdbeAddOp(v, OP_String, 0, 0, z, 0); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, z, p->n+1); sqliteFree(z); break; } @@ -581,25 +582,25 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){ } case TK_NOT: { sqliteExprCode(pParse, pExpr->pLeft); - sqliteVdbeAddOp(v, op, 0, 0, 0, 0); + sqliteVdbeAddOp(v, op, 0, 0); break; } case TK_ISNULL: case TK_NOTNULL: { int dest; - sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Integer, 1, 0); sqliteExprCode(pParse, pExpr->pLeft); dest = sqliteVdbeCurrentAddr(v) + 2; - sqliteVdbeAddOp(v, op, 0, dest, 0, 0); - sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0); + sqliteVdbeAddOp(v, op, 0, dest); + sqliteVdbeAddOp(v, OP_AddImm, -1, 0); break; } case TK_AGG_FUNCTION: { - sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg, 0, 0); + sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); if( pExpr->iColumn==FN_Avg ){ assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg ); - sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount, 0, 0); - sqliteVdbeAddOp(v, OP_Divide, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount); + sqliteVdbeAddOp(v, OP_Divide, 0, 0); } break; } @@ -610,7 +611,7 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){ ExprList *pList = pExpr->pList; switch( id ){ case FN_Fcnt: { - sqliteVdbeAddOp(v, OP_Fcnt, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Fcnt, 0, 0); break; } case FN_Min: @@ -619,21 +620,21 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){ for(i=0; i<pList->nExpr; i++){ sqliteExprCode(pParse, pList->a[i].pExpr); if( i>0 ){ - sqliteVdbeAddOp(v, op, 0, 0, 0, 0); + sqliteVdbeAddOp(v, op, 0, 0); } } break; } case FN_Length: { sqliteExprCode(pParse, pList->a[0].pExpr); - sqliteVdbeAddOp(v, OP_Strlen, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Strlen, 0, 0); break; } case FN_Substr: { for(i=0; i<pList->nExpr; i++){ sqliteExprCode(pParse, pList->a[i].pExpr); } - sqliteVdbeAddOp(v, OP_Substr, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Substr, 0, 0); break; } default: { @@ -644,27 +645,27 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){ break; } case TK_SELECT: { - sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0, 0, 0); + sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0); break; } case TK_IN: { int addr; - sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Integer, 1, 0); sqliteExprCode(pParse, pExpr->pLeft); addr = sqliteVdbeCurrentAddr(v); if( pExpr->pSelect ){ - sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2, 0, 0); + sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2); }else{ - sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2, 0, 0); + sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2); } - sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0); + sqliteVdbeAddOp(v, OP_AddImm, -1, 0); break; } case TK_BETWEEN: { int lbl = sqliteVdbeMakeLabel(v); - sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Integer, 0, 0); sqliteExprIfFalse(pParse, pExpr, lbl); - sqliteVdbeAddOp(v, OP_AddImm, 1, 0, 0, 0); + sqliteVdbeAddOp(v, OP_AddImm, 1, 0); sqliteVdbeResolveLabel(v, lbl); break; } @@ -721,39 +722,40 @@ void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){ case TK_GLOB: { sqliteExprCode(pParse, pExpr->pLeft); sqliteExprCode(pParse, pExpr->pRight); - sqliteVdbeAddOp(v, op, 0, dest, 0, 0); + sqliteVdbeAddOp(v, op, 0, dest); break; } case TK_ISNULL: case TK_NOTNULL: { sqliteExprCode(pParse, pExpr->pLeft); - sqliteVdbeAddOp(v, op, 0, dest, 0, 0); + sqliteVdbeAddOp(v, op, 0, dest); break; } case TK_IN: { sqliteExprCode(pParse, pExpr->pLeft); if( pExpr->pSelect ){ - sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest, 0, 0); + sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest); }else{ - sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest, 0, 0); + sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest); } break; } case TK_BETWEEN: { int lbl = sqliteVdbeMakeLabel(v); sqliteExprCode(pParse, pExpr->pLeft); - sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Dup, 0, 0); sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); - sqliteVdbeAddOp(v, OP_Lt, 0, lbl, 0, 0); + sqliteVdbeAddOp(v, OP_Lt, 0, lbl); sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); - sqliteVdbeAddOp(v, OP_Le, 0, dest, 0, 0); - sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, lbl); + sqliteVdbeAddOp(v, OP_Le, 0, dest); + sqliteVdbeAddOp(v, OP_Integer, 0, 0); + sqliteVdbeResolveLabel(v, lbl); + sqliteVdbeAddOp(v, OP_Pop, 1, 0); break; } default: { sqliteExprCode(pParse, pExpr); - sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0); + sqliteVdbeAddOp(v, OP_If, 0, dest); break; } } @@ -806,48 +808,48 @@ void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){ case TK_EQ: { sqliteExprCode(pParse, pExpr->pLeft); sqliteExprCode(pParse, pExpr->pRight); - sqliteVdbeAddOp(v, op, 0, dest, 0, 0); + sqliteVdbeAddOp(v, op, 0, dest); break; } case TK_LIKE: case TK_GLOB: { sqliteExprCode(pParse, pExpr->pLeft); sqliteExprCode(pParse, pExpr->pRight); - sqliteVdbeAddOp(v, op, 1, dest, 0, 0); + sqliteVdbeAddOp(v, op, 1, dest); break; } case TK_ISNULL: case TK_NOTNULL: { sqliteExprCode(pParse, pExpr->pLeft); - sqliteVdbeAddOp(v, op, 0, dest, 0, 0); + sqliteVdbeAddOp(v, op, 0, dest); break; } case TK_IN: { sqliteExprCode(pParse, pExpr->pLeft); if( pExpr->pSelect ){ - sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest, 0, 0); + sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest); }else{ - sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest, 0, 0); + sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest); } break; } case TK_BETWEEN: { int addr; sqliteExprCode(pParse, pExpr->pLeft); - sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Dup, 0, 0); sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); addr = sqliteVdbeCurrentAddr(v); - sqliteVdbeAddOp(v, OP_Ge, 0, addr+3, 0, 0); - sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Goto, 0, dest, 0, 0); + sqliteVdbeAddOp(v, OP_Ge, 0, addr+3); + sqliteVdbeAddOp(v, OP_Pop, 1, 0); + sqliteVdbeAddOp(v, OP_Goto, 0, dest); sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); - sqliteVdbeAddOp(v, OP_Gt, 0, dest, 0, 0); + sqliteVdbeAddOp(v, OP_Gt, 0, dest); break; } default: { sqliteExprCode(pParse, pExpr); - sqliteVdbeAddOp(v, OP_Not, 0, 0, 0, 0); - sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0); + sqliteVdbeAddOp(v, OP_Not, 0, 0); + sqliteVdbeAddOp(v, OP_If, 0, dest); break; } } diff --git a/src/insert.c b/src/insert.c index 711f8eb94..489f7389c 100644 --- a/src/insert.c +++ b/src/insert.c @@ -12,7 +12,7 @@ ** This file contains C code routines that are called by the parser ** to handle INSERT statements in SQLite. ** -** $Id: insert.c,v 1.22 2001/10/08 13:22:33 drh Exp $ +** $Id: insert.c,v 1.23 2001/10/13 01:06:48 drh Exp $ */ #include "sqliteInt.h" @@ -77,8 +77,8 @@ void sqliteInsert( v = sqliteGetVdbe(pParse); if( v==0 ) goto insert_cleanup; if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0); - sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Transaction, 0, 0); + sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0); pParse->schemaVerified = 1; } @@ -91,7 +91,7 @@ void sqliteInsert( if( pSelect ){ int rc; srcTab = pParse->nTab++; - sqliteVdbeAddOp(v, OP_OpenTemp, srcTab, 0, 0, 0); + sqliteVdbeAddOp(v, OP_OpenTemp, srcTab, 0); rc = sqliteSelect(pParse, pSelect, SRT_Table, srcTab); if( rc || pParse->nErr || sqlite_malloc_failed ) goto insert_cleanup; assert( pSelect->pEList ); @@ -157,9 +157,11 @@ void sqliteInsert( */ base = pParse->nTab; openOp = pTab->isTemp ? OP_OpenWrAux : OP_OpenWrite; - sqliteVdbeAddOp(v, openOp, base, pTab->tnum, pTab->zName, 0); + 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, pIdx->zName, 0); + sqliteVdbeAddOp(v, openOp, idx+base, pIdx->tnum); + sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC); } /* If the data source is a SELECT statement, then we have to create @@ -168,16 +170,16 @@ void sqliteInsert( ** and the loop is not used. */ if( srcTab>=0 ){ - sqliteVdbeAddOp(v, OP_Rewind, srcTab, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Rewind, srcTab, 0); iBreak = sqliteVdbeMakeLabel(v); - iCont = sqliteVdbeAddOp(v, OP_Next, srcTab, iBreak, 0, 0); + iCont = sqliteVdbeAddOp(v, OP_Next, srcTab, iBreak); } /* Create a new entry in the table and fill it with data. */ - sqliteVdbeAddOp(v, OP_NewRecno, base, 0, 0, 0); + sqliteVdbeAddOp(v, OP_NewRecno, base, 0); if( pTab->pIndex ){ - sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Dup, 0, 0); } for(i=0; i<pTab->nCol; i++){ if( pColumn==0 ){ @@ -188,22 +190,23 @@ void sqliteInsert( } } if( pColumn && j>=pColumn->nId ){ - sqliteVdbeAddOp(v, OP_String, 0, 0, pTab->aCol[i].zDflt, 0); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zDflt, P3_STATIC); }else if( srcTab>=0 ){ - sqliteVdbeAddOp(v, OP_Column, srcTab, i, 0, 0); + sqliteVdbeAddOp(v, OP_Column, srcTab, i); }else{ sqliteExprCode(pParse, pList->a[j].pExpr); } } - sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Put, base, 0, 0, 0); + sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0); + sqliteVdbeAddOp(v, OP_Put, base, 0); /* Create appropriate entries for the new data row in all indices ** of the table. */ for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){ if( pIdx->pNext ){ - sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Dup, 0, 0); } for(i=0; i<pIdx->nColumn; i++){ int idx = pIdx->aiColumn[i]; @@ -215,25 +218,27 @@ void sqliteInsert( } } if( pColumn && j>=pColumn->nId ){ - sqliteVdbeAddOp(v, OP_String, 0, 0, pTab->aCol[idx].zDflt, 0); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, pTab->aCol[idx].zDflt, P3_STATIC); }else if( srcTab>=0 ){ - sqliteVdbeAddOp(v, OP_Column, srcTab, idx, 0, 0); + sqliteVdbeAddOp(v, OP_Column, srcTab, idx); }else{ sqliteExprCode(pParse, pList->a[j].pExpr); } } - sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0, 0, 0); - sqliteVdbeAddOp(v, OP_PutIdx, idx+base, pIdx->isUnique, 0, 0); + sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0); + sqliteVdbeAddOp(v, OP_PutIdx, idx+base, pIdx->isUnique); } /* The bottom of the loop, if the data source is a SELECT statement */ if( srcTab>=0 ){ - sqliteVdbeAddOp(v, OP_Goto, 0, iCont, 0, 0); - sqliteVdbeAddOp(v, OP_Noop, 0, 0, 0, iBreak); + sqliteVdbeAddOp(v, OP_Goto, 0, iCont); + sqliteVdbeResolveLabel(v, iBreak); + sqliteVdbeAddOp(v, OP_Noop, 0, 0); } if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Commit, 0, 0); } diff --git a/src/select.c b/src/select.c index ab1cc5a27..ea265bad6 100644 --- a/src/select.c +++ b/src/select.c @@ -12,7 +12,7 @@ ** This file contains C code routines that are called by the parser ** to handle SELECT statements in SQLite. ** -** $Id: select.c,v 1.38 2001/10/06 16:33:03 drh Exp $ +** $Id: select.c,v 1.39 2001/10/13 01:06:48 drh Exp $ */ #include "sqliteInt.h" @@ -110,7 +110,7 @@ static int selectInnerLoop( nColumn = pEList->nExpr; }else{ for(i=0; i<nColumn; i++){ - sqliteVdbeAddOp(v, OP_Column, srcTab, i, 0, 0); + sqliteVdbeAddOp(v, OP_Column, srcTab, i); } } @@ -120,12 +120,14 @@ static int selectInnerLoop( */ if( distinct>=0 ){ int lbl = sqliteVdbeMakeLabel(v); - sqliteVdbeAddOp(v, OP_MakeKey, pEList->nExpr, 1, 0, 0); - sqliteVdbeAddOp(v, OP_Distinct, distinct, lbl, 0, 0); - sqliteVdbeAddOp(v, OP_Pop, pEList->nExpr+1, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Goto, 0, iContinue, 0, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0, "", lbl); - sqliteVdbeAddOp(v, OP_Put, distinct, 0, 0, 0); + sqliteVdbeAddOp(v, OP_MakeKey, pEList->nExpr, 1); + sqliteVdbeAddOp(v, OP_Distinct, distinct, lbl); + sqliteVdbeAddOp(v, OP_Pop, pEList->nExpr+1, 0); + sqliteVdbeAddOp(v, OP_Goto, 0, iContinue); + sqliteVdbeResolveLabel(v, lbl); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, "", P3_STATIC); + sqliteVdbeAddOp(v, OP_Put, distinct, 0); } /* If there is an ORDER BY clause, then store the results @@ -133,7 +135,7 @@ static int selectInnerLoop( */ if( pOrderBy ){ char *zSortOrder; - sqliteVdbeAddOp(v, OP_SortMakeRec, nColumn, 0, 0, 0); + sqliteVdbeAddOp(v, OP_SortMakeRec, nColumn, 0); zSortOrder = sqliteMalloc( pOrderBy->nExpr + 1 ); if( zSortOrder==0 ) return 1; for(i=0; i<pOrderBy->nExpr; i++){ @@ -141,27 +143,29 @@ static int selectInnerLoop( sqliteExprCode(pParse, pOrderBy->a[i].pExpr); } zSortOrder[pOrderBy->nExpr] = 0; - sqliteVdbeAddOp(v, OP_SortMakeKey, pOrderBy->nExpr, 0, zSortOrder, 0); + sqliteVdbeAddOp(v, OP_SortMakeKey, pOrderBy->nExpr, 0); + sqliteVdbeChangeP3(v, -1, zSortOrder, strlen(zSortOrder)); sqliteFree(zSortOrder); - sqliteVdbeAddOp(v, OP_SortPut, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_SortPut, 0, 0); }else /* In this mode, write each query result to the key of the temporary ** table iParm. */ if( eDest==SRT_Union ){ - sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0, 0, 0); - sqliteVdbeAddOp(v, OP_String, iParm, 0, "", 0); - sqliteVdbeAddOp(v, OP_Put, iParm, 0, 0, 0); + sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0); + sqliteVdbeAddOp(v, OP_String, iParm, 0); + sqliteVdbeChangeP3(v, -1, "", P3_STATIC); + sqliteVdbeAddOp(v, OP_Put, iParm, 0); }else /* Store the result as data using a unique key. */ if( eDest==SRT_Table ){ - sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0, 0, 0); - sqliteVdbeAddOp(v, OP_NewRecno, iParm, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Pull, 1, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Put, iParm, 0, 0, 0); + sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0); + sqliteVdbeAddOp(v, OP_NewRecno, iParm, 0); + sqliteVdbeAddOp(v, OP_Pull, 1, 0); + sqliteVdbeAddOp(v, OP_Put, iParm, 0); }else /* Construct a record from the query result, but instead of @@ -169,9 +173,9 @@ static int selectInnerLoop( ** the temporary table iParm. */ if( eDest==SRT_Except ){ - int addr = sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0, 0, 0); - sqliteVdbeAddOp(v, OP_NotFound, iParm, addr+3, 0, 0); - sqliteVdbeAddOp(v, OP_Delete, iParm, 0, 0, 0); + int addr = sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0); + sqliteVdbeAddOp(v, OP_NotFound, iParm, addr+3); + sqliteVdbeAddOp(v, OP_Delete, iParm, 0); }else /* If we are creating a set for an "expr IN (SELECT ...)" construct, @@ -180,8 +184,9 @@ static int selectInnerLoop( */ if( eDest==SRT_Set ){ assert( nColumn==1 ); - sqliteVdbeAddOp(v, OP_String, 0, 0, "", 0); - sqliteVdbeAddOp(v, OP_Put, iParm, 0, 0, 0); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, "", P3_STATIC); + sqliteVdbeAddOp(v, OP_Put, iParm, 0); }else @@ -191,14 +196,14 @@ static int selectInnerLoop( */ if( eDest==SRT_Mem ){ assert( nColumn==1 ); - sqliteVdbeAddOp(v, OP_MemStore, iParm, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Goto, 0, iBreak, 0, 0); + sqliteVdbeAddOp(v, OP_MemStore, iParm, 0); + sqliteVdbeAddOp(v, OP_Goto, 0, iBreak); }else /* If none of the above, send the data to the callback function. */ { - sqliteVdbeAddOp(v, OP_Callback, nColumn, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Callback, nColumn, 0); } return 0; } @@ -212,11 +217,12 @@ static int selectInnerLoop( static void generateSortTail(Vdbe *v, int nColumn){ int end = sqliteVdbeMakeLabel(v); int addr; - sqliteVdbeAddOp(v, OP_Sort, 0, 0, 0, 0); - addr = sqliteVdbeAddOp(v, OP_SortNext, 0, end, 0, 0); - sqliteVdbeAddOp(v, OP_SortCallback, nColumn, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Goto, 0, addr, 0, 0); - sqliteVdbeAddOp(v, OP_SortClose, 0, 0, 0, end); + sqliteVdbeAddOp(v, OP_Sort, 0, 0); + addr = sqliteVdbeAddOp(v, OP_SortNext, 0, end); + sqliteVdbeAddOp(v, OP_SortCallback, nColumn, 0); + sqliteVdbeAddOp(v, OP_Goto, 0, addr); + sqliteVdbeResolveLabel(v, end); + sqliteVdbeAddOp(v, OP_SortClose, 0, 0); } /* @@ -230,25 +236,26 @@ void generateColumnNames(Parse *pParse, IdList *pTabList, ExprList *pEList){ int i; if( pParse->colNamesSet || v==0 || sqlite_malloc_failed ) return; pParse->colNamesSet = 1; - sqliteVdbeAddOp(v, OP_ColumnCount, pEList->nExpr, 0, 0, 0); + sqliteVdbeAddOp(v, OP_ColumnCount, pEList->nExpr, 0); for(i=0; i<pEList->nExpr; i++){ Expr *p; - int addr; if( pEList->a[i].zName ){ char *zName = pEList->a[i].zName; - sqliteVdbeAddOp(v, OP_ColumnName, i, 0, zName, 0); + sqliteVdbeAddOp(v, OP_ColumnName, i, 0); + sqliteVdbeChangeP3(v, -1, zName, strlen(zName)); continue; } p = pEList->a[i].pExpr; if( p==0 ) continue; if( p->span.z && p->span.z[0] ){ - addr = sqliteVdbeAddOp(v,OP_ColumnName, i, 0, 0, 0); - sqliteVdbeChangeP3(v, addr, p->span.z, p->span.n); + int addr = sqliteVdbeAddOp(v,OP_ColumnName, i, 0); + sqliteVdbeChangeP3(v, -1, p->span.z, p->span.n); sqliteVdbeCompressSpace(v, addr); }else if( p->op!=TK_COLUMN || pTabList==0 ){ char zName[30]; sprintf(zName, "column%d", i+1); - sqliteVdbeAddOp(v, OP_ColumnName, i, 0, zName, 0); + sqliteVdbeAddOp(v, OP_ColumnName, i, 0); + sqliteVdbeChangeP3(v, -1, zName, strlen(zName)); }else{ if( pTabList->nId>1 || (pParse->db->flags & SQLITE_FullColNames)!=0 ){ char *zName = 0; @@ -258,12 +265,14 @@ void generateColumnNames(Parse *pParse, IdList *pTabList, ExprList *pEList){ zTab = pTabList->a[p->iTable].zAlias; if( zTab==0 ) zTab = pTab->zName; sqliteSetString(&zName, zTab, ".", pTab->aCol[p->iColumn].zName, 0); - sqliteVdbeAddOp(v, OP_ColumnName, i, 0, zName, 0); + sqliteVdbeAddOp(v, OP_ColumnName, i, 0); + sqliteVdbeChangeP3(v, -1, zName, strlen(zName)); sqliteFree(zName); }else{ Table *pTab = pTabList->a[0].pTab; char *zName = pTab->aCol[p->iColumn].zName; - sqliteVdbeAddOp(v, OP_ColumnName, i, 0, zName, 0); + sqliteVdbeAddOp(v, OP_ColumnName, i, 0); + sqliteVdbeChangeP3(v, -1, zName, P3_STATIC); } } } @@ -504,10 +513,10 @@ static int multiSelect(Parse *pParse, Select *p, int eDest, int iParm){ return 1; } if( p->op!=TK_ALL ){ - sqliteVdbeAddOp(v, OP_OpenTemp, unionTab, 0, 0, 0); - sqliteVdbeAddOp(v, OP_KeyAsData, unionTab, 1, 0, 0); + sqliteVdbeAddOp(v, OP_OpenTemp, unionTab, 0); + sqliteVdbeAddOp(v, OP_KeyAsData, unionTab, 1); }else{ - sqliteVdbeAddOp(v, OP_OpenTemp, unionTab, 0, 0, 0); + sqliteVdbeAddOp(v, OP_OpenTemp, unionTab, 0); } } @@ -536,17 +545,18 @@ static int multiSelect(Parse *pParse, Select *p, int eDest, int iParm){ assert( p->pEList ); generateColumnNames(pParse, 0, p->pEList); if( p->pOrderBy ){ - sqliteVdbeAddOp(v, OP_SortOpen, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_SortOpen, 0, 0); } - sqliteVdbeAddOp(v, OP_Rewind, unionTab, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Rewind, unionTab, 0); iBreak = sqliteVdbeMakeLabel(v); - iCont = sqliteVdbeAddOp(v, OP_Next, unionTab, iBreak, 0, 0); + iCont = sqliteVdbeAddOp(v, OP_Next, unionTab, iBreak); rc = selectInnerLoop(pParse, 0, unionTab, p->pEList->nExpr, p->pOrderBy, -1, eDest, iParm, iCont, iBreak); if( rc ) return 1; - sqliteVdbeAddOp(v, OP_Goto, 0, iCont, 0, 0); - sqliteVdbeAddOp(v, OP_Close, unionTab, 0, 0, iBreak); + sqliteVdbeAddOp(v, OP_Goto, 0, iCont); + sqliteVdbeResolveLabel(v, iBreak); + sqliteVdbeAddOp(v, OP_Close, unionTab, 0); if( p->pOrderBy ){ generateSortTail(v, p->pEList->nExpr); } @@ -566,8 +576,8 @@ static int multiSelect(Parse *pParse, Select *p, int eDest, int iParm){ if( p->pOrderBy && matchOrderbyToColumn(pParse,p,p->pOrderBy,tab1,1) ){ return 1; } - sqliteVdbeAddOp(v, OP_OpenTemp, tab1, 0, 0, 0); - sqliteVdbeAddOp(v, OP_KeyAsData, tab1, 1, 0, 0); + sqliteVdbeAddOp(v, OP_OpenTemp, tab1, 0); + sqliteVdbeAddOp(v, OP_KeyAsData, tab1, 1); /* Code the SELECTs to our left into temporary table "tab1". */ @@ -576,8 +586,8 @@ static int multiSelect(Parse *pParse, Select *p, int eDest, int iParm){ /* Code the current SELECT into temporary table "tab2" */ - sqliteVdbeAddOp(v, OP_OpenTemp, tab2, 0, 0, 0); - sqliteVdbeAddOp(v, OP_KeyAsData, tab2, 1, 0, 0); + sqliteVdbeAddOp(v, OP_OpenTemp, tab2, 0); + sqliteVdbeAddOp(v, OP_KeyAsData, tab2, 1); p->pPrior = 0; rc = sqliteSelect(pParse, p, SRT_Union, tab2); p->pPrior = pPrior; @@ -589,20 +599,21 @@ static int multiSelect(Parse *pParse, Select *p, int eDest, int iParm){ assert( p->pEList ); generateColumnNames(pParse, 0, p->pEList); if( p->pOrderBy ){ - sqliteVdbeAddOp(v, OP_SortOpen, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_SortOpen, 0, 0); } - sqliteVdbeAddOp(v, OP_Rewind, tab1, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Rewind, tab1, 0); iBreak = sqliteVdbeMakeLabel(v); - iCont = sqliteVdbeAddOp(v, OP_Next, tab1, iBreak, 0, 0); - sqliteVdbeAddOp(v, OP_FullKey, tab1, 0, 0, 0); - sqliteVdbeAddOp(v, OP_NotFound, tab2, iCont, 0, 0); + iCont = sqliteVdbeAddOp(v, OP_Next, tab1, iBreak); + sqliteVdbeAddOp(v, OP_FullKey, tab1, 0); + sqliteVdbeAddOp(v, OP_NotFound, tab2, iCont); rc = selectInnerLoop(pParse, 0, tab1, p->pEList->nExpr, p->pOrderBy, -1, eDest, iParm, iCont, iBreak); if( rc ) return 1; - sqliteVdbeAddOp(v, OP_Goto, 0, iCont, 0, 0); - sqliteVdbeAddOp(v, OP_Close, tab2, 0, 0, iBreak); - sqliteVdbeAddOp(v, OP_Close, tab1, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Goto, 0, iCont); + sqliteVdbeResolveLabel(v, iBreak); + sqliteVdbeAddOp(v, OP_Close, tab2, 0); + sqliteVdbeAddOp(v, OP_Close, tab1, 0); if( p->pOrderBy ){ generateSortTail(v, p->pEList->nExpr); } @@ -842,7 +853,7 @@ int sqliteSelect( v = sqliteGetVdbe(pParse); if( v==0 ) return 1; if( pOrderBy ){ - sqliteVdbeAddOp(v, OP_SortOpen, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_SortOpen, 0, 0); } /* Identify column names if we will be using in the callback. This @@ -855,20 +866,20 @@ int sqliteSelect( /* Reset the aggregator */ if( isAgg ){ - sqliteVdbeAddOp(v, OP_AggReset, 0, pParse->nAgg, 0, 0); + sqliteVdbeAddOp(v, OP_AggReset, 0, pParse->nAgg); } /* Initialize the memory cell to NULL */ if( eDest==SRT_Mem ){ - sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0); - sqliteVdbeAddOp(v, OP_MemStore, iParm, 0, 0, 0); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeAddOp(v, OP_MemStore, iParm, 0); } /* Begin the database scan */ if( isDistinct ){ - sqliteVdbeAddOp(v, OP_OpenTemp, distinct, 0, 0, 0); + sqliteVdbeAddOp(v, OP_OpenTemp, distinct, 0); } pWInfo = sqliteWhereBegin(pParse, pTabList, pWhere, 0); if( pWInfo==0 ) return 1; @@ -892,7 +903,7 @@ int sqliteSelect( for(i=0; i<pGroupBy->nExpr; i++){ sqliteExprCode(pParse, pGroupBy->a[i].pExpr); } - sqliteVdbeAddOp(v, OP_MakeKey, pGroupBy->nExpr, 0, 0, 0); + sqliteVdbeAddOp(v, OP_MakeKey, pGroupBy->nExpr, 0); doFocus = 1; }else{ doFocus = 0; @@ -903,16 +914,17 @@ int sqliteSelect( } } if( doFocus ){ - sqliteVdbeAddOp(v, OP_String, 0, 0, "", 0); + sqliteVdbeAddOp(v, OP_String, 0, 0); + sqliteVdbeChangeP3(v, -1, "", P3_STATIC); } } if( doFocus ){ int lbl1 = sqliteVdbeMakeLabel(v); - sqliteVdbeAddOp(v, OP_AggFocus, 0, lbl1, 0, 0); + sqliteVdbeAddOp(v, OP_AggFocus, 0, lbl1); for(i=0; i<pParse->nAgg; i++){ if( pParse->aAgg[i].isAgg ) continue; sqliteExprCode(pParse, pParse->aAgg[i].pExpr); - sqliteVdbeAddOp(v, OP_AggSet, 0, i, 0, 0); + sqliteVdbeAddOp(v, OP_AggSet, 0, i); } sqliteVdbeResolveLabel(v, lbl1); } @@ -922,21 +934,21 @@ int sqliteSelect( if( !pParse->aAgg[i].isAgg ) continue; pE = pParse->aAgg[i].pExpr; if( pE==0 ){ - sqliteVdbeAddOp(v, OP_AggIncr, 1, i, 0, 0); + sqliteVdbeAddOp(v, OP_AggIncr, 1, i); continue; } assert( pE->op==TK_AGG_FUNCTION ); assert( pE->pList!=0 && pE->pList->nExpr==1 ); sqliteExprCode(pParse, pE->pList->a[0].pExpr); - sqliteVdbeAddOp(v, OP_AggGet, 0, i, 0, 0); + sqliteVdbeAddOp(v, OP_AggGet, 0, i); switch( pE->iColumn ){ case FN_Min: op = OP_Min; break; case FN_Max: op = OP_Max; break; case FN_Avg: op = OP_Add; break; case FN_Sum: op = OP_Add; break; } - sqliteVdbeAddOp(v, op, 0, 0, 0, 0); - sqliteVdbeAddOp(v, OP_AggSet, 0, i, 0, 0); + sqliteVdbeAddOp(v, op, 0, 0); + sqliteVdbeAddOp(v, OP_AggSet, 0, i); } } @@ -951,7 +963,7 @@ int sqliteSelect( if( isAgg ){ int endagg = sqliteVdbeMakeLabel(v); int startagg; - startagg = sqliteVdbeAddOp(v, OP_AggNext, 0, endagg, 0, 0); + startagg = sqliteVdbeAddOp(v, OP_AggNext, 0, endagg); pParse->useAgg = 1; if( pHaving ){ sqliteExprIfFalse(pParse, pHaving, startagg); @@ -960,8 +972,9 @@ int sqliteSelect( startagg, endagg) ){ return 1; } - sqliteVdbeAddOp(v, OP_Goto, 0, startagg, 0, 0); - sqliteVdbeAddOp(v, OP_Noop, 0, 0, 0, endagg); + sqliteVdbeAddOp(v, OP_Goto, 0, startagg); + sqliteVdbeResolveLabel(v, endagg); + sqliteVdbeAddOp(v, OP_Noop, 0, 0); pParse->useAgg = 0; } diff --git a/src/update.c b/src/update.c index db23bb6e8..f9f69fed5 100644 --- a/src/update.c +++ b/src/update.c @@ -12,7 +12,7 @@ ** This file contains C code routines that are called by the parser ** to handle UPDATE statements. ** -** $Id: update.c,v 1.17 2001/10/08 13:22:33 drh Exp $ +** $Id: update.c,v 1.18 2001/10/13 01:06:48 drh Exp $ */ #include "sqliteInt.h" @@ -136,20 +136,20 @@ void sqliteUpdate( v = sqliteGetVdbe(pParse); if( v==0 ) goto update_cleanup; if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0); - sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Transaction, 0, 0); + sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0); pParse->schemaVerified = 1; } /* Begin the database scan */ - sqliteVdbeAddOp(v, OP_ListOpen, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_ListOpen, 0, 0); pWInfo = sqliteWhereBegin(pParse, pTabList, pWhere, 1); if( pWInfo==0 ) goto update_cleanup; /* Remember the index of every item to be updated. */ - sqliteVdbeAddOp(v, OP_ListWrite, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_ListWrite, 0, 0); /* End the database scan loop. */ @@ -158,12 +158,12 @@ void sqliteUpdate( /* Rewind the list of records that need to be updated and ** open every index that needs updating. */ - sqliteVdbeAddOp(v, OP_ListRewind, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_ListRewind, 0, 0); base = pParse->nTab; openOp = pTab->isTemp ? OP_OpenWrAux : OP_OpenWrite; - sqliteVdbeAddOp(v, openOp, base, pTab->tnum, 0, 0); + sqliteVdbeAddOp(v, openOp, base, pTab->tnum); for(i=0; i<nIdx; i++){ - sqliteVdbeAddOp(v, openOp, base+i+1, apIdx[i]->tnum, 0, 0); + sqliteVdbeAddOp(v, openOp, base+i+1, apIdx[i]->tnum); } /* Loop over every record that needs updating. We have to load @@ -172,20 +172,20 @@ void sqliteUpdate( ** Also, the old data is needed to delete the old index entires. */ end = sqliteVdbeMakeLabel(v); - addr = sqliteVdbeAddOp(v, OP_ListRead, 0, end, 0, 0); - sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0); - sqliteVdbeAddOp(v, OP_MoveTo, base, 0, 0, 0); + addr = sqliteVdbeAddOp(v, OP_ListRead, 0, end); + sqliteVdbeAddOp(v, OP_Dup, 0, 0); + sqliteVdbeAddOp(v, OP_MoveTo, base, 0); /* Delete the old indices for the current record. */ for(i=0; i<nIdx; i++){ - sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Dup, 0, 0); pIdx = apIdx[i]; for(j=0; j<pIdx->nColumn; j++){ - sqliteVdbeAddOp(v, OP_Column, base, pIdx->aiColumn[j], 0, 0); + sqliteVdbeAddOp(v, OP_Column, base, pIdx->aiColumn[j]); } - sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0, 0, 0); - sqliteVdbeAddOp(v, OP_DeleteIdx, base+i+1, 0, 0, 0); + sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0); + sqliteVdbeAddOp(v, OP_DeleteIdx, base+i+1, 0); } /* Compute a completely new data for this record. @@ -193,7 +193,7 @@ void sqliteUpdate( for(i=0; i<pTab->nCol; i++){ j = aXRef[i]; if( j<0 ){ - sqliteVdbeAddOp(v, OP_Column, base, i, 0, 0); + sqliteVdbeAddOp(v, OP_Column, base, i); }else{ sqliteExprCode(pParse, pChanges->a[j].pExpr); } @@ -202,27 +202,28 @@ void sqliteUpdate( /* Insert new index entries that correspond to the new data */ for(i=0; i<nIdx; i++){ - sqliteVdbeAddOp(v, OP_Dup, pTab->nCol, 0, 0, 0); /* The KEY */ + sqliteVdbeAddOp(v, OP_Dup, pTab->nCol, 0); /* The KEY */ pIdx = apIdx[i]; for(j=0; j<pIdx->nColumn; j++){ - sqliteVdbeAddOp(v, OP_Dup, j+pTab->nCol-pIdx->aiColumn[j], 0, 0, 0); + sqliteVdbeAddOp(v, OP_Dup, j+pTab->nCol-pIdx->aiColumn[j], 0); } - sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0, 0, 0); - sqliteVdbeAddOp(v, OP_PutIdx, base+i+1, pIdx->isUnique, 0, 0); + sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0); + sqliteVdbeAddOp(v, OP_PutIdx, base+i+1, pIdx->isUnique); } /* Write the new data back into the database. */ - sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0, 0, 0); - sqliteVdbeAddOp(v, OP_Put, base, 0, 0, 0); + sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0); + sqliteVdbeAddOp(v, OP_Put, base, 0); /* Repeat the above with the next record to be updated, until ** all record selected by the WHERE clause have been updated. */ - sqliteVdbeAddOp(v, OP_Goto, 0, addr, 0, 0); - sqliteVdbeAddOp(v, OP_ListClose, 0, 0, 0, end); + sqliteVdbeAddOp(v, OP_Goto, 0, addr); + sqliteVdbeResolveLabel(v, end); + sqliteVdbeAddOp(v, OP_ListClose, 0, 0); if( (db->flags & SQLITE_InTrans)==0 ){ - sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Commit, 0, 0); } update_cleanup: diff --git a/src/vdbe.c b/src/vdbe.c index 185e539c8..2cace34e8 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -30,7 +30,7 @@ ** But other routines are also provided to help in building up ** a program instruction by instruction. ** -** $Id: vdbe.c,v 1.82 2001/10/09 04:19:47 drh Exp $ +** $Id: vdbe.c,v 1.83 2001/10/13 01:06:48 drh Exp $ */ #include "sqliteInt.h" #include <ctype.h> @@ -233,24 +233,20 @@ void sqliteVdbeTrace(Vdbe *p, FILE *trace){ ** ** op The opcode for this instruction ** -** p1, p2, p3 Three operands. +** p1, p2 First two of the three possible operands. ** -** lbl A symbolic label for this instruction. -** -** Symbolic labels are negative numbers that stand for the address -** of instructions that have yet to be coded. When the instruction -** is coded, its real address is substituted in the p2 field of -** prior and subsequent instructions that have the lbl value in -** their p2 fields. +** Use the sqliteVdbeResolveLabel() function to fix an address and +** the sqliteVdbeChangeP3() function to change the value of the P3 +** operand. */ -int sqliteVdbeAddOp(Vdbe *p, int op, int p1, int p2, const char *p3, int lbl){ - int i, j; +int sqliteVdbeAddOp(Vdbe *p, int op, int p1, int p2){ + int i; i = p->nOp; p->nOp++; if( i>=p->nOpAlloc ){ int oldSize = p->nOpAlloc; - p->nOpAlloc = p->nOpAlloc*2 + 10; + p->nOpAlloc = p->nOpAlloc*2 + 100; p->aOp = sqliteRealloc(p->aOp, p->nOpAlloc*sizeof(Op)); if( p->aOp==0 ){ p->nOp = 0; @@ -265,18 +261,8 @@ int sqliteVdbeAddOp(Vdbe *p, int op, int p1, int p2, const char *p3, int lbl){ p2 = p->aLabel[-1-p2]; } p->aOp[i].p2 = p2; - if( p3 && p3[0] ){ - p->aOp[i].p3 = sqliteStrDup(p3); - p->aOp[i].p3dyn = 1; - }else{ - p->aOp[i].p3 = 0; - } - if( lbl<0 && (-lbl)<=p->nLabel ){ - p->aLabel[-1-lbl] = i; - for(j=0; j<i; j++){ - if( p->aOp[j].p2==lbl ) p->aOp[j].p2 = i; - } - } + p->aOp[i].p3 = 0; + p->aOp[i].p3type = P3_NOTUSED; return i; } @@ -323,9 +309,11 @@ int sqliteVdbeAddOpList(Vdbe *p, int nOp, VdbeOp const *aOp){ int i; for(i=0; i<nOp; i++){ int p2 = aOp[i].p2; - if( p2<0 ) p2 = addr + ADDR(p2); - sqliteVdbeAddOp(p, aOp[i].opcode, aOp[i].p1, p2, aOp[i].p3, 0); + p->aOp[i+addr] = aOp[i]; + if( p2<0 ) p->aOp[i+addr].p2 = addr + ADDR(p2); + p->aOp[i+addr].p3type = aOp[i].p3 ? P3_STATIC : P3_NOTUSED; } + p->nOp += nOp; } return addr; } @@ -353,22 +341,33 @@ void sqliteVdbeChangeP1(Vdbe *p, int addr, int val){ ** A value of n==0 means copy bytes of zP3 up to and including the ** first null byte. If n>0 then copy n+1 bytes of zP3. ** -** If n<0 then zP3 is assumed to be a pointer to a static string. -** P3 is made to point directly to this string without any copying. +** If n==P3_STATIC it means that zP3 is a pointer to a constant static +** string we can just copy the pointer. n==P3_POINTER means zP3 is +** a pointer to some object other than a string. +** +** If addr<0 then change P3 on the most recently inserted instruction. */ void sqliteVdbeChangeP3(Vdbe *p, int addr, char *zP3, int n){ - if( p && addr>=0 && p->nOp>addr && zP3 ){ - Op *pOp = &p->aOp[addr]; - if( pOp->p3 && pOp->p3dyn ){ - sqliteFree(pOp->p3); - } - if( n<0 ){ - pOp->p3 = zP3; - pOp->p3dyn = 0; - }else{ - sqliteSetNString(&p->aOp[addr].p3, zP3, n, 0); - pOp->p3dyn = 1; - } + Op *pOp; + if( p==0 ) return; + if( addr<0 || addr>=p->nOp ){ + addr = p->nOp - 1; + if( addr<0 ) return; + } + pOp = &p->aOp[addr]; + if( pOp->p3 && pOp->p3type==P3_DYNAMIC ){ + sqliteFree(pOp->p3); + pOp->p3 = 0; + } + if( zP3==0 ){ + pOp->p3 = 0; + pOp->p3type = P3_NOTUSED; + }else if( n<0 ){ + pOp->p3 = zP3; + pOp->p3type = n; + }else{ + sqliteSetNString(&pOp->p3, zP3, n, 0); + pOp->p3type = P3_DYNAMIC; } } @@ -386,11 +385,12 @@ void sqliteVdbeDequoteP3(Vdbe *p, int addr){ if( addr<0 || addr>=p->nOp ) return; pOp = &p->aOp[addr]; if( pOp->p3==0 || pOp->p3[0]==0 ) return; - if( !pOp->p3dyn ){ + if( pOp->p3type==P3_POINTER ) return; + if( pOp->p3type!=P3_DYNAMIC ){ pOp->p3 = sqliteStrDup(pOp->p3); - pOp->p3dyn = 1; + pOp->p3type = P3_DYNAMIC; } - if( pOp->p3 ) sqliteDequote(pOp->p3); + sqliteDequote(pOp->p3); } /* @@ -404,9 +404,11 @@ void sqliteVdbeCompressSpace(Vdbe *p, int addr){ Op *pOp; if( addr<0 || addr>=p->nOp ) return; pOp = &p->aOp[addr]; - if( !pOp->p3dyn ){ + if( pOp->p3type!=P3_DYNAMIC ){ pOp->p3 = sqliteStrDup(pOp->p3); - pOp->p3dyn = 1; + pOp->p3type = P3_DYNAMIC; + }else if( pOp->p3type!=P3_STATIC ){ + return; } z = pOp->p3; if( z==0 ) return; @@ -770,7 +772,7 @@ void sqliteVdbeDelete(Vdbe *p){ p->nOp = 0; } for(i=0; i<p->nOp; i++){ - if( p->aOp[i].p3dyn ){ + if( p->aOp[i].p3type==P3_DYNAMIC ){ sqliteFree(p->aOp[i].p3); } } @@ -873,7 +875,7 @@ int sqliteVdbeList( sprintf(zAddr,"%d",i); sprintf(zP1,"%d", p->aOp[i].p1); sprintf(zP2,"%d", p->aOp[i].p2); - azValue[4] = p->aOp[i].p3; + azValue[4] = p->aOp[i].p3type!=P3_POINTER ? p->aOp[i].p3 : ""; azValue[1] = zOpName[p->aOp[i].opcode]; if( xCallback(pArg, 5, azValue, azColumnNames) ){ rc = SQLITE_ABORT; @@ -2871,7 +2873,7 @@ case OP_CreateTable: { int i = ++p->tos; int pgno; VERIFY( if( NeedStack(p, p->tos) ) goto no_mem; ) - assert( pOp->p3!=0 && pOp->p3dyn==0 ); + assert( pOp->p3!=0 && pOp->p3type==P3_POINTER ); rc = sqliteBtreeCreateTable(pOp->p2 ? db->pBeTemp : pBt, &pgno); if( rc==SQLITE_OK ){ aStack[i].i = pgno; diff --git a/src/vdbe.h b/src/vdbe.h index b70c5c6b9..69a1eaa11 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -15,7 +15,7 @@ ** or VDBE. The VDBE implements an abstract machine that runs a ** simple program to access and modify the underlying database. ** -** $Id: vdbe.h,v 1.27 2001/10/12 17:30:05 drh Exp $ +** $Id: vdbe.h,v 1.28 2001/10/13 01:06:49 drh Exp $ */ #ifndef _SQLITE_VDBE_H_ #define _SQLITE_VDBE_H_ @@ -38,11 +38,19 @@ struct VdbeOp { int p1; /* First operand */ int p2; /* Second parameter (often the jump destination) */ char *p3; /* Third parameter */ - int p3dyn; /* True if p3 is malloced. False if it is static */ + int p3type; /* P3_STATIC, P3_DYNAMIC or P3_POINTER */ }; typedef struct VdbeOp VdbeOp; /* +** Allowed values of VdbeOp.p3type +*/ +#define P3_NOTUSED 0 /* The P3 parameter is not used */ +#define P3_DYNAMIC 1 /* Pointer to a string obtained from sqliteMalloc() */ +#define P3_STATIC (-1) /* Pointer to a static string */ +#define P3_POINTER (-2) /* P3 is a pointer to some structure or object */ + +/* ** The following macro converts a relative address in the p2 field ** of a VdbeOp structure into a negative number so that ** sqliteVdbeAddOpList() knows that the address is relative. Calling @@ -199,7 +207,7 @@ typedef struct VdbeOp VdbeOp; */ Vdbe *sqliteVdbeCreate(sqlite*); void sqliteVdbeCreateCallback(Vdbe*, int*); -int sqliteVdbeAddOp(Vdbe*,int,int,int,const char*,int); +int sqliteVdbeAddOp(Vdbe*,int,int,int); int sqliteVdbeAddOpList(Vdbe*, int nOp, VdbeOp const *aOp); void sqliteVdbeChangeP1(Vdbe*, int addr, int P1); void sqliteVdbeChangeP3(Vdbe*, int addr, char *zP1, int N); diff --git a/src/where.c b/src/where.c index 971e20a2c..b63bc059a 100644 --- a/src/where.c +++ b/src/where.c @@ -13,7 +13,7 @@ ** the WHERE clause of SQL statements. Also found here are subroutines ** to generate VDBE code to evaluate expressions. ** -** $Id: where.c,v 1.22 2001/10/08 13:22:33 drh Exp $ +** $Id: where.c,v 1.23 2001/10/13 01:06:49 drh Exp $ */ #include "sqliteInt.h" @@ -290,15 +290,16 @@ WhereInfo *sqliteWhereBegin( pTab = pTabList->a[i].pTab; openOp = pTab->isTemp ? OP_OpenAux : OP_Open; - sqliteVdbeAddOp(v, openOp, base+i, pTab->tnum, pTab->zName, 0); + sqliteVdbeAddOp(v, openOp, base+i, 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, 0, 0); + sqliteVdbeAddOp(v, OP_VerifyCookie, pParse->db->schema_cookie, 0); pParse->schemaVerified = 1; } if( i<ARRAYSIZE(aIdx) && aIdx[i]!=0 ){ - sqliteVdbeAddOp(v, openOp, base+pTabList->nId+i, aIdx[i]->tnum, - aIdx[i]->zName, 0); + sqliteVdbeAddOp(v, openOp, base+pTabList->nId+i, aIdx[i]->tnum); + sqliteVdbeChangeP3(v, -1, aIdx[i]->zName, P3_STATIC); } } memcpy(pWInfo->aIdx, aIdx, sizeof(aIdx)); @@ -344,20 +345,21 @@ WhereInfo *sqliteWhereBegin( break; } } - sqliteVdbeAddOp(v, OP_AddImm, 0, 0, 0, 0); + sqliteVdbeAddOp(v, OP_AddImm, 0, 0); if( i==pTabList->nId-1 && pushKey ){ haveKey = 1; }else{ - sqliteVdbeAddOp(v, OP_NotFound, base+idx, brk, 0, 0); + sqliteVdbeAddOp(v, OP_NotFound, base+idx, brk); haveKey = 0; } }else if( pIdx==0 ){ /* Case 2: There was no usable index. We must do a complete ** scan of the table. */ - sqliteVdbeAddOp(v, OP_Rewind, base+idx, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Rewind, base+idx, 0); cont = sqliteVdbeMakeLabel(v); - sqliteVdbeAddOp(v, OP_Next, base+idx, brk, 0, cont); + sqliteVdbeResolveLabel(v, cont); + sqliteVdbeAddOp(v, OP_Next, base+idx, brk); haveKey = 0; }else{ /* Case 3: We do have a usable index in pIdx. @@ -384,13 +386,14 @@ WhereInfo *sqliteWhereBegin( } } } - sqliteVdbeAddOp(v, OP_MakeKey, pIdx->nColumn, 0, 0, 0); - sqliteVdbeAddOp(v, OP_BeginIdx, base+pTabList->nId+i, 0, 0, 0); - sqliteVdbeAddOp(v, OP_NextIdx, base+pTabList->nId+i, brk, 0, cont); + sqliteVdbeAddOp(v, OP_MakeKey, pIdx->nColumn, 0); + sqliteVdbeAddOp(v, OP_BeginIdx, base+pTabList->nId+i, 0); + sqliteVdbeResolveLabel(v, cont); + sqliteVdbeAddOp(v, OP_NextIdx, base+pTabList->nId+i, brk); if( i==pTabList->nId-1 && pushKey ){ haveKey = 1; }else{ - sqliteVdbeAddOp(v, OP_MoveTo, base+idx, 0, 0, 0); + sqliteVdbeAddOp(v, OP_MoveTo, base+idx, 0); haveKey = 0; } } @@ -405,7 +408,7 @@ WhereInfo *sqliteWhereBegin( if( (aExpr[j].prereqLeft & loopMask)!=aExpr[j].prereqLeft ) continue; if( haveKey ){ haveKey = 0; - sqliteVdbeAddOp(v, OP_MoveTo, base+idx, 0, 0, 0); + sqliteVdbeAddOp(v, OP_MoveTo, base+idx, 0); } sqliteExprIfFalse(pParse, aExpr[j].p, cont); aExpr[j].p = 0; @@ -414,7 +417,7 @@ WhereInfo *sqliteWhereBegin( } pWInfo->iContinue = cont; if( pushKey && !haveKey ){ - sqliteVdbeAddOp(v, OP_Recno, base, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Recno, base, 0); } sqliteFree(aOrder); return pWInfo; @@ -429,16 +432,18 @@ void sqliteWhereEnd(WhereInfo *pWInfo){ int brk = pWInfo->iBreak; int base = pWInfo->base; - sqliteVdbeAddOp(v, OP_Goto, 0, pWInfo->iContinue, 0, 0); + sqliteVdbeAddOp(v, OP_Goto, 0, pWInfo->iContinue); for(i=0; i<pWInfo->pTabList->nId; i++){ - sqliteVdbeAddOp(v, OP_Close, base+i, 0, 0, brk); + sqliteVdbeResolveLabel(v, brk); + sqliteVdbeAddOp(v, OP_Close, base+i, 0); brk = 0; if( i<ARRAYSIZE(pWInfo->aIdx) && pWInfo->aIdx[i]!=0 ){ - sqliteVdbeAddOp(v, OP_Close, base+pWInfo->pTabList->nId+i, 0, 0, 0); + sqliteVdbeAddOp(v, OP_Close, base+pWInfo->pTabList->nId+i, 0); } } if( brk!=0 ){ - sqliteVdbeAddOp(v, OP_Noop, 0, 0, 0, brk); + sqliteVdbeResolveLabel(v, brk); + sqliteVdbeAddOp(v, OP_Noop, 0, 0); } sqliteFree(pWInfo); return; |