1# 2016 March 7 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# Tests for RBU focused on the REPLACE operation (rbu_control column 12# contains integer value 2). 13# 14 15source [file join [file dirname [info script]] rbu_common.tcl] 16set ::testprefix rbuC 17 18#------------------------------------------------------------------------- 19# This test is actually of an UPDATE directive. Just to establish that 20# these work with UNIQUE indexes before preceding to REPLACE. 21# 22do_execsql_test 1.0 { 23 CREATE TABLE t1(i INTEGER PRIMARY KEY, a, b, c UNIQUE); 24 INSERT INTO t1 VALUES(1, 'a', 'b', 'c'); 25} 26 27forcedelete rbu.db 28do_execsql_test 1.1 { 29 ATTACH 'rbu.db' AS rbu; 30 CREATE TABLE rbu.data_t1(i, a, b, c, rbu_control); 31 INSERT INTO data_t1 VALUES(1, 'a', 'b', 'c', '.xxx'); 32} 33 34do_test 1.2 { 35 step_rbu test.db rbu.db 36} {SQLITE_DONE} 37 38do_execsql_test 1.3 { 39 SELECT * FROM t1 40} { 41 1 a b c 42} 43 44#------------------------------------------------------------------------- 45# 46foreach {tn schema} { 47 1 { 48 CREATE TABLE t1(i INTEGER PRIMARY KEY, a, b, c UNIQUE); 49 CREATE INDEX t1a ON t1(a); 50 } 51 2 { 52 CREATE TABLE t1(i PRIMARY KEY, a, b, c UNIQUE); 53 CREATE INDEX t1a ON t1(a); 54 } 55 3 { 56 CREATE TABLE t1(i PRIMARY KEY, a, b, c UNIQUE) WITHOUT ROWID; 57 CREATE INDEX t1a ON t1(a); 58 } 59} { 60 reset_db 61 forcedelete rbu.db 62 execsql $schema 63 64 do_execsql_test 2.$tn.0 { 65 INSERT INTO t1 VALUES(1, 'a', 'b', 'c'); 66 INSERT INTO t1 VALUES(2, 'b', 'c', 'd'); 67 INSERT INTO t1 VALUES(3, 'c', 'd', 'e'); 68 } 69 70 do_execsql_test 2.$tn.1 { 71 ATTACH 'rbu.db' AS rbu; 72 CREATE TABLE rbu.data_t1(i, a, b, c, rbu_control); 73 INSERT INTO data_t1 VALUES(1, 1, 2, 3, 2); 74 INSERT INTO data_t1 VALUES(3, 'c', 'd', 'e', 2); 75 INSERT INTO data_t1 VALUES(4, 'd', 'e', 'f', 2); 76 } 77 78 do_test 2.$tn.2 { 79 step_rbu test.db rbu.db 80 } {SQLITE_DONE} 81 82 do_execsql_test 2.$tn.3 { 83 SELECT * FROM t1 ORDER BY i 84 } { 85 1 1 2 3 86 2 b c d 87 3 c d e 88 4 d e f 89 } 90 91 integrity_check 2.$tn.4 92} 93 94foreach {tn schema} { 95 1 { 96 CREATE TABLE t1(a, b, c UNIQUE); 97 CREATE INDEX t1a ON t1(a); 98 } 99 100 2 { 101 CREATE VIRTUAL TABLE t1 USING fts5(a, b, c); 102 } 103} { 104 if {$tn==2} { ifcapable !fts5 break } 105 reset_db 106 forcedelete rbu.db 107 execsql $schema 108 109 do_execsql_test 3.$tn.0 { 110 INSERT INTO t1 VALUES('a', 'b', 'c'); 111 INSERT INTO t1 VALUES('b', 'c', 'd'); 112 INSERT INTO t1 VALUES('c', 'd', 'e'); 113 } 114 115 do_execsql_test 3.$tn.1 { 116 ATTACH 'rbu.db' AS rbu; 117 CREATE TABLE rbu.data_t1(rbu_rowid, a, b, c, rbu_control); 118 INSERT INTO data_t1 VALUES(1, 1, 2, 3, 2); 119 INSERT INTO data_t1 VALUES(3, 'c', 'd', 'e', 2); 120 INSERT INTO data_t1 VALUES(4, 'd', 'e', 'f', 2); 121 } 122 123 do_test 3.$tn.2 { 124 step_rbu test.db rbu.db 125 } {SQLITE_DONE} 126 127 do_execsql_test 3.$tn.3 { 128 SELECT rowid, * FROM t1 ORDER BY 1 129 } { 130 1 1 2 3 131 2 b c d 132 3 c d e 133 4 d e f 134 } 135 136 integrity_check 3.$tn.4 137} 138 139 140 141finish_test 142