1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
|
# 2025 Jan 28
#
# 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.
#
#***********************************************************************
# This file implements regression tests for SQLite library.
#
if {![info exists testdir]} {
set testdir [file join [file dirname [info script]] .. .. test]
}
source [file join [file dirname [info script]] session_common.tcl]
source $testdir/tester.tcl
ifcapable !session {finish_test; return}
set testprefix session_gen
foreach {otn sct} {
1 VIRTUAL
2 STORED
} {
eval [string map [list %TYPE% $sct] {
reset_db
set testprefix $testprefix-$otn
do_execsql_test 1.0 {
CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
CREATE TABLE t2(a INTEGER PRIMARY KEY, b AS (c+1) %TYPE%, c);
CREATE TABLE t3(
a,
b AS (a+10) %TYPE%,
c,
d AS (c+1) %TYPE%,
e,
PRIMARY KEY(c, e)
) WITHOUT ROWID;
CREATE TABLE t4(a AS (c*100) %TYPE%, b INTEGER PRIMARY KEY, c);
CREATE TABLE t5(x, y);
}
foreach {tn sql changeset} {
0.1 {
INSERT INTO t5 VALUES('abc', 'def');
} {
{INSERT t5 0 X.. {} {i 1 t abc t def}}
}
0.2 {
UPDATE t5 SET y='xyz' WHERE rowid=1;
} {
{UPDATE t5 0 X.. {i 1 {} {} t def} {{} {} {} {} t xyz}}
}
0.3 {
DELETE FROM t5;
} {
{DELETE t5 0 X.. {i 1 t abc t xyz} {}}
}
1.1 {
INSERT INTO t2 VALUES(1, 2);
INSERT INTO t2 VALUES(2, 123);
} {
{INSERT t2 0 X. {} {i 1 i 2}}
{INSERT t2 0 X. {} {i 2 i 123}}
}
1.2 {
UPDATE t2 SET c=456 WHERE a=1
} {
{UPDATE t2 0 X. {i 1 i 2} {{} {} i 456}}
}
1.3 {
DELETE FROM t2 WHERE a=2
} {
{DELETE t2 0 X. {i 2 i 123} {}}
}
1.4 {
UPDATE t2 SET a=15
} {
{INSERT t2 0 X. {} {i 15 i 456}}
{DELETE t2 0 X. {i 1 i 456} {}}
}
2.1 {
INSERT INTO t3 VALUES(5, 6, 7);
INSERT INTO t3 VALUES(8, 9, 10);
} {
{INSERT t3 0 .XX {} {i 8 i 9 i 10}}
{INSERT t3 0 .XX {} {i 5 i 6 i 7}}
}
2.2 {
UPDATE t3 SET a = 505 WHERE (c, e) = (6, 7);
} {
{UPDATE t3 0 .XX {i 5 i 6 i 7} {i 505 {} {} {} {}}}
}
2.3 {
DELETE FROM t3 WHERE (c, e) = (9, 10);
} {
{DELETE t3 0 .XX {i 8 i 9 i 10} {}}
}
2.4 {
UPDATE t3 SET c=1000
} {
{DELETE t3 0 .XX {i 505 i 6 i 7} {}}
{INSERT t3 0 .XX {} {i 505 i 1000 i 7}}
}
3.1 {
INSERT INTO t4 VALUES(100, 100);
} {
{INSERT t4 0 X. {} {i 100 i 100}}
}
} {
do_test 1.$tn.1 {
sqlite3session S db main
S object_config rowid 1
S attach *
execsql $sql
} {}
do_changeset_test 1.$tn.2 S $changeset
S delete
}
#-------------------------------------------------------------------------
reset_db
forcedelete test.db2
sqlite3 db2 test.db2
do_common_sql {
CREATE TABLE t0(x INTEGER PRIMARY KEY, y);
INSERT INTO t0 VALUES(1, 'one');
INSERT INTO t0 VALUES(2, 'two');
CREATE TABLE t1(a AS (c*10) %TYPE%, b INTEGER PRIMARY KEY, c);
INSERT INTO t1 VALUES(1, 5);
INSERT INTO t1 VALUES(2, 10);
INSERT INTO t1 VALUES(3, 5);
CREATE TABLE t2(
a, b, c AS (a*b) %TYPE%,
'k 1', 'k 2', PRIMARY KEY('k 1', 'k 2')
) WITHOUT ROWID;
INSERT INTO t2 VALUES('a', 'b', 1, 11);
INSERT INTO t2 VALUES('A', 'B', 2, 22);
INSERT INTO t2 VALUES('Aa', 'Bb', 3, 33);
}
foreach {tn sql} {
1.1 { INSERT INTO t0 VALUES(4, 15) }
1.2 { INSERT INTO t1 VALUES(4, 15) }
1.3 { INSERT INTO t2 VALUES(1, 2, 3, 4) }
2.1 { UPDATE t1 SET c=100 WHERE b=2 }
2.2 { UPDATE t2 SET a=11 }
3.1 { DELETE FROM t2 WHERE (t2.'k 1') = 2 }
3.2 { DELETE FROM t1 }
} {
do_test 2.$tn.1 {
# execsql { PRAGMA vdbe_listing = 1 } db2
do_then_apply_sql $sql
} {}
do_test 2.$tn.2 {
compare_db db db2
} {}
}
db2 close
}]}
finish_test
|