]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add test file savepoint6.test. Contains pseudo random tests of savepoint related...
authordanielk1977 <danielk1977@noemail.net>
Sat, 3 Jan 2009 10:41:29 +0000 (10:41 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Sat, 3 Jan 2009 10:41:29 +0000 (10:41 +0000)
FossilOrigin-Name: 2946fbb7183d597b4db1db203eb5fd57c9762dc4

manifest
manifest.uuid
test/quick.test
test/savepoint6.test [new file with mode: 0644]

index 5f64a639c9454dbbada39a61c9459ac204388b35..2b5b643239c845457bf75245293bf7621ec7574d 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Memory\sallocation\sfailure\sin\sBitvec\sare\sprobably\sall\sbenign.\s\sStill,\sadd\ncode\sto\scheck\sthis,\sjust\sto\sbe\ssure.\s(CVS\s6104)
-D 2009-01-02T21:39:39
+C Add\stest\sfile\ssavepoint6.test.\sContains\spseudo\srandom\stests\sof\ssavepoint\srelated\scommands.\s(CVS\s6105)
+D 2009-01-03T10:41:29
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 05461a9b5803d5ad10c79f989801e9fd2cc3e592
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -483,7 +483,7 @@ F test/pragma2.test 5364893491b9231dd170e3459bfc2e2342658b47
 F test/printf.test 262a5acd3158f788e9bdf7f18d718f3af32ff6ef
 F test/progress.test 5b075c3c790c7b2a61419bc199db87aaf48b8301 x
 F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc
-F test/quick.test a244cd60117c07afaba2223bb025fd482ca13290
+F test/quick.test 9ab91798b047684f0dd26ee698920dbb69a30a10
 F test/quote.test 215897dbe8de1a6f701265836d6601cc6ed103e6
 F test/randexpr1.tcl 40dec52119ed3a2b8b2a773bce24b63a3a746459
 F test/randexpr1.test 1084050991e9ba22c1c10edd8d84673b501cc25a
@@ -498,6 +498,7 @@ F test/savepoint2.test 18f6c75d5c133b93838019df8988b8cdf379d3de
 F test/savepoint3.test 1a0b1c0f59c6ae4402bfbca7cec29d4b1b272ff0
 F test/savepoint4.test fd8850063e3c40565545f5c291e7f79a30591670
 F test/savepoint5.test 0735db177e0ebbaedc39812c8d065075d563c4fd
+F test/savepoint6.test 4808a41d2426d96d2fd742573c374f1d3ba90c61
 F test/schema.test a8b000723375fd42c68d310091bdbd744fde647c
 F test/schema2.test 35e1c9696443d6694c8980c411497c2b5190d32e
 F test/select1.test d0a4cad954fd41c030ec16ffbd2d08a4c0548742
@@ -691,7 +692,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
-P 3e9efb763875b20c856d748c19e449080a3ae97c
-R fbb0f228e00217f5f89f33568f0e8c54
-U drh
-Z 9cf41e60e2f6cdb3d7a7b42a85a7af92
+P 4688e1c8b1203c3538aa862421ed344888059fe2
+R 31d99a8d501205effd4ffc0b8feb8587
+U danielk1977
+Z fec136a2b1f38279973feea5622497f3
index c4aaabf331bc9220f0a51cc2a4748be744f0db40..7c663f1af55b6558e517faeeb8c84c0f6e3eac4c 100644 (file)
@@ -1 +1 @@
-4688e1c8b1203c3538aa862421ed344888059fe2
\ No newline at end of file
+2946fbb7183d597b4db1db203eb5fd57c9762dc4
\ No newline at end of file
index 123bbaad539ee0d952ea7e3fcf722c0626bd82f4..64d238c2071860084cbb122ba272a658f39a3434 100644 (file)
@@ -6,7 +6,7 @@
 #***********************************************************************
 # This file runs all tests.
 #
-# $Id: quick.test,v 1.90 2008/12/19 16:31:12 danielk1977 Exp $
+# $Id: quick.test,v 1.91 2009/01/03 10:41:29 danielk1977 Exp $
 
 proc lshift {lvar} {
   upvar $lvar l
@@ -70,6 +70,7 @@ set EXCLUDE {
   permutations.test
   quick.test
   savepoint4.test
+  savepoint6.test
   select9.test
   soak.test
   speed1.test
diff --git a/test/savepoint6.test b/test/savepoint6.test
new file mode 100644 (file)
index 0000000..96d95fc
--- /dev/null
@@ -0,0 +1,207 @@
+# 2009 January 3
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+# $Id: savepoint6.test,v 1.1 2009/01/03 10:41:29 danielk1977 Exp $
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+do_test savepoint6-1.1 {
+  execsql {
+    PRAGMA auto_vacuum = incremental;
+    CREATE TABLE t1(x, y);
+    CREATE UNIQUE INDEX i1 ON t1(x);
+    CREATE INDEX i2 ON t1(y);
+  }
+} {}
+
+#--------------------------------------------------------------------------
+# In memory database state.
+#
+# ::lSavepoint is a list containing one entry for each active savepoint. The
+# first entry in the list corresponds to the most recently opened savepoint.
+# Each entry consists of two elements:
+#
+#   1. The savepoint name.
+#
+#   2. A serialized Tcl array representing the contents of table t1 at the
+#      start of the savepoint. The keys of the array are the x values. The
+#      values are the y values.
+#  
+# Array ::aEntry contains the contents of database table t1. Array keys are
+# x values, the array data values are y values.
+#
+set lSavepoint [list]
+array set aEntry [list]
+
+proc x_to_y {x} {
+  set nChar [expr int(rand()*250) + 250]
+  set str " $nChar [string repeat $x. $nChar]"
+  string range $str 1 $nChar
+}
+#--------------------------------------------------------------------------
+
+#-------------------------------------------------------------------------
+# Procs to operate on database:
+#
+#   savepoint NAME
+#   rollback  NAME
+#   release   NAME
+#
+#   insert_rows XVALUES
+#   delete_rows XVALUES
+#
+proc savepoint {zName} {
+  catch { db eval "SAVEPOINT $zName" }
+  lappend ::lSavepoint [list $zName [array get ::aEntry]]
+}
+
+proc rollback {zName} {
+  catch { db eval "ROLLBACK TO $zName" }
+  for {set i [expr {[llength $::lSavepoint]-1}]} {$i>=0} {incr i -1} {
+    set zSavepoint [lindex $::lSavepoint $i 0]
+    if {$zSavepoint eq $zName} {
+      unset -nocomplain ::aEntry
+      array set ::aEntry [lindex $::lSavepoint $i 1]
+
+
+      if {$i+1 < [llength $::lSavepoint]} {
+        set ::lSavepoint [lreplace $::lSavepoint [expr $i+1] end]
+      }
+      break
+    }
+  }
+}
+
+proc release {zName} {
+  catch { db eval "RELEASE $zName" }
+  for {set i [expr {[llength $::lSavepoint]-1}]} {$i>=0} {incr i -1} {
+    set zSavepoint [lindex $::lSavepoint $i 0]
+    if {$zSavepoint eq $zName} {
+      set ::lSavepoint [lreplace $::lSavepoint $i end]
+      break
+    }
+  }
+}
+
+proc insert_rows {lX} {
+  foreach x $lX {
+    set y [x_to_y $x]
+
+    # Update database [db]
+    db eval {INSERT OR REPLACE INTO t1 VALUES($x, $y)}
+
+    # Update the Tcl database.
+    set ::aEntry($x) $y
+  }
+}
+
+proc delete_rows {lX} {
+  foreach x $lX {
+    # Update database [db]
+    db eval {DELETE FROM t1 WHERE x = $x}
+
+    # Update the Tcl database.
+    unset -nocomplain ::aEntry($x)
+  }
+}
+#-------------------------------------------------------------------------
+
+#-------------------------------------------------------------------------
+# Proc to compare database content with the in-memory representation.
+#
+#   checkdb
+#
+proc checkdb {} {
+  set nEntry [db one {SELECT count(*) FROM t1}]
+  set nEntry2 [array size ::aEntry]
+  if {$nEntry != $nEntry2} {
+    error "$nEntry entries in database, $nEntry2 entries in array"
+  }
+  db eval {SELECT x, y FROM t1} {
+    if {![info exists ::aEntry($x)]} {
+      error "Entry $x exists in database, but not in array"
+    }
+    if {$::aEntry($x) ne $y} {
+      error "Entry $x is set to {$y} in database, {$::aEntry($x)} in array"
+    }
+  }
+
+  db eval { PRAGMA integrity_check }
+}
+#-------------------------------------------------------------------------
+
+#-------------------------------------------------------------------------
+# Proc to return random set of x values.
+#
+#   random_integers
+#
+proc random_integers {nRes nRange} {
+  set ret [list]
+  for {set i 0} {$i<$nRes} {incr i} {
+    lappend ret [expr int(rand()*$nRange)]
+  }
+  return $ret
+} 
+#-------------------------------------------------------------------------
+
+db eval { PRAGMA cache_size = 10 }
+expr srand(0)
+
+proc database_op {} {
+  set i [expr int(rand()*2)] 
+  if {$i==0} {
+    insert_rows [random_integers 100 1000]
+  }
+  if {$i==1} {
+    delete_rows [random_integers 100 1000]
+    set i [expr int(rand()*3)] 
+    if {$i==0} {
+      db eval {PRAGMA incremental_vacuum}
+    }
+  }
+}
+
+proc savepoint_op {} {
+  set names {one two three four five}
+  set cmds  {savepoint savepoint savepoint savepoint release rollback}
+
+  set C [lindex $cmds [expr int(rand()*6)]]
+  set N [lindex $names [expr int(rand()*5)]]
+
+  $C $N
+  return ok
+}
+
+do_test savepoint6-2.1 {
+  savepoint one
+  insert_rows [random_integers 100 1000]
+  release one
+  checkdb
+} {ok}
+
+for {set i 0} {$i < 1000} {incr i} {
+  do_test savepoint6-3.$i.1 {
+    savepoint_op
+  } {ok}
+
+  do_test savepoint6-3.$i.2 {
+    database_op
+    database_op
+    checkdb
+  } {ok}
+}
+
+unset -nocomplain ::lSavepoint
+unset -nocomplain ::aEntry
+
+finish_test
+