persistentstorage/sqlite3api/TEST/TclScript/misuse.test
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     1 # 2002 May 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.
       
    12 #
       
    13 # This file implements tests for the SQLITE_MISUSE detection logic.
       
    14 # This test file leaks memory and file descriptors.
       
    15 #
       
    16 # $Id: misuse.test,v 1.11 2006/01/03 00:33:50 drh Exp $
       
    17 
       
    18 set testdir [file dirname $argv0]
       
    19 source $testdir/tester.tcl
       
    20 
       
    21 proc catchsql2 {sql} {
       
    22   set r [
       
    23     catch {
       
    24       set res [list]
       
    25       db eval $sql data {
       
    26         if { $res==[list] } {
       
    27           foreach f $data(*) {lappend res $f}
       
    28         }
       
    29         foreach f $data(*) {lappend res $data($f)}
       
    30       }
       
    31       set res
       
    32     } msg
       
    33   ]
       
    34   lappend r $msg
       
    35 }
       
    36 
       
    37 
       
    38 # Make sure the test logic works
       
    39 #
       
    40 do_test misuse-1.1 {
       
    41   db close
       
    42   catch {file delete -force test2.db}
       
    43   catch {file delete -force test2.db-journal}
       
    44   sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db]
       
    45   execsql {
       
    46     CREATE TABLE t1(a,b);
       
    47     INSERT INTO t1 VALUES(1,2);
       
    48   }
       
    49   catchsql2 {
       
    50     SELECT * FROM t1
       
    51   }
       
    52 } {0 {a b 1 2}}
       
    53 do_test misuse-1.2 {
       
    54   catchsql2 {
       
    55     SELECT x_coalesce(NULL,a) AS 'xyz' FROM t1
       
    56   }
       
    57 } {1 {no such function: x_coalesce}}
       
    58 do_test misuse-1.3 {
       
    59   sqlite3_create_function $::DB
       
    60   catchsql2 {
       
    61     SELECT x_coalesce(NULL,a) AS 'xyz' FROM t1
       
    62   }
       
    63 } {0 {xyz 1}}
       
    64 
       
    65 # Use the x_sqlite_exec() SQL function to simulate the effect of two
       
    66 # threads trying to use the same database at the same time.
       
    67 #
       
    68 # It used to be prohibited to invoke sqlite_exec() from within a function,
       
    69 # but that has changed.  The following tests used to cause errors but now
       
    70 # they do not.
       
    71 #
       
    72 ifcapable {utf16} {
       
    73   do_test misuse-1.4 {
       
    74     catchsql2 {
       
    75        SELECT x_sqlite_exec('SELECT * FROM t1') AS xyz;
       
    76     } 
       
    77   } {0 {xyz {1 2}}}
       
    78 }
       
    79 do_test misuse-1.5 {
       
    80   catchsql2 {SELECT * FROM t1}
       
    81 } {0 {a b 1 2}}
       
    82 do_test misuse-1.6 {
       
    83   catchsql {
       
    84     SELECT * FROM t1
       
    85   }
       
    86 } {0 {1 2}}
       
    87 
       
    88 # Attempt to register a new SQL function while an sqlite_exec() is active.
       
    89 #
       
    90 do_test misuse-2.1 {
       
    91   db close
       
    92   sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db]
       
    93   execsql {
       
    94     SELECT * FROM t1
       
    95   }
       
    96 } {1 2}
       
    97 do_test misuse-2.2 {
       
    98   catchsql2 {SELECT * FROM t1}
       
    99 } {0 {a b 1 2}}
       
   100 
       
   101 # We used to disallow creating new function from within an exec().
       
   102 # But now this is acceptable.
       
   103 do_test misuse-2.3 {
       
   104   set v [catch {
       
   105     db eval {SELECT * FROM t1} {} {
       
   106       sqlite3_create_function $::DB
       
   107     }
       
   108   } msg]
       
   109   lappend v $msg
       
   110 } {0 {}}
       
   111 do_test misuse-2.4 {
       
   112   catchsql2 {SELECT * FROM t1}
       
   113 } {0 {a b 1 2}}
       
   114 do_test misuse-2.5 {
       
   115   catchsql {
       
   116     SELECT * FROM t1
       
   117   }
       
   118 } {0 {1 2}}
       
   119 
       
   120 # Attempt to register a new SQL aggregate while an sqlite_exec() is active.
       
   121 #
       
   122 do_test misuse-3.1 {
       
   123   db close
       
   124   sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db]
       
   125   execsql {
       
   126     SELECT * FROM t1
       
   127   }
       
   128 } {1 2}
       
   129 do_test misuse-3.2 {
       
   130   catchsql2 {SELECT * FROM t1}
       
   131 } {0 {a b 1 2}}
       
   132 
       
   133 # We used to disallow creating new function from within an exec().
       
   134 # But now this is acceptable.
       
   135 do_test misuse-3.3 {
       
   136   set v [catch {
       
   137     db eval {SELECT * FROM t1} {} {
       
   138       sqlite3_create_aggregate $::DB
       
   139     }
       
   140   } msg]
       
   141   lappend v $msg
       
   142 } {0 {}}
       
   143 do_test misuse-3.4 {
       
   144   catchsql2 {SELECT * FROM t1}
       
   145 } {0 {a b 1 2}}
       
   146 do_test misuse-3.5 {
       
   147   catchsql {
       
   148     SELECT * FROM t1
       
   149   }
       
   150 } {0 {1 2}}
       
   151 
       
   152 # Attempt to close the database from an sqlite_exec callback.
       
   153 #
       
   154 # Update for v3: The db cannot be closed because there are active
       
   155 # VMs. The sqlite3_close call would return SQLITE_BUSY.
       
   156 do_test misuse-4.1 {
       
   157   db close
       
   158   sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db]
       
   159   execsql {
       
   160     SELECT * FROM t1
       
   161   }
       
   162 } {1 2}
       
   163 do_test misuse-4.2 {
       
   164   catchsql2 {SELECT * FROM t1}
       
   165 } {0 {a b 1 2}}
       
   166 do_test misuse-4.3 {
       
   167   set v [catch {
       
   168     db eval {SELECT * FROM t1} {} {
       
   169       set r [sqlite3_close $::DB]
       
   170     }
       
   171   } msg]
       
   172   lappend v $msg $r
       
   173 } {0 {} SQLITE_BUSY}
       
   174 do_test misuse-4.4 {
       
   175   # Flush the TCL statement cache here, otherwise the sqlite3_close() will
       
   176   # fail because there are still un-finalized() VDBEs.
       
   177   db cache flush
       
   178   sqlite3_close $::DB
       
   179   catchsql2 {SELECT * FROM t1}
       
   180 } {1 {library routine called out of sequence}}
       
   181 do_test misuse-4.5 {
       
   182   catchsql {
       
   183     SELECT * FROM t1
       
   184   }
       
   185 } {1 {library routine called out of sequence}}
       
   186 
       
   187 # Attempt to use a database after it has been closed.
       
   188 #
       
   189 do_test misuse-5.1 {
       
   190   db close
       
   191   sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db]
       
   192   execsql {
       
   193     SELECT * FROM t1
       
   194   }
       
   195 } {1 2}
       
   196 do_test misuse-5.2 {
       
   197   catchsql2 {SELECT * FROM t1}
       
   198 } {0 {a b 1 2}}
       
   199 do_test misuse-5.3 {
       
   200   db close
       
   201   set r [catch {
       
   202     sqlite3_prepare $::DB {SELECT * FROM t1} -1 TAIL
       
   203   } msg]
       
   204   lappend r $msg
       
   205 } {1 {(21) library routine called out of sequence}}
       
   206 
       
   207 finish_test