/ Hex Artifact Content
Login

Artifact 76201cfcba801d02d13600700f26ab64313d1826:


0000: 23 20 32 30 30 34 20 4a 61 6e 20 31 34 0a 23 0a  # 2004 Jan 14.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou give..#.#****
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c 65 20  ***.# This file 
0170: 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72 65  implements regre
0180: 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72 20  ssion tests for 
0190: 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 74 6f  TCL interface to
01a0: 20 74 68 65 0a 23 20 53 51 4c 69 74 65 20 6c 69   the.# SQLite li
01b0: 62 72 61 72 79 2e 20 0a 23 0a 23 20 54 68 65 20  brary. .#.# The 
01c0: 66 6f 63 75 73 20 6f 66 20 74 68 65 20 74 65 73  focus of the tes
01d0: 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  ts in this file 
01e0: 69 73 20 74 68 65 20 20 66 6f 6c 6c 6f 77 69 6e  is the  followin
01f0: 67 20 69 6e 74 65 72 66 61 63 65 3a 0a 23 0a 23  g interface:.#.#
0200: 20 20 20 20 20 20 73 71 6c 69 74 65 5f 63 6f 6d        sqlite_com
0210: 6d 69 74 5f 68 6f 6f 6b 20 20 20 20 28 74 65 73  mit_hook    (tes
0220: 74 73 20 68 6f 6f 6b 2d 31 2e 2e 68 6f 6f 6b 2d  ts hook-1..hook-
0230: 33 20 69 6e 63 6c 75 73 69 76 65 29 0a 23 20 20  3 inclusive).#  
0240: 20 20 20 20 73 71 6c 69 74 65 5f 75 70 64 61 74      sqlite_updat
0250: 65 5f 68 6f 6f 6b 20 20 20 20 28 74 65 73 74 73  e_hook    (tests
0260: 20 68 6f 6f 6b 2d 34 2d 2a 29 0a 23 20 20 20 20   hook-4-*).#    
0270: 20 20 73 71 6c 69 74 65 5f 72 6f 6c 6c 62 61 63    sqlite_rollbac
0280: 6b 5f 68 6f 6f 6b 20 20 28 74 65 73 74 73 20 68  k_hook  (tests h
0290: 6f 6f 6b 2d 35 2e 2a 29 0a 23 0a 23 20 24 49 64  ook-5.*).#.# $Id
02a0: 3a 20 68 6f 6f 6b 2e 74 65 73 74 2c 76 20 31 2e  : hook.test,v 1.
02b0: 31 35 20 32 30 30 39 2f 30 34 2f 30 37 20 31 34  15 2009/04/07 14
02c0: 3a 31 34 3a 32 33 20 64 61 6e 69 65 6c 6b 31 39  :14:23 danielk19
02d0: 37 37 20 45 78 70 20 24 0a 0a 73 65 74 20 74 65  77 Exp $..set te
02e0: 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e  stdir [file dirn
02f0: 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72  ame $argv0].sour
0300: 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74  ce $testdir/test
0310: 65 72 2e 74 63 6c 0a 73 65 74 20 3a 3a 74 65 73  er.tcl.set ::tes
0320: 74 70 72 65 66 69 78 20 68 6f 6f 6b 0a 0a 64 6f  tprefix hook..do
0330: 5f 74 65 73 74 20 68 6f 6f 6b 2d 31 2e 32 20 7b  _test hook-1.2 {
0340: 0a 20 20 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f  .  db commit_hoo
0350: 6b 0a 7d 20 7b 7d 0a 0a 0a 64 6f 5f 74 65 73 74  k.} {}...do_test
0360: 20 68 6f 6f 6b 2d 33 2e 31 20 7b 0a 20 20 73 65   hook-3.1 {.  se
0370: 74 20 63 6f 6d 6d 69 74 5f 63 6e 74 20 30 0a 20  t commit_cnt 0. 
0380: 20 70 72 6f 63 20 63 6f 6d 6d 69 74 5f 68 6f 6f   proc commit_hoo
0390: 6b 20 7b 7d 20 7b 0a 20 20 20 20 69 6e 63 72 20  k {} {.    incr 
03a0: 3a 3a 63 6f 6d 6d 69 74 5f 63 6e 74 0a 20 20 20  ::commit_cnt.   
03b0: 20 72 65 74 75 72 6e 20 30 0a 20 20 7d 0a 20 20   return 0.  }.  
03c0: 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3a  db commit_hook :
03d0: 3a 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 0a 20 20 64  :commit_hook.  d
03e0: 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 0a 7d 20  b commit_hook.} 
03f0: 7b 3a 3a 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 7d 0a  {::commit_hook}.
0400: 64 6f 5f 74 65 73 74 20 68 6f 6f 6b 2d 33 2e 32  do_test hook-3.2
0410: 20 7b 0a 20 20 73 65 74 20 63 6f 6d 6d 69 74 5f   {.  set commit_
0420: 63 6e 74 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73  cnt.} {0}.do_tes
0430: 74 20 68 6f 6f 6b 2d 33 2e 33 20 7b 0a 20 20 65  t hook-3.3 {.  e
0440: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
0450: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 62  ATE TABLE t2(a,b
0460: 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 63 6f 6d  );.  }.  set com
0470: 6d 69 74 5f 63 6e 74 0a 7d 20 7b 31 7d 0a 64 6f  mit_cnt.} {1}.do
0480: 5f 74 65 73 74 20 68 6f 6f 6b 2d 33 2e 34 20 7b  _test hook-3.4 {
0490: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
04a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
04b0: 56 41 4c 55 45 53 28 31 2c 32 29 3b 0a 20 20 20  VALUES(1,2);.   
04c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
04d0: 53 45 4c 45 43 54 20 61 2b 31 2c 20 62 2b 31 20  SELECT a+1, b+1 
04e0: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53  FROM t2;.    INS
04f0: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
0500: 43 54 20 61 2b 32 2c 20 62 2b 32 20 46 52 4f 4d  CT a+2, b+2 FROM
0510: 20 74 32 3b 0a 20 20 7d 0a 20 20 73 65 74 20 63   t2;.  }.  set c
0520: 6f 6d 6d 69 74 5f 63 6e 74 0a 7d 20 7b 34 7d 0a  ommit_cnt.} {4}.
0530: 64 6f 5f 74 65 73 74 20 68 6f 6f 6b 2d 33 2e 35  do_test hook-3.5
0540: 20 7b 0a 20 20 73 65 74 20 63 6f 6d 6d 69 74 5f   {.  set commit_
0550: 63 6e 74 20 7b 7d 0a 20 20 70 72 6f 63 20 63 6f  cnt {}.  proc co
0560: 6d 6d 69 74 5f 68 6f 6f 6b 20 7b 7d 20 7b 0a 20  mmit_hook {} {. 
0570: 20 20 20 73 65 74 20 3a 3a 63 6f 6d 6d 69 74 5f     set ::commit_
0580: 63 6e 74 20 5b 65 78 65 63 73 71 6c 20 7b 53 45  cnt [execsql {SE
0590: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 5d  LECT * FROM t2}]
05a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 0a 20 20  .    return 0.  
05b0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
05c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
05d0: 20 56 41 4c 55 45 53 28 35 2c 36 29 3b 0a 20 20   VALUES(5,6);.  
05e0: 7d 0a 20 20 73 65 74 20 63 6f 6d 6d 69 74 5f 63  }.  set commit_c
05f0: 6e 74 0a 7d 20 7b 31 20 32 20 32 20 33 20 33 20  nt.} {1 2 2 3 3 
0600: 34 20 34 20 35 20 35 20 36 7d 0a 64 6f 5f 74 65  4 4 5 5 6}.do_te
0610: 73 74 20 68 6f 6f 6b 2d 33 2e 36 20 7b 0a 20 20  st hook-3.6 {.  
0620: 73 65 74 20 63 6f 6d 6d 69 74 5f 63 6e 74 20 7b  set commit_cnt {
0630: 7d 0a 20 20 70 72 6f 63 20 63 6f 6d 6d 69 74 5f  }.  proc commit_
0640: 68 6f 6f 6b 20 7b 7d 20 7b 0a 20 20 20 20 73 65  hook {} {.    se
0650: 74 20 3a 3a 63 6f 6d 6d 69 74 5f 63 6e 74 20 5b  t ::commit_cnt [
0660: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
0670: 2a 20 46 52 4f 4d 20 74 32 7d 5d 20 0a 20 20 20  * FROM t2}] .   
0680: 20 72 65 74 75 72 6e 20 31 0a 20 20 7d 0a 20 20   return 1.  }.  
0690: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49  catchsql {.    I
06a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
06b0: 4c 55 45 53 28 36 2c 37 29 3b 0a 20 20 7d 0a 7d  LUES(6,7);.  }.}
06c0: 20 7b 31 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20   {1 {constraint 
06d0: 66 61 69 6c 65 64 7d 7d 0a 76 65 72 69 66 79 5f  failed}}.verify_
06e0: 65 78 5f 65 72 72 63 6f 64 65 20 68 6f 6f 6b 2d  ex_errcode hook-
06f0: 33 2e 36 62 20 53 51 4c 49 54 45 5f 43 4f 4e 53  3.6b SQLITE_CONS
0700: 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
0710: 4b 0a 64 6f 5f 74 65 73 74 20 68 6f 6f 6b 2d 33  K.do_test hook-3
0720: 2e 37 20 7b 0a 20 20 73 65 74 20 3a 3a 63 6f 6d  .7 {.  set ::com
0730: 6d 69 74 5f 63 6e 74 0a 7d 20 7b 31 20 32 20 32  mit_cnt.} {1 2 2
0740: 20 33 20 33 20 34 20 34 20 35 20 35 20 36 20 36   3 3 4 4 5 5 6 6
0750: 20 37 7d 0a 64 6f 5f 74 65 73 74 20 68 6f 6f 6b   7}.do_test hook
0760: 2d 33 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c  -3.8 {.  execsql
0770: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
0780: 74 32 7d 0a 7d 20 7b 31 20 32 20 32 20 33 20 33  t2}.} {1 2 2 3 3
0790: 20 34 20 34 20 35 20 35 20 36 7d 0a 0a 23 20 54   4 4 5 5 6}..# T
07a0: 65 73 74 20 74 75 72 6e 6e 69 6e 67 20 6f 66 66  est turnning off
07b0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
07c0: 0a 23 0a 64 6f 5f 74 65 73 74 20 68 6f 6f 6b 2d  .#.do_test hook-
07d0: 33 2e 39 20 7b 0a 20 20 64 62 20 63 6f 6d 6d 69  3.9 {.  db commi
07e0: 74 5f 68 6f 6f 6b 20 7b 7d 0a 20 20 73 65 74 20  t_hook {}.  set 
07f0: 3a 3a 63 6f 6d 6d 69 74 5f 63 6e 74 20 7b 7d 0a  ::commit_cnt {}.
0800: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0810: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
0820: 41 4c 55 45 53 28 37 2c 38 29 3b 0a 20 20 7d 0a  ALUES(7,8);.  }.
0830: 20 20 73 65 74 20 3a 3a 63 6f 6d 6d 69 74 5f 63    set ::commit_c
0840: 6e 74 0a 7d 20 7b 7d 0a 0a 23 20 54 69 63 6b 65  nt.} {}..# Ticke
0850: 74 20 23 33 35 36 34 2e 0a 23 0a 64 6f 5f 74 65  t #3564..#.do_te
0860: 73 74 20 68 6f 6f 6b 2d 33 2e 31 30 20 7b 0a 20  st hook-3.10 {. 
0870: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73   forcedelete tes
0880: 74 32 2e 64 62 20 74 65 73 74 32 2e 64 62 2d 6a  t2.db test2.db-j
0890: 6f 75 72 6e 61 6c 0a 20 20 73 71 6c 69 74 65 33  ournal.  sqlite3
08a0: 20 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20   db2 test2.db.  
08b0: 70 72 6f 63 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  proc commit_hook
08c0: 20 7b 7d 20 7b 0a 20 20 20 20 73 65 74 20 79 20   {} {.    set y 
08d0: 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54  [db2 one {SELECT
08e0: 20 79 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45   y FROM t3 WHERE
08f0: 20 79 3e 31 30 7d 5d 0a 20 20 20 20 72 65 74 75   y>10}].    retu
0900: 72 6e 20 5b 65 78 70 72 20 7b 24 79 3e 31 30 7d  rn [expr {$y>10}
0910: 5d 0a 20 20 7d 0a 20 20 64 62 32 20 65 76 61 6c  ].  }.  db2 eval
0920: 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   {CREATE TABLE t
0930: 33 28 78 2c 79 29 7d 0a 20 20 64 62 32 20 63 6f  3(x,y)}.  db2 co
0940: 6d 6d 69 74 5f 68 6f 6f 6b 20 63 6f 6d 6d 69 74  mmit_hook commit
0950: 5f 68 6f 6f 6b 0a 20 20 63 61 74 63 68 73 71 6c  _hook.  catchsql
0960: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33   {INSERT INTO t3
0970: 20 56 41 4c 55 45 53 28 31 2c 32 29 7d 20 64 62   VALUES(1,2)} db
0980: 32 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 49 4e  2.  catchsql {IN
0990: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
09a0: 55 45 53 28 31 31 2c 31 32 29 7d 20 64 62 32 0a  UES(11,12)} db2.
09b0: 20 20 63 61 74 63 68 73 71 6c 20 7b 49 4e 53 45    catchsql {INSE
09c0: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
09d0: 53 28 33 2c 34 29 7d 20 64 62 32 0a 20 20 64 62  S(3,4)} db2.  db
09e0: 32 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c  2 eval {.    SEL
09f0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 4f 52  ECT * FROM t3 OR
0a00: 44 45 52 20 42 59 20 78 3b 0a 20 20 7d 0a 7d 20  DER BY x;.  }.} 
0a10: 7b 31 20 32 20 33 20 34 7d 0a 64 62 32 20 63 6c  {1 2 3 4}.db2 cl
0a20: 6f 73 65 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ose...#---------
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a70: 2d 2d 2d 0a 23 20 54 65 73 74 73 20 66 6f 72 20  ---.# Tests for 
0a80: 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 2e  the update-hook.
0a90: 0a 23 0a 23 20 34 2e 31 2e 2a 20 2d 20 56 65 72  .#.# 4.1.* - Ver
0aa0: 79 20 73 69 6d 70 6c 65 20 74 65 73 74 73 2e 20  y simple tests. 
0ab0: 54 65 73 74 20 74 68 61 74 20 74 68 65 20 75 70  Test that the up
0ac0: 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76  date hook is inv
0ad0: 6f 6b 65 64 20 63 6f 72 72 65 63 74 6c 79 20 0a  oked correctly .
0ae0: 23 20 20 20 20 20 20 20 20 20 66 6f 72 20 49 4e  #         for IN
0af0: 53 45 52 54 2c 20 44 45 4c 45 54 45 20 61 6e 64  SERT, DELETE and
0b00: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
0b10: 74 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 44 45  ts, including DE
0b20: 4c 45 54 45 20 0a 23 20 20 20 20 20 20 20 20 20  LETE .#         
0b30: 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68 20  statements with 
0b40: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
0b50: 0a 23 20 34 2e 32 2e 2a 20 2d 20 43 68 65 63 6b  .# 4.2.* - Check
0b60: 20 74 68 61 74 20 74 68 65 20 75 70 64 61 74 65   that the update
0b70: 2d 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64  -hook is invoked
0b80: 20 66 6f 72 20 72 6f 77 73 20 6d 6f 64 69 66 69   for rows modifi
0b90: 65 64 20 62 79 20 74 72 69 67 67 65 72 0a 23 20  ed by trigger.# 
0ba0: 20 20 20 20 20 20 20 20 62 6f 64 69 65 73 2e 20          bodies. 
0bb0: 41 6c 73 6f 20 74 68 61 74 20 74 68 65 20 64 61  Also that the da
0bc0: 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 63  tabase name is c
0bd0: 6f 72 72 65 63 74 6c 79 20 72 65 70 6f 72 74 65  orrectly reporte
0be0: 64 20 77 68 65 6e 20 0a 23 20 20 20 20 20 20 20  d when .#       
0bf0: 20 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61    an attached da
0c00: 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69  tabase is modifi
0c10: 65 64 2e 0a 23 20 34 2e 33 2e 2a 20 2d 20 44 6f  ed..# 4.3.* - Do
0c20: 20 73 6f 6d 65 20 73 6f 72 74 69 6e 67 2c 20 67   some sorting, g
0c30: 72 6f 75 70 69 6e 67 2c 20 63 6f 6d 70 6f 75 6e  rouping, compoun
0c40: 64 20 71 75 65 72 69 65 73 2c 20 70 6f 70 75 6c  d queries, popul
0c50: 61 74 69 6f 6e 20 61 6e 64 20 0a 23 20 20 20 20  ation and .#    
0c60: 20 20 20 20 20 64 65 70 6f 70 75 6c 61 74 69 6f       depopulatio
0c70: 6e 20 6f 66 20 69 6e 64 69 63 65 73 2c 20 74 6f  n of indices, to
0c80: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 75   make sure the u
0c90: 70 64 61 74 65 2d 68 6f 6f 6b 20 69 73 20 6e 6f  pdate-hook is no
0ca0: 74 20 0a 23 20 20 20 20 20 20 20 20 20 69 6e 76  t .#         inv
0cb0: 6f 6b 65 64 20 69 6e 63 6f 72 72 65 63 74 6c 79  oked incorrectly
0cc0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
0cd0: 46 3a 20 52 2d 32 31 39 39 39 2d 34 35 31 32 32  F: R-21999-45122
0ce0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 75 70 64   The sqlite3_upd
0cf0: 61 74 65 5f 68 6f 6f 6b 28 29 20 69 6e 74 65 72  ate_hook() inter
0d00: 66 61 63 65 0a 23 20 72 65 67 69 73 74 65 72 73  face.# registers
0d10: 20 61 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63   a callback func
0d20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 64 61  tion with the da
0d30: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
0d40: 6e 20 69 64 65 6e 74 69 66 69 65 64 0a 23 20 62  n identified.# b
0d50: 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  y the first argu
0d60: 6d 65 6e 74 20 74 6f 20 62 65 20 69 6e 76 6f 6b  ment to be invok
0d70: 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  ed whenever a ro
0d80: 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 23 20  w is updated,.# 
0d90: 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65  inserted or dele
0da0: 74 65 64 20 69 6e 20 61 20 72 6f 77 69 64 20 74  ted in a rowid t
0db0: 61 62 6c 65 2e 0a 0a 23 20 53 69 6d 70 6c 65 20  able...# Simple 
0dc0: 74 65 73 74 73 0a 64 6f 5f 74 65 73 74 20 68 6f  tests.do_test ho
0dd0: 6f 6b 2d 34 2e 31 2e 31 61 20 7b 0a 20 20 63 61  ok-4.1.1a {.  ca
0de0: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  tchsql {.    DRO
0df0: 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 7d 0a  P TABLE t1;.  }.
0e00: 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
0e10: 61 69 6e 20 3a 3a 75 70 64 61 74 65 5f 68 6f 6f  ain ::update_hoo
0e20: 6b 0a 20 20 73 65 74 20 3a 3a 75 70 64 61 74 65  k.  set ::update
0e30: 5f 68 6f 6f 6b 20 7b 7d 0a 20 20 64 62 20 75 70  _hook {}.  db up
0e40: 64 61 74 65 5f 68 6f 6f 6b 20 5b 6c 69 73 74 20  date_hook [list 
0e50: 6c 61 70 70 65 6e 64 20 3a 3a 75 70 64 61 74 65  lappend ::update
0e60: 5f 68 6f 6f 6b 5d 0a 20 20 23 0a 20 20 23 20 45  _hook].  #.  # E
0e70: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32  VIDENCE-OF: R-52
0e80: 32 32 33 2d 32 37 32 37 35 20 54 68 65 20 75 70  223-27275 The up
0e90: 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 6e 6f 74  date hook is not
0ea0: 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 0a 20 20   invoked when.  
0eb0: 23 20 69 6e 74 65 72 6e 61 6c 20 73 79 73 74 65  # internal syste
0ec0: 6d 20 74 61 62 6c 65 73 20 61 72 65 20 6d 6f 64  m tables are mod
0ed0: 69 66 69 65 64 20 28 69 2e 65 2e 20 73 71 6c 69  ified (i.e. sqli
0ee0: 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 0a 20 20  te_master and.  
0ef0: 23 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  # sqlite_sequenc
0f00: 65 29 2e 0a 20 20 23 0a 20 20 65 78 65 63 73 71  e)..  #.  execsq
0f10: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
0f20: 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45  ABLE t1(a INTEGE
0f30: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
0f40: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
0f50: 42 4c 45 20 74 31 77 28 61 20 49 4e 54 20 50 52  BLE t1w(a INT PR
0f60: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 20 57 49  IMARY KEY, b) WI
0f70: 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 20 20 7d  THOUT ROWID;.  }
0f80: 0a 20 20 73 65 74 20 3a 3a 75 70 64 61 74 65 5f  .  set ::update_
0f90: 68 6f 6f 6b 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  hook.} {}.do_tes
0fa0: 74 20 68 6f 6f 6b 2d 34 2e 31 2e 31 62 20 7b 0a  t hook-4.1.1b {.
0fb0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0fc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0fd0: 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b  ALUES(1, 'one');
0fe0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0ff0: 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27 74   t1 VALUES(2, 't
1000: 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  wo');.    INSERT
1010: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1020: 33 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20 20  3, 'three');.   
1030: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 77   INSERT INTO t1w
1040: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1050: 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 45  1;.  }.} {}..# E
1060: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35  VIDENCE-OF: R-15
1070: 35 30 36 2d 35 37 36 36 36 20 54 68 65 20 73 65  506-57666 The se
1080: 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b 20 61 72  cond callback ar
1090: 67 75 6d 65 6e 74 20 69 73 20 6f 6e 65 20 6f 66  gument is one of
10a0: 0a 23 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  .# SQLITE_INSERT
10b0: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
10c0: 20 6f 72 20 53 51 4c 49 54 45 5f 55 50 44 41 54   or SQLITE_UPDAT
10d0: 45 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  E, depending on 
10e0: 74 68 65 0a 23 20 6f 70 65 72 61 74 69 6f 6e 20  the.# operation 
10f0: 74 68 61 74 20 63 61 75 73 65 64 20 74 68 65 20  that caused the 
1100: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
1110: 6e 76 6f 6b 65 64 2e 0a 23 0a 23 20 45 56 49 44  nvoked..#.# EVID
1120: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 32 31 33  ENCE-OF: R-29213
1130: 2d 36 31 31 39 35 20 54 68 65 20 74 68 69 72 64  -61195 The third
1140: 20 61 6e 64 20 66 6f 75 72 74 68 20 61 72 67 75   and fourth argu
1150: 6d 65 6e 74 73 20 74 6f 20 74 68 65 0a 23 20 63  ments to the.# c
1160: 61 6c 6c 62 61 63 6b 20 63 6f 6e 74 61 69 6e 20  allback contain 
1170: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20  pointers to the 
1180: 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 61 62  database and tab
1190: 6c 65 20 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 69  le name containi
11a0: 6e 67 0a 23 20 74 68 65 20 61 66 66 65 63 74 65  ng.# the affecte
11b0: 64 20 72 6f 77 2e 0a 23 0a 23 20 45 56 49 44 45  d row..#.# EVIDE
11c0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 38 30 39 2d  NCE-OF: R-30809-
11d0: 35 37 38 31 32 20 54 68 65 20 66 69 6e 61 6c 20  57812 The final 
11e0: 63 61 6c 6c 62 61 63 6b 20 70 61 72 61 6d 65 74  callback paramet
11f0: 65 72 20 69 73 20 74 68 65 20 72 6f 77 69 64 0a  er is the rowid.
1200: 23 20 6f 66 20 74 68 65 20 72 6f 77 2e 0a 23 0a  # of the row..#.
1210: 64 6f 5f 74 65 73 74 20 68 6f 6f 6b 2d 34 2e 31  do_test hook-4.1
1220: 2e 32 20 7b 0a 20 20 73 65 74 20 3a 3a 75 70 64  .2 {.  set ::upd
1230: 61 74 65 5f 68 6f 6f 6b 20 7b 7d 0a 20 20 65 78  ate_hook {}.  ex
1240: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
1250: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1260: 53 28 34 2c 20 27 66 6f 75 72 27 29 3b 0a 20 20  S(4, 'four');.  
1270: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
1280: 20 57 48 45 52 45 20 62 20 3d 20 27 74 77 6f 27   WHERE b = 'two'
1290: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20  ;.    UPDATE t1 
12a0: 53 45 54 20 62 20 3d 20 27 27 20 57 48 45 52 45  SET b = '' WHERE
12b0: 20 61 20 3d 20 31 20 4f 52 20 61 20 3d 20 33 3b   a = 1 OR a = 3;
12c0: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
12d0: 20 74 31 20 57 48 45 52 45 20 31 3b 20 2d 2d 20   t1 WHERE 1; -- 
12e0: 41 76 6f 69 64 20 74 68 65 20 74 72 75 6e 63 61  Avoid the trunca
12f0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
1300: 28 66 6f 72 20 6e 6f 77 29 0a 20 20 7d 0a 20 20  (for now).  }.  
1310: 73 65 74 20 3a 3a 75 70 64 61 74 65 5f 68 6f 6f  set ::update_hoo
1320: 6b 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 20 20  k.} [list \.    
1330: 49 4e 53 45 52 54 20 6d 61 69 6e 20 74 31 20 34  INSERT main t1 4
1340: 20 5c 0a 20 20 20 20 44 45 4c 45 54 45 20 6d 61   \.    DELETE ma
1350: 69 6e 20 74 31 20 32 20 5c 0a 20 20 20 20 55 50  in t1 2 \.    UP
1360: 44 41 54 45 20 6d 61 69 6e 20 74 31 20 31 20 5c  DATE main t1 1 \
1370: 0a 20 20 20 20 55 50 44 41 54 45 20 6d 61 69 6e  .    UPDATE main
1380: 20 74 31 20 33 20 5c 0a 20 20 20 20 44 45 4c 45   t1 3 \.    DELE
1390: 54 45 20 6d 61 69 6e 20 74 31 20 31 20 5c 0a 20  TE main t1 1 \. 
13a0: 20 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20 74     DELETE main t
13b0: 31 20 33 20 5c 0a 20 20 20 20 44 45 4c 45 54 45  1 3 \.    DELETE
13c0: 20 6d 61 69 6e 20 74 31 20 34 20 5c 0a 5d 0a 0a   main t1 4 \.]..
13d0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
13e0: 2d 36 31 38 30 38 2d 31 34 33 34 34 20 54 68 65  -61808-14344 The
13f0: 20 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f   sqlite3_update_
1400: 68 6f 6f 6b 28 29 20 69 6e 74 65 72 66 61 63 65  hook() interface
1410: 20 64 6f 65 73 0a 23 20 6e 6f 74 20 66 69 72 65   does.# not fire
1420: 20 63 61 6c 6c 62 61 63 6b 73 20 66 6f 72 20 63   callbacks for c
1430: 68 61 6e 67 65 73 20 74 6f 20 61 20 57 49 54 48  hanges to a WITH
1440: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
1450: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
1460: 3a 20 52 2d 33 33 32 35 37 2d 34 34 32 34 39 20  : R-33257-44249 
1470: 54 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 20  The update hook 
1480: 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 77  is not invoked w
1490: 68 65 6e 20 57 49 54 48 4f 55 54 0a 23 20 52 4f  hen WITHOUT.# RO
14a0: 57 49 44 20 74 61 62 6c 65 73 20 61 72 65 20 6d  WID tables are m
14b0: 6f 64 69 66 69 65 64 2e 0a 23 0a 62 72 65 61 6b  odified..#.break
14c0: 70 6f 69 6e 74 0a 64 6f 5f 74 65 73 74 20 68 6f  point.do_test ho
14d0: 6f 6b 2d 34 2e 31 2e 32 77 20 7b 0a 20 20 73 65  ok-4.1.2w {.  se
14e0: 74 20 3a 3a 75 70 64 61 74 65 5f 68 6f 6f 6b 20  t ::update_hook 
14f0: 7b 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  {}.  execsql {. 
1500: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1510: 31 77 20 56 41 4c 55 45 53 28 34 2c 20 27 66 6f  1w VALUES(4, 'fo
1520: 75 72 27 29 3b 0a 20 20 20 20 44 45 4c 45 54 45  ur');.    DELETE
1530: 20 46 52 4f 4d 20 74 31 77 20 57 48 45 52 45 20   FROM t1w WHERE 
1540: 62 20 3d 20 27 74 77 6f 27 3b 0a 20 20 20 20 55  b = 'two';.    U
1550: 50 44 41 54 45 20 74 31 77 20 53 45 54 20 62 20  PDATE t1w SET b 
1560: 3d 20 27 27 20 57 48 45 52 45 20 61 20 3d 20 31  = '' WHERE a = 1
1570: 20 4f 52 20 61 20 3d 20 33 3b 0a 20 20 20 20 44   OR a = 3;.    D
1580: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 77 20 57  ELETE FROM t1w W
1590: 48 45 52 45 20 31 3b 20 2d 2d 20 41 76 6f 69 64  HERE 1; -- Avoid
15a0: 20 74 68 65 20 74 72 75 6e 63 61 74 65 20 6f 70   the truncate op
15b0: 74 69 6d 69 7a 61 74 69 6f 6e 20 28 66 6f 72 20  timization (for 
15c0: 6e 6f 77 29 0a 20 20 7d 0a 20 20 73 65 74 20 3a  now).  }.  set :
15d0: 3a 75 70 64 61 74 65 5f 68 6f 6f 6b 0a 7d 20 7b  :update_hook.} {
15e0: 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 74 72 69  }..ifcapable tri
15f0: 67 67 65 72 20 7b 0a 20 20 23 20 55 70 64 61 74  gger {.  # Updat
1600: 65 20 68 6f 6f 6b 20 69 73 20 6e 6f 74 20 69 6e  e hook is not in
1610: 76 6f 6b 65 64 20 66 6f 72 20 63 68 61 6e 67 65  voked for change
1620: 73 20 74 6f 20 73 71 6c 69 74 65 5f 6d 61 73 74  s to sqlite_mast
1630: 65 72 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  er.  #.  do_test
1640: 20 68 6f 6f 6b 2d 34 2e 31 2e 33 20 7b 0a 20 20   hook-4.1.3 {.  
1650: 20 20 73 65 74 20 3a 3a 75 70 64 61 74 65 5f 68    set ::update_h
1660: 6f 6f 6b 20 7b 7d 0a 20 20 20 20 65 78 65 63 73  ook {}.    execs
1670: 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
1680: 45 20 54 52 49 47 47 45 52 20 72 31 20 41 46 54  E TRIGGER r1 AFT
1690: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20  ER INSERT ON t1 
16a0: 42 45 47 49 4e 20 53 45 4c 45 43 54 20 52 41 49  BEGIN SELECT RAI
16b0: 53 45 28 49 47 4e 4f 52 45 29 3b 20 45 4e 44 3b  SE(IGNORE); END;
16c0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 3a  .    }.    set :
16d0: 3a 75 70 64 61 74 65 5f 68 6f 6f 6b 0a 20 20 7d  :update_hook.  }
16e0: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 68 6f   {}.  do_test ho
16f0: 6f 6b 2d 34 2e 31 2e 34 20 7b 0a 20 20 20 20 73  ok-4.1.4 {.    s
1700: 65 74 20 3a 3a 75 70 64 61 74 65 5f 68 6f 6f 6b  et ::update_hook
1710: 20 7b 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20   {}.    execsql 
1720: 7b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 52 49  {.      DROP TRI
1730: 47 47 45 52 20 72 31 3b 0a 20 20 20 20 7d 0a 20  GGER r1;.    }. 
1740: 20 20 20 73 65 74 20 3a 3a 75 70 64 61 74 65 5f     set ::update_
1750: 68 6f 6f 6b 0a 20 20 7d 20 7b 7d 0a 20 20 0a 20  hook.  } {}.  . 
1760: 20 73 65 74 20 3a 3a 75 70 64 61 74 65 5f 68 6f   set ::update_ho
1770: 6f 6b 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ok {}.  do_test 
1780: 68 6f 6f 6b 2d 34 2e 32 2e 31 20 7b 0a 20 20 20  hook-4.2.1 {.   
1790: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
17a0: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b    DROP TABLE t2;
17b0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73  .    }.    execs
17c0: 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
17d0: 45 20 54 41 42 4c 45 20 74 32 28 63 20 49 4e 54  E TABLE t2(c INT
17e0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
17f0: 2c 20 64 29 3b 0a 20 20 20 20 20 20 43 52 45 41  , d);.      CREA
1800: 54 45 20 54 52 49 47 47 45 52 20 74 31 5f 74 72  TE TRIGGER t1_tr
1810: 69 67 67 65 72 20 41 46 54 45 52 20 49 4e 53 45  igger AFTER INSE
1820: 52 54 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20  RT ON t1 BEGIN. 
1830: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
1840: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 6e 65 77  TO t2 VALUES(new
1850: 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20 20  .a, new.b);.    
1860: 20 20 20 20 55 50 44 41 54 45 20 74 32 20 53 45      UPDATE t2 SE
1870: 54 20 64 20 3d 20 64 20 7c 7c 20 27 20 76 69 61  T d = d || ' via
1880: 20 74 72 69 67 67 65 72 27 20 57 48 45 52 45 20   trigger' WHERE 
1890: 6e 65 77 2e 61 20 3d 20 63 3b 0a 20 20 20 20 20  new.a = c;.     
18a0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
18b0: 32 20 57 48 45 52 45 20 6e 65 77 2e 61 20 3d 20  2 WHERE new.a = 
18c0: 63 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20  c;.      END;.  
18d0: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
18e0: 74 65 73 74 20 68 6f 6f 6b 2d 34 2e 32 2e 32 20  test hook-4.2.2 
18f0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
1900: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1910: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27  O t1 VALUES(1, '
1920: 6f 6e 65 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  one');.      INS
1930: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1940: 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20  ES(2, 'two');.  
1950: 20 20 7d 0a 20 20 20 20 73 65 74 20 3a 3a 75 70    }.    set ::up
1960: 64 61 74 65 5f 68 6f 6f 6b 0a 20 20 7d 20 5b 6c  date_hook.  } [l
1970: 69 73 74 20 5c 0a 20 20 20 20 20 20 49 4e 53 45  ist \.      INSE
1980: 52 54 20 6d 61 69 6e 20 74 31 20 31 20 5c 0a 20  RT main t1 1 \. 
1990: 20 20 20 20 20 49 4e 53 45 52 54 20 6d 61 69 6e       INSERT main
19a0: 20 74 32 20 31 20 5c 0a 20 20 20 20 20 20 55 50   t2 1 \.      UP
19b0: 44 41 54 45 20 6d 61 69 6e 20 74 32 20 31 20 5c  DATE main t2 1 \
19c0: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 6d 61  .      DELETE ma
19d0: 69 6e 20 74 32 20 31 20 5c 0a 20 20 20 20 20 20  in t2 1 \.      
19e0: 49 4e 53 45 52 54 20 6d 61 69 6e 20 74 31 20 32  INSERT main t1 2
19f0: 20 5c 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20   \.      INSERT 
1a00: 6d 61 69 6e 20 74 32 20 32 20 5c 0a 20 20 20 20  main t2 2 \.    
1a10: 20 20 55 50 44 41 54 45 20 6d 61 69 6e 20 74 32    UPDATE main t2
1a20: 20 32 20 5c 0a 20 20 20 20 20 20 44 45 4c 45 54   2 \.      DELET
1a30: 45 20 6d 61 69 6e 20 74 32 20 32 20 5c 0a 20 20  E main t2 2 \.  
1a40: 5d 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 65 78 65  ].} else {.  exe
1a50: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
1a60: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1a70: 28 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20  (1, 'one');.    
1a80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1a90: 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b  ALUES(2, 'two');
1aa0: 0a 20 20 7d 0a 7d 0a 0a 23 20 55 70 64 61 74 65  .  }.}..# Update
1ab0: 2d 68 6f 6f 6b 20 2b 20 41 54 54 41 43 48 0a 73  -hook + ATTACH.s
1ac0: 65 74 20 3a 3a 75 70 64 61 74 65 5f 68 6f 6f 6b  et ::update_hook
1ad0: 20 7b 7d 0a 69 66 63 61 70 61 62 6c 65 20 61 74   {}.ifcapable at
1ae0: 74 61 63 68 20 7b 0a 20 20 64 6f 5f 74 65 73 74  tach {.  do_test
1af0: 20 68 6f 6f 6b 2d 34 2e 32 2e 33 20 7b 0a 20 20   hook-4.2.3 {.  
1b00: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65    forcedelete te
1b10: 73 74 32 2e 64 62 0a 20 20 20 20 65 78 65 63 73  st2.db.    execs
1b20: 71 6c 20 7b 0a 20 20 20 20 20 20 41 54 54 41 43  ql {.      ATTAC
1b30: 48 20 27 74 65 73 74 32 2e 64 62 27 20 41 53 20  H 'test2.db' AS 
1b40: 61 75 78 3b 0a 20 20 20 20 20 20 43 52 45 41 54  aux;.      CREAT
1b50: 45 20 54 41 42 4c 45 20 61 75 78 2e 74 33 28 61  E TABLE aux.t3(a
1b60: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
1b70: 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 20 20   KEY, b);.      
1b80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 75 78 2e  INSERT INTO aux.
1b90: 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t3 SELECT * FROM
1ba0: 20 74 31 3b 0a 20 20 20 20 20 20 55 50 44 41 54   t1;.      UPDAT
1bb0: 45 20 74 33 20 53 45 54 20 62 20 3d 20 27 74 77  E t3 SET b = 'tw
1bc0: 6f 20 6f 72 20 73 6f 27 20 57 48 45 52 45 20 61  o or so' WHERE a
1bd0: 20 3d 20 32 3b 0a 20 20 20 20 20 20 44 45 4c 45   = 2;.      DELE
1be0: 54 45 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45  TE FROM t3 WHERE
1bf0: 20 31 3b 20 2d 2d 20 41 76 6f 69 64 20 74 68 65   1; -- Avoid the
1c00: 20 74 72 75 6e 63 61 74 65 20 6f 70 74 69 6d 69   truncate optimi
1c10: 7a 61 74 69 6f 6e 20 28 66 6f 72 20 6e 6f 77 29  zation (for now)
1c20: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 3a  .    }.    set :
1c30: 3a 75 70 64 61 74 65 5f 68 6f 6f 6b 0a 20 20 7d  :update_hook.  }
1c40: 20 5b 6c 69 73 74 20 5c 0a 20 20 20 20 20 20 49   [list \.      I
1c50: 4e 53 45 52 54 20 61 75 78 20 74 33 20 31 20 5c  NSERT aux t3 1 \
1c60: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 61 75  .      INSERT au
1c70: 78 20 74 33 20 32 20 5c 0a 20 20 20 20 20 20 55  x t3 2 \.      U
1c80: 50 44 41 54 45 20 61 75 78 20 74 33 20 32 20 5c  PDATE aux t3 2 \
1c90: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 61 75  .      DELETE au
1ca0: 78 20 74 33 20 31 20 5c 0a 20 20 20 20 20 20 44  x t3 1 \.      D
1cb0: 45 4c 45 54 45 20 61 75 78 20 74 33 20 32 20 5c  ELETE aux t3 2 \
1cc0: 0a 20 20 5d 0a 7d 0a 0a 69 66 63 61 70 61 62 6c  .  ].}..ifcapabl
1cd0: 65 20 74 72 69 67 67 65 72 20 7b 0a 20 20 65 78  e trigger {.  ex
1ce0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50  ecsql {.    DROP
1cf0: 20 54 52 49 47 47 45 52 20 74 31 5f 74 72 69 67   TRIGGER t1_trig
1d00: 67 65 72 3b 0a 20 20 7d 0a 7d 0a 0a 23 20 54 65  ger;.  }.}..# Te
1d10: 73 74 20 74 68 61 74 20 6f 74 68 65 72 20 76 64  st that other vd
1d20: 62 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 69 6e  be operations in
1d30: 76 6f 6c 76 69 6e 67 20 62 74 72 65 65 20 73 74  volving btree st
1d40: 72 75 63 74 75 72 65 73 20 64 6f 20 6e 6f 74 20  ructures do not 
1d50: 0a 23 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 69  .# incorrectly i
1d60: 6e 76 6f 6b 65 20 74 68 65 20 75 70 64 61 74 65  nvoke the update
1d70: 2d 68 6f 6f 6b 2e 0a 73 65 74 20 3a 3a 75 70 64  -hook..set ::upd
1d80: 61 74 65 5f 68 6f 6f 6b 20 7b 7d 0a 64 6f 5f 74  ate_hook {}.do_t
1d90: 65 73 74 20 68 6f 6f 6b 2d 34 2e 33 2e 31 20 7b  est hook-4.3.1 {
1da0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1db0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31   CREATE INDEX t1
1dc0: 5f 69 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20  _i ON t1(b);.   
1dd0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1de0: 56 41 4c 55 45 53 28 33 2c 20 27 74 68 72 65 65  VALUES(3, 'three
1df0: 27 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74  ');.    UPDATE t
1e00: 31 20 53 45 54 20 62 20 3d 20 27 27 3b 0a 20 20  1 SET b = '';.  
1e10: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
1e20: 20 57 48 45 52 45 20 61 20 3e 20 31 3b 0a 20 20   WHERE a > 1;.  
1e30: 7d 0a 20 20 73 65 74 20 3a 3a 75 70 64 61 74 65  }.  set ::update
1e40: 5f 68 6f 6f 6b 0a 7d 20 5b 6c 69 73 74 20 5c 0a  _hook.} [list \.
1e50: 20 20 20 20 49 4e 53 45 52 54 20 6d 61 69 6e 20      INSERT main 
1e60: 74 31 20 33 20 5c 0a 20 20 20 20 55 50 44 41 54  t1 3 \.    UPDAT
1e70: 45 20 6d 61 69 6e 20 74 31 20 31 20 5c 0a 20 20  E main t1 1 \.  
1e80: 20 20 55 50 44 41 54 45 20 6d 61 69 6e 20 74 31    UPDATE main t1
1e90: 20 32 20 5c 0a 20 20 20 20 55 50 44 41 54 45 20   2 \.    UPDATE 
1ea0: 6d 61 69 6e 20 74 31 20 33 20 5c 0a 20 20 20 20  main t1 3 \.    
1eb0: 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 31 20 32  DELETE main t1 2
1ec0: 20 5c 0a 20 20 20 20 44 45 4c 45 54 45 20 6d 61   \.    DELETE ma
1ed0: 69 6e 20 74 31 20 33 20 5c 0a 5d 0a 73 65 74 20  in t1 3 \.].set 
1ee0: 3a 3a 75 70 64 61 74 65 5f 68 6f 6f 6b 20 7b 7d  ::update_hook {}
1ef0: 0a 69 66 63 61 70 61 62 6c 65 20 63 6f 6d 70 6f  .ifcapable compo
1f00: 75 6e 64 26 26 61 74 74 61 63 68 20 7b 0a 20 20  und&&attach {.  
1f10: 64 6f 5f 74 65 73 74 20 68 6f 6f 6b 2d 34 2e 33  do_test hook-4.3
1f20: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
1f30: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
1f40: 2a 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  * FROM t1 UNION 
1f50: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
1f60: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
1f70: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41   FROM t1 UNION A
1f80: 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  LL SELECT * FROM
1f90: 20 74 33 3b 0a 20 20 20 20 20 20 53 45 4c 45 43   t3;.      SELEC
1fa0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 49 4e 54 45  T * FROM t1 INTE
1fb0: 52 53 45 43 54 20 53 45 4c 45 43 54 20 2a 20 46  RSECT SELECT * F
1fc0: 52 4f 4d 20 74 33 3b 0a 20 20 20 20 20 20 53 45  ROM t3;.      SE
1fd0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 45  LECT * FROM t1 E
1fe0: 58 43 45 50 54 20 53 45 4c 45 43 54 20 2a 20 46  XCEPT SELECT * F
1ff0: 52 4f 4d 20 74 33 3b 0a 20 20 20 20 20 20 53 45  ROM t3;.      SE
2000: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f  LECT * FROM t1 O
2010: 52 44 45 52 20 42 59 20 62 3b 0a 20 20 20 20 20  RDER BY b;.     
2020: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2030: 31 20 47 52 4f 55 50 20 42 59 20 62 3b 0a 20 20  1 GROUP BY b;.  
2040: 20 20 7d 0a 20 20 20 20 73 65 74 20 3a 3a 75 70    }.    set ::up
2050: 64 61 74 65 5f 68 6f 6f 6b 0a 20 20 7d 20 5b 6c  date_hook.  } [l
2060: 69 73 74 5d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20  ist].}..do_test 
2070: 68 6f 6f 6b 2d 34 2e 34 20 7b 0a 20 20 65 78 65  hook-4.4 {.  exe
2080: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
2090: 45 20 54 41 42 4c 45 20 74 34 28 61 20 55 4e 49  E TABLE t4(a UNI
20a0: 51 55 45 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  QUE, b);.    INS
20b0: 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
20c0: 45 53 28 31 2c 20 27 61 27 29 3b 0a 20 20 20 20  ES(1, 'a');.    
20d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
20e0: 41 4c 55 45 53 28 32 2c 20 27 62 27 29 3b 0a 20  ALUES(2, 'b');. 
20f0: 20 7d 0a 20 20 73 65 74 20 3a 3a 75 70 64 61 74   }.  set ::updat
2100: 65 5f 68 6f 6f 6b 20 5b 6c 69 73 74 5d 0a 20 20  e_hook [list].  
2110: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 45  execsql {.    RE
2120: 50 4c 41 43 45 20 49 4e 54 4f 20 74 34 20 56 41  PLACE INTO t4 VA
2130: 4c 55 45 53 28 31 2c 20 27 63 27 29 3b 0a 20 20  LUES(1, 'c');.  
2140: 7d 0a 20 20 73 65 74 20 3a 3a 75 70 64 61 74 65  }.  set ::update
2150: 5f 68 6f 6f 6b 0a 7d 20 5b 6c 69 73 74 20 49 4e  _hook.} [list IN
2160: 53 45 52 54 20 6d 61 69 6e 20 74 34 20 33 20 5d  SERT main t4 3 ]
2170: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2180: 20 68 6f 6f 6b 2d 34 2e 34 2e 31 20 7b 0a 20 20   hook-4.4.1 {.  
2190: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34  SELECT * FROM t4
21a0: 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 7d 20 7b   ORDER BY a;.} {
21b0: 31 20 63 20 32 20 62 7d 0a 64 6f 5f 74 65 73 74  1 c 2 b}.do_test
21c0: 20 68 6f 6f 6b 2d 34 2e 34 2e 32 20 7b 0a 20 20   hook-4.4.2 {.  
21d0: 73 65 74 20 3a 3a 75 70 64 61 74 65 5f 68 6f 6f  set ::update_hoo
21e0: 6b 20 5b 6c 69 73 74 5d 0a 20 20 65 78 65 63 73  k [list].  execs
21f0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
2200: 72 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65  recursive_trigge
2210: 72 73 20 3d 20 6f 6e 3b 0a 20 20 20 20 52 45 50  rs = on;.    REP
2220: 4c 41 43 45 20 49 4e 54 4f 20 74 34 20 56 41 4c  LACE INTO t4 VAL
2230: 55 45 53 28 31 2c 20 27 64 27 29 3b 0a 20 20 7d  UES(1, 'd');.  }
2240: 0a 20 20 73 65 74 20 3a 3a 75 70 64 61 74 65 5f  .  set ::update_
2250: 68 6f 6f 6b 0a 7d 20 5b 6c 69 73 74 20 49 4e 53  hook.} [list INS
2260: 45 52 54 20 6d 61 69 6e 20 74 34 20 34 20 5d 0a  ERT main t4 4 ].
2270: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2280: 68 6f 6f 6b 2d 34 2e 34 2e 33 20 7b 0a 20 20 53  hook-4.4.3 {.  S
2290: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 20  ELECT * FROM t4 
22a0: 4f 52 44 45 52 20 42 59 20 61 3b 0a 7d 20 7b 31  ORDER BY a;.} {1
22b0: 20 64 20 32 20 62 7d 0a 0a 64 62 20 75 70 64 61   d 2 b}..db upda
22c0: 74 65 5f 68 6f 6f 6b 20 7b 7d 0a 23 0a 23 2d 2d  te_hook {}.#.#--
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 2d 2d 2d  ----------..#---
2320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
2370: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f   the rollback-ho
2380: 6f 6b 2e 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b  ok. The rollback
2390: 2d 68 6f 6f 6b 20 69 73 20 61 20 62 69 74 20 6d  -hook is a bit m
23a0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20  ore complicated 
23b0: 74 68 61 6e 0a 23 20 65 69 74 68 65 72 20 74 68  than.# either th
23c0: 65 20 63 6f 6d 6d 69 74 20 6f 72 20 75 70 64 61  e commit or upda
23d0: 74 65 20 68 6f 6f 6b 73 20 62 65 63 61 75 73 65  te hooks because
23e0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20   a rollback can 
23f0: 68 61 70 70 65 6e 20 0a 23 20 65 78 70 6c 69 63  happen .# explic
2400: 69 74 6c 79 20 28 61 6e 20 73 71 6c 20 52 4f 4c  itly (an sql ROL
2410: 4c 42 41 43 4b 20 73 74 61 74 65 6d 65 6e 74 29  LBACK statement)
2420: 20 6f 72 20 69 6d 70 6c 69 63 69 74 6c 79 20 28   or implicitly (
2430: 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20  a constraint or 
2440: 0a 23 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  .# error conditi
2450: 6f 6e 29 2e 0a 23 0a 23 20 68 6f 6f 6b 2d 35 2e  on)..#.# hook-5.
2460: 31 2e 2a 20 2d 20 54 65 73 74 20 65 78 70 6c 69  1.* - Test expli
2470: 63 69 74 20 72 6f 6c 6c 62 61 63 6b 73 2e 0a 23  cit rollbacks..#
2480: 20 68 6f 6f 6b 2d 35 2e 32 2e 2a 20 2d 20 54 65   hook-5.2.* - Te
2490: 73 74 20 69 6d 70 6c 69 63 69 74 20 72 6f 6c 6c  st implicit roll
24a0: 62 61 63 6b 73 20 63 61 75 73 65 64 20 62 79 20  backs caused by 
24b0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 75  constraint failu
24c0: 72 65 2e 0a 23 0a 23 20 68 6f 6f 6b 2d 35 2e 33  re..#.# hook-5.3
24d0: 2e 2a 20 2d 20 54 65 73 74 20 69 6d 70 6c 69 63  .* - Test implic
24e0: 69 74 20 72 6f 6c 6c 62 61 63 6b 73 20 63 61 75  it rollbacks cau
24f0: 73 65 64 20 62 79 20 49 4f 20 65 72 72 6f 72 73  sed by IO errors
2500: 2e 0a 23 20 68 6f 6f 6b 2d 35 2e 34 2e 2a 20 2d  ..# hook-5.4.* -
2510: 20 54 65 73 74 20 69 6d 70 6c 69 63 69 74 20 72   Test implicit r
2520: 6f 6c 6c 62 61 63 6b 73 20 63 61 75 73 65 64 20  ollbacks caused 
2530: 62 79 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  by malloc() fail
2540: 75 72 65 2e 0a 23 20 68 6f 6f 6b 2d 35 2e 35 2e  ure..# hook-5.5.
2550: 2a 20 2d 20 54 65 73 74 20 68 6f 74 2d 6a 6f 75  * - Test hot-jou
2560: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 73 2e 20  rnal rollbacks. 
2570: 4f 72 20 73 68 6f 75 6c 64 20 74 68 65 20 72 6f  Or should the ro
2580: 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20 0a 23 20 20  llback hook .#  
2590: 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20              not 
25a0: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  be called for th
25b0: 65 73 65 3f 0a 23 0a 0a 64 6f 5f 74 65 73 74 20  ese?.#..do_test 
25c0: 68 6f 6f 6b 2d 35 2e 30 20 7b 0a 20 20 23 20 43  hook-5.0 {.  # C
25d0: 6f 6e 66 69 67 75 72 65 20 74 68 65 20 72 6f 6c  onfigure the rol
25e0: 6c 62 61 63 6b 20 68 6f 6f 6b 20 74 6f 20 69 6e  lback hook to in
25f0: 63 72 65 6d 65 6e 74 20 67 6c 6f 62 61 6c 20 76  crement global v
2600: 61 72 69 61 62 6c 65 20 0a 20 20 23 20 24 3a 3a  ariable .  # $::
2610: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 65 61  rollback_hook ea
2620: 63 68 20 74 69 6d 65 20 69 74 20 69 73 20 69 6e  ch time it is in
2630: 76 6f 6b 65 64 2e 0a 20 20 73 65 74 20 3a 3a 72  voked..  set ::r
2640: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 30 0a 20  ollback_hook 0. 
2650: 20 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f   db rollback_hoo
2660: 6b 20 5b 6c 69 73 74 20 69 6e 63 72 20 3a 3a 72  k [list incr ::r
2670: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 0a 7d 20  ollback_hook].} 
2680: 7b 7d 0a 0a 23 20 54 65 73 74 20 65 78 70 6c 69  {}..# Test expli
2690: 63 69 74 20 72 6f 6c 6c 62 61 63 6b 73 2e 20 4e  cit rollbacks. N
26a0: 6f 74 20 6d 75 63 68 20 63 61 6e 20 72 65 61 6c  ot much can real
26b0: 6c 79 20 67 6f 20 77 72 6f 6e 67 20 68 65 72 65  ly go wrong here
26c0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 68 6f 6f 6b  ..#.do_test hook
26d0: 2d 35 2e 31 2e 31 20 7b 0a 20 20 73 65 74 20 3a  -5.1.1 {.  set :
26e0: 3a 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 30  :rollback_hook 0
26f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2700: 20 42 45 47 49 4e 3b 0a 20 20 20 20 52 4f 4c 4c   BEGIN;.    ROLL
2710: 42 41 43 4b 3b 0a 20 20 7d 0a 20 20 73 65 74 20  BACK;.  }.  set 
2720: 3a 3a 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 0a  ::rollback_hook.
2730: 7d 20 7b 31 7d 0a 0a 23 20 54 65 73 74 20 69 6d  } {1}..# Test im
2740: 70 6c 69 63 69 74 20 72 6f 6c 6c 62 61 63 6b 73  plicit rollbacks
2750: 20 63 61 75 73 65 64 20 62 79 20 63 6f 6e 73 74   caused by const
2760: 72 61 69 6e 74 73 2e 0a 23 0a 64 6f 5f 74 65 73  raints..#.do_tes
2770: 74 20 68 6f 6f 6b 2d 35 2e 32 2e 31 20 7b 0a 20  t hook-5.2.1 {. 
2780: 20 73 65 74 20 3a 3a 72 6f 6c 6c 62 61 63 6b 5f   set ::rollback_
2790: 68 6f 6f 6b 20 30 0a 20 20 63 61 74 63 68 73 71  hook 0.  catchsq
27a0: 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  l {.    DROP TAB
27b0: 4c 45 20 74 31 3b 0a 20 20 20 20 43 52 45 41 54  LE t1;.    CREAT
27c0: 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49  E TABLE t1(a PRI
27d0: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
27e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
27f0: 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27   VALUES('one', '
2800: 49 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  I');.    INSERT 
2810: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
2820: 6f 6e 65 27 2c 20 27 49 27 29 3b 0a 20 20 7d 0a  one', 'I');.  }.
2830: 20 20 73 65 74 20 3a 3a 72 6f 6c 6c 62 61 63 6b    set ::rollback
2840: 5f 68 6f 6f 6b 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  _hook.} {1}.do_t
2850: 65 73 74 20 68 6f 6f 6b 2d 35 2e 32 2e 32 20 7b  est hook-5.2.2 {
2860: 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20  .  # Check that 
2870: 74 68 65 20 49 4e 53 45 52 54 20 74 72 61 6e 73  the INSERT trans
2880: 61 63 74 69 6f 6e 20 61 62 6f 76 65 20 72 65 61  action above rea
2890: 6c 6c 79 20 77 61 73 20 72 6f 6c 6c 65 64 20 62  lly was rolled b
28a0: 61 63 6b 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b  ack..  execsql {
28b0: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
28c0: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
28d0: 7d 0a 7d 20 7b 31 7d 0a 0a 23 0a 23 20 45 6e 64  }.} {1}..#.# End
28e0: 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 74   rollback-hook t
28f0: 65 73 74 69 6e 67 2e 0a 23 2d 2d 2d 2d 2d 2d 2d  esting..#-------
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2940: 2d 2d 2d 2d 2d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  -----..#--------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2990: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
29a0: 20 69 66 20 61 20 63 6f 6d 6d 69 74 2d 68 6f 6f   if a commit-hoo
29b0: 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
29c0: 72 6f 20 28 63 61 75 73 69 6e 67 20 61 20 72 6f  ro (causing a ro
29d0: 6c 6c 62 61 63 6b 29 2c 20 74 68 65 0a 23 20 72  llback), the.# r
29e0: 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 69 73 20  ollback-hook is 
29f0: 69 6e 76 6f 6b 65 64 2e 0a 23 0a 70 72 6f 63 20  invoked..#.proc 
2a00: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 7b 7d 20 7b  commit_hook {} {
2a10: 0a 20 20 6c 61 70 70 65 6e 64 20 3a 3a 68 6f 6f  .  lappend ::hoo
2a20: 6b 73 20 43 4f 4d 4d 49 54 0a 20 20 72 65 74 75  ks COMMIT.  retu
2a30: 72 6e 20 31 0a 7d 0a 70 72 6f 63 20 72 6f 6c 6c  rn 1.}.proc roll
2a40: 62 61 63 6b 5f 68 6f 6f 6b 20 7b 7d 20 7b 0a 20  back_hook {} {. 
2a50: 20 6c 61 70 70 65 6e 64 20 3a 3a 68 6f 6f 6b 73   lappend ::hooks
2a60: 20 52 4f 4c 4c 42 41 43 4b 0a 7d 0a 64 6f 5f 74   ROLLBACK.}.do_t
2a70: 65 73 74 20 68 6f 6f 6b 2d 36 2e 31 20 7b 0a 20  est hook-6.1 {. 
2a80: 20 73 65 74 20 3a 3a 68 6f 6f 6b 73 20 5b 6c 69   set ::hooks [li
2a90: 73 74 5d 0a 20 20 64 62 20 63 6f 6d 6d 69 74 5f  st].  db commit_
2aa0: 68 6f 6f 6b 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  hook commit_hook
2ab0: 0a 20 20 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68  .  db rollback_h
2ac0: 6f 6f 6b 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  ook rollback_hoo
2ad0: 6b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  k.  catchsql {. 
2ae0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
2af0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
2b00: 41 4c 55 45 53 28 27 74 77 6f 27 2c 20 27 49 49  ALUES('two', 'II
2b10: 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ');.    COMMIT;.
2b20: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
2b30: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2b40: 20 7d 0a 7d 20 7b 6f 6e 65 20 49 7d 0a 64 6f 5f   }.} {one I}.do_
2b50: 74 65 73 74 20 68 6f 6f 6b 2d 36 2e 32 20 7b 0a  test hook-6.2 {.
2b60: 20 20 73 65 74 20 3a 3a 68 6f 6f 6b 73 0a 7d 20    set ::hooks.} 
2b70: 7b 43 4f 4d 4d 49 54 20 52 4f 4c 4c 42 41 43 4b  {COMMIT ROLLBACK
2b80: 7d 0a 75 6e 73 65 74 20 3a 3a 68 6f 6f 6b 73 0a  }.unset ::hooks.
2b90: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
2be0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
2bf0: 65 73 74 73 20 2d 20 68 6f 6f 6b 2d 37 2e 2a 20  ests - hook-7.* 
2c00: 2d 20 74 65 73 74 20 74 68 65 20 70 72 65 2d 75  - test the pre-u
2c10: 70 64 61 74 65 20 68 6f 6f 6b 2e 0a 23 0a 69 66  pdate hook..#.if
2c20: 63 61 70 61 62 6c 65 20 21 70 72 65 75 70 64 61  capable !preupda
2c30: 74 65 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65  te {.  finish_te
2c40: 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 23 0a  st.  return.}.#.
2c50: 23 20 37 2e 31 2e 31 20 2d 20 49 4e 53 45 52 54  # 7.1.1 - INSERT
2c60: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 20 37 2e   statement..# 7.
2c70: 31 2e 32 20 2d 20 49 4e 53 45 52 54 20 49 4e 54  1.2 - INSERT INT
2c80: 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 20 73 74 61  O ... SELECT sta
2c90: 74 65 6d 65 6e 74 2e 0a 23 20 37 2e 31 2e 33 20  tement..# 7.1.3 
2ca0: 2d 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 2e  - REPLACE INTO .
2cb0: 2e 2e 20 28 72 6f 77 69 64 20 63 6f 6e 66 6c 69  .. (rowid confli
2cc0: 63 74 29 0a 23 20 37 2e 31 2e 34 20 2d 20 52 45  ct).# 7.1.4 - RE
2cd0: 50 4c 41 43 45 20 49 4e 54 4f 20 2e 2e 2e 20 28  PLACE INTO ... (
2ce0: 6f 74 68 65 72 20 69 6e 64 65 78 20 63 6f 6e 66  other index conf
2cf0: 6c 69 63 74 73 29 0a 23 20 37 2e 31 2e 35 20 2d  licts).# 7.1.5 -
2d00: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 2e 2e   REPLACE INTO ..
2d10: 2e 20 28 62 6f 74 68 20 72 6f 77 69 64 20 61 6e  . (both rowid an
2d20: 64 20 6f 74 68 65 72 20 69 6e 64 65 78 20 63 6f  d other index co
2d30: 6e 66 6c 69 63 74 73 29 0a 23 0a 23 20 37 2e 32  nflicts).#.# 7.2
2d40: 2e 31 20 2d 20 44 45 4c 45 54 45 20 73 74 61 74  .1 - DELETE stat
2d50: 65 6d 65 6e 74 2e 0a 23 20 37 2e 32 2e 32 20 2d  ement..# 7.2.2 -
2d60: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
2d70: 74 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  t that uses the 
2d80: 74 72 75 6e 63 61 74 65 20 6f 70 74 69 6d 69 7a  truncate optimiz
2d90: 61 74 69 6f 6e 2e 0a 23 0a 23 20 37 2e 33 2e 31  ation..#.# 7.3.1
2da0: 20 2d 20 55 50 44 41 54 45 20 73 74 61 74 65 6d   - UPDATE statem
2db0: 65 6e 74 2e 0a 23 20 37 2e 33 2e 32 20 2d 20 55  ent..# 7.3.2 - U
2dc0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  PDATE statement 
2dd0: 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20 74 68  that modifies th
2de0: 65 20 72 6f 77 69 64 2e 0a 23 20 37 2e 33 2e 33  e rowid..# 7.3.3
2df0: 20 2d 20 55 50 44 41 54 45 20 4f 52 20 52 45 50   - UPDATE OR REP
2e00: 4c 41 43 45 20 2e 2e 2e 20 28 72 6f 77 69 64 20  LACE ... (rowid 
2e10: 63 6f 6e 66 6c 69 63 74 29 2e 0a 23 20 37 2e 33  conflict)..# 7.3
2e20: 2e 34 20 2d 20 55 50 44 41 54 45 20 4f 52 20 52  .4 - UPDATE OR R
2e30: 45 50 4c 41 43 45 20 2e 2e 2e 20 28 6f 74 68 65  EPLACE ... (othe
2e40: 72 20 69 6e 64 65 78 20 63 6f 6e 66 6c 69 63 74  r index conflict
2e50: 73 29 0a 23 20 37 2e 33 2e 34 20 2d 20 55 50 44  s).# 7.3.4 - UPD
2e60: 41 54 45 20 4f 52 20 52 45 50 4c 41 43 45 20 2e  ATE OR REPLACE .
2e70: 2e 2e 20 28 62 6f 74 68 20 72 6f 77 69 64 20 61  .. (both rowid a
2e80: 6e 64 20 6f 74 68 65 72 20 69 6e 64 65 78 20 63  nd other index c
2e90: 6f 6e 66 6c 69 63 74 73 29 0a 23 0a 23 20 37 2e  onflicts).#.# 7.
2ea0: 34 2e 31 20 2d 20 54 65 73 74 20 74 68 61 74 20  4.1 - Test that 
2eb0: 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 2d 68  the pre-update-h
2ec0: 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ook is invoked o
2ed0: 6e 6c 79 20 6f 6e 63 65 20 69 66 20 61 20 72 6f  nly once if a ro
2ee0: 77 20 62 65 69 6e 67 0a 23 20 20 20 20 20 20 20  w being.#       
2ef0: 20 20 64 65 6c 65 74 65 64 20 69 73 20 72 65 6d    deleted is rem
2f00: 6f 76 65 64 20 62 79 20 61 20 42 45 46 4f 52 45  oved by a BEFORE
2f10: 20 74 72 69 67 67 65 72 2e 0a 23 0a 23 20 37 2e   trigger..#.# 7.
2f20: 34 2e 32 20 2d 20 54 65 73 74 20 74 68 61 74 20  4.2 - Test that 
2f30: 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 2d 68  the pre-update-h
2f40: 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69  ook is invoked i
2f50: 66 20 61 20 42 45 46 4f 52 45 20 74 72 69 67 67  f a BEFORE trigg
2f60: 65 72 20 0a 23 20 20 20 20 20 20 20 20 20 72 65  er .#         re
2f70: 6d 6f 76 65 73 20 61 20 72 6f 77 20 62 65 69 6e  moves a row bein
2f80: 67 20 75 70 64 61 74 65 64 2e 20 49 6e 20 74 68  g updated. In th
2f90: 69 73 20 63 61 73 65 20 74 68 65 20 75 70 64 61  is case the upda
2fa0: 74 65 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 0a 23  te hook should.#
2fb0: 20 20 20 20 20 20 20 20 20 62 65 20 69 6e 76 6f           be invo
2fc0: 6b 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ked with SQLITE_
2fd0: 49 4e 53 45 52 54 20 61 73 20 74 68 65 20 6f 70  INSERT as the op
2fe0: 63 6f 64 65 20 77 68 65 6e 20 69 6e 73 65 72 74  code when insert
2ff0: 69 6e 67 20 74 68 65 0a 23 20 20 20 20 20 20 20  ing the.#       
3000: 20 20 6e 65 77 20 76 65 72 73 69 6f 6e 20 6f 66    new version of
3010: 20 74 68 65 20 72 6f 77 2e 0a 23 20 20 20 20 20   the row..#     
3020: 20 20 20 20 0a 23 20 54 4f 44 4f 3a 20 53 68 6f      .# TODO: Sho
3030: 72 74 20 72 65 63 6f 72 64 73 20 28 74 68 6f 73  rt records (thos
3040: 65 20 63 72 65 61 74 65 64 20 62 65 66 6f 72 65  e created before
3050: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 61 64 64   a column is add
3060: 65 64 20 74 6f 20 61 20 74 61 62 6c 65 20 0a 23  ed to a table .#
3070: 20 20 20 20 20 20 20 75 73 69 6e 67 20 41 4c 54         using ALT
3080: 45 52 20 54 41 42 4c 45 29 0a 23 0a 0a 70 72 6f  ER TABLE).#..pro
3090: 63 20 64 6f 5f 70 72 65 75 70 64 61 74 65 5f 74  c do_preupdate_t
30a0: 65 73 74 20 7b 74 6e 20 73 71 6c 20 78 7d 20 7b  est {tn sql x} {
30b0: 0a 20 20 73 65 74 20 58 20 5b 6c 69 73 74 5d 0a  .  set X [list].
30c0: 20 20 66 6f 72 65 61 63 68 20 65 6c 65 6d 20 24    foreach elem $
30d0: 78 20 7b 6c 61 70 70 65 6e 64 20 58 20 24 65 6c  x {lappend X $el
30e0: 65 6d 7d 0a 20 20 75 70 6c 65 76 65 6c 20 64 6f  em}.  uplevel do
30f0: 5f 74 65 73 74 20 24 74 6e 20 5b 6c 69 73 74 20  _test $tn [list 
3100: 22 0a 20 20 20 20 73 65 74 20 3a 3a 70 72 65 75  ".    set ::preu
3110: 70 64 61 74 65 20 5c 5b 6c 69 73 74 5c 5d 0a 20  pdate \[list\]. 
3120: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 24 73 71     execsql { $sq
3130: 6c 20 7d 0a 20 20 20 20 73 65 74 20 3a 3a 70 72  l }.    set ::pr
3140: 65 75 70 64 61 74 65 0a 20 20 22 5d 20 5b 6c 69  eupdate.  "] [li
3150: 73 74 20 24 58 5d 0a 7d 0a 0a 70 72 6f 63 20 70  st $X].}..proc p
3160: 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 7b 61  reupdate_hook {a
3170: 72 67 73 7d 20 7b 0a 20 20 73 65 74 20 74 79 70  rgs} {.  set typ
3180: 65 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20  e [lindex $args 
3190: 30 5d 0a 20 20 65 76 61 6c 20 6c 61 70 70 65 6e  0].  eval lappen
31a0: 64 20 3a 3a 70 72 65 75 70 64 61 74 65 20 24 61  d ::preupdate $a
31b0: 72 67 73 0a 20 20 69 66 20 7b 24 74 79 70 65 20  rgs.  if {$type 
31c0: 21 3d 20 22 49 4e 53 45 52 54 22 7d 20 7b 0a 20  != "INSERT"} {. 
31d0: 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d     for {set i 0}
31e0: 20 7b 24 69 20 3c 20 5b 64 62 20 70 72 65 75 70   {$i < [db preup
31f0: 64 61 74 65 20 63 6f 75 6e 74 5d 7d 20 7b 69 6e  date count]} {in
3200: 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 6c 61  cr i} {.      la
3210: 70 70 65 6e 64 20 3a 3a 70 72 65 75 70 64 61 74  ppend ::preupdat
3220: 65 20 5b 64 62 20 70 72 65 75 70 64 61 74 65 20  e [db preupdate 
3230: 6f 6c 64 20 24 69 5d 0a 20 20 20 20 7d 0a 20 20  old $i].    }.  
3240: 7d 0a 20 20 69 66 20 7b 24 74 79 70 65 20 21 3d  }.  if {$type !=
3250: 20 22 44 45 4c 45 54 45 22 7d 20 7b 0a 20 20 20   "DELETE"} {.   
3260: 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b   for {set i 0} {
3270: 24 69 20 3c 20 5b 64 62 20 70 72 65 75 70 64 61  $i < [db preupda
3280: 74 65 20 63 6f 75 6e 74 5d 7d 20 7b 69 6e 63 72  te count]} {incr
3290: 20 69 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20   i} {.      set 
32a0: 72 63 20 5b 63 61 74 63 68 20 7b 20 64 62 20 70  rc [catch { db p
32b0: 72 65 75 70 64 61 74 65 20 6e 65 77 20 24 69 20  reupdate new $i 
32c0: 7d 20 76 5d 0a 20 20 20 20 20 20 6c 61 70 70 65  } v].      lappe
32d0: 6e 64 20 3a 3a 70 72 65 75 70 64 61 74 65 20 24  nd ::preupdate $
32e0: 76 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 64  v.    }.  }.}..d
32f0: 62 20 63 6c 6f 73 65 0a 66 6f 72 63 65 64 65 6c  b close.forcedel
3300: 65 74 65 20 74 65 73 74 2e 64 62 0a 73 71 6c 69  ete test.db.sqli
3310: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64  te3 db test.db.d
3320: 62 20 70 72 65 75 70 64 61 74 65 20 68 6f 6f 6b  b preupdate hook
3330: 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 0a   preupdate_hook.
3340: 0a 23 20 53 65 74 20 75 70 20 61 20 73 63 68 65  .# Set up a sche
3350: 6d 61 20 74 6f 20 75 73 65 20 66 6f 72 20 74 65  ma to use for te
3360: 73 74 73 20 37 2e 31 2e 2a 20 74 6f 20 37 2e 33  sts 7.1.* to 7.3
3370: 2e 2a 2e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .*..do_execsql_t
3380: 65 73 74 20 37 2e 30 20 7b 20 0a 20 20 43 52 45  est 7.0 { .  CRE
3390: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
33a0: 62 29 3b 20 0a 20 20 43 52 45 41 54 45 20 54 41  b); .  CREATE TA
33b0: 42 4c 45 20 74 32 28 78 2c 20 79 29 3b 20 0a 20  BLE t2(x, y); . 
33c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
33d0: 28 69 2c 20 6a 2c 20 55 4e 49 51 55 45 28 69 29  (i, j, UNIQUE(i)
33e0: 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  );..  INSERT INT
33f0: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 61 27 2c  O t2 VALUES('a',
3400: 20 27 62 27 29 3b 0a 20 20 49 4e 53 45 52 54 20   'b');.  INSERT 
3410: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
3420: 63 27 2c 20 27 64 27 29 3b 0a 0a 20 20 49 4e 53  c', 'd');..  INS
3430: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
3440: 45 53 28 34 2c 20 31 36 29 3b 0a 20 20 49 4e 53  ES(4, 16);.  INS
3450: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
3460: 45 53 28 35 2c 20 32 35 29 3b 0a 20 20 49 4e 53  ES(5, 25);.  INS
3470: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
3480: 45 53 28 36 2c 20 33 36 29 3b 0a 7d 20 0a 0a 64  ES(6, 36);.} ..d
3490: 6f 5f 70 72 65 75 70 64 61 74 65 5f 74 65 73 74  o_preupdate_test
34a0: 20 37 2e 31 2e 31 20 7b 0a 20 20 49 4e 53 45 52   7.1.1 {.  INSER
34b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
34c0: 28 27 78 27 2c 20 27 79 27 29 0a 7d 20 7b 49 4e  ('x', 'y').} {IN
34d0: 53 45 52 54 20 6d 61 69 6e 20 74 31 20 31 20 31  SERT main t1 1 1
34e0: 20 20 78 20 79 7d 0a 0a 23 20 37 2e 31 2e 32 2e    x y}..# 7.1.2.
34f0: 31 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 74  1 does not use t
3500: 68 65 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61  he xfer optimiza
3510: 74 69 6f 6e 2e 20 37 2e 31 2e 32 2e 32 20 64 6f  tion. 7.1.2.2 do
3520: 65 73 2e 0a 64 6f 5f 70 72 65 75 70 64 61 74 65  es..do_preupdate
3530: 5f 74 65 73 74 20 37 2e 31 2e 32 2e 31 20 7b 0a  _test 7.1.2.1 {.
3540: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3550: 20 53 45 4c 45 43 54 20 79 2c 20 78 20 46 52 4f   SELECT y, x FRO
3560: 4d 20 74 32 3b 0a 7d 20 7b 49 4e 53 45 52 54 20  M t2;.} {INSERT 
3570: 6d 61 69 6e 20 74 31 20 32 20 32 20 62 20 61 20  main t1 2 2 b a 
3580: 20 20 49 4e 53 45 52 54 20 6d 61 69 6e 20 74 31    INSERT main t1
3590: 20 33 20 33 20 64 20 63 7d 0a 64 6f 5f 70 72 65   3 3 d c}.do_pre
35a0: 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e 31 2e  update_test 7.1.
35b0: 32 2e 32 20 7b 0a 20 20 49 4e 53 45 52 54 20 49  2.2 {.  INSERT I
35c0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20  NTO t1 SELECT * 
35d0: 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 4e 53 45  FROM t2;.} {INSE
35e0: 52 54 20 6d 61 69 6e 20 74 31 20 34 20 34 20 61  RT main t1 4 4 a
35f0: 20 62 20 20 20 49 4e 53 45 52 54 20 6d 61 69 6e   b   INSERT main
3600: 20 74 31 20 35 20 35 20 63 20 64 7d 0a 0a 64 6f   t1 5 5 c d}..do
3610: 5f 70 72 65 75 70 64 61 74 65 5f 74 65 73 74 20  _preupdate_test 
3620: 37 2e 31 2e 33 20 7b 0a 20 20 52 45 50 4c 41 43  7.1.3 {.  REPLAC
3630: 45 20 49 4e 54 4f 20 74 31 28 72 6f 77 69 64 2c  E INTO t1(rowid,
3640: 20 61 2c 20 62 29 20 56 41 4c 55 45 53 28 31 2c   a, b) VALUES(1,
3650: 20 31 2c 20 31 29 3b 0a 7d 20 7b 0a 20 20 44 45   1, 1);.} {.  DE
3660: 4c 45 54 45 20 6d 61 69 6e 20 74 31 20 31 20 31  LETE main t1 1 1
3670: 20 20 20 78 20 79 0a 20 20 49 4e 53 45 52 54 20     x y.  INSERT 
3680: 6d 61 69 6e 20 74 31 20 31 20 31 20 20 20 31 20  main t1 1 1   1 
3690: 31 0a 7d 0a 0a 64 6f 5f 70 72 65 75 70 64 61 74  1.}..do_preupdat
36a0: 65 5f 74 65 73 74 20 37 2e 31 2e 34 20 7b 0a 20  e_test 7.1.4 {. 
36b0: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 33   REPLACE INTO t3
36c0: 20 56 41 4c 55 45 53 28 34 2c 20 4e 55 4c 4c 29   VALUES(4, NULL)
36d0: 3b 0a 7d 20 7b 0a 20 20 44 45 4c 45 54 45 20 6d  ;.} {.  DELETE m
36e0: 61 69 6e 20 74 33 20 31 20 31 20 20 20 34 20 31  ain t3 1 1   4 1
36f0: 36 0a 20 20 49 4e 53 45 52 54 20 6d 61 69 6e 20  6.  INSERT main 
3700: 74 33 20 34 20 34 20 20 20 34 20 7b 7d 0a 7d 0a  t3 4 4   4 {}.}.
3710: 0a 64 6f 5f 70 72 65 75 70 64 61 74 65 5f 74 65  .do_preupdate_te
3720: 73 74 20 37 2e 31 2e 35 20 7b 0a 20 20 52 45 50  st 7.1.5 {.  REP
3730: 4c 41 43 45 20 49 4e 54 4f 20 74 33 28 72 6f 77  LACE INTO t3(row
3740: 69 64 2c 20 69 2c 20 6a 29 20 56 41 4c 55 45 53  id, i, j) VALUES
3750: 28 32 2c 20 36 2c 20 4e 55 4c 4c 29 3b 0a 7d 20  (2, 6, NULL);.} 
3760: 7b 0a 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20  {.  DELETE main 
3770: 74 33 20 32 20 32 20 20 35 20 32 35 0a 20 20 44  t3 2 2  5 25.  D
3780: 45 4c 45 54 45 20 6d 61 69 6e 20 74 33 20 33 20  ELETE main t3 3 
3790: 33 20 20 36 20 33 36 0a 20 20 49 4e 53 45 52 54  3  6 36.  INSERT
37a0: 20 6d 61 69 6e 20 74 33 20 32 20 32 20 20 36 20   main t3 2 2  6 
37b0: 7b 7d 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  {}.}..do_execsql
37c0: 5f 74 65 73 74 20 37 2e 32 2e 30 20 7b 20 53 45  _test 7.2.0 { SE
37d0: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
37e0: 74 31 20 7d 20 7b 31 20 32 20 33 20 34 20 35 7d  t1 } {1 2 3 4 5}
37f0: 0a 0a 64 6f 5f 70 72 65 75 70 64 61 74 65 5f 74  ..do_preupdate_t
3800: 65 73 74 20 37 2e 32 2e 31 20 7b 0a 20 20 44 45  est 7.2.1 {.  DE
3810: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
3820: 52 45 20 72 6f 77 69 64 20 3d 20 33 0a 7d 20 7b  RE rowid = 3.} {
3830: 0a 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20 74  .  DELETE main t
3840: 31 20 33 20 33 20 20 64 20 63 0a 7d 0a 64 6f 5f  1 3 3  d c.}.do_
3850: 70 72 65 75 70 64 61 74 65 5f 74 65 73 74 20 37  preupdate_test 7
3860: 2e 32 2e 32 20 7b 0a 20 20 44 45 4c 45 54 45 20  .2.2 {.  DELETE 
3870: 46 52 4f 4d 20 74 31 0a 7d 20 7b 0a 20 20 44 45  FROM t1.} {.  DE
3880: 4c 45 54 45 20 6d 61 69 6e 20 74 31 20 31 20 31  LETE main t1 1 1
3890: 20 20 20 31 20 31 0a 20 20 44 45 4c 45 54 45 20     1 1.  DELETE 
38a0: 6d 61 69 6e 20 74 31 20 32 20 32 20 20 20 62 20  main t1 2 2   b 
38b0: 61 0a 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20  a.  DELETE main 
38c0: 74 31 20 34 20 34 20 20 20 61 20 62 0a 20 20 44  t1 4 4   a b.  D
38d0: 45 4c 45 54 45 20 6d 61 69 6e 20 74 31 20 35 20  ELETE main t1 5 
38e0: 35 20 20 20 63 20 64 0a 7d 0a 0a 64 6f 5f 65 78  5   c d.}..do_ex
38f0: 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 33 2e 30  ecsql_test 7.3.0
3900: 20 7b 20 0a 20 20 44 45 4c 45 54 45 20 46 52 4f   { .  DELETE FRO
3910: 4d 20 74 31 3b 0a 20 20 44 45 4c 45 54 45 20 46  M t1;.  DELETE F
3920: 52 4f 4d 20 74 32 3b 0a 20 20 44 45 4c 45 54 45  ROM t2;.  DELETE
3930: 20 46 52 4f 4d 20 74 33 3b 0a 0a 20 20 49 4e 53   FROM t3;..  INS
3940: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
3950: 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
3960: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
3970: 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b  ALUES('c', 'd');
3980: 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ..  INSERT INTO 
3990: 74 33 20 56 41 4c 55 45 53 28 34 2c 20 31 36 29  t3 VALUES(4, 16)
39a0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
39b0: 74 33 20 56 41 4c 55 45 53 28 35 2c 20 32 35 29  t3 VALUES(5, 25)
39c0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
39d0: 74 33 20 56 41 4c 55 45 53 28 36 2c 20 33 36 29  t3 VALUES(6, 36)
39e0: 3b 0a 7d 0a 0a 64 6f 5f 70 72 65 75 70 64 61 74  ;.}..do_preupdat
39f0: 65 5f 74 65 73 74 20 37 2e 33 2e 31 20 7b 0a 20  e_test 7.3.1 {. 
3a00: 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20 79   UPDATE t2 SET y
3a10: 20 3d 20 79 7c 7c 79 3b 0a 7d 20 7b 0a 20 20 55   = y||y;.} {.  U
3a20: 50 44 41 54 45 20 6d 61 69 6e 20 74 32 20 31 20  PDATE main t2 1 
3a30: 31 20 20 20 61 20 62 20 20 61 20 62 62 0a 20 20  1   a b  a bb.  
3a40: 55 50 44 41 54 45 20 6d 61 69 6e 20 74 32 20 32  UPDATE main t2 2
3a50: 20 32 20 20 20 63 20 64 20 20 63 20 64 64 0a 7d   2   c d  c dd.}
3a60: 0a 0a 64 6f 5f 70 72 65 75 70 64 61 74 65 5f 74  ..do_preupdate_t
3a70: 65 73 74 20 37 2e 33 2e 32 20 7b 0a 20 20 55 50  est 7.3.2 {.  UP
3a80: 44 41 54 45 20 74 32 20 53 45 54 20 72 6f 77 69  DATE t2 SET rowi
3a90: 64 20 3d 20 72 6f 77 69 64 2d 31 3b 0a 7d 20 7b  d = rowid-1;.} {
3aa0: 0a 20 20 55 50 44 41 54 45 20 6d 61 69 6e 20 74  .  UPDATE main t
3ab0: 32 20 31 20 30 20 20 20 61 20 62 62 20 20 61 20  2 1 0   a bb  a 
3ac0: 62 62 0a 20 20 55 50 44 41 54 45 20 6d 61 69 6e  bb.  UPDATE main
3ad0: 20 74 32 20 32 20 31 20 20 20 63 20 64 64 20 20   t2 2 1   c dd  
3ae0: 63 20 64 64 0a 7d 0a 0a 64 6f 5f 70 72 65 75 70  c dd.}..do_preup
3af0: 64 61 74 65 5f 74 65 73 74 20 37 2e 33 2e 33 20  date_test 7.3.3 
3b00: 7b 0a 20 20 55 50 44 41 54 45 20 4f 52 20 52 45  {.  UPDATE OR RE
3b10: 50 4c 41 43 45 20 74 32 20 53 45 54 20 72 6f 77  PLACE t2 SET row
3b20: 69 64 20 3d 20 31 20 57 48 45 52 45 20 78 20 3d  id = 1 WHERE x =
3b30: 20 27 61 27 0a 7d 20 7b 0a 20 20 44 45 4c 45 54   'a'.} {.  DELET
3b40: 45 20 6d 61 69 6e 20 74 32 20 31 20 31 20 20 20  E main t2 1 1   
3b50: 63 20 64 64 0a 20 20 55 50 44 41 54 45 20 6d 61  c dd.  UPDATE ma
3b60: 69 6e 20 74 32 20 30 20 31 20 20 20 61 20 62 62  in t2 0 1   a bb
3b70: 20 20 61 20 62 62 0a 7d 0a 0a 64 6f 5f 70 72 65    a bb.}..do_pre
3b80: 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e 33 2e  update_test 7.3.
3b90: 34 2e 31 20 7b 0a 20 20 55 50 44 41 54 45 20 4f  4.1 {.  UPDATE O
3ba0: 52 20 52 45 50 4c 41 43 45 20 74 33 20 53 45 54  R REPLACE t3 SET
3bb0: 20 69 20 3d 20 35 20 57 48 45 52 45 20 69 20 3d   i = 5 WHERE i =
3bc0: 20 36 0a 7d 20 7b 0a 20 20 44 45 4c 45 54 45 20   6.} {.  DELETE 
3bd0: 6d 61 69 6e 20 74 33 20 32 20 32 20 20 20 35 20  main t3 2 2   5 
3be0: 32 35 0a 20 20 55 50 44 41 54 45 20 6d 61 69 6e  25.  UPDATE main
3bf0: 20 74 33 20 33 20 33 20 20 20 36 20 33 36 20 20   t3 3 3   6 36  
3c00: 35 20 33 36 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73  5 36.}..do_execs
3c10: 71 6c 5f 74 65 73 74 20 37 2e 33 2e 34 2e 32 20  ql_test 7.3.4.2 
3c20: 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  {.  INSERT INTO 
3c30: 74 33 20 56 41 4c 55 45 53 28 31 30 2c 20 31 30  t3 VALUES(10, 10
3c40: 30 29 3b 0a 20 20 53 45 4c 45 43 54 20 72 6f 77  0);.  SELECT row
3c50: 69 64 2c 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 7d  id, * FROM t3;.}
3c60: 20 7b 31 20 34 20 31 36 20 20 20 33 20 35 20 33   {1 4 16   3 5 3
3c70: 36 20 20 20 34 20 31 30 20 31 30 30 7d 0a 0a 64  6   4 10 100}..d
3c80: 6f 5f 70 72 65 75 70 64 61 74 65 5f 74 65 73 74  o_preupdate_test
3c90: 20 37 2e 33 2e 35 20 7b 0a 20 20 55 50 44 41 54   7.3.5 {.  UPDAT
3ca0: 45 20 4f 52 20 52 45 50 4c 41 43 45 20 74 33 20  E OR REPLACE t3 
3cb0: 53 45 54 20 72 6f 77 69 64 20 3d 20 31 2c 20 69  SET rowid = 1, i
3cc0: 20 3d 20 35 20 57 48 45 52 45 20 6a 20 3d 20 31   = 5 WHERE j = 1
3cd0: 30 30 3b 0a 7d 20 7b 0a 20 20 44 45 4c 45 54 45  00;.} {.  DELETE
3ce0: 20 6d 61 69 6e 20 74 33 20 31 20 31 20 20 20 20   main t3 1 1    
3cf0: 34 20 20 31 36 0a 20 20 44 45 4c 45 54 45 20 6d  4  16.  DELETE m
3d00: 61 69 6e 20 74 33 20 33 20 33 20 20 20 20 35 20  ain t3 3 3    5 
3d10: 20 33 36 0a 20 20 55 50 44 41 54 45 20 6d 61 69   36.  UPDATE mai
3d20: 6e 20 74 33 20 34 20 31 20 20 20 31 30 20 31 30  n t3 4 1   10 10
3d30: 30 20 20 35 20 31 30 30 0a 7d 0a 0a 64 6f 5f 65  0  5 100.}..do_e
3d40: 78 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 34 2e  xecsql_test 7.4.
3d50: 31 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  1.0 {.  CREATE T
3d60: 41 42 4c 45 20 74 34 28 61 2c 20 62 29 3b 0a 20  ABLE t4(a, b);. 
3d70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
3d80: 56 41 4c 55 45 53 28 27 61 27 2c 20 31 29 3b 0a  VALUES('a', 1);.
3d90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34    INSERT INTO t4
3da0: 20 56 41 4c 55 45 53 28 27 62 27 2c 20 32 29 3b   VALUES('b', 2);
3db0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
3dc0: 34 20 56 41 4c 55 45 53 28 27 63 27 2c 20 33 29  4 VALUES('c', 3)
3dd0: 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 52 49 47  ;..  CREATE TRIG
3de0: 47 45 52 20 74 34 74 20 42 45 46 4f 52 45 20 44  GER t4t BEFORE D
3df0: 45 4c 45 54 45 20 4f 4e 20 74 34 20 42 45 47 49  ELETE ON t4 BEGI
3e00: 4e 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  N.    DELETE FRO
3e10: 4d 20 74 34 20 57 48 45 52 45 20 62 20 3d 20 31  M t4 WHERE b = 1
3e20: 3b 0a 20 20 45 4e 44 3b 0a 7d 0a 0a 64 6f 5f 70  ;.  END;.}..do_p
3e30: 72 65 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e  reupdate_test 7.
3e40: 34 2e 31 2e 31 20 7b 0a 20 20 44 45 4c 45 54 45  4.1.1 {.  DELETE
3e50: 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 62   FROM t4 WHERE b
3e60: 20 3d 20 33 0a 7d 20 7b 0a 20 20 44 45 4c 45 54   = 3.} {.  DELET
3e70: 45 20 6d 61 69 6e 20 74 34 20 31 20 31 20 20 20  E main t4 1 1   
3e80: 61 20 31 0a 20 20 44 45 4c 45 54 45 20 6d 61 69  a 1.  DELETE mai
3e90: 6e 20 74 34 20 33 20 33 20 20 20 63 20 33 0a 7d  n t4 3 3   c 3.}
3ea0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
3eb0: 74 20 37 2e 34 2e 31 2e 32 20 7b 0a 20 20 49 4e  t 7.4.1.2 {.  IN
3ec0: 53 45 52 54 20 49 4e 54 4f 20 74 34 28 72 6f 77  SERT INTO t4(row
3ed0: 69 64 2c 20 61 2c 20 62 29 20 56 41 4c 55 45 53  id, a, b) VALUES
3ee0: 28 31 2c 20 27 61 27 2c 20 31 29 3b 0a 20 20 49  (1, 'a', 1);.  I
3ef0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 28 72 6f  NSERT INTO t4(ro
3f00: 77 69 64 2c 20 61 2c 20 62 29 20 56 41 4c 55 45  wid, a, b) VALUE
3f10: 53 28 33 2c 20 27 63 27 2c 20 33 29 3b 0a 7d 0a  S(3, 'c', 3);.}.
3f20: 64 6f 5f 70 72 65 75 70 64 61 74 65 5f 74 65 73  do_preupdate_tes
3f30: 74 20 37 2e 34 2e 31 2e 33 20 7b 0a 20 20 44 45  t 7.4.1.3 {.  DE
3f40: 4c 45 54 45 20 46 52 4f 4d 20 74 34 20 57 48 45  LETE FROM t4 WHE
3f50: 52 45 20 62 20 3d 20 31 0a 7d 20 7b 0a 20 20 44  RE b = 1.} {.  D
3f60: 45 4c 45 54 45 20 6d 61 69 6e 20 74 34 20 31 20  ELETE main t4 1 
3f70: 31 20 20 20 61 20 31 0a 7d 0a 0a 64 6f 5f 65 78  1   a 1.}..do_ex
3f80: 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 34 2e 32  ecsql_test 7.4.2
3f90: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
3fa0: 42 4c 45 20 74 35 28 61 2c 20 62 29 3b 0a 20 20  BLE t5(a, b);.  
3fb0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56  INSERT INTO t5 V
3fc0: 41 4c 55 45 53 28 27 61 27 2c 20 31 29 3b 0a 20  ALUES('a', 1);. 
3fd0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20   INSERT INTO t5 
3fe0: 56 41 4c 55 45 53 28 27 62 27 2c 20 32 29 3b 0a  VALUES('b', 2);.
3ff0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35    INSERT INTO t5
4000: 20 56 41 4c 55 45 53 28 27 63 27 2c 20 33 29 3b   VALUES('c', 3);
4010: 0a 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47  ..  CREATE TRIGG
4020: 45 52 20 74 35 74 20 42 45 46 4f 52 45 20 55 50  ER t5t BEFORE UP
4030: 44 41 54 45 20 4f 4e 20 74 35 20 42 45 47 49 4e  DATE ON t5 BEGIN
4040: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
4050: 20 74 35 20 57 48 45 52 45 20 62 20 3d 20 31 3b   t5 WHERE b = 1;
4060: 0a 20 20 45 4e 44 3b 0a 7d 0a 64 6f 5f 70 72 65  .  END;.}.do_pre
4070: 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e 34 2e  update_test 7.4.
4080: 32 2e 31 20 7b 0a 20 20 55 50 44 41 54 45 20 74  2.1 {.  UPDATE t
4090: 35 20 53 45 54 20 62 20 3d 20 34 20 57 48 45 52  5 SET b = 4 WHER
40a0: 45 20 61 20 3d 20 27 63 27 0a 7d 20 7b 0a 20 20  E a = 'c'.} {.  
40b0: 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 35 20 31  DELETE main t5 1
40c0: 20 31 20 20 20 61 20 31 0a 20 20 55 50 44 41 54   1   a 1.  UPDAT
40d0: 45 20 6d 61 69 6e 20 74 35 20 33 20 33 20 20 20  E main t5 3 3   
40e0: 63 20 33 20 20 63 20 34 0a 7d 0a 0a 64 6f 5f 65  c 3  c 4.}..do_e
40f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 34 2e  xecsql_test 7.4.
4100: 32 2e 32 20 7b 0a 20 20 49 4e 53 45 52 54 20 49  2.2 {.  INSERT I
4110: 4e 54 4f 20 74 35 28 72 6f 77 69 64 2c 20 61 2c  NTO t5(rowid, a,
4120: 20 62 29 20 56 41 4c 55 45 53 28 31 2c 20 27 61   b) VALUES(1, 'a
4130: 27 2c 20 31 29 3b 0a 7d 0a 0a 64 6f 5f 70 72 65  ', 1);.}..do_pre
4140: 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e 34 2e  update_test 7.4.
4150: 32 2e 33 20 7b 0a 20 20 55 50 44 41 54 45 20 74  2.3 {.  UPDATE t
4160: 35 20 53 45 54 20 62 20 3d 20 35 20 57 48 45 52  5 SET b = 5 WHER
4170: 45 20 61 20 3d 20 27 61 27 0a 7d 20 7b 0a 20 20  E a = 'a'.} {.  
4180: 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 35 20 31  DELETE main t5 1
4190: 20 31 20 20 20 61 20 31 0a 7d 0a 0a 64 6f 5f 65   1   a 1.}..do_e
41a0: 78 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 35 2e  xecsql_test 7.5.
41b0: 31 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  1.0 {.  CREATE T
41c0: 41 42 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a 20  ABLE t7(a, b);. 
41d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 20   INSERT INTO t7 
41e0: 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27 74  VALUES('one', 't
41f0: 77 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  wo');.  INSERT I
4200: 4e 54 4f 20 74 37 20 56 41 4c 55 45 53 28 27 74  NTO t7 VALUES('t
4210: 68 72 65 65 27 2c 20 27 66 6f 75 72 27 29 3b 0a  hree', 'four');.
4220: 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 37    ALTER TABLE t7
4230: 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20 44 45   ADD COLUMN c DE
4240: 46 41 55 4c 54 20 4e 55 4c 4c 3b 0a 7d 0a 0a 64  FAULT NULL;.}..d
4250: 6f 5f 70 72 65 75 70 64 61 74 65 5f 74 65 73 74  o_preupdate_test
4260: 20 37 2e 35 2e 31 2e 31 20 7b 0a 20 20 44 45 4c   7.5.1.1 {.  DEL
4270: 45 54 45 20 46 52 4f 4d 20 74 37 20 57 48 45 52  ETE FROM t7 WHER
4280: 45 20 61 20 3d 20 27 6f 6e 65 27 0a 7d 20 7b 0a  E a = 'one'.} {.
4290: 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 37    DELETE main t7
42a0: 20 31 20 31 20 20 20 6f 6e 65 20 74 77 6f 20 7b   1 1   one two {
42b0: 7d 0a 7d 0a 0a 64 6f 5f 70 72 65 75 70 64 61 74  }.}..do_preupdat
42c0: 65 5f 74 65 73 74 20 37 2e 35 2e 31 2e 32 20 7b  e_test 7.5.1.2 {
42d0: 0a 20 20 55 50 44 41 54 45 20 74 37 20 53 45 54  .  UPDATE t7 SET
42e0: 20 62 20 3d 20 27 66 69 76 65 27 0a 7d 20 7b 0a   b = 'five'.} {.
42f0: 20 20 55 50 44 41 54 45 20 6d 61 69 6e 20 74 37    UPDATE main t7
4300: 20 32 20 32 20 20 20 74 68 72 65 65 20 66 6f 75   2 2   three fou
4310: 72 20 7b 7d 20 20 74 68 72 65 65 20 66 69 76 65  r {}  three five
4320: 20 7b 7d 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71   {}.}..do_execsq
4330: 6c 5f 74 65 73 74 20 37 2e 35 2e 32 2e 30 20 7b  l_test 7.5.2.0 {
4340: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
4350: 74 38 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45  t8(a, b);.  INSE
4360: 52 54 20 49 4e 54 4f 20 74 38 20 56 41 4c 55 45  RT INTO t8 VALUE
4370: 53 28 27 6f 6e 65 27 2c 20 27 74 77 6f 27 29 3b  S('one', 'two');
4380: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
4390: 38 20 56 41 4c 55 45 53 28 27 74 68 72 65 65 27  8 VALUES('three'
43a0: 2c 20 27 66 6f 75 72 27 29 3b 0a 20 20 41 4c 54  , 'four');.  ALT
43b0: 45 52 20 54 41 42 4c 45 20 74 38 20 41 44 44 20  ER TABLE t8 ADD 
43c0: 43 4f 4c 55 4d 4e 20 63 20 44 45 46 41 55 4c 54  COLUMN c DEFAULT
43d0: 20 27 78 78 78 27 3b 0a 7d 0a 0a 69 66 63 61 70   'xxx';.}..ifcap
43e0: 61 62 6c 65 20 21 73 65 73 73 69 6f 6e 20 7b 0a  able !session {.
43f0: 20 20 23 20 41 74 20 74 69 6d 65 20 6f 66 20 77    # At time of w
4400: 72 69 74 69 6e 67 2c 20 74 68 65 73 65 20 74 77  riting, these tw
4410: 6f 20 61 72 65 20 62 72 6f 6b 65 6e 2e 20 54 68  o are broken. Th
4420: 65 79 20 64 65 6d 6f 6e 73 74 72 61 74 65 20 74  ey demonstrate t
4430: 68 61 74 20 74 68 65 0a 20 20 23 20 73 71 6c 69  hat the.  # sqli
4440: 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c  te3_preupdate_ol
4450: 64 28 29 20 6d 65 74 68 6f 64 20 64 6f 65 73 20  d() method does 
4460: 6e 6f 74 20 68 61 6e 64 6c 65 20 74 68 65 20 63  not handle the c
4470: 61 73 65 20 77 68 65 72 65 20 41 4c 54 45 52 20  ase where ALTER 
4480: 54 41 42 4c 45 0a 20 20 23 20 68 61 73 20 62 65  TABLE.  # has be
4490: 65 6e 20 75 73 65 64 20 74 6f 20 61 64 64 20 61  en used to add a
44a0: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20 64   column with a d
44b0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 74 68  efault value oth
44c0: 65 72 20 74 68 61 6e 20 4e 55 4c 4c 2e 0a 20 20  er than NULL..  
44d0: 23 0a 20 20 64 6f 5f 70 72 65 75 70 64 61 74 65  #.  do_preupdate
44e0: 5f 74 65 73 74 20 37 2e 35 2e 32 2e 31 20 7b 0a  _test 7.5.2.1 {.
44f0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
4500: 74 38 20 57 48 45 52 45 20 61 20 3d 20 27 6f 6e  t8 WHERE a = 'on
4510: 65 27 0a 20 20 7d 20 7b 0a 20 20 20 20 44 45 4c  e'.  } {.    DEL
4520: 45 54 45 20 6d 61 69 6e 20 74 38 20 31 20 31 20  ETE main t8 1 1 
4530: 20 20 6f 6e 65 20 74 77 6f 20 78 78 78 0a 20 20    one two xxx.  
4540: 7d 0a 20 20 64 6f 5f 70 72 65 75 70 64 61 74 65  }.  do_preupdate
4550: 5f 74 65 73 74 20 37 2e 35 2e 32 2e 32 20 7b 0a  _test 7.5.2.2 {.
4560: 20 20 20 20 55 50 44 41 54 45 20 74 38 20 53 45      UPDATE t8 SE
4570: 54 20 62 20 3d 20 27 66 69 76 65 27 0a 20 20 7d  T b = 'five'.  }
4580: 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 6d 61   {.    UPDATE ma
4590: 69 6e 20 74 38 20 32 20 32 20 20 20 74 68 72 65  in t8 2 2   thre
45a0: 65 20 66 6f 75 72 20 78 78 78 20 20 74 68 72 65  e four xxx  thre
45b0: 65 20 66 69 76 65 20 78 78 78 0a 20 20 7d 0a 7d  e five xxx.  }.}
45c0: 0a 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  ..# This block o
45d0: 66 20 74 65 73 74 73 20 76 65 72 69 66 69 65 73  f tests verifies
45e0: 20 74 68 61 74 20 49 50 4b 20 76 61 6c 75 65 73   that IPK values
45f0: 20 61 72 65 20 63 6f 72 72 65 63 74 6c 79 20 72   are correctly r
4600: 65 70 6f 72 74 65 64 0a 23 20 62 79 20 74 68 65  eported.# by the
4610: 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61   sqlite3_preupda
4620: 74 65 5f 6f 6c 64 28 29 20 61 6e 64 20 73 71 6c  te_old() and sql
4630: 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6e  ite3_preupdate_n
4640: 65 77 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ew() functions..
4650: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
4660: 74 20 37 2e 36 2e 31 20 7b 20 43 52 45 41 54 45  t 7.6.1 { CREATE
4670: 20 54 41 42 4c 45 20 74 39 28 61 2c 20 62 20 49   TABLE t9(a, b I
4680: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
4690: 45 59 2c 20 63 29 20 7d 0a 64 6f 5f 70 72 65 75  EY, c) }.do_preu
46a0: 70 64 61 74 65 5f 74 65 73 74 20 37 2e 36 2e 32  pdate_test 7.6.2
46b0: 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f   {.  INSERT INTO
46c0: 20 74 39 20 56 41 4c 55 45 53 28 31 2c 20 32 2c   t9 VALUES(1, 2,
46d0: 20 33 29 3b 0a 20 20 55 50 44 41 54 45 20 74 39   3);.  UPDATE t9
46e0: 20 53 45 54 20 62 20 3d 20 62 2b 31 2c 20 63 20   SET b = b+1, c 
46f0: 3d 20 63 2b 31 3b 0a 20 20 44 45 4c 45 54 45 20  = c+1;.  DELETE 
4700: 46 52 4f 4d 20 74 39 20 57 48 45 52 45 20 61 20  FROM t9 WHERE a 
4710: 3d 20 31 3b 0a 7d 20 7b 0a 20 20 49 4e 53 45 52  = 1;.} {.  INSER
4720: 54 20 6d 61 69 6e 20 74 39 20 32 20 32 20 20 20  T main t9 2 2   
4730: 31 20 32 20 33 0a 20 20 55 50 44 41 54 45 20 6d  1 2 3.  UPDATE m
4740: 61 69 6e 20 74 39 20 32 20 33 20 20 20 31 20 32  ain t9 2 3   1 2
4750: 20 33 20 20 20 31 20 33 20 34 0a 20 20 44 45 4c   3   1 3 4.  DEL
4760: 45 54 45 20 6d 61 69 6e 20 74 39 20 33 20 33 20  ETE main t9 3 3 
4770: 20 20 31 20 33 20 34 0a 7d 0a 0a 23 2d 2d 2d 2d    1 3 4.}..#----
4780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47c0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
47d0: 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 70  at the sqlite3_p
47e0: 72 65 75 70 64 61 74 65 5f 64 65 70 74 68 28 29  reupdate_depth()
47f0: 20 41 50 49 20 73 65 65 6d 73 20 74 6f 20 77 6f   API seems to wo
4800: 72 6b 2e 0a 23 0a 70 72 6f 63 20 70 72 65 75 70  rk..#.proc preup
4810: 64 61 74 65 5f 68 6f 6f 6b 20 7b 61 72 67 73 7d  date_hook {args}
4820: 20 7b 0a 20 20 73 65 74 20 74 79 70 65 20 5b 6c   {.  set type [l
4830: 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d 0a 20  index $args 0]. 
4840: 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 3a 3a   eval lappend ::
4850: 70 72 65 75 70 64 61 74 65 20 24 61 72 67 73 0a  preupdate $args.
4860: 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 3a    eval lappend :
4870: 3a 70 72 65 75 70 64 61 74 65 20 5b 64 62 20 70  :preupdate [db p
4880: 72 65 75 70 64 61 74 65 20 64 65 70 74 68 5d 0a  reupdate depth].
4890: 0a 20 20 69 66 20 7b 24 74 79 70 65 20 21 3d 20  .  if {$type != 
48a0: 22 49 4e 53 45 52 54 22 7d 20 7b 0a 20 20 20 20  "INSERT"} {.    
48b0: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
48c0: 69 20 3c 20 5b 64 62 20 70 72 65 75 70 64 61 74  i < [db preupdat
48d0: 65 20 63 6f 75 6e 74 5d 7d 20 7b 69 6e 63 72 20  e count]} {incr 
48e0: 69 7d 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65  i} {.      lappe
48f0: 6e 64 20 3a 3a 70 72 65 75 70 64 61 74 65 20 5b  nd ::preupdate [
4900: 64 62 20 70 72 65 75 70 64 61 74 65 20 6f 6c 64  db preupdate old
4910: 20 24 69 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   $i].    }.  }. 
4920: 20 69 66 20 7b 24 74 79 70 65 20 21 3d 20 22 44   if {$type != "D
4930: 45 4c 45 54 45 22 7d 20 7b 0a 20 20 20 20 66 6f  ELETE"} {.    fo
4940: 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20  r {set i 0} {$i 
4950: 3c 20 5b 64 62 20 70 72 65 75 70 64 61 74 65 20  < [db preupdate 
4960: 63 6f 75 6e 74 5d 7d 20 7b 69 6e 63 72 20 69 7d  count]} {incr i}
4970: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 72 63 20   {.      set rc 
4980: 5b 63 61 74 63 68 20 7b 20 64 62 20 70 72 65 75  [catch { db preu
4990: 70 64 61 74 65 20 6e 65 77 20 24 69 20 7d 20 76  pdate new $i } v
49a0: 5d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20  ].      lappend 
49b0: 3a 3a 70 72 65 75 70 64 61 74 65 20 24 76 0a 20  ::preupdate $v. 
49c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 64 62 20 63     }.  }.}..db c
49d0: 6c 6f 73 65 0a 66 6f 72 63 65 64 65 6c 65 74 65  lose.forcedelete
49e0: 20 74 65 73 74 2e 64 62 0a 73 71 6c 69 74 65 33   test.db.sqlite3
49f0: 20 64 62 20 74 65 73 74 2e 64 62 0a 64 62 20 70   db test.db.db p
4a00: 72 65 75 70 64 61 74 65 20 68 6f 6f 6b 20 70 72  reupdate hook pr
4a10: 65 75 70 64 61 74 65 5f 68 6f 6f 6b 0a 0a 64 6f  eupdate_hook..do
4a20: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 37 2e  _execsql_test 7.
4a30: 36 2e 31 20 7b 20 0a 20 20 43 52 45 41 54 45 20  6.1 { .  CREATE 
4a40: 54 41 42 4c 45 20 74 31 28 78 20 50 52 49 4d 41  TABLE t1(x PRIMA
4a50: 52 59 20 4b 45 59 29 3b 0a 20 20 43 52 45 41 54  RY KEY);.  CREAT
4a60: 45 20 54 41 42 4c 45 20 74 32 28 78 20 50 52 49  E TABLE t2(x PRI
4a70: 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 43 52 45  MARY KEY);.  CRE
4a80: 41 54 45 20 54 41 42 4c 45 20 74 33 28 78 20 50  ATE TABLE t3(x P
4a90: 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 43  RIMARY KEY);.  C
4aa0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 78  REATE TABLE t4(x
4ab0: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 0a   PRIMARY KEY);..
4ac0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
4ad0: 20 61 20 41 46 54 45 52 20 49 4e 53 45 52 54 20   a AFTER INSERT 
4ae0: 4f 4e 20 74 31 20 42 45 47 49 4e 20 49 4e 53 45  ON t1 BEGIN INSE
4af0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
4b00: 53 28 6e 65 77 2e 78 29 3b 20 45 4e 44 3b 0a 20  S(new.x); END;. 
4b10: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
4b20: 62 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  b AFTER INSERT O
4b30: 4e 20 74 32 20 42 45 47 49 4e 20 49 4e 53 45 52  N t2 BEGIN INSER
4b40: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
4b50: 28 6e 65 77 2e 78 29 3b 20 45 4e 44 3b 0a 20 20  (new.x); END;.  
4b60: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 63  CREATE TRIGGER c
4b70: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
4b80: 20 74 33 20 42 45 47 49 4e 20 49 4e 53 45 52 54   t3 BEGIN INSERT
4b90: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
4ba0: 6e 65 77 2e 78 29 3b 20 45 4e 44 3b 0a 0a 20 20  new.x); END;..  
4bb0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 64  CREATE TRIGGER d
4bc0: 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e   AFTER UPDATE ON
4bd0: 20 74 31 20 42 45 47 49 4e 20 55 50 44 41 54 45   t1 BEGIN UPDATE
4be0: 20 74 32 20 53 45 54 20 78 20 3d 20 6e 65 77 2e   t2 SET x = new.
4bf0: 78 3b 20 45 4e 44 3b 0a 20 20 43 52 45 41 54 45  x; END;.  CREATE
4c00: 20 54 52 49 47 47 45 52 20 65 20 41 46 54 45 52   TRIGGER e AFTER
4c10: 20 55 50 44 41 54 45 20 4f 4e 20 74 32 20 42 45   UPDATE ON t2 BE
4c20: 47 49 4e 20 55 50 44 41 54 45 20 74 33 20 53 45  GIN UPDATE t3 SE
4c30: 54 20 78 20 3d 20 6e 65 77 2e 78 3b 20 45 4e 44  T x = new.x; END
4c40: 3b 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47  ;.  CREATE TRIGG
4c50: 45 52 20 66 20 41 46 54 45 52 20 55 50 44 41 54  ER f AFTER UPDAT
4c60: 45 20 4f 4e 20 74 33 20 42 45 47 49 4e 20 55 50  E ON t3 BEGIN UP
4c70: 44 41 54 45 20 74 34 20 53 45 54 20 78 20 3d 20  DATE t4 SET x = 
4c80: 6e 65 77 2e 78 3b 20 45 4e 44 3b 0a 0a 20 20 43  new.x; END;..  C
4c90: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 67 20  REATE TRIGGER g 
4ca0: 41 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20  AFTER DELETE ON 
4cb0: 74 31 20 42 45 47 49 4e 20 44 45 4c 45 54 45 20  t1 BEGIN DELETE 
4cc0: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 31 3b  FROM t2 WHERE 1;
4cd0: 20 45 4e 44 3b 0a 20 20 43 52 45 41 54 45 20 54   END;.  CREATE T
4ce0: 52 49 47 47 45 52 20 68 20 41 46 54 45 52 20 44  RIGGER h AFTER D
4cf0: 45 4c 45 54 45 20 4f 4e 20 74 32 20 42 45 47 49  ELETE ON t2 BEGI
4d00: 4e 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 33  N DELETE FROM t3
4d10: 20 57 48 45 52 45 20 31 3b 20 45 4e 44 3b 0a 20   WHERE 1; END;. 
4d20: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
4d30: 69 20 41 46 54 45 52 20 44 45 4c 45 54 45 20 4f  i AFTER DELETE O
4d40: 4e 20 74 33 20 42 45 47 49 4e 20 44 45 4c 45 54  N t3 BEGIN DELET
4d50: 45 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20  E FROM t4 WHERE 
4d60: 31 3b 20 45 4e 44 3b 0a 7d 0a 0a 64 6f 5f 70 72  1; END;.}..do_pr
4d70: 65 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e 36  eupdate_test 7.6
4d80: 2e 32 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e  .2 {.  INSERT IN
4d90: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78 79  TO t1 VALUES('xy
4da0: 7a 27 29 3b 0a 7d 20 7b 0a 20 20 49 4e 53 45 52  z');.} {.  INSER
4db0: 54 20 6d 61 69 6e 20 74 31 20 31 20 31 20 20 20  T main t1 1 1   
4dc0: 30 20 20 20 20 20 20 78 79 7a 0a 20 20 49 4e 53  0      xyz.  INS
4dd0: 45 52 54 20 6d 61 69 6e 20 74 32 20 31 20 31 20  ERT main t2 1 1 
4de0: 20 20 31 20 20 20 20 20 20 78 79 7a 0a 20 20 49    1      xyz.  I
4df0: 4e 53 45 52 54 20 6d 61 69 6e 20 74 33 20 31 20  NSERT main t3 1 
4e00: 31 20 20 20 32 20 20 20 20 20 20 78 79 7a 0a 20  1   2      xyz. 
4e10: 20 49 4e 53 45 52 54 20 6d 61 69 6e 20 74 34 20   INSERT main t4 
4e20: 31 20 31 20 20 20 33 20 20 20 20 20 20 78 79 7a  1 1   3      xyz
4e30: 0a 7d 0a 64 6f 5f 70 72 65 75 70 64 61 74 65 5f  .}.do_preupdate_
4e40: 74 65 73 74 20 37 2e 36 2e 33 20 7b 0a 20 20 55  test 7.6.3 {.  U
4e50: 50 44 41 54 45 20 74 31 20 53 45 54 20 78 20 3d  PDATE t1 SET x =
4e60: 20 27 61 62 63 27 3b 0a 7d 20 7b 0a 20 20 55 50   'abc';.} {.  UP
4e70: 44 41 54 45 20 6d 61 69 6e 20 74 31 20 31 20 31  DATE main t1 1 1
4e80: 20 20 20 30 20 20 20 20 20 20 78 79 7a 20 61 62     0      xyz ab
4e90: 63 0a 20 20 55 50 44 41 54 45 20 6d 61 69 6e 20  c.  UPDATE main 
4ea0: 74 32 20 31 20 31 20 20 20 31 20 20 20 20 20 20  t2 1 1   1      
4eb0: 78 79 7a 20 61 62 63 0a 20 20 55 50 44 41 54 45  xyz abc.  UPDATE
4ec0: 20 6d 61 69 6e 20 74 33 20 31 20 31 20 20 20 32   main t3 1 1   2
4ed0: 20 20 20 20 20 20 78 79 7a 20 61 62 63 0a 20 20        xyz abc.  
4ee0: 55 50 44 41 54 45 20 6d 61 69 6e 20 74 34 20 31  UPDATE main t4 1
4ef0: 20 31 20 20 20 33 20 20 20 20 20 20 78 79 7a 20   1   3      xyz 
4f00: 61 62 63 0a 7d 0a 64 6f 5f 70 72 65 75 70 64 61  abc.}.do_preupda
4f10: 74 65 5f 74 65 73 74 20 37 2e 36 2e 34 20 7b 0a  te_test 7.6.4 {.
4f20: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
4f30: 20 57 48 45 52 45 20 31 3b 0a 7d 20 7b 0a 20 20   WHERE 1;.} {.  
4f40: 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 31 20 31  DELETE main t1 1
4f50: 20 31 20 20 20 30 20 20 20 20 20 20 61 62 63 0a   1   0      abc.
4f60: 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 32    DELETE main t2
4f70: 20 31 20 31 20 20 20 31 20 20 20 20 20 20 61 62   1 1   1      ab
4f80: 63 0a 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20  c.  DELETE main 
4f90: 74 33 20 31 20 31 20 20 20 32 20 20 20 20 20 20  t3 1 1   2      
4fa0: 61 62 63 0a 20 20 44 45 4c 45 54 45 20 6d 61 69  abc.  DELETE mai
4fb0: 6e 20 74 34 20 31 20 31 20 20 20 33 20 20 20 20  n t4 1 1   3    
4fc0: 20 20 61 62 63 0a 7d 0a 0a 64 6f 5f 65 78 65 63    abc.}..do_exec
4fd0: 73 71 6c 5f 74 65 73 74 20 37 2e 36 2e 35 20 7b  sql_test 7.6.5 {
4fe0: 20 0a 20 20 44 52 4f 50 20 54 52 49 47 47 45 52   .  DROP TRIGGER
4ff0: 20 61 3b 20 44 52 4f 50 20 54 52 49 47 47 45 52   a; DROP TRIGGER
5000: 20 62 3b 20 44 52 4f 50 20 54 52 49 47 47 45 52   b; DROP TRIGGER
5010: 20 63 3b 0a 20 20 44 52 4f 50 20 54 52 49 47 47   c;.  DROP TRIGG
5020: 45 52 20 64 3b 20 44 52 4f 50 20 54 52 49 47 47  ER d; DROP TRIGG
5030: 45 52 20 65 3b 20 44 52 4f 50 20 54 52 49 47 47  ER e; DROP TRIGG
5040: 45 52 20 66 3b 0a 20 20 44 52 4f 50 20 54 52 49  ER f;.  DROP TRI
5050: 47 47 45 52 20 67 3b 20 44 52 4f 50 20 54 52 49  GGER g; DROP TRI
5060: 47 47 45 52 20 68 3b 20 44 52 4f 50 20 54 52 49  GGER h; DROP TRI
5070: 47 47 45 52 20 69 3b 0a 0a 20 20 43 52 45 41 54  GGER i;..  CREAT
5080: 45 20 54 52 49 47 47 45 52 20 61 20 42 45 46 4f  E TRIGGER a BEFO
5090: 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20  RE INSERT ON t1 
50a0: 42 45 47 49 4e 20 49 4e 53 45 52 54 20 49 4e 54  BEGIN INSERT INT
50b0: 4f 20 74 32 20 56 41 4c 55 45 53 28 6e 65 77 2e  O t2 VALUES(new.
50c0: 78 29 3b 20 45 4e 44 3b 0a 20 20 43 52 45 41 54  x); END;.  CREAT
50d0: 45 20 54 52 49 47 47 45 52 20 62 20 42 45 46 4f  E TRIGGER b BEFO
50e0: 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 20  RE INSERT ON t2 
50f0: 42 45 47 49 4e 20 49 4e 53 45 52 54 20 49 4e 54  BEGIN INSERT INT
5100: 4f 20 74 33 20 56 41 4c 55 45 53 28 6e 65 77 2e  O t3 VALUES(new.
5110: 78 29 3b 20 45 4e 44 3b 0a 20 20 43 52 45 41 54  x); END;.  CREAT
5120: 45 20 54 52 49 47 47 45 52 20 63 20 42 45 46 4f  E TRIGGER c BEFO
5130: 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 33 20  RE INSERT ON t3 
5140: 42 45 47 49 4e 20 49 4e 53 45 52 54 20 49 4e 54  BEGIN INSERT INT
5150: 4f 20 74 34 20 56 41 4c 55 45 53 28 6e 65 77 2e  O t4 VALUES(new.
5160: 78 29 3b 20 45 4e 44 3b 0a 0a 20 20 43 52 45 41  x); END;..  CREA
5170: 54 45 20 54 52 49 47 47 45 52 20 64 20 42 45 46  TE TRIGGER d BEF
5180: 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20 74 31  ORE UPDATE ON t1
5190: 20 42 45 47 49 4e 20 55 50 44 41 54 45 20 74 32   BEGIN UPDATE t2
51a0: 20 53 45 54 20 78 20 3d 20 6e 65 77 2e 78 3b 20   SET x = new.x; 
51b0: 45 4e 44 3b 0a 20 20 43 52 45 41 54 45 20 54 52  END;.  CREATE TR
51c0: 49 47 47 45 52 20 65 20 42 45 46 4f 52 45 20 55  IGGER e BEFORE U
51d0: 50 44 41 54 45 20 4f 4e 20 74 32 20 42 45 47 49  PDATE ON t2 BEGI
51e0: 4e 20 55 50 44 41 54 45 20 74 33 20 53 45 54 20  N UPDATE t3 SET 
51f0: 78 20 3d 20 6e 65 77 2e 78 3b 20 45 4e 44 3b 0a  x = new.x; END;.
5200: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
5210: 20 66 20 42 45 46 4f 52 45 20 55 50 44 41 54 45   f BEFORE UPDATE
5220: 20 4f 4e 20 74 33 20 42 45 47 49 4e 20 55 50 44   ON t3 BEGIN UPD
5230: 41 54 45 20 74 34 20 53 45 54 20 78 20 3d 20 6e  ATE t4 SET x = n
5240: 65 77 2e 78 3b 20 45 4e 44 3b 0a 0a 20 20 43 52  ew.x; END;..  CR
5250: 45 41 54 45 20 54 52 49 47 47 45 52 20 67 20 42  EATE TRIGGER g B
5260: 45 46 4f 52 45 20 44 45 4c 45 54 45 20 4f 4e 20  EFORE DELETE ON 
5270: 74 31 20 42 45 47 49 4e 20 44 45 4c 45 54 45 20  t1 BEGIN DELETE 
5280: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 31 3b  FROM t2 WHERE 1;
5290: 20 45 4e 44 3b 0a 20 20 43 52 45 41 54 45 20 54   END;.  CREATE T
52a0: 52 49 47 47 45 52 20 68 20 42 45 46 4f 52 45 20  RIGGER h BEFORE 
52b0: 44 45 4c 45 54 45 20 4f 4e 20 74 32 20 42 45 47  DELETE ON t2 BEG
52c0: 49 4e 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  IN DELETE FROM t
52d0: 33 20 57 48 45 52 45 20 31 3b 20 45 4e 44 3b 0a  3 WHERE 1; END;.
52e0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
52f0: 20 69 20 42 45 46 4f 52 45 20 44 45 4c 45 54 45   i BEFORE DELETE
5300: 20 4f 4e 20 74 33 20 42 45 47 49 4e 20 44 45 4c   ON t3 BEGIN DEL
5310: 45 54 45 20 46 52 4f 4d 20 74 34 20 57 48 45 52  ETE FROM t4 WHER
5320: 45 20 31 3b 20 45 4e 44 3b 0a 7d 0a 0a 64 6f 5f  E 1; END;.}..do_
5330: 70 72 65 75 70 64 61 74 65 5f 74 65 73 74 20 37  preupdate_test 7
5340: 2e 36 2e 36 20 7b 0a 20 20 49 4e 53 45 52 54 20  .6.6 {.  INSERT 
5350: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
5360: 78 79 7a 27 29 3b 0a 7d 20 7b 0a 20 20 49 4e 53  xyz');.} {.  INS
5370: 45 52 54 20 6d 61 69 6e 20 74 34 20 31 20 31 20  ERT main t4 1 1 
5380: 20 20 33 20 20 20 20 20 20 78 79 7a 0a 20 20 49    3      xyz.  I
5390: 4e 53 45 52 54 20 6d 61 69 6e 20 74 33 20 31 20  NSERT main t3 1 
53a0: 31 20 20 20 32 20 20 20 20 20 20 78 79 7a 0a 20  1   2      xyz. 
53b0: 20 49 4e 53 45 52 54 20 6d 61 69 6e 20 74 32 20   INSERT main t2 
53c0: 31 20 31 20 20 20 31 20 20 20 20 20 20 78 79 7a  1 1   1      xyz
53d0: 0a 20 20 49 4e 53 45 52 54 20 6d 61 69 6e 20 74  .  INSERT main t
53e0: 31 20 31 20 31 20 20 20 30 20 20 20 20 20 20 78  1 1 1   0      x
53f0: 79 7a 0a 7d 0a 64 6f 5f 70 72 65 75 70 64 61 74  yz.}.do_preupdat
5400: 65 5f 74 65 73 74 20 37 2e 36 2e 33 20 7b 0a 20  e_test 7.6.3 {. 
5410: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 78   UPDATE t1 SET x
5420: 20 3d 20 27 61 62 63 27 3b 0a 7d 20 7b 0a 20 20   = 'abc';.} {.  
5430: 55 50 44 41 54 45 20 6d 61 69 6e 20 74 34 20 31  UPDATE main t4 1
5440: 20 31 20 20 20 33 20 20 20 20 20 20 78 79 7a 20   1   3      xyz 
5450: 61 62 63 0a 20 20 55 50 44 41 54 45 20 6d 61 69  abc.  UPDATE mai
5460: 6e 20 74 33 20 31 20 31 20 20 20 32 20 20 20 20  n t3 1 1   2    
5470: 20 20 78 79 7a 20 61 62 63 0a 20 20 55 50 44 41    xyz abc.  UPDA
5480: 54 45 20 6d 61 69 6e 20 74 32 20 31 20 31 20 20  TE main t2 1 1  
5490: 20 31 20 20 20 20 20 20 78 79 7a 20 61 62 63 0a   1      xyz abc.
54a0: 20 20 55 50 44 41 54 45 20 6d 61 69 6e 20 74 31    UPDATE main t1
54b0: 20 31 20 31 20 20 20 30 20 20 20 20 20 20 78 79   1 1   0      xy
54c0: 7a 20 61 62 63 0a 7d 0a 64 6f 5f 70 72 65 75 70  z abc.}.do_preup
54d0: 64 61 74 65 5f 74 65 73 74 20 37 2e 36 2e 34 20  date_test 7.6.4 
54e0: 7b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  {.  DELETE FROM 
54f0: 74 31 20 57 48 45 52 45 20 31 3b 0a 7d 20 7b 0a  t1 WHERE 1;.} {.
5500: 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 34    DELETE main t4
5510: 20 31 20 31 20 20 20 33 20 20 20 20 20 20 61 62   1 1   3      ab
5520: 63 0a 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20  c.  DELETE main 
5530: 74 33 20 31 20 31 20 20 20 32 20 20 20 20 20 20  t3 1 1   2      
5540: 61 62 63 0a 20 20 44 45 4c 45 54 45 20 6d 61 69  abc.  DELETE mai
5550: 6e 20 74 32 20 31 20 31 20 20 20 31 20 20 20 20  n t2 1 1   1    
5560: 20 20 61 62 63 0a 20 20 44 45 4c 45 54 45 20 6d    abc.  DELETE m
5570: 61 69 6e 20 74 31 20 31 20 31 20 20 20 30 20 20  ain t1 1 1   0  
5580: 20 20 20 20 61 62 63 0a 7d 0a 0a 66 69 6e 69 73      abc.}..finis
5590: 68 5f 74 65 73 74 0a                             h_test.