-- -- Check constraints -- Constraints can be specified with either DEFAULT or CHECK clauses. -- -- -- DEFAULT syntax -- CREATE TABLE DEFAULT_TBL (i int DEFAULT 100, x text DEFAULT 'vadim', f float8 DEFAULT 123.456); INSERT INTO DEFAULT_TBL VALUES (1, 'thomas', 57.0613); INSERT INTO DEFAULT_TBL VALUES (1, 'bruce'); INSERT INTO DEFAULT_TBL (i, f) VALUES (2, 987.654); INSERT INTO DEFAULT_TBL (x) VALUES ('tgl'); INSERT INTO DEFAULT_TBL VALUES (3, null, 1.0); SELECT '' AS four, * FROM DEFAULT_TBL; CREATE SEQUENCE DEFAULT_SEQ; CREATE TABLE DEFAULTEXPR_TBL (i1 int DEFAULT 100 + (200-199) * 2, i2 int DEFAULT nextval('default_seq')); INSERT INTO DEFAULTEXPR_TBL VALUES (-1, -2); INSERT INTO DEFAULTEXPR_TBL (i1) VALUES (-3); INSERT INTO DEFAULTEXPR_TBL (i2) VALUES (-4); INSERT INTO DEFAULTEXPR_TBL (i2) VALUES (NULL); SELECT '' AS four, * FROM DEFAULTEXPR_TBL; -- errors -- test for: -- extraneous comma -- booleans not allowed CREATE TABLE error_tbl (i int DEFAULT (100, )); CREATE TABLE error_tbl (b1 bool DEFAULT 1 < 2); -- -- CHECK syntax -- CREATE TABLE CHECK_TBL (x int) CONSTRAINT CHECK_CON CHECK (x > 3); INSERT INTO CHECK_TBL VALUES (5); INSERT INTO CHECK_TBL VALUES (4); INSERT INTO CHECK_TBL VALUES (3); INSERT INTO CHECK_TBL VALUES (2); INSERT INTO CHECK_TBL VALUES (6); INSERT INTO CHECK_TBL VALUES (1); CREATE SEQUENCE CHECK_SEQ; CREATE TABLE CHECK2_TBL (x int, y text, z int) CONSTRAINT SEQUENCE_CON CHECK (x > 3 and y <> 'check failed' and x < 8); INSERT INTO CHECK2_TBL VALUES (4, 'check ok', -2); INSERT INTO CHECK2_TBL VALUES (1, 'x check failed', -2); INSERT INTO CHECK2_TBL VALUES (5, 'z check failed', 10); INSERT INTO CHECK2_TBL VALUES (0, 'check failed', -2); INSERT INTO CHECK2_TBL VALUES (6, 'check failed', 11); INSERT INTO CHECK2_TBL VALUES (7, 'check ok', 7); -- -- Check constraints on INSERT -- CREATE SEQUENCE INSERT_SEQ; CREATE TABLE INSERT_TBL (x INT DEFAULT nextval('insert_seq'), y TEXT DEFAULT '-NULL-', z INT DEFAULT -1 * currval('insert_seq') ) CONSTRAINT INSERT_CON CHECK (x >= 3 AND y <> 'check failed' AND x < 8), CHECK x + z = 0; INSERT INTO INSERT_TBL VALUES (null, null, null); INSERT INTO INSERT_TBL(x,z) VALUES (2, -2); SELECT * FROM INSERT_TBL; SELECT nextval('insert_seq'); INSERT INTO INSERT_TBL(y) VALUES ('Y'); INSERT INTO INSERT_TBL(y) VALUES ('Y'); INSERT INTO INSERT_TBL(x,z) VALUES (1, -2); INSERT INTO INSERT_TBL(z,x) VALUES (-7, 7); INSERT INTO INSERT_TBL VALUES (5, 'check failed', -5); INSERT INTO INSERT_TBL VALUES (7, '!check failed', -7); INSERT INTO INSERT_TBL(y) VALUES ('-!NULL-'); SELECT * FROM INSERT_TBL; INSERT INTO INSERT_TBL(y,z) VALUES ('check failed', 4); INSERT INTO INSERT_TBL(x,y) VALUES (5, 'check failed'); INSERT INTO INSERT_TBL(x,y) VALUES (5, '!check failed'); INSERT INTO INSERT_TBL(y) VALUES ('-!NULL-'); SELECT * FROM INSERT_TBL; SELECT nextval('insert_seq'); INSERT INTO INSERT_TBL(y) VALUES ('Y'); SELECT currval('insert_seq'); -- -- Check constraints on INSERT INTO -- DELETE FROM INSERT_TBL; DROP SEQUENCE INSERT_SEQ; CREATE SEQUENCE INSERT_SEQ START 4; CREATE TABLE TEMP (xd INT, yd TEXT, zd INT); INSERT INTO TEMP VALUES (null, 'Y', null); INSERT INTO TEMP VALUES (5, '!check failed', null); INSERT INTO TEMP VALUES (null, 'try again', null); INSERT INTO INSERT_TBL(y) select yd from TEMP; SELECT * FROM INSERT_TBL; INSERT INTO INSERT_TBL SELECT * FROM TEMP WHERE yd = 'try again'; INSERT INTO INSERT_TBL(y,z) SELECT yd, -7 FROM TEMP WHERE yd = 'try again'; INSERT INTO INSERT_TBL(y,z) SELECT yd, -8 FROM TEMP WHERE yd = 'try again'; SELECT * FROM INSERT_TBL; DROP TABLE TEMP; -- -- Check constraints on UPDATE -- UPDATE INSERT_TBL SET x = NULL WHERE x = 6; UPDATE INSERT_TBL SET x = 6 WHERE x = 6; UPDATE INSERT_TBL SET x = -z, z = -x; UPDATE INSERT_TBL SET x = z, z = x; SELECT * FROM INSERT_TBL; -- -- Check constraints on COPY FROM -- CREATE TABLE COPY_TBL (x INT, y TEXT, z INT) CONSTRAINT COPY_CON CHECK (x > 3 AND y <> 'check failed' AND x < 7 ); COPY COPY_TBL FROM '_OBJWD_/data/constro.data'; SELECT * FROM COPY_TBL; COPY COPY_TBL FROM '_OBJWD_/data/constrf.data'; SELECT * FROM COPY_TBL;