|
|
# 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. |
|
|
# |
|
|
# |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
INSERT INTO t0 VALUES(1, 'one'); |
|
|
INSERT INTO t0 VALUES(2, 'two'); |
|
|
|
|
|
CREATE TABLE t1(a AS (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 |
|
|
|
|
|
|
|
|
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 |
|
|
|