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