/ Hex Artifact Content
Login

Artifact ea4b59dd1b0d7f5f5e4b7cca978cdb905752a9d7c57dc4344a591dba765a3691:


0000: 23 20 32 30 31 33 2d 31 31 2d 30 32 0a 23 0a 23  # 2013-11-02.#.#
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: 0a 23 20 54 68 69 73 20 66 69 6c 65 20 69 6d 70  .# This file imp
01b0: 6c 65 6d 65 6e 74 73 20 74 65 73 74 73 20 66 6f  lements tests fo
01c0: 72 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 6f  r foreign keys o
01d0: 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a  n WITHOUT ROWID.
01e0: 23 20 74 61 62 6c 65 73 2e 0a 23 0a 0a 73 65 74  # tables..#..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 69 66 63 61 70  ester.tcl..ifcap
0230: 61 62 6c 65 20 7b 21 66 6f 72 65 69 67 6e 6b 65  able {!foreignke
0240: 79 7c 7c 21 74 72 69 67 67 65 72 7d 20 7b 0a 20  y||!trigger} {. 
0250: 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 72   finish_test.  r
0260: 65 74 75 72 6e 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  eturn.}..#------
0270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02b0: 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74 72 75 63  ---.# Test struc
02c0: 74 75 72 65 3a 0a 23 0a 23 20 77 69 74 68 6f 75  ture:.#.# withou
02d0: 74 5f 72 6f 77 69 64 33 2d 31 2e 2a 3a 20 53 69  t_rowid3-1.*: Si
02e0: 6d 70 6c 65 20 74 65 73 74 73 20 74 6f 20 63 68  mple tests to ch
02f0: 65 63 6b 20 74 68 61 74 20 69 6d 6d 65 64 69 61  eck that immedia
0300: 74 65 20 61 6e 64 20 64 65 66 65 72 72 65 64 20  te and deferred 
0310: 66 6f 72 65 69 67 6e 20 6b 65 79 20 0a 23 20 20  foreign key .#  
0320: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72            constr
0330: 61 69 6e 74 73 20 77 6f 72 6b 20 77 68 65 6e 20  aints work when 
0340: 6e 6f 74 20 69 6e 73 69 64 65 20 61 20 74 72 61  not inside a tra
0350: 6e 73 61 63 74 69 6f 6e 2e 0a 23 20 20 20 20 20  nsaction..#     
0360: 20 20 20 20 20 20 20 0a 23 20 77 69 74 68 6f 75         .# withou
0370: 74 5f 72 6f 77 69 64 33 2d 32 2e 2a 3a 20 54 65  t_rowid3-2.*: Te
0380: 73 74 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  sts to verify th
0390: 61 74 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  at deferred fore
03a0: 69 67 6e 20 6b 65 79 73 20 77 6f 72 6b 20 69 6e  ign keys work in
03b0: 73 69 64 65 0a 23 20 20 20 20 20 20 20 20 20 20  side.#          
03c0: 20 20 65 78 70 6c 69 63 69 74 20 74 72 61 6e 73    explicit trans
03d0: 61 63 74 69 6f 6e 73 20 28 69 2e 65 20 74 68 61  actions (i.e tha
03e0: 74 20 70 72 6f 63 65 73 73 69 6e 67 20 72 65 61  t processing rea
03f0: 6c 6c 79 20 69 73 20 64 65 66 65 72 72 65 64 29  lly is deferred)
0400: 2e 0a 23 0a 23 20 77 69 74 68 6f 75 74 5f 72 6f  ..#.# without_ro
0410: 77 69 64 33 2d 33 2e 2a 3a 20 54 65 73 74 73 20  wid3-3.*: Tests 
0420: 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74  that a statement
0430: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
0440: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 66 20 61  rolled back if a
0450: 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 69  n.#            i
0460: 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
0470: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
0480: 69 73 20 76 69 6f 6c 61 74 65 64 2e 0a 23 0a 23  is violated..#.#
0490: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
04a0: 34 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 46  4.*: Test that F
04b0: 4b 20 61 63 74 69 6f 6e 73 20 6d 61 79 20 72 65  K actions may re
04c0: 63 75 72 73 65 20 65 76 65 6e 20 77 68 65 6e 20  curse even when 
04d0: 72 65 63 75 72 73 69 76 65 20 74 72 69 67 67 65  recursive trigge
04e0: 72 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  rs.#            
04f0: 61 72 65 20 64 69 73 61 62 6c 65 64 2e 0a 23 0a  are disabled..#.
0500: 23 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  # without_rowid3
0510: 2d 35 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61 74  -5.*: Check that
0520: 20 69 66 20 66 6f 72 65 69 67 6e 2d 6b 65 79 73   if foreign-keys
0530: 20 61 72 65 20 65 6e 61 62 6c 65 64 2c 20 69 74   are enabled, it
0540: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
0550: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 74 6f  .#            to
0560: 20 77 72 69 74 65 20 74 6f 20 61 6e 20 46 4b 20   write to an FK 
0570: 63 6f 6c 75 6d 6e 20 75 73 69 6e 67 20 74 68 65  column using the
0580: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
0590: 62 20 41 50 49 2e 0a 23 0a 23 20 77 69 74 68 6f  b API..#.# witho
05a0: 75 74 5f 72 6f 77 69 64 33 2d 36 2e 2a 3a 20 54  ut_rowid3-6.*: T
05b0: 65 73 74 20 74 68 61 74 20 46 4b 20 70 72 6f 63  est that FK proc
05c0: 65 73 73 69 6e 67 20 69 73 20 61 75 74 6f 6d 61  essing is automa
05d0: 74 69 63 61 6c 6c 79 20 64 69 73 61 62 6c 65 64  tically disabled
05e0: 20 77 68 65 6e 20 0a 23 20 20 20 20 20 20 20 20   when .#        
05f0: 20 20 20 20 72 75 6e 6e 69 6e 67 20 56 41 43 55      running VACU
0600: 55 4d 2e 0a 23 0a 23 20 77 69 74 68 6f 75 74 5f  UM..#.# without_
0610: 72 6f 77 69 64 33 2d 37 2e 2a 3a 20 54 65 73 74  rowid3-7.*: Test
0620: 20 75 73 69 6e 67 20 61 6e 20 49 50 4b 20 61 73   using an IPK as
0630: 20 74 68 65 20 6b 65 79 20 69 6e 20 74 68 65 20   the key in the 
0640: 63 68 69 6c 64 20 28 72 65 66 65 72 65 6e 63 69  child (referenci
0650: 6e 67 29 20 74 61 62 6c 65 2e 0a 23 0a 23 20 77  ng) table..#.# w
0660: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 38 2e  ithout_rowid3-8.
0670: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 65 6e 61  *: Test that ena
0680: 62 6c 69 6e 67 2f 64 69 73 61 62 6c 69 6e 67 20  bling/disabling 
0690: 66 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70 70  foreign key supp
06a0: 6f 72 74 20 77 68 69 6c 65 20 61 20 0a 23 20 20  ort while a .#  
06b0: 20 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 61            transa
06c0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
06d0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
06e0: 0a 23 0a 23 20 77 69 74 68 6f 75 74 5f 72 6f 77  .#.# without_row
06f0: 69 64 33 2d 39 2e 2a 3a 20 54 65 73 74 20 53 45  id3-9.*: Test SE
0700: 54 20 44 45 46 41 55 4c 54 20 61 63 74 69 6f 6e  T DEFAULT action
0710: 73 2e 0a 23 0a 23 20 77 69 74 68 6f 75 74 5f 72  s..#.# without_r
0720: 6f 77 69 64 33 2d 31 30 2e 2a 3a 20 54 65 73 74  owid3-10.*: Test
0730: 20 65 72 72 6f 72 73 2e 0a 23 0a 23 20 77 69 74   errors..#.# wit
0740: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 31 2e 2a  hout_rowid3-11.*
0750: 3a 20 54 65 73 74 20 43 41 53 43 41 44 45 20 61  : Test CASCADE a
0760: 63 74 69 6f 6e 73 2e 0a 23 0a 23 20 77 69 74 68  ctions..#.# with
0770: 6f 75 74 5f 72 6f 77 69 64 33 2d 31 32 2e 2a 3a  out_rowid3-12.*:
0780: 20 54 65 73 74 20 52 45 53 54 52 49 43 54 20 61   Test RESTRICT a
0790: 63 74 69 6f 6e 73 2e 0a 23 0a 23 20 77 69 74 68  ctions..#.# with
07a0: 6f 75 74 5f 72 6f 77 69 64 33 2d 31 33 2e 2a 3a  out_rowid3-13.*:
07b0: 20 54 65 73 74 20 74 68 61 74 20 46 4b 20 70 72   Test that FK pr
07c0: 6f 63 65 73 73 69 6e 67 20 69 73 20 70 65 72 66  ocessing is perf
07d0: 6f 72 6d 65 64 20 77 68 65 6e 20 61 20 72 6f 77  ormed when a row
07e0: 20 69 73 20 52 45 50 4c 41 43 45 44 20 62 79 0a   is REPLACED by.
07f0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e  #             an
0800: 20 55 50 44 41 54 45 20 6f 72 20 49 4e 53 45 52   UPDATE or INSER
0810: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 23  T statement..#.#
0820: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
0830: 31 34 2e 2a 3a 20 54 65 73 74 20 74 68 65 20 41  14.*: Test the A
0840: 4c 54 45 52 20 54 41 42 4c 45 20 61 6e 64 20 44  LTER TABLE and D
0850: 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e  ROP TABLE comman
0860: 64 73 2e 0a 23 0a 23 20 77 69 74 68 6f 75 74 5f  ds..#.# without_
0870: 72 6f 77 69 64 33 2d 31 35 2e 2a 3a 20 54 65 73  rowid3-15.*: Tes
0880: 74 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20  t that if there 
0890: 61 72 65 20 6e 6f 20 28 6b 6e 6f 77 6e 29 20 6f  are no (known) o
08a0: 75 74 73 74 61 6e 64 69 6e 67 20 66 6f 72 65 69  utstanding forei
08b0: 67 6e 20 6b 65 79 20 0a 23 20 20 20 20 20 20 20  gn key .#       
08c0: 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74        constraint
08d0: 20 76 69 6f 6c 61 74 69 6f 6e 73 20 69 6e 20 74   violations in t
08e0: 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 6e 73  he database, ins
08f0: 65 72 74 69 6e 67 20 69 6e 74 6f 20 61 20 70 61  erting into a pa
0900: 72 65 6e 74 0a 23 20 20 20 20 20 20 20 20 20 20  rent.#          
0910: 20 20 20 74 61 62 6c 65 20 6f 72 20 64 65 6c 65     table or dele
0920: 74 69 6e 67 20 66 72 6f 6d 20 61 20 63 68 69 6c  ting from a chil
0930: 64 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  d table does not
0940: 20 63 61 75 73 65 20 53 51 4c 69 74 65 0a 23 20   cause SQLite.# 
0950: 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 63              to c
0960: 68 65 63 6b 20 69 66 20 74 68 69 73 20 68 61 73  heck if this has
0970: 20 72 65 70 61 69 72 65 64 20 61 6e 20 6f 75 74   repaired an out
0980: 73 74 61 6e 64 69 6e 67 20 76 69 6f 6c 61 74 69  standing violati
0990: 6f 6e 2e 0a 23 0a 23 20 77 69 74 68 6f 75 74 5f  on..#.# without_
09a0: 72 6f 77 69 64 33 2d 31 36 2e 2a 3a 20 54 65 73  rowid3-16.*: Tes
09b0: 74 20 74 68 61 74 20 72 6f 77 73 20 74 68 61 74  t that rows that
09c0: 20 72 65 66 65 72 20 74 6f 20 74 68 65 6d 73 65   refer to themse
09d0: 6c 76 65 73 20 6d 61 79 20 62 65 20 69 6e 73 65  lves may be inse
09e0: 72 74 65 64 2c 20 0a 23 20 20 20 20 20 20 20 20  rted, .#        
09f0: 20 20 20 20 20 75 70 64 61 74 65 64 20 61 6e 64       updated and
0a00: 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20 77 69   deleted..#.# wi
0a10: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 37 2e  thout_rowid3-17.
0a20: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 74 68 65  *: Test that the
0a30: 20 22 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 22   "count_changes"
0a40: 20 70 72 61 67 6d 61 20 64 6f 65 73 20 6e 6f 74   pragma does not
0a50: 20 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 0a   interfere with.
0a60: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4b  #             FK
0a70: 20 63 6f 6e 73 74 72 61 69 6e 74 20 70 72 6f 63   constraint proc
0a80: 65 73 73 69 6e 67 2e 0a 23 20 0a 23 20 77 69 74  essing..# .# wit
0a90: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 38 2e 2a  hout_rowid3-18.*
0aa0: 3a 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20  : Test that the 
0ab0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61  authorization ca
0ac0: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
0ad0: 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  d when processin
0ae0: 67 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  g.#             
0af0: 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  FK constraints..
0b00: 23 0a 23 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  #.# without_rowi
0b10: 64 33 2d 32 30 2e 2a 3a 20 54 65 73 74 20 74 68  d3-20.*: Test th
0b20: 61 74 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  at ON CONFLICT c
0b30: 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64  lauses specified
0b40: 20 61 73 20 70 61 72 74 20 6f 66 20 73 74 61 74   as part of stat
0b50: 65 6d 65 6e 74 73 0a 23 20 20 20 20 20 20 20 20  ements.#        
0b60: 20 20 20 20 20 64 6f 20 6e 6f 74 20 61 66 66 65       do not affe
0b70: 63 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  ct the operation
0b80: 20 6f 66 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e   of FK constrain
0b90: 74 73 2e 0a 23 0a 23 20 77 69 74 68 6f 75 74 5f  ts..#.# without_
0ba0: 72 6f 77 69 64 33 2d 67 65 6e 66 6b 65 79 2e 2a  rowid3-genfkey.*
0bb0: 3a 20 54 65 73 74 73 20 74 68 61 74 20 77 65 72  : Tests that wer
0bc0: 65 20 75 73 65 64 20 77 69 74 68 20 74 68 65 20  e used with the 
0bd0: 73 68 65 6c 6c 20 74 6f 6f 6c 20 2e 67 65 6e 66  shell tool .genf
0be0: 6b 65 79 0a 23 20 20 20 20 20 20 20 20 20 20 20  key.#           
0bf0: 20 63 6f 6d 6d 61 6e 64 2e 20 52 65 63 79 63 6c   command. Recycl
0c00: 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 62  ed to test the b
0c10: 75 69 6c 74 2d 69 6e 20 69 6d 70 6c 65 6d 65 6e  uilt-in implemen
0c20: 74 61 74 69 6f 6e 2e 0a 23 0a 23 20 77 69 74 68  tation..#.# with
0c30: 6f 75 74 5f 72 6f 77 69 64 33 2d 64 64 30 38 65  out_rowid3-dd08e
0c40: 35 2e 2a 3a 20 20 54 65 73 74 73 20 74 6f 20 76  5.*:  Tests to v
0c50: 65 72 69 66 79 20 74 68 61 74 20 74 69 63 6b 65  erify that ticke
0c60: 74 20 64 64 30 38 65 35 61 39 38 38 64 30 30 64  t dd08e5a988d00d
0c70: 65 63 63 34 61 35 34 33 64 61 61 38 64 0a 23 20  ecc4a543daa8d.# 
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 68 61 73 20 62 65 65 6e 20 66 69 78 65 64 2e   has been fixed.
0ca0: 0a 23 0a 0a 0a 65 78 65 63 73 71 6c 20 7b 20 50  .#...execsql { P
0cb0: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
0cc0: 79 73 20 3d 20 6f 6e 20 7d 0a 0a 73 65 74 20 46  ys = on }..set F
0cd0: 6b 65 79 53 69 6d 70 6c 65 53 63 68 65 6d 61 20  keySimpleSchema 
0ce0: 7b 0a 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69  {.  PRAGMA forei
0cf0: 67 6e 5f 6b 65 79 73 20 3d 20 6f 6e 3b 0a 20 20  gn_keys = on;.  
0d00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0d10: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
0d20: 29 20 57 49 54 48 4f 55 54 20 72 6f 77 69 64 3b  ) WITHOUT rowid;
0d30: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
0d40: 74 32 28 63 20 52 45 46 45 52 45 4e 43 45 53 20  t2(c REFERENCES 
0d50: 74 31 28 61 29 20 2f 44 2f 20 2c 20 64 29 3b 0a  t1(a) /D/ , d);.
0d60: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
0d70: 74 33 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  t3(a PRIMARY KEY
0d80: 2c 20 62 29 20 57 49 54 48 4f 55 54 20 72 6f 77  , b) WITHOUT row
0d90: 69 64 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  id;.  CREATE TAB
0da0: 4c 45 20 74 34 28 63 20 52 45 46 45 52 45 4e 43  LE t4(c REFERENC
0db0: 45 53 20 74 33 20 2f 44 2f 2c 20 64 29 3b 0a 0a  ES t3 /D/, d);..
0dc0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0dd0: 37 28 61 2c 20 62 20 49 4e 54 20 50 52 49 4d 41  7(a, b INT PRIMA
0de0: 52 59 20 4b 45 59 29 20 57 49 54 48 4f 55 54 20  RY KEY) WITHOUT 
0df0: 72 6f 77 69 64 3b 0a 20 20 43 52 45 41 54 45 20  rowid;.  CREATE 
0e00: 54 41 42 4c 45 20 74 38 28 63 20 52 45 46 45 52  TABLE t8(c REFER
0e10: 45 4e 43 45 53 20 74 37 20 2f 44 2f 2c 20 64 29  ENCES t7 /D/, d)
0e20: 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  ;..  CREATE TABL
0e30: 45 20 74 39 28 61 20 52 45 46 45 52 45 4e 43 45  E t9(a REFERENCE
0e40: 53 20 6e 6f 73 75 63 68 74 61 62 6c 65 2c 20 62  S nosuchtable, b
0e50: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
0e60: 45 20 74 31 30 28 61 20 52 45 46 45 52 45 4e 43  E t10(a REFERENC
0e70: 45 53 20 74 39 28 63 29 20 2f 44 2f 2c 20 62 29  ES t9(c) /D/, b)
0e80: 3b 0a 7d 0a 0a 0a 73 65 74 20 46 6b 65 79 53 69  ;.}...set FkeySi
0e90: 6d 70 6c 65 54 65 73 74 73 20 7b 0a 20 20 31 2e  mpleTests {.  1.
0ea0: 31 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  1  "INSERT INTO 
0eb0: 74 32 20 56 41 4c 55 45 53 28 31 2c 20 33 29 22  t2 VALUES(1, 3)"
0ec0: 20 20 20 20 20 20 7b 31 20 7b 46 4f 52 45 49 47        {1 {FOREIG
0ed0: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
0ee0: 20 66 61 69 6c 65 64 7d 7d 0a 20 20 31 2e 32 20   failed}}.  1.2 
0ef0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31   "INSERT INTO t1
0f00: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 22 20 20   VALUES(1, 2)"  
0f10: 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 31 2e 33      {0 {}}.  1.3
0f20: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
0f30: 32 20 56 41 4c 55 45 53 28 31 2c 20 33 29 22 20  2 VALUES(1, 3)" 
0f40: 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 31 2e       {0 {}}.  1.
0f50: 34 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  4  "INSERT INTO 
0f60: 74 32 20 56 41 4c 55 45 53 28 32 2c 20 34 29 22  t2 VALUES(2, 4)"
0f70: 20 20 20 20 20 20 7b 31 20 7b 46 4f 52 45 49 47        {1 {FOREIG
0f80: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
0f90: 20 66 61 69 6c 65 64 7d 7d 0a 20 20 31 2e 35 20   failed}}.  1.5 
0fa0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32   "INSERT INTO t2
0fb0: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 34 29   VALUES(NULL, 4)
0fc0: 22 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 31 2e 36  "   {0 {}}.  1.6
0fd0: 20 20 22 55 50 44 41 54 45 20 74 32 20 53 45 54    "UPDATE t2 SET
0fe0: 20 63 3d 32 20 57 48 45 52 45 20 64 3d 34 22 20   c=2 WHERE d=4" 
0ff0: 20 20 20 20 20 7b 31 20 7b 46 4f 52 45 49 47 4e       {1 {FOREIGN
1000: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
1010: 66 61 69 6c 65 64 7d 7d 0a 20 20 31 2e 37 20 20  failed}}.  1.7  
1020: 22 55 50 44 41 54 45 20 74 32 20 53 45 54 20 63  "UPDATE t2 SET c
1030: 3d 31 20 57 48 45 52 45 20 64 3d 34 22 20 20 20  =1 WHERE d=4"   
1040: 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 31 2e 39 20     {0 {}}.  1.9 
1050: 20 22 55 50 44 41 54 45 20 74 32 20 53 45 54 20   "UPDATE t2 SET 
1060: 63 3d 31 20 57 48 45 52 45 20 64 3d 34 22 20 20  c=1 WHERE d=4"  
1070: 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 31 2e 31      {0 {}}.  1.1
1080: 30 20 22 55 50 44 41 54 45 20 74 32 20 53 45 54  0 "UPDATE t2 SET
1090: 20 63 3d 4e 55 4c 4c 20 57 48 45 52 45 20 64 3d   c=NULL WHERE d=
10a0: 34 22 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 31 2e  4"   {0 {}}.  1.
10b0: 31 31 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  11 "DELETE FROM 
10c0: 74 31 20 57 48 45 52 45 20 61 3d 31 22 20 20 20  t1 WHERE a=1"   
10d0: 20 20 20 20 20 20 7b 31 20 7b 46 4f 52 45 49 47        {1 {FOREIG
10e0: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
10f0: 20 66 61 69 6c 65 64 7d 7d 0a 20 20 31 2e 31 32   failed}}.  1.12
1100: 20 22 55 50 44 41 54 45 20 74 31 20 53 45 54 20   "UPDATE t1 SET 
1110: 61 20 3d 20 32 22 20 20 20 20 20 20 20 20 20 20  a = 2"          
1120: 20 20 20 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20      {1 {FOREIGN 
1130: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
1140: 61 69 6c 65 64 7d 7d 0a 20 20 31 2e 31 33 20 22  ailed}}.  1.13 "
1150: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20  UPDATE t1 SET a 
1160: 3d 20 31 22 20 20 20 20 20 20 20 20 20 20 20 20  = 1"            
1170: 20 20 7b 30 20 7b 7d 7d 0a 0a 20 20 32 2e 31 20    {0 {}}..  2.1 
1180: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34   "INSERT INTO t4
1190: 20 56 41 4c 55 45 53 28 31 2c 20 33 29 22 20 20   VALUES(1, 3)"  
11a0: 20 20 20 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20      {1 {FOREIGN 
11b0: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
11c0: 61 69 6c 65 64 7d 7d 0a 20 20 32 2e 32 20 20 22  ailed}}.  2.2  "
11d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
11e0: 41 4c 55 45 53 28 31 2c 20 32 29 22 20 20 20 20  ALUES(1, 2)"    
11f0: 20 20 7b 30 20 7b 7d 7d 0a 20 20 32 2e 33 20 20    {0 {}}.  2.3  
1200: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20  "INSERT INTO t4 
1210: 56 41 4c 55 45 53 28 31 2c 20 33 29 22 20 20 20  VALUES(1, 3)"   
1220: 20 20 20 7b 30 20 7b 7d 7d 0a 0a 20 20 34 2e 31     {0 {}}..  4.1
1230: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
1240: 38 20 56 41 4c 55 45 53 28 31 2c 20 33 29 22 20  8 VALUES(1, 3)" 
1250: 20 20 20 20 20 7b 31 20 7b 46 4f 52 45 49 47 4e       {1 {FOREIGN
1260: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
1270: 66 61 69 6c 65 64 7d 7d 0a 20 20 34 2e 32 20 20  failed}}.  4.2  
1280: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 20  "INSERT INTO t7 
1290: 56 41 4c 55 45 53 28 32 2c 20 31 29 22 20 20 20  VALUES(2, 1)"   
12a0: 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 33 20     {0 {}}.  4.3 
12b0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 38   "INSERT INTO t8
12c0: 20 56 41 4c 55 45 53 28 31 2c 20 33 29 22 20 20   VALUES(1, 3)"  
12d0: 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 34      {0 {}}.  4.4
12e0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
12f0: 38 20 56 41 4c 55 45 53 28 32 2c 20 34 29 22 20  8 VALUES(2, 4)" 
1300: 20 20 20 20 20 7b 31 20 7b 46 4f 52 45 49 47 4e       {1 {FOREIGN
1310: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
1320: 66 61 69 6c 65 64 7d 7d 0a 20 20 34 2e 35 20 20  failed}}.  4.5  
1330: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 38 20  "INSERT INTO t8 
1340: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 34 29 22  VALUES(NULL, 4)"
1350: 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 36 20     {0 {}}.  4.6 
1360: 20 22 55 50 44 41 54 45 20 74 38 20 53 45 54 20   "UPDATE t8 SET 
1370: 63 3d 32 20 57 48 45 52 45 20 64 3d 34 22 20 20  c=2 WHERE d=4"  
1380: 20 20 20 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20      {1 {FOREIGN 
1390: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
13a0: 61 69 6c 65 64 7d 7d 0a 20 20 34 2e 37 20 20 22  ailed}}.  4.7  "
13b0: 55 50 44 41 54 45 20 74 38 20 53 45 54 20 63 3d  UPDATE t8 SET c=
13c0: 31 20 57 48 45 52 45 20 64 3d 34 22 20 20 20 20  1 WHERE d=4"    
13d0: 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 39 20 20    {0 {}}.  4.9  
13e0: 22 55 50 44 41 54 45 20 74 38 20 53 45 54 20 63  "UPDATE t8 SET c
13f0: 3d 31 20 57 48 45 52 45 20 64 3d 34 22 20 20 20  =1 WHERE d=4"   
1400: 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 31 30     {0 {}}.  4.10
1410: 20 22 55 50 44 41 54 45 20 74 38 20 53 45 54 20   "UPDATE t8 SET 
1420: 63 3d 4e 55 4c 4c 20 57 48 45 52 45 20 64 3d 34  c=NULL WHERE d=4
1430: 22 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 31  "   {0 {}}.  4.1
1440: 31 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  1 "DELETE FROM t
1450: 37 20 57 48 45 52 45 20 62 3d 31 22 20 20 20 20  7 WHERE b=1"    
1460: 20 20 20 20 20 7b 31 20 7b 46 4f 52 45 49 47 4e       {1 {FOREIGN
1470: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
1480: 66 61 69 6c 65 64 7d 7d 0a 20 20 34 2e 31 32 20  failed}}.  4.12 
1490: 22 55 50 44 41 54 45 20 74 37 20 53 45 54 20 62  "UPDATE t7 SET b
14a0: 20 3d 20 32 22 20 20 20 20 20 20 20 20 20 20 20   = 2"           
14b0: 20 20 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b     {1 {FOREIGN K
14c0: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
14d0: 69 6c 65 64 7d 7d 0a 20 20 34 2e 31 33 20 22 55  iled}}.  4.13 "U
14e0: 50 44 41 54 45 20 74 37 20 53 45 54 20 62 20 3d  PDATE t7 SET b =
14f0: 20 31 22 20 20 20 20 20 20 20 20 20 20 20 20 20   1"             
1500: 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 31 34 20 22   {0 {}}.  4.14 "
1510: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 38 20 56  INSERT INTO t8 V
1520: 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 22  ALUES('a', 'b')"
1530: 20 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45    {1 {FOREIGN KE
1540: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
1550: 6c 65 64 7d 7d 0a 20 20 34 2e 31 35 20 22 55 50  led}}.  4.15 "UP
1560: 44 41 54 45 20 74 37 20 53 45 54 20 62 20 3d 20  DATE t7 SET b = 
1570: 35 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5"              
1580: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
1590: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
15a0: 64 7d 7d 0a 20 20 34 2e 31 37 20 22 55 50 44 41  d}}.  4.17 "UPDA
15b0: 54 45 20 74 37 20 53 45 54 20 61 20 3d 20 31 30  TE t7 SET a = 10
15c0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 30  "             {0
15d0: 20 7b 7d 7d 0a 0a 20 20 35 2e 31 20 20 22 49 4e   {}}..  5.1  "IN
15e0: 53 45 52 54 20 49 4e 54 4f 20 74 39 20 56 41 4c  SERT INTO t9 VAL
15f0: 55 45 53 28 31 2c 20 33 29 22 20 20 20 20 20 20  UES(1, 3)"      
1600: 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c  {1 {no such tabl
1610: 65 3a 20 6d 61 69 6e 2e 6e 6f 73 75 63 68 74 61  e: main.nosuchta
1620: 62 6c 65 7d 7d 0a 20 20 35 2e 32 20 20 22 49 4e  ble}}.  5.2  "IN
1630: 53 45 52 54 20 49 4e 54 4f 20 74 31 30 20 56 41  SERT INTO t10 VA
1640: 4c 55 45 53 28 31 2c 20 33 29 22 20 20 0a 20 20  LUES(1, 3)"  .  
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 20 20 20 20 20 20 20 20 7b 31 20 7b 66 6f            {1 {fo
1670: 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
1680: 63 68 20 2d 20 22 74 31 30 22 20 72 65 66 65 72  ch - "t10" refer
1690: 65 6e 63 69 6e 67 20 22 74 39 22 7d 7d 0a 7d 0a  encing "t9"}}.}.
16a0: 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74  .do_test without
16b0: 5f 72 6f 77 69 64 33 2d 31 2e 31 2e 30 20 7b 0a  _rowid3-1.1.0 {.
16c0: 20 20 65 78 65 63 73 71 6c 20 5b 73 74 72 69 6e    execsql [strin
16d0: 67 20 6d 61 70 20 7b 2f 44 2f 20 7b 7d 7d 20 24  g map {/D/ {}} $
16e0: 46 6b 65 79 53 69 6d 70 6c 65 53 63 68 65 6d 61  FkeySimpleSchema
16f0: 5d 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b  ].} {}.foreach {
1700: 74 6e 20 7a 53 71 6c 20 72 65 73 7d 20 24 46 6b  tn zSql res} $Fk
1710: 65 79 53 69 6d 70 6c 65 54 65 73 74 73 20 7b 0a  eySimpleTests {.
1720: 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75    do_test withou
1730: 74 5f 72 6f 77 69 64 33 2d 31 2e 31 2e 24 74 6e  t_rowid3-1.1.$tn
1740: 2e 31 20 7b 20 63 61 74 63 68 73 71 6c 20 24 7a  .1 { catchsql $z
1750: 53 71 6c 20 7d 20 24 72 65 73 0a 20 20 64 6f 5f  Sql } $res.  do_
1760: 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77  test without_row
1770: 69 64 33 2d 31 2e 31 2e 24 74 6e 2e 32 20 7b 20  id3-1.1.$tn.2 { 
1780: 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
1790: 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63 68 65 63  foreign_key_chec
17a0: 6b 28 74 31 29 7d 20 7d 20 7b 7d 0a 20 20 64 6f  k(t1)} } {}.  do
17b0: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
17c0: 77 69 64 33 2d 31 2e 31 2e 24 74 6e 2e 33 20 7b  wid3-1.1.$tn.3 {
17d0: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
17e0: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63 68 65   foreign_key_che
17f0: 63 6b 28 74 32 29 7d 20 7d 20 7b 7d 0a 20 20 64  ck(t2)} } {}.  d
1800: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
1810: 6f 77 69 64 33 2d 31 2e 31 2e 24 74 6e 2e 34 20  owid3-1.1.$tn.4 
1820: 7b 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d  { execsql {PRAGM
1830: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63 68  A foreign_key_ch
1840: 65 63 6b 28 74 33 29 7d 20 7d 20 7b 7d 0a 20 20  eck(t3)} } {}.  
1850: 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
1860: 72 6f 77 69 64 33 2d 31 2e 31 2e 24 74 6e 2e 35  rowid3-1.1.$tn.5
1870: 20 7b 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47   { execsql {PRAG
1880: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63  MA foreign_key_c
1890: 68 65 63 6b 28 74 34 29 7d 20 7d 20 7b 7d 0a 20  heck(t4)} } {}. 
18a0: 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74   do_test without
18b0: 5f 72 6f 77 69 64 33 2d 31 2e 31 2e 24 74 6e 2e  _rowid3-1.1.$tn.
18c0: 36 20 7b 20 65 78 65 63 73 71 6c 20 7b 50 52 41  6 { execsql {PRA
18d0: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f  GMA foreign_key_
18e0: 63 68 65 63 6b 28 74 37 29 7d 20 7d 20 7b 7d 0a  check(t7)} } {}.
18f0: 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75    do_test withou
1900: 74 5f 72 6f 77 69 64 33 2d 31 2e 31 2e 24 74 6e  t_rowid3-1.1.$tn
1910: 2e 37 20 7b 20 65 78 65 63 73 71 6c 20 7b 50 52  .7 { execsql {PR
1920: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
1930: 5f 63 68 65 63 6b 28 74 38 29 7d 20 7d 20 7b 7d  _check(t8)} } {}
1940: 0a 7d 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .}.drop_all_tabl
1950: 65 73 0a 0a 64 6f 5f 74 65 73 74 20 77 69 74 68  es..do_test with
1960: 6f 75 74 5f 72 6f 77 69 64 33 2d 31 2e 32 2e 30  out_rowid3-1.2.0
1970: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 5b 73 74   {.  execsql [st
1980: 72 69 6e 67 20 6d 61 70 20 7b 2f 44 2f 20 7b 44  ring map {/D/ {D
1990: 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41  EFERRABLE INITIA
19a0: 4c 4c 59 20 44 45 46 45 52 52 45 44 7d 7d 20 24  LLY DEFERRED}} $
19b0: 46 6b 65 79 53 69 6d 70 6c 65 53 63 68 65 6d 61  FkeySimpleSchema
19c0: 5d 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b  ].} {}.foreach {
19d0: 74 6e 20 7a 53 71 6c 20 72 65 73 7d 20 24 46 6b  tn zSql res} $Fk
19e0: 65 79 53 69 6d 70 6c 65 54 65 73 74 73 20 7b 0a  eySimpleTests {.
19f0: 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75    do_test withou
1a00: 74 5f 72 6f 77 69 64 33 2d 31 2e 32 2e 24 74 6e  t_rowid3-1.2.$tn
1a10: 20 7b 20 63 61 74 63 68 73 71 6c 20 24 7a 53 71   { catchsql $zSq
1a20: 6c 20 7d 20 24 72 65 73 0a 20 20 64 6f 5f 74 65  l } $res.  do_te
1a30: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
1a40: 33 2d 31 2e 32 2e 24 74 6e 2e 32 20 7b 20 65 78  3-1.2.$tn.2 { ex
1a50: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f  ecsql {PRAGMA fo
1a60: 72 65 69 67 6e 5f 6b 65 79 5f 63 68 65 63 6b 28  reign_key_check(
1a70: 74 31 29 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74  t1)} } {}.  do_t
1a80: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
1a90: 64 33 2d 31 2e 32 2e 24 74 6e 2e 33 20 7b 20 65  d3-1.2.$tn.3 { e
1aa0: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 66  xecsql {PRAGMA f
1ab0: 6f 72 65 69 67 6e 5f 6b 65 79 5f 63 68 65 63 6b  oreign_key_check
1ac0: 28 74 32 29 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f  (t2)} } {}.  do_
1ad0: 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77  test without_row
1ae0: 69 64 33 2d 31 2e 32 2e 24 74 6e 2e 34 20 7b 20  id3-1.2.$tn.4 { 
1af0: 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
1b00: 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63 68 65 63  foreign_key_chec
1b10: 6b 28 74 33 29 7d 20 7d 20 7b 7d 0a 20 20 64 6f  k(t3)} } {}.  do
1b20: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
1b30: 77 69 64 33 2d 31 2e 32 2e 24 74 6e 2e 35 20 7b  wid3-1.2.$tn.5 {
1b40: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
1b50: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63 68 65   foreign_key_che
1b60: 63 6b 28 74 34 29 7d 20 7d 20 7b 7d 0a 20 20 64  ck(t4)} } {}.  d
1b70: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
1b80: 6f 77 69 64 33 2d 31 2e 32 2e 24 74 6e 2e 36 20  owid3-1.2.$tn.6 
1b90: 7b 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d  { execsql {PRAGM
1ba0: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63 68  A foreign_key_ch
1bb0: 65 63 6b 28 74 37 29 7d 20 7d 20 7b 7d 0a 20 20  eck(t7)} } {}.  
1bc0: 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
1bd0: 72 6f 77 69 64 33 2d 31 2e 32 2e 24 74 6e 2e 37  rowid3-1.2.$tn.7
1be0: 20 7b 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47   { execsql {PRAG
1bf0: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63  MA foreign_key_c
1c00: 68 65 63 6b 28 74 38 29 7d 20 7d 20 7b 7d 0a 7d  heck(t8)} } {}.}
1c10: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
1c20: 0a 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75  ..do_test withou
1c30: 74 5f 72 6f 77 69 64 33 2d 31 2e 33 2e 30 20 7b  t_rowid3-1.3.0 {
1c40: 0a 20 20 65 78 65 63 73 71 6c 20 5b 73 74 72 69  .  execsql [stri
1c50: 6e 67 20 6d 61 70 20 7b 2f 44 2f 20 7b 7d 7d 20  ng map {/D/ {}} 
1c60: 24 46 6b 65 79 53 69 6d 70 6c 65 53 63 68 65 6d  $FkeySimpleSchem
1c70: 61 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50  a].  execsql { P
1c80: 52 41 47 4d 41 20 63 6f 75 6e 74 5f 63 68 61 6e  RAGMA count_chan
1c90: 67 65 73 20 3d 20 31 20 7d 0a 7d 20 7b 7d 0a 66  ges = 1 }.} {}.f
1ca0: 6f 72 65 61 63 68 20 7b 74 6e 20 7a 53 71 6c 20  oreach {tn zSql 
1cb0: 72 65 73 7d 20 24 46 6b 65 79 53 69 6d 70 6c 65  res} $FkeySimple
1cc0: 54 65 73 74 73 20 7b 0a 20 20 69 66 20 7b 24 72  Tests {.  if {$r
1cd0: 65 73 20 3d 3d 20 22 30 20 7b 7d 22 7d 20 7b 20  es == "0 {}"} { 
1ce0: 73 65 74 20 72 65 73 20 7b 30 20 31 7d 20 7d 0a  set res {0 1} }.
1cf0: 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75    do_test withou
1d00: 74 5f 72 6f 77 69 64 33 2d 31 2e 33 2e 24 74 6e  t_rowid3-1.3.$tn
1d10: 20 7b 20 63 61 74 63 68 73 71 6c 20 24 7a 53 71   { catchsql $zSq
1d20: 6c 20 7d 20 24 72 65 73 0a 20 20 64 6f 5f 74 65  l } $res.  do_te
1d30: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
1d40: 33 2d 31 2e 33 2e 24 74 6e 2e 32 20 7b 20 65 78  3-1.3.$tn.2 { ex
1d50: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f  ecsql {PRAGMA fo
1d60: 72 65 69 67 6e 5f 6b 65 79 5f 63 68 65 63 6b 28  reign_key_check(
1d70: 74 31 29 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74  t1)} } {}.  do_t
1d80: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
1d90: 64 33 2d 31 2e 33 2e 24 74 6e 2e 33 20 7b 20 65  d3-1.3.$tn.3 { e
1da0: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 66  xecsql {PRAGMA f
1db0: 6f 72 65 69 67 6e 5f 6b 65 79 5f 63 68 65 63 6b  oreign_key_check
1dc0: 28 74 32 29 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f  (t2)} } {}.  do_
1dd0: 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77  test without_row
1de0: 69 64 33 2d 31 2e 33 2e 24 74 6e 2e 34 20 7b 20  id3-1.3.$tn.4 { 
1df0: 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
1e00: 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63 68 65 63  foreign_key_chec
1e10: 6b 28 74 33 29 7d 20 7d 20 7b 7d 0a 20 20 64 6f  k(t3)} } {}.  do
1e20: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
1e30: 77 69 64 33 2d 31 2e 33 2e 24 74 6e 2e 35 20 7b  wid3-1.3.$tn.5 {
1e40: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
1e50: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63 68 65   foreign_key_che
1e60: 63 6b 28 74 34 29 7d 20 7d 20 7b 7d 0a 20 20 64  ck(t4)} } {}.  d
1e70: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
1e80: 6f 77 69 64 33 2d 31 2e 33 2e 24 74 6e 2e 36 20  owid3-1.3.$tn.6 
1e90: 7b 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d  { execsql {PRAGM
1ea0: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63 68  A foreign_key_ch
1eb0: 65 63 6b 28 74 37 29 7d 20 7d 20 7b 7d 0a 20 20  eck(t7)} } {}.  
1ec0: 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
1ed0: 72 6f 77 69 64 33 2d 31 2e 33 2e 24 74 6e 2e 37  rowid3-1.3.$tn.7
1ee0: 20 7b 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47   { execsql {PRAG
1ef0: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63  MA foreign_key_c
1f00: 68 65 63 6b 28 74 38 29 7d 20 7d 20 7b 7d 0a 7d  heck(t8)} } {}.}
1f10: 0a 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d  .execsql { PRAGM
1f20: 41 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 20  A count_changes 
1f30: 3d 20 30 20 7d 0a 64 72 6f 70 5f 61 6c 6c 5f 74  = 0 }.drop_all_t
1f40: 61 62 6c 65 73 0a 0a 64 6f 5f 74 65 73 74 20 77  ables..do_test w
1f50: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 2e  ithout_rowid3-1.
1f60: 34 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.0 {.  execsql 
1f70: 5b 73 74 72 69 6e 67 20 6d 61 70 20 7b 2f 44 2f  [string map {/D/
1f80: 20 7b 7d 7d 20 24 46 6b 65 79 53 69 6d 70 6c 65   {}} $FkeySimple
1f90: 53 63 68 65 6d 61 5d 0a 20 20 65 78 65 63 73 71  Schema].  execsq
1fa0: 6c 20 7b 20 50 52 41 47 4d 41 20 63 6f 75 6e 74  l { PRAGMA count
1fb0: 5f 63 68 61 6e 67 65 73 20 3d 20 31 20 7d 0a 7d  _changes = 1 }.}
1fc0: 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20   {}.foreach {tn 
1fd0: 7a 53 71 6c 20 72 65 73 7d 20 24 46 6b 65 79 53  zSql res} $FkeyS
1fe0: 69 6d 70 6c 65 54 65 73 74 73 20 7b 0a 20 20 69  impleTests {.  i
1ff0: 66 20 7b 24 72 65 73 20 3d 3d 20 22 30 20 7b 7d  f {$res == "0 {}
2000: 22 7d 20 7b 20 73 65 74 20 72 65 73 20 7b 30 20  "} { set res {0 
2010: 31 7d 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 42  1} }.  execsql B
2020: 45 47 49 4e 0a 20 20 64 6f 5f 74 65 73 74 20 77  EGIN.  do_test w
2030: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 2e  ithout_rowid3-1.
2040: 34 2e 24 74 6e 20 7b 20 63 61 74 63 68 73 71 6c  4.$tn { catchsql
2050: 20 24 7a 53 71 6c 20 7d 20 24 72 65 73 0a 20 20   $zSql } $res.  
2060: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d  execsql COMMIT.}
2070: 0a 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d  .execsql { PRAGM
2080: 41 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 20  A count_changes 
2090: 3d 20 30 20 7d 0a 64 72 6f 70 5f 61 6c 6c 5f 74  = 0 }.drop_all_t
20a0: 61 62 6c 65 73 0a 0a 23 20 53 70 65 63 69 61 6c  ables..# Special
20b0: 20 74 65 73 74 3a 20 57 68 65 6e 20 74 68 65 20   test: When the 
20c0: 70 61 72 65 6e 74 20 6b 65 79 20 69 73 20 61 6e  parent key is an
20d0: 20 49 50 4b 2c 20 6d 61 6b 65 20 73 75 72 65 20   IPK, make sure 
20e0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 0a  the affinity of.
20f0: 23 20 74 68 65 20 49 50 4b 20 69 73 20 6e 6f 74  # the IPK is not
2100: 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20   applied to the 
2110: 63 68 69 6c 64 20 6b 65 79 20 76 61 6c 75 65 20  child key value 
2120: 62 65 66 6f 72 65 20 69 74 20 69 73 20 69 6e 73  before it is ins
2130: 65 72 74 65 64 0a 23 20 69 6e 74 6f 20 74 68 65  erted.# into the
2140: 20 63 68 69 6c 64 20 74 61 62 6c 65 2e 0a 64 6f   child table..do
2150: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
2160: 77 69 64 33 2d 31 2e 35 2e 31 20 7b 0a 20 20 65  wid3-1.5.1 {.  e
2170: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
2180: 41 54 45 20 54 41 42 4c 45 20 69 28 69 20 49 4e  ATE TABLE i(i IN
2190: 54 20 50 52 49 4d 41 52 59 20 4b 45 59 29 20 57  T PRIMARY KEY) W
21a0: 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20  ITHOUT rowid;.  
21b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6a    CREATE TABLE j
21c0: 28 6a 20 52 45 46 45 52 45 4e 43 45 53 20 69 29  (j REFERENCES i)
21d0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
21e0: 4f 20 69 20 56 41 4c 55 45 53 28 33 35 29 3b 0a  O i VALUES(35);.
21f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2200: 6a 20 56 41 4c 55 45 53 28 27 33 35 2e 30 27 29  j VALUES('35.0')
2210: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6a 2c 20  ;.    SELECT j, 
2220: 74 79 70 65 6f 66 28 6a 29 20 46 52 4f 4d 20 6a  typeof(j) FROM j
2230: 3b 0a 20 20 7d 0a 7d 20 7b 33 35 2e 30 20 74 65  ;.  }.} {35.0 te
2240: 78 74 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68  xt}.do_test with
2250: 6f 75 74 5f 72 6f 77 69 64 33 2d 31 2e 35 2e 32  out_rowid3-1.5.2
2260: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
2270: 44 45 4c 45 54 45 20 46 52 4f 4d 20 69 20 7d 0a  DELETE FROM i }.
2280: 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
2290: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
22a0: 6c 65 64 7d 7d 0a 0a 23 20 53 61 6d 65 20 74 65  led}}..# Same te
22b0: 73 74 20 75 73 69 6e 67 20 61 20 72 65 67 75 6c  st using a regul
22c0: 61 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77  ar primary key w
22d0: 69 74 68 20 69 6e 74 65 67 65 72 20 61 66 66 69  ith integer affi
22e0: 6e 69 74 79 2e 0a 64 72 6f 70 5f 61 6c 6c 5f 74  nity..drop_all_t
22f0: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 77 69  ables.do_test wi
2300: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 2e 36  thout_rowid3-1.6
2310: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
2320: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2330: 45 20 69 28 69 20 49 4e 54 20 55 4e 49 51 55 45  E i(i INT UNIQUE
2340: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
2350: 42 4c 45 20 6a 28 6a 20 52 45 46 45 52 45 4e 43  BLE j(j REFERENC
2360: 45 53 20 69 28 69 29 29 3b 0a 20 20 20 20 49 4e  ES i(i));.    IN
2370: 53 45 52 54 20 49 4e 54 4f 20 69 20 56 41 4c 55  SERT INTO i VALU
2380: 45 53 28 27 33 35 2e 30 27 29 3b 0a 20 20 20 20  ES('35.0');.    
2390: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6a 20 56 41  INSERT INTO j VA
23a0: 4c 55 45 53 28 27 33 35 2e 30 27 29 3b 0a 20 20  LUES('35.0');.  
23b0: 20 20 53 45 4c 45 43 54 20 6a 2c 20 74 79 70 65    SELECT j, type
23c0: 6f 66 28 6a 29 20 46 52 4f 4d 20 6a 3b 0a 20 20  of(j) FROM j;.  
23d0: 20 20 53 45 4c 45 43 54 20 69 2c 20 74 79 70 65    SELECT i, type
23e0: 6f 66 28 69 29 20 46 52 4f 4d 20 69 3b 0a 20 20  of(i) FROM i;.  
23f0: 7d 0a 7d 20 7b 33 35 2e 30 20 74 65 78 74 20 33  }.} {35.0 text 3
2400: 35 20 69 6e 74 65 67 65 72 7d 0a 64 6f 5f 74 65  5 integer}.do_te
2410: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
2420: 33 2d 31 2e 36 2e 32 20 7b 0a 20 20 63 61 74 63  3-1.6.2 {.  catc
2430: 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52  hsql { DELETE FR
2440: 4f 4d 20 69 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52  OM i }.} {1 {FOR
2450: 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
2460: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 23 20  int failed}}..# 
2470: 55 73 65 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  Use a collation 
2480: 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 20  sequence on the 
2490: 70 61 72 65 6e 74 20 6b 65 79 2e 0a 64 72 6f 70  parent key..drop
24a0: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
24b0: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
24c0: 64 33 2d 31 2e 37 2e 31 20 7b 0a 20 20 65 78 65  d3-1.7.1 {.  exe
24d0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
24e0: 45 20 54 41 42 4c 45 20 69 28 69 20 54 45 58 54  E TABLE i(i TEXT
24f0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
2500: 50 52 49 4d 41 52 59 20 4b 45 59 29 20 57 49 54  PRIMARY KEY) WIT
2510: 48 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20 20 20  HOUT rowid;.    
2520: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6a 28 6a  CREATE TABLE j(j
2530: 20 54 45 58 54 20 43 4f 4c 4c 41 54 45 20 62 69   TEXT COLLATE bi
2540: 6e 61 72 79 20 52 45 46 45 52 45 4e 43 45 53 20  nary REFERENCES 
2550: 69 28 69 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  i(i));.    INSER
2560: 54 20 49 4e 54 4f 20 69 20 56 41 4c 55 45 53 28  T INTO i VALUES(
2570: 27 53 51 4c 69 74 65 27 29 3b 0a 20 20 20 20 49  'SQLite');.    I
2580: 4e 53 45 52 54 20 49 4e 54 4f 20 6a 20 56 41 4c  NSERT INTO j VAL
2590: 55 45 53 28 27 73 71 6c 69 74 65 27 29 3b 0a 20  UES('sqlite');. 
25a0: 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   }.  catchsql { 
25b0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 69 20 7d 0a  DELETE FROM i }.
25c0: 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
25d0: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
25e0: 6c 65 64 7d 7d 0a 0a 23 20 55 73 65 20 74 68 65  led}}..# Use the
25f0: 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 6c   parent key coll
2600: 61 74 69 6f 6e 20 65 76 65 6e 20 69 66 20 69 74  ation even if it
2610: 20 69 73 20 64 65 66 61 75 6c 74 20 61 6e 64 20   is default and 
2620: 74 68 65 20 63 68 69 6c 64 20 6b 65 79 0a 23 20  the child key.# 
2630: 68 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74 20  has an explicit 
2640: 76 61 6c 75 65 2e 0a 64 72 6f 70 5f 61 6c 6c 5f  value..drop_all_
2650: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 77  tables.do_test w
2660: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 2e  ithout_rowid3-1.
2670: 37 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.2 {.  execsql 
2680: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
2690: 4c 45 20 69 28 69 20 54 45 58 54 20 50 52 49 4d  LE i(i TEXT PRIM
26a0: 41 52 59 20 4b 45 59 29 20 57 49 54 48 4f 55 54  ARY KEY) WITHOUT
26b0: 20 72 6f 77 69 64 3b 20 20 2d 2d 20 43 6f 6c 73   rowid;  -- Cols
26c0: 65 71 20 69 73 20 22 42 49 4e 41 52 59 22 0a 20  eq is "BINARY". 
26d0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
26e0: 6a 28 6a 20 54 45 58 54 20 43 4f 4c 4c 41 54 45  j(j TEXT COLLATE
26f0: 20 6e 6f 63 61 73 65 20 52 45 46 45 52 45 4e 43   nocase REFERENC
2700: 45 53 20 69 28 69 29 29 3b 0a 20 20 20 20 49 4e  ES i(i));.    IN
2710: 53 45 52 54 20 49 4e 54 4f 20 69 20 56 41 4c 55  SERT INTO i VALU
2720: 45 53 28 27 53 51 4c 69 74 65 27 29 3b 0a 20 20  ES('SQLite');.  
2730: 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49  }.  catchsql { I
2740: 4e 53 45 52 54 20 49 4e 54 4f 20 6a 20 56 41 4c  NSERT INTO j VAL
2750: 55 45 53 28 27 73 71 6c 69 74 65 27 29 20 7d 0a  UES('sqlite') }.
2760: 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
2770: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
2780: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 69  led}}.do_test wi
2790: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 2e 37  thout_rowid3-1.7
27a0: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
27b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
27c0: 20 69 20 56 41 4c 55 45 53 28 27 73 71 6c 69 74   i VALUES('sqlit
27d0: 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  e');.    INSERT 
27e0: 49 4e 54 4f 20 6a 20 56 41 4c 55 45 53 28 27 73  INTO j VALUES('s
27f0: 71 6c 69 74 65 27 29 3b 0a 20 20 20 20 44 45 4c  qlite');.    DEL
2800: 45 54 45 20 46 52 4f 4d 20 69 20 57 48 45 52 45  ETE FROM i WHERE
2810: 20 69 20 3d 20 27 53 51 4c 69 74 65 27 3b 0a 20   i = 'SQLite';. 
2820: 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   }.  catchsql { 
2830: 44 45 4c 45 54 45 20 46 52 4f 4d 20 69 20 57 48  DELETE FROM i WH
2840: 45 52 45 20 69 20 3d 20 27 73 71 6c 69 74 65 27  ERE i = 'sqlite'
2850: 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e   }.} {1 {FOREIGN
2860: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
2870: 66 61 69 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d  failed}}..#-----
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28c0: 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 73 65 63 74  ----.# This sect
28d0: 69 6f 6e 20 28 74 65 73 74 20 63 61 73 65 73 20  ion (test cases 
28e0: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32  without_rowid3-2
28f0: 2e 2a 29 20 63 6f 6e 74 61 69 6e 73 20 74 65 73  .*) contains tes
2900: 74 73 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74  ts to check that
2910: 20 74 68 65 0a 23 20 64 65 66 65 72 72 65 64 20   the.# deferred 
2920: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
2930: 74 72 61 69 6e 74 20 6c 6f 67 69 63 20 77 6f 72  traint logic wor
2940: 6b 73 2e 0a 23 0a 70 72 6f 63 20 77 69 74 68 6f  ks..#.proc witho
2950: 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74 65 73 74  ut_rowid3-2-test
2960: 20 7b 74 6e 20 6e 6f 63 6f 6d 6d 69 74 20 73 71   {tn nocommit sq
2970: 6c 20 7b 72 65 73 20 7b 7d 7d 7d 20 7b 0a 20 20  l {res {}}} {.  
2980: 69 66 20 7b 24 72 65 73 20 65 71 20 22 46 4b 56  if {$res eq "FKV
2990: 22 7d 20 7b 0a 20 20 20 20 73 65 74 20 65 78 70  "} {.    set exp
29a0: 65 63 74 65 64 20 7b 31 20 7b 46 4f 52 45 49 47  ected {1 {FOREIG
29b0: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
29c0: 20 66 61 69 6c 65 64 7d 7d 0a 20 20 7d 20 65 6c   failed}}.  } el
29d0: 73 65 20 7b 0a 20 20 20 20 73 65 74 20 65 78 70  se {.    set exp
29e0: 65 63 74 65 64 20 5b 6c 69 73 74 20 30 20 24 72  ected [list 0 $r
29f0: 65 73 5d 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73  es].  }.  do_tes
2a00: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  t without_rowid3
2a10: 2d 32 2e 24 74 6e 20 5b 6c 69 73 74 20 63 61 74  -2.$tn [list cat
2a20: 63 68 73 71 6c 20 24 73 71 6c 5d 20 24 65 78 70  chsql $sql] $exp
2a30: 65 63 74 65 64 0a 20 20 69 66 20 7b 24 6e 6f 63  ected.  if {$noc
2a40: 6f 6d 6d 69 74 7d 20 7b 0a 20 20 20 20 64 6f 5f  ommit} {.    do_
2a50: 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77  test without_row
2a60: 69 64 33 2d 32 2e 24 7b 74 6e 7d 63 20 7b 0a 20  id3-2.${tn}c {. 
2a70: 20 20 20 20 20 63 61 74 63 68 73 71 6c 20 43 4f       catchsql CO
2a80: 4d 4d 49 54 0a 20 20 20 20 7d 20 7b 31 20 7b 46  MMIT.    } {1 {F
2a90: 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
2aa0: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 20  raint failed}}. 
2ab0: 20 7d 0a 7d 0a 0a 77 69 74 68 6f 75 74 5f 72 6f   }.}..without_ro
2ac0: 77 69 64 33 2d 32 2d 74 65 73 74 20 31 20 30 20  wid3-2-test 1 0 
2ad0: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
2ae0: 20 6e 6f 64 65 28 0a 20 20 20 20 6e 6f 64 65 69   node(.    nodei
2af0: 64 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20  d PRIMARY KEY,. 
2b00: 20 20 20 70 61 72 65 6e 74 20 52 45 46 45 52 45     parent REFERE
2b10: 4e 43 45 53 20 6e 6f 64 65 20 44 45 46 45 52 52  NCES node DEFERR
2b20: 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44  ABLE INITIALLY D
2b30: 45 46 45 52 52 45 44 0a 20 20 29 20 57 49 54 48  EFERRED.  ) WITH
2b40: 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20 43 52 45  OUT rowid;.  CRE
2b50: 41 54 45 20 54 41 42 4c 45 20 6c 65 61 66 28 0a  ATE TABLE leaf(.
2b60: 20 20 20 20 63 65 6c 6c 69 64 20 50 52 49 4d 41      cellid PRIMA
2b70: 52 59 20 4b 45 59 2c 0a 20 20 20 20 70 61 72 65  RY KEY,.    pare
2b80: 6e 74 20 52 45 46 45 52 45 4e 43 45 53 20 6e 6f  nt REFERENCES no
2b90: 64 65 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e  de DEFERRABLE IN
2ba0: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
2bb0: 0a 20 20 29 20 57 49 54 48 4f 55 54 20 72 6f 77  .  ) WITHOUT row
2bc0: 69 64 3b 0a 7d 0a 0a 77 69 74 68 6f 75 74 5f 72  id;.}..without_r
2bd0: 6f 77 69 64 33 2d 32 2d 74 65 73 74 20 31 20 20  owid3-2-test 1  
2be0: 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e  0 "INSERT INTO n
2bf0: 6f 64 65 20 56 41 4c 55 45 53 28 31 2c 20 30 29  ode VALUES(1, 0)
2c00: 22 20 20 20 20 20 20 20 46 4b 56 0a 77 69 74 68  "       FKV.with
2c10: 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74 65 73  out_rowid3-2-tes
2c20: 74 20 32 20 20 30 20 22 42 45 47 49 4e 22 0a 77  t 2  0 "BEGIN".w
2c30: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d  ithout_rowid3-2-
2c40: 74 65 73 74 20 33 20 20 31 20 20 20 22 49 4e 53  test 3  1   "INS
2c50: 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65 20 56 41  ERT INTO node VA
2c60: 4c 55 45 53 28 31 2c 20 30 29 22 0a 77 69 74 68  LUES(1, 0)".with
2c70: 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74 65 73  out_rowid3-2-tes
2c80: 74 20 34 20 20 30 20 20 20 22 55 50 44 41 54 45  t 4  0   "UPDATE
2c90: 20 6e 6f 64 65 20 53 45 54 20 70 61 72 65 6e 74   node SET parent
2ca0: 20 3d 20 4e 55 4c 4c 22 0a 77 69 74 68 6f 75 74   = NULL".without
2cb0: 5f 72 6f 77 69 64 33 2d 32 2d 74 65 73 74 20 35  _rowid3-2-test 5
2cc0: 20 20 30 20 22 43 4f 4d 4d 49 54 22 0a 77 69 74    0 "COMMIT".wit
2cd0: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74 65  hout_rowid3-2-te
2ce0: 73 74 20 36 20 20 30 20 22 53 45 4c 45 43 54 20  st 6  0 "SELECT 
2cf0: 2a 20 46 52 4f 4d 20 6e 6f 64 65 22 20 7b 31 20  * FROM node" {1 
2d00: 7b 7d 7d 0a 0a 77 69 74 68 6f 75 74 5f 72 6f 77  {}}..without_row
2d10: 69 64 33 2d 32 2d 74 65 73 74 20 37 20 20 30 20  id3-2-test 7  0 
2d20: 22 42 45 47 49 4e 22 0a 77 69 74 68 6f 75 74 5f  "BEGIN".without_
2d30: 72 6f 77 69 64 33 2d 32 2d 74 65 73 74 20 38 20  rowid3-2-test 8 
2d40: 20 31 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54   1   "INSERT INT
2d50: 4f 20 6c 65 61 66 20 56 41 4c 55 45 53 28 27 61  O leaf VALUES('a
2d60: 27 2c 20 32 29 22 0a 77 69 74 68 6f 75 74 5f 72  ', 2)".without_r
2d70: 6f 77 69 64 33 2d 32 2d 74 65 73 74 20 39 20 20  owid3-2-test 9  
2d80: 31 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  1   "INSERT INTO
2d90: 20 6e 6f 64 65 20 56 41 4c 55 45 53 28 32 2c 20   node VALUES(2, 
2da0: 30 29 22 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69  0)".without_rowi
2db0: 64 33 2d 32 2d 74 65 73 74 20 31 30 20 30 20 20  d3-2-test 10 0  
2dc0: 20 22 55 50 44 41 54 45 20 6e 6f 64 65 20 53 45   "UPDATE node SE
2dd0: 54 20 70 61 72 65 6e 74 20 3d 20 31 20 57 48 45  T parent = 1 WHE
2de0: 52 45 20 6e 6f 64 65 69 64 20 3d 20 32 22 0a 77  RE nodeid = 2".w
2df0: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d  ithout_rowid3-2-
2e00: 74 65 73 74 20 31 31 20 30 20 22 43 4f 4d 4d 49  test 11 0 "COMMI
2e10: 54 22 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  T".without_rowid
2e20: 33 2d 32 2d 74 65 73 74 20 31 32 20 30 20 22 53  3-2-test 12 0 "S
2e30: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6e 6f 64  ELECT * FROM nod
2e40: 65 22 20 7b 31 20 7b 7d 20 32 20 31 7d 0a 77 69  e" {1 {} 2 1}.wi
2e50: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74  thout_rowid3-2-t
2e60: 65 73 74 20 31 33 20 30 20 22 53 45 4c 45 43 54  est 13 0 "SELECT
2e70: 20 2a 20 46 52 4f 4d 20 6c 65 61 66 22 20 7b 61   * FROM leaf" {a
2e80: 20 32 7d 0a 0a 77 69 74 68 6f 75 74 5f 72 6f 77   2}..without_row
2e90: 69 64 33 2d 32 2d 74 65 73 74 20 31 34 20 30 20  id3-2-test 14 0 
2ea0: 22 42 45 47 49 4e 22 0a 77 69 74 68 6f 75 74 5f  "BEGIN".without_
2eb0: 72 6f 77 69 64 33 2d 32 2d 74 65 73 74 20 31 35  rowid3-2-test 15
2ec0: 20 31 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f   1   "DELETE FRO
2ed0: 4d 20 6e 6f 64 65 20 57 48 45 52 45 20 6e 6f 64  M node WHERE nod
2ee0: 65 69 64 20 3d 20 32 22 0a 77 69 74 68 6f 75 74  eid = 2".without
2ef0: 5f 72 6f 77 69 64 33 2d 32 2d 74 65 73 74 20 31  _rowid3-2-test 1
2f00: 36 20 30 20 20 20 22 49 4e 53 45 52 54 20 49 4e  6 0   "INSERT IN
2f10: 54 4f 20 6e 6f 64 65 20 56 41 4c 55 45 53 28 32  TO node VALUES(2
2f20: 2c 20 4e 55 4c 4c 29 22 0a 77 69 74 68 6f 75 74  , NULL)".without
2f30: 5f 72 6f 77 69 64 33 2d 32 2d 74 65 73 74 20 31  _rowid3-2-test 1
2f40: 37 20 30 20 22 43 4f 4d 4d 49 54 22 0a 77 69 74  7 0 "COMMIT".wit
2f50: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74 65  hout_rowid3-2-te
2f60: 73 74 20 31 38 20 30 20 22 53 45 4c 45 43 54 20  st 18 0 "SELECT 
2f70: 2a 20 46 52 4f 4d 20 6e 6f 64 65 22 20 7b 31 20  * FROM node" {1 
2f80: 7b 7d 20 32 20 7b 7d 7d 0a 77 69 74 68 6f 75 74  {} 2 {}}.without
2f90: 5f 72 6f 77 69 64 33 2d 32 2d 74 65 73 74 20 31  _rowid3-2-test 1
2fa0: 39 20 30 20 22 53 45 4c 45 43 54 20 2a 20 46 52  9 0 "SELECT * FR
2fb0: 4f 4d 20 6c 65 61 66 22 20 7b 61 20 32 7d 0a 0a  OM leaf" {a 2}..
2fc0: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32  without_rowid3-2
2fd0: 2d 74 65 73 74 20 32 30 20 30 20 22 42 45 47 49  -test 20 0 "BEGI
2fe0: 4e 22 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  N".without_rowid
2ff0: 33 2d 32 2d 74 65 73 74 20 32 31 20 30 20 20 20  3-2-test 21 0   
3000: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 65 61  "INSERT INTO lea
3010: 66 20 56 41 4c 55 45 53 28 27 62 27 2c 20 31 29  f VALUES('b', 1)
3020: 22 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  ".without_rowid3
3030: 2d 32 2d 74 65 73 74 20 32 32 20 30 20 20 20 22  -2-test 22 0   "
3040: 53 41 56 45 50 4f 49 4e 54 20 73 61 76 65 22 0a  SAVEPOINT save".
3050: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32  without_rowid3-2
3060: 2d 74 65 73 74 20 32 33 20 30 20 20 20 20 20 22  -test 23 0     "
3070: 44 45 4c 45 54 45 20 46 52 4f 4d 20 6e 6f 64 65  DELETE FROM node
3080: 20 57 48 45 52 45 20 6e 6f 64 65 69 64 20 3d 20   WHERE nodeid = 
3090: 31 22 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  1".without_rowid
30a0: 33 2d 32 2d 74 65 73 74 20 32 34 20 30 20 20 20  3-2-test 24 0   
30b0: 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 61 76  "ROLLBACK TO sav
30c0: 65 22 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  e".without_rowid
30d0: 33 2d 32 2d 74 65 73 74 20 32 35 20 30 20 22 43  3-2-test 25 0 "C
30e0: 4f 4d 4d 49 54 22 0a 77 69 74 68 6f 75 74 5f 72  OMMIT".without_r
30f0: 6f 77 69 64 33 2d 32 2d 74 65 73 74 20 32 36 20  owid3-2-test 26 
3100: 30 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  0 "SELECT * FROM
3110: 20 6e 6f 64 65 22 20 7b 31 20 7b 7d 20 32 20 7b   node" {1 {} 2 {
3120: 7d 7d 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  }}.without_rowid
3130: 33 2d 32 2d 74 65 73 74 20 32 37 20 30 20 22 53  3-2-test 27 0 "S
3140: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c 65 61  ELECT * FROM lea
3150: 66 22 20 7b 61 20 32 20 62 20 31 7d 0a 0a 77 69  f" {a 2 b 1}..wi
3160: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74  thout_rowid3-2-t
3170: 65 73 74 20 32 38 20 30 20 22 42 45 47 49 4e 22  est 28 0 "BEGIN"
3180: 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d  .without_rowid3-
3190: 32 2d 74 65 73 74 20 32 39 20 30 20 20 20 22 49  2-test 29 0   "I
31a0: 4e 53 45 52 54 20 49 4e 54 4f 20 6c 65 61 66 20  NSERT INTO leaf 
31b0: 56 41 4c 55 45 53 28 27 63 27 2c 20 31 29 22 0a  VALUES('c', 1)".
31c0: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32  without_rowid3-2
31d0: 2d 74 65 73 74 20 33 30 20 30 20 20 20 22 53 41  -test 30 0   "SA
31e0: 56 45 50 4f 49 4e 54 20 73 61 76 65 22 0a 77 69  VEPOINT save".wi
31f0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74  thout_rowid3-2-t
3200: 65 73 74 20 33 31 20 30 20 20 20 20 20 22 44 45  est 31 0     "DE
3210: 4c 45 54 45 20 46 52 4f 4d 20 6e 6f 64 65 20 57  LETE FROM node W
3220: 48 45 52 45 20 6e 6f 64 65 69 64 20 3d 20 31 22  HERE nodeid = 1"
3230: 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d  .without_rowid3-
3240: 32 2d 74 65 73 74 20 33 32 20 31 20 20 20 22 52  2-test 32 1   "R
3250: 45 4c 45 41 53 45 20 73 61 76 65 22 0a 77 69 74  ELEASE save".wit
3260: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74 65  hout_rowid3-2-te
3270: 73 74 20 33 33 20 31 20 20 20 22 44 45 4c 45 54  st 33 1   "DELET
3280: 45 20 46 52 4f 4d 20 6c 65 61 66 20 57 48 45 52  E FROM leaf WHER
3290: 45 20 63 65 6c 6c 69 64 20 3d 20 27 62 27 22 0a  E cellid = 'b'".
32a0: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32  without_rowid3-2
32b0: 2d 74 65 73 74 20 33 34 20 30 20 20 20 22 44 45  -test 34 0   "DE
32c0: 4c 45 54 45 20 46 52 4f 4d 20 6c 65 61 66 20 57  LETE FROM leaf W
32d0: 48 45 52 45 20 63 65 6c 6c 69 64 20 3d 20 27 63  HERE cellid = 'c
32e0: 27 22 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  '".without_rowid
32f0: 33 2d 32 2d 74 65 73 74 20 33 35 20 30 20 22 43  3-2-test 35 0 "C
3300: 4f 4d 4d 49 54 22 0a 77 69 74 68 6f 75 74 5f 72  OMMIT".without_r
3310: 6f 77 69 64 33 2d 32 2d 74 65 73 74 20 33 36 20  owid3-2-test 36 
3320: 30 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  0 "SELECT * FROM
3330: 20 6e 6f 64 65 22 20 7b 32 20 7b 7d 7d 20 0a 77   node" {2 {}} .w
3340: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d  ithout_rowid3-2-
3350: 74 65 73 74 20 33 37 20 30 20 22 53 45 4c 45 43  test 37 0 "SELEC
3360: 54 20 2a 20 46 52 4f 4d 20 6c 65 61 66 22 20 7b  T * FROM leaf" {
3370: 61 20 32 7d 0a 0a 77 69 74 68 6f 75 74 5f 72 6f  a 2}..without_ro
3380: 77 69 64 33 2d 32 2d 74 65 73 74 20 33 38 20 30  wid3-2-test 38 0
3390: 20 22 53 41 56 45 50 4f 49 4e 54 20 6f 75 74 65   "SAVEPOINT oute
33a0: 72 22 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  r".without_rowid
33b0: 33 2d 32 2d 74 65 73 74 20 33 39 20 31 20 20 20  3-2-test 39 1   
33c0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 65 61  "INSERT INTO lea
33d0: 66 20 56 41 4c 55 45 53 28 27 64 27 2c 20 33 29  f VALUES('d', 3)
33e0: 22 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  ".without_rowid3
33f0: 2d 32 2d 74 65 73 74 20 34 30 20 31 20 22 52 45  -2-test 40 1 "RE
3400: 4c 45 41 53 45 20 6f 75 74 65 72 22 20 20 20 20  LEASE outer"    
3410: 46 4b 56 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69  FKV.without_rowi
3420: 64 33 2d 32 2d 74 65 73 74 20 34 31 20 31 20 20  d3-2-test 41 1  
3430: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 65   "INSERT INTO le
3440: 61 66 20 56 41 4c 55 45 53 28 27 65 27 2c 20 33  af VALUES('e', 3
3450: 29 22 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  )".without_rowid
3460: 33 2d 32 2d 74 65 73 74 20 34 32 20 30 20 20 20  3-2-test 42 0   
3470: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e 6f 64  "INSERT INTO nod
3480: 65 20 56 41 4c 55 45 53 28 33 2c 20 32 29 22 0a  e VALUES(3, 2)".
3490: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32  without_rowid3-2
34a0: 2d 74 65 73 74 20 34 33 20 30 20 22 52 45 4c 45  -test 43 0 "RELE
34b0: 41 53 45 20 6f 75 74 65 72 22 0a 0a 77 69 74 68  ASE outer"..with
34c0: 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74 65 73  out_rowid3-2-tes
34d0: 74 20 34 34 20 30 20 22 53 41 56 45 50 4f 49 4e  t 44 0 "SAVEPOIN
34e0: 54 20 6f 75 74 65 72 22 0a 77 69 74 68 6f 75 74  T outer".without
34f0: 5f 72 6f 77 69 64 33 2d 32 2d 74 65 73 74 20 34  _rowid3-2-test 4
3500: 35 20 31 20 20 20 22 44 45 4c 45 54 45 20 46 52  5 1   "DELETE FR
3510: 4f 4d 20 6e 6f 64 65 20 57 48 45 52 45 20 6e 6f  OM node WHERE no
3520: 64 65 69 64 3d 33 22 0a 77 69 74 68 6f 75 74 5f  deid=3".without_
3530: 72 6f 77 69 64 33 2d 32 2d 74 65 73 74 20 34 37  rowid3-2-test 47
3540: 20 30 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54   0   "INSERT INT
3550: 4f 20 6e 6f 64 65 20 56 41 4c 55 45 53 28 33 2c  O node VALUES(3,
3560: 20 32 29 22 0a 77 69 74 68 6f 75 74 5f 72 6f 77   2)".without_row
3570: 69 64 33 2d 32 2d 74 65 73 74 20 34 38 20 30 20  id3-2-test 48 0 
3580: 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 75 74  "ROLLBACK TO out
3590: 65 72 22 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69  er".without_rowi
35a0: 64 33 2d 32 2d 74 65 73 74 20 34 39 20 30 20 22  d3-2-test 49 0 "
35b0: 52 45 4c 45 41 53 45 20 6f 75 74 65 72 22 0a 0a  RELEASE outer"..
35c0: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32  without_rowid3-2
35d0: 2d 74 65 73 74 20 35 30 20 30 20 22 53 41 56 45  -test 50 0 "SAVE
35e0: 50 4f 49 4e 54 20 6f 75 74 65 72 22 0a 77 69 74  POINT outer".wit
35f0: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74 65  hout_rowid3-2-te
3600: 73 74 20 35 31 20 31 20 20 20 22 49 4e 53 45 52  st 51 1   "INSER
3610: 54 20 49 4e 54 4f 20 6c 65 61 66 20 56 41 4c 55  T INTO leaf VALU
3620: 45 53 28 27 66 27 2c 20 34 29 22 0a 77 69 74 68  ES('f', 4)".with
3630: 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74 65 73  out_rowid3-2-tes
3640: 74 20 35 32 20 31 20 20 20 22 53 41 56 45 50 4f  t 52 1   "SAVEPO
3650: 49 4e 54 20 69 6e 6e 65 72 22 0a 77 69 74 68 6f  INT inner".witho
3660: 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74 65 73 74  ut_rowid3-2-test
3670: 20 35 33 20 31 20 20 20 20 20 22 49 4e 53 45 52   53 1     "INSER
3680: 54 20 49 4e 54 4f 20 6c 65 61 66 20 56 41 4c 55  T INTO leaf VALU
3690: 45 53 28 27 67 27 2c 20 34 29 22 0a 77 69 74 68  ES('g', 4)".with
36a0: 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74 65 73  out_rowid3-2-tes
36b0: 74 20 35 34 20 31 20 20 22 52 45 4c 45 41 53 45  t 54 1  "RELEASE
36c0: 20 6f 75 74 65 72 22 20 20 20 46 4b 56 0a 77 69   outer"   FKV.wi
36d0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74  thout_rowid3-2-t
36e0: 65 73 74 20 35 35 20 31 20 20 20 22 52 4f 4c 4c  est 55 1   "ROLL
36f0: 42 41 43 4b 20 54 4f 20 69 6e 6e 65 72 22 0a 77  BACK TO inner".w
3700: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d  ithout_rowid3-2-
3710: 74 65 73 74 20 35 36 20 30 20 20 22 43 4f 4d 4d  test 56 0  "COMM
3720: 49 54 22 20 20 20 20 20 20 20 20 20 20 46 4b 56  IT"          FKV
3730: 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d  .without_rowid3-
3740: 32 2d 74 65 73 74 20 35 37 20 30 20 20 20 22 49  2-test 57 0   "I
3750: 4e 53 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65 20  NSERT INTO node 
3760: 56 41 4c 55 45 53 28 34 2c 20 4e 55 4c 4c 29 22  VALUES(4, NULL)"
3770: 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d  .without_rowid3-
3780: 32 2d 74 65 73 74 20 35 38 20 30 20 22 52 45 4c  2-test 58 0 "REL
3790: 45 41 53 45 20 6f 75 74 65 72 22 0a 77 69 74 68  EASE outer".with
37a0: 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74 65 73  out_rowid3-2-tes
37b0: 74 20 35 39 20 30 20 22 53 45 4c 45 43 54 20 2a  t 59 0 "SELECT *
37c0: 20 46 52 4f 4d 20 6e 6f 64 65 22 20 7b 32 20 7b   FROM node" {2 {
37d0: 7d 20 33 20 32 20 34 20 7b 7d 7d 0a 77 69 74 68  } 3 2 4 {}}.with
37e0: 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74 65 73  out_rowid3-2-tes
37f0: 74 20 36 30 20 30 20 22 53 45 4c 45 43 54 20 2a  t 60 0 "SELECT *
3800: 20 46 52 4f 4d 20 6c 65 61 66 22 20 7b 61 20 32   FROM leaf" {a 2
3810: 20 64 20 33 20 65 20 33 20 66 20 34 7d 0a 0a 23   d 3 e 3 f 4}..#
3820: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
3830: 65 74 20 6f 66 20 74 65 73 74 73 20 63 68 65 63  et of tests chec
3840: 6b 20 74 68 61 74 20 69 66 20 61 20 73 74 61 74  k that if a stat
3850: 65 6d 65 6e 74 20 74 68 61 74 20 61 66 66 65 63  ement that affec
3860: 74 73 20 0a 23 20 6d 75 6c 74 69 70 6c 65 20 72  ts .# multiple r
3870: 6f 77 73 20 76 69 6f 6c 61 74 65 73 20 73 6f 6d  ows violates som
3880: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
3890: 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20  nstraints, then 
38a0: 73 74 72 69 6b 65 73 20 61 20 0a 23 20 63 6f 6e  strikes a .# con
38b0: 73 74 72 61 69 6e 74 20 74 68 61 74 20 63 61 75  straint that cau
38c0: 73 65 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ses the statemen
38d0: 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  t-transaction to
38e0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
38f0: 20 0a 23 20 74 68 65 20 64 65 66 65 72 72 65 64   .# the deferred
3900: 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e   constraint coun
3910: 74 65 72 20 69 73 20 63 6f 72 72 65 63 74 6c 79  ter is correctly
3920: 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61   reset to the va
3930: 6c 75 65 20 69 74 20 0a 23 20 68 61 64 20 62 65  lue it .# had be
3940: 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 6d 65  fore the stateme
3950: 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt-transaction w
3960: 61 73 20 6f 70 65 6e 65 64 2e 0a 23 0a 77 69 74  as opened..#.wit
3970: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74 65  hout_rowid3-2-te
3980: 73 74 20 36 31 20 30 20 22 42 45 47 49 4e 22 0a  st 61 0 "BEGIN".
3990: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32  without_rowid3-2
39a0: 2d 74 65 73 74 20 36 32 20 30 20 20 20 22 44 45  -test 62 0   "DE
39b0: 4c 45 54 45 20 46 52 4f 4d 20 6c 65 61 66 22 0a  LETE FROM leaf".
39c0: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32  without_rowid3-2
39d0: 2d 74 65 73 74 20 36 33 20 30 20 20 20 22 44 45  -test 63 0   "DE
39e0: 4c 45 54 45 20 46 52 4f 4d 20 6e 6f 64 65 22 0a  LETE FROM node".
39f0: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32  without_rowid3-2
3a00: 2d 74 65 73 74 20 36 34 20 31 20 20 20 22 49 4e  -test 64 1   "IN
3a10: 53 45 52 54 20 49 4e 54 4f 20 6c 65 61 66 20 56  SERT INTO leaf V
3a20: 41 4c 55 45 53 28 27 61 27 2c 20 31 29 22 0a 77  ALUES('a', 1)".w
3a30: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d  ithout_rowid3-2-
3a40: 74 65 73 74 20 36 35 20 31 20 20 20 22 49 4e 53  test 65 1   "INS
3a50: 45 52 54 20 49 4e 54 4f 20 6c 65 61 66 20 56 41  ERT INTO leaf VA
3a60: 4c 55 45 53 28 27 62 27 2c 20 32 29 22 0a 77 69  LUES('b', 2)".wi
3a70: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2d 74  thout_rowid3-2-t
3a80: 65 73 74 20 36 36 20 31 20 20 20 22 49 4e 53 45  est 66 1   "INSE
3a90: 52 54 20 49 4e 54 4f 20 6c 65 61 66 20 56 41 4c  RT INTO leaf VAL
3aa0: 55 45 53 28 27 63 27 2c 20 31 29 22 0a 64 6f 5f  UES('c', 1)".do_
3ab0: 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77  test without_row
3ac0: 69 64 33 2d 32 2d 74 65 73 74 2d 36 37 20 7b 0a  id3-2-test-67 {.
3ad0: 20 20 63 61 74 63 68 73 71 6c 20 20 20 20 20 20    catchsql      
3ae0: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
3af0: 20 6e 6f 64 65 20 53 45 4c 45 43 54 20 70 61 72   node SELECT par
3b00: 65 6e 74 2c 20 33 20 46 52 4f 4d 20 6c 65 61 66  ent, 3 FROM leaf
3b10: 22 0a 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20 63  ".} {1 {UNIQUE c
3b20: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
3b30: 3a 20 6e 6f 64 65 2e 6e 6f 64 65 69 64 7d 7d 0a  : node.nodeid}}.
3b40: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32  without_rowid3-2
3b50: 2d 74 65 73 74 20 36 38 20 30 20 22 43 4f 4d 4d  -test 68 0 "COMM
3b60: 49 54 22 20 20 20 20 20 20 20 20 20 20 20 46 4b  IT"           FK
3b70: 56 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  V.without_rowid3
3b80: 2d 32 2d 74 65 73 74 20 36 39 20 31 20 20 20 22  -2-test 69 1   "
3b90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65  INSERT INTO node
3ba0: 20 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 29   VALUES(1, NULL)
3bb0: 22 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  ".without_rowid3
3bc0: 2d 32 2d 74 65 73 74 20 37 30 20 30 20 20 20 22  -2-test 70 0   "
3bd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65  INSERT INTO node
3be0: 20 56 41 4c 55 45 53 28 32 2c 20 4e 55 4c 4c 29   VALUES(2, NULL)
3bf0: 22 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  ".without_rowid3
3c00: 2d 32 2d 74 65 73 74 20 37 31 20 30 20 22 43 4f  -2-test 71 0 "CO
3c10: 4d 4d 49 54 22 0a 0a 77 69 74 68 6f 75 74 5f 72  MMIT"..without_r
3c20: 6f 77 69 64 33 2d 32 2d 74 65 73 74 20 37 32 20  owid3-2-test 72 
3c30: 30 20 22 42 45 47 49 4e 22 0a 77 69 74 68 6f 75  0 "BEGIN".withou
3c40: 74 5f 72 6f 77 69 64 33 2d 32 2d 74 65 73 74 20  t_rowid3-2-test 
3c50: 37 33 20 31 20 20 20 22 44 45 4c 45 54 45 20 46  73 1   "DELETE F
3c60: 52 4f 4d 20 6e 6f 64 65 22 0a 77 69 74 68 6f 75  ROM node".withou
3c70: 74 5f 72 6f 77 69 64 33 2d 32 2d 74 65 73 74 20  t_rowid3-2-test 
3c80: 37 34 20 30 20 20 20 22 49 4e 53 45 52 54 20 49  74 0   "INSERT I
3c90: 4e 54 4f 20 6e 6f 64 65 28 6e 6f 64 65 69 64 29  NTO node(nodeid)
3ca0: 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
3cb0: 20 70 61 72 65 6e 74 20 46 52 4f 4d 20 6c 65 61   parent FROM lea
3cc0: 66 22 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  f".without_rowid
3cd0: 33 2d 32 2d 74 65 73 74 20 37 35 20 30 20 22 43  3-2-test 75 0 "C
3ce0: 4f 4d 4d 49 54 22 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  OMMIT"..#-------
3cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d30: 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 73 20  --.# Test cases 
3d40: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 33  without_rowid3-3
3d50: 2e 2a 20 74 65 73 74 20 74 68 61 74 20 61 20 70  .* test that a p
3d60: 72 6f 67 72 61 6d 20 74 68 61 74 20 65 78 65 63  rogram that exec
3d70: 75 74 65 73 20 66 6f 72 65 69 67 6e 20 6b 65 79  utes foreign key
3d80: 0a 23 20 61 63 74 69 6f 6e 73 20 28 43 41 53 43  .# actions (CASC
3d90: 41 44 45 2c 20 53 45 54 20 44 45 46 41 55 4c 54  ADE, SET DEFAULT
3da0: 2c 20 53 45 54 20 4e 55 4c 4c 20 65 74 63 2e 29  , SET NULL etc.)
3db0: 20 6f 72 20 74 65 73 74 73 20 46 4b 20 63 6f 6e   or tests FK con
3dc0: 73 74 72 61 69 6e 74 73 0a 23 20 6f 70 65 6e 73  straints.# opens
3dd0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
3de0: 6e 73 61 63 74 69 6f 6e 20 69 66 20 72 65 71 75  nsaction if requ
3df0: 69 72 65 64 2e 0a 23 0a 23 20 77 69 74 68 6f 75  ired..#.# withou
3e00: 74 5f 72 6f 77 69 64 33 2d 33 2e 31 2e 2a 3a 20  t_rowid3-3.1.*: 
3e10: 54 65 73 74 20 55 50 44 41 54 45 20 73 74 61 74  Test UPDATE stat
3e20: 65 6d 65 6e 74 73 2e 0a 23 20 77 69 74 68 6f 75  ements..# withou
3e30: 74 5f 72 6f 77 69 64 33 2d 33 2e 32 2e 2a 3a 20  t_rowid3-3.2.*: 
3e40: 54 65 73 74 20 44 45 4c 45 54 45 20 73 74 61 74  Test DELETE stat
3e50: 65 6d 65 6e 74 73 2e 0a 23 0a 64 72 6f 70 5f 61  ements..#.drop_a
3e60: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
3e70: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  t without_rowid3
3e80: 2d 33 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  -3.1.1 {.  execs
3e90: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
3ea0: 54 41 42 4c 45 20 61 62 28 61 20 50 52 49 4d 41  TABLE ab(a PRIMA
3eb0: 52 59 20 4b 45 59 2c 20 62 29 20 57 49 54 48 4f  RY KEY, b) WITHO
3ec0: 55 54 20 72 6f 77 69 64 3b 0a 20 20 20 20 43 52  UT rowid;.    CR
3ed0: 45 41 54 45 20 54 41 42 4c 45 20 63 64 28 0a 20  EATE TABLE cd(. 
3ee0: 20 20 20 20 20 63 20 50 52 49 4d 41 52 59 20 4b       c PRIMARY K
3ef0: 45 59 20 52 45 46 45 52 45 4e 43 45 53 20 61 62  EY REFERENCES ab
3f00: 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41   ON UPDATE CASCA
3f10: 44 45 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53  DE ON DELETE CAS
3f20: 43 41 44 45 2c 20 0a 20 20 20 20 20 20 64 0a 20  CADE, .      d. 
3f30: 20 20 20 29 20 57 49 54 48 4f 55 54 20 72 6f 77     ) WITHOUT row
3f40: 69 64 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  id;.    CREATE T
3f50: 41 42 4c 45 20 65 66 28 0a 20 20 20 20 20 20 65  ABLE ef(.      e
3f60: 20 52 45 46 45 52 45 4e 43 45 53 20 63 64 20 4f   REFERENCES cd O
3f70: 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45  N UPDATE CASCADE
3f80: 2c 20 0a 20 20 20 20 20 20 66 2c 20 43 48 45 43  , .      f, CHEC
3f90: 4b 20 28 65 21 3d 35 29 0a 20 20 20 20 29 3b 0a  K (e!=5).    );.
3fa0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
3fb0: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
3fc0: 33 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  3.1.2 {.  execsq
3fd0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
3fe0: 4e 54 4f 20 61 62 20 56 41 4c 55 45 53 28 31 2c  NTO ab VALUES(1,
3ff0: 20 27 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'b');.    INSER
4000: 54 20 49 4e 54 4f 20 63 64 20 56 41 4c 55 45 53  T INTO cd VALUES
4010: 28 31 2c 20 27 64 27 29 3b 0a 20 20 20 20 49 4e  (1, 'd');.    IN
4020: 53 45 52 54 20 49 4e 54 4f 20 65 66 20 56 41 4c  SERT INTO ef VAL
4030: 55 45 53 28 31 2c 20 27 65 27 29 3b 0a 20 20 7d  UES(1, 'e');.  }
4040: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 69  .} {}.do_test wi
4050: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 33 2e 31  thout_rowid3-3.1
4060: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
4070: 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20  { UPDATE ab SET 
4080: 61 20 3d 20 35 20 7d 0a 7d 20 7b 31 20 7b 43 48  a = 5 }.} {1 {CH
4090: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  ECK constraint f
40a0: 61 69 6c 65 64 3a 20 65 66 7d 7d 0a 64 6f 5f 74  ailed: ef}}.do_t
40b0: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
40c0: 64 33 2d 33 2e 31 2e 34 20 7b 0a 20 20 65 78 65  d3-3.1.4 {.  exe
40d0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
40e0: 46 52 4f 4d 20 61 62 20 7d 0a 7d 20 7b 31 20 62  FROM ab }.} {1 b
40f0: 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75  }.do_test withou
4100: 74 5f 72 6f 77 69 64 33 2d 33 2e 31 2e 34 20 7b  t_rowid3-3.1.4 {
4110: 0a 20 20 65 78 65 63 73 71 6c 20 42 45 47 49 4e  .  execsql BEGIN
4120: 3b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55  ;.  catchsql { U
4130: 50 44 41 54 45 20 61 62 20 53 45 54 20 61 20 3d  PDATE ab SET a =
4140: 20 35 20 7d 0a 7d 20 7b 31 20 7b 43 48 45 43 4b   5 }.} {1 {CHECK
4150: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
4160: 65 64 3a 20 65 66 7d 7d 0a 64 6f 5f 74 65 73 74  ed: ef}}.do_test
4170: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
4180: 33 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  3.1.5 {.  execsq
4190: 6c 20 43 4f 4d 4d 49 54 3b 0a 20 20 65 78 65 63  l COMMIT;.  exec
41a0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
41b0: 52 4f 4d 20 61 62 3b 20 53 45 4c 45 43 54 20 2a  ROM ab; SELECT *
41c0: 20 46 52 4f 4d 20 63 64 3b 20 53 45 4c 45 43 54   FROM cd; SELECT
41d0: 20 2a 20 46 52 4f 4d 20 65 66 20 7d 0a 7d 20 7b   * FROM ef }.} {
41e0: 31 20 62 20 31 20 64 20 31 20 65 7d 0a 0a 64 6f  1 b 1 d 1 e}..do
41f0: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
4200: 77 69 64 33 2d 33 2e 32 2e 31 20 7b 0a 20 20 65  wid3-3.2.1 {.  e
4210: 78 65 63 73 71 6c 20 42 45 47 49 4e 3b 0a 20 20  xecsql BEGIN;.  
4220: 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54  catchsql { DELET
4230: 45 20 46 52 4f 4d 20 61 62 20 7d 0a 7d 20 7b 31  E FROM ab }.} {1
4240: 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
4250: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
4260: 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75  }.do_test withou
4270: 74 5f 72 6f 77 69 64 33 2d 33 2e 32 2e 32 20 7b  t_rowid3-3.2.2 {
4280: 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49  .  execsql COMMI
4290: 54 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  T.  execsql { SE
42a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 3b 20  LECT * FROM ab; 
42b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 64  SELECT * FROM cd
42c0: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
42d0: 65 66 20 7d 0a 7d 20 7b 31 20 62 20 31 20 64 20  ef }.} {1 b 1 d 
42e0: 31 20 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  1 e}..#---------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4330: 0a 23 20 54 65 73 74 20 63 61 73 65 73 20 77 69  .# Test cases wi
4340: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 34 2e 2a  thout_rowid3-4.*
4350: 20 74 65 73 74 20 74 68 61 74 20 72 65 63 75 72   test that recur
4360: 73 69 76 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  sive foreign key
4370: 20 61 63 74 69 6f 6e 73 20 0a 23 20 28 69 2e 65   actions .# (i.e
4380: 2e 20 43 41 53 43 41 44 45 29 20 61 72 65 20 61  . CASCADE) are a
4390: 6c 6c 6f 77 65 64 20 65 76 65 6e 20 69 66 20 72  llowed even if r
43a0: 65 63 75 72 73 69 76 65 20 74 72 69 67 67 65 72  ecursive trigger
43b0: 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 2e 0a  s are disabled..
43c0: 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
43d0: 73 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75  s.do_test withou
43e0: 74 5f 72 6f 77 69 64 33 2d 34 2e 31 20 7b 0a 20  t_rowid3-4.1 {. 
43f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
4400: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 0a  REATE TABLE t1(.
4410: 20 20 20 20 20 20 6e 6f 64 65 20 50 52 49 4d 41        node PRIMA
4420: 52 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 70  RY KEY, .      p
4430: 61 72 65 6e 74 20 52 45 46 45 52 45 4e 43 45 53  arent REFERENCES
4440: 20 74 31 20 4f 4e 20 44 45 4c 45 54 45 20 43 41   t1 ON DELETE CA
4450: 53 43 41 44 45 0a 20 20 20 20 29 20 57 49 54 48  SCADE.    ) WITH
4460: 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20 20 20 43  OUT rowid;.    C
4470: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 6e  REATE TABLE t2(n
4480: 6f 64 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  ode PRIMARY KEY,
4490: 20 70 61 72 65 6e 74 29 20 57 49 54 48 4f 55 54   parent) WITHOUT
44a0: 20 72 6f 77 69 64 3b 0a 20 20 20 20 43 52 45 41   rowid;.    CREA
44b0: 54 45 20 54 52 49 47 47 45 52 20 74 32 74 20 41  TE TRIGGER t2t A
44c0: 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 74  FTER DELETE ON t
44d0: 32 20 42 45 47 49 4e 0a 20 20 20 20 20 20 44 45  2 BEGIN.      DE
44e0: 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45  LETE FROM t2 WHE
44f0: 52 45 20 70 61 72 65 6e 74 20 3d 20 6f 6c 64 2e  RE parent = old.
4500: 6e 6f 64 65 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  node;.    END;. 
4510: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4520: 31 20 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c  1 VALUES(1, NULL
4530: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
4540: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20  TO t1 VALUES(2, 
4550: 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1);.    INSERT I
4560: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
4570: 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   1);.    INSERT 
4580: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34  INTO t1 VALUES(4
4590: 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 2);.    INSERT
45a0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
45b0: 35 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  5, 2);.    INSER
45c0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
45d0: 28 36 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53 45  (6, 3);.    INSE
45e0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
45f0: 53 28 37 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53  S(7, 3);.    INS
4600: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
4610: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
4620: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77  }.} {}.do_test w
4630: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 34 2e  ithout_rowid3-4.
4640: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
4650: 50 52 41 47 4d 41 20 72 65 63 75 72 73 69 76 65  PRAGMA recursive
4660: 5f 74 72 69 67 67 65 72 73 20 3d 20 6f 66 66 20  _triggers = off 
4670: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  }.  execsql { . 
4680: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
4690: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
46a0: 48 45 52 45 20 6e 6f 64 65 20 3d 20 31 3b 0a 20  HERE node = 1;. 
46b0: 20 20 20 20 20 53 45 4c 45 43 54 20 6e 6f 64 65       SELECT node
46c0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
46d0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  {}.do_test witho
46e0: 75 74 5f 72 6f 77 69 64 33 2d 34 2e 33 20 7b 0a  ut_rowid3-4.3 {.
46f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
4700: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
4710: 32 20 57 48 45 52 45 20 6e 6f 64 65 20 3d 20 31  2 WHERE node = 1
4720: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 6e  ;.      SELECT n
4730: 6f 64 65 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  ode FROM t2;.   
4740: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d   ROLLBACK;.  }.}
4750: 20 7b 34 20 35 20 36 20 37 7d 0a 64 6f 5f 74 65   {4 5 6 7}.do_te
4760: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
4770: 33 2d 34 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  3-4.4 {.  execsq
4780: 6c 20 7b 20 50 52 41 47 4d 41 20 72 65 63 75 72  l { PRAGMA recur
4790: 73 69 76 65 5f 74 72 69 67 67 65 72 73 20 3d 20  sive_triggers = 
47a0: 6f 6e 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  on }.  execsql {
47b0: 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20   .    BEGIN;.   
47c0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
47d0: 31 20 57 48 45 52 45 20 6e 6f 64 65 20 3d 20 31  1 WHERE node = 1
47e0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 6e  ;.      SELECT n
47f0: 6f 64 65 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  ode FROM t1;.  }
4800: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 69  .} {}.do_test wi
4810: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 34 2e 33  thout_rowid3-4.3
4820: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
4830: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
4840: 4d 20 74 32 20 57 48 45 52 45 20 6e 6f 64 65 20  M t2 WHERE node 
4850: 3d 20 31 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  = 1;.      SELEC
4860: 54 20 6e 6f 64 65 20 46 52 4f 4d 20 74 32 3b 0a  T node FROM t2;.
4870: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
4880: 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  }.} {}..#-------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48d0: 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 73 20  --.# Test cases 
48e0: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 35  without_rowid3-5
48f0: 2e 2a 20 76 65 72 69 66 79 20 74 68 61 74 20 74  .* verify that t
4900: 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  he incremental b
4910: 6c 6f 62 20 41 50 49 20 6d 61 79 20 6e 6f 74 0a  lob API may not.
4920: 23 20 77 72 69 74 65 20 74 6f 20 61 20 66 6f 72  # write to a for
4930: 65 69 67 6e 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  eign key column 
4940: 77 68 69 6c 65 20 66 6f 72 65 69 67 6e 2d 6b 65  while foreign-ke
4950: 79 73 20 61 72 65 20 65 6e 61 62 6c 65 64 2e 0a  ys are enabled..
4960: 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
4970: 73 0a 69 66 63 61 70 61 62 6c 65 20 69 6e 63 72  s.ifcapable incr
4980: 62 6c 6f 62 20 7b 0a 20 20 64 6f 5f 74 65 73 74  blob {.  do_test
4990: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
49a0: 35 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71  5.1 {.    execsq
49b0: 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45  l {.      CREATE
49c0: 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d   TABLE t1(a PRIM
49d0: 41 52 59 20 4b 45 59 2c 20 62 29 20 57 49 54 48  ARY KEY, b) WITH
49e0: 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20 20 20 20  OUT rowid;.     
49f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
4a00: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
4a10: 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 28  b REFERENCES t1(
4a20: 61 29 29 20 57 49 54 48 4f 55 54 20 72 6f 77 69  a)) WITHOUT rowi
4a30: 64 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  d;.      INSERT 
4a40: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
4a50: 68 65 6c 6c 6f 27 2c 20 27 77 6f 72 6c 64 27 29  hello', 'world')
4a60: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
4a70: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 6b  NTO t2 VALUES('k
4a80: 65 79 27 2c 20 27 68 65 6c 6c 6f 27 29 3b 0a 20  ey', 'hello');. 
4a90: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f     }.  } {}.  do
4aa0: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
4ab0: 77 69 64 33 2d 35 2e 32 20 7b 0a 20 20 20 20 73  wid3-5.2 {.    s
4ac0: 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 20 73  et rc [catch { s
4ad0: 65 74 20 66 64 20 5b 64 62 20 69 6e 63 72 62 6c  et fd [db incrbl
4ae0: 6f 62 20 74 32 20 62 20 31 5d 20 7d 20 6d 73 67  ob t2 b 1] } msg
4af0: 5d 0a 20 20 20 20 6c 69 73 74 20 24 72 63 20 24  ].    list $rc $
4b00: 6d 73 67 0a 20 20 7d 20 7b 31 20 7b 63 61 6e 6e  msg.  } {1 {cann
4b10: 6f 74 20 6f 70 65 6e 20 74 61 62 6c 65 20 77 69  ot open table wi
4b20: 74 68 6f 75 74 20 72 6f 77 69 64 3a 20 74 32 7d  thout rowid: t2}
4b30: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68  }.  do_test with
4b40: 6f 75 74 5f 72 6f 77 69 64 33 2d 35 2e 35 20 7b  out_rowid3-5.5 {
4b50: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
4b60: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
4b70: 79 73 20 3d 20 6f 6e 20 7d 0a 20 20 7d 20 7b 7d  ys = on }.  } {}
4b80: 0a 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  .}..drop_all_tab
4b90: 6c 65 73 0a 69 66 63 61 70 61 62 6c 65 20 76 61  les.ifcapable va
4ba0: 63 75 75 6d 20 7b 0a 20 20 64 6f 5f 74 65 73 74  cuum {.  do_test
4bb0: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
4bc0: 36 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71  6.1 {.    execsq
4bd0: 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45  l {.      CREATE
4be0: 20 54 41 42 4c 45 20 74 31 28 61 20 52 45 46 45   TABLE t1(a REFE
4bf0: 52 45 4e 43 45 53 20 74 32 28 63 29 2c 20 62 29  RENCES t2(c), b)
4c00: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
4c10: 41 42 4c 45 20 74 32 28 63 20 55 4e 49 51 55 45  ABLE t2(c UNIQUE
4c20: 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  , b);.      INSE
4c30: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
4c40: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 49  S(1, 2);.      I
4c50: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4c60: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
4c70: 20 20 56 41 43 55 55 4d 3b 0a 20 20 20 20 7d 0a    VACUUM;.    }.
4c80: 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d    } {}.}..#-----
4c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cd0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
4ce0: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
4cf0: 74 6f 20 75 73 65 20 61 6e 20 49 4e 54 20 50 52  to use an INT PR
4d00: 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68 65  IMARY KEY as the
4d10: 20 63 68 69 6c 64 20 6b 65 79 0a 23 20 6f 66 20   child key.# of 
4d20: 61 20 66 6f 72 65 69 67 6e 20 63 6f 6e 73 74 72  a foreign constr
4d30: 61 69 6e 74 2e 0a 23 20 0a 64 72 6f 70 5f 61 6c  aint..# .drop_al
4d40: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
4d50: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
4d60: 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.1 {.  execsql 
4d70: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
4d80: 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20  LE t1(a PRIMARY 
4d90: 4b 45 59 2c 20 62 29 20 57 49 54 48 4f 55 54 20  KEY, b) WITHOUT 
4da0: 72 6f 77 69 64 3b 0a 20 20 20 20 43 52 45 41 54  rowid;.    CREAT
4db0: 45 20 54 41 42 4c 45 20 74 32 28 63 20 49 4e 54  E TABLE t2(c INT
4dc0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 52 45 46   PRIMARY KEY REF
4dd0: 45 52 45 4e 43 45 53 20 74 31 2c 20 62 29 20 57  ERENCES t1, b) W
4de0: 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20  ITHOUT rowid;.  
4df0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77  }.} {}.do_test w
4e00: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 37 2e  ithout_rowid3-7.
4e10: 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  2 {.  catchsql {
4e20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
4e30: 56 41 4c 55 45 53 28 31 2c 20 27 41 27 29 3b 20  VALUES(1, 'A'); 
4e40: 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20  }.} {1 {FOREIGN 
4e50: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
4e60: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
4e70: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 37  without_rowid3-7
4e80: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
4e90: 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54   .    INSERT INT
4ea0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
4eb0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
4ec0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20  TO t1 VALUES(2, 
4ed0: 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  3);.    INSERT I
4ee0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c  NTO t2 VALUES(1,
4ef0: 20 27 41 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a   'A');.  }.} {}.
4f00: 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
4f10: 72 6f 77 69 64 33 2d 37 2e 34 20 7b 0a 20 20 65  rowid3-7.4 {.  e
4f20: 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20  xecsql { UPDATE 
4f30: 74 32 20 53 45 54 20 63 20 3d 20 32 20 7d 0a 7d  t2 SET c = 2 }.}
4f40: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68   {}.do_test with
4f50: 6f 75 74 5f 72 6f 77 69 64 33 2d 37 2e 35 20 7b  out_rowid3-7.5 {
4f60: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50  .  catchsql { UP
4f70: 44 41 54 45 20 74 32 20 53 45 54 20 63 20 3d 20  DATE t2 SET c = 
4f80: 33 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47  3 }.} {1 {FOREIG
4f90: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
4fa0: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
4fb0: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  t without_rowid3
4fc0: 2d 37 2e 36 20 7b 0a 20 20 63 61 74 63 68 73 71  -7.6 {.  catchsq
4fd0: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
4fe0: 74 31 20 57 48 45 52 45 20 61 20 3d 20 32 20 7d  t1 WHERE a = 2 }
4ff0: 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b  .} {1 {FOREIGN K
5000: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
5010: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 77  iled}}.do_test w
5020: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 37 2e  ithout_rowid3-7.
5030: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  7 {.  execsql { 
5040: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
5050: 48 45 52 45 20 61 20 3d 20 31 20 7d 0a 7d 20 7b  HERE a = 1 }.} {
5060: 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75  }.do_test withou
5070: 74 5f 72 6f 77 69 64 33 2d 37 2e 38 20 7b 0a 20  t_rowid3-7.8 {. 
5080: 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41   catchsql { UPDA
5090: 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 33 20  TE t1 SET a = 3 
50a0: 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20  }.} {1 {FOREIGN 
50b0: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
50c0: 61 69 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ailed}}..#------
50d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5110: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
5120: 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
5130: 6c 65 20 74 6f 20 65 6e 61 62 6c 65 2f 64 69 73  le to enable/dis
5140: 61 62 6c 65 20 46 4b 20 73 75 70 70 6f 72 74 20  able FK support 
5150: 77 68 69 6c 65 20 61 0a 23 20 74 72 61 6e 73 61  while a.# transa
5160: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 23  ction is open..#
5170: 20 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65   .drop_all_table
5180: 73 0a 70 72 6f 63 20 77 69 74 68 6f 75 74 5f 72  s.proc without_r
5190: 6f 77 69 64 33 2d 38 2d 74 65 73 74 20 7b 74 6e  owid3-8-test {tn
51a0: 20 7a 53 71 6c 20 76 61 6c 75 65 7d 20 7b 0a 20   zSql value} {. 
51b0: 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74   do_test without
51c0: 5f 72 6f 77 69 64 33 2d 32 2e 38 2e 24 74 6e 2e  _rowid3-2.8.$tn.
51d0: 31 20 5b 6c 69 73 74 20 65 78 65 63 73 71 6c 20  1 [list execsql 
51e0: 24 7a 53 71 6c 5d 20 7b 7d 0a 20 20 64 6f 5f 74  $zSql] {}.  do_t
51f0: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
5200: 64 33 2d 32 2e 38 2e 24 74 6e 2e 32 20 7b 20 65  d3-2.8.$tn.2 { e
5210: 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 66  xecsql "PRAGMA f
5220: 6f 72 65 69 67 6e 5f 6b 65 79 73 22 20 7d 20 24  oreign_keys" } $
5230: 76 61 6c 75 65 0a 7d 0a 77 69 74 68 6f 75 74 5f  value.}.without_
5240: 72 6f 77 69 64 33 2d 38 2d 74 65 73 74 20 20 31  rowid3-8-test  1
5250: 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67   { PRAGMA foreig
5260: 6e 5f 6b 65 79 73 20 3d 20 30 20 20 20 20 20 7d  n_keys = 0     }
5270: 20 30 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64   0.without_rowid
5280: 33 2d 38 2d 74 65 73 74 20 20 32 20 7b 20 50 52  3-8-test  2 { PR
5290: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
52a0: 73 20 3d 20 31 20 20 20 20 20 7d 20 31 0a 77 69  s = 1     } 1.wi
52b0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 38 2d 74  thout_rowid3-8-t
52c0: 65 73 74 20 20 33 20 7b 20 42 45 47 49 4e 20 20  est  3 { BEGIN  
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52e0: 20 20 20 20 20 7d 20 31 0a 77 69 74 68 6f 75 74       } 1.without
52f0: 5f 72 6f 77 69 64 33 2d 38 2d 74 65 73 74 20 20  _rowid3-8-test  
5300: 34 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69  4 { PRAGMA forei
5310: 67 6e 5f 6b 65 79 73 20 3d 20 30 20 20 20 20 20  gn_keys = 0     
5320: 7d 20 31 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69  } 1.without_rowi
5330: 64 33 2d 38 2d 74 65 73 74 20 20 35 20 7b 20 43  d3-8-test  5 { C
5340: 4f 4d 4d 49 54 20 20 20 20 20 20 20 20 20 20 20  OMMIT           
5350: 20 20 20 20 20 20 20 20 20 20 20 7d 20 31 0a 77             } 1.w
5360: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 38 2d  ithout_rowid3-8-
5370: 74 65 73 74 20 20 36 20 7b 20 50 52 41 47 4d 41  test  6 { PRAGMA
5380: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
5390: 30 20 20 20 20 20 7d 20 30 0a 77 69 74 68 6f 75  0     } 0.withou
53a0: 74 5f 72 6f 77 69 64 33 2d 38 2d 74 65 73 74 20  t_rowid3-8-test 
53b0: 20 37 20 7b 20 42 45 47 49 4e 20 20 20 20 20 20   7 { BEGIN      
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53d0: 20 7d 20 30 0a 77 69 74 68 6f 75 74 5f 72 6f 77   } 0.without_row
53e0: 69 64 33 2d 38 2d 74 65 73 74 20 20 38 20 7b 20  id3-8-test  8 { 
53f0: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
5400: 65 79 73 20 3d 20 31 20 20 20 20 20 7d 20 30 0a  eys = 1     } 0.
5410: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 38  without_rowid3-8
5420: 2d 74 65 73 74 20 20 39 20 7b 20 43 4f 4d 4d 49  -test  9 { COMMI
5430: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
5440: 20 20 20 20 20 20 20 7d 20 30 0a 77 69 74 68 6f         } 0.witho
5450: 75 74 5f 72 6f 77 69 64 33 2d 38 2d 74 65 73 74  ut_rowid3-8-test
5460: 20 31 30 20 7b 20 50 52 41 47 4d 41 20 66 6f 72   10 { PRAGMA for
5470: 65 69 67 6e 5f 6b 65 79 73 20 3d 20 31 20 20 20  eign_keys = 1   
5480: 20 20 7d 20 31 0a 77 69 74 68 6f 75 74 5f 72 6f    } 1.without_ro
5490: 77 69 64 33 2d 38 2d 74 65 73 74 20 31 31 20 7b  wid3-8-test 11 {
54a0: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
54b0: 6b 65 79 73 20 3d 20 6f 66 66 20 20 20 7d 20 30  keys = off   } 0
54c0: 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d  .without_rowid3-
54d0: 38 2d 74 65 73 74 20 31 32 20 7b 20 50 52 41 47  8-test 12 { PRAG
54e0: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
54f0: 3d 20 6f 6e 20 20 20 20 7d 20 31 0a 77 69 74 68  = on    } 1.with
5500: 6f 75 74 5f 72 6f 77 69 64 33 2d 38 2d 74 65 73  out_rowid3-8-tes
5510: 74 20 31 33 20 7b 20 50 52 41 47 4d 41 20 66 6f  t 13 { PRAGMA fo
5520: 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 6e 6f 20  reign_keys = no 
5530: 20 20 20 7d 20 30 0a 77 69 74 68 6f 75 74 5f 72     } 0.without_r
5540: 6f 77 69 64 33 2d 38 2d 74 65 73 74 20 31 34 20  owid3-8-test 14 
5550: 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e  { PRAGMA foreign
5560: 5f 6b 65 79 73 20 3d 20 79 65 73 20 20 20 7d 20  _keys = yes   } 
5570: 31 0a 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  1.without_rowid3
5580: 2d 38 2d 74 65 73 74 20 31 35 20 7b 20 50 52 41  -8-test 15 { PRA
5590: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
55a0: 20 3d 20 66 61 6c 73 65 20 7d 20 30 0a 77 69 74   = false } 0.wit
55b0: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 38 2d 74 65  hout_rowid3-8-te
55c0: 73 74 20 31 36 20 7b 20 50 52 41 47 4d 41 20 66  st 16 { PRAGMA f
55d0: 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 74 72  oreign_keys = tr
55e0: 75 65 20 20 7d 20 31 0a 0a 23 2d 2d 2d 2d 2d 2d  ue  } 1..#------
55f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5630: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
5640: 69 6e 67 20 74 65 73 74 73 2c 20 77 69 74 68 6f  ing tests, witho
5650: 75 74 5f 72 6f 77 69 64 33 2d 39 2e 2a 2c 20 74  ut_rowid3-9.*, t
5660: 65 73 74 20 53 45 54 20 44 45 46 41 55 4c 54 20  est SET DEFAULT 
5670: 61 63 74 69 6f 6e 73 2e 0a 23 0a 64 72 6f 70 5f  actions..#.drop_
5680: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
5690: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
56a0: 33 2d 39 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63  3-9.1.1 {.  exec
56b0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
56c0: 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 20   TABLE t1(a INT 
56d0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 20  PRIMARY KEY, b) 
56e0: 57 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a 20  WITHOUT rowid;. 
56f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5700: 74 32 28 0a 20 20 20 20 20 20 63 20 49 4e 54 20  t2(.      c INT 
5710: 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20  PRIMARY KEY,.   
5720: 20 20 20 64 20 49 4e 54 45 47 45 52 20 44 45 46     d INTEGER DEF
5730: 41 55 4c 54 20 31 20 52 45 46 45 52 45 4e 43 45  AULT 1 REFERENCE
5740: 53 20 74 31 20 4f 4e 20 44 45 4c 45 54 45 20 53  S t1 ON DELETE S
5750: 45 54 20 44 45 46 41 55 4c 54 0a 20 20 20 20 29  ET DEFAULT.    )
5760: 20 57 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a   WITHOUT rowid;.
5770: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
5780: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  t1;.  }.} {}.do_
5790: 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77  test without_row
57a0: 69 64 33 2d 39 2e 31 2e 32 20 7b 0a 20 20 65 78  id3-9.1.2 {.  ex
57b0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
57c0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
57d0: 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20  S(1, 'one');.   
57e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
57f0: 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27 29  VALUES(2, 'two')
5800: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5810: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32  O t2 VALUES(1, 2
5820: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  );.    SELECT * 
5830: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 44 45 4c  FROM t2;.    DEL
5840: 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ETE FROM t1 WHER
5850: 45 20 61 20 3d 20 32 3b 0a 20 20 20 20 53 45 4c  E a = 2;.    SEL
5860: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
5870: 20 7d 0a 7d 20 7b 31 20 32 20 31 20 31 7d 0a 64   }.} {1 2 1 1}.d
5880: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
5890: 6f 77 69 64 33 2d 39 2e 31 2e 33 20 7b 0a 20 20  owid3-9.1.3 {.  
58a0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
58b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
58c0: 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20  UES(2, 'two');. 
58d0: 20 20 20 55 50 44 41 54 45 20 74 32 20 53 45 54     UPDATE t2 SET
58e0: 20 64 20 3d 20 32 3b 0a 20 20 20 20 44 45 4c 45   d = 2;.    DELE
58f0: 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  TE FROM t1 WHERE
5900: 20 61 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45   a = 1;.    SELE
5910: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
5920: 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73  }.} {1 2}.do_tes
5930: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  t without_rowid3
5940: 2d 39 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73  -9.1.4 {.  execs
5950: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
5960: 4f 4d 20 74 31 20 7d 0a 7d 20 7b 32 20 74 77 6f  OM t1 }.} {2 two
5970: 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75  }.do_test withou
5980: 74 5f 72 6f 77 69 64 33 2d 39 2e 31 2e 35 20 7b  t_rowid3-9.1.5 {
5990: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45  .  catchsql { DE
59a0: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  LETE FROM t1 }.}
59b0: 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59   {1 {FOREIGN KEY
59c0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
59d0: 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 69  ed}}..do_test wi
59e0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 39 2e 32  thout_rowid3-9.2
59f0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
5a00: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5a10: 45 20 70 70 28 61 2c 20 62 2c 20 63 2c 20 50 52  E pp(a, b, c, PR
5a20: 49 4d 41 52 59 20 4b 45 59 28 62 2c 20 63 29 29  IMARY KEY(b, c))
5a30: 20 57 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a   WITHOUT rowid;.
5a40: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
5a50: 20 63 63 28 64 20 44 45 46 41 55 4c 54 20 33 2c   cc(d DEFAULT 3,
5a60: 20 65 20 44 45 46 41 55 4c 54 20 31 2c 20 66 20   e DEFAULT 1, f 
5a70: 44 45 46 41 55 4c 54 20 32 2c 0a 20 20 20 20 20  DEFAULT 2,.     
5a80: 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 66     FOREIGN KEY(f
5a90: 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20  , d) REFERENCES 
5aa0: 70 70 20 0a 20 20 20 20 20 20 20 20 4f 4e 20 55  pp .        ON U
5ab0: 50 44 41 54 45 20 53 45 54 20 44 45 46 41 55 4c  PDATE SET DEFAUL
5ac0: 54 20 0a 20 20 20 20 20 20 20 20 4f 4e 20 44 45  T .        ON DE
5ad0: 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 0a 20 20  LETE SET NULL.  
5ae0: 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20    );.    INSERT 
5af0: 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53 28 31  INTO pp VALUES(1
5b00: 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53  , 2, 3);.    INS
5b10: 45 52 54 20 49 4e 54 4f 20 70 70 20 56 41 4c 55  ERT INTO pp VALU
5b20: 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a 20 20 20  ES(4, 5, 6);.   
5b30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 70 20   INSERT INTO pp 
5b40: 56 41 4c 55 45 53 28 37 2c 20 38 2c 20 39 29 3b  VALUES(7, 8, 9);
5b50: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
5b60: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  t without_rowid3
5b70: 2d 39 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73  -9.2.2 {.  execs
5b80: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
5b90: 49 4e 54 4f 20 63 63 20 56 41 4c 55 45 53 28 36  INTO cc VALUES(6
5ba0: 2c 20 27 41 27 2c 20 35 29 3b 0a 20 20 20 20 49  , 'A', 5);.    I
5bb0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56 41  NSERT INTO cc VA
5bc0: 4c 55 45 53 28 36 2c 20 27 42 27 2c 20 35 29 3b  LUES(6, 'B', 5);
5bd0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5be0: 20 63 63 20 56 41 4c 55 45 53 28 39 2c 20 27 41   cc VALUES(9, 'A
5bf0: 27 2c 20 38 29 3b 0a 20 20 20 20 49 4e 53 45 52  ', 8);.    INSER
5c00: 54 20 49 4e 54 4f 20 63 63 20 56 41 4c 55 45 53  T INTO cc VALUES
5c10: 28 39 2c 20 27 42 27 2c 20 38 29 3b 0a 20 20 20  (9, 'B', 8);.   
5c20: 20 55 50 44 41 54 45 20 70 70 20 53 45 54 20 62   UPDATE pp SET b
5c30: 20 3d 20 31 20 57 48 45 52 45 20 61 20 3d 20 37   = 1 WHERE a = 7
5c40: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
5c50: 52 4f 4d 20 63 63 3b 0a 20 20 7d 0a 7d 20 7b 36  ROM cc;.  }.} {6
5c60: 20 41 20 35 20 36 20 42 20 35 20 33 20 41 20 32   A 5 6 B 5 3 A 2
5c70: 20 33 20 42 20 32 7d 0a 64 6f 5f 74 65 73 74 20   3 B 2}.do_test 
5c80: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 39  without_rowid3-9
5c90: 2e 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .2.3 {.  execsql
5ca0: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
5cb0: 4f 4d 20 70 70 20 57 48 45 52 45 20 61 20 3d 20  OM pp WHERE a = 
5cc0: 34 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  4;.    SELECT * 
5cd0: 46 52 4f 4d 20 63 63 3b 0a 20 20 7d 0a 7d 20 7b  FROM cc;.  }.} {
5ce0: 7b 7d 20 41 20 7b 7d 20 7b 7d 20 42 20 7b 7d 20  {} A {} {} B {} 
5cf0: 33 20 41 20 32 20 33 20 42 20 32 7d 0a 0a 23 2d  3 A 2 3 B 2}..#-
5d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
5d50: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c 20  ollowing tests, 
5d60: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31  without_rowid3-1
5d70: 30 2e 2a 2c 20 74 65 73 74 20 22 66 6f 72 65 69  0.*, test "forei
5d80: 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 22  gn key mismatch"
5d90: 20 61 6e 64 20 0a 23 20 6f 74 68 65 72 20 65 72   and .# other er
5da0: 72 6f 72 73 2e 0a 23 0a 73 65 74 20 74 6e 20 30  rors..#.set tn 0
5db0: 0a 66 6f 72 65 61 63 68 20 7a 53 71 6c 20 5b 6c  .foreach zSql [l
5dc0: 69 73 74 20 7b 0a 20 20 43 52 45 41 54 45 20 54  ist {.  CREATE T
5dd0: 41 42 4c 45 20 70 28 61 20 50 52 49 4d 41 52 59  ABLE p(a PRIMARY
5de0: 20 4b 45 59 2c 20 62 29 20 57 49 54 48 4f 55 54   KEY, b) WITHOUT
5df0: 20 72 6f 77 69 64 3b 0a 20 20 43 52 45 41 54 45   rowid;.  CREATE
5e00: 20 54 41 42 4c 45 20 63 28 78 20 52 45 46 45 52   TABLE c(x REFER
5e10: 45 4e 43 45 53 20 70 28 63 29 29 3b 0a 7d 20 7b  ENCES p(c));.} {
5e20: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
5e30: 63 28 78 20 52 45 46 45 52 45 4e 43 45 53 20 76  c(x REFERENCES v
5e40: 28 79 29 29 3b 0a 20 20 43 52 45 41 54 45 20 56  (y));.  CREATE V
5e50: 49 45 57 20 76 20 41 53 20 53 45 4c 45 43 54 20  IEW v AS SELECT 
5e60: 78 20 41 53 20 79 20 46 52 4f 4d 20 63 3b 0a 7d  x AS y FROM c;.}
5e70: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
5e80: 45 20 70 28 61 2c 20 62 2c 20 50 52 49 4d 41 52  E p(a, b, PRIMAR
5e90: 59 20 4b 45 59 28 61 2c 20 62 29 29 20 57 49 54  Y KEY(a, b)) WIT
5ea0: 48 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20 43 52  HOUT rowid;.  CR
5eb0: 45 41 54 45 20 54 41 42 4c 45 20 63 28 78 20 52  EATE TABLE c(x R
5ec0: 45 46 45 52 45 4e 43 45 53 20 70 29 3b 0a 7d 20  EFERENCES p);.} 
5ed0: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
5ee0: 20 70 28 61 20 43 4f 4c 4c 41 54 45 20 62 69 6e   p(a COLLATE bin
5ef0: 61 72 79 2c 20 62 29 3b 0a 20 20 43 52 45 41 54  ary, b);.  CREAT
5f00: 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 69  E UNIQUE INDEX i
5f10: 20 4f 4e 20 70 28 61 20 43 4f 4c 4c 41 54 45 20   ON p(a COLLATE 
5f20: 6e 6f 63 61 73 65 29 3b 0a 20 20 43 52 45 41 54  nocase);.  CREAT
5f30: 45 20 54 41 42 4c 45 20 63 28 78 20 52 45 46 45  E TABLE c(x REFE
5f40: 52 45 4e 43 45 53 20 70 28 61 29 29 3b 0a 7d 5d  RENCES p(a));.}]
5f50: 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61   {.  drop_all_ta
5f60: 62 6c 65 73 0a 20 20 64 6f 5f 74 65 73 74 20 77  bles.  do_test w
5f70: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 30  ithout_rowid3-10
5f80: 2e 31 2e 5b 69 6e 63 72 20 74 6e 5d 20 7b 0a 20  .1.[incr tn] {. 
5f90: 20 20 20 65 78 65 63 73 71 6c 20 24 7a 53 71 6c     execsql $zSql
5fa0: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
5fb0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 44 45  INSERT INTO c DE
5fc0: 46 41 55 4c 54 20 56 41 4c 55 45 53 20 7d 0a 20  FAULT VALUES }. 
5fd0: 20 7d 20 7b 2f 31 20 7b 66 6f 72 65 69 67 6e 20   } {/1 {foreign 
5fe0: 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22  key mismatch - "
5ff0: 63 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22  c" referencing "
6000: 2e 22 7d 2f 7d 0a 7d 0a 0a 23 20 22 72 6f 77 69  ."}/}.}..# "rowi
6010: 64 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  d" cannot be use
6020: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 63  d as part of a c
6030: 68 69 6c 64 20 6f 72 20 70 61 72 65 6e 74 20 6b  hild or parent k
6040: 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 20 0a 23  ey definition .#
6050: 20 75 6e 6c 65 73 73 20 69 74 20 68 61 70 70 65   unless it happe
6060: 6e 73 20 74 6f 20 62 65 20 74 68 65 20 6e 61 6d  ns to be the nam
6070: 65 20 6f 66 20 61 6e 20 65 78 70 6c 69 63 69 74  e of an explicit
6080: 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75  ly declared colu
6090: 6d 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 69  mn..#.do_test wi
60a0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 30 2e  thout_rowid3-10.
60b0: 32 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c  2.1 {.  drop_all
60c0: 5f 74 61 62 6c 65 73 0a 20 20 63 61 74 63 68 73  _tables.  catchs
60d0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
60e0: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
60f0: 52 59 20 4b 45 59 2c 20 62 29 20 57 49 54 48 4f  RY KEY, b) WITHO
6100: 55 54 20 72 6f 77 69 64 3b 0a 20 20 20 20 43 52  UT rowid;.    CR
6110: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 63 2c  EATE TABLE t2(c,
6120: 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   d, FOREIGN KEY(
6130: 72 6f 77 69 64 29 20 52 45 46 45 52 45 4e 43 45  rowid) REFERENCE
6140: 53 20 74 31 28 61 29 29 3b 0a 20 20 7d 0a 7d 20  S t1(a));.  }.} 
6150: 7b 31 20 7b 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75  {1 {unknown colu
6160: 6d 6e 20 22 72 6f 77 69 64 22 20 69 6e 20 66 6f  mn "rowid" in fo
6170: 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
6180: 74 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 77  tion}}.do_test w
6190: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 30  ithout_rowid3-10
61a0: 2e 32 2e 32 20 7b 0a 20 20 64 72 6f 70 5f 61 6c  .2.2 {.  drop_al
61b0: 6c 5f 74 61 62 6c 65 73 0a 20 20 63 61 74 63 68  l_tables.  catch
61c0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
61d0: 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d   TABLE t1(a PRIM
61e0: 41 52 59 20 4b 45 59 2c 20 62 29 20 57 49 54 48  ARY KEY, b) WITH
61f0: 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20 20 20 43  OUT rowid;.    C
6200: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 72  REATE TABLE t2(r
6210: 6f 77 69 64 2c 20 64 2c 20 46 4f 52 45 49 47 4e  owid, d, FOREIGN
6220: 20 4b 45 59 28 72 6f 77 69 64 29 20 52 45 46 45   KEY(rowid) REFE
6230: 52 45 4e 43 45 53 20 74 31 28 61 29 29 3b 0a 20  RENCES t1(a));. 
6240: 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74   }.} {0 {}}.do_t
6250: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
6260: 64 33 2d 31 30 2e 32 2e 31 20 7b 0a 20 20 64 72  d3-10.2.1 {.  dr
6270: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20  op_all_tables.  
6280: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43  catchsql {.    C
6290: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
62a0: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
62b0: 20 54 41 42 4c 45 20 74 32 28 63 2c 20 64 2c 20   TABLE t2(c, d, 
62c0: 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 29 20 52  FOREIGN KEY(c) R
62d0: 45 46 45 52 45 4e 43 45 53 20 74 31 28 72 6f 77  EFERENCES t1(row
62e0: 69 64 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  id));.    INSERT
62f0: 20 49 4e 54 4f 20 74 31 28 72 6f 77 69 64 2c 20   INTO t1(rowid, 
6300: 61 2c 20 62 29 20 56 41 4c 55 45 53 28 31 2c 20  a, b) VALUES(1, 
6310: 31 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52  1, 1);.    INSER
6320: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
6330: 28 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 20 7b 31  (1, 1);.  }.} {1
6340: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   {foreign key mi
6350: 73 6d 61 74 63 68 20 2d 20 22 74 32 22 20 72 65  smatch - "t2" re
6360: 66 65 72 65 6e 63 69 6e 67 20 22 74 31 22 7d 7d  ferencing "t1"}}
6370: 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74  .do_test without
6380: 5f 72 6f 77 69 64 33 2d 31 30 2e 32 2e 32 20 7b  _rowid3-10.2.2 {
6390: 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
63a0: 65 73 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  es.  catchsql {.
63b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
63c0: 20 74 31 28 72 6f 77 69 64 20 50 52 49 4d 41 52   t1(rowid PRIMAR
63d0: 59 20 4b 45 59 2c 20 62 29 20 57 49 54 48 4f 55  Y KEY, b) WITHOU
63e0: 54 20 72 6f 77 69 64 3b 0a 20 20 20 20 43 52 45  T rowid;.    CRE
63f0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 63 2c 20  ATE TABLE t2(c, 
6400: 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63  d, FOREIGN KEY(c
6410: 29 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 28  ) REFERENCES t1(
6420: 72 6f 77 69 64 29 29 3b 0a 20 20 20 20 49 4e 53  rowid));.    INS
6430: 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77 69  ERT INTO t1(rowi
6440: 64 2c 20 62 29 20 56 41 4c 55 45 53 28 31 2c 20  d, b) VALUES(1, 
6450: 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1);.    INSERT I
6460: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c  NTO t2 VALUES(1,
6470: 20 31 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d   1);.  }.} {0 {}
6480: 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
64d0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
64e0: 65 73 74 73 2c 20 77 69 74 68 6f 75 74 5f 72 6f  ests, without_ro
64f0: 77 69 64 33 2d 31 31 2e 2a 2c 20 74 65 73 74 20  wid3-11.*, test 
6500: 43 41 53 43 41 44 45 20 61 63 74 69 6f 6e 73 2e  CASCADE actions.
6510: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
6520: 65 73 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  es.do_test witho
6530: 75 74 5f 72 6f 77 69 64 33 2d 31 31 2e 31 2e 31  ut_rowid3-11.1.1
6540: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
6550: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6560: 74 31 28 61 20 49 4e 54 20 50 52 49 4d 41 52 59  t1(a INT PRIMARY
6570: 20 4b 45 59 2c 20 62 29 20 57 49 54 48 4f 55 54   KEY, b) WITHOUT
6580: 20 72 6f 77 69 64 3b 0a 20 20 20 20 43 52 45 41   rowid;.    CREA
6590: 54 45 20 54 41 42 4c 45 20 74 32 28 63 2c 20 64  TE TABLE t2(c, d
65a0: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 29  , FOREIGN KEY(c)
65b0: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 28 61   REFERENCES t1(a
65c0: 29 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43  ) ON UPDATE CASC
65d0: 41 44 45 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52  ADE);..    INSER
65e0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
65f0: 28 31 30 2c 20 31 30 30 29 3b 0a 20 20 20 20 49  (10, 100);.    I
6600: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
6610: 4c 55 45 53 28 31 30 2c 20 31 30 30 29 3b 0a 20  LUES(10, 100);. 
6620: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
6630: 20 61 20 3d 20 31 35 3b 0a 20 20 20 20 53 45 4c   a = 15;.    SEL
6640: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
6650: 20 7d 0a 7d 20 7b 31 35 20 31 30 30 7d 0a 0a 23   }.} {15 100}..#
6660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
66b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c  following tests,
66c0: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
66d0: 31 32 2e 2a 2c 20 74 65 73 74 20 52 45 53 54 52  12.*, test RESTR
66e0: 49 43 54 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 64  ICT actions..#.d
66f0: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
6700: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
6710: 6f 77 69 64 33 2d 31 32 2e 31 2e 31 20 7b 0a 20  owid3-12.1.1 {. 
6720: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
6730: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
6740: 2c 20 62 20 50 52 49 4d 41 52 59 20 4b 45 59 29  , b PRIMARY KEY)
6750: 20 57 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a   WITHOUT rowid;.
6760: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6770: 20 74 32 28 0a 20 20 20 20 20 20 78 20 52 45 46   t2(.      x REF
6780: 45 52 45 4e 43 45 53 20 74 31 20 4f 4e 20 55 50  ERENCES t1 ON UP
6790: 44 41 54 45 20 52 45 53 54 52 49 43 54 20 44 45  DATE RESTRICT DE
67a0: 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
67b0: 4c 59 20 44 45 46 45 52 52 45 44 20 0a 20 20 20  LY DEFERRED .   
67c0: 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49   );.    INSERT I
67d0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
67e0: 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53   'one');.    INS
67f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
6800: 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20  ES(2, 'two');.  
6810: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6820: 20 56 41 4c 55 45 53 28 33 2c 20 27 74 68 72 65   VALUES(3, 'thre
6830: 65 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  e');.  }.} {}.do
6840: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
6850: 77 69 64 33 2d 31 32 2e 31 2e 32 20 7b 20 0a 20  wid3-12.1.2 { . 
6860: 20 65 78 65 63 73 71 6c 20 22 42 45 47 49 4e 22   execsql "BEGIN"
6870: 0a 20 20 65 78 65 63 73 71 6c 20 22 49 4e 53 45  .  execsql "INSE
6880: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
6890: 53 28 27 74 77 6f 27 29 22 0a 7d 20 7b 7d 0a 64  S('two')".} {}.d
68a0: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
68b0: 6f 77 69 64 33 2d 31 32 2e 31 2e 33 20 7b 20 0a  owid3-12.1.3 { .
68c0: 20 20 65 78 65 63 73 71 6c 20 22 55 50 44 41 54    execsql "UPDAT
68d0: 45 20 74 31 20 53 45 54 20 62 20 3d 20 27 66 6f  E t1 SET b = 'fo
68e0: 75 72 27 20 57 48 45 52 45 20 62 20 3d 20 27 6f  ur' WHERE b = 'o
68f0: 6e 65 27 22 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  ne'".} {}.do_tes
6900: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  t without_rowid3
6910: 2d 31 32 2e 31 2e 34 20 7b 20 0a 20 20 63 61 74  -12.1.4 { .  cat
6920: 63 68 73 71 6c 20 22 55 50 44 41 54 45 20 74 31  chsql "UPDATE t1
6930: 20 53 45 54 20 62 20 3d 20 27 66 69 76 65 27 20   SET b = 'five' 
6940: 57 48 45 52 45 20 62 20 3d 20 27 74 77 6f 27 22  WHERE b = 'two'"
6950: 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b  .} {1 {FOREIGN K
6960: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
6970: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 77  iled}}.do_test w
6980: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 32  ithout_rowid3-12
6990: 2e 31 2e 35 20 7b 20 0a 20 20 65 78 65 63 73 71  .1.5 { .  execsq
69a0: 6c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  l "DELETE FROM t
69b0: 31 20 57 48 45 52 45 20 62 20 3d 20 27 74 77 6f  1 WHERE b = 'two
69c0: 27 22 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  '".} {}.do_test 
69d0: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31  without_rowid3-1
69e0: 32 2e 31 2e 36 20 7b 20 0a 20 20 63 61 74 63 68  2.1.6 { .  catch
69f0: 73 71 6c 20 22 43 4f 4d 4d 49 54 22 0a 7d 20 7b  sql "COMMIT".} {
6a00: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
6a10: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
6a20: 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  }}.do_test witho
6a30: 75 74 5f 72 6f 77 69 64 33 2d 31 32 2e 31 2e 37  ut_rowid3-12.1.7
6a40: 20 7b 20 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a   { .  execsql {.
6a50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6a60: 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77  t1 VALUES(2, 'tw
6a70: 6f 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  o');.    COMMIT;
6a80: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 72 6f 70 5f  .  }.} {}..drop_
6a90: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
6aa0: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
6ab0: 33 2d 31 32 2e 32 2e 31 20 7b 0a 20 20 65 78 65  3-12.2.1 {.  exe
6ac0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
6ad0: 45 20 54 41 42 4c 45 20 74 31 28 78 20 43 4f 4c  E TABLE t1(x COL
6ae0: 4c 41 54 45 20 4e 4f 43 41 53 45 20 50 52 49 4d  LATE NOCASE PRIM
6af0: 41 52 59 20 4b 45 59 29 20 57 49 54 48 4f 55 54  ARY KEY) WITHOUT
6b00: 20 72 6f 77 69 64 3b 0a 20 20 20 20 43 52 45 41   rowid;.    CREA
6b10: 54 45 20 54 52 49 47 47 45 52 20 74 74 31 20 41  TE TRIGGER tt1 A
6b20: 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 74  FTER DELETE ON t
6b30: 31 20 0a 20 20 20 20 20 20 57 48 45 4e 20 45 58  1 .      WHEN EX
6b40: 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 31 20  ISTS ( SELECT 1 
6b50: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 6f 6c  FROM t2 WHERE ol
6b60: 64 2e 78 20 3d 20 79 20 29 0a 20 20 20 20 42 45  d.x = y ).    BE
6b70: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
6b80: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6b90: 6f 6c 64 2e 78 29 3b 0a 20 20 20 20 45 4e 44 3b  old.x);.    END;
6ba0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
6bb0: 45 20 74 32 28 79 20 52 45 46 45 52 45 4e 43 45  E t2(y REFERENCE
6bc0: 53 20 74 31 29 3b 0a 20 20 20 20 49 4e 53 45 52  S t1);.    INSER
6bd0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
6be0: 28 27 41 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ('A');.    INSER
6bf0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
6c00: 28 27 42 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ('B');.    INSER
6c10: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
6c20: 28 27 61 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ('a');.    INSER
6c30: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
6c40: 28 27 62 27 29 3b 0a 0a 20 20 20 20 53 45 4c 45  ('b');..    SELE
6c50: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
6c60: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
6c70: 74 32 3b 0a 20 20 7d 0a 7d 20 7b 41 20 42 20 61  t2;.  }.} {A B a
6c80: 20 62 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68   b}.do_test with
6c90: 6f 75 74 5f 72 6f 77 69 64 33 2d 31 32 2e 32 2e  out_rowid3-12.2.
6ca0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
6cb0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 7d  DELETE FROM t1 }
6cc0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
6cd0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
6ce0: 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  1;.    SELECT * 
6cf0: 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b  FROM t2;.  }.} {
6d00: 41 20 42 20 61 20 62 7d 0a 64 6f 5f 74 65 73 74  A B a b}.do_test
6d10: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
6d20: 31 32 2e 32 2e 33 20 7b 0a 20 20 65 78 65 63 73  12.2.3 {.  execs
6d30: 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41  ql {.    DROP TA
6d40: 42 4c 45 20 74 32 3b 0a 20 20 20 20 43 52 45 41  BLE t2;.    CREA
6d50: 54 45 20 54 41 42 4c 45 20 74 32 28 79 20 52 45  TE TABLE t2(y RE
6d60: 46 45 52 45 4e 43 45 53 20 74 31 20 4f 4e 20 44  FERENCES t1 ON D
6d70: 45 4c 45 54 45 20 52 45 53 54 52 49 43 54 29 3b  ELETE RESTRICT);
6d80: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
6d90: 20 74 32 20 56 41 4c 55 45 53 28 27 61 27 29 3b   t2 VALUES('a');
6da0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
6db0: 20 74 32 20 56 41 4c 55 45 53 28 27 62 27 29 3b   t2 VALUES('b');
6dc0: 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  .  }.  catchsql 
6dd0: 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31  { DELETE FROM t1
6de0: 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e   }.} {1 {FOREIGN
6df0: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
6e00: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
6e10: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
6e20: 31 32 2e 32 2e 34 20 7b 0a 20 20 65 78 65 63 73  12.2.4 {.  execs
6e30: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
6e40: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53  * FROM t1;.    S
6e50: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
6e60: 0a 20 20 7d 0a 7d 20 7b 41 20 42 20 61 20 62 7d  .  }.} {A B a b}
6e70: 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  ..drop_all_table
6e80: 73 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75  s.do_test withou
6e90: 74 5f 72 6f 77 69 64 33 2d 31 32 2e 33 2e 31 20  t_rowid3-12.3.1 
6ea0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
6eb0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 75    CREATE TABLE u
6ec0: 70 28 0a 20 20 20 20 20 20 63 30 30 2c 20 63 30  p(.      c00, c0
6ed0: 31 2c 20 63 30 32 2c 20 63 30 33 2c 20 63 30 34  1, c02, c03, c04
6ee0: 2c 20 63 30 35 2c 20 63 30 36 2c 20 63 30 37 2c  , c05, c06, c07,
6ef0: 20 63 30 38 2c 20 63 30 39 2c 0a 20 20 20 20 20   c08, c09,.     
6f00: 20 63 31 30 2c 20 63 31 31 2c 20 63 31 32 2c 20   c10, c11, c12, 
6f10: 63 31 33 2c 20 63 31 34 2c 20 63 31 35 2c 20 63  c13, c14, c15, c
6f20: 31 36 2c 20 63 31 37 2c 20 63 31 38 2c 20 63 31  16, c17, c18, c1
6f30: 39 2c 0a 20 20 20 20 20 20 63 32 30 2c 20 63 32  9,.      c20, c2
6f40: 31 2c 20 63 32 32 2c 20 63 32 33 2c 20 63 32 34  1, c22, c23, c24
6f50: 2c 20 63 32 35 2c 20 63 32 36 2c 20 63 32 37 2c  , c25, c26, c27,
6f60: 20 63 32 38 2c 20 63 32 39 2c 0a 20 20 20 20 20   c28, c29,.     
6f70: 20 63 33 30 2c 20 63 33 31 2c 20 63 33 32 2c 20   c30, c31, c32, 
6f80: 63 33 33 2c 20 63 33 34 2c 20 63 33 35 2c 20 63  c33, c34, c35, c
6f90: 33 36 2c 20 63 33 37 2c 20 63 33 38 2c 20 63 33  36, c37, c38, c3
6fa0: 39 2c 0a 20 20 20 20 20 20 50 52 49 4d 41 52 59  9,.      PRIMARY
6fb0: 20 4b 45 59 28 63 33 34 2c 20 63 33 35 29 0a 20   KEY(c34, c35). 
6fc0: 20 20 20 29 20 57 49 54 48 4f 55 54 20 72 6f 77     ) WITHOUT row
6fd0: 69 64 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  id;.    CREATE T
6fe0: 41 42 4c 45 20 64 6f 77 6e 28 0a 20 20 20 20 20  ABLE down(.     
6ff0: 20 63 30 30 2c 20 63 30 31 2c 20 63 30 32 2c 20   c00, c01, c02, 
7000: 63 30 33 2c 20 63 30 34 2c 20 63 30 35 2c 20 63  c03, c04, c05, c
7010: 30 36 2c 20 63 30 37 2c 20 63 30 38 2c 20 63 30  06, c07, c08, c0
7020: 39 2c 0a 20 20 20 20 20 20 63 31 30 2c 20 63 31  9,.      c10, c1
7030: 31 2c 20 63 31 32 2c 20 63 31 33 2c 20 63 31 34  1, c12, c13, c14
7040: 2c 20 63 31 35 2c 20 63 31 36 2c 20 63 31 37 2c  , c15, c16, c17,
7050: 20 63 31 38 2c 20 63 31 39 2c 0a 20 20 20 20 20   c18, c19,.     
7060: 20 63 32 30 2c 20 63 32 31 2c 20 63 32 32 2c 20   c20, c21, c22, 
7070: 63 32 33 2c 20 63 32 34 2c 20 63 32 35 2c 20 63  c23, c24, c25, c
7080: 32 36 2c 20 63 32 37 2c 20 63 32 38 2c 20 63 32  26, c27, c28, c2
7090: 39 2c 0a 20 20 20 20 20 20 63 33 30 2c 20 63 33  9,.      c30, c3
70a0: 31 2c 20 63 33 32 2c 20 63 33 33 2c 20 63 33 34  1, c32, c33, c34
70b0: 2c 20 63 33 35 2c 20 63 33 36 2c 20 63 33 37 2c  , c35, c36, c37,
70c0: 20 63 33 38 2c 20 63 33 39 2c 0a 20 20 20 20 20   c38, c39,.     
70d0: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 33 39   FOREIGN KEY(c39
70e0: 2c 20 63 33 38 29 20 52 45 46 45 52 45 4e 43 45  , c38) REFERENCE
70f0: 53 20 75 70 20 4f 4e 20 55 50 44 41 54 45 20 43  S up ON UPDATE C
7100: 41 53 43 41 44 45 0a 20 20 20 20 29 3b 0a 20 20  ASCADE.    );.  
7110: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77  }.} {}.do_test w
7120: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 32  ithout_rowid3-12
7130: 2e 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.2 {.  execsql
7140: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
7150: 54 4f 20 75 70 28 63 33 34 2c 20 63 33 35 29 20  TO up(c34, c35) 
7160: 56 41 4c 55 45 53 28 27 79 65 73 27 2c 20 27 6e  VALUES('yes', 'n
7170: 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  o');.    INSERT 
7180: 49 4e 54 4f 20 64 6f 77 6e 28 63 33 39 2c 20 63  INTO down(c39, c
7190: 33 38 29 20 56 41 4c 55 45 53 28 27 79 65 73 27  38) VALUES('yes'
71a0: 2c 20 27 6e 6f 27 29 3b 0a 20 20 20 20 55 50 44  , 'no');.    UPD
71b0: 41 54 45 20 75 70 20 53 45 54 20 63 33 34 20 3d  ATE up SET c34 =
71c0: 20 27 70 6f 73 73 69 62 6c 79 27 3b 0a 20 20 20   'possibly';.   
71d0: 20 53 45 4c 45 43 54 20 63 33 38 2c 20 63 33 39   SELECT c38, c39
71e0: 20 46 52 4f 4d 20 64 6f 77 6e 3b 0a 20 20 20 20   FROM down;.    
71f0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 64 6f 77 6e  DELETE FROM down
7200: 3b 0a 20 20 7d 0a 7d 20 7b 6e 6f 20 70 6f 73 73  ;.  }.} {no poss
7210: 69 62 6c 79 7d 0a 64 6f 5f 74 65 73 74 20 77 69  ibly}.do_test wi
7220: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 32 2e  thout_rowid3-12.
7230: 33 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  3.3 {.  catchsql
7240: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64   { INSERT INTO d
7250: 6f 77 6e 28 63 33 39 2c 20 63 33 38 29 20 56 41  own(c39, c38) VA
7260: 4c 55 45 53 28 27 79 65 73 27 2c 20 27 6e 6f 27  LUES('yes', 'no'
7270: 29 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47  ) }.} {1 {FOREIG
7280: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
7290: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
72a0: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  t without_rowid3
72b0: 2d 31 32 2e 33 2e 34 20 7b 0a 20 20 65 78 65 63  -12.3.4 {.  exec
72c0: 73 71 6c 20 7b 20 0a 20 20 20 20 49 4e 53 45 52  sql { .    INSER
72d0: 54 20 49 4e 54 4f 20 75 70 28 63 33 34 2c 20 63  T INTO up(c34, c
72e0: 33 35 29 20 56 41 4c 55 45 53 28 27 79 65 73 27  35) VALUES('yes'
72f0: 2c 20 27 6e 6f 27 29 3b 0a 20 20 20 20 49 4e 53  , 'no');.    INS
7300: 45 52 54 20 49 4e 54 4f 20 64 6f 77 6e 28 63 33  ERT INTO down(c3
7310: 39 2c 20 63 33 38 29 20 56 41 4c 55 45 53 28 27  9, c38) VALUES('
7320: 79 65 73 27 2c 20 27 6e 6f 27 29 3b 0a 20 20 7d  yes', 'no');.  }
7330: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45  .  catchsql { DE
7340: 4c 45 54 45 20 46 52 4f 4d 20 75 70 20 57 48 45  LETE FROM up WHE
7350: 52 45 20 63 33 34 20 3d 20 27 79 65 73 27 20 7d  RE c34 = 'yes' }
7360: 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b  .} {1 {FOREIGN K
7370: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
7380: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 77  iled}}.do_test w
7390: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 32  ithout_rowid3-12
73a0: 2e 33 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.5 {.  execsql
73b0: 20 7b 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46   { .    DELETE F
73c0: 52 4f 4d 20 75 70 20 57 48 45 52 45 20 63 33 34  ROM up WHERE c34
73d0: 20 3d 20 27 70 6f 73 73 69 62 6c 79 27 3b 0a 20   = 'possibly';. 
73e0: 20 20 20 53 45 4c 45 43 54 20 63 33 34 2c 20 63     SELECT c34, c
73f0: 33 35 20 46 52 4f 4d 20 75 70 3b 0a 20 20 20 20  35 FROM up;.    
7400: 53 45 4c 45 43 54 20 63 33 39 2c 20 63 33 38 20  SELECT c39, c38 
7410: 46 52 4f 4d 20 64 6f 77 6e 3b 0a 20 20 7d 0a 7d  FROM down;.  }.}
7420: 20 7b 79 65 73 20 6e 6f 20 79 65 73 20 6e 6f 7d   {yes no yes no}
7430: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
7440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
7480: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
7490: 74 73 2c 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  ts, without_rowi
74a0: 64 33 2d 31 33 2e 2a 2c 20 74 65 73 74 20 74 68  d3-13.*, test th
74b0: 61 74 20 46 4b 20 70 72 6f 63 65 73 73 69 6e 67  at FK processing
74c0: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 0a 23 20   is performed.# 
74d0: 77 68 65 6e 20 72 6f 77 73 20 61 72 65 20 52 45  when rows are RE
74e0: 50 4c 41 43 45 64 2e 0a 23 0a 64 72 6f 70 5f 61  PLACEd..#.drop_a
74f0: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
7500: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  t without_rowid3
7510: 2d 31 33 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63  -13.1.1 {.  exec
7520: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
7530: 20 54 41 42 4c 45 20 70 70 28 61 20 55 4e 49 51   TABLE pp(a UNIQ
7540: 55 45 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52  UE, b, c, PRIMAR
7550: 59 20 4b 45 59 28 62 2c 20 63 29 29 20 57 49 54  Y KEY(b, c)) WIT
7560: 48 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20 20 20  HOUT rowid;.    
7570: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 63 28  CREATE TABLE cc(
7580: 64 2c 20 65 2c 20 66 20 55 4e 49 51 55 45 2c 20  d, e, f UNIQUE, 
7590: 46 4f 52 45 49 47 4e 20 4b 45 59 28 64 2c 20 65  FOREIGN KEY(d, e
75a0: 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 70 29  ) REFERENCES pp)
75b0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
75c0: 4f 20 70 70 20 56 41 4c 55 45 53 28 31 2c 20 32  O pp VALUES(1, 2
75d0: 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 3);.    INSERT
75e0: 20 49 4e 54 4f 20 63 63 20 56 41 4c 55 45 53 28   INTO cc VALUES(
75f0: 32 2c 20 33 2c 20 31 29 3b 0a 20 20 7d 0a 7d 20  2, 3, 1);.  }.} 
7600: 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  {}.foreach {tn s
7610: 74 6d 74 7d 20 7b 0a 20 20 31 20 20 20 22 52 45  tmt} {.  1   "RE
7620: 50 4c 41 43 45 20 49 4e 54 4f 20 70 70 20 56 41  PLACE INTO pp VA
7630: 4c 55 45 53 28 31 2c 20 34 2c 20 35 29 22 0a 7d  LUES(1, 4, 5)".}
7640: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74   {.  do_test wit
7650: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 33 2e 31  hout_rowid3-13.1
7660: 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 63 61 74  .$tn.1 {.    cat
7670: 63 68 73 71 6c 20 24 73 74 6d 74 0a 20 20 7d 20  chsql $stmt.  } 
7680: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
7690: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
76a0: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69  d}}.  do_test wi
76b0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 33 2e  thout_rowid3-13.
76c0: 31 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78  1.$tn.2 {.    ex
76d0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
76e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 70 3b 0a  LECT * FROM pp;.
76f0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
7700: 52 4f 4d 20 63 63 3b 0a 20 20 20 20 7d 0a 20 20  ROM cc;.    }.  
7710: 7d 20 7b 31 20 32 20 33 20 32 20 33 20 31 7d 0a  } {1 2 3 2 3 1}.
7720: 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75    do_test withou
7730: 74 5f 72 6f 77 69 64 33 2d 31 33 2e 31 2e 24 74  t_rowid3-13.1.$t
7740: 6e 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  n.3 {.    execsq
7750: 6c 20 42 45 47 49 4e 3b 0a 20 20 20 20 63 61 74  l BEGIN;.    cat
7760: 63 68 73 71 6c 20 24 73 74 6d 74 0a 20 20 7d 20  chsql $stmt.  } 
7770: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
7780: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
7790: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69  d}}.  do_test wi
77a0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 33 2e  thout_rowid3-13.
77b0: 31 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 65 78  1.$tn.4 {.    ex
77c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 4f  ecsql {.      CO
77d0: 4d 4d 49 54 3b 0a 20 20 20 20 20 20 53 45 4c 45  MMIT;.      SELE
77e0: 43 54 20 2a 20 46 52 4f 4d 20 70 70 3b 0a 20 20  CT * FROM pp;.  
77f0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
7800: 4d 20 63 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M cc;.    }.  } 
7810: 7b 31 20 32 20 33 20 32 20 33 20 31 7d 0a 7d 0a  {1 2 3 2 3 1}.}.
7820: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
7830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
7870: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
7880: 73 2c 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  s, without_rowid
7890: 33 2d 31 34 2e 2a 2c 20 74 65 73 74 20 74 68 61  3-14.*, test tha
78a0: 74 20 74 68 65 20 22 44 52 4f 50 20 54 41 42 4c  t the "DROP TABL
78b0: 45 22 20 61 6e 64 20 22 41 4c 54 45 52 0a 23 20  E" and "ALTER.# 
78c0: 54 41 42 4c 45 22 20 63 6f 6d 6d 61 6e 64 73 20  TABLE" commands 
78d0: 77 6f 72 6b 20 61 73 20 65 78 70 65 63 74 65 64  work as expected
78e0: 20 77 72 74 20 66 6f 72 65 69 67 6e 20 6b 65 79   wrt foreign key
78f0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 23 0a   constraints..#.
7900: 23 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  # without_rowid3
7910: 2d 31 34 2e 31 2a 3a 20 41 4c 54 45 52 20 54 41  -14.1*: ALTER TA
7920: 42 4c 45 20 41 44 44 20 43 4f 4c 55 4d 4e 0a 23  BLE ADD COLUMN.#
7930: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
7940: 31 34 2e 32 2a 3a 20 41 4c 54 45 52 20 54 41 42  14.2*: ALTER TAB
7950: 4c 45 20 52 45 4e 41 4d 45 20 54 41 42 4c 45 0a  LE RENAME TABLE.
7960: 23 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  # without_rowid3
7970: 2d 31 34 2e 33 2a 3a 20 44 52 4f 50 20 54 41 42  -14.3*: DROP TAB
7980: 4c 45 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  LE.#.drop_all_ta
7990: 62 6c 65 73 0a 69 66 63 61 70 61 62 6c 65 20 61  bles.ifcapable a
79a0: 6c 74 65 72 74 61 62 6c 65 20 7b 0a 20 20 64 6f  ltertable {.  do
79b0: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
79c0: 77 69 64 33 2d 31 34 2e 31 2e 31 20 7b 0a 20 20  wid3-14.1.1 {.  
79d0: 20 20 23 20 41 64 64 69 6e 67 20 61 20 63 6f 6c    # Adding a col
79e0: 75 6d 6e 20 77 69 74 68 20 61 20 52 45 46 45 52  umn with a REFER
79f0: 45 4e 43 45 53 20 63 6c 61 75 73 65 20 69 73 20  ENCES clause is 
7a00: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 2e 0a 20  not supported.. 
7a10: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20     execsql { .  
7a20: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7a30: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
7a40: 59 29 20 57 49 54 48 4f 55 54 20 72 6f 77 69 64  Y) WITHOUT rowid
7a50: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
7a60: 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20  ABLE t2(a, b);. 
7a70: 20 20 20 7d 0a 20 20 20 20 63 61 74 63 68 73 71     }.    catchsq
7a80: 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20  l { ALTER TABLE 
7a90: 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20  t2 ADD COLUMN c 
7aa0: 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 7d 0a  REFERENCES t1 }.
7ab0: 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f    } {0 {}}.  do_
7ac0: 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77  test without_row
7ad0: 69 64 33 2d 31 34 2e 31 2e 32 20 7b 0a 20 20 20  id3-14.1.2 {.   
7ae0: 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54 45   catchsql { ALTE
7af0: 52 20 54 41 42 4c 45 20 74 32 20 41 44 44 20 43  R TABLE t2 ADD C
7b00: 4f 4c 55 4d 4e 20 64 20 44 45 46 41 55 4c 54 20  OLUMN d DEFAULT 
7b10: 4e 55 4c 4c 20 52 45 46 45 52 45 4e 43 45 53 20  NULL REFERENCES 
7b20: 74 31 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a  t1 }.  } {0 {}}.
7b30: 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75    do_test withou
7b40: 74 5f 72 6f 77 69 64 33 2d 31 34 2e 31 2e 33 20  t_rowid3-14.1.3 
7b50: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
7b60: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 32 20   ALTER TABLE t2 
7b70: 41 44 44 20 43 4f 4c 55 4d 4e 20 65 20 52 45 46  ADD COLUMN e REF
7b80: 45 52 45 4e 43 45 53 20 74 31 20 44 45 46 41 55  ERENCES t1 DEFAU
7b90: 4c 54 20 4e 55 4c 4c 7d 0a 20 20 7d 20 7b 30 20  LT NULL}.  } {0 
7ba0: 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69  {}}.  do_test wi
7bb0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e  thout_rowid3-14.
7bc0: 31 2e 34 20 7b 0a 20 20 20 20 63 61 74 63 68 73  1.4 {.    catchs
7bd0: 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45  ql { ALTER TABLE
7be0: 20 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 66   t2 ADD COLUMN f
7bf0: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 44   REFERENCES t1 D
7c00: 45 46 41 55 4c 54 20 27 74 65 78 74 27 7d 0a 20  EFAULT 'text'}. 
7c10: 20 7d 20 7b 31 20 7b 43 61 6e 6e 6f 74 20 61 64   } {1 {Cannot ad
7c20: 64 20 61 20 52 45 46 45 52 45 4e 43 45 53 20 63  d a REFERENCES c
7c30: 6f 6c 75 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e  olumn with non-N
7c40: 55 4c 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ULL default valu
7c50: 65 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69  e}}.  do_test wi
7c60: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e  thout_rowid3-14.
7c70: 31 2e 35 20 7b 0a 20 20 20 20 63 61 74 63 68 73  1.5 {.    catchs
7c80: 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45  ql { ALTER TABLE
7c90: 20 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 67   t2 ADD COLUMN g
7ca0: 20 44 45 46 41 55 4c 54 20 43 55 52 52 45 4e 54   DEFAULT CURRENT
7cb0: 5f 54 49 4d 45 20 52 45 46 45 52 45 4e 43 45 53  _TIME REFERENCES
7cc0: 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 7b 43 61   t1 }.  } {1 {Ca
7cd0: 6e 6e 6f 74 20 61 64 64 20 61 20 52 45 46 45 52  nnot add a REFER
7ce0: 45 4e 43 45 53 20 63 6f 6c 75 6d 6e 20 77 69 74  ENCES column wit
7cf0: 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75  h non-NULL defau
7d00: 6c 74 20 76 61 6c 75 65 7d 7d 0a 20 20 64 6f 5f  lt value}}.  do_
7d10: 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77  test without_row
7d20: 69 64 33 2d 31 34 2e 31 2e 36 20 7b 0a 20 20 20  id3-14.1.6 {.   
7d30: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
7d40: 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e    PRAGMA foreign
7d50: 5f 6b 65 79 73 20 3d 20 6f 66 66 3b 0a 20 20 20  _keys = off;.   
7d60: 20 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74     ALTER TABLE t
7d70: 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 68 20 44  2 ADD COLUMN h D
7d80: 45 46 41 55 4c 54 20 27 74 65 78 74 27 20 52 45  EFAULT 'text' RE
7d90: 46 45 52 45 4e 43 45 53 20 74 31 3b 0a 20 20 20  FERENCES t1;.   
7da0: 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67     PRAGMA foreig
7db0: 6e 5f 6b 65 79 73 20 3d 20 6f 6e 3b 0a 20 20 20  n_keys = on;.   
7dc0: 20 20 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52     SELECT sql FR
7dd0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
7de0: 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 74 32 27   WHERE name='t2'
7df0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7b 43 52  ;.    }.  } {{CR
7e00: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
7e10: 20 62 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53   b, c REFERENCES
7e20: 20 74 31 2c 20 64 20 44 45 46 41 55 4c 54 20 4e   t1, d DEFAULT N
7e30: 55 4c 4c 20 52 45 46 45 52 45 4e 43 45 53 20 74  ULL REFERENCES t
7e40: 31 2c 20 65 20 52 45 46 45 52 45 4e 43 45 53 20  1, e REFERENCES 
7e50: 74 31 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c 2c  t1 DEFAULT NULL,
7e60: 20 68 20 44 45 46 41 55 4c 54 20 27 74 65 78 74   h DEFAULT 'text
7e70: 27 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 29  ' REFERENCES t1)
7e80: 7d 7d 0a 20 20 0a 20 20 0a 20 20 23 20 54 65 73  }}.  .  .  # Tes
7e90: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 72 65 6e  t the sqlite_ren
7ea0: 61 6d 65 5f 70 61 72 65 6e 74 28 29 20 66 75 6e  ame_parent() fun
7eb0: 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 2e 0a  ction directly..
7ec0: 20 20 23 0a 20 20 70 72 6f 63 20 74 65 73 74 5f    #.  proc test_
7ed0: 72 65 6e 61 6d 65 5f 70 61 72 65 6e 74 20 7b 7a  rename_parent {z
7ee0: 43 72 65 61 74 65 20 7a 4f 6c 64 20 7a 4e 65 77  Create zOld zNew
7ef0: 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20  } {.    db eval 
7f00: 7b 53 45 4c 45 43 54 20 73 71 6c 69 74 65 5f 72  {SELECT sqlite_r
7f10: 65 6e 61 6d 65 5f 74 61 62 6c 65 28 0a 20 20 20  ename_table(.   
7f20: 20 20 20 20 20 27 6d 61 69 6e 27 2c 20 27 74 61       'main', 'ta
7f30: 62 6c 65 27 2c 20 27 74 31 27 2c 20 24 7a 43 72  ble', 't1', $zCr
7f40: 65 61 74 65 2c 20 24 7a 4f 6c 64 2c 20 24 7a 4e  eate, $zOld, $zN
7f50: 65 77 2c 20 30 0a 20 20 20 20 29 7d 0a 20 20 7d  ew, 0.    )}.  }
7f60: 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
7f70: 63 6f 6e 74 72 6f 6c 20 53 51 4c 49 54 45 5f 54  control SQLITE_T
7f80: 45 53 54 43 54 52 4c 5f 49 4e 54 45 52 4e 41 4c  ESTCTRL_INTERNAL
7f90: 5f 46 55 4e 43 54 49 4f 4e 53 20 31 0a 20 20 64  _FUNCTIONS 1.  d
7fa0: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
7fb0: 6f 77 69 64 33 2d 31 34 2e 32 2e 31 2e 31 20 7b  owid3-14.2.1.1 {
7fc0: 0a 20 20 20 20 74 65 73 74 5f 72 65 6e 61 6d 65  .    test_rename
7fd0: 5f 70 61 72 65 6e 74 20 7b 43 52 45 41 54 45 20  _parent {CREATE 
7fe0: 54 41 42 4c 45 20 74 31 28 61 20 52 45 46 45 52  TABLE t1(a REFER
7ff0: 45 4e 43 45 53 20 74 32 29 7d 20 74 32 20 74 33  ENCES t2)} t2 t3
8000: 0a 20 20 7d 20 7b 7b 43 52 45 41 54 45 20 54 41  .  } {{CREATE TA
8010: 42 4c 45 20 74 31 28 61 20 52 45 46 45 52 45 4e  BLE t1(a REFEREN
8020: 43 45 53 20 22 74 33 22 29 7d 7d 0a 20 20 64 6f  CES "t3")}}.  do
8030: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
8040: 77 69 64 33 2d 31 34 2e 32 2e 31 2e 32 20 7b 0a  wid3-14.2.1.2 {.
8050: 20 20 20 20 74 65 73 74 5f 72 65 6e 61 6d 65 5f      test_rename_
8060: 70 61 72 65 6e 74 20 7b 43 52 45 41 54 45 20 54  parent {CREATE T
8070: 41 42 4c 45 20 74 31 28 61 20 52 45 46 45 52 45  ABLE t1(a REFERE
8080: 4e 43 45 53 20 74 32 29 7d 20 74 34 20 74 33 0a  NCES t2)} t4 t3.
8090: 20 20 7d 20 7b 7b 43 52 45 41 54 45 20 54 41 42    } {{CREATE TAB
80a0: 4c 45 20 74 31 28 61 20 52 45 46 45 52 45 4e 43  LE t1(a REFERENC
80b0: 45 53 20 74 32 29 7d 7d 0a 20 20 64 6f 5f 74 65  ES t2)}}.  do_te
80c0: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
80d0: 33 2d 31 34 2e 32 2e 31 2e 33 20 7b 0a 20 20 20  3-14.2.1.3 {.   
80e0: 20 74 65 73 74 5f 72 65 6e 61 6d 65 5f 70 61 72   test_rename_par
80f0: 65 6e 74 20 7b 43 52 45 41 54 45 20 54 41 42 4c  ent {CREATE TABL
8100: 45 20 74 31 28 61 20 52 45 46 45 52 45 4e 43 45  E t1(a REFERENCE
8110: 53 20 22 74 32 22 29 7d 20 74 32 20 74 33 0a 20  S "t2")} t2 t3. 
8120: 20 7d 20 7b 7b 43 52 45 41 54 45 20 54 41 42 4c   } {{CREATE TABL
8130: 45 20 74 31 28 61 20 52 45 46 45 52 45 4e 43 45  E t1(a REFERENCE
8140: 53 20 22 74 33 22 29 7d 7d 0a 20 20 73 71 6c 69  S "t3")}}.  sqli
8150: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
8160: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
8170: 5f 49 4e 54 45 52 4e 41 4c 5f 46 55 4e 43 54 49  _INTERNAL_FUNCTI
8180: 4f 4e 53 20 30 0a 20 20 0a 20 20 23 20 54 65 73  ONS 0.  .  # Tes
8190: 74 20 41 4c 54 45 52 20 54 41 42 4c 45 20 52 45  t ALTER TABLE RE
81a0: 4e 41 4d 45 20 54 41 42 4c 45 20 61 20 62 69 74  NAME TABLE a bit
81b0: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
81c0: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31  without_rowid3-1
81d0: 34 2e 32 2e 32 2e 31 20 7b 0a 20 20 20 20 64 72  4.2.2.1 {.    dr
81e0: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20  op_all_tables.  
81f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
8200: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
8210: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
8220: 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31   b REFERENCES t1
8230: 29 20 57 49 54 48 4f 55 54 20 72 6f 77 69 64 3b  ) WITHOUT rowid;
8240: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
8250: 42 4c 45 20 74 32 28 61 20 50 52 49 4d 41 52 59  BLE t2(a PRIMARY
8260: 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43   KEY, b REFERENC
8270: 45 53 20 74 31 2c 20 63 20 52 45 46 45 52 45 4e  ES t1, c REFEREN
8280: 43 45 53 20 74 32 29 0a 20 20 20 20 20 20 20 20  CES t2).        
8290: 20 20 20 20 57 49 54 48 4f 55 54 20 72 6f 77 69      WITHOUT rowi
82a0: 64 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  d;.      CREATE 
82b0: 54 41 42 4c 45 20 74 33 28 61 20 52 45 46 45 52  TABLE t3(a REFER
82c0: 45 4e 43 45 53 20 74 31 2c 20 62 20 52 45 46 45  ENCES t1, b REFE
82d0: 52 45 4e 43 45 53 20 74 32 2c 20 63 20 52 45 46  RENCES t2, c REF
82e0: 45 52 45 4e 43 45 53 20 74 31 29 3b 0a 20 20 20  ERENCES t1);.   
82f0: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
8300: 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d   SELECT sql FROM
8310: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
8320: 48 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62  HERE type = 'tab
8330: 6c 65 27 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 5c  le'}.  } [list \
8340: 0a 20 20 20 20 7b 43 52 45 41 54 45 20 54 41 42  .    {CREATE TAB
8350: 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20  LE t1(a PRIMARY 
8360: 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45  KEY, b REFERENCE
8370: 53 20 74 31 29 20 57 49 54 48 4f 55 54 20 72 6f  S t1) WITHOUT ro
8380: 77 69 64 7d 20 20 20 20 20 20 20 5c 0a 20 20 20  wid}       \.   
8390: 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   {CREATE TABLE t
83a0: 32 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  2(a PRIMARY KEY,
83b0: 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31   b REFERENCES t1
83c0: 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53 20 74  , c REFERENCES t
83d0: 32 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 57  2).            W
83e0: 49 54 48 4f 55 54 20 72 6f 77 69 64 7d 20 20 20  ITHOUT rowid}   
83f0: 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20 54   \.    {CREATE T
8400: 41 42 4c 45 20 74 33 28 61 20 52 45 46 45 52 45  ABLE t3(a REFERE
8410: 4e 43 45 53 20 74 31 2c 20 62 20 52 45 46 45 52  NCES t1, b REFER
8420: 45 4e 43 45 53 20 74 32 2c 20 63 20 52 45 46 45  ENCES t2, c REFE
8430: 52 45 4e 43 45 53 20 74 31 29 7d 20 20 5c 0a 20  RENCES t1)}  \. 
8440: 20 5d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74   ].  do_test wit
8450: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e 32  hout_rowid3-14.2
8460: 2e 32 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73  .2.2 {.    execs
8470: 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45  ql { ALTER TABLE
8480: 20 74 31 20 52 45 4e 41 4d 45 20 54 4f 20 74 34   t1 RENAME TO t4
8490: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
84a0: 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d   SELECT sql FROM
84b0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
84c0: 48 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62  HERE type = 'tab
84d0: 6c 65 27 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 5c  le'}.  } [list \
84e0: 0a 20 20 20 20 7b 43 52 45 41 54 45 20 54 41 42  .    {CREATE TAB
84f0: 4c 45 20 22 74 34 22 28 61 20 50 52 49 4d 41 52  LE "t4"(a PRIMAR
8500: 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e  Y KEY, b REFEREN
8510: 43 45 53 20 22 74 34 22 29 20 57 49 54 48 4f 55  CES "t4") WITHOU
8520: 54 20 72 6f 77 69 64 7d 20 20 20 20 20 20 5c 0a  T rowid}      \.
8530: 20 20 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c      {CREATE TABL
8540: 45 20 74 32 28 61 20 50 52 49 4d 41 52 59 20 4b  E t2(a PRIMARY K
8550: 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53  EY, b REFERENCES
8560: 20 22 74 34 22 2c 20 63 20 52 45 46 45 52 45 4e   "t4", c REFEREN
8570: 43 45 53 20 74 32 29 0a 20 20 20 20 20 20 20 20  CES t2).        
8580: 20 20 20 20 57 49 54 48 4f 55 54 20 72 6f 77 69      WITHOUT rowi
8590: 64 7d 20 20 20 20 20 5c 0a 20 20 20 20 7b 43 52  d}     \.    {CR
85a0: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 20  EATE TABLE t3(a 
85b0: 52 45 46 45 52 45 4e 43 45 53 20 22 74 34 22 2c  REFERENCES "t4",
85c0: 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 32   b REFERENCES t2
85d0: 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53 20 22  , c REFERENCES "
85e0: 74 34 22 29 7d 20 5c 0a 20 20 5d 0a 20 20 64 6f  t4")} \.  ].  do
85f0: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
8600: 77 69 64 33 2d 31 34 2e 32 2e 32 2e 33 20 7b 0a  wid3-14.2.2.3 {.
8610: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49      catchsql { I
8620: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
8630: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 20 7d 0a  LUES(1, 2, 3) }.
8640: 20 20 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20    } {1 {FOREIGN 
8650: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
8660: 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73  ailed}}.  do_tes
8670: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  t without_rowid3
8680: 2d 31 34 2e 32 2e 32 2e 34 20 7b 0a 20 20 20 20  -14.2.2.4 {.    
8690: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
86a0: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
86b0: 31 2c 20 4e 55 4c 4c 29 20 7d 0a 20 20 7d 20 7b  1, NULL) }.  } {
86c0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68  }.  do_test with
86d0: 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e 32 2e  out_rowid3-14.2.
86e0: 32 2e 35 20 7b 0a 20 20 20 20 63 61 74 63 68 73  2.5 {.    catchs
86f0: 71 6c 20 7b 20 55 50 44 41 54 45 20 74 34 20 53  ql { UPDATE t4 S
8700: 45 54 20 62 20 3d 20 35 20 7d 0a 20 20 7d 20 7b  ET b = 5 }.  } {
8710: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
8720: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
8730: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74  }}.  do_test wit
8740: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e 32  hout_rowid3-14.2
8750: 2e 32 2e 36 20 7b 0a 20 20 20 20 63 61 74 63 68  .2.6 {.    catch
8760: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 34 20  sql { UPDATE t4 
8770: 53 45 54 20 62 20 3d 20 31 20 7d 0a 20 20 7d 20  SET b = 1 }.  } 
8780: 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  {0 {}}.  do_test
8790: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
87a0: 31 34 2e 32 2e 32 2e 37 20 7b 0a 20 20 20 20 65  14.2.2.7 {.    e
87b0: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
87c0: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31  INTO t3 VALUES(1
87d0: 2c 20 4e 55 4c 4c 2c 20 31 29 20 7d 0a 20 20 7d  , NULL, 1) }.  }
87e0: 20 7b 7d 0a 0a 20 20 23 20 52 65 70 65 61 74 20   {}..  # Repeat 
87f0: 66 6f 72 20 54 45 4d 50 20 74 61 62 6c 65 73 0a  for TEMP tables.
8800: 20 20 23 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74    #.  drop_all_t
8810: 61 62 6c 65 73 0a 20 20 64 6f 5f 74 65 73 74 20  ables.  do_test 
8820: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31  without_rowid3-1
8830: 34 2e 31 74 6d 70 2e 31 20 7b 0a 20 20 20 20 23  4.1tmp.1 {.    #
8840: 20 41 64 64 69 6e 67 20 61 20 63 6f 6c 75 6d 6e   Adding a column
8850: 20 77 69 74 68 20 61 20 52 45 46 45 52 45 4e 43   with a REFERENC
8860: 45 53 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  ES clause is not
8870: 20 73 75 70 70 6f 72 74 65 64 2e 0a 20 20 20 20   supported..    
8880: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
8890: 20 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42   CREATE TEMP TAB
88a0: 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20  LE t1(a PRIMARY 
88b0: 4b 45 59 29 20 57 49 54 48 4f 55 54 20 72 6f 77  KEY) WITHOUT row
88c0: 69 64 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  id;.      CREATE
88d0: 20 54 45 4d 50 20 54 41 42 4c 45 20 74 32 28 61   TEMP TABLE t2(a
88e0: 2c 20 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , b);.    }.    
88f0: 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54 45 52  catchsql { ALTER
8900: 20 54 41 42 4c 45 20 74 32 20 41 44 44 20 43 4f   TABLE t2 ADD CO
8910: 4c 55 4d 4e 20 63 20 52 45 46 45 52 45 4e 43 45  LUMN c REFERENCE
8920: 53 20 74 31 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d  S t1 }.  } {0 {}
8930: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68  }.  do_test with
8940: 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e 31 74  out_rowid3-14.1t
8950: 6d 70 2e 32 20 7b 0a 20 20 20 20 63 61 74 63 68  mp.2 {.    catch
8960: 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c  sql { ALTER TABL
8970: 45 20 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20  E t2 ADD COLUMN 
8980: 64 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c 20 52  d DEFAULT NULL R
8990: 45 46 45 52 45 4e 43 45 53 20 74 31 20 7d 0a 20  EFERENCES t1 }. 
89a0: 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74   } {0 {}}.  do_t
89b0: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
89c0: 64 33 2d 31 34 2e 31 74 6d 70 2e 33 20 7b 0a 20  d3-14.1tmp.3 {. 
89d0: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c     catchsql { AL
89e0: 54 45 52 20 54 41 42 4c 45 20 74 32 20 41 44 44  TER TABLE t2 ADD
89f0: 20 43 4f 4c 55 4d 4e 20 65 20 52 45 46 45 52 45   COLUMN e REFERE
8a00: 4e 43 45 53 20 74 31 20 44 45 46 41 55 4c 54 20  NCES t1 DEFAULT 
8a10: 4e 55 4c 4c 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d  NULL}.  } {0 {}}
8a20: 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  .  do_test witho
8a30: 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e 31 74 6d  ut_rowid3-14.1tm
8a40: 70 2e 34 20 7b 0a 20 20 20 20 63 61 74 63 68 73  p.4 {.    catchs
8a50: 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45  ql { ALTER TABLE
8a60: 20 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 66   t2 ADD COLUMN f
8a70: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 44   REFERENCES t1 D
8a80: 45 46 41 55 4c 54 20 27 74 65 78 74 27 7d 0a 20  EFAULT 'text'}. 
8a90: 20 7d 20 7b 31 20 7b 43 61 6e 6e 6f 74 20 61 64   } {1 {Cannot ad
8aa0: 64 20 61 20 52 45 46 45 52 45 4e 43 45 53 20 63  d a REFERENCES c
8ab0: 6f 6c 75 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e  olumn with non-N
8ac0: 55 4c 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ULL default valu
8ad0: 65 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69  e}}.  do_test wi
8ae0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e  thout_rowid3-14.
8af0: 31 74 6d 70 2e 35 20 7b 0a 20 20 20 20 63 61 74  1tmp.5 {.    cat
8b00: 63 68 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41  chsql { ALTER TA
8b10: 42 4c 45 20 74 32 20 41 44 44 20 43 4f 4c 55 4d  BLE t2 ADD COLUM
8b20: 4e 20 67 20 44 45 46 41 55 4c 54 20 43 55 52 52  N g DEFAULT CURR
8b30: 45 4e 54 5f 54 49 4d 45 20 52 45 46 45 52 45 4e  ENT_TIME REFEREN
8b40: 43 45 53 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20  CES t1 }.  } {1 
8b50: 7b 43 61 6e 6e 6f 74 20 61 64 64 20 61 20 52 45  {Cannot add a RE
8b60: 46 45 52 45 4e 43 45 53 20 63 6f 6c 75 6d 6e 20  FERENCES column 
8b70: 77 69 74 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65  with non-NULL de
8b80: 66 61 75 6c 74 20 76 61 6c 75 65 7d 7d 0a 20 20  fault value}}.  
8b90: 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
8ba0: 72 6f 77 69 64 33 2d 31 34 2e 31 74 6d 70 2e 36  rowid3-14.1tmp.6
8bb0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
8bc0: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 66   .      PRAGMA f
8bd0: 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 6f 66  oreign_keys = of
8be0: 66 3b 0a 20 20 20 20 20 20 41 4c 54 45 52 20 54  f;.      ALTER T
8bf0: 41 42 4c 45 20 74 32 20 41 44 44 20 43 4f 4c 55  ABLE t2 ADD COLU
8c00: 4d 4e 20 68 20 44 45 46 41 55 4c 54 20 27 74 65  MN h DEFAULT 'te
8c10: 78 74 27 20 52 45 46 45 52 45 4e 43 45 53 20 74  xt' REFERENCES t
8c20: 31 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  1;.      PRAGMA 
8c30: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 6f  foreign_keys = o
8c40: 6e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  n;.      SELECT 
8c50: 73 71 6c 20 46 52 4f 4d 20 74 65 6d 70 2e 73 71  sql FROM temp.sq
8c60: 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
8c70: 45 20 6e 61 6d 65 3d 27 74 32 27 3b 0a 20 20 20  E name='t2';.   
8c80: 20 7d 0a 20 20 7d 20 7b 7b 43 52 45 41 54 45 20   }.  } {{CREATE 
8c90: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 2c 20 63  TABLE t2(a, b, c
8ca0: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 2c 20   REFERENCES t1, 
8cb0: 64 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c 20 52  d DEFAULT NULL R
8cc0: 45 46 45 52 45 4e 43 45 53 20 74 31 2c 20 65 20  EFERENCES t1, e 
8cd0: 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 44 45  REFERENCES t1 DE
8ce0: 46 41 55 4c 54 20 4e 55 4c 4c 2c 20 68 20 44 45  FAULT NULL, h DE
8cf0: 46 41 55 4c 54 20 27 74 65 78 74 27 20 52 45 46  FAULT 'text' REF
8d00: 45 52 45 4e 43 45 53 20 74 31 29 7d 7d 0a 0a 20  ERENCES t1)}}.. 
8d10: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
8d20: 6e 74 72 6f 6c 20 53 51 4c 49 54 45 5f 54 45 53  ntrol SQLITE_TES
8d30: 54 43 54 52 4c 5f 49 4e 54 45 52 4e 41 4c 5f 46  TCTRL_INTERNAL_F
8d40: 55 4e 43 54 49 4f 4e 53 20 31 0a 20 20 64 6f 5f  UNCTIONS 1.  do_
8d50: 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77  test without_row
8d60: 69 64 33 2d 31 34 2e 32 74 6d 70 2e 31 2e 31 20  id3-14.2tmp.1.1 
8d70: 7b 0a 20 20 20 20 74 65 73 74 5f 72 65 6e 61 6d  {.    test_renam
8d80: 65 5f 70 61 72 65 6e 74 20 7b 43 52 45 41 54 45  e_parent {CREATE
8d90: 20 54 41 42 4c 45 20 74 31 28 61 20 52 45 46 45   TABLE t1(a REFE
8da0: 52 45 4e 43 45 53 20 74 32 29 7d 20 74 32 20 74  RENCES t2)} t2 t
8db0: 33 0a 20 20 7d 20 7b 7b 43 52 45 41 54 45 20 54  3.  } {{CREATE T
8dc0: 41 42 4c 45 20 74 31 28 61 20 52 45 46 45 52 45  ABLE t1(a REFERE
8dd0: 4e 43 45 53 20 22 74 33 22 29 7d 7d 0a 20 20 64  NCES "t3")}}.  d
8de0: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
8df0: 6f 77 69 64 33 2d 31 34 2e 32 74 6d 70 2e 31 2e  owid3-14.2tmp.1.
8e00: 32 20 7b 0a 20 20 20 20 74 65 73 74 5f 72 65 6e  2 {.    test_ren
8e10: 61 6d 65 5f 70 61 72 65 6e 74 20 7b 43 52 45 41  ame_parent {CREA
8e20: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 52 45  TE TABLE t1(a RE
8e30: 46 45 52 45 4e 43 45 53 20 74 32 29 7d 20 74 34  FERENCES t2)} t4
8e40: 20 74 33 0a 20 20 7d 20 7b 7b 43 52 45 41 54 45   t3.  } {{CREATE
8e50: 20 54 41 42 4c 45 20 74 31 28 61 20 52 45 46 45   TABLE t1(a REFE
8e60: 52 45 4e 43 45 53 20 74 32 29 7d 7d 0a 20 20 64  RENCES t2)}}.  d
8e70: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
8e80: 6f 77 69 64 33 2d 31 34 2e 32 74 6d 70 2e 31 2e  owid3-14.2tmp.1.
8e90: 33 20 7b 0a 20 20 20 20 74 65 73 74 5f 72 65 6e  3 {.    test_ren
8ea0: 61 6d 65 5f 70 61 72 65 6e 74 20 7b 43 52 45 41  ame_parent {CREA
8eb0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 52 45  TE TABLE t1(a RE
8ec0: 46 45 52 45 4e 43 45 53 20 22 74 32 22 29 7d 20  FERENCES "t2")} 
8ed0: 74 32 20 74 33 0a 20 20 7d 20 7b 7b 43 52 45 41  t2 t3.  } {{CREA
8ee0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 52 45  TE TABLE t1(a RE
8ef0: 46 45 52 45 4e 43 45 53 20 22 74 33 22 29 7d 7d  FERENCES "t3")}}
8f00: 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
8f10: 63 6f 6e 74 72 6f 6c 20 53 51 4c 49 54 45 5f 54  control SQLITE_T
8f20: 45 53 54 43 54 52 4c 5f 49 4e 54 45 52 4e 41 4c  ESTCTRL_INTERNAL
8f30: 5f 46 55 4e 43 54 49 4f 4e 53 20 30 0a 20 20 0a  _FUNCTIONS 0.  .
8f40: 20 20 23 20 54 65 73 74 20 41 4c 54 45 52 20 54    # Test ALTER T
8f50: 41 42 4c 45 20 52 45 4e 41 4d 45 20 54 41 42 4c  ABLE RENAME TABL
8f60: 45 20 61 20 62 69 74 2e 0a 20 20 23 0a 20 20 64  E a bit..  #.  d
8f70: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
8f80: 6f 77 69 64 33 2d 31 34 2e 32 74 6d 70 2e 32 2e  owid3-14.2tmp.2.
8f90: 31 20 7b 0a 20 20 20 20 64 72 6f 70 5f 61 6c 6c  1 {.    drop_all
8fa0: 5f 74 61 62 6c 65 73 0a 20 20 20 20 65 78 65 63  _tables.    exec
8fb0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41  sql {.      CREA
8fc0: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 74 31  TE TEMP TABLE t1
8fd0: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
8fe0: 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 29  b REFERENCES t1)
8ff0: 20 57 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a   WITHOUT rowid;.
9000: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d        CREATE TEM
9010: 50 20 54 41 42 4c 45 20 74 32 28 61 20 50 52 49  P TABLE t2(a PRI
9020: 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45  MARY KEY, b REFE
9030: 52 45 4e 43 45 53 20 74 31 2c 20 63 20 52 45 46  RENCES t1, c REF
9040: 45 52 45 4e 43 45 53 20 74 32 29 0a 20 20 20 20  ERENCES t2).    
9050: 20 20 20 20 20 20 20 20 57 49 54 48 4f 55 54 20          WITHOUT 
9060: 72 6f 77 69 64 3b 0a 20 20 20 20 20 20 43 52 45  rowid;.      CRE
9070: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 74  ATE TEMP TABLE t
9080: 33 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 74  3(a REFERENCES t
9090: 31 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  1, b REFERENCES 
90a0: 74 32 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53  t2, c REFERENCES
90b0: 20 74 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   t1);.    }.    
90c0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
90d0: 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
90e0: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 57 48 45  _temp_master WHE
90f0: 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65  RE type = 'table
9100: 27 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 5c 0a 20  '}.  } [list \. 
9110: 20 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45     {CREATE TABLE
9120: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
9130: 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  Y, b REFERENCES 
9140: 74 31 29 20 57 49 54 48 4f 55 54 20 72 6f 77 69  t1) WITHOUT rowi
9150: 64 7d 20 20 20 20 20 20 20 5c 0a 20 20 20 20 7b  d}       \.    {
9160: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
9170: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
9180: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 2c 20   REFERENCES t1, 
9190: 63 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 29  c REFERENCES t2)
91a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 57 49 54  .            WIT
91b0: 48 4f 55 54 20 72 6f 77 69 64 7d 20 20 20 20 5c  HOUT rowid}    \
91c0: 0a 20 20 20 20 7b 43 52 45 41 54 45 20 54 41 42  .    {CREATE TAB
91d0: 4c 45 20 74 33 28 61 20 52 45 46 45 52 45 4e 43  LE t3(a REFERENC
91e0: 45 53 20 74 31 2c 20 62 20 52 45 46 45 52 45 4e  ES t1, b REFEREN
91f0: 43 45 53 20 74 32 2c 20 63 20 52 45 46 45 52 45  CES t2, c REFERE
9200: 4e 43 45 53 20 74 31 29 7d 20 20 5c 0a 20 20 5d  NCES t1)}  \.  ]
9210: 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  .  do_test witho
9220: 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e 32 74 6d  ut_rowid3-14.2tm
9230: 70 2e 32 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  p.2.2 {.    exec
9240: 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c  sql { ALTER TABL
9250: 45 20 74 31 20 52 45 4e 41 4d 45 20 54 4f 20 74  E t1 RENAME TO t
9260: 34 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 }.    execsql 
9270: 7b 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f  { SELECT sql FRO
9280: 4d 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d 61  M temp.sqlite_ma
9290: 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65 20  ster WHERE type 
92a0: 3d 20 27 74 61 62 6c 65 27 7d 0a 20 20 7d 20 5b  = 'table'}.  } [
92b0: 6c 69 73 74 20 5c 0a 20 20 20 20 7b 43 52 45 41  list \.    {CREA
92c0: 54 45 20 54 41 42 4c 45 20 22 74 34 22 28 61 20  TE TABLE "t4"(a 
92d0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52  PRIMARY KEY, b R
92e0: 45 46 45 52 45 4e 43 45 53 20 22 74 34 22 29 20  EFERENCES "t4") 
92f0: 57 49 54 48 4f 55 54 20 72 6f 77 69 64 7d 20 20  WITHOUT rowid}  
9300: 20 20 20 20 5c 0a 20 20 20 20 7b 43 52 45 41 54      \.    {CREAT
9310: 45 20 54 41 42 4c 45 20 74 32 28 61 20 50 52 49  E TABLE t2(a PRI
9320: 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45  MARY KEY, b REFE
9330: 52 45 4e 43 45 53 20 22 74 34 22 2c 20 63 20 52  RENCES "t4", c R
9340: 45 46 45 52 45 4e 43 45 53 20 74 32 29 0a 20 20  EFERENCES t2).  
9350: 20 20 20 20 20 20 20 20 20 20 57 49 54 48 4f 55            WITHOU
9360: 54 20 72 6f 77 69 64 7d 20 20 20 20 20 5c 0a 20  T rowid}     \. 
9370: 20 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45     {CREATE TABLE
9380: 20 74 33 28 61 20 52 45 46 45 52 45 4e 43 45 53   t3(a REFERENCES
9390: 20 22 74 34 22 2c 20 62 20 52 45 46 45 52 45 4e   "t4", b REFEREN
93a0: 43 45 53 20 74 32 2c 20 63 20 52 45 46 45 52 45  CES t2, c REFERE
93b0: 4e 43 45 53 20 22 74 34 22 29 7d 20 5c 0a 20 20  NCES "t4")} \.  
93c0: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68  ].  do_test with
93d0: 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e 32 74  out_rowid3-14.2t
93e0: 6d 70 2e 32 2e 33 20 7b 0a 20 20 20 20 63 61 74  mp.2.3 {.    cat
93f0: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
9400: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c  NTO t3 VALUES(1,
9410: 20 32 2c 20 33 29 20 7d 0a 20 20 7d 20 7b 31 20   2, 3) }.  } {1 
9420: 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  {FOREIGN KEY con
9430: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
9440: 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  .  do_test witho
9450: 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e 32 74 6d  ut_rowid3-14.2tm
9460: 70 2e 32 2e 34 20 7b 0a 20 20 20 20 65 78 65 63  p.2.4 {.    exec
9470: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
9480: 4f 20 74 34 20 56 41 4c 55 45 53 28 31 2c 20 4e  O t4 VALUES(1, N
9490: 55 4c 4c 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20  ULL) }.  } {}.  
94a0: 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
94b0: 72 6f 77 69 64 33 2d 31 34 2e 32 74 6d 70 2e 32  rowid3-14.2tmp.2
94c0: 2e 35 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .5 {.    catchsq
94d0: 6c 20 7b 20 55 50 44 41 54 45 20 74 34 20 53 45  l { UPDATE t4 SE
94e0: 54 20 62 20 3d 20 35 20 7d 0a 20 20 7d 20 7b 31  T b = 5 }.  } {1
94f0: 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
9500: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
9510: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68  }.  do_test with
9520: 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e 32 74  out_rowid3-14.2t
9530: 6d 70 2e 32 2e 36 20 7b 0a 20 20 20 20 63 61 74  mp.2.6 {.    cat
9540: 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74  chsql { UPDATE t
9550: 34 20 53 45 54 20 62 20 3d 20 31 20 7d 0a 20 20  4 SET b = 1 }.  
9560: 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65  } {0 {}}.  do_te
9570: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
9580: 33 2d 31 34 2e 32 74 6d 70 2e 32 2e 37 20 7b 0a  3-14.2tmp.2.7 {.
9590: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
95a0: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
95b0: 55 45 53 28 31 2c 20 4e 55 4c 4c 2c 20 31 29 20  UES(1, NULL, 1) 
95c0: 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 23 20 52 65  }.  } {}..  # Re
95d0: 70 65 61 74 20 66 6f 72 20 41 54 54 41 43 48 2d  peat for ATTACH-
95e0: 65 64 20 74 61 62 6c 65 73 0a 20 20 23 0a 20 20  ed tables.  #.  
95f0: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
9600: 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75    do_test withou
9610: 74 5f 72 6f 77 69 64 33 2d 31 34 2e 31 61 75 78  t_rowid3-14.1aux
9620: 2e 31 20 7b 0a 20 20 20 20 23 20 41 64 64 69 6e  .1 {.    # Addin
9630: 67 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  g a column with 
9640: 61 20 52 45 46 45 52 45 4e 43 45 53 20 63 6c 61  a REFERENCES cla
9650: 75 73 65 20 69 73 20 6e 6f 74 20 73 75 70 70 6f  use is not suppo
9660: 72 74 65 64 2e 0a 20 20 20 20 65 78 65 63 73 71  rted..    execsq
9670: 6c 20 7b 20 0a 20 20 20 20 20 20 41 54 54 41 43  l { .      ATTAC
9680: 48 20 27 3a 6d 65 6d 6f 72 79 3a 27 20 41 53 20  H ':memory:' AS 
9690: 61 75 78 3b 0a 20 20 20 20 20 20 43 52 45 41 54  aux;.      CREAT
96a0: 45 20 54 41 42 4c 45 20 61 75 78 2e 74 31 28 61  E TABLE aux.t1(a
96b0: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 20 57 49   PRIMARY KEY) WI
96c0: 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20 20  THOUT rowid;.   
96d0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
96e0: 61 75 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20  aux.t2(a, b);.  
96f0: 20 20 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c    }.    catchsql
9700: 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74   { ALTER TABLE t
9710: 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20 52  2 ADD COLUMN c R
9720: 45 46 45 52 45 4e 43 45 53 20 74 31 20 7d 0a 20  EFERENCES t1 }. 
9730: 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74   } {0 {}}.  do_t
9740: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
9750: 64 33 2d 31 34 2e 31 61 75 78 2e 32 20 7b 0a 20  d3-14.1aux.2 {. 
9760: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c     catchsql { AL
9770: 54 45 52 20 54 41 42 4c 45 20 74 32 20 41 44 44  TER TABLE t2 ADD
9780: 20 43 4f 4c 55 4d 4e 20 64 20 44 45 46 41 55 4c   COLUMN d DEFAUL
9790: 54 20 4e 55 4c 4c 20 52 45 46 45 52 45 4e 43 45  T NULL REFERENCE
97a0: 53 20 74 31 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d  S t1 }.  } {0 {}
97b0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68  }.  do_test with
97c0: 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e 31 61  out_rowid3-14.1a
97d0: 75 78 2e 33 20 7b 0a 20 20 20 20 63 61 74 63 68  ux.3 {.    catch
97e0: 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c  sql { ALTER TABL
97f0: 45 20 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20  E t2 ADD COLUMN 
9800: 65 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20  e REFERENCES t1 
9810: 44 45 46 41 55 4c 54 20 4e 55 4c 4c 7d 0a 20 20  DEFAULT NULL}.  
9820: 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65  } {0 {}}.  do_te
9830: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
9840: 33 2d 31 34 2e 31 61 75 78 2e 34 20 7b 0a 20 20  3-14.1aux.4 {.  
9850: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54    catchsql { ALT
9860: 45 52 20 54 41 42 4c 45 20 74 32 20 41 44 44 20  ER TABLE t2 ADD 
9870: 43 4f 4c 55 4d 4e 20 66 20 52 45 46 45 52 45 4e  COLUMN f REFEREN
9880: 43 45 53 20 74 31 20 44 45 46 41 55 4c 54 20 27  CES t1 DEFAULT '
9890: 74 65 78 74 27 7d 0a 20 20 7d 20 7b 31 20 7b 43  text'}.  } {1 {C
98a0: 61 6e 6e 6f 74 20 61 64 64 20 61 20 52 45 46 45  annot add a REFE
98b0: 52 45 4e 43 45 53 20 63 6f 6c 75 6d 6e 20 77 69  RENCES column wi
98c0: 74 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61  th non-NULL defa
98d0: 75 6c 74 20 76 61 6c 75 65 7d 7d 0a 20 20 64 6f  ult value}}.  do
98e0: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
98f0: 77 69 64 33 2d 31 34 2e 31 61 75 78 2e 35 20 7b  wid3-14.1aux.5 {
9900: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
9910: 41 4c 54 45 52 20 54 41 42 4c 45 20 74 32 20 41  ALTER TABLE t2 A
9920: 44 44 20 43 4f 4c 55 4d 4e 20 67 20 44 45 46 41  DD COLUMN g DEFA
9930: 55 4c 54 20 43 55 52 52 45 4e 54 5f 54 49 4d 45  ULT CURRENT_TIME
9940: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 7d   REFERENCES t1 }
9950: 0a 20 20 7d 20 7b 31 20 7b 43 61 6e 6e 6f 74 20  .  } {1 {Cannot 
9960: 61 64 64 20 61 20 52 45 46 45 52 45 4e 43 45 53  add a REFERENCES
9970: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 6e 6f 6e   column with non
9980: 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74 20 76 61  -NULL default va
9990: 6c 75 65 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  lue}}.  do_test 
99a0: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31  without_rowid3-1
99b0: 34 2e 31 61 75 78 2e 36 20 7b 0a 20 20 20 20 65  4.1aux.6 {.    e
99c0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20  xecsql { .      
99d0: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
99e0: 65 79 73 20 3d 20 6f 66 66 3b 0a 20 20 20 20 20  eys = off;.     
99f0: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 32 20   ALTER TABLE t2 
9a00: 41 44 44 20 43 4f 4c 55 4d 4e 20 68 20 44 45 46  ADD COLUMN h DEF
9a10: 41 55 4c 54 20 27 74 65 78 74 27 20 52 45 46 45  AULT 'text' REFE
9a20: 52 45 4e 43 45 53 20 74 31 3b 0a 20 20 20 20 20  RENCES t1;.     
9a30: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
9a40: 6b 65 79 73 20 3d 20 6f 6e 3b 0a 20 20 20 20 20  keys = on;.     
9a50: 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d   SELECT sql FROM
9a60: 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d 61 73 74   aux.sqlite_mast
9a70: 65 72 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 74  er WHERE name='t
9a80: 32 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7b  2';.    }.  } {{
9a90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
9aa0: 61 2c 20 62 2c 20 63 20 52 45 46 45 52 45 4e 43  a, b, c REFERENC
9ab0: 45 53 20 74 31 2c 20 64 20 44 45 46 41 55 4c 54  ES t1, d DEFAULT
9ac0: 20 4e 55 4c 4c 20 52 45 46 45 52 45 4e 43 45 53   NULL REFERENCES
9ad0: 20 74 31 2c 20 65 20 52 45 46 45 52 45 4e 43 45   t1, e REFERENCE
9ae0: 53 20 74 31 20 44 45 46 41 55 4c 54 20 4e 55 4c  S t1 DEFAULT NUL
9af0: 4c 2c 20 68 20 44 45 46 41 55 4c 54 20 27 74 65  L, h DEFAULT 'te
9b00: 78 74 27 20 52 45 46 45 52 45 4e 43 45 53 20 74  xt' REFERENCES t
9b10: 31 29 7d 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  1)}}..  sqlite3_
9b20: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 53 51 4c  test_control SQL
9b30: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4e 54  ITE_TESTCTRL_INT
9b40: 45 52 4e 41 4c 5f 46 55 4e 43 54 49 4f 4e 53 20  ERNAL_FUNCTIONS 
9b50: 31 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68  1.  do_test with
9b60: 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e 32 61  out_rowid3-14.2a
9b70: 75 78 2e 31 2e 31 20 7b 0a 20 20 20 20 74 65 73  ux.1.1 {.    tes
9b80: 74 5f 72 65 6e 61 6d 65 5f 70 61 72 65 6e 74 20  t_rename_parent 
9b90: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  {CREATE TABLE t1
9ba0: 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 74 32  (a REFERENCES t2
9bb0: 29 7d 20 74 32 20 74 33 0a 20 20 7d 20 7b 7b 43  )} t2 t3.  } {{C
9bc0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
9bd0: 20 52 45 46 45 52 45 4e 43 45 53 20 22 74 33 22   REFERENCES "t3"
9be0: 29 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69  )}}.  do_test wi
9bf0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e  thout_rowid3-14.
9c00: 32 61 75 78 2e 31 2e 32 20 7b 0a 20 20 20 20 74  2aux.1.2 {.    t
9c10: 65 73 74 5f 72 65 6e 61 6d 65 5f 70 61 72 65 6e  est_rename_paren
9c20: 74 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20  t {CREATE TABLE 
9c30: 74 31 28 61 20 52 45 46 45 52 45 4e 43 45 53 20  t1(a REFERENCES 
9c40: 74 32 29 7d 20 74 34 20 74 33 0a 20 20 7d 20 7b  t2)} t4 t3.  } {
9c50: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  {CREATE TABLE t1
9c60: 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 74 32  (a REFERENCES t2
9c70: 29 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69  )}}.  do_test wi
9c80: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e  thout_rowid3-14.
9c90: 32 61 75 78 2e 31 2e 33 20 7b 0a 20 20 20 20 74  2aux.1.3 {.    t
9ca0: 65 73 74 5f 72 65 6e 61 6d 65 5f 70 61 72 65 6e  est_rename_paren
9cb0: 74 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20  t {CREATE TABLE 
9cc0: 74 31 28 61 20 52 45 46 45 52 45 4e 43 45 53 20  t1(a REFERENCES 
9cd0: 22 74 32 22 29 7d 20 74 32 20 74 33 0a 20 20 7d  "t2")} t2 t3.  }
9ce0: 20 7b 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20   {{CREATE TABLE 
9cf0: 74 31 28 61 20 52 45 46 45 52 45 4e 43 45 53 20  t1(a REFERENCES 
9d00: 22 74 33 22 29 7d 7d 0a 20 20 73 71 6c 69 74 65  "t3")}}.  sqlite
9d10: 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 53  3_test_control S
9d20: 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
9d30: 4e 54 45 52 4e 41 4c 5f 46 55 4e 43 54 49 4f 4e  NTERNAL_FUNCTION
9d40: 53 20 30 0a 20 20 0a 20 20 23 20 54 65 73 74 20  S 0.  .  # Test 
9d50: 41 4c 54 45 52 20 54 41 42 4c 45 20 52 45 4e 41  ALTER TABLE RENA
9d60: 4d 45 20 54 41 42 4c 45 20 61 20 62 69 74 2e 0a  ME TABLE a bit..
9d70: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 69    #.  do_test wi
9d80: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e  thout_rowid3-14.
9d90: 32 61 75 78 2e 32 2e 31 20 7b 0a 20 20 20 20 64  2aux.2.1 {.    d
9da0: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
9db0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
9dc0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9dd0: 61 75 78 2e 74 31 28 61 20 50 52 49 4d 41 52 59  aux.t1(a PRIMARY
9de0: 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43   KEY, b REFERENC
9df0: 45 53 20 74 31 29 20 57 49 54 48 4f 55 54 20 72  ES t1) WITHOUT r
9e00: 6f 77 69 64 3b 0a 20 20 20 20 20 20 43 52 45 41  owid;.      CREA
9e10: 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28  TE TABLE aux.t2(
9e20: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
9e30: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 2c 20   REFERENCES t1, 
9e40: 63 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 29  c REFERENCES t2)
9e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 57 49 54  .            WIT
9e60: 48 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20 20 20  HOUT rowid;.    
9e70: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
9e80: 75 78 2e 74 33 28 61 20 52 45 46 45 52 45 4e 43  ux.t3(a REFERENC
9e90: 45 53 20 74 31 2c 20 62 20 52 45 46 45 52 45 4e  ES t1, b REFEREN
9ea0: 43 45 53 20 74 32 2c 20 63 20 52 45 46 45 52 45  CES t2, c REFERE
9eb0: 4e 43 45 53 20 74 31 29 3b 0a 20 20 20 20 7d 0a  NCES t1);.    }.
9ec0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
9ed0: 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 61 75  LECT sql FROM au
9ee0: 78 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  x.sqlite_master 
9ef0: 57 48 45 52 45 20 74 79 70 65 20 3d 20 27 74 61  WHERE type = 'ta
9f00: 62 6c 65 27 7d 0a 20 20 7d 20 5b 6c 69 73 74 20  ble'}.  } [list 
9f10: 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20 54 41  \.    {CREATE TA
9f20: 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59  BLE t1(a PRIMARY
9f30: 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43   KEY, b REFERENC
9f40: 45 53 20 74 31 29 20 57 49 54 48 4f 55 54 20 72  ES t1) WITHOUT r
9f50: 6f 77 69 64 7d 20 20 20 20 20 20 20 5c 0a 20 20  owid}       \.  
9f60: 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20    {CREATE TABLE 
9f70: 74 32 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  t2(a PRIMARY KEY
9f80: 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 74  , b REFERENCES t
9f90: 31 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53 20  1, c REFERENCES 
9fa0: 74 32 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  t2).            
9fb0: 57 49 54 48 4f 55 54 20 72 6f 77 69 64 7d 20 20  WITHOUT rowid}  
9fc0: 20 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20    \.    {CREATE 
9fd0: 54 41 42 4c 45 20 74 33 28 61 20 52 45 46 45 52  TABLE t3(a REFER
9fe0: 45 4e 43 45 53 20 74 31 2c 20 62 20 52 45 46 45  ENCES t1, b REFE
9ff0: 52 45 4e 43 45 53 20 74 32 2c 20 63 20 52 45 46  RENCES t2, c REF
a000: 45 52 45 4e 43 45 53 20 74 31 29 7d 20 20 5c 0a  ERENCES t1)}  \.
a010: 20 20 5d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69    ].  do_test wi
a020: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e  thout_rowid3-14.
a030: 32 61 75 78 2e 32 2e 32 20 7b 0a 20 20 20 20 65  2aux.2.2 {.    e
a040: 78 65 63 73 71 6c 20 7b 20 41 4c 54 45 52 20 54  xecsql { ALTER T
a050: 41 42 4c 45 20 74 31 20 52 45 4e 41 4d 45 20 54  ABLE t1 RENAME T
a060: 4f 20 74 34 20 7d 0a 20 20 20 20 65 78 65 63 73  O t4 }.    execs
a070: 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 71 6c 20  ql { SELECT sql 
a080: 46 52 4f 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f  FROM aux.sqlite_
a090: 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70  master WHERE typ
a0a0: 65 20 3d 20 27 74 61 62 6c 65 27 7d 0a 20 20 7d  e = 'table'}.  }
a0b0: 20 5b 6c 69 73 74 20 5c 0a 20 20 20 20 7b 43 52   [list \.    {CR
a0c0: 45 41 54 45 20 54 41 42 4c 45 20 22 74 34 22 28  EATE TABLE "t4"(
a0d0: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
a0e0: 20 52 45 46 45 52 45 4e 43 45 53 20 22 74 34 22   REFERENCES "t4"
a0f0: 29 20 57 49 54 48 4f 55 54 20 72 6f 77 69 64 7d  ) WITHOUT rowid}
a100: 20 20 20 20 20 20 5c 0a 20 20 20 20 7b 43 52 45        \.    {CRE
a110: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 50  ATE TABLE t2(a P
a120: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45  RIMARY KEY, b RE
a130: 46 45 52 45 4e 43 45 53 20 22 74 34 22 2c 20 63  FERENCES "t4", c
a140: 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 0a   REFERENCES t2).
a150: 20 20 20 20 20 20 20 20 20 20 20 20 57 49 54 48              WITH
a160: 4f 55 54 20 72 6f 77 69 64 7d 20 20 20 20 20 5c  OUT rowid}     \
a170: 0a 20 20 20 20 7b 43 52 45 41 54 45 20 54 41 42  .    {CREATE TAB
a180: 4c 45 20 74 33 28 61 20 52 45 46 45 52 45 4e 43  LE t3(a REFERENC
a190: 45 53 20 22 74 34 22 2c 20 62 20 52 45 46 45 52  ES "t4", b REFER
a1a0: 45 4e 43 45 53 20 74 32 2c 20 63 20 52 45 46 45  ENCES t2, c REFE
a1b0: 52 45 4e 43 45 53 20 22 74 34 22 29 7d 20 5c 0a  RENCES "t4")} \.
a1c0: 20 20 5d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69    ].  do_test wi
a1d0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e  thout_rowid3-14.
a1e0: 32 61 75 78 2e 32 2e 33 20 7b 0a 20 20 20 20 63  2aux.2.3 {.    c
a1f0: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
a200: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
a210: 31 2c 20 32 2c 20 33 29 20 7d 0a 20 20 7d 20 7b  1, 2, 3) }.  } {
a220: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
a230: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
a240: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74  }}.  do_test wit
a250: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e 32  hout_rowid3-14.2
a260: 61 75 78 2e 32 2e 34 20 7b 0a 20 20 20 20 65 78  aux.2.4 {.    ex
a270: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
a280: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 31 2c  NTO t4 VALUES(1,
a290: 20 4e 55 4c 4c 29 20 7d 0a 20 20 7d 20 7b 7d 0a   NULL) }.  } {}.
a2a0: 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75    do_test withou
a2b0: 74 5f 72 6f 77 69 64 33 2d 31 34 2e 32 61 75 78  t_rowid3-14.2aux
a2c0: 2e 32 2e 35 20 7b 0a 20 20 20 20 63 61 74 63 68  .2.5 {.    catch
a2d0: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 34 20  sql { UPDATE t4 
a2e0: 53 45 54 20 62 20 3d 20 35 20 7d 0a 20 20 7d 20  SET b = 5 }.  } 
a2f0: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
a300: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
a310: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69  d}}.  do_test wi
a320: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 34 2e  thout_rowid3-14.
a330: 32 61 75 78 2e 32 2e 36 20 7b 0a 20 20 20 20 63  2aux.2.6 {.    c
a340: 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45  atchsql { UPDATE
a350: 20 74 34 20 53 45 54 20 62 20 3d 20 31 20 7d 0a   t4 SET b = 1 }.
a360: 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f    } {0 {}}.  do_
a370: 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77  test without_row
a380: 69 64 33 2d 31 34 2e 32 61 75 78 2e 32 2e 37 20  id3-14.2aux.2.7 
a390: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
a3a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
a3b0: 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 2c 20 31  ALUES(1, NULL, 1
a3c0: 29 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 64 6f  ) }.  } {}.}..do
a3d0: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
a3e0: 77 69 64 33 2d 32 2e 31 34 2e 33 2e 31 20 7b 0a  wid3-2.14.3.1 {.
a3f0: 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65    drop_all_table
a400: 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  s.  execsql {.  
a410: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a420: 31 28 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45  1(a, b REFERENCE
a430: 53 20 6e 6f 73 75 63 68 74 61 62 6c 65 29 3b 0a  S nosuchtable);.
a440: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
a450: 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  1;.  }.} {}.do_t
a460: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
a470: 64 33 2d 32 2e 31 34 2e 33 2e 32 20 7b 0a 20 20  d3-2.14.3.2 {.  
a480: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
a490: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
a4a0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 20  PRIMARY KEY, b) 
a4b0: 57 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a 20  WITHOUT rowid;. 
a4c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a4d0: 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 31 29  1 VALUES('a', 1)
a4e0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
a4f0: 4c 45 20 74 32 28 78 20 52 45 46 45 52 45 4e 43  LE t2(x REFERENC
a500: 45 53 20 74 31 29 3b 0a 20 20 20 20 49 4e 53 45  ES t1);.    INSE
a510: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
a520: 53 28 27 61 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  S('a');.  }.} {}
a530: 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74  .do_test without
a540: 5f 72 6f 77 69 64 33 2d 32 2e 31 34 2e 33 2e 33  _rowid3-2.14.3.3
a550: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
a560: 44 52 4f 50 20 54 41 42 4c 45 20 74 31 20 7d 0a  DROP TABLE t1 }.
a570: 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
a580: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
a590: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 69  led}}.do_test wi
a5a0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2e 31  thout_rowid3-2.1
a5b0: 34 2e 33 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  4.3.4 {.  execsq
a5c0: 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
a5d0: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 44 52 4f 50  ROM t2;.    DROP
a5e0: 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 7d 0a 7d   TABLE t1;.  }.}
a5f0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68   {}.do_test with
a600: 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2e 31 34 2e  out_rowid3-2.14.
a610: 33 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  3.4 {.  catchsql
a620: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
a630: 32 20 56 41 4c 55 45 53 28 27 78 27 29 20 7d 0a  2 VALUES('x') }.
a640: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61  } {1 {no such ta
a650: 62 6c 65 3a 20 6d 61 69 6e 2e 74 31 7d 7d 0a 64  ble: main.t1}}.d
a660: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
a670: 6f 77 69 64 33 2d 32 2e 31 34 2e 33 2e 35 20 7b  owid3-2.14.3.5 {
a680: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a690: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
a6a0: 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 20  (x PRIMARY KEY) 
a6b0: 57 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a 20  WITHOUT rowid;. 
a6c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a6d0: 31 20 56 41 4c 55 45 53 28 27 78 27 29 3b 0a 20  1 VALUES('x');. 
a6e0: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   }.  execsql { I
a6f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
a700: 4c 55 45 53 28 27 78 27 29 20 7d 0a 7d 20 7b 7d  LUES('x') }.} {}
a710: 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74  .do_test without
a720: 5f 72 6f 77 69 64 33 2d 32 2e 31 34 2e 33 2e 36  _rowid3-2.14.3.6
a730: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
a740: 44 52 4f 50 20 54 41 42 4c 45 20 74 31 20 7d 0a  DROP TABLE t1 }.
a750: 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
a760: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
a770: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 69  led}}.do_test wi
a780: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2e 31  thout_rowid3-2.1
a790: 34 2e 33 2e 37 20 7b 0a 20 20 65 78 65 63 73 71  4.3.7 {.  execsq
a7a0: 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  l {.    DROP TAB
a7b0: 4c 45 20 74 32 3b 0a 20 20 20 20 44 52 4f 50 20  LE t2;.    DROP 
a7c0: 54 41 42 4c 45 20 74 31 3b 0a 20 20 7d 0a 7d 20  TABLE t1;.  }.} 
a7d0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  {}.do_test witho
a7e0: 75 74 5f 72 6f 77 69 64 33 2d 32 2e 31 34 2e 33  ut_rowid3-2.14.3
a7f0: 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .8 {.  execsql {
a800: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
a810: 45 20 70 70 28 78 2c 20 79 2c 20 50 52 49 4d 41  E pp(x, y, PRIMA
a820: 52 59 20 4b 45 59 28 78 2c 20 79 29 29 20 57 49  RY KEY(x, y)) WI
a830: 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 20 20 20  THOUT ROWID;.   
a840: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 63   CREATE TABLE cc
a850: 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
a860: 45 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e  EY(a, b) REFEREN
a870: 43 45 53 20 70 70 28 78 2c 20 7a 29 29 3b 0a 20  CES pp(x, z));. 
a880: 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   }.  catchsql { 
a890: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56  INSERT INTO cc V
a8a0: 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a 7d 20  ALUES(1, 2) }.} 
a8b0: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
a8c0: 6d 69 73 6d 61 74 63 68 20 2d 20 22 63 63 22 20  mismatch - "cc" 
a8d0: 72 65 66 65 72 65 6e 63 69 6e 67 20 22 70 70 22  referencing "pp"
a8e0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  }}.do_test witho
a8f0: 75 74 5f 72 6f 77 69 64 33 2d 32 2e 31 34 2e 33  ut_rowid3-2.14.3
a900: 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .9 {.  execsql {
a910: 20 44 52 4f 50 20 54 41 42 4c 45 20 63 63 20 7d   DROP TABLE cc }
a920: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 69  .} {}.do_test wi
a930: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2e 31  thout_rowid3-2.1
a940: 34 2e 33 2e 31 30 20 7b 0a 20 20 65 78 65 63 73  4.3.10 {.  execs
a950: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
a960: 54 41 42 4c 45 20 63 63 28 61 2c 20 62 2c 20 0a  TABLE cc(a, b, .
a970: 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45        FOREIGN KE
a980: 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43  Y(a, b) REFERENC
a990: 45 53 20 70 70 20 44 45 46 45 52 52 41 42 4c 45  ES pp DEFERRABLE
a9a0: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
a9b0: 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  RED.    );.  }. 
a9c0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
a9d0: 4e 53 45 52 54 20 49 4e 54 4f 20 70 70 20 56 41  NSERT INTO pp VA
a9e0: 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a  LUES('a', 'b');.
a9f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
aa00: 63 63 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  cc VALUES('a', '
aa10: 62 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  b');.    BEGIN;.
aa20: 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45        DROP TABLE
aa30: 20 70 70 3b 0a 20 20 20 20 20 20 43 52 45 41 54   pp;.      CREAT
aa40: 45 20 54 41 42 4c 45 20 70 70 28 61 2c 20 62 2c  E TABLE pp(a, b,
aa50: 20 63 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   c, PRIMARY KEY(
aa60: 62 2c 20 63 29 29 20 57 49 54 48 4f 55 54 20 72  b, c)) WITHOUT r
aa70: 6f 77 69 64 3b 0a 20 20 20 20 20 20 49 4e 53 45  owid;.      INSE
aa80: 52 54 20 49 4e 54 4f 20 70 70 20 56 41 4c 55 45  RT INTO pp VALUE
aa90: 53 28 31 2c 20 27 61 27 2c 20 27 62 27 29 3b 0a  S(1, 'a', 'b');.
aaa0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
aab0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74  } {}.do_test wit
aac0: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 2e 31 34  hout_rowid3-2.14
aad0: 2e 33 2e 31 31 20 7b 0a 20 20 65 78 65 63 73 71  .3.11 {.  execsq
aae0: 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a  l { .    BEGIN;.
aaf0: 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45        DROP TABLE
ab00: 20 63 63 3b 0a 20 20 20 20 20 20 44 52 4f 50 20   cc;.      DROP 
ab10: 54 41 42 4c 45 20 70 70 3b 0a 20 20 20 20 43 4f  TABLE pp;.    CO
ab20: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  MMIT;.  }.} {}.d
ab30: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
ab40: 6f 77 69 64 33 2d 32 2e 31 34 2e 33 2e 31 32 20  owid3-2.14.3.12 
ab50: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
ab60: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 62    CREATE TABLE b
ab70: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
ab80: 41 54 45 20 54 41 42 4c 45 20 62 32 28 61 2c 20  ATE TABLE b2(a, 
ab90: 62 20 52 45 46 45 52 45 4e 43 45 53 20 62 31 29  b REFERENCES b1)
aba0: 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
abb0: 20 62 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f   b1;.  }.} {}.do
abc0: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
abd0: 77 69 64 33 2d 32 2e 31 34 2e 33 2e 31 33 20 7b  wid3-2.14.3.13 {
abe0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
abf0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 33   CREATE TABLE b3
ac00: 28 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53  (a, b REFERENCES
ac10: 20 62 32 20 44 45 46 45 52 52 41 42 4c 45 20 49   b2 DEFERRABLE I
ac20: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
ac30: 44 29 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  D);.    DROP TAB
ac40: 4c 45 20 62 32 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  LE b2;.  }.} {}.
ac50: 0a 23 20 54 65 73 74 20 74 68 61 74 20 6e 6f 74  .# Test that not
ac60: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
ac70: 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 61 20  when dropping a 
ac80: 74 61 62 6c 65 20 74 68 61 74 20 72 65 66 65 72  table that refer
ac90: 73 20 74 6f 20 61 20 76 69 65 77 2e 0a 23 20 4f  s to a view..# O
aca0: 72 20 64 72 6f 70 70 69 6e 67 20 61 20 76 69 65  r dropping a vie
acb0: 77 20 74 68 61 74 20 61 6e 20 65 78 69 73 74 69  w that an existi
acc0: 6e 67 20 46 4b 20 28 69 6e 63 6f 72 72 65 63 74  ng FK (incorrect
acd0: 6c 79 29 20 72 65 66 65 72 73 20 74 6f 2e 20 4f  ly) refers to. O
ace0: 72 20 65 69 74 68 65 72 0a 23 20 6f 66 20 74 68  r either.# of th
acf0: 65 20 61 62 6f 76 65 20 73 63 65 6e 61 72 69 6f  e above scenario
ad00: 73 20 77 69 74 68 20 61 20 76 69 72 74 75 61 6c  s with a virtual
ad10: 20 74 61 62 6c 65 2e 0a 64 72 6f 70 5f 61 6c 6c   table..drop_all
ad20: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
ad30: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32  without_rowid3-2
ad40: 2e 31 34 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63  .14.4.1 {.  exec
ad50: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
ad60: 20 54 41 42 4c 45 20 74 31 28 78 20 52 45 46 45   TABLE t1(x REFE
ad70: 52 45 4e 43 45 53 20 76 29 3b 20 0a 20 20 20 20  RENCES v); .    
ad80: 43 52 45 41 54 45 20 56 49 45 57 20 76 20 41 53  CREATE VIEW v AS
ad90: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
ada0: 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  1;.  }.} {}.do_t
adb0: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
adc0: 64 33 2d 32 2e 31 34 2e 34 2e 32 20 7b 0a 20 20  d3-2.14.4.2 {.  
add0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52  execsql {.    DR
ade0: 4f 50 20 56 49 45 57 20 76 3b 0a 20 20 7d 0a 7d  OP VIEW v;.  }.}
adf0: 20 7b 7d 0a 69 66 63 61 70 61 62 6c 65 20 76 74   {}.ifcapable vt
ae00: 61 62 20 7b 0a 20 20 72 65 67 69 73 74 65 72 5f  ab {.  register_
ae10: 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 64 62 0a 20  echo_module db. 
ae20: 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74   do_test without
ae30: 5f 72 6f 77 69 64 33 2d 32 2e 31 34 2e 34 2e 33  _rowid3-2.14.4.3
ae40: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
ae50: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
ae60: 54 41 42 4c 45 20 76 20 55 53 49 4e 47 20 65 63  TABLE v USING ec
ae70: 68 6f 28 74 31 29 20 7d 0a 20 20 7d 20 7b 7d 0a  ho(t1) }.  } {}.
ae80: 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75    do_test withou
ae90: 74 5f 72 6f 77 69 64 33 2d 32 2e 31 34 2e 34 2e  t_rowid3-2.14.4.
aea0: 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  2 {.    execsql 
aeb0: 7b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42  {.      DROP TAB
aec0: 4c 45 20 76 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  LE v;.    }.  } 
aed0: 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}.}..#---------
aee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af20: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
af30: 20 74 65 73 74 73 2c 20 77 69 74 68 6f 75 74 5f   tests, without_
af40: 72 6f 77 69 64 33 2d 31 35 2e 2a 2c 20 74 65 73  rowid3-15.*, tes
af50: 74 20 74 68 61 74 20 75 6e 6e 65 63 65 73 73 61  t that unnecessa
af60: 72 79 20 46 4b 20 72 65 6c 61 74 65 64 20 73 63  ry FK related sc
af70: 61 6e 73 20 0a 23 20 61 6e 64 20 6c 6f 6f 6b 75  ans .# and looku
af80: 70 73 20 61 72 65 20 61 76 6f 69 64 65 64 20 77  ps are avoided w
af90: 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69  hen the constrai
afa0: 6e 74 20 63 6f 75 6e 74 65 72 73 20 61 72 65 20  nt counters are 
afb0: 7a 65 72 6f 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  zero..#.drop_all
afc0: 5f 74 61 62 6c 65 73 0a 70 72 6f 63 20 65 78 65  _tables.proc exe
afd0: 63 73 71 6c 53 20 7b 7a 53 71 6c 7d 20 7b 0a 20  csqlS {zSql} {. 
afe0: 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 73 65   set ::sqlite_se
aff0: 61 72 63 68 5f 63 6f 75 6e 74 20 30 0a 20 20 73  arch_count 0.  s
b000: 65 74 20 3a 3a 73 71 6c 69 74 65 5f 66 6f 75 6e  et ::sqlite_foun
b010: 64 5f 63 6f 75 6e 74 20 30 0a 20 20 73 65 74 20  d_count 0.  set 
b020: 72 65 73 20 5b 75 70 6c 65 76 65 6c 20 5b 6c 69  res [uplevel [li
b030: 73 74 20 65 78 65 63 73 71 6c 20 24 7a 53 71 6c  st execsql $zSql
b040: 5d 5d 0a 20 20 63 6f 6e 63 61 74 20 5b 65 78 70  ]].  concat [exp
b050: 72 20 24 3a 3a 73 71 6c 69 74 65 5f 66 6f 75 6e  r $::sqlite_foun
b060: 64 5f 63 6f 75 6e 74 20 2b 20 24 3a 3a 73 71 6c  d_count + $::sql
b070: 69 74 65 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  ite_search_count
b080: 5d 20 24 72 65 73 0a 7d 0a 64 6f 5f 74 65 73 74  ] $res.}.do_test
b090: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
b0a0: 31 35 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  15.1.1 {.  execs
b0b0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
b0c0: 54 41 42 4c 45 20 70 70 28 61 20 50 52 49 4d 41  TABLE pp(a PRIMA
b0d0: 52 59 20 4b 45 59 2c 20 62 29 20 57 49 54 48 4f  RY KEY, b) WITHO
b0e0: 55 54 20 72 6f 77 69 64 3b 0a 20 20 20 20 43 52  UT rowid;.    CR
b0f0: 45 41 54 45 20 54 41 42 4c 45 20 63 63 28 78 2c  EATE TABLE cc(x,
b100: 20 79 20 52 45 46 45 52 45 4e 43 45 53 20 70 70   y REFERENCES pp
b110: 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54   DEFERRABLE INIT
b120: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 29 3b  IALLY DEFERRED);
b130: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
b140: 20 70 70 20 56 41 4c 55 45 53 28 31 2c 20 27 6f   pp VALUES(1, 'o
b150: 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ne');.    INSERT
b160: 20 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53 28   INTO pp VALUES(
b170: 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20 49  2, 'two');.    I
b180: 4e 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56 41  NSERT INTO cc VA
b190: 4c 55 45 53 28 27 6e 65 75 6e 67 27 2c 20 31 29  LUES('neung', 1)
b1a0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
b1b0: 4f 20 63 63 20 56 41 4c 55 45 53 28 27 73 6f 6e  O cc VALUES('son
b1c0: 67 27 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  g', 2);.  }.} {}
b1d0: 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74  .do_test without
b1e0: 5f 72 6f 77 69 64 33 2d 31 35 2e 31 2e 32 20 7b  _rowid3-15.1.2 {
b1f0: 0a 20 20 65 78 65 63 73 71 6c 53 20 7b 20 49 4e  .  execsqlS { IN
b200: 53 45 52 54 20 49 4e 54 4f 20 70 70 20 56 41 4c  SERT INTO pp VAL
b210: 55 45 53 28 33 2c 20 27 74 68 72 65 65 27 29 20  UES(3, 'three') 
b220: 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  }.} {0}.do_test 
b230: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31  without_rowid3-1
b240: 35 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  5.1.3 {.  execsq
b250: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
b260: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
b270: 20 63 63 20 56 41 4c 55 45 53 28 27 73 65 65 27   cc VALUES('see'
b280: 2c 20 34 29 3b 20 20 20 20 2d 2d 20 56 69 6f 6c  , 4);    -- Viol
b290: 61 74 65 73 20 64 65 66 65 72 72 65 64 20 63 6f  ates deferred co
b2a0: 6e 73 74 72 61 69 6e 74 0a 20 20 7d 0a 20 20 65  nstraint.  }.  e
b2b0: 78 65 63 73 71 6c 53 20 7b 20 49 4e 53 45 52 54  xecsqlS { INSERT
b2c0: 20 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53 28   INTO pp VALUES(
b2d0: 35 2c 20 27 66 69 76 65 27 29 20 7d 0a 7d 20 7b  5, 'five') }.} {
b2e0: 32 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  2}.do_test witho
b2f0: 75 74 5f 72 6f 77 69 64 33 2d 31 35 2e 31 2e 34  ut_rowid3-15.1.4
b300: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 44   {.  execsql { D
b310: 45 4c 45 54 45 20 46 52 4f 4d 20 63 63 20 57 48  ELETE FROM cc WH
b320: 45 52 45 20 78 20 3d 20 27 73 65 65 27 20 7d 0a  ERE x = 'see' }.
b330: 20 20 65 78 65 63 73 71 6c 53 20 7b 20 49 4e 53    execsqlS { INS
b340: 45 52 54 20 49 4e 54 4f 20 70 70 20 56 41 4c 55  ERT INTO pp VALU
b350: 45 53 28 36 2c 20 27 73 69 78 27 29 20 7d 0a 7d  ES(6, 'six') }.}
b360: 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74   {0}.do_test wit
b370: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 35 2e 31  hout_rowid3-15.1
b380: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43  .5 {.  execsql C
b390: 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  OMMIT.} {}.do_te
b3a0: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
b3b0: 33 2d 31 35 2e 31 2e 36 20 7b 0a 20 20 65 78 65  3-15.1.6 {.  exe
b3c0: 63 73 71 6c 20 42 45 47 49 4e 0a 20 20 65 78 65  csql BEGIN.  exe
b3d0: 63 73 71 6c 53 20 7b 0a 20 20 20 20 44 45 4c 45  csqlS {.    DELE
b3e0: 54 45 20 46 52 4f 4d 20 63 63 20 57 48 45 52 45  TE FROM cc WHERE
b3f0: 20 78 20 3d 20 27 6e 65 75 6e 67 27 3b 0a 20 20   x = 'neung';.  
b400: 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a    ROLLBACK;.  }.
b410: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77 69  } {1}.do_test wi
b420: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 35 2e  thout_rowid3-15.
b430: 31 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.7 {.  execsql 
b440: 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  { .    BEGIN;.  
b450: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 70    DELETE FROM pp
b460: 20 57 48 45 52 45 20 61 20 3d 20 32 3b 0a 20 20   WHERE a = 2;.  
b470: 7d 0a 20 20 65 78 65 63 73 71 6c 53 20 7b 0a 20  }.  execsqlS {. 
b480: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63     DELETE FROM c
b490: 63 20 57 48 45 52 45 20 78 20 3d 20 27 6e 65 75  c WHERE x = 'neu
b4a0: 6e 67 27 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43  ng';.    ROLLBAC
b4b0: 4b 3b 0a 20 20 7d 0a 7d 20 7b 32 7d 0a 0a 23 2d  K;.  }.} {2}..#-
b4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b500: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20  --------.# This 
b510: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 74 65  next block of te
b520: 73 74 73 2c 20 77 69 74 68 6f 75 74 5f 72 6f 77  sts, without_row
b530: 69 64 33 2d 31 36 2e 2a 2c 20 74 65 73 74 20 74  id3-16.*, test t
b540: 68 61 74 20 72 6f 77 73 20 74 68 61 74 20 72 65  hat rows that re
b550: 66 65 72 20 74 6f 0a 23 20 74 68 65 6d 73 65 6c  fer to.# themsel
b560: 76 65 73 20 6d 61 79 20 62 65 20 69 6e 73 65 72  ves may be inser
b570: 74 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e  ted and deleted.
b580: 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 7a  .#.foreach {tn z
b590: 53 63 68 65 6d 61 7d 20 7b 0a 20 20 31 20 7b 20  Schema} {.  1 { 
b5a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 65 6c  CREATE TABLE sel
b5b0: 66 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d  f(a INTEGER PRIM
b5c0: 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52  ARY KEY, b REFER
b5d0: 45 4e 43 45 53 20 73 65 6c 66 28 61 29 29 0a 20  ENCES self(a)). 
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 57 49 54 48              WITH
b5f0: 4f 55 54 20 72 6f 77 69 64 20 7d 0a 20 20 32 20  OUT rowid }.  2 
b600: 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  { CREATE TABLE s
b610: 65 6c 66 28 61 20 50 52 49 4d 41 52 59 20 4b 45  elf(a PRIMARY KE
b620: 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  Y, b REFERENCES 
b630: 73 65 6c 66 28 61 29 29 20 57 49 54 48 4f 55 54  self(a)) WITHOUT
b640: 20 72 6f 77 69 64 20 7d 0a 20 20 33 20 7b 20 43   rowid }.  3 { C
b650: 52 45 41 54 45 20 54 41 42 4c 45 20 73 65 6c 66  REATE TABLE self
b660: 28 61 20 55 4e 49 51 55 45 2c 20 62 20 49 4e 54  (a UNIQUE, b INT
b670: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 52 45 46   PRIMARY KEY REF
b680: 45 52 45 4e 43 45 53 20 73 65 6c 66 28 61 29 29  ERENCES self(a))
b690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 57 49  .             WI
b6a0: 54 48 4f 55 54 20 72 6f 77 69 64 20 7d 0a 7d 20  THOUT rowid }.} 
b6b0: 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  {.  drop_all_tab
b6c0: 6c 65 73 0a 20 20 64 6f 5f 74 65 73 74 20 77 69  les.  do_test wi
b6d0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 36 2e  thout_rowid3-16.
b6e0: 31 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 78  1.$tn.1 {.    ex
b6f0: 65 63 73 71 6c 20 24 7a 53 63 68 65 6d 61 0a 20  ecsql $zSchema. 
b700: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
b710: 45 52 54 20 49 4e 54 4f 20 73 65 6c 66 20 56 41  ERT INTO self VA
b720: 4c 55 45 53 28 31 33 2c 20 31 33 29 20 7d 0a 20  LUES(13, 13) }. 
b730: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
b740: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31  without_rowid3-1
b750: 36 2e 31 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  6.1.$tn.2 {.    
b760: 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45  execsql { UPDATE
b770: 20 73 65 6c 66 20 53 45 54 20 61 20 3d 20 31 34   self SET a = 14
b780: 2c 20 62 20 3d 20 31 34 20 7d 0a 20 20 7d 20 7b  , b = 14 }.  } {
b790: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74  }..  do_test wit
b7a0: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 36 2e 31  hout_rowid3-16.1
b7b0: 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 63 61 74  .$tn.3 {.    cat
b7c0: 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 73  chsql { UPDATE s
b7d0: 65 6c 66 20 53 45 54 20 62 20 3d 20 31 35 20 7d  elf SET b = 15 }
b7e0: 0a 20 20 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e  .  } {1 {FOREIGN
b7f0: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
b800: 66 61 69 6c 65 64 7d 7d 0a 0a 20 20 64 6f 5f 74  failed}}..  do_t
b810: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
b820: 64 33 2d 31 36 2e 31 2e 24 74 6e 2e 34 20 7b 0a  d3-16.1.$tn.4 {.
b830: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55      catchsql { U
b840: 50 44 41 54 45 20 73 65 6c 66 20 53 45 54 20 61  PDATE self SET a
b850: 20 3d 20 31 35 20 7d 0a 20 20 7d 20 7b 31 20 7b   = 15 }.  } {1 {
b860: 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
b870: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
b880: 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  .  do_test witho
b890: 75 74 5f 72 6f 77 69 64 33 2d 31 36 2e 31 2e 24  ut_rowid3-16.1.$
b8a0: 74 6e 2e 35 20 7b 0a 20 20 20 20 63 61 74 63 68  tn.5 {.    catch
b8b0: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 73 65 6c  sql { UPDATE sel
b8c0: 66 20 53 45 54 20 61 20 3d 20 31 35 2c 20 62 20  f SET a = 15, b 
b8d0: 3d 20 31 36 20 7d 0a 20 20 7d 20 7b 31 20 7b 46  = 16 }.  } {1 {F
b8e0: 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
b8f0: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a  raint failed}}..
b900: 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75    do_test withou
b910: 74 5f 72 6f 77 69 64 33 2d 31 36 2e 31 2e 24 74  t_rowid3-16.1.$t
b920: 6e 2e 36 20 7b 0a 20 20 20 20 63 61 74 63 68 73  n.6 {.    catchs
b930: 71 6c 20 7b 20 55 50 44 41 54 45 20 73 65 6c 66  ql { UPDATE self
b940: 20 53 45 54 20 61 20 3d 20 31 37 2c 20 62 20 3d   SET a = 17, b =
b950: 20 31 37 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d   17 }.  } {0 {}}
b960: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68  ..  do_test with
b970: 6f 75 74 5f 72 6f 77 69 64 33 2d 31 36 2e 31 2e  out_rowid3-16.1.
b980: 24 74 6e 2e 37 20 7b 0a 20 20 20 20 65 78 65 63  $tn.7 {.    exec
b990: 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
b9a0: 4d 20 73 65 6c 66 20 7d 0a 20 20 7d 20 7b 7d 0a  M self }.  } {}.
b9b0: 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75    do_test withou
b9c0: 74 5f 72 6f 77 69 64 33 2d 31 36 2e 31 2e 24 74  t_rowid3-16.1.$t
b9d0: 6e 2e 38 20 7b 0a 20 20 20 20 63 61 74 63 68 73  n.8 {.    catchs
b9e0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
b9f0: 20 73 65 6c 66 20 56 41 4c 55 45 53 28 32 30 2c   self VALUES(20,
ba00: 20 32 31 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 46   21) }.  } {1 {F
ba10: 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
ba20: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 7d  raint failed}}.}
ba30: 0a 0a 23 20 41 64 64 69 74 69 6f 6e 61 6c 20 74  ..# Additional t
ba40: 65 73 74 73 20 63 61 73 65 73 20 75 73 69 6e 67  ests cases using
ba50: 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 73 65   multi-column se
ba60: 6c 66 2d 72 65 66 65 72 65 6e 74 69 61 6c 0a 23  lf-referential.#
ba70: 20 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e   FOREIGN KEY con
ba80: 73 74 72 61 69 6e 74 73 2e 0a 23 0a 64 72 6f 70  straints..#.drop
ba90: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65  _all_tables.do_e
baa0: 78 65 63 73 71 6c 5f 74 65 73 74 20 77 69 74 68  xecsql_test with
bab0: 6f 75 74 5f 72 6f 77 69 64 33 2d 31 36 2e 34 2e  out_rowid3-16.4.
bac0: 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 66  1.1 {.  PRAGMA f
bad0: 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 4e 3b 0a  oreign_keys=ON;.
bae0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
baf0: 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 2c 0a 20  1(a,b,c,d,e,f,. 
bb00: 20 20 20 20 55 4e 49 51 55 45 20 28 61 2c 62 29      UNIQUE (a,b)
bb10: 2c 0a 20 20 20 20 20 50 52 49 4d 41 52 59 20 4b  ,.     PRIMARY K
bb20: 45 59 20 28 65 2c 63 29 2c 0a 20 20 20 20 20 46  EY (e,c),.     F
bb30: 4f 52 45 49 47 4e 20 4b 45 59 20 28 64 2c 66 29  OREIGN KEY (d,f)
bb40: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 28 65   REFERENCES t1(e
bb50: 2c 63 29 0a 20 20 29 20 57 49 54 48 4f 55 54 20  ,c).  ) WITHOUT 
bb60: 72 6f 77 69 64 3b 0a 20 20 49 4e 53 45 52 54 20  rowid;.  INSERT 
bb70: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
bb80: 2c 32 2c 33 2c 35 2c 35 2c 33 29 3b 0a 20 20 49  ,2,3,5,5,3);.  I
bb90: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
bba0: 4c 55 45 53 28 32 2c 33 2c 34 2c 36 2c 36 2c 34  LUES(2,3,4,6,6,4
bbb0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
bbc0: 20 74 31 20 56 41 4c 55 45 53 28 27 78 27 2c 27   t1 VALUES('x','
bbd0: 79 27 2c 31 2e 35 2c 27 66 69 7a 7a 6c 65 27 2c  y',1.5,'fizzle',
bbe0: 27 66 69 7a 7a 6c 65 27 2c 31 2e 35 29 3b 0a 20  'fizzle',1.5);. 
bbf0: 20 53 45 4c 45 43 54 20 2a 2c 20 27 7c 27 20 46   SELECT *, '|' F
bc00: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
bc10: 61 2c 20 62 3b 0a 7d 20 7b 31 20 32 20 33 20 35  a, b;.} {1 2 3 5
bc20: 20 35 20 33 20 7c 20 32 20 33 20 34 20 36 20 36   5 3 | 2 3 4 6 6
bc30: 20 34 20 7c 20 78 20 79 20 31 2e 35 20 66 69 7a   4 | x y 1.5 fiz
bc40: 7a 6c 65 20 66 69 7a 7a 6c 65 20 31 2e 35 20 7c  zle fizzle 1.5 |
bc50: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
bc60: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
bc70: 33 2d 31 36 2e 34 2e 31 2e 32 20 7b 0a 20 20 55  3-16.4.1.2 {.  U
bc80: 50 44 41 54 45 20 74 31 20 53 45 54 20 63 3d 39  PDATE t1 SET c=9
bc90: 39 2c 20 66 3d 39 39 20 57 48 45 52 45 20 61 3d  9, f=99 WHERE a=
bca0: 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 2c 20 27  1;.  SELECT *, '
bcb0: 7c 27 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52  |' FROM t1 ORDER
bcc0: 20 42 59 20 61 2c 20 62 3b 0a 7d 20 7b 31 20 32   BY a, b;.} {1 2
bcd0: 20 39 39 20 35 20 35 20 39 39 20 7c 20 32 20 33   99 5 5 99 | 2 3
bce0: 20 34 20 36 20 36 20 34 20 7c 20 78 20 79 20 31   4 6 6 4 | x y 1
bcf0: 2e 35 20 66 69 7a 7a 6c 65 20 66 69 7a 7a 6c 65  .5 fizzle fizzle
bd00: 20 31 2e 35 20 7c 7d 0a 0a 64 6f 5f 65 78 65 63   1.5 |}..do_exec
bd10: 73 71 6c 5f 74 65 73 74 20 77 69 74 68 6f 75 74  sql_test without
bd20: 5f 72 6f 77 69 64 33 2d 31 36 2e 34 2e 31 2e 33  _rowid3-16.4.1.3
bd30: 20 7b 0a 20 20 55 50 44 41 54 45 20 74 31 20 53   {.  UPDATE t1 S
bd40: 45 54 20 65 3d 38 37 36 2c 20 64 3d 38 37 36 20  ET e=876, d=876 
bd50: 57 48 45 52 45 20 61 3d 32 3b 0a 20 20 53 45 4c  WHERE a=2;.  SEL
bd60: 45 43 54 20 2a 2c 20 27 7c 27 20 46 52 4f 4d 20  ECT *, '|' FROM 
bd70: 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20 62  t1 ORDER BY a, b
bd80: 3b 0a 7d 20 7b 31 20 32 20 39 39 20 35 20 35 20  ;.} {1 2 99 5 5 
bd90: 39 39 20 7c 20 32 20 33 20 34 20 38 37 36 20 38  99 | 2 3 4 876 8
bda0: 37 36 20 34 20 7c 20 78 20 79 20 31 2e 35 20 66  76 4 | x y 1.5 f
bdb0: 69 7a 7a 6c 65 20 66 69 7a 7a 6c 65 20 31 2e 35  izzle fizzle 1.5
bdc0: 20 7c 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 69 74   |}..do_test wit
bdd0: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 36 2e 34  hout_rowid3-16.4
bde0: 2e 31 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71  .1.4 {.  catchsq
bdf0: 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74  l {.    UPDATE t
be00: 31 20 53 45 54 20 63 3d 31 31 2c 20 65 3d 32 32  1 SET c=11, e=22
be10: 20 57 48 45 52 45 20 61 3d 31 3b 0a 20 20 7d 0a   WHERE a=1;.  }.
be20: 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
be30: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
be40: 6c 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 77  led}}..do_test w
be50: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 36  ithout_rowid3-16
be60: 2e 34 2e 31 2e 35 20 7b 0a 20 20 63 61 74 63 68  .4.1.5 {.  catch
be70: 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
be80: 20 74 31 20 53 45 54 20 64 3d 31 31 2c 20 66 3d   t1 SET d=11, f=
be90: 32 32 20 57 48 45 52 45 20 61 3d 31 3b 0a 20 20  22 WHERE a=1;.  
bea0: 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20  }.} {1 {FOREIGN 
beb0: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
bec0: 61 69 6c 65 64 7d 7d 0a 0a 64 6f 5f 65 78 65 63  ailed}}..do_exec
bed0: 73 71 6c 5f 74 65 73 74 20 77 69 74 68 6f 75 74  sql_test without
bee0: 5f 72 6f 77 69 64 33 2d 31 36 2e 34 2e 31 2e 36  _rowid3-16.4.1.6
bef0: 20 7b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d   {.  DELETE FROM
bf00: 20 74 31 20 57 48 45 52 45 20 61 3d 31 3b 0a 20   t1 WHERE a=1;. 
bf10: 20 53 45 4c 45 43 54 20 2a 2c 20 27 7c 27 20 46   SELECT *, '|' F
bf20: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
bf30: 61 2c 20 62 3b 0a 7d 20 7b 32 20 33 20 34 20 38  a, b;.} {2 3 4 8
bf40: 37 36 20 38 37 36 20 34 20 7c 20 78 20 79 20 31  76 876 4 | x y 1
bf50: 2e 35 20 66 69 7a 7a 6c 65 20 66 69 7a 7a 6c 65  .5 fizzle fizzle
bf60: 20 31 2e 35 20 7c 7d 0a 0a 64 6f 5f 65 78 65 63   1.5 |}..do_exec
bf70: 73 71 6c 5f 74 65 73 74 20 77 69 74 68 6f 75 74  sql_test without
bf80: 5f 72 6f 77 69 64 33 2d 31 36 2e 34 2e 32 2e 31  _rowid3-16.4.2.1
bf90: 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20   {.  DROP TABLE 
bfa0: 74 31 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  t1;.  CREATE TAB
bfb0: 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c  LE t1(a,b,c,d,e,
bfc0: 66 2c 0a 20 20 20 20 20 50 52 49 4d 41 52 59 20  f,.     PRIMARY 
bfd0: 4b 45 59 20 28 61 2c 62 29 2c 0a 20 20 20 20 20  KEY (a,b),.     
bfe0: 55 4e 49 51 55 45 20 28 65 2c 63 29 2c 0a 20 20  UNIQUE (e,c),.  
bff0: 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 20 28     FOREIGN KEY (
c000: 64 2c 66 29 20 52 45 46 45 52 45 4e 43 45 53 20  d,f) REFERENCES 
c010: 74 31 28 65 2c 63 29 0a 20 20 29 20 57 49 54 48  t1(e,c).  ) WITH
c020: 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20 49 4e 53  OUT rowid;.  INS
c030: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
c040: 45 53 28 31 2c 32 2c 33 2c 35 2c 35 2c 33 29 3b  ES(1,2,3,5,5,3);
c050: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
c060: 31 20 56 41 4c 55 45 53 28 32 2c 33 2c 34 2c 36  1 VALUES(2,3,4,6
c070: 2c 36 2c 34 29 3b 0a 20 20 49 4e 53 45 52 54 20  ,6,4);.  INSERT 
c080: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
c090: 78 27 2c 27 79 27 2c 31 2e 35 2c 27 66 69 7a 7a  x','y',1.5,'fizz
c0a0: 6c 65 27 2c 27 66 69 7a 7a 6c 65 27 2c 31 2e 35  le','fizzle',1.5
c0b0: 29 3b 0a 20 20 53 45 4c 45 43 54 20 2a 2c 20 27  );.  SELECT *, '
c0c0: 7c 27 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52  |' FROM t1 ORDER
c0d0: 20 42 59 20 61 2c 20 62 3b 0a 7d 20 7b 31 20 32   BY a, b;.} {1 2
c0e0: 20 33 20 35 20 35 20 33 20 7c 20 32 20 33 20 34   3 5 5 3 | 2 3 4
c0f0: 20 36 20 36 20 34 20 7c 20 78 20 79 20 31 2e 35   6 6 4 | x y 1.5
c100: 20 66 69 7a 7a 6c 65 20 66 69 7a 7a 6c 65 20 31   fizzle fizzle 1
c110: 2e 35 20 7c 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  .5 |}..do_execsq
c120: 6c 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  l_test without_r
c130: 6f 77 69 64 33 2d 31 36 2e 34 2e 32 2e 32 20 7b  owid3-16.4.2.2 {
c140: 0a 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54  .  UPDATE t1 SET
c150: 20 63 3d 39 39 2c 20 66 3d 39 39 20 57 48 45 52   c=99, f=99 WHER
c160: 45 20 61 3d 31 3b 0a 20 20 53 45 4c 45 43 54 20  E a=1;.  SELECT 
c170: 2a 2c 20 27 7c 27 20 46 52 4f 4d 20 74 31 20 4f  *, '|' FROM t1 O
c180: 52 44 45 52 20 42 59 20 61 2c 20 62 3b 0a 7d 20  RDER BY a, b;.} 
c190: 7b 31 20 32 20 39 39 20 35 20 35 20 39 39 20 7c  {1 2 99 5 5 99 |
c1a0: 20 32 20 33 20 34 20 36 20 36 20 34 20 7c 20 78   2 3 4 6 6 4 | x
c1b0: 20 79 20 31 2e 35 20 66 69 7a 7a 6c 65 20 66 69   y 1.5 fizzle fi
c1c0: 7a 7a 6c 65 20 31 2e 35 20 7c 7d 0a 0a 64 6f 5f  zzle 1.5 |}..do_
c1d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77 69 74  execsql_test wit
c1e0: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 36 2e 34  hout_rowid3-16.4
c1f0: 2e 32 2e 33 20 7b 0a 20 20 55 50 44 41 54 45 20  .2.3 {.  UPDATE 
c200: 74 31 20 53 45 54 20 65 3d 38 37 36 2c 20 64 3d  t1 SET e=876, d=
c210: 38 37 36 20 57 48 45 52 45 20 61 3d 32 3b 0a 20  876 WHERE a=2;. 
c220: 20 53 45 4c 45 43 54 20 2a 2c 20 27 7c 27 20 46   SELECT *, '|' F
c230: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
c240: 61 2c 20 62 3b 0a 7d 20 7b 31 20 32 20 39 39 20  a, b;.} {1 2 99 
c250: 35 20 35 20 39 39 20 7c 20 32 20 33 20 34 20 38  5 5 99 | 2 3 4 8
c260: 37 36 20 38 37 36 20 34 20 7c 20 78 20 79 20 31  76 876 4 | x y 1
c270: 2e 35 20 66 69 7a 7a 6c 65 20 66 69 7a 7a 6c 65  .5 fizzle fizzle
c280: 20 31 2e 35 20 7c 7d 0a 0a 64 6f 5f 74 65 73 74   1.5 |}..do_test
c290: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
c2a0: 31 36 2e 34 2e 32 2e 34 20 7b 0a 20 20 63 61 74  16.4.2.4 {.  cat
c2b0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41  chsql {.    UPDA
c2c0: 54 45 20 74 31 20 53 45 54 20 63 3d 31 31 2c 20  TE t1 SET c=11, 
c2d0: 65 3d 32 32 20 57 48 45 52 45 20 61 3d 31 3b 0a  e=22 WHERE a=1;.
c2e0: 20 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47    }.} {1 {FOREIG
c2f0: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
c300: 20 66 61 69 6c 65 64 7d 7d 0a 0a 64 6f 5f 74 65   failed}}..do_te
c310: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
c320: 33 2d 31 36 2e 34 2e 32 2e 35 20 7b 0a 20 20 63  3-16.4.2.5 {.  c
c330: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 55 50  atchsql {.    UP
c340: 44 41 54 45 20 74 31 20 53 45 54 20 64 3d 31 31  DATE t1 SET d=11
c350: 2c 20 66 3d 32 32 20 57 48 45 52 45 20 61 3d 31  , f=22 WHERE a=1
c360: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45  ;.  }.} {1 {FORE
c370: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
c380: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 64 6f 5f  nt failed}}..do_
c390: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77 69 74  execsql_test wit
c3a0: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 36 2e 34  hout_rowid3-16.4
c3b0: 2e 32 2e 36 20 7b 0a 20 20 44 45 4c 45 54 45 20  .2.6 {.  DELETE 
c3c0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
c3d0: 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 2c 20 27  1;.  SELECT *, '
c3e0: 7c 27 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52  |' FROM t1 ORDER
c3f0: 20 42 59 20 61 2c 20 62 3b 0a 7d 20 7b 32 20 33   BY a, b;.} {2 3
c400: 20 34 20 38 37 36 20 38 37 36 20 34 20 7c 20 78   4 876 876 4 | x
c410: 20 79 20 31 2e 35 20 66 69 7a 7a 6c 65 20 66 69   y 1.5 fizzle fi
c420: 7a 7a 6c 65 20 31 2e 35 20 7c 7d 0a 0a 0a 23 2d  zzle 1.5 |}...#-
c430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c470: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20  --------.# This 
c480: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 74 65  next block of te
c490: 73 74 73 2c 20 77 69 74 68 6f 75 74 5f 72 6f 77  sts, without_row
c4a0: 69 64 33 2d 31 37 2e 2a 2c 20 74 65 73 74 73 20  id3-17.*, tests 
c4b0: 74 68 61 74 20 69 66 20 22 50 52 41 47 4d 41 20  that if "PRAGMA 
c4c0: 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 22 0a 23  count_changes".#
c4d0: 20 69 73 20 74 75 72 6e 65 64 20 6f 6e 20 73 74   is turned on st
c4e0: 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76 69  atements that vi
c4f0: 6f 6c 61 74 65 20 69 6d 6d 65 64 69 61 74 65 20  olate immediate 
c500: 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  FK constraints r
c510: 65 74 75 72 6e 0a 23 20 53 51 4c 49 54 45 5f 43  eturn.# SQLITE_C
c520: 4f 4e 53 54 52 41 49 4e 54 20 69 6d 6d 65 64 69  ONSTRAINT immedi
c530: 61 74 65 6c 79 2c 20 6e 6f 74 20 61 66 74 65 72  ately, not after
c540: 20 72 65 74 75 72 6e 69 6e 67 20 61 20 6e 75 6d   returning a num
c550: 62 65 72 20 6f 66 20 72 6f 77 73 2e 0a 23 20 57  ber of rows..# W
c560: 68 65 72 65 61 73 20 73 74 61 74 65 6d 65 6e 74  hereas statement
c570: 73 20 74 68 61 74 20 76 69 6f 6c 61 74 65 20 64  s that violate d
c580: 65 66 65 72 72 65 64 20 46 4b 20 63 6f 6e 73 74  eferred FK const
c590: 72 61 69 6e 74 73 20 72 65 74 75 72 6e 20 74 68  raints return th
c5a0: 65 20 6e 75 6d 62 65 72 0a 23 20 6f 66 20 72 6f  e number.# of ro
c5b0: 77 73 20 62 65 66 6f 72 65 20 66 61 69 6c 69 6e  ws before failin
c5c0: 67 2e 0a 23 0a 23 20 41 6c 73 6f 20 74 65 73 74  g..#.# Also test
c5d0: 20 74 68 61 74 20 72 6f 77 73 20 6d 6f 64 69 66   that rows modif
c5e0: 69 65 64 20 62 79 20 46 4b 20 61 63 74 69 6f 6e  ied by FK action
c5f0: 73 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65  s are not counte
c600: 64 20 69 6e 20 65 69 74 68 65 72 20 74 68 65 0a  d in either the.
c610: 23 20 72 65 74 75 72 6e 65 64 20 72 6f 77 20 63  # returned row c
c620: 6f 75 6e 74 20 6f 72 20 74 68 65 20 76 61 6c 75  ount or the valu
c630: 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  es returned by s
c640: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
c650: 2e 20 4c 69 6b 65 0a 23 20 74 72 69 67 67 65 72  . Like.# trigger
c660: 20 72 65 6c 61 74 65 64 20 63 68 61 6e 67 65 73   related changes
c670: 2c 20 74 68 65 79 20 61 72 65 20 69 6e 63 6c 75  , they are inclu
c680: 64 65 64 20 69 6e 20 73 71 6c 69 74 65 33 5f 74  ded in sqlite3_t
c690: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 20 74  otal_changes() t
c6a0: 68 6f 75 67 68 2e 0a 23 0a 64 72 6f 70 5f 61 6c  hough..#.drop_al
c6b0: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
c6c0: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
c6d0: 31 37 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  17.1.1 {.  execs
c6e0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 6f 75 6e  ql { PRAGMA coun
c6f0: 74 5f 63 68 61 6e 67 65 73 20 3d 20 31 20 7d 0a  t_changes = 1 }.
c700: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
c710: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 6e   CREATE TABLE on
c720: 65 28 61 2c 20 62 2c 20 63 2c 20 55 4e 49 51 55  e(a, b, c, UNIQU
c730: 45 28 62 2c 20 63 29 29 3b 0a 20 20 20 20 43 52  E(b, c));.    CR
c740: 45 41 54 45 20 54 41 42 4c 45 20 74 77 6f 28 64  EATE TABLE two(d
c750: 2c 20 65 2c 20 66 2c 20 46 4f 52 45 49 47 4e 20  , e, f, FOREIGN 
c760: 4b 45 59 28 65 2c 20 66 29 20 52 45 46 45 52 45  KEY(e, f) REFERE
c770: 4e 43 45 53 20 6f 6e 65 28 62 2c 20 63 29 29 3b  NCES one(b, c));
c780: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
c790: 20 6f 6e 65 20 56 41 4c 55 45 53 28 31 2c 20 32   one VALUES(1, 2
c7a0: 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a  , 3);.  }.} {1}.
c7b0: 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
c7c0: 72 6f 77 69 64 33 2d 31 37 2e 31 2e 32 20 7b 0a  rowid3-17.1.2 {.
c7d0: 20 20 73 65 74 20 53 54 4d 54 20 5b 73 71 6c 69    set STMT [sqli
c7e0: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20 64  te3_prepare_v2 d
c7f0: 62 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  b "INSERT INTO t
c800: 77 6f 20 56 41 4c 55 45 53 28 34 2c 20 35 2c 20  wo VALUES(4, 5, 
c810: 36 29 22 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20  6)" -1 dummy].  
c820: 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 53 54  sqlite3_step $ST
c830: 4d 54 0a 7d 20 7b 53 51 4c 49 54 45 5f 43 4f 4e  MT.} {SQLITE_CON
c840: 53 54 52 41 49 4e 54 7d 0a 76 65 72 69 66 79 5f  STRAINT}.verify_
c850: 65 78 5f 65 72 72 63 6f 64 65 20 77 69 74 68 6f  ex_errcode witho
c860: 75 74 5f 72 6f 77 69 64 33 2d 31 37 2e 31 2e 32  ut_rowid3-17.1.2
c870: 62 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  b SQLITE_CONSTRA
c880: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 69  INT_FOREIGNKEY.i
c890: 66 63 61 70 61 62 6c 65 20 61 75 74 6f 72 65 73  fcapable autores
c8a0: 65 74 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 77  et {.  do_test w
c8b0: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 37  ithout_rowid3-17
c8c0: 2e 31 2e 33 20 7b 0a 20 20 20 20 73 71 6c 69 74  .1.3 {.    sqlit
c8d0: 65 33 5f 73 74 65 70 20 24 53 54 4d 54 0a 20 20  e3_step $STMT.  
c8e0: 7d 20 7b 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  } {SQLITE_CONSTR
c8f0: 41 49 4e 54 7d 0a 20 20 76 65 72 69 66 79 5f 65  AINT}.  verify_e
c900: 78 5f 65 72 72 63 6f 64 65 20 77 69 74 68 6f 75  x_errcode withou
c910: 74 5f 72 6f 77 69 64 33 2d 31 37 2e 31 2e 33 62  t_rowid3-17.1.3b
c920: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
c930: 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 7d 20  NT_FOREIGNKEY.} 
c940: 65 6c 73 65 20 7b 0a 20 20 64 6f 5f 74 65 73 74  else {.  do_test
c950: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
c960: 31 37 2e 31 2e 33 20 7b 0a 20 20 20 20 73 71 6c  17.1.3 {.    sql
c970: 69 74 65 33 5f 73 74 65 70 20 24 53 54 4d 54 0a  ite3_step $STMT.
c980: 20 20 7d 20 7b 53 51 4c 49 54 45 5f 4d 49 53 55    } {SQLITE_MISU
c990: 53 45 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 77 69  SE}.}.do_test wi
c9a0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 37 2e  thout_rowid3-17.
c9b0: 31 2e 34 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  1.4 {.  sqlite3_
c9c0: 66 69 6e 61 6c 69 7a 65 20 24 53 54 4d 54 0a 7d  finalize $STMT.}
c9d0: 20 7b 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   {SQLITE_CONSTRA
c9e0: 49 4e 54 7d 0a 76 65 72 69 66 79 5f 65 78 5f 65  INT}.verify_ex_e
c9f0: 72 72 63 6f 64 65 20 77 69 74 68 6f 75 74 5f 72  rrcode without_r
ca00: 6f 77 69 64 33 2d 31 37 2e 31 2e 34 62 20 53 51  owid3-17.1.4b SQ
ca10: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
ca20: 46 4f 52 45 49 47 4e 4b 45 59 0a 64 6f 5f 74 65  FOREIGNKEY.do_te
ca30: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
ca40: 33 2d 31 37 2e 31 2e 35 20 7b 0a 20 20 65 78 65  3-17.1.5 {.  exe
ca50: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
ca60: 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45  T INTO one VALUE
ca70: 53 28 32 2c 20 33 2c 20 34 29 3b 0a 20 20 20 20  S(2, 3, 4);.    
ca80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20  INSERT INTO one 
ca90: 56 41 4c 55 45 53 28 33 2c 20 34 2c 20 35 29 3b  VALUES(3, 4, 5);
caa0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
cab0: 20 74 77 6f 20 56 41 4c 55 45 53 28 31 2c 20 32   two VALUES(1, 2
cac0: 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 3);.    INSERT
cad0: 20 49 4e 54 4f 20 74 77 6f 20 56 41 4c 55 45 53   INTO two VALUES
cae0: 28 32 2c 20 33 2c 20 34 29 3b 0a 20 20 20 20 49  (2, 3, 4);.    I
caf0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 77 6f 20 56  NSERT INTO two V
cb00: 41 4c 55 45 53 28 33 2c 20 34 2c 20 35 29 3b 0a  ALUES(3, 4, 5);.
cb10: 20 20 7d 0a 7d 20 7b 31 20 31 20 31 20 31 20 31    }.} {1 1 1 1 1
cb20: 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75  }.do_test withou
cb30: 74 5f 72 6f 77 69 64 33 2d 31 37 2e 31 2e 36 20  t_rowid3-17.1.6 
cb40: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
cb50: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
cb60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20  INSERT INTO one 
cb70: 56 41 4c 55 45 53 28 30 2c 20 30 2c 20 30 29 3b  VALUES(0, 0, 0);
cb80: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 77  .      UPDATE tw
cb90: 6f 20 53 45 54 20 65 3d 65 2b 31 2c 20 66 3d 66  o SET e=e+1, f=f
cba0: 2b 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 46 4f  +1;.  }.} {1 {FO
cbb0: 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
cbc0: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
cbd0: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
cbe0: 77 69 64 33 2d 31 37 2e 31 2e 37 20 7b 0a 20 20  wid3-17.1.7 {.  
cbf0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
cc00: 20 2a 20 46 52 4f 4d 20 6f 6e 65 20 7d 0a 7d 20   * FROM one }.} 
cc10: 7b 31 20 32 20 33 20 32 20 33 20 34 20 33 20 34  {1 2 3 2 3 4 3 4
cc20: 20 35 20 30 20 30 20 30 7d 0a 64 6f 5f 74 65 73   5 0 0 0}.do_tes
cc30: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  t without_rowid3
cc40: 2d 31 37 2e 31 2e 38 20 7b 0a 20 20 65 78 65 63  -17.1.8 {.  exec
cc50: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
cc60: 52 4f 4d 20 74 77 6f 20 7d 0a 7d 20 7b 31 20 32  ROM two }.} {1 2
cc70: 20 33 20 32 20 33 20 34 20 33 20 34 20 35 7d 0a   3 2 3 4 3 4 5}.
cc80: 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
cc90: 72 6f 77 69 64 33 2d 31 37 2e 31 2e 39 20 7b 0a  rowid3-17.1.9 {.
cca0: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
ccb0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 69  .} {}.do_test wi
ccc0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 37 2e  thout_rowid3-17.
ccd0: 31 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c  1.10 {.  execsql
cce0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
ccf0: 42 4c 45 20 74 68 72 65 65 28 0a 20 20 20 20 20  BLE three(.     
cd00: 20 67 2c 20 68 2c 20 69 2c 20 0a 20 20 20 20 20   g, h, i, .     
cd10: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 68 2c 20   FOREIGN KEY(h, 
cd20: 69 29 20 52 45 46 45 52 45 4e 43 45 53 20 6f 6e  i) REFERENCES on
cd30: 65 28 62 2c 20 63 29 20 44 45 46 45 52 52 41 42  e(b, c) DEFERRAB
cd40: 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  LE INITIALLY DEF
cd50: 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 7d  ERRED.    );.  }
cd60: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 69  .} {}.do_test wi
cd70: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 37 2e  thout_rowid3-17.
cd80: 31 2e 31 31 20 7b 0a 20 20 73 65 74 20 53 54 4d  1.11 {.  set STM
cd90: 54 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  T [sqlite3_prepa
cda0: 72 65 5f 76 32 20 64 62 20 22 49 4e 53 45 52 54  re_v2 db "INSERT
cdb0: 20 49 4e 54 4f 20 74 68 72 65 65 20 56 41 4c 55   INTO three VALU
cdc0: 45 53 28 37 2c 20 38 2c 20 39 29 22 20 2d 31 20  ES(7, 8, 9)" -1 
cdd0: 64 75 6d 6d 79 5d 0a 20 20 73 71 6c 69 74 65 33  dummy].  sqlite3
cde0: 5f 73 74 65 70 20 24 53 54 4d 54 0a 7d 20 7b 53  _step $STMT.} {S
cdf0: 51 4c 49 54 45 5f 52 4f 57 7d 0a 64 6f 5f 74 65  QLITE_ROW}.do_te
ce00: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
ce10: 33 2d 31 37 2e 31 2e 31 32 20 7b 0a 20 20 73 71  3-17.1.12 {.  sq
ce20: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
ce30: 74 20 24 53 54 4d 54 20 30 0a 7d 20 7b 31 7d 0a  t $STMT 0.} {1}.
ce40: 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
ce50: 72 6f 77 69 64 33 2d 31 37 2e 31 2e 31 33 20 7b  rowid3-17.1.13 {
ce60: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20  .  sqlite3_step 
ce70: 24 53 54 4d 54 0a 7d 20 7b 53 51 4c 49 54 45 5f  $STMT.} {SQLITE_
ce80: 43 4f 4e 53 54 52 41 49 4e 54 7d 0a 76 65 72 69  CONSTRAINT}.veri
ce90: 66 79 5f 65 78 5f 65 72 72 63 6f 64 65 20 77 69  fy_ex_errcode wi
cea0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 37 2e  thout_rowid3-17.
ceb0: 31 2e 31 33 62 20 53 51 4c 49 54 45 5f 43 4f 4e  1.13b SQLITE_CON
cec0: 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
ced0: 45 59 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  EY.do_test witho
cee0: 75 74 5f 72 6f 77 69 64 33 2d 31 37 2e 31 2e 31  ut_rowid3-17.1.1
cef0: 34 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  4 {.  sqlite3_fi
cf00: 6e 61 6c 69 7a 65 20 24 53 54 4d 54 0a 7d 20 7b  nalize $STMT.} {
cf10: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
cf20: 54 7d 0a 76 65 72 69 66 79 5f 65 78 5f 65 72 72  T}.verify_ex_err
cf30: 63 6f 64 65 20 77 69 74 68 6f 75 74 5f 72 6f 77  code without_row
cf40: 69 64 33 2d 31 37 2e 31 2e 31 34 62 20 53 51 4c  id3-17.1.14b SQL
cf50: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
cf60: 4f 52 45 49 47 4e 4b 45 59 0a 0a 64 72 6f 70 5f  OREIGNKEY..drop_
cf70: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
cf80: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
cf90: 33 2d 31 37 2e 32 2e 31 20 7b 0a 20 20 65 78 65  3-17.2.1 {.  exe
cfa0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
cfb0: 45 20 54 41 42 4c 45 20 68 69 67 68 28 22 61 27  E TABLE high("a'
cfc0: 62 21 22 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  b!" PRIMARY KEY,
cfd0: 20 62 29 20 57 49 54 48 4f 55 54 20 72 6f 77 69   b) WITHOUT rowi
cfe0: 64 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  d;.    CREATE TA
cff0: 42 4c 45 20 6c 6f 77 28 0a 20 20 20 20 20 20 63  BLE low(.      c
d000: 2c 20 0a 20 20 20 20 20 20 22 64 26 36 22 20 52  , .      "d&6" R
d010: 45 46 45 52 45 4e 43 45 53 20 68 69 67 68 20 4f  EFERENCES high O
d020: 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45  N UPDATE CASCADE
d030: 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41   ON DELETE CASCA
d040: 44 45 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20  DE.    );.  }.} 
d050: 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  {}.do_test witho
d060: 75 74 5f 72 6f 77 69 64 33 2d 31 37 2e 32 2e 32  ut_rowid3-17.2.2
d070: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
d080: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 68     INSERT INTO h
d090: 69 67 68 20 56 41 4c 55 45 53 28 27 61 27 2c 20  igh VALUES('a', 
d0a0: 27 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'b');.    INSERT
d0b0: 20 49 4e 54 4f 20 6c 6f 77 20 56 41 4c 55 45 53   INTO low VALUES
d0c0: 28 27 62 27 2c 20 27 61 27 29 3b 0a 20 20 7d 0a  ('b', 'a');.  }.
d0d0: 20 20 64 62 20 63 68 61 6e 67 65 73 0a 7d 20 7b    db changes.} {
d0e0: 31 7d 0a 73 65 74 20 6e 54 6f 74 61 6c 20 5b 64  1}.set nTotal [d
d0f0: 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 5d  b total_changes]
d100: 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74  .do_test without
d110: 5f 72 6f 77 69 64 33 2d 31 37 2e 32 2e 33 20 7b  _rowid3-17.2.3 {
d120: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44  .  execsql { UPD
d130: 41 54 45 20 68 69 67 68 20 53 45 54 20 22 61 27  ATE high SET "a'
d140: 62 21 22 20 3d 20 27 63 27 20 7d 0a 7d 20 7b 31  b!" = 'c' }.} {1
d150: 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75  }.do_test withou
d160: 74 5f 72 6f 77 69 64 33 2d 31 37 2e 32 2e 34 20  t_rowid3-17.2.4 
d170: 7b 0a 20 20 64 62 20 63 68 61 6e 67 65 73 0a 7d  {.  db changes.}
d180: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74   {1}.do_test wit
d190: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 37 2e 32  hout_rowid3-17.2
d1a0: 2e 35 20 7b 0a 20 20 65 78 70 72 20 5b 64 62 20  .5 {.  expr [db 
d1b0: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 5d 20 2d  total_changes] -
d1c0: 20 24 6e 54 6f 74 61 6c 0a 7d 20 7b 32 7d 0a 64   $nTotal.} {2}.d
d1d0: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
d1e0: 6f 77 69 64 33 2d 31 37 2e 32 2e 36 20 7b 0a 20  owid3-17.2.6 {. 
d1f0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
d200: 54 20 2a 20 46 52 4f 4d 20 68 69 67 68 20 3b 20  T * FROM high ; 
d210: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f  SELECT * FROM lo
d220: 77 20 7d 0a 7d 20 7b 63 20 62 20 62 20 63 7d 0a  w }.} {c b b c}.
d230: 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
d240: 72 6f 77 69 64 33 2d 31 37 2e 32 2e 37 20 7b 0a  rowid3-17.2.7 {.
d250: 20 20 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45    execsql { DELE
d260: 54 45 20 46 52 4f 4d 20 68 69 67 68 20 7d 0a 7d  TE FROM high }.}
d270: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74   {1}.do_test wit
d280: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 37 2e 32  hout_rowid3-17.2
d290: 2e 38 20 7b 0a 20 20 64 62 20 63 68 61 6e 67 65  .8 {.  db change
d2a0: 73 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  s.} {1}.do_test 
d2b0: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31  without_rowid3-1
d2c0: 37 2e 32 2e 39 20 7b 0a 20 20 65 78 70 72 20 5b  7.2.9 {.  expr [
d2d0: 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  db total_changes
d2e0: 5d 20 2d 20 24 6e 54 6f 74 61 6c 0a 7d 20 7b 34  ] - $nTotal.} {4
d2f0: 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75  }.do_test withou
d300: 74 5f 72 6f 77 69 64 33 2d 31 37 2e 32 2e 31 30  t_rowid3-17.2.10
d310: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
d320: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 68 69 67  ELECT * FROM hig
d330: 68 20 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  h ; SELECT * FRO
d340: 4d 20 6c 6f 77 20 7d 0a 7d 20 7b 7d 0a 65 78 65  M low }.} {}.exe
d350: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 6f  csql { PRAGMA co
d360: 75 6e 74 5f 63 68 61 6e 67 65 73 20 3d 20 30 20  unt_changes = 0 
d370: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
d380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
d3c0: 54 65 73 74 20 74 68 61 74 20 74 68 65 20 61 75  Test that the au
d3d0: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c  thorization call
d3e0: 62 61 63 6b 20 77 6f 72 6b 73 2e 0a 23 0a 0a 69  back works..#..i
d3f0: 66 63 61 70 61 62 6c 65 20 61 75 74 68 20 7b 0a  fcapable auth {.
d400: 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75    do_test withou
d410: 74 5f 72 6f 77 69 64 33 2d 31 38 2e 31 20 7b 0a  t_rowid3-18.1 {.
d420: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
d430: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
d440: 20 6c 6f 6e 67 28 61 2c 20 62 20 50 52 49 4d 41   long(a, b PRIMA
d450: 52 59 20 4b 45 59 2c 20 63 29 20 57 49 54 48 4f  RY KEY, c) WITHO
d460: 55 54 20 72 6f 77 69 64 3b 0a 20 20 20 20 20 20  UT rowid;.      
d470: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 68 6f  CREATE TABLE sho
d480: 72 74 28 64 2c 20 65 2c 20 66 20 52 45 46 45 52  rt(d, e, f REFER
d490: 45 4e 43 45 53 20 6c 6f 6e 67 29 3b 0a 20 20 20  ENCES long);.   
d4a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
d4b0: 6d 69 64 28 67 2c 20 68 2c 20 69 20 52 45 46 45  mid(g, h, i REFE
d4c0: 52 45 4e 43 45 53 20 6c 6f 6e 67 20 44 45 46 45  RENCES long DEFE
d4d0: 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
d4e0: 20 44 45 46 45 52 52 45 44 29 3b 0a 20 20 20 20   DEFERRED);.    
d4f0: 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 70 72 6f 63  }.  } {}..  proc
d500: 20 61 75 74 68 20 7b 61 72 67 73 7d 20 7b 65 76   auth {args} {ev
d510: 61 6c 20 6c 61 70 70 65 6e 64 20 3a 3a 61 75 74  al lappend ::aut
d520: 68 61 72 67 73 20 5b 6c 72 61 6e 67 65 20 24 61  hargs [lrange $a
d530: 72 67 73 20 30 20 34 5d 3b 20 72 65 74 75 72 6e  rgs 0 4]; return
d540: 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 20 20 64 62   SQLITE_OK}.  db
d550: 20 61 75 74 68 20 61 75 74 68 0a 0a 20 20 23 20   auth auth..  # 
d560: 41 6e 20 69 6e 73 65 72 74 20 6f 6e 20 74 68 65  An insert on the
d570: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6d 75   parent table mu
d580: 73 74 20 72 65 61 64 20 74 68 65 20 63 68 69 6c  st read the chil
d590: 64 20 6b 65 79 20 6f 66 20 61 6e 79 20 64 65 66  d key of any def
d5a0: 65 72 72 65 64 0a 20 20 23 20 66 6f 72 65 69 67  erred.  # foreig
d5b0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
d5c0: 73 2e 20 42 75 74 20 6e 6f 74 20 74 68 65 20 63  s. But not the c
d5d0: 68 69 6c 64 20 6b 65 79 20 6f 66 20 69 6d 6d 65  hild key of imme
d5e0: 64 69 61 74 65 20 63 6f 6e 73 74 72 61 69 6e 74  diate constraint
d5f0: 73 2e 0a 20 20 73 65 74 20 61 75 74 68 61 72 67  s..  set autharg
d600: 73 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  s {}.  do_test w
d610: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 38  ithout_rowid3-18
d620: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
d630: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c   { INSERT INTO l
d640: 6f 6e 67 20 56 41 4c 55 45 53 28 31 2c 20 32 2c  ong VALUES(1, 2,
d650: 20 33 29 20 7d 0a 20 20 20 20 73 65 74 20 61 75   3) }.    set au
d660: 74 68 61 72 67 73 0a 20 20 7d 20 7b 53 51 4c 49  thargs.  } {SQLI
d670: 54 45 5f 49 4e 53 45 52 54 20 6c 6f 6e 67 20 7b  TE_INSERT long {
d680: 7d 20 6d 61 69 6e 20 7b 7d 20 53 51 4c 49 54 45  } main {} SQLITE
d690: 5f 52 45 41 44 20 6d 69 64 20 69 20 6d 61 69 6e  _READ mid i main
d6a0: 20 7b 7d 7d 0a 0a 20 20 23 20 41 6e 20 69 6e 73   {}}..  # An ins
d6b0: 65 72 74 20 6f 6e 20 74 68 65 20 63 68 69 6c 64  ert on the child
d6c0: 20 74 61 62 6c 65 20 6f 66 20 61 6e 20 69 6d 6d   table of an imm
d6d0: 65 64 69 61 74 65 20 63 6f 6e 73 74 72 61 69 6e  ediate constrain
d6e0: 74 20 6d 75 73 74 20 72 65 61 64 20 74 68 65 0a  t must read the.
d6f0: 20 20 23 20 70 61 72 65 6e 74 20 6b 65 79 20 63    # parent key c
d700: 6f 6c 75 6d 6e 73 20 28 74 6f 20 73 65 65 20 69  olumns (to see i
d710: 66 20 69 74 20 69 73 20 61 20 76 69 6f 6c 61 74  f it is a violat
d720: 69 6f 6e 20 6f 72 20 6e 6f 74 29 2e 0a 20 20 73  ion or not)..  s
d730: 65 74 20 61 75 74 68 61 72 67 73 20 7b 7d 0a 20  et authargs {}. 
d740: 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74   do_test without
d750: 5f 72 6f 77 69 64 33 2d 31 38 2e 33 20 7b 0a 20  _rowid3-18.3 {. 
d760: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
d770: 45 52 54 20 49 4e 54 4f 20 73 68 6f 72 74 20 56  ERT INTO short V
d780: 41 4c 55 45 53 28 31 2c 20 33 2c 20 32 29 20 7d  ALUES(1, 3, 2) }
d790: 0a 20 20 20 20 73 65 74 20 61 75 74 68 61 72 67  .    set autharg
d7a0: 73 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 49 4e  s.  } {SQLITE_IN
d7b0: 53 45 52 54 20 73 68 6f 72 74 20 7b 7d 20 6d 61  SERT short {} ma
d7c0: 69 6e 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45 41  in {} SQLITE_REA
d7d0: 44 20 6c 6f 6e 67 20 62 20 6d 61 69 6e 20 7b 7d  D long b main {}
d7e0: 7d 0a 20 20 0a 20 20 23 20 41 73 20 6d 75 73 74  }.  .  # As must
d7f0: 20 61 6e 20 69 6e 73 65 72 74 20 6f 6e 20 74 68   an insert on th
d800: 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 6f 66  e child table of
d810: 20 61 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73   a deferred cons
d820: 74 72 61 69 6e 74 2e 0a 20 20 73 65 74 20 61 75  traint..  set au
d830: 74 68 61 72 67 73 20 7b 7d 0a 20 20 64 6f 5f 74  thargs {}.  do_t
d840: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
d850: 64 33 2d 31 38 2e 34 20 7b 0a 20 20 20 20 65 78  d3-18.4 {.    ex
d860: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
d870: 4e 54 4f 20 6d 69 64 20 56 41 4c 55 45 53 28 31  NTO mid VALUES(1
d880: 2c 20 33 2c 20 32 29 20 7d 0a 20 20 20 20 73 65  , 3, 2) }.    se
d890: 74 20 61 75 74 68 61 72 67 73 0a 20 20 7d 20 7b  t authargs.  } {
d8a0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 6d 69  SQLITE_INSERT mi
d8b0: 64 20 7b 7d 20 6d 61 69 6e 20 7b 7d 20 53 51 4c  d {} main {} SQL
d8c0: 49 54 45 5f 52 45 41 44 20 6c 6f 6e 67 20 62 20  ITE_READ long b 
d8d0: 6d 61 69 6e 20 7b 7d 7d 0a 0a 20 20 64 6f 5f 74  main {}}..  do_t
d8e0: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
d8f0: 64 33 2d 31 38 2e 35 20 7b 0a 20 20 20 20 65 78  d3-18.5 {.    ex
d900: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52  ecsql {.      CR
d910: 45 41 54 45 20 54 41 42 4c 45 20 6e 6f 75 67 68  EATE TABLE nough
d920: 74 28 61 2c 20 62 20 50 52 49 4d 41 52 59 20 4b  t(a, b PRIMARY K
d930: 45 59 2c 20 63 29 20 57 49 54 48 4f 55 54 20 72  EY, c) WITHOUT r
d940: 6f 77 69 64 3b 0a 20 20 20 20 20 20 43 52 45 41  owid;.      CREA
d950: 54 45 20 54 41 42 4c 45 20 63 72 6f 73 73 28 64  TE TABLE cross(d
d960: 2c 20 65 2c 20 66 2c 0a 20 20 20 20 20 20 20 20  , e, f,.        
d970: 46 4f 52 45 49 47 4e 20 4b 45 59 28 65 29 20 52  FOREIGN KEY(e) R
d980: 45 46 45 52 45 4e 43 45 53 20 6e 6f 75 67 68 74  EFERENCES nought
d990: 28 62 29 20 4f 4e 20 55 50 44 41 54 45 20 43 41  (b) ON UPDATE CA
d9a0: 53 43 41 44 45 0a 20 20 20 20 20 20 29 3b 0a 20  SCADE.      );. 
d9b0: 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c     }.    execsql
d9c0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e   { INSERT INTO n
d9d0: 6f 75 67 68 74 20 56 41 4c 55 45 53 28 32 2c 20  ought VALUES(2, 
d9e0: 31 2c 20 32 29 20 7d 0a 20 20 20 20 65 78 65 63  1, 2) }.    exec
d9f0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
da00: 4f 20 63 72 6f 73 73 20 56 41 4c 55 45 53 28 30  O cross VALUES(0
da10: 2c 20 31 2c 20 30 29 20 7d 0a 20 20 20 20 73 65  , 1, 0) }.    se
da20: 74 20 61 75 74 68 61 72 67 73 20 5b 6c 69 73 74  t authargs [list
da30: 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  ].    execsql { 
da40: 55 50 44 41 54 45 20 6e 6f 75 67 68 74 20 53 45  UPDATE nought SE
da50: 54 20 62 20 3d 20 35 20 7d 0a 20 20 20 20 73 65  T b = 5 }.    se
da60: 74 20 61 75 74 68 61 72 67 73 0a 20 20 7d 20 7b  t authargs.  } {
da70: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 6e 6f  SQLITE_UPDATE no
da80: 75 67 68 74 20 62 20 6d 61 69 6e 20 7b 7d 20 53  ught b main {} S
da90: 51 4c 49 54 45 5f 52 45 41 44 20 63 72 6f 73 73  QLITE_READ cross
daa0: 20 65 20 6d 61 69 6e 20 7b 7d 20 53 51 4c 49 54   e main {} SQLIT
dab0: 45 5f 52 45 41 44 20 63 72 6f 73 73 20 65 20 6d  E_READ cross e m
dac0: 61 69 6e 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45  ain {} SQLITE_RE
dad0: 41 44 20 6e 6f 75 67 68 74 20 62 20 6d 61 69 6e  AD nought b main
dae0: 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45 41 44 20   {} SQLITE_READ 
daf0: 6e 6f 75 67 68 74 20 62 20 6d 61 69 6e 20 7b 7d  nought b main {}
db00: 20 53 51 4c 49 54 45 5f 52 45 41 44 20 6e 6f 75   SQLITE_READ nou
db10: 67 68 74 20 62 20 6d 61 69 6e 20 7b 7d 20 53 51  ght b main {} SQ
db20: 4c 49 54 45 5f 55 50 44 41 54 45 20 63 72 6f 73  LITE_UPDATE cros
db30: 73 20 65 20 6d 61 69 6e 20 7b 7d 20 53 51 4c 49  s e main {} SQLI
db40: 54 45 5f 52 45 41 44 20 6e 6f 75 67 68 74 20 62  TE_READ nought b
db50: 20 6d 61 69 6e 20 7b 7d 20 53 51 4c 49 54 45 5f   main {} SQLITE_
db60: 52 45 41 44 20 63 72 6f 73 73 20 65 20 6d 61 69  READ cross e mai
db70: 6e 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45 41 44  n {} SQLITE_READ
db80: 20 6e 6f 75 67 68 74 20 62 20 6d 61 69 6e 20 7b   nought b main {
db90: 7d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 6e 6f  } SQLITE_READ no
dba0: 75 67 68 74 20 62 20 6d 61 69 6e 20 7b 7d 7d 0a  ught b main {}}.
dbb0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  .  do_test witho
dbc0: 75 74 5f 72 6f 77 69 64 33 2d 31 38 2e 36 20 7b  ut_rowid3-18.6 {
dbd0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45  .    execsql {SE
dbe0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 72 6f 73  LECT * FROM cros
dbf0: 73 7d 0a 20 20 7d 20 7b 30 20 35 20 30 7d 0a 0a  s}.  } {0 5 0}..
dc00: 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75    do_test withou
dc10: 74 5f 72 6f 77 69 64 33 2d 31 38 2e 37 20 7b 0a  t_rowid3-18.7 {.
dc20: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
dc30: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
dc40: 20 6f 6e 65 28 61 20 49 4e 54 20 50 52 49 4d 41   one(a INT PRIMA
dc50: 52 59 20 4b 45 59 2c 20 62 29 20 57 49 54 48 4f  RY KEY, b) WITHO
dc60: 55 54 20 72 6f 77 69 64 3b 0a 20 20 20 20 20 20  UT rowid;.      
dc70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 77 6f  CREATE TABLE two
dc80: 28 62 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53  (b, c REFERENCES
dc90: 20 6f 6e 65 29 3b 0a 20 20 20 20 20 20 49 4e 53   one);.      INS
dca0: 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c  ERT INTO one VAL
dcb0: 55 45 53 28 31 30 31 2c 20 31 30 32 29 3b 0a 20  UES(101, 102);. 
dcc0: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 61 75 74     }.    set aut
dcd0: 68 61 72 67 73 20 5b 6c 69 73 74 5d 0a 20 20 20  hargs [list].   
dce0: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
dcf0: 54 20 49 4e 54 4f 20 74 77 6f 20 56 41 4c 55 45  T INTO two VALUE
dd00: 53 28 31 30 30 2c 20 31 30 31 29 3b 20 7d 0a 20  S(100, 101); }. 
dd10: 20 20 20 73 65 74 20 61 75 74 68 61 72 67 73 0a     set authargs.
dd20: 20 20 7d 20 7b 53 51 4c 49 54 45 5f 49 4e 53 45    } {SQLITE_INSE
dd30: 52 54 20 74 77 6f 20 7b 7d 20 6d 61 69 6e 20 7b  RT two {} main {
dd40: 7d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 6f 6e  } SQLITE_READ on
dd50: 65 20 61 20 6d 61 69 6e 20 7b 7d 7d 0a 0a 20 20  e a main {}}..  
dd60: 23 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  # Return SQLITE_
dd70: 49 47 4e 4f 52 45 20 74 6f 20 72 65 71 75 65 73  IGNORE to reques
dd80: 74 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ts to read from 
dd90: 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
dda0: 2e 20 54 68 69 73 0a 20 20 23 20 63 61 75 73 65  . This.  # cause
ddb0: 73 20 69 6e 73 65 72 74 73 20 6f 66 20 6e 6f 6e  s inserts of non
ddc0: 2d 4e 55 4c 4c 20 6b 65 79 73 20 69 6e 74 6f 20  -NULL keys into 
ddd0: 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20  the child table 
dde0: 74 6f 20 66 61 69 6c 2e 0a 20 20 23 0a 20 20 72  to fail..  #.  r
ddf0: 65 6e 61 6d 65 20 61 75 74 68 20 7b 7d 0a 20 20  ename auth {}.  
de00: 70 72 6f 63 20 61 75 74 68 20 7b 61 72 67 73 7d  proc auth {args}
de10: 20 7b 0a 20 20 20 20 69 66 20 7b 5b 6c 69 6e 64   {.    if {[lind
de20: 65 78 20 24 61 72 67 73 20 31 5d 20 3d 3d 20 22  ex $args 1] == "
de30: 6c 6f 6e 67 22 7d 20 7b 72 65 74 75 72 6e 20 53  long"} {return S
de40: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 7d 0a 20 20  QLITE_IGNORE}.  
de50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
de60: 4f 4b 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74  OK.  }.  do_test
de70: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
de80: 31 38 2e 38 20 7b 0a 20 20 20 20 63 61 74 63 68  18.8 {.    catch
de90: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
dea0: 4f 20 73 68 6f 72 74 20 56 41 4c 55 45 53 28 31  O short VALUES(1
deb0: 2c 20 33 2c 20 32 29 20 7d 0a 20 20 7d 20 7b 31  , 3, 2) }.  } {1
dec0: 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
ded0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
dee0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68  }.  do_test with
def0: 6f 75 74 5f 72 6f 77 69 64 33 2d 31 38 2e 39 20  out_rowid3-18.9 
df00: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
df10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 68 6f 72  INSERT INTO shor
df20: 74 20 56 41 4c 55 45 53 28 31 2c 20 33 2c 20 4e  t VALUES(1, 3, N
df30: 55 4c 4c 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20  ULL) }.  } {}.  
df40: 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
df50: 72 6f 77 69 64 33 2d 31 38 2e 31 30 20 7b 0a 20  rowid3-18.10 {. 
df60: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
df70: 45 43 54 20 2a 20 46 52 4f 4d 20 73 68 6f 72 74  ECT * FROM short
df80: 20 7d 0a 20 20 7d 20 7b 31 20 33 20 32 20 31 20   }.  } {1 3 2 1 
df90: 33 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  3 {}}.  do_test 
dfa0: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31  without_rowid3-1
dfb0: 38 2e 31 31 20 7b 0a 20 20 20 20 63 61 74 63 68  8.11 {.    catch
dfc0: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 73 68 6f  sql { UPDATE sho
dfd0: 72 74 20 53 45 54 20 66 20 3d 20 32 20 57 48 45  rt SET f = 2 WHE
dfe0: 52 45 20 66 20 49 53 20 4e 55 4c 4c 20 7d 0a 20  RE f IS NULL }. 
dff0: 20 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b   } {1 {FOREIGN K
e000: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
e010: 69 6c 65 64 7d 7d 0a 0a 20 20 64 62 20 61 75 74  iled}}..  db aut
e020: 68 20 7b 7d 0a 20 20 75 6e 73 65 74 20 61 75 74  h {}.  unset aut
e030: 68 61 72 67 73 0a 7d 0a 0a 0a 64 6f 5f 74 65 73  hargs.}...do_tes
e040: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  t without_rowid3
e050: 2d 31 39 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -19.1 {.  execsq
e060: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
e070: 41 42 4c 45 20 6d 61 69 6e 28 69 64 20 49 4e 54  ABLE main(id INT
e080: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 20 57 49   PRIMARY KEY) WI
e090: 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20 20  THOUT rowid;.   
e0a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 75   CREATE TABLE su
e0b0: 62 28 69 64 20 49 4e 54 20 52 45 46 45 52 45 4e  b(id INT REFEREN
e0c0: 43 45 53 20 6d 61 69 6e 28 69 64 29 29 3b 0a 20  CES main(id));. 
e0d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d     INSERT INTO m
e0e0: 61 69 6e 20 56 41 4c 55 45 53 28 31 29 3b 0a 20  ain VALUES(1);. 
e0f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d     INSERT INTO m
e100: 61 69 6e 20 56 41 4c 55 45 53 28 32 29 3b 0a 20  ain VALUES(2);. 
e110: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73     INSERT INTO s
e120: 75 62 20 56 41 4c 55 45 53 28 32 29 3b 0a 20 20  ub VALUES(2);.  
e130: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77  }.} {}.do_test w
e140: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 39  ithout_rowid3-19
e150: 2e 32 20 7b 0a 20 20 73 65 74 20 53 20 5b 73 71  .2 {.  set S [sq
e160: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
e170: 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d   db "DELETE FROM
e180: 20 6d 61 69 6e 20 57 48 45 52 45 20 69 64 20 3d   main WHERE id =
e190: 20 3f 22 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20   ?" -1 dummy].  
e1a0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
e1b0: 20 24 53 20 31 20 32 0a 20 20 73 71 6c 69 74 65   $S 1 2.  sqlite
e1c0: 33 5f 73 74 65 70 20 24 53 0a 7d 20 7b 53 51 4c  3_step $S.} {SQL
e1d0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 7d 0a  ITE_CONSTRAINT}.
e1e0: 76 65 72 69 66 79 5f 65 78 5f 65 72 72 63 6f 64  verify_ex_errcod
e1f0: 65 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  e without_rowid3
e200: 2d 31 39 2e 32 62 20 53 51 4c 49 54 45 5f 43 4f  -19.2b SQLITE_CO
e210: 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
e220: 4b 45 59 0a 64 6f 5f 74 65 73 74 20 77 69 74 68  KEY.do_test with
e230: 6f 75 74 5f 72 6f 77 69 64 33 2d 31 39 2e 33 20  out_rowid3-19.3 
e240: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65  {.  sqlite3_rese
e250: 74 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 43  t $S.} {SQLITE_C
e260: 4f 4e 53 54 52 41 49 4e 54 7d 0a 76 65 72 69 66  ONSTRAINT}.verif
e270: 79 5f 65 78 5f 65 72 72 63 6f 64 65 20 77 69 74  y_ex_errcode wit
e280: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 31 39 2e 33  hout_rowid3-19.3
e290: 62 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  b SQLITE_CONSTRA
e2a0: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 64  INT_FOREIGNKEY.d
e2b0: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
e2c0: 6f 77 69 64 33 2d 31 39 2e 34 20 7b 0a 20 20 73  owid3-19.4 {.  s
e2d0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20  qlite3_bind_int 
e2e0: 24 53 20 31 20 31 0a 20 20 73 71 6c 69 74 65 33  $S 1 1.  sqlite3
e2f0: 5f 73 74 65 70 20 24 53 0a 7d 20 7b 53 51 4c 49  _step $S.} {SQLI
e300: 54 45 5f 44 4f 4e 45 7d 0a 64 6f 5f 74 65 73 74  TE_DONE}.do_test
e310: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
e320: 31 39 2e 34 20 7b 0a 20 20 73 71 6c 69 74 65 33  19.4 {.  sqlite3
e330: 5f 66 69 6e 61 6c 69 7a 65 20 24 53 0a 7d 20 7b  _finalize $S.} {
e340: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 64 72 6f 70  SQLITE_OK}..drop
e350: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
e360: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
e370: 64 33 2d 32 30 2e 31 20 7b 0a 20 20 65 78 65 63  d3-20.1 {.  exec
e380: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
e390: 20 54 41 42 4c 45 20 70 70 28 61 20 50 52 49 4d   TABLE pp(a PRIM
e3a0: 41 52 59 20 4b 45 59 2c 20 62 29 20 57 49 54 48  ARY KEY, b) WITH
e3b0: 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20 20 20 43  OUT rowid;.    C
e3c0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 63 28 63  REATE TABLE cc(c
e3d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 64 20   PRIMARY KEY, d 
e3e0: 52 45 46 45 52 45 4e 43 45 53 20 70 70 29 20 57  REFERENCES pp) W
e3f0: 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20  ITHOUT rowid;.  
e400: 7d 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20  }.} {}..foreach 
e410: 7b 74 6e 20 69 6e 73 65 72 74 7d 20 7b 0a 20 20  {tn insert} {.  
e420: 31 20 22 49 4e 53 45 52 54 22 0a 20 20 32 20 22  1 "INSERT".  2 "
e430: 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45  INSERT OR IGNORE
e440: 22 0a 20 20 33 20 22 49 4e 53 45 52 54 20 4f 52  ".  3 "INSERT OR
e450: 20 41 42 4f 52 54 22 0a 20 20 34 20 22 49 4e 53   ABORT".  4 "INS
e460: 45 52 54 20 4f 52 20 52 4f 4c 4c 42 41 43 4b 22  ERT OR ROLLBACK"
e470: 0a 20 20 35 20 22 49 4e 53 45 52 54 20 4f 52 20  .  5 "INSERT OR 
e480: 52 45 50 4c 41 43 45 22 0a 20 20 36 20 22 49 4e  REPLACE".  6 "IN
e490: 53 45 52 54 20 4f 52 20 46 41 49 4c 22 0a 7d 20  SERT OR FAIL".} 
e4a0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68  {.  do_test with
e4b0: 6f 75 74 5f 72 6f 77 69 64 33 2d 32 30 2e 32 2e  out_rowid3-20.2.
e4c0: 24 74 6e 2e 31 20 7b 0a 20 20 20 20 63 61 74 63  $tn.1 {.    catc
e4d0: 68 73 71 6c 20 22 24 69 6e 73 65 72 74 20 49 4e  hsql "$insert IN
e4e0: 54 4f 20 63 63 20 56 41 4c 55 45 53 28 31 2c 20  TO cc VALUES(1, 
e4f0: 32 29 22 0a 20 20 7d 20 7b 31 20 7b 46 4f 52 45  2)".  } {1 {FORE
e500: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
e510: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f  nt failed}}.  do
e520: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
e530: 77 69 64 33 2d 32 30 2e 32 2e 24 74 6e 2e 32 20  wid3-20.2.$tn.2 
e540: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
e550: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 63  SELECT * FROM cc
e560: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
e570: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
e580: 64 33 2d 32 30 2e 32 2e 24 74 6e 2e 33 20 7b 0a  d3-20.2.$tn.3 {.
e590: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
e5a0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
e5b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
e5c0: 70 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f  p VALUES(2, 'two
e5d0: 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ');.        INSE
e5e0: 52 54 20 49 4e 54 4f 20 63 63 20 56 41 4c 55 45  RT INTO cc VALUE
e5f0: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20  S(1, 2);.    }. 
e600: 20 20 20 63 61 74 63 68 73 71 6c 20 22 24 69 6e     catchsql "$in
e610: 73 65 72 74 20 49 4e 54 4f 20 63 63 20 56 41 4c  sert INTO cc VAL
e620: 55 45 53 28 33 2c 20 34 29 22 0a 20 20 7d 20 7b  UES(3, 4)".  } {
e630: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
e640: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
e650: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74  }}.  do_test wit
e660: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 30 2e 32  hout_rowid3-20.2
e670: 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 65 78 65  .$tn.4 {.    exe
e680: 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 3b 20  csql { COMMIT ; 
e690: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 63  SELECT * FROM cc
e6a0: 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20 64   }.  } {1 2}.  d
e6b0: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
e6c0: 6f 77 69 64 33 2d 32 30 2e 32 2e 24 74 6e 2e 35  owid3-20.2.$tn.5
e6d0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
e6e0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 63 20   DELETE FROM cc 
e6f0: 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 70  ; DELETE FROM pp
e700: 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 66 6f 72   }.  } {}.}..for
e710: 65 61 63 68 20 7b 74 6e 20 75 70 64 61 74 65 7d  each {tn update}
e720: 20 7b 0a 20 20 31 20 22 55 50 44 41 54 45 22 0a   {.  1 "UPDATE".
e730: 20 20 32 20 22 55 50 44 41 54 45 20 4f 52 20 49    2 "UPDATE OR I
e740: 47 4e 4f 52 45 22 0a 20 20 33 20 22 55 50 44 41  GNORE".  3 "UPDA
e750: 54 45 20 4f 52 20 41 42 4f 52 54 22 0a 20 20 34  TE OR ABORT".  4
e760: 20 22 55 50 44 41 54 45 20 4f 52 20 52 4f 4c 4c   "UPDATE OR ROLL
e770: 42 41 43 4b 22 0a 20 20 35 20 22 55 50 44 41 54  BACK".  5 "UPDAT
e780: 45 20 4f 52 20 52 45 50 4c 41 43 45 22 0a 20 20  E OR REPLACE".  
e790: 36 20 22 55 50 44 41 54 45 20 4f 52 20 46 41 49  6 "UPDATE OR FAI
e7a0: 4c 22 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74  L".} {.  do_test
e7b0: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
e7c0: 32 30 2e 33 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  20.3.$tn.1 {.   
e7d0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
e7e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 70 20   INSERT INTO pp 
e7f0: 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27 29  VALUES(2, 'two')
e800: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
e810: 4e 54 4f 20 63 63 20 56 41 4c 55 45 53 28 31 2c  NTO cc VALUES(1,
e820: 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   2);.    }.  } {
e830: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68  }.  do_test with
e840: 6f 75 74 5f 72 6f 77 69 64 33 2d 32 30 2e 33 2e  out_rowid3-20.3.
e850: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 63 61 74 63  $tn.2 {.    catc
e860: 68 73 71 6c 20 22 24 75 70 64 61 74 65 20 70 70  hsql "$update pp
e870: 20 53 45 54 20 61 20 3d 20 31 22 0a 20 20 7d 20   SET a = 1".  } 
e880: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
e890: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
e8a0: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69  d}}.  do_test wi
e8b0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 30 2e  thout_rowid3-20.
e8c0: 33 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 65 78  3.$tn.3 {.    ex
e8d0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
e8e0: 20 46 52 4f 4d 20 70 70 20 7d 0a 20 20 7d 20 7b   FROM pp }.  } {
e8f0: 32 20 74 77 6f 7d 0a 20 20 64 6f 5f 74 65 73 74  2 two}.  do_test
e900: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
e910: 32 30 2e 33 2e 24 74 6e 2e 34 20 7b 0a 20 20 20  20.3.$tn.4 {.   
e920: 20 63 61 74 63 68 73 71 6c 20 22 24 75 70 64 61   catchsql "$upda
e930: 74 65 20 63 63 20 53 45 54 20 64 20 3d 20 31 22  te cc SET d = 1"
e940: 0a 20 20 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e  .  } {1 {FOREIGN
e950: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
e960: 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f 74 65  failed}}.  do_te
e970: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
e980: 33 2d 32 30 2e 33 2e 24 74 6e 2e 35 20 7b 0a 20  3-20.3.$tn.5 {. 
e990: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
e9a0: 45 43 54 20 2a 20 46 52 4f 4d 20 63 63 20 7d 0a  ECT * FROM cc }.
e9b0: 20 20 7d 20 7b 31 20 32 7d 0a 20 20 64 6f 5f 74    } {1 2}.  do_t
e9c0: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
e9d0: 64 33 2d 32 30 2e 33 2e 24 74 6e 2e 36 20 7b 0a  d3-20.3.$tn.6 {.
e9e0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
e9f0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
ea00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
ea10: 70 20 56 41 4c 55 45 53 28 33 2c 20 27 74 68 72  p VALUES(3, 'thr
ea20: 65 65 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ee');.    }.    
ea30: 63 61 74 63 68 73 71 6c 20 22 24 75 70 64 61 74  catchsql "$updat
ea40: 65 20 70 70 20 53 45 54 20 61 20 3d 20 31 20 57  e pp SET a = 1 W
ea50: 48 45 52 45 20 61 20 3d 20 32 22 0a 20 20 7d 20  HERE a = 2".  } 
ea60: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
ea70: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
ea80: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69  d}}.  do_test wi
ea90: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 32 30 2e  thout_rowid3-20.
eaa0: 33 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 65 78  3.$tn.7 {.    ex
eab0: 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 3b  ecsql { COMMIT ;
eac0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70   SELECT * FROM p
ead0: 70 20 7d 0a 20 20 7d 20 7b 32 20 74 77 6f 20 33  p }.  } {2 two 3
eae0: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
eaf0: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  t without_rowid3
eb00: 2d 32 30 2e 33 2e 24 74 6e 2e 38 20 7b 0a 20 20  -20.3.$tn.8 {.  
eb10: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
eb20: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20    BEGIN;.       
eb30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 63 20   INSERT INTO cc 
eb40: 56 41 4c 55 45 53 28 32 2c 20 32 29 3b 0a 20 20  VALUES(2, 2);.  
eb50: 20 20 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c    }.    catchsql
eb60: 20 22 24 75 70 64 61 74 65 20 63 63 20 53 45 54   "$update cc SET
eb70: 20 64 20 3d 20 31 20 57 48 45 52 45 20 63 20 3d   d = 1 WHERE c =
eb80: 20 31 22 0a 20 20 7d 20 7b 31 20 7b 46 4f 52 45   1".  } {1 {FORE
eb90: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
eba0: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f  nt failed}}.  do
ebb0: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
ebc0: 77 69 64 33 2d 32 30 2e 33 2e 24 74 6e 2e 39 20  wid3-20.3.$tn.9 
ebd0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
ebe0: 43 4f 4d 4d 49 54 20 3b 20 53 45 4c 45 43 54 20  COMMIT ; SELECT 
ebf0: 2a 20 46 52 4f 4d 20 63 63 20 7d 0a 20 20 7d 20  * FROM cc }.  } 
ec00: 7b 31 20 32 20 32 20 32 7d 0a 20 20 64 6f 5f 74  {1 2 2 2}.  do_t
ec10: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
ec20: 64 33 2d 32 30 2e 33 2e 24 74 6e 2e 31 30 20 7b  d3-20.3.$tn.10 {
ec30: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 44  .    execsql { D
ec40: 45 4c 45 54 45 20 46 52 4f 4d 20 63 63 20 3b 20  ELETE FROM cc ; 
ec50: 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 70 20 7d  DELETE FROM pp }
ec60: 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  .  } {}.}..#----
ec70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ecb0: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
ecc0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 74  owing block of t
ecd0: 65 73 74 73 2c 20 74 68 6f 73 65 20 70 72 65 66  ests, those pref
ece0: 69 78 65 64 20 77 69 74 68 20 22 77 69 74 68 6f  ixed with "witho
ecf0: 75 74 5f 72 6f 77 69 64 33 2d 67 65 6e 66 6b 65  ut_rowid3-genfke
ed00: 79 2e 22 2c 0a 23 20 61 72 65 20 74 68 65 20 73  y.",.# are the s
ed10: 61 6d 65 20 74 65 73 74 73 20 74 68 61 74 20 77  ame tests that w
ed20: 65 72 65 20 75 73 65 64 20 74 6f 20 74 65 73 74  ere used to test
ed30: 20 74 68 65 20 22 2e 67 65 6e 66 6b 65 79 22 20   the ".genfkey" 
ed40: 63 6f 6d 6d 61 6e 64 20 70 72 6f 76 69 64 65 64  command provided
ed50: 20 0a 23 20 62 79 20 74 68 65 20 73 68 65 6c 6c   .# by the shell
ed60: 20 74 6f 6f 6c 2e 20 53 6f 20 74 68 65 73 65 20   tool. So these 
ed70: 74 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  tests show that 
ed80: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66 6f 72  the built-in for
ed90: 65 69 67 6e 20 6b 65 79 20 0a 23 20 69 6d 70 6c  eign key .# impl
eda0: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6d 6f  ementation is mo
edb0: 72 65 20 6f 72 20 6c 65 73 73 20 63 6f 6d 70 61  re or less compa
edc0: 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 74  tible with the t
edd0: 72 69 67 67 65 72 73 20 67 65 6e 65 72 61 74 65  riggers generate
ede0: 64 20 0a 23 20 62 79 20 67 65 6e 66 6b 65 79 2e  d .# by genfkey.
edf0: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
ee00: 65 73 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  es.do_test witho
ee10: 75 74 5f 72 6f 77 69 64 33 2d 67 65 6e 66 6b 65  ut_rowid3-genfke
ee20: 79 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  y.1.1 {.  execsq
ee30: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
ee40: 41 42 4c 45 20 74 31 28 61 20 49 4e 54 20 50 52  ABLE t1(a INT PR
ee50: 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 2c  IMARY KEY, b, c,
ee60: 20 55 4e 49 51 55 45 28 62 2c 20 63 29 29 20 57   UNIQUE(b, c)) W
ee70: 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20  ITHOUT rowid;.  
ee80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
ee90: 32 28 65 20 52 45 46 45 52 45 4e 43 45 53 20 74  2(e REFERENCES t
eea0: 31 2c 20 66 29 3b 0a 20 20 20 20 43 52 45 41 54  1, f);.    CREAT
eeb0: 45 20 54 41 42 4c 45 20 74 33 28 67 2c 20 68 2c  E TABLE t3(g, h,
eec0: 20 69 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 20   i, FOREIGN KEY 
eed0: 28 68 2c 20 69 29 20 52 45 46 45 52 45 4e 43 45  (h, i) REFERENCE
eee0: 53 20 74 31 28 62 2c 20 63 29 29 3b 0a 20 20 7d  S t1(b, c));.  }
eef0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 69  .} {}.do_test wi
ef00: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 67 65 6e  thout_rowid3-gen
ef10: 66 6b 65 79 2e 31 2e 32 20 7b 0a 20 20 63 61 74  fkey.1.2 {.  cat
ef20: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
ef30: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c  NTO t2 VALUES(1,
ef40: 20 32 29 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45   2) }.} {1 {FORE
ef50: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
ef60: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
ef70: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
ef80: 64 33 2d 67 65 6e 66 6b 65 79 2e 31 2e 33 20 7b  d3-genfkey.1.3 {
ef90: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
efa0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
efb0: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b  VALUES(1, 2, 3);
efc0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
efd0: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t2 VALUES(1, 2)
efe0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
eff0: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
f000: 33 2d 67 65 6e 66 6b 65 79 2e 31 2e 34 20 7b 0a  3-genfkey.1.4 {.
f010: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
f020: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
f030: 53 28 4e 55 4c 4c 2c 20 33 29 20 7d 0a 7d 20 7b  S(NULL, 3) }.} {
f040: 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75  }.do_test withou
f050: 74 5f 72 6f 77 69 64 33 2d 67 65 6e 66 6b 65 79  t_rowid3-genfkey
f060: 2e 31 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71  .1.5 {.  catchsq
f070: 6c 20 7b 20 55 50 44 41 54 45 20 74 32 20 53 45  l { UPDATE t2 SE
f080: 54 20 65 20 3d 20 35 20 57 48 45 52 45 20 65 20  T e = 5 WHERE e 
f090: 49 53 20 4e 55 4c 4c 20 7d 0a 7d 20 7b 31 20 7b  IS NULL }.} {1 {
f0a0: 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
f0b0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
f0c0: 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
f0d0: 72 6f 77 69 64 33 2d 67 65 6e 66 6b 65 79 2e 31  rowid3-genfkey.1
f0e0: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .6 {.  execsql {
f0f0: 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20 65   UPDATE t2 SET e
f100: 20 3d 20 31 20 57 48 45 52 45 20 65 20 49 53 20   = 1 WHERE e IS 
f110: 4e 55 4c 4c 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  NULL }.} {}.do_t
f120: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
f130: 64 33 2d 67 65 6e 66 6b 65 79 2e 31 2e 37 20 7b  d3-genfkey.1.7 {
f140: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44  .  execsql { UPD
f150: 41 54 45 20 74 32 20 53 45 54 20 65 20 3d 20 4e  ATE t2 SET e = N
f160: 55 4c 4c 20 57 48 45 52 45 20 66 20 3d 20 33 20  ULL WHERE f = 3 
f170: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77  }.} {}.do_test w
f180: 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 67 65  ithout_rowid3-ge
f190: 6e 66 6b 65 79 2e 31 2e 38 20 7b 0a 20 20 63 61  nfkey.1.8 {.  ca
f1a0: 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20  tchsql { UPDATE 
f1b0: 74 31 20 53 45 54 20 61 20 3d 20 31 30 20 7d 0a  t1 SET a = 10 }.
f1c0: 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
f1d0: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
f1e0: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 69  led}}.do_test wi
f1f0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 67 65 6e  thout_rowid3-gen
f200: 66 6b 65 79 2e 31 2e 39 20 7b 0a 20 20 63 61 74  fkey.1.9 {.  cat
f210: 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74  chsql { UPDATE t
f220: 31 20 53 45 54 20 61 20 3d 20 4e 55 4c 4c 20 7d  1 SET a = NULL }
f230: 0a 7d 20 7b 31 20 7b 4e 4f 54 20 4e 55 4c 4c 20  .} {1 {NOT NULL 
f240: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
f250: 64 3a 20 74 31 2e 61 7d 7d 0a 64 6f 5f 74 65 73  d: t1.a}}.do_tes
f260: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  t without_rowid3
f270: 2d 67 65 6e 66 6b 65 79 2e 31 2e 31 30 20 7b 0a  -genfkey.1.10 {.
f280: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c    catchsql { DEL
f290: 45 54 45 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  ETE FROM t1 }.} 
f2a0: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
f2b0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
f2c0: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68  d}}.do_test with
f2d0: 6f 75 74 5f 72 6f 77 69 64 33 2d 67 65 6e 66 6b  out_rowid3-genfk
f2e0: 65 79 2e 31 2e 31 31 20 7b 0a 20 20 65 78 65 63  ey.1.11 {.  exec
f2f0: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 32 20  sql { UPDATE t2 
f300: 53 45 54 20 65 20 3d 20 4e 55 4c 4c 20 7d 0a 7d  SET e = NULL }.}
f310: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68   {}.do_test with
f320: 6f 75 74 5f 72 6f 77 69 64 33 2d 67 65 6e 66 6b  out_rowid3-genfk
f330: 65 79 2e 31 2e 31 32 20 7b 0a 20 20 65 78 65 63  ey.1.12 {.  exec
f340: 73 71 6c 20 7b 20 0a 20 20 20 20 55 50 44 41 54  sql { .    UPDAT
f350: 45 20 74 31 20 53 45 54 20 61 20 3d 20 31 30 3b  E t1 SET a = 10;
f360: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
f370: 20 74 31 3b 0a 20 20 20 20 44 45 4c 45 54 45 20   t1;.    DELETE 
f380: 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b  FROM t2;.  }.} {
f390: 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75  }.do_test withou
f3a0: 74 5f 72 6f 77 69 64 33 2d 67 65 6e 66 6b 65 79  t_rowid3-genfkey
f3b0: 2e 31 2e 31 33 20 7b 0a 20 20 65 78 65 63 73 71  .1.13 {.  execsq
f3c0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
f3d0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c  NTO t3 VALUES(1,
f3e0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20   NULL, NULL);.  
f3f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
f400: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 4e 55   VALUES(1, 2, NU
f410: 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  LL);.    INSERT 
f420: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31  INTO t3 VALUES(1
f430: 2c 20 4e 55 4c 4c 2c 20 33 29 3b 0a 20 20 7d 0a  , NULL, 3);.  }.
f440: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74  } {}.do_test wit
f450: 68 6f 75 74 5f 72 6f 77 69 64 33 2d 67 65 6e 66  hout_rowid3-genf
f460: 6b 65 79 2e 31 2e 31 34 20 7b 0a 20 20 63 61 74  key.1.14 {.  cat
f470: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
f480: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 33 2c  NTO t3 VALUES(3,
f490: 20 31 2c 20 34 29 20 7d 0a 7d 20 7b 31 20 7b 46   1, 4) }.} {1 {F
f4a0: 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
f4b0: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
f4c0: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
f4d0: 6f 77 69 64 33 2d 67 65 6e 66 6b 65 79 2e 31 2e  owid3-genfkey.1.
f4e0: 31 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  15 {.  execsql {
f4f0: 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54   .    INSERT INT
f500: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 31  O t1 VALUES(1, 1
f510: 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 4);.    INSERT
f520: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
f530: 33 2c 20 31 2c 20 34 29 3b 0a 20 20 7d 0a 7d 20  3, 1, 4);.  }.} 
f540: 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  {}.do_test witho
f550: 75 74 5f 72 6f 77 69 64 33 2d 67 65 6e 66 6b 65  ut_rowid3-genfke
f560: 79 2e 31 2e 31 36 20 7b 0a 20 20 63 61 74 63 68  y.1.16 {.  catch
f570: 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
f580: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52  M t1 }.} {1 {FOR
f590: 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
f5a0: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
f5b0: 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77  test without_row
f5c0: 69 64 33 2d 67 65 6e 66 6b 65 79 2e 31 2e 31 37  id3-genfkey.1.17
f5d0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
f5e0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
f5f0: 3d 20 31 30 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45  = 10}.} {1 {FORE
f600: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
f610: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
f620: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
f630: 64 33 2d 67 65 6e 66 6b 65 79 2e 31 2e 31 38 20  d3-genfkey.1.18 
f640: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50  {.  execsql { UP
f650: 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20  DATE t1 SET a = 
f660: 31 30 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  10}.} {}.do_test
f670: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
f680: 67 65 6e 66 6b 65 79 2e 31 2e 31 39 20 7b 0a 20  genfkey.1.19 {. 
f690: 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41   catchsql { UPDA
f6a0: 54 45 20 74 33 20 53 45 54 20 68 20 3d 20 27 68  TE t3 SET h = 'h
f6b0: 65 6c 6c 6f 27 20 57 48 45 52 45 20 69 20 3d 20  ello' WHERE i = 
f6c0: 33 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e  3}.} {1 {FOREIGN
f6d0: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
f6e0: 66 61 69 6c 65 64 7d 7d 0a 0a 64 72 6f 70 5f 61  failed}}..drop_a
f6f0: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
f700: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  t without_rowid3
f710: 2d 67 65 6e 66 6b 65 79 2e 32 2e 31 20 7b 0a 20  -genfkey.2.1 {. 
f720: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
f730: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
f740: 20 49 4e 54 20 50 52 49 4d 41 52 59 20 4b 45 59   INT PRIMARY KEY
f750: 2c 20 62 2c 20 63 2c 20 55 4e 49 51 55 45 28 62  , b, c, UNIQUE(b
f760: 2c 20 63 29 29 20 57 49 54 48 4f 55 54 20 72 6f  , c)) WITHOUT ro
f770: 77 69 64 3b 0a 20 20 20 20 43 52 45 41 54 45 20  wid;.    CREATE 
f780: 54 41 42 4c 45 20 74 32 28 65 20 52 45 46 45 52  TABLE t2(e REFER
f790: 45 4e 43 45 53 20 74 31 20 4f 4e 20 55 50 44 41  ENCES t1 ON UPDA
f7a0: 54 45 20 43 41 53 43 41 44 45 20 4f 4e 20 44 45  TE CASCADE ON DE
f7b0: 4c 45 54 45 20 43 41 53 43 41 44 45 2c 20 66 29  LETE CASCADE, f)
f7c0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
f7d0: 4c 45 20 74 33 28 67 2c 20 68 2c 20 69 2c 20 0a  LE t3(g, h, i, .
f7e0: 20 20 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20          FOREIGN 
f7f0: 4b 45 59 20 28 68 2c 20 69 29 20 0a 20 20 20 20  KEY (h, i) .    
f800: 20 20 20 20 52 45 46 45 52 45 4e 43 45 53 20 74      REFERENCES t
f810: 31 28 62 2c 20 63 29 20 4f 4e 20 55 50 44 41 54  1(b, c) ON UPDAT
f820: 45 20 43 41 53 43 41 44 45 20 4f 4e 20 44 45 4c  E CASCADE ON DEL
f830: 45 54 45 20 43 41 53 43 41 44 45 0a 20 20 20 20  ETE CASCADE.    
f840: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
f850: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
f860: 64 33 2d 67 65 6e 66 6b 65 79 2e 32 2e 32 20 7b  d3-genfkey.2.2 {
f870: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
f880: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
f890: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b  VALUES(1, 2, 3);
f8a0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
f8b0: 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20 35 2c   t1 VALUES(4, 5,
f8c0: 20 36 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   6);.    INSERT 
f8d0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31  INTO t2 VALUES(1
f8e0: 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e  , 'one');.    IN
f8f0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
f900: 55 45 53 28 34 2c 20 27 66 6f 75 72 27 29 3b 0a  UES(4, 'four');.
f910: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
f920: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
f930: 67 65 6e 66 6b 65 79 2e 32 2e 33 20 7b 0a 20 20  genfkey.2.3 {.  
f940: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
f950: 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20  DATE t1 SET a = 
f960: 32 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20  2 WHERE a = 1;. 
f970: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
f980: 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 32 20 6f 6e   t2;.  }.} {2 on
f990: 65 20 34 20 66 6f 75 72 7d 0a 64 6f 5f 74 65 73  e 4 four}.do_tes
f9a0: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  t without_rowid3
f9b0: 2d 67 65 6e 66 6b 65 79 2e 32 2e 34 20 7b 0a 20  -genfkey.2.4 {. 
f9c0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
f9d0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
f9e0: 45 52 45 20 61 20 3d 20 34 3b 0a 20 20 20 20 53  ERE a = 4;.    S
f9f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
fa00: 0a 20 20 7d 0a 7d 20 7b 32 20 6f 6e 65 7d 0a 0a  .  }.} {2 one}..
fa10: 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
fa20: 72 6f 77 69 64 33 2d 67 65 6e 66 6b 65 79 2e 32  rowid3-genfkey.2
fa30: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
fa40: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
fa50: 20 74 33 20 56 41 4c 55 45 53 28 27 68 65 6c 6c   t3 VALUES('hell
fa60: 6f 27 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 55  o', 2, 3);.    U
fa70: 50 44 41 54 45 20 74 31 20 53 45 54 20 63 20 3d  PDATE t1 SET c =
fa80: 20 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a   2;.    SELECT *
fa90: 20 46 52 4f 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20   FROM t3;.  }.} 
faa0: 7b 68 65 6c 6c 6f 20 32 20 32 7d 0a 64 6f 5f 74  {hello 2 2}.do_t
fab0: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
fac0: 64 33 2d 67 65 6e 66 6b 65 79 2e 32 2e 36 20 7b  d3-genfkey.2.6 {
fad0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
fae0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b   DELETE FROM t1;
faf0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
fb00: 4f 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OM t3;.  }.} {}.
fb10: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
fb20: 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74  .do_test without
fb30: 5f 72 6f 77 69 64 33 2d 67 65 6e 66 6b 65 79 2e  _rowid3-genfkey.
fb40: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
fb50: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
fb60: 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20  LE t1(a INTEGER 
fb70: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20  PRIMARY KEY, b, 
fb80: 63 2c 20 55 4e 49 51 55 45 28 63 2c 20 62 29 29  c, UNIQUE(c, b))
fb90: 20 57 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a   WITHOUT rowid;.
fba0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
fbb0: 20 74 32 28 65 20 52 45 46 45 52 45 4e 43 45 53   t2(e REFERENCES
fbc0: 20 74 31 20 4f 4e 20 55 50 44 41 54 45 20 53 45   t1 ON UPDATE SE
fbd0: 54 20 4e 55 4c 4c 20 4f 4e 20 44 45 4c 45 54 45  T NULL ON DELETE
fbe0: 20 53 45 54 20 4e 55 4c 4c 2c 20 66 29 3b 0a 20   SET NULL, f);. 
fbf0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
fc00: 74 33 28 67 2c 20 68 2c 20 69 2c 20 0a 20 20 20  t3(g, h, i, .   
fc10: 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
fc20: 20 28 68 2c 20 69 29 20 0a 20 20 20 20 20 20 20   (h, i) .       
fc30: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 28 62   REFERENCES t1(b
fc40: 2c 20 63 29 20 4f 4e 20 55 50 44 41 54 45 20 53  , c) ON UPDATE S
fc50: 45 54 20 4e 55 4c 4c 20 4f 4e 20 44 45 4c 45 54  ET NULL ON DELET
fc60: 45 20 53 45 54 20 4e 55 4c 4c 0a 20 20 20 20 29  E SET NULL.    )
fc70: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
fc80: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
fc90: 33 2d 67 65 6e 66 6b 65 79 2e 33 2e 32 20 7b 0a  3-genfkey.3.2 {.
fca0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
fcb0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
fcc0: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a  ALUES(1, 2, 3);.
fcd0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
fce0: 74 31 20 56 41 4c 55 45 53 28 34 2c 20 35 2c 20  t1 VALUES(4, 5, 
fcf0: 36 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  6);.    INSERT I
fd00: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c  NTO t2 VALUES(1,
fd10: 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53   'one');.    INS
fd20: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
fd30: 45 53 28 34 2c 20 27 66 6f 75 72 27 29 3b 0a 20  ES(4, 'four');. 
fd40: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
fd50: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 67  without_rowid3-g
fd60: 65 6e 66 6b 65 79 2e 33 2e 33 20 7b 0a 20 20 65  enfkey.3.3 {.  e
fd70: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44  xecsql {.    UPD
fd80: 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 32  ATE t1 SET a = 2
fd90: 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20   WHERE a = 1;.  
fda0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
fdb0: 74 32 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 6f 6e  t2;.  }.} {{} on
fdc0: 65 20 34 20 66 6f 75 72 7d 0a 64 6f 5f 74 65 73  e 4 four}.do_tes
fdd0: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33  t without_rowid3
fde0: 2d 67 65 6e 66 6b 65 79 2e 33 2e 34 20 7b 0a 20  -genfkey.3.4 {. 
fdf0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
fe00: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
fe10: 45 52 45 20 61 20 3d 20 34 3b 0a 20 20 20 20 53  ERE a = 4;.    S
fe20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
fe30: 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 6f 6e 65 20 7b  .  }.} {{} one {
fe40: 7d 20 66 6f 75 72 7d 0a 64 6f 5f 74 65 73 74 20  } four}.do_test 
fe50: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 67  without_rowid3-g
fe60: 65 6e 66 6b 65 79 2e 33 2e 35 20 7b 0a 20 20 65  enfkey.3.5 {.  e
fe70: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
fe80: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
fe90: 45 53 28 27 68 65 6c 6c 6f 27 2c 20 32 2c 20 33  ES('hello', 2, 3
fea0: 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31  );.    UPDATE t1
feb0: 20 53 45 54 20 63 20 3d 20 32 3b 0a 20 20 20 20   SET c = 2;.    
fec0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
fed0: 3b 0a 20 20 7d 0a 7d 20 7b 68 65 6c 6c 6f 20 7b  ;.  }.} {hello {
fee0: 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 69  } {}}.do_test wi
fef0: 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 67 65 6e  thout_rowid3-gen
ff00: 66 6b 65 79 2e 33 2e 36 20 7b 0a 20 20 65 78 65  fkey.3.6 {.  exe
ff10: 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
ff20: 45 20 74 33 20 53 45 54 20 68 20 3d 20 32 2c 20  E t3 SET h = 2, 
ff30: 69 20 3d 20 32 3b 0a 20 20 20 20 44 45 4c 45 54  i = 2;.    DELET
ff40: 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53  E FROM t1;.    S
ff50: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
ff60: 0a 20 20 7d 0a 7d 20 7b 68 65 6c 6c 6f 20 7b 7d  .  }.} {hello {}
ff70: 20 7b 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}}..#---------
ff80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ff90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ffa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ffb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ffc0: 0a 23 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .# Verify that t
ffd0: 69 63 6b 65 74 20 64 64 30 38 65 35 61 39 38 38  icket dd08e5a988
ffe0: 64 30 30 64 65 63 63 34 61 35 34 33 64 61 61 38  d00decc4a543daa8
fff0: 64 62 62 66 61 62 39 63 35 37 37 61 64 38 20 68  dbbfab9c577ad8 h
10000 61 73 20 62 65 65 6e 0a 23 20 66 69 78 65 64 2e  as been.# fixed.
10010 0a 23 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  .#.do_test witho
10020 75 74 5f 72 6f 77 69 64 33 2d 64 64 30 38 65 35  ut_rowid3-dd08e5
10030 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.1 {.  execsql
10040 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 66 6f   {.    PRAGMA fo
10050 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 4e 3b 0a 20  reign_keys=ON;. 
10060 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
10070 74 64 64 30 38 28 61 20 49 4e 54 45 47 45 52 20  tdd08(a INTEGER 
10080 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 20  PRIMARY KEY, b) 
10090 57 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a 20  WITHOUT rowid;. 
100a0 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45     CREATE UNIQUE
100b0 20 49 4e 44 45 58 20 69 64 64 30 38 20 4f 4e 20   INDEX idd08 ON 
100c0 74 64 64 30 38 28 61 2c 62 29 3b 0a 20 20 20 20  tdd08(a,b);.    
100d0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 64 64 30  INSERT INTO tdd0
100e0 38 20 56 41 4c 55 45 53 28 32 30 30 2c 33 30 30  8 VALUES(200,300
100f0 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
10100 41 42 4c 45 20 74 64 64 30 38 5f 62 28 77 2c 78  ABLE tdd08_b(w,x
10110 2c 79 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28  ,y, FOREIGN KEY(
10120 78 2c 79 29 20 52 45 46 45 52 45 4e 43 45 53 20  x,y) REFERENCES 
10130 74 64 64 30 38 28 61 2c 62 29 29 3b 0a 20 20 20  tdd08(a,b));.   
10140 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 64 64   INSERT INTO tdd
10150 30 38 5f 62 20 56 41 4c 55 45 53 28 31 30 30 2c  08_b VALUES(100,
10160 32 30 30 2c 33 30 30 29 3b 0a 20 20 7d 0a 7d 20  200,300);.  }.} 
10170 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  {}.do_test witho
10180 75 74 5f 72 6f 77 69 64 33 2d 64 64 30 38 65 35  ut_rowid3-dd08e5
10190 2e 31 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  .1.2 {.  catchsq
101a0 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
101b0 52 4f 4d 20 74 64 64 30 38 3b 0a 20 20 7d 0a 7d  ROM tdd08;.  }.}
101c0 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59   {1 {FOREIGN KEY
101d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
101e0 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74  ed}}.do_test wit
101f0 68 6f 75 74 5f 72 6f 77 69 64 33 2d 64 64 30 38  hout_rowid3-dd08
10200 65 35 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73  e5.1.3 {.  execs
10210 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
10220 2a 20 46 52 4f 4d 20 74 64 64 30 38 3b 0a 20 20  * FROM tdd08;.  
10230 7d 0a 7d 20 7b 32 30 30 20 33 30 30 7d 0a 64 6f  }.} {200 300}.do
10240 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
10250 77 69 64 33 2d 64 64 30 38 65 35 2e 31 2e 34 20  wid3-dd08e5.1.4 
10260 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
10270 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10280 64 64 30 38 5f 62 20 56 41 4c 55 45 53 28 34 30  dd08_b VALUES(40
10290 30 2c 35 30 30 2c 33 30 30 29 3b 0a 20 20 7d 0a  0,500,300);.  }.
102a0 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
102b0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
102c0 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 69  led}}.do_test wi
102d0 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 64 64 30  thout_rowid3-dd0
102e0 38 65 35 2e 31 2e 35 20 7b 0a 20 20 63 61 74 63  8e5.1.5 {.  catc
102f0 68 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  hsql {.    UPDAT
10300 45 20 74 64 64 30 38 5f 62 20 53 45 54 20 78 3d  E tdd08_b SET x=
10310 78 2b 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 46  x+1;.  }.} {1 {F
10320 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
10330 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
10340 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
10350 6f 77 69 64 33 2d 64 64 30 38 65 35 2e 31 2e 36  owid3-dd08e5.1.6
10360 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
10370 20 20 20 20 55 50 44 41 54 45 20 74 64 64 30 38      UPDATE tdd08
10380 20 53 45 54 20 61 3d 61 2b 31 3b 0a 20 20 7d 0a   SET a=a+1;.  }.
10390 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
103a0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
103b0 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  led}}..#--------
103c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
103d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
103e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
103f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10400 2d 0a 23 20 56 65 72 69 66 79 20 74 68 61 74 20  -.# Verify that 
10410 74 69 63 6b 65 74 20 63 65 37 63 31 33 33 65 61  ticket ce7c133ea
10420 36 63 63 39 63 63 64 63 31 61 36 30 64 38 30 34  6cc9ccdc1a60d804
10430 34 31 66 38 30 62 36 31 38 30 66 35 65 62 61 0a  41f80b6180f5eba.
10440 23 20 66 69 78 65 64 2e 0a 23 0a 64 6f 5f 74 65  # fixed..#.do_te
10450 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
10460 33 2d 63 65 37 63 31 33 2e 31 2e 31 20 7b 0a 20  3-ce7c13.1.1 {. 
10470 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
10480 52 45 41 54 45 20 54 41 42 4c 45 20 74 63 65 37  REATE TABLE tce7
10490 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d  1(a INTEGER PRIM
104a0 41 52 59 20 4b 45 59 2c 20 62 29 20 57 49 54 48  ARY KEY, b) WITH
104b0 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20 20 20 43  OUT rowid;.    C
104c0 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
104d0 45 58 20 69 63 65 37 31 20 4f 4e 20 74 63 65 37  EX ice71 ON tce7
104e0 31 28 61 2c 62 29 3b 0a 20 20 20 20 49 4e 53 45  1(a,b);.    INSE
104f0 52 54 20 49 4e 54 4f 20 74 63 65 37 31 20 56 41  RT INTO tce71 VA
10500 4c 55 45 53 28 31 30 30 2c 32 30 30 29 3b 0a 20  LUES(100,200);. 
10510 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
10520 74 63 65 37 32 28 77 2c 20 78 2c 20 79 2c 20 46  tce72(w, x, y, F
10530 4f 52 45 49 47 4e 20 4b 45 59 28 78 2c 79 29 20  OREIGN KEY(x,y) 
10540 52 45 46 45 52 45 4e 43 45 53 20 74 63 65 37 31  REFERENCES tce71
10550 28 61 2c 62 29 29 3b 0a 20 20 20 20 49 4e 53 45  (a,b));.    INSE
10560 52 54 20 49 4e 54 4f 20 74 63 65 37 32 20 56 41  RT INTO tce72 VA
10570 4c 55 45 53 28 33 30 30 2c 31 30 30 2c 32 30 30  LUES(300,100,200
10580 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 63  );.    UPDATE tc
10590 65 37 31 20 73 65 74 20 62 20 3d 20 32 30 30 20  e71 set b = 200 
105a0 77 68 65 72 65 20 61 20 3d 20 31 30 30 3b 0a 20  where a = 100;. 
105b0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
105c0 20 74 63 65 37 31 2c 20 74 63 65 37 32 3b 0a 20   tce71, tce72;. 
105d0 20 7d 0a 7d 20 7b 31 30 30 20 32 30 30 20 33 30   }.} {100 200 30
105e0 30 20 31 30 30 20 32 30 30 7d 0a 64 6f 5f 74 65  0 100 200}.do_te
105f0 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
10600 33 2d 63 65 37 63 31 33 2e 31 2e 32 20 7b 0a 20  3-ce7c13.1.2 {. 
10610 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
10620 55 50 44 41 54 45 20 74 63 65 37 31 20 73 65 74  UPDATE tce71 set
10630 20 62 20 3d 20 32 30 31 20 77 68 65 72 65 20 61   b = 201 where a
10640 20 3d 20 31 30 30 3b 0a 20 20 7d 0a 7d 20 7b 31   = 100;.  }.} {1
10650 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
10660 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
10670 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75  }.do_test withou
10680 74 5f 72 6f 77 69 64 33 2d 63 65 37 63 31 33 2e  t_rowid3-ce7c13.
10690 31 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.3 {.  catchsql
106a0 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74 63   {.    UPDATE tc
106b0 65 37 31 20 73 65 74 20 61 20 3d 20 31 30 31 20  e71 set a = 101 
106c0 77 68 65 72 65 20 61 20 3d 20 31 30 30 3b 0a 20  where a = 100;. 
106d0 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e   }.} {1 {FOREIGN
106e0 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
106f0 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
10700 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
10710 63 65 37 63 31 33 2e 31 2e 34 20 7b 0a 20 20 65  ce7c13.1.4 {.  e
10720 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
10730 41 54 45 20 54 41 42 4c 45 20 74 63 65 37 33 28  ATE TABLE tce73(
10740 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
10750 59 20 4b 45 59 2c 20 62 2c 20 55 4e 49 51 55 45  Y KEY, b, UNIQUE
10760 28 61 2c 62 29 29 20 57 49 54 48 4f 55 54 20 72  (a,b)) WITHOUT r
10770 6f 77 69 64 3b 0a 20 20 20 20 49 4e 53 45 52 54  owid;.    INSERT
10780 20 49 4e 54 4f 20 74 63 65 37 33 20 56 41 4c 55   INTO tce73 VALU
10790 45 53 28 31 30 30 2c 32 30 30 29 3b 0a 20 20 20  ES(100,200);.   
107a0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 63   CREATE TABLE tc
107b0 65 37 34 28 77 2c 20 78 2c 20 79 2c 20 46 4f 52  e74(w, x, y, FOR
107c0 45 49 47 4e 20 4b 45 59 28 78 2c 79 29 20 52 45  EIGN KEY(x,y) RE
107d0 46 45 52 45 4e 43 45 53 20 74 63 65 37 33 28 61  FERENCES tce73(a
107e0 2c 62 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ,b));.    INSERT
107f0 20 49 4e 54 4f 20 74 63 65 37 34 20 56 41 4c 55   INTO tce74 VALU
10800 45 53 28 33 30 30 2c 31 30 30 2c 32 30 30 29 3b  ES(300,100,200);
10810 0a 20 20 20 20 55 50 44 41 54 45 20 74 63 65 37  .    UPDATE tce7
10820 33 20 73 65 74 20 62 20 3d 20 32 30 30 20 77 68  3 set b = 200 wh
10830 65 72 65 20 61 20 3d 20 31 30 30 3b 0a 20 20 20  ere a = 100;.   
10840 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
10850 63 65 37 33 2c 20 74 63 65 37 34 3b 0a 20 20 7d  ce73, tce74;.  }
10860 0a 7d 20 7b 31 30 30 20 32 30 30 20 33 30 30 20  .} {100 200 300 
10870 31 30 30 20 32 30 30 7d 0a 64 6f 5f 74 65 73 74  100 200}.do_test
10880 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d   without_rowid3-
10890 63 65 37 63 31 33 2e 31 2e 35 20 7b 0a 20 20 63  ce7c13.1.5 {.  c
108a0 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 55 50  atchsql {.    UP
108b0 44 41 54 45 20 74 63 65 37 33 20 73 65 74 20 62  DATE tce73 set b
108c0 20 3d 20 32 30 31 20 77 68 65 72 65 20 61 20 3d   = 201 where a =
108d0 20 31 30 30 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b   100;.  }.} {1 {
108e0 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
108f0 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
10900 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
10910 72 6f 77 69 64 33 2d 63 65 37 63 31 33 2e 31 2e  rowid3-ce7c13.1.
10920 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  6 {.  catchsql {
10930 0a 20 20 20 20 55 50 44 41 54 45 20 74 63 65 37  .    UPDATE tce7
10940 33 20 73 65 74 20 61 20 3d 20 31 30 31 20 77 68  3 set a = 101 wh
10950 65 72 65 20 61 20 3d 20 31 30 30 3b 0a 20 20 7d  ere a = 100;.  }
10960 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b  .} {1 {FOREIGN K
10970 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
10980 69 6c 65 64 7d 7d 0a 0a 23 20 43 6f 6e 66 69 72  iled}}..# Confir
10990 6d 20 74 68 61 74 20 63 68 61 6e 67 65 73 28 29  m that changes()
109a0 20 77 6f 72 6b 73 20 6f 6e 20 57 49 54 48 4f 55   works on WITHOU
109b0 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 74  T ROWID tables t
109c0 68 61 74 20 75 73 65 20 74 68 65 0a 23 20 78 66  hat use the.# xf
109d0 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  er optimization.
109e0 0a 23 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69  .#.db close.sqli
109f0 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a  te3 db :memory:.
10a00 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
10a10 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 33 2d 33  without_rowid3-3
10a20 30 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54  0.1 {.  CREATE T
10a30 41 42 4c 45 20 74 31 28 61 2c 62 2c 50 52 49 4d  ABLE t1(a,b,PRIM
10a40 41 52 59 20 4b 45 59 28 61 2c 62 29 29 20 57 49  ARY KEY(a,b)) WI
10a50 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 20 20 43  THOUT ROWID;.  C
10a60 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
10a70 2c 62 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 61  ,b,PRIMARY KEY(a
10a80 2c 62 29 29 20 57 49 54 48 4f 55 54 20 52 4f 57  ,b)) WITHOUT ROW
10a90 49 44 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ID;.  INSERT INT
10aa0 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32 29  O t1 VALUES(1,2)
10ab0 2c 28 33 2c 34 29 2c 28 35 2c 36 29 3b 0a 20 20  ,(3,4),(5,6);.  
10ac0 53 45 4c 45 43 54 20 63 68 61 6e 67 65 73 28 29  SELECT changes()
10ad0 3b 0a 7d 20 7b 33 7d 0a 64 6f 5f 65 78 65 63 73  ;.} {3}.do_execs
10ae0 71 6c 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  ql_test without_
10af0 72 6f 77 69 64 33 2d 33 30 2e 32 20 7b 0a 20 20  rowid3-30.2 {.  
10b00 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53  INSERT INTO t2 S
10b10 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
10b20 0a 20 20 53 45 4c 45 43 54 20 63 68 61 6e 67 65  .  SELECT change
10b30 73 28 29 3b 0a 7d 20 7b 33 7d 0a 0a 66 69 6e 69  s();.} {3}..fini
10b40 73 68 5f 74 65 73 74 0a                          sh_test.