Added code to INSERT, DELETE and UPDATE virtual tables.  The new code is
mostly untested. (CVS 3248)

FossilOrigin-Name: 32c97b884b104d120db3c0a87f5eab28f36851f8
diff --git a/src/insert.c b/src/insert.c
index 295d753..3d34fed 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.165 2006/06/11 23:41:55 drh Exp $
+** $Id: insert.c,v 1.166 2006/06/14 19:00:21 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -567,6 +567,10 @@
   ** case the record number is the same as that column. 
   */
   if( !isView ){
+    if( IsVirtual(pTab) ){
+      /* The row that the VUpdate opcode will delete:  none */
+      sqlite3VdbeAddOp(v, OP_Null, 0, 0);
+    }
     if( keyColumn>=0 ){
       if( useTempTable ){
         sqlite3VdbeAddOp(v, OP_Column, srcTab, keyColumn);
@@ -582,6 +586,8 @@
       sqlite3VdbeAddOp(v, OP_Pop, 1, 0);
       sqlite3VdbeAddOp(v, OP_NewRowid, base, counterMem);
       sqlite3VdbeAddOp(v, OP_MustBeInt, 0, 0);
+    }else if( IsVirtual(pTab) ){
+      sqlite3VdbeAddOp(v, OP_Null, 0, 0);
     }else{
       sqlite3VdbeAddOp(v, OP_NewRowid, base, counterMem);
     }
@@ -624,10 +630,18 @@
     /* Generate code to check constraints and generate index keys and
     ** do the insertion.
     */
-    sqlite3GenerateConstraintChecks(pParse, pTab, base, 0, keyColumn>=0,
-                                   0, onError, endOfLoop);
-    sqlite3CompleteInsertion(pParse, pTab, base, 0,0,0,
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+    if( IsVirtual(pTab) ){
+      sqlite3VdbeOp3(v, OP_VUpdate, 0, pTab->nCol+1,
+                     (const char*)pTab->pVtab, P3_VTAB);
+    }else
+#endif
+    {
+      sqlite3GenerateConstraintChecks(pParse, pTab, base, 0, keyColumn>=0,
+                                     0, onError, endOfLoop);
+      sqlite3CompleteInsertion(pParse, pTab, base, 0,0,0,
                             (triggers_exist & TRIGGER_AFTER)!=0 ? newIdx : -1);
+    }
   }
 
   /* Update the count of rows that are inserted
@@ -665,7 +679,7 @@
     sqlite3VdbeResolveLabel(v, iCleanup);
   }
 
-  if( !triggers_exist ){
+  if( !triggers_exist && !IsVirtual(pTab) ){
     /* Close all tables opened */
     sqlite3VdbeAddOp(v, OP_Close, base, 0);
     for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){
@@ -1105,9 +1119,13 @@
   int op           /* OP_OpenRead or OP_OpenWrite */
 ){
   int i;
-  int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
+  int iDb;
   Index *pIdx;
-  Vdbe *v = sqlite3GetVdbe(pParse);
+  Vdbe *v;
+
+  if( IsVirtual(pTab) ) return;
+  iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
+  v = sqlite3GetVdbe(pParse);
   assert( v!=0 );
   sqlite3OpenTable(pParse, base, iDb, pTab, op);
   for(i=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){