Home | History | Annotate | Download | only in test
      1 # 2008 June 18
      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 is devoted to testing the sqlite3_next_stmt and
     14 # sqlite3_stmt_readonly interfaces.
     15 #
     16 # $Id: capi3d.test,v 1.2 2008/07/14 15:11:20 drh Exp $
     17 #
     18 
     19 set testdir [file dirname $argv0]
     20 source $testdir/tester.tcl
     21 
     22 # Create N prepared statements against database connection db
     23 # and return a list of all the generated prepared statements.
     24 #
     25 proc make_prepared_statements {N} {
     26   set plist {}
     27   for {set i 0} {$i<$N} {incr i} {
     28     set sql "SELECT $i FROM sqlite_master WHERE name LIKE '%$i%'"
     29     if {rand()<0.33} {    
     30       set s [sqlite3_prepare_v2 db $sql -1 notused]
     31     } else {
     32       ifcapable utf16 {
     33         if {rand()<0.5} {
     34           set sql [encoding convertto unicode $sql]\x00\x00
     35           set s [sqlite3_prepare16 db $sql -1 notused]
     36         } else {
     37           set s [sqlite3_prepare db $sql -1 notused]
     38         }
     39       }
     40       ifcapable !utf16 {
     41         set s [sqlite3_prepare db $sql -1 notused]
     42       }
     43     }
     44     lappend plist $s
     45   }
     46   return $plist
     47 }
     48 
     49 
     50 # Scramble the $inlist into a random order.
     51 #
     52 proc scramble {inlist} {
     53   set y {}
     54   foreach x $inlist {
     55     lappend y [list [expr {rand()}] $x]
     56   }
     57   set y [lsort $y]
     58   set outlist {}
     59   foreach x $y {
     60     lappend outlist [lindex $x 1]
     61   }
     62   return $outlist
     63 }
     64 
     65 # Database initially has no prepared statements.
     66 #
     67 do_test capi3d-1.1 {
     68   db cache flush
     69   sqlite3_next_stmt db 0
     70 } {}
     71 
     72 # Run the following tests for between 1 and 100 prepared statements.
     73 #
     74 for {set i 1} {$i<=100} {incr i} {
     75   set stmtlist [make_prepared_statements $i]
     76   do_test capi3d-1.2.$i.1 {
     77     set p [sqlite3_next_stmt db 0]
     78     set x {}
     79     while {$p!=""} {
     80       lappend x $p
     81       set p [sqlite3_next_stmt db $p]
     82     }
     83     lsort $x
     84   } [lsort $stmtlist]
     85   do_test capi3-1.2.$i.2 {
     86     foreach p [scramble $::stmtlist] {
     87       sqlite3_finalize $p
     88     }
     89     sqlite3_next_stmt db 0
     90   } {}
     91 }
     92 
     93 # Tests for the is-read-only interface.
     94 #
     95 proc test_is_readonly {testname sql truth} {
     96   do_test $testname [format {
     97     set DB [sqlite3_connection_pointer db]
     98     set STMT [sqlite3_prepare $DB {%s} -1 TAIL]
     99     set rc [sqlite3_stmt_readonly $STMT]
    100     sqlite3_finalize $STMT
    101     set rc
    102   } $sql] $truth
    103 }
    104 
    105 test_is_readonly capi3d-2.1 {SELECT * FROM sqlite_master} 1
    106 test_is_readonly capi3d-2.2 {CREATE TABLE t1(x)} 0
    107 db eval {CREATE TABLE t1(x)}
    108 test_is_readonly capi3d-2.3 {INSERT INTO t1 VALUES(5)} 0
    109 test_is_readonly capi3d-2.4 {UPDATE t1 SET x=x+1 WHERE x<0} 0
    110 test_is_readonly capi3d-2.5 {SELECT * FROM t1} 1
    111 do_test capi3-2.99 {
    112   sqlite3_stmt_readonly 0
    113 } 1
    114 
    115 
    116 finish_test
    117