gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/misuse.test (about)

     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 {forcedelete test2.db}
    43    catch {forcedelete 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  
   175  if {[clang_sanitize_address]==0} {
   176    do_test misuse-4.4 {
   177    # Flush the TCL statement cache here, otherwise the sqlite3_close() will
   178    # fail because there are still un-finalized() VDBEs.
   179      db cache flush
   180        sqlite3_close $::DB
   181        catchsql2 {SELECT * FROM t1}
   182    } {1 {bad parameter or other API misuse}}
   183    do_test misuse-4.5 {
   184      catchsql {
   185        SELECT * FROM t1
   186      }
   187    } {1 {bad parameter or other API misuse}}
   188  
   189    # Attempt to use a database after it has been closed.
   190    #
   191    do_test misuse-5.1 {
   192      db close
   193        sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db]
   194        execsql {
   195          SELECT * FROM t1
   196        }
   197    } {1 2}
   198    do_test misuse-5.2 {
   199      catchsql2 {SELECT * FROM t1}
   200    } {0 {a b 1 2}}
   201    do_test misuse-5.3 {
   202      db close
   203        set r [catch {
   204          sqlite3_prepare $::DB {SELECT * FROM t1} -1 TAIL
   205        } msg]
   206      lappend r $msg
   207    } {1 {(21) bad parameter or other API misuse}}
   208  }
   209  
   210  finish_test