File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / test / capi3d.test
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:04:16 2012 UTC (12 years, 10 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    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 and sqlite3_stmt_busy interfaces.
   15: #
   16: # $Id: capi3d.test,v 1.1.1.1 2012/02/21 17:04:16 misho 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: # Tests for sqlite3_stmt_busy
  116: #
  117: do_test capi3d-3.1 {
  118:   db eval {INSERT INTO t1 VALUES(6); INSERT INTO t1 VALUES(7);}
  119:   set STMT [sqlite3_prepare db {SELECT * FROM t1} -1 TAIL]
  120:   sqlite3_stmt_busy $STMT
  121: } {0}
  122: do_test capi3d-3.2 {
  123:   sqlite3_step $STMT
  124:   sqlite3_stmt_busy $STMT
  125: } {1}
  126: do_test capi3d-3.3 {
  127:   sqlite3_step $STMT
  128:   sqlite3_stmt_busy $STMT
  129: } {1}
  130: do_test capi3d-3.4 {
  131:   sqlite3_reset $STMT
  132:   sqlite3_stmt_busy $STMT
  133: } {0}
  134: 
  135: do_test capi3d-3.99 {
  136:   sqlite3_finalize $STMT
  137:   sqlite3_stmt_busy 0
  138: } {0}
  139: 
  140: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>