sl@0: # 2005 November 2 sl@0: # sl@0: # The author disclaims copyright to this source code. In place of sl@0: # a legal notice, here is a blessing: sl@0: # sl@0: # May you do good and not evil. sl@0: # May you find forgiveness for yourself and forgive others. sl@0: # May you share freely, never taking more than you give. sl@0: # sl@0: #*********************************************************************** sl@0: # This file implements regression tests for SQLite library. The sl@0: # focus of this file is testing CHECK constraints sl@0: # sl@0: # $Id: check.test,v 1.11 2007/07/23 19:39:47 drh Exp $ sl@0: sl@0: set testdir [file dirname $argv0] sl@0: source $testdir/tester.tcl sl@0: sl@0: # Only run these tests if the build includes support for CHECK constraints sl@0: ifcapable !check { sl@0: finish_test sl@0: return sl@0: } sl@0: sl@0: do_test check-1.1 { sl@0: execsql { sl@0: CREATE TABLE t1( sl@0: x INTEGER CHECK( x<5 ), sl@0: y REAL CHECK( y>x ) sl@0: ); sl@0: } sl@0: } {} sl@0: do_test check-1.2 { sl@0: execsql { sl@0: INSERT INTO t1 VALUES(3,4); sl@0: SELECT * FROM t1; sl@0: } sl@0: } {3 4.0} sl@0: do_test check-1.3 { sl@0: catchsql { sl@0: INSERT INTO t1 VALUES(6,7); sl@0: } sl@0: } {1 {constraint failed}} sl@0: do_test check-1.4 { sl@0: execsql { sl@0: SELECT * FROM t1; sl@0: } sl@0: } {3 4.0} sl@0: do_test check-1.5 { sl@0: catchsql { sl@0: INSERT INTO t1 VALUES(4,3); sl@0: } sl@0: } {1 {constraint failed}} sl@0: do_test check-1.6 { sl@0: execsql { sl@0: SELECT * FROM t1; sl@0: } sl@0: } {3 4.0} sl@0: do_test check-1.7 { sl@0: catchsql { sl@0: INSERT INTO t1 VALUES(NULL,6); sl@0: } sl@0: } {0 {}} sl@0: do_test check-1.8 { sl@0: execsql { sl@0: SELECT * FROM t1; sl@0: } sl@0: } {3 4.0 {} 6.0} sl@0: do_test check-1.9 { sl@0: catchsql { sl@0: INSERT INTO t1 VALUES(2,NULL); sl@0: } sl@0: } {0 {}} sl@0: do_test check-1.10 { sl@0: execsql { sl@0: SELECT * FROM t1; sl@0: } sl@0: } {3 4.0 {} 6.0 2 {}} sl@0: do_test check-1.11 { sl@0: execsql { sl@0: DELETE FROM t1 WHERE x IS NULL OR x!=3; sl@0: UPDATE t1 SET x=2 WHERE x==3; sl@0: SELECT * FROM t1; sl@0: } sl@0: } {2 4.0} sl@0: do_test check-1.12 { sl@0: catchsql { sl@0: UPDATE t1 SET x=7 WHERE x==2 sl@0: } sl@0: } {1 {constraint failed}} sl@0: do_test check-1.13 { sl@0: execsql { sl@0: SELECT * FROM t1; sl@0: } sl@0: } {2 4.0} sl@0: do_test check-1.14 { sl@0: catchsql { sl@0: UPDATE t1 SET x=5 WHERE x==2 sl@0: } sl@0: } {1 {constraint failed}} sl@0: do_test check-1.15 { sl@0: execsql { sl@0: SELECT * FROM t1; sl@0: } sl@0: } {2 4.0} sl@0: do_test check-1.16 { sl@0: catchsql { sl@0: UPDATE t1 SET x=4, y=11 WHERE x==2 sl@0: } sl@0: } {0 {}} sl@0: do_test check-1.17 { sl@0: execsql { sl@0: SELECT * FROM t1; sl@0: } sl@0: } {4 11.0} sl@0: sl@0: do_test check-2.1 { sl@0: execsql { sl@0: CREATE TABLE t2( sl@0: x INTEGER CHECK( typeof(coalesce(x,0))=="integer" ), sl@0: y REAL CHECK( typeof(coalesce(y,0.1))=="real" ), sl@0: z TEXT CHECK( typeof(coalesce(z,''))=="text" ) sl@0: ); sl@0: } sl@0: } {} sl@0: do_test check-2.2 { sl@0: execsql { sl@0: INSERT INTO t2 VALUES(1,2.2,'three'); sl@0: SELECT * FROM t2; sl@0: } sl@0: } {1 2.2 three} sl@0: do_test check-2.3 { sl@0: execsql { sl@0: INSERT INTO t2 VALUES(NULL, NULL, NULL); sl@0: SELECT * FROM t2; sl@0: } sl@0: } {1 2.2 three {} {} {}} sl@0: do_test check-2.4 { sl@0: catchsql { sl@0: INSERT INTO t2 VALUES(1.1, NULL, NULL); sl@0: } sl@0: } {1 {constraint failed}} sl@0: do_test check-2.5 { sl@0: catchsql { sl@0: INSERT INTO t2 VALUES(NULL, 5, NULL); sl@0: } sl@0: } {1 {constraint failed}} sl@0: do_test check-2.6 { sl@0: catchsql { sl@0: INSERT INTO t2 VALUES(NULL, NULL, 3.14159); sl@0: } sl@0: } {1 {constraint failed}} sl@0: sl@0: ifcapable subquery { sl@0: do_test check-3.1 { sl@0: catchsql { sl@0: CREATE TABLE t3( sl@0: x, y, z, sl@0: CHECK( x<(SELECT min(x) FROM t1) ) sl@0: ); sl@0: } sl@0: } {1 {subqueries prohibited in CHECK constraints}} sl@0: } sl@0: sl@0: do_test check-3.2 { sl@0: execsql { sl@0: SELECT name FROM sqlite_master ORDER BY name sl@0: } sl@0: } {t1 t2} sl@0: do_test check-3.3 { sl@0: catchsql { sl@0: CREATE TABLE t3( sl@0: x, y, z, sl@0: CHECK( q