From: drh Date: Sun, 22 Feb 2004 20:05:00 +0000 (+0000) Subject: Use sqliteVdbeOp3 instead of sqliteVdbeChangeP3 where applicable. (CVS 1266) X-Git-Tag: version-3.6.10~4802 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=701a0aebe265adae96e0cab54bfba8052ebdfac5;p=thirdparty%2Fsqlite.git Use sqliteVdbeOp3 instead of sqliteVdbeChangeP3 where applicable. (CVS 1266) FossilOrigin-Name: 51f1e8f7539596b33bc3365ec8f34041602d049c --- diff --git a/manifest b/manifest index 56ffe640a4..b589074932 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Code\scleanup\sin\sbuild.c.\s(CVS\s1265) -D 2004-02-22T18:56:49 +C Use\ssqliteVdbeOp3\sinstead\sof\ssqliteVdbeChangeP3\swhere\sapplicable.\s(CVS\s1266) +D 2004-02-22T20:05:01 F Makefile.in cfd75c46b335881999333a9e4b982fa8491f200b F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd @@ -27,16 +27,16 @@ F src/auth.c 4fa3b05bd19445d1c474d6751c4a508d6ea0abe1 F src/btree.c 0a40efb01fa3a431a16d8604f603431d8c9cebfa F src/btree.h 41cb3ff6ebc3f6da2d0a074e39ff8c7a2287469f F src/btree_rb.c 32b2cb4285c0fbd53b89de021637b63d52257e54 -F src/build.c dbeef48d1f6f134d8a3de9f9bb6928812c3fbfee +F src/build.c 85dee2c7d23f618b9c5384091df00cbf64cce527 F src/copy.c 391ce142f6b1faa093867ecee134f61a5028a9af F src/date.c 3025642cee50d5c41aef4a22cbc41aa7e543c922 F src/delete.c 8e2ff752bf485906effcc64f267cdd7227463567 F src/encode.c 9e70ea1e4e746f23f18180949e94f1bb1c2220d3 -F src/expr.c 86eaf80e4d893ba184afc965a53a8dffda209ad4 +F src/expr.c 61b71ce2e93b0faca39db9e9c06e9a089d25a04f F src/func.c a2265f29e6a286203c9dfeb835d9a50439617805 F src/hash.c 9b56ef3b291e25168f630d5643a4264ec011c70e F src/hash.h 3247573ab95b9dd90bcca0307a75d9a16da1ccc7 -F src/insert.c ad2902c171d23b92e2b350db2da86e36062e044b +F src/insert.c c59f59fb461ad7f8939df289915669c04632edba F src/main.c 0f77633b37540fabd45e68c5137f32f4cd99470a F src/md5.c fe4f9c9c6f71dfc26af8da63e4d04489b1430565 F src/os.c f5fc4954725b2fcd852979f2746085fe8ca27710 @@ -44,10 +44,10 @@ F src/os.h 250a3789be609adfee5c5aa20137ce8683276f24 F src/pager.c 29ddad4dd454f0aaa98e2bcd327710ab9f02f833 F src/pager.h 82332878799280145639a48d88cdb4058925e3f6 F src/parse.y 023720cb8c3bef74e51738bca78335d0dc6d2cfd -F src/pragma.c a8d43661193ba3114da787f43969d0a34f0ed07c +F src/pragma.c 621d319580e9e23712ec232e8be1786cdae06b36 F src/printf.c f201a5a316afc474d29d51e07501536e8998194d F src/random.c 775913e0b7fbd6295d21f12a7bd35b46387c44b2 -F src/select.c 9a41dace754f0dab5e991e402c05fa3c24d04f19 +F src/select.c 902000034e44817e2822d72870c15eff842dea9e F src/shell.c c3d3404fa82bb0808444fda9884d1bb572fd18b9 F src/sqlite.h.in 64f016cd5ce190643a0f47760188fdf4e0b2227e F src/sqliteInt.h a3e8f422803abf1e6ba07e15ffe5070a50f8b5e5 @@ -59,14 +59,14 @@ F src/test3.c 30985ebdfaf3ee1462a9b0652d3efbdc8d9798f5 F src/test4.c dcbbbb382626fd466a7c46907f74db35fc8bad64 F src/tokenize.c 6676b946fd8825b67ab52140af4fdc57a70bda48 F src/trigger.c a9927b57c865b6f3df3fb5e40c9824d722660ded -F src/update.c e6eed1a4a429cc28f57533365c72293794c904cf +F src/update.c 4c50328ebc127852bde8e2950eb8933234802c21 F src/util.c 122bc174f6c8c2eb6a9127d9f13c4c74f83b85e4 F src/vacuum.c d9e80c2b36ee1f623dbf1bdf3cedad24a23f87ac F src/vdbe.c af187d86cb1bcc1ead227245350d1693c28c77a2 -F src/vdbe.h b1b22ffca48f593d375fd846c583679d49c2e5c9 +F src/vdbe.h ac987945e4dd6f987bca534c6005899f089fc270 F src/vdbeInt.h b40ff02ce39fd076e6ff3369e19c1bbfe1986682 -F src/vdbeaux.c 88ebe3aa963478f3cee9fb6e3d8ca9db1bafacb2 -F src/where.c 6ac293e94aa3e662ec74f6b48d2ef5e341a30cdd +F src/vdbeaux.c e2cdd1ab63604a390612c73e26bdd2ef910e9438 +F src/where.c b58764861a96bab3f1d294200f9e53519b92c274 F test/all.test 569a92a8ee88f5300c057cc4a8f50fbbc69a3242 F test/attach.test ba8261d38da6b6a7d4f78ec543c548c4418582ef F test/attach2.test ce61e6185b3cd891cc0e9a4c868fcc65eb92fc55 @@ -189,7 +189,7 @@ F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604 F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1 F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4 -P 69aac043af7f93e7b3f036622c0ac9261cae1839 -R 31316bc136a82339f6877cfbb462944f +P 9211e14cf81f4de125bad246d8a289786f2854aa +R 77ff7dbcb5fd6ddb4e286234c013c859 U drh -Z c273a71cca2efed399051894b17dbdca +Z 751f59f1e75cd541f38cd5d5979c86ff diff --git a/manifest.uuid b/manifest.uuid index 0bf02868ab..ec8fcee41f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9211e14cf81f4de125bad246d8a289786f2854aa \ No newline at end of file +51f1e8f7539596b33bc3365ec8f34041602d049c \ No newline at end of file diff --git a/src/build.c b/src/build.c index 934ea57c9c..d367e40213 100644 --- a/src/build.c +++ b/src/build.c @@ -23,7 +23,7 @@ ** ROLLBACK ** PRAGMA ** -** $Id: build.c,v 1.173 2004/02/22 18:56:49 drh Exp $ +** $Id: build.c,v 1.174 2004/02/22 20:05:01 drh Exp $ */ #include "sqliteInt.h" #include @@ -928,24 +928,16 @@ 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->iDb); - sqliteVdbeChangeP3(v, -1, (char *)&p->tnum, P3_POINTER); + sqliteVdbeOp3(v, OP_CreateTable, 0, p->iDb, (char*)&p->tnum, P3_POINTER); }else{ /* A view */ sqliteVdbeAddOp(v, OP_Integer, 0, 0); } p->tnum = 0; sqliteVdbeAddOp(v, OP_Pull, 1, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0); - if( p->pSelect==0 ){ - sqliteVdbeChangeP3(v, -1, "table", P3_STATIC); - }else{ - sqliteVdbeChangeP3(v, -1, "view", P3_STATIC); - } - sqliteVdbeAddOp(v, OP_String, 0, 0); - sqliteVdbeChangeP3(v, -1, p->zName, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0); - sqliteVdbeChangeP3(v, -1, p->zName, 0); + sqliteVdbeOp3(v, OP_String, 0, 0, p->pSelect==0?"table":"view", P3_STATIC); + sqliteVdbeOp3(v, OP_String, 0, 0, p->zName, 0); + sqliteVdbeOp3(v, OP_String, 0, 0, p->zName, 0); sqliteVdbeAddOp(v, OP_Dup, 4, 0); sqliteVdbeAddOp(v, OP_String, 0, 0); if( pSelect ){ @@ -1133,12 +1125,12 @@ int sqliteViewGetColumnNames(Parse *pParse, Table *pTable){ */ static void sqliteViewResetColumnNames(Table *pTable){ int i; - if( pTable==0 || pTable->pSelect==0 ) return; - if( pTable->nCol==0 ) return; - for(i=0; inCol; i++){ - sqliteFree(pTable->aCol[i].zName); - sqliteFree(pTable->aCol[i].zDflt); - sqliteFree(pTable->aCol[i].zType); + Column *pCol; + assert( pTable!=0 && pTable->pSelect!=0 ); + for(i=0, pCol=pTable->aCol; inCol; i++, pCol++){ + sqliteFree(pCol->zName); + sqliteFree(pCol->zDflt); + sqliteFree(pCol->zType); } sqliteFree(pTable->aCol); pTable->aCol = 0; @@ -1700,19 +1692,17 @@ void sqliteCreateIndex( sqliteOpenMasterTable(v, isTemp); } 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, strlen(pIndex->zName)); - sqliteVdbeAddOp(v, OP_String, 0, 0); - sqliteVdbeChangeP3(v, -1, pTab->zName, 0); - addr = sqliteVdbeAddOp(v, OP_CreateIndex, 0, isTemp); - sqliteVdbeChangeP3(v, addr, (char*)&pIndex->tnum, P3_POINTER); + sqliteVdbeOp3(v, OP_String, 0, 0, "index", P3_STATIC); + sqliteVdbeOp3(v, OP_String, 0, 0, pIndex->zName, 0); + sqliteVdbeOp3(v, OP_String, 0, 0, pTab->zName, 0); + sqliteVdbeOp3(v, OP_CreateIndex, 0, isTemp,(char*)&pIndex->tnum,P3_POINTER); pIndex->tnum = 0; if( pTable ){ - sqliteVdbeAddOp(v, OP_Dup, 0, 0); - sqliteVdbeAddOp(v, OP_Integer, isTemp, 0); - sqliteVdbeAddOp(v, OP_OpenWrite, 1, 0); + sqliteVdbeCode(v, + OP_Dup, 0, 0, + OP_Integer, isTemp, 0, + OP_OpenWrite, 1, 0, + 0); } addr = sqliteVdbeAddOp(v, OP_String, 0, 0); if( pStart && pEnd ){ @@ -1723,8 +1713,7 @@ void sqliteCreateIndex( sqliteVdbeAddOp(v, OP_PutIntKey, 0, 0); if( pTable ){ sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0); - sqliteVdbeAddOp(v, OP_OpenRead, 2, pTab->tnum); - sqliteVdbeChangeP3(v, -1, pTab->zName, 0); + sqliteVdbeOp3(v, OP_OpenRead, 2, pTab->tnum, pTab->zName, 0); lbl2 = sqliteVdbeMakeLabel(v); sqliteVdbeAddOp(v, OP_Rewind, 2, lbl2); lbl1 = sqliteVdbeAddOp(v, OP_Recno, 2, 0); @@ -1738,8 +1727,8 @@ void sqliteCreateIndex( } sqliteVdbeAddOp(v, OP_MakeIdxKey, pIndex->nColumn, 0); if( db->file_format>=4 ) sqliteAddIdxKeyType(v, pIndex); - sqliteVdbeAddOp(v, OP_IdxPut, 1, pIndex->onError!=OE_None); - sqliteVdbeChangeP3(v, -1, "indexed columns are not unique", P3_STATIC); + sqliteVdbeOp3(v, OP_IdxPut, 1, pIndex->onError!=OE_None, + "indexed columns are not unique", P3_STATIC); sqliteVdbeAddOp(v, OP_Next, 2, lbl1); sqliteVdbeResolveLabel(v, lbl2); sqliteVdbeAddOp(v, OP_Close, 2, 0); diff --git a/src/expr.c b/src/expr.c index 3daa2b20c3..7b96ad3f90 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.110 2004/02/22 18:40:57 drh Exp $ +** $Id: expr.c,v 1.111 2004/02/22 20:05:01 drh Exp $ */ #include "sqliteInt.h" #include @@ -717,9 +717,10 @@ int sqliteExprResolveIds( case TK_FLOAT: case TK_INTEGER: case TK_STRING: { - int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); + int addr; assert( pE2->token.z ); - sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n); + addr = sqliteVdbeOp3(v, OP_SetInsert, iSet, 0, + pE2->token.z, pE2->token.n); sqliteVdbeDequoteP3(v, addr); break; } @@ -1166,8 +1167,7 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){ for(i=0; ia[i].pExpr); } - sqliteVdbeAddOp(v, OP_Function, nExpr, 0); - sqliteVdbeChangeP3(v, -1, (char*)pDef, P3_POINTER); + sqliteVdbeOp3(v, OP_Function, nExpr, 0, (char*)pDef, P3_POINTER); break; } case TK_SELECT: { @@ -1257,15 +1257,13 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){ if( pExpr->iColumn == OE_Rollback || pExpr->iColumn == OE_Abort || pExpr->iColumn == OE_Fail ){ - char * msg = sqliteStrNDup(pExpr->token.z, pExpr->token.n); - sqliteVdbeAddOp(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn); - sqliteDequote(msg); - sqliteVdbeChangeP3(v, -1, msg, 0); - sqliteFree(msg); + sqliteVdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn, + pExpr->token.z, pExpr->token.n); + sqliteVdbeDequoteP3(v, -1); } else { assert( pExpr->iColumn == OE_Ignore ); - sqliteVdbeAddOp(v, OP_Goto, 0, pParse->trigStack->ignoreJump); - sqliteVdbeChangeP3(v, -1, "(IGNORE jump)", 0); + sqliteVdbeOp3(v, OP_Goto, 0, pParse->trigStack->ignoreJump, + "(IGNORE jump)", 0); } } break; diff --git a/src/insert.c b/src/insert.c index 679502e65a..9f3a747efb 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.92 2004/02/20 22:53:39 rdc Exp $ +** $Id: insert.c,v 1.93 2004/02/22 20:05:01 drh Exp $ */ #include "sqliteInt.h" @@ -331,12 +331,11 @@ void sqliteInsert( if( !row_triggers_exist ){ base = pParse->nTab; sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0); - sqliteVdbeAddOp(v, OP_OpenWrite, base, pTab->tnum); - sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC); + sqliteVdbeOp3(v, OP_OpenWrite, base, pTab->tnum, 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); + sqliteVdbeOp3(v, OP_OpenWrite, idx+base, pIdx->tnum, + pIdx->zName, P3_STATIC); } pParse->nTab += idx; } @@ -391,8 +390,7 @@ void sqliteInsert( } } if( pColumn && j>=pColumn->nId ){ - sqliteVdbeAddOp(v, OP_String, 0, 0); - sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zDflt, P3_STATIC); + sqliteVdbeOp3(v, OP_String, 0, 0, pTab->aCol[i].zDflt, P3_STATIC); }else if( useTempTable ){ sqliteVdbeAddOp(v, OP_Column, srcTab, j); }else if( pSelect ){ @@ -417,12 +415,11 @@ void sqliteInsert( 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); + sqliteVdbeOp3(v, OP_OpenWrite, base, pTab->tnum, 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); + sqliteVdbeOp3(v, OP_OpenWrite, idx+base, pIdx->tnum, + pIdx->zName, P3_STATIC); } pParse->nTab += idx; } @@ -472,8 +469,7 @@ void sqliteInsert( } } if( pColumn && j>=pColumn->nId ){ - sqliteVdbeAddOp(v, OP_String, 0, 0); - sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zDflt, P3_STATIC); + sqliteVdbeOp3(v, OP_String, 0, 0, pTab->aCol[i].zDflt, P3_STATIC); }else if( useTempTable ){ sqliteVdbeAddOp(v, OP_Column, srcTab, j); }else if( pSelect ){ @@ -542,8 +538,7 @@ void sqliteInsert( ** Return the number of rows inserted. */ if( db->flags & SQLITE_CountRows ){ - sqliteVdbeAddOp(v, OP_ColumnName, 0, 1); - sqliteVdbeChangeP3(v, -1, "rows inserted", P3_STATIC); + sqliteVdbeOp3(v, OP_ColumnName, 0, 1, "rows inserted", P3_STATIC); sqliteVdbeAddOp(v, OP_MemLoad, iCntMem, 0); sqliteVdbeAddOp(v, OP_Callback, 1, 0); } @@ -699,8 +694,7 @@ void sqliteGenerateConstraintChecks( break; } case OE_Replace: { - sqliteVdbeAddOp(v, OP_String, 0, 0); - sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zDflt, P3_STATIC); + sqliteVdbeOp3(v, OP_String, 0, 0, pTab->aCol[i].zDflt, P3_STATIC); sqliteVdbeAddOp(v, OP_Push, nCol-i, 0); break; } @@ -742,8 +736,8 @@ void sqliteGenerateConstraintChecks( case OE_Rollback: case OE_Abort: case OE_Fail: { - sqliteVdbeAddOp(v, OP_Halt, SQLITE_CONSTRAINT, onError); - sqliteVdbeChangeP3(v, -1, "PRIMARY KEY must be unique", P3_STATIC); + sqliteVdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, onError, + "PRIMARY KEY must be unique", P3_STATIC); break; } case OE_Replace: { @@ -840,8 +834,7 @@ void sqliteGenerateConstraintChecks( } strcpy(&zErrMsg[n1], pIdx->nColumn>1 ? " are not unique" : " is not unique"); - sqliteVdbeAddOp(v, OP_Halt, SQLITE_CONSTRAINT, onError); - sqliteVdbeChangeP3(v, -1, sqliteStrDup(zErrMsg), P3_DYNAMIC); + sqliteVdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, onError, zErrMsg, 0); break; } case OE_Ignore: { diff --git a/src/pragma.c b/src/pragma.c index c350018f3b..d9cf6354ae 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -11,7 +11,7 @@ ************************************************************************* ** This file contains code used to implement the PRAGMA command. ** -** $Id: pragma.c,v 1.17 2004/02/21 14:00:29 drh Exp $ +** $Id: pragma.c,v 1.18 2004/02/22 20:05:01 drh Exp $ */ #include "sqliteInt.h" #include @@ -106,12 +106,11 @@ static int flagPragma(Parse *pParse, const char *zLeft, const char *zRight){ sqlite *db = pParse->db; Vdbe *v; if( strcmp(zLeft,zRight)==0 && (v = sqliteGetVdbe(pParse))!=0 ){ - sqliteVdbeAddOp(v, OP_ColumnName, 0, 1); - sqliteVdbeChangeP3(v, -1, aPragma[i].zName, P3_STATIC); - sqliteVdbeAddOp(v, OP_ColumnName, 1, 0); - sqliteVdbeChangeP3(v, -1, "boolean", P3_STATIC); - sqliteVdbeAddOp(v, OP_Integer, (db->flags & aPragma[i].mask)!=0, 0); - sqliteVdbeAddOp(v, OP_Callback, 1, 0); + sqliteVdbeOp3(v, OP_ColumnName, 0, 1, aPragma[i].zName, P3_STATIC); + sqliteVdbeOp3(v, OP_ColumnName, 1, 0, "boolean", P3_STATIC); + sqliteVdbeCode(v, OP_Integer, (db->flags & aPragma[i].mask)!=0, 0, + OP_Callback, 1, 0, + 0); }else if( getBoolean(zRight) ){ db->flags |= aPragma[i].mask; }else{ @@ -358,14 +357,12 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){ sqliteViewGetColumnNames(pParse, pTab); for(i=0; inCol; 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); + sqliteVdbeOp3(v, OP_String, 0, 0, pTab->aCol[i].zName, 0); + sqliteVdbeOp3(v, OP_String, 0, 0, + pTab->aCol[i].zType ? pTab->aCol[i].zType : "numeric", 0); sqliteVdbeAddOp(v, OP_Integer, pTab->aCol[i].notNull, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0); - sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zDflt, P3_STATIC); + sqliteVdbeOp3(v, OP_String, 0, 0, + pTab->aCol[i].zDflt, P3_STATIC); sqliteVdbeAddOp(v, OP_Integer, pTab->aCol[i].isPrimKey, 0); sqliteVdbeAddOp(v, OP_Callback, 6, 0); } @@ -389,9 +386,8 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){ 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); + sqliteVdbeOp3(v, OP_String, 0, 0, pTab->aCol[cnum].zName, 0); sqliteVdbeAddOp(v, OP_Callback, 3, 0); } } @@ -416,8 +412,7 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){ 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); + sqliteVdbeOp3(v, OP_String, 0, 0, pIdx->zName, 0); sqliteVdbeAddOp(v, OP_Integer, pIdx->onError!=OE_None, 0); sqliteVdbeAddOp(v, OP_Callback, 3, 0); ++i; @@ -450,13 +445,10 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){ for(j=0; jnCol; j++){ sqliteVdbeAddOp(v, OP_Integer, i, 0); sqliteVdbeAddOp(v, OP_Integer, j, 0); - sqliteVdbeAddOp(v, OP_String, 0, 0); - sqliteVdbeChangeP3(v, -1, pFK->zTo, P3_STATIC); - sqliteVdbeAddOp(v, OP_String, 0, 0); - sqliteVdbeChangeP3(v, -1, pTab->aCol[pFK->aCol[j].iFrom].zName, - P3_STATIC); - sqliteVdbeAddOp(v, OP_String, 0, 0); - sqliteVdbeChangeP3(v, -1, pFK->aCol[j].zCol, P3_STATIC); + sqliteVdbeOp3(v, OP_String, 0, 0, pFK->zTo, 0); + sqliteVdbeOp3(v, OP_String, 0, 0, + pTab->aCol[pFK->aCol[j].iFrom].zName, 0); + sqliteVdbeOp3(v, OP_String, 0, 0, pFK->aCol[j].zCol, 0); sqliteVdbeAddOp(v, OP_Callback, 5, 0); } ++i; @@ -478,11 +470,9 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){ 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_String, 0, 0); - sqliteVdbeChangeP3(v, -1, sqliteBtreeGetFilename(db->aDb[i].pBt), - P3_STATIC); + sqliteVdbeOp3(v, OP_String, 0, 0, db->aDb[i].zName, 0); + sqliteVdbeOp3(v, OP_String, 0, 0, + sqliteBtreeGetFilename(db->aDb[i].pBt), 0); sqliteVdbeAddOp(v, OP_Callback, 3, 0); } }else @@ -633,13 +623,11 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){ if( pTab->pIndex==0 ) continue; sqliteVdbeAddOp(v, OP_Integer, i, 0); - sqliteVdbeAddOp(v, OP_OpenRead, 1, pTab->tnum); - sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC); + sqliteVdbeOp3(v, OP_OpenRead, 1, pTab->tnum, pTab->zName, 0); for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ if( pIdx->tnum==0 ) continue; sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0); - sqliteVdbeAddOp(v, OP_OpenRead, j+2, pIdx->tnum); - sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC); + sqliteVdbeOp3(v, OP_OpenRead, j+2, pIdx->tnum, pIdx->zName, 0); } sqliteVdbeAddOp(v, OP_Integer, 0, 0); sqliteVdbeAddOp(v, OP_MemStore, 1, 1); diff --git a/src/select.c b/src/select.c index 149eecae12..1a8886686a 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.157 2004/02/20 14:50:58 drh Exp $ +** $Id: select.c,v 1.158 2004/02/22 20:05:01 drh Exp $ */ #include "sqliteInt.h" @@ -338,9 +338,7 @@ static void pushOntoSorter(Parse *pParse, Vdbe *v, ExprList *pOrderBy){ sqliteExprCode(pParse, pOrderBy->a[i].pExpr); } zSortOrder[pOrderBy->nExpr] = 0; - sqliteVdbeAddOp(v, OP_SortMakeKey, pOrderBy->nExpr, 0); - sqliteVdbeChangeP3(v, -1, zSortOrder, strlen(zSortOrder)); - sqliteFree(zSortOrder); + sqliteVdbeOp3(v, OP_SortMakeKey, pOrderBy->nExpr, 0, zSortOrder, P3_DYNAMIC); sqliteVdbeAddOp(v, OP_SortPut, 0, 0); } @@ -363,8 +361,7 @@ void sqliteAddKeyType(Vdbe *v, ExprList *pEList){ zType[i] = sqliteExprType(pEList->a[i].pExpr)==SQLITE_SO_NUM ? 'n' : 't'; } zType[i] = 0; - sqliteVdbeChangeP3(v, -1, zType, nColumn); - sqliteFree(zType); + sqliteVdbeChangeP3(v, -1, zType, P3_DYNAMIC); } /* @@ -672,8 +669,7 @@ static void generateColumnTypes( zType = "NUMERIC"; } } - sqliteVdbeAddOp(v, OP_ColumnName, i + pEList->nExpr, 0); - sqliteVdbeChangeP3(v, -1, zType, 0); + sqliteVdbeOp3(v, OP_ColumnName, i + pEList->nExpr, 0, zType, 0); } } @@ -704,8 +700,7 @@ static void generateColumnNames( if( p==0 ) continue; if( pEList->a[i].zName ){ char *zName = pEList->a[i].zName; - sqliteVdbeAddOp(v, OP_ColumnName, i, p2); - sqliteVdbeChangeP3(v, -1, zName, strlen(zName)); + sqliteVdbeOp3(v, OP_ColumnName, i, p2, zName, 0); continue; } if( p->op==TK_COLUMN && pTabList ){ @@ -723,8 +718,7 @@ static void generateColumnNames( zCol = pTab->aCol[iCol].zName; } if( !shortNames && !fullNames && p->span.z && p->span.z[0] ){ - int addr = sqliteVdbeAddOp(v,OP_ColumnName, i, p2); - sqliteVdbeChangeP3(v, -1, p->span.z, p->span.n); + int addr = sqliteVdbeOp3(v,OP_ColumnName, i, p2, p->span.z, p->span.n); sqliteVdbeCompressSpace(v, addr); }else if( fullNames || (!shortNames && pTabList->nSrc>1) ){ char *zName = 0; @@ -733,23 +727,18 @@ static void generateColumnNames( zTab = pTabList->a[j].zAlias; if( fullNames || zTab==0 ) zTab = pTab->zName; sqliteSetString(&zName, zTab, ".", zCol, 0); - sqliteVdbeAddOp(v, OP_ColumnName, i, p2); - sqliteVdbeChangeP3(v, -1, zName, strlen(zName)); - sqliteFree(zName); + sqliteVdbeOp3(v, OP_ColumnName, i, p2, zName, P3_DYNAMIC); }else{ - sqliteVdbeAddOp(v, OP_ColumnName, i, p2); - sqliteVdbeChangeP3(v, -1, zCol, 0); + sqliteVdbeOp3(v, OP_ColumnName, i, p2, zCol, 0); } }else if( p->span.z && p->span.z[0] ){ - int addr = sqliteVdbeAddOp(v,OP_ColumnName, i, p2); - sqliteVdbeChangeP3(v, -1, p->span.z, p->span.n); + int addr = sqliteVdbeOp3(v,OP_ColumnName, i, p2, p->span.z, p->span.n); sqliteVdbeCompressSpace(v, addr); }else{ char zName[30]; assert( p->op!=TK_COLUMN || pTabList==0 ); sprintf(zName, "column%d", i+1); - sqliteVdbeAddOp(v, OP_ColumnName, i, p2); - sqliteVdbeChangeP3(v, -1, zName, strlen(zName)); + sqliteVdbeOp3(v, OP_ColumnName, i, p2, zName, 0); } } } @@ -1910,15 +1899,13 @@ static int simpleMinMaxQuery(Parse *pParse, Select *p, int eDest, int iParm){ base = p->pSrc->a[0].iCursor; computeLimitRegisters(pParse, p); sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0); - sqliteVdbeAddOp(v, OP_OpenRead, base, pTab->tnum); - sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC); + sqliteVdbeOp3(v, OP_OpenRead, base, pTab->tnum, pTab->zName, 0); cont = sqliteVdbeMakeLabel(v); if( pIdx==0 ){ sqliteVdbeAddOp(v, seekOp, base, 0); }else{ sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0); - sqliteVdbeAddOp(v, OP_OpenRead, base+1, pIdx->tnum); - sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC); + sqliteVdbeOp3(v, OP_OpenRead, base+1, pIdx->tnum, pIdx->zName, P3_STATIC); sqliteVdbeAddOp(v, seekOp, base+1, 0); sqliteVdbeAddOp(v, OP_IdxRecno, base+1, 0); sqliteVdbeAddOp(v, OP_Close, base+1, 0); @@ -2277,8 +2264,7 @@ int sqliteSelect( for(i=0; inAgg; i++){ FuncDef *pFunc; if( (pFunc = pParse->aAgg[i].pFunc)!=0 && pFunc->xFinalize!=0 ){ - sqliteVdbeAddOp(v, OP_AggInit, 0, i); - sqliteVdbeChangeP3(v, -1, (char*)pFunc, P3_POINTER); + sqliteVdbeOp3(v, OP_AggInit, 0, i, (char*)pFunc, P3_POINTER); } } if( pGroupBy==0 ){ diff --git a/src/update.c b/src/update.c index 41077e1522..a3d8811de3 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.69 2004/02/20 22:53:39 rdc Exp $ +** $Id: update.c,v 1.70 2004/02/22 20:05:02 drh Exp $ */ #include "sqliteInt.h" @@ -437,8 +437,7 @@ void sqliteUpdate( ** Return the number of rows that were changed. */ if( db->flags & SQLITE_CountRows && !pParse->trigStack ){ - sqliteVdbeAddOp(v, OP_ColumnName, 0, 1); - sqliteVdbeChangeP3(v, -1, "rows updated", P3_STATIC); + sqliteVdbeOp3(v, OP_ColumnName, 0, 1, "rows updated", P3_STATIC); sqliteVdbeAddOp(v, OP_Callback, 1, 0); } diff --git a/src/vdbe.h b/src/vdbe.h index e90979a3cd..f39de1cff7 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.70 2004/02/21 13:31:11 drh Exp $ +** $Id: vdbe.h,v 1.71 2004/02/22 20:05:02 drh Exp $ */ #ifndef _SQLITE_VDBE_H_ #define _SQLITE_VDBE_H_ @@ -87,6 +87,8 @@ typedef struct VdbeOpList VdbeOpList; Vdbe *sqliteVdbeCreate(sqlite*); void sqliteVdbeCreateCallback(Vdbe*, int*); int sqliteVdbeAddOp(Vdbe*,int,int,int); +int sqliteVdbeOp3(Vdbe*,int,int,int,const char *zP3,int); +int sqliteVdbeCode(Vdbe*,...); int sqliteVdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp); void sqliteVdbeChangeP1(Vdbe*, int addr, int P1); void sqliteVdbeChangeP2(Vdbe*, int addr, int P2); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index f7ba9a77ab..6254aa881d 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -73,6 +73,7 @@ void sqliteVdbeTrace(Vdbe *p, FILE *trace){ */ int sqliteVdbeAddOp(Vdbe *p, int op, int p1, int p2){ int i; + VdbeOp *pOp; i = p->nOp; p->nOp++; @@ -89,20 +90,50 @@ int sqliteVdbeAddOp(Vdbe *p, int op, int p1, int p2){ p->aOp = aNew; memset(&p->aOp[oldSize], 0, (p->nOpAlloc-oldSize)*sizeof(Op)); } - p->aOp[i].opcode = op; - p->aOp[i].p1 = p1; + pOp = &p->aOp[i]; + pOp->opcode = op; + pOp->p1 = p1; if( p2<0 && (-1-p2)nLabel && p->aLabel[-1-p2]>=0 ){ p2 = p->aLabel[-1-p2]; } - p->aOp[i].p2 = p2; - p->aOp[i].p3 = 0; - p->aOp[i].p3type = P3_NOTUSED; + pOp->p2 = p2; + pOp->p3 = 0; + pOp->p3type = P3_NOTUSED; #ifndef NDEBUG if( sqlite_vdbe_addop_trace ) sqliteVdbePrintOp(0, i, &p->aOp[i]); #endif return i; } +/* +** Add an opcode that includes the p3 value. +*/ +int sqliteVdbeOp3(Vdbe *p, int op, int p1, int p2, const char *zP3, int p3type){ + int addr = sqliteVdbeAddOp(p, op, p1, p2); + sqliteVdbeChangeP3(p, addr, zP3, p3type); + return addr; +} + +/* +** Add multiple opcodes. The list is terminated by an opcode of 0. +*/ +int sqliteVdbeCode(Vdbe *p, ...){ + int addr; + va_list ap; + int opcode, p1, p2; + va_start(ap, p); + addr = p->nOp; + while( (opcode = va_arg(ap,int))!=0 ){ + p1 = va_arg(ap,int); + p2 = va_arg(ap,int); + sqliteVdbeAddOp(p, opcode, p1, p2); + } + va_end(ap); + return addr; +} + + + /* ** Create a new symbolic label for an instruction that has yet to be ** coded. The symbolic label is really just a negative number. The diff --git a/src/where.c b/src/where.c index 5df3c07042..34195c6516 100644 --- a/src/where.c +++ b/src/where.c @@ -12,7 +12,7 @@ ** This module contains C code that generates VDBE code used to process ** the WHERE clause of SQL statements. ** -** $Id: where.c,v 1.88 2004/02/22 18:40:57 drh Exp $ +** $Id: where.c,v 1.89 2004/02/22 20:05:02 drh Exp $ */ #include "sqliteInt.h" @@ -669,18 +669,17 @@ WhereInfo *sqliteWhereBegin( */ for(i=0; inSrc; i++){ Table *pTab; + Index *pIx; pTab = pTabList->a[i].pTab; if( pTab->isTransient || pTab->pSelect ) continue; sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0); - sqliteVdbeAddOp(v, OP_OpenRead, pTabList->a[i].iCursor, pTab->tnum); - sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC); + sqliteVdbeOp3(v, OP_OpenRead, pTabList->a[i].iCursor, pTab->tnum, + pTab->zName, P3_STATIC); sqliteCodeVerifySchema(pParse, pTab->iDb); - if( pWInfo->a[i].pIdx!=0 ){ - 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); + if( (pIx = pWInfo->a[i].pIdx)!=0 ){ + sqliteVdbeAddOp(v, OP_Integer, pIx->iDb, 0); + sqliteVdbeOp3(v, OP_OpenRead, pWInfo->a[i].iCur, pIx->tnum, pIx->zName,0); } }