xref: /sqlite-3.40.0/test/capi3d.test (revision bb5a9c3e)
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 interface.
14#
15# $Id: capi3d.test,v 1.1 2008/06/19 02:52:25 drh Exp $
16#
17
18set testdir [file dirname $argv0]
19source $testdir/tester.tcl
20
21# Create N prepared statements against database connection db
22# and return a list of all the generated prepared statements.
23#
24proc make_prepared_statements {N} {
25  set plist {}
26  for {set i 0} {$i<$N} {incr i} {
27    set sql "SELECT $i FROM sqlite_master WHERE name LIKE '%$i%'"
28    if {rand()<0.33} {
29      set s [sqlite3_prepare_v2 db $sql -1 notused]
30    } else {
31      ifcapable utf16 {
32        if {rand()<0.5} {
33          set sql [encoding convertto unicode $sql]\x00\x00
34          set s [sqlite3_prepare16 db $sql -1 notused]
35        } else {
36          set s [sqlite3_prepare db $sql -1 notused]
37        }
38      }
39      ifcapable !utf16 {
40        set s [sqlite3_prepare db $sql -1 notused]
41      }
42    }
43    lappend plist $s
44  }
45  return $plist
46}
47
48
49# Scramble the $inlist into a random order.
50#
51proc scramble {inlist} {
52  set y {}
53  foreach x $inlist {
54    lappend y [list [expr {rand()}] $x]
55  }
56  set y [lsort $y]
57  set outlist {}
58  foreach x $y {
59    lappend outlist [lindex $x 1]
60  }
61  return $outlist
62}
63
64# Database initially has no prepared statements.
65#
66do_test capi3d-1.1 {
67  sqlite3_next_stmt db 0
68} {}
69
70# Run the following tests for between 1 and 100 prepared statements.
71#
72for {set i 1} {$i<=100} {incr i} {
73  set stmtlist [make_prepared_statements $i]
74  do_test capi3d-1.2.$i.1 {
75    set p [sqlite3_next_stmt db 0]
76    set x {}
77    while {$p!=""} {
78      lappend x $p
79      set p [sqlite3_next_stmt db $p]
80    }
81    lsort $x
82  } [lsort $stmtlist]
83  do_test capi3-1.2.$i.2 {
84    foreach p [scramble $::stmtlist] {
85      sqlite3_finalize $p
86    }
87    sqlite3_next_stmt db 0
88  } {}
89}
90
91
92finish_test
93