Annotation of embedaddon/sqlite3/test/check.test, revision 1.1.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>