Annotation of embedaddon/sqlite3/test/check.test, revision 1.1
1.1 ! misho 1: # 2005 November 2
! 2: #
! 3: # The author disclaims copyright to this source code. In place of
! 4: # a legal notice, here is a blessing:
! 5: #
! 6: # May you do good and not evil.
! 7: # May you find forgiveness for yourself and forgive others.
! 8: # May you share freely, never taking more than you give.
! 9: #
! 10: #***********************************************************************
! 11: # This file implements regression tests for SQLite library. The
! 12: # focus of this file is testing CHECK constraints
! 13: #
! 14: # $Id: check.test,v 1.13 2009/06/05 17:09:12 drh Exp $
! 15:
! 16: set testdir [file dirname $argv0]
! 17: source $testdir/tester.tcl
! 18:
! 19: # Only run these tests if the build includes support for CHECK constraints
! 20: ifcapable !check {
! 21: finish_test
! 22: return
! 23: }
! 24:
! 25: do_test check-1.1 {
! 26: execsql {
! 27: CREATE TABLE t1(
! 28: x INTEGER CHECK( x<5 ),
! 29: y REAL CHECK( y>x )
! 30: );
! 31: }
! 32: } {}
! 33: do_test check-1.2 {
! 34: execsql {
! 35: INSERT INTO t1 VALUES(3,4);
! 36: SELECT * FROM t1;
! 37: }
! 38: } {3 4.0}
! 39: do_test check-1.3 {
! 40: catchsql {
! 41: INSERT INTO t1 VALUES(6,7);
! 42: }
! 43: } {1 {constraint failed}}
! 44: do_test check-1.4 {
! 45: execsql {
! 46: SELECT * FROM t1;
! 47: }
! 48: } {3 4.0}
! 49: do_test check-1.5 {
! 50: catchsql {
! 51: INSERT INTO t1 VALUES(4,3);
! 52: }
! 53: } {1 {constraint failed}}
! 54: do_test check-1.6 {
! 55: execsql {
! 56: SELECT * FROM t1;
! 57: }
! 58: } {3 4.0}
! 59: do_test check-1.7 {
! 60: catchsql {
! 61: INSERT INTO t1 VALUES(NULL,6);
! 62: }
! 63: } {0 {}}
! 64: do_test check-1.8 {
! 65: execsql {
! 66: SELECT * FROM t1;
! 67: }
! 68: } {3 4.0 {} 6.0}
! 69: do_test check-1.9 {
! 70: catchsql {
! 71: INSERT INTO t1 VALUES(2,NULL);
! 72: }
! 73: } {0 {}}
! 74: do_test check-1.10 {
! 75: execsql {
! 76: SELECT * FROM t1;
! 77: }
! 78: } {3 4.0 {} 6.0 2 {}}
! 79: do_test check-1.11 {
! 80: execsql {
! 81: DELETE FROM t1 WHERE x IS NULL OR x!=3;
! 82: UPDATE t1 SET x=2 WHERE x==3;
! 83: SELECT * FROM t1;
! 84: }
! 85: } {2 4.0}
! 86: do_test check-1.12 {
! 87: catchsql {
! 88: UPDATE t1 SET x=7 WHERE x==2
! 89: }
! 90: } {1 {constraint failed}}
! 91: do_test check-1.13 {
! 92: execsql {
! 93: SELECT * FROM t1;
! 94: }
! 95: } {2 4.0}
! 96: do_test check-1.14 {
! 97: catchsql {
! 98: UPDATE t1 SET x=5 WHERE x==2
! 99: }
! 100: } {1 {constraint failed}}
! 101: do_test check-1.15 {
! 102: execsql {
! 103: SELECT * FROM t1;
! 104: }
! 105: } {2 4.0}
! 106: do_test check-1.16 {
! 107: catchsql {
! 108: UPDATE t1 SET x=4, y=11 WHERE x==2
! 109: }
! 110: } {0 {}}
! 111: do_test check-1.17 {
! 112: execsql {
! 113: SELECT * FROM t1;
! 114: }
! 115: } {4 11.0}
! 116:
! 117: do_test check-2.1 {
! 118: execsql {
! 119: CREATE TABLE t2(
! 120: x INTEGER CHECK( typeof(coalesce(x,0))=="integer" ),
! 121: y REAL CHECK( typeof(coalesce(y,0.1))=='real' ),
! 122: z TEXT CHECK( typeof(coalesce(z,''))=='text' )
! 123: );
! 124: }
! 125: } {}
! 126: do_test check-2.2 {
! 127: execsql {
! 128: INSERT INTO t2 VALUES(1,2.2,'three');
! 129: SELECT * FROM t2;
! 130: }
! 131: } {1 2.2 three}
! 132: db close
! 133: sqlite3 db test.db
! 134: do_test check-2.3 {
! 135: execsql {
! 136: INSERT INTO t2 VALUES(NULL, NULL, NULL);
! 137: SELECT * FROM t2;
! 138: }
! 139: } {1 2.2 three {} {} {}}
! 140: do_test check-2.4 {
! 141: catchsql {
! 142: INSERT INTO t2 VALUES(1.1, NULL, NULL);
! 143: }
! 144: } {1 {constraint failed}}
! 145: do_test check-2.5 {
! 146: catchsql {
! 147: INSERT INTO t2 VALUES(NULL, 5, NULL);
! 148: }
! 149: } {1 {constraint failed}}
! 150: do_test check-2.6 {
! 151: catchsql {
! 152: INSERT INTO t2 VALUES(NULL, NULL, 3.14159);
! 153: }
! 154: } {1 {constraint failed}}
! 155:
! 156: ifcapable subquery {
! 157: do_test check-3.1 {
! 158: catchsql {
! 159: CREATE TABLE t3(
! 160: x, y, z,
! 161: CHECK( x<(SELECT min(x) FROM t1) )
! 162: );
! 163: }
! 164: } {1 {subqueries prohibited in CHECK constraints}}
! 165: }
! 166:
! 167: do_test check-3.2 {
! 168: execsql {
! 169: SELECT name FROM sqlite_master ORDER BY name
! 170: }
! 171: } {t1 t2}
! 172: do_test check-3.3 {
! 173: catchsql {
! 174: CREATE TABLE t3(
! 175: x, y, z,
! 176: CHECK( q<x )
! 177: );
! 178: }
! 179: } {1 {no such column: q}}
! 180: do_test check-3.4 {
! 181: execsql {
! 182: SELECT name FROM sqlite_master ORDER BY name
! 183: }
! 184: } {t1 t2}
! 185: do_test check-3.5 {
! 186: catchsql {
! 187: CREATE TABLE t3(
! 188: x, y, z,
! 189: CHECK( t2.x<x )
! 190: );
! 191: }
! 192: } {1 {no such column: t2.x}}
! 193: do_test check-3.6 {
! 194: execsql {
! 195: SELECT name FROM sqlite_master ORDER BY name
! 196: }
! 197: } {t1 t2}
! 198: do_test check-3.7 {
! 199: catchsql {
! 200: CREATE TABLE t3(
! 201: x, y, z,
! 202: CHECK( t3.x<25 )
! 203: );
! 204: }
! 205: } {0 {}}
! 206: do_test check-3.8 {
! 207: execsql {
! 208: INSERT INTO t3 VALUES(1,2,3);
! 209: SELECT * FROM t3;
! 210: }
! 211: } {1 2 3}
! 212: do_test check-3.9 {
! 213: catchsql {
! 214: INSERT INTO t3 VALUES(111,222,333);
! 215: }
! 216: } {1 {constraint failed}}
! 217:
! 218: do_test check-4.1 {
! 219: execsql {
! 220: CREATE TABLE t4(x, y,
! 221: CHECK (
! 222: x+y==11
! 223: OR x*y==12
! 224: OR x/y BETWEEN 5 AND 8
! 225: OR -x==y+10
! 226: )
! 227: );
! 228: }
! 229: } {}
! 230: do_test check-4.2 {
! 231: execsql {
! 232: INSERT INTO t4 VALUES(1,10);
! 233: SELECT * FROM t4
! 234: }
! 235: } {1 10}
! 236: do_test check-4.3 {
! 237: execsql {
! 238: UPDATE t4 SET x=4, y=3;
! 239: SELECT * FROM t4
! 240: }
! 241: } {4 3}
! 242: do_test check-4.4 {
! 243: execsql {
! 244: UPDATE t4 SET x=12, y=2;
! 245: SELECT * FROM t4
! 246: }
! 247: } {12 2}
! 248: do_test check-4.5 {
! 249: execsql {
! 250: UPDATE t4 SET x=12, y=-22;
! 251: SELECT * FROM t4
! 252: }
! 253: } {12 -22}
! 254: do_test check-4.6 {
! 255: catchsql {
! 256: UPDATE t4 SET x=0, y=1;
! 257: }
! 258: } {1 {constraint failed}}
! 259: do_test check-4.7 {
! 260: execsql {
! 261: SELECT * FROM t4;
! 262: }
! 263: } {12 -22}
! 264: do_test check-4.8 {
! 265: execsql {
! 266: PRAGMA ignore_check_constraints=ON;
! 267: UPDATE t4 SET x=0, y=1;
! 268: SELECT * FROM t4;
! 269: }
! 270: } {0 1}
! 271: do_test check-4.9 {
! 272: catchsql {
! 273: PRAGMA ignore_check_constraints=OFF;
! 274: UPDATE t4 SET x=0, y=2;
! 275: }
! 276: } {1 {constraint failed}}
! 277: ifcapable vacuum {
! 278: do_test check_4.10 {
! 279: catchsql {
! 280: VACUUM
! 281: }
! 282: } {0 {}}
! 283: }
! 284:
! 285: do_test check-5.1 {
! 286: catchsql {
! 287: CREATE TABLE t5(x, y,
! 288: CHECK( x*y<:abc )
! 289: );
! 290: }
! 291: } {1 {parameters prohibited in CHECK constraints}}
! 292: do_test check-5.2 {
! 293: catchsql {
! 294: CREATE TABLE t5(x, y,
! 295: CHECK( x*y<? )
! 296: );
! 297: }
! 298: } {1 {parameters prohibited in CHECK constraints}}
! 299:
! 300: ifcapable conflict {
! 301:
! 302: do_test check-6.1 {
! 303: execsql {SELECT * FROM t1}
! 304: } {4 11.0}
! 305: do_test check-6.2 {
! 306: execsql {
! 307: UPDATE OR IGNORE t1 SET x=5;
! 308: SELECT * FROM t1;
! 309: }
! 310: } {4 11.0}
! 311: do_test check-6.3 {
! 312: execsql {
! 313: INSERT OR IGNORE INTO t1 VALUES(5,4.0);
! 314: SELECT * FROM t1;
! 315: }
! 316: } {4 11.0}
! 317: do_test check-6.4 {
! 318: execsql {
! 319: INSERT OR IGNORE INTO t1 VALUES(2,20.0);
! 320: SELECT * FROM t1;
! 321: }
! 322: } {4 11.0 2 20.0}
! 323: do_test check-6.5 {
! 324: catchsql {
! 325: UPDATE OR FAIL t1 SET x=7-x, y=y+1;
! 326: }
! 327: } {1 {constraint failed}}
! 328: do_test check-6.6 {
! 329: execsql {
! 330: SELECT * FROM t1;
! 331: }
! 332: } {3 12.0 2 20.0}
! 333: do_test check-6.7 {
! 334: catchsql {
! 335: BEGIN;
! 336: INSERT INTO t1 VALUES(1,30.0);
! 337: INSERT OR ROLLBACK INTO t1 VALUES(8,40.0);
! 338: }
! 339: } {1 {constraint failed}}
! 340: do_test check-6.8 {
! 341: catchsql {
! 342: COMMIT;
! 343: }
! 344: } {1 {cannot commit - no transaction is active}}
! 345: do_test check-6.9 {
! 346: execsql {
! 347: SELECT * FROM t1
! 348: }
! 349: } {3 12.0 2 20.0}
! 350:
! 351: do_test check-6.11 {
! 352: execsql {SELECT * FROM t1}
! 353: } {3 12.0 2 20.0}
! 354: do_test check-6.12 {
! 355: catchsql {
! 356: REPLACE INTO t1 VALUES(6,7);
! 357: }
! 358: } {1 {constraint failed}}
! 359: do_test check-6.13 {
! 360: execsql {SELECT * FROM t1}
! 361: } {3 12.0 2 20.0}
! 362: do_test check-6.14 {
! 363: catchsql {
! 364: INSERT OR IGNORE INTO t1 VALUES(6,7);
! 365: }
! 366: } {0 {}}
! 367: do_test check-6.15 {
! 368: execsql {SELECT * FROM t1}
! 369: } {3 12.0 2 20.0}
! 370:
! 371:
! 372: }
! 373:
! 374: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>