sqlite/test/gencol1.test
drh ff37c40787 Correctly generate pre-UPDATE content for virtual columns that are used
by foreign key constraints.  Ticket [b9befa4b83a660cc]

FossilOrigin-Name: 40d3282ec285d9f724f6548283f48b601510cf5284da17485723fd650a68f436
2019-10-31 20:54:20 +00:00

163 lines
4.0 KiB
Plaintext

# 2019-10-31
#
# 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.
#
#***********************************************************************
#
# Test cases for generated columns.
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
# ticket 830277d9db6c3ba1 on 2019-10-31
do_execsql_test gencol1-100 {
CREATE TABLE t0(c0 AS(TYPEOF(c1)), c1);
INSERT INTO t0(c1) VALUES(0);
CREATE TABLE t1(x AS (typeof(y)), y);
INSERT INTO t1 SELECT * FROM t0;
SELECT * FROM t1;
} {integer 0}
foreach {tn schema} {
1 {
CREATE TABLE t1(
a INT,
b TEXT,
c ANY,
w INT GENERATED ALWAYS AS (a*10),
x TEXT AS (typeof(c)),
y TEXT AS (substr(b,a,a+2))
);
}
2 {
CREATE TABLE t1(
w INT GENERATED ALWAYS AS (a*10),
x TEXT AS (typeof(c)),
y TEXT AS (substr(b,a,a+2)),
a INT,
b TEXT,
c ANY
);
}
3 {
CREATE TABLE t1(
w INT GENERATED ALWAYS AS (a*10),
a INT,
x TEXT AS (typeof(c)) STORED,
b TEXT,
y TEXT AS (substr(b,a,a+2)),
c ANY
);
}
4 {
CREATE TABLE t1(
a INTEGER PRIMARY KEY,
w INT GENERATED ALWAYS AS (a*10),
b TEXT,
x TEXT AS (typeof(c)),
y TEXT AS (substr(b,a,a+2)) STORED,
c ANY
);
}
5 {
CREATE TABLE t1(
w INT GENERATED ALWAYS AS (a*10),
a INT,
x TEXT AS (typeof(c)),
b TEXT,
y TEXT AS (substr(b,a,a+2)) STORED,
c ANY,
PRIMARY KEY(a,b)
) WITHOUT ROWID;
}
6 {
CREATE TABLE t1(
w INT GENERATED ALWAYS AS (m*5),
m INT AS (a*2) STORED,
a INT,
x TEXT AS (typeof(c)),
b TEXT,
y TEXT AS (substr(b,m/2,m/2+2)) STORED,
c ANY,
PRIMARY KEY(a,b)
);
}
7 {
CREATE TABLE t1(
w INT GENERATED ALWAYS AS (m*5),
m INT AS (a*2) NOT NULL,
a INT,
x TEXT AS (typeof(c)) CHECK (x<>'blank'),
b TEXT,
y TEXT AS (substr(b,m/2,m/2+2)) STORED,
c ANY,
PRIMARY KEY(b,a)
) WITHOUT ROWID;
}
} {
catch {db close}
sqlite3 db :memory:
db eval $schema
do_execsql_test gencol1-2.$tn.100 {
INSERT INTO t1(a,b,c) VALUES(1,'abcdef',5.5),(3,'cantaloupe',NULL);
SELECT w, x, y, '|' FROM t1 ORDER BY a;
} {10 real abc | 30 null ntalo |}
do_execsql_test gencol1-2.$tn.101 {
SELECT w, x, y, '|' FROM t1 ORDER BY w;
} {10 real abc | 30 null ntalo |}
do_execsql_test gencol1-2.$tn.102 {
SELECT a FROM t1 WHERE w=30;
} {3}
do_execsql_test gencol1-2.$tn.103 {
SELECT a FROM t1 WHERE x='real';
} {1}
do_execsql_test gencol1-2.$tn.104 {
SELECT a FROM t1 WHERE y LIKE '%tal%' OR x='real' ORDER BY b;
} {1 3}
do_execsql_test gencol1-2.$tn.110 {
CREATE INDEX t1w ON t1(w);
SELECT a FROM t1 WHERE w=10;
} {1}
do_execsql_test gencol1-2.$tn.120 {
CREATE INDEX t1x ON t1(x) WHERE w BETWEEN 20 AND 40;
SELECT a FROM t1 WHERE x='null' AND w BETWEEN 20 AND 40;
} {3}
do_execsql_test gencol1-2.$tn.121 {
SELECT a FROM t1 WHERE x='real';
} {1}
do_execsql_test gencol1-2.$tn.130 {
VACUUM;
PRAGMA integrity_check;
} {ok}
do_execsql_test gencol1-2.$tn.140 {
UPDATE t1 SET a=a+100 WHERE w<20;
SELECT a, w, '|' FROM t1 ORDER BY w;
} {3 30 | 101 1010 |}
do_execsql_test gencol1-2.$tn.150 {
INSERT INTO t1 VALUES(4,'jambalaya','Chef John'),(15,87719874135,0);
SELECT w, x, y, '|' FROM t1 ORDER BY w;
} {30 null ntalo | 40 text balaya | 150 integer {} | 1010 real {} |}
}
# 2019-10-31 ticket b9befa4b83a660cc
db close
sqlite3 db :memory:
do_execsql_test gencol1-3.100 {
PRAGMA foreign_keys = true;
CREATE TABLE t0(c0 PRIMARY KEY, c1, c2 AS (c0+c1-c3) REFERENCES t0, c3);
INSERT INTO t0 VALUES (0, 0, 0), (11, 5, 5);
UPDATE t0 SET c1 = c0, c3 = c0;
SELECT *, '|' FROM t0 ORDER BY +c0;
} {0 0 0 0 | 11 11 11 11 |}
do_catchsql_test gencol1-3.110 {
UPDATE t0 SET c1 = c0, c3 = c0+1;
} {1 {FOREIGN KEY constraint failed}}
finish_test