]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Test the handling of errors in virtual table methods. (CVS 3284)
authordanielk1977 <danielk1977@noemail.net>
Thu, 22 Jun 2006 09:53:48 +0000 (09:53 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Thu, 22 Jun 2006 09:53:48 +0000 (09:53 +0000)
FossilOrigin-Name: 51b729d9d9f8a60cdfb552809e4aa10012f4eb68

manifest
manifest.uuid
src/main.c
src/sqlite.h.in
src/test8.c
src/test_schema.c
src/vdbe.c
test/vtab1.test
test/vtab_err.test [new file with mode: 0644]

index ce345daad61ef1c4fe50c0a324d3f6e8af90715f..3a25ed2353c464b4a8e2ec0c5a48fe6fd918ccb9 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Make\sthe\slast_insert_rowid\smethod\sin\sthe\sTCL\sinterface\swork\swith\n64-bit\srowids.\s(CVS\s3283)
-D 2006-06-21T19:30:34
+C Test\sthe\shandling\sof\serrors\sin\svirtual\stable\smethods.\s(CVS\s3284)
+D 2006-06-22T09:53:49
 F Makefile.in f839b470345d3cb4b0644068474623fe2464b5d3
 F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935
 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@@ -49,7 +49,7 @@ F src/hash.h 1b3f7e2609141fd571f62199fc38687d262e9564
 F src/insert.c 63f01d3f4e0ba7ed171934a24aece2191824faec
 F src/legacy.c fa15d505dd4e45044177ee4d1c6aeaf8c836d390
 F src/loadext.c b08c5f5a57b78afd8cd0dd1677e98519e18db56f
-F src/main.c 7101314a365120465bf5e308caaf518b7776430c
+F src/main.c 645a02be048d60ead33e53e10e0b84fb002bf7ca
 F src/md5.c c5fdfa5c2593eaee2e32a5ce6c6927c986eaf217
 F src/os.c 59f05de8c5777c34876607114a2fbe55ae578235
 F src/os.h ac2ccb4f48902c1611a7e1f171eb81d17e3b8eb2
@@ -72,7 +72,7 @@ F src/random.c d40f8d356cecbd351ccfab6eaedd7ec1b54f5261
 F src/select.c 380fa06c99ae01050c0054c4b1db91e9f1d8322d
 F src/server.c 087b92a39d883e3fa113cae259d64e4c7438bc96
 F src/shell.c ad73192b30a338a58fe81183d4a5d5a1d4e51d36
-F src/sqlite.h.in 7855b46387f3f6ac1925301f450df9cbd7a1269b
+F src/sqlite.h.in b8c6139b3af13a2c361a8a5aeabb28aa3eef1ae1
 F src/sqlite3ext.h e334107f6cad0d00c0414e04189742a45ce916b1
 F src/sqliteInt.h d79b031593462dfcbc8c122a5f698a00e6b124fa
 F src/table.c f64ec4fbfe333f8df925bc6ba494f55e05b0e75e
@@ -84,11 +84,11 @@ F src/test4.c 8b784cd82de158a2317cb4ac4bc86f91ad315e25
 F src/test5.c 7162f8526affb771c4ed256826eee7bb9eca265f
 F src/test6.c 60a02961ceb7b3edc25f5dc5c1ac2556622a76de
 F src/test7.c 03fa8d787f6aebc6d1f72504d52f33013ad2c8e3
-F src/test8.c d584dc94c0a62afb21bca311d2958defc6684236
+F src/test8.c b8014836e18b9f42d0ac5c190efcc8318694c14e
 F src/test_async.c e3deaedd4d86a56391b81808fde9e44fbd92f1d3
 F src/test_loadext.c 22065d601a18878e5542191001f0eaa5d77c0ed8
 F src/test_md5.c 6c42bc0a3c0b54be34623ff77a0eec32b2fa96e3
-F src/test_schema.c 741238e40158a4ff88e450bdcf60836570283a71
+F src/test_schema.c 5aeddd60a60c3070de4c5bfa4f5c333c7769109c
 F src/test_server.c a6460daed0b92ecbc2531b6dc73717470e7a648c
 F src/test_tclvar.c c52f67fbe06d32804af2ba9a2d7aadfc15f5910c
 F src/tokenize.c 6ebcafa6622839968dda4418a7b6945f277a128f
@@ -97,7 +97,7 @@ F src/update.c 686b13db8b28a129a2407aaffc8b7588d1104e0b
 F src/utf.c ab81ac59084ff1c07d421eb1a0a84ec809603b44
 F src/util.c ca6ee72772c0f5dc04d2e0ab1973fd3b6a9bf79d
 F src/vacuum.c 5b37d0f436f8e1ffacd17934e44720b38d2247f9
-F src/vdbe.c 4b55bfea65855201b8f2e07102ad70ea1d21b7f6
+F src/vdbe.c 2c36e0badc0bcc14f099e95ec84470c479fbd399
 F src/vdbe.h 258b5d1c0aaa72192f09ff0568ce42b383f156fa
 F src/vdbeInt.h 6ccb7eaae76ebd761470f6a035501ff33aa92c20
 F src/vdbeapi.c 6af0e7160af260052a7a4500464221a03dada75f
@@ -291,12 +291,13 @@ F test/vacuum.test 37f998b841cb335397c26d9bbc3457182af2565f
 F test/vacuum2.test 5aea8c88a65cb29f7d175296e7c819c6158d838c
 F test/varint.test ab7b110089a08b9926ed7390e7e97bdefeb74102
 F test/view.test 16e2774fe35e47a07ac4471b7f0bcc948b1aa6d5
-F test/vtab1.test 5bb366f18287c9b4c8af110a810c10eb713fb58b
+F test/vtab1.test 3f21d81e599afd100e60830f5f0426c1f74febda
 F test/vtab2.test e57f9865368df26ef5eb8bc630962d82086f174b
 F test/vtab3.test f38d6d7d19f08bffdadce4d5b8cba078f8118587
 F test/vtab4.test 4b4293341443839ef6dc02f8d9e614702a6c67ff
 F test/vtab5.test 9fb8f335651afe8f870011e2f68e5b00c5ad03cd
 F test/vtab6.test 0b4fe07e421b2b9a334bec8781e75cbd8e230bd3
+F test/vtab_err.test 7b435152e5555ca01645cbd15864430a80c44765
 F test/where.test ee7c9a6659b07e1ee61177f6e7ff71565ee2c9df
 F test/where2.test a16476a5913e75cf65b38f2daa6157a6b7791394
 F test/where3.test 3b5ad2c58069e12be2bd86bc5e211a82810521aa
@@ -372,7 +373,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
 F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
-P 2d2805785f473afc202df532df84c45e6f0dc0f1
-R d6693457ff045b088af9dc2f8803cb5d
-U drh
-Z ebff9741f160eff78cf3357f860940cd
+P d50c37975de7639627422cbed40eb03a431874d5
+R deba37635ada8fb35f1bc556c53eccea
+U danielk1977
+Z fb72a1410426354cd3d1ca1870332bcd
index 8be725a07d1a65ec70e2d6939f7758332c8d5786..c307b704a8e7764816f3a5ed5ace1f404143b87d 100644 (file)
@@ -1 +1 @@
-d50c37975de7639627422cbed40eb03a431874d5
\ No newline at end of file
+51b729d9d9f8a60cdfb552809e4aa10012f4eb68
\ No newline at end of file
index 44569e011a0405d9f718348302f95aed5a66350c..b72d219dad904e69d02bbd7990583c1f1e1c6693 100644 (file)
@@ -14,7 +14,7 @@
 ** other files are for internal use by SQLite and should not be
 ** accessed by users of the library.
 **
-** $Id: main.c,v 1.345 2006/06/16 16:08:55 danielk1977 Exp $
+** $Id: main.c,v 1.346 2006/06/22 09:53:49 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 #include "os.h"
@@ -203,10 +203,10 @@ void sqlite3RollbackAll(sqlite3 *db){
       db->aDb[i].inTrans = 0;
     }
   }
