14565faa9Sdan# 2011 March 07 24565faa9Sdan# 34565faa9Sdan# The author disclaims copyright to this source code. In place of 44565faa9Sdan# a legal notice, here is a blessing: 54565faa9Sdan# 64565faa9Sdan# May you do good and not evil. 74565faa9Sdan# May you find forgiveness for yourself and forgive others. 84565faa9Sdan# May you share freely, never taking more than you give. 94565faa9Sdan# 104565faa9Sdan#*********************************************************************** 114565faa9Sdan# This file implements regression tests for SQLite library. 124565faa9Sdan# 134565faa9Sdan 144565faa9Sdanif {![info exists testdir]} { 154565faa9Sdan set testdir [file join [file dirname [info script]] .. .. test] 164565faa9Sdan} 174565faa9Sdansource [file join [file dirname [info script]] session_common.tcl] 184565faa9Sdansource $testdir/tester.tcl 199b1c62d4Sdrhifcapable !session {finish_test; return} 204565faa9Sdan 214565faa9Sdanset testprefix session1 224565faa9Sdan 23cb9a3643Sdan# Run all tests in this file twice. Once with "WITHOUT ROWID", and once 24cb9a3643Sdan# with regular rowid tables. 25cb9a3643Sdan# 26cb9a3643Sdanforeach {tn trailing} { 27cb9a3643Sdan 1 "" 28cb9a3643Sdan 2 " WITHOUT ROWID " 29cb9a3643Sdan} { 30cb9a3643Sdaneval [string map [list %WR% $trailing] { 31cb9a3643Sdan 32cb9a3643Sdandb close 33cb9a3643Sdanforcedelete test.db test.db2 34cb9a3643Sdanreset_db 35cb9a3643Sdan 36cb9a3643Sdando_execsql_test $tn.1.0 { 37cb9a3643Sdan CREATE TABLE t1(x PRIMARY KEY, y) %WR%; 384565faa9Sdan INSERT INTO t1 VALUES('abc', 'def'); 394565faa9Sdan} 404565faa9Sdan 414565faa9Sdan#------------------------------------------------------------------------- 424565faa9Sdan# Test creating, attaching tables to and deleting session objects. 434565faa9Sdan# 44cb9a3643Sdando_test $tn.1.1 { sqlite3session S db main } {S} 45cb9a3643Sdando_test $tn.1.2 { S delete } {} 46cb9a3643Sdando_test $tn.1.3 { sqlite3session S db main } {S} 47cb9a3643Sdando_test $tn.1.4 { S attach t1 } {} 48cb9a3643Sdando_test $tn.1.5 { S delete } {} 49cb9a3643Sdando_test $tn.1.6 { sqlite3session S db main } {S} 50cb9a3643Sdando_test $tn.1.7 { S attach t1 ; S attach t2 ; S attach t3 } {} 51cb9a3643Sdando_test $tn.1.8 { S attach t1 ; S attach t2 ; S attach t3 } {} 52cb9a3643Sdando_test $tn.1.9 { S delete } {} 53cb9a3643Sdando_test $tn.1.10 { 544565faa9Sdan sqlite3session S db main 554565faa9Sdan S attach t1 564565faa9Sdan execsql { INSERT INTO t1 VALUES('ghi', 'jkl') } 574565faa9Sdan} {} 58cb9a3643Sdando_test $tn.1.11 { S delete } {} 59cb9a3643Sdanif {$tn==1} { 60cb9a3643Sdan do_test $tn.1.12 { 614565faa9Sdan sqlite3session S db main 624565faa9Sdan S attach t1 634565faa9Sdan execsql { INSERT INTO t1 VALUES('mno', 'pqr') } 644565faa9Sdan execsql { UPDATE t1 SET x = 111 WHERE rowid = 1 } 654565faa9Sdan execsql { DELETE FROM t1 WHERE rowid = 2 } 664565faa9Sdan } {} 67cb9a3643Sdan do_test $tn.1.13 { 684565faa9Sdan S changeset 694565faa9Sdan S delete 704565faa9Sdan } {} 71cb9a3643Sdan} 724565faa9Sdan 734565faa9Sdan#------------------------------------------------------------------------- 744565faa9Sdan# Simple changeset tests. Also test the sqlite3changeset_invert() 754565faa9Sdan# function. 764565faa9Sdan# 77cb9a3643Sdando_test $tn.2.1.1 { 784565faa9Sdan execsql { DELETE FROM t1 } 794565faa9Sdan sqlite3session S db main 804565faa9Sdan S attach t1 814565faa9Sdan execsql { INSERT INTO t1 VALUES(1, 'Sukhothai') } 824565faa9Sdan execsql { INSERT INTO t1 VALUES(2, 'Ayutthaya') } 834565faa9Sdan execsql { INSERT INTO t1 VALUES(3, 'Thonburi') } 844565faa9Sdan} {} 85cb9a3643Sdando_changeset_test $tn.2.1.2 S { 86244593c8Sdan {INSERT t1 0 X. {} {i 1 t Sukhothai}} 87244593c8Sdan {INSERT t1 0 X. {} {i 2 t Ayutthaya}} 88244593c8Sdan {INSERT t1 0 X. {} {i 3 t Thonburi}} 894565faa9Sdan} 90cb9a3643Sdando_changeset_invert_test $tn.2.1.3 S { 91244593c8Sdan {DELETE t1 0 X. {i 1 t Sukhothai} {}} 92244593c8Sdan {DELETE t1 0 X. {i 2 t Ayutthaya} {}} 93244593c8Sdan {DELETE t1 0 X. {i 3 t Thonburi} {}} 944565faa9Sdan} 95cb9a3643Sdando_test $tn.2.1.4 { S delete } {} 964565faa9Sdan 97cb9a3643Sdando_test $tn.2.2.1 { 984565faa9Sdan sqlite3session S db main 994565faa9Sdan S attach t1 1004565faa9Sdan execsql { DELETE FROM t1 WHERE 1 } 1014565faa9Sdan} {} 102cb9a3643Sdando_changeset_test $tn.2.2.2 S { 103244593c8Sdan {DELETE t1 0 X. {i 1 t Sukhothai} {}} 104244593c8Sdan {DELETE t1 0 X. {i 2 t Ayutthaya} {}} 105244593c8Sdan {DELETE t1 0 X. {i 3 t Thonburi} {}} 1064565faa9Sdan} 107cb9a3643Sdando_changeset_invert_test $tn.2.2.3 S { 108244593c8Sdan {INSERT t1 0 X. {} {i 1 t Sukhothai}} 109244593c8Sdan {INSERT t1 0 X. {} {i 2 t Ayutthaya}} 110244593c8Sdan {INSERT t1 0 X. {} {i 3 t Thonburi}} 1114565faa9Sdan} 112cb9a3643Sdando_test $tn.2.2.4 { S delete } {} 1134565faa9Sdan 114cb9a3643Sdando_test $tn.2.3.1 { 1154565faa9Sdan execsql { DELETE FROM t1 } 1164565faa9Sdan sqlite3session S db main 1174565faa9Sdan execsql { INSERT INTO t1 VALUES(1, 'Sukhothai') } 1184565faa9Sdan execsql { INSERT INTO t1 VALUES(2, 'Ayutthaya') } 1194565faa9Sdan execsql { INSERT INTO t1 VALUES(3, 'Thonburi') } 1204565faa9Sdan S attach t1 1214565faa9Sdan execsql { 1224565faa9Sdan UPDATE t1 SET x = 10 WHERE x = 1; 1234565faa9Sdan UPDATE t1 SET y = 'Surin' WHERE x = 2; 1244565faa9Sdan UPDATE t1 SET x = 20, y = 'Thapae' WHERE x = 3; 1254565faa9Sdan } 1264565faa9Sdan} {} 1274565faa9Sdan 128cb9a3643Sdando_changeset_test $tn.2.3.2 S { 129244593c8Sdan {INSERT t1 0 X. {} {i 10 t Sukhothai}} 130244593c8Sdan {DELETE t1 0 X. {i 1 t Sukhothai} {}} 131244593c8Sdan {UPDATE t1 0 X. {i 2 t Ayutthaya} {{} {} t Surin}} 132244593c8Sdan {DELETE t1 0 X. {i 3 t Thonburi} {}} 133244593c8Sdan {INSERT t1 0 X. {} {i 20 t Thapae}} 1344565faa9Sdan} 1354565faa9Sdan 136cb9a3643Sdando_changeset_invert_test $tn.2.3.3 S { 137244593c8Sdan {DELETE t1 0 X. {i 10 t Sukhothai} {}} 138244593c8Sdan {INSERT t1 0 X. {} {i 1 t Sukhothai}} 139cfec7eeeSdan {UPDATE t1 0 X. {i 2 t Surin} {{} {} t Ayutthaya}} 140244593c8Sdan {INSERT t1 0 X. {} {i 3 t Thonburi}} 141244593c8Sdan {DELETE t1 0 X. {i 20 t Thapae} {}} 1424565faa9Sdan} 143cb9a3643Sdando_test $tn.2.3.4 { S delete } {} 1444565faa9Sdan 145cb9a3643Sdando_test $tn.2.4.1 { 1464565faa9Sdan sqlite3session S db main 1474565faa9Sdan S attach t1 1484565faa9Sdan execsql { INSERT INTO t1 VALUES(100, 'Bangkok') } 1494565faa9Sdan execsql { DELETE FROM t1 WHERE x = 100 } 1504565faa9Sdan} {} 151cb9a3643Sdando_changeset_test $tn.2.4.2 S {} 152cb9a3643Sdando_changeset_invert_test $tn.2.4.3 S {} 153cb9a3643Sdando_test $tn.2.4.4 { S delete } {} 1544565faa9Sdan 155*779e9906Sdando_execsql_test $tn.2.5.0 { 156*779e9906Sdan SELECT * FROM t1 ORDER BY x 157*779e9906Sdan} { 158*779e9906Sdan 2 Surin 159*779e9906Sdan 10 Sukhothai 160*779e9906Sdan 20 Thapae 161*779e9906Sdan} 162*779e9906Sdan 163*779e9906Sdando_test $tn.2.5.1 { 164*779e9906Sdan sqlite3session S db main 165*779e9906Sdan S attach t1 166*779e9906Sdan execsql { DELETE FROM t1 } 167*779e9906Sdan} {} 168*779e9906Sdando_changeset_test $tn.2.5.2 S { 169*779e9906Sdan {DELETE t1 0 X. {i 10 t Sukhothai} {}} 170*779e9906Sdan {DELETE t1 0 X. {i 2 t Surin} {}} 171*779e9906Sdan {DELETE t1 0 X. {i 20 t Thapae} {}} 172*779e9906Sdan} 173*779e9906Sdando_test $tn.2.5.3 { S delete } {} 174*779e9906Sdan 1754565faa9Sdan#------------------------------------------------------------------------- 1764565faa9Sdan# Test the application of simple changesets. These tests also test that 1774565faa9Sdan# the conflict callback is invoked correctly. For these tests, the 1784565faa9Sdan# conflict callback always returns OMIT. 1794565faa9Sdan# 1804565faa9Sdandb close 1814565faa9Sdanforcedelete test.db test.db2 1824565faa9Sdansqlite3 db test.db 1834565faa9Sdansqlite3 db2 test.db2 1844565faa9Sdan 1854565faa9Sdanproc xConflict {args} { 1864565faa9Sdan lappend ::xConflict $args 1874565faa9Sdan return "" 1884565faa9Sdan} 1894565faa9Sdan 1904565faa9Sdanproc bgerror {args} { set ::background_error $args } 1914565faa9Sdan 1924565faa9Sdanproc do_conflict_test {tn args} { 1934565faa9Sdan set O(-tables) [list] 1944565faa9Sdan set O(-sql) [list] 1954565faa9Sdan set O(-conflicts) [list] 1964565faa9Sdan 1974565faa9Sdan array set V $args 1984565faa9Sdan foreach key [array names V] { 1994565faa9Sdan if {![info exists O($key)]} {error "no such option: $key"} 2004565faa9Sdan } 2014565faa9Sdan array set O $args 2024565faa9Sdan 2034565faa9Sdan sqlite3session S db main 2044565faa9Sdan foreach t $O(-tables) { S attach $t } 2054565faa9Sdan execsql $O(-sql) 2064565faa9Sdan set ::xConflict [list] 2074565faa9Sdan sqlite3changeset_apply db2 [S changeset] xConflict 2084565faa9Sdan 2094565faa9Sdan set conflicts [list] 2104565faa9Sdan foreach c $O(-conflicts) { 2114565faa9Sdan lappend conflicts $c 2124565faa9Sdan } 2134565faa9Sdan 2144565faa9Sdan after 1 {set go 1} 2154565faa9Sdan vwait go 2164565faa9Sdan 2174565faa9Sdan uplevel do_test $tn [list { set ::xConflict }] [list $conflicts] 2184565faa9Sdan S delete 2194565faa9Sdan} 2204565faa9Sdan 2214565faa9Sdanproc do_db2_test {testname sql {result {}}} { 2224565faa9Sdan uplevel do_test $testname [list "execsql {$sql} db2"] [list [list {*}$result]] 2234565faa9Sdan} 2244565faa9Sdan 2254565faa9Sdan# Test INSERT changesets. 2264565faa9Sdan# 227cb9a3643Sdando_test $tn.3.1.0 { 228cb9a3643Sdan execsql { CREATE TABLE t1(a PRIMARY KEY, b NOT NULL) %WR% } db2 2294565faa9Sdan execsql { 230cb9a3643Sdan CREATE TABLE t1(a PRIMARY KEY, b) %WR%; 2314565faa9Sdan INSERT INTO t1 VALUES(1, 'one'); 2324565faa9Sdan INSERT INTO t1 VALUES(2, 'two'); 2334565faa9Sdan } db 2344565faa9Sdan} {} 235cb9a3643Sdando_db2_test $tn.3.1.1 "INSERT INTO t1 VALUES(6, 'VI')" 236cb9a3643Sdando_conflict_test $tn.3.1.2 -tables t1 -sql { 2374565faa9Sdan INSERT INTO t1 VALUES(3, 'three'); 2384565faa9Sdan INSERT INTO t1 VALUES(4, 'four'); 2394565faa9Sdan INSERT INTO t1 VALUES(5, 'five'); 2404565faa9Sdan INSERT INTO t1 VALUES(6, 'six'); 2414565faa9Sdan INSERT INTO t1 VALUES(7, 'seven'); 2424565faa9Sdan INSERT INTO t1 VALUES(8, NULL); 2434565faa9Sdan} -conflicts { 2444565faa9Sdan {INSERT t1 CONFLICT {i 6 t six} {i 6 t VI}} 245d9151526Sdan {INSERT t1 CONSTRAINT {i 8 n {}}} 2464565faa9Sdan} 2474565faa9Sdan 248cb9a3643Sdando_db2_test $tn.3.1.3 "SELECT * FROM t1 ORDER BY a" { 249cb9a3643Sdan 3 three 4 four 5 five 6 VI 7 seven 2504565faa9Sdan} 251cb9a3643Sdando_execsql_test $tn.3.1.4 "SELECT * FROM t1" { 2524565faa9Sdan 1 one 2 two 3 three 4 four 5 five 6 six 7 seven 8 {} 2534565faa9Sdan} 2544565faa9Sdan 2554565faa9Sdan# Test DELETE changesets. 2564565faa9Sdan# 257cb9a3643Sdando_execsql_test $tn.3.2.1 { 2584565faa9Sdan PRAGMA foreign_keys = on; 259cb9a3643Sdan CREATE TABLE t2(a PRIMARY KEY, b)%WR%; 2604565faa9Sdan CREATE TABLE t3(c, d REFERENCES t2); 2614565faa9Sdan INSERT INTO t2 VALUES(1, 'one'); 2624565faa9Sdan INSERT INTO t2 VALUES(2, 'two'); 2634565faa9Sdan INSERT INTO t2 VALUES(3, 'three'); 2644565faa9Sdan INSERT INTO t2 VALUES(4, 'four'); 2654565faa9Sdan} 266cb9a3643Sdando_db2_test $tn.3.2.2 { 2674565faa9Sdan PRAGMA foreign_keys = on; 268cb9a3643Sdan CREATE TABLE t2(a PRIMARY KEY, b)%WR%; 2694565faa9Sdan CREATE TABLE t3(c, d REFERENCES t2); 2704565faa9Sdan INSERT INTO t2 VALUES(1, 'one'); 2714565faa9Sdan INSERT INTO t2 VALUES(2, 'two'); 2724565faa9Sdan INSERT INTO t2 VALUES(4, 'five'); 2734565faa9Sdan INSERT INTO t3 VALUES('i', 1); 2744565faa9Sdan} 275cb9a3643Sdando_conflict_test $tn.3.2.3 -tables t2 -sql { 2764565faa9Sdan DELETE FROM t2 WHERE a = 1; 2774565faa9Sdan DELETE FROM t2 WHERE a = 2; 2784565faa9Sdan DELETE FROM t2 WHERE a = 3; 2794565faa9Sdan DELETE FROM t2 WHERE a = 4; 2804565faa9Sdan} -conflicts { 2814565faa9Sdan {DELETE t2 NOTFOUND {i 3 t three}} 2824565faa9Sdan {DELETE t2 DATA {i 4 t four} {i 4 t five}} 283cb3e4b79Sdan {FOREIGN_KEY 1} 2844565faa9Sdan} 285cb9a3643Sdando_execsql_test $tn.3.2.4 "SELECT * FROM t2" {} 286cb9a3643Sdando_db2_test $tn.3.2.5 "SELECT * FROM t2" {4 five} 2874565faa9Sdan 2884565faa9Sdan# Test UPDATE changesets. 2894565faa9Sdan# 290cb9a3643Sdando_execsql_test $tn.3.3.1 { 291cb9a3643Sdan CREATE TABLE t4(a, b, c, PRIMARY KEY(b, c))%WR%; 2924565faa9Sdan INSERT INTO t4 VALUES(1, 2, 3); 2934565faa9Sdan INSERT INTO t4 VALUES(4, 5, 6); 2944565faa9Sdan INSERT INTO t4 VALUES(7, 8, 9); 2954565faa9Sdan INSERT INTO t4 VALUES(10, 11, 12); 2964565faa9Sdan} 297cb9a3643Sdando_db2_test $tn.3.3.2 { 298cb9a3643Sdan CREATE TABLE t4(a NOT NULL, b, c, PRIMARY KEY(b, c))%WR%; 2994565faa9Sdan INSERT INTO t4 VALUES(0, 2, 3); 3004565faa9Sdan INSERT INTO t4 VALUES(4, 5, 7); 3014565faa9Sdan INSERT INTO t4 VALUES(7, 8, 9); 3024565faa9Sdan INSERT INTO t4 VALUES(10, 11, 12); 3034565faa9Sdan} 304cb9a3643Sdando_conflict_test $tn.3.3.3 -tables t4 -sql { 3054565faa9Sdan UPDATE t4 SET a = -1 WHERE b = 2; 3064565faa9Sdan UPDATE t4 SET a = -1 WHERE b = 5; 3074565faa9Sdan UPDATE t4 SET a = NULL WHERE c = 9; 3084565faa9Sdan UPDATE t4 SET a = 'x' WHERE b = 11; 3094565faa9Sdan} -conflicts { 3104565faa9Sdan {UPDATE t4 DATA {i 1 i 2 i 3} {i -1 {} {} {} {}} {i 0 i 2 i 3}} 3114565faa9Sdan {UPDATE t4 NOTFOUND {i 4 i 5 i 6} {i -1 {} {} {} {}}} 312d9151526Sdan {UPDATE t4 CONSTRAINT {i 7 i 8 i 9} {n {} {} {} {} {}}} 3134565faa9Sdan} 314cb9a3643Sdando_db2_test $tn.3.3.4 { SELECT * FROM t4 } {0 2 3 4 5 7 7 8 9 x 11 12} 315cb9a3643Sdando_execsql_test $tn.3.3.5 { SELECT * FROM t4 } {-1 2 3 -1 5 6 {} 8 9 x 11 12} 3164565faa9Sdan 3174565faa9Sdan#------------------------------------------------------------------------- 3184565faa9Sdan# This next block of tests verifies that values returned by the conflict 3194565faa9Sdan# handler are intepreted correctly. 3204565faa9Sdan# 3214565faa9Sdan 3224565faa9Sdanproc test_reset {} { 3234565faa9Sdan db close 3244565faa9Sdan db2 close 3254565faa9Sdan forcedelete test.db test.db2 3264565faa9Sdan sqlite3 db test.db 3274565faa9Sdan sqlite3 db2 test.db2 3284565faa9Sdan} 3294565faa9Sdan 3304565faa9Sdanproc xConflict {args} { 3314565faa9Sdan lappend ::xConflict $args 3324565faa9Sdan return $::conflict_return 3334565faa9Sdan} 3344565faa9Sdan 335cb9a3643Sdanforeach {tn2 conflict_return after} { 3364565faa9Sdan 1 OMIT {1 2 value1 4 5 7 10 x x} 3374565faa9Sdan 2 REPLACE {1 2 value1 4 5 value2 10 8 9} 3384565faa9Sdan} { 3394565faa9Sdan test_reset 3404565faa9Sdan 341cb9a3643Sdan do_test $tn.4.$tn2.1 { 3424565faa9Sdan foreach db {db db2} { 3434565faa9Sdan execsql { 344cb9a3643Sdan CREATE TABLE t1(a, b, c, PRIMARY KEY(a))%WR%; 3454565faa9Sdan INSERT INTO t1 VALUES(1, 2, 3); 3464565faa9Sdan INSERT INTO t1 VALUES(4, 5, 6); 3474565faa9Sdan INSERT INTO t1 VALUES(7, 8, 9); 3484565faa9Sdan } $db 3494565faa9Sdan } 3504565faa9Sdan execsql { 3514565faa9Sdan REPLACE INTO t1 VALUES(4, 5, 7); 3524565faa9Sdan REPLACE INTO t1 VALUES(10, 'x', 'x'); 3534565faa9Sdan } db2 3544565faa9Sdan } {} 3554565faa9Sdan 356cb9a3643Sdan do_conflict_test $tn.4.$tn2.2 -tables t1 -sql { 3574565faa9Sdan UPDATE t1 SET c = 'value1' WHERE a = 1; -- no conflict 3584565faa9Sdan UPDATE t1 SET c = 'value2' WHERE a = 4; -- DATA conflict 3594565faa9Sdan UPDATE t1 SET a = 10 WHERE a = 7; -- CONFLICT conflict 3604565faa9Sdan } -conflicts { 3614565faa9Sdan {INSERT t1 CONFLICT {i 10 i 8 i 9} {i 10 t x t x}} 3624565faa9Sdan {UPDATE t1 DATA {i 4 {} {} i 6} {{} {} {} {} t value2} {i 4 i 5 i 7}} 3634565faa9Sdan } 3644565faa9Sdan 365cb9a3643Sdan do_db2_test $tn.4.$tn2.3 "SELECT * FROM t1 ORDER BY a" $after 3664565faa9Sdan} 3674565faa9Sdan 368cb9a3643Sdanforeach {tn2 conflict_return} { 3694565faa9Sdan 1 OMIT 3704565faa9Sdan 2 REPLACE 3714565faa9Sdan} { 3724565faa9Sdan test_reset 3734565faa9Sdan 374cb9a3643Sdan do_test $tn.5.$tn2.1 { 3754565faa9Sdan # Create an identical schema in both databases. 3764565faa9Sdan set schema { 377cb9a3643Sdan CREATE TABLE "'foolish name'"(x, y, z, PRIMARY KEY(x, y))%WR%; 3784565faa9Sdan } 3794565faa9Sdan execsql $schema db 3804565faa9Sdan execsql $schema db2 3814565faa9Sdan 3824565faa9Sdan # Add some rows to [db2]. These rows will cause conflicts later 3834565faa9Sdan # on when the changeset from [db] is applied to it. 3844565faa9Sdan execsql { 3854565faa9Sdan INSERT INTO "'foolish name'" VALUES('one', 'one', 'ii'); 3864565faa9Sdan INSERT INTO "'foolish name'" VALUES('one', 'two', 'i'); 3874565faa9Sdan INSERT INTO "'foolish name'" VALUES('two', 'two', 'ii'); 3884565faa9Sdan } db2 3894565faa9Sdan 3904565faa9Sdan } {} 3914565faa9Sdan 392cb9a3643Sdan do_conflict_test $tn.5.$tn2.2 -tables {{'foolish name'}} -sql { 3934565faa9Sdan INSERT INTO "'foolish name'" VALUES('one', 'two', 2); 3944565faa9Sdan } -conflicts { 3954565faa9Sdan {INSERT {'foolish name'} CONFLICT {t one t two i 2} {t one t two t i}} 3964565faa9Sdan } 3974565faa9Sdan 3984565faa9Sdan set res(REPLACE) {one one ii one two 2 two two ii} 3994565faa9Sdan set res(OMIT) {one one ii one two i two two ii} 400cb9a3643Sdan do_db2_test $tn.5.$tn2.3 { 4014565faa9Sdan SELECT * FROM "'foolish name'" ORDER BY x, y 4024565faa9Sdan } $res($conflict_return) 4034565faa9Sdan 4044565faa9Sdan 405cb9a3643Sdan do_test $tn.5.$tn2.1 { 4064565faa9Sdan set schema { 407cb9a3643Sdan CREATE TABLE d1("z""z" PRIMARY KEY, y)%WR%; 4084565faa9Sdan INSERT INTO d1 VALUES(1, 'one'); 4094565faa9Sdan INSERT INTO d1 VALUES(2, 'two'); 4104565faa9Sdan } 4114565faa9Sdan execsql $schema db 4124565faa9Sdan execsql $schema db2 4134565faa9Sdan 4144565faa9Sdan execsql { 4154565faa9Sdan UPDATE d1 SET y = 'TWO' WHERE "z""z" = 2; 4164565faa9Sdan } db2 4174565faa9Sdan 4184565faa9Sdan } {} 4194565faa9Sdan 420cb9a3643Sdan do_conflict_test $tn.5.$tn2.2 -tables d1 -sql { 4214565faa9Sdan DELETE FROM d1 WHERE "z""z" = 2; 4224565faa9Sdan } -conflicts { 4234565faa9Sdan {DELETE d1 DATA {i 2 t two} {i 2 t TWO}} 4244565faa9Sdan } 4254565faa9Sdan 4264565faa9Sdan set res(REPLACE) {1 one} 4274565faa9Sdan set res(OMIT) {1 one 2 TWO} 428cb9a3643Sdan do_db2_test $tn.5.$tn2.3 "SELECT * FROM d1" $res($conflict_return) 4294565faa9Sdan} 4304565faa9Sdan 4314565faa9Sdan#------------------------------------------------------------------------- 4324565faa9Sdan# Test that two tables can be monitored by a single session object. 4334565faa9Sdan# 4344565faa9Sdantest_reset 4354565faa9Sdanset schema { 436cb9a3643Sdan CREATE TABLE t1(a COLLATE nocase PRIMARY KEY, b)%WR%; 437cb9a3643Sdan CREATE TABLE t2(a, b PRIMARY KEY)%WR%; 4384565faa9Sdan} 439cb9a3643Sdando_test $tn.6.0 { 4404565faa9Sdan execsql $schema db 4414565faa9Sdan execsql $schema db2 4424565faa9Sdan execsql { 4434565faa9Sdan INSERT INTO t1 VALUES('a', 'b'); 4444565faa9Sdan INSERT INTO t2 VALUES('a', 'b'); 4454565faa9Sdan } db2 4464565faa9Sdan} {} 4474565faa9Sdan 4484565faa9Sdanset conflict_return "" 449cb9a3643Sdando_conflict_test $tn.6.1 -tables {t1 t2} -sql { 4504565faa9Sdan INSERT INTO t1 VALUES('1', '2'); 4514565faa9Sdan INSERT INTO t1 VALUES('A', 'B'); 4524565faa9Sdan INSERT INTO t2 VALUES('A', 'B'); 4534565faa9Sdan} -conflicts { 4544565faa9Sdan {INSERT t1 CONFLICT {t A t B} {t a t b}} 4554565faa9Sdan} 4564565faa9Sdan 457cb9a3643Sdando_db2_test $tn.6.2 "SELECT * FROM t1 ORDER BY a" {1 2 a b} 458cb9a3643Sdando_db2_test $tn.6.3 "SELECT * FROM t2 ORDER BY a" {A B a b} 4594565faa9Sdan 4606734007dSdan#------------------------------------------------------------------------- 4616734007dSdan# Test that session objects are not confused by changes to table in 4626734007dSdan# other databases. 4636734007dSdan# 4646734007dSdancatch { db2 close } 4656734007dSdandrop_all_tables 4666734007dSdanforcedelete test.db2 467cb9a3643Sdando_iterator_test $tn.7.1 * { 4686734007dSdan ATTACH 'test.db2' AS aux; 469cb9a3643Sdan CREATE TABLE main.t1(x PRIMARY KEY, y)%WR%; 470cb9a3643Sdan CREATE TABLE aux.t1(x PRIMARY KEY, y)%WR%; 4716734007dSdan 4726734007dSdan INSERT INTO main.t1 VALUES('one', 1); 4736734007dSdan INSERT INTO main.t1 VALUES('two', 2); 4746734007dSdan INSERT INTO aux.t1 VALUES('three', 3); 4756734007dSdan INSERT INTO aux.t1 VALUES('four', 4); 4766734007dSdan} { 4776734007dSdan {INSERT t1 0 X. {} {t two i 2}} 4786734007dSdan {INSERT t1 0 X. {} {t one i 1}} 4796734007dSdan} 4806734007dSdan 481b69ec348Sdan#------------------------------------------------------------------------- 482b69ec348Sdan# Test the sqlite3session_isempty() function. 483b69ec348Sdan# 484cb9a3643Sdando_test $tn.8.1 { 485b69ec348Sdan execsql { 486cb9a3643Sdan CREATE TABLE t5(x PRIMARY KEY, y)%WR%; 487cb9a3643Sdan CREATE TABLE t6(x PRIMARY KEY, y)%WR%; 488b69ec348Sdan INSERT INTO t5 VALUES('a', 'b'); 489b69ec348Sdan INSERT INTO t6 VALUES('a', 'b'); 490b69ec348Sdan } 491b69ec348Sdan sqlite3session S db main 492b69ec348Sdan S attach * 493b69ec348Sdan 494b69ec348Sdan S isempty 495ff530326Sdan} {1} 496cb9a3643Sdando_test $tn.8.2 { 497b69ec348Sdan execsql { DELETE FROM t5 } 498b69ec348Sdan S isempty 499ff530326Sdan} {0} 500cb9a3643Sdando_test $tn.8.3 { 501b69ec348Sdan S delete 502b69ec348Sdan sqlite3session S db main 503b69ec348Sdan S attach t5 504b69ec348Sdan execsql { DELETE FROM t5 } 505b69ec348Sdan S isempty 506ff530326Sdan} {1} 507cb9a3643Sdando_test $tn.8.4 { S delete } {} 5086734007dSdan 509cb9a3643Sdando_test $tn.8.5 { 510082c96dfSdan sqlite3session S db main 511082c96dfSdan S attach t5 512082c96dfSdan S attach t6 513082c96dfSdan execsql { INSERT INTO t5 VALUES(1, 2) } 514082c96dfSdan S isempty 515082c96dfSdan} {0} 516082c96dfSdan 517cb9a3643Sdando_test $tn.8.6 { 518082c96dfSdan S delete 519082c96dfSdan sqlite3session S db main 520082c96dfSdan S attach t5 521082c96dfSdan S attach t6 522082c96dfSdan execsql { INSERT INTO t6 VALUES(1, 2) } 523082c96dfSdan S isempty 524082c96dfSdan} {0} 525cb9a3643Sdando_test $tn.8.7 { S delete } {} 526082c96dfSdan 527cfec7eeeSdan#------------------------------------------------------------------------- 528cfec7eeeSdan# 529cb9a3643Sdando_execsql_test $tn.9.1 { 530cb9a3643Sdan CREATE TABLE t7(a, b, c, d, e PRIMARY KEY, f, g)%WR%; 531cfec7eeeSdan INSERT INTO t7 VALUES(1, 1, 1, 1, 1, 1, 1); 532cfec7eeeSdan} 533cb9a3643Sdando_test $tn.9.2 { 534cfec7eeeSdan sqlite3session S db main 535cfec7eeeSdan S attach * 536cfec7eeeSdan execsql { UPDATE t7 SET b=2, d=2 } 537cfec7eeeSdan} {} 538cb9a3643Sdando_changeset_test $tn.9.2 S {{UPDATE t7 0 ....X.. {{} {} i 1 {} {} i 1 i 1 {} {} {} {}} {{} {} i 2 {} {} i 2 {} {} {} {} {} {}}}} 539cfec7eeeSdanS delete 5404565faa9Sdancatch { db2 close } 541e8fa8c96Sdan 542e8fa8c96Sdan#------------------------------------------------------------------------- 543e8fa8c96Sdan# Test a really long table name. 544e8fa8c96Sdan# 545e8fa8c96Sdanreset_db 546e8fa8c96Sdanset tblname [string repeat tblname123 100] 547cb9a3643Sdando_test $tn.10.1.1 { 548e8fa8c96Sdan execsql " 549cb9a3643Sdan CREATE TABLE $tblname (a PRIMARY KEY, b)%WR%; 550e8fa8c96Sdan INSERT INTO $tblname VALUES('xyz', 'def'); 551e8fa8c96Sdan " 552e8fa8c96Sdan sqlite3session S db main 553e8fa8c96Sdan S attach $tblname 554e8fa8c96Sdan execsql " 555e8fa8c96Sdan INSERT INTO $tblname VALUES('uvw', 'abc'); 556e8fa8c96Sdan DELETE FROM $tblname WHERE a = 'xyz'; 557e8fa8c96Sdan " 558e8fa8c96Sdan} {} 559cb9a3643Sdando_changeset_test $tn.10.1.2 S " 560e8fa8c96Sdan {INSERT $tblname 0 X. {} {t uvw t abc}} 561e8fa8c96Sdan {DELETE $tblname 0 X. {t xyz t def} {}} 562e8fa8c96Sdan" 563cb9a3643Sdando_test $tn.10.1.4 { S delete } {} 564e8fa8c96Sdan 5656dc29e60Sdan#--------------------------------------------------------------- 5666dc29e60Sdanreset_db 567cb9a3643Sdando_execsql_test $tn.11.1 { 5686dc29e60Sdan CREATE TABLE t1(a, b); 5696dc29e60Sdan} 570cb9a3643Sdando_test $tn.11.2 { 5716dc29e60Sdan sqlite3session S db main 5726dc29e60Sdan S attach t1 5736dc29e60Sdan execsql { 5746dc29e60Sdan INSERT INTO t1 VALUES(1, 2); 5756dc29e60Sdan } 5766dc29e60Sdan S changeset 5776dc29e60Sdan} {} 5786dc29e60Sdan 5796dc29e60SdanS delete 5806dc29e60Sdan 5816dc29e60Sdan 5826dc29e60Sdan#------------------------------------------------------------------------- 5836dc29e60Sdan# Test a really long table name. 5846dc29e60Sdan# 5856dc29e60Sdanreset_db 5866dc29e60Sdanset tblname [string repeat tblname123 100] 587cb9a3643Sdando_test $tn.10.1.1 { 5886dc29e60Sdan execsql " 589cb9a3643Sdan CREATE TABLE $tblname (a PRIMARY KEY, b)%WR%; 5906dc29e60Sdan INSERT INTO $tblname VALUES('xyz', 'def'); 5916dc29e60Sdan " 5926dc29e60Sdan sqlite3session S db main 5936dc29e60Sdan S attach $tblname 5946dc29e60Sdan execsql " 5956dc29e60Sdan INSERT INTO $tblname VALUES('uvw', 'abc'); 5966dc29e60Sdan DELETE FROM $tblname WHERE a = 'xyz'; 5976dc29e60Sdan " 5986dc29e60Sdan} {} 599cb9a3643Sdando_changeset_test $tn.10.1.2 S " 6006dc29e60Sdan {INSERT $tblname 0 X. {} {t uvw t abc}} 6016dc29e60Sdan {DELETE $tblname 0 X. {t xyz t def} {}} 6026dc29e60Sdan" 603cb9a3643Sdando_test $tn.10.1.4 { S delete } {} 6046dc29e60Sdan 605e43635aaSdan#------------------------------------------------------------------------- 606e43635aaSdan# Test the effect of updating a column from 0.0 to 0.0. 607e43635aaSdan# 608e43635aaSdanreset_db 609cb9a3643Sdando_execsql_test $tn.11.1 { 610cb9a3643Sdan CREATE TABLE t1(a INTEGER PRIMARY KEY, b REAL)%WR%; 611e43635aaSdan INSERT INTO t1 VALUES(1, 0.0); 612e43635aaSdan} 613cb9a3643Sdando_iterator_test $tn.11.2 * { 614e43635aaSdan UPDATE t1 SET b = 0.0; 615e43635aaSdan} { 616e43635aaSdan} 617e8fa8c96Sdan 618f64ece14Sdanreset_db 619cb9a3643Sdando_execsql_test $tn.12.1 { 620cb9a3643Sdan CREATE TABLE t1(r INTEGER PRIMARY KEY, a, b)%WR%; 621f64ece14Sdan CREATE INDEX i1 ON t1(a); 622f64ece14Sdan INSERT INTO t1 VALUES(1, 1, 1); 623f64ece14Sdan INSERT INTO t1 VALUES(2, 1, 2); 624f64ece14Sdan INSERT INTO t1 VALUES(3, 1, 3); 625f64ece14Sdan} 626f64ece14Sdan 627cb9a3643Sdando_iterator_test $tn.12.2 * { 628f64ece14Sdan UPDATE t1 SET b='one' WHERE a=1; 629f64ece14Sdan} { 630f64ece14Sdan {UPDATE t1 0 X.. {i 1 {} {} i 1} {{} {} {} {} t one}} 631f64ece14Sdan {UPDATE t1 0 X.. {i 2 {} {} i 2} {{} {} {} {} t one}} 632f64ece14Sdan {UPDATE t1 0 X.. {i 3 {} {} i 3} {{} {} {} {} t one}} 633f64ece14Sdan} 634f64ece14Sdan 635fe55da38Sdan#------------------------------------------------------------------------- 636fe55da38Sdan# Test that no savepoint is used if -nosavepoint is specified. 637fe55da38Sdan# 638fe55da38Sdando_execsql_test $tn.13.1 { 639fe55da38Sdan CREATE TABLE x1(a INTEGER PRIMARY KEY, b)%WR%; 640fe55da38Sdan} 641fe55da38Sdando_test $tn.13.2 { 642fe55da38Sdan execsql BEGIN 643fe55da38Sdan set C [changeset_from_sql { 644fe55da38Sdan INSERT INTO x1 VALUES(1, 'one'); 645fe55da38Sdan INSERT INTO x1 VALUES(2, 'two'); 646fe55da38Sdan INSERT INTO x1 VALUES(3, 'three'); 647fe55da38Sdan }] 648fe55da38Sdan execsql ROLLBACK 649fe55da38Sdan execsql { 650fe55da38Sdan INSERT INTO x1 VALUES(1, 'i'); 651fe55da38Sdan INSERT INTO x1 VALUES(2, 'ii'); 652fe55da38Sdan INSERT INTO x1 VALUES(3, 'iii'); 653fe55da38Sdan } 654fe55da38Sdan} {} 655fe55da38Sdan 656fe55da38Sdanproc xConflict {args} { 657fe55da38Sdan set ret [lindex $::CONFLICT_HANDLERS 0] 658fe55da38Sdan set ::CONFLICT_HANDLERS [lrange $::CONFLICT_HANDLERS 1 end] 659fe55da38Sdan set ret 660fe55da38Sdan} 661fe55da38Sdando_test $tn.13.3 { 662fe55da38Sdan set CONFLICT_HANDLERS [list REPLACE REPLACE ABORT] 663fe55da38Sdan execsql BEGIN 664fe55da38Sdan catch { sqlite3changeset_apply_v2 db $C xConflict } msg 665fe55da38Sdan execsql { 666fe55da38Sdan SELECT * FROM x1 667fe55da38Sdan } 668fe55da38Sdan} {1 i 2 ii 3 iii} 669fe55da38Sdando_test $tn.13.3 { 670fe55da38Sdan set CONFLICT_HANDLERS [list REPLACE REPLACE ABORT] 671fe55da38Sdan execsql ROLLBACK 672fe55da38Sdan execsql BEGIN 673fe55da38Sdan catch { sqlite3changeset_apply_v2 -nosavepoint db $C xConflict } msg 674fe55da38Sdan execsql { SELECT * FROM x1 } 675fe55da38Sdan} {1 one 2 two 3 iii} 676fe55da38Sdanexecsql ROLLBACK 677fe55da38Sdan 6781f48e67dSdando_test $tn.14.1 { sqlite3session_config strm_size -1 } 64 6791f48e67dSdando_test $tn.14.2 { sqlite3session_config strm_size 65536 } 65536 6801f48e67dSdando_test $tn.14.3 { sqlite3session_config strm_size 64 } 64 6811f48e67dSdando_test $tn.14.4 { 6821f48e67dSdan list [catch {sqlite3session_config invalid 123} msg] $msg 6831f48e67dSdan} {1 SQLITE_MISUSE} 6841f48e67dSdan 685cb9a3643Sdan}] 686cb9a3643Sdan} 687f64ece14Sdan 688f64ece14Sdan 6894565faa9Sdanfinish_test 690