xref: /sqlite-3.40.0/ext/session/session8.test (revision 7d44b22d)
1cfec7eeeSdan# 2011 July 13
2cfec7eeeSdan#
3cfec7eeeSdan# The author disclaims copyright to this source code.  In place of
4cfec7eeeSdan# a legal notice, here is a blessing:
5cfec7eeeSdan#
6cfec7eeeSdan#    May you do good and not evil.
7cfec7eeeSdan#    May you find forgiveness for yourself and forgive others.
8cfec7eeeSdan#    May you share freely, never taking more than you give.
9cfec7eeeSdan#
10cfec7eeeSdan#***********************************************************************
11cfec7eeeSdan# This file implements regression tests for SQLite library.
12cfec7eeeSdan#
13cfec7eeeSdan
14cfec7eeeSdanif {![info exists testdir]} {
15cfec7eeeSdan  set testdir [file join [file dirname [info script]] .. .. test]
16cfec7eeeSdan}
17cfec7eeeSdansource [file join [file dirname [info script]] session_common.tcl]
18cfec7eeeSdansource $testdir/tester.tcl
19cfec7eeeSdanifcapable !session {finish_test; return}
20cfec7eeeSdan
21cfec7eeeSdanset testprefix session8
22cfec7eeeSdan
23cfec7eeeSdanproc noop {args} {}
24cfec7eeeSdan
25cfec7eeeSdan# Like [dbcksum] in tester.tcl. Except this version is not sensitive
26cfec7eeeSdan# to changes in the value of implicit IPK columns.
27cfec7eeeSdan#
28cfec7eeeSdanproc udbcksum {db dbname} {
29cfec7eeeSdan  if {$dbname=="temp"} {
30cfec7eeeSdan    set master sqlite_temp_master
31cfec7eeeSdan  } else {
32cfec7eeeSdan    set master $dbname.sqlite_master
33cfec7eeeSdan  }
34cfec7eeeSdan  set alltab [$db eval "SELECT name FROM $master WHERE type='table'"]
35cfec7eeeSdan  set txt [$db eval "SELECT * FROM $master"]\n
36cfec7eeeSdan  foreach tab $alltab {
37cfec7eeeSdan    append txt [lsort [$db eval "SELECT * FROM $dbname.$tab"]]\n
38cfec7eeeSdan  }
39cfec7eeeSdan  return [md5 $txt]
40cfec7eeeSdan}
41cfec7eeeSdan
42cfec7eeeSdanproc do_then_undo {tn sql} {
43cfec7eeeSdan  set ck1 [udbcksum db main]
44cfec7eeeSdan
45cfec7eeeSdan  sqlite3session S db main
46cfec7eeeSdan  S attach *
47cfec7eeeSdan  db eval $sql
48cfec7eeeSdan
49cfec7eeeSdan  set ck2 [udbcksum db main]
50cfec7eeeSdan
51cfec7eeeSdan  set invert [sqlite3changeset_invert [S changeset]]
52cfec7eeeSdan  S delete
53cfec7eeeSdan  sqlite3changeset_apply db $invert noop
54cfec7eeeSdan
55cfec7eeeSdan  set ck3 [udbcksum db main]
56cfec7eeeSdan
57cfec7eeeSdan  set a [expr {$ck1==$ck2}]
58cfec7eeeSdan  set b [expr {$ck1==$ck3}]
59cfec7eeeSdan  uplevel [list do_test $tn.1 "set {} $a" 0]
60cfec7eeeSdan  uplevel [list do_test $tn.2 "set {} $b" 1]
61cfec7eeeSdan}
62cfec7eeeSdan
63cfec7eeeSdando_execsql_test 1.1 {
64cfec7eeeSdan  CREATE TABLE t1(a PRIMARY KEY, b);
65cfec7eeeSdan  INSERT INTO t1 VALUES(1, 2);
66*7d44b22dSdrh  INSERT INTO t1 VALUES('abc', 'xyz');
67cfec7eeeSdan}
68cfec7eeeSdando_then_undo 1.2 { INSERT INTO t1 VALUES(3, 4); }
69cfec7eeeSdando_then_undo 1.3 { DELETE FROM t1 WHERE b=2; }
70cfec7eeeSdando_then_undo 1.4 { UPDATE t1 SET b = 3 WHERE a = 1; }
71cfec7eeeSdan
72cfec7eeeSdando_execsql_test 2.1 {
73cfec7eeeSdan  CREATE TABLE t2(a, b PRIMARY KEY);
74cfec7eeeSdan  INSERT INTO t2 VALUES(1, 2);
75cfec7eeeSdan  INSERT INTO t2 VALUES('abc', 'xyz');
76cfec7eeeSdan}
77cfec7eeeSdando_then_undo 1.2 { INSERT INTO t2 VALUES(3, 4); }
78cfec7eeeSdando_then_undo 1.3 { DELETE FROM t2 WHERE b=2; }
79cfec7eeeSdando_then_undo 1.4 { UPDATE t1 SET a = '123' WHERE b = 'xyz'; }
80cfec7eeeSdan
81cfec7eeeSdando_execsql_test 3.1 {
82cfec7eeeSdan  CREATE TABLE t3(a, b, c, d, e, PRIMARY KEY(c, e));
83cfec7eeeSdan  INSERT INTO t3 VALUES('x', 45, 0.0, 'abcdef', 12);
84cfec7eeeSdan  INSERT INTO t3 VALUES(45, 0.0, 'abcdef', 12, 'x');
85cfec7eeeSdan  INSERT INTO t3 VALUES(0.0, 'abcdef', 12, 'x', 45);
86cfec7eeeSdan}
87cfec7eeeSdan
88cfec7eeeSdando_then_undo 3.2 { UPDATE t3 SET b=b||b WHERE e!='x' }
89cfec7eeeSdando_then_undo 3.3 { UPDATE t3 SET a = 46 }
90cfec7eeeSdan
91cfec7eeeSdanfinish_test
92