/ Hex Artifact Content
Login

Artifact dcc952a127c394ce0de2aa634d26c78207e855327cc63a24d3638ca8fbfa641e:


0000: 23 20 32 30 30 35 20 4e 6f 76 65 6d 62 65 72 20  # 2005 November 
0010: 32 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  2.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an you give..#.#
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66  *******.# This f
0170: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72  ile implements r
0180: 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20  egression tests 
0190: 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61  for SQLite libra
01a0: 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73  ry.  The.# focus
01b0: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 69 73   of this file is
01c0: 20 74 65 73 74 69 6e 67 20 43 48 45 43 4b 20 63   testing CHECK c
01d0: 6f 6e 73 74 72 61 69 6e 74 73 0a 23 0a 23 20 24  onstraints.#.# $
01e0: 49 64 3a 20 63 68 65 63 6b 2e 74 65 73 74 2c 76  Id: check.test,v
01f0: 20 31 2e 31 33 20 32 30 30 39 2f 30 36 2f 30 35   1.13 2009/06/05
0200: 20 31 37 3a 30 39 3a 31 32 20 64 72 68 20 45 78   17:09:12 drh Ex
0210: 70 20 24 0a 0a 73 65 74 20 74 65 73 74 64 69 72  p $..set testdir
0220: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
0230: 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74  argv0].source $t
0240: 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63  estdir/tester.tc
0250: 6c 0a 73 65 74 20 3a 3a 74 65 73 74 70 72 65 66  l.set ::testpref
0260: 69 78 20 63 68 65 63 6b 0a 0a 23 20 4f 6e 6c 79  ix check..# Only
0270: 20 72 75 6e 20 74 68 65 73 65 20 74 65 73 74 73   run these tests
0280: 20 69 66 20 74 68 65 20 62 75 69 6c 64 20 69 6e   if the build in
0290: 63 6c 75 64 65 73 20 73 75 70 70 6f 72 74 20 66  cludes support f
02a0: 6f 72 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  or CHECK constra
02b0: 69 6e 74 73 0a 69 66 63 61 70 61 62 6c 65 20 21  ints.ifcapable !
02c0: 63 68 65 63 6b 20 7b 0a 20 20 66 69 6e 69 73 68  check {.  finish
02d0: 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d  _test.  return.}
02e0: 0a 0a 64 6f 5f 74 65 73 74 20 63 68 65 63 6b 2d  ..do_test check-
02f0: 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.1 {.  execsql 
0300: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
0310: 4c 45 20 74 31 28 0a 20 20 20 20 20 20 78 20 49  LE t1(.      x I
0320: 4e 54 45 47 45 52 20 43 48 45 43 4b 28 20 78 3c  NTEGER CHECK( x<
0330: 35 20 29 2c 0a 20 20 20 20 20 20 79 20 52 45 41  5 ),.      y REA
0340: 4c 20 43 48 45 43 4b 28 20 79 3e 78 20 29 0a 20  L CHECK( y>x ). 
0350: 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64     );.  }.} {}.d
0360: 6f 5f 74 65 73 74 20 63 68 65 63 6b 2d 31 2e 32  o_test check-1.2
0370: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0380: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0390: 31 20 56 41 4c 55 45 53 28 33 2c 34 29 3b 0a 20  1 VALUES(3,4);. 
03a0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
03b0: 20 74 31 3b 0a 20 20 7d 20 20 0a 7d 20 7b 33 20   t1;.  }  .} {3 
03c0: 34 2e 30 7d 0a 64 6f 5f 74 65 73 74 20 63 68 65  4.0}.do_test che
03d0: 63 6b 2d 31 2e 33 20 7b 0a 20 20 63 61 74 63 68  ck-1.3 {.  catch
03e0: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
03f0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0400: 36 2c 37 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  6,7);.  }.} {1 {
0410: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
0420: 20 66 61 69 6c 65 64 3a 20 74 31 7d 7d 0a 64 6f   failed: t1}}.do
0430: 5f 74 65 73 74 20 63 68 65 63 6b 2d 31 2e 34 20  _test check-1.4 
0440: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
0450: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0460: 74 31 3b 0a 20 20 7d 20 20 0a 7d 20 7b 33 20 34  t1;.  }  .} {3 4
0470: 2e 30 7d 0a 64 6f 5f 74 65 73 74 20 63 68 65 63  .0}.do_test chec
0480: 6b 2d 31 2e 35 20 7b 0a 20 20 63 61 74 63 68 73  k-1.5 {.  catchs
0490: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
04a0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34  INTO t1 VALUES(4
04b0: 2c 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 43  ,3);.  }.} {1 {C
04c0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
04d0: 66 61 69 6c 65 64 3a 20 74 31 7d 7d 0a 64 6f 5f  failed: t1}}.do_
04e0: 74 65 73 74 20 63 68 65 63 6b 2d 31 2e 36 20 7b  test check-1.6 {
04f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0500: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0510: 31 3b 0a 20 20 7d 20 20 0a 7d 20 7b 33 20 34 2e  1;.  }  .} {3 4.
0520: 30 7d 0a 64 6f 5f 74 65 73 74 20 63 68 65 63 6b  0}.do_test check
0530: 2d 31 2e 37 20 7b 0a 20 20 63 61 74 63 68 73 71  -1.7 {.  catchsq
0540: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
0550: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55  NTO t1 VALUES(NU
0560: 4c 4c 2c 36 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20  LL,6);.  }.} {0 
0570: 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 63 68 65 63  {}}.do_test chec
0580: 6b 2d 31 2e 38 20 7b 0a 20 20 65 78 65 63 73 71  k-1.8 {.  execsq
0590: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
05a0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 20 20 0a   FROM t1;.  }  .
05b0: 7d 20 7b 33 20 34 2e 30 20 7b 7d 20 36 2e 30 7d  } {3 4.0 {} 6.0}
05c0: 0a 64 6f 5f 74 65 73 74 20 63 68 65 63 6b 2d 31  .do_test check-1
05d0: 2e 39 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .9 {.  catchsql 
05e0: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
05f0: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 4e 55  O t1 VALUES(2,NU
0600: 4c 4c 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d  LL);.  }.} {0 {}
0610: 7d 0a 64 6f 5f 74 65 73 74 20 63 68 65 63 6b 2d  }.do_test check-
0620: 31 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c  1.10 {.  execsql
0630: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
0640: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 20 20 0a 7d  FROM t1;.  }  .}
0650: 20 7b 33 20 34 2e 30 20 7b 7d 20 36 2e 30 20 32   {3 4.0 {} 6.0 2
0660: 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 63 68 65   {}}.do_test che
0670: 63 6b 2d 31 2e 31 31 20 7b 0a 20 20 65 78 65 63  ck-1.11 {.  exec
0680: 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45  sql {.    DELETE
0690: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78   FROM t1 WHERE x
06a0: 20 49 53 20 4e 55 4c 4c 20 4f 52 20 78 21 3d 33   IS NULL OR x!=3
06b0: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20  ;.    UPDATE t1 
06c0: 53 45 54 20 78 3d 32 20 57 48 45 52 45 20 78 3d  SET x=2 WHERE x=
06d0: 3d 33 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  =3;.    SELECT *
06e0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
06f0: 7b 32 20 34 2e 30 7d 0a 64 6f 5f 74 65 73 74 20  {2 4.0}.do_test 
0700: 63 68 65 63 6b 2d 31 2e 31 32 20 7b 0a 20 20 63  check-1.12 {.  c
0710: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 55 50  atchsql {.    UP
0720: 44 41 54 45 20 74 31 20 53 45 54 20 78 3d 37 20  DATE t1 SET x=7 
0730: 57 48 45 52 45 20 78 3d 3d 32 0a 20 20 7d 0a 7d  WHERE x==2.  }.}
0740: 20 7b 31 20 7b 43 48 45 43 4b 20 63 6f 6e 73 74   {1 {CHECK const
0750: 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 74 31  raint failed: t1
0760: 7d 7d 0a 64 6f 5f 74 65 73 74 20 63 68 65 63 6b  }}.do_test check
0770: 2d 31 2e 31 33 20 7b 0a 20 20 65 78 65 63 73 71  -1.13 {.  execsq
0780: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
0790: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
07a0: 7b 32 20 34 2e 30 7d 0a 64 6f 5f 74 65 73 74 20  {2 4.0}.do_test 
07b0: 63 68 65 63 6b 2d 31 2e 31 34 20 7b 0a 20 20 63  check-1.14 {.  c
07c0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 55 50  atchsql {.    UP
07d0: 44 41 54 45 20 74 31 20 53 45 54 20 78 3d 35 20  DATE t1 SET x=5 
07e0: 57 48 45 52 45 20 78 3d 3d 32 0a 20 20 7d 0a 7d  WHERE x==2.  }.}
07f0: 20 7b 31 20 7b 43 48 45 43 4b 20 63 6f 6e 73 74   {1 {CHECK const
0800: 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 74 31  raint failed: t1
0810: 7d 7d 0a 64 6f 5f 74 65 73 74 20 63 68 65 63 6b  }}.do_test check
0820: 2d 31 2e 31 35 20 7b 0a 20 20 65 78 65 63 73 71  -1.15 {.  execsq
0830: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
0840: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
0850: 7b 32 20 34 2e 30 7d 0a 64 6f 5f 74 65 73 74 20  {2 4.0}.do_test 
0860: 63 68 65 63 6b 2d 31 2e 31 36 20 7b 0a 20 20 63  check-1.16 {.  c
0870: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 55 50  atchsql {.    UP
0880: 44 41 54 45 20 74 31 20 53 45 54 20 78 3d 34 2c  DATE t1 SET x=4,
0890: 20 79 3d 31 31 20 57 48 45 52 45 20 78 3d 3d 32   y=11 WHERE x==2
08a0: 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f  .  }.} {0 {}}.do
08b0: 5f 74 65 73 74 20 63 68 65 63 6b 2d 31 2e 31 37  _test check-1.17
08c0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
08d0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
08e0: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 34 20 31 31   t1;.  }.} {4 11
08f0: 2e 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 63 68 65  .0}..do_test che
0900: 63 6b 2d 32 2e 31 20 7b 0a 20 20 65 78 65 63 73  ck-2.1 {.  execs
0910: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
0920: 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20  writable_schema 
0930: 3d 20 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20  = 1;.    CREATE 
0940: 54 41 42 4c 45 20 74 32 28 0a 20 20 20 20 20 20  TABLE t2(.      
0950: 78 20 49 4e 54 45 47 45 52 20 43 4f 4e 53 54 52  x INTEGER CONSTR
0960: 41 49 4e 54 20 6f 6e 65 20 43 48 45 43 4b 28 20  AINT one CHECK( 
0970: 74 79 70 65 6f 66 28 63 6f 61 6c 65 73 63 65 28  typeof(coalesce(
0980: 78 2c 30 29 29 3d 3d 22 69 6e 74 65 67 65 72 22  x,0))=="integer"
0990: 20 29 2c 0a 20 20 20 20 20 20 79 20 52 45 41 4c   ),.      y REAL
09a0: 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 77 6f 20   CONSTRAINT two 
09b0: 43 48 45 43 4b 28 20 74 79 70 65 6f 66 28 63 6f  CHECK( typeof(co
09c0: 61 6c 65 73 63 65 28 79 2c 30 2e 31 29 29 3d 3d  alesce(y,0.1))==
09d0: 27 72 65 61 6c 27 20 29 2c 0a 20 20 20 20 20 20  'real' ),.      
09e0: 7a 20 54 45 58 54 20 43 4f 4e 53 54 52 41 49 4e  z TEXT CONSTRAIN
09f0: 54 20 74 68 72 65 65 20 43 48 45 43 4b 28 20 74  T three CHECK( t
0a00: 79 70 65 6f 66 28 63 6f 61 6c 65 73 63 65 28 7a  ypeof(coalesce(z
0a10: 2c 27 27 29 29 3d 3d 27 74 65 78 74 27 20 29 0a  ,''))=='text' ).
0a20: 20 20 20 20 29 3b 0a 20 20 20 20 50 52 41 47 4d      );.    PRAGM
0a30: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
0a40: 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  a = 0;.  }.} {}.
0a50: 64 6f 5f 74 65 73 74 20 63 68 65 63 6b 2d 32 2e  do_test check-2.
0a60: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
0a70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0a80: 74 32 20 56 41 4c 55 45 53 28 31 2c 32 2e 32 2c  t2 VALUES(1,2.2,
0a90: 27 74 68 72 65 65 27 29 3b 0a 20 20 20 20 53 45  'three');.    SE
0aa0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
0ab0: 20 20 7d 0a 7d 20 7b 31 20 32 2e 32 20 74 68 72    }.} {1 2.2 thr
0ac0: 65 65 7d 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c  ee}.db close.sql
0ad0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
0ae0: 64 6f 5f 74 65 73 74 20 63 68 65 63 6b 2d 32 2e  do_test check-2.
0af0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
0b00: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0b10: 74 32 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20  t2 VALUES(NULL, 
0b20: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  NULL, NULL);.   
0b30: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0b40: 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 2e 32 20  2;.  }.} {1 2.2 
0b50: 74 68 72 65 65 20 7b 7d 20 7b 7d 20 7b 7d 7d 0a  three {} {} {}}.
0b60: 64 6f 5f 74 65 73 74 20 63 68 65 63 6b 2d 32 2e  do_test check-2.
0b70: 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  4 {.  catchsql {
0b80: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0b90: 20 74 32 20 56 41 4c 55 45 53 28 31 2e 31 2c 20   t2 VALUES(1.1, 
0ba0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 7d  NULL, NULL);.  }
0bb0: 0a 7d 20 7b 31 20 7b 43 48 45 43 4b 20 63 6f 6e  .} {1 {CHECK con
0bc0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20  straint failed: 
0bd0: 6f 6e 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 63 68  one}}.do_test ch
0be0: 65 63 6b 2d 32 2e 35 20 7b 0a 20 20 63 61 74 63  eck-2.5 {.  catc
0bf0: 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  hsql {.    INSER
0c00: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
0c10: 28 4e 55 4c 4c 2c 20 35 2c 20 4e 55 4c 4c 29 3b  (NULL, 5, NULL);
0c20: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 43 48 45 43 4b  .  }.} {1 {CHECK
0c30: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
0c40: 65 64 3a 20 74 77 6f 7d 7d 0a 64 6f 5f 74 65 73  ed: two}}.do_tes
0c50: 74 20 63 68 65 63 6b 2d 32 2e 36 20 7b 0a 20 20  t check-2.6 {.  
0c60: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49  catchsql {.    I
0c70: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
0c80: 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  LUES(NULL, NULL,
0c90: 20 33 2e 31 34 31 35 39 29 3b 0a 20 20 7d 0a 7d   3.14159);.  }.}
0ca0: 20 7b 31 20 7b 43 48 45 43 4b 20 63 6f 6e 73 74   {1 {CHECK const
0cb0: 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 74 68  raint failed: th
0cc0: 72 65 65 7d 7d 0a 0a 23 20 55 6e 64 6f 63 75 6d  ree}}..# Undocum
0cd0: 65 6e 74 65 64 20 62 65 68 61 76 69 6f 72 3a 20  ented behavior: 
0ce0: 20 54 68 65 20 43 4f 4e 53 54 52 41 49 4e 54 20   The CONSTRAINT 
0cf0: 6e 61 6d 65 20 63 6c 61 75 73 65 20 63 61 6e 20  name clause can 
0d00: 66 6f 6c 6c 6f 77 20 61 20 63 6f 6e 73 74 72 61  follow a constra
0d10: 69 6e 74 2e 0a 23 20 53 75 63 68 20 61 20 63 6c  int..# Such a cl
0d20: 61 75 73 65 20 69 73 20 69 67 6e 6f 72 65 64 2e  ause is ignored.
0d30: 20 20 42 75 74 20 74 68 65 20 70 61 72 73 65 72    But the parser
0d40: 20 6d 75 73 74 20 61 63 63 65 70 74 20 69 74 20   must accept it 
0d50: 66 6f 72 20 62 61 63 6b 77 61 72 64 73 0a 23 20  for backwards.# 
0d60: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 23  compatibility..#
0d70: 0a 64 6f 5f 74 65 73 74 20 63 68 65 63 6b 2d 32  .do_test check-2
0d80: 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .10 {.  execsql 
0d90: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
0da0: 4c 45 20 74 32 62 28 0a 20 20 20 20 20 20 78 20  LE t2b(.      x 
0db0: 49 4e 54 45 47 45 52 20 43 48 45 43 4b 28 20 74  INTEGER CHECK( t
0dc0: 79 70 65 6f 66 28 63 6f 61 6c 65 73 63 65 28 78  ypeof(coalesce(x
0dd0: 2c 30 29 29 3d 3d 27 69 6e 74 65 67 65 72 27 20  ,0))=='integer' 
0de0: 29 20 43 4f 4e 53 54 52 41 49 4e 54 20 6f 6e 65  ) CONSTRAINT one
0df0: 2c 0a 20 20 20 20 20 20 79 20 54 45 58 54 20 50  ,.      y TEXT P
0e00: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
0e10: 72 61 69 6e 74 20 74 77 6f 2c 0a 20 20 20 20 20  raint two,.     
0e20: 20 7a 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20   z INTEGER,.    
0e30: 20 20 55 4e 49 51 55 45 28 78 2c 7a 29 20 63 6f    UNIQUE(x,z) co
0e40: 6e 73 74 72 61 69 6e 74 20 74 68 72 65 65 0a 20  nstraint three. 
0e50: 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64     );.  }.} {}.d
0e60: 6f 5f 74 65 73 74 20 63 68 65 63 6b 2d 32 2e 31  o_test check-2.1
0e70: 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  1 {.  catchsql {
0e80: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0e90: 20 74 32 62 20 56 41 4c 55 45 53 28 27 78 79 7a   t2b VALUES('xyz
0ea0: 7a 79 27 2c 27 68 69 27 2c 35 29 3b 0a 20 20 7d  zy','hi',5);.  }
0eb0: 0a 7d 20 7b 31 20 7b 43 48 45 43 4b 20 63 6f 6e  .} {1 {CHECK con
0ec0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20  straint failed: 
0ed0: 74 32 62 7d 7d 0a 64 6f 5f 74 65 73 74 20 63 68  t2b}}.do_test ch
0ee0: 65 63 6b 2d 32 2e 31 32 20 7b 0a 20 20 65 78 65  eck-2.12 {.  exe
0ef0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
0f00: 45 20 54 41 42 4c 45 20 74 32 63 28 0a 20 20 20  E TABLE t2c(.   
0f10: 20 20 20 78 20 49 4e 54 45 47 45 52 20 43 4f 4e     x INTEGER CON
0f20: 53 54 52 41 49 4e 54 20 78 5f 6f 6e 65 20 43 4f  STRAINT x_one CO
0f30: 4e 53 54 52 41 49 4e 54 20 78 5f 74 77 6f 0a 20  NSTRAINT x_two. 
0f40: 20 20 20 20 20 20 20 20 20 43 48 45 43 4b 28 20           CHECK( 
0f50: 74 79 70 65 6f 66 28 63 6f 61 6c 65 73 63 65 28  typeof(coalesce(
0f60: 78 2c 30 29 29 3d 3d 27 69 6e 74 65 67 65 72 27  x,0))=='integer'
0f70: 20 29 0a 20 20 20 20 20 20 20 20 20 20 43 4f 4e   ).          CON
0f80: 53 54 52 41 49 4e 54 20 78 5f 74 77 6f 20 43 4f  STRAINT x_two CO
0f90: 4e 53 54 52 41 49 4e 54 20 78 5f 74 68 72 65 65  NSTRAINT x_three
0fa0: 2c 0a 20 20 20 20 20 20 79 20 49 4e 54 45 47 45  ,.      y INTEGE
0fb0: 52 2c 20 7a 20 49 4e 54 45 47 45 52 2c 0a 20 20  R, z INTEGER,.  
0fc0: 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 75      CONSTRAINT u
0fd0: 5f 6f 6e 65 20 55 4e 49 51 55 45 28 78 2c 79 2c  _one UNIQUE(x,y,
0fe0: 7a 29 20 43 4f 4e 53 54 52 41 49 4e 54 20 75 5f  z) CONSTRAINT u_
0ff0: 74 77 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  two.    );.  }.}
1000: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 63 68 65 63   {}.do_test chec
1010: 6b 2d 32 2e 31 33 20 7b 0a 20 20 63 61 74 63 68  k-2.13 {.  catch
1020: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
1030: 20 49 4e 54 4f 20 74 32 63 20 56 41 4c 55 45 53   INTO t2c VALUES
1040: 28 27 78 79 7a 7a 79 27 2c 37 2c 38 29 3b 0a 20  ('xyzzy',7,8);. 
1050: 20 7d 0a 7d 20 7b 31 20 7b 43 48 45 43 4b 20 63   }.} {1 {CHECK c
1060: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
1070: 3a 20 78 5f 74 77 6f 7d 7d 0a 64 6f 5f 74 65 73  : x_two}}.do_tes
1080: 74 20 63 68 65 63 6b 2d 32 2e 63 6c 65 61 6e 75  t check-2.cleanu
1090: 70 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  p {.  execsql {.
10a0: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49      DROP TABLE I
10b0: 46 20 45 58 49 53 54 53 20 74 32 62 3b 0a 20 20  F EXISTS t2b;.  
10c0: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20    DROP TABLE IF 
10d0: 45 58 49 53 54 53 20 74 32 63 3b 0a 20 20 7d 0a  EXISTS t2c;.  }.
10e0: 7d 20 7b 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20  } {}..ifcapable 
10f0: 73 75 62 71 75 65 72 79 20 7b 0a 20 20 64 6f 5f  subquery {.  do_
1100: 74 65 73 74 20 63 68 65 63 6b 2d 33 2e 31 20 7b  test check-3.1 {
1110: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  .    catchsql {.
1120: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
1130: 4c 45 20 74 33 28 0a 20 20 20 20 20 20 20 20 78  LE t3(.        x
1140: 2c 20 79 2c 20 7a 2c 0a 20 20 20 20 20 20 20 20  , y, z,.        
1150: 43 48 45 43 4b 28 20 78 3c 28 53 45 4c 45 43 54  CHECK( x<(SELECT
1160: 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 74 31 29   min(x) FROM t1)
1170: 20 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   ).      );.    
1180: 7d 0a 20 20 7d 20 7b 31 20 7b 73 75 62 71 75 65  }.  } {1 {subque
1190: 72 69 65 73 20 70 72 6f 68 69 62 69 74 65 64 20  ries prohibited 
11a0: 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  in CHECK constra
11b0: 69 6e 74 73 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65 73  ints}}.}..do_tes
11c0: 74 20 63 68 65 63 6b 2d 33 2e 32 20 7b 0a 20 20  t check-3.2 {.  
11d0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
11e0: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
11f0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44  qlite_master ORD
1200: 45 52 20 42 59 20 6e 61 6d 65 0a 20 20 7d 0a 7d  ER BY name.  }.}
1210: 20 7b 74 31 20 74 32 7d 0a 64 6f 5f 74 65 73 74   {t1 t2}.do_test
1220: 20 63 68 65 63 6b 2d 33 2e 33 20 7b 0a 20 20 63   check-3.3 {.  c
1230: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52  atchsql {.    CR
1240: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 0a 20  EATE TABLE t3(. 
1250: 20 20 20 20 20 78 2c 20 79 2c 20 7a 2c 0a 20 20       x, y, z,.  
1260: 20 20 20 20 43 48 45 43 4b 28 20 71 3c 78 20 29      CHECK( q<x )
1270: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 31  .    );.  }.} {1
1280: 20 7b 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e   {no such column
1290: 3a 20 71 7d 7d 0a 64 6f 5f 74 65 73 74 20 63 68  : q}}.do_test ch
12a0: 65 63 6b 2d 33 2e 34 20 7b 0a 20 20 65 78 65 63  eck-3.4 {.  exec
12b0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
12c0: 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
12d0: 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42  e_master ORDER B
12e0: 59 20 6e 61 6d 65 0a 20 20 7d 0a 7d 20 7b 74 31  Y name.  }.} {t1
12f0: 20 74 32 7d 0a 64 6f 5f 74 65 73 74 20 63 68 65   t2}.do_test che
1300: 63 6b 2d 33 2e 35 20 7b 0a 20 20 63 61 74 63 68  ck-3.5 {.  catch
1310: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
1320: 20 54 41 42 4c 45 20 74 33 28 0a 20 20 20 20 20   TABLE t3(.     
1330: 20 78 2c 20 79 2c 20 7a 2c 0a 20 20 20 20 20 20   x, y, z,.      
1340: 43 48 45 43 4b 28 20 74 32 2e 78 3c 78 20 29 0a  CHECK( t2.x<x ).
1350: 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20      );.  }.} {1 
1360: 7b 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a  {no such column:
1370: 20 74 32 2e 78 7d 7d 0a 64 6f 5f 74 65 73 74 20   t2.x}}.do_test 
1380: 63 68 65 63 6b 2d 33 2e 36 20 7b 0a 20 20 65 78  check-3.6 {.  ex
1390: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
13a0: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
13b0: 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52  ite_master ORDER
13c0: 20 42 59 20 6e 61 6d 65 0a 20 20 7d 0a 7d 20 7b   BY name.  }.} {
13d0: 74 31 20 74 32 7d 0a 64 6f 5f 74 65 73 74 20 63  t1 t2}.do_test c
13e0: 68 65 63 6b 2d 33 2e 37 20 7b 0a 20 20 63 61 74  heck-3.7 {.  cat
13f0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  chsql {.    CREA
1400: 54 45 20 54 41 42 4c 45 20 74 33 28 0a 20 20 20  TE TABLE t3(.   
1410: 20 20 20 78 2c 20 79 2c 20 7a 2c 0a 20 20 20 20     x, y, z,.    
1420: 20 20 43 48 45 43 4b 28 20 74 33 2e 78 3c 32 35    CHECK( t3.x<25
1430: 20 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20   ).    );.  }.} 
1440: 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 63  {0 {}}.do_test c
1450: 68 65 63 6b 2d 33 2e 38 20 7b 0a 20 20 65 78 65  heck-3.8 {.  exe
1460: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
1470: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
1480: 28 31 2c 32 2c 33 29 3b 0a 20 20 20 20 53 45 4c  (1,2,3);.    SEL
1490: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20  ECT * FROM t3;. 
14a0: 20 7d 0a 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f   }.} {1 2 3}.do_
14b0: 74 65 73 74 20 63 68 65 63 6b 2d 33 2e 39 20 7b  test check-3.9 {
14c0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
14d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
14e0: 20 56 41 4c 55 45 53 28 31 31 31 2c 32 32 32 2c   VALUES(111,222,
14f0: 33 33 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  333);.  }.} {1 {
1500: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
1510: 20 66 61 69 6c 65 64 3a 20 74 33 7d 7d 0a 0a 64   failed: t3}}..d
1520: 6f 5f 74 65 73 74 20 63 68 65 63 6b 2d 34 2e 31  o_test check-4.1
1530: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1540: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1550: 74 34 28 78 2c 20 79 2c 0a 20 20 20 20 20 20 43  t4(x, y,.      C
1560: 48 45 43 4b 20 28 0a 20 20 20 20 20 20 20 20 20  HECK (.         
1570: 20 20 78 2b 79 3d 3d 31 31 0a 20 20 20 20 20 20    x+y==11.      
1580: 20 20 4f 52 20 78 2a 79 3d 3d 31 32 0a 20 20 20    OR x*y==12.   
1590: 20 20 20 20 20 4f 52 20 78 2f 79 20 42 45 54 57       OR x/y BETW
15a0: 45 45 4e 20 35 20 41 4e 44 20 38 0a 20 20 20 20  EEN 5 AND 8.    
15b0: 20 20 20 20 4f 52 20 2d 78 3d 3d 79 2b 31 30 0a      OR -x==y+10.
15c0: 20 20 20 20 20 20 29 0a 20 20 20 20 29 3b 0a 20        ).    );. 
15d0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
15e0: 63 68 65 63 6b 2d 34 2e 32 20 7b 0a 20 20 65 78  check-4.2 {.  ex
15f0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
1600: 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45  RT INTO t4 VALUE
1610: 53 28 31 2c 31 30 29 3b 0a 20 20 20 20 53 45 4c  S(1,10);.    SEL
1620: 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 0a 20 20  ECT * FROM t4.  
1630: 7d 0a 7d 20 7b 31 20 31 30 7d 0a 64 6f 5f 74 65  }.} {1 10}.do_te
1640: 73 74 20 63 68 65 63 6b 2d 34 2e 33 20 7b 0a 20  st check-4.3 {. 
1650: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
1660: 50 44 41 54 45 20 74 34 20 53 45 54 20 78 3d 34  PDATE t4 SET x=4
1670: 2c 20 79 3d 33 3b 0a 20 20 20 20 53 45 4c 45 43  , y=3;.    SELEC
1680: 54 20 2a 20 46 52 4f 4d 20 74 34 0a 20 20 7d 0a  T * FROM t4.  }.
1690: 7d 20 7b 34 20 33 7d 0a 64 6f 5f 74 65 73 74 20  } {4 3}.do_test 
16a0: 63 68 65 63 6b 2d 34 2e 34 20 7b 0a 20 20 65 78  check-4.4 {.  ex
16b0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41  ecsql {.    UPDA
16c0: 54 45 20 74 34 20 53 45 54 20 78 3d 31 32 2c 20  TE t4 SET x=12, 
16d0: 79 3d 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  y=2;.    SELECT 
16e0: 2a 20 46 52 4f 4d 20 74 34 0a 20 20 7d 0a 7d 20  * FROM t4.  }.} 
16f0: 7b 31 32 20 32 7d 0a 64 6f 5f 74 65 73 74 20 63  {12 2}.do_test c
1700: 68 65 63 6b 2d 34 2e 35 20 7b 0a 20 20 65 78 65  heck-4.5 {.  exe
1710: 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
1720: 45 20 74 34 20 53 45 54 20 78 3d 31 32 2c 20 79  E t4 SET x=12, y
1730: 3d 2d 32 32 3b 0a 20 20 20 20 53 45 4c 45 43 54  =-22;.    SELECT
1740: 20 2a 20 46 52 4f 4d 20 74 34 0a 20 20 7d 0a 7d   * FROM t4.  }.}
1750: 20 7b 31 32 20 2d 32 32 7d 0a 64 6f 5f 74 65 73   {12 -22}.do_tes
1760: 74 20 63 68 65 63 6b 2d 34 2e 36 20 7b 0a 20 20  t check-4.6 {.  
1770: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 55  catchsql {.    U
1780: 50 44 41 54 45 20 74 34 20 53 45 54 20 78 3d 30  PDATE t4 SET x=0
1790: 2c 20 79 3d 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20  , y=1;.  }.} {1 
17a0: 7b 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e  {CHECK constrain
17b0: 74 20 66 61 69 6c 65 64 3a 20 74 34 7d 7d 0a 64  t failed: t4}}.d
17c0: 6f 5f 74 65 73 74 20 63 68 65 63 6b 2d 34 2e 37  o_test check-4.7
17d0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
17e0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
17f0: 20 74 34 3b 0a 20 20 7d 0a 7d 20 7b 31 32 20 2d   t4;.  }.} {12 -
1800: 32 32 7d 0a 64 6f 5f 74 65 73 74 20 63 68 65 63  22}.do_test chec
1810: 6b 2d 34 2e 38 20 7b 0a 20 20 65 78 65 63 73 71  k-4.8 {.  execsq
1820: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  l {.    PRAGMA i
1830: 67 6e 6f 72 65 5f 63 68 65 63 6b 5f 63 6f 6e 73  gnore_check_cons
1840: 74 72 61 69 6e 74 73 3d 4f 4e 3b 0a 20 20 20 20  traints=ON;.    
1850: 55 50 44 41 54 45 20 74 34 20 53 45 54 20 78 3d  UPDATE t4 SET x=
1860: 30 2c 20 79 3d 31 3b 0a 20 20 20 20 53 45 4c 45  0, y=1;.    SELE
1870: 43 54 20 2a 20 46 52 4f 4d 20 74 34 3b 0a 20 20  CT * FROM t4;.  
1880: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
1890: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20  ty_check;.  }.} 
18a0: 7b 30 20 31 20 6f 6b 7d 0a 64 6f 5f 65 78 65 63  {0 1 ok}.do_exec
18b0: 73 71 6c 5f 74 65 73 74 20 63 68 65 63 6b 2d 34  sql_test check-4
18c0: 2e 38 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20  .8.1 {.  PRAGMA 
18d0: 69 67 6e 6f 72 65 5f 63 68 65 63 6b 5f 63 6f 6e  ignore_check_con
18e0: 73 74 72 61 69 6e 74 73 3d 4f 46 46 3b 0a 20 20  straints=OFF;.  
18f0: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
1900: 5f 63 68 65 63 6b 3b 0a 7d 20 7b 7b 43 48 45 43  _check;.} {{CHEC
1910: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  K constraint fai
1920: 6c 65 64 20 69 6e 20 74 34 7d 7d 0a 64 6f 5f 74  led in t4}}.do_t
1930: 65 73 74 20 63 68 65 63 6b 2d 34 2e 39 20 7b 0a  est check-4.9 {.
1940: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
1950: 20 55 50 44 41 54 45 20 74 34 20 53 45 54 20 78   UPDATE t4 SET x
1960: 3d 30 2c 20 79 3d 32 3b 0a 20 20 7d 0a 7d 20 7b  =0, y=2;.  }.} {
1970: 31 20 7b 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  1 {CHECK constra
1980: 69 6e 74 20 66 61 69 6c 65 64 3a 20 74 34 7d 7d  int failed: t4}}
1990: 0a 69 66 63 61 70 61 62 6c 65 20 76 61 63 75 75  .ifcapable vacuu
19a0: 6d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 63 68  m {.  do_test ch
19b0: 65 63 6b 5f 34 2e 31 30 20 7b 0a 20 20 20 20 63  eck_4.10 {.    c
19c0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20  atchsql {.      
19d0: 56 41 43 55 55 4d 0a 20 20 20 20 7d 0a 20 20 7d  VACUUM.    }.  }
19e0: 20 7b 30 20 7b 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65   {0 {}}.}..do_te
19f0: 73 74 20 63 68 65 63 6b 2d 35 2e 31 20 7b 0a 20  st check-5.1 {. 
1a00: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
1a10: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 35 28  CREATE TABLE t5(
1a20: 78 2c 20 79 2c 0a 20 20 20 20 20 20 43 48 45 43  x, y,.      CHEC
1a30: 4b 28 20 78 2a 79 3c 3a 61 62 63 20 29 0a 20 20  K( x*y<:abc ).  
1a40: 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 70    );.  }.} {1 {p
1a50: 61 72 61 6d 65 74 65 72 73 20 70 72 6f 68 69 62  arameters prohib
1a60: 69 74 65 64 20 69 6e 20 43 48 45 43 4b 20 63 6f  ited in CHECK co
1a70: 6e 73 74 72 61 69 6e 74 73 7d 7d 0a 64 6f 5f 74  nstraints}}.do_t
1a80: 65 73 74 20 63 68 65 63 6b 2d 35 2e 32 20 7b 0a  est check-5.2 {.
1a90: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
1aa0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 35   CREATE TABLE t5
1ab0: 28 78 2c 20 79 2c 0a 20 20 20 20 20 20 43 48 45  (x, y,.      CHE
1ac0: 43 4b 28 20 78 2a 79 3c 3f 20 29 0a 20 20 20 20  CK( x*y<? ).    
1ad0: 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 70 61 72  );.  }.} {1 {par
1ae0: 61 6d 65 74 65 72 73 20 70 72 6f 68 69 62 69 74  ameters prohibit
1af0: 65 64 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73  ed in CHECK cons
1b00: 74 72 61 69 6e 74 73 7d 7d 0a 0a 69 66 63 61 70  traints}}..ifcap
1b10: 61 62 6c 65 20 63 6f 6e 66 6c 69 63 74 20 7b 0a  able conflict {.
1b20: 0a 64 6f 5f 74 65 73 74 20 63 68 65 63 6b 2d 36  .do_test check-6
1b30: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
1b40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1b50: 7d 0a 7d 20 7b 34 20 31 31 2e 30 7d 0a 64 6f 5f  }.} {4 11.0}.do_
1b60: 74 65 73 74 20 63 68 65 63 6b 2d 36 2e 32 20 7b  test check-6.2 {
1b70: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1b80: 20 55 50 44 41 54 45 20 4f 52 20 49 47 4e 4f 52   UPDATE OR IGNOR
1b90: 45 20 74 31 20 53 45 54 20 78 3d 35 3b 0a 20 20  E t1 SET x=5;.  
1ba0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1bb0: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 34 20 31 31 2e  t1;.  }.} {4 11.
1bc0: 30 7d 0a 64 6f 5f 74 65 73 74 20 63 68 65 63 6b  0}.do_test check
1bd0: 2d 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -6.3 {.  execsql
1be0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52   {.    INSERT OR
1bf0: 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 31 20   IGNORE INTO t1 
1c00: 56 41 4c 55 45 53 28 35 2c 34 2e 30 29 3b 0a 20  VALUES(5,4.0);. 
1c10: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1c20: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 34 20 31 31   t1;.  }.} {4 11
1c30: 2e 30 7d 0a 64 6f 5f 74 65 73 74 20 63 68 65 63  .0}.do_test chec
1c40: 6b 2d 36 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  k-6.4 {.  execsq
1c50: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 4f  l {.    INSERT O
1c60: 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 31  R IGNORE INTO t1
1c70: 20 56 41 4c 55 45 53 28 32 2c 32 30 2e 30 29 3b   VALUES(2,20.0);
1c80: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
1c90: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 34 20  OM t1;.  }.} {4 
1ca0: 31 31 2e 30 20 32 20 32 30 2e 30 7d 0a 64 6f 5f  11.0 2 20.0}.do_
1cb0: 74 65 73 74 20 63 68 65 63 6b 2d 36 2e 35 20 7b  test check-6.5 {
1cc0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
1cd0: 20 20 55 50 44 41 54 45 20 4f 52 20 46 41 49 4c    UPDATE OR FAIL
1ce0: 20 74 31 20 53 45 54 20 78 3d 37 2d 78 2c 20 79   t1 SET x=7-x, y
1cf0: 3d 79 2b 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  =y+1;.  }.} {1 {
1d00: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
1d10: 20 66 61 69 6c 65 64 3a 20 74 31 7d 7d 0a 64 6f   failed: t1}}.do
1d20: 5f 74 65 73 74 20 63 68 65 63 6b 2d 36 2e 36 20  _test check-6.6 
1d30: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1d40: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1d50: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 33 20 31 32 2e  t1;.  }.} {3 12.
1d60: 30 20 32 20 32 30 2e 30 7d 0a 64 6f 5f 74 65 73  0 2 20.0}.do_tes
1d70: 74 20 63 68 65 63 6b 2d 36 2e 37 20 7b 0a 20 20  t check-6.7 {.  
1d80: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 42  catchsql {.    B
1d90: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
1da0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1db0: 31 2c 33 30 2e 30 29 3b 0a 20 20 20 20 49 4e 53  1,30.0);.    INS
1dc0: 45 52 54 20 4f 52 20 52 4f 4c 4c 42 41 43 4b 20  ERT OR ROLLBACK 
1dd0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 38  INTO t1 VALUES(8
1de0: 2c 34 30 2e 30 29 3b 0a 20 20 7d 0a 7d 20 7b 31  ,40.0);.  }.} {1
1df0: 20 7b 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69   {CHECK constrai
1e00: 6e 74 20 66 61 69 6c 65 64 3a 20 74 31 7d 7d 0a  nt failed: t1}}.
1e10: 64 6f 5f 74 65 73 74 20 63 68 65 63 6b 2d 36 2e  do_test check-6.
1e20: 38 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  8 {.  catchsql {
1e30: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
1e40: 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 63 6f  .} {1 {cannot co
1e50: 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61  mmit - no transa
1e60: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 7d  ction is active}
1e70: 7d 0a 64 6f 5f 74 65 73 74 20 63 68 65 63 6b 2d  }.do_test check-
1e80: 36 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.9 {.  execsql 
1e90: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
1ea0: 52 4f 4d 20 74 31 0a 20 20 7d 0a 7d 20 7b 33 20  ROM t1.  }.} {3 
1eb0: 31 32 2e 30 20 32 20 32 30 2e 30 7d 0a 0a 64 6f  12.0 2 20.0}..do
1ec0: 5f 74 65 73 74 20 63 68 65 63 6b 2d 36 2e 31 31  _test check-6.11
1ed0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
1ee0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a  LECT * FROM t1}.
1ef0: 7d 20 7b 33 20 31 32 2e 30 20 32 20 32 30 2e 30  } {3 12.0 2 20.0
1f00: 7d 0a 64 6f 5f 74 65 73 74 20 63 68 65 63 6b 2d  }.do_test check-
1f10: 36 2e 31 32 20 7b 0a 20 20 63 61 74 63 68 73 71  6.12 {.  catchsq
1f20: 6c 20 7b 0a 20 20 20 20 52 45 50 4c 41 43 45 20  l {.    REPLACE 
1f30: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36  INTO t1 VALUES(6
1f40: 2c 37 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 43  ,7);.  }.} {1 {C
1f50: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
1f60: 66 61 69 6c 65 64 3a 20 74 31 7d 7d 0a 64 6f 5f  failed: t1}}.do_
1f70: 74 65 73 74 20 63 68 65 63 6b 2d 36 2e 31 33 20  test check-6.13 
1f80: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
1f90: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 7d  ECT * FROM t1}.}
1fa0: 20 7b 33 20 31 32 2e 30 20 32 20 32 30 2e 30 7d   {3 12.0 2 20.0}
1fb0: 0a 64 6f 5f 74 65 73 74 20 63 68 65 63 6b 2d 36  .do_test check-6
1fc0: 2e 31 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  .14 {.  catchsql
1fd0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52   {.    INSERT OR
1fe0: 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 31 20   IGNORE INTO t1 
1ff0: 56 41 4c 55 45 53 28 36 2c 37 29 3b 0a 20 20 7d  VALUES(6,7);.  }
2000: 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73  .} {0 {}}.do_tes
2010: 74 20 63 68 65 63 6b 2d 36 2e 31 35 20 7b 0a 20  t check-6.15 {. 
2020: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
2030: 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 7d 20 7b 33   * FROM t1}.} {3
2040: 20 31 32 2e 30 20 32 20 32 30 2e 30 7d 0a 0a 0a   12.0 2 20.0}...
2050: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
2060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
20a0: 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e   If a connection
20b0: 20 6f 70 65 6e 73 20 61 20 64 61 74 61 62 61 73   opens a databas
20c0: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
20d0: 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  a CHECK constrai
20e0: 6e 74 20 74 68 61 74 0a 23 20 75 73 65 73 20 61  nt that.# uses a
20f0: 6e 20 75 6e 6b 6e 6f 77 6e 20 55 44 46 2c 20 74  n unknown UDF, t
2100: 68 65 20 73 63 68 65 6d 61 20 73 68 6f 75 6c 64  he schema should
2110: 20 6e 6f 74 20 62 65 20 63 6f 6e 73 69 64 65 72   not be consider
2120: 65 64 20 6d 61 6c 66 6f 72 6d 65 64 2e 0a 23 20  ed malformed..# 
2130: 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6d 6f  Attempting to mo
2140: 64 69 66 79 20 74 68 65 20 74 61 62 6c 65 20 73  dify the table s
2150: 68 6f 75 6c 64 20 66 61 69 6c 20 28 73 69 6e 63  hould fail (sinc
2160: 65 20 74 68 65 20 43 48 45 43 4b 20 63 6f 6e 73  e the CHECK cons
2170: 74 72 61 69 6e 74 0a 23 20 63 61 6e 6e 6f 74 20  traint.# cannot 
2180: 62 65 20 74 65 73 74 65 64 29 2e 0a 23 0a 72 65  be tested)..#.re
2190: 73 65 74 5f 64 62 0a 70 72 6f 63 20 6d 79 66 75  set_db.proc myfu
21a0: 6e 63 20 7b 78 7d 20 7b 65 78 70 72 20 24 78 20  nc {x} {expr $x 
21b0: 3c 20 31 30 7d 0a 64 62 20 66 75 6e 63 20 6d 79  < 10}.db func my
21c0: 66 75 6e 63 20 6d 79 66 75 6e 63 0a 0a 64 6f 5f  func myfunc..do_
21d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 20 37 2e  execsql_test  7.
21e0: 31 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45  1 { CREATE TABLE
21f0: 20 74 36 28 61 20 43 48 45 43 4b 20 28 6d 79 66   t6(a CHECK (myf
2200: 75 6e 63 28 61 29 29 29 20 7d 0a 64 6f 5f 65 78  unc(a))) }.do_ex
2210: 65 63 73 71 6c 5f 74 65 73 74 20 20 37 2e 32 20  ecsql_test  7.2 
2220: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36  { INSERT INTO t6
2230: 20 56 41 4c 55 45 53 28 39 29 20 20 7d 0a 64 6f   VALUES(9)  }.do
2240: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 37  _catchsql_test 7
2250: 2e 33 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  .3 { INSERT INTO
2260: 20 74 36 20 56 41 4c 55 45 53 28 31 31 29 20 7d   t6 VALUES(11) }
2270: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 7b 31 20   \.          {1 
2280: 7b 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e  {CHECK constrain
2290: 74 20 66 61 69 6c 65 64 3a 20 74 36 7d 7d 0a 0a  t failed: t6}}..
22a0: 64 6f 5f 74 65 73 74 20 37 2e 34 20 7b 0a 20 20  do_test 7.4 {.  
22b0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
22c0: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  .db.  execsql { 
22d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36  SELECT * FROM t6
22e0: 20 7d 20 64 62 32 20 0a 7d 20 7b 39 7d 0a 0a 64   } db2 .} {9}..d
22f0: 6f 5f 74 65 73 74 20 37 2e 35 20 7b 0a 20 20 63  o_test 7.5 {.  c
2300: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
2310: 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28   INTO t6 VALUES(
2320: 38 29 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 75  8) } db2.} {1 {u
2330: 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a  nknown function:
2340: 20 6d 79 66 75 6e 63 28 29 7d 7d 0a 0a 64 6f 5f   myfunc()}}..do_
2350: 74 65 73 74 20 37 2e 36 20 7b 0a 20 20 63 61 74  test 7.6 {.  cat
2360: 63 68 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54  chsql { CREATE T
2370: 41 42 4c 45 20 74 37 28 61 20 43 48 45 43 4b 20  ABLE t7(a CHECK 
2380: 28 6d 79 66 75 6e 63 28 61 29 29 29 20 7d 20 64  (myfunc(a))) } d
2390: 62 32 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68  b2.} {1 {no such
23a0: 20 66 75 6e 63 74 69 6f 6e 3a 20 6d 79 66 75 6e   function: myfun
23b0: 63 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 37 2e 37  c}}..do_test 7.7
23c0: 20 7b 0a 20 20 64 62 32 20 66 75 6e 63 20 6d 79   {.  db2 func my
23d0: 66 75 6e 63 20 6d 79 66 75 6e 63 0a 20 20 65 78  func myfunc.  ex
23e0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
23f0: 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28 38 29  NTO t6 VALUES(8)
2400: 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 0a 64 6f 5f   } db2.} {}..do_
2410: 74 65 73 74 20 37 2e 38 20 7b 0a 20 20 64 62 32  test 7.8 {.  db2
2420: 20 66 75 6e 63 20 6d 79 66 75 6e 63 20 6d 79 66   func myfunc myf
2430: 75 6e 63 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  unc.  catchsql {
2440: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20   INSERT INTO t6 
2450: 56 41 4c 55 45 53 28 31 32 29 20 7d 20 64 62 32  VALUES(12) } db2
2460: 0a 7d 20 7b 31 20 7b 43 48 45 43 4b 20 63 6f 6e  .} {1 {CHECK con
2470: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20  straint failed: 
2480: 74 36 7d 7d 0a 0a 23 20 32 30 31 33 2d 30 38 2d  t6}}..# 2013-08-
2490: 30 32 3a 20 20 53 69 6c 65 6e 74 6c 79 20 69 67  02:  Silently ig
24a0: 6e 6f 72 65 20 64 61 74 61 62 61 73 65 20 6e 61  nore database na
24b0: 6d 65 20 71 75 61 6c 69 66 69 65 72 73 20 69 6e  me qualifiers in
24c0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
24d0: 74 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ts..#.do_execsql
24e0: 5f 74 65 73 74 20 38 2e 31 20 7b 0a 20 20 43 52  _test 8.1 {.  CR
24f0: 45 41 54 45 20 54 41 42 4c 45 20 74 38 31 30 28  EATE TABLE t810(
2500: 61 2c 20 43 48 45 43 4b 28 20 6d 61 69 6e 2e 74  a, CHECK( main.t
2510: 38 31 30 2e 61 3e 30 20 29 29 3b 0a 20 20 43 52  810.a>0 ));.  CR
2520: 45 41 54 45 20 54 41 42 4c 45 20 74 38 31 31 28  EATE TABLE t811(
2530: 62 2c 20 43 48 45 43 4b 28 20 78 79 7a 7a 79 2e  b, CHECK( xyzzy.
2540: 74 38 31 31 2e 62 20 42 45 54 57 45 45 4e 20 35  t811.b BETWEEN 5
2550: 20 41 4e 44 20 31 30 20 29 29 3b 0a 7d 20 7b 7d   AND 10 ));.} {}
2560: 0a 0a 23 20 4d 61 6b 65 20 73 75 72 65 20 63 68  ..# Make sure ch
2570: 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  eck constraints 
2580: 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 4f  involving the RO
2590: 57 49 44 20 61 72 65 20 6e 6f 74 20 69 67 6e 6f  WID are not igno
25a0: 72 65 64 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  red.#.do_execsql
25b0: 5f 74 65 73 74 20 39 2e 31 20 7b 0a 20 20 43 52  _test 9.1 {.  CR
25c0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 0a 20  EATE TABLE t1(. 
25d0: 20 20 20 61 20 49 4e 54 45 47 45 52 20 50 52 49     a INTEGER PRI
25e0: 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 62 20  MARY KEY,.    b 
25f0: 49 4e 54 45 47 45 52 20 4e 4f 54 20 4e 55 4c 4c  INTEGER NOT NULL
2600: 20 43 4f 4e 53 54 52 41 49 4e 54 20 27 62 2d 63   CONSTRAINT 'b-c
2610: 68 65 63 6b 27 20 43 48 45 43 4b 28 20 62 3e 61  heck' CHECK( b>a
2620: 20 29 2c 0a 20 20 20 20 63 20 49 4e 54 45 47 45   ),.    c INTEGE
2630: 52 20 4e 4f 54 20 4e 55 4c 4c 20 43 4f 4e 53 54  R NOT NULL CONST
2640: 52 41 49 4e 54 20 27 63 2d 63 68 65 63 6b 27 20  RAINT 'c-check' 
2650: 43 48 45 43 4b 28 20 63 3e 72 6f 77 69 64 2a 32  CHECK( c>rowid*2
2660: 20 29 2c 0a 20 20 20 20 64 20 49 4e 54 45 47 45   ),.    d INTEGE
2670: 52 20 4e 4f 54 20 4e 55 4c 4c 20 43 4f 4e 53 54  R NOT NULL CONST
2680: 52 41 49 4e 54 20 27 64 2d 63 68 65 63 6b 27 20  RAINT 'd-check' 
2690: 43 48 45 43 4b 28 20 64 20 42 45 54 57 45 45 4e  CHECK( d BETWEEN
26a0: 20 62 20 41 4e 44 20 63 20 29 0a 20 20 29 3b 0a   b AND c ).  );.
26b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
26c0: 28 61 2c 62 2c 63 2c 64 29 20 56 41 4c 55 45 53  (a,b,c,d) VALUES
26d0: 28 31 2c 32 2c 34 2c 33 29 2c 28 32 2c 34 2c 36  (1,2,4,3),(2,4,6
26e0: 2c 35 29 2c 28 33 2c 31 30 2c 33 30 2c 32 30 29  ,5),(3,10,30,20)
26f0: 3b 0a 7d 20 7b 7d 0a 64 6f 5f 63 61 74 63 68 73  ;.} {}.do_catchs
2700: 71 6c 5f 74 65 73 74 20 39 2e 32 20 7b 0a 20 20  ql_test 9.2 {.  
2710: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 3d  UPDATE t1 SET b=
2720: 30 20 57 48 45 52 45 20 61 3d 31 3b 0a 7d 20 7b  0 WHERE a=1;.} {
2730: 31 20 7b 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  1 {CHECK constra
2740: 69 6e 74 20 66 61 69 6c 65 64 3a 20 62 2d 63 68  int failed: b-ch
2750: 65 63 6b 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71  eck}}.do_catchsq
2760: 6c 5f 74 65 73 74 20 39 2e 33 20 7b 0a 20 20 55  l_test 9.3 {.  U
2770: 50 44 41 54 45 20 74 31 20 53 45 54 20 63 3d 61  PDATE t1 SET c=a
2780: 2a 32 20 57 48 45 52 45 20 61 3d 31 3b 0a 7d 20  *2 WHERE a=1;.} 
2790: 7b 31 20 7b 43 48 45 43 4b 20 63 6f 6e 73 74 72  {1 {CHECK constr
27a0: 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 63 2d 63  aint failed: c-c
27b0: 68 65 63 6b 7d 7d 0a 0a 23 20 49 6e 74 65 67 72  heck}}..# Integr
27c0: 69 74 79 20 63 68 65 63 6b 20 6f 6e 20 61 20 56  ity check on a V
27d0: 49 45 57 20 77 69 74 68 20 63 6f 6c 75 6d 6e 73  IEW with columns
27e0: 2e 0a 23 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32  ..#.db close.db2
27f0: 20 63 6c 6f 73 65 0a 66 6f 72 63 65 64 65 6c 65   close.forcedele
2800: 74 65 20 74 65 73 74 2e 64 62 0a 73 71 6c 69 74  te test.db.sqlit
2810: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64 6f  e3 db test.db.do
2820: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 30  _execsql_test 10
2830: 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .1 {.  CREATE TA
2840: 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 43 52 45  BLE t1(x);.  CRE
2850: 41 54 45 20 56 49 45 57 20 76 31 28 79 29 20 41  ATE VIEW v1(y) A
2860: 53 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20  S SELECT x FROM 
2870: 74 31 3b 0a 20 20 50 52 41 47 4d 41 20 69 6e 74  t1;.  PRAGMA int
2880: 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 7d 20  egrity_check;.} 
2890: 7b 6f 6b 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73  {ok}..finish_tes
28a0: 74 0a                                            t.