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