Home | History | Annotate | Download | only in test
      1 # 2006 June 10
      2 #
      3 # The author disclaims copyright to this source code.  In place of
      4 # a legal notice, here is a blessing:
      5 #
      6 #    May you do good and not evil.
      7 #    May you find forgiveness for yourself and forgive others.
      8 #    May you share freely, never taking more than you give.
      9 #
     10 #***********************************************************************
     11 # This file implements regression tests for SQLite library. The
     12 # focus is on testing the following virtual table methods:
     13 #
     14 #     xBegin
     15 #     xSync
     16 #     xCommit
     17 #     xRollback
     18 #
     19 # $Id: vtab4.test,v 1.3 2008/07/12 14:52:21 drh Exp $
     20 
     21 set testdir [file dirname $argv0]
     22 source $testdir/tester.tcl
     23 
     24 unset -nocomplain echo_module
     25 unset -nocomplain echo_module_sync_fail
     26 
     27 ifcapable !vtab {
     28   finish_test
     29   return
     30 }
     31 
     32 # Register the echo module
     33 db cache size 0
     34 register_echo_module [sqlite3_connection_pointer db]
     35 
     36 do_test vtab4-1.1 {
     37   execsql {
     38     CREATE TABLE treal(a PRIMARY KEY, b, c);
     39     CREATE VIRTUAL TABLE techo USING echo(treal);
     40   }
     41 } {}
     42 
     43 # Test an INSERT, UPDATE and DELETE statement on the virtual table
     44 # in an implicit transaction. Each should result in a single call
     45 # to xBegin, xSync and xCommit.
     46 #
     47 do_test vtab4-1.2 {
     48   set echo_module [list]
     49   execsql {
     50     INSERT INTO techo VALUES(1, 2, 3);
     51   }
     52   set echo_module
     53 } {xBegin echo(treal) xSync echo(treal) xCommit echo(treal)}
     54 do_test vtab4-1.3 {
     55   set echo_module [list]
     56   execsql {
     57     UPDATE techo SET a = 2;
     58   }
     59   set echo_module
     60 } [list xBestIndex {SELECT rowid, * FROM 'treal'} \
     61         xBegin     echo(treal)                    \
     62         xFilter    {SELECT rowid, * FROM 'treal'} \
     63         xSync      echo(treal)                    \
     64         xCommit    echo(treal)                    \
     65 ]
     66 do_test vtab4-1.4 {
     67   set echo_module [list]
     68   execsql {
     69     DELETE FROM techo;
     70   }
     71   set echo_module
     72 } [list xBestIndex {SELECT rowid, * FROM 'treal'} \
     73         xBegin     echo(treal)                    \
     74         xFilter    {SELECT rowid, * FROM 'treal'} \
     75         xSync      echo(treal)                    \
     76         xCommit    echo(treal)                    \
     77 ]
     78 
     79 # Ensure xBegin is not called more than once in a single transaction.
     80 #
     81 do_test vtab4-2.1 {
     82   set echo_module [list]
     83   execsql {
     84     BEGIN;
     85     INSERT INTO techo VALUES(1, 2, 3);
     86     INSERT INTO techo VALUES(4, 5, 6);
     87     INSERT INTO techo VALUES(7, 8, 9);
     88     COMMIT;
     89   }
     90   set echo_module
     91 } {xBegin echo(treal) xSync echo(treal) xCommit echo(treal)}
     92 
     93 # Try a transaction with two virtual tables.
     94 #
     95 do_test vtab4-2.2 {
     96   execsql {
     97     CREATE TABLE sreal(a, b, c UNIQUE);
     98     CREATE VIRTUAL TABLE secho USING echo(sreal);
     99   }
    100   set echo_module [list]
    101   execsql {
    102     BEGIN;
    103     INSERT INTO secho SELECT * FROM techo;
    104     DELETE FROM techo;
    105     COMMIT;
    106   }
    107   set echo_module
    108 } [list xBestIndex {SELECT rowid, * FROM 'treal'} \
    109         xBegin     echo(sreal)                    \
    110         xFilter    {SELECT rowid, * FROM 'treal'} \
    111         xBestIndex {SELECT rowid, * FROM 'treal'} \
    112         xBegin     echo(treal)                    \
    113         xFilter    {SELECT rowid, * FROM 'treal'} \
    114         xSync   echo(sreal)                       \
    115         xSync   echo(treal)                       \
    116         xCommit echo(sreal)                       \
    117         xCommit echo(treal)                       \
    118 ]
    119 do_test vtab4-2.3 {
    120   execsql {
    121     SELECT * FROM secho;
    122   }
    123 } {1 2 3 4 5 6 7 8 9}
    124 do_test vtab4-2.4 {
    125   execsql {
    126     SELECT * FROM techo;
    127   }
    128 } {}
    129 
    130 # Try an explicit ROLLBACK on a transaction with two open virtual tables.
    131 do_test vtab4-2.5 {
    132   set echo_module [list]
    133   execsql {
    134     BEGIN;
    135     INSERT INTO techo SELECT * FROM secho;
    136     DELETE FROM secho;
    137     ROLLBACK;
    138   }
    139   set echo_module
    140 } [list xBestIndex {SELECT rowid, * FROM 'sreal'} \
    141         xBegin     echo(treal)                    \
    142         xFilter    {SELECT rowid, * FROM 'sreal'} \
    143         xBestIndex {SELECT rowid, * FROM 'sreal'} \
    144         xBegin     echo(sreal)                    \
    145         xFilter    {SELECT rowid, * FROM 'sreal'} \
    146         xRollback  echo(treal)                    \
    147         xRollback  echo(sreal)                    \
    148 ]
    149 do_test vtab4-2.6 {
    150   execsql {
    151     SELECT * FROM secho;
    152   }
    153 } {1 2 3 4 5 6 7 8 9}
    154 do_test vtab4-2.7 {
    155   execsql {
    156     SELECT * FROM techo;
    157   }
    158 } {}
    159 
    160 do_test vtab4-3.1 {
    161   set echo_module [list]
    162   set echo_module_sync_fail treal
    163   catchsql {
    164     INSERT INTO techo VALUES(1, 2, 3);
    165   }
    166 } {1 {unknown error}}
    167 do_test vtab4-3.2 {
    168   set echo_module
    169 } {xBegin echo(treal) xSync echo(treal) xRollback echo(treal)}
    170 
    171 do_test vtab4-3.3 {
    172   set echo_module [list]
    173   set echo_module_sync_fail sreal
    174   catchsql {
    175     BEGIN;
    176     INSERT INTO techo SELECT * FROM secho;
    177     DELETE FROM secho;
    178     COMMIT;
    179   }
    180   set echo_module
    181 } [list xBestIndex {SELECT rowid, * FROM 'sreal'} \
    182         xBegin     echo(treal)                    \
    183         xFilter    {SELECT rowid, * FROM 'sreal'} \
    184         xBestIndex {SELECT rowid, * FROM 'sreal'} \
    185         xBegin     echo(sreal)                    \
    186         xFilter    {SELECT rowid, * FROM 'sreal'} \
    187         xSync      echo(treal)                    \
    188         xSync      echo(sreal)                    \
    189         xRollback  echo(treal)                    \
    190         xRollback  echo(sreal)                    \
    191 ]
    192 
    193 finish_test
    194