/ Hex Artifact Content
Login

Artifact 3b7b99d0eece6d279812c2aef6fa08bdfabc633e:


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 64 6f 5f 74 65  odified..#.do_te
14c0: 73 74 20 68 6f 6f 6b 2d 34 2e 31 2e 32 77 20 7b  st hook-4.1.2w {
14d0: 0a 20 20 73 65 74 20 3a 3a 75 70 64 61 74 65 5f  .  set ::update_
14e0: 68 6f 6f 6b 20 7b 7d 0a 20 20 65 78 65 63 73 71  hook {}.  execsq
14f0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
1500: 4e 54 4f 20 74 31 77 20 56 41 4c 55 45 53 28 34  NTO t1w VALUES(4
1510: 2c 20 27 66 6f 75 72 27 29 3b 0a 20 20 20 20 44  , 'four');.    D
1520: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 77 20 57  ELETE FROM t1w W
1530: 48 45 52 45 20 62 20 3d 20 27 74 77 6f 27 3b 0a  HERE b = 'two';.
1540: 20 20 20 20 55 50 44 41 54 45 20 74 31 77 20 53      UPDATE t1w S
1550: 45 54 20 62 20 3d 20 27 27 20 57 48 45 52 45 20  ET b = '' WHERE 
1560: 61 20 3d 20 31 20 4f 52 20 61 20 3d 20 33 3b 0a  a = 1 OR a = 3;.
1570: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
1580: 74 31 77 20 57 48 45 52 45 20 31 3b 20 2d 2d 20  t1w WHERE 1; -- 
1590: 41 76 6f 69 64 20 74 68 65 20 74 72 75 6e 63 61  Avoid the trunca
15a0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
15b0: 28 66 6f 72 20 6e 6f 77 29 0a 20 20 7d 0a 20 20  (for now).  }.  
15c0: 73 65 74 20 3a 3a 75 70 64 61 74 65 5f 68 6f 6f  set ::update_hoo
15d0: 6b 0a 7d 20 7b 7d 0a 0a 69 66 63 61 70 61 62 6c  k.} {}..ifcapabl
15e0: 65 20 74 72 69 67 67 65 72 20 7b 0a 20 20 23 20  e trigger {.  # 
15f0: 55 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 6e  Update hook is n
1600: 6f 74 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 63  ot invoked for c
1610: 68 61 6e 67 65 73 20 74 6f 20 73 71 6c 69 74 65  hanges to sqlite
1620: 5f 6d 61 73 74 65 72 0a 20 20 23 0a 20 20 64 6f  _master.  #.  do
1630: 5f 74 65 73 74 20 68 6f 6f 6b 2d 34 2e 31 2e 33  _test hook-4.1.3
1640: 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 75 70 64   {.    set ::upd
1650: 61 74 65 5f 68 6f 6f 6b 20 7b 7d 0a 20 20 20 20  ate_hook {}.    
1660: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
1670: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 72  CREATE TRIGGER r
1680: 31 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  1 AFTER INSERT O
1690: 4e 20 74 31 20 42 45 47 49 4e 20 53 45 4c 45 43  N t1 BEGIN SELEC
16a0: 54 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29 3b  T RAISE(IGNORE);
16b0: 20 45 4e 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20   END;.    }.    
16c0: 73 65 74 20 3a 3a 75 70 64 61 74 65 5f 68 6f 6f  set ::update_hoo
16d0: 6b 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  k.  } {}.  do_te
16e0: 73 74 20 68 6f 6f 6b 2d 34 2e 31 2e 34 20 7b 0a  st hook-4.1.4 {.
16f0: 20 20 20 20 73 65 74 20 3a 3a 75 70 64 61 74 65      set ::update
1700: 5f 68 6f 6f 6b 20 7b 7d 0a 20 20 20 20 65 78 65  _hook {}.    exe
1710: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 52 4f  csql {.      DRO
1720: 50 20 54 52 49 47 47 45 52 20 72 31 3b 0a 20 20  P TRIGGER r1;.  
1730: 20 20 7d 0a 20 20 20 20 73 65 74 20 3a 3a 75 70    }.    set ::up
1740: 64 61 74 65 5f 68 6f 6f 6b 0a 20 20 7d 20 7b 7d  date_hook.  } {}
1750: 0a 20 20 0a 20 20 73 65 74 20 3a 3a 75 70 64 61  .  .  set ::upda
1760: 74 65 5f 68 6f 6f 6b 20 7b 7d 0a 20 20 64 6f 5f  te_hook {}.  do_
1770: 74 65 73 74 20 68 6f 6f 6b 2d 34 2e 32 2e 31 20  test hook-4.2.1 
1780: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
1790: 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c  .      DROP TABL
17a0: 45 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E t2;.    }.    
17b0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
17c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
17d0: 63 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  c INTEGER PRIMAR
17e0: 59 20 4b 45 59 2c 20 64 29 3b 0a 20 20 20 20 20  Y KEY, d);.     
17f0: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
1800: 74 31 5f 74 72 69 67 67 65 72 20 41 46 54 45 52  t1_trigger AFTER
1810: 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20 42 45   INSERT ON t1 BE
1820: 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e 53 45  GIN.        INSE
1830: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
1840: 53 28 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b  S(new.a, new.b);
1850: 0a 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20  .        UPDATE 
1860: 74 32 20 53 45 54 20 64 20 3d 20 64 20 7c 7c 20  t2 SET d = d || 
1870: 27 20 76 69 61 20 74 72 69 67 67 65 72 27 20 57  ' via trigger' W
1880: 48 45 52 45 20 6e 65 77 2e 61 20 3d 20 63 3b 0a  HERE new.a = c;.
1890: 20 20 20 20 20 20 20 20 44 45 4c 45 54 45 20 46          DELETE F
18a0: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 6e 65 77  ROM t2 WHERE new
18b0: 2e 61 20 3d 20 63 3b 0a 20 20 20 20 20 20 45 4e  .a = c;.      EN
18c0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  D;.    }.  } {}.
18d0: 20 20 64 6f 5f 74 65 73 74 20 68 6f 6f 6b 2d 34    do_test hook-4
18e0: 2e 32 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73  .2.2 {.    execs
18f0: 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52  ql {.      INSER
1900: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1910: 28 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20  (1, 'one');.    
1920: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1930: 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27   VALUES(2, 'two'
1940: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  );.    }.    set
1950: 20 3a 3a 75 70 64 61 74 65 5f 68 6f 6f 6b 0a 20   ::update_hook. 
1960: 20 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 20 20 20   } [list \.     
1970: 20 49 4e 53 45 52 54 20 6d 61 69 6e 20 74 31 20   INSERT main t1 
1980: 31 20 5c 0a 20 20 20 20 20 20 49 4e 53 45 52 54  1 \.      INSERT
1990: 20 6d 61 69 6e 20 74 32 20 31 20 5c 0a 20 20 20   main t2 1 \.   
19a0: 20 20 20 55 50 44 41 54 45 20 6d 61 69 6e 20 74     UPDATE main t
19b0: 32 20 31 20 5c 0a 20 20 20 20 20 20 44 45 4c 45  2 1 \.      DELE
19c0: 54 45 20 6d 61 69 6e 20 74 32 20 31 20 5c 0a 20  TE main t2 1 \. 
19d0: 20 20 20 20 20 49 4e 53 45 52 54 20 6d 61 69 6e       INSERT main
19e0: 20 74 31 20 32 20 5c 0a 20 20 20 20 20 20 49 4e   t1 2 \.      IN
19f0: 53 45 52 54 20 6d 61 69 6e 20 74 32 20 32 20 5c  SERT main t2 2 \
1a00: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 6d 61  .      UPDATE ma
1a10: 69 6e 20 74 32 20 32 20 5c 0a 20 20 20 20 20 20  in t2 2 \.      
1a20: 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 32 20 32  DELETE main t2 2
1a30: 20 5c 0a 20 20 5d 0a 7d 20 65 6c 73 65 20 7b 0a   \.  ].} else {.
1a40: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1a50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1a60: 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b  ALUES(1, 'one');
1a70: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1a80: 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27 74   t1 VALUES(2, 't
1a90: 77 6f 27 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 20 55  wo');.  }.}..# U
1aa0: 70 64 61 74 65 2d 68 6f 6f 6b 20 2b 20 41 54 54  pdate-hook + ATT
1ab0: 41 43 48 0a 73 65 74 20 3a 3a 75 70 64 61 74 65  ACH.set ::update
1ac0: 5f 68 6f 6f 6b 20 7b 7d 0a 69 66 63 61 70 61 62  _hook {}.ifcapab
1ad0: 6c 65 20 61 74 74 61 63 68 20 7b 0a 20 20 64 6f  le attach {.  do
1ae0: 5f 74 65 73 74 20 68 6f 6f 6b 2d 34 2e 32 2e 33  _test hook-4.2.3
1af0: 20 7b 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65   {.    forcedele
1b00: 74 65 20 74 65 73 74 32 2e 64 62 0a 20 20 20 20  te test2.db.    
1b10: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
1b20: 41 54 54 41 43 48 20 27 74 65 73 74 32 2e 64 62  ATTACH 'test2.db
1b30: 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 20 20  ' AS aux;.      
1b40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78  CREATE TABLE aux
1b50: 2e 74 33 28 61 20 49 4e 54 45 47 45 52 20 50 52  .t3(a INTEGER PR
1b60: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20  IMARY KEY, b);. 
1b70: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1b80: 20 61 75 78 2e 74 33 20 53 45 4c 45 43 54 20 2a   aux.t3 SELECT *
1b90: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
1ba0: 55 50 44 41 54 45 20 74 33 20 53 45 54 20 62 20  UPDATE t3 SET b 
1bb0: 3d 20 27 74 77 6f 20 6f 72 20 73 6f 27 20 57 48  = 'two or so' WH
1bc0: 45 52 45 20 61 20 3d 20 32 3b 0a 20 20 20 20 20  ERE a = 2;.     
1bd0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 33 20   DELETE FROM t3 
1be0: 57 48 45 52 45 20 31 3b 20 2d 2d 20 41 76 6f 69  WHERE 1; -- Avoi
1bf0: 64 20 74 68 65 20 74 72 75 6e 63 61 74 65 20 6f  d the truncate o
1c00: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 66 6f 72  ptimization (for
1c10: 20 6e 6f 77 29 0a 20 20 20 20 7d 0a 20 20 20 20   now).    }.    
1c20: 73 65 74 20 3a 3a 75 70 64 61 74 65 5f 68 6f 6f  set ::update_hoo
1c30: 6b 0a 20 20 7d 20 5b 6c 69 73 74 20 5c 0a 20 20  k.  } [list \.  
1c40: 20 20 20 20 49 4e 53 45 52 54 20 61 75 78 20 74      INSERT aux t
1c50: 33 20 31 20 5c 0a 20 20 20 20 20 20 49 4e 53 45  3 1 \.      INSE
1c60: 52 54 20 61 75 78 20 74 33 20 32 20 5c 0a 20 20  RT aux t3 2 \.  
1c70: 20 20 20 20 55 50 44 41 54 45 20 61 75 78 20 74      UPDATE aux t
1c80: 33 20 32 20 5c 0a 20 20 20 20 20 20 44 45 4c 45  3 2 \.      DELE
1c90: 54 45 20 61 75 78 20 74 33 20 31 20 5c 0a 20 20  TE aux t3 1 \.  
1ca0: 20 20 20 20 44 45 4c 45 54 45 20 61 75 78 20 74      DELETE aux t
1cb0: 33 20 32 20 5c 0a 20 20 5d 0a 7d 0a 0a 69 66 63  3 2 \.  ].}..ifc
1cc0: 61 70 61 62 6c 65 20 74 72 69 67 67 65 72 20 7b  apable trigger {
1cd0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1ce0: 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 74 31   DROP TRIGGER t1
1cf0: 5f 74 72 69 67 67 65 72 3b 0a 20 20 7d 0a 7d 0a  _trigger;.  }.}.
1d00: 0a 23 20 54 65 73 74 20 74 68 61 74 20 6f 74 68  .# Test that oth
1d10: 65 72 20 76 64 62 65 20 6f 70 65 72 61 74 69 6f  er vdbe operatio
1d20: 6e 73 20 69 6e 76 6f 6c 76 69 6e 67 20 62 74 72  ns involving btr
1d30: 65 65 20 73 74 72 75 63 74 75 72 65 73 20 64 6f  ee structures do
1d40: 20 6e 6f 74 20 0a 23 20 69 6e 63 6f 72 72 65 63   not .# incorrec
1d50: 74 6c 79 20 69 6e 76 6f 6b 65 20 74 68 65 20 75  tly invoke the u
1d60: 70 64 61 74 65 2d 68 6f 6f 6b 2e 0a 73 65 74 20  pdate-hook..set 
1d70: 3a 3a 75 70 64 61 74 65 5f 68 6f 6f 6b 20 7b 7d  ::update_hook {}
1d80: 0a 64 6f 5f 74 65 73 74 20 68 6f 6f 6b 2d 34 2e  .do_test hook-4.
1d90: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
1da0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  {.    CREATE IND
1db0: 45 58 20 74 31 5f 69 20 4f 4e 20 74 31 28 62 29  EX t1_i ON t1(b)
1dc0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1dd0: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 27  O t1 VALUES(3, '
1de0: 74 68 72 65 65 27 29 3b 0a 20 20 20 20 55 50 44  three');.    UPD
1df0: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 27  ATE t1 SET b = '
1e00: 27 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  ';.    DELETE FR
1e10: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
1e20: 31 3b 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 75  1;.  }.  set ::u
1e30: 70 64 61 74 65 5f 68 6f 6f 6b 0a 7d 20 5b 6c 69  pdate_hook.} [li
1e40: 73 74 20 5c 0a 20 20 20 20 49 4e 53 45 52 54 20  st \.    INSERT 
1e50: 6d 61 69 6e 20 74 31 20 33 20 5c 0a 20 20 20 20  main t1 3 \.    
1e60: 55 50 44 41 54 45 20 6d 61 69 6e 20 74 31 20 31  UPDATE main t1 1
1e70: 20 5c 0a 20 20 20 20 55 50 44 41 54 45 20 6d 61   \.    UPDATE ma
1e80: 69 6e 20 74 31 20 32 20 5c 0a 20 20 20 20 55 50  in t1 2 \.    UP
1e90: 44 41 54 45 20 6d 61 69 6e 20 74 31 20 33 20 5c  DATE main t1 3 \
1ea0: 0a 20 20 20 20 44 45 4c 45 54 45 20 6d 61 69 6e  .    DELETE main
1eb0: 20 74 31 20 32 20 5c 0a 20 20 20 20 44 45 4c 45   t1 2 \.    DELE
1ec0: 54 45 20 6d 61 69 6e 20 74 31 20 33 20 5c 0a 5d  TE main t1 3 \.]
1ed0: 0a 73 65 74 20 3a 3a 75 70 64 61 74 65 5f 68 6f  .set ::update_ho
1ee0: 6f 6b 20 7b 7d 0a 69 66 63 61 70 61 62 6c 65 20  ok {}.ifcapable 
1ef0: 63 6f 6d 70 6f 75 6e 64 26 26 61 74 74 61 63 68  compound&&attach
1f00: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 68 6f 6f   {.  do_test hoo
1f10: 6b 2d 34 2e 33 2e 32 20 7b 0a 20 20 20 20 65 78  k-4.3.2 {.    ex
1f20: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
1f30: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 55  LECT * FROM t1 U
1f40: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 2a 20 46 52  NION SELECT * FR
1f50: 4f 4d 20 74 33 3b 0a 20 20 20 20 20 20 53 45 4c  OM t3;.      SEL
1f60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 55 4e  ECT * FROM t1 UN
1f70: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a  ION ALL SELECT *
1f80: 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 20 20   FROM t3;.      
1f90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1fa0: 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43   INTERSECT SELEC
1fb0: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20  T * FROM t3;.   
1fc0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1fd0: 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
1fe0: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20  T * FROM t3;.   
1ff0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2000: 20 74 31 20 4f 52 44 45 52 20 42 59 20 62 3b 0a   t1 ORDER BY b;.
2010: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
2020: 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20  ROM t1 GROUP BY 
2030: 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  b;.    }.    set
2040: 20 3a 3a 75 70 64 61 74 65 5f 68 6f 6f 6b 0a 20   ::update_hook. 
2050: 20 7d 20 5b 6c 69 73 74 5d 0a 7d 0a 0a 64 6f 5f   } [list].}..do_
2060: 74 65 73 74 20 68 6f 6f 6b 2d 34 2e 34 20 7b 0a  test hook-4.4 {.
2070: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2080: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28  CREATE TABLE t4(
2090: 61 20 55 4e 49 51 55 45 2c 20 62 29 3b 0a 20 20  a UNIQUE, b);.  
20a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34    INSERT INTO t4
20b0: 20 56 41 4c 55 45 53 28 31 2c 20 27 61 27 29 3b   VALUES(1, 'a');
20c0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
20d0: 20 74 34 20 56 41 4c 55 45 53 28 32 2c 20 27 62   t4 VALUES(2, 'b
20e0: 27 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a  ');.  }.  set ::
20f0: 75 70 64 61 74 65 5f 68 6f 6f 6b 20 5b 6c 69 73  update_hook [lis
2100: 74 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  t].  execsql {. 
2110: 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20     REPLACE INTO 
2120: 74 34 20 56 41 4c 55 45 53 28 31 2c 20 27 63 27  t4 VALUES(1, 'c'
2130: 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 75  );.  }.  set ::u
2140: 70 64 61 74 65 5f 68 6f 6f 6b 0a 7d 20 5b 6c 69  pdate_hook.} [li
2150: 73 74 20 49 4e 53 45 52 54 20 6d 61 69 6e 20 74  st INSERT main t
2160: 34 20 33 20 5d 0a 64 6f 5f 65 78 65 63 73 71 6c  4 3 ].do_execsql
2170: 5f 74 65 73 74 20 68 6f 6f 6b 2d 34 2e 34 2e 31  _test hook-4.4.1
2180: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
2190: 4f 4d 20 74 34 20 4f 52 44 45 52 20 42 59 20 61  OM t4 ORDER BY a
21a0: 3b 0a 7d 20 7b 31 20 63 20 32 20 62 7d 0a 64 6f  ;.} {1 c 2 b}.do
21b0: 5f 74 65 73 74 20 68 6f 6f 6b 2d 34 2e 34 2e 32  _test hook-4.4.2
21c0: 20 7b 0a 20 20 73 65 74 20 3a 3a 75 70 64 61 74   {.  set ::updat
21d0: 65 5f 68 6f 6f 6b 20 5b 6c 69 73 74 5d 0a 20 20  e_hook [list].  
21e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
21f0: 41 47 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74  AGMA recursive_t
2200: 72 69 67 67 65 72 73 20 3d 20 6f 6e 3b 0a 20 20  riggers = on;.  
2210: 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74    REPLACE INTO t
2220: 34 20 56 41 4c 55 45 53 28 31 2c 20 27 64 27 29  4 VALUES(1, 'd')
2230: 3b 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 75 70  ;.  }.  set ::up
2240: 64 61 74 65 5f 68 6f 6f 6b 0a 7d 20 5b 6c 69 73  date_hook.} [lis
2250: 74 20 49 4e 53 45 52 54 20 6d 61 69 6e 20 74 34  t INSERT main t4
2260: 20 34 20 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   4 ].do_execsql_
2270: 74 65 73 74 20 68 6f 6f 6b 2d 34 2e 34 2e 33 20  test hook-4.4.3 
2280: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
2290: 4d 20 74 34 20 4f 52 44 45 52 20 42 59 20 61 3b  M t4 ORDER BY a;
22a0: 0a 7d 20 7b 31 20 64 20 32 20 62 7d 0a 0a 64 62  .} {1 d 2 b}..db
22b0: 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20 7b 7d 0a   update_hook {}.
22c0: 23 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #.#-------------
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 0a  ---------------.
2310: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 23  --------------.#
2360: 20 54 65 73 74 20 74 68 65 20 72 6f 6c 6c 62 61   Test the rollba
2370: 63 6b 2d 68 6f 6f 6b 2e 20 54 68 65 20 72 6f 6c  ck-hook. The rol
2380: 6c 62 61 63 6b 2d 68 6f 6f 6b 20 69 73 20 61 20  lback-hook is a 
2390: 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63  bit more complic
23a0: 61 74 65 64 20 74 68 61 6e 0a 23 20 65 69 74 68  ated than.# eith
23b0: 65 72 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 72  er the commit or
23c0: 20 75 70 64 61 74 65 20 68 6f 6f 6b 73 20 62 65   update hooks be
23d0: 63 61 75 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  cause a rollback
23e0: 20 63 61 6e 20 68 61 70 70 65 6e 20 0a 23 20 65   can happen .# e
23f0: 78 70 6c 69 63 69 74 6c 79 20 28 61 6e 20 73 71  xplicitly (an sq
2400: 6c 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65  l ROLLBACK state
2410: 6d 65 6e 74 29 20 6f 72 20 69 6d 70 6c 69 63 69  ment) or implici
2420: 74 6c 79 20 28 61 20 63 6f 6e 73 74 72 61 69 6e  tly (a constrain
2430: 74 20 6f 72 20 0a 23 20 65 72 72 6f 72 20 63 6f  t or .# error co
2440: 6e 64 69 74 69 6f 6e 29 2e 0a 23 0a 23 20 68 6f  ndition)..#.# ho
2450: 6f 6b 2d 35 2e 31 2e 2a 20 2d 20 54 65 73 74 20  ok-5.1.* - Test 
2460: 65 78 70 6c 69 63 69 74 20 72 6f 6c 6c 62 61 63  explicit rollbac
2470: 6b 73 2e 0a 23 20 68 6f 6f 6b 2d 35 2e 32 2e 2a  ks..# hook-5.2.*
2480: 20 2d 20 54 65 73 74 20 69 6d 70 6c 69 63 69 74   - Test implicit
2490: 20 72 6f 6c 6c 62 61 63 6b 73 20 63 61 75 73 65   rollbacks cause
24a0: 64 20 62 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  d by constraint 
24b0: 66 61 69 6c 75 72 65 2e 0a 23 0a 23 20 68 6f 6f  failure..#.# hoo
24c0: 6b 2d 35 2e 33 2e 2a 20 2d 20 54 65 73 74 20 69  k-5.3.* - Test i
24d0: 6d 70 6c 69 63 69 74 20 72 6f 6c 6c 62 61 63 6b  mplicit rollback
24e0: 73 20 63 61 75 73 65 64 20 62 79 20 49 4f 20 65  s caused by IO e
24f0: 72 72 6f 72 73 2e 0a 23 20 68 6f 6f 6b 2d 35 2e  rrors..# hook-5.
2500: 34 2e 2a 20 2d 20 54 65 73 74 20 69 6d 70 6c 69  4.* - Test impli
2510: 63 69 74 20 72 6f 6c 6c 62 61 63 6b 73 20 63 61  cit rollbacks ca
2520: 75 73 65 64 20 62 79 20 6d 61 6c 6c 6f 63 28 29  used by malloc()
2530: 20 66 61 69 6c 75 72 65 2e 0a 23 20 68 6f 6f 6b   failure..# hook
2540: 2d 35 2e 35 2e 2a 20 2d 20 54 65 73 74 20 68 6f  -5.5.* - Test ho
2550: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
2560: 63 6b 73 2e 20 4f 72 20 73 68 6f 75 6c 64 20 74  cks. Or should t
2570: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b  he rollback hook
2580: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
2590: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 66   not be called f
25a0: 6f 72 20 74 68 65 73 65 3f 0a 23 0a 0a 64 6f 5f  or these?.#..do_
25b0: 74 65 73 74 20 68 6f 6f 6b 2d 35 2e 30 20 7b 0a  test hook-5.0 {.
25c0: 20 20 23 20 43 6f 6e 66 69 67 75 72 65 20 74 68    # Configure th
25d0: 65 20 72 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20  e rollback hook 
25e0: 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 67 6c 6f  to increment glo
25f0: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 0a 20 20  bal variable .  
2600: 23 20 24 3a 3a 72 6f 6c 6c 62 61 63 6b 5f 68 6f  # $::rollback_ho
2610: 6f 6b 20 65 61 63 68 20 74 69 6d 65 20 69 74 20  ok each time it 
2620: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 73 65  is invoked..  se
2630: 74 20 3a 3a 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  t ::rollback_hoo
2640: 6b 20 30 0a 20 20 64 62 20 72 6f 6c 6c 62 61 63  k 0.  db rollbac
2650: 6b 5f 68 6f 6f 6b 20 5b 6c 69 73 74 20 69 6e 63  k_hook [list inc
2660: 72 20 3a 3a 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  r ::rollback_hoo
2670: 6b 5d 0a 7d 20 7b 7d 0a 0a 23 20 54 65 73 74 20  k].} {}..# Test 
2680: 65 78 70 6c 69 63 69 74 20 72 6f 6c 6c 62 61 63  explicit rollbac
2690: 6b 73 2e 20 4e 6f 74 20 6d 75 63 68 20 63 61 6e  ks. Not much can
26a0: 20 72 65 61 6c 6c 79 20 67 6f 20 77 72 6f 6e 67   really go wrong
26b0: 20 68 65 72 65 2e 0a 23 0a 64 6f 5f 74 65 73 74   here..#.do_test
26c0: 20 68 6f 6f 6b 2d 35 2e 31 2e 31 20 7b 0a 20 20   hook-5.1.1 {.  
26d0: 73 65 74 20 3a 3a 72 6f 6c 6c 62 61 63 6b 5f 68  set ::rollback_h
26e0: 6f 6f 6b 20 30 0a 20 20 65 78 65 63 73 71 6c 20  ook 0.  execsql 
26f0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
2700: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20   ROLLBACK;.  }. 
2710: 20 73 65 74 20 3a 3a 72 6f 6c 6c 62 61 63 6b 5f   set ::rollback_
2720: 68 6f 6f 6b 0a 7d 20 7b 31 7d 0a 0a 23 20 54 65  hook.} {1}..# Te
2730: 73 74 20 69 6d 70 6c 69 63 69 74 20 72 6f 6c 6c  st implicit roll
2740: 62 61 63 6b 73 20 63 61 75 73 65 64 20 62 79 20  backs caused by 
2750: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 23 0a 64  constraints..#.d
2760: 6f 5f 74 65 73 74 20 68 6f 6f 6b 2d 35 2e 32 2e  o_test hook-5.2.
2770: 31 20 7b 0a 20 20 73 65 74 20 3a 3a 72 6f 6c 6c  1 {.  set ::roll
2780: 62 61 63 6b 5f 68 6f 6f 6b 20 30 0a 20 20 63 61  back_hook 0.  ca
2790: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  tchsql {.    DRO
27a0: 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 20 20  P TABLE t1;.    
27b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
27c0: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
27d0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
27e0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 6f 6e  TO t1 VALUES('on
27f0: 65 27 2c 20 27 49 27 29 3b 0a 20 20 20 20 49 4e  e', 'I');.    IN
2800: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2810: 55 45 53 28 27 6f 6e 65 27 2c 20 27 49 27 29 3b  UES('one', 'I');
2820: 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 72 6f 6c  .  }.  set ::rol
2830: 6c 62 61 63 6b 5f 68 6f 6f 6b 0a 7d 20 7b 31 7d  lback_hook.} {1}
2840: 0a 64 6f 5f 74 65 73 74 20 68 6f 6f 6b 2d 35 2e  .do_test hook-5.
2850: 32 2e 32 20 7b 0a 20 20 23 20 43 68 65 63 6b 20  2.2 {.  # Check 
2860: 74 68 61 74 20 74 68 65 20 49 4e 53 45 52 54 20  that the INSERT 
2870: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 62 6f 76  transaction abov
2880: 65 20 72 65 61 6c 6c 79 20 77 61 73 20 72 6f 6c  e really was rol
2890: 6c 65 64 20 62 61 63 6b 2e 0a 20 20 65 78 65 63  led back..  exec
28a0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
28b0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
28c0: 31 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 0a 23 0a  1;.  }.} {1}..#.
28d0: 23 20 45 6e 64 20 72 6f 6c 6c 62 61 63 6b 2d 68  # End rollback-h
28e0: 6f 6f 6b 20 74 65 73 74 69 6e 67 2e 0a 23 2d 2d  ook testing..#--
28f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 0a 23 2d 2d 2d  ----------..#---
2940: 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 23 20 54 65 73 74  ---------.# Test
2990: 20 74 68 61 74 20 69 66 20 61 20 63 6f 6d 6d 69   that if a commi
29a0: 74 2d 68 6f 6f 6b 20 72 65 74 75 72 6e 73 20 6e  t-hook returns n
29b0: 6f 6e 2d 7a 65 72 6f 20 28 63 61 75 73 69 6e 67  on-zero (causing
29c0: 20 61 20 72 6f 6c 6c 62 61 63 6b 29 2c 20 74 68   a rollback), th
29d0: 65 0a 23 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f  e.# rollback-hoo
29e0: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 23 0a  k is invoked..#.
29f0: 70 72 6f 63 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  proc commit_hook
2a00: 20 7b 7d 20 7b 0a 20 20 6c 61 70 70 65 6e 64 20   {} {.  lappend 
2a10: 3a 3a 68 6f 6f 6b 73 20 43 4f 4d 4d 49 54 0a 20  ::hooks COMMIT. 
2a20: 20 72 65 74 75 72 6e 20 31 0a 7d 0a 70 72 6f 63   return 1.}.proc
2a30: 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 7b   rollback_hook {
2a40: 7d 20 7b 0a 20 20 6c 61 70 70 65 6e 64 20 3a 3a  } {.  lappend ::
2a50: 68 6f 6f 6b 73 20 52 4f 4c 4c 42 41 43 4b 0a 7d  hooks ROLLBACK.}
2a60: 0a 64 6f 5f 74 65 73 74 20 68 6f 6f 6b 2d 36 2e  .do_test hook-6.
2a70: 31 20 7b 0a 20 20 73 65 74 20 3a 3a 68 6f 6f 6b  1 {.  set ::hook
2a80: 73 20 5b 6c 69 73 74 5d 0a 20 20 64 62 20 63 6f  s [list].  db co
2a90: 6d 6d 69 74 5f 68 6f 6f 6b 20 63 6f 6d 6d 69 74  mmit_hook commit
2aa0: 5f 68 6f 6f 6b 0a 20 20 64 62 20 72 6f 6c 6c 62  _hook.  db rollb
2ab0: 61 63 6b 5f 68 6f 6f 6b 20 72 6f 6c 6c 62 61 63  ack_hook rollbac
2ac0: 6b 5f 68 6f 6f 6b 0a 20 20 63 61 74 63 68 73 71  k_hook.  catchsq
2ad0: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
2ae0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2af0: 20 74 31 20 56 41 4c 55 45 53 28 27 74 77 6f 27   t1 VALUES('two'
2b00: 2c 20 27 49 49 27 29 3b 0a 20 20 20 20 43 4f 4d  , 'II');.    COM
2b10: 4d 49 54 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73  MIT;.  }.  execs
2b20: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
2b30: 4f 4d 20 74 31 20 7d 0a 7d 20 7b 6f 6e 65 20 49  OM t1 }.} {one I
2b40: 7d 0a 64 6f 5f 74 65 73 74 20 68 6f 6f 6b 2d 36  }.do_test hook-6
2b50: 2e 32 20 7b 0a 20 20 73 65 74 20 3a 3a 68 6f 6f  .2 {.  set ::hoo
2b60: 6b 73 0a 7d 20 7b 43 4f 4d 4d 49 54 20 52 4f 4c  ks.} {COMMIT ROL
2b70: 4c 42 41 43 4b 7d 0a 75 6e 73 65 74 20 3a 3a 68  LBACK}.unset ::h
2b80: 6f 6f 6b 73 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ooks..#---------
2b90: 2d 2d 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 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
2be0: 69 6e 67 20 74 65 73 74 73 20 2d 20 68 6f 6f 6b  ing tests - hook
2bf0: 2d 37 2e 2a 20 2d 20 74 65 73 74 20 74 68 65 20  -7.* - test the 
2c00: 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e  pre-update hook.
2c10: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 21 70 72  .#.ifcapable !pr
2c20: 65 75 70 64 61 74 65 20 7b 0a 20 20 66 69 6e 69  eupdate {.  fini
2c30: 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e  sh_test.  return
2c40: 0a 7d 0a 23 0a 23 20 37 2e 31 2e 31 20 2d 20 49  .}.#.# 7.1.1 - I
2c50: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2e  NSERT statement.
2c60: 0a 23 20 37 2e 31 2e 32 20 2d 20 49 4e 53 45 52  .# 7.1.2 - INSER
2c70: 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43  T INTO ... SELEC
2c80: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 20 37  T statement..# 7
2c90: 2e 31 2e 33 20 2d 20 52 45 50 4c 41 43 45 20 49  .1.3 - REPLACE I
2ca0: 4e 54 4f 20 2e 2e 2e 20 28 72 6f 77 69 64 20 63  NTO ... (rowid c
2cb0: 6f 6e 66 6c 69 63 74 29 0a 23 20 37 2e 31 2e 34  onflict).# 7.1.4
2cc0: 20 2d 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20   - REPLACE INTO 
2cd0: 2e 2e 2e 20 28 6f 74 68 65 72 20 69 6e 64 65 78  ... (other index
2ce0: 20 63 6f 6e 66 6c 69 63 74 73 29 0a 23 20 37 2e   conflicts).# 7.
2cf0: 31 2e 35 20 2d 20 52 45 50 4c 41 43 45 20 49 4e  1.5 - REPLACE IN
2d00: 54 4f 20 2e 2e 2e 20 28 62 6f 74 68 20 72 6f 77  TO ... (both row
2d10: 69 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 64  id and other ind
2d20: 65 78 20 63 6f 6e 66 6c 69 63 74 73 29 0a 23 0a  ex conflicts).#.
2d30: 23 20 37 2e 32 2e 31 20 2d 20 44 45 4c 45 54 45  # 7.2.1 - DELETE
2d40: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 20 37 2e   statement..# 7.
2d50: 32 2e 32 20 2d 20 44 45 4c 45 54 45 20 73 74 61  2.2 - DELETE sta
2d60: 74 65 6d 65 6e 74 20 74 68 61 74 20 75 73 65 73  tement that uses
2d70: 20 74 68 65 20 74 72 75 6e 63 61 74 65 20 6f 70   the truncate op
2d80: 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 23 0a 23 20  timization..#.# 
2d90: 37 2e 33 2e 31 20 2d 20 55 50 44 41 54 45 20 73  7.3.1 - UPDATE s
2da0: 74 61 74 65 6d 65 6e 74 2e 0a 23 20 37 2e 33 2e  tatement..# 7.3.
2db0: 32 20 2d 20 55 50 44 41 54 45 20 73 74 61 74 65  2 - UPDATE state
2dc0: 6d 65 6e 74 20 74 68 61 74 20 6d 6f 64 69 66 69  ment that modifi
2dd0: 65 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 23 20  es the rowid..# 
2de0: 37 2e 33 2e 33 20 2d 20 55 50 44 41 54 45 20 4f  7.3.3 - UPDATE O
2df0: 52 20 52 45 50 4c 41 43 45 20 2e 2e 2e 20 28 72  R REPLACE ... (r
2e00: 6f 77 69 64 20 63 6f 6e 66 6c 69 63 74 29 2e 0a  owid conflict)..
2e10: 23 20 37 2e 33 2e 34 20 2d 20 55 50 44 41 54 45  # 7.3.4 - UPDATE
2e20: 20 4f 52 20 52 45 50 4c 41 43 45 20 2e 2e 2e 20   OR REPLACE ... 
2e30: 28 6f 74 68 65 72 20 69 6e 64 65 78 20 63 6f 6e  (other index con
2e40: 66 6c 69 63 74 73 29 0a 23 20 37 2e 33 2e 34 20  flicts).# 7.3.4 
2e50: 2d 20 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c  - UPDATE OR REPL
2e60: 41 43 45 20 2e 2e 2e 20 28 62 6f 74 68 20 72 6f  ACE ... (both ro
2e70: 77 69 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e  wid and other in
2e80: 64 65 78 20 63 6f 6e 66 6c 69 63 74 73 29 0a 23  dex conflicts).#
2e90: 0a 23 20 37 2e 34 2e 31 20 2d 20 54 65 73 74 20  .# 7.4.1 - Test 
2ea0: 74 68 61 74 20 74 68 65 20 70 72 65 2d 75 70 64  that the pre-upd
2eb0: 61 74 65 2d 68 6f 6f 6b 20 69 73 20 69 6e 76 6f  ate-hook is invo
2ec0: 6b 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66  ked only once if
2ed0: 20 61 20 72 6f 77 20 62 65 69 6e 67 0a 23 20 20   a row being.#  
2ee0: 20 20 20 20 20 20 20 64 65 6c 65 74 65 64 20 69         deleted i
2ef0: 73 20 72 65 6d 6f 76 65 64 20 62 79 20 61 20 42  s removed by a B
2f00: 45 46 4f 52 45 20 74 72 69 67 67 65 72 2e 0a 23  EFORE trigger..#
2f10: 0a 23 20 37 2e 34 2e 32 20 2d 20 54 65 73 74 20  .# 7.4.2 - Test 
2f20: 74 68 61 74 20 74 68 65 20 70 72 65 2d 75 70 64  that the pre-upd
2f30: 61 74 65 2d 68 6f 6f 6b 20 69 73 20 69 6e 76 6f  ate-hook is invo
2f40: 6b 65 64 20 69 66 20 61 20 42 45 46 4f 52 45 20  ked if a BEFORE 
2f50: 74 72 69 67 67 65 72 20 0a 23 20 20 20 20 20 20  trigger .#      
2f60: 20 20 20 72 65 6d 6f 76 65 73 20 61 20 72 6f 77     removes a row
2f70: 20 62 65 69 6e 67 20 75 70 64 61 74 65 64 2e 20   being updated. 
2f80: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2f90: 20 75 70 64 61 74 65 20 68 6f 6f 6b 20 73 68 6f   update hook sho
2fa0: 75 6c 64 0a 23 20 20 20 20 20 20 20 20 20 62 65  uld.#         be
2fb0: 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 53 51   invoked with SQ
2fc0: 4c 49 54 45 5f 49 4e 53 45 52 54 20 61 73 20 74  LITE_INSERT as t
2fd0: 68 65 20 6f 70 63 6f 64 65 20 77 68 65 6e 20 69  he opcode when i
2fe0: 6e 73 65 72 74 69 6e 67 20 74 68 65 0a 23 20 20  nserting the.#  
2ff0: 20 20 20 20 20 20 20 6e 65 77 20 76 65 72 73 69         new versi
3000: 6f 6e 20 6f 66 20 74 68 65 20 72 6f 77 2e 0a 23  on of the row..#
3010: 20 20 20 20 20 20 20 20 20 0a 23 20 54 4f 44 4f           .# TODO
3020: 3a 20 53 68 6f 72 74 20 72 65 63 6f 72 64 73 20  : Short records 
3030: 28 74 68 6f 73 65 20 63 72 65 61 74 65 64 20 62  (those created b
3040: 65 66 6f 72 65 20 61 20 63 6f 6c 75 6d 6e 20 69  efore a column i
3050: 73 20 61 64 64 65 64 20 74 6f 20 61 20 74 61 62  s added to a tab
3060: 6c 65 20 0a 23 20 20 20 20 20 20 20 75 73 69 6e  le .#       usin
3070: 67 20 41 4c 54 45 52 20 54 41 42 4c 45 29 0a 23  g ALTER TABLE).#
3080: 0a 0a 70 72 6f 63 20 64 6f 5f 70 72 65 75 70 64  ..proc do_preupd
3090: 61 74 65 5f 74 65 73 74 20 7b 74 6e 20 73 71 6c  ate_test {tn sql
30a0: 20 78 7d 20 7b 0a 20 20 73 65 74 20 58 20 5b 6c   x} {.  set X [l
30b0: 69 73 74 5d 0a 20 20 66 6f 72 65 61 63 68 20 65  ist].  foreach e
30c0: 6c 65 6d 20 24 78 20 7b 6c 61 70 70 65 6e 64 20  lem $x {lappend 
30d0: 58 20 24 65 6c 65 6d 7d 0a 20 20 75 70 6c 65 76  X $elem}.  uplev
30e0: 65 6c 20 64 6f 5f 74 65 73 74 20 24 74 6e 20 5b  el do_test $tn [
30f0: 6c 69 73 74 20 22 0a 20 20 20 20 73 65 74 20 3a  list ".    set :
3100: 3a 70 72 65 75 70 64 61 74 65 20 5c 5b 6c 69 73  :preupdate \[lis
3110: 74 5c 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  t\].    execsql 
3120: 7b 20 24 73 71 6c 20 7d 0a 20 20 20 20 73 65 74  { $sql }.    set
3130: 20 3a 3a 70 72 65 75 70 64 61 74 65 0a 20 20 22   ::preupdate.  "
3140: 5d 20 5b 6c 69 73 74 20 24 58 5d 0a 7d 0a 0a 70  ] [list $X].}..p
3150: 72 6f 63 20 70 72 65 75 70 64 61 74 65 5f 68 6f  roc preupdate_ho
3160: 6f 6b 20 7b 61 72 67 73 7d 20 7b 0a 20 20 73 65  ok {args} {.  se
3170: 74 20 74 79 70 65 20 5b 6c 69 6e 64 65 78 20 24  t type [lindex $
3180: 61 72 67 73 20 30 5d 0a 20 20 65 76 61 6c 20 6c  args 0].  eval l
3190: 61 70 70 65 6e 64 20 3a 3a 70 72 65 75 70 64 61  append ::preupda
31a0: 74 65 20 24 61 72 67 73 0a 20 20 69 66 20 7b 24  te $args.  if {$
31b0: 74 79 70 65 20 21 3d 20 22 49 4e 53 45 52 54 22  type != "INSERT"
31c0: 7d 20 7b 0a 20 20 20 20 66 6f 72 20 7b 73 65 74  } {.    for {set
31d0: 20 69 20 30 7d 20 7b 24 69 20 3c 20 5b 64 62 20   i 0} {$i < [db 
31e0: 70 72 65 75 70 64 61 74 65 20 63 6f 75 6e 74 5d  preupdate count]
31f0: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
3200: 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 70 72 65     lappend ::pre
3210: 75 70 64 61 74 65 20 5b 64 62 20 70 72 65 75 70  update [db preup
3220: 64 61 74 65 20 6f 6c 64 20 24 69 5d 0a 20 20 20  date old $i].   
3230: 20 7d 0a 20 20 7d 0a 20 20 69 66 20 7b 24 74 79   }.  }.  if {$ty
3240: 70 65 20 21 3d 20 22 44 45 4c 45 54 45 22 7d 20  pe != "DELETE"} 
3250: 7b 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69  {.    for {set i
3260: 20 30 7d 20 7b 24 69 20 3c 20 5b 64 62 20 70 72   0} {$i < [db pr
3270: 65 75 70 64 61 74 65 20 63 6f 75 6e 74 5d 7d 20  eupdate count]} 
3280: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20  {incr i} {.     
3290: 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b   set rc [catch {
32a0: 20 64 62 20 70 72 65 75 70 64 61 74 65 20 6e 65   db preupdate ne
32b0: 77 20 24 69 20 7d 20 76 5d 0a 20 20 20 20 20 20  w $i } v].      
32c0: 6c 61 70 70 65 6e 64 20 3a 3a 70 72 65 75 70 64  lappend ::preupd
32d0: 61 74 65 20 24 76 0a 20 20 20 20 7d 0a 20 20 7d  ate $v.    }.  }
32e0: 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72  .}..db close.for
32f0: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
3300: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
3310: 2e 64 62 0a 64 62 20 70 72 65 75 70 64 61 74 65  .db.db preupdate
3320: 20 68 6f 6f 6b 20 70 72 65 75 70 64 61 74 65 5f   hook preupdate_
3330: 68 6f 6f 6b 0a 0a 23 20 53 65 74 20 75 70 20 61  hook..# Set up a
3340: 20 73 63 68 65 6d 61 20 74 6f 20 75 73 65 20 66   schema to use f
3350: 6f 72 20 74 65 73 74 73 20 37 2e 31 2e 2a 20 74  or tests 7.1.* t
3360: 6f 20 37 2e 33 2e 2a 2e 0a 64 6f 5f 65 78 65 63  o 7.3.*..do_exec
3370: 73 71 6c 5f 74 65 73 74 20 37 2e 30 20 7b 20 0a  sql_test 7.0 { .
3380: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
3390: 31 28 61 2c 20 62 29 3b 20 0a 20 20 43 52 45 41  1(a, b); .  CREA
33a0: 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c 20 79  TE TABLE t2(x, y
33b0: 29 3b 20 0a 20 20 43 52 45 41 54 45 20 54 41 42  ); .  CREATE TAB
33c0: 4c 45 20 74 33 28 69 2c 20 6a 2c 20 55 4e 49 51  LE t3(i, j, UNIQ
33d0: 55 45 28 69 29 29 3b 0a 0a 20 20 49 4e 53 45 52  UE(i));..  INSER
33e0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
33f0: 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 49 4e  ('a', 'b');.  IN
3400: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
3410: 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b 0a 0a  UES('c', 'd');..
3420: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
3430: 20 56 41 4c 55 45 53 28 34 2c 20 31 36 29 3b 0a   VALUES(4, 16);.
3440: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
3450: 20 56 41 4c 55 45 53 28 35 2c 20 32 35 29 3b 0a   VALUES(5, 25);.
3460: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
3470: 20 56 41 4c 55 45 53 28 36 2c 20 33 36 29 3b 0a   VALUES(6, 36);.
3480: 7d 20 0a 0a 64 6f 5f 70 72 65 75 70 64 61 74 65  } ..do_preupdate
3490: 5f 74 65 73 74 20 37 2e 31 2e 31 20 7b 0a 20 20  _test 7.1.1 {.  
34a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
34b0: 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 0a  ALUES('x', 'y').
34c0: 7d 20 7b 49 4e 53 45 52 54 20 6d 61 69 6e 20 74  } {INSERT main t
34d0: 31 20 31 20 31 20 20 78 20 79 7d 0a 0a 23 20 37  1 1 1  x y}..# 7
34e0: 2e 31 2e 32 2e 31 20 64 6f 65 73 20 6e 6f 74 20  .1.2.1 does not 
34f0: 75 73 65 20 74 68 65 20 78 66 65 72 20 6f 70 74  use the xfer opt
3500: 69 6d 69 7a 61 74 69 6f 6e 2e 20 37 2e 31 2e 32  imization. 7.1.2
3510: 2e 32 20 64 6f 65 73 2e 0a 64 6f 5f 70 72 65 75  .2 does..do_preu
3520: 70 64 61 74 65 5f 74 65 73 74 20 37 2e 31 2e 32  pdate_test 7.1.2
3530: 2e 31 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e  .1 {.  INSERT IN
3540: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 79 2c 20  TO t1 SELECT y, 
3550: 78 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 4e  x FROM t2;.} {IN
3560: 53 45 52 54 20 6d 61 69 6e 20 74 31 20 32 20 32  SERT main t1 2 2
3570: 20 62 20 61 20 20 20 49 4e 53 45 52 54 20 6d 61   b a   INSERT ma
3580: 69 6e 20 74 31 20 33 20 33 20 64 20 63 7d 0a 64  in t1 3 3 d c}.d
3590: 6f 5f 70 72 65 75 70 64 61 74 65 5f 74 65 73 74  o_preupdate_test
35a0: 20 37 2e 31 2e 32 2e 32 20 7b 0a 20 20 49 4e 53   7.1.2.2 {.  INS
35b0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
35c0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
35d0: 7b 49 4e 53 45 52 54 20 6d 61 69 6e 20 74 31 20  {INSERT main t1 
35e0: 34 20 34 20 61 20 62 20 20 20 49 4e 53 45 52 54  4 4 a b   INSERT
35f0: 20 6d 61 69 6e 20 74 31 20 35 20 35 20 63 20 64   main t1 5 5 c d
3600: 7d 0a 0a 64 6f 5f 70 72 65 75 70 64 61 74 65 5f  }..do_preupdate_
3610: 74 65 73 74 20 37 2e 31 2e 33 20 7b 0a 20 20 52  test 7.1.3 {.  R
3620: 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 31 28 72  EPLACE INTO t1(r
3630: 6f 77 69 64 2c 20 61 2c 20 62 29 20 56 41 4c 55  owid, a, b) VALU
3640: 45 53 28 31 2c 20 31 2c 20 31 29 3b 0a 7d 20 7b  ES(1, 1, 1);.} {
3650: 0a 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20 74  .  DELETE main t
3660: 31 20 31 20 31 20 20 20 78 20 79 0a 20 20 49 4e  1 1 1   x y.  IN
3670: 53 45 52 54 20 6d 61 69 6e 20 74 31 20 31 20 31  SERT main t1 1 1
3680: 20 20 20 31 20 31 0a 7d 0a 0a 64 6f 5f 70 72 65     1 1.}..do_pre
3690: 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e 31 2e  update_test 7.1.
36a0: 34 20 7b 0a 20 20 52 45 50 4c 41 43 45 20 49 4e  4 {.  REPLACE IN
36b0: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 34 2c 20  TO t3 VALUES(4, 
36c0: 4e 55 4c 4c 29 3b 0a 7d 20 7b 0a 20 20 44 45 4c  NULL);.} {.  DEL
36d0: 45 54 45 20 6d 61 69 6e 20 74 33 20 31 20 31 20  ETE main t3 1 1 
36e0: 20 20 34 20 31 36 0a 20 20 49 4e 53 45 52 54 20    4 16.  INSERT 
36f0: 6d 61 69 6e 20 74 33 20 34 20 34 20 20 20 34 20  main t3 4 4   4 
3700: 7b 7d 0a 7d 0a 0a 64 6f 5f 70 72 65 75 70 64 61  {}.}..do_preupda
3710: 74 65 5f 74 65 73 74 20 37 2e 31 2e 35 20 7b 0a  te_test 7.1.5 {.
3720: 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74    REPLACE INTO t
3730: 33 28 72 6f 77 69 64 2c 20 69 2c 20 6a 29 20 56  3(rowid, i, j) V
3740: 41 4c 55 45 53 28 32 2c 20 36 2c 20 4e 55 4c 4c  ALUES(2, 6, NULL
3750: 29 3b 0a 7d 20 7b 0a 20 20 44 45 4c 45 54 45 20  );.} {.  DELETE 
3760: 6d 61 69 6e 20 74 33 20 32 20 32 20 20 35 20 32  main t3 2 2  5 2
3770: 35 0a 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20  5.  DELETE main 
3780: 74 33 20 33 20 33 20 20 36 20 33 36 0a 20 20 49  t3 3 3  6 36.  I
3790: 4e 53 45 52 54 20 6d 61 69 6e 20 74 33 20 32 20  NSERT main t3 2 
37a0: 32 20 20 36 20 7b 7d 0a 7d 0a 0a 64 6f 5f 65 78  2  6 {}.}..do_ex
37b0: 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 32 2e 30  ecsql_test 7.2.0
37c0: 20 7b 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20   { SELECT rowid 
37d0: 46 52 4f 4d 20 74 31 20 7d 20 7b 31 20 32 20 33  FROM t1 } {1 2 3
37e0: 20 34 20 35 7d 0a 0a 64 6f 5f 70 72 65 75 70 64   4 5}..do_preupd
37f0: 61 74 65 5f 74 65 73 74 20 37 2e 32 2e 31 20 7b  ate_test 7.2.1 {
3800: 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  .  DELETE FROM t
3810: 31 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20  1 WHERE rowid = 
3820: 33 0a 7d 20 7b 0a 20 20 44 45 4c 45 54 45 20 6d  3.} {.  DELETE m
3830: 61 69 6e 20 74 31 20 33 20 33 20 20 64 20 63 0a  ain t1 3 3  d c.
3840: 7d 0a 64 6f 5f 70 72 65 75 70 64 61 74 65 5f 74  }.do_preupdate_t
3850: 65 73 74 20 37 2e 32 2e 32 20 7b 0a 20 20 44 45  est 7.2.2 {.  DE
3860: 4c 45 54 45 20 46 52 4f 4d 20 74 31 0a 7d 20 7b  LETE FROM t1.} {
3870: 0a 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20 74  .  DELETE main t
3880: 31 20 31 20 31 20 20 20 31 20 31 0a 20 20 44 45  1 1 1   1 1.  DE
3890: 4c 45 54 45 20 6d 61 69 6e 20 74 31 20 32 20 32  LETE main t1 2 2
38a0: 20 20 20 62 20 61 0a 20 20 44 45 4c 45 54 45 20     b a.  DELETE 
38b0: 6d 61 69 6e 20 74 31 20 34 20 34 20 20 20 61 20  main t1 4 4   a 
38c0: 62 0a 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20  b.  DELETE main 
38d0: 74 31 20 35 20 35 20 20 20 63 20 64 0a 7d 0a 0a  t1 5 5   c d.}..
38e0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
38f0: 37 2e 33 2e 30 20 7b 20 0a 20 20 44 45 4c 45 54  7.3.0 { .  DELET
3900: 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 44 45 4c  E FROM t1;.  DEL
3910: 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20 44  ETE FROM t2;.  D
3920: 45 4c 45 54 45 20 46 52 4f 4d 20 74 33 3b 0a 0a  ELETE FROM t3;..
3930: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
3940: 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
3950: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
3960: 20 74 32 20 56 41 4c 55 45 53 28 27 63 27 2c 20   t2 VALUES('c', 
3970: 27 64 27 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20  'd');..  INSERT 
3980: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 34  INTO t3 VALUES(4
3990: 2c 20 31 36 29 3b 0a 20 20 49 4e 53 45 52 54 20  , 16);.  INSERT 
39a0: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 35  INTO t3 VALUES(5
39b0: 2c 20 32 35 29 3b 0a 20 20 49 4e 53 45 52 54 20  , 25);.  INSERT 
39c0: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 36  INTO t3 VALUES(6
39d0: 2c 20 33 36 29 3b 0a 7d 0a 0a 64 6f 5f 70 72 65  , 36);.}..do_pre
39e0: 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e 33 2e  update_test 7.3.
39f0: 31 20 7b 0a 20 20 55 50 44 41 54 45 20 74 32 20  1 {.  UPDATE t2 
3a00: 53 45 54 20 79 20 3d 20 79 7c 7c 79 3b 0a 7d 20  SET y = y||y;.} 
3a10: 7b 0a 20 20 55 50 44 41 54 45 20 6d 61 69 6e 20  {.  UPDATE main 
3a20: 74 32 20 31 20 31 20 20 20 61 20 62 20 20 61 20  t2 1 1   a b  a 
3a30: 62 62 0a 20 20 55 50 44 41 54 45 20 6d 61 69 6e  bb.  UPDATE main
3a40: 20 74 32 20 32 20 32 20 20 20 63 20 64 20 20 63   t2 2 2   c d  c
3a50: 20 64 64 0a 7d 0a 0a 64 6f 5f 70 72 65 75 70 64   dd.}..do_preupd
3a60: 61 74 65 5f 74 65 73 74 20 37 2e 33 2e 32 20 7b  ate_test 7.3.2 {
3a70: 0a 20 20 55 50 44 41 54 45 20 74 32 20 53 45 54  .  UPDATE t2 SET
3a80: 20 72 6f 77 69 64 20 3d 20 72 6f 77 69 64 2d 31   rowid = rowid-1
3a90: 3b 0a 7d 20 7b 0a 20 20 55 50 44 41 54 45 20 6d  ;.} {.  UPDATE m
3aa0: 61 69 6e 20 74 32 20 31 20 30 20 20 20 61 20 62  ain t2 1 0   a b
3ab0: 62 20 20 61 20 62 62 0a 20 20 55 50 44 41 54 45  b  a bb.  UPDATE
3ac0: 20 6d 61 69 6e 20 74 32 20 32 20 31 20 20 20 63   main t2 2 1   c
3ad0: 20 64 64 20 20 63 20 64 64 0a 7d 0a 0a 64 6f 5f   dd  c dd.}..do_
3ae0: 70 72 65 75 70 64 61 74 65 5f 74 65 73 74 20 37  preupdate_test 7
3af0: 2e 33 2e 33 20 7b 0a 20 20 55 50 44 41 54 45 20  .3.3 {.  UPDATE 
3b00: 4f 52 20 52 45 50 4c 41 43 45 20 74 32 20 53 45  OR REPLACE t2 SE
3b10: 54 20 72 6f 77 69 64 20 3d 20 31 20 57 48 45 52  T rowid = 1 WHER
3b20: 45 20 78 20 3d 20 27 61 27 0a 7d 20 7b 0a 20 20  E x = 'a'.} {.  
3b30: 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 32 20 31  DELETE main t2 1
3b40: 20 31 20 20 20 63 20 64 64 0a 20 20 55 50 44 41   1   c dd.  UPDA
3b50: 54 45 20 6d 61 69 6e 20 74 32 20 30 20 31 20 20  TE main t2 0 1  
3b60: 20 61 20 62 62 20 20 61 20 62 62 0a 7d 0a 0a 64   a bb  a bb.}..d
3b70: 6f 5f 70 72 65 75 70 64 61 74 65 5f 74 65 73 74  o_preupdate_test
3b80: 20 37 2e 33 2e 34 2e 31 20 7b 0a 20 20 55 50 44   7.3.4.1 {.  UPD
3b90: 41 54 45 20 4f 52 20 52 45 50 4c 41 43 45 20 74  ATE OR REPLACE t
3ba0: 33 20 53 45 54 20 69 20 3d 20 35 20 57 48 45 52  3 SET i = 5 WHER
3bb0: 45 20 69 20 3d 20 36 0a 7d 20 7b 0a 20 20 44 45  E i = 6.} {.  DE
3bc0: 4c 45 54 45 20 6d 61 69 6e 20 74 33 20 32 20 32  LETE main t3 2 2
3bd0: 20 20 20 35 20 32 35 0a 20 20 55 50 44 41 54 45     5 25.  UPDATE
3be0: 20 6d 61 69 6e 20 74 33 20 33 20 33 20 20 20 36   main t3 3 3   6
3bf0: 20 33 36 20 20 35 20 33 36 0a 7d 0a 0a 64 6f 5f   36  5 36.}..do_
3c00: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 33  execsql_test 7.3
3c10: 2e 34 2e 32 20 7b 0a 20 20 49 4e 53 45 52 54 20  .4.2 {.  INSERT 
3c20: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31  INTO t3 VALUES(1
3c30: 30 2c 20 31 30 30 29 3b 0a 20 20 53 45 4c 45 43  0, 100);.  SELEC
3c40: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
3c50: 74 33 3b 0a 7d 20 7b 31 20 34 20 31 36 20 20 20  t3;.} {1 4 16   
3c60: 33 20 35 20 33 36 20 20 20 34 20 31 30 20 31 30  3 5 36   4 10 10
3c70: 30 7d 0a 0a 64 6f 5f 70 72 65 75 70 64 61 74 65  0}..do_preupdate
3c80: 5f 74 65 73 74 20 37 2e 33 2e 35 20 7b 0a 20 20  _test 7.3.5 {.  
3c90: 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c 41 43  UPDATE OR REPLAC
3ca0: 45 20 74 33 20 53 45 54 20 72 6f 77 69 64 20 3d  E t3 SET rowid =
3cb0: 20 31 2c 20 69 20 3d 20 35 20 57 48 45 52 45 20   1, i = 5 WHERE 
3cc0: 6a 20 3d 20 31 30 30 3b 0a 7d 20 7b 0a 20 20 44  j = 100;.} {.  D
3cd0: 45 4c 45 54 45 20 6d 61 69 6e 20 74 33 20 31 20  ELETE main t3 1 
3ce0: 31 20 20 20 20 34 20 20 31 36 0a 20 20 44 45 4c  1    4  16.  DEL
3cf0: 45 54 45 20 6d 61 69 6e 20 74 33 20 33 20 33 20  ETE main t3 3 3 
3d00: 20 20 20 35 20 20 33 36 0a 20 20 55 50 44 41 54     5  36.  UPDAT
3d10: 45 20 6d 61 69 6e 20 74 33 20 34 20 31 20 20 20  E main t3 4 1   
3d20: 31 30 20 31 30 30 20 20 35 20 31 30 30 0a 7d 0a  10 100  5 100.}.
3d30: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3d40: 20 37 2e 34 2e 31 2e 30 20 7b 0a 20 20 43 52 45   7.4.1.0 {.  CRE
3d50: 41 54 45 20 54 41 42 4c 45 20 74 34 28 61 2c 20  ATE TABLE t4(a, 
3d60: 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  b);.  INSERT INT
3d70: 4f 20 74 34 20 56 41 4c 55 45 53 28 27 61 27 2c  O t4 VALUES('a',
3d80: 20 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   1);.  INSERT IN
3d90: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27 62 27  TO t4 VALUES('b'
3da0: 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 2);.  INSERT I
3db0: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27 63  NTO t4 VALUES('c
3dc0: 27 2c 20 33 29 3b 0a 0a 20 20 43 52 45 41 54 45  ', 3);..  CREATE
3dd0: 20 54 52 49 47 47 45 52 20 74 34 74 20 42 45 46   TRIGGER t4t BEF
3de0: 4f 52 45 20 44 45 4c 45 54 45 20 4f 4e 20 74 34  ORE DELETE ON t4
3df0: 20 42 45 47 49 4e 0a 20 20 20 20 44 45 4c 45 54   BEGIN.    DELET
3e00: 45 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20  E FROM t4 WHERE 
3e10: 62 20 3d 20 31 3b 0a 20 20 45 4e 44 3b 0a 7d 0a  b = 1;.  END;.}.
3e20: 0a 64 6f 5f 70 72 65 75 70 64 61 74 65 5f 74 65  .do_preupdate_te
3e30: 73 74 20 37 2e 34 2e 31 2e 31 20 7b 0a 20 20 44  st 7.4.1.1 {.  D
3e40: 45 4c 45 54 45 20 46 52 4f 4d 20 74 34 20 57 48  ELETE FROM t4 WH
3e50: 45 52 45 20 62 20 3d 20 33 0a 7d 20 7b 0a 20 20  ERE b = 3.} {.  
3e60: 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 34 20 31  DELETE main t4 1
3e70: 20 31 20 20 20 61 20 31 0a 20 20 44 45 4c 45 54   1   a 1.  DELET
3e80: 45 20 6d 61 69 6e 20 74 34 20 33 20 33 20 20 20  E main t4 3 3   
3e90: 63 20 33 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  c 3.}..do_execsq
3ea0: 6c 5f 74 65 73 74 20 37 2e 34 2e 31 2e 32 20 7b  l_test 7.4.1.2 {
3eb0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
3ec0: 34 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20 56  4(rowid, a, b) V
3ed0: 41 4c 55 45 53 28 31 2c 20 27 61 27 2c 20 31 29  ALUES(1, 'a', 1)
3ee0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
3ef0: 74 34 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20  t4(rowid, a, b) 
3f00: 56 41 4c 55 45 53 28 33 2c 20 27 63 27 2c 20 33  VALUES(3, 'c', 3
3f10: 29 3b 0a 7d 0a 64 6f 5f 70 72 65 75 70 64 61 74  );.}.do_preupdat
3f20: 65 5f 74 65 73 74 20 37 2e 34 2e 31 2e 33 20 7b  e_test 7.4.1.3 {
3f30: 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  .  DELETE FROM t
3f40: 34 20 57 48 45 52 45 20 62 20 3d 20 31 0a 7d 20  4 WHERE b = 1.} 
3f50: 7b 0a 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20  {.  DELETE main 
3f60: 74 34 20 31 20 31 20 20 20 61 20 31 0a 7d 0a 0a  t4 1 1   a 1.}..
3f70: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3f80: 37 2e 34 2e 32 2e 30 20 7b 0a 20 20 43 52 45 41  7.4.2.0 {.  CREA
3f90: 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20 62  TE TABLE t5(a, b
3fa0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
3fb0: 20 74 35 20 56 41 4c 55 45 53 28 27 61 27 2c 20   t5 VALUES('a', 
3fc0: 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  1);.  INSERT INT
3fd0: 4f 20 74 35 20 56 41 4c 55 45 53 28 27 62 27 2c  O t5 VALUES('b',
3fe0: 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   2);.  INSERT IN
3ff0: 54 4f 20 74 35 20 56 41 4c 55 45 53 28 27 63 27  TO t5 VALUES('c'
4000: 2c 20 33 29 3b 0a 0a 20 20 43 52 45 41 54 45 20  , 3);..  CREATE 
4010: 54 52 49 47 47 45 52 20 74 35 74 20 42 45 46 4f  TRIGGER t5t BEFO
4020: 52 45 20 55 50 44 41 54 45 20 4f 4e 20 74 35 20  RE UPDATE ON t5 
4030: 42 45 47 49 4e 0a 20 20 20 20 44 45 4c 45 54 45  BEGIN.    DELETE
4040: 20 46 52 4f 4d 20 74 35 20 57 48 45 52 45 20 62   FROM t5 WHERE b
4050: 20 3d 20 31 3b 0a 20 20 45 4e 44 3b 0a 7d 0a 64   = 1;.  END;.}.d
4060: 6f 5f 70 72 65 75 70 64 61 74 65 5f 74 65 73 74  o_preupdate_test
4070: 20 37 2e 34 2e 32 2e 31 20 7b 0a 20 20 55 50 44   7.4.2.1 {.  UPD
4080: 41 54 45 20 74 35 20 53 45 54 20 62 20 3d 20 34  ATE t5 SET b = 4
4090: 20 57 48 45 52 45 20 61 20 3d 20 27 63 27 0a 7d   WHERE a = 'c'.}
40a0: 20 7b 0a 20 20 44 45 4c 45 54 45 20 6d 61 69 6e   {.  DELETE main
40b0: 20 74 35 20 31 20 31 20 20 20 61 20 31 0a 20 20   t5 1 1   a 1.  
40c0: 55 50 44 41 54 45 20 6d 61 69 6e 20 74 35 20 33  UPDATE main t5 3
40d0: 20 33 20 20 20 63 20 33 20 20 63 20 34 0a 7d 0a   3   c 3  c 4.}.
40e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
40f0: 20 37 2e 34 2e 32 2e 32 20 7b 0a 20 20 49 4e 53   7.4.2.2 {.  INS
4100: 45 52 54 20 49 4e 54 4f 20 74 35 28 72 6f 77 69  ERT INTO t5(rowi
4110: 64 2c 20 61 2c 20 62 29 20 56 41 4c 55 45 53 28  d, a, b) VALUES(
4120: 31 2c 20 27 61 27 2c 20 31 29 3b 0a 7d 0a 0a 64  1, 'a', 1);.}..d
4130: 6f 5f 70 72 65 75 70 64 61 74 65 5f 74 65 73 74  o_preupdate_test
4140: 20 37 2e 34 2e 32 2e 33 20 7b 0a 20 20 55 50 44   7.4.2.3 {.  UPD
4150: 41 54 45 20 74 35 20 53 45 54 20 62 20 3d 20 35  ATE t5 SET b = 5
4160: 20 57 48 45 52 45 20 61 20 3d 20 27 61 27 0a 7d   WHERE a = 'a'.}
4170: 20 7b 0a 20 20 44 45 4c 45 54 45 20 6d 61 69 6e   {.  DELETE main
4180: 20 74 35 20 31 20 31 20 20 20 61 20 31 0a 7d 0a   t5 1 1   a 1.}.
4190: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
41a0: 20 37 2e 35 2e 31 2e 30 20 7b 0a 20 20 43 52 45   7.5.1.0 {.  CRE
41b0: 41 54 45 20 54 41 42 4c 45 20 74 37 28 61 2c 20  ATE TABLE t7(a, 
41c0: 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  b);.  INSERT INT
41d0: 4f 20 74 37 20 56 41 4c 55 45 53 28 27 6f 6e 65  O t7 VALUES('one
41e0: 27 2c 20 27 74 77 6f 27 29 3b 0a 20 20 49 4e 53  ', 'two');.  INS
41f0: 45 52 54 20 49 4e 54 4f 20 74 37 20 56 41 4c 55  ERT INTO t7 VALU
4200: 45 53 28 27 74 68 72 65 65 27 2c 20 27 66 6f 75  ES('three', 'fou
4210: 72 27 29 3b 0a 20 20 41 4c 54 45 52 20 54 41 42  r');.  ALTER TAB
4220: 4c 45 20 74 37 20 41 44 44 20 43 4f 4c 55 4d 4e  LE t7 ADD COLUMN
4230: 20 63 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c 3b   c DEFAULT NULL;
4240: 0a 7d 0a 0a 64 6f 5f 70 72 65 75 70 64 61 74 65  .}..do_preupdate
4250: 5f 74 65 73 74 20 37 2e 35 2e 31 2e 31 20 7b 0a  _test 7.5.1.1 {.
4260: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 37    DELETE FROM t7
4270: 20 57 48 45 52 45 20 61 20 3d 20 27 6f 6e 65 27   WHERE a = 'one'
4280: 0a 7d 20 7b 0a 20 20 44 45 4c 45 54 45 20 6d 61  .} {.  DELETE ma
4290: 69 6e 20 74 37 20 31 20 31 20 20 20 6f 6e 65 20  in t7 1 1   one 
42a0: 74 77 6f 20 7b 7d 0a 7d 0a 0a 64 6f 5f 70 72 65  two {}.}..do_pre
42b0: 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e 35 2e  update_test 7.5.
42c0: 31 2e 32 20 7b 0a 20 20 55 50 44 41 54 45 20 74  1.2 {.  UPDATE t
42d0: 37 20 53 45 54 20 62 20 3d 20 27 66 69 76 65 27  7 SET b = 'five'
42e0: 0a 7d 20 7b 0a 20 20 55 50 44 41 54 45 20 6d 61  .} {.  UPDATE ma
42f0: 69 6e 20 74 37 20 32 20 32 20 20 20 74 68 72 65  in t7 2 2   thre
4300: 65 20 66 6f 75 72 20 7b 7d 20 20 74 68 72 65 65  e four {}  three
4310: 20 66 69 76 65 20 7b 7d 0a 7d 0a 0a 64 6f 5f 65   five {}.}..do_e
4320: 78 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 35 2e  xecsql_test 7.5.
4330: 32 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  2.0 {.  CREATE T
4340: 41 42 4c 45 20 74 38 28 61 2c 20 62 29 3b 0a 20  ABLE t8(a, b);. 
4350: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 38 20   INSERT INTO t8 
4360: 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27 74  VALUES('one', 't
4370: 77 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  wo');.  INSERT I
4380: 4e 54 4f 20 74 38 20 56 41 4c 55 45 53 28 27 74  NTO t8 VALUES('t
4390: 68 72 65 65 27 2c 20 27 66 6f 75 72 27 29 3b 0a  hree', 'four');.
43a0: 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 38    ALTER TABLE t8
43b0: 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20 44 45   ADD COLUMN c DE
43c0: 46 41 55 4c 54 20 27 78 78 78 27 3b 0a 7d 0a 0a  FAULT 'xxx';.}..
43d0: 69 66 20 30 20 7b 0a 20 20 23 20 41 74 20 74 69  if 0 {.  # At ti
43e0: 6d 65 20 6f 66 20 77 72 69 74 69 6e 67 2c 20 74  me of writing, t
43f0: 68 65 73 65 20 74 77 6f 20 61 72 65 20 62 72 6f  hese two are bro
4400: 6b 65 6e 2e 20 54 68 65 79 20 64 65 6d 6f 6e 73  ken. They demons
4410: 74 72 61 74 65 20 74 68 61 74 20 74 68 65 0a 20  trate that the. 
4420: 20 23 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70   # sqlite3_preup
4430: 64 61 74 65 5f 6f 6c 64 28 29 20 6d 65 74 68 6f  date_old() metho
4440: 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 6e 64 6c  d does not handl
4450: 65 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  e the case where
4460: 20 41 4c 54 45 52 20 54 41 42 4c 45 0a 20 20 23   ALTER TABLE.  #
4470: 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 74   has been used t
4480: 6f 20 61 64 64 20 61 20 63 6f 6c 75 6d 6e 20 77  o add a column w
4490: 69 74 68 20 61 20 64 65 66 61 75 6c 74 20 76 61  ith a default va
44a0: 6c 75 65 20 6f 74 68 65 72 20 74 68 61 6e 20 4e  lue other than N
44b0: 55 4c 4c 2e 0a 20 20 23 0a 20 20 64 6f 5f 70 72  ULL..  #.  do_pr
44c0: 65 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e 35  eupdate_test 7.5
44d0: 2e 32 2e 31 20 7b 0a 20 20 20 20 44 45 4c 45 54  .2.1 {.    DELET
44e0: 45 20 46 52 4f 4d 20 74 38 20 57 48 45 52 45 20  E FROM t8 WHERE 
44f0: 61 20 3d 20 27 6f 6e 65 27 0a 20 20 7d 20 7b 0a  a = 'one'.  } {.
4500: 20 20 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20      DELETE main 
4510: 74 38 20 31 20 31 20 20 20 6f 6e 65 20 74 77 6f  t8 1 1   one two
4520: 20 78 78 78 0a 20 20 7d 0a 20 20 64 6f 5f 70 72   xxx.  }.  do_pr
4530: 65 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e 35  eupdate_test 7.5
4540: 2e 32 2e 32 20 7b 0a 20 20 20 20 55 50 44 41 54  .2.2 {.    UPDAT
4550: 45 20 74 38 20 53 45 54 20 62 20 3d 20 27 66 69  E t8 SET b = 'fi
4560: 76 65 27 0a 20 20 7d 20 7b 0a 20 20 20 20 55 50  ve'.  } {.    UP
4570: 44 41 54 45 20 6d 61 69 6e 20 74 38 20 32 20 32  DATE main t8 2 2
4580: 20 20 20 74 68 72 65 65 20 66 6f 75 72 20 78 78     three four xx
4590: 78 20 20 74 68 72 65 65 20 66 69 76 65 20 78 78  x  three five xx
45a0: 78 0a 20 20 7d 0a 7d 0a 0a 23 20 54 68 69 73 20  x.  }.}..# This 
45b0: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 76  block of tests v
45c0: 65 72 69 66 69 65 73 20 74 68 61 74 20 49 50 4b  erifies that IPK
45d0: 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 72 72   values are corr
45e0: 65 63 74 6c 79 20 72 65 70 6f 72 74 65 64 0a 23  ectly reported.#
45f0: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
4600: 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28 29 20  preupdate_old() 
4610: 61 6e 64 20 73 71 6c 69 74 65 33 5f 70 72 65 75  and sqlite3_preu
4620: 70 64 61 74 65 5f 6e 65 77 28 29 20 66 75 6e 63  pdate_new() func
4630: 74 69 6f 6e 73 2e 0a 23 0a 64 6f 5f 65 78 65 63  tions..#.do_exec
4640: 73 71 6c 5f 74 65 73 74 20 37 2e 36 2e 31 20 7b  sql_test 7.6.1 {
4650: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 39   CREATE TABLE t9
4660: 28 61 2c 20 62 20 49 4e 54 45 47 45 52 20 50 52  (a, b INTEGER PR
4670: 49 4d 41 52 59 20 4b 45 59 2c 20 63 29 20 7d 0a  IMARY KEY, c) }.
4680: 64 6f 5f 70 72 65 75 70 64 61 74 65 5f 74 65 73  do_preupdate_tes
4690: 74 20 37 2e 36 2e 32 20 7b 0a 20 20 49 4e 53 45  t 7.6.2 {.  INSE
46a0: 52 54 20 49 4e 54 4f 20 74 39 20 56 41 4c 55 45  RT INTO t9 VALUE
46b0: 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 55 50  S(1, 2, 3);.  UP
46c0: 44 41 54 45 20 74 39 20 53 45 54 20 62 20 3d 20  DATE t9 SET b = 
46d0: 62 2b 31 2c 20 63 20 3d 20 63 2b 31 3b 0a 20 20  b+1, c = c+1;.  
46e0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 39 20 57  DELETE FROM t9 W
46f0: 48 45 52 45 20 61 20 3d 20 31 3b 0a 7d 20 7b 0a  HERE a = 1;.} {.
4700: 20 20 49 4e 53 45 52 54 20 6d 61 69 6e 20 74 39    INSERT main t9
4710: 20 32 20 32 20 20 20 31 20 32 20 33 0a 20 20 55   2 2   1 2 3.  U
4720: 50 44 41 54 45 20 6d 61 69 6e 20 74 39 20 32 20  PDATE main t9 2 
4730: 33 20 20 20 31 20 32 20 33 20 20 20 31 20 33 20  3   1 2 3   1 3 
4740: 34 0a 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20  4.  DELETE main 
4750: 74 39 20 33 20 33 20 20 20 31 20 33 20 34 0a 7d  t9 3 3   1 3 4.}
4760: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
4770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20  -------------.# 
47b0: 54 65 73 74 20 74 68 61 74 20 74 68 65 20 73 71  Test that the sq
47c0: 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
47d0: 64 65 70 74 68 28 29 20 41 50 49 20 73 65 65 6d  depth() API seem
47e0: 73 20 74 6f 20 77 6f 72 6b 2e 0a 23 0a 70 72 6f  s to work..#.pro
47f0: 63 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b  c preupdate_hook
4800: 20 7b 61 72 67 73 7d 20 7b 0a 20 20 73 65 74 20   {args} {.  set 
4810: 74 79 70 65 20 5b 6c 69 6e 64 65 78 20 24 61 72  type [lindex $ar
4820: 67 73 20 30 5d 0a 20 20 65 76 61 6c 20 6c 61 70  gs 0].  eval lap
4830: 70 65 6e 64 20 3a 3a 70 72 65 75 70 64 61 74 65  pend ::preupdate
4840: 20 24 61 72 67 73 0a 20 20 65 76 61 6c 20 6c 61   $args.  eval la
4850: 70 70 65 6e 64 20 3a 3a 70 72 65 75 70 64 61 74  ppend ::preupdat
4860: 65 20 5b 64 62 20 70 72 65 75 70 64 61 74 65 20  e [db preupdate 
4870: 64 65 70 74 68 5d 0a 0a 20 20 69 66 20 7b 24 74  depth]..  if {$t
4880: 79 70 65 20 21 3d 20 22 49 4e 53 45 52 54 22 7d  ype != "INSERT"}
4890: 20 7b 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20   {.    for {set 
48a0: 69 20 30 7d 20 7b 24 69 20 3c 20 5b 64 62 20 70  i 0} {$i < [db p
48b0: 72 65 75 70 64 61 74 65 20 63 6f 75 6e 74 5d 7d  reupdate count]}
48c0: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
48d0: 20 20 6c 61 70 70 65 6e 64 20 3a 3a 70 72 65 75    lappend ::preu
48e0: 70 64 61 74 65 20 5b 64 62 20 70 72 65 75 70 64  pdate [db preupd
48f0: 61 74 65 20 6f 6c 64 20 24 69 5d 0a 20 20 20 20  ate old $i].    
4900: 7d 0a 20 20 7d 0a 20 20 69 66 20 7b 24 74 79 70  }.  }.  if {$typ
4910: 65 20 21 3d 20 22 44 45 4c 45 54 45 22 7d 20 7b  e != "DELETE"} {
4920: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20  .    for {set i 
4930: 30 7d 20 7b 24 69 20 3c 20 5b 64 62 20 70 72 65  0} {$i < [db pre
4940: 75 70 64 61 74 65 20 63 6f 75 6e 74 5d 7d 20 7b  update count]} {
4950: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20  incr i} {.      
4960: 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 20  set rc [catch { 
4970: 64 62 20 70 72 65 75 70 64 61 74 65 20 6e 65 77  db preupdate new
4980: 20 24 69 20 7d 20 76 5d 0a 20 20 20 20 20 20 6c   $i } v].      l
4990: 61 70 70 65 6e 64 20 3a 3a 70 72 65 75 70 64 61  append ::preupda
49a0: 74 65 20 24 76 0a 20 20 20 20 7d 0a 20 20 7d 0a  te $v.    }.  }.
49b0: 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72 63  }..db close.forc
49c0: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a  edelete test.db.
49d0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
49e0: 64 62 0a 64 62 20 70 72 65 75 70 64 61 74 65 20  db.db preupdate 
49f0: 68 6f 6f 6b 20 70 72 65 75 70 64 61 74 65 5f 68  hook preupdate_h
4a00: 6f 6f 6b 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ook..do_execsql_
4a10: 74 65 73 74 20 37 2e 36 2e 31 20 7b 20 0a 20 20  test 7.6.1 { .  
4a20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
4a30: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  x PRIMARY KEY);.
4a40: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
4a50: 32 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29  2(x PRIMARY KEY)
4a60: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
4a70: 20 74 33 28 78 20 50 52 49 4d 41 52 59 20 4b 45   t3(x PRIMARY KE
4a80: 59 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  Y);.  CREATE TAB
4a90: 4c 45 20 74 34 28 78 20 50 52 49 4d 41 52 59 20  LE t4(x PRIMARY 
4aa0: 4b 45 59 29 3b 0a 0a 20 20 43 52 45 41 54 45 20  KEY);..  CREATE 
4ab0: 54 52 49 47 47 45 52 20 61 20 41 46 54 45 52 20  TRIGGER a AFTER 
4ac0: 49 4e 53 45 52 54 20 4f 4e 20 74 31 20 42 45 47  INSERT ON t1 BEG
4ad0: 49 4e 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  IN INSERT INTO t
4ae0: 32 20 56 41 4c 55 45 53 28 6e 65 77 2e 78 29 3b  2 VALUES(new.x);
4af0: 20 45 4e 44 3b 0a 20 20 43 52 45 41 54 45 20 54   END;.  CREATE T
4b00: 52 49 47 47 45 52 20 62 20 41 46 54 45 52 20 49  RIGGER b AFTER I
4b10: 4e 53 45 52 54 20 4f 4e 20 74 32 20 42 45 47 49  NSERT ON t2 BEGI
4b20: 4e 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33  N INSERT INTO t3
4b30: 20 56 41 4c 55 45 53 28 6e 65 77 2e 78 29 3b 20   VALUES(new.x); 
4b40: 45 4e 44 3b 0a 20 20 43 52 45 41 54 45 20 54 52  END;.  CREATE TR
4b50: 49 47 47 45 52 20 63 20 41 46 54 45 52 20 49 4e  IGGER c AFTER IN
4b60: 53 45 52 54 20 4f 4e 20 74 33 20 42 45 47 49 4e  SERT ON t3 BEGIN
4b70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
4b80: 56 41 4c 55 45 53 28 6e 65 77 2e 78 29 3b 20 45  VALUES(new.x); E
4b90: 4e 44 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 52  ND;..  CREATE TR
4ba0: 49 47 47 45 52 20 64 20 41 46 54 45 52 20 55 50  IGGER d AFTER UP
4bb0: 44 41 54 45 20 4f 4e 20 74 31 20 42 45 47 49 4e  DATE ON t1 BEGIN
4bc0: 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20 78   UPDATE t2 SET x
4bd0: 20 3d 20 6e 65 77 2e 78 3b 20 45 4e 44 3b 0a 20   = new.x; END;. 
4be0: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
4bf0: 65 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f  e AFTER UPDATE O
4c00: 4e 20 74 32 20 42 45 47 49 4e 20 55 50 44 41 54  N t2 BEGIN UPDAT
4c10: 45 20 74 33 20 53 45 54 20 78 20 3d 20 6e 65 77  E t3 SET x = new
4c20: 2e 78 3b 20 45 4e 44 3b 0a 20 20 43 52 45 41 54  .x; END;.  CREAT
4c30: 45 20 54 52 49 47 47 45 52 20 66 20 41 46 54 45  E TRIGGER f AFTE
4c40: 52 20 55 50 44 41 54 45 20 4f 4e 20 74 33 20 42  R UPDATE ON t3 B
4c50: 45 47 49 4e 20 55 50 44 41 54 45 20 74 34 20 53  EGIN UPDATE t4 S
4c60: 45 54 20 78 20 3d 20 6e 65 77 2e 78 3b 20 45 4e  ET x = new.x; EN
4c70: 44 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 52 49  D;..  CREATE TRI
4c80: 47 47 45 52 20 67 20 41 46 54 45 52 20 44 45 4c  GGER g AFTER DEL
4c90: 45 54 45 20 4f 4e 20 74 31 20 42 45 47 49 4e 20  ETE ON t1 BEGIN 
4ca0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57  DELETE FROM t2 W
4cb0: 48 45 52 45 20 31 3b 20 45 4e 44 3b 0a 20 20 43  HERE 1; END;.  C
4cc0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 68 20  REATE TRIGGER h 
4cd0: 41 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20  AFTER DELETE ON 
4ce0: 74 32 20 42 45 47 49 4e 20 44 45 4c 45 54 45 20  t2 BEGIN DELETE 
4cf0: 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 31 3b  FROM t3 WHERE 1;
4d00: 20 45 4e 44 3b 0a 20 20 43 52 45 41 54 45 20 54   END;.  CREATE T
4d10: 52 49 47 47 45 52 20 69 20 41 46 54 45 52 20 44  RIGGER i AFTER D
4d20: 45 4c 45 54 45 20 4f 4e 20 74 33 20 42 45 47 49  ELETE ON t3 BEGI
4d30: 4e 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 34  N DELETE FROM t4
4d40: 20 57 48 45 52 45 20 31 3b 20 45 4e 44 3b 0a 7d   WHERE 1; END;.}
4d50: 0a 0a 64 6f 5f 70 72 65 75 70 64 61 74 65 5f 74  ..do_preupdate_t
4d60: 65 73 74 20 37 2e 36 2e 32 20 7b 0a 20 20 49 4e  est 7.6.2 {.  IN
4d70: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4d80: 55 45 53 28 27 78 79 7a 27 29 3b 0a 7d 20 7b 0a  UES('xyz');.} {.
4d90: 20 20 49 4e 53 45 52 54 20 6d 61 69 6e 20 74 31    INSERT main t1
4da0: 20 31 20 31 20 20 20 30 20 20 20 20 20 20 78 79   1 1   0      xy
4db0: 7a 0a 20 20 49 4e 53 45 52 54 20 6d 61 69 6e 20  z.  INSERT main 
4dc0: 74 32 20 31 20 31 20 20 20 31 20 20 20 20 20 20  t2 1 1   1      
4dd0: 78 79 7a 0a 20 20 49 4e 53 45 52 54 20 6d 61 69  xyz.  INSERT mai
4de0: 6e 20 74 33 20 31 20 31 20 20 20 32 20 20 20 20  n t3 1 1   2    
4df0: 20 20 78 79 7a 0a 20 20 49 4e 53 45 52 54 20 6d    xyz.  INSERT m
4e00: 61 69 6e 20 74 34 20 31 20 31 20 20 20 33 20 20  ain t4 1 1   3  
4e10: 20 20 20 20 78 79 7a 0a 7d 0a 64 6f 5f 70 72 65      xyz.}.do_pre
4e20: 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e 36 2e  update_test 7.6.
4e30: 33 20 7b 0a 20 20 55 50 44 41 54 45 20 74 31 20  3 {.  UPDATE t1 
4e40: 53 45 54 20 78 20 3d 20 27 61 62 63 27 3b 0a 7d  SET x = 'abc';.}
4e50: 20 7b 0a 20 20 55 50 44 41 54 45 20 6d 61 69 6e   {.  UPDATE main
4e60: 20 74 31 20 31 20 31 20 20 20 30 20 20 20 20 20   t1 1 1   0     
4e70: 20 78 79 7a 20 61 62 63 0a 20 20 55 50 44 41 54   xyz abc.  UPDAT
4e80: 45 20 6d 61 69 6e 20 74 32 20 31 20 31 20 20 20  E main t2 1 1   
4e90: 31 20 20 20 20 20 20 78 79 7a 20 61 62 63 0a 20  1      xyz abc. 
4ea0: 20 55 50 44 41 54 45 20 6d 61 69 6e 20 74 33 20   UPDATE main t3 
4eb0: 31 20 31 20 20 20 32 20 20 20 20 20 20 78 79 7a  1 1   2      xyz
4ec0: 20 61 62 63 0a 20 20 55 50 44 41 54 45 20 6d 61   abc.  UPDATE ma
4ed0: 69 6e 20 74 34 20 31 20 31 20 20 20 33 20 20 20  in t4 1 1   3   
4ee0: 20 20 20 78 79 7a 20 61 62 63 0a 7d 0a 64 6f 5f     xyz abc.}.do_
4ef0: 70 72 65 75 70 64 61 74 65 5f 74 65 73 74 20 37  preupdate_test 7
4f00: 2e 36 2e 34 20 7b 0a 20 20 44 45 4c 45 54 45 20  .6.4 {.  DELETE 
4f10: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 31 3b  FROM t1 WHERE 1;
4f20: 0a 7d 20 7b 0a 20 20 44 45 4c 45 54 45 20 6d 61  .} {.  DELETE ma
4f30: 69 6e 20 74 31 20 31 20 31 20 20 20 30 20 20 20  in t1 1 1   0   
4f40: 20 20 20 61 62 63 0a 20 20 44 45 4c 45 54 45 20     abc.  DELETE 
4f50: 6d 61 69 6e 20 74 32 20 31 20 31 20 20 20 31 20  main t2 1 1   1 
4f60: 20 20 20 20 20 61 62 63 0a 20 20 44 45 4c 45 54       abc.  DELET
4f70: 45 20 6d 61 69 6e 20 74 33 20 31 20 31 20 20 20  E main t3 1 1   
4f80: 32 20 20 20 20 20 20 61 62 63 0a 20 20 44 45 4c  2      abc.  DEL
4f90: 45 54 45 20 6d 61 69 6e 20 74 34 20 31 20 31 20  ETE main t4 1 1 
4fa0: 20 20 33 20 20 20 20 20 20 61 62 63 0a 7d 0a 0a    3      abc.}..
4fb0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
4fc0: 37 2e 36 2e 35 20 7b 20 0a 20 20 44 52 4f 50 20  7.6.5 { .  DROP 
4fd0: 54 52 49 47 47 45 52 20 61 3b 20 44 52 4f 50 20  TRIGGER a; DROP 
4fe0: 54 52 49 47 47 45 52 20 62 3b 20 44 52 4f 50 20  TRIGGER b; DROP 
4ff0: 54 52 49 47 47 45 52 20 63 3b 0a 20 20 44 52 4f  TRIGGER c;.  DRO
5000: 50 20 54 52 49 47 47 45 52 20 64 3b 20 44 52 4f  P TRIGGER d; DRO
5010: 50 20 54 52 49 47 47 45 52 20 65 3b 20 44 52 4f  P TRIGGER e; DRO
5020: 50 20 54 52 49 47 47 45 52 20 66 3b 0a 20 20 44  P TRIGGER f;.  D
5030: 52 4f 50 20 54 52 49 47 47 45 52 20 67 3b 20 44  ROP TRIGGER g; D
5040: 52 4f 50 20 54 52 49 47 47 45 52 20 68 3b 20 44  ROP TRIGGER h; D
5050: 52 4f 50 20 54 52 49 47 47 45 52 20 69 3b 0a 0a  ROP TRIGGER i;..
5060: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
5070: 20 61 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54   a BEFORE INSERT
5080: 20 4f 4e 20 74 31 20 42 45 47 49 4e 20 49 4e 53   ON t1 BEGIN INS
5090: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
50a0: 45 53 28 6e 65 77 2e 78 29 3b 20 45 4e 44 3b 0a  ES(new.x); END;.
50b0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
50c0: 20 62 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54   b BEFORE INSERT
50d0: 20 4f 4e 20 74 32 20 42 45 47 49 4e 20 49 4e 53   ON t2 BEGIN INS
50e0: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
50f0: 45 53 28 6e 65 77 2e 78 29 3b 20 45 4e 44 3b 0a  ES(new.x); END;.
5100: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
5110: 20 63 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54   c BEFORE INSERT
5120: 20 4f 4e 20 74 33 20 42 45 47 49 4e 20 49 4e 53   ON t3 BEGIN INS
5130: 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
5140: 45 53 28 6e 65 77 2e 78 29 3b 20 45 4e 44 3b 0a  ES(new.x); END;.
5150: 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45  .  CREATE TRIGGE
5160: 52 20 64 20 42 45 46 4f 52 45 20 55 50 44 41 54  R d BEFORE UPDAT
5170: 45 20 4f 4e 20 74 31 20 42 45 47 49 4e 20 55 50  E ON t1 BEGIN UP
5180: 44 41 54 45 20 74 32 20 53 45 54 20 78 20 3d 20  DATE t2 SET x = 
5190: 6e 65 77 2e 78 3b 20 45 4e 44 3b 0a 20 20 43 52  new.x; END;.  CR
51a0: 45 41 54 45 20 54 52 49 47 47 45 52 20 65 20 42  EATE TRIGGER e B
51b0: 45 46 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20  EFORE UPDATE ON 
51c0: 74 32 20 42 45 47 49 4e 20 55 50 44 41 54 45 20  t2 BEGIN UPDATE 
51d0: 74 33 20 53 45 54 20 78 20 3d 20 6e 65 77 2e 78  t3 SET x = new.x
51e0: 3b 20 45 4e 44 3b 0a 20 20 43 52 45 41 54 45 20  ; END;.  CREATE 
51f0: 54 52 49 47 47 45 52 20 66 20 42 45 46 4f 52 45  TRIGGER f BEFORE
5200: 20 55 50 44 41 54 45 20 4f 4e 20 74 33 20 42 45   UPDATE ON t3 BE
5210: 47 49 4e 20 55 50 44 41 54 45 20 74 34 20 53 45  GIN UPDATE t4 SE
5220: 54 20 78 20 3d 20 6e 65 77 2e 78 3b 20 45 4e 44  T x = new.x; END
5230: 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 52 49 47  ;..  CREATE TRIG
5240: 47 45 52 20 67 20 42 45 46 4f 52 45 20 44 45 4c  GER g BEFORE DEL
5250: 45 54 45 20 4f 4e 20 74 31 20 42 45 47 49 4e 20  ETE ON t1 BEGIN 
5260: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57  DELETE FROM t2 W
5270: 48 45 52 45 20 31 3b 20 45 4e 44 3b 0a 20 20 43  HERE 1; END;.  C
5280: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 68 20  REATE TRIGGER h 
5290: 42 45 46 4f 52 45 20 44 45 4c 45 54 45 20 4f 4e  BEFORE DELETE ON
52a0: 20 74 32 20 42 45 47 49 4e 20 44 45 4c 45 54 45   t2 BEGIN DELETE
52b0: 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 31   FROM t3 WHERE 1
52c0: 3b 20 45 4e 44 3b 0a 20 20 43 52 45 41 54 45 20  ; END;.  CREATE 
52d0: 54 52 49 47 47 45 52 20 69 20 42 45 46 4f 52 45  TRIGGER i BEFORE
52e0: 20 44 45 4c 45 54 45 20 4f 4e 20 74 33 20 42 45   DELETE ON t3 BE
52f0: 47 49 4e 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  GIN DELETE FROM 
5300: 74 34 20 57 48 45 52 45 20 31 3b 20 45 4e 44 3b  t4 WHERE 1; END;
5310: 0a 7d 0a 0a 64 6f 5f 70 72 65 75 70 64 61 74 65  .}..do_preupdate
5320: 5f 74 65 73 74 20 37 2e 36 2e 36 20 7b 0a 20 20  _test 7.6.6 {.  
5330: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5340: 41 4c 55 45 53 28 27 78 79 7a 27 29 3b 0a 7d 20  ALUES('xyz');.} 
5350: 7b 0a 20 20 49 4e 53 45 52 54 20 6d 61 69 6e 20  {.  INSERT main 
5360: 74 34 20 31 20 31 20 20 20 33 20 20 20 20 20 20  t4 1 1   3      
5370: 78 79 7a 0a 20 20 49 4e 53 45 52 54 20 6d 61 69  xyz.  INSERT mai
5380: 6e 20 74 33 20 31 20 31 20 20 20 32 20 20 20 20  n t3 1 1   2    
5390: 20 20 78 79 7a 0a 20 20 49 4e 53 45 52 54 20 6d    xyz.  INSERT m
53a0: 61 69 6e 20 74 32 20 31 20 31 20 20 20 31 20 20  ain t2 1 1   1  
53b0: 20 20 20 20 78 79 7a 0a 20 20 49 4e 53 45 52 54      xyz.  INSERT
53c0: 20 6d 61 69 6e 20 74 31 20 31 20 31 20 20 20 30   main t1 1 1   0
53d0: 20 20 20 20 20 20 78 79 7a 0a 7d 0a 64 6f 5f 70        xyz.}.do_p
53e0: 72 65 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e  reupdate_test 7.
53f0: 36 2e 33 20 7b 0a 20 20 55 50 44 41 54 45 20 74  6.3 {.  UPDATE t
5400: 31 20 53 45 54 20 78 20 3d 20 27 61 62 63 27 3b  1 SET x = 'abc';
5410: 0a 7d 20 7b 0a 20 20 55 50 44 41 54 45 20 6d 61  .} {.  UPDATE ma
5420: 69 6e 20 74 34 20 31 20 31 20 20 20 33 20 20 20  in t4 1 1   3   
5430: 20 20 20 78 79 7a 20 61 62 63 0a 20 20 55 50 44     xyz abc.  UPD
5440: 41 54 45 20 6d 61 69 6e 20 74 33 20 31 20 31 20  ATE main t3 1 1 
5450: 20 20 32 20 20 20 20 20 20 78 79 7a 20 61 62 63    2      xyz abc
5460: 0a 20 20 55 50 44 41 54 45 20 6d 61 69 6e 20 74  .  UPDATE main t
5470: 32 20 31 20 31 20 20 20 31 20 20 20 20 20 20 78  2 1 1   1      x
5480: 79 7a 20 61 62 63 0a 20 20 55 50 44 41 54 45 20  yz abc.  UPDATE 
5490: 6d 61 69 6e 20 74 31 20 31 20 31 20 20 20 30 20  main t1 1 1   0 
54a0: 20 20 20 20 20 78 79 7a 20 61 62 63 0a 7d 0a 64       xyz abc.}.d
54b0: 6f 5f 70 72 65 75 70 64 61 74 65 5f 74 65 73 74  o_preupdate_test
54c0: 20 37 2e 36 2e 34 20 7b 0a 20 20 44 45 4c 45 54   7.6.4 {.  DELET
54d0: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
54e0: 31 3b 0a 7d 20 7b 0a 20 20 44 45 4c 45 54 45 20  1;.} {.  DELETE 
54f0: 6d 61 69 6e 20 74 34 20 31 20 31 20 20 20 33 20  main t4 1 1   3 
5500: 20 20 20 20 20 61 62 63 0a 20 20 44 45 4c 45 54       abc.  DELET
5510: 45 20 6d 61 69 6e 20 74 33 20 31 20 31 20 20 20  E main t3 1 1   
5520: 32 20 20 20 20 20 20 61 62 63 0a 20 20 44 45 4c  2      abc.  DEL
5530: 45 54 45 20 6d 61 69 6e 20 74 32 20 31 20 31 20  ETE main t2 1 1 
5540: 20 20 31 20 20 20 20 20 20 61 62 63 0a 20 20 44    1      abc.  D
5550: 45 4c 45 54 45 20 6d 61 69 6e 20 74 31 20 31 20  ELETE main t1 1 
5560: 31 20 20 20 30 20 20 20 20 20 20 61 62 63 0a 7d  1   0      abc.}
5570: 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a        ..finish_test.