diff options
author | drh <drh@noemail.net> | 2006-06-14 19:00:20 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2006-06-14 19:00:20 +0000 |
commit | 4cbdda9e273d030228bc58128d59e84009baefeb (patch) | |
tree | 8da8bb9cb7812dbe99a7e58929aab1b73c630095 /src/delete.c | |
parent | badf7a7a2fa7af2e78341999a3de812d04d1eaeb (diff) | |
download | sqlite-4cbdda9e273d030228bc58128d59e84009baefeb.tar.gz sqlite-4cbdda9e273d030228bc58128d59e84009baefeb.zip |
Added code to INSERT, DELETE and UPDATE virtual tables. The new code is
mostly untested. (CVS 3248)
FossilOrigin-Name: 32c97b884b104d120db3c0a87f5eab28f36851f8
Diffstat (limited to 'src/delete.c')
-rw-r--r-- | src/delete.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/src/delete.c b/src/delete.c index e16597d8a..37b8577d8 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 ** in order to generate code for DELETE FROM statements. ** -** $Id: delete.c,v 1.123 2006/06/11 23:41:55 drh Exp $ +** $Id: delete.c,v 1.124 2006/06/14 19:00:21 drh Exp $ */ #include "sqliteInt.h" @@ -42,8 +42,12 @@ Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){ ** writable return 0; */ int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){ - if( pTab->readOnly && (pParse->db->flags & SQLITE_WriteSchema)==0 - && pParse->nested==0 ){ + if( (pTab->readOnly && (pParse->db->flags & SQLITE_WriteSchema)==0 + && pParse->nested==0) +#ifndef SQLITE_OMIT_VIRTUALTABLE + || (pTab->pModule && pTab->pModule->xUpdate==0) +#endif + ){ sqlite3ErrorMsg(pParse, "table %s may not be modified", pTab->zName); return 1; } @@ -66,7 +70,9 @@ void sqlite3OpenTable( Table *pTab, /* The table to be opened */ int opcode /* OP_OpenRead or OP_OpenWrite */ ){ - Vdbe *v = sqlite3GetVdbe(p); + Vdbe *v; + if( IsVirtual(pTab) ) return; + v = sqlite3GetVdbe(p); assert( opcode==OP_OpenWrite || opcode==OP_OpenRead ); sqlite3TableLock(p, iDb, pTab->tnum, (opcode==OP_OpenWrite), pTab->zName); sqlite3VdbeAddOp(v, OP_Integer, iDb, 0); @@ -205,7 +211,7 @@ void sqlite3DeleteFrom( ** It is easier just to erase the whole table. Note, however, that ** this means that the row change count will be incorrect. */ - if( pWhere==0 && !triggers_exist ){ + if( pWhere==0 && !triggers_exist && !IsVirtual(pTab) ){ if( db->flags & SQLITE_CountRows ){ /* If counting rows deleted, just count the total number of ** entries in the table. */ @@ -243,7 +249,7 @@ void sqlite3DeleteFrom( /* Remember the rowid of every item to be deleted. */ - sqlite3VdbeAddOp(v, OP_Rowid, iCur, 0); + sqlite3VdbeAddOp(v, IsVirtual(pTab) ? OP_VRowid : OP_Rowid, iCur, 0); sqlite3VdbeAddOp(v, OP_FifoWrite, 0, 0); if( db->flags & SQLITE_CountRows ){ sqlite3VdbeAddOp(v, OP_AddImm, 1, 0); @@ -304,7 +310,14 @@ void sqlite3DeleteFrom( } /* Delete the row */ - sqlite3GenerateRowDelete(db, v, pTab, iCur, pParse->nested==0); +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + sqlite3VdbeOp3(v, OP_VUpdate, 0, 1, (const char*)pTab->pVtab, P3_VTAB); + }else +#endif + { + sqlite3GenerateRowDelete(db, v, pTab, iCur, pParse->nested==0); + } } /* If there are row triggers, close all cursors then invoke @@ -327,7 +340,7 @@ void sqlite3DeleteFrom( sqlite3VdbeResolveLabel(v, end); /* Close the cursors after the loop if there are no row triggers */ - if( !triggers_exist ){ + if( !triggers_exist && !IsVirtual(pTab) ){ for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ sqlite3VdbeAddOp(v, OP_Close, iCur + i, pIdx->tnum); } |