Annotation of embedaddon/sqlite3/test/vtab7.test, revision 1.1

1.1     ! misho       1: # 2006 July 25
        !             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 focus
        !            12: # of this test is reading and writing to the database from within a
        !            13: # virtual table xSync() callback.
        !            14: #
        !            15: # $Id: vtab7.test,v 1.4 2007/12/04 16:54:53 drh Exp $
        !            16: 
        !            17: set testdir [file dirname $argv0]
        !            18: source $testdir/tester.tcl
        !            19: 
        !            20: ifcapable !vtab {
        !            21:   finish_test
        !            22:   return
        !            23: }
        !            24: 
        !            25: # Register the echo module. Code inside the echo module appends elements
        !            26: # to the global tcl list variable ::echo_module whenever SQLite invokes
        !            27: # certain module callbacks. This includes the xSync(), xCommit() and 
        !            28: # xRollback() callbacks. For each of these callback, two elements are
        !            29: # appended to ::echo_module, as follows:
        !            30: #
        !            31: #     Module method        Elements appended to ::echo_module
        !            32: #     -------------------------------------------------------
        !            33: #     xSync()              xSync echo($tablename)
        !            34: #     xCommit()            xCommit echo($tablename)
        !            35: #     xRollback()          xRollback echo($tablename)
        !            36: #     -------------------------------------------------------
        !            37: #
        !            38: # In each case, $tablename is replaced by the name of the real table (not
        !            39: # the echo table). By setting up a tcl trace on the ::echo_module variable,
        !            40: # code in this file arranges for a Tcl script to be executed from within
        !            41: # the echo module xSync() callback.
        !            42: #
        !            43: register_echo_module [sqlite3_connection_pointer db]
        !            44: trace add variable ::echo_module write echo_module_trace
        !            45: 
        !            46: # This Tcl proc is invoked whenever the ::echo_module variable is written.
        !            47: #
        !            48: proc echo_module_trace {args} {
        !            49:   # Filter out writes to ::echo_module that are not xSync, xCommit or 
        !            50:   # xRollback callbacks.
        !            51:   if {[llength $::echo_module] < 2} return
        !            52:   set x [lindex $::echo_module end-1]
        !            53:   if {$x ne "xSync" && $x ne "xCommit" && $x ne "xRollback"} return
        !            54: 
        !            55:   regexp {^echo.(.*).$} [lindex $::echo_module end] dummy tablename
        !            56:   # puts "Ladies and gentlemen, an $x on $tablename!"
        !            57: 
        !            58:   if {[info exists ::callbacks($x,$tablename)]} {
        !            59:     eval $::callbacks($x,$tablename)
        !            60:   }
        !            61: }
        !            62: 
        !            63: # The following tests, vtab7-1.*, test that the trace callback on 
        !            64: # ::echo_module is providing the expected tcl callbacks.
        !            65: do_test vtab7-1.1 {
        !            66:   execsql {
        !            67:     CREATE TABLE abc(a, b, c);
        !            68:     CREATE VIRTUAL TABLE abc2 USING echo(abc);
        !            69:   }
        !            70: } {}
        !            71: 
        !            72: do_test vtab7-1.2 {
        !            73:   set ::callbacks(xSync,abc) {incr ::counter}
        !            74:   set ::counter 0
        !            75:   execsql {
        !            76:     INSERT INTO abc2 VALUES(1, 2, 3);
        !            77:   }
        !            78:   set ::counter
        !            79: } {1}
        !            80: 
        !            81: # Write to an existing database table from within an xSync callback.
        !            82: do_test vtab7-2.1 {
        !            83:   set ::callbacks(xSync,abc) {
        !            84:     execsql {INSERT INTO log VALUES('xSync');}
        !            85:   }
        !            86:   execsql {
        !            87:     CREATE TABLE log(msg);
        !            88:     INSERT INTO abc2 VALUES(4, 5, 6);
        !            89:     SELECT * FROM log;
        !            90:   }
        !            91: } {xSync}
        !            92: do_test vtab7-2.3 {
        !            93:   execsql {
        !            94:     INSERT INTO abc2 VALUES(4, 5, 6);
        !            95:     SELECT * FROM log;
        !            96:   }
        !            97: } {xSync xSync}
        !            98: do_test vtab7-2.4 {
        !            99:   execsql {
        !           100:     INSERT INTO abc2 VALUES(4, 5, 6);
        !           101:     SELECT * FROM log;
        !           102:   }
        !           103: } {xSync xSync xSync}
        !           104: 
        !           105: # Create a database table from within xSync callback.
        !           106: do_test vtab7-2.5 {
        !           107:   set ::callbacks(xSync,abc) {
        !           108:     execsql { CREATE TABLE newtab(d, e, f); }
        !           109:   }
        !           110:   execsql {
        !           111:     INSERT INTO abc2 VALUES(1, 2, 3);
        !           112:     SELECT name FROM sqlite_master ORDER BY name;
        !           113:   }
        !           114: } {abc abc2 log newtab}
        !           115: 
        !           116: # Drop a database table from within xSync callback.
        !           117: # This is not allowed.  Tables cannot be dropped while
        !           118: # any other statement is active.
        !           119: #
        !           120: do_test vtab7-2.6 {
        !           121:   set ::callbacks(xSync,abc) {
        !           122:     set ::rc [catchsql { DROP TABLE newtab }]
        !           123:   }
        !           124:   execsql {
        !           125:     INSERT INTO abc2 VALUES(1, 2, 3);
        !           126:     SELECT name FROM sqlite_master ORDER BY name;
        !           127:   }
        !           128: } {abc abc2 log newtab}
        !           129: do_test vtab7-2.6.1 {
        !           130:   set ::rc
        !           131: } {1 {database table is locked}}
        !           132: execsql {DROP TABLE newtab}
        !           133: 
        !           134: # Write to an attached database from xSync().
        !           135: ifcapable attach {
        !           136:   do_test vtab7-3.1 {
        !           137:     forcedelete test2.db
        !           138:     forcedelete test2.db-journal
        !           139:     execsql {
        !           140:       ATTACH 'test2.db' AS db2;
        !           141:       CREATE TABLE db2.stuff(description, shape, color);
        !           142:     }
        !           143:     set ::callbacks(xSync,abc) {
        !           144:       execsql { INSERT INTO db2.stuff VALUES('abc', 'square', 'green'); }
        !           145:     }
        !           146:     execsql {
        !           147:       INSERT INTO abc2 VALUES(1, 2, 3);
        !           148:       SELECT * from stuff;
        !           149:     }
        !           150:   } {abc square green}
        !           151: }
        !           152: 
        !           153: # UPDATE: The next test passes, but leaks memory. So leave it out.
        !           154: #
        !           155: # The following tests test that writing to the database from within
        !           156: # the xCommit callback causes a misuse error.
        !           157: # do_test vtab7-4.1 {
        !           158: #   unset -nocomplain ::callbacks(xSync,abc)
        !           159: #   set ::callbacks(xCommit,abc) {
        !           160: #     execsql { INSERT INTO log VALUES('hello') }
        !           161: #   }
        !           162: #   catchsql {
        !           163: #     INSERT INTO abc2 VALUES(1, 2, 3);
        !           164: #   }
        !           165: # } {1 {library routine called out of sequence}}
        !           166: 
        !           167: # These tests, vtab7-4.*, test that an SQLITE_LOCKED error is returned
        !           168: # if an attempt to write to a virtual module table or create a new 
        !           169: # virtual table from within an xSync() callback.
        !           170: do_test vtab7-4.1 {
        !           171:   execsql {
        !           172:     CREATE TABLE def(d, e, f);
        !           173:     CREATE VIRTUAL TABLE def2 USING echo(def);
        !           174:   }
        !           175:   set ::callbacks(xSync,abc) {
        !           176:     set ::error [catchsql { INSERT INTO def2 VALUES(1, 2, 3) }]
        !           177:   }
        !           178:   execsql {
        !           179:     INSERT INTO abc2 VALUES(1, 2, 3);
        !           180:   }
        !           181:   set ::error
        !           182: } {1 {database table is locked}}
        !           183: do_test vtab7-4.2 {
        !           184:   set ::callbacks(xSync,abc) {
        !           185:     set ::error [catchsql { CREATE VIRTUAL TABLE def3 USING echo(def) }]
        !           186:   }
        !           187:   execsql {
        !           188:     INSERT INTO abc2 VALUES(1, 2, 3);
        !           189:   }
        !           190:   set ::error
        !           191: } {1 {database table is locked}}
        !           192: 
        !           193: do_test vtab7-4.3 {
        !           194:   set ::callbacks(xSync,abc) {
        !           195:     set ::error [catchsql { DROP TABLE def2 }]
        !           196:   }
        !           197:   execsql {
        !           198:     INSERT INTO abc2 VALUES(1, 2, 3);
        !           199:     SELECT name FROM sqlite_master ORDER BY name;
        !           200:   }
        !           201:   set ::error
        !           202: } {1 {database table is locked}}
        !           203: 
        !           204: trace remove variable ::echo_module write echo_module_trace
        !           205: unset -nocomplain ::callbacks
        !           206: 
        !           207: finish_test

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