sl@0: # 2008 June 18 sl@0: # sl@0: # The author disclaims copyright to this source code. In place of sl@0: # a legal notice, here is a blessing: sl@0: # sl@0: # May you do good and not evil. sl@0: # May you find forgiveness for yourself and forgive others. sl@0: # May you share freely, never taking more than you give. sl@0: # sl@0: #*********************************************************************** sl@0: # This file implements regression tests for SQLite library. sl@0: # sl@0: # This file is devoted to testing the sqlite3_next_stmt interface. sl@0: # sl@0: # $Id: capi3d.test,v 1.2 2008/07/14 15:11:20 drh Exp $ sl@0: # sl@0: sl@0: set testdir [file dirname $argv0] sl@0: source $testdir/tester.tcl sl@0: sl@0: # Create N prepared statements against database connection db sl@0: # and return a list of all the generated prepared statements. sl@0: # sl@0: proc make_prepared_statements {N} { sl@0: set plist {} sl@0: for {set i 0} {$i<$N} {incr i} { sl@0: set sql "SELECT $i FROM sqlite_master WHERE name LIKE '%$i%'" sl@0: if {rand()<0.33} { sl@0: set s [sqlite3_prepare_v2 db $sql -1 notused] sl@0: } else { sl@0: ifcapable utf16 { sl@0: if {rand()<0.5} { sl@0: set sql [encoding convertto unicode $sql]\x00\x00 sl@0: set s [sqlite3_prepare16 db $sql -1 notused] sl@0: } else { sl@0: set s [sqlite3_prepare db $sql -1 notused] sl@0: } sl@0: } sl@0: ifcapable !utf16 { sl@0: set s [sqlite3_prepare db $sql -1 notused] sl@0: } sl@0: } sl@0: lappend plist $s sl@0: } sl@0: return $plist sl@0: } sl@0: sl@0: sl@0: # Scramble the $inlist into a random order. sl@0: # sl@0: proc scramble {inlist} { sl@0: set y {} sl@0: foreach x $inlist { sl@0: lappend y [list [expr {rand()}] $x] sl@0: } sl@0: set y [lsort $y] sl@0: set outlist {} sl@0: foreach x $y { sl@0: lappend outlist [lindex $x 1] sl@0: } sl@0: return $outlist sl@0: } sl@0: sl@0: # Database initially has no prepared statements. sl@0: # sl@0: do_test capi3d-1.1 { sl@0: db cache flush sl@0: sqlite3_next_stmt db 0 sl@0: } {} sl@0: sl@0: # Run the following tests for between 1 and 100 prepared statements. sl@0: # sl@0: for {set i 1} {$i<=100} {incr i} { sl@0: set stmtlist [make_prepared_statements $i] sl@0: do_test capi3d-1.2.$i.1 { sl@0: set p [sqlite3_next_stmt db 0] sl@0: set x {} sl@0: while {$p!=""} { sl@0: lappend x $p sl@0: set p [sqlite3_next_stmt db $p] sl@0: } sl@0: lsort $x sl@0: } [lsort $stmtlist] sl@0: do_test capi3-1.2.$i.2 { sl@0: foreach p [scramble $::stmtlist] { sl@0: sqlite3_finalize $p sl@0: } sl@0: sqlite3_next_stmt db 0 sl@0: } {} sl@0: } sl@0: sl@0: sl@0: finish_test