+  sqlite3VtabRollback(db);
   if( db->flags&SQLITE_InternChanges ){
     sqlite3ResetInternalSchema(db, 0);
   }
-  sqlite3VtabRollback(db);
 
   /* If one has been configured, invoke the rollback-hook callback */
   if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){
index 426ba73574392bc67c84f4e6cbdf2a4ffb930bc8..cb613b2fe8078b06e4cc010bb628898d92d9349a 100644 (file)
@@ -12,7 +12,7 @@
 ** This header file defines the interface that the SQLite library
 ** presents to client programs.
 **
-** @(#) $Id: sqlite.h.in,v 1.180 2006/06/17 09:39:56 danielk1977 Exp $
+** @(#) $Id: sqlite.h.in,v 1.181 2006/06/22 09:53:50 danielk1977 Exp $
 */
 #ifndef _SQLITE3_H_
 #define _SQLITE3_H_
@@ -1551,6 +1551,7 @@ struct sqlite3_module {
   int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr,
                 int argc, sqlite3_value **argv);
   int (*xNext)(sqlite3_vtab_cursor*);
+  int (*xEof)(sqlite3_vtab_cursor*);
   int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int);
   int (*xRowid)(sqlite3_vtab_cursor*, sqlite_int64 *pRowid);
   int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite_int64 *);
index ca04dc9c7502362148036929f6afb27eee015686..dae047d35a970278174cbafa1097c947fd1f3ab2 100644 (file)
@@ -13,7 +13,7 @@
 ** is not included in the SQLite library.  It is used for automated
 ** testing of the SQLite library.
 **
-** $Id: test8.c,v 1.30 2006/06/21 16:02:43 danielk1977 Exp $
+** $Id: test8.c,v 1.31 2006/06/22 09:53:50 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 #include "tcl.h"
@@ -49,6 +49,7 @@ struct echo_vtab {
   sqlite3 *db;
 
   char *zTableName;       /* Name of the real table */
+  char *zLogName;         /* Name of the log table */
   int nCol;               /* Number of columns in the real table */
   int *aIndex;            /* Array of size nCol. True if column has an index */
   char **aCol;            /* Array of size nCol. Column names */
@@ -194,7 +195,7 @@ static int echoDeclareVtab(
 ){
   int rc = SQLITE_OK;
 
-  if( argc==4 ){
+  if( argc>=4 ){
     sqlite3_stmt *pStmt = 0;
     sqlite3_prepare(db, 
         "SELECT sql FROM sqlite_master WHERE type = 'table' AND name = ?",
@@ -266,8 +267,20 @@ static int echoCreate(
   int argc, char **argv,
   sqlite3_vtab **ppVtab
 ){
+  int rc = SQLITE_OK;
   appendToEchoModule((Tcl_Interp *)(pAux), "xCreate");
-  return echoConstructor(db, pAux, argc, argv, ppVtab);
+  rc = echoConstructor(db, pAux, argc, argv, ppVtab);
+#if 0
+  if( rc==SQLITE_OK && argc==5 ){
+    char *zSql;
+    echo_vtab *pVtab = *(echo_vtab **)ppVtab;
+    pVtab->zLogName = sqlite3MPrintf("%s", argv[4]);
+    zSql = sqlite3MPrintf("CREATE TABLE %Q(logmsg)", pVtab->zLogName);
+    rc = sqlite3_exec(db, zSql, 0, 0, 0);
+    sqliteFree(zSql);
+  }
+#endif
+  return rc;
 }
 static int echoConnect(
   sqlite3 *db,
@@ -284,8 +297,21 @@ static int echoDisconnect(sqlite3_vtab *pVtab){
   return echoDestructor(pVtab);
 }
 static int echoDestroy(sqlite3_vtab *pVtab){
+  int rc = SQLITE_OK;
+  echo_vtab *p = (echo_vtab *)pVtab;
   appendToEchoModule(((echo_vtab *)pVtab)->interp, "xDestroy");
-  return echoDestructor(pVtab);
+#if 0
+  if( p && p->zLogName ){
+    char *zSql;
+    zSql = sqlite3MPrintf("DROP TABLE %Q", p->zLogName);
+    rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
+    sqliteFree(zSql);
+  }
+#endif
+  if( rc==SQLITE_OK ){
+    rc = echoDestructor(pVtab);
+  }
+  return rc;
 }
 
 static int echoOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
@@ -302,6 +328,14 @@ static int echoClose(sqlite3_vtab_cursor *cur){
   return SQLITE_OK;
 }
 
+/*
+** Return non-zero if the cursor does not currently point to a valid record
+** (i.e if the scan has finished), or zero otherwise.
+*/
+static int echoEof(sqlite3_vtab_cursor *cur){
+  return (((echo_cursor *)cur)->pStmt ? 0 : 1);
+}
+
 static int echoNext(sqlite3_vtab_cursor *cur){
   int rc;
   echo_cursor *pCur = (echo_cursor *)cur;
@@ -309,11 +343,10 @@ static int echoNext(sqlite3_vtab_cursor *cur){
   rc = sqlite3_step(pCur->pStmt);
 
   if( rc==SQLITE_ROW ){
-    rc = 1;
-  } else {
-    pCur->errcode = sqlite3_finalize(pCur->pStmt);
+    rc = SQLITE_OK;
+  }else{
+    rc = sqlite3_finalize(pCur->pStmt);
     pCur->pStmt = 0;
-    rc = 0;
   }
 
   return rc;
@@ -406,6 +439,7 @@ static int echoFilter(
   if( rc==SQLITE_OK ){
     ret = echoNext(pVtabCursor);
   }else{
+    assert( !pCur->pStmt );
     ret = 0;
     pCur->errcode = rc;
   }
@@ -723,6 +757,7 @@ static sqlite3_module echoModule = {
   echoClose,                 /* xClose - close a cursor */
   echoFilter,                /* xFilter - configure scan constraints */
   echoNext,                  /* xNext - advance a cursor */
+  echoEof,                   /* xEof */
   echoColumn,                /* xColumn - read data */
   echoRowid,                 /* xRowid - read data */
   echoUpdate,                /* xUpdate - write data */
index 06e1db15aad3075adde474cd39f048bebe551005..671940343d622e83d8c249e31cc760facbbb89a0 100644 (file)
@@ -13,7 +13,7 @@
 ** is not included in the SQLite library.  It is used for automated
 ** testing of the SQLite library.
 **
-** $Id: test_schema.c,v 1.5 2006/06/20 11:01:08 danielk1977 Exp $
+** $Id: test_schema.c,v 1.6 2006/06/22 09:53:50 danielk1977 Exp $
 */
 
 /* The code in this file defines a sqlite3 virtual-table module that
@@ -161,6 +161,11 @@ static int finalize(sqlite3_stmt **ppStmt){
   return rc;
 }
 
+static int schemaEof(sqlite3_vtab_cursor *cur){
+  schema_cursor *pCur = (schema_cursor *)cur;
+  return (pCur->pDbList ? 0 : 1);
+}
+
 /*
 ** Advance the cursor to the next row.
 */
@@ -171,15 +176,15 @@ static int schemaNext(sqlite3_vtab_cursor *cur){
   char *zSql = 0;
 
   while( !pCur->pColumnList || SQLITE_ROW!=sqlite3_step(pCur->pColumnList) ){
-    if( SQLITE_OK!=(rc = finalize(&pCur->pColumnList)) ) goto fail;
+    if( SQLITE_OK!=(rc = finalize(&pCur->pColumnList)) ) goto next_exit;
 
     while( !pCur->pTableList || SQLITE_ROW!=sqlite3_step(pCur->pTableList) ){
-      if( SQLITE_OK!=(rc = finalize(&pCur->pTableList)) ) goto fail;
+      if( SQLITE_OK!=(rc = finalize(&pCur->pTableList)) ) goto next_exit;
 
       assert(pCur->pDbList);
       while( SQLITE_ROW!=sqlite3_step(pCur->pDbList) ){
-        if( SQLITE_OK!=(rc = finalize(&pCur->pDbList)) ) goto fail;
-        return 0;
+        rc = finalize(&pCur->pDbList);
+        goto next_exit;
       }
 
       /* Set zSql to the SQL to pull the list of tables from the 
@@ -200,12 +205,12 @@ static int schemaNext(sqlite3_vtab_cursor *cur){
       }
       if( !zSql ){
         rc = SQLITE_NOMEM;
-        goto fail;
+        goto next_exit;
       }
 
       rc = sqlite3_prepare(pVtab->db, zSql, -1, &pCur->pTableList, 0);
       sqlite3_free(zSql);
-      if( rc!=SQLITE_OK ) goto fail;
+      if( rc!=SQLITE_OK ) goto next_exit;
     }
 
     /* Set zSql to the SQL to the table_info pragma for the table currently
@@ -219,17 +224,17 @@ static int schemaNext(sqlite3_vtab_cursor *cur){
 
     if( !zSql ){
       rc = SQLITE_NOMEM;
-      goto fail;
+      goto next_exit;
     }
     rc = sqlite3_prepare(pVtab->db, zSql, -1, &pCur->pColumnList, 0);
     sqlite3_free(zSql);
-    if( rc!=SQLITE_OK ) goto fail;
+    if( rc!=SQLITE_OK ) goto next_exit;
   }
   pCur->rowid++;
 
-fail:
+next_exit:
   /* TODO: Handle rc */
-  return 1;
+  return rc;
 }
 
 /*
@@ -274,6 +279,7 @@ static sqlite3_module schemaModule = {
   schemaClose,                 /* xClose - close a cursor */
   schemaFilter,                /* xFilter - configure scan constraints */
   schemaNext,                  /* xNext - advance a cursor */
+  schemaEof,                   /* xEof */
   schemaColumn,                /* xColumn - read data */
   schemaRowid,                 /* xRowid - read data */
 };
index 1b641beca82af1f72d9808226c3f377e7a81a103..d59ce628f87d2687933e36ff30e2dc4f102d71d8 100644 (file)
@@ -43,7 +43,7 @@
 ** in this file for details.  If in doubt, do not deviate from existing
 ** commenting and indentation practices when changing or adding code.
 **
-** $Id: vdbe.c,v 1.564 2006/06/16 21:13:22 drh Exp $
+** $Id: vdbe.c,v 1.565 2006/06/22 09:53:50 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 #include "os.h"
@@ -4651,10 +4651,13 @@ case OP_VFilter: {   /* no-push */
     }
 
     if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
-    res = pModule->xFilter(pCur->pVtabCursor, pTos->i, pOp->p3, nArg, apArg);
+    rc = pModule->xFilter(pCur->pVtabCursor, pTos->i, pOp->p3, nArg, apArg);
+    if( rc==SQLITE_OK ){
+      res = pModule->xEof(pCur->pVtabCursor);
+    }
     if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
 
-    if( res==0 ){
+    if( res ){
       pc = pOp->p2 - 1;
     }
   }
@@ -4759,11 +4762,14 @@ case OP_VNext: {   /* no-push */
     ** some other method is next invoked on the save virtual table cursor.
     */
     if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
-    res = pModule->xNext(pCur->pVtabCursor);
+    rc = pModule->xNext(pCur->pVtabCursor);
+    if( rc==SQLITE_OK ){
+      res = pModule->xEof(pCur->pVtabCursor);
+    }
     if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
 
-    if( res ){
-      /* If there is data (or an error), jump to P2 */
+    if( !res ){
+      /* If there is data, jump to P2 */
       pc = pOp->p2 - 1;
     }
   }
index 445a980766592e7b2ea31693b6e3350c7d318bbe..f9fc9be79057c4c1f6a1856a94bb338917d7573a 100644 (file)
@@ -11,7 +11,7 @@
 # This file implements regression tests for SQLite library.  The
 # focus of this file is creating and dropping virtual tables.
 #
-# $Id: vtab1.test,v 1.28 2006/06/21 16:02:44 danielk1977 Exp $
+# $Id: vtab1.test,v 1.29 2006/06/22 09:53:50 danielk1977 Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -738,6 +738,36 @@ do_test vtab1.8-1 {
         xSync   echo(real_abc)         \
         xCommit echo(real_abc)         \
 ]
+do_test vtab1.8-2 {
+  execsql {
+    DROP TABLE aux.e2;
+    DROP TABLE treal;
+    DROP TABLE techo;
+    DROP TABLE echo_abc;
+    DROP TABLE real_abc;
+  }
+} {}
+
+if 0 {
+  do_test vtab1.9-1 {
+    set echo_module ""
+    execsql {
+      CREATE TABLE r(a, b, c);
+      CREATE VIRTUAL TABLE e USING echo(r, e_log);
+      SELECT name FROM sqlite_master;
+    }
+  } {r e e_log}
+  do_test vtab1.9-2 {
+    explain {
+      DROP TABLE e;
+    }
+    execsql {
+      PRAGMA vdbe_trace = 1;
+      DROP TABLE e;
+      SELECT name FROM sqlite_master;
+    }
+  } {r}
+}
 
 finish_test
 
diff --git a/test/vtab_err.test b/test/vtab_err.test
new file mode 100644 (file)
index 0000000..cae67c2
--- /dev/null
@@ -0,0 +1,42 @@
+# 2006 June 10
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+# $Id: vtab_err.test,v 1.1 2006/06/22 09:53:50 danielk1977 Exp $
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+ifcapable !vtab {
+  finish_test
+  return
+}
+
+do_ioerr_test vtab_err-1 -tclprep {
+  register_echo_module [sqlite3_connection_pointer db]
+} -sqlbody {
+  BEGIN;
+  CREATE TABLE r(a PRIMARY KEY, b, c);
+  CREATE VIRTUAL TABLE e USING echo(r);
+  INSERT INTO e VALUES(1, 2, 3);
+  INSERT INTO e VALUES('a', 'b', 'c');
+  UPDATE e SET c = 10;
+  DELETE FROM e WHERE a = 'a';
+  COMMIT;
+  BEGIN;
+    CREATE TABLE r2(a, b, c);
+    INSERT INTO r2 SELECT * FROM e;
+    INSERT INTO e SELECT a||'x', b, c FROM r2;
+  COMMIT;
+}
+
+
+finish_test
+