xref: /sqlite-3.40.0/test/strict2.test (revision 5c929042)
19e1209d1Sdrh# 2021-08-19
29e1209d1Sdrh#
39e1209d1Sdrh# The author disclaims copyright to this source code.  In place of
49e1209d1Sdrh# a legal notice, here is a blessing:
59e1209d1Sdrh#
69e1209d1Sdrh#    May you do good and not evil.
79e1209d1Sdrh#    May you find forgiveness for yourself and forgive others.
89e1209d1Sdrh#    May you share freely, never taking more than you give.
99e1209d1Sdrh#
109e1209d1Sdrh#***********************************************************************
119e1209d1Sdrh#
129e1209d1Sdrh# This file implements regression tests for SQLite library.  The
139e1209d1Sdrh# focus of this file is testing STRICT tables.
149e1209d1Sdrh#
159e1209d1Sdrh
169e1209d1Sdrhset testdir [file dirname $argv0]
179e1209d1Sdrhsource $testdir/tester.tcl
189e1209d1Sdrhset testprefix strict2
199e1209d1Sdrh
209e1209d1Sdrh# PRAGMA integrity_check on a STRICT table should verify that
219e1209d1Sdrh# all of the values are of the correct type.
229e1209d1Sdrh#
239e1209d1Sdrhdo_execsql_test strict2-1.1 {
249e1209d1Sdrh  CREATE TABLE t1(
259e1209d1Sdrh    a INT,
269e1209d1Sdrh    b INTEGER,
279e1209d1Sdrh    c TEXT,
289e1209d1Sdrh    d REAL,
299e1209d1Sdrh    e BLOB
309e1209d1Sdrh  ) STRICT;
319e1209d1Sdrh  CREATE TABLE t1nn(
329e1209d1Sdrh    a INT NOT NULL,
339e1209d1Sdrh    b INTEGER NOT NULL,
349e1209d1Sdrh    c TEXT NOT NULL,
359e1209d1Sdrh    d REAL NOT NULL,
369e1209d1Sdrh    e BLOB NOT NULL
379e1209d1Sdrh  ) STRICT;
389e1209d1Sdrh  CREATE TABLE t2(a,b,c,d,e);
399e1209d1Sdrh  INSERT INTO t1(a,b,c,d,e) VALUES(1,1,'one',1.0,x'b1'),(2,2,'two',2.25,x'b2b2b2');
409e1209d1Sdrh  PRAGMA writable_schema=on;
419e1209d1Sdrh  UPDATE sqlite_schema SET rootpage=(SELECT rootpage FROM sqlite_schema WHERE name='t1');
429e1209d1Sdrh} {}
439e1209d1Sdrhdb close
449e1209d1Sdrhsqlite3 db test.db
459e1209d1Sdrhdo_execsql_test strict2-1.2 {
469e1209d1Sdrh  PRAGMA quick_check('t1');
479e1209d1Sdrh} {ok}
489e1209d1Sdrhdo_execsql_test strict2-1.3 {
499e1209d1Sdrh  UPDATE t2 SET a=2.5 WHERE b=2;
509e1209d1Sdrh  PRAGMA quick_check('t1');
519e1209d1Sdrh} {{non-INT value in t1.a}}
529e1209d1Sdrhdo_execsql_test strict2-1.4 {
539e1209d1Sdrh  UPDATE t2 SET a='xyz' WHERE b=2;
549e1209d1Sdrh  PRAGMA quick_check('t1');
559e1209d1Sdrh} {{non-INT value in t1.a}}
569e1209d1Sdrhdo_execsql_test strict2-1.5 {
579e1209d1Sdrh  UPDATE t2 SET a=x'445566' WHERE b=2;
589e1209d1Sdrh  PRAGMA quick_check('t1');
599e1209d1Sdrh} {{non-INT value in t1.a}}
609e1209d1Sdrhdo_execsql_test strict2-1.6 {
619e1209d1Sdrh  UPDATE t2 SET a=2.5 WHERE b=2;
629e1209d1Sdrh  PRAGMA quick_check('t1nn');
639e1209d1Sdrh} {{non-INT value in t1nn.a}}
649e1209d1Sdrhdo_execsql_test strict2-1.7 {
659e1209d1Sdrh  UPDATE t2 SET a='xyz' WHERE b=2;
669e1209d1Sdrh  PRAGMA quick_check('t1nn');
679e1209d1Sdrh} {{non-INT value in t1nn.a}}
689e1209d1Sdrhdo_execsql_test strict2-1.8 {
699e1209d1Sdrh  UPDATE t2 SET a=x'445566' WHERE b=2;
709e1209d1Sdrh  PRAGMA quick_check('t1nn');
719e1209d1Sdrh} {{non-INT value in t1nn.a}}
729e1209d1Sdrh
739e1209d1Sdrhdo_execsql_test strict2-1.13 {
749e1209d1Sdrh  UPDATE t2 SET a=2 WHERE b=2;
759e1209d1Sdrh  UPDATE t2 SET b=2.5 WHERE a=2;
769e1209d1Sdrh  PRAGMA quick_check('t1');
779e1209d1Sdrh} {{non-INTEGER value in t1.b}}
789e1209d1Sdrhdo_execsql_test strict2-1.14 {
799e1209d1Sdrh  UPDATE t2 SET b='two' WHERE a=2;
809e1209d1Sdrh  PRAGMA quick_check('t1');
819e1209d1Sdrh} {{non-INTEGER value in t1.b}}
829e1209d1Sdrhdo_execsql_test strict2-1.15 {
839e1209d1Sdrh  UPDATE t2 SET b=x'b0b1b2b3b4' WHERE a=2;
849e1209d1Sdrh  PRAGMA quick_check('t1');
859e1209d1Sdrh} {{non-INTEGER value in t1.b}}
869e1209d1Sdrhdo_execsql_test strict2-1.16 {
879e1209d1Sdrh  UPDATE t2 SET b=NULL WHERE a=2;
889e1209d1Sdrh  PRAGMA quick_check('t1');
899e1209d1Sdrh} {ok}
909e1209d1Sdrhdo_execsql_test strict2-1.17 {
919e1209d1Sdrh  UPDATE t2 SET b=2.5 WHERE a=2;
929e1209d1Sdrh  PRAGMA quick_check('t1nn');
939e1209d1Sdrh} {{non-INTEGER value in t1nn.b}}
949e1209d1Sdrhdo_execsql_test strict2-1.18 {
959e1209d1Sdrh  UPDATE t2 SET b=NULL WHERE a=2;
969e1209d1Sdrh  PRAGMA quick_check('t1nn');
979e1209d1Sdrh} {{NULL value in t1nn.b}}
989e1209d1Sdrh
999e1209d1Sdrhdo_execsql_test strict2-1.23 {
1009e1209d1Sdrh  UPDATE t2 SET b=2 WHERE a=2;
1019e1209d1Sdrh  UPDATE t2 SET c=9 WHERE a=2;
1029e1209d1Sdrh  PRAGMA quick_check('t1');
1039e1209d1Sdrh} {{non-TEXT value in t1.c}}
1049e1209d1Sdrhdo_execsql_test strict2-1.24 {
1059e1209d1Sdrh  UPDATE t2 SET c=9.5 WHERE a=2;
1069e1209d1Sdrh  PRAGMA quick_check('t1');
1079e1209d1Sdrh} {{non-TEXT value in t1.c}}
1089e1209d1Sdrhdo_execsql_test strict2-1.25 {
1099e1209d1Sdrh  UPDATE t2 SET c=x'b0b1b2b3b4' WHERE a=2;
1109e1209d1Sdrh  PRAGMA quick_check('t1');
1119e1209d1Sdrh} {{non-TEXT value in t1.c}}
1129e1209d1Sdrh
1139e1209d1Sdrhdo_execsql_test strict2-1.33 {
1149e1209d1Sdrh  UPDATE t2 SET c='two' WHERE a=2;
1159e1209d1Sdrh  UPDATE t2 SET d=9 WHERE a=2;
1169e1209d1Sdrh  PRAGMA quick_check('t1');
1179e1209d1Sdrh} {ok}
1189e1209d1Sdrhdo_execsql_test strict2-1.34 {
1199e1209d1Sdrh  UPDATE t2 SET d='nine' WHERE a=2;
1209e1209d1Sdrh  PRAGMA quick_check('t1');
1219e1209d1Sdrh} {{non-REAL value in t1.d}}
1229e1209d1Sdrhdo_execsql_test strict2-1.35 {
1239e1209d1Sdrh  UPDATE t2 SET d=x'b0b1b2b3b4' WHERE a=2;
1249e1209d1Sdrh  PRAGMA quick_check('t1');
1259e1209d1Sdrh} {{non-REAL value in t1.d}}
1269e1209d1Sdrh
1279e1209d1Sdrhdo_execsql_test strict2-1.43 {
1289e1209d1Sdrh  UPDATE t2 SET d=2.5 WHERE a=2;
1299e1209d1Sdrh  UPDATE t2 SET e=9 WHERE a=2;
1309e1209d1Sdrh  PRAGMA quick_check('t1');
1319e1209d1Sdrh} {{non-BLOB value in t1.e}}
1329e1209d1Sdrhdo_execsql_test strict2-1.44 {
1339e1209d1Sdrh  UPDATE t2 SET e=9.5 WHERE a=2;
1349e1209d1Sdrh  PRAGMA quick_check('t1');
1359e1209d1Sdrh} {{non-BLOB value in t1.e}}
1369e1209d1Sdrhdo_execsql_test strict2-1.45 {
1379e1209d1Sdrh  UPDATE t2 SET e='hello' WHERE a=2;
1389e1209d1Sdrh  PRAGMA quick_check('t1');
1399e1209d1Sdrh} {{non-BLOB value in t1.e}}
1409e1209d1Sdrh
14194b70d83Sdrhdo_execsql_test strict2-2.0 {
14294b70d83Sdrh  DROP TABLE IF EXISTS t2;
14394b70d83Sdrh  CREATE TABLE t2(a INT, b ANY) STRICT;
14494b70d83Sdrh  INSERT INTO t2(a,b) VALUES(1,2),(3,4.5),(5,'six'),(7,x'8888'),(9,NULL);
14594b70d83Sdrh  PRAGMA integrity_check(t2);
14694b70d83Sdrh} {ok}
1479e1209d1Sdrh
148*5c929042Sdrhdo_execsql_test strict2-3.0 {
149*5c929042Sdrh  DROP TABLE IF EXISTS t1;
150*5c929042Sdrh  CREATE TABLE t1(id ANY PRIMARY KEY, x TEXT);
151*5c929042Sdrh  INSERT INTO t1 VALUES(1,2),('three','four'),(x'5555','six'),(NULL,'eight');
152*5c929042Sdrh  PRAGMA writable_schema=ON;
153*5c929042Sdrh  UPDATE sqlite_schema SET sql=(sql||'STRICT') WHERE name='t1';
154*5c929042Sdrh  PRAGMA writable_schema=RESET;
155*5c929042Sdrh  PRAGMA integrity_check(t1);
156*5c929042Sdrh} {{NULL value in t1.id}}
157*5c929042Sdrh
1589e1209d1Sdrhfinish_test
159