mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
Use sqliteVdbeOp3 instead of sqliteVdbeChangeP3 where applicable. (CVS 1266)
FossilOrigin-Name: 51f1e8f7539596b33bc3365ec8f34041602d049c
This commit is contained in:
28
manifest
28
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Code\scleanup\sin\sbuild.c.\s(CVS\s1265)
|
C Use\ssqliteVdbeOp3\sinstead\sof\ssqliteVdbeChangeP3\swhere\sapplicable.\s(CVS\s1266)
|
||||||
D 2004-02-22T18:56:49
|
D 2004-02-22T20:05:01
|
||||||
F Makefile.in cfd75c46b335881999333a9e4b982fa8491f200b
|
F Makefile.in cfd75c46b335881999333a9e4b982fa8491f200b
|
||||||
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
|
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
|
||||||
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
|
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
|
||||||
@@ -27,16 +27,16 @@ F src/auth.c 4fa3b05bd19445d1c474d6751c4a508d6ea0abe1
|
|||||||
F src/btree.c 0a40efb01fa3a431a16d8604f603431d8c9cebfa
|
F src/btree.c 0a40efb01fa3a431a16d8604f603431d8c9cebfa
|
||||||
F src/btree.h 41cb3ff6ebc3f6da2d0a074e39ff8c7a2287469f
|
F src/btree.h 41cb3ff6ebc3f6da2d0a074e39ff8c7a2287469f
|
||||||
F src/btree_rb.c 32b2cb4285c0fbd53b89de021637b63d52257e54
|
F src/btree_rb.c 32b2cb4285c0fbd53b89de021637b63d52257e54
|
||||||
F src/build.c dbeef48d1f6f134d8a3de9f9bb6928812c3fbfee
|
F src/build.c 85dee2c7d23f618b9c5384091df00cbf64cce527
|
||||||
F src/copy.c 391ce142f6b1faa093867ecee134f61a5028a9af
|
F src/copy.c 391ce142f6b1faa093867ecee134f61a5028a9af
|
||||||
F src/date.c 3025642cee50d5c41aef4a22cbc41aa7e543c922
|
F src/date.c 3025642cee50d5c41aef4a22cbc41aa7e543c922
|
||||||
F src/delete.c 8e2ff752bf485906effcc64f267cdd7227463567
|
F src/delete.c 8e2ff752bf485906effcc64f267cdd7227463567
|
||||||
F src/encode.c 9e70ea1e4e746f23f18180949e94f1bb1c2220d3
|
F src/encode.c 9e70ea1e4e746f23f18180949e94f1bb1c2220d3
|
||||||
F src/expr.c 86eaf80e4d893ba184afc965a53a8dffda209ad4
|
F src/expr.c 61b71ce2e93b0faca39db9e9c06e9a089d25a04f
|
||||||
F src/func.c a2265f29e6a286203c9dfeb835d9a50439617805
|
F src/func.c a2265f29e6a286203c9dfeb835d9a50439617805
|
||||||
F src/hash.c 9b56ef3b291e25168f630d5643a4264ec011c70e
|
F src/hash.c 9b56ef3b291e25168f630d5643a4264ec011c70e
|
||||||
F src/hash.h 3247573ab95b9dd90bcca0307a75d9a16da1ccc7
|
F src/hash.h 3247573ab95b9dd90bcca0307a75d9a16da1ccc7
|
||||||
F src/insert.c ad2902c171d23b92e2b350db2da86e36062e044b
|
F src/insert.c c59f59fb461ad7f8939df289915669c04632edba
|
||||||
F src/main.c 0f77633b37540fabd45e68c5137f32f4cd99470a
|
F src/main.c 0f77633b37540fabd45e68c5137f32f4cd99470a
|
||||||
F src/md5.c fe4f9c9c6f71dfc26af8da63e4d04489b1430565
|
F src/md5.c fe4f9c9c6f71dfc26af8da63e4d04489b1430565
|
||||||
F src/os.c f5fc4954725b2fcd852979f2746085fe8ca27710
|
F src/os.c f5fc4954725b2fcd852979f2746085fe8ca27710
|
||||||
@@ -44,10 +44,10 @@ F src/os.h 250a3789be609adfee5c5aa20137ce8683276f24
|
|||||||
F src/pager.c 29ddad4dd454f0aaa98e2bcd327710ab9f02f833
|
F src/pager.c 29ddad4dd454f0aaa98e2bcd327710ab9f02f833
|
||||||
F src/pager.h 82332878799280145639a48d88cdb4058925e3f6
|
F src/pager.h 82332878799280145639a48d88cdb4058925e3f6
|
||||||
F src/parse.y 023720cb8c3bef74e51738bca78335d0dc6d2cfd
|
F src/parse.y 023720cb8c3bef74e51738bca78335d0dc6d2cfd
|
||||||
F src/pragma.c a8d43661193ba3114da787f43969d0a34f0ed07c
|
F src/pragma.c 621d319580e9e23712ec232e8be1786cdae06b36
|
||||||
F src/printf.c f201a5a316afc474d29d51e07501536e8998194d
|
F src/printf.c f201a5a316afc474d29d51e07501536e8998194d
|
||||||
F src/random.c 775913e0b7fbd6295d21f12a7bd35b46387c44b2
|
F src/random.c 775913e0b7fbd6295d21f12a7bd35b46387c44b2
|
||||||
F src/select.c 9a41dace754f0dab5e991e402c05fa3c24d04f19
|
F src/select.c 902000034e44817e2822d72870c15eff842dea9e
|
||||||
F src/shell.c c3d3404fa82bb0808444fda9884d1bb572fd18b9
|
F src/shell.c c3d3404fa82bb0808444fda9884d1bb572fd18b9
|
||||||
F src/sqlite.h.in 64f016cd5ce190643a0f47760188fdf4e0b2227e
|
F src/sqlite.h.in 64f016cd5ce190643a0f47760188fdf4e0b2227e
|
||||||
F src/sqliteInt.h a3e8f422803abf1e6ba07e15ffe5070a50f8b5e5
|
F src/sqliteInt.h a3e8f422803abf1e6ba07e15ffe5070a50f8b5e5
|
||||||
@@ -59,14 +59,14 @@ F src/test3.c 30985ebdfaf3ee1462a9b0652d3efbdc8d9798f5
|
|||||||
F src/test4.c dcbbbb382626fd466a7c46907f74db35fc8bad64
|
F src/test4.c dcbbbb382626fd466a7c46907f74db35fc8bad64
|
||||||
F src/tokenize.c 6676b946fd8825b67ab52140af4fdc57a70bda48
|
F src/tokenize.c 6676b946fd8825b67ab52140af4fdc57a70bda48
|
||||||
F src/trigger.c a9927b57c865b6f3df3fb5e40c9824d722660ded
|
F src/trigger.c a9927b57c865b6f3df3fb5e40c9824d722660ded
|
||||||
F src/update.c e6eed1a4a429cc28f57533365c72293794c904cf
|
F src/update.c 4c50328ebc127852bde8e2950eb8933234802c21
|
||||||
F src/util.c 122bc174f6c8c2eb6a9127d9f13c4c74f83b85e4
|
F src/util.c 122bc174f6c8c2eb6a9127d9f13c4c74f83b85e4
|
||||||
F src/vacuum.c d9e80c2b36ee1f623dbf1bdf3cedad24a23f87ac
|
F src/vacuum.c d9e80c2b36ee1f623dbf1bdf3cedad24a23f87ac
|
||||||
F src/vdbe.c af187d86cb1bcc1ead227245350d1693c28c77a2
|
F src/vdbe.c af187d86cb1bcc1ead227245350d1693c28c77a2
|
||||||
F src/vdbe.h b1b22ffca48f593d375fd846c583679d49c2e5c9
|
F src/vdbe.h ac987945e4dd6f987bca534c6005899f089fc270
|
||||||
F src/vdbeInt.h b40ff02ce39fd076e6ff3369e19c1bbfe1986682
|
F src/vdbeInt.h b40ff02ce39fd076e6ff3369e19c1bbfe1986682
|
||||||
F src/vdbeaux.c 88ebe3aa963478f3cee9fb6e3d8ca9db1bafacb2
|
F src/vdbeaux.c e2cdd1ab63604a390612c73e26bdd2ef910e9438
|
||||||
F src/where.c 6ac293e94aa3e662ec74f6b48d2ef5e341a30cdd
|
F src/where.c b58764861a96bab3f1d294200f9e53519b92c274
|
||||||
F test/all.test 569a92a8ee88f5300c057cc4a8f50fbbc69a3242
|
F test/all.test 569a92a8ee88f5300c057cc4a8f50fbbc69a3242
|
||||||
F test/attach.test ba8261d38da6b6a7d4f78ec543c548c4418582ef
|
F test/attach.test ba8261d38da6b6a7d4f78ec543c548c4418582ef
|
||||||
F test/attach2.test ce61e6185b3cd891cc0e9a4c868fcc65eb92fc55
|
F test/attach2.test ce61e6185b3cd891cc0e9a4c868fcc65eb92fc55
|
||||||
@@ -189,7 +189,7 @@ F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604
|
|||||||
F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da
|
F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da
|
||||||
F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1
|
F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1
|
||||||
F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
|
F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
|
||||||
P 69aac043af7f93e7b3f036622c0ac9261cae1839
|
P 9211e14cf81f4de125bad246d8a289786f2854aa
|
||||||
R 31316bc136a82339f6877cfbb462944f
|
R 77ff7dbcb5fd6ddb4e286234c013c859
|
||||||
U drh
|
U drh
|
||||||
Z c273a71cca2efed399051894b17dbdca
|
Z 751f59f1e75cd541f38cd5d5979c86ff
|
||||||
|
@@ -1 +1 @@
|
|||||||
9211e14cf81f4de125bad246d8a289786f2854aa
|
51f1e8f7539596b33bc3365ec8f34041602d049c
|
57
src/build.c
57
src/build.c
@@ -23,7 +23,7 @@
|
|||||||
** ROLLBACK
|
** ROLLBACK
|
||||||
** PRAGMA
|
** 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 "sqliteInt.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
@@ -928,24 +928,16 @@ void sqliteEndTable(Parse *pParse, Token *pEnd, Select *pSelect){
|
|||||||
if( v==0 ) return;
|
if( v==0 ) return;
|
||||||
if( p->pSelect==0 ){
|
if( p->pSelect==0 ){
|
||||||
/* A regular table */
|
/* A regular table */
|
||||||
sqliteVdbeAddOp(v, OP_CreateTable, 0, p->iDb);
|
sqliteVdbeOp3(v, OP_CreateTable, 0, p->iDb, (char*)&p->tnum, P3_POINTER);
|
||||||
sqliteVdbeChangeP3(v, -1, (char *)&p->tnum, P3_POINTER);
|
|
||||||
}else{
|
}else{
|
||||||
/* A view */
|
/* A view */
|
||||||
sqliteVdbeAddOp(v, OP_Integer, 0, 0);
|
sqliteVdbeAddOp(v, OP_Integer, 0, 0);
|
||||||
}
|
}
|
||||||
p->tnum = 0;
|
p->tnum = 0;
|
||||||
sqliteVdbeAddOp(v, OP_Pull, 1, 0);
|
sqliteVdbeAddOp(v, OP_Pull, 1, 0);
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
sqliteVdbeOp3(v, OP_String, 0, 0, p->pSelect==0?"table":"view", P3_STATIC);
|
||||||
if( p->pSelect==0 ){
|
sqliteVdbeOp3(v, OP_String, 0, 0, p->zName, 0);
|
||||||
sqliteVdbeChangeP3(v, -1, "table", P3_STATIC);
|
sqliteVdbeOp3(v, OP_String, 0, 0, p->zName, 0);
|
||||||
}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);
|
|
||||||
sqliteVdbeAddOp(v, OP_Dup, 4, 0);
|
sqliteVdbeAddOp(v, OP_Dup, 4, 0);
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
||||||
if( pSelect ){
|
if( pSelect ){
|
||||||
@@ -1133,12 +1125,12 @@ int sqliteViewGetColumnNames(Parse *pParse, Table *pTable){
|
|||||||
*/
|
*/
|
||||||
static void sqliteViewResetColumnNames(Table *pTable){
|
static void sqliteViewResetColumnNames(Table *pTable){
|
||||||
int i;
|
int i;
|
||||||
if( pTable==0 || pTable->pSelect==0 ) return;
|
Column *pCol;
|
||||||
if( pTable->nCol==0 ) return;
|
assert( pTable!=0 && pTable->pSelect!=0 );
|
||||||
for(i=0; i<pTable->nCol; i++){
|
for(i=0, pCol=pTable->aCol; i<pTable->nCol; i++, pCol++){
|
||||||
sqliteFree(pTable->aCol[i].zName);
|
sqliteFree(pCol->zName);
|
||||||
sqliteFree(pTable->aCol[i].zDflt);
|
sqliteFree(pCol->zDflt);
|
||||||
sqliteFree(pTable->aCol[i].zType);
|
sqliteFree(pCol->zType);
|
||||||
}
|
}
|
||||||
sqliteFree(pTable->aCol);
|
sqliteFree(pTable->aCol);
|
||||||
pTable->aCol = 0;
|
pTable->aCol = 0;
|
||||||
@@ -1700,19 +1692,17 @@ void sqliteCreateIndex(
|
|||||||
sqliteOpenMasterTable(v, isTemp);
|
sqliteOpenMasterTable(v, isTemp);
|
||||||
}
|
}
|
||||||
sqliteVdbeAddOp(v, OP_NewRecno, 0, 0);
|
sqliteVdbeAddOp(v, OP_NewRecno, 0, 0);
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
sqliteVdbeOp3(v, OP_String, 0, 0, "index", P3_STATIC);
|
||||||
sqliteVdbeChangeP3(v, -1, "index", P3_STATIC);
|
sqliteVdbeOp3(v, OP_String, 0, 0, pIndex->zName, 0);
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
sqliteVdbeOp3(v, OP_String, 0, 0, pTab->zName, 0);
|
||||||
sqliteVdbeChangeP3(v, -1, pIndex->zName, strlen(pIndex->zName));
|
sqliteVdbeOp3(v, OP_CreateIndex, 0, isTemp,(char*)&pIndex->tnum,P3_POINTER);
|
||||||
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);
|
|
||||||
pIndex->tnum = 0;
|
pIndex->tnum = 0;
|
||||||
if( pTable ){
|
if( pTable ){
|
||||||
sqliteVdbeAddOp(v, OP_Dup, 0, 0);
|
sqliteVdbeCode(v,
|
||||||
sqliteVdbeAddOp(v, OP_Integer, isTemp, 0);
|
OP_Dup, 0, 0,
|
||||||
sqliteVdbeAddOp(v, OP_OpenWrite, 1, 0);
|
OP_Integer, isTemp, 0,
|
||||||
|
OP_OpenWrite, 1, 0,
|
||||||
|
0);
|
||||||
}
|
}
|
||||||
addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
|
addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
|
||||||
if( pStart && pEnd ){
|
if( pStart && pEnd ){
|
||||||
@@ -1723,8 +1713,7 @@ void sqliteCreateIndex(
|
|||||||
sqliteVdbeAddOp(v, OP_PutIntKey, 0, 0);
|
sqliteVdbeAddOp(v, OP_PutIntKey, 0, 0);
|
||||||
if( pTable ){
|
if( pTable ){
|
||||||
sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0);
|
sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0);
|
||||||
sqliteVdbeAddOp(v, OP_OpenRead, 2, pTab->tnum);
|
sqliteVdbeOp3(v, OP_OpenRead, 2, pTab->tnum, pTab->zName, 0);
|
||||||
sqliteVdbeChangeP3(v, -1, pTab->zName, 0);
|
|
||||||
lbl2 = sqliteVdbeMakeLabel(v);
|
lbl2 = sqliteVdbeMakeLabel(v);
|
||||||
sqliteVdbeAddOp(v, OP_Rewind, 2, lbl2);
|
sqliteVdbeAddOp(v, OP_Rewind, 2, lbl2);
|
||||||
lbl1 = sqliteVdbeAddOp(v, OP_Recno, 2, 0);
|
lbl1 = sqliteVdbeAddOp(v, OP_Recno, 2, 0);
|
||||||
@@ -1738,8 +1727,8 @@ void sqliteCreateIndex(
|
|||||||
}
|
}
|
||||||
sqliteVdbeAddOp(v, OP_MakeIdxKey, pIndex->nColumn, 0);
|
sqliteVdbeAddOp(v, OP_MakeIdxKey, pIndex->nColumn, 0);
|
||||||
if( db->file_format>=4 ) sqliteAddIdxKeyType(v, pIndex);
|
if( db->file_format>=4 ) sqliteAddIdxKeyType(v, pIndex);
|
||||||
sqliteVdbeAddOp(v, OP_IdxPut, 1, pIndex->onError!=OE_None);
|
sqliteVdbeOp3(v, OP_IdxPut, 1, pIndex->onError!=OE_None,
|
||||||
sqliteVdbeChangeP3(v, -1, "indexed columns are not unique", P3_STATIC);
|
"indexed columns are not unique", P3_STATIC);
|
||||||
sqliteVdbeAddOp(v, OP_Next, 2, lbl1);
|
sqliteVdbeAddOp(v, OP_Next, 2, lbl1);
|
||||||
sqliteVdbeResolveLabel(v, lbl2);
|
sqliteVdbeResolveLabel(v, lbl2);
|
||||||
sqliteVdbeAddOp(v, OP_Close, 2, 0);
|
sqliteVdbeAddOp(v, OP_Close, 2, 0);
|
||||||
|
22
src/expr.c
22
src/expr.c
@@ -12,7 +12,7 @@
|
|||||||
** This file contains routines used for analyzing expressions and
|
** This file contains routines used for analyzing expressions and
|
||||||
** for generating VDBE code that evaluates expressions in SQLite.
|
** 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 "sqliteInt.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
@@ -717,9 +717,10 @@ int sqliteExprResolveIds(
|
|||||||
case TK_FLOAT:
|
case TK_FLOAT:
|
||||||
case TK_INTEGER:
|
case TK_INTEGER:
|
||||||
case TK_STRING: {
|
case TK_STRING: {
|
||||||
int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
|
int addr;
|
||||||
assert( pE2->token.z );
|
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);
|
sqliteVdbeDequoteP3(v, addr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1166,8 +1167,7 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){
|
|||||||
for(i=0; i<nExpr; i++){
|
for(i=0; i<nExpr; i++){
|
||||||
sqliteExprCode(pParse, pList->a[i].pExpr);
|
sqliteExprCode(pParse, pList->a[i].pExpr);
|
||||||
}
|
}
|
||||||
sqliteVdbeAddOp(v, OP_Function, nExpr, 0);
|
sqliteVdbeOp3(v, OP_Function, nExpr, 0, (char*)pDef, P3_POINTER);
|
||||||
sqliteVdbeChangeP3(v, -1, (char*)pDef, P3_POINTER);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TK_SELECT: {
|
case TK_SELECT: {
|
||||||
@@ -1257,15 +1257,13 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){
|
|||||||
if( pExpr->iColumn == OE_Rollback ||
|
if( pExpr->iColumn == OE_Rollback ||
|
||||||
pExpr->iColumn == OE_Abort ||
|
pExpr->iColumn == OE_Abort ||
|
||||||
pExpr->iColumn == OE_Fail ){
|
pExpr->iColumn == OE_Fail ){
|
||||||
char * msg = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
|
sqliteVdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn,
|
||||||
sqliteVdbeAddOp(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn);
|
pExpr->token.z, pExpr->token.n);
|
||||||
sqliteDequote(msg);
|
sqliteVdbeDequoteP3(v, -1);
|
||||||
sqliteVdbeChangeP3(v, -1, msg, 0);
|
|
||||||
sqliteFree(msg);
|
|
||||||
} else {
|
} else {
|
||||||
assert( pExpr->iColumn == OE_Ignore );
|
assert( pExpr->iColumn == OE_Ignore );
|
||||||
sqliteVdbeAddOp(v, OP_Goto, 0, pParse->trigStack->ignoreJump);
|
sqliteVdbeOp3(v, OP_Goto, 0, pParse->trigStack->ignoreJump,
|
||||||
sqliteVdbeChangeP3(v, -1, "(IGNORE jump)", 0);
|
"(IGNORE jump)", 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
35
src/insert.c
35
src/insert.c
@@ -12,7 +12,7 @@
|
|||||||
** This file contains C code routines that are called by the parser
|
** This file contains C code routines that are called by the parser
|
||||||
** to handle INSERT statements in SQLite.
|
** 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"
|
#include "sqliteInt.h"
|
||||||
|
|
||||||
@@ -331,12 +331,11 @@ void sqliteInsert(
|
|||||||
if( !row_triggers_exist ){
|
if( !row_triggers_exist ){
|
||||||
base = pParse->nTab;
|
base = pParse->nTab;
|
||||||
sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0);
|
sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0);
|
||||||
sqliteVdbeAddOp(v, OP_OpenWrite, base, pTab->tnum);
|
sqliteVdbeOp3(v, OP_OpenWrite, base, pTab->tnum, pTab->zName, P3_STATIC);
|
||||||
sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC);
|
|
||||||
for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){
|
for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){
|
||||||
sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0);
|
sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0);
|
||||||
sqliteVdbeAddOp(v, OP_OpenWrite, idx+base, pIdx->tnum);
|
sqliteVdbeOp3(v, OP_OpenWrite, idx+base, pIdx->tnum,
|
||||||
sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC);
|
pIdx->zName, P3_STATIC);
|
||||||
}
|
}
|
||||||
pParse->nTab += idx;
|
pParse->nTab += idx;
|
||||||
}
|
}
|
||||||
@@ -391,8 +390,7 @@ void sqliteInsert(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( pColumn && j>=pColumn->nId ){
|
if( pColumn && j>=pColumn->nId ){
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
sqliteVdbeOp3(v, OP_String, 0, 0, pTab->aCol[i].zDflt, P3_STATIC);
|
||||||
sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zDflt, P3_STATIC);
|
|
||||||
}else if( useTempTable ){
|
}else if( useTempTable ){
|
||||||
sqliteVdbeAddOp(v, OP_Column, srcTab, j);
|
sqliteVdbeAddOp(v, OP_Column, srcTab, j);
|
||||||
}else if( pSelect ){
|
}else if( pSelect ){
|
||||||
@@ -417,12 +415,11 @@ void sqliteInsert(
|
|||||||
if( row_triggers_exist && !isView ){
|
if( row_triggers_exist && !isView ){
|
||||||
base = pParse->nTab;
|
base = pParse->nTab;
|
||||||
sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0);
|
sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0);
|
||||||
sqliteVdbeAddOp(v, OP_OpenWrite, base, pTab->tnum);
|
sqliteVdbeOp3(v, OP_OpenWrite, base, pTab->tnum, pTab->zName, P3_STATIC);
|
||||||
sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC);
|
|
||||||
for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){
|
for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){
|
||||||
sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0);
|
sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0);
|
||||||
sqliteVdbeAddOp(v, OP_OpenWrite, idx+base, pIdx->tnum);
|
sqliteVdbeOp3(v, OP_OpenWrite, idx+base, pIdx->tnum,
|
||||||
sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC);
|
pIdx->zName, P3_STATIC);
|
||||||
}
|
}
|
||||||
pParse->nTab += idx;
|
pParse->nTab += idx;
|
||||||
}
|
}
|
||||||
@@ -472,8 +469,7 @@ void sqliteInsert(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( pColumn && j>=pColumn->nId ){
|
if( pColumn && j>=pColumn->nId ){
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
sqliteVdbeOp3(v, OP_String, 0, 0, pTab->aCol[i].zDflt, P3_STATIC);
|
||||||
sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zDflt, P3_STATIC);
|
|
||||||
}else if( useTempTable ){
|
}else if( useTempTable ){
|
||||||
sqliteVdbeAddOp(v, OP_Column, srcTab, j);
|
sqliteVdbeAddOp(v, OP_Column, srcTab, j);
|
||||||
}else if( pSelect ){
|
}else if( pSelect ){
|
||||||
@@ -542,8 +538,7 @@ void sqliteInsert(
|
|||||||
** Return the number of rows inserted.
|
** Return the number of rows inserted.
|
||||||
*/
|
*/
|
||||||
if( db->flags & SQLITE_CountRows ){
|
if( db->flags & SQLITE_CountRows ){
|
||||||
sqliteVdbeAddOp(v, OP_ColumnName, 0, 1);
|
sqliteVdbeOp3(v, OP_ColumnName, 0, 1, "rows inserted", P3_STATIC);
|
||||||
sqliteVdbeChangeP3(v, -1, "rows inserted", P3_STATIC);
|
|
||||||
sqliteVdbeAddOp(v, OP_MemLoad, iCntMem, 0);
|
sqliteVdbeAddOp(v, OP_MemLoad, iCntMem, 0);
|
||||||
sqliteVdbeAddOp(v, OP_Callback, 1, 0);
|
sqliteVdbeAddOp(v, OP_Callback, 1, 0);
|
||||||
}
|
}
|
||||||
@@ -699,8 +694,7 @@ void sqliteGenerateConstraintChecks(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OE_Replace: {
|
case OE_Replace: {
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
sqliteVdbeOp3(v, OP_String, 0, 0, pTab->aCol[i].zDflt, P3_STATIC);
|
||||||
sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zDflt, P3_STATIC);
|
|
||||||
sqliteVdbeAddOp(v, OP_Push, nCol-i, 0);
|
sqliteVdbeAddOp(v, OP_Push, nCol-i, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -742,8 +736,8 @@ void sqliteGenerateConstraintChecks(
|
|||||||
case OE_Rollback:
|
case OE_Rollback:
|
||||||
case OE_Abort:
|
case OE_Abort:
|
||||||
case OE_Fail: {
|
case OE_Fail: {
|
||||||
sqliteVdbeAddOp(v, OP_Halt, SQLITE_CONSTRAINT, onError);
|
sqliteVdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, onError,
|
||||||
sqliteVdbeChangeP3(v, -1, "PRIMARY KEY must be unique", P3_STATIC);
|
"PRIMARY KEY must be unique", P3_STATIC);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OE_Replace: {
|
case OE_Replace: {
|
||||||
@@ -840,8 +834,7 @@ void sqliteGenerateConstraintChecks(
|
|||||||
}
|
}
|
||||||
strcpy(&zErrMsg[n1],
|
strcpy(&zErrMsg[n1],
|
||||||
pIdx->nColumn>1 ? " are not unique" : " is not unique");
|
pIdx->nColumn>1 ? " are not unique" : " is not unique");
|
||||||
sqliteVdbeAddOp(v, OP_Halt, SQLITE_CONSTRAINT, onError);
|
sqliteVdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, onError, zErrMsg, 0);
|
||||||
sqliteVdbeChangeP3(v, -1, sqliteStrDup(zErrMsg), P3_DYNAMIC);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OE_Ignore: {
|
case OE_Ignore: {
|
||||||
|
56
src/pragma.c
56
src/pragma.c
@@ -11,7 +11,7 @@
|
|||||||
*************************************************************************
|
*************************************************************************
|
||||||
** This file contains code used to implement the PRAGMA command.
|
** 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 "sqliteInt.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
@@ -106,12 +106,11 @@ static int flagPragma(Parse *pParse, const char *zLeft, const char *zRight){
|
|||||||
sqlite *db = pParse->db;
|
sqlite *db = pParse->db;
|
||||||
Vdbe *v;
|
Vdbe *v;
|
||||||
if( strcmp(zLeft,zRight)==0 && (v = sqliteGetVdbe(pParse))!=0 ){
|
if( strcmp(zLeft,zRight)==0 && (v = sqliteGetVdbe(pParse))!=0 ){
|
||||||
sqliteVdbeAddOp(v, OP_ColumnName, 0, 1);
|
sqliteVdbeOp3(v, OP_ColumnName, 0, 1, aPragma[i].zName, P3_STATIC);
|
||||||
sqliteVdbeChangeP3(v, -1, aPragma[i].zName, P3_STATIC);
|
sqliteVdbeOp3(v, OP_ColumnName, 1, 0, "boolean", P3_STATIC);
|
||||||
sqliteVdbeAddOp(v, OP_ColumnName, 1, 0);
|
sqliteVdbeCode(v, OP_Integer, (db->flags & aPragma[i].mask)!=0, 0,
|
||||||
sqliteVdbeChangeP3(v, -1, "boolean", P3_STATIC);
|
OP_Callback, 1, 0,
|
||||||
sqliteVdbeAddOp(v, OP_Integer, (db->flags & aPragma[i].mask)!=0, 0);
|
0);
|
||||||
sqliteVdbeAddOp(v, OP_Callback, 1, 0);
|
|
||||||
}else if( getBoolean(zRight) ){
|
}else if( getBoolean(zRight) ){
|
||||||
db->flags |= aPragma[i].mask;
|
db->flags |= aPragma[i].mask;
|
||||||
}else{
|
}else{
|
||||||
@@ -358,14 +357,12 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){
|
|||||||
sqliteViewGetColumnNames(pParse, pTab);
|
sqliteViewGetColumnNames(pParse, pTab);
|
||||||
for(i=0; i<pTab->nCol; i++){
|
for(i=0; i<pTab->nCol; i++){
|
||||||
sqliteVdbeAddOp(v, OP_Integer, i, 0);
|
sqliteVdbeAddOp(v, OP_Integer, i, 0);
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
sqliteVdbeOp3(v, OP_String, 0, 0, pTab->aCol[i].zName, 0);
|
||||||
sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zName, P3_STATIC);
|
sqliteVdbeOp3(v, OP_String, 0, 0,
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
pTab->aCol[i].zType ? pTab->aCol[i].zType : "numeric", 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_Integer, pTab->aCol[i].notNull, 0);
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
sqliteVdbeOp3(v, OP_String, 0, 0,
|
||||||
sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zDflt, P3_STATIC);
|
pTab->aCol[i].zDflt, P3_STATIC);
|
||||||
sqliteVdbeAddOp(v, OP_Integer, pTab->aCol[i].isPrimKey, 0);
|
sqliteVdbeAddOp(v, OP_Integer, pTab->aCol[i].isPrimKey, 0);
|
||||||
sqliteVdbeAddOp(v, OP_Callback, 6, 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];
|
int cnum = pIdx->aiColumn[i];
|
||||||
sqliteVdbeAddOp(v, OP_Integer, i, 0);
|
sqliteVdbeAddOp(v, OP_Integer, i, 0);
|
||||||
sqliteVdbeAddOp(v, OP_Integer, cnum, 0);
|
sqliteVdbeAddOp(v, OP_Integer, cnum, 0);
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
|
||||||
assert( pTab->nCol>cnum );
|
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);
|
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);
|
sqliteVdbeAddOpList(v, ArraySize(indexListPreface), indexListPreface);
|
||||||
while(pIdx){
|
while(pIdx){
|
||||||
sqliteVdbeAddOp(v, OP_Integer, i, 0);
|
sqliteVdbeAddOp(v, OP_Integer, i, 0);
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
sqliteVdbeOp3(v, OP_String, 0, 0, pIdx->zName, 0);
|
||||||
sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC);
|
|
||||||
sqliteVdbeAddOp(v, OP_Integer, pIdx->onError!=OE_None, 0);
|
sqliteVdbeAddOp(v, OP_Integer, pIdx->onError!=OE_None, 0);
|
||||||
sqliteVdbeAddOp(v, OP_Callback, 3, 0);
|
sqliteVdbeAddOp(v, OP_Callback, 3, 0);
|
||||||
++i;
|
++i;
|
||||||
@@ -450,13 +445,10 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){
|
|||||||
for(j=0; j<pFK->nCol; j++){
|
for(j=0; j<pFK->nCol; j++){
|
||||||
sqliteVdbeAddOp(v, OP_Integer, i, 0);
|
sqliteVdbeAddOp(v, OP_Integer, i, 0);
|
||||||
sqliteVdbeAddOp(v, OP_Integer, j, 0);
|
sqliteVdbeAddOp(v, OP_Integer, j, 0);
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
sqliteVdbeOp3(v, OP_String, 0, 0, pFK->zTo, 0);
|
||||||
sqliteVdbeChangeP3(v, -1, pFK->zTo, P3_STATIC);
|
sqliteVdbeOp3(v, OP_String, 0, 0,
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
pTab->aCol[pFK->aCol[j].iFrom].zName, 0);
|
||||||
sqliteVdbeChangeP3(v, -1, pTab->aCol[pFK->aCol[j].iFrom].zName,
|
sqliteVdbeOp3(v, OP_String, 0, 0, pFK->aCol[j].zCol, 0);
|
||||||
P3_STATIC);
|
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
|
||||||
sqliteVdbeChangeP3(v, -1, pFK->aCol[j].zCol, P3_STATIC);
|
|
||||||
sqliteVdbeAddOp(v, OP_Callback, 5, 0);
|
sqliteVdbeAddOp(v, OP_Callback, 5, 0);
|
||||||
}
|
}
|
||||||
++i;
|
++i;
|
||||||
@@ -478,11 +470,9 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){
|
|||||||
if( db->aDb[i].pBt==0 ) continue;
|
if( db->aDb[i].pBt==0 ) continue;
|
||||||
assert( db->aDb[i].zName!=0 );
|
assert( db->aDb[i].zName!=0 );
|
||||||
sqliteVdbeAddOp(v, OP_Integer, i, 0);
|
sqliteVdbeAddOp(v, OP_Integer, i, 0);
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
sqliteVdbeOp3(v, OP_String, 0, 0, db->aDb[i].zName, 0);
|
||||||
sqliteVdbeChangeP3(v, -1, db->aDb[i].zName, P3_STATIC);
|
sqliteVdbeOp3(v, OP_String, 0, 0,
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0);
|
sqliteBtreeGetFilename(db->aDb[i].pBt), 0);
|
||||||
sqliteVdbeChangeP3(v, -1, sqliteBtreeGetFilename(db->aDb[i].pBt),
|
|
||||||
P3_STATIC);
|
|
||||||
sqliteVdbeAddOp(v, OP_Callback, 3, 0);
|
sqliteVdbeAddOp(v, OP_Callback, 3, 0);
|
||||||
}
|
}
|
||||||
}else
|
}else
|
||||||
@@ -633,13 +623,11 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){
|
|||||||
|
|
||||||
if( pTab->pIndex==0 ) continue;
|
if( pTab->pIndex==0 ) continue;
|
||||||
sqliteVdbeAddOp(v, OP_Integer, i, 0);
|
sqliteVdbeAddOp(v, OP_Integer, i, 0);
|
||||||
sqliteVdbeAddOp(v, OP_OpenRead, 1, pTab->tnum);
|
sqliteVdbeOp3(v, OP_OpenRead, 1, pTab->tnum, pTab->zName, 0);
|
||||||
sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC);
|
|
||||||
for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
|
for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
|
||||||
if( pIdx->tnum==0 ) continue;
|
if( pIdx->tnum==0 ) continue;
|
||||||
sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0);
|
sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0);
|
||||||
sqliteVdbeAddOp(v, OP_OpenRead, j+2, pIdx->tnum);
|
sqliteVdbeOp3(v, OP_OpenRead, j+2, pIdx->tnum, pIdx->zName, 0);
|
||||||
sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC);
|
|
||||||
}
|
}
|
||||||
sqliteVdbeAddOp(v, OP_Integer, 0, 0);
|
sqliteVdbeAddOp(v, OP_Integer, 0, 0);
|
||||||
sqliteVdbeAddOp(v, OP_MemStore, 1, 1);
|
sqliteVdbeAddOp(v, OP_MemStore, 1, 1);
|
||||||
|
40
src/select.c
40
src/select.c
@@ -12,7 +12,7 @@
|
|||||||
** This file contains C code routines that are called by the parser
|
** This file contains C code routines that are called by the parser
|
||||||
** to handle SELECT statements in SQLite.
|
** 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"
|
#include "sqliteInt.h"
|
||||||
|
|
||||||
@@ -338,9 +338,7 @@ static void pushOntoSorter(Parse *pParse, Vdbe *v, ExprList *pOrderBy){
|
|||||||
sqliteExprCode(pParse, pOrderBy->a[i].pExpr);
|
sqliteExprCode(pParse, pOrderBy->a[i].pExpr);
|
||||||
}
|
}
|
||||||
zSortOrder[pOrderBy->nExpr] = 0;
|
zSortOrder[pOrderBy->nExpr] = 0;
|
||||||
sqliteVdbeAddOp(v, OP_SortMakeKey, pOrderBy->nExpr, 0);
|
sqliteVdbeOp3(v, OP_SortMakeKey, pOrderBy->nExpr, 0, zSortOrder, P3_DYNAMIC);
|
||||||
sqliteVdbeChangeP3(v, -1, zSortOrder, strlen(zSortOrder));
|
|
||||||
sqliteFree(zSortOrder);
|
|
||||||
sqliteVdbeAddOp(v, OP_SortPut, 0, 0);
|
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] = sqliteExprType(pEList->a[i].pExpr)==SQLITE_SO_NUM ? 'n' : 't';
|
||||||
}
|
}
|
||||||
zType[i] = 0;
|
zType[i] = 0;
|
||||||
sqliteVdbeChangeP3(v, -1, zType, nColumn);
|
sqliteVdbeChangeP3(v, -1, zType, P3_DYNAMIC);
|
||||||
sqliteFree(zType);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -672,8 +669,7 @@ static void generateColumnTypes(
|
|||||||
zType = "NUMERIC";
|
zType = "NUMERIC";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sqliteVdbeAddOp(v, OP_ColumnName, i + pEList->nExpr, 0);
|
sqliteVdbeOp3(v, OP_ColumnName, i + pEList->nExpr, 0, zType, 0);
|
||||||
sqliteVdbeChangeP3(v, -1, zType, 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -704,8 +700,7 @@ static void generateColumnNames(
|
|||||||
if( p==0 ) continue;
|
if( p==0 ) continue;
|
||||||
if( pEList->a[i].zName ){
|
if( pEList->a[i].zName ){
|
||||||
char *zName = pEList->a[i].zName;
|
char *zName = pEList->a[i].zName;
|
||||||
sqliteVdbeAddOp(v, OP_ColumnName, i, p2);
|
sqliteVdbeOp3(v, OP_ColumnName, i, p2, zName, 0);
|
||||||
sqliteVdbeChangeP3(v, -1, zName, strlen(zName));
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if( p->op==TK_COLUMN && pTabList ){
|
if( p->op==TK_COLUMN && pTabList ){
|
||||||
@@ -723,8 +718,7 @@ static void generateColumnNames(
|
|||||||
zCol = pTab->aCol[iCol].zName;
|
zCol = pTab->aCol[iCol].zName;
|
||||||
}
|
}
|
||||||
if( !shortNames && !fullNames && p->span.z && p->span.z[0] ){
|
if( !shortNames && !fullNames && p->span.z && p->span.z[0] ){
|
||||||
int addr = sqliteVdbeAddOp(v,OP_ColumnName, i, p2);
|
int addr = sqliteVdbeOp3(v,OP_ColumnName, i, p2, p->span.z, p->span.n);
|
||||||
sqliteVdbeChangeP3(v, -1, p->span.z, p->span.n);
|
|
||||||
sqliteVdbeCompressSpace(v, addr);
|
sqliteVdbeCompressSpace(v, addr);
|
||||||
}else if( fullNames || (!shortNames && pTabList->nSrc>1) ){
|
}else if( fullNames || (!shortNames && pTabList->nSrc>1) ){
|
||||||
char *zName = 0;
|
char *zName = 0;
|
||||||
@@ -733,23 +727,18 @@ static void generateColumnNames(
|
|||||||
zTab = pTabList->a[j].zAlias;
|
zTab = pTabList->a[j].zAlias;
|
||||||
if( fullNames || zTab==0 ) zTab = pTab->zName;
|
if( fullNames || zTab==0 ) zTab = pTab->zName;
|
||||||
sqliteSetString(&zName, zTab, ".", zCol, 0);
|
sqliteSetString(&zName, zTab, ".", zCol, 0);
|
||||||
sqliteVdbeAddOp(v, OP_ColumnName, i, p2);
|
sqliteVdbeOp3(v, OP_ColumnName, i, p2, zName, P3_DYNAMIC);
|
||||||
sqliteVdbeChangeP3(v, -1, zName, strlen(zName));
|
|
||||||
sqliteFree(zName);
|
|
||||||
}else{
|
}else{
|
||||||
sqliteVdbeAddOp(v, OP_ColumnName, i, p2);
|
sqliteVdbeOp3(v, OP_ColumnName, i, p2, zCol, 0);
|
||||||
sqliteVdbeChangeP3(v, -1, zCol, 0);
|
|
||||||
}
|
}
|
||||||
}else if( p->span.z && p->span.z[0] ){
|
}else if( p->span.z && p->span.z[0] ){
|
||||||
int addr = sqliteVdbeAddOp(v,OP_ColumnName, i, p2);
|
int addr = sqliteVdbeOp3(v,OP_ColumnName, i, p2, p->span.z, p->span.n);
|
||||||
sqliteVdbeChangeP3(v, -1, p->span.z, p->span.n);
|
|
||||||
sqliteVdbeCompressSpace(v, addr);
|
sqliteVdbeCompressSpace(v, addr);
|
||||||
}else{
|
}else{
|
||||||
char zName[30];
|
char zName[30];
|
||||||
assert( p->op!=TK_COLUMN || pTabList==0 );
|
assert( p->op!=TK_COLUMN || pTabList==0 );
|
||||||
sprintf(zName, "column%d", i+1);
|
sprintf(zName, "column%d", i+1);
|
||||||
sqliteVdbeAddOp(v, OP_ColumnName, i, p2);
|
sqliteVdbeOp3(v, OP_ColumnName, i, p2, zName, 0);
|
||||||
sqliteVdbeChangeP3(v, -1, zName, strlen(zName));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1910,15 +1899,13 @@ static int simpleMinMaxQuery(Parse *pParse, Select *p, int eDest, int iParm){
|
|||||||
base = p->pSrc->a[0].iCursor;
|
base = p->pSrc->a[0].iCursor;
|
||||||
computeLimitRegisters(pParse, p);
|
computeLimitRegisters(pParse, p);
|
||||||
sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0);
|
sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0);
|
||||||
sqliteVdbeAddOp(v, OP_OpenRead, base, pTab->tnum);
|
sqliteVdbeOp3(v, OP_OpenRead, base, pTab->tnum, pTab->zName, 0);
|
||||||
sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC);
|
|
||||||
cont = sqliteVdbeMakeLabel(v);
|
cont = sqliteVdbeMakeLabel(v);
|
||||||
if( pIdx==0 ){
|
if( pIdx==0 ){
|
||||||
sqliteVdbeAddOp(v, seekOp, base, 0);
|
sqliteVdbeAddOp(v, seekOp, base, 0);
|
||||||
}else{
|
}else{
|
||||||
sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0);
|
sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0);
|
||||||
sqliteVdbeAddOp(v, OP_OpenRead, base+1, pIdx->tnum);
|
sqliteVdbeOp3(v, OP_OpenRead, base+1, pIdx->tnum, pIdx->zName, P3_STATIC);
|
||||||
sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC);
|
|
||||||
sqliteVdbeAddOp(v, seekOp, base+1, 0);
|
sqliteVdbeAddOp(v, seekOp, base+1, 0);
|
||||||
sqliteVdbeAddOp(v, OP_IdxRecno, base+1, 0);
|
sqliteVdbeAddOp(v, OP_IdxRecno, base+1, 0);
|
||||||
sqliteVdbeAddOp(v, OP_Close, base+1, 0);
|
sqliteVdbeAddOp(v, OP_Close, base+1, 0);
|
||||||
@@ -2277,8 +2264,7 @@ int sqliteSelect(
|
|||||||
for(i=0; i<pParse->nAgg; i++){
|
for(i=0; i<pParse->nAgg; i++){
|
||||||
FuncDef *pFunc;
|
FuncDef *pFunc;
|
||||||
if( (pFunc = pParse->aAgg[i].pFunc)!=0 && pFunc->xFinalize!=0 ){
|
if( (pFunc = pParse->aAgg[i].pFunc)!=0 && pFunc->xFinalize!=0 ){
|
||||||
sqliteVdbeAddOp(v, OP_AggInit, 0, i);
|
sqliteVdbeOp3(v, OP_AggInit, 0, i, (char*)pFunc, P3_POINTER);
|
||||||
sqliteVdbeChangeP3(v, -1, (char*)pFunc, P3_POINTER);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( pGroupBy==0 ){
|
if( pGroupBy==0 ){
|
||||||
|
@@ -12,7 +12,7 @@
|
|||||||
** This file contains C code routines that are called by the parser
|
** This file contains C code routines that are called by the parser
|
||||||
** to handle UPDATE statements.
|
** 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"
|
#include "sqliteInt.h"
|
||||||
|
|
||||||
@@ -437,8 +437,7 @@ void sqliteUpdate(
|
|||||||
** Return the number of rows that were changed.
|
** Return the number of rows that were changed.
|
||||||
*/
|
*/
|
||||||
if( db->flags & SQLITE_CountRows && !pParse->trigStack ){
|
if( db->flags & SQLITE_CountRows && !pParse->trigStack ){
|
||||||
sqliteVdbeAddOp(v, OP_ColumnName, 0, 1);
|
sqliteVdbeOp3(v, OP_ColumnName, 0, 1, "rows updated", P3_STATIC);
|
||||||
sqliteVdbeChangeP3(v, -1, "rows updated", P3_STATIC);
|
|
||||||
sqliteVdbeAddOp(v, OP_Callback, 1, 0);
|
sqliteVdbeAddOp(v, OP_Callback, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
** or VDBE. The VDBE implements an abstract machine that runs a
|
** or VDBE. The VDBE implements an abstract machine that runs a
|
||||||
** simple program to access and modify the underlying database.
|
** 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_
|
#ifndef _SQLITE_VDBE_H_
|
||||||
#define _SQLITE_VDBE_H_
|
#define _SQLITE_VDBE_H_
|
||||||
@@ -87,6 +87,8 @@ typedef struct VdbeOpList VdbeOpList;
|
|||||||
Vdbe *sqliteVdbeCreate(sqlite*);
|
Vdbe *sqliteVdbeCreate(sqlite*);
|
||||||
void sqliteVdbeCreateCallback(Vdbe*, int*);
|
void sqliteVdbeCreateCallback(Vdbe*, int*);
|
||||||
int sqliteVdbeAddOp(Vdbe*,int,int,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);
|
int sqliteVdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp);
|
||||||
void sqliteVdbeChangeP1(Vdbe*, int addr, int P1);
|
void sqliteVdbeChangeP1(Vdbe*, int addr, int P1);
|
||||||
void sqliteVdbeChangeP2(Vdbe*, int addr, int P2);
|
void sqliteVdbeChangeP2(Vdbe*, int addr, int P2);
|
||||||
|
@@ -73,6 +73,7 @@ void sqliteVdbeTrace(Vdbe *p, FILE *trace){
|
|||||||
*/
|
*/
|
||||||
int sqliteVdbeAddOp(Vdbe *p, int op, int p1, int p2){
|
int sqliteVdbeAddOp(Vdbe *p, int op, int p1, int p2){
|
||||||
int i;
|
int i;
|
||||||
|
VdbeOp *pOp;
|
||||||
|
|
||||||
i = p->nOp;
|
i = p->nOp;
|
||||||
p->nOp++;
|
p->nOp++;
|
||||||
@@ -89,20 +90,50 @@ int sqliteVdbeAddOp(Vdbe *p, int op, int p1, int p2){
|
|||||||
p->aOp = aNew;
|
p->aOp = aNew;
|
||||||
memset(&p->aOp[oldSize], 0, (p->nOpAlloc-oldSize)*sizeof(Op));
|
memset(&p->aOp[oldSize], 0, (p->nOpAlloc-oldSize)*sizeof(Op));
|
||||||
}
|
}
|
||||||
p->aOp[i].opcode = op;
|
pOp = &p->aOp[i];
|
||||||
p->aOp[i].p1 = p1;
|
pOp->opcode = op;
|
||||||
|
pOp->p1 = p1;
|
||||||
if( p2<0 && (-1-p2)<p->nLabel && p->aLabel[-1-p2]>=0 ){
|
if( p2<0 && (-1-p2)<p->nLabel && p->aLabel[-1-p2]>=0 ){
|
||||||
p2 = p->aLabel[-1-p2];
|
p2 = p->aLabel[-1-p2];
|
||||||
}
|
}
|
||||||
p->aOp[i].p2 = p2;
|
pOp->p2 = p2;
|
||||||
p->aOp[i].p3 = 0;
|
pOp->p3 = 0;
|
||||||
p->aOp[i].p3type = P3_NOTUSED;
|
pOp->p3type = P3_NOTUSED;
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
if( sqlite_vdbe_addop_trace ) sqliteVdbePrintOp(0, i, &p->aOp[i]);
|
if( sqlite_vdbe_addop_trace ) sqliteVdbePrintOp(0, i, &p->aOp[i]);
|
||||||
#endif
|
#endif
|
||||||
return i;
|
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
|
** Create a new symbolic label for an instruction that has yet to be
|
||||||
** coded. The symbolic label is really just a negative number. The
|
** coded. The symbolic label is really just a negative number. The
|
||||||
|
15
src/where.c
15
src/where.c
@@ -12,7 +12,7 @@
|
|||||||
** This module contains C code that generates VDBE code used to process
|
** This module contains C code that generates VDBE code used to process
|
||||||
** the WHERE clause of SQL statements.
|
** 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"
|
#include "sqliteInt.h"
|
||||||
|
|
||||||
@@ -669,18 +669,17 @@ WhereInfo *sqliteWhereBegin(
|
|||||||
*/
|
*/
|
||||||
for(i=0; i<pTabList->nSrc; i++){
|
for(i=0; i<pTabList->nSrc; i++){
|
||||||
Table *pTab;
|
Table *pTab;
|
||||||
|
Index *pIx;
|
||||||
|
|
||||||
pTab = pTabList->a[i].pTab;
|
pTab = pTabList->a[i].pTab;
|
||||||
if( pTab->isTransient || pTab->pSelect ) continue;
|
if( pTab->isTransient || pTab->pSelect ) continue;
|
||||||
sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0);
|
sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0);
|
||||||
sqliteVdbeAddOp(v, OP_OpenRead, pTabList->a[i].iCursor, pTab->tnum);
|
sqliteVdbeOp3(v, OP_OpenRead, pTabList->a[i].iCursor, pTab->tnum,
|
||||||
sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC);
|
pTab->zName, P3_STATIC);
|
||||||
sqliteCodeVerifySchema(pParse, pTab->iDb);
|
sqliteCodeVerifySchema(pParse, pTab->iDb);
|
||||||
if( pWInfo->a[i].pIdx!=0 ){
|
if( (pIx = pWInfo->a[i].pIdx)!=0 ){
|
||||||
sqliteVdbeAddOp(v, OP_Integer, pWInfo->a[i].pIdx->iDb, 0);
|
sqliteVdbeAddOp(v, OP_Integer, pIx->iDb, 0);
|
||||||
sqliteVdbeAddOp(v, OP_OpenRead,
|
sqliteVdbeOp3(v, OP_OpenRead, pWInfo->a[i].iCur, pIx->tnum, pIx->zName,0);
|
||||||
pWInfo->a[i].iCur, pWInfo->a[i].pIdx->tnum);
|
|
||||||
sqliteVdbeChangeP3(v, -1, pWInfo->a[i].pIdx->zName, P3_STATIC);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user