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
|
# 2021-08-19
#
# 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. The
# focus of this file is testing STRICT tables.
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
set testprefix strict2
# PRAGMA integrity_check on a STRICT table should verify that
# all of the values are of the correct type.
#
do_execsql_test strict2-1.1 {
CREATE TABLE t1(
a INT,
b INTEGER,
c TEXT,
d REAL,
e BLOB
) STRICT;
CREATE TABLE t1nn(
a INT NOT NULL,
b INTEGER NOT NULL,
c TEXT NOT NULL,
d REAL NOT NULL,
e BLOB NOT NULL
) STRICT;
CREATE TABLE t2(a,b,c,d,e);
INSERT INTO t1(a,b,c,d,e) VALUES(1,1,'one',1.0,x'b1'),(2,2,'two',2.25,x'b2b2b2');
PRAGMA writable_schema=on;
UPDATE sqlite_schema SET rootpage=(SELECT rootpage FROM sqlite_schema WHERE name='t1');
} {}
db close
sqlite3 db test.db
do_execsql_test strict2-1.2 {
PRAGMA quick_check('t1');
} {ok}
do_execsql_test strict2-1.3 {
UPDATE t2 SET a=2.5 WHERE b=2;
PRAGMA quick_check('t1');
} {{non-INT value in t1.a}}
do_execsql_test strict2-1.4 {
UPDATE t2 SET a='xyz' WHERE b=2;
PRAGMA quick_check('t1');
} {{non-INT value in t1.a}}
do_execsql_test strict2-1.5 {
UPDATE t2 SET a=x'445566' WHERE b=2;
PRAGMA quick_check('t1');
} {{non-INT value in t1.a}}
do_execsql_test strict2-1.6 {
UPDATE t2 SET a=2.5 WHERE b=2;
PRAGMA quick_check('t1nn');
} {{non-INT value in t1nn.a}}
do_execsql_test strict2-1.7 {
UPDATE t2 SET a='xyz' WHERE b=2;
PRAGMA quick_check('t1nn');
} {{non-INT value in t1nn.a}}
do_execsql_test strict2-1.8 {
UPDATE t2 SET a=x'445566' WHERE b=2;
PRAGMA quick_check('t1nn');
} {{non-INT value in t1nn.a}}
do_execsql_test strict2-1.13 {
UPDATE t2 SET a=2 WHERE b=2;
UPDATE t2 SET b=2.5 WHERE a=2;
PRAGMA quick_check('t1');
} {{non-INTEGER value in t1.b}}
do_execsql_test strict2-1.14 {
UPDATE t2 SET b='two' WHERE a=2;
PRAGMA quick_check('t1');
} {{non-INTEGER value in t1.b}}
do_execsql_test strict2-1.15 {
UPDATE t2 SET b=x'b0b1b2b3b4' WHERE a=2;
PRAGMA quick_check('t1');
} {{non-INTEGER value in t1.b}}
do_execsql_test strict2-1.16 {
UPDATE t2 SET b=NULL WHERE a=2;
PRAGMA quick_check('t1');
} {ok}
do_execsql_test strict2-1.17 {
UPDATE t2 SET b=2.5 WHERE a=2;
PRAGMA quick_check('t1nn');
} {{non-INTEGER value in t1nn.b}}
do_execsql_test strict2-1.18 {
UPDATE t2 SET b=NULL WHERE a=2;
PRAGMA quick_check('t1nn');
} {{NULL value in t1nn.b}}
do_execsql_test strict2-1.23 {
UPDATE t2 SET b=2 WHERE a=2;
UPDATE t2 SET c=9 WHERE a=2;
PRAGMA quick_check('t1');
} {{non-TEXT value in t1.c}}
do_execsql_test strict2-1.24 {
UPDATE t2 SET c=9.5 WHERE a=2;
PRAGMA quick_check('t1');
} {{non-TEXT value in t1.c}}
do_execsql_test strict2-1.25 {
UPDATE t2 SET c=x'b0b1b2b3b4' WHERE a=2;
PRAGMA quick_check('t1');
} {{non-TEXT value in t1.c}}
do_execsql_test strict2-1.33 {
UPDATE t2 SET c='two' WHERE a=2;
UPDATE t2 SET d=9 WHERE a=2;
PRAGMA quick_check('t1');
} {ok}
do_execsql_test strict2-1.34 {
UPDATE t2 SET d='nine' WHERE a=2;
PRAGMA quick_check('t1');
} {{non-REAL value in t1.d}}
do_execsql_test strict2-1.35 {
UPDATE t2 SET d=x'b0b1b2b3b4' WHERE a=2;
PRAGMA quick_check('t1');
} {{non-REAL value in t1.d}}
do_execsql_test strict2-1.43 {
UPDATE t2 SET d=2.5 WHERE a=2;
UPDATE t2 SET e=9 WHERE a=2;
PRAGMA quick_check('t1');
} {{non-BLOB value in t1.e}}
do_execsql_test strict2-1.44 {
UPDATE t2 SET e=9.5 WHERE a=2;
PRAGMA quick_check('t1');
} {{non-BLOB value in t1.e}}
do_execsql_test strict2-1.45 {
UPDATE t2 SET e='hello' WHERE a=2;
PRAGMA quick_check('t1');
} {{non-BLOB value in t1.e}}
do_execsql_test strict2-2.0 {
DROP TABLE IF EXISTS t2;
CREATE TABLE t2(a INT, b ANY) STRICT;
INSERT INTO t2(a,b) VALUES(1,2),(3,4.5),(5,'six'),(7,x'8888'),(9,NULL);
PRAGMA integrity_check(t2);
} {ok}
do_execsql_test strict2-3.0 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(id ANY PRIMARY KEY, x TEXT);
INSERT INTO t1 VALUES(1,2),('three','four'),(x'5555','six'),(NULL,'eight');
PRAGMA writable_schema=ON;
UPDATE sqlite_schema SET sql=(sql||'STRICT') WHERE name='t1';
PRAGMA writable_schema=RESET;
PRAGMA integrity_check(t1);
} {{NULL value in t1.id}}
finish_test
|