/ Hex Artifact Content
Login

Artifact d054aad1a3772dd9045510382875468a9dcae15f:


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 64 6f 5f 74 65 73 74  failed}}.do_test
06e0: 20 68 6f 6f 6b 2d 33 2e 37 20 7b 0a 20 20 73 65   hook-3.7 {.  se
06f0: 74 20 3a 3a 63 6f 6d 6d 69 74 5f 63 6e 74 0a 7d  t ::commit_cnt.}
0700: 20 7b 31 20 32 20 32 20 33 20 33 20 34 20 34 20   {1 2 2 3 3 4 4 
0710: 35 20 35 20 36 20 36 20 37 7d 0a 64 6f 5f 74 65  5 5 6 6 7}.do_te
0720: 73 74 20 68 6f 6f 6b 2d 33 2e 38 20 7b 0a 20 20  st hook-3.8 {.  
0730: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
0740: 2a 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20  * FROM t2}.} {1 
0750: 32 20 32 20 33 20 33 20 34 20 34 20 35 20 35 20  2 2 3 3 4 4 5 5 
0760: 36 7d 0a 0a 23 20 54 65 73 74 20 74 75 72 6e 6e  6}..# Test turnn
0770: 69 6e 67 20 6f 66 66 20 74 68 65 20 63 6f 6d 6d  ing off the comm
0780: 69 74 20 68 6f 6f 6b 0a 23 0a 64 6f 5f 74 65 73  it hook.#.do_tes
0790: 74 20 68 6f 6f 6b 2d 33 2e 39 20 7b 0a 20 20 64  t hook-3.9 {.  d
07a0: 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 7b 7d  b commit_hook {}
07b0: 0a 20 20 73 65 74 20 3a 3a 63 6f 6d 6d 69 74 5f  .  set ::commit_
07c0: 63 6e 74 20 7b 7d 0a 20 20 65 78 65 63 73 71 6c  cnt {}.  execsql
07d0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
07e0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 37 2c 38  TO t2 VALUES(7,8
07f0: 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 63  );.  }.  set ::c
0800: 6f 6d 6d 69 74 5f 63 6e 74 0a 7d 20 7b 7d 0a 0a  ommit_cnt.} {}..
0810: 23 20 54 69 63 6b 65 74 20 23 33 35 36 34 2e 0a  # Ticket #3564..
0820: 23 0a 64 6f 5f 74 65 73 74 20 68 6f 6f 6b 2d 33  #.do_test hook-3
0830: 2e 31 30 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c  .10 {.  file del
0840: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 32  ete -force test2
0850: 2e 64 62 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75  .db test2.db-jou
0860: 72 6e 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64  rnal.  sqlite3 d
0870: 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 70 72  b2 test2.db.  pr
0880: 6f 63 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 7b  oc commit_hook {
0890: 7d 20 7b 0a 20 20 20 20 73 65 74 20 79 20 5b 64  } {.    set y [d
08a0: 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 79  b2 one {SELECT y
08b0: 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 79   FROM t3 WHERE y
08c0: 3e 31 30 7d 5d 0a 20 20 20 20 72 65 74 75 72 6e  >10}].    return
08d0: 20 5b 65 78 70 72 20 7b 24 79 3e 31 30 7d 5d 0a   [expr {$y>10}].
08e0: 20 20 7d 0a 20 20 64 62 32 20 65 76 61 6c 20 7b    }.  db2 eval {
08f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
0900: 78 2c 79 29 7d 0a 20 20 64 62 32 20 63 6f 6d 6d  x,y)}.  db2 comm
0910: 69 74 5f 68 6f 6f 6b 20 63 6f 6d 6d 69 74 5f 68  it_hook commit_h
0920: 6f 6f 6b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  ook.  catchsql {
0930: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
0940: 41 4c 55 45 53 28 31 2c 32 29 7d 20 64 62 32 0a  ALUES(1,2)} db2.
0950: 20 20 63 61 74 63 68 73 71 6c 20 7b 49 4e 53 45    catchsql {INSE
0960: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
0970: 53 28 31 31 2c 31 32 29 7d 20 64 62 32 0a 20 20  S(11,12)} db2.  
0980: 63 61 74 63 68 73 71 6c 20 7b 49 4e 53 45 52 54  catchsql {INSERT
0990: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
09a0: 33 2c 34 29 7d 20 64 62 32 0a 20 20 64 62 32 20  3,4)} db2.  db2 
09b0: 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  eval {.    SELEC
09c0: 54 20 2a 20 46 52 4f 4d 20 74 33 20 4f 52 44 45  T * FROM t3 ORDE
09d0: 52 20 42 59 20 78 3b 0a 20 20 7d 0a 7d 20 7b 31  R BY x;.  }.} {1
09e0: 20 32 20 33 20 34 7d 0a 64 62 32 20 63 6c 6f 73   2 3 4}.db2 clos
09f0: 65 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e...#-----------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a40: 2d 0a 23 20 54 65 73 74 73 20 66 6f 72 20 74 68  -.# Tests for th
0a50: 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 2e 0a 23  e update-hook..#
0a60: 0a 23 20 34 2e 31 2e 2a 20 2d 20 56 65 72 79 20  .# 4.1.* - Very 
0a70: 73 69 6d 70 6c 65 20 74 65 73 74 73 2e 20 54 65  simple tests. Te
0a80: 73 74 20 74 68 61 74 20 74 68 65 20 75 70 64 61  st that the upda
0a90: 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b  te hook is invok
0aa0: 65 64 20 63 6f 72 72 65 63 74 6c 79 20 0a 23 20  ed correctly .# 
0ab0: 20 20 20 20 20 20 20 20 66 6f 72 20 49 4e 53 45          for INSE
0ac0: 52 54 2c 20 44 45 4c 45 54 45 20 61 6e 64 20 55  RT, DELETE and U
0ad0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
0ae0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 44 45 4c 45  , including DELE
0af0: 54 45 20 0a 23 20 20 20 20 20 20 20 20 20 73 74  TE .#         st
0b00: 61 74 65 6d 65 6e 74 73 20 77 69 74 68 20 6e 6f  atements with no
0b10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 23   WHERE clause..#
0b20: 20 34 2e 32 2e 2a 20 2d 20 43 68 65 63 6b 20 74   4.2.* - Check t
0b30: 68 61 74 20 74 68 65 20 75 70 64 61 74 65 2d 68  hat the update-h
0b40: 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 66  ook is invoked f
0b50: 6f 72 20 72 6f 77 73 20 6d 6f 64 69 66 69 65 64  or rows modified
0b60: 20 62 79 20 74 72 69 67 67 65 72 0a 23 20 20 20   by trigger.#   
0b70: 20 20 20 20 20 20 62 6f 64 69 65 73 2e 20 41 6c        bodies. Al
0b80: 73 6f 20 74 68 61 74 20 74 68 65 20 64 61 74 61  so that the data
0b90: 62 61 73 65 20 6e 61 6d 65 20 69 73 20 63 6f 72  base name is cor
0ba0: 72 65 63 74 6c 79 20 72 65 70 6f 72 74 65 64 20  rectly reported 
0bb0: 77 68 65 6e 20 0a 23 20 20 20 20 20 20 20 20 20  when .#         
0bc0: 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61  an attached data
0bd0: 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64  base is modified
0be0: 2e 0a 23 20 34 2e 33 2e 2a 20 2d 20 44 6f 20 73  ..# 4.3.* - Do s
0bf0: 6f 6d 65 20 73 6f 72 74 69 6e 67 2c 20 67 72 6f  ome sorting, gro
0c00: 75 70 69 6e 67 2c 20 63 6f 6d 70 6f 75 6e 64 20  uping, compound 
0c10: 71 75 65 72 69 65 73 2c 20 70 6f 70 75 6c 61 74  queries, populat
0c20: 69 6f 6e 20 61 6e 64 20 0a 23 20 20 20 20 20 20  ion and .#      
0c30: 20 20 20 64 65 70 6f 70 75 6c 61 74 69 6f 6e 20     depopulation 
0c40: 6f 66 20 69 6e 64 69 63 65 73 2c 20 74 6f 20 6d  of indices, to m
0c50: 61 6b 65 20 73 75 72 65 20 74 68 65 20 75 70 64  ake sure the upd
0c60: 61 74 65 2d 68 6f 6f 6b 20 69 73 20 6e 6f 74 20  ate-hook is not 
0c70: 0a 23 20 20 20 20 20 20 20 20 20 69 6e 76 6f 6b  .#         invok
0c80: 65 64 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a  ed incorrectly..
0c90: 23 0a 0a 23 20 53 69 6d 70 6c 65 20 74 65 73 74  #..# Simple test
0ca0: 73 0a 64 6f 5f 74 65 73 74 20 68 6f 6f 6b 2d 34  s.do_test hook-4
0cb0: 2e 31 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71  .1.1 {.  catchsq
0cc0: 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  l {.    DROP TAB
0cd0: 4c 45 20 74 31 3b 0a 20 20 7d 0a 20 20 65 78 65  LE t1;.  }.  exe
0ce0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
0cf0: 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
0d00: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
0d10: 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , b);.    INSERT
0d20: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0d30: 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49  1, 'one');.    I
0d40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0d50: 4c 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a  LUES(2, 'two');.
0d60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0d70: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 27 74 68  t1 VALUES(3, 'th
0d80: 72 65 65 27 29 3b 0a 20 20 7d 0a 20 20 64 62 20  ree');.  }.  db 
0d90: 75 70 64 61 74 65 5f 68 6f 6f 6b 20 5b 6c 69 73  update_hook [lis
0da0: 74 20 6c 61 70 70 65 6e 64 20 3a 3a 75 70 64 61  t lappend ::upda
0db0: 74 65 5f 68 6f 6f 6b 5d 0a 7d 20 7b 7d 0a 64 6f  te_hook].} {}.do
0dc0: 5f 74 65 73 74 20 68 6f 6f 6b 2d 34 2e 31 2e 32  _test hook-4.1.2
0dd0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0de0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0df0: 31 20 56 41 4c 55 45 53 28 34 2c 20 27 66 6f 75  1 VALUES(4, 'fou
0e00: 72 27 29 3b 0a 20 20 20 20 44 45 4c 45 54 45 20  r');.    DELETE 
0e10: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20  FROM t1 WHERE b 
0e20: 3d 20 27 74 77 6f 27 3b 0a 20 20 20 20 55 50 44  = 'two';.    UPD
0e30: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 27  ATE t1 SET b = '
0e40: 27 20 57 48 45 52 45 20 61 20 3d 20 31 20 4f 52  ' WHERE a = 1 OR
0e50: 20 61 20 3d 20 33 3b 0a 20 20 20 20 44 45 4c 45   a = 3;.    DELE
0e60: 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  TE FROM t1 WHERE
0e70: 20 31 3b 20 2d 2d 20 41 76 6f 69 64 20 74 68 65   1; -- Avoid the
0e80: 20 74 72 75 6e 63 61 74 65 20 6f 70 74 69 6d 69   truncate optimi
0e90: 7a 61 74 69 6f 6e 20 28 66 6f 72 20 6e 6f 77 29  zation (for now)
0ea0: 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 75 70 64  .  }.  set ::upd
0eb0: 61 74 65 5f 68 6f 6f 6b 0a 7d 20 5b 6c 69 73 74  ate_hook.} [list
0ec0: 20 5c 0a 20 20 20 20 49 4e 53 45 52 54 20 6d 61   \.    INSERT ma
0ed0: 69 6e 20 74 31 20 34 20 5c 0a 20 20 20 20 44 45  in t1 4 \.    DE
0ee0: 4c 45 54 45 20 6d 61 69 6e 20 74 31 20 32 20 5c  LETE main t1 2 \
0ef0: 0a 20 20 20 20 55 50 44 41 54 45 20 6d 61 69 6e  .    UPDATE main
0f00: 20 74 31 20 31 20 5c 0a 20 20 20 20 55 50 44 41   t1 1 \.    UPDA
0f10: 54 45 20 6d 61 69 6e 20 74 31 20 33 20 5c 0a 20  TE main t1 3 \. 
0f20: 20 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20 74     DELETE main t
0f30: 31 20 31 20 5c 0a 20 20 20 20 44 45 4c 45 54 45  1 1 \.    DELETE
0f40: 20 6d 61 69 6e 20 74 31 20 33 20 5c 0a 20 20 20   main t1 3 \.   
0f50: 20 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 31 20   DELETE main t1 
0f60: 34 20 5c 0a 5d 0a 0a 69 66 63 61 70 61 62 6c 65  4 \.]..ifcapable
0f70: 20 74 72 69 67 67 65 72 20 7b 0a 20 20 23 20 55   trigger {.  # U
0f80: 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 6e 6f  pdate hook is no
0f90: 74 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 63 68  t invoked for ch
0fa0: 61 6e 67 65 73 20 74 6f 20 73 71 6c 69 74 65 5f  anges to sqlite_
0fb0: 6d 61 73 74 65 72 0a 20 20 23 0a 20 20 64 6f 5f  master.  #.  do_
0fc0: 74 65 73 74 20 68 6f 6f 6b 2d 34 2e 31 2e 33 20  test hook-4.1.3 
0fd0: 7b 0a 20 20 20 20 73 65 74 20 3a 3a 75 70 64 61  {.    set ::upda
0fe0: 74 65 5f 68 6f 6f 6b 20 7b 7d 0a 20 20 20 20 65  te_hook {}.    e
0ff0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  xecsql {.      C
1000: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 72 31  REATE TRIGGER r1
1010: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
1020: 20 74 31 20 42 45 47 49 4e 20 53 45 4c 45 43 54   t1 BEGIN SELECT
1030: 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29 3b 20   RAISE(IGNORE); 
1040: 45 4e 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  END;.    }.    s
1050: 65 74 20 3a 3a 75 70 64 61 74 65 5f 68 6f 6f 6b  et ::update_hook
1060: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
1070: 74 20 68 6f 6f 6b 2d 34 2e 31 2e 34 20 7b 0a 20  t hook-4.1.4 {. 
1080: 20 20 20 73 65 74 20 3a 3a 75 70 64 61 74 65 5f     set ::update_
1090: 68 6f 6f 6b 20 7b 7d 0a 20 20 20 20 65 78 65 63  hook {}.    exec
10a0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 52 4f 50  sql {.      DROP
10b0: 20 54 52 49 47 47 45 52 20 72 31 3b 0a 20 20 20   TRIGGER r1;.   
10c0: 20 7d 0a 20 20 20 20 73 65 74 20 3a 3a 75 70 64   }.    set ::upd
10d0: 61 74 65 5f 68 6f 6f 6b 0a 20 20 7d 20 7b 7d 0a  ate_hook.  } {}.
10e0: 20 20 0a 20 20 73 65 74 20 3a 3a 75 70 64 61 74    .  set ::updat
10f0: 65 5f 68 6f 6f 6b 20 7b 7d 0a 20 20 64 6f 5f 74  e_hook {}.  do_t
1100: 65 73 74 20 68 6f 6f 6b 2d 34 2e 32 2e 31 20 7b  est hook-4.2.1 {
1110: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  .    catchsql {.
1120: 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45        DROP TABLE
1130: 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65   t2;.    }.    e
1140: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  xecsql {.      C
1150: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 63  REATE TABLE t2(c
1160: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
1170: 20 4b 45 59 2c 20 64 29 3b 0a 20 20 20 20 20 20   KEY, d);.      
1180: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
1190: 31 5f 74 72 69 67 67 65 72 20 41 46 54 45 52 20  1_trigger AFTER 
11a0: 49 4e 53 45 52 54 20 4f 4e 20 74 31 20 42 45 47  INSERT ON t1 BEG
11b0: 49 4e 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  IN.        INSER
11c0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
11d0: 28 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a  (new.a, new.b);.
11e0: 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20 74          UPDATE t
11f0: 32 20 53 45 54 20 64 20 3d 20 64 20 7c 7c 20 27  2 SET d = d || '
1200: 20 76 69 61 20 74 72 69 67 67 65 72 27 20 57 48   via trigger' WH
1210: 45 52 45 20 6e 65 77 2e 61 20 3d 20 63 3b 0a 20  ERE new.a = c;. 
1220: 20 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52         DELETE FR
1230: 4f 4d 20 74 32 20 57 48 45 52 45 20 6e 65 77 2e  OM t2 WHERE new.
1240: 61 20 3d 20 63 3b 0a 20 20 20 20 20 20 45 4e 44  a = c;.      END
1250: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20  ;.    }.  } {}. 
1260: 20 64 6f 5f 74 65 73 74 20 68 6f 6f 6b 2d 34 2e   do_test hook-4.
1270: 32 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  2.2 {.    execsq
1280: 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  l {.      INSERT
1290: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
12a0: 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 20  1, 'one');.     
12b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
12c0: 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27 29  VALUES(2, 'two')
12d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20  ;.    }.    set 
12e0: 3a 3a 75 70 64 61 74 65 5f 68 6f 6f 6b 0a 20 20  ::update_hook.  
12f0: 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 20 20 20 20  } [list \.      
1300: 49 4e 53 45 52 54 20 6d 61 69 6e 20 74 31 20 31  INSERT main t1 1
1310: 20 5c 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20   \.      INSERT 
1320: 6d 61 69 6e 20 74 32 20 31 20 5c 0a 20 20 20 20  main t2 1 \.    
1330: 20 20 55 50 44 41 54 45 20 6d 61 69 6e 20 74 32    UPDATE main t2
1340: 20 31 20 5c 0a 20 20 20 20 20 20 44 45 4c 45 54   1 \.      DELET
1350: 45 20 6d 61 69 6e 20 74 32 20 31 20 5c 0a 20 20  E main t2 1 \.  
1360: 20 20 20 20 49 4e 53 45 52 54 20 6d 61 69 6e 20      INSERT main 
1370: 74 31 20 32 20 5c 0a 20 20 20 20 20 20 49 4e 53  t1 2 \.      INS
1380: 45 52 54 20 6d 61 69 6e 20 74 32 20 32 20 5c 0a  ERT main t2 2 \.
1390: 20 20 20 20 20 20 55 50 44 41 54 45 20 6d 61 69        UPDATE mai
13a0: 6e 20 74 32 20 32 20 5c 0a 20 20 20 20 20 20 44  n t2 2 \.      D
13b0: 45 4c 45 54 45 20 6d 61 69 6e 20 74 32 20 32 20  ELETE main t2 2 
13c0: 5c 0a 20 20 5d 0a 7d 20 65 6c 73 65 20 7b 0a 20  \.  ].} else {. 
13d0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
13e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
13f0: 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a  LUES(1, 'one');.
1400: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1410: 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77  t1 VALUES(2, 'tw
1420: 6f 27 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 20 55 70  o');.  }.}..# Up
1430: 64 61 74 65 2d 68 6f 6f 6b 20 2b 20 41 54 54 41  date-hook + ATTA
1440: 43 48 0a 73 65 74 20 3a 3a 75 70 64 61 74 65 5f  CH.set ::update_
1450: 68 6f 6f 6b 20 7b 7d 0a 69 66 63 61 70 61 62 6c  hook {}.ifcapabl
1460: 65 20 61 74 74 61 63 68 20 7b 0a 20 20 64 6f 5f  e attach {.  do_
1470: 74 65 73 74 20 68 6f 6f 6b 2d 34 2e 32 2e 33 20  test hook-4.2.3 
1480: 7b 0a 20 20 20 20 66 69 6c 65 20 64 65 6c 65 74  {.    file delet
1490: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64  e -force test2.d
14a0: 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  b.    execsql {.
14b0: 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74 65        ATTACH 'te
14c0: 73 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b 0a  st2.db' AS aux;.
14d0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
14e0: 4c 45 20 61 75 78 2e 74 33 28 61 20 49 4e 54 45  LE aux.t3(a INTE
14f0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
1500: 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   b);.      INSER
1510: 54 20 49 4e 54 4f 20 61 75 78 2e 74 33 20 53 45  T INTO aux.t3 SE
1520: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
1530: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 33 20        UPDATE t3 
1540: 53 45 54 20 62 20 3d 20 27 74 77 6f 20 6f 72 20  SET b = 'two or 
1550: 73 6f 27 20 57 48 45 52 45 20 61 20 3d 20 32 3b  so' WHERE a = 2;
1560: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
1570: 4f 4d 20 74 33 20 57 48 45 52 45 20 31 3b 20 2d  OM t3 WHERE 1; -
1580: 2d 20 41 76 6f 69 64 20 74 68 65 20 74 72 75 6e  - Avoid the trun
1590: 63 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  cate optimizatio
15a0: 6e 20 28 66 6f 72 20 6e 6f 77 29 0a 20 20 20 20  n (for now).    
15b0: 7d 0a 20 20 20 20 73 65 74 20 3a 3a 75 70 64 61  }.    set ::upda
15c0: 74 65 5f 68 6f 6f 6b 0a 20 20 7d 20 5b 6c 69 73  te_hook.  } [lis
15d0: 74 20 5c 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t \.      INSERT
15e0: 20 61 75 78 20 74 33 20 31 20 5c 0a 20 20 20 20   aux t3 1 \.    
15f0: 20 20 49 4e 53 45 52 54 20 61 75 78 20 74 33 20    INSERT aux t3 
1600: 32 20 5c 0a 20 20 20 20 20 20 55 50 44 41 54 45  2 \.      UPDATE
1610: 20 61 75 78 20 74 33 20 32 20 5c 0a 20 20 20 20   aux t3 2 \.    
1620: 20 20 44 45 4c 45 54 45 20 61 75 78 20 74 33 20    DELETE aux t3 
1630: 31 20 5c 0a 20 20 20 20 20 20 44 45 4c 45 54 45  1 \.      DELETE
1640: 20 61 75 78 20 74 33 20 32 20 5c 0a 20 20 5d 0a   aux t3 2 \.  ].
1650: 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 74 72 69  }..ifcapable tri
1660: 67 67 65 72 20 7b 0a 20 20 65 78 65 63 73 71 6c  gger {.  execsql
1670: 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 52 49 47   {.    DROP TRIG
1680: 47 45 52 20 74 31 5f 74 72 69 67 67 65 72 3b 0a  GER t1_trigger;.
1690: 20 20 7d 0a 7d 0a 0a 23 20 54 65 73 74 20 74 68    }.}..# Test th
16a0: 61 74 20 6f 74 68 65 72 20 76 64 62 65 20 6f 70  at other vdbe op
16b0: 65 72 61 74 69 6f 6e 73 20 69 6e 76 6f 6c 76 69  erations involvi
16c0: 6e 67 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ng btree structu
16d0: 72 65 73 20 64 6f 20 6e 6f 74 20 0a 23 20 69 6e  res do not .# in
16e0: 63 6f 72 72 65 63 74 6c 79 20 69 6e 76 6f 6b 65  correctly invoke
16f0: 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b   the update-hook
1700: 2e 0a 73 65 74 20 3a 3a 75 70 64 61 74 65 5f 68  ..set ::update_h
1710: 6f 6f 6b 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 68  ook {}.do_test h
1720: 6f 6f 6b 2d 34 2e 33 2e 31 20 7b 0a 20 20 65 78  ook-4.3.1 {.  ex
1730: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
1740: 54 45 20 49 4e 44 45 58 20 74 31 5f 69 20 4f 4e  TE INDEX t1_i ON
1750: 20 74 31 28 62 29 3b 0a 20 20 20 20 49 4e 53 45   t1(b);.    INSE
1760: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1770: 53 28 33 2c 20 27 74 68 72 65 65 27 29 3b 0a 20  S(3, 'three');. 
1780: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
1790: 20 62 20 3d 20 27 27 3b 0a 20 20 20 20 44 45 4c   b = '';.    DEL
17a0: 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ETE FROM t1 WHER
17b0: 45 20 61 20 3e 20 31 3b 0a 20 20 7d 0a 20 20 73  E a > 1;.  }.  s
17c0: 65 74 20 3a 3a 75 70 64 61 74 65 5f 68 6f 6f 6b  et ::update_hook
17d0: 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 20 20 49  .} [list \.    I
17e0: 4e 53 45 52 54 20 6d 61 69 6e 20 74 31 20 33 20  NSERT main t1 3 
17f0: 5c 0a 20 20 20 20 55 50 44 41 54 45 20 6d 61 69  \.    UPDATE mai
1800: 6e 20 74 31 20 31 20 5c 0a 20 20 20 20 55 50 44  n t1 1 \.    UPD
1810: 41 54 45 20 6d 61 69 6e 20 74 31 20 32 20 5c 0a  ATE main t1 2 \.
1820: 20 20 20 20 55 50 44 41 54 45 20 6d 61 69 6e 20      UPDATE main 
1830: 74 31 20 33 20 5c 0a 20 20 20 20 44 45 4c 45 54  t1 3 \.    DELET
1840: 45 20 6d 61 69 6e 20 74 31 20 32 20 5c 0a 20 20  E main t1 2 \.  
1850: 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 31    DELETE main t1
1860: 20 33 20 5c 0a 5d 0a 73 65 74 20 3a 3a 75 70 64   3 \.].set ::upd
1870: 61 74 65 5f 68 6f 6f 6b 20 7b 7d 0a 69 66 63 61  ate_hook {}.ifca
1880: 70 61 62 6c 65 20 63 6f 6d 70 6f 75 6e 64 26 26  pable compound&&
1890: 61 74 74 61 63 68 20 7b 0a 20 20 64 6f 5f 74 65  attach {.  do_te
18a0: 73 74 20 68 6f 6f 6b 2d 34 2e 33 2e 32 20 7b 0a  st hook-4.3.2 {.
18b0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
18c0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
18d0: 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
18e0: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20  T * FROM t3;.   
18f0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1900: 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   t1 UNION ALL SE
1910: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a  LECT * FROM t3;.
1920: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
1930: 52 4f 4d 20 74 31 20 49 4e 54 45 52 53 45 43 54  ROM t1 INTERSECT
1940: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1950: 33 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  3;.      SELECT 
1960: 2a 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  * FROM t1 EXCEPT
1970: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1980: 33 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  3;.      SELECT 
1990: 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  * FROM t1 ORDER 
19a0: 42 59 20 62 3b 0a 20 20 20 20 20 20 53 45 4c 45  BY b;.      SELE
19b0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f  CT * FROM t1 GRO
19c0: 55 50 20 42 59 20 62 3b 0a 20 20 20 20 7d 0a 20  UP BY b;.    }. 
19d0: 20 20 20 73 65 74 20 3a 3a 75 70 64 61 74 65 5f     set ::update_
19e0: 68 6f 6f 6b 0a 20 20 7d 20 5b 6c 69 73 74 5d 0a  hook.  } [list].
19f0: 7d 0a 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b  }.db update_hook
1a00: 20 7b 7d 0a 23 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}.#.#---------
1a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a50: 2d 2d 2d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---..#----------
1a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1aa0: 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20 72 6f  --.# Test the ro
1ab0: 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 2e 20 54 68 65  llback-hook. The
1ac0: 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 69   rollback-hook i
1ad0: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1ae0: 70 6c 69 63 61 74 65 64 20 74 68 61 6e 0a 23 20  plicated than.# 
1af0: 65 69 74 68 65 72 20 74 68 65 20 63 6f 6d 6d 69  either the commi
1b00: 74 20 6f 72 20 75 70 64 61 74 65 20 68 6f 6f 6b  t or update hook
1b10: 73 20 62 65 63 61 75 73 65 20 61 20 72 6f 6c 6c  s because a roll
1b20: 62 61 63 6b 20 63 61 6e 20 68 61 70 70 65 6e 20  back can happen 
1b30: 0a 23 20 65 78 70 6c 69 63 69 74 6c 79 20 28 61  .# explicitly (a
1b40: 6e 20 73 71 6c 20 52 4f 4c 4c 42 41 43 4b 20 73  n sql ROLLBACK s
1b50: 74 61 74 65 6d 65 6e 74 29 20 6f 72 20 69 6d 70  tatement) or imp
1b60: 6c 69 63 69 74 6c 79 20 28 61 20 63 6f 6e 73 74  licitly (a const
1b70: 72 61 69 6e 74 20 6f 72 20 0a 23 20 65 72 72 6f  raint or .# erro
1b80: 72 20 63 6f 6e 64 69 74 69 6f 6e 29 2e 0a 23 0a  r condition)..#.
1b90: 23 20 68 6f 6f 6b 2d 35 2e 31 2e 2a 20 2d 20 54  # hook-5.1.* - T
1ba0: 65 73 74 20 65 78 70 6c 69 63 69 74 20 72 6f 6c  est explicit rol
1bb0: 6c 62 61 63 6b 73 2e 0a 23 20 68 6f 6f 6b 2d 35  lbacks..# hook-5
1bc0: 2e 32 2e 2a 20 2d 20 54 65 73 74 20 69 6d 70 6c  .2.* - Test impl
1bd0: 69 63 69 74 20 72 6f 6c 6c 62 61 63 6b 73 20 63  icit rollbacks c
1be0: 61 75 73 65 64 20 62 79 20 63 6f 6e 73 74 72 61  aused by constra
1bf0: 69 6e 74 20 66 61 69 6c 75 72 65 2e 0a 23 0a 23  int failure..#.#
1c00: 20 68 6f 6f 6b 2d 35 2e 33 2e 2a 20 2d 20 54 65   hook-5.3.* - Te
1c10: 73 74 20 69 6d 70 6c 69 63 69 74 20 72 6f 6c 6c  st implicit roll
1c20: 62 61 63 6b 73 20 63 61 75 73 65 64 20 62 79 20  backs caused by 
1c30: 49 4f 20 65 72 72 6f 72 73 2e 0a 23 20 68 6f 6f  IO errors..# hoo
1c40: 6b 2d 35 2e 34 2e 2a 20 2d 20 54 65 73 74 20 69  k-5.4.* - Test i
1c50: 6d 70 6c 69 63 69 74 20 72 6f 6c 6c 62 61 63 6b  mplicit rollback
1c60: 73 20 63 61 75 73 65 64 20 62 79 20 6d 61 6c 6c  s caused by mall
1c70: 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 23 20  oc() failure..# 
1c80: 68 6f 6f 6b 2d 35 2e 35 2e 2a 20 2d 20 54 65 73  hook-5.5.* - Tes
1c90: 74 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  t hot-journal ro
1ca0: 6c 6c 62 61 63 6b 73 2e 20 4f 72 20 73 68 6f 75  llbacks. Or shou
1cb0: 6c 64 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ld the rollback 
1cc0: 68 6f 6f 6b 20 0a 23 20 20 20 20 20 20 20 20 20  hook .#         
1cd0: 20 20 20 20 20 6e 6f 74 20 62 65 20 63 61 6c 6c       not be call
1ce0: 65 64 20 66 6f 72 20 74 68 65 73 65 3f 0a 23 0a  ed for these?.#.
1cf0: 0a 64 6f 5f 74 65 73 74 20 68 6f 6f 6b 2d 35 2e  .do_test hook-5.
1d00: 30 20 7b 0a 20 20 23 20 43 6f 6e 66 69 67 75 72  0 {.  # Configur
1d10: 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 68  e the rollback h
1d20: 6f 6f 6b 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  ook to increment
1d30: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
1d40: 20 0a 20 20 23 20 24 3a 3a 72 6f 6c 6c 62 61 63   .  # $::rollbac
1d50: 6b 5f 68 6f 6f 6b 20 65 61 63 68 20 74 69 6d 65  k_hook each time
1d60: 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 0a   it is invoked..
1d70: 20 20 73 65 74 20 3a 3a 72 6f 6c 6c 62 61 63 6b    set ::rollback
1d80: 5f 68 6f 6f 6b 20 30 0a 20 20 64 62 20 72 6f 6c  _hook 0.  db rol
1d90: 6c 62 61 63 6b 5f 68 6f 6f 6b 20 5b 6c 69 73 74  lback_hook [list
1da0: 20 69 6e 63 72 20 3a 3a 72 6f 6c 6c 62 61 63 6b   incr ::rollback
1db0: 5f 68 6f 6f 6b 5d 0a 7d 20 7b 7d 0a 0a 23 20 54  _hook].} {}..# T
1dc0: 65 73 74 20 65 78 70 6c 69 63 69 74 20 72 6f 6c  est explicit rol
1dd0: 6c 62 61 63 6b 73 2e 20 4e 6f 74 20 6d 75 63 68  lbacks. Not much
1de0: 20 63 61 6e 20 72 65 61 6c 6c 79 20 67 6f 20 77   can really go w
1df0: 72 6f 6e 67 20 68 65 72 65 2e 0a 23 0a 64 6f 5f  rong here..#.do_
1e00: 74 65 73 74 20 68 6f 6f 6b 2d 35 2e 31 2e 31 20  test hook-5.1.1 
1e10: 7b 0a 20 20 73 65 74 20 3a 3a 72 6f 6c 6c 62 61  {.  set ::rollba
1e20: 63 6b 5f 68 6f 6f 6b 20 30 0a 20 20 65 78 65 63  ck_hook 0.  exec
1e30: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
1e40: 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20  .    ROLLBACK;. 
1e50: 20 7d 0a 20 20 73 65 74 20 3a 3a 72 6f 6c 6c 62   }.  set ::rollb
1e60: 61 63 6b 5f 68 6f 6f 6b 0a 7d 20 7b 31 7d 0a 0a  ack_hook.} {1}..
1e70: 23 20 54 65 73 74 20 69 6d 70 6c 69 63 69 74 20  # Test implicit 
1e80: 72 6f 6c 6c 62 61 63 6b 73 20 63 61 75 73 65 64  rollbacks caused
1e90: 20 62 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e   by constraints.
1ea0: 0a 23 0a 64 6f 5f 74 65 73 74 20 68 6f 6f 6b 2d  .#.do_test hook-
1eb0: 35 2e 32 2e 31 20 7b 0a 20 20 73 65 74 20 3a 3a  5.2.1 {.  set ::
1ec0: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 30 0a  rollback_hook 0.
1ed0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
1ee0: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a   DROP TABLE t1;.
1ef0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1f00: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
1f10: 59 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  Y, b);.    INSER
1f20: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1f30: 28 27 6f 6e 65 27 2c 20 27 49 27 29 3b 0a 20 20  ('one', 'I');.  
1f40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1f50: 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27   VALUES('one', '
1f60: 49 27 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 3a  I');.  }.  set :
1f70: 3a 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 0a 7d  :rollback_hook.}
1f80: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 68 6f 6f   {1}.do_test hoo
1f90: 6b 2d 35 2e 32 2e 32 20 7b 0a 20 20 23 20 43 68  k-5.2.2 {.  # Ch
1fa0: 65 63 6b 20 74 68 61 74 20 74 68 65 20 49 4e 53  eck that the INS
1fb0: 45 52 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ERT transaction 
1fc0: 61 62 6f 76 65 20 72 65 61 6c 6c 79 20 77 61 73  above really was
1fd0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
1fe0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
1ff0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2000: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 7d  OM t1;.  }.} {1}
2010: 0a 0a 23 0a 23 20 45 6e 64 20 72 6f 6c 6c 62 61  ..#.# End rollba
2020: 63 6b 2d 68 6f 6f 6b 20 74 65 73 74 69 6e 67 2e  ck-hook testing.
2030: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
2040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a  --------------..
2080: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
2090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
20d0: 54 65 73 74 20 74 68 61 74 20 69 66 20 61 20 63  Test that if a c
20e0: 6f 6d 6d 69 74 2d 68 6f 6f 6b 20 72 65 74 75 72  ommit-hook retur
20f0: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 28 63 61 75  ns non-zero (cau
2100: 73 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 29  sing a rollback)
2110: 2c 20 74 68 65 0a 23 20 72 6f 6c 6c 62 61 63 6b  , the.# rollback
2120: 2d 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64  -hook is invoked
2130: 2e 0a 23 0a 70 72 6f 63 20 63 6f 6d 6d 69 74 5f  ..#.proc commit_
2140: 68 6f 6f 6b 20 7b 7d 20 7b 0a 20 20 6c 61 70 70  hook {} {.  lapp
2150: 65 6e 64 20 3a 3a 68 6f 6f 6b 73 20 43 4f 4d 4d  end ::hooks COMM
2160: 49 54 0a 20 20 72 65 74 75 72 6e 20 31 0a 7d 0a  IT.  return 1.}.
2170: 70 72 6f 63 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f  proc rollback_ho
2180: 6f 6b 20 7b 7d 20 7b 0a 20 20 6c 61 70 70 65 6e  ok {} {.  lappen
2190: 64 20 3a 3a 68 6f 6f 6b 73 20 52 4f 4c 4c 42 41  d ::hooks ROLLBA
21a0: 43 4b 0a 7d 0a 64 6f 5f 74 65 73 74 20 68 6f 6f  CK.}.do_test hoo
21b0: 6b 2d 36 2e 31 20 7b 0a 20 20 73 65 74 20 3a 3a  k-6.1 {.  set ::
21c0: 68 6f 6f 6b 73 20 5b 6c 69 73 74 5d 0a 20 20 64  hooks [list].  d
21d0: 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 63 6f  b commit_hook co
21e0: 6d 6d 69 74 5f 68 6f 6f 6b 0a 20 20 64 62 20 72  mmit_hook.  db r
21f0: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 72 6f 6c  ollback_hook rol
2200: 6c 62 61 63 6b 5f 68 6f 6f 6b 0a 20 20 63 61 74  lback_hook.  cat
2210: 63 68 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  chsql {.    BEGI
2220: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
2230: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
2240: 74 77 6f 27 2c 20 27 49 49 27 29 3b 0a 20 20 20  two', 'II');.   
2250: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 65   COMMIT;.  }.  e
2260: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
2270: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 6f  * FROM t1 }.} {o
2280: 6e 65 20 49 7d 0a 64 6f 5f 74 65 73 74 20 68 6f  ne I}.do_test ho
2290: 6f 6b 2d 36 2e 32 20 7b 0a 20 20 73 65 74 20 3a  ok-6.2 {.  set :
22a0: 3a 68 6f 6f 6b 73 0a 7d 20 7b 43 4f 4d 4d 49 54  :hooks.} {COMMIT
22b0: 20 52 4f 4c 4c 42 41 43 4b 7d 0a 75 6e 73 65 74   ROLLBACK}.unset
22c0: 20 3a 3a 68 6f 6f 6b 73 0a 0a 23 2d 2d 2d 2d 2d   ::hooks..#-----
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2310: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
2320: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d 20  llowing tests - 
2330: 68 6f 6f 6b 2d 37 2e 2a 20 2d 20 74 65 73 74 20  hook-7.* - test 
2340: 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68  the pre-update h
2350: 6f 6f 6b 2e 0a 23 0a 23 20 37 2e 31 2e 31 20 2d  ook..#.# 7.1.1 -
2360: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
2370: 74 2e 0a 23 20 37 2e 31 2e 32 20 2d 20 49 4e 53  t..# 7.1.2 - INS
2380: 45 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c  ERT INTO ... SEL
2390: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23  ECT statement..#
23a0: 20 37 2e 31 2e 33 20 2d 20 52 45 50 4c 41 43 45   7.1.3 - REPLACE
23b0: 20 49 4e 54 4f 20 2e 2e 2e 20 28 72 6f 77 69 64   INTO ... (rowid
23c0: 20 63 6f 6e 66 6c 69 63 74 29 0a 23 20 37 2e 31   conflict).# 7.1
23d0: 2e 34 20 2d 20 52 45 50 4c 41 43 45 20 49 4e 54  .4 - REPLACE INT
23e0: 4f 20 2e 2e 2e 20 28 6f 74 68 65 72 20 69 6e 64  O ... (other ind
23f0: 65 78 20 63 6f 6e 66 6c 69 63 74 73 29 0a 23 20  ex conflicts).# 
2400: 37 2e 31 2e 35 20 2d 20 52 45 50 4c 41 43 45 20  7.1.5 - REPLACE 
2410: 49 4e 54 4f 20 2e 2e 2e 20 28 62 6f 74 68 20 72  INTO ... (both r
2420: 6f 77 69 64 20 61 6e 64 20 6f 74 68 65 72 20 69  owid and other i
2430: 6e 64 65 78 20 63 6f 6e 66 6c 69 63 74 73 29 0a  ndex conflicts).
2440: 23 0a 23 20 37 2e 32 2e 31 20 2d 20 44 45 4c 45  #.# 7.2.1 - DELE
2450: 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 20  TE statement..# 
2460: 37 2e 32 2e 32 20 2d 20 44 45 4c 45 54 45 20 73  7.2.2 - DELETE s
2470: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 75 73  tatement that us
2480: 65 73 20 74 68 65 20 74 72 75 6e 63 61 74 65 20  es the truncate 
2490: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 23 0a  optimization..#.
24a0: 23 20 37 2e 33 2e 31 20 2d 20 55 50 44 41 54 45  # 7.3.1 - UPDATE
24b0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 20 37 2e   statement..# 7.
24c0: 33 2e 32 20 2d 20 55 50 44 41 54 45 20 73 74 61  3.2 - UPDATE sta
24d0: 74 65 6d 65 6e 74 20 74 68 61 74 20 6d 6f 64 69  tement that modi
24e0: 66 69 65 73 20 74 68 65 20 72 6f 77 69 64 2e 0a  fies the rowid..
24f0: 23 20 37 2e 33 2e 33 20 2d 20 55 50 44 41 54 45  # 7.3.3 - UPDATE
2500: 20 4f 52 20 52 45 50 4c 41 43 45 20 2e 2e 2e 20   OR REPLACE ... 
2510: 28 72 6f 77 69 64 20 63 6f 6e 66 6c 69 63 74 29  (rowid conflict)
2520: 2e 0a 23 20 37 2e 33 2e 34 20 2d 20 55 50 44 41  ..# 7.3.4 - UPDA
2530: 54 45 20 4f 52 20 52 45 50 4c 41 43 45 20 2e 2e  TE OR REPLACE ..
2540: 2e 20 28 6f 74 68 65 72 20 69 6e 64 65 78 20 63  . (other index c
2550: 6f 6e 66 6c 69 63 74 73 29 0a 23 20 37 2e 33 2e  onflicts).# 7.3.
2560: 34 20 2d 20 55 50 44 41 54 45 20 4f 52 20 52 45  4 - UPDATE OR RE
2570: 50 4c 41 43 45 20 2e 2e 2e 20 28 62 6f 74 68 20  PLACE ... (both 
2580: 72 6f 77 69 64 20 61 6e 64 20 6f 74 68 65 72 20  rowid and other 
2590: 69 6e 64 65 78 20 63 6f 6e 66 6c 69 63 74 73 29  index conflicts)
25a0: 0a 23 0a 23 20 37 2e 34 2e 31 20 2d 20 54 65 73  .#.# 7.4.1 - Tes
25b0: 74 20 74 68 61 74 20 74 68 65 20 70 72 65 2d 75  t that the pre-u
25c0: 70 64 61 74 65 2d 68 6f 6f 6b 20 69 73 20 69 6e  pdate-hook is in
25d0: 76 6f 6b 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20  voked only once 
25e0: 69 66 20 61 20 72 6f 77 20 62 65 69 6e 67 0a 23  if a row being.#
25f0: 20 20 20 20 20 20 20 20 20 64 65 6c 65 74 65 64           deleted
2600: 20 69 73 20 72 65 6d 6f 76 65 64 20 62 79 20 61   is removed by a
2610: 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 2e   BEFORE trigger.
2620: 0a 23 0a 23 20 37 2e 34 2e 32 20 2d 20 54 65 73  .#.# 7.4.2 - Tes
2630: 74 20 74 68 61 74 20 74 68 65 20 70 72 65 2d 75  t that the pre-u
2640: 70 64 61 74 65 2d 68 6f 6f 6b 20 69 73 20 69 6e  pdate-hook is in
2650: 76 6f 6b 65 64 20 69 66 20 61 20 42 45 46 4f 52  voked if a BEFOR
2660: 45 20 74 72 69 67 67 65 72 20 0a 23 20 20 20 20  E trigger .#    
2670: 20 20 20 20 20 72 65 6d 6f 76 65 73 20 61 20 72       removes a r
2680: 6f 77 20 62 65 69 6e 67 20 75 70 64 61 74 65 64  ow being updated
2690: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
26a0: 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 20 73  he update hook s
26b0: 68 6f 75 6c 64 0a 23 20 20 20 20 20 20 20 20 20  hould.#         
26c0: 62 65 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  be invoked with 
26d0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 61 73  SQLITE_INSERT as
26e0: 20 74 68 65 20 6f 70 63 6f 64 65 20 77 68 65 6e   the opcode when
26f0: 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 0a 23   inserting the.#
2700: 20 20 20 20 20 20 20 20 20 6e 65 77 20 76 65 72           new ver
2710: 73 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 77 2e  sion of the row.
2720: 0a 23 20 20 20 20 20 20 20 20 20 0a 23 20 54 4f  .#         .# TO
2730: 44 4f 3a 20 53 68 6f 72 74 20 72 65 63 6f 72 64  DO: Short record
2740: 73 20 28 74 68 6f 73 65 20 63 72 65 61 74 65 64  s (those created
2750: 20 62 65 66 6f 72 65 20 61 20 63 6f 6c 75 6d 6e   before a column
2760: 20 69 73 20 61 64 64 65 64 20 74 6f 20 61 20 74   is added to a t
2770: 61 62 6c 65 20 0a 23 20 20 20 20 20 20 20 75 73  able .#       us
2780: 69 6e 67 20 41 4c 54 45 52 20 54 41 42 4c 45 29  ing ALTER TABLE)
2790: 0a 23 0a 0a 70 72 6f 63 20 64 6f 5f 70 72 65 75  .#..proc do_preu
27a0: 70 64 61 74 65 5f 74 65 73 74 20 7b 74 6e 20 73  pdate_test {tn s
27b0: 71 6c 20 78 7d 20 7b 0a 20 20 73 65 74 20 58 20  ql x} {.  set X 
27c0: 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 65 61 63 68  [list].  foreach
27d0: 20 65 6c 65 6d 20 24 78 20 7b 6c 61 70 70 65 6e   elem $x {lappen
27e0: 64 20 58 20 24 65 6c 65 6d 7d 0a 20 20 75 70 6c  d X $elem}.  upl
27f0: 65 76 65 6c 20 64 6f 5f 74 65 73 74 20 24 74 6e  evel do_test $tn
2800: 20 5b 6c 69 73 74 20 22 0a 20 20 20 20 73 65 74   [list ".    set
2810: 20 3a 3a 70 72 65 75 70 64 61 74 65 20 5c 5b 6c   ::preupdate \[l
2820: 69 73 74 5c 5d 0a 20 20 20 20 65 78 65 63 73 71  ist\].    execsq
2830: 6c 20 7b 20 24 73 71 6c 20 7d 0a 20 20 20 20 73  l { $sql }.    s
2840: 65 74 20 3a 3a 70 72 65 75 70 64 61 74 65 0a 20  et ::preupdate. 
2850: 20 22 5d 20 5b 6c 69 73 74 20 24 58 5d 0a 7d 0a   "] [list $X].}.
2860: 0a 70 72 6f 63 20 70 72 65 75 70 64 61 74 65 5f  .proc preupdate_
2870: 68 6f 6f 6b 20 7b 61 72 67 73 7d 20 7b 0a 20 20  hook {args} {.  
2880: 73 65 74 20 74 79 70 65 20 5b 6c 69 6e 64 65 78  set type [lindex
2890: 20 24 61 72 67 73 20 30 5d 0a 20 20 65 76 61 6c   $args 0].  eval
28a0: 20 6c 61 70 70 65 6e 64 20 3a 3a 70 72 65 75 70   lappend ::preup
28b0: 64 61 74 65 20 24 61 72 67 73 0a 20 20 69 66 20  date $args.  if 
28c0: 7b 24 74 79 70 65 20 21 3d 20 22 49 4e 53 45 52  {$type != "INSER
28d0: 54 22 7d 20 7b 0a 20 20 20 20 66 6f 72 20 7b 73  T"} {.    for {s
28e0: 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 5b 64  et i 0} {$i < [d
28f0: 62 20 70 72 65 75 70 64 61 74 65 20 63 6f 75 6e  b preupdate coun
2900: 74 5d 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  t]} {incr i} {. 
2910: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 70       lappend ::p
2920: 72 65 75 70 64 61 74 65 20 5b 64 62 20 70 72 65  reupdate [db pre
2930: 75 70 64 61 74 65 20 6f 6c 64 20 24 69 5d 0a 20  update old $i]. 
2940: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20 7b 24     }.  }.  if {$
2950: 74 79 70 65 20 21 3d 20 22 44 45 4c 45 54 45 22  type != "DELETE"
2960: 7d 20 7b 0a 20 20 20 20 66 6f 72 20 7b 73 65 74  } {.    for {set
2970: 20 69 20 30 7d 20 7b 24 69 20 3c 20 5b 64 62 20   i 0} {$i < [db 
2980: 70 72 65 75 70 64 61 74 65 20 63 6f 75 6e 74 5d  preupdate count]
2990: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
29a0: 20 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68     set rc [catch
29b0: 20 7b 20 64 62 20 70 72 65 75 70 64 61 74 65 20   { db preupdate 
29c0: 6e 65 77 20 24 69 20 7d 20 76 5d 0a 20 20 20 20  new $i } v].    
29d0: 20 20 6c 61 70 70 65 6e 64 20 3a 3a 70 72 65 75    lappend ::preu
29e0: 70 64 61 74 65 20 24 76 0a 20 20 20 20 7d 0a 20  pdate $v.    }. 
29f0: 20 7d 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 66   }.}..db close.f
2a00: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
2a10: 64 62 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65  db.sqlite3 db te
2a20: 73 74 2e 64 62 0a 64 62 20 70 72 65 75 70 64 61  st.db.db preupda
2a30: 74 65 20 68 6f 6f 6b 20 70 72 65 75 70 64 61 74  te hook preupdat
2a40: 65 5f 68 6f 6f 6b 0a 0a 23 20 53 65 74 20 75 70  e_hook..# Set up
2a50: 20 61 20 73 63 68 65 6d 61 20 74 6f 20 75 73 65   a schema to use
2a60: 20 66 6f 72 20 74 65 73 74 73 20 37 2e 31 2e 2a   for tests 7.1.*
2a70: 20 74 6f 20 37 2e 33 2e 2a 2e 0a 64 6f 5f 65 78   to 7.3.*..do_ex
2a80: 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 30 20 7b  ecsql_test 7.0 {
2a90: 20 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45   .  CREATE TABLE
2aa0: 20 74 31 28 61 2c 20 62 29 3b 20 0a 20 20 43 52   t1(a, b); .  CR
2ab0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c  EATE TABLE t2(x,
2ac0: 20 79 29 3b 20 0a 20 20 43 52 45 41 54 45 20 54   y); .  CREATE T
2ad0: 41 42 4c 45 20 74 33 28 69 2c 20 6a 2c 20 55 4e  ABLE t3(i, j, UN
2ae0: 49 51 55 45 28 69 29 29 3b 0a 0a 20 20 49 4e 53  IQUE(i));..  INS
2af0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
2b00: 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
2b10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
2b20: 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b  ALUES('c', 'd');
2b30: 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ..  INSERT INTO 
2b40: 74 33 20 56 41 4c 55 45 53 28 34 2c 20 31 36 29  t3 VALUES(4, 16)
2b50: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
2b60: 74 33 20 56 41 4c 55 45 53 28 35 2c 20 32 35 29  t3 VALUES(5, 25)
2b70: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
2b80: 74 33 20 56 41 4c 55 45 53 28 36 2c 20 33 36 29  t3 VALUES(6, 36)
2b90: 3b 0a 7d 20 0a 0a 64 6f 5f 70 72 65 75 70 64 61  ;.} ..do_preupda
2ba0: 74 65 5f 74 65 73 74 20 37 2e 31 2e 31 20 7b 0a  te_test 7.1.1 {.
2bb0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2bc0: 20 56 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27   VALUES('x', 'y'
2bd0: 29 0a 7d 20 7b 49 4e 53 45 52 54 20 6d 61 69 6e  ).} {INSERT main
2be0: 20 74 31 20 31 20 31 20 20 78 20 79 7d 0a 0a 23   t1 1 1  x y}..#
2bf0: 20 37 2e 31 2e 32 2e 31 20 64 6f 65 73 20 6e 6f   7.1.2.1 does no
2c00: 74 20 75 73 65 20 74 68 65 20 78 66 65 72 20 6f  t use the xfer o
2c10: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 37 2e 31  ptimization. 7.1
2c20: 2e 32 2e 32 20 64 6f 65 73 2e 0a 64 6f 5f 70 72  .2.2 does..do_pr
2c30: 65 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e 31  eupdate_test 7.1
2c40: 2e 32 2e 31 20 7b 0a 20 20 49 4e 53 45 52 54 20  .2.1 {.  INSERT 
2c50: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 79  INTO t1 SELECT y
2c60: 2c 20 78 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  , x FROM t2;.} {
2c70: 49 4e 53 45 52 54 20 6d 61 69 6e 20 74 31 20 32  INSERT main t1 2
2c80: 20 32 20 62 20 61 20 20 20 49 4e 53 45 52 54 20   2 b a   INSERT 
2c90: 6d 61 69 6e 20 74 31 20 33 20 33 20 64 20 63 7d  main t1 3 3 d c}
2ca0: 0a 64 6f 5f 70 72 65 75 70 64 61 74 65 5f 74 65  .do_preupdate_te
2cb0: 73 74 20 37 2e 31 2e 32 2e 32 20 7b 0a 20 20 49  st 7.1.2.2 {.  I
2cc0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
2cd0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
2ce0: 7d 20 7b 49 4e 53 45 52 54 20 6d 61 69 6e 20 74  } {INSERT main t
2cf0: 31 20 34 20 34 20 61 20 62 20 20 20 49 4e 53 45  1 4 4 a b   INSE
2d00: 52 54 20 6d 61 69 6e 20 74 31 20 35 20 35 20 63  RT main t1 5 5 c
2d10: 20 64 7d 0a 0a 64 6f 5f 70 72 65 75 70 64 61 74   d}..do_preupdat
2d20: 65 5f 74 65 73 74 20 37 2e 31 2e 33 20 7b 0a 20  e_test 7.1.3 {. 
2d30: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 31   REPLACE INTO t1
2d40: 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20 56 41  (rowid, a, b) VA
2d50: 4c 55 45 53 28 31 2c 20 31 2c 20 31 29 3b 0a 7d  LUES(1, 1, 1);.}
2d60: 20 7b 0a 20 20 44 45 4c 45 54 45 20 6d 61 69 6e   {.  DELETE main
2d70: 20 74 31 20 31 20 31 20 20 20 78 20 79 0a 20 20   t1 1 1   x y.  
2d80: 49 4e 53 45 52 54 20 6d 61 69 6e 20 74 31 20 31  INSERT main t1 1
2d90: 20 31 20 20 20 31 20 31 0a 7d 0a 0a 64 6f 5f 70   1   1 1.}..do_p
2da0: 72 65 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e  reupdate_test 7.
2db0: 31 2e 34 20 7b 0a 20 20 52 45 50 4c 41 43 45 20  1.4 {.  REPLACE 
2dc0: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 34  INTO t3 VALUES(4
2dd0: 2c 20 4e 55 4c 4c 29 3b 0a 7d 20 7b 0a 20 20 44  , NULL);.} {.  D
2de0: 45 4c 45 54 45 20 6d 61 69 6e 20 74 33 20 31 20  ELETE main t3 1 
2df0: 31 20 20 20 34 20 31 36 0a 20 20 49 4e 53 45 52  1   4 16.  INSER
2e00: 54 20 6d 61 69 6e 20 74 33 20 34 20 34 20 20 20  T main t3 4 4   
2e10: 34 20 7b 7d 0a 7d 0a 0a 64 6f 5f 70 72 65 75 70  4 {}.}..do_preup
2e20: 64 61 74 65 5f 74 65 73 74 20 37 2e 31 2e 35 20  date_test 7.1.5 
2e30: 7b 0a 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f  {.  REPLACE INTO
2e40: 20 74 33 28 72 6f 77 69 64 2c 20 69 2c 20 6a 29   t3(rowid, i, j)
2e50: 20 56 41 4c 55 45 53 28 32 2c 20 36 2c 20 4e 55   VALUES(2, 6, NU
2e60: 4c 4c 29 3b 0a 7d 20 7b 0a 20 20 44 45 4c 45 54  LL);.} {.  DELET
2e70: 45 20 6d 61 69 6e 20 74 33 20 32 20 32 20 20 35  E main t3 2 2  5
2e80: 20 32 35 0a 20 20 44 45 4c 45 54 45 20 6d 61 69   25.  DELETE mai
2e90: 6e 20 74 33 20 33 20 33 20 20 36 20 33 36 0a 20  n t3 3 3  6 36. 
2ea0: 20 49 4e 53 45 52 54 20 6d 61 69 6e 20 74 33 20   INSERT main t3 
2eb0: 32 20 32 20 20 36 20 7b 7d 0a 7d 0a 0a 64 6f 5f  2 2  6 {}.}..do_
2ec0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 32  execsql_test 7.2
2ed0: 2e 30 20 7b 20 53 45 4c 45 43 54 20 72 6f 77 69  .0 { SELECT rowi
2ee0: 64 20 46 52 4f 4d 20 74 31 20 7d 20 7b 31 20 32  d FROM t1 } {1 2
2ef0: 20 33 20 34 20 35 7d 0a 0a 64 6f 5f 70 72 65 75   3 4 5}..do_preu
2f00: 70 64 61 74 65 5f 74 65 73 74 20 37 2e 32 2e 31  pdate_test 7.2.1
2f10: 20 7b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d   {.  DELETE FROM
2f20: 20 74 31 20 57 48 45 52 45 20 72 6f 77 69 64 20   t1 WHERE rowid 
2f30: 3d 20 33 0a 7d 20 7b 0a 20 20 44 45 4c 45 54 45  = 3.} {.  DELETE
2f40: 20 6d 61 69 6e 20 74 31 20 33 20 33 20 20 64 20   main t1 3 3  d 
2f50: 63 0a 7d 0a 64 6f 5f 70 72 65 75 70 64 61 74 65  c.}.do_preupdate
2f60: 5f 74 65 73 74 20 37 2e 32 2e 32 20 7b 0a 20 20  _test 7.2.2 {.  
2f70: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 0a 7d  DELETE FROM t1.}
2f80: 20 7b 0a 20 20 44 45 4c 45 54 45 20 6d 61 69 6e   {.  DELETE main
2f90: 20 74 33 20 31 20 31 20 20 20 31 20 31 0a 20 20   t3 1 1   1 1.  
2fa0: 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 33 20 32  DELETE main t3 2
2fb0: 20 32 20 20 20 62 20 61 0a 20 20 44 45 4c 45 54   2   b a.  DELET
2fc0: 45 20 6d 61 69 6e 20 74 33 20 34 20 34 20 20 20  E main t3 4 4   
2fd0: 61 20 62 0a 20 20 44 45 4c 45 54 45 20 6d 61 69  a b.  DELETE mai
2fe0: 6e 20 74 33 20 35 20 35 20 20 20 63 20 64 0a 7d  n t3 5 5   c d.}
2ff0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
3000: 74 20 37 2e 33 2e 30 20 7b 20 0a 20 20 44 45 4c  t 7.3.0 { .  DEL
3010: 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 44  ETE FROM t1;.  D
3020: 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20  ELETE FROM t2;. 
3030: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 33 3b   DELETE FROM t3;
3040: 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ..  INSERT INTO 
3050: 74 32 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  t2 VALUES('a', '
3060: 62 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  b');.  INSERT IN
3070: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 63 27  TO t2 VALUES('c'
3080: 2c 20 27 64 27 29 3b 0a 0a 20 20 49 4e 53 45 52  , 'd');..  INSER
3090: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
30a0: 28 34 2c 20 31 36 29 3b 0a 20 20 49 4e 53 45 52  (4, 16);.  INSER
30b0: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
30c0: 28 35 2c 20 32 35 29 3b 0a 20 20 49 4e 53 45 52  (5, 25);.  INSER
30d0: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
30e0: 28 36 2c 20 33 36 29 3b 0a 7d 0a 0a 64 6f 5f 70  (6, 36);.}..do_p
30f0: 72 65 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e  reupdate_test 7.
3100: 33 2e 31 20 7b 0a 20 20 55 50 44 41 54 45 20 74  3.1 {.  UPDATE t
3110: 32 20 53 45 54 20 79 20 3d 20 79 7c 7c 79 3b 0a  2 SET y = y||y;.
3120: 7d 20 7b 0a 20 20 55 50 44 41 54 45 20 6d 61 69  } {.  UPDATE mai
3130: 6e 20 74 32 20 31 20 31 20 20 20 61 20 62 20 20  n t2 1 1   a b  
3140: 61 20 62 62 0a 20 20 55 50 44 41 54 45 20 6d 61  a bb.  UPDATE ma
3150: 69 6e 20 74 32 20 32 20 32 20 20 20 63 20 64 20  in t2 2 2   c d 
3160: 20 63 20 64 64 0a 7d 0a 0a 64 6f 5f 70 72 65 75   c dd.}..do_preu
3170: 70 64 61 74 65 5f 74 65 73 74 20 37 2e 33 2e 32  pdate_test 7.3.2
3180: 20 7b 0a 20 20 55 50 44 41 54 45 20 74 32 20 53   {.  UPDATE t2 S
3190: 45 54 20 72 6f 77 69 64 20 3d 20 72 6f 77 69 64  ET rowid = rowid
31a0: 2d 31 3b 0a 7d 20 7b 0a 20 20 55 50 44 41 54 45  -1;.} {.  UPDATE
31b0: 20 6d 61 69 6e 20 74 32 20 31 20 30 20 20 20 61   main t2 1 0   a
31c0: 20 62 62 20 20 61 20 62 62 0a 20 20 55 50 44 41   bb  a bb.  UPDA
31d0: 54 45 20 6d 61 69 6e 20 74 32 20 32 20 31 20 20  TE main t2 2 1  
31e0: 20 63 20 64 64 20 20 63 20 64 64 0a 7d 0a 0a 64   c dd  c dd.}..d
31f0: 6f 5f 70 72 65 75 70 64 61 74 65 5f 74 65 73 74  o_preupdate_test
3200: 20 37 2e 33 2e 33 20 7b 0a 20 20 55 50 44 41 54   7.3.3 {.  UPDAT
3210: 45 20 4f 52 20 52 45 50 4c 41 43 45 20 74 32 20  E OR REPLACE t2 
3220: 53 45 54 20 72 6f 77 69 64 20 3d 20 31 20 57 48  SET rowid = 1 WH
3230: 45 52 45 20 78 20 3d 20 27 61 27 0a 7d 20 7b 0a  ERE x = 'a'.} {.
3240: 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 32    DELETE main t2
3250: 20 31 20 31 20 20 20 63 20 64 64 0a 20 20 55 50   1 1   c dd.  UP
3260: 44 41 54 45 20 6d 61 69 6e 20 74 32 20 30 20 31  DATE main t2 0 1
3270: 20 20 20 61 20 62 62 20 20 61 20 62 62 0a 7d 0a     a bb  a bb.}.
3280: 0a 64 6f 5f 70 72 65 75 70 64 61 74 65 5f 74 65  .do_preupdate_te
3290: 73 74 20 37 2e 33 2e 34 2e 31 20 7b 0a 20 20 55  st 7.3.4.1 {.  U
32a0: 50 44 41 54 45 20 4f 52 20 52 45 50 4c 41 43 45  PDATE OR REPLACE
32b0: 20 74 33 20 53 45 54 20 69 20 3d 20 35 20 57 48   t3 SET i = 5 WH
32c0: 45 52 45 20 69 20 3d 20 36 0a 7d 20 7b 0a 20 20  ERE i = 6.} {.  
32d0: 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 33 20 32  DELETE main t3 2
32e0: 20 32 20 20 20 35 20 32 35 0a 20 20 55 50 44 41   2   5 25.  UPDA
32f0: 54 45 20 6d 61 69 6e 20 74 33 20 33 20 33 20 20  TE main t3 3 3  
3300: 20 36 20 33 36 20 20 35 20 33 36 0a 7d 0a 0a 64   6 36  5 36.}..d
3310: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 37  o_execsql_test 7
3320: 2e 33 2e 34 2e 32 20 7b 0a 20 20 49 4e 53 45 52  .3.4.2 {.  INSER
3330: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
3340: 28 31 30 2c 20 31 30 30 29 3b 0a 20 20 53 45 4c  (10, 100);.  SEL
3350: 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f  ECT rowid, * FRO
3360: 4d 20 74 33 3b 0a 7d 20 7b 31 20 34 20 31 36 20  M t3;.} {1 4 16 
3370: 20 20 33 20 35 20 33 36 20 20 20 34 20 31 30 20    3 5 36   4 10 
3380: 31 30 30 7d 0a 0a 64 6f 5f 70 72 65 75 70 64 61  100}..do_preupda
3390: 74 65 5f 74 65 73 74 20 37 2e 33 2e 35 20 7b 0a  te_test 7.3.5 {.
33a0: 20 20 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c    UPDATE OR REPL
33b0: 41 43 45 20 74 33 20 53 45 54 20 72 6f 77 69 64  ACE t3 SET rowid
33c0: 20 3d 20 31 2c 20 69 20 3d 20 35 20 57 48 45 52   = 1, i = 5 WHER
33d0: 45 20 6a 20 3d 20 31 30 30 3b 0a 7d 20 7b 0a 20  E j = 100;.} {. 
33e0: 20 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 33 20   DELETE main t3 
33f0: 31 20 31 20 20 20 20 34 20 20 31 36 0a 20 20 44  1 1    4  16.  D
3400: 45 4c 45 54 45 20 6d 61 69 6e 20 74 33 20 33 20  ELETE main t3 3 
3410: 33 20 20 20 20 35 20 20 33 36 0a 20 20 55 50 44  3    5  36.  UPD
3420: 41 54 45 20 6d 61 69 6e 20 74 33 20 34 20 31 20  ATE main t3 4 1 
3430: 20 20 31 30 20 31 30 30 20 20 35 20 31 30 30 0a    10 100  5 100.
3440: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
3450: 73 74 20 37 2e 34 2e 31 2e 30 20 7b 0a 20 20 43  st 7.4.1.0 {.  C
3460: 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 61  REATE TABLE t4(a
3470: 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , b);.  INSERT I
3480: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27 61  NTO t4 VALUES('a
3490: 27 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52 54 20  ', 1);.  INSERT 
34a0: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27  INTO t4 VALUES('
34b0: 62 27 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54  b', 2);.  INSERT
34c0: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
34d0: 27 63 27 2c 20 33 29 3b 0a 0a 20 20 43 52 45 41  'c', 3);..  CREA
34e0: 54 45 20 54 52 49 47 47 45 52 20 74 34 74 20 42  TE TRIGGER t4t B
34f0: 45 46 4f 52 45 20 44 45 4c 45 54 45 20 4f 4e 20  EFORE DELETE ON 
3500: 74 34 20 42 45 47 49 4e 0a 20 20 20 20 44 45 4c  t4 BEGIN.    DEL
3510: 45 54 45 20 46 52 4f 4d 20 74 34 20 57 48 45 52  ETE FROM t4 WHER
3520: 45 20 62 20 3d 20 31 3b 0a 20 20 45 4e 44 3b 0a  E b = 1;.  END;.
3530: 7d 0a 0a 64 6f 5f 70 72 65 75 70 64 61 74 65 5f  }..do_preupdate_
3540: 74 65 73 74 20 37 2e 34 2e 31 2e 31 20 7b 0a 20  test 7.4.1.1 {. 
3550: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 34 20   DELETE FROM t4 
3560: 57 48 45 52 45 20 62 20 3d 20 33 0a 7d 20 7b 0a  WHERE b = 3.} {.
3570: 20 20 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 34    DELETE main t4
3580: 20 31 20 31 20 20 20 61 20 31 0a 20 20 44 45 4c   1 1   a 1.  DEL
3590: 45 54 45 20 6d 61 69 6e 20 74 34 20 33 20 33 20  ETE main t4 3 3 
35a0: 20 20 63 20 33 0a 7d 0a 0a 64 6f 5f 65 78 65 63    c 3.}..do_exec
35b0: 73 71 6c 5f 74 65 73 74 20 37 2e 34 2e 31 2e 32  sql_test 7.4.1.2
35c0: 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f   {.  INSERT INTO
35d0: 20 74 34 28 72 6f 77 69 64 2c 20 61 2c 20 62 29   t4(rowid, a, b)
35e0: 20 56 41 4c 55 45 53 28 31 2c 20 27 61 27 2c 20   VALUES(1, 'a', 
35f0: 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  1);.  INSERT INT
3600: 4f 20 74 34 28 72 6f 77 69 64 2c 20 61 2c 20 62  O t4(rowid, a, b
3610: 29 20 56 41 4c 55 45 53 28 33 2c 20 27 63 27 2c  ) VALUES(3, 'c',
3620: 20 33 29 3b 0a 7d 0a 64 6f 5f 70 72 65 75 70 64   3);.}.do_preupd
3630: 61 74 65 5f 74 65 73 74 20 37 2e 34 2e 31 2e 33  ate_test 7.4.1.3
3640: 20 7b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d   {.  DELETE FROM
3650: 20 74 34 20 57 48 45 52 45 20 62 20 3d 20 31 0a   t4 WHERE b = 1.
3660: 7d 20 7b 0a 20 20 44 45 4c 45 54 45 20 6d 61 69  } {.  DELETE mai
3670: 6e 20 74 34 20 31 20 31 20 20 20 61 20 31 0a 7d  n t4 1 1   a 1.}
3680: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
3690: 74 20 37 2e 34 2e 32 2e 30 20 7b 0a 20 20 43 52  t 7.4.2.0 {.  CR
36a0: 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c  EATE TABLE t5(a,
36b0: 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   b);.  INSERT IN
36c0: 54 4f 20 74 35 20 56 41 4c 55 45 53 28 27 61 27  TO t5 VALUES('a'
36d0: 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 1);.  INSERT I
36e0: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 27 62  NTO t5 VALUES('b
36f0: 27 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20  ', 2);.  INSERT 
3700: 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 27  INTO t5 VALUES('
3710: 63 27 2c 20 33 29 3b 0a 0a 20 20 43 52 45 41 54  c', 3);..  CREAT
3720: 45 20 54 52 49 47 47 45 52 20 74 35 74 20 42 45  E TRIGGER t5t BE
3730: 46 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20 74  FORE UPDATE ON t
3740: 35 20 42 45 47 49 4e 0a 20 20 20 20 44 45 4c 45  5 BEGIN.    DELE
3750: 54 45 20 46 52 4f 4d 20 74 35 20 57 48 45 52 45  TE FROM t5 WHERE
3760: 20 62 20 3d 20 31 3b 0a 20 20 45 4e 44 3b 0a 7d   b = 1;.  END;.}
3770: 0a 64 6f 5f 70 72 65 75 70 64 61 74 65 5f 74 65  .do_preupdate_te
3780: 73 74 20 37 2e 34 2e 32 2e 31 20 7b 0a 20 20 55  st 7.4.2.1 {.  U
3790: 50 44 41 54 45 20 74 35 20 53 45 54 20 62 20 3d  PDATE t5 SET b =
37a0: 20 34 20 57 48 45 52 45 20 61 20 3d 20 27 63 27   4 WHERE a = 'c'
37b0: 0a 7d 20 7b 0a 20 20 44 45 4c 45 54 45 20 6d 61  .} {.  DELETE ma
37c0: 69 6e 20 74 35 20 31 20 31 20 20 20 61 20 31 0a  in t5 1 1   a 1.
37d0: 20 20 55 50 44 41 54 45 20 6d 61 69 6e 20 74 35    UPDATE main t5
37e0: 20 33 20 33 20 20 20 63 20 33 20 20 63 20 34 0a   3 3   c 3  c 4.
37f0: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
3800: 73 74 20 37 2e 34 2e 32 2e 32 20 7b 0a 20 20 49  st 7.4.2.2 {.  I
3810: 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 28 72 6f  NSERT INTO t5(ro
3820: 77 69 64 2c 20 61 2c 20 62 29 20 56 41 4c 55 45  wid, a, b) VALUE
3830: 53 28 31 2c 20 27 61 27 2c 20 31 29 3b 0a 7d 0a  S(1, 'a', 1);.}.
3840: 0a 64 6f 5f 70 72 65 75 70 64 61 74 65 5f 74 65  .do_preupdate_te
3850: 73 74 20 37 2e 34 2e 32 2e 33 20 7b 0a 20 20 55  st 7.4.2.3 {.  U
3860: 50 44 41 54 45 20 74 35 20 53 45 54 20 62 20 3d  PDATE t5 SET b =
3870: 20 35 20 57 48 45 52 45 20 61 20 3d 20 27 61 27   5 WHERE a = 'a'
3880: 0a 7d 20 7b 0a 20 20 44 45 4c 45 54 45 20 6d 61  .} {.  DELETE ma
3890: 69 6e 20 74 35 20 31 20 31 20 20 20 61 20 31 0a  in t5 1 1   a 1.
38a0: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
38b0: 73 74 20 37 2e 35 2e 31 2e 30 20 7b 0a 20 20 43  st 7.5.1.0 {.  C
38c0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 37 28 61  REATE TABLE t7(a
38d0: 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , b);.  INSERT I
38e0: 4e 54 4f 20 74 37 20 56 41 4c 55 45 53 28 27 6f  NTO t7 VALUES('o
38f0: 6e 65 27 2c 20 27 74 77 6f 27 29 3b 0a 20 20 49  ne', 'two');.  I
3900: 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 20 56 41  NSERT INTO t7 VA
3910: 4c 55 45 53 28 27 74 68 72 65 65 27 2c 20 27 66  LUES('three', 'f
3920: 6f 75 72 27 29 3b 0a 20 20 41 4c 54 45 52 20 54  our');.  ALTER T
3930: 41 42 4c 45 20 74 37 20 41 44 44 20 43 4f 4c 55  ABLE t7 ADD COLU
3940: 4d 4e 20 63 20 44 45 46 41 55 4c 54 20 4e 55 4c  MN c DEFAULT NUL
3950: 4c 3b 0a 7d 0a 0a 64 6f 5f 70 72 65 75 70 64 61  L;.}..do_preupda
3960: 74 65 5f 74 65 73 74 20 37 2e 35 2e 31 2e 31 20  te_test 7.5.1.1 
3970: 7b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  {.  DELETE FROM 
3980: 74 37 20 57 48 45 52 45 20 61 20 3d 20 27 6f 6e  t7 WHERE a = 'on
3990: 65 27 0a 7d 20 7b 0a 20 20 44 45 4c 45 54 45 20  e'.} {.  DELETE 
39a0: 6d 61 69 6e 20 74 37 20 31 20 31 20 20 20 6f 6e  main t7 1 1   on
39b0: 65 20 74 77 6f 20 7b 7d 0a 7d 0a 0a 64 6f 5f 70  e two {}.}..do_p
39c0: 72 65 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e  reupdate_test 7.
39d0: 35 2e 31 2e 32 20 7b 0a 20 20 55 50 44 41 54 45  5.1.2 {.  UPDATE
39e0: 20 74 37 20 53 45 54 20 62 20 3d 20 27 66 69 76   t7 SET b = 'fiv
39f0: 65 27 0a 7d 20 7b 0a 20 20 55 50 44 41 54 45 20  e'.} {.  UPDATE 
3a00: 6d 61 69 6e 20 74 37 20 32 20 32 20 20 20 74 68  main t7 2 2   th
3a10: 72 65 65 20 66 6f 75 72 20 7b 7d 20 20 74 68 72  ree four {}  thr
3a20: 65 65 20 66 69 76 65 20 7b 7d 0a 7d 0a 0a 64 6f  ee five {}.}..do
3a30: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 37 2e  _execsql_test 7.
3a40: 35 2e 32 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  5.2.0 {.  CREATE
3a50: 20 54 41 42 4c 45 20 74 38 28 61 2c 20 62 29 3b   TABLE t8(a, b);
3a60: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
3a70: 38 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20  8 VALUES('one', 
3a80: 27 74 77 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54  'two');.  INSERT
3a90: 20 49 4e 54 4f 20 74 38 20 56 41 4c 55 45 53 28   INTO t8 VALUES(
3aa0: 27 74 68 72 65 65 27 2c 20 27 66 6f 75 72 27 29  'three', 'four')
3ab0: 3b 0a 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20  ;.  ALTER TABLE 
3ac0: 74 38 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20  t8 ADD COLUMN c 
3ad0: 44 45 46 41 55 4c 54 20 27 78 78 78 27 3b 0a 7d  DEFAULT 'xxx';.}
3ae0: 0a 0a 23 20 41 74 20 74 69 6d 65 20 6f 66 20 77  ..# At time of w
3af0: 72 69 74 69 6e 67 2c 20 74 68 65 73 65 20 74 77  riting, these tw
3b00: 6f 20 61 72 65 20 62 72 6f 6b 65 6e 2e 20 54 68  o are broken. Th
3b10: 65 79 20 64 65 6d 6f 6e 73 74 72 61 74 65 20 74  ey demonstrate t
3b20: 68 61 74 20 74 68 65 0a 23 20 73 71 6c 69 74 65  hat the.# sqlite
3b30: 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28  3_preupdate_old(
3b40: 29 20 6d 65 74 68 6f 64 20 64 6f 65 73 20 6e 6f  ) method does no
3b50: 74 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  t handle the cas
3b60: 65 20 77 68 65 72 65 20 41 4c 54 45 52 20 54 41  e where ALTER TA
3b70: 42 4c 45 0a 23 20 68 61 73 20 62 65 65 6e 20 75  BLE.# has been u
3b80: 73 65 64 20 74 6f 20 61 64 64 20 61 20 63 6f 6c  sed to add a col
3b90: 75 6d 6e 20 77 69 74 68 20 61 20 64 65 66 61 75  umn with a defau
3ba0: 6c 74 20 76 61 6c 75 65 20 6f 74 68 65 72 20 74  lt value other t
3bb0: 68 61 6e 20 4e 55 4c 4c 2e 0a 23 0a 64 6f 5f 70  han NULL..#.do_p
3bc0: 72 65 75 70 64 61 74 65 5f 74 65 73 74 20 37 2e  reupdate_test 7.
3bd0: 35 2e 32 2e 31 20 7b 0a 20 20 44 45 4c 45 54 45  5.2.1 {.  DELETE
3be0: 20 46 52 4f 4d 20 74 38 20 57 48 45 52 45 20 61   FROM t8 WHERE a
3bf0: 20 3d 20 27 6f 6e 65 27 0a 7d 20 7b 0a 20 20 44   = 'one'.} {.  D
3c00: 45 4c 45 54 45 20 6d 61 69 6e 20 74 38 20 31 20  ELETE main t8 1 
3c10: 31 20 20 20 6f 6e 65 20 74 77 6f 20 78 78 78 0a  1   one two xxx.
3c20: 7d 0a 64 6f 5f 70 72 65 75 70 64 61 74 65 5f 74  }.do_preupdate_t
3c30: 65 73 74 20 37 2e 35 2e 32 2e 32 20 7b 0a 20 20  est 7.5.2.2 {.  
3c40: 55 50 44 41 54 45 20 74 38 20 53 45 54 20 62 20  UPDATE t8 SET b 
3c50: 3d 20 27 66 69 76 65 27 0a 7d 20 7b 0a 20 20 55  = 'five'.} {.  U
3c60: 50 44 41 54 45 20 6d 61 69 6e 20 74 38 20 32 20  PDATE main t8 2 
3c70: 32 20 20 20 74 68 72 65 65 20 66 6f 75 72 20 78  2   three four x
3c80: 78 78 20 20 74 68 72 65 65 20 66 69 76 65 20 78  xx  three five x
3c90: 78 78 0a 7d 0a 0a 23 20 54 68 69 73 20 62 6c 6f  xx.}..# This blo
3ca0: 63 6b 20 6f 66 20 74 65 73 74 73 20 76 65 72 69  ck of tests veri
3cb0: 66 69 65 73 20 74 68 61 74 20 49 50 4b 20 76 61  fies that IPK va
3cc0: 6c 75 65 73 20 61 72 65 20 63 6f 72 72 65 63 74  lues are correct
3cd0: 6c 79 20 72 65 70 6f 72 74 65 64 0a 23 20 62 79  ly reported.# by
3ce0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 70 72 65   the sqlite3_pre
3cf0: 75 70 64 61 74 65 5f 6f 6c 64 28 29 20 61 6e 64  update_old() and
3d00: 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61   sqlite3_preupda
3d10: 74 65 5f 6e 65 77 28 29 20 66 75 6e 63 74 69 6f  te_new() functio
3d20: 6e 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ns..#.do_execsql
3d30: 5f 74 65 73 74 20 37 2e 36 2e 31 20 7b 20 43 52  _test 7.6.1 { CR
3d40: 45 41 54 45 20 54 41 42 4c 45 20 74 39 28 61 2c  EATE TABLE t9(a,
3d50: 20 62 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41   b INTEGER PRIMA
3d60: 52 59 20 4b 45 59 2c 20 63 29 20 7d 0a 64 6f 5f  RY KEY, c) }.do_
3d70: 70 72 65 75 70 64 61 74 65 5f 74 65 73 74 20 37  preupdate_test 7
3d80: 2e 36 2e 32 20 7b 0a 20 20 49 4e 53 45 52 54 20  .6.2 {.  INSERT 
3d90: 49 4e 54 4f 20 74 39 20 56 41 4c 55 45 53 28 31  INTO t9 VALUES(1
3da0: 2c 20 32 2c 20 33 29 3b 0a 20 20 55 50 44 41 54  , 2, 3);.  UPDAT
3db0: 45 20 74 39 20 53 45 54 20 62 20 3d 20 62 2b 31  E t9 SET b = b+1
3dc0: 2c 20 63 20 3d 20 63 2b 31 3b 0a 20 20 44 45 4c  , c = c+1;.  DEL
3dd0: 45 54 45 20 46 52 4f 4d 20 74 39 20 57 48 45 52  ETE FROM t9 WHER
3de0: 45 20 61 20 3d 20 31 3b 0a 7d 20 7b 0a 20 20 49  E a = 1;.} {.  I
3df0: 4e 53 45 52 54 20 6d 61 69 6e 20 74 39 20 32 20  NSERT main t9 2 
3e00: 32 20 20 20 31 20 32 20 33 0a 20 20 55 50 44 41  2   1 2 3.  UPDA
3e10: 54 45 20 6d 61 69 6e 20 74 39 20 32 20 33 20 20  TE main t9 2 3  
3e20: 20 31 20 32 20 33 20 20 20 31 20 33 20 34 0a 20   1 2 3   1 3 4. 
3e30: 20 44 45 4c 45 54 45 20 6d 61 69 6e 20 74 39 20   DELETE main t9 
3e40: 33 20 33 20 20 20 31 20 33 20 34 0a 7d 0a 0a 0a  3 3   1 3 4.}...
3e50: 66 69 6e 69 73 68 5f 74 65 73 74 0a 0a           finish_test..