/ Hex Artifact Content
Login

Artifact 4e08bcbaee0399f35d58b5581881e7a6243d458a:


0000: 23 20 32 30 31 33 2d 31 31 2d 30 34 0a 23 0a 23  # 2013-11-04.#.#
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 0a 23 20 52 65 67 72 65 73 73 69 6f  **.#.# Regressio
0170: 6e 20 74 65 73 74 69 6e 67 20 6f 66 20 46 4f 52  n testing of FOR
0180: 20 45 41 43 48 20 52 4f 57 20 74 61 62 6c 65 20   EACH ROW table 
0190: 74 72 69 67 67 65 72 73 20 6f 6e 20 57 49 54 48  triggers on WITH
01a0: 4f 55 54 20 52 4f 57 49 44 0a 23 20 74 61 62 6c  OUT ROWID.# tabl
01b0: 65 73 2e 0a 23 0a 23 20 31 2e 20 54 72 69 67 67  es..#.# 1. Trigg
01c0: 65 72 20 65 78 65 63 75 74 69 6f 6e 20 6f 72 64  er execution ord
01d0: 65 72 20 74 65 73 74 73 2e 20 0a 23 20 54 68 65  er tests. .# The
01e0: 73 65 20 74 65 73 74 73 20 65 6e 73 75 72 65 20  se tests ensure 
01f0: 74 68 61 74 20 42 45 46 4f 52 45 20 61 6e 64 20  that BEFORE and 
0200: 41 46 54 45 52 20 74 72 69 67 67 65 72 73 20 61  AFTER triggers a
0210: 72 65 20 66 69 72 65 64 20 61 74 20 74 68 65 20  re fired at the 
0220: 63 6f 72 72 65 63 74 0a 23 20 74 69 6d 65 73 20  correct.# times 
0230: 72 65 6c 61 74 69 76 65 20 74 6f 20 65 61 63 68  relative to each
0240: 20 6f 74 68 65 72 20 61 6e 64 20 74 68 65 20 74   other and the t
0250: 72 69 67 67 65 72 69 6e 67 20 73 74 61 74 65 6d  riggering statem
0260: 65 6e 74 2e 20 0a 23 0a 23 20 77 69 74 68 6f 75  ent. .#.# withou
0270: 74 5f 72 6f 77 69 64 34 2d 31 2e 31 2e 2a 3a 20  t_rowid4-1.1.*: 
0280: 4f 4e 20 55 50 44 41 54 45 20 74 72 69 67 67 65  ON UPDATE trigge
0290: 72 20 65 78 65 63 75 74 69 6f 6e 20 6d 6f 64 65  r execution mode
02a0: 6c 2e 0a 23 20 77 69 74 68 6f 75 74 5f 72 6f 77  l..# without_row
02b0: 69 64 34 2d 31 2e 32 2e 2a 3a 20 44 45 4c 45 54  id4-1.2.*: DELET
02c0: 45 20 74 72 69 67 67 65 72 20 65 78 65 63 75 74  E trigger execut
02d0: 69 6f 6e 20 6d 6f 64 65 6c 2e 0a 23 20 77 69 74  ion model..# wit
02e0: 68 6f 75 74 5f 72 6f 77 69 64 34 2d 31 2e 33 2e  hout_rowid4-1.3.
02f0: 2a 3a 20 49 4e 53 45 52 54 20 74 72 69 67 67 65  *: INSERT trigge
0300: 72 20 65 78 65 63 75 74 69 6f 6e 20 6d 6f 64 65  r execution mode
0310: 6c 2e 0a 23 0a 23 20 32 2e 20 54 72 69 67 67 65  l..#.# 2. Trigge
0320: 72 20 70 72 6f 67 72 61 6d 20 65 78 65 63 75 74  r program execut
0330: 69 6f 6e 20 74 65 73 74 73 2e 0a 23 20 54 68 65  ion tests..# The
0340: 73 65 20 74 65 73 74 73 20 65 6e 73 75 72 65 20  se tests ensure 
0350: 74 68 61 74 20 74 72 69 67 67 65 72 20 70 72 6f  that trigger pro
0360: 67 72 61 6d 73 20 65 78 65 63 75 74 65 20 63 6f  grams execute co
0370: 72 72 65 63 74 6c 79 20 28 69 65 2e 20 74 68 61  rrectly (ie. tha
0380: 74 20 61 0a 23 20 74 72 69 67 67 65 72 20 70 72  t a.# trigger pr
0390: 6f 67 72 61 6d 20 63 61 6e 20 63 6f 72 72 65 63  ogram can correc
03a0: 74 6c 79 20 65 78 65 63 75 74 65 20 49 4e 53 45  tly execute INSE
03b0: 52 54 2c 20 55 50 44 41 54 45 2c 20 44 45 4c 45  RT, UPDATE, DELE
03c0: 54 45 20 2a 20 53 45 4c 45 43 54 0a 23 20 73 74  TE * SELECT.# st
03d0: 61 74 65 6d 65 6e 74 73 2c 20 61 6e 64 20 63 6f  atements, and co
03e0: 6d 62 69 6e 61 74 69 6f 6e 73 20 74 68 65 72 65  mbinations there
03f0: 6f 66 29 2e 0a 23 0a 23 20 33 2e 20 53 65 6c 65  of)..#.# 3. Sele
0400: 63 74 69 76 65 20 74 72 69 67 67 65 72 20 65 78  ctive trigger ex
0410: 65 63 75 74 69 6f 6e 20 0a 23 20 54 68 69 73 20  ecution .# This 
0420: 74 65 73 74 73 20 74 68 61 74 20 63 6f 6e 64 69  tests that condi
0430: 74 69 6f 6e 61 6c 20 74 72 69 67 67 65 72 73 20  tional triggers 
0440: 28 69 65 2e 20 55 50 44 41 54 45 20 4f 46 20 74  (ie. UPDATE OF t
0450: 72 69 67 67 65 72 73 20 61 6e 64 20 74 72 69 67  riggers and trig
0460: 67 65 72 73 0a 23 20 77 69 74 68 20 57 48 45 4e  gers.# with WHEN
0470: 20 63 6c 61 75 73 65 73 29 20 61 72 65 20 66 69   clauses) are fi
0480: 72 65 64 20 6f 6e 6c 79 20 66 69 72 65 64 20 77  red only fired w
0490: 68 65 6e 20 74 68 65 79 20 61 72 65 20 73 75 70  hen they are sup
04a0: 70 6f 73 65 64 20 74 6f 20 62 65 2e 0a 23 0a 23  posed to be..#.#
04b0: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 34 2d   without_rowid4-
04c0: 33 2e 31 3a 20 55 50 44 41 54 45 20 4f 46 20 74  3.1: UPDATE OF t
04d0: 72 69 67 67 65 72 73 0a 23 20 77 69 74 68 6f 75  riggers.# withou
04e0: 74 5f 72 6f 77 69 64 34 2d 33 2e 32 3a 20 57 48  t_rowid4-3.2: WH
04f0: 45 4e 20 63 6c 61 75 73 65 0a 23 0a 23 20 34 2e  EN clause.#.# 4.
0500: 20 43 61 73 63 61 64 65 64 20 74 72 69 67 67 65   Cascaded trigge
0510: 72 20 65 78 65 63 75 74 69 6f 6e 20 0a 23 20 54  r execution .# T
0520: 65 73 74 73 20 74 68 61 74 20 74 72 69 67 67 65  ests that trigge
0530: 72 2d 70 72 6f 67 72 61 6d 73 20 6d 61 79 20 63  r-programs may c
0540: 61 75 73 65 20 6f 74 68 65 72 20 74 72 69 67 67  ause other trigg
0550: 65 72 73 20 74 6f 20 66 69 72 65 2e 20 41 6c 73  ers to fire. Als
0560: 6f 20 74 68 61 74 20 61 20 0a 23 20 74 72 69 67  o that a .# trig
0570: 67 65 72 2d 70 72 6f 67 72 61 6d 20 69 73 20 6e  ger-program is n
0580: 65 76 65 72 20 65 78 65 63 75 74 65 64 20 72 65  ever executed re
0590: 63 75 72 73 69 76 65 6c 79 2e 0a 23 20 0a 23 20  cursively..# .# 
05a0: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 34 2d 34  without_rowid4-4
05b0: 2e 31 3a 20 54 72 69 76 69 61 6c 20 63 61 73 63  .1: Trivial casc
05c0: 61 64 69 6e 67 20 74 72 69 67 67 65 72 0a 23 20  ading trigger.# 
05d0: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 34 2d 34  without_rowid4-4
05e0: 2e 32 3a 20 54 72 69 76 69 61 6c 20 72 65 63 75  .2: Trivial recu
05f0: 72 73 69 76 65 20 74 72 69 67 67 65 72 20 68 61  rsive trigger ha
0600: 6e 64 6c 69 6e 67 20 0a 23 0a 23 20 35 2e 20 43  ndling .#.# 5. C
0610: 6f 75 6e 74 20 63 68 61 6e 67 65 73 20 62 65 68  ount changes beh
0620: 61 76 69 6f 75 72 2e 0a 23 20 56 65 72 69 66 79  aviour..# Verify
0630: 20 74 68 61 74 20 72 6f 77 73 20 61 6c 74 65 72   that rows alter
0640: 65 64 20 62 79 20 74 72 69 67 67 65 72 73 20 61  ed by triggers a
0650: 72 65 20 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20  re not included 
0660: 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  in the return va
0670: 6c 75 65 0a 23 20 6f 66 20 74 68 65 20 22 63 6f  lue.# of the "co
0680: 75 6e 74 20 63 68 61 6e 67 65 73 22 20 69 6e 74  unt changes" int
0690: 65 72 66 61 63 65 2e 0a 23 0a 23 20 36 2e 20 4f  erface..#.# 6. O
06a0: 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
06b0: 65 20 68 61 6e 64 6c 69 6e 67 0a 23 20 77 69 74  e handling.# wit
06c0: 68 6f 75 74 5f 72 6f 77 69 64 34 2d 36 2e 31 5b  hout_rowid4-6.1[
06d0: 61 2d 66 5d 3a 20 49 4e 53 45 52 54 20 73 74 61  a-f]: INSERT sta
06e0: 74 65 6d 65 6e 74 73 0a 23 20 77 69 74 68 6f 75  tements.# withou
06f0: 74 5f 72 6f 77 69 64 34 2d 36 2e 32 5b 61 2d 66  t_rowid4-6.2[a-f
0700: 5d 3a 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  ]: UPDATE statem
0710: 65 6e 74 73 0a 23 0a 23 20 37 2e 20 26 20 38 2e  ents.#.# 7. & 8.
0720: 20 54 72 69 67 67 65 72 73 20 6f 6e 20 76 69 65   Triggers on vie
0730: 77 73 20 66 69 72 65 20 63 6f 72 72 65 63 74 6c  ws fire correctl
0740: 79 2e 0a 23 0a 0a 73 65 74 20 74 65 73 74 64 69  y..#..set testdi
0750: 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  r [file dirname 
0760: 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24  $argv0].source $
0770: 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74  testdir/tester.t
0780: 63 6c 0a 69 66 63 61 70 61 62 6c 65 20 7b 21 74  cl.ifcapable {!t
0790: 72 69 67 67 65 72 7d 20 7b 0a 20 20 66 69 6e 69  rigger} {.  fini
07a0: 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e  sh_test.  return
07b0: 0a 7d 0a 0a 23 20 54 68 65 20 74 65 73 74 73 20  .}..# The tests 
07c0: 69 6e 20 74 68 69 73 20 66 69 6c 65 20 77 65 72  in this file wer
07d0: 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65  e written before
07e0: 20 53 51 4c 69 74 65 20 73 75 70 70 6f 72 74 65   SQLite supporte
07f0: 64 20 72 65 63 75 72 73 69 76 65 0a 23 20 74 72  d recursive.# tr
0800: 69 67 67 65 72 20 69 6e 76 6f 63 61 74 69 6f 6e  igger invocation
0810: 2c 20 61 6e 64 20 73 6f 6d 65 20 74 65 73 74 73  , and some tests
0820: 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 61 74 20   depend on that 
0830: 74 6f 20 70 61 73 73 2e 20 53 6f 20 64 69 73 61  to pass. So disa
0840: 62 6c 65 0a 23 20 72 65 63 75 72 73 69 76 65 20  ble.# recursive 
0850: 74 72 69 67 67 65 72 73 20 66 6f 72 20 74 68 69  triggers for thi
0860: 73 20 66 69 6c 65 2e 0a 63 61 74 63 68 73 71 6c  s file..catchsql
0870: 20 7b 20 70 72 61 67 6d 61 20 72 65 63 75 72 73   { pragma recurs
0880: 69 76 65 5f 74 72 69 67 67 65 72 73 20 3d 20 6f  ive_triggers = o
0890: 66 66 20 7d 20 0a 0a 23 20 31 2e 0a 69 66 63 61  ff } ..# 1..ifca
08a0: 70 61 62 6c 65 20 73 75 62 71 75 65 72 79 20 7b  pable subquery {
08b0: 0a 20 20 73 65 74 20 69 69 20 30 0a 20 20 73 65  .  set ii 0.  se
08c0: 74 20 74 62 6c 5f 64 65 66 69 6e 69 74 69 6f 6e  t tbl_definition
08d0: 73 20 5b 6c 69 73 74 20 5c 0a 20 20 09 7b 43 52  s [list \.  .{CR
08e0: 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c 20 28  EATE TABLE tbl (
08f0: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
0900: 59 20 4b 45 59 2c 20 62 29 20 57 49 54 48 4f 55  Y KEY, b) WITHOU
0910: 54 20 72 6f 77 69 64 3b 7d 20 20 20 20 5c 0a 20  T rowid;}    \. 
0920: 20 20 20 20 20 20 20 7b 43 52 45 41 54 45 20 54         {CREATE T
0930: 41 42 4c 45 20 74 62 6c 20 28 61 2c 20 62 20 50  ABLE tbl (a, b P
0940: 52 49 4d 41 52 59 20 4b 45 59 29 20 57 49 54 48  RIMARY KEY) WITH
0950: 4f 55 54 20 72 6f 77 69 64 3b 7d 20 20 20 20 20  OUT rowid;}     
0960: 20 20 20 20 20 20 20 5c 0a 20 20 09 7b 43 52 45         \.  .{CRE
0970: 41 54 45 20 54 41 42 4c 45 20 74 62 6c 20 28 61  ATE TABLE tbl (a
0980: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
0990: 20 57 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a   WITHOUT rowid;.
09a0: 20 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20           CREATE 
09b0: 49 4e 44 45 58 20 74 62 6c 5f 69 64 78 20 4f 4e  INDEX tbl_idx ON
09c0: 20 74 62 6c 28 62 29 3b 7d 20 20 20 20 20 20 5c   tbl(b);}      \
09d0: 0a 20 20 5d 0a 20 20 69 66 63 61 70 61 62 6c 65  .  ].  ifcapable
09e0: 20 74 65 6d 70 64 62 20 7b 0a 20 20 20 20 6c 61   tempdb {.    la
09f0: 70 70 65 6e 64 20 74 62 6c 5f 64 65 66 69 6e 69  ppend tbl_defini
0a00: 74 69 6f 6e 73 20 5c 0a 20 20 20 20 20 20 20 20  tions \.        
0a10: 7b 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  {CREATE TEMP TAB
0a20: 4c 45 20 74 62 6c 20 28 61 20 50 52 49 4d 41 52  LE tbl (a PRIMAR
0a30: 59 20 4b 45 59 2c 20 62 29 20 57 49 54 48 4f 55  Y KEY, b) WITHOU
0a40: 54 20 72 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  T rowid;.       
0a50: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74    CREATE INDEX t
0a60: 62 6c 5f 69 64 78 20 4f 4e 20 74 62 6c 28 62 29  bl_idx ON tbl(b)
0a70: 3b 7d 20 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  ;} .    lappend 
0a80: 74 62 6c 5f 64 65 66 69 6e 69 74 69 6f 6e 73 20  tbl_definitions 
0a90: 5c 0a 20 20 20 20 20 20 20 20 7b 43 52 45 41 54  \.        {CREAT
0aa0: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 74 62 6c  E TEMP TABLE tbl
0ab0: 20 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c   (a PRIMARY KEY,
0ac0: 20 62 29 20 57 49 54 48 4f 55 54 20 72 6f 77 69   b) WITHOUT rowi
0ad0: 64 7d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 74  d}.    lappend t
0ae0: 62 6c 5f 64 65 66 69 6e 69 74 69 6f 6e 73 20 5c  bl_definitions \
0af0: 0a 20 20 20 20 20 20 20 20 7b 43 52 45 41 54 45  .        {CREATE
0b00: 20 54 45 4d 50 4f 52 41 52 59 20 54 41 42 4c 45   TEMPORARY TABLE
0b10: 20 74 62 6c 20 28 61 20 49 4e 54 45 47 45 52 20   tbl (a INTEGER 
0b20: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 20  PRIMARY KEY, b) 
0b30: 57 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 7d 0a  WITHOUT rowid;}.
0b40: 20 20 7d 0a 20 20 66 6f 72 65 61 63 68 20 74 62    }.  foreach tb
0b50: 6c 5f 64 65 66 6e 20 24 74 62 6c 5f 64 65 66 69  l_defn $tbl_defi
0b60: 6e 69 74 69 6f 6e 73 20 7b 0a 20 20 20 20 69 6e  nitions {.    in
0b70: 63 72 20 69 69 0a 20 20 20 20 63 61 74 63 68 73  cr ii.    catchs
0b80: 71 6c 20 7b 20 44 52 4f 50 20 49 4e 44 45 58 20  ql { DROP INDEX 
0b90: 74 62 6c 5f 69 64 78 3b 20 7d 0a 20 20 20 20 63  tbl_idx; }.    c
0ba0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20  atchsql {.      
0bb0: 44 52 4f 50 20 54 41 42 4c 45 20 72 6c 6f 67 3b  DROP TABLE rlog;
0bc0: 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c  .      DROP TABL
0bd0: 45 20 63 6c 6f 67 3b 0a 20 20 20 20 20 20 44 52  E clog;.      DR
0be0: 4f 50 20 54 41 42 4c 45 20 74 62 6c 3b 0a 20 20  OP TABLE tbl;.  
0bf0: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 6f      DROP TABLE o
0c00: 74 68 65 72 5f 74 62 6c 3b 0a 20 20 20 20 7d 0a  ther_tbl;.    }.
0c10: 20 20 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24    .    execsql $
0c20: 74 62 6c 5f 64 65 66 6e 0a 20 20 0a 20 20 20 20  tbl_defn.  .    
0c30: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
0c40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
0c50: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
0c60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0c70: 74 62 6c 20 56 41 4c 55 45 53 28 33 2c 20 34 29  tbl VALUES(3, 4)
0c80: 3b 0a 20 20 0a 20 20 20 20 20 20 43 52 45 41 54  ;.  .      CREAT
0c90: 45 20 54 41 42 4c 45 20 72 6c 6f 67 20 28 69 64  E TABLE rlog (id
0ca0: 78 2c 20 6f 6c 64 5f 61 2c 20 6f 6c 64 5f 62 2c  x, old_a, old_b,
0cb0: 20 64 62 5f 73 75 6d 5f 61 2c 20 64 62 5f 73 75   db_sum_a, db_su
0cc0: 6d 5f 62 2c 20 6e 65 77 5f 61 2c 20 6e 65 77 5f  m_b, new_a, new_
0cd0: 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  b);.      CREATE
0ce0: 20 54 41 42 4c 45 20 63 6c 6f 67 20 28 69 64 78   TABLE clog (idx
0cf0: 2c 20 6f 6c 64 5f 61 2c 20 6f 6c 64 5f 62 2c 20  , old_a, old_b, 
0d00: 64 62 5f 73 75 6d 5f 61 2c 20 64 62 5f 73 75 6d  db_sum_a, db_sum
0d10: 5f 62 2c 20 6e 65 77 5f 61 2c 20 6e 65 77 5f 62  _b, new_a, new_b
0d20: 29 3b 0a 20 20 0a 20 20 20 20 20 20 43 52 45 41  );.  .      CREA
0d30: 54 45 20 54 52 49 47 47 45 52 20 62 65 66 6f 72  TE TRIGGER befor
0d40: 65 5f 75 70 64 61 74 65 5f 72 6f 77 20 42 45 46  e_update_row BEF
0d50: 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20 74 62  ORE UPDATE ON tb
0d60: 6c 20 46 4f 52 20 45 41 43 48 20 52 4f 57 20 0a  l FOR EACH ROW .
0d70: 20 20 20 20 20 20 20 20 42 45 47 49 4e 0a 20 20          BEGIN.  
0d80: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0d90: 4f 20 72 6c 6f 67 20 56 41 4c 55 45 53 20 28 20  O rlog VALUES ( 
0da0: 28 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65  (SELECT coalesce
0db0: 28 6d 61 78 28 69 64 78 29 2c 30 29 20 2b 20 31  (max(idx),0) + 1
0dc0: 20 46 52 4f 4d 20 72 6c 6f 67 29 2c 20 0a 20 20   FROM rlog), .  
0dd0: 09 20 20 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c  .  old.a, old.b,
0de0: 20 0a 20 20 09 20 20 28 53 45 4c 45 43 54 20 63   .  .  (SELECT c
0df0: 6f 61 6c 65 73 63 65 28 73 75 6d 28 61 29 2c 30  oalesce(sum(a),0
0e00: 29 20 46 52 4f 4d 20 74 62 6c 29 2c 0a 20 20 20  ) FROM tbl),.   
0e10: 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 63         (SELECT c
0e20: 6f 61 6c 65 73 63 65 28 73 75 6d 28 62 29 2c 30  oalesce(sum(b),0
0e30: 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20 0a 20 20  ) FROM tbl), .  
0e40: 09 20 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29  .  new.a, new.b)
0e50: 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 0a  ;.      END;.  .
0e60: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49        CREATE TRI
0e70: 47 47 45 52 20 61 66 74 65 72 5f 75 70 64 61 74  GGER after_updat
0e80: 65 5f 72 6f 77 20 41 46 54 45 52 20 55 50 44 41  e_row AFTER UPDA
0e90: 54 45 20 4f 4e 20 74 62 6c 20 46 4f 52 20 45 41  TE ON tbl FOR EA
0ea0: 43 48 20 52 4f 57 20 0a 20 20 20 20 20 20 20 20  CH ROW .        
0eb0: 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e  BEGIN.        IN
0ec0: 53 45 52 54 20 49 4e 54 4f 20 72 6c 6f 67 20 56  SERT INTO rlog V
0ed0: 41 4c 55 45 53 20 28 20 28 53 45 4c 45 43 54 20  ALUES ( (SELECT 
0ee0: 63 6f 61 6c 65 73 63 65 28 6d 61 78 28 69 64 78  coalesce(max(idx
0ef0: 29 2c 30 29 20 2b 20 31 20 46 52 4f 4d 20 72 6c  ),0) + 1 FROM rl
0f00: 6f 67 29 2c 20 0a 20 20 09 20 20 6f 6c 64 2e 61  og), .  .  old.a
0f10: 2c 20 6f 6c 64 2e 62 2c 20 0a 20 20 09 20 20 28  , old.b, .  .  (
0f20: 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28  SELECT coalesce(
0f30: 73 75 6d 28 61 29 2c 30 29 20 46 52 4f 4d 20 74  sum(a),0) FROM t
0f40: 62 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28  bl),.          (
0f50: 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28  SELECT coalesce(
0f60: 73 75 6d 28 62 29 2c 30 29 20 46 52 4f 4d 20 74  sum(b),0) FROM t
0f70: 62 6c 29 2c 20 0a 20 20 09 20 20 6e 65 77 2e 61  bl), .  .  new.a
0f80: 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20 20 20 20  , new.b);.      
0f90: 45 4e 44 3b 0a 20 20 0a 20 20 20 20 20 20 43 52  END;.  .      CR
0fa0: 45 41 54 45 20 54 52 49 47 47 45 52 20 63 6f 6e  EATE TRIGGER con
0fb0: 64 69 74 69 6f 6e 61 6c 5f 75 70 64 61 74 65 5f  ditional_update_
0fc0: 72 6f 77 20 41 46 54 45 52 20 55 50 44 41 54 45  row AFTER UPDATE
0fd0: 20 4f 4e 20 74 62 6c 20 46 4f 52 20 45 41 43 48   ON tbl FOR EACH
0fe0: 20 52 4f 57 0a 20 20 20 20 20 20 20 20 57 48 45   ROW.        WHE
0ff0: 4e 20 6f 6c 64 2e 61 20 3d 20 31 0a 20 20 20 20  N old.a = 1.    
1000: 20 20 20 20 42 45 47 49 4e 0a 20 20 20 20 20 20      BEGIN.      
1010: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 6c    INSERT INTO cl
1020: 6f 67 20 56 41 4c 55 45 53 20 28 20 28 53 45 4c  og VALUES ( (SEL
1030: 45 43 54 20 63 6f 61 6c 65 73 63 65 28 6d 61 78  ECT coalesce(max
1040: 28 69 64 78 29 2c 30 29 20 2b 20 31 20 46 52 4f  (idx),0) + 1 FRO
1050: 4d 20 63 6c 6f 67 29 2c 20 0a 20 20 09 20 20 6f  M clog), .  .  o
1060: 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20 0a 20 20  ld.a, old.b, .  
1070: 09 20 20 28 53 45 4c 45 43 54 20 63 6f 61 6c 65  .  (SELECT coale
1080: 73 63 65 28 73 75 6d 28 61 29 2c 30 29 20 46 52  sce(sum(a),0) FR
1090: 4f 4d 20 74 62 6c 29 2c 0a 20 20 20 20 20 20 20  OM tbl),.       
10a0: 20 20 20 28 53 45 4c 45 43 54 20 63 6f 61 6c 65     (SELECT coale
10b0: 73 63 65 28 73 75 6d 28 62 29 2c 30 29 20 46 52  sce(sum(b),0) FR
10c0: 4f 4d 20 74 62 6c 29 2c 20 0a 20 20 09 20 20 6e  OM tbl), .  .  n
10d0: 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20 20  ew.a, new.b);.  
10e0: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 7d 0a 20      END;.    }. 
10f0: 20 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 69   .    do_test wi
1100: 74 68 6f 75 74 5f 72 6f 77 69 64 34 2d 31 2e 24  thout_rowid4-1.$
1110: 69 69 2e 31 20 7b 0a 20 20 20 20 20 20 73 65 74  ii.1 {.      set
1120: 20 72 20 7b 7d 0a 20 20 20 20 20 20 66 6f 72 65   r {}.      fore
1130: 61 63 68 20 76 20 5b 65 78 65 63 73 71 6c 20 7b  ach v [execsql {
1140: 20 0a 20 20 20 20 20 20 20 20 55 50 44 41 54 45   .        UPDATE
1150: 20 74 62 6c 20 53 45 54 20 61 20 3d 20 61 20 2a   tbl SET a = a *
1160: 20 31 30 2c 20 62 20 3d 20 62 20 2a 20 31 30 3b   10, b = b * 10;
1170: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
1180: 2a 20 46 52 4f 4d 20 72 6c 6f 67 20 4f 52 44 45  * FROM rlog ORDE
1190: 52 20 42 59 20 69 64 78 3b 0a 20 20 20 20 20 20  R BY idx;.      
11a0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
11b0: 63 6c 6f 67 20 4f 52 44 45 52 20 42 59 20 69 64  clog ORDER BY id
11c0: 78 3b 0a 20 20 20 20 20 20 7d 5d 20 7b 0a 20 20  x;.      }] {.  
11d0: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 20        lappend r 
11e0: 5b 65 78 70 72 20 7b 69 6e 74 28 24 76 29 7d 5d  [expr {int($v)}]
11f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1200: 65 74 20 72 0a 20 20 20 20 7d 20 5b 6c 69 73 74  et r.    } [list
1210: 20 31 20 31 20 32 20 20 34 20 20 36 20 31 30 20   1 1 2  4  6 10 
1220: 32 30 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  20 \.           
1230: 20 32 20 31 20 32 20 31 33 20 32 34 20 31 30 20   2 1 2 13 24 10 
1240: 32 30 20 5c 0a 20 20 09 20 20 20 20 33 20 33 20  20 \.  .    3 3 
1250: 34 20 31 33 20 32 34 20 33 30 20 34 30 20 5c 0a  4 13 24 30 40 \.
1260: 20 20 09 20 20 20 20 34 20 33 20 34 20 34 30 20    .    4 3 4 40 
1270: 36 30 20 33 30 20 34 30 20 5c 0a 20 20 20 20 20  60 30 40 \.     
1280: 20 20 20 20 20 20 20 31 20 31 20 32 20 31 33 20         1 1 2 13 
1290: 32 34 20 31 30 20 32 30 20 5d 0a 20 20 0a 20 20  24 10 20 ].  .  
12a0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
12b0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 72 6c    DELETE FROM rl
12c0: 6f 67 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  og;.      DELETE
12d0: 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20   FROM tbl;.     
12e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
12f0: 20 56 41 4c 55 45 53 20 28 31 30 30 2c 20 31 30   VALUES (100, 10
1300: 30 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  0);.      INSERT
1310: 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53   INTO tbl VALUES
1320: 20 28 33 30 30 2c 20 32 30 30 29 3b 0a 20 20 20   (300, 200);.   
1330: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
1340: 52 20 64 65 6c 65 74 65 5f 62 65 66 6f 72 65 5f  R delete_before_
1350: 72 6f 77 20 42 45 46 4f 52 45 20 44 45 4c 45 54  row BEFORE DELET
1360: 45 20 4f 4e 20 74 62 6c 20 46 4f 52 20 45 41 43  E ON tbl FOR EAC
1370: 48 20 52 4f 57 0a 20 20 20 20 20 20 20 20 42 45  H ROW.        BE
1380: 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e 53 45  GIN.        INSE
1390: 52 54 20 49 4e 54 4f 20 72 6c 6f 67 20 56 41 4c  RT INTO rlog VAL
13a0: 55 45 53 20 28 20 28 53 45 4c 45 43 54 20 63 6f  UES ( (SELECT co
13b0: 61 6c 65 73 63 65 28 6d 61 78 28 69 64 78 29 2c  alesce(max(idx),
13c0: 30 29 20 2b 20 31 20 46 52 4f 4d 20 72 6c 6f 67  0) + 1 FROM rlog
13d0: 29 2c 20 0a 20 20 09 20 20 6f 6c 64 2e 61 2c 20  ), .  .  old.a, 
13e0: 6f 6c 64 2e 62 2c 20 0a 20 20 09 20 20 28 53 45  old.b, .  .  (SE
13f0: 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28 73 75  LECT coalesce(su
1400: 6d 28 61 29 2c 30 29 20 46 52 4f 4d 20 74 62 6c  m(a),0) FROM tbl
1410: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 53 45  ),.          (SE
1420: 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28 73 75  LECT coalesce(su
1430: 6d 28 62 29 2c 30 29 20 46 52 4f 4d 20 74 62 6c  m(b),0) FROM tbl
1440: 29 2c 20 0a 20 20 09 20 20 30 2c 20 30 29 3b 0a  ), .  .  0, 0);.
1450: 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 0a 20 20        END;.  .  
1460: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
1470: 45 52 20 64 65 6c 65 74 65 5f 61 66 74 65 72 5f  ER delete_after_
1480: 72 6f 77 20 41 46 54 45 52 20 44 45 4c 45 54 45  row AFTER DELETE
1490: 20 4f 4e 20 74 62 6c 20 46 4f 52 20 45 41 43 48   ON tbl FOR EACH
14a0: 20 52 4f 57 0a 20 20 20 20 20 20 20 20 42 45 47   ROW.        BEG
14b0: 49 4e 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  IN.        INSER
14c0: 54 20 49 4e 54 4f 20 72 6c 6f 67 20 56 41 4c 55  T INTO rlog VALU
14d0: 45 53 20 28 20 28 53 45 4c 45 43 54 20 63 6f 61  ES ( (SELECT coa
14e0: 6c 65 73 63 65 28 6d 61 78 28 69 64 78 29 2c 30  lesce(max(idx),0
14f0: 29 20 2b 20 31 20 46 52 4f 4d 20 72 6c 6f 67 29  ) + 1 FROM rlog)
1500: 2c 20 0a 20 20 09 20 20 6f 6c 64 2e 61 2c 20 6f  , .  .  old.a, o
1510: 6c 64 2e 62 2c 20 0a 20 20 09 20 20 28 53 45 4c  ld.b, .  .  (SEL
1520: 45 43 54 20 63 6f 61 6c 65 73 63 65 28 73 75 6d  ECT coalesce(sum
1530: 28 61 29 2c 30 29 20 46 52 4f 4d 20 74 62 6c 29  (a),0) FROM tbl)
1540: 2c 0a 20 20 20 20 20 20 20 20 20 20 28 53 45 4c  ,.          (SEL
1550: 45 43 54 20 63 6f 61 6c 65 73 63 65 28 73 75 6d  ECT coalesce(sum
1560: 28 62 29 2c 30 29 20 46 52 4f 4d 20 74 62 6c 29  (b),0) FROM tbl)
1570: 2c 20 0a 20 20 09 20 20 30 2c 20 30 29 3b 0a 20  , .  .  0, 0);. 
1580: 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 7d 0a       END;.    }.
1590: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68      do_test with
15a0: 6f 75 74 5f 72 6f 77 69 64 34 2d 31 2e 24 69 69  out_rowid4-1.$ii
15b0: 2e 32 20 7b 0a 20 20 20 20 20 20 73 65 74 20 72  .2 {.      set r
15c0: 20 7b 7d 0a 20 20 20 20 20 20 66 6f 72 65 61 63   {}.      foreac
15d0: 68 20 76 20 5b 65 78 65 63 73 71 6c 20 7b 0a 20  h v [execsql {. 
15e0: 20 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52         DELETE FR
15f0: 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 20 20  OM tbl;.        
1600: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 72 6c  SELECT * FROM rl
1610: 6f 67 3b 0a 20 20 20 20 20 20 7d 5d 20 7b 0a 20  og;.      }] {. 
1620: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
1630: 20 5b 65 78 70 72 20 7b 69 6e 74 28 24 76 29 7d   [expr {int($v)}
1640: 5d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ].      }.      
1650: 73 65 74 20 72 0a 20 20 20 20 7d 20 5b 6c 69 73  set r.    } [lis
1660: 74 20 31 20 31 30 30 20 31 30 30 20 34 30 30 20  t 1 100 100 400 
1670: 33 30 30 20 30 20 30 20 5c 0a 20 20 20 20 20 20  300 0 0 \.      
1680: 20 20 20 20 20 20 32 20 31 30 30 20 31 30 30 20        2 100 100 
1690: 33 30 30 20 32 30 30 20 30 20 30 20 5c 0a 20 20  300 200 0 0 \.  
16a0: 20 20 20 20 20 20 20 20 20 20 33 20 33 30 30 20            3 300 
16b0: 32 30 30 20 33 30 30 20 32 30 30 20 30 20 30 20  200 300 200 0 0 
16c0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 34 20  \.            4 
16d0: 33 30 30 20 32 30 30 20 30 20 30 20 30 20 30 20  300 200 0 0 0 0 
16e0: 5d 0a 20 20 0a 20 20 20 20 65 78 65 63 73 71 6c  ].  .    execsql
16f0: 20 7b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20   {.      DELETE 
1700: 46 52 4f 4d 20 72 6c 6f 67 3b 0a 20 20 20 20 20  FROM rlog;.     
1710: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
1720: 69 6e 73 65 72 74 5f 62 65 66 6f 72 65 5f 72 6f  insert_before_ro
1730: 77 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54 20  w BEFORE INSERT 
1740: 4f 4e 20 74 62 6c 20 46 4f 52 20 45 41 43 48 20  ON tbl FOR EACH 
1750: 52 4f 57 0a 20 20 20 20 20 20 20 20 42 45 47 49  ROW.        BEGI
1760: 4e 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  N.        INSERT
1770: 20 49 4e 54 4f 20 72 6c 6f 67 20 56 41 4c 55 45   INTO rlog VALUE
1780: 53 20 28 20 28 53 45 4c 45 43 54 20 63 6f 61 6c  S ( (SELECT coal
1790: 65 73 63 65 28 6d 61 78 28 69 64 78 29 2c 30 29  esce(max(idx),0)
17a0: 20 2b 20 31 20 46 52 4f 4d 20 72 6c 6f 67 29 2c   + 1 FROM rlog),
17b0: 20 0a 20 20 09 20 20 30 2c 20 30 2c 0a 20 20 09   .  .  0, 0,.  .
17c0: 20 20 28 53 45 4c 45 43 54 20 63 6f 61 6c 65 73    (SELECT coales
17d0: 63 65 28 73 75 6d 28 61 29 2c 30 29 20 46 52 4f  ce(sum(a),0) FRO
17e0: 4d 20 74 62 6c 29 2c 0a 20 20 20 20 20 20 20 20  M tbl),.        
17f0: 20 20 28 53 45 4c 45 43 54 20 63 6f 61 6c 65 73    (SELECT coales
1800: 63 65 28 73 75 6d 28 62 29 2c 30 29 20 46 52 4f  ce(sum(b),0) FRO
1810: 4d 20 74 62 6c 29 2c 20 0a 20 20 09 20 20 6e 65  M tbl), .  .  ne
1820: 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20  w.a, new.b);.   
1830: 20 20 20 45 4e 44 3b 0a 20 20 0a 20 20 20 20 20     END;.  .     
1840: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
1850: 69 6e 73 65 72 74 5f 61 66 74 65 72 5f 72 6f 77  insert_after_row
1860: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
1870: 20 74 62 6c 20 46 4f 52 20 45 41 43 48 20 52 4f   tbl FOR EACH RO
1880: 57 0a 20 20 20 20 20 20 20 20 42 45 47 49 4e 0a  W.        BEGIN.
1890: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
18a0: 4e 54 4f 20 72 6c 6f 67 20 56 41 4c 55 45 53 20  NTO rlog VALUES 
18b0: 28 20 28 53 45 4c 45 43 54 20 63 6f 61 6c 65 73  ( (SELECT coales
18c0: 63 65 28 6d 61 78 28 69 64 78 29 2c 30 29 20 2b  ce(max(idx),0) +
18d0: 20 31 20 46 52 4f 4d 20 72 6c 6f 67 29 2c 20 0a   1 FROM rlog), .
18e0: 20 20 09 20 20 30 2c 20 30 2c 0a 20 20 09 20 20    .  0, 0,.  .  
18f0: 28 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65  (SELECT coalesce
1900: 28 73 75 6d 28 61 29 2c 30 29 20 46 52 4f 4d 20  (sum(a),0) FROM 
1910: 74 62 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20  tbl),.          
1920: 28 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65  (SELECT coalesce
1930: 28 73 75 6d 28 62 29 2c 30 29 20 46 52 4f 4d 20  (sum(b),0) FROM 
1940: 74 62 6c 29 2c 20 0a 20 20 09 20 20 6e 65 77 2e  tbl), .  .  new.
1950: 61 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20 20 20  a, new.b);.     
1960: 20 45 4e 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20   END;.    }.    
1970: 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
1980: 72 6f 77 69 64 34 2d 31 2e 24 69 69 2e 33 20 7b  rowid4-1.$ii.3 {
1990: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b  .      execsql {
19a0: 0a 20 20 0a 20 20 20 20 20 20 20 20 43 52 45 41  .  .        CREA
19b0: 54 45 20 54 41 42 4c 45 20 6f 74 68 65 72 5f 74  TE TABLE other_t
19c0: 62 6c 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  bl(a, b);.      
19d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 74    INSERT INTO ot
19e0: 68 65 72 5f 74 62 6c 20 56 41 4c 55 45 53 28 31  her_tbl VALUES(1
19f0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  , 2);.        IN
1a00: 53 45 52 54 20 49 4e 54 4f 20 6f 74 68 65 72 5f  SERT INTO other_
1a10: 74 62 6c 20 56 41 4c 55 45 53 28 33 2c 20 34 29  tbl VALUES(3, 4)
1a20: 3b 0a 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 53  ;.        -- INS
1a30: 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c  ERT INTO tbl SEL
1a40: 45 43 54 20 2a 20 46 52 4f 4d 20 6f 74 68 65 72  ECT * FROM other
1a50: 5f 74 62 6c 3b 0a 20 20 20 20 20 20 20 20 49 4e  _tbl;.        IN
1a60: 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41  SERT INTO tbl VA
1a70: 4c 55 45 53 28 35 2c 20 36 29 3b 0a 20 20 20 20  LUES(5, 6);.    
1a80: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 6f      DROP TABLE o
1a90: 74 68 65 72 5f 74 62 6c 3b 0a 20 20 0a 20 20 20  ther_tbl;.  .   
1aa0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
1ab0: 4f 4d 20 72 6c 6f 67 3b 0a 20 20 20 20 20 20 7d  OM rlog;.      }
1ac0: 0a 20 20 20 20 7d 20 5b 6c 69 73 74 20 31 20 30  .    } [list 1 0
1ad0: 20 30 20 30 20 30 20 35 20 36 20 5c 0a 20 20 20   0 0 0 5 6 \.   
1ae0: 20 20 20 20 20 20 20 20 20 32 20 30 20 30 20 35           2 0 0 5
1af0: 20 36 20 35 20 36 20 5d 0a 20 20 0a 20 20 20 20   6 5 6 ].  .    
1b00: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
1b10: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 34 2d 31  without_rowid4-1
1b20: 2e 24 69 69 2e 34 0a 20 20 7d 0a 20 20 63 61 74  .$ii.4.  }.  cat
1b30: 63 68 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50  chsql {.    DROP
1b40: 20 54 41 42 4c 45 20 72 6c 6f 67 3b 0a 20 20 20   TABLE rlog;.   
1b50: 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6c 6f 67   DROP TABLE clog
1b60: 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
1b70: 20 74 62 6c 3b 0a 20 20 20 20 44 52 4f 50 20 54   tbl;.    DROP T
1b80: 41 42 4c 45 20 6f 74 68 65 72 5f 74 62 6c 3b 0a  ABLE other_tbl;.
1b90: 20 20 7d 0a 7d 0a 0a 23 20 32 2e 0a 73 65 74 20    }.}..# 2..set 
1ba0: 69 69 20 30 0a 66 6f 72 65 61 63 68 20 74 72 5f  ii 0.foreach tr_
1bb0: 70 72 6f 67 72 61 6d 20 7b 0a 20 20 7b 55 50 44  program {.  {UPD
1bc0: 41 54 45 20 74 62 6c 20 53 45 54 20 62 20 3d 20  ATE tbl SET b = 
1bd0: 6f 6c 64 2e 62 3b 7d 0a 20 20 7b 49 4e 53 45 52  old.b;}.  {INSER
1be0: 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45  T INTO log VALUE
1bf0: 53 28 6e 65 77 2e 63 2c 20 32 2c 20 33 29 3b 7d  S(new.c, 2, 3);}
1c00: 0a 20 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20  .  {DELETE FROM 
1c10: 6c 6f 67 20 57 48 45 52 45 20 61 20 3d 20 31 3b  log WHERE a = 1;
1c20: 7d 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f  }.  {INSERT INTO
1c30: 20 74 62 6c 20 56 41 4c 55 45 53 28 35 30 30 2c   tbl VALUES(500,
1c40: 20 6e 65 77 2e 62 20 2a 20 31 30 2c 20 37 30 30   new.b * 10, 700
1c50: 29 3b 20 0a 20 20 20 20 55 50 44 41 54 45 20 74  ); .    UPDATE t
1c60: 62 6c 20 53 45 54 20 63 20 3d 20 6f 6c 64 2e 63  bl SET c = old.c
1c70: 3b 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  ; .    DELETE FR
1c80: 4f 4d 20 6c 6f 67 3b 7d 0a 20 20 7b 49 4e 53 45  OM log;}.  {INSE
1c90: 52 54 20 49 4e 54 4f 20 6c 6f 67 20 73 65 6c 65  RT INTO log sele
1ca0: 63 74 20 2a 20 66 72 6f 6d 20 74 62 6c 3b 7d 20  ct * from tbl;} 
1cb0: 0a 7d 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 74  .} {.  foreach t
1cc0: 65 73 74 5f 76 61 72 73 65 74 20 5b 20 6c 69 73  est_varset [ lis
1cd0: 74 20 5c 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  t \.    {.      
1ce0: 73 65 74 20 73 74 61 74 65 6d 65 6e 74 20 7b 55  set statement {U
1cf0: 50 44 41 54 45 20 74 62 6c 20 53 45 54 20 63 20  PDATE tbl SET c 
1d00: 3d 20 31 30 20 57 48 45 52 45 20 61 20 3d 20 31  = 10 WHERE a = 1
1d10: 3b 7d 20 0a 20 20 20 20 20 20 73 65 74 20 70 72  ;} .      set pr
1d20: 65 70 20 20 20 20 20 20 7b 49 4e 53 45 52 54 20  ep      {INSERT 
1d30: 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28  INTO tbl VALUES(
1d40: 31 2c 20 32 2c 20 33 29 3b 7d 0a 20 20 20 20 20  1, 2, 3);}.     
1d50: 20 73 65 74 20 6e 65 77 43 20 31 30 0a 20 20 20   set newC 10.   
1d60: 20 20 20 73 65 74 20 6e 65 77 42 20 32 0a 20 20     set newB 2.  
1d70: 20 20 20 20 73 65 74 20 6e 65 77 41 20 31 0a 20      set newA 1. 
1d80: 20 20 20 20 20 73 65 74 20 6f 6c 64 41 20 31 0a       set oldA 1.
1d90: 20 20 20 20 20 20 73 65 74 20 6f 6c 64 42 20 32        set oldB 2
1da0: 0a 20 20 20 20 20 20 73 65 74 20 6f 6c 64 43 20  .      set oldC 
1db0: 33 0a 20 20 20 20 7d 20 5c 0a 20 20 20 20 7b 0a  3.    } \.    {.
1dc0: 20 20 20 20 20 20 73 65 74 20 73 74 61 74 65 6d        set statem
1dd0: 65 6e 74 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d  ent {DELETE FROM
1de0: 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31   tbl WHERE a = 1
1df0: 3b 7d 0a 20 20 20 20 20 20 73 65 74 20 70 72 65  ;}.      set pre
1e00: 70 20 20 20 20 20 20 7b 49 4e 53 45 52 54 20 49  p      {INSERT I
1e10: 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28 31  NTO tbl VALUES(1
1e20: 2c 20 32 2c 20 33 29 3b 7d 0a 20 20 20 20 20 20  , 2, 3);}.      
1e30: 73 65 74 20 6f 6c 64 41 20 31 0a 20 20 20 20 20  set oldA 1.     
1e40: 20 73 65 74 20 6f 6c 64 42 20 32 0a 20 20 20 20   set oldB 2.    
1e50: 20 20 73 65 74 20 6f 6c 64 43 20 33 0a 20 20 20    set oldC 3.   
1e60: 20 7d 20 5c 0a 20 20 20 20 7b 0a 20 20 20 20 20   } \.    {.     
1e70: 20 73 65 74 20 73 74 61 74 65 6d 65 6e 74 20 7b   set statement {
1e80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
1e90: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b  VALUES(1, 2, 3);
1ea0: 7d 0a 20 20 20 20 20 20 73 65 74 20 6e 65 77 41  }.      set newA
1eb0: 20 31 0a 20 20 20 20 20 20 73 65 74 20 6e 65 77   1.      set new
1ec0: 42 20 32 0a 20 20 20 20 20 20 73 65 74 20 6e 65  B 2.      set ne
1ed0: 77 43 20 33 0a 20 20 20 20 7d 0a 20 20 5d 20 5c  wC 3.    }.  ] \
1ee0: 0a 20 20 7b 0a 20 20 20 20 73 65 74 20 73 74 61  .  {.    set sta
1ef0: 74 65 6d 65 6e 74 20 7b 7d 0a 20 20 20 20 73 65  tement {}.    se
1f00: 74 20 70 72 65 70 20 7b 7d 0a 20 20 20 20 73 65  t prep {}.    se
1f10: 74 20 6e 65 77 41 20 7b 27 27 7d 0a 20 20 20 20  t newA {''}.    
1f20: 73 65 74 20 6e 65 77 42 20 7b 27 27 7d 0a 20 20  set newB {''}.  
1f30: 20 20 73 65 74 20 6e 65 77 43 20 7b 27 27 7d 0a    set newC {''}.
1f40: 20 20 20 20 73 65 74 20 6f 6c 64 41 20 7b 27 27      set oldA {''
1f50: 7d 0a 20 20 20 20 73 65 74 20 6f 6c 64 42 20 7b  }.    set oldB {
1f60: 27 27 7d 0a 20 20 20 20 73 65 74 20 6f 6c 64 43  ''}.    set oldC
1f70: 20 7b 27 27 7d 0a 0a 20 20 20 20 69 6e 63 72 20   {''}..    incr 
1f80: 69 69 0a 0a 20 20 20 20 65 76 61 6c 20 24 74 65  ii..    eval $te
1f90: 73 74 5f 76 61 72 73 65 74 0a 0a 20 20 20 20 73  st_varset..    s
1fa0: 65 74 20 73 74 61 74 65 6d 65 6e 74 5f 74 79 70  et statement_typ
1fb0: 65 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  e [string range 
1fc0: 24 73 74 61 74 65 6d 65 6e 74 20 30 20 35 5d 0a  $statement 0 5].
1fd0: 20 20 20 20 73 65 74 20 74 72 5f 70 72 6f 67 72      set tr_progr
1fe0: 61 6d 5f 66 69 78 65 64 20 24 74 72 5f 70 72 6f  am_fixed $tr_pro
1ff0: 67 72 61 6d 0a 20 20 20 20 69 66 20 7b 24 73 74  gram.    if {$st
2000: 61 74 65 6d 65 6e 74 5f 74 79 70 65 20 3d 3d 20  atement_type == 
2010: 22 44 45 4c 45 54 45 22 7d 20 7b 0a 20 20 20 20  "DELETE"} {.    
2020: 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 6e 65    regsub -all ne
2030: 77 5c 2e 61 20 24 74 72 5f 70 72 6f 67 72 61 6d  w\.a $tr_program
2040: 5f 66 69 78 65 64 20 7b 27 27 7d 20 74 72 5f 70  _fixed {''} tr_p
2050: 72 6f 67 72 61 6d 5f 66 69 78 65 64 20 0a 20 20  rogram_fixed .  
2060: 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20      regsub -all 
2070: 6e 65 77 5c 2e 62 20 24 74 72 5f 70 72 6f 67 72  new\.b $tr_progr
2080: 61 6d 5f 66 69 78 65 64 20 7b 27 27 7d 20 74 72  am_fixed {''} tr
2090: 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65 64 20 0a  _program_fixed .
20a0: 20 20 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c        regsub -al
20b0: 6c 20 6e 65 77 5c 2e 63 20 24 74 72 5f 70 72 6f  l new\.c $tr_pro
20c0: 67 72 61 6d 5f 66 69 78 65 64 20 7b 27 27 7d 20  gram_fixed {''} 
20d0: 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65 64  tr_program_fixed
20e0: 20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b   .    }.    if {
20f0: 24 73 74 61 74 65 6d 65 6e 74 5f 74 79 70 65 20  $statement_type 
2100: 3d 3d 20 22 49 4e 53 45 52 54 22 7d 20 7b 0a 20  == "INSERT"} {. 
2110: 20 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c       regsub -all
2120: 20 6f 6c 64 5c 2e 61 20 24 74 72 5f 70 72 6f 67   old\.a $tr_prog
2130: 72 61 6d 5f 66 69 78 65 64 20 7b 27 27 7d 20 74  ram_fixed {''} t
2140: 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65 64 20  r_program_fixed 
2150: 0a 20 20 20 20 20 20 72 65 67 73 75 62 20 2d 61  .      regsub -a
2160: 6c 6c 20 6f 6c 64 5c 2e 62 20 24 74 72 5f 70 72  ll old\.b $tr_pr
2170: 6f 67 72 61 6d 5f 66 69 78 65 64 20 7b 27 27 7d  ogram_fixed {''}
2180: 20 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65   tr_program_fixe
2190: 64 20 0a 20 20 20 20 20 20 72 65 67 73 75 62 20  d .      regsub 
21a0: 2d 61 6c 6c 20 6f 6c 64 5c 2e 63 20 24 74 72 5f  -all old\.c $tr_
21b0: 70 72 6f 67 72 61 6d 5f 66 69 78 65 64 20 7b 27  program_fixed {'
21c0: 27 7d 20 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69  '} tr_program_fi
21d0: 78 65 64 20 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  xed .    }...   
21e0: 20 73 65 74 20 74 72 5f 70 72 6f 67 72 61 6d 5f   set tr_program_
21f0: 63 6f 6f 6b 65 64 20 24 74 72 5f 70 72 6f 67 72  cooked $tr_progr
2200: 61 6d 0a 20 20 20 20 72 65 67 73 75 62 20 2d 61  am.    regsub -a
2210: 6c 6c 20 6e 65 77 5c 2e 61 20 24 74 72 5f 70 72  ll new\.a $tr_pr
2220: 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20 24 6e 65  ogram_cooked $ne
2230: 77 41 20 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f  wA tr_program_co
2240: 6f 6b 65 64 20 0a 20 20 20 20 72 65 67 73 75 62  oked .    regsub
2250: 20 2d 61 6c 6c 20 6e 65 77 5c 2e 62 20 24 74 72   -all new\.b $tr
2260: 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20  _program_cooked 
2270: 24 6e 65 77 42 20 74 72 5f 70 72 6f 67 72 61 6d  $newB tr_program
2280: 5f 63 6f 6f 6b 65 64 20 0a 20 20 20 20 72 65 67  _cooked .    reg
2290: 73 75 62 20 2d 61 6c 6c 20 6e 65 77 5c 2e 63 20  sub -all new\.c 
22a0: 24 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b  $tr_program_cook
22b0: 65 64 20 24 6e 65 77 43 20 74 72 5f 70 72 6f 67  ed $newC tr_prog
22c0: 72 61 6d 5f 63 6f 6f 6b 65 64 20 0a 20 20 20 20  ram_cooked .    
22d0: 72 65 67 73 75 62 20 2d 61 6c 6c 20 6f 6c 64 5c  regsub -all old\
22e0: 2e 61 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f 63  .a $tr_program_c
22f0: 6f 6f 6b 65 64 20 24 6f 6c 64 41 20 74 72 5f 70  ooked $oldA tr_p
2300: 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20 0a 20  rogram_cooked . 
2310: 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 6f     regsub -all o
2320: 6c 64 5c 2e 62 20 24 74 72 5f 70 72 6f 67 72 61  ld\.b $tr_progra
2330: 6d 5f 63 6f 6f 6b 65 64 20 24 6f 6c 64 42 20 74  m_cooked $oldB t
2340: 72 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64  r_program_cooked
2350: 20 0a 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c   .    regsub -al
2360: 6c 20 6f 6c 64 5c 2e 63 20 24 74 72 5f 70 72 6f  l old\.c $tr_pro
2370: 67 72 61 6d 5f 63 6f 6f 6b 65 64 20 24 6f 6c 64  gram_cooked $old
2380: 43 20 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f  C tr_program_coo
2390: 6b 65 64 20 0a 0a 20 20 20 20 63 61 74 63 68 73  ked ..    catchs
23a0: 71 6c 20 7b 0a 20 20 20 20 20 20 44 52 4f 50 20  ql {.      DROP 
23b0: 54 41 42 4c 45 20 74 62 6c 3b 0a 20 20 20 20 20  TABLE tbl;.     
23c0: 20 44 52 4f 50 20 54 41 42 4c 45 20 6c 6f 67 3b   DROP TABLE log;
23d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 78 65 63  .    }..    exec
23e0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41  sql {.      CREA
23f0: 54 45 20 54 41 42 4c 45 20 74 62 6c 28 61 20 50  TE TABLE tbl(a P
2400: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63  RIMARY KEY, b, c
2410: 29 20 57 49 54 48 4f 55 54 20 72 6f 77 69 64 3b  ) WITHOUT rowid;
2420: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
2430: 42 4c 45 20 6c 6f 67 28 61 2c 20 62 2c 20 63 29  BLE log(a, b, c)
2440: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74  ;.    }..    set
2450: 20 71 75 65 72 79 20 7b 53 45 4c 45 43 54 20 2a   query {SELECT *
2460: 20 46 52 4f 4d 20 74 62 6c 3b 20 53 45 4c 45 43   FROM tbl; SELEC
2470: 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b 7d 0a 20  T * FROM log;}. 
2480: 20 20 20 73 65 74 20 70 72 65 70 20 22 24 70 72     set prep "$pr
2490: 65 70 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ep; INSERT INTO 
24a0: 6c 6f 67 20 56 41 4c 55 45 53 28 31 2c 20 32 2c  log VALUES(1, 2,
24b0: 20 33 29 3b 5c 0a 20 20 20 20 20 20 20 20 20 20   3);\.          
24c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c     INSERT INTO l
24d0: 6f 67 20 56 41 4c 55 45 53 28 31 30 2c 20 32 30  og VALUES(10, 20
24e0: 2c 20 33 30 29 3b 22 0a 0a 23 20 43 68 65 63 6b  , 30);"..# Check
24f0: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 42 45   execution of BE
2500: 46 4f 52 45 20 70 72 6f 67 72 61 6d 73 3a 0a 0a  FORE programs:..
2510: 20 20 20 20 73 65 74 20 62 65 66 6f 72 65 5f 64      set before_d
2520: 61 74 61 20 5b 20 65 78 65 63 73 71 6c 20 22 24  ata [ execsql "$
2530: 70 72 65 70 20 24 74 72 5f 70 72 6f 67 72 61 6d  prep $tr_program
2540: 5f 63 6f 6f 6b 65 64 20 24 73 74 61 74 65 6d 65  _cooked $stateme
2550: 6e 74 20 24 71 75 65 72 79 22 20 5d 0a 0a 20 20  nt $query" ]..  
2560: 20 20 65 78 65 63 73 71 6c 20 22 44 45 4c 45 54    execsql "DELET
2570: 45 20 46 52 4f 4d 20 74 62 6c 3b 20 44 45 4c 45  E FROM tbl; DELE
2580: 54 45 20 46 52 4f 4d 20 6c 6f 67 3b 20 24 70 72  TE FROM log; $pr
2590: 65 70 22 3b 0a 20 20 20 20 65 78 65 63 73 71 6c  ep";.    execsql
25a0: 20 22 43 52 45 41 54 45 20 54 52 49 47 47 45 52   "CREATE TRIGGER
25b0: 20 74 68 65 5f 74 72 69 67 67 65 72 20 42 45 46   the_trigger BEF
25c0: 4f 52 45 20 5b 73 74 72 69 6e 67 20 72 61 6e 67  ORE [string rang
25d0: 65 20 24 73 74 61 74 65 6d 65 6e 74 20 30 20 36  e $statement 0 6
25e0: 5d 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]\.             
25f0: 4f 4e 20 74 62 6c 20 42 45 47 49 4e 20 24 74 72  ON tbl BEGIN $tr
2600: 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65 64 20 45  _program_fixed E
2610: 4e 44 3b 22 0a 0a 20 20 20 20 64 6f 5f 74 65 73  ND;"..    do_tes
2620: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 34  t without_rowid4
2630: 2d 32 2e 24 69 69 2d 62 65 66 6f 72 65 20 22 65  -2.$ii-before "e
2640: 78 65 63 73 71 6c 20 7b 24 73 74 61 74 65 6d 65  xecsql {$stateme
2650: 6e 74 20 24 71 75 65 72 79 7d 22 20 24 62 65 66  nt $query}" $bef
2660: 6f 72 65 5f 64 61 74 61 0a 0a 20 20 20 20 65 78  ore_data..    ex
2670: 65 63 73 71 6c 20 22 44 52 4f 50 20 54 52 49 47  ecsql "DROP TRIG
2680: 47 45 52 20 74 68 65 5f 74 72 69 67 67 65 72 3b  GER the_trigger;
2690: 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 44  ".    execsql "D
26a0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 3b 20  ELETE FROM tbl; 
26b0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 6c 6f 67 3b  DELETE FROM log;
26c0: 22 0a 0a 23 20 43 68 65 63 6b 20 65 78 65 63 75  "..# Check execu
26d0: 74 69 6f 6e 20 6f 66 20 41 46 54 45 52 20 70 72  tion of AFTER pr
26e0: 6f 67 72 61 6d 73 0a 20 20 20 20 73 65 74 20 61  ograms.    set a
26f0: 66 74 65 72 5f 64 61 74 61 20 5b 20 65 78 65 63  fter_data [ exec
2700: 73 71 6c 20 22 24 70 72 65 70 20 24 73 74 61 74  sql "$prep $stat
2710: 65 6d 65 6e 74 20 24 74 72 5f 70 72 6f 67 72 61  ement $tr_progra
2720: 6d 5f 63 6f 6f 6b 65 64 20 24 71 75 65 72 79 22  m_cooked $query"
2730: 20 5d 0a 0a 20 20 20 20 65 78 65 63 73 71 6c 20   ]..    execsql 
2740: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c  "DELETE FROM tbl
2750: 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 6c 6f  ; DELETE FROM lo
2760: 67 3b 20 24 70 72 65 70 22 3b 0a 20 20 20 20 65  g; $prep";.    e
2770: 78 65 63 73 71 6c 20 22 43 52 45 41 54 45 20 54  xecsql "CREATE T
2780: 52 49 47 47 45 52 20 74 68 65 5f 74 72 69 67 67  RIGGER the_trigg
2790: 65 72 20 41 46 54 45 52 20 5b 73 74 72 69 6e 67  er AFTER [string
27a0: 20 72 61 6e 67 65 20 24 73 74 61 74 65 6d 65 6e   range $statemen
27b0: 74 20 30 20 36 5d 5c 0a 20 20 20 20 20 20 20 20  t 0 6]\.        
27c0: 20 20 20 20 20 4f 4e 20 74 62 6c 20 42 45 47 49       ON tbl BEGI
27d0: 4e 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69  N $tr_program_fi
27e0: 78 65 64 20 45 4e 44 3b 22 0a 0a 20 20 20 20 64  xed END;"..    d
27f0: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
2800: 6f 77 69 64 34 2d 32 2e 24 69 69 2d 61 66 74 65  owid4-2.$ii-afte
2810: 72 20 22 65 78 65 63 73 71 6c 20 7b 24 73 74 61  r "execsql {$sta
2820: 74 65 6d 65 6e 74 20 24 71 75 65 72 79 7d 22 20  tement $query}" 
2830: 24 61 66 74 65 72 5f 64 61 74 61 0a 20 20 20 20  $after_data.    
2840: 65 78 65 63 73 71 6c 20 22 44 52 4f 50 20 54 52  execsql "DROP TR
2850: 49 47 47 45 52 20 74 68 65 5f 74 72 69 67 67 65  IGGER the_trigge
2860: 72 3b 22 0a 0a 20 20 20 20 69 6e 74 65 67 72 69  r;"..    integri
2870: 74 79 5f 63 68 65 63 6b 20 77 69 74 68 6f 75 74  ty_check without
2880: 5f 72 6f 77 69 64 34 2d 32 2e 24 69 69 2d 69 6e  _rowid4-2.$ii-in
2890: 74 65 67 72 69 74 79 0a 20 20 7d 0a 7d 0a 63 61  tegrity.  }.}.ca
28a0: 74 63 68 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20  tchsql {.  DROP 
28b0: 54 41 42 4c 45 20 74 62 6c 3b 0a 20 20 44 52 4f  TABLE tbl;.  DRO
28c0: 50 20 54 41 42 4c 45 20 6c 6f 67 3b 0a 7d 0a 0a  P TABLE log;.}..
28d0: 23 20 33 2e 0a 0a 23 20 77 69 74 68 6f 75 74 5f  # 3...# without_
28e0: 72 6f 77 69 64 34 2d 33 2e 31 3a 20 55 50 44 41  rowid4-3.1: UPDA
28f0: 54 45 20 4f 46 20 74 72 69 67 67 65 72 73 0a 65  TE OF triggers.e
2900: 78 65 63 73 71 6c 20 7b 0a 20 20 43 52 45 41 54  xecsql {.  CREAT
2910: 45 20 54 41 42 4c 45 20 74 62 6c 20 28 61 2c 20  E TABLE tbl (a, 
2920: 62 2c 20 63 2c 20 64 2c 20 50 52 49 4d 41 52 59  b, c, d, PRIMARY
2930: 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29 29 20 57   KEY(a,b,c,d)) W
2940: 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20  ITHOUT rowid;.  
2950: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6c 6f 67  CREATE TABLE log
2960: 20 28 61 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   (a);.  INSERT I
2970: 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 20 28  NTO log VALUES (
2980: 30 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  0);.  INSERT INT
2990: 4f 20 74 62 6c 20 56 41 4c 55 45 53 20 28 30 2c  O tbl VALUES (0,
29a0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 49 4e 53   0, 0, 0);.  INS
29b0: 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c  ERT INTO tbl VAL
29c0: 55 45 53 20 28 31 2c 20 30 2c 20 30 2c 20 30 29  UES (1, 0, 0, 0)
29d0: 3b 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47  ;.  CREATE TRIGG
29e0: 45 52 20 74 62 6c 5f 61 66 74 65 72 5f 75 70 64  ER tbl_after_upd
29f0: 61 74 65 5f 63 64 20 42 45 46 4f 52 45 20 55 50  ate_cd BEFORE UP
2a00: 44 41 54 45 20 4f 46 20 63 2c 20 64 20 4f 4e 20  DATE OF c, d ON 
2a10: 74 62 6c 0a 20 20 20 20 42 45 47 49 4e 0a 20 20  tbl.    BEGIN.  
2a20: 20 20 20 20 55 50 44 41 54 45 20 6c 6f 67 20 53      UPDATE log S
2a30: 45 54 20 61 20 3d 20 61 20 2b 20 31 3b 0a 20 20  ET a = a + 1;.  
2a40: 20 20 45 4e 44 3b 0a 7d 0a 64 6f 5f 74 65 73 74    END;.}.do_test
2a50: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 34 2d   without_rowid4-
2a60: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
2a70: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74 62 6c  {.    UPDATE tbl
2a80: 20 53 45 54 20 62 20 3d 20 31 2c 20 63 20 3d 20   SET b = 1, c = 
2a90: 31 30 3b 20 2d 2d 20 32 0a 20 20 20 20 55 50 44  10; -- 2.    UPD
2aa0: 41 54 45 20 74 62 6c 20 53 45 54 20 62 20 3d 20  ATE tbl SET b = 
2ab0: 31 30 3b 20 2d 2d 20 30 0a 20 20 20 20 55 50 44  10; -- 0.    UPD
2ac0: 41 54 45 20 74 62 6c 20 53 45 54 20 64 20 3d 20  ATE tbl SET d = 
2ad0: 34 20 57 48 45 52 45 20 61 20 3d 20 30 3b 20 2d  4 WHERE a = 0; -
2ae0: 2d 31 0a 20 20 20 20 55 50 44 41 54 45 20 74 62  -1.    UPDATE tb
2af0: 6c 20 53 45 54 20 61 20 3d 20 34 2c 20 62 20 3d  l SET a = 4, b =
2b00: 20 31 30 3b 20 2d 2d 30 0a 20 20 20 20 53 45 4c   10; --0.    SEL
2b10: 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a  ECT * FROM log;.
2b20: 20 20 7d 0a 7d 20 7b 33 7d 0a 65 78 65 63 73 71    }.} {3}.execsq
2b30: 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45  l {.  DROP TABLE
2b40: 20 74 62 6c 3b 0a 20 20 44 52 4f 50 20 54 41 42   tbl;.  DROP TAB
2b50: 4c 45 20 6c 6f 67 3b 0a 7d 0a 0a 23 20 77 69 74  LE log;.}..# wit
2b60: 68 6f 75 74 5f 72 6f 77 69 64 34 2d 33 2e 32 3a  hout_rowid4-3.2:
2b70: 20 57 48 45 4e 20 63 6c 61 75 73 65 0a 73 65 74   WHEN clause.set
2b80: 20 77 68 65 6e 5f 74 72 69 67 67 65 72 73 20 5b   when_triggers [
2b90: 6c 69 73 74 20 7b 74 31 20 42 45 46 4f 52 45 20  list {t1 BEFORE 
2ba0: 49 4e 53 45 52 54 20 4f 4e 20 74 62 6c 20 57 48  INSERT ON tbl WH
2bb0: 45 4e 20 6e 65 77 2e 61 20 3e 20 32 30 7d 5d 0a  EN new.a > 20}].
2bc0: 69 66 63 61 70 61 62 6c 65 20 73 75 62 71 75 65  ifcapable subque
2bd0: 72 79 20 7b 0a 20 20 6c 61 70 70 65 6e 64 20 77  ry {.  lappend w
2be0: 68 65 6e 5f 74 72 69 67 67 65 72 73 20 5c 0a 20  hen_triggers \. 
2bf0: 20 20 20 20 20 7b 74 32 20 42 45 46 4f 52 45 20       {t2 BEFORE 
2c00: 49 4e 53 45 52 54 20 4f 4e 20 74 62 6c 20 57 48  INSERT ON tbl WH
2c10: 45 4e 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74  EN (SELECT count
2c20: 28 2a 29 20 46 52 4f 4d 20 74 62 6c 29 20 3d 20  (*) FROM tbl) = 
2c30: 30 7d 0a 7d 0a 0a 65 78 65 63 73 71 6c 20 7b 0a  0}.}..execsql {.
2c40: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2c50: 62 6c 20 28 61 2c 20 62 2c 20 63 2c 20 64 29 3b  bl (a, b, c, d);
2c60: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
2c70: 6c 6f 67 20 28 61 29 3b 0a 20 20 49 4e 53 45 52  log (a);.  INSER
2c80: 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45  T INTO log VALUE
2c90: 53 20 28 30 29 3b 0a 7d 0a 0a 66 6f 72 65 61 63  S (0);.}..foreac
2ca0: 68 20 74 72 69 67 20 24 77 68 65 6e 5f 74 72 69  h trig $when_tri
2cb0: 67 67 65 72 73 20 7b 0a 20 20 65 78 65 63 73 71  ggers {.  execsq
2cc0: 6c 20 22 43 52 45 41 54 45 20 54 52 49 47 47 45  l "CREATE TRIGGE
2cd0: 52 20 24 74 72 69 67 20 42 45 47 49 4e 20 55 50  R $trig BEGIN UP
2ce0: 44 41 54 45 20 6c 6f 67 20 73 65 74 20 61 20 3d  DATE log set a =
2cf0: 20 61 20 2b 20 31 3b 20 45 4e 44 3b 22 0a 7d 0a   a + 1; END;".}.
2d00: 0a 69 66 63 61 70 61 62 6c 65 20 73 75 62 71 75  .ifcapable subqu
2d10: 65 72 79 20 7b 0a 20 20 73 65 74 20 74 32 33 32  ery {.  set t232
2d20: 20 7b 31 20 30 20 31 7d 0a 7d 20 65 6c 73 65 20   {1 0 1}.} else 
2d30: 7b 0a 20 20 73 65 74 20 74 32 33 32 20 7b 30 20  {.  set t232 {0 
2d40: 30 20 31 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 77  0 1}.}.do_test w
2d50: 69 74 68 6f 75 74 5f 72 6f 77 69 64 34 2d 33 2e  ithout_rowid4-3.
2d60: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
2d70: 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ..    INSERT INT
2d80: 4f 20 74 62 6c 20 56 41 4c 55 45 53 28 30 2c 20  O tbl VALUES(0, 
2d90: 30 2c 20 30 2c 20 30 29 3b 20 20 20 20 20 2d 2d  0, 0, 0);     --
2da0: 20 31 20 28 69 66 63 61 70 61 62 6c 65 20 73 75   1 (ifcapable su
2db0: 62 71 75 65 72 79 29 0a 20 20 20 20 53 45 4c 45  bquery).    SELE
2dc0: 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20  CT * FROM log;. 
2dd0: 20 20 20 55 50 44 41 54 45 20 6c 6f 67 20 53 45     UPDATE log SE
2de0: 54 20 61 20 3d 20 30 3b 0a 0a 20 20 20 20 49 4e  T a = 0;..    IN
2df0: 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41  SERT INTO tbl VA
2e00: 4c 55 45 53 28 30 2c 20 30 2c 20 30 2c 20 30 29  LUES(0, 0, 0, 0)
2e10: 3b 20 20 20 20 20 2d 2d 20 30 0a 20 20 20 20 53  ;     -- 0.    S
2e20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67  ELECT * FROM log
2e30: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 6c 6f 67  ;.    UPDATE log
2e40: 20 53 45 54 20 61 20 3d 20 30 3b 0a 0a 20 20 20   SET a = 0;..   
2e50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
2e60: 20 56 41 4c 55 45 53 28 32 30 30 2c 20 30 2c 20   VALUES(200, 0, 
2e70: 30 2c 20 30 29 3b 20 20 20 20 20 2d 2d 20 31 0a  0, 0);     -- 1.
2e80: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2e90: 4d 20 6c 6f 67 3b 0a 20 20 20 20 55 50 44 41 54  M log;.    UPDAT
2ea0: 45 20 6c 6f 67 20 53 45 54 20 61 20 3d 20 30 3b  E log SET a = 0;
2eb0: 0a 20 20 7d 0a 7d 20 24 74 32 33 32 0a 65 78 65  .  }.} $t232.exe
2ec0: 63 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41  csql {.  DROP TA
2ed0: 42 4c 45 20 74 62 6c 3b 0a 20 20 44 52 4f 50 20  BLE tbl;.  DROP 
2ee0: 54 41 42 4c 45 20 6c 6f 67 3b 0a 7d 0a 69 6e 74  TABLE log;.}.int
2ef0: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 77 69 74  egrity_check wit
2f00: 68 6f 75 74 5f 72 6f 77 69 64 34 2d 33 2e 33 0a  hout_rowid4-3.3.
2f10: 0a 23 20 53 69 6d 70 6c 65 20 63 61 73 63 61 64  .# Simple cascad
2f20: 65 64 20 74 72 69 67 67 65 72 0a 65 78 65 63 73  ed trigger.execs
2f30: 71 6c 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  ql {.  CREATE TA
2f40: 42 4c 45 20 74 62 6c 41 28 61 2c 20 62 2c 20 50  BLE tblA(a, b, P
2f50: 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 29 29  RIMARY KEY(a,b))
2f60: 20 57 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a   WITHOUT rowid;.
2f70: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2f80: 62 6c 42 28 61 2c 20 62 2c 20 50 52 49 4d 41 52  blB(a, b, PRIMAR
2f90: 59 20 4b 45 59 28 61 2c 62 29 29 20 57 49 54 48  Y KEY(a,b)) WITH
2fa0: 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20 43 52 45  OUT rowid;.  CRE
2fb0: 41 54 45 20 54 41 42 4c 45 20 74 62 6c 43 28 61  ATE TABLE tblC(a
2fc0: 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , b, PRIMARY KEY
2fd0: 28 61 2c 62 29 29 20 57 49 54 48 4f 55 54 20 72  (a,b)) WITHOUT r
2fe0: 6f 77 69 64 3b 0a 0a 20 20 43 52 45 41 54 45 20  owid;..  CREATE 
2ff0: 54 52 49 47 47 45 52 20 74 72 31 20 42 45 46 4f  TRIGGER tr1 BEFO
3000: 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 62 6c  RE INSERT ON tbl
3010: 41 20 42 45 47 49 4e 0a 20 20 20 20 49 4e 53 45  A BEGIN.    INSE
3020: 52 54 20 49 4e 54 4f 20 74 62 6c 42 20 76 61 6c  RT INTO tblB val
3030: 75 65 73 28 6e 65 77 2e 61 2c 20 6e 65 77 2e 62  ues(new.a, new.b
3040: 29 3b 0a 20 20 45 4e 44 3b 0a 0a 20 20 43 52 45  );.  END;..  CRE
3050: 41 54 45 20 54 52 49 47 47 45 52 20 74 72 32 20  ATE TRIGGER tr2 
3060: 42 45 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e  BEFORE INSERT ON
3070: 20 74 62 6c 42 20 42 45 47 49 4e 0a 20 20 20 20   tblB BEGIN.    
3080: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 43  INSERT INTO tblC
3090: 20 76 61 6c 75 65 73 28 6e 65 77 2e 61 2c 20 6e   values(new.a, n
30a0: 65 77 2e 62 29 3b 0a 20 20 45 4e 44 3b 0a 7d 0a  ew.b);.  END;.}.
30b0: 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
30c0: 72 6f 77 69 64 34 2d 34 2e 31 20 7b 0a 20 20 65  rowid4-4.1 {.  e
30d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
30e0: 45 52 54 20 49 4e 54 4f 20 74 62 6c 41 20 76 61  ERT INTO tblA va
30f0: 6c 75 65 73 28 31 2c 20 32 29 3b 0a 20 20 20 20  lues(1, 2);.    
3100: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 62  SELECT * FROM tb
3110: 6c 41 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  lA;.    SELECT *
3120: 20 46 52 4f 4d 20 74 62 6c 42 3b 0a 20 20 20 20   FROM tblB;.    
3130: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 62  SELECT * FROM tb
3140: 6c 43 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 31  lC;.  }.} {1 2 1
3150: 20 32 20 31 20 32 7d 0a 65 78 65 63 73 71 6c 20   2 1 2}.execsql 
3160: 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74  {.  DROP TABLE t
3170: 62 6c 41 3b 0a 20 20 44 52 4f 50 20 54 41 42 4c  blA;.  DROP TABL
3180: 45 20 74 62 6c 42 3b 0a 20 20 44 52 4f 50 20 54  E tblB;.  DROP T
3190: 41 42 4c 45 20 74 62 6c 43 3b 0a 7d 0a 0a 23 20  ABLE tblC;.}..# 
31a0: 53 69 6d 70 6c 65 20 72 65 63 75 72 73 69 76 65  Simple recursive
31b0: 20 74 72 69 67 67 65 72 0a 65 78 65 63 73 71 6c   trigger.execsql
31c0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
31d0: 45 20 74 62 6c 28 61 2c 20 62 2c 20 63 2c 20 50  E tbl(a, b, c, P
31e0: 52 49 4d 41 52 59 20 4b 45 59 28 63 2c 61 2c 62  RIMARY KEY(c,a,b
31f0: 29 29 20 57 49 54 48 4f 55 54 20 72 6f 77 69 64  )) WITHOUT rowid
3200: 3b 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47  ;.  CREATE TRIGG
3210: 45 52 20 74 62 6c 5f 74 72 69 67 20 42 45 46 4f  ER tbl_trig BEFO
3220: 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 62 6c  RE INSERT ON tbl
3230: 20 0a 20 20 20 20 42 45 47 49 4e 0a 20 20 20 20   .    BEGIN.    
3240: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
3250: 6c 20 56 41 4c 55 45 53 20 28 6e 65 77 2e 61 2c  l VALUES (new.a,
3260: 20 6e 65 77 2e 62 2c 20 6e 65 77 2e 63 2b 31 29   new.b, new.c+1)
3270: 3b 0a 20 20 20 20 45 4e 44 3b 0a 7d 0a 64 6f 5f  ;.    END;.}.do_
3280: 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77  test without_row
3290: 69 64 34 2d 34 2e 32 20 7b 0a 20 20 65 78 65 63  id4-4.2 {.  exec
32a0: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
32b0: 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53   INTO tbl VALUES
32c0: 20 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20   (1, 2, 3);.    
32d0: 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20 74 62  select * from tb
32e0: 6c 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20  l;.  }.} {1 2 3 
32f0: 31 20 32 20 34 7d 0a 65 78 65 63 73 71 6c 20 7b  1 2 4}.execsql {
3300: 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 62  .  DROP TABLE tb
3310: 6c 3b 0a 7d 0a 0a 23 20 35 2e 0a 65 78 65 63 73  l;.}..# 5..execs
3320: 71 6c 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  ql {.  CREATE TA
3330: 42 4c 45 20 74 62 6c 28 61 2c 20 62 2c 20 63 2c  BLE tbl(a, b, c,
3340: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 63 2c 61   PRIMARY KEY(c,a
3350: 2c 62 29 29 20 57 49 54 48 4f 55 54 20 72 6f 77  ,b)) WITHOUT row
3360: 69 64 3b 0a 20 20 43 52 45 41 54 45 20 54 52 49  id;.  CREATE TRI
3370: 47 47 45 52 20 74 62 6c 5f 74 72 69 67 20 42 45  GGER tbl_trig BE
3380: 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74  FORE INSERT ON t
3390: 62 6c 20 0a 20 20 20 20 42 45 47 49 4e 0a 20 20  bl .    BEGIN.  
33a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
33b0: 74 62 6c 20 56 41 4c 55 45 53 20 28 31 2c 20 32  tbl VALUES (1, 2
33c0: 2c 20 33 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  , 3);.      INSE
33d0: 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55  RT INTO tbl VALU
33e0: 45 53 20 28 32 2c 20 32 2c 20 33 29 3b 0a 20 20  ES (2, 2, 3);.  
33f0: 20 20 20 20 55 50 44 41 54 45 20 74 62 6c 20 73      UPDATE tbl s
3400: 65 74 20 62 20 3d 20 31 30 20 57 48 45 52 45 20  et b = 10 WHERE 
3410: 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 44 45 4c  a = 1;.      DEL
3420: 45 54 45 20 46 52 4f 4d 20 74 62 6c 20 57 48 45  ETE FROM tbl WHE
3430: 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 20 20  RE a = 1;.      
3440: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 3b  DELETE FROM tbl;
3450: 0a 20 20 20 20 45 4e 44 3b 0a 7d 0a 64 6f 5f 74  .    END;.}.do_t
3460: 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69  est without_rowi
3470: 64 34 2d 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  d4-5 {.  execsql
3480: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
3490: 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28 31 30  TO tbl VALUES(10
34a0: 30 2c 20 32 30 30 2c 20 33 30 30 29 3b 0a 20 20  0, 200, 300);.  
34b0: 7d 0a 20 20 64 62 20 63 68 61 6e 67 65 73 0a 7d  }.  db changes.}
34c0: 20 7b 31 7d 0a 65 78 65 63 73 71 6c 20 7b 0a 20   {1}.execsql {. 
34d0: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 62 6c 3b   DROP TABLE tbl;
34e0: 0a 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 63 6f  .}..ifcapable co
34f0: 6e 66 6c 69 63 74 20 7b 0a 20 20 23 20 48 61 6e  nflict {.  # Han
3500: 64 6c 69 6e 67 20 6f 66 20 4f 4e 20 43 4f 4e 46  dling of ON CONF
3510: 4c 49 43 54 20 62 79 20 49 4e 53 45 52 54 20 73  LICT by INSERT s
3520: 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65  tatements inside
3530: 20 74 72 69 67 67 65 72 73 0a 20 20 65 78 65 63   triggers.  exec
3540: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
3550: 20 54 41 42 4c 45 20 74 62 6c 20 28 61 20 50 52   TABLE tbl (a PR
3560: 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29  IMARY KEY, b, c)
3570: 20 57 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a   WITHOUT rowid;.
3580: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
3590: 45 52 20 61 69 5f 74 62 6c 20 41 46 54 45 52 20  ER ai_tbl AFTER 
35a0: 49 4e 53 45 52 54 20 4f 4e 20 74 62 6c 20 42 45  INSERT ON tbl BE
35b0: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
35c0: 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20   OR IGNORE INTO 
35d0: 74 62 6c 20 76 61 6c 75 65 73 20 28 6e 65 77 2e  tbl values (new.
35e0: 61 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 45 4e  a, 0, 0);.    EN
35f0: 44 3b 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74  D;.  }.  do_test
3600: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 34 2d   without_rowid4-
3610: 36 2e 31 61 20 7b 0a 20 20 20 20 65 78 65 63 73  6.1a {.    execs
3620: 71 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e  ql {.      BEGIN
3630: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3640: 4e 54 4f 20 74 62 6c 20 76 61 6c 75 65 73 20 28  NTO tbl values (
3650: 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 20 20  1, 2, 3);.      
3660: 53 45 4c 45 43 54 20 2a 20 66 72 6f 6d 20 74 62  SELECT * from tb
3670: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  l;.    }.  } {1 
3680: 32 20 33 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  2 3}.  do_test w
3690: 69 74 68 6f 75 74 5f 72 6f 77 69 64 34 2d 36 2e  ithout_rowid4-6.
36a0: 31 62 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  1b {.    catchsq
36b0: 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  l {.      INSERT
36c0: 20 4f 52 20 41 42 4f 52 54 20 49 4e 54 4f 20 74   OR ABORT INTO t
36d0: 62 6c 20 76 61 6c 75 65 73 20 28 32 2c 20 32 2c  bl values (2, 2,
36e0: 20 33 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   3);.    }.  } {
36f0: 31 20 7b 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  1 {UNIQUE constr
3700: 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 74 62 6c  aint failed: tbl
3710: 2e 61 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  .a}}.  do_test w
3720: 69 74 68 6f 75 74 5f 72 6f 77 69 64 34 2d 36 2e  ithout_rowid4-6.
3730: 31 63 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  1c {.    execsql
3740: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
3750: 2a 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20 20 20  * from tbl;.    
3760: 7d 0a 20 20 7d 20 7b 31 20 32 20 33 7d 0a 20 20  }.  } {1 2 3}.  
3770: 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
3780: 72 6f 77 69 64 34 2d 36 2e 31 64 20 7b 0a 20 20  rowid4-6.1d {.  
3790: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
37a0: 20 20 20 49 4e 53 45 52 54 20 4f 52 20 46 41 49     INSERT OR FAI
37b0: 4c 20 49 4e 54 4f 20 74 62 6c 20 76 61 6c 75 65  L INTO tbl value
37c0: 73 20 28 32 2c 20 32 2c 20 33 29 3b 0a 20 20 20  s (2, 2, 3);.   
37d0: 20 7d 0a 20 20 7d 20 7b 31 20 7b 55 4e 49 51 55   }.  } {1 {UNIQU
37e0: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  E constraint fai
37f0: 6c 65 64 3a 20 74 62 6c 2e 61 7d 7d 0a 20 20 64  led: tbl.a}}.  d
3800: 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72  o_test without_r
3810: 6f 77 69 64 34 2d 36 2e 31 65 20 7b 0a 20 20 20  owid4-6.1e {.   
3820: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
3830: 20 53 45 4c 45 43 54 20 2a 20 66 72 6f 6d 20 74   SELECT * from t
3840: 62 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31  bl;.    }.  } {1
3850: 20 32 20 33 20 32 20 32 20 33 7d 0a 20 20 64 6f   2 3 2 2 3}.  do
3860: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
3870: 77 69 64 34 2d 36 2e 31 66 20 7b 0a 20 20 20 20  wid4-6.1f {.    
3880: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
3890: 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43  INSERT OR REPLAC
38a0: 45 20 49 4e 54 4f 20 74 62 6c 20 76 61 6c 75 65  E INTO tbl value
38b0: 73 20 28 32 2c 20 32 2c 20 33 29 3b 0a 20 20 20  s (2, 2, 3);.   
38c0: 20 20 20 53 45 4c 45 43 54 20 2a 20 66 72 6f 6d     SELECT * from
38d0: 20 74 62 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 20   tbl;.    }.  } 
38e0: 7b 31 20 32 20 33 20 32 20 30 20 30 7d 0a 20 20  {1 2 3 2 0 0}.  
38f0: 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f  do_test without_
3900: 72 6f 77 69 64 34 2d 36 2e 31 67 20 7b 0a 20 20  rowid4-6.1g {.  
3910: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
3920: 20 20 20 49 4e 53 45 52 54 20 4f 52 20 52 4f 4c     INSERT OR ROL
3930: 4c 42 41 43 4b 20 49 4e 54 4f 20 74 62 6c 20 76  LBACK INTO tbl v
3940: 61 6c 75 65 73 20 28 33 2c 20 32 2c 20 33 29 3b  alues (3, 2, 3);
3950: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b 55  .    }.  } {1 {U
3960: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
3970: 20 66 61 69 6c 65 64 3a 20 74 62 6c 2e 61 7d 7d   failed: tbl.a}}
3980: 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f  .  do_test witho
3990: 75 74 5f 72 6f 77 69 64 34 2d 36 2e 31 68 20 7b  ut_rowid4-6.1h {
39a0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
39b0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 66 72       SELECT * fr
39c0: 6f 6d 20 74 62 6c 3b 0a 20 20 20 20 7d 0a 20 20  om tbl;.    }.  
39d0: 7d 20 7b 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  } {}.  execsql {
39e0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 7d  DELETE FROM tbl}
39f0: 0a 20 20 0a 20 20 0a 20 20 23 20 48 61 6e 64 6c  .  .  .  # Handl
3a00: 69 6e 67 20 6f 66 20 4f 4e 20 43 4f 4e 46 4c 49  ing of ON CONFLI
3a10: 43 54 20 62 79 20 55 50 44 41 54 45 20 73 74 61  CT by UPDATE sta
3a20: 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 20 74  tements inside t
3a30: 72 69 67 67 65 72 73 0a 20 20 65 78 65 63 73 71  riggers.  execsq
3a40: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
3a50: 4e 54 4f 20 74 62 6c 20 76 61 6c 75 65 73 20 28  NTO tbl values (
3a60: 34 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 49 4e  4, 2, 3);.    IN
3a70: 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 76 61  SERT INTO tbl va
3a80: 6c 75 65 73 20 28 36 2c 20 33 2c 20 34 29 3b 0a  lues (6, 3, 4);.
3a90: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
3aa0: 45 52 20 61 75 5f 74 62 6c 20 41 46 54 45 52 20  ER au_tbl AFTER 
3ab0: 55 50 44 41 54 45 20 4f 4e 20 74 62 6c 20 42 45  UPDATE ON tbl BE
3ac0: 47 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45  GIN.      UPDATE
3ad0: 20 4f 52 20 49 47 4e 4f 52 45 20 74 62 6c 20 53   OR IGNORE tbl S
3ae0: 45 54 20 61 20 3d 20 6e 65 77 2e 61 2c 20 63 20  ET a = new.a, c 
3af0: 3d 20 31 30 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  = 10;.    END;. 
3b00: 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74   }.  do_test wit
3b10: 68 6f 75 74 5f 72 6f 77 69 64 34 2d 36 2e 32 61  hout_rowid4-6.2a
3b20: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3b30: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
3b40: 20 20 20 20 55 50 44 41 54 45 20 74 62 6c 20 53      UPDATE tbl S
3b50: 45 54 20 61 20 3d 20 31 20 57 48 45 52 45 20 61  ET a = 1 WHERE a
3b60: 20 3d 20 34 3b 0a 20 20 20 20 20 20 53 45 4c 45   = 4;.      SELE
3b70: 43 54 20 2a 20 66 72 6f 6d 20 74 62 6c 3b 0a 20  CT * from tbl;. 
3b80: 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20 31 30     }.  } {1 2 10
3b90: 20 36 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73   6 3 4}.  do_tes
3ba0: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 34  t without_rowid4
3bb0: 2d 36 2e 32 62 20 7b 0a 20 20 20 20 63 61 74 63  -6.2b {.    catc
3bc0: 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 55 50 44  hsql {.      UPD
3bd0: 41 54 45 20 4f 52 20 41 42 4f 52 54 20 74 62 6c  ATE OR ABORT tbl
3be0: 20 53 45 54 20 61 20 3d 20 34 20 57 48 45 52 45   SET a = 4 WHERE
3bf0: 20 61 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20   a = 1;.    }.  
3c00: 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20 63 6f 6e  } {1 {UNIQUE con
3c10: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20  straint failed: 
3c20: 74 62 6c 2e 61 7d 7d 0a 20 20 64 6f 5f 74 65 73  tbl.a}}.  do_tes
3c30: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 34  t without_rowid4
3c40: 2d 36 2e 32 63 20 7b 0a 20 20 20 20 65 78 65 63  -6.2c {.    exec
3c50: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
3c60: 43 54 20 2a 20 66 72 6f 6d 20 74 62 6c 3b 0a 20  CT * from tbl;. 
3c70: 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20 31 30     }.  } {1 2 10
3c80: 20 36 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73   6 3 4}.  do_tes
3c90: 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 34  t without_rowid4
3ca0: 2d 36 2e 32 64 20 7b 0a 20 20 20 20 63 61 74 63  -6.2d {.    catc
3cb0: 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 55 50 44  hsql {.      UPD
3cc0: 41 54 45 20 4f 52 20 46 41 49 4c 20 74 62 6c 20  ATE OR FAIL tbl 
3cd0: 53 45 54 20 61 20 3d 20 34 20 57 48 45 52 45 20  SET a = 4 WHERE 
3ce0: 61 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  a = 1;.    }.  }
3cf0: 20 7b 31 20 7b 55 4e 49 51 55 45 20 63 6f 6e 73   {1 {UNIQUE cons
3d00: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 74  traint failed: t
3d10: 62 6c 2e 61 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  bl.a}}.  do_test
3d20: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 34 2d   without_rowid4-
3d30: 36 2e 32 65 20 7b 0a 20 20 20 20 65 78 65 63 73  6.2e {.    execs
3d40: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
3d50: 54 20 2a 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20  T * from tbl;.  
3d60: 20 20 7d 0a 20 20 7d 20 7b 34 20 32 20 31 30 20    }.  } {4 2 10 
3d70: 36 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74  6 3 4}.  do_test
3d80: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 34 2d   without_rowid4-
3d90: 36 2e 32 66 2e 31 20 7b 0a 20 20 20 20 65 78 65  6.2f.1 {.    exe
3da0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 55 50 44  csql {.      UPD
3db0: 41 54 45 20 4f 52 20 52 45 50 4c 41 43 45 20 74  ATE OR REPLACE t
3dc0: 62 6c 20 53 45 54 20 61 20 3d 20 31 20 57 48 45  bl SET a = 1 WHE
3dd0: 52 45 20 61 20 3d 20 34 3b 0a 20 20 20 20 20 20  RE a = 4;.      
3de0: 53 45 4c 45 43 54 20 2a 20 66 72 6f 6d 20 74 62  SELECT * from tb
3df0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  l;.    }.  } {1 
3e00: 33 20 31 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20  3 10}.  do_test 
3e10: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 34 2d 36  without_rowid4-6
3e20: 2e 32 66 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  .2f.2 {.    exec
3e30: 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45  sql {.      INSE
3e40: 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55  RT INTO tbl VALU
3e50: 45 53 20 28 32 2c 20 33 2c 20 34 29 3b 0a 20 20  ES (2, 3, 4);.  
3e60: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
3e70: 4d 20 74 62 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  M tbl;.    }.  }
3e80: 20 7b 31 20 33 20 31 30 20 32 20 33 20 34 7d 0a   {1 3 10 2 3 4}.
3e90: 20 20 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75    do_test withou
3ea0: 74 5f 72 6f 77 69 64 34 2d 36 2e 32 67 20 7b 0a  t_rowid4-6.2g {.
3eb0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20      catchsql {. 
3ec0: 20 20 20 20 20 55 50 44 41 54 45 20 4f 52 20 52       UPDATE OR R
3ed0: 4f 4c 4c 42 41 43 4b 20 74 62 6c 20 53 45 54 20  OLLBACK tbl SET 
3ee0: 61 20 3d 20 34 20 57 48 45 52 45 20 61 20 3d 20  a = 4 WHERE a = 
3ef0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  1;.    }.  } {1 
3f00: 7b 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69  {UNIQUE constrai
3f10: 6e 74 20 66 61 69 6c 65 64 3a 20 74 62 6c 2e 61  nt failed: tbl.a
3f20: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 69 74  }}.  do_test wit
3f30: 68 6f 75 74 5f 72 6f 77 69 64 34 2d 36 2e 32 68  hout_rowid4-6.2h
3f40: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3f50: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
3f60: 66 72 6f 6d 20 74 62 6c 3b 0a 20 20 20 20 7d 0a  from tbl;.    }.
3f70: 20 20 7d 20 7b 34 20 32 20 33 20 36 20 33 20 34    } {4 2 3 6 3 4
3f80: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
3f90: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 62 6c    DROP TABLE tbl
3fa0: 3b 0a 20 20 7d 0a 7d 20 3b 20 23 20 69 66 63 61  ;.  }.} ; # ifca
3fb0: 70 61 62 6c 65 20 63 6f 6e 66 6c 69 63 74 0a 0a  pable conflict..
3fc0: 23 20 37 2e 20 54 72 69 67 67 65 72 73 20 6f 6e  # 7. Triggers on
3fd0: 20 76 69 65 77 73 0a 69 66 63 61 70 61 62 6c 65   views.ifcapable
3fe0: 20 76 69 65 77 20 7b 0a 0a 64 6f 5f 74 65 73 74   view {..do_test
3ff0: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 34 2d   without_rowid4-
4000: 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.1 {.  execsql 
4010: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
4020: 20 61 62 28 61 2c 20 62 2c 20 50 52 49 4d 41 52   ab(a, b, PRIMAR
4030: 59 20 4b 45 59 28 61 2c 62 29 29 20 57 49 54 48  Y KEY(a,b)) WITH
4040: 4f 55 54 20 72 6f 77 69 64 3b 0a 20 20 43 52 45  OUT rowid;.  CRE
4050: 41 54 45 20 54 41 42 4c 45 20 63 64 28 63 2c 20  ATE TABLE cd(c, 
4060: 64 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 63  d, PRIMARY KEY(c
4070: 2c 64 29 29 20 57 49 54 48 4f 55 54 20 72 6f 77  ,d)) WITHOUT row
4080: 69 64 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  id;.  INSERT INT
4090: 4f 20 61 62 20 56 41 4c 55 45 53 20 28 31 2c 20  O ab VALUES (1, 
40a0: 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  2);.  INSERT INT
40b0: 4f 20 61 62 20 56 41 4c 55 45 53 20 28 30 2c 20  O ab VALUES (0, 
40c0: 30 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  0);.  INSERT INT
40d0: 4f 20 63 64 20 56 41 4c 55 45 53 20 28 33 2c 20  O cd VALUES (3, 
40e0: 34 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41  4);..  CREATE TA
40f0: 42 4c 45 20 74 6c 6f 67 28 69 69 20 49 4e 54 45  BLE tlog(ii INTE
4100: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
4110: 20 0a 20 20 20 20 20 20 6f 6c 64 61 2c 20 6f 6c   .      olda, ol
4120: 64 62 2c 20 6f 6c 64 63 2c 20 6f 6c 64 64 2c 20  db, oldc, oldd, 
4130: 6e 65 77 61 2c 20 6e 65 77 62 2c 20 6e 65 77 63  newa, newb, newc
4140: 2c 20 6e 65 77 64 29 3b 0a 0a 20 20 43 52 45 41  , newd);..  CREA
4150: 54 45 20 56 49 45 57 20 61 62 63 64 20 41 53 20  TE VIEW abcd AS 
4160: 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 2c 20  SELECT a, b, c, 
4170: 64 20 46 52 4f 4d 20 61 62 2c 20 63 64 3b 0a 0a  d FROM ab, cd;..
4180: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
4190: 20 62 65 66 6f 72 65 5f 75 70 64 61 74 65 20 49   before_update I
41a0: 4e 53 54 45 41 44 20 4f 46 20 55 50 44 41 54 45  NSTEAD OF UPDATE
41b0: 20 4f 4e 20 61 62 63 64 20 42 45 47 49 4e 0a 20   ON abcd BEGIN. 
41c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
41d0: 6c 6f 67 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c  log VALUES(NULL,
41e0: 20 0a 09 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c   ..old.a, old.b,
41f0: 20 6f 6c 64 2e 63 2c 20 6f 6c 64 2e 64 2c 20 6e   old.c, old.d, n
4200: 65 77 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e 65 77  ew.a, new.b, new
4210: 2e 63 2c 20 6e 65 77 2e 64 29 3b 0a 20 20 45 4e  .c, new.d);.  EN
4220: 44 3b 0a 20 20 43 52 45 41 54 45 20 54 52 49 47  D;.  CREATE TRIG
4230: 47 45 52 20 61 66 74 65 72 5f 75 70 64 61 74 65  GER after_update
4240: 20 49 4e 53 54 45 41 44 20 4f 46 20 55 50 44 41   INSTEAD OF UPDA
4250: 54 45 20 4f 4e 20 61 62 63 64 20 42 45 47 49 4e  TE ON abcd BEGIN
4260: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
4270: 20 74 6c 6f 67 20 56 41 4c 55 45 53 28 4e 55 4c   tlog VALUES(NUL
4280: 4c 2c 20 0a 09 6f 6c 64 2e 61 2c 20 6f 6c 64 2e  L, ..old.a, old.
4290: 62 2c 20 6f 6c 64 2e 63 2c 20 6f 6c 64 2e 64 2c  b, old.c, old.d,
42a0: 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e   new.a, new.b, n
42b0: 65 77 2e 63 2c 20 6e 65 77 2e 64 29 3b 0a 20 20  ew.c, new.d);.  
42c0: 45 4e 44 3b 0a 0a 20 20 43 52 45 41 54 45 20 54  END;..  CREATE T
42d0: 52 49 47 47 45 52 20 62 65 66 6f 72 65 5f 64 65  RIGGER before_de
42e0: 6c 65 74 65 20 49 4e 53 54 45 41 44 20 4f 46 20  lete INSTEAD OF 
42f0: 44 45 4c 45 54 45 20 4f 4e 20 61 62 63 64 20 42  DELETE ON abcd B
4300: 45 47 49 4e 0a 20 20 20 20 49 4e 53 45 52 54 20  EGIN.    INSERT 
4310: 49 4e 54 4f 20 74 6c 6f 67 20 56 41 4c 55 45 53  INTO tlog VALUES
4320: 28 4e 55 4c 4c 2c 20 0a 09 6f 6c 64 2e 61 2c 20  (NULL, ..old.a, 
4330: 6f 6c 64 2e 62 2c 20 6f 6c 64 2e 63 2c 20 6f 6c  old.b, old.c, ol
4340: 64 2e 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  d.d, 0, 0, 0, 0)
4350: 3b 0a 20 20 45 4e 44 3b 0a 20 20 43 52 45 41 54  ;.  END;.  CREAT
4360: 45 20 54 52 49 47 47 45 52 20 61 66 74 65 72 5f  E TRIGGER after_
4370: 64 65 6c 65 74 65 20 49 4e 53 54 45 41 44 20 4f  delete INSTEAD O
4380: 46 20 44 45 4c 45 54 45 20 4f 4e 20 61 62 63 64  F DELETE ON abcd
4390: 20 42 45 47 49 4e 0a 20 20 20 20 49 4e 53 45 52   BEGIN.    INSER
43a0: 54 20 49 4e 54 4f 20 74 6c 6f 67 20 56 41 4c 55  T INTO tlog VALU
43b0: 45 53 28 4e 55 4c 4c 2c 20 0a 09 6f 6c 64 2e 61  ES(NULL, ..old.a
43c0: 2c 20 6f 6c 64 2e 62 2c 20 6f 6c 64 2e 63 2c 20  , old.b, old.c, 
43d0: 6f 6c 64 2e 64 2c 20 30 2c 20 30 2c 20 30 2c 20  old.d, 0, 0, 0, 
43e0: 30 29 3b 0a 20 20 45 4e 44 3b 0a 0a 20 20 43 52  0);.  END;..  CR
43f0: 45 41 54 45 20 54 52 49 47 47 45 52 20 62 65 66  EATE TRIGGER bef
4400: 6f 72 65 5f 69 6e 73 65 72 74 20 49 4e 53 54 45  ore_insert INSTE
4410: 41 44 20 4f 46 20 49 4e 53 45 52 54 20 4f 4e 20  AD OF INSERT ON 
4420: 61 62 63 64 20 42 45 47 49 4e 0a 20 20 20 20 49  abcd BEGIN.    I
4430: 4e 53 45 52 54 20 49 4e 54 4f 20 74 6c 6f 67 20  NSERT INTO tlog 
4440: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 0a 09 30  VALUES(NULL, ..0
4450: 2c 20 30 2c 20 30 2c 20 30 2c 20 6e 65 77 2e 61  , 0, 0, 0, new.a
4460: 2c 20 6e 65 77 2e 62 2c 20 6e 65 77 2e 63 2c 20  , new.b, new.c, 
4470: 6e 65 77 2e 64 29 3b 0a 20 20 45 4e 44 3b 0a 20  new.d);.  END;. 
4480: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
4490: 20 61 66 74 65 72 5f 69 6e 73 65 72 74 20 49 4e   after_insert IN
44a0: 53 54 45 41 44 20 4f 46 20 49 4e 53 45 52 54 20  STEAD OF INSERT 
44b0: 4f 4e 20 61 62 63 64 20 42 45 47 49 4e 0a 20 20  ON abcd BEGIN.  
44c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 6c    INSERT INTO tl
44d0: 6f 67 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20  og VALUES(NULL, 
44e0: 0a 09 30 2c 20 30 2c 20 30 2c 20 30 2c 20 6e 65  ..0, 0, 0, 0, ne
44f0: 77 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e 65 77 2e  w.a, new.b, new.
4500: 63 2c 20 6e 65 77 2e 64 29 3b 0a 20 20 20 45 4e  c, new.d);.   EN
4510: 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 3b 0a 0a 64 6f  D;.  }.} {};..do
4520: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
4530: 77 69 64 34 2d 37 2e 32 20 7b 0a 20 20 65 78 65  wid4-7.2 {.  exe
4540: 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
4550: 45 20 61 62 63 64 20 53 45 54 20 61 20 3d 20 31  E abcd SET a = 1
4560: 30 30 2c 20 62 20 3d 20 35 2a 35 20 57 48 45 52  00, b = 5*5 WHER
4570: 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 44 45 4c  E a = 1;.    DEL
4580: 45 54 45 20 46 52 4f 4d 20 61 62 63 64 20 57 48  ETE FROM abcd WH
4590: 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 49  ERE a = 1;.    I
45a0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 64 20  NSERT INTO abcd 
45b0: 56 41 4c 55 45 53 28 31 30 2c 20 32 30 2c 20 33  VALUES(10, 20, 3
45c0: 30 2c 20 34 30 29 3b 0a 20 20 20 20 53 45 4c 45  0, 40);.    SELE
45d0: 43 54 20 2a 20 46 52 4f 4d 20 74 6c 6f 67 3b 0a  CT * FROM tlog;.
45e0: 20 20 7d 0a 7d 20 5b 20 6c 69 73 74 20 31 20 31    }.} [ list 1 1
45f0: 20 32 20 33 20 34 20 31 30 30 20 32 35 20 33 20   2 3 4 100 25 3 
4600: 34 20 5c 0a 20 20 20 20 20 20 20 20 20 32 20 31  4 \.         2 1
4610: 20 32 20 33 20 34 20 31 30 30 20 32 35 20 33 20   2 3 4 100 25 3 
4620: 34 20 5c 0a 09 20 33 20 31 20 32 20 33 20 34 20  4 \.. 3 1 2 3 4 
4630: 30 20 30 20 30 20 30 20 5c 0a 09 20 34 20 31 20  0 0 0 0 \.. 4 1 
4640: 32 20 33 20 34 20 30 20 30 20 30 20 30 20 5c 0a  2 3 4 0 0 0 0 \.
4650: 09 20 35 20 30 20 30 20 30 20 30 20 31 30 20 32  . 5 0 0 0 0 10 2
4660: 30 20 33 30 20 34 30 20 5c 0a 09 20 36 20 30 20  0 30 40 \.. 6 0 
4670: 30 20 30 20 30 20 31 30 20 32 30 20 33 30 20 34  0 0 0 10 20 30 4
4680: 30 20 5d 0a 0a 64 6f 5f 74 65 73 74 20 77 69 74  0 ]..do_test wit
4690: 68 6f 75 74 5f 72 6f 77 69 64 34 2d 37 2e 33 20  hout_rowid4-7.3 
46a0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
46b0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 6c    DELETE FROM tl
46c0: 6f 67 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  og;.    INSERT I
46d0: 4e 54 4f 20 61 62 63 64 20 56 41 4c 55 45 53 28  NTO abcd VALUES(
46e0: 31 30 2c 20 32 30 2c 20 33 30 2c 20 34 30 29 3b  10, 20, 30, 40);
46f0: 0a 20 20 20 20 55 50 44 41 54 45 20 61 62 63 64  .    UPDATE abcd
4700: 20 53 45 54 20 61 20 3d 20 31 30 30 2c 20 62 20   SET a = 100, b 
4710: 3d 20 35 2a 35 20 57 48 45 52 45 20 61 20 3d 20  = 5*5 WHERE a = 
4720: 31 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  1;.    DELETE FR
4730: 4f 4d 20 61 62 63 64 20 57 48 45 52 45 20 61 20  OM abcd WHERE a 
4740: 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  = 1;.    SELECT 
4750: 2a 20 46 52 4f 4d 20 74 6c 6f 67 3b 0a 20 20 7d  * FROM tlog;.  }
4760: 0a 7d 20 5b 20 6c 69 73 74 20 5c 0a 20 20 20 31  .} [ list \.   1
4770: 20 30 20 30 20 30 20 30 20 31 30 20 32 30 20 33   0 0 0 0 10 20 3
4780: 30 20 34 30 20 5c 0a 20 20 20 32 20 30 20 30 20  0 40 \.   2 0 0 
4790: 30 20 30 20 31 30 20 32 30 20 33 30 20 34 30 20  0 0 10 20 30 40 
47a0: 5c 0a 20 20 20 33 20 31 20 32 20 33 20 34 20 31  \.   3 1 2 3 4 1
47b0: 30 30 20 32 35 20 33 20 34 20 5c 0a 20 20 20 34  00 25 3 4 \.   4
47c0: 20 31 20 32 20 33 20 34 20 31 30 30 20 32 35 20   1 2 3 4 100 25 
47d0: 33 20 34 20 5c 0a 20 20 20 35 20 31 20 32 20 33  3 4 \.   5 1 2 3
47e0: 20 34 20 30 20 30 20 30 20 30 20 5c 0a 20 20 20   4 0 0 0 0 \.   
47f0: 36 20 31 20 32 20 33 20 34 20 30 20 30 20 30 20  6 1 2 3 4 0 0 0 
4800: 30 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 77 69  0 \.].do_test wi
4810: 74 68 6f 75 74 5f 72 6f 77 69 64 34 2d 37 2e 34  thout_rowid4-7.4
4820: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4830: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
4840: 6c 6f 67 3b 0a 20 20 20 20 44 45 4c 45 54 45 20  log;.    DELETE 
4850: 46 52 4f 4d 20 61 62 63 64 20 57 48 45 52 45 20  FROM abcd WHERE 
4860: 61 20 3d 20 31 3b 0a 20 20 20 20 49 4e 53 45 52  a = 1;.    INSER
4870: 54 20 49 4e 54 4f 20 61 62 63 64 20 56 41 4c 55  T INTO abcd VALU
4880: 45 53 28 31 30 2c 20 32 30 2c 20 33 30 2c 20 34  ES(10, 20, 30, 4
4890: 30 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20 61  0);.    UPDATE a
48a0: 62 63 64 20 53 45 54 20 61 20 3d 20 31 30 30 2c  bcd SET a = 100,
48b0: 20 62 20 3d 20 35 2a 35 20 57 48 45 52 45 20 61   b = 5*5 WHERE a
48c0: 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45 43 54   = 1;.    SELECT
48d0: 20 2a 20 46 52 4f 4d 20 74 6c 6f 67 3b 0a 20 20   * FROM tlog;.  
48e0: 7d 0a 7d 20 5b 20 6c 69 73 74 20 5c 0a 20 20 20  }.} [ list \.   
48f0: 31 20 31 20 32 20 33 20 34 20 30 20 30 20 30 20  1 1 2 3 4 0 0 0 
4900: 30 20 5c 0a 20 20 20 32 20 31 20 32 20 33 20 34  0 \.   2 1 2 3 4
4910: 20 30 20 30 20 30 20 30 20 5c 0a 20 20 20 33 20   0 0 0 0 \.   3 
4920: 30 20 30 20 30 20 30 20 31 30 20 32 30 20 33 30  0 0 0 0 10 20 30
4930: 20 34 30 20 5c 0a 20 20 20 34 20 30 20 30 20 30   40 \.   4 0 0 0
4940: 20 30 20 31 30 20 32 30 20 33 30 20 34 30 20 5c   0 10 20 30 40 \
4950: 0a 20 20 20 35 20 31 20 32 20 33 20 34 20 31 30  .   5 1 2 3 4 10
4960: 30 20 32 35 20 33 20 34 20 5c 0a 20 20 20 36 20  0 25 3 4 \.   6 
4970: 31 20 32 20 33 20 34 20 31 30 30 20 32 35 20 33  1 2 3 4 100 25 3
4980: 20 34 20 5c 0a 5d 0a 0a 64 6f 5f 74 65 73 74 20   4 \.]..do_test 
4990: 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 34 2d 38  without_rowid4-8
49a0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
49b0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
49c0: 45 20 74 31 28 61 2c 62 2c 63 2c 20 50 52 49 4d  E t1(a,b,c, PRIM
49d0: 41 52 59 20 4b 45 59 28 61 2c 62 2c 63 29 29 20  ARY KEY(a,b,c)) 
49e0: 57 49 54 48 4f 55 54 20 72 6f 77 69 64 3b 0a 20  WITHOUT rowid;. 
49f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4a00: 31 20 56 41 4c 55 45 53 28 31 2c 32 2c 33 29 3b  1 VALUES(1,2,3);
4a10: 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57  .    CREATE VIEW
4a20: 20 76 31 20 41 53 0a 20 20 20 20 20 20 53 45 4c   v1 AS.      SEL
4a30: 45 43 54 20 61 2b 62 20 41 53 20 78 2c 20 62 2b  ECT a+b AS x, b+
4a40: 63 20 41 53 20 79 2c 20 61 2b 63 20 41 53 20 7a  c AS y, a+c AS z
4a50: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53 45   FROM t1;.    SE
4a60: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 76 31 3b 0a  LECT * FROM v1;.
4a70: 20 20 7d 0a 7d 20 7b 33 20 35 20 34 7d 0a 64 6f    }.} {3 5 4}.do
4a80: 5f 74 65 73 74 20 77 69 74 68 6f 75 74 5f 72 6f  _test without_ro
4a90: 77 69 64 34 2d 38 2e 32 20 7b 0a 20 20 65 78 65  wid4-8.2 {.  exe
4aa0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
4ab0: 45 20 54 41 42 4c 45 20 76 31 6c 6f 67 28 61 2c  E TABLE v1log(a,
4ac0: 62 2c 63 2c 64 2c 65 2c 66 29 3b 0a 20 20 20 20  b,c,d,e,f);.    
4ad0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 72  CREATE TRIGGER r
4ae0: 31 20 49 4e 53 54 45 41 44 20 4f 46 20 44 45 4c  1 INSTEAD OF DEL
4af0: 45 54 45 20 4f 4e 20 76 31 20 42 45 47 49 4e 0a  ETE ON v1 BEGIN.
4b00: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4b10: 4f 20 76 31 6c 6f 67 20 56 41 4c 55 45 53 28 4f  O v1log VALUES(O
4b20: 4c 44 2e 78 2c 4e 55 4c 4c 2c 4f 4c 44 2e 79 2c  LD.x,NULL,OLD.y,
4b30: 4e 55 4c 4c 2c 4f 4c 44 2e 7a 2c 4e 55 4c 4c 29  NULL,OLD.z,NULL)
4b40: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 44  ;.    END;.    D
4b50: 45 4c 45 54 45 20 46 52 4f 4d 20 76 31 20 57 48  ELETE FROM v1 WH
4b60: 45 52 45 20 78 3d 31 3b 0a 20 20 20 20 53 45 4c  ERE x=1;.    SEL
4b70: 45 43 54 20 2a 20 46 52 4f 4d 20 76 31 6c 6f 67  ECT * FROM v1log
4b80: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
4b90: 73 74 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  st without_rowid
4ba0: 34 2d 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  4-8.3 {.  execsq
4bb0: 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
4bc0: 52 4f 4d 20 76 31 20 57 48 45 52 45 20 78 3d 33  ROM v1 WHERE x=3
4bd0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
4be0: 52 4f 4d 20 76 31 6c 6f 67 3b 0a 20 20 7d 0a 7d  ROM v1log;.  }.}
4bf0: 20 7b 33 20 7b 7d 20 35 20 7b 7d 20 34 20 7b 7d   {3 {} 5 {} 4 {}
4c00: 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75  }.do_test withou
4c10: 74 5f 72 6f 77 69 64 34 2d 38 2e 34 20 7b 0a 20  t_rowid4-8.4 {. 
4c20: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
4c30: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4c40: 4c 55 45 53 28 34 2c 35 2c 36 29 3b 0a 20 20 20  LUES(4,5,6);.   
4c50: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 76 31 6c   DELETE FROM v1l
4c60: 6f 67 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  og;.    DELETE F
4c70: 52 4f 4d 20 76 31 20 57 48 45 52 45 20 79 3d 31  ROM v1 WHERE y=1
4c80: 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  1;.    SELECT * 
4c90: 46 52 4f 4d 20 76 31 6c 6f 67 3b 0a 20 20 7d 0a  FROM v1log;.  }.
4ca0: 7d 20 7b 39 20 7b 7d 20 31 31 20 7b 7d 20 31 30  } {9 {} 11 {} 10
4cb0: 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 69 74   {}}.do_test wit
4cc0: 68 6f 75 74 5f 72 6f 77 69 64 34 2d 38 2e 35 20  hout_rowid4-8.5 
4cd0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
4ce0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
4cf0: 20 72 32 20 49 4e 53 54 45 41 44 20 4f 46 20 49   r2 INSTEAD OF I
4d00: 4e 53 45 52 54 20 4f 4e 20 76 31 20 42 45 47 49  NSERT ON v1 BEGI
4d10: 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  N.      INSERT I
4d20: 4e 54 4f 20 76 31 6c 6f 67 20 56 41 4c 55 45 53  NTO v1log VALUES
4d30: 28 4e 55 4c 4c 2c 4e 45 57 2e 78 2c 4e 55 4c 4c  (NULL,NEW.x,NULL
4d40: 2c 4e 45 57 2e 79 2c 4e 55 4c 4c 2c 4e 45 57 2e  ,NEW.y,NULL,NEW.
4d50: 7a 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20  z);.    END;.   
4d60: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 76 31 6c   DELETE FROM v1l
4d70: 6f 67 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  og;.    INSERT I
4d80: 4e 54 4f 20 76 31 20 56 41 4c 55 45 53 28 31 2c  NTO v1 VALUES(1,
4d90: 32 2c 33 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  2,3);.    SELECT
4da0: 20 2a 20 46 52 4f 4d 20 76 31 6c 6f 67 3b 0a 20   * FROM v1log;. 
4db0: 20 7d 0a 7d 20 7b 7b 7d 20 31 20 7b 7d 20 32 20   }.} {{} 1 {} 2 
4dc0: 7b 7d 20 33 7d 0a 64 6f 5f 74 65 73 74 20 77 69  {} 3}.do_test wi
4dd0: 74 68 6f 75 74 5f 72 6f 77 69 64 34 2d 38 2e 36  thout_rowid4-8.6
4de0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4df0: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
4e00: 52 20 72 33 20 49 4e 53 54 45 41 44 20 4f 46 20  R r3 INSTEAD OF 
4e10: 55 50 44 41 54 45 20 4f 4e 20 76 31 20 42 45 47  UPDATE ON v1 BEG
4e20: 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  IN.      INSERT 
4e30: 49 4e 54 4f 20 76 31 6c 6f 67 20 56 41 4c 55 45  INTO v1log VALUE
4e40: 53 28 4f 4c 44 2e 78 2c 4e 45 57 2e 78 2c 4f 4c  S(OLD.x,NEW.x,OL
4e50: 44 2e 79 2c 4e 45 57 2e 79 2c 4f 4c 44 2e 7a 2c  D.y,NEW.y,OLD.z,
4e60: 4e 45 57 2e 7a 29 3b 0a 20 20 20 20 45 4e 44 3b  NEW.z);.    END;
4e70: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
4e80: 20 76 31 6c 6f 67 3b 0a 20 20 20 20 55 50 44 41   v1log;.    UPDA
4e90: 54 45 20 76 31 20 53 45 54 20 78 3d 78 2b 31 30  TE v1 SET x=x+10
4ea0: 30 2c 20 79 3d 79 2b 32 30 30 2c 20 7a 3d 7a 2b  0, y=y+200, z=z+
4eb0: 33 30 30 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  300;.    SELECT 
4ec0: 2a 20 46 52 4f 4d 20 76 31 6c 6f 67 3b 0a 20 20  * FROM v1log;.  
4ed0: 7d 0a 7d 20 7b 33 20 31 30 33 20 35 20 32 30 35  }.} {3 103 5 205
4ee0: 20 34 20 33 30 34 20 39 20 31 30 39 20 31 31 20   4 304 9 109 11 
4ef0: 32 31 31 20 31 30 20 33 31 30 7d 0a 0a 23 20 41  211 10 310}..# A
4f00: 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20  t one point the 
4f10: 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 73 20 63 61  following was ca
4f20: 75 73 69 6e 67 20 61 20 73 65 67 66 61 75 6c 74  using a segfault
4f30: 2e 0a 64 6f 5f 74 65 73 74 20 77 69 74 68 6f 75  ..do_test withou
4f40: 74 5f 72 6f 77 69 64 34 2d 39 2e 31 20 7b 0a 20  t_rowid4-9.1 {. 
4f50: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
4f60: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
4f70: 20 54 45 58 54 2c 20 62 20 54 45 58 54 29 3b 0a   TEXT, b TEXT);.
4f80: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
4f90: 76 33 20 41 53 20 53 45 4c 45 43 54 20 74 33 2e  v3 AS SELECT t3.
4fa0: 61 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 43  a FROM t3;.    C
4fb0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72  REATE TRIGGER tr
4fc0: 69 67 31 20 49 4e 53 54 45 41 44 20 4f 46 20 44  ig1 INSTEAD OF D
4fd0: 45 4c 45 54 45 20 4f 4e 20 76 33 20 42 45 47 49  ELETE ON v3 BEGI
4fe0: 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 31  N.      SELECT 1
4ff0: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 44  ;.    END;.    D
5000: 45 4c 45 54 45 20 46 52 4f 4d 20 76 33 20 57 48  ELETE FROM v3 WH
5010: 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 7d 0a 7d  ERE a = 1;.  }.}
5020: 20 7b 7d 0a 0a 7d 20 3b 23 20 69 66 63 61 70 61   {}..} ;# ifcapa
5030: 62 6c 65 20 76 69 65 77 0a 0a 69 6e 74 65 67 72  ble view..integr
5040: 69 74 79 5f 63 68 65 63 6b 20 77 69 74 68 6f 75  ity_check withou
5050: 74 5f 72 6f 77 69 64 34 2d 39 2e 39 0a 0a 66 69  t_rowid4-9.9..fi
5060: 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.