Annotation of embedaddon/sqlite3/test/vtab_shared.test, revision 1.1.1.1

1.1       misho       1: # 2007 April 16
                      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 tests interactions between the virtual table and
                     12: # shared-schema functionality.
                     13: #
                     14: # $Id: vtab_shared.test,v 1.3 2009/07/24 17:58:53 danielk1977 Exp $
                     15: 
                     16: set testdir [file dirname $argv0]
                     17: source $testdir/tester.tcl
                     18: 
                     19: ifcapable !vtab||!shared_cache {
                     20:   finish_test
                     21:   return
                     22: }
                     23: 
                     24: db close
                     25: sqlite3_enable_shared_cache 1
                     26: sqlite3 db  test.db
                     27: sqlite3 db2 test.db
                     28: 
                     29: do_test vtab_shared-1.1 {
                     30:   register_echo_module [sqlite3_connection_pointer db]
                     31:   execsql {
                     32:     CREATE TABLE t0(a, b, c);
                     33:     INSERT INTO t0 VALUES(1, 2, 3);
                     34:     CREATE VIRTUAL TABLE t1 USING echo(t0);
                     35:   }
                     36: } {}
                     37: 
                     38: do_test vtab_shared-1.2 {
                     39:   execsql { SELECT * FROM t1 } db
                     40: } {1 2 3}
                     41: 
                     42: # Fails because the 'echo' module has not been registered with connection db2
                     43: do_test vtab_shared-1.3 {
                     44:   catchsql { SELECT * FROM t1 } db2
                     45: } {1 {no such module: echo}}
                     46: 
                     47: do_test vtab_shared-1.4 {
                     48:   execsql { SELECT * FROM t0 } db2
                     49: } {1 2 3}
                     50: 
                     51: do_test vtab_shared-1.5 {
                     52:   register_echo_module [sqlite3_connection_pointer db2]
                     53:   execsql { SELECT * FROM t1 } db
                     54: } {1 2 3}
                     55: 
                     56: # Works after the module is registered with db2
                     57: do_test vtab_shared-1.6 {
                     58:   execsql { SELECT * FROM t1 } db2
                     59: } {1 2 3}
                     60: 
                     61: # Set a write-lock on table t0 using connection [db]. Then try to read from
                     62: # virtual table t1 using [db2]. That this returns an SQLITE_LOCKED error
                     63: # shows that the correct sqlite3_vtab is being used.
                     64: #
                     65: do_test vtab_shared-1.8.1 {
                     66:   execsql { 
                     67:     BEGIN;
                     68:     INSERT INTO t1 VALUES(4, 5, 6);
                     69:     SELECT * FROM t1;
                     70:   }
                     71: } {1 2 3 4 5 6}
                     72: do_test vtab_shared-1.8.2 {
                     73:   catchsql { SELECT * FROM t1 } db2
                     74: } {1 {database table is locked}}
                     75: do_test vtab_shared-1.8.3 {
                     76:   catchsql { SELECT *  FROM t0 } db2
                     77: } {1 {database table is locked: t0}}
                     78: do_test vtab_shared-1.8.4 {
                     79:   execsql { SELECT * FROM t0 } db
                     80: } {1 2 3 4 5 6}
                     81: do_test vtab_shared-1.8.5 {
                     82:   execsql { COMMIT } db
                     83:   execsql { SELECT *  FROM t1 } db2
                     84: } {1 2 3 4 5 6}
                     85: 
                     86: # While a SELECT is active on virtual table t1 via connection [db], close 
                     87: # [db2]. This causes the schema to be reset internally. Verify that this
                     88: # does not cause a problem.
                     89: #
                     90: foreach {iTest dbSelect dbClose} {
                     91:   1 db  db2
                     92:   2 db  db2
                     93:   3 db2 db
                     94: } {
                     95:   do_test vtab_shared-1.9.$iTest {
                     96:     set res [list]
                     97:     $dbSelect eval { SELECT * FROM t1 } {
                     98:       if {$a == 1} {$dbClose close}
                     99:       lappend res $a $b $c
                    100:     }
                    101:     sqlite3 $dbClose test.db
                    102:     register_echo_module [sqlite3_connection_pointer $dbClose]
                    103:     set res
                    104:   } {1 2 3 4 5 6}
                    105: }
                    106: 
                    107: # Ensure that it is not possible for one connection to DROP a virtual
                    108: # table while a second connection is reading from the database.
                    109: #
                    110: do_test vtab_shared-1.10 {
                    111:   db eval { SELECT * FROM t1 } {
                    112:     set error [catchsql { DROP TABLE t1 } db2]
                    113:     break
                    114:   }
                    115:   set error
                    116: } {1 {database table is locked: sqlite_master}}
                    117: 
                    118: do_test vtab_shared-1.11 {
                    119: breakpoint
                    120:   execsql {
                    121:     CREATE VIRTUAL TABLE t2 USING echo(t0);
                    122:     CREATE VIRTUAL TABLE t3 USING echo(t0);
                    123:   }
                    124:   execsql { SELECT * FROM t3 } db2
                    125: } {1 2 3 4 5 6}
                    126: 
                    127: do_test vtab_shared-1.12.1 {
                    128:   db close
                    129:   execsql { 
                    130:     SELECT * FROM t1 UNION ALL
                    131:     SELECT * FROM t2 UNION ALL
                    132:     SELECT * FROM t3 
                    133:   } db2
                    134: } {1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6}
                    135: do_test vtab_shared-1.12.2 {
                    136:   sqlite3 db test.db
                    137:   register_echo_module [sqlite3_connection_pointer db]
                    138:   execsql { 
                    139:     SELECT * FROM t1 UNION ALL
                    140:     SELECT * FROM t2 UNION ALL
                    141:     SELECT * FROM t3 
                    142:   } db
                    143: } {1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6}
                    144: 
                    145: # Try a rename or two.
                    146: #
                    147: ifcapable altertable {
                    148:   do_test vtab_shared-1.13.1 {
                    149:     execsql { ALTER TABLE t1 RENAME TO t4 }
                    150:     execsql { SELECT * FROM t4 } db
                    151:   } {1 2 3 4 5 6}
                    152:   do_test vtab_shared-1.13.2 {
                    153:     execsql { SELECT * FROM t4 } db2
                    154:   } {1 2 3 4 5 6}
                    155:   do_test vtab_shared-1.13.3 {
                    156:     execsql { ALTER TABLE t2 RENAME TO t5 }
                    157:     execsql { SELECT * FROM t4 } db2
                    158:   } {1 2 3 4 5 6}
                    159: }
                    160: 
                    161: # Try an UPDATE/INSERT/DELETE on a shared vtab as the first statement after a
                    162: # schema is loaded.
                    163: do_test vtab_shared_1.14.1 {
                    164:   db2 close
                    165:   sqlite3 db2 test.db
                    166:   register_echo_module [sqlite3_connection_pointer db2]
                    167:   execsql { SELECT * FROM t3 }
                    168: } {1 2 3 4 5 6}
                    169: do_test vtab_shared_1.14.2 {
                    170:   execsql { 
                    171:     UPDATE t3 SET c = 'six' WHERE c = 6;
                    172:     SELECT * FROM t3;
                    173:   } db2
                    174: } {1 2 3 4 5 six}
                    175: do_test vtab_shared_1.14.3 {
                    176:   db2 close
                    177:   sqlite3 db2 test.db
                    178:   register_echo_module [sqlite3_connection_pointer db2]
                    179:   execsql { SELECT * FROM t3 }
                    180: } {1 2 3 4 5 six}
                    181: do_test vtab_shared_1.14.4 {
                    182:   execsql { 
                    183:     DELETE FROM t3 WHERE c = 'six';
                    184:     SELECT * FROM t3;
                    185:   } db2
                    186: } {1 2 3}
                    187: do_test vtab_shared_1.14.5 {
                    188:   db2 close
                    189:   sqlite3 db2 test.db
                    190:   register_echo_module [sqlite3_connection_pointer db2]
                    191:   execsql { SELECT * FROM t3 }
                    192: } {1 2 3}
                    193: do_test vtab_shared_1.14.6 {
                    194:   execsql { 
                    195:     INSERT INTO t3 VALUES(4, 5, 6);
                    196:     SELECT * FROM t3;
                    197:   } db2
                    198: } {1 2 3 4 5 6}
                    199: 
                    200: do_test vtab_shared_1.15.1 {
                    201:   db2 close
                    202:   sqlite3 db2 test.db
                    203:   register_echo_module [sqlite3_connection_pointer db2]
                    204:   execsql { 
                    205:     UPDATE t3 SET c = 'six' WHERE c = 6;
                    206:     SELECT * FROM t3;
                    207:   } db2
                    208: } {1 2 3 4 5 six}
                    209: do_test vtab_shared_1.15.2 {
                    210:   db2 close
                    211:   sqlite3 db2 test.db
                    212:   register_echo_module [sqlite3_connection_pointer db2]
                    213:   execsql { 
                    214:     DELETE FROM t3 WHERE c = 'six';
                    215:     SELECT * FROM t3;
                    216:   } db2
                    217: } {1 2 3}
                    218: do_test vtab_shared_1.15.3 {
                    219:   db2 close
                    220:   sqlite3 db2 test.db
                    221:   register_echo_module [sqlite3_connection_pointer db2]
                    222:   execsql { 
                    223:     INSERT INTO t3 VALUES(4, 5, 6);
                    224:     SELECT * FROM t3;
                    225:   }
                    226: } {1 2 3 4 5 6}
                    227: 
                    228: db close
                    229: db2 close
                    230: sqlite3_enable_shared_cache 0
                    231: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>