/ Hex Artifact Content
Login

Artifact 391b9bf9a229547a129c61ac345ed1a6f5eb1854:


0000: 23 20 32 30 31 34 2d 30 38 2d 32 34 0a 23 0a 23  # 2014-08-24.#.#
0010: 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
0020: 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
0030: 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
0040: 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
0050: 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  f.# a legal noti
0060: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
0070: 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 4d  essing:.#.#    M
0080: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
0090: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 20  nd not evil..#  
00a0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00b0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00c0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00d0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 20  ive others..#   
00e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
00f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0100: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0110: 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  u 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 0a 23 20 54 68 69 73 20 66 69 6c 65 20 69  **.# This file i
0170: 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72 65 73  mplements regres
0180: 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72 20 53  sion tests for S
0190: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0a 23  QLite library..#
01a0: 20 54 68 65 20 66 6f 63 75 73 20 6f 66 20 74 68   The focus of th
01b0: 69 73 20 73 63 72 69 70 74 20 69 73 20 74 65 73  is script is tes
01c0: 74 69 6e 67 20 64 65 74 61 69 6c 73 20 6f 66 20  ting details of 
01d0: 74 68 65 20 53 51 4c 20 6c 61 6e 67 75 61 67 65  the SQL language
01e0: 20 70 61 72 73 65 72 2e 0a 23 20 0a 0a 73 65 74   parser..# ..set
01f0: 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64   testdir [file d
0200: 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73  irname $argv0].s
0210: 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74  ource $testdir/t
0220: 65 73 74 65 72 2e 74 63 6c 0a 0a 64 6f 5f 63 61  ester.tcl..do_ca
0230: 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 72 73  tchsql_test pars
0240: 65 72 31 2d 31 2e 31 20 7b 0a 20 20 43 52 45 41  er1-1.1 {.  CREA
0250: 54 45 20 54 41 42 4c 45 20 74 31 28 0a 20 20 20  TE TABLE t1(.   
0260: 20 61 20 54 45 58 54 20 50 52 49 4d 41 52 59 20   a TEXT PRIMARY 
0270: 4b 45 59 2c 0a 20 20 20 20 62 20 54 45 58 54 2c  KEY,.    b TEXT,
0280: 0a 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59  .    FOREIGN KEY
0290: 28 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  (b COLLATE nocas
02a0: 65 20 44 45 53 43 29 20 52 45 46 45 52 45 4e 43  e DESC) REFERENC
02b0: 45 53 20 74 31 28 61 20 43 4f 4c 4c 41 54 45 20  ES t1(a COLLATE 
02c0: 62 69 6e 61 72 79 20 41 53 43 29 0a 20 20 29 3b  binary ASC).  );
02d0: 0a 7d 20 7b 31 20 7b 73 79 6e 74 61 78 20 65 72  .} {1 {syntax er
02e0: 72 6f 72 20 61 66 74 65 72 20 63 6f 6c 75 6d 6e  ror after column
02f0: 20 6e 61 6d 65 20 22 62 22 7d 7d 0a 0a 0a 23 20   name "b"}}...# 
0300: 56 65 72 69 66 79 20 74 68 61 74 20 61 20 6c 65  Verify that a le
0310: 67 61 63 79 20 73 63 68 65 6d 61 20 69 6e 20 74  gacy schema in t
0320: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
0330: 20 66 69 6c 65 20 69 73 20 61 6c 6c 6f 77 65 64   file is allowed
0340: 20 74 6f 20 68 61 76 65 0a 23 20 43 4f 4c 4c 41   to have.# COLLA
0350: 54 45 2c 20 41 53 43 2c 20 61 6e 64 20 44 45 53  TE, ASC, and DES
0360: 43 20 6b 65 79 77 6f 72 64 73 20 6f 6e 20 74 68  C keywords on th
0370: 65 20 69 64 20 6c 69 73 74 20 6f 66 20 61 20 46  e id list of a F
0380: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 61 6e  K constraint, an
0390: 64 20 74 68 61 74 0a 23 20 74 68 6f 73 65 20 6b  d that.# those k
03a0: 65 79 77 6f 72 64 73 20 61 72 65 20 73 69 6c 65  eywords are sile
03b0: 6e 74 6c 79 20 69 67 6e 6f 72 65 64 2e 0a 23 0a  ntly ignored..#.
03c0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
03d0: 70 61 72 73 65 72 31 2d 31 2e 32 20 7b 0a 20 20  parser1-1.2 {.  
03e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03f0: 0a 20 20 20 20 61 20 54 45 58 54 20 50 52 49 4d  .    a TEXT PRIM
0400: 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 62 20 54  ARY KEY,.    b T
0410: 45 58 54 2c 0a 20 20 20 20 46 4f 52 45 49 47 4e  EXT,.    FOREIGN
0420: 20 4b 45 59 28 62 29 20 52 45 46 45 52 45 4e 43   KEY(b) REFERENC
0430: 45 53 20 74 31 28 61 29 0a 20 20 29 3b 0a 20 20  ES t1(a).  );.  
0440: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0450: 41 4c 55 45 53 28 27 61 62 63 27 2c 4e 55 4c 4c  ALUES('abc',NULL
0460: 29 2c 28 27 78 79 7a 27 2c 27 61 62 63 27 29 3b  ),('xyz','abc');
0470: 0a 20 20 50 52 41 47 4d 41 20 77 72 69 74 61 62  .  PRAGMA writab
0480: 6c 65 5f 73 63 68 65 6d 61 3d 6f 6e 3b 0a 20 20  le_schema=on;.  
0490: 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f 6d 61  UPDATE sqlite_ma
04a0: 73 74 65 72 20 53 45 54 20 73 71 6c 3d 27 43 52  ster SET sql='CR
04b0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 0a 20  EATE TABLE t1(. 
04c0: 20 20 20 61 20 54 45 58 54 20 50 52 49 4d 41 52     a TEXT PRIMAR
04d0: 59 20 4b 45 59 2c 0a 20 20 20 20 62 20 54 45 58  Y KEY,.    b TEX
04e0: 54 2c 0a 20 20 20 20 46 4f 52 45 49 47 4e 20 4b  T,.    FOREIGN K
04f0: 45 59 28 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  EY(b COLLATE noc
0500: 61 73 65 29 20 52 45 46 45 52 45 4e 43 45 53 20  ase) REFERENCES 
0510: 74 31 28 61 29 0a 20 20 29 27 20 57 48 45 52 45  t1(a).  )' WHERE
0520: 20 6e 61 6d 65 3d 27 74 31 27 3b 0a 20 20 53 45   name='t1';.  SE
0530: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
0540: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
0550: 52 45 20 73 71 6c 20 4c 49 4b 45 20 27 25 63 6f  RE sql LIKE '%co
0560: 6c 6c 61 74 65 25 27 3b 0a 7d 20 7b 74 31 7d 0a  llate%';.} {t1}.
0570: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
0580: 2e 64 62 0a 64 6f 5f 74 65 73 74 20 70 61 72 73  .db.do_test pars
0590: 65 72 31 2d 31 2e 33 20 7b 0a 20 20 73 71 6c 69  er1-1.3 {.  sqli
05a0: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
05b0: 20 20 64 62 32 20 65 76 61 6c 20 7b 53 45 4c 45    db2 eval {SELE
05c0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44  CT * FROM t1 ORD
05d0: 45 52 20 42 59 20 31 7d 0a 7d 20 7b 61 62 63 20  ER BY 1}.} {abc 
05e0: 7b 7d 20 78 79 7a 20 61 62 63 7d 0a 64 62 32 20  {} xyz abc}.db2 
05f0: 63 6c 6f 73 65 0a 0a 64 6f 5f 65 78 65 63 73 71  close..do_execsq
0600: 6c 5f 74 65 73 74 20 70 61 72 73 65 72 31 2d 31  l_test parser1-1
0610: 2e 34 20 7b 0a 20 20 55 50 44 41 54 45 20 73 71  .4 {.  UPDATE sq
0620: 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45 54 20  lite_master SET 
0630: 73 71 6c 3d 27 43 52 45 41 54 45 20 54 41 42 4c  sql='CREATE TABL
0640: 45 20 74 31 28 0a 20 20 20 20 61 20 54 45 58 54  E t1(.    a TEXT
0650: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20   PRIMARY KEY,.  
0660: 20 20 62 20 54 45 58 54 2c 0a 20 20 20 20 46 4f    b TEXT,.    FO
0670: 52 45 49 47 4e 20 4b 45 59 28 62 20 41 53 43 29  REIGN KEY(b ASC)
0680: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 28 61   REFERENCES t1(a
0690: 29 0a 20 20 29 27 20 57 48 45 52 45 20 6e 61 6d  ).  )' WHERE nam
06a0: 65 3d 27 74 31 27 3b 0a 20 20 53 45 4c 45 43 54  e='t1';.  SELECT
06b0: 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
06c0: 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 73  e_master WHERE s
06d0: 71 6c 20 4c 49 4b 45 20 27 25 41 53 43 25 27 3b  ql LIKE '%ASC%';
06e0: 0a 7d 20 7b 74 31 7d 0a 73 71 6c 69 74 65 33 20  .} {t1}.sqlite3 
06f0: 64 62 32 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74  db2 test.db.do_t
0700: 65 73 74 20 70 61 72 73 65 72 31 2d 31 2e 35 20  est parser1-1.5 
0710: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  {.  sqlite3 db2 
0720: 74 65 73 74 2e 64 62 0a 20 20 64 62 32 20 65 76  test.db.  db2 ev
0730: 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  al {SELECT * FRO
0740: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 31 7d  M t1 ORDER BY 1}
0750: 0a 7d 20 7b 61 62 63 20 7b 7d 20 78 79 7a 20 61  .} {abc {} xyz a
0760: 62 63 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 64  bc}.db2 close..d
0770: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
0780: 70 61 72 73 65 72 31 2d 32 2e 31 20 7b 0a 20 20  parser1-2.1 {.  
0790: 57 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 20  WITH RECURSIVE. 
07a0: 20 20 20 63 28 78 20 43 4f 4c 4c 41 54 45 20 62     c(x COLLATE b
07b0: 69 6e 61 72 79 29 20 41 53 20 28 56 41 4c 55 45  inary) AS (VALUE
07c0: 53 28 31 29 20 55 4e 49 4f 4e 20 53 45 4c 45 43  S(1) UNION SELEC
07d0: 54 20 78 2b 31 20 46 52 4f 4d 20 63 20 57 48 45  T x+1 FROM c WHE
07e0: 52 45 20 78 3c 35 29 0a 20 20 53 45 4c 45 43 54  RE x<5).  SELECT
07f0: 20 78 20 46 52 4f 4d 20 63 3b 0a 7d 20 7b 31 20   x FROM c;.} {1 
0800: 7b 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 66  {syntax error af
0810: 74 65 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ter column name 
0820: 22 78 22 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71  "x"}}.do_catchsq
0830: 6c 5f 74 65 73 74 20 70 61 72 73 65 72 31 2d 32  l_test parser1-2
0840: 2e 32 20 7b 0a 20 20 57 49 54 48 20 52 45 43 55  .2 {.  WITH RECU
0850: 52 53 49 56 45 0a 20 20 20 20 63 28 78 20 41 53  RSIVE.    c(x AS
0860: 43 29 20 41 53 20 28 56 41 4c 55 45 53 28 31 29  C) AS (VALUES(1)
0870: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 78 2b   UNION SELECT x+
0880: 31 20 46 52 4f 4d 20 63 20 57 48 45 52 45 20 78  1 FROM c WHERE x
0890: 3c 35 29 0a 20 20 53 45 4c 45 43 54 20 78 20 46  <5).  SELECT x F
08a0: 52 4f 4d 20 63 3b 0a 7d 20 7b 31 20 7b 73 79 6e  ROM c;.} {1 {syn
08b0: 74 61 78 20 65 72 72 6f 72 20 61 66 74 65 72 20  tax error after 
08c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 22 78 22 7d  column name "x"}
08d0: 7d 0a 0a 23 20 56 65 72 69 66 79 20 74 68 61 74  }..# Verify that
08e0: 20 74 68 65 20 63 6f 6d 6d 61 20 62 65 74 77 65   the comma betwe
08f0: 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c  en multiple tabl
0900: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73  e constraints is
0910: 0a 23 20 6f 70 74 69 6f 6e 61 6c 2e 0a 23 0a 23  .# optional..#.#
0920: 20 54 68 65 20 6d 69 73 73 69 6e 67 20 63 6f 6d   The missing com
0930: 6d 61 20 69 73 20 74 65 63 68 6e 69 63 61 6c 6c  ma is technicall
0940: 79 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72  y a syntax error
0950: 2e 20 20 42 75 74 20 77 65 20 68 61 76 65 20 74  .  But we have t
0960: 6f 20 73 75 70 70 6f 72 74 0a 23 20 69 74 20 62  o support.# it b
0970: 65 63 61 75 73 65 20 74 68 65 72 65 20 6d 69 67  ecause there mig
0980: 68 74 20 62 65 20 6c 65 67 61 63 79 20 64 61 74  ht be legacy dat
0990: 61 62 61 73 65 73 20 74 68 61 74 20 6f 6d 69 74  abases that omit
09a0: 20 74 68 65 20 63 6f 6d 6d 61 73 20 69 6e 20 74   the commas in t
09b0: 68 65 69 72 0a 23 20 73 71 6c 69 74 65 5f 6d 61  heir.# sqlite_ma
09c0: 73 74 65 72 20 74 61 62 6c 65 73 2e 0a 23 0a 64  ster tables..#.d
09d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
09e0: 61 72 73 65 72 31 2d 33 2e 31 20 7b 0a 20 20 43  arser1-3.1 {.  C
09f0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 30 30  REATE TABLE t300
0a00: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  (id INTEGER PRIM
0a10: 41 52 59 20 4b 45 59 29 3b 0a 20 20 43 52 45 41  ARY KEY);.  CREA
0a20: 54 45 20 54 41 42 4c 45 20 74 33 30 31 28 0a 20  TE TABLE t301(. 
0a30: 20 20 20 69 64 20 49 4e 54 45 47 45 52 20 50 52     id INTEGER PR
0a40: 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 63  IMARY KEY,.    c
0a50: 31 20 49 4e 54 45 47 45 52 20 4e 4f 54 20 4e 55  1 INTEGER NOT NU
0a60: 4c 4c 2c 0a 20 20 20 20 63 32 20 49 4e 54 45 47  LL,.    c2 INTEG
0a70: 45 52 20 4e 4f 54 20 4e 55 4c 4c 2c 0a 20 20 20  ER NOT NULL,.   
0a80: 20 63 33 20 42 4f 4f 4c 45 41 4e 20 4e 4f 54 20   c3 BOOLEAN NOT 
0a90: 4e 55 4c 4c 20 44 45 46 41 55 4c 54 20 30 2c 0a  NULL DEFAULT 0,.
0aa0: 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28      FOREIGN KEY(
0ab0: 63 31 29 20 52 45 46 45 52 45 4e 43 45 53 20 74  c1) REFERENCES t
0ac0: 33 30 30 28 69 64 29 20 4f 4e 20 44 45 4c 45 54  300(id) ON DELET
0ad0: 45 20 43 41 53 43 41 44 45 20 4f 4e 20 55 50 44  E CASCADE ON UPD
0ae0: 41 54 45 20 52 45 53 54 52 49 43 54 0a 20 20 20  ATE RESTRICT.   
0af0: 20 20 20 20 20 2f 2a 20 6e 6f 20 63 6f 6d 6d 61       /* no comma
0b00: 20 2a 2f 0a 20 20 20 20 46 4f 52 45 49 47 4e 20   */.    FOREIGN 
0b10: 4b 45 59 28 63 32 29 20 52 45 46 45 52 45 4e 43  KEY(c2) REFERENC
0b20: 45 53 20 74 33 30 30 28 69 64 29 20 4f 4e 20 44  ES t300(id) ON D
0b30: 45 4c 45 54 45 20 43 41 53 43 41 44 45 20 4f 4e  ELETE CASCADE ON
0b40: 20 55 50 44 41 54 45 20 52 45 53 54 52 49 43 54   UPDATE RESTRICT
0b50: 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 20 63  .        /* no c
0b60: 6f 6d 6d 61 20 2a 2f 0a 20 20 20 20 55 4e 49 51  omma */.    UNIQ
0b70: 55 45 28 63 31 2c 20 63 32 29 0a 20 20 29 3b 0a  UE(c1, c2).  );.
0b80: 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e    PRAGMA foreign
0b90: 5f 6b 65 79 5f 6c 69 73 74 28 74 33 30 31 29 3b  _key_list(t301);
0ba0: 0a 7d 20 7b 30 20 30 20 74 33 30 30 20 63 32 20  .} {0 0 t300 c2 
0bb0: 69 64 20 52 45 53 54 52 49 43 54 20 43 41 53 43  id RESTRICT CASC
0bc0: 41 44 45 20 4e 4f 4e 45 20 31 20 30 20 74 33 30  ADE NONE 1 0 t30
0bd0: 30 20 63 31 20 69 64 20 52 45 53 54 52 49 43 54  0 c1 id RESTRICT
0be0: 20 43 41 53 43 41 44 45 20 4e 4f 4e 45 7d 0a 0a   CASCADE NONE}..
0bf0: 66 69 6e 69 73 68 5f 74 65 73 74 0a              finish_test.