/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 2fd24cd7aa0b879d49a224cbd647d698f1e7ac5c:


0000: 23 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72  # 2001 September
0010: 20 31 35 0a 23 0a 23 20 54 68 65 20 61 75 74 68   15.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67  place of.# a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23  is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
0120: 0a 23 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 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73  *********.# This
0170: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
0180: 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74   regression test
0190: 73 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62  s for SQLite lib
01a0: 72 61 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63  rary.  The.# foc
01b0: 75 73 20 6f 66 20 74 68 69 73 20 73 63 72 69 70  us of this scrip
01c0: 74 20 69 73 20 64 61 74 61 62 61 73 65 20 6c 6f  t is database lo
01d0: 63 6b 73 2e 0a 23 0a 23 20 24 49 64 3a 20 74 72  cks..#.# $Id: tr
01e0: 61 6e 73 2e 74 65 73 74 2c 76 20 31 2e 33 38 20  ans.test,v 1.38 
01f0: 32 30 30 38 2f 30 34 2f 31 39 20 32 30 3a 33 34  2008/04/19 20:34
0200: 3a 31 39 20 64 72 68 20 45 78 70 20 24 0a 0a 0a  :19 drh Exp $...
0210: 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c  set testdir [fil
0220: 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30  e dirname $argv0
0230: 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69  ].source $testdi
0240: 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 0a 23  r/tester.tcl...#
0250: 20 43 72 65 61 74 65 20 73 65 76 65 72 61 6c 20   Create several 
0260: 74 61 62 6c 65 73 20 74 6f 20 77 6f 72 6b 20 77  tables to work w
0270: 69 74 68 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 74  ith..#.do_test t
0280: 72 61 6e 73 2d 31 2e 30 20 7b 0a 20 20 65 78 65  rans-1.0 {.  exe
0290: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
02a0: 45 20 54 41 42 4c 45 20 6f 6e 65 28 61 20 69 6e  E TABLE one(a in
02b0: 74 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  t PRIMARY KEY, b
02c0: 20 74 65 78 74 29 3b 0a 20 20 20 20 49 4e 53 45   text);.    INSE
02d0: 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55  RT INTO one VALU
02e0: 45 53 28 31 2c 27 6f 6e 65 27 29 3b 0a 20 20 20  ES(1,'one');.   
02f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65   INSERT INTO one
0300: 20 56 41 4c 55 45 53 28 32 2c 27 74 77 6f 27 29   VALUES(2,'two')
0310: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0320: 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 33 2c 27  O one VALUES(3,'
0330: 74 68 72 65 65 27 29 3b 0a 20 20 20 20 53 45 4c  three');.    SEL
0340: 45 43 54 20 62 20 46 52 4f 4d 20 6f 6e 65 20 4f  ECT b FROM one O
0350: 52 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d  RDER BY a;.  }.}
0360: 20 7b 6f 6e 65 20 74 77 6f 20 74 68 72 65 65 7d   {one two three}
0370: 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  .integrity_check
0380: 20 74 72 61 6e 73 2d 31 2e 30 2e 31 0a 64 6f 5f   trans-1.0.1.do_
0390: 74 65 73 74 20 74 72 61 6e 73 2d 31 2e 31 20 7b  test trans-1.1 {
03a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
03b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 77   CREATE TABLE tw
03c0: 6f 28 61 20 69 6e 74 20 50 52 49 4d 41 52 59 20  o(a int PRIMARY 
03d0: 4b 45 59 2c 20 62 20 74 65 78 74 29 3b 0a 20 20  KEY, b text);.  
03e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 77    INSERT INTO tw
03f0: 6f 20 56 41 4c 55 45 53 28 31 2c 27 49 27 29 3b  o VALUES(1,'I');
0400: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0410: 20 74 77 6f 20 56 41 4c 55 45 53 28 35 2c 27 56   two VALUES(5,'V
0420: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
0430: 4e 54 4f 20 74 77 6f 20 56 41 4c 55 45 53 28 31  NTO two VALUES(1
0440: 30 2c 27 58 27 29 3b 0a 20 20 20 20 53 45 4c 45  0,'X');.    SELE
0450: 43 54 20 62 20 46 52 4f 4d 20 74 77 6f 20 4f 52  CT b FROM two OR
0460: 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20  DER BY a;.  }.} 
0470: 7b 49 20 56 20 58 7d 0a 64 6f 5f 74 65 73 74 20  {I V X}.do_test 
0480: 74 72 61 6e 73 2d 31 2e 39 20 7b 0a 20 20 73 71  trans-1.9 {.  sq
0490: 6c 69 74 65 33 20 61 6c 74 64 62 20 74 65 73 74  lite3 altdb test
04a0: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  .db.  execsql {S
04b0: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 6f 6e 65  ELECT b FROM one
04c0: 20 4f 52 44 45 52 20 42 59 20 61 7d 20 61 6c 74   ORDER BY a} alt
04d0: 64 62 0a 7d 20 7b 6f 6e 65 20 74 77 6f 20 74 68  db.} {one two th
04e0: 72 65 65 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61  ree}.do_test tra
04f0: 6e 73 2d 31 2e 31 30 20 7b 0a 20 20 65 78 65 63  ns-1.10 {.  exec
0500: 73 71 6c 20 7b 53 45 4c 45 43 54 20 62 20 46 52  sql {SELECT b FR
0510: 4f 4d 20 74 77 6f 20 4f 52 44 45 52 20 42 59 20  OM two ORDER BY 
0520: 61 7d 20 61 6c 74 64 62 0a 7d 20 7b 49 20 56 20  a} altdb.} {I V 
0530: 58 7d 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65  X}.integrity_che
0540: 63 6b 20 74 72 61 6e 73 2d 31 2e 31 31 0a 0a 23  ck trans-1.11..#
0550: 20 42 61 73 69 63 20 74 72 61 6e 73 61 63 74 69   Basic transacti
0560: 6f 6e 73 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72  ons.#.do_test tr
0570: 61 6e 73 2d 32 2e 31 20 7b 0a 20 20 73 65 74 20  ans-2.1 {.  set 
0580: 76 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71  v [catch {execsq
0590: 6c 20 7b 42 45 47 49 4e 7d 7d 20 6d 73 67 5d 0a  l {BEGIN}} msg].
05a0: 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67    lappend v $msg
05b0: 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73  .} {0 {}}.do_tes
05c0: 74 20 74 72 61 6e 73 2d 32 2e 32 20 7b 0a 20 20  t trans-2.2 {.  
05d0: 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 65 78  set v [catch {ex
05e0: 65 63 73 71 6c 20 7b 45 4e 44 7d 7d 20 6d 73 67  ecsql {END}} msg
05f0: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d  ].  lappend v $m
0600: 73 67 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74  sg.} {0 {}}.do_t
0610: 65 73 74 20 74 72 61 6e 73 2d 32 2e 33 20 7b 0a  est trans-2.3 {.
0620: 20 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b    set v [catch {
0630: 65 78 65 63 73 71 6c 20 7b 42 45 47 49 4e 20 54  execsql {BEGIN T
0640: 52 41 4e 53 41 43 54 49 4f 4e 7d 7d 20 6d 73 67  RANSACTION}} msg
0650: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d  ].  lappend v $m
0660: 73 67 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74  sg.} {0 {}}.do_t
0670: 65 73 74 20 74 72 61 6e 73 2d 32 2e 34 20 7b 0a  est trans-2.4 {.
0680: 20 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b    set v [catch {
0690: 65 78 65 63 73 71 6c 20 7b 43 4f 4d 4d 49 54 20  execsql {COMMIT 
06a0: 54 52 41 4e 53 41 43 54 49 4f 4e 7d 7d 20 6d 73  TRANSACTION}} ms
06b0: 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24  g].  lappend v $
06c0: 6d 73 67 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f  msg.} {0 {}}.do_
06d0: 74 65 73 74 20 74 72 61 6e 73 2d 32 2e 35 20 7b  test trans-2.5 {
06e0: 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63 68 20  .  set v [catch 
06f0: 7b 65 78 65 63 73 71 6c 20 7b 42 45 47 49 4e 20  {execsql {BEGIN 
0700: 54 52 41 4e 53 41 43 54 49 4f 4e 20 27 66 6f 6f  TRANSACTION 'foo
0710: 27 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65  '}} msg].  lappe
0720: 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 30 20 7b  nd v $msg.} {0 {
0730: 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73  }}.do_test trans
0740: 2d 32 2e 36 20 7b 0a 20 20 73 65 74 20 76 20 5b  -2.6 {.  set v [
0750: 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b  catch {execsql {
0760: 52 4f 4c 4c 42 41 43 4b 20 54 52 41 4e 53 41 43  ROLLBACK TRANSAC
0770: 54 49 4f 4e 20 27 66 6f 6f 27 7d 7d 20 6d 73 67  TION 'foo'}} msg
0780: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d  ].  lappend v $m
0790: 73 67 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74  sg.} {0 {}}.do_t
07a0: 65 73 74 20 74 72 61 6e 73 2d 32 2e 31 30 20 7b  est trans-2.10 {
07b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
07c0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c 45   BEGIN;.    SELE
07d0: 43 54 20 61 20 46 52 4f 4d 20 6f 6e 65 20 4f 52  CT a FROM one OR
07e0: 44 45 52 20 42 59 20 61 3b 0a 20 20 20 20 53 45  DER BY a;.    SE
07f0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 77 6f 20  LECT a FROM two 
0800: 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20 20 20  ORDER BY a;.    
0810: 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20  END;.  }.} {1 2 
0820: 33 20 31 20 35 20 31 30 7d 0a 69 6e 74 65 67 72  3 1 5 10}.integr
0830: 69 74 79 5f 63 68 65 63 6b 20 74 72 61 6e 73 2d  ity_check trans-
0840: 32 2e 31 31 0a 0a 23 20 43 68 65 63 6b 20 74 68  2.11..# Check th
0850: 65 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69  e locking behavi
0860: 6f 72 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72 61  or.#.do_test tra
0870: 6e 73 2d 33 2e 31 20 7b 0a 20 20 65 78 65 63 73  ns-3.1 {.  execs
0880: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
0890: 20 20 20 20 55 50 44 41 54 45 20 6f 6e 65 20 53      UPDATE one S
08a0: 45 54 20 61 20 3d 20 30 20 57 48 45 52 45 20 30  ET a = 0 WHERE 0
08b0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  ;.    SELECT a F
08c0: 52 4f 4d 20 6f 6e 65 20 4f 52 44 45 52 20 42 59  ROM one ORDER BY
08d0: 20 61 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33   a;.  }.} {1 2 3
08e0: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d  }.do_test trans-
08f0: 33 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  3.2 {.  catchsql
0900: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 20   {.    SELECT a 
0910: 46 52 4f 4d 20 74 77 6f 20 4f 52 44 45 52 20 42  FROM two ORDER B
0920: 59 20 61 3b 0a 20 20 7d 20 61 6c 74 64 62 0a 7d  Y a;.  } altdb.}
0930: 20 7b 30 20 7b 31 20 35 20 31 30 7d 7d 0a 0a 64   {0 {1 5 10}}..d
0940: 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d 33 2e 33  o_test trans-3.3
0950: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
0960: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
0970: 4d 20 6f 6e 65 20 4f 52 44 45 52 20 42 59 20 61  M one ORDER BY a
0980: 3b 0a 20 20 7d 20 61 6c 74 64 62 0a 7d 20 7b 30  ;.  } altdb.} {0
0990: 20 7b 31 20 32 20 33 7d 7d 0a 64 6f 5f 74 65 73   {1 2 3}}.do_tes
09a0: 74 20 74 72 61 6e 73 2d 33 2e 34 20 7b 0a 20 20  t trans-3.4 {.  
09b0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49  catchsql {.    I
09c0: 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56  NSERT INTO one V
09d0: 41 4c 55 45 53 28 34 2c 27 66 6f 75 72 27 29 3b  ALUES(4,'four');
09e0: 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f  .  }.} {0 {}}.do
09f0: 5f 74 65 73 74 20 74 72 61 6e 73 2d 33 2e 35 20  _test trans-3.5 
0a00: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
0a10: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
0a20: 20 74 77 6f 20 4f 52 44 45 52 20 42 59 20 61 3b   two ORDER BY a;
0a30: 0a 20 20 7d 20 61 6c 74 64 62 0a 7d 20 7b 30 20  .  } altdb.} {0 
0a40: 7b 31 20 35 20 31 30 7d 7d 0a 64 6f 5f 74 65 73  {1 5 10}}.do_tes
0a50: 74 20 74 72 61 6e 73 2d 33 2e 36 20 7b 0a 20 20  t trans-3.6 {.  
0a60: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53  catchsql {.    S
0a70: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 6f 6e 65  ELECT a FROM one
0a80: 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20 7d   ORDER BY a;.  }
0a90: 20 61 6c 74 64 62 0a 7d 20 7b 30 20 7b 31 20 32   altdb.} {0 {1 2
0aa0: 20 33 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61   3}}.do_test tra
0ab0: 6e 73 2d 33 2e 37 20 7b 0a 20 20 63 61 74 63 68  ns-3.7 {.  catch
0ac0: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
0ad0: 20 49 4e 54 4f 20 74 77 6f 20 56 41 4c 55 45 53   INTO two VALUES
0ae0: 28 34 2c 27 49 56 27 29 3b 0a 20 20 7d 0a 7d 20  (4,'IV');.  }.} 
0af0: 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 74  {0 {}}.do_test t
0b00: 72 61 6e 73 2d 33 2e 38 20 7b 0a 20 20 63 61 74  rans-3.8 {.  cat
0b10: 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  chsql {.    SELE
0b20: 43 54 20 61 20 46 52 4f 4d 20 74 77 6f 20 4f 52  CT a FROM two OR
0b30: 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 20 61 6c  DER BY a;.  } al
0b40: 74 64 62 0a 7d 20 7b 30 20 7b 31 20 35 20 31 30  tdb.} {0 {1 5 10
0b50: 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73  }}.do_test trans
0b60: 2d 33 2e 39 20 7b 0a 20 20 63 61 74 63 68 73 71  -3.9 {.  catchsq
0b70: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61  l {.    SELECT a
0b80: 20 46 52 4f 4d 20 6f 6e 65 20 4f 52 44 45 52 20   FROM one ORDER 
0b90: 42 59 20 61 3b 0a 20 20 7d 20 61 6c 74 64 62 0a  BY a;.  } altdb.
0ba0: 7d 20 7b 30 20 7b 31 20 32 20 33 7d 7d 0a 64 6f  } {0 {1 2 3}}.do
0bb0: 5f 74 65 73 74 20 74 72 61 6e 73 2d 33 2e 31 30  _test trans-3.10
0bc0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 45 4e   {.  execsql {EN
0bd0: 44 20 54 52 41 4e 53 41 43 54 49 4f 4e 7d 0a 7d  D TRANSACTION}.}
0be0: 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 61   {}..do_test tra
0bf0: 6e 73 2d 33 2e 31 31 20 7b 0a 20 20 73 65 74 20  ns-3.11 {.  set 
0c00: 76 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71  v [catch {execsq
0c10: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61  l {.    SELECT a
0c20: 20 46 52 4f 4d 20 74 77 6f 20 4f 52 44 45 52 20   FROM two ORDER 
0c30: 42 59 20 61 3b 0a 20 20 7d 20 61 6c 74 64 62 7d  BY a;.  } altdb}
0c40: 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20   msg].  lappend 
0c50: 76 20 24 6d 73 67 0a 7d 20 7b 30 20 7b 31 20 34  v $msg.} {0 {1 4
0c60: 20 35 20 31 30 7d 7d 0a 64 6f 5f 74 65 73 74 20   5 10}}.do_test 
0c70: 74 72 61 6e 73 2d 33 2e 31 32 20 7b 0a 20 20 73  trans-3.12 {.  s
0c80: 65 74 20 76 20 5b 63 61 74 63 68 20 7b 65 78 65  et v [catch {exe
0c90: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
0ca0: 54 20 61 20 46 52 4f 4d 20 6f 6e 65 20 4f 52 44  T a FROM one ORD
0cb0: 45 52 20 42 59 20 61 3b 0a 20 20 7d 20 61 6c 74  ER BY a;.  } alt
0cc0: 64 62 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65  db} msg].  lappe
0cd0: 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 30 20 7b  nd v $msg.} {0 {
0ce0: 31 20 32 20 33 20 34 7d 7d 0a 64 6f 5f 74 65 73  1 2 3 4}}.do_tes
0cf0: 74 20 74 72 61 6e 73 2d 33 2e 31 33 20 7b 0a 20  t trans-3.13 {. 
0d00: 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 65   set v [catch {e
0d10: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
0d20: 45 43 54 20 61 20 46 52 4f 4d 20 74 77 6f 20 4f  ECT a FROM two O
0d30: 52 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 20 64  RDER BY a;.  } d
0d40: 62 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e  b} msg].  lappen
0d50: 64 20 76 20 24 6d 73 67 0a 7d 20 7b 30 20 7b 31  d v $msg.} {0 {1
0d60: 20 34 20 35 20 31 30 7d 7d 0a 64 6f 5f 74 65 73   4 5 10}}.do_tes
0d70: 74 20 74 72 61 6e 73 2d 33 2e 31 34 20 7b 0a 20  t trans-3.14 {. 
0d80: 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 65   set v [catch {e
0d90: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
0da0: 45 43 54 20 61 20 46 52 4f 4d 20 6f 6e 65 20 4f  ECT a FROM one O
0db0: 52 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 20 64  RDER BY a;.  } d
0dc0: 62 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e  b} msg].  lappen
0dd0: 64 20 76 20 24 6d 73 67 0a 7d 20 7b 30 20 7b 31  d v $msg.} {0 {1
0de0: 20 32 20 33 20 34 7d 7d 0a 69 6e 74 65 67 72 69   2 3 4}}.integri
0df0: 74 79 5f 63 68 65 63 6b 20 74 72 61 6e 73 2d 33  ty_check trans-3
0e00: 2e 31 35 0a 0a 64 6f 5f 74 65 73 74 20 74 72 61  .15..do_test tra
0e10: 6e 73 2d 34 2e 31 20 7b 0a 20 20 73 65 74 20 76  ns-4.1 {.  set v
0e20: 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c   [catch {execsql
0e30: 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20   {.    COMMIT;. 
0e40: 20 7d 20 64 62 7d 20 6d 73 67 5d 0a 20 20 6c 61   } db} msg].  la
0e50: 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b  ppend v $msg.} {
0e60: 31 20 7b 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74  1 {cannot commit
0e70: 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f   - no transactio
0e80: 6e 20 69 73 20 61 63 74 69 76 65 7d 7d 0a 64 6f  n is active}}.do
0e90: 5f 74 65 73 74 20 74 72 61 6e 73 2d 34 2e 32 20  _test trans-4.2 
0ea0: 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63 68  {.  set v [catch
0eb0: 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20   {execsql {.    
0ec0: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 20 64 62  ROLLBACK;.  } db
0ed0: 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64  } msg].  lappend
0ee0: 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 63 61   v $msg.} {1 {ca
0ef0: 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20  nnot rollback - 
0f00: 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  no transaction i
0f10: 73 20 61 63 74 69 76 65 7d 7d 0a 64 6f 5f 74 65  s active}}.do_te
0f20: 73 74 20 74 72 61 6e 73 2d 34 2e 33 20 7b 0a 20  st trans-4.3 {. 
0f30: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
0f40: 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f  BEGIN TRANSACTIO
0f50: 4e 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 77  N;.    UPDATE tw
0f60: 6f 20 53 45 54 20 61 20 3d 20 30 20 57 48 45 52  o SET a = 0 WHER
0f70: 45 20 30 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  E 0;.    SELECT 
0f80: 61 20 46 52 4f 4d 20 74 77 6f 20 4f 52 44 45 52  a FROM two ORDER
0f90: 20 42 59 20 61 3b 0a 20 20 7d 20 64 62 0a 7d 20   BY a;.  } db.} 
0fa0: 7b 30 20 7b 31 20 34 20 35 20 31 30 7d 7d 0a 64  {0 {1 4 5 10}}.d
0fb0: 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d 34 2e 34  o_test trans-4.4
0fc0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
0fd0: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
0fe0: 4d 20 74 77 6f 20 4f 52 44 45 52 20 42 59 20 61  M two ORDER BY a
0ff0: 3b 0a 20 20 7d 20 61 6c 74 64 62 0a 7d 20 7b 30  ;.  } altdb.} {0
1000: 20 7b 31 20 34 20 35 20 31 30 7d 7d 0a 64 6f 5f   {1 4 5 10}}.do_
1010: 74 65 73 74 20 74 72 61 6e 73 2d 34 2e 35 20 7b  test trans-4.5 {
1020: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
1030: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
1040: 6f 6e 65 20 4f 52 44 45 52 20 42 59 20 61 3b 0a  one ORDER BY a;.
1050: 20 20 7d 20 61 6c 74 64 62 0a 7d 20 7b 30 20 7b    } altdb.} {0 {
1060: 31 20 32 20 33 20 34 7d 7d 0a 64 6f 5f 74 65 73  1 2 3 4}}.do_tes
1070: 74 20 74 72 61 6e 73 2d 34 2e 36 20 7b 0a 20 20  t trans-4.6 {.  
1080: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 42  catchsql {.    B
1090: 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e  EGIN TRANSACTION
10a0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  ;.    SELECT a F
10b0: 52 4f 4d 20 6f 6e 65 20 4f 52 44 45 52 20 42 59  ROM one ORDER BY
10c0: 20 61 3b 0a 20 20 7d 20 64 62 0a 7d 20 7b 31 20   a;.  } db.} {1 
10d0: 7b 63 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20  {cannot start a 
10e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68  transaction with
10f0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
1100: 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73  }}.do_test trans
1110: 2d 34 2e 37 20 7b 0a 20 20 63 61 74 63 68 73 71  -4.7 {.  catchsq
1120: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61  l {.    SELECT a
1130: 20 46 52 4f 4d 20 74 77 6f 20 4f 52 44 45 52 20   FROM two ORDER 
1140: 42 59 20 61 3b 0a 20 20 7d 20 61 6c 74 64 62 0a  BY a;.  } altdb.
1150: 7d 20 7b 30 20 7b 31 20 34 20 35 20 31 30 7d 7d  } {0 {1 4 5 10}}
1160: 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d 34  .do_test trans-4
1170: 2e 38 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .8 {.  catchsql 
1180: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  {.    SELECT a F
1190: 52 4f 4d 20 6f 6e 65 20 4f 52 44 45 52 20 42 59  ROM one ORDER BY
11a0: 20 61 3b 0a 20 20 7d 20 61 6c 74 64 62 0a 7d 20   a;.  } altdb.} 
11b0: 7b 30 20 7b 31 20 32 20 33 20 34 7d 7d 0a 64 6f  {0 {1 2 3 4}}.do
11c0: 5f 74 65 73 74 20 74 72 61 6e 73 2d 34 2e 39 20  _test trans-4.9 
11d0: 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63 68  {.  set v [catch
11e0: 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20   {execsql {.    
11f0: 45 4e 44 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b  END TRANSACTION;
1200: 0a 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52  .    SELECT a FR
1210: 4f 4d 20 74 77 6f 20 4f 52 44 45 52 20 42 59 20  OM two ORDER BY 
1220: 61 3b 0a 20 20 7d 20 64 62 7d 20 6d 73 67 5d 0a  a;.  } db} msg].
1230: 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67    lappend v $msg
1240: 0a 7d 20 7b 30 20 7b 31 20 34 20 35 20 31 30 7d  .} {0 {1 4 5 10}
1250: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d  }.do_test trans-
1260: 34 2e 31 30 20 7b 0a 20 20 73 65 74 20 76 20 5b  4.10 {.  set v [
1270: 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b  catch {execsql {
1280: 0a 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52  .    SELECT a FR
1290: 4f 4d 20 74 77 6f 20 4f 52 44 45 52 20 42 59 20  OM two ORDER BY 
12a0: 61 3b 0a 20 20 7d 20 61 6c 74 64 62 7d 20 6d 73  a;.  } altdb} ms
12b0: 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24  g].  lappend v $
12c0: 6d 73 67 0a 7d 20 7b 30 20 7b 31 20 34 20 35 20  msg.} {0 {1 4 5 
12d0: 31 30 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61  10}}.do_test tra
12e0: 6e 73 2d 34 2e 31 31 20 7b 0a 20 20 73 65 74 20  ns-4.11 {.  set 
12f0: 76 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71  v [catch {execsq
1300: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61  l {.    SELECT a
1310: 20 46 52 4f 4d 20 6f 6e 65 20 4f 52 44 45 52 20   FROM one ORDER 
1320: 42 59 20 61 3b 0a 20 20 7d 20 61 6c 74 64 62 7d  BY a;.  } altdb}
1330: 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20   msg].  lappend 
1340: 76 20 24 6d 73 67 0a 7d 20 7b 30 20 7b 31 20 32  v $msg.} {0 {1 2
1350: 20 33 20 34 7d 7d 0a 69 6e 74 65 67 72 69 74 79   3 4}}.integrity
1360: 5f 63 68 65 63 6b 20 74 72 61 6e 73 2d 34 2e 31  _check trans-4.1
1370: 32 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d  2.do_test trans-
1380: 34 2e 39 38 20 7b 0a 20 20 61 6c 74 64 62 20 63  4.98 {.  altdb c
1390: 6c 6f 73 65 0a 20 20 65 78 65 63 73 71 6c 20 7b  lose.  execsql {
13a0: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
13b0: 6f 6e 65 3b 0a 20 20 20 20 44 52 4f 50 20 54 41  one;.    DROP TA
13c0: 42 4c 45 20 74 77 6f 3b 0a 20 20 7d 0a 7d 20 7b  BLE two;.  }.} {
13d0: 7d 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  }.integrity_chec
13e0: 6b 20 74 72 61 6e 73 2d 34 2e 39 39 0a 0a 23 20  k trans-4.99..# 
13f0: 43 68 65 63 6b 20 6f 75 74 20 74 68 65 20 63 6f  Check out the co
1400: 6d 6d 69 74 2f 72 6f 6c 6c 62 61 63 6b 20 62 65  mmit/rollback be
1410: 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 64 61  havior of the da
1420: 74 61 62 61 73 65 0a 23 0a 64 6f 5f 74 65 73 74  tabase.#.do_test
1430: 20 74 72 61 6e 73 2d 35 2e 31 20 7b 0a 20 20 65   trans-5.1 {.  e
1440: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6e  xecsql {SELECT n
1450: 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
1460: 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70  master WHERE typ
1470: 65 3d 27 74 61 62 6c 65 27 20 4f 52 44 45 52 20  e='table' ORDER 
1480: 42 59 20 6e 61 6d 65 7d 0a 7d 20 7b 7d 0a 64 6f  BY name}.} {}.do
1490: 5f 74 65 73 74 20 74 72 61 6e 73 2d 35 2e 32 20  _test trans-5.2 
14a0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 42 45 47  {.  execsql {BEG
14b0: 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 7d 0a  IN TRANSACTION}.
14c0: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
14d0: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
14e0: 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
14f0: 74 79 70 65 3d 27 74 61 62 6c 65 27 20 4f 52 44  type='table' ORD
1500: 45 52 20 42 59 20 6e 61 6d 65 7d 0a 7d 20 7b 7d  ER BY name}.} {}
1510: 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d 35  .do_test trans-5
1520: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
1530: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65  CREATE TABLE one
1540: 28 61 20 74 65 78 74 2c 20 62 20 69 6e 74 29 7d  (a text, b int)}
1550: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
1560: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
1570: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
1580: 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20 4f 52   type='table' OR
1590: 44 45 52 20 42 59 20 6e 61 6d 65 7d 0a 7d 20 7b  DER BY name}.} {
15a0: 6f 6e 65 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61  one}.do_test tra
15b0: 6e 73 2d 35 2e 34 20 7b 0a 20 20 65 78 65 63 73  ns-5.4 {.  execs
15c0: 71 6c 20 7b 53 45 4c 45 43 54 20 61 2c 62 20 46  ql {SELECT a,b F
15d0: 52 4f 4d 20 6f 6e 65 20 4f 52 44 45 52 20 42 59  ROM one ORDER BY
15e0: 20 62 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74   b}.} {}.do_test
15f0: 20 74 72 61 6e 73 2d 35 2e 35 20 7b 0a 20 20 65   trans-5.5 {.  e
1600: 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20 49  xecsql {INSERT I
1610: 4e 54 4f 20 6f 6e 65 28 61 2c 62 29 20 56 41 4c  NTO one(a,b) VAL
1620: 55 45 53 28 27 68 65 6c 6c 6f 27 2c 20 31 29 7d  UES('hello', 1)}
1630: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
1640: 43 54 20 61 2c 62 20 46 52 4f 4d 20 6f 6e 65 20  CT a,b FROM one 
1650: 4f 52 44 45 52 20 42 59 20 62 7d 0a 7d 20 7b 68  ORDER BY b}.} {h
1660: 65 6c 6c 6f 20 31 7d 0a 64 6f 5f 74 65 73 74 20  ello 1}.do_test 
1670: 74 72 61 6e 73 2d 35 2e 36 20 7b 0a 20 20 65 78  trans-5.6 {.  ex
1680: 65 63 73 71 6c 20 7b 52 4f 4c 4c 42 41 43 4b 7d  ecsql {ROLLBACK}
1690: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
16a0: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
16b0: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
16c0: 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20 4f 52   type='table' OR
16d0: 44 45 52 20 42 59 20 6e 61 6d 65 7d 0a 7d 20 7b  DER BY name}.} {
16e0: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d  }.do_test trans-
16f0: 35 2e 37 20 7b 0a 20 20 73 65 74 20 76 20 5b 63  5.7 {.  set v [c
1700: 61 74 63 68 20 7b 0a 20 20 20 20 65 78 65 63 73  atch {.    execs
1710: 71 6c 20 7b 53 45 4c 45 43 54 20 61 2c 62 20 46  ql {SELECT a,b F
1720: 52 4f 4d 20 6f 6e 65 20 4f 52 44 45 52 20 42 59  ROM one ORDER BY
1730: 20 62 7d 0a 20 20 7d 20 6d 73 67 5d 0a 20 20 6c   b}.  } msg].  l
1740: 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20  append v $msg.} 
1750: 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c  {1 {no such tabl
1760: 65 3a 20 6f 6e 65 7d 7d 0a 0a 23 20 54 65 73 74  e: one}}..# Test
1770: 20 63 6f 6d 6d 69 74 73 20 61 6e 64 20 72 6f 6c   commits and rol
1780: 6c 62 61 63 6b 73 20 6f 66 20 74 61 62 6c 65 20  lbacks of table 
1790: 43 52 45 41 54 45 20 54 41 42 4c 45 73 2c 20 43  CREATE TABLEs, C
17a0: 52 45 41 54 45 20 49 4e 44 45 58 73 0a 23 20 44  REATE INDEXs.# D
17b0: 52 4f 50 20 54 41 42 4c 45 73 20 61 6e 64 20 44  ROP TABLEs and D
17c0: 52 4f 50 20 49 4e 44 45 58 73 0a 23 0a 64 6f 5f  ROP INDEXs.#.do_
17d0: 74 65 73 74 20 74 72 61 6e 73 2d 35 2e 38 20 7b  test trans-5.8 {
17e0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
17f0: 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 66 52 4f   SELECT name fRO
1800: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
1810: 0a 20 20 20 20 57 48 45 52 45 20 74 79 70 65 3d  .    WHERE type=
1820: 27 74 61 62 6c 65 27 20 4f 52 20 74 79 70 65 3d  'table' OR type=
1830: 27 69 6e 64 65 78 27 0a 20 20 20 20 4f 52 44 45  'index'.    ORDE
1840: 52 20 42 59 20 6e 61 6d 65 0a 20 20 7d 0a 7d 20  R BY name.  }.} 
1850: 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73  {}.do_test trans
1860: 2d 35 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c  -5.9 {.  execsql
1870: 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 54 52 41   {.    BEGIN TRA
1880: 4e 53 41 43 54 49 4f 4e 3b 0a 20 20 20 20 43 52  NSACTION;.    CR
1890: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
18a0: 69 6e 74 2c 20 62 20 69 6e 74 2c 20 63 20 69 6e  int, b int, c in
18b0: 74 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  t);.    SELECT n
18c0: 61 6d 65 20 66 52 4f 4d 20 73 71 6c 69 74 65 5f  ame fROM sqlite_
18d0: 6d 61 73 74 65 72 20 0a 20 20 20 20 57 48 45 52  master .    WHER
18e0: 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20 4f  E type='table' O
18f0: 52 20 74 79 70 65 3d 27 69 6e 64 65 78 27 0a 20  R type='index'. 
1900: 20 20 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65     ORDER BY name
1910: 3b 0a 20 20 7d 0a 7d 20 7b 74 31 7d 0a 64 6f 5f  ;.  }.} {t1}.do_
1920: 74 65 73 74 20 74 72 61 6e 73 2d 35 2e 31 30 20  test trans-5.10 
1930: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1940: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
1950: 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20  1 ON t1(a);.    
1960: 53 45 4c 45 43 54 20 6e 61 6d 65 20 66 52 4f 4d  SELECT name fROM
1970: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a   sqlite_master .
1980: 20 20 20 20 57 48 45 52 45 20 74 79 70 65 3d 27      WHERE type='
1990: 74 61 62 6c 65 27 20 4f 52 20 74 79 70 65 3d 27  table' OR type='
19a0: 69 6e 64 65 78 27 0a 20 20 20 20 4f 52 44 45 52  index'.    ORDER
19b0: 20 42 59 20 6e 61 6d 65 3b 0a 20 20 7d 0a 7d 20   BY name;.  }.} 
19c0: 7b 69 31 20 74 31 7d 0a 64 6f 5f 74 65 73 74 20  {i1 t1}.do_test 
19d0: 74 72 61 6e 73 2d 35 2e 31 31 20 7b 0a 20 20 65  trans-5.11 {.  e
19e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d  xecsql {.    COM
19f0: 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  MIT;.    SELECT 
1a00: 6e 61 6d 65 20 66 52 4f 4d 20 73 71 6c 69 74 65  name fROM sqlite
1a10: 5f 6d 61 73 74 65 72 20 0a 20 20 20 20 57 48 45  _master .    WHE
1a20: 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20  RE type='table' 
1a30: 4f 52 20 74 79 70 65 3d 27 69 6e 64 65 78 27 0a  OR type='index'.
1a40: 20 20 20 20 4f 52 44 45 52 20 42 59 20 6e 61 6d      ORDER BY nam
1a50: 65 3b 0a 20 20 7d 0a 7d 20 7b 69 31 20 74 31 7d  e;.  }.} {i1 t1}
1a60: 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d 35  .do_test trans-5
1a70: 2e 31 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .12 {.  execsql 
1a80: 7b 0a 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e  {.    BEGIN TRAN
1a90: 53 41 43 54 49 4f 4e 3b 0a 20 20 20 20 43 52 45  SACTION;.    CRE
1aa0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 69  ATE TABLE t2(a i
1ab0: 6e 74 2c 20 62 20 69 6e 74 2c 20 63 20 69 6e 74  nt, b int, c int
1ac0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
1ad0: 44 45 58 20 69 32 61 20 4f 4e 20 74 32 28 61 29  DEX i2a ON t2(a)
1ae0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
1af0: 45 58 20 69 32 62 20 4f 4e 20 74 32 28 62 29 3b  EX i2b ON t2(b);
1b00: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
1b10: 74 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  t1;.    SELECT n
1b20: 61 6d 65 20 66 52 4f 4d 20 73 71 6c 69 74 65 5f  ame fROM sqlite_
1b30: 6d 61 73 74 65 72 20 0a 20 20 20 20 57 48 45 52  master .    WHER
1b40: 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20 4f  E type='table' O
1b50: 52 20 74 79 70 65 3d 27 69 6e 64 65 78 27 0a 20  R type='index'. 
1b60: 20 20 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65     ORDER BY name
1b70: 3b 0a 20 20 7d 0a 7d 20 7b 69 32 61 20 69 32 62  ;.  }.} {i2a i2b
1b80: 20 74 32 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61   t2}.do_test tra
1b90: 6e 73 2d 35 2e 31 33 20 7b 0a 20 20 65 78 65 63  ns-5.13 {.  exec
1ba0: 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41  sql {.    ROLLBA
1bb0: 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  CK;.    SELECT n
1bc0: 61 6d 65 20 66 52 4f 4d 20 73 71 6c 69 74 65 5f  ame fROM sqlite_
1bd0: 6d 61 73 74 65 72 20 0a 20 20 20 20 57 48 45 52  master .    WHER
1be0: 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20 4f  E type='table' O
1bf0: 52 20 74 79 70 65 3d 27 69 6e 64 65 78 27 0a 20  R type='index'. 
1c00: 20 20 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65     ORDER BY name
1c10: 3b 0a 20 20 7d 0a 7d 20 7b 69 31 20 74 31 7d 0a  ;.  }.} {i1 t1}.
1c20: 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d 35 2e  do_test trans-5.
1c30: 31 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  14 {.  execsql {
1c40: 0a 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53  .    BEGIN TRANS
1c50: 41 43 54 49 4f 4e 3b 0a 20 20 20 20 44 52 4f 50  ACTION;.    DROP
1c60: 20 49 4e 44 45 58 20 69 31 3b 0a 20 20 20 20 53   INDEX i1;.    S
1c70: 45 4c 45 43 54 20 6e 61 6d 65 20 66 52 4f 4d 20  ELECT name fROM 
1c80: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20  sqlite_master . 
1c90: 20 20 20 57 48 45 52 45 20 74 79 70 65 3d 27 74     WHERE type='t
1ca0: 61 62 6c 65 27 20 4f 52 20 74 79 70 65 3d 27 69  able' OR type='i
1cb0: 6e 64 65 78 27 0a 20 20 20 20 4f 52 44 45 52 20  ndex'.    ORDER 
1cc0: 42 59 20 6e 61 6d 65 3b 0a 20 20 7d 0a 7d 20 7b  BY name;.  }.} {
1cd0: 74 31 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e  t1}.do_test tran
1ce0: 73 2d 35 2e 31 35 20 7b 0a 20 20 65 78 65 63 73  s-5.15 {.  execs
1cf0: 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43  ql {.    ROLLBAC
1d00: 4b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61  K;.    SELECT na
1d10: 6d 65 20 66 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me fROM sqlite_m
1d20: 61 73 74 65 72 20 0a 20 20 20 20 57 48 45 52 45  aster .    WHERE
1d30: 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20 4f 52   type='table' OR
1d40: 20 74 79 70 65 3d 27 69 6e 64 65 78 27 0a 20 20   type='index'.  
1d50: 20 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b    ORDER BY name;
1d60: 0a 20 20 7d 0a 7d 20 7b 69 31 20 74 31 7d 0a 64  .  }.} {i1 t1}.d
1d70: 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d 35 2e 31  o_test trans-5.1
1d80: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  6 {.  execsql {.
1d90: 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53 41      BEGIN TRANSA
1da0: 43 54 49 4f 4e 3b 0a 20 20 20 20 44 52 4f 50 20  CTION;.    DROP 
1db0: 49 4e 44 45 58 20 69 31 3b 0a 20 20 20 20 43 52  INDEX i1;.    CR
1dc0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 20  EATE TABLE t2(x 
1dd0: 69 6e 74 2c 20 79 20 69 6e 74 2c 20 7a 20 69 6e  int, y int, z in
1de0: 74 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  t);.    CREATE I
1df0: 4e 44 45 58 20 69 32 78 20 4f 4e 20 74 32 28 78  NDEX i2x ON t2(x
1e00: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
1e10: 44 45 58 20 69 32 79 20 4f 4e 20 74 32 28 79 29  DEX i2y ON t2(y)
1e20: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1e30: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 32 2c  O t2 VALUES(1,2,
1e40: 33 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  3);.    SELECT n
1e50: 61 6d 65 20 66 52 4f 4d 20 73 71 6c 69 74 65 5f  ame fROM sqlite_
1e60: 6d 61 73 74 65 72 20 0a 20 20 20 20 57 48 45 52  master .    WHER
1e70: 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20 4f  E type='table' O
1e80: 52 20 74 79 70 65 3d 27 69 6e 64 65 78 27 0a 20  R type='index'. 
1e90: 20 20 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65     ORDER BY name
1ea0: 3b 0a 20 20 7d 0a 7d 20 7b 69 32 78 20 69 32 79  ;.  }.} {i2x i2y
1eb0: 20 74 31 20 74 32 7d 0a 64 6f 5f 74 65 73 74 20   t1 t2}.do_test 
1ec0: 74 72 61 6e 73 2d 35 2e 31 37 20 7b 0a 20 20 65  trans-5.17 {.  e
1ed0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d  xecsql {.    COM
1ee0: 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  MIT;.    SELECT 
1ef0: 6e 61 6d 65 20 66 52 4f 4d 20 73 71 6c 69 74 65  name fROM sqlite
1f00: 5f 6d 61 73 74 65 72 20 0a 20 20 20 20 57 48 45  _master .    WHE
1f10: 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20  RE type='table' 
1f20: 4f 52 20 74 79 70 65 3d 27 69 6e 64 65 78 27 0a  OR type='index'.
1f30: 20 20 20 20 4f 52 44 45 52 20 42 59 20 6e 61 6d      ORDER BY nam
1f40: 65 3b 0a 20 20 7d 0a 7d 20 7b 69 32 78 20 69 32  e;.  }.} {i2x i2
1f50: 79 20 74 31 20 74 32 7d 0a 64 6f 5f 74 65 73 74  y t1 t2}.do_test
1f60: 20 74 72 61 6e 73 2d 35 2e 31 38 20 7b 0a 20 20   trans-5.18 {.  
1f70: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
1f80: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
1f90: 20 20 7d 0a 7d 20 7b 31 20 32 20 33 7d 0a 64 6f    }.} {1 2 3}.do
1fa0: 5f 74 65 73 74 20 74 72 61 6e 73 2d 35 2e 31 39  _test trans-5.19
1fb0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1fc0: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
1fd0: 20 74 32 20 57 48 45 52 45 20 79 3d 32 3b 0a 20   t2 WHERE y=2;. 
1fe0: 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74   }.} {1}.do_test
1ff0: 20 74 72 61 6e 73 2d 35 2e 32 30 20 7b 0a 20 20   trans-5.20 {.  
2000: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
2010: 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b  GIN TRANSACTION;
2020: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
2030: 74 31 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  t1;.    DROP TAB
2040: 4c 45 20 74 32 3b 0a 20 20 20 20 53 45 4c 45 43  LE t2;.    SELEC
2050: 54 20 6e 61 6d 65 20 66 52 4f 4d 20 73 71 6c 69  T name fROM sqli
2060: 74 65 5f 6d 61 73 74 65 72 20 0a 20 20 20 20 57  te_master .    W
2070: 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65  HERE type='table
2080: 27 20 4f 52 20 74 79 70 65 3d 27 69 6e 64 65 78  ' OR type='index
2090: 27 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 6e  '.    ORDER BY n
20a0: 61 6d 65 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  ame;.  }.} {}.do
20b0: 5f 74 65 73 74 20 74 72 61 6e 73 2d 35 2e 32 31  _test trans-5.21
20c0: 20 7b 0a 20 20 73 65 74 20 72 20 5b 63 61 74 63   {.  set r [catc
20d0: 68 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  h {execsql {.   
20e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
20f0: 32 0a 20 20 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61  2.  }} msg].  la
2100: 70 70 65 6e 64 20 72 20 24 6d 73 67 0a 7d 20 7b  ppend r $msg.} {
2110: 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  1 {no such table
2120: 3a 20 74 32 7d 7d 0a 64 6f 5f 74 65 73 74 20 74  : t2}}.do_test t
2130: 72 61 6e 73 2d 35 2e 32 32 20 7b 0a 20 20 65 78  rans-5.22 {.  ex
2140: 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c  ecsql {.    ROLL
2150: 42 41 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43 54  BACK;.    SELECT
2160: 20 6e 61 6d 65 20 66 52 4f 4d 20 73 71 6c 69 74   name fROM sqlit
2170: 65 5f 6d 61 73 74 65 72 20 0a 20 20 20 20 57 48  e_master .    WH
2180: 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27  ERE type='table'
2190: 20 4f 52 20 74 79 70 65 3d 27 69 6e 64 65 78 27   OR type='index'
21a0: 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 6e 61  .    ORDER BY na
21b0: 6d 65 3b 0a 20 20 7d 0a 7d 20 7b 69 32 78 20 69  me;.  }.} {i2x i
21c0: 32 79 20 74 31 20 74 32 7d 0a 64 6f 5f 74 65 73  2y t1 t2}.do_tes
21d0: 74 20 74 72 61 6e 73 2d 35 2e 32 33 20 7b 0a 20  t trans-5.23 {. 
21e0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
21f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
2200: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 7d 0a 69  .  }.} {1 2 3}.i
2210: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 74  ntegrity_check t
2220: 72 61 6e 73 2d 35 2e 32 33 0a 0a 0a 23 20 54 72  rans-5.23...# Tr
2230: 79 20 74 6f 20 44 52 4f 50 20 61 6e 64 20 43 52  y to DROP and CR
2240: 45 41 54 45 20 74 61 62 6c 65 73 20 61 6e 64 20  EATE tables and 
2250: 69 6e 64 69 63 65 73 20 77 69 74 68 20 74 68 65  indices with the
2260: 20 73 61 6d 65 20 6e 61 6d 65 0a 23 20 77 69 74   same name.# wit
2270: 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
2280: 6e 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 52 4f  n.  Make sure RO
2290: 4c 4c 42 41 43 4b 20 77 6f 72 6b 73 2e 0a 23 0a  LLBACK works..#.
22a0: 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d 36 2e  do_test trans-6.
22b0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 32 20 7b  1 {.  execsql2 {
22c0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
22d0: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32 2c 33   t1 VALUES(1,2,3
22e0: 29 3b 0a 20 20 20 20 42 45 47 49 4e 20 54 52 41  );.    BEGIN TRA
22f0: 4e 53 41 43 54 49 4f 4e 3b 0a 20 20 20 20 44 52  NSACTION;.    DR
2300: 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 20  OP TABLE t1;.   
2310: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
2320: 28 70 2c 71 2c 72 29 3b 0a 20 20 20 20 52 4f 4c  (p,q,r);.    ROL
2330: 4c 42 41 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43  LBACK;.    SELEC
2340: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
2350: 0a 7d 20 7b 61 20 31 20 62 20 32 20 63 20 33 7d  .} {a 1 b 2 c 3}
2360: 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d 36  .do_test trans-6
2370: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 32 20  .2 {.  execsql2 
2380: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
2390: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32 2c  O t1 VALUES(1,2,
23a0: 33 29 3b 0a 20 20 20 20 42 45 47 49 4e 20 54 52  3);.    BEGIN TR
23b0: 41 4e 53 41 43 54 49 4f 4e 3b 0a 20 20 20 20 44  ANSACTION;.    D
23c0: 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20  ROP TABLE t1;.  
23d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
23e0: 31 28 70 2c 71 2c 72 29 3b 0a 20 20 20 20 43 4f  1(p,q,r);.    CO
23f0: 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43 54  MMIT;.    SELECT
2400: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
2410: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61  } {}.do_test tra
2420: 6e 73 2d 36 2e 33 20 7b 0a 20 20 65 78 65 63 73  ns-6.3 {.  execs
2430: 71 6c 32 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  ql2 {.    INSERT
2440: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
2450: 31 2c 32 2c 33 29 3b 0a 20 20 20 20 53 45 4c 45  1,2,3);.    SELE
2460: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
2470: 7d 0a 7d 20 7b 70 20 31 20 71 20 32 20 72 20 33  }.} {p 1 q 2 r 3
2480: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d  }.do_test trans-
2490: 36 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 32  6.4 {.  execsql2
24a0: 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 54 52 41   {.    BEGIN TRA
24b0: 4e 53 41 43 54 49 4f 4e 3b 0a 20 20 20 20 44 52  NSACTION;.    DR
24c0: 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 20  OP TABLE t1;.   
24d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
24e0: 28 61 2c 62 2c 63 29 3b 0a 20 20 20 20 49 4e 53  (a,b,c);.    INS
24f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2500: 45 53 28 34 2c 35 2c 36 29 3b 0a 20 20 20 20 53  ES(4,5,6);.    S
2510: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
2520: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
2530: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20 34 20 62  t1;.  }.} {a 4 b
2540: 20 35 20 63 20 36 7d 0a 64 6f 5f 74 65 73 74 20   5 c 6}.do_test 
2550: 74 72 61 6e 73 2d 36 2e 35 20 7b 0a 20 20 65 78  trans-6.5 {.  ex
2560: 65 63 73 71 6c 32 20 7b 0a 20 20 20 20 52 4f 4c  ecsql2 {.    ROL
2570: 4c 42 41 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43  LBACK;.    SELEC
2580: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
2590: 0a 7d 20 7b 70 20 31 20 71 20 32 20 72 20 33 7d  .} {p 1 q 2 r 3}
25a0: 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d 36  .do_test trans-6
25b0: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 32 20  .6 {.  execsql2 
25c0: 7b 0a 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e  {.    BEGIN TRAN
25d0: 53 41 43 54 49 4f 4e 3b 0a 20 20 20 20 44 52 4f  SACTION;.    DRO
25e0: 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 20 20  P TABLE t1;.    
25f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
2600: 61 2c 62 2c 63 29 3b 0a 20 20 20 20 49 4e 53 45  a,b,c);.    INSE
2610: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
2620: 53 28 34 2c 35 2c 36 29 3b 0a 20 20 20 20 53 45  S(4,5,6);.    SE
2630: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
2640: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
2650: 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20 34 20 62 20  1;.  }.} {a 4 b 
2660: 35 20 63 20 36 7d 0a 64 6f 5f 74 65 73 74 20 74  5 c 6}.do_test t
2670: 72 61 6e 73 2d 36 2e 37 20 7b 0a 20 20 63 61 74  rans-6.7 {.  cat
2680: 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d  chsql {.    COMM
2690: 49 54 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  IT;.    SELECT *
26a0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
26b0: 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c  {1 {no such tabl
26c0: 65 3a 20 74 31 7d 7d 0a 0a 23 20 52 65 70 65 61  e: t1}}..# Repea
26d0: 74 20 6f 6e 20 61 20 74 61 62 6c 65 20 77 69 74  t on a table wit
26e0: 68 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c  h an automatical
26f0: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 69 6e 64  ly generated ind
2700: 65 78 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72  ex..#.do_test tr
2710: 61 6e 73 2d 36 2e 31 30 20 7b 0a 20 20 65 78 65  ans-6.10 {.  exe
2720: 63 73 71 6c 32 20 7b 0a 20 20 20 20 43 52 45 41  csql2 {.    CREA
2730: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 75 6e  TE TABLE t1(a un
2740: 69 71 75 65 2c 62 2c 63 29 3b 0a 20 20 20 20 49  ique,b,c);.    I
2750: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2760: 4c 55 45 53 28 31 2c 32 2c 33 29 3b 0a 20 20 20  LUES(1,2,3);.   
2770: 20 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49   BEGIN TRANSACTI
2780: 4f 4e 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  ON;.    DROP TAB
2790: 4c 45 20 74 31 3b 0a 20 20 20 20 43 52 45 41 54  LE t1;.    CREAT
27a0: 45 20 54 41 42 4c 45 20 74 31 28 70 20 75 6e 69  E TABLE t1(p uni
27b0: 71 75 65 2c 71 2c 72 29 3b 0a 20 20 20 20 52 4f  que,q,r);.    RO
27c0: 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 53 45 4c 45  LLBACK;.    SELE
27d0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
27e0: 7d 0a 7d 20 7b 61 20 31 20 62 20 32 20 63 20 33  }.} {a 1 b 2 c 3
27f0: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d  }.do_test trans-
2800: 36 2e 31 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  6.11 {.  execsql
2810: 32 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 54 52  2 {.    BEGIN TR
2820: 41 4e 53 41 43 54 49 4f 4e 3b 0a 20 20 20 20 44  ANSACTION;.    D
2830: 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20  ROP TABLE t1;.  
2840: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2850: 31 28 70 20 75 6e 69 71 75 65 2c 71 2c 72 29 3b  1(p unique,q,r);
2860: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20  .    COMMIT;.   
2870: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2880: 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  1;.  }.} {}.do_t
2890: 65 73 74 20 74 72 61 6e 73 2d 36 2e 31 32 20 7b  est trans-6.12 {
28a0: 0a 20 20 65 78 65 63 73 71 6c 32 20 7b 0a 20 20  .  execsql2 {.  
28b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
28c0: 20 56 41 4c 55 45 53 28 31 2c 32 2c 33 29 3b 0a   VALUES(1,2,3);.
28d0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
28e0: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 70 20 31  M t1;.  }.} {p 1
28f0: 20 71 20 32 20 72 20 33 7d 0a 64 6f 5f 74 65 73   q 2 r 3}.do_tes
2900: 74 20 74 72 61 6e 73 2d 36 2e 31 33 20 7b 0a 20  t trans-6.13 {. 
2910: 20 65 78 65 63 73 71 6c 32 20 7b 0a 20 20 20 20   execsql2 {.    
2920: 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f  BEGIN TRANSACTIO
2930: 4e 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c  N;.    DROP TABL
2940: 45 20 74 31 3b 0a 20 20 20 20 43 52 45 41 54 45  E t1;.    CREATE
2950: 20 54 41 42 4c 45 20 74 31 28 61 20 75 6e 69 71   TABLE t1(a uniq
2960: 75 65 2c 62 2c 63 29 3b 0a 20 20 20 20 49 4e 53  ue,b,c);.    INS
2970: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2980: 45 53 28 34 2c 35 2c 36 29 3b 0a 20 20 20 20 53  ES(4,5,6);.    S
2990: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
29a0: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
29b0: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20 34 20 62  t1;.  }.} {a 4 b
29c0: 20 35 20 63 20 36 7d 0a 64 6f 5f 74 65 73 74 20   5 c 6}.do_test 
29d0: 74 72 61 6e 73 2d 36 2e 31 34 20 7b 0a 20 20 65  trans-6.14 {.  e
29e0: 78 65 63 73 71 6c 32 20 7b 0a 20 20 20 20 52 4f  xecsql2 {.    RO
29f0: 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 53 45 4c 45  LLBACK;.    SELE
2a00: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
2a10: 7d 0a 7d 20 7b 70 20 31 20 71 20 32 20 72 20 33  }.} {p 1 q 2 r 3
2a20: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d  }.do_test trans-
2a30: 36 2e 31 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  6.15 {.  execsql
2a40: 32 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 54 52  2 {.    BEGIN TR
2a50: 41 4e 53 41 43 54 49 4f 4e 3b 0a 20 20 20 20 44  ANSACTION;.    D
2a60: 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20  ROP TABLE t1;.  
2a70: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2a80: 31 28 61 20 75 6e 69 71 75 65 2c 62 2c 63 29 3b  1(a unique,b,c);
2a90: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2aa0: 20 74 31 20 56 41 4c 55 45 53 28 34 2c 35 2c 36   t1 VALUES(4,5,6
2ab0: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  );.    SELECT * 
2ac0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 44 52 4f  FROM t1;.    DRO
2ad0: 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 7d 0a  P TABLE t1;.  }.
2ae0: 7d 20 7b 61 20 34 20 62 20 35 20 63 20 36 7d 0a  } {a 4 b 5 c 6}.
2af0: 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d 36 2e  do_test trans-6.
2b00: 31 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  16 {.  catchsql 
2b10: 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  {.    COMMIT;.  
2b20: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2b30: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f  t1;.  }.} {1 {no
2b40: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 74 31 7d   such table: t1}
2b50: 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73  }..do_test trans
2b60: 2d 36 2e 32 30 20 7b 0a 20 20 65 78 65 63 73 71  -6.20 {.  execsq
2b70: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
2b80: 41 42 4c 45 20 74 31 28 61 20 69 6e 74 65 67 65  ABLE t1(a intege
2b90: 72 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 62 2c  r primary key,b,
2ba0: 63 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  c);.    INSERT I
2bb0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
2bc0: 2d 32 2c 2d 33 29 3b 0a 20 20 20 20 49 4e 53 45  -2,-3);.    INSE
2bd0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
2be0: 53 28 34 2c 2d 35 2c 2d 36 29 3b 0a 20 20 20 20  S(4,-5,-6);.    
2bf0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2c00: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 2d 32 20 2d 33  ;.  }.} {1 -2 -3
2c10: 20 34 20 2d 35 20 2d 36 7d 0a 64 6f 5f 74 65 73   4 -5 -6}.do_tes
2c20: 74 20 74 72 61 6e 73 2d 36 2e 32 31 20 7b 0a 20  t trans-6.21 {. 
2c30: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
2c40: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
2c50: 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 53 45 4c  N t1(b);.    SEL
2c60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
2c70: 45 52 45 20 62 3c 31 3b 0a 20 20 7d 0a 7d 20 7b  ERE b<1;.  }.} {
2c80: 34 20 2d 35 20 2d 36 20 31 20 2d 32 20 2d 33 7d  4 -5 -6 1 -2 -3}
2c90: 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d 36  .do_test trans-6
2ca0: 2e 32 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .22 {.  execsql 
2cb0: 7b 0a 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e  {.    BEGIN TRAN
2cc0: 53 41 43 54 49 4f 4e 3b 0a 20 20 20 20 44 52 4f  SACTION;.    DRO
2cd0: 50 20 49 4e 44 45 58 20 69 31 3b 0a 20 20 20 20  P INDEX i1;.    
2ce0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2cf0: 20 57 48 45 52 45 20 62 3c 31 3b 0a 20 20 20 20   WHERE b<1;.    
2d00: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20  ROLLBACK;.  }.} 
2d10: 7b 31 20 2d 32 20 2d 33 20 34 20 2d 35 20 2d 36  {1 -2 -3 4 -5 -6
2d20: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d  }.do_test trans-
2d30: 36 2e 32 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  6.23 {.  execsql
2d40: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
2d50: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3c  FROM t1 WHERE b<
2d60: 31 3b 0a 20 20 7d 0a 7d 20 7b 34 20 2d 35 20 2d  1;.  }.} {4 -5 -
2d70: 36 20 31 20 2d 32 20 2d 33 7d 0a 64 6f 5f 74 65  6 1 -2 -3}.do_te
2d80: 73 74 20 74 72 61 6e 73 2d 36 2e 32 34 20 7b 0a  st trans-6.24 {.
2d90: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2da0: 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f  BEGIN TRANSACTIO
2db0: 4e 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c  N;.    DROP TABL
2dc0: 45 20 74 31 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  E t1;.    ROLLBA
2dd0: 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  CK;.    SELECT *
2de0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
2df0: 3c 31 3b 0a 20 20 7d 0a 7d 20 7b 34 20 2d 35 20  <1;.  }.} {4 -5 
2e00: 2d 36 20 31 20 2d 32 20 2d 33 7d 0a 0a 64 6f 5f  -6 1 -2 -3}..do_
2e10: 74 65 73 74 20 74 72 61 6e 73 2d 36 2e 32 35 20  test trans-6.25 
2e20: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2e30: 20 20 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54    BEGIN TRANSACT
2e40: 49 4f 4e 3b 0a 20 20 20 20 44 52 4f 50 20 49 4e  ION;.    DROP IN
2e50: 44 45 58 20 69 31 3b 0a 20 20 20 20 43 52 45 41  DEX i1;.    CREA
2e60: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
2e70: 31 28 63 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  1(c);.    SELECT
2e80: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
2e90: 20 62 3c 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 2d   b<1;.  }.} {1 -
2ea0: 32 20 2d 33 20 34 20 2d 35 20 2d 36 7d 0a 64 6f  2 -3 4 -5 -6}.do
2eb0: 5f 74 65 73 74 20 74 72 61 6e 73 2d 36 2e 32 36  _test trans-6.26
2ec0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2ed0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2ee0: 20 74 31 20 57 48 45 52 45 20 63 3c 31 3b 0a 20   t1 WHERE c<1;. 
2ef0: 20 7d 0a 7d 20 7b 34 20 2d 35 20 2d 36 20 31 20   }.} {4 -5 -6 1 
2f00: 2d 32 20 2d 33 7d 0a 64 6f 5f 74 65 73 74 20 74  -2 -3}.do_test t
2f10: 72 61 6e 73 2d 36 2e 32 37 20 7b 0a 20 20 65 78  rans-6.27 {.  ex
2f20: 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c  ecsql {.    ROLL
2f30: 42 41 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43 54  BACK;.    SELECT
2f40: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
2f50: 20 62 3c 31 3b 0a 20 20 7d 0a 7d 20 7b 34 20 2d   b<1;.  }.} {4 -
2f60: 35 20 2d 36 20 31 20 2d 32 20 2d 33 7d 0a 64 6f  5 -6 1 -2 -3}.do
2f70: 5f 74 65 73 74 20 74 72 61 6e 73 2d 36 2e 32 38  _test trans-6.28
2f80: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2f90: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2fa0: 20 74 31 20 57 48 45 52 45 20 63 3c 31 3b 0a 20   t1 WHERE c<1;. 
2fb0: 20 7d 0a 7d 20 7b 31 20 2d 32 20 2d 33 20 34 20   }.} {1 -2 -3 4 
2fc0: 2d 35 20 2d 36 7d 0a 0a 23 20 54 68 65 20 66 6f  -5 -6}..# The fo
2fd0: 6c 6c 6f 77 69 6e 67 20 72 65 70 65 61 74 73 20  llowing repeats 
2fe0: 73 74 65 70 73 20 36 2e 32 30 20 74 68 72 6f 75  steps 6.20 throu
2ff0: 67 68 20 36 2e 32 38 2c 20 62 75 74 20 70 75 74  gh 6.28, but put
3000: 73 20 61 20 22 75 6e 69 71 75 65 22 0a 23 20 63  s a "unique".# c
3010: 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 20 66 69  onstraint the fi
3020: 72 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  rst field of the
3030: 20 74 61 62 6c 65 20 69 6e 20 6f 72 64 65 72 20   table in order 
3040: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 0a 23  to generate an.#
3050: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
3060: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e  ..#.do_test tran
3070: 73 2d 36 2e 33 30 20 7b 0a 20 20 65 78 65 63 73  s-6.30 {.  execs
3080: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 54  ql {.    BEGIN T
3090: 52 41 4e 53 41 43 54 49 4f 4e 3b 0a 20 20 20 20  RANSACTION;.    
30a0: 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20  DROP TABLE t1;. 
30b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
30c0: 74 31 28 61 20 69 6e 74 20 75 6e 69 71 75 65 2c  t1(a int unique,
30d0: 62 2c 63 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  b,c);.    COMMIT
30e0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
30f0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 2d 32  O t1 VALUES(1,-2
3100: 2c 2d 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ,-3);.    INSERT
3110: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
3120: 34 2c 2d 35 2c 2d 36 29 3b 0a 20 20 20 20 53 45  4,-5,-6);.    SE
3130: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f  LECT * FROM t1 O
3140: 52 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d  RDER BY a;.  }.}
3150: 20 7b 31 20 2d 32 20 2d 33 20 34 20 2d 35 20 2d   {1 -2 -3 4 -5 -
3160: 36 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73  6}.do_test trans
3170: 2d 36 2e 33 31 20 7b 0a 20 20 65 78 65 63 73 71  -6.31 {.  execsq
3180: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 49  l {.    CREATE I
3190: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 29  NDEX i1 ON t1(b)
31a0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
31b0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3c 31  ROM t1 WHERE b<1
31c0: 3b 0a 20 20 7d 0a 7d 20 7b 34 20 2d 35 20 2d 36  ;.  }.} {4 -5 -6
31d0: 20 31 20 2d 32 20 2d 33 7d 0a 64 6f 5f 74 65 73   1 -2 -3}.do_tes
31e0: 74 20 74 72 61 6e 73 2d 36 2e 33 32 20 7b 0a 20  t trans-6.32 {. 
31f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
3200: 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e  EGIN TRANSACTION
3210: 3b 0a 20 20 20 20 44 52 4f 50 20 49 4e 44 45 58  ;.    DROP INDEX
3220: 20 69 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   i1;.    SELECT 
3230: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
3240: 62 3c 31 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43  b<1;.    ROLLBAC
3250: 4b 3b 0a 20 20 7d 0a 7d 20 7b 31 20 2d 32 20 2d  K;.  }.} {1 -2 -
3260: 33 20 34 20 2d 35 20 2d 36 7d 0a 64 6f 5f 74 65  3 4 -5 -6}.do_te
3270: 73 74 20 74 72 61 6e 73 2d 36 2e 33 33 20 7b 0a  st trans-6.33 {.
3280: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3290: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
32a0: 20 57 48 45 52 45 20 62 3c 31 3b 0a 20 20 7d 0a   WHERE b<1;.  }.
32b0: 7d 20 7b 34 20 2d 35 20 2d 36 20 31 20 2d 32 20  } {4 -5 -6 1 -2 
32c0: 2d 33 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e  -3}.do_test tran
32d0: 73 2d 36 2e 33 34 20 7b 0a 20 20 65 78 65 63 73  s-6.34 {.  execs
32e0: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 54  ql {.    BEGIN T
32f0: 52 41 4e 53 41 43 54 49 4f 4e 3b 0a 20 20 20 20  RANSACTION;.    
3300: 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20  DROP TABLE t1;. 
3310: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20     ROLLBACK;.   
3320: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3330: 31 20 57 48 45 52 45 20 62 3c 31 3b 0a 20 20 7d  1 WHERE b<1;.  }
3340: 0a 7d 20 7b 34 20 2d 35 20 2d 36 20 31 20 2d 32  .} {4 -5 -6 1 -2
3350: 20 2d 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72   -3}..do_test tr
3360: 61 6e 73 2d 36 2e 33 35 20 7b 0a 20 20 65 78 65  ans-6.35 {.  exe
3370: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
3380: 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 0a 20 20   TRANSACTION;.  
3390: 20 20 44 52 4f 50 20 49 4e 44 45 58 20 69 31 3b    DROP INDEX i1;
33a0: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
33b0: 58 20 69 31 20 4f 4e 20 74 31 28 63 29 3b 0a 20  X i1 ON t1(c);. 
33c0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
33d0: 20 74 31 20 57 48 45 52 45 20 62 3c 31 3b 0a 20   t1 WHERE b<1;. 
33e0: 20 7d 0a 7d 20 7b 31 20 2d 32 20 2d 33 20 34 20   }.} {1 -2 -3 4 
33f0: 2d 35 20 2d 36 7d 0a 64 6f 5f 74 65 73 74 20 74  -5 -6}.do_test t
3400: 72 61 6e 73 2d 36 2e 33 36 20 7b 0a 20 20 65 78  rans-6.36 {.  ex
3410: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
3420: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
3430: 52 45 20 63 3c 31 3b 0a 20 20 7d 0a 7d 20 7b 34  RE c<1;.  }.} {4
3440: 20 2d 35 20 2d 36 20 31 20 2d 32 20 2d 33 7d 0a   -5 -6 1 -2 -3}.
3450: 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d 36 2e  do_test trans-6.
3460: 33 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  37 {.  execsql {
3470: 0a 20 20 20 20 44 52 4f 50 20 49 4e 44 45 58 20  .    DROP INDEX 
3480: 69 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  i1;.    SELECT *
3490: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 63   FROM t1 WHERE c
34a0: 3c 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 2d 32 20  <1;.  }.} {1 -2 
34b0: 2d 33 20 34 20 2d 35 20 2d 36 7d 0a 64 6f 5f 74  -3 4 -5 -6}.do_t
34c0: 65 73 74 20 74 72 61 6e 73 2d 36 2e 33 38 20 7b  est trans-6.38 {
34d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
34e0: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 53   ROLLBACK;.    S
34f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
3500: 57 48 45 52 45 20 62 3c 31 3b 0a 20 20 7d 0a 7d  WHERE b<1;.  }.}
3510: 20 7b 34 20 2d 35 20 2d 36 20 31 20 2d 32 20 2d   {4 -5 -6 1 -2 -
3520: 33 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73  3}.do_test trans
3530: 2d 36 2e 33 39 20 7b 0a 20 20 65 78 65 63 73 71  -6.39 {.  execsq
3540: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
3550: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 63   FROM t1 WHERE c
3560: 3c 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 2d 32 20  <1;.  }.} {1 -2 
3570: 2d 33 20 34 20 2d 35 20 2d 36 7d 0a 69 6e 74 65  -3 4 -5 -6}.inte
3580: 67 72 69 74 79 5f 63 68 65 63 6b 20 74 72 61 6e  grity_check tran
3590: 73 2d 36 2e 34 30 0a 0a 23 20 54 65 73 74 20 74  s-6.40..# Test t
35a0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 72 6f 6c 6c  o make sure roll
35b0: 62 61 63 6b 20 72 65 73 74 6f 72 65 73 20 74 68  back restores th
35c0: 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20  e database back 
35d0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
35e0: 23 20 73 74 61 74 65 2e 0a 23 0a 64 6f 5f 74 65  # state..#.do_te
35f0: 73 74 20 74 72 61 6e 73 2d 37 2e 31 20 7b 0a 20  st trans-7.1 {. 
3600: 20 65 78 65 63 73 71 6c 20 7b 42 45 47 49 4e 7d   execsql {BEGIN}
3610: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d  .  for {set i 0}
3620: 20 7b 24 69 3c 31 30 30 30 7d 20 7b 69 6e 63 72   {$i<1000} {incr
3630: 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 31   i} {.    set r1
3640: 20 5b 65 78 70 72 20 7b 72 61 6e 64 28 29 7d 5d   [expr {rand()}]
3650: 0a 20 20 20 20 73 65 74 20 72 32 20 5b 65 78 70  .    set r2 [exp
3660: 72 20 7b 72 61 6e 64 28 29 7d 5d 0a 20 20 20 20  r {rand()}].    
3670: 73 65 74 20 72 33 20 5b 65 78 70 72 20 7b 72 61  set r3 [expr {ra
3680: 6e 64 28 29 7d 5d 0a 20 20 20 20 65 78 65 63 73  nd()}].    execs
3690: 71 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  ql "INSERT INTO 
36a0: 74 32 20 56 41 4c 55 45 53 28 24 72 31 2c 24 72  t2 VALUES($r1,$r
36b0: 32 2c 24 72 33 29 22 0a 20 20 7d 0a 20 20 65 78  2,$r3)".  }.  ex
36c0: 65 63 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d 0a 20  ecsql {COMMIT}. 
36d0: 20 73 65 74 20 3a 3a 63 68 65 63 6b 73 75 6d 20   set ::checksum 
36e0: 5b 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54  [execsql {SELECT
36f0: 20 6d 64 35 73 75 6d 28 78 2c 79 2c 7a 29 20 46   md5sum(x,y,z) F
3700: 52 4f 4d 20 74 32 7d 5d 0a 20 20 73 65 74 20 3a  ROM t2}].  set :
3710: 3a 63 68 65 63 6b 73 75 6d 32 20 5b 0a 20 20 20  :checksum2 [.   
3720: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
3730: 20 6d 64 35 73 75 6d 28 74 79 70 65 2c 6e 61 6d   md5sum(type,nam
3740: 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70  e,tbl_name,rootp
3750: 61 67 65 2c 73 71 6c 29 20 46 52 4f 4d 20 73 71  age,sql) FROM sq
3760: 6c 69 74 65 5f 6d 61 73 74 65 72 7d 0a 20 20 5d  lite_master}.  ]
3770: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
3780: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
3790: 20 74 32 7d 0a 7d 20 7b 31 30 30 31 7d 0a 64 6f   t2}.} {1001}.do
37a0: 5f 74 65 73 74 20 74 72 61 6e 73 2d 37 2e 32 20  _test trans-7.2 
37b0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
37c0: 45 43 54 20 6d 64 35 73 75 6d 28 78 2c 79 2c 7a  ECT md5sum(x,y,z
37d0: 29 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 24 63 68  ) FROM t2}.} $ch
37e0: 65 63 6b 73 75 6d 0a 64 6f 5f 74 65 73 74 20 74  ecksum.do_test t
37f0: 72 61 6e 73 2d 37 2e 32 2e 31 20 7b 0a 20 20 65  rans-7.2.1 {.  e
3800: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6d  xecsql {SELECT m
3810: 64 35 73 75 6d 28 74 79 70 65 2c 6e 61 6d 65 2c  d5sum(type,name,
3820: 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67  tbl_name,rootpag
3830: 65 2c 73 71 6c 29 20 46 52 4f 4d 20 73 71 6c 69  e,sql) FROM sqli
3840: 74 65 5f 6d 61 73 74 65 72 7d 0a 7d 20 24 63 68  te_master}.} $ch
3850: 65 63 6b 73 75 6d 32 0a 64 6f 5f 74 65 73 74 20  ecksum2.do_test 
3860: 74 72 61 6e 73 2d 37 2e 33 20 7b 0a 20 20 65 78  trans-7.3 {.  ex
3870: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
3880: 4e 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  N;.    DELETE FR
3890: 4f 4d 20 74 32 3b 0a 20 20 20 20 52 4f 4c 4c 42  OM t2;.    ROLLB
38a0: 41 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  ACK;.    SELECT 
38b0: 6d 64 35 73 75 6d 28 78 2c 79 2c 7a 29 20 46 52  md5sum(x,y,z) FR
38c0: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 24 63 68  OM t2;.  }.} $ch
38d0: 65 63 6b 73 75 6d 0a 64 6f 5f 74 65 73 74 20 74  ecksum.do_test t
38e0: 72 61 6e 73 2d 37 2e 34 20 7b 0a 20 20 65 78 65  rans-7.4 {.  exe
38f0: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
3900: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
3910: 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52  O t2 SELECT * FR
3920: 4f 4d 20 74 32 3b 0a 20 20 20 20 52 4f 4c 4c 42  OM t2;.    ROLLB
3930: 41 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  ACK;.    SELECT 
3940: 6d 64 35 73 75 6d 28 78 2c 79 2c 7a 29 20 46 52  md5sum(x,y,z) FR
3950: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 24 63 68  OM t2;.  }.} $ch
3960: 65 63 6b 73 75 6d 0a 64 6f 5f 74 65 73 74 20 74  ecksum.do_test t
3970: 72 61 6e 73 2d 37 2e 35 20 7b 0a 20 20 65 78 65  rans-7.5 {.  exe
3980: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
3990: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
39a0: 4d 20 74 32 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  M t2;.    ROLLBA
39b0: 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6d  CK;.    SELECT m
39c0: 64 35 73 75 6d 28 78 2c 79 2c 7a 29 20 46 52 4f  d5sum(x,y,z) FRO
39d0: 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 24 63 68 65  M t2;.  }.} $che
39e0: 63 6b 73 75 6d 0a 64 6f 5f 74 65 73 74 20 74 72  cksum.do_test tr
39f0: 61 6e 73 2d 37 2e 36 20 7b 0a 20 20 65 78 65 63  ans-7.6 {.  exec
3a00: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
3a10: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3a20: 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t2 SELECT * FRO
3a30: 4d 20 74 32 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  M t2;.    ROLLBA
3a40: 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6d  CK;.    SELECT m
3a50: 64 35 73 75 6d 28 78 2c 79 2c 7a 29 20 46 52 4f  d5sum(x,y,z) FRO
3a60: 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 24 63 68 65  M t2;.  }.} $che
3a70: 63 6b 73 75 6d 0a 64 6f 5f 74 65 73 74 20 74 72  cksum.do_test tr
3a80: 61 6e 73 2d 37 2e 37 20 7b 0a 20 20 65 78 65 63  ans-7.7 {.  exec
3a90: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
3aa0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3ab0: 45 20 74 33 20 41 53 20 53 45 4c 45 43 54 20 2a  E t3 AS SELECT *
3ac0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e   FROM t2;.    IN
3ad0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
3ae0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20  ECT * FROM t3;. 
3af0: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20     ROLLBACK;.   
3b00: 20 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 78   SELECT md5sum(x
3b10: 2c 79 2c 7a 29 20 46 52 4f 4d 20 74 32 3b 0a 20  ,y,z) FROM t2;. 
3b20: 20 7d 0a 7d 20 24 63 68 65 63 6b 73 75 6d 0a 64   }.} $checksum.d
3b30: 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d 37 2e 38  o_test trans-7.8
3b40: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
3b50: 4c 45 43 54 20 6d 64 35 73 75 6d 28 74 79 70 65  LECT md5sum(type
3b60: 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72  ,name,tbl_name,r
3b70: 6f 6f 74 70 61 67 65 2c 73 71 6c 29 20 46 52 4f  ootpage,sql) FRO
3b80: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d  M sqlite_master}
3b90: 0a 7d 20 24 63 68 65 63 6b 73 75 6d 32 0a 69 66  .} $checksum2.if
3ba0: 63 61 70 61 62 6c 65 20 74 65 6d 70 64 62 20 7b  capable tempdb {
3bb0: 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 61 6e 73  .  do_test trans
3bc0: 2d 37 2e 39 20 7b 0a 20 20 20 20 65 78 65 63 73  -7.9 {.    execs
3bd0: 71 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e  ql {.      BEGIN
3be0: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
3bf0: 45 4d 50 20 54 41 42 4c 45 20 74 33 20 41 53 20  EMP TABLE t3 AS 
3c00: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
3c10: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3c20: 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20  NTO t2 SELECT * 
3c30: 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 20 20 52  FROM t3;.      R
3c40: 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 53  OLLBACK;.      S
3c50: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 78 2c 79  ELECT md5sum(x,y
3c60: 2c 7a 29 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  ,z) FROM t2;.   
3c70: 20 7d 0a 20 20 7d 20 24 63 68 65 63 6b 73 75 6d   }.  } $checksum
3c80: 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73  .}.do_test trans
3c90: 2d 37 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71  -7.10 {.  execsq
3ca0: 6c 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d  l {SELECT md5sum
3cb0: 28 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e  (type,name,tbl_n
3cc0: 61 6d 65 2c 72 6f 6f 74 70 61 67 65 2c 73 71 6c  ame,rootpage,sql
3cd0: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
3ce0: 73 74 65 72 7d 0a 7d 20 24 63 68 65 63 6b 73 75  ster}.} $checksu
3cf0: 6d 32 0a 69 66 63 61 70 61 62 6c 65 20 74 65 6d  m2.ifcapable tem
3d00: 70 64 62 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  pdb {.  do_test 
3d10: 74 72 61 6e 73 2d 37 2e 31 31 20 7b 0a 20 20 20  trans-7.11 {.   
3d20: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
3d30: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52   BEGIN;.      CR
3d40: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
3d50: 74 33 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  t3 AS SELECT * F
3d60: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20 20 49 4e  ROM t2;.      IN
3d70: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
3d80: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20  ECT * FROM t3;. 
3d90: 20 20 20 20 20 44 52 4f 50 20 49 4e 44 45 58 20       DROP INDEX 
3da0: 69 32 78 3b 0a 20 20 20 20 20 20 44 52 4f 50 20  i2x;.      DROP 
3db0: 49 4e 44 45 58 20 69 32 79 3b 0a 20 20 20 20 20  INDEX i2y;.     
3dc0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33   CREATE INDEX i3
3dd0: 61 20 4f 4e 20 74 33 28 78 29 3b 0a 20 20 20 20  a ON t3(x);.    
3de0: 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20    ROLLBACK;.    
3df0: 20 20 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28    SELECT md5sum(
3e00: 78 2c 79 2c 7a 29 20 46 52 4f 4d 20 74 32 3b 0a  x,y,z) FROM t2;.
3e10: 20 20 20 20 7d 0a 20 20 7d 20 24 63 68 65 63 6b      }.  } $check
3e20: 73 75 6d 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 72  sum.}.do_test tr
3e30: 61 6e 73 2d 37 2e 31 32 20 7b 0a 20 20 65 78 65  ans-7.12 {.  exe
3e40: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6d 64 35  csql {SELECT md5
3e50: 73 75 6d 28 74 79 70 65 2c 6e 61 6d 65 2c 74 62  sum(type,name,tb
3e60: 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67 65 2c  l_name,rootpage,
3e70: 73 71 6c 29 20 46 52 4f 4d 20 73 71 6c 69 74 65  sql) FROM sqlite
3e80: 5f 6d 61 73 74 65 72 7d 0a 7d 20 24 63 68 65 63  _master}.} $chec
3e90: 6b 73 75 6d 32 0a 69 66 63 61 70 61 62 6c 65 20  ksum2.ifcapable 
3ea0: 74 65 6d 70 64 62 20 7b 0a 20 20 64 6f 5f 74 65  tempdb {.  do_te
3eb0: 73 74 20 74 72 61 6e 73 2d 37 2e 31 33 20 7b 0a  st trans-7.13 {.
3ec0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
3ed0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
3ee0: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a   DROP TABLE t2;.
3ef0: 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a        ROLLBACK;.
3f00: 20 20 20 20 20 20 53 45 4c 45 43 54 20 6d 64 35        SELECT md5
3f10: 73 75 6d 28 78 2c 79 2c 7a 29 20 46 52 4f 4d 20  sum(x,y,z) FROM 
3f20: 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 24 63  t2;.    }.  } $c
3f30: 68 65 63 6b 73 75 6d 0a 7d 0a 64 6f 5f 74 65 73  hecksum.}.do_tes
3f40: 74 20 74 72 61 6e 73 2d 37 2e 31 34 20 7b 0a 20  t trans-7.14 {. 
3f50: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
3f60: 20 6d 64 35 73 75 6d 28 74 79 70 65 2c 6e 61 6d   md5sum(type,nam
3f70: 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70  e,tbl_name,rootp
3f80: 61 67 65 2c 73 71 6c 29 20 46 52 4f 4d 20 73 71  age,sql) FROM sq
3f90: 6c 69 74 65 5f 6d 61 73 74 65 72 7d 0a 7d 20 24  lite_master}.} $
3fa0: 63 68 65 63 6b 73 75 6d 32 0a 69 6e 74 65 67 72  checksum2.integr
3fb0: 69 74 79 5f 63 68 65 63 6b 20 74 72 61 6e 73 2d  ity_check trans-
3fc0: 37 2e 31 35 0a 0a 23 20 41 72 72 61 6e 67 65 20  7.15..# Arrange 
3fd0: 66 6f 72 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  for another proc
3fe0: 65 73 73 20 74 6f 20 62 65 67 69 6e 20 6d 6f 64  ess to begin mod
3ff0: 69 66 79 69 6e 67 20 74 68 65 20 64 61 74 61 62  ifying the datab
4000: 61 73 65 20 62 75 74 20 61 62 6f 72 74 0a 23 20  ase but abort.# 
4010: 61 6e 64 20 64 69 65 20 69 6e 20 74 68 65 20 6d  and die in the m
4020: 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6d 6f 64  iddle of the mod
4030: 69 66 69 63 61 74 69 6f 6e 2e 20 20 54 68 65 6e  ification.  Then
4040: 20 68 61 76 65 20 74 68 69 73 20 70 72 6f 63 65   have this proce
4050: 73 73 20 72 65 61 64 0a 23 20 74 68 65 20 64 61  ss read.# the da
4060: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 70 72  tabase.  This pr
4070: 6f 63 65 73 73 20 73 68 6f 75 6c 64 20 64 65 74  ocess should det
4080: 65 63 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ect the journal 
4090: 66 69 6c 65 20 61 6e 64 20 72 6f 6c 6c 20 69 74  file and roll it
40a0: 0a 23 20 62 61 63 6b 2e 20 20 56 65 72 69 66 79  .# back.  Verify
40b0: 20 74 68 61 74 20 74 68 69 73 20 68 61 70 70 65   that this happe
40c0: 6e 73 20 63 6f 72 72 65 63 74 6c 79 2e 0a 23 0a  ns correctly..#.
40d0: 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65 73  set fd [open tes
40e0: 74 2e 74 63 6c 20 77 5d 0a 70 75 74 73 20 24 66  t.tcl w].puts $f
40f0: 64 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  d {.  sqlite3 db
4100: 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20 65 76   test.db.  db ev
4110: 61 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  al {.    PRAGMA 
4120: 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69  default_cache_si
4130: 7a 65 3d 32 30 3b 0a 20 20 20 20 42 45 47 49 4e  ze=20;.    BEGIN
4140: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
4150: 4c 45 20 74 33 20 41 53 20 53 45 4c 45 43 54 20  LE t3 AS SELECT 
4160: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 44  * FROM t2;.    D
4170: 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20  ELETE FROM t2;. 
4180: 20 7d 0a 20 20 73 71 6c 69 74 65 5f 61 62 6f 72   }.  sqlite_abor
4190: 74 0a 7d 0a 63 6c 6f 73 65 20 24 66 64 0a 64 6f  t.}.close $fd.do
41a0: 5f 74 65 73 74 20 74 72 61 6e 73 2d 38 2e 31 20  _test trans-8.1 
41b0: 7b 0a 20 20 63 61 74 63 68 20 7b 65 78 65 63 20  {.  catch {exec 
41c0: 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66 65 78 65 63  [info nameofexec
41d0: 5d 20 74 65 73 74 2e 74 63 6c 7d 0a 20 20 65 78  ] test.tcl}.  ex
41e0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6d 64  ecsql {SELECT md
41f0: 35 73 75 6d 28 78 2c 79 2c 7a 29 20 46 52 4f 4d  5sum(x,y,z) FROM
4200: 20 74 32 7d 0a 7d 20 24 63 68 65 63 6b 73 75 6d   t2}.} $checksum
4210: 0a 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d 38  .do_test trans-8
4220: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
4230: 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 74 79  SELECT md5sum(ty
4240: 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65  pe,name,tbl_name
4250: 2c 72 6f 6f 74 70 61 67 65 2c 73 71 6c 29 20 46  ,rootpage,sql) F
4260: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
4270: 72 7d 0a 7d 20 24 63 68 65 63 6b 73 75 6d 32 0a  r}.} $checksum2.
4280: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
4290: 74 72 61 6e 73 2d 38 2e 33 0a 73 65 74 20 66 64  trans-8.3.set fd
42a0: 20 5b 6f 70 65 6e 20 74 65 73 74 2e 74 63 6c 20   [open test.tcl 
42b0: 77 5d 0a 70 75 74 73 20 24 66 64 20 7b 0a 20 20  w].puts $fd {.  
42c0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
42d0: 64 62 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20  db.  db eval {. 
42e0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
42f0: 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 3b 0a  l_mode=persist;.
4300: 20 20 20 20 50 52 41 47 4d 41 20 64 65 66 61 75      PRAGMA defau
4310: 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 3d 32 30  lt_cache_size=20
4320: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
4330: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
4340: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
4350: 4d 20 74 32 3b 0a 20 20 20 20 44 45 4c 45 54 45  M t2;.    DELETE
4360: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 20 20   FROM t2;.  }.  
4370: 73 71 6c 69 74 65 5f 61 62 6f 72 74 0a 7d 0a 63  sqlite_abort.}.c
4380: 6c 6f 73 65 20 24 66 64 0a 64 6f 5f 74 65 73 74  lose $fd.do_test
4390: 20 74 72 61 6e 73 2d 38 2e 34 20 7b 0a 20 20 63   trans-8.4 {.  c
43a0: 61 74 63 68 20 7b 65 78 65 63 20 5b 69 6e 66 6f  atch {exec [info
43b0: 20 6e 61 6d 65 6f 66 65 78 65 63 5d 20 74 65 73   nameofexec] tes
43c0: 74 2e 74 63 6c 7d 0a 20 20 65 78 65 63 73 71 6c  t.tcl}.  execsql
43d0: 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28   {SELECT md5sum(
43e0: 78 2c 79 2c 7a 29 20 46 52 4f 4d 20 74 32 7d 0a  x,y,z) FROM t2}.
43f0: 7d 20 24 63 68 65 63 6b 73 75 6d 0a 64 6f 5f 74  } $checksum.do_t
4400: 65 73 74 20 74 72 61 6e 73 2d 38 2e 35 20 7b 0a  est trans-8.5 {.
4410: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
4420: 54 20 6d 64 35 73 75 6d 28 74 79 70 65 2c 6e 61  T md5sum(type,na
4430: 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74  me,tbl_name,root
4440: 70 61 67 65 2c 73 71 6c 29 20 46 52 4f 4d 20 73  page,sql) FROM s
4450: 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 0a 7d 20  qlite_master}.} 
4460: 24 63 68 65 63 6b 73 75 6d 32 0a 69 6e 74 65 67  $checksum2.integ
4470: 72 69 74 79 5f 63 68 65 63 6b 20 74 72 61 6e 73  rity_check trans
4480: 2d 38 2e 36 0a 0a 23 20 49 6e 20 74 68 65 20 66  -8.6..# In the f
4490: 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63  ollowing sequenc
44a0: 65 20 6f 66 20 74 65 73 74 73 2c 20 63 6f 6d 70  e of tests, comp
44b0: 75 74 65 20 74 68 65 20 4d 44 35 20 73 75 6d 20  ute the MD5 sum 
44c0: 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 23  of the content.#
44d0: 20 6f 66 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b   of a table, mak
44e0: 65 20 6c 6f 74 73 20 6f 66 20 6d 6f 64 69 66 69  e lots of modifi
44f0: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74 20  cations to that 
4500: 74 61 62 6c 65 2c 20 74 68 65 6e 20 64 6f 20 61  table, then do a
4510: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20 56 65 72   rollback..# Ver
4520: 69 66 79 20 74 68 61 74 20 61 66 74 65 72 20 74  ify that after t
4530: 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  he rollback, the
4540: 20 4d 44 35 20 63 68 65 63 6b 73 75 6d 20 69 73   MD5 checksum is
4550: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 23 0a 64 6f   unchanged..#.do
4560: 5f 74 65 73 74 20 74 72 61 6e 73 2d 39 2e 31 20  _test trans-9.1 
4570: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
4580: 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74    PRAGMA default
4590: 5f 63 61 63 68 65 5f 73 69 7a 65 3d 31 30 3b 0a  _cache_size=10;.
45a0: 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20    }.  db close. 
45b0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
45c0: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
45d0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43      BEGIN;.    C
45e0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 78  REATE TABLE t3(x
45f0: 20 54 45 58 54 29 3b 0a 20 20 20 20 49 4e 53 45   TEXT);.    INSE
4600: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
4610: 53 28 72 61 6e 64 73 74 72 28 31 30 2c 34 30 30  S(randstr(10,400
4620: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
4630: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 72 61  NTO t3 VALUES(ra
4640: 6e 64 73 74 72 28 31 30 2c 34 30 30 29 29 3b 0a  ndstr(10,400));.
4650: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4660: 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64 73 74  t3 SELECT randst
4670: 72 28 31 30 2c 34 30 30 29 20 46 52 4f 4d 20 74  r(10,400) FROM t
4680: 33 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  3;.    INSERT IN
4690: 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e  TO t3 SELECT ran
46a0: 64 73 74 72 28 31 30 2c 34 30 30 29 20 46 52 4f  dstr(10,400) FRO
46b0: 4d 20 74 33 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t3;.    INSERT
46c0: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
46d0: 72 61 6e 64 73 74 72 28 31 30 2c 34 30 30 29 20  randstr(10,400) 
46e0: 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 49 4e 53  FROM t3;.    INS
46f0: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
4700: 43 54 20 72 61 6e 64 73 74 72 28 31 30 2c 34 30  CT randstr(10,40
4710: 30 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20  0) FROM t3;.    
4720: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53  INSERT INTO t3 S
4730: 45 4c 45 43 54 20 72 61 6e 64 73 74 72 28 31 30  ELECT randstr(10
4740: 2c 34 30 30 29 20 46 52 4f 4d 20 74 33 3b 0a 20  ,400) FROM t3;. 
4750: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4760: 33 20 53 45 4c 45 43 54 20 72 61 6e 64 73 74 72  3 SELECT randstr
4770: 28 31 30 2c 34 30 30 29 20 46 52 4f 4d 20 74 33  (10,400) FROM t3
4780: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4790: 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64  O t3 SELECT rand
47a0: 73 74 72 28 31 30 2c 34 30 30 29 20 46 52 4f 4d  str(10,400) FROM
47b0: 20 74 33 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t3;.    INSERT 
47c0: 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72  INTO t3 SELECT r
47d0: 61 6e 64 73 74 72 28 31 30 2c 34 30 30 29 20 46  andstr(10,400) F
47e0: 52 4f 4d 20 74 33 3b 0a 20 20 20 20 49 4e 53 45  ROM t3;.    INSE
47f0: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
4800: 54 20 72 61 6e 64 73 74 72 28 31 30 2c 34 30 30  T randstr(10,400
4810: 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 43  ) FROM t3;.    C
4820: 4f 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43  OMMIT;.    SELEC
4830: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
4840: 74 33 3b 0a 20 20 7d 0a 7d 20 7b 31 30 32 34 7d  t3;.  }.} {1024}
4850: 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ..# The followin
4860: 67 20 70 72 6f 63 65 64 75 72 65 20 63 6f 6d 70  g procedure comp
4870: 75 74 65 73 20 61 20 22 73 69 67 6e 61 74 75 72  utes a "signatur
4880: 65 22 20 66 6f 72 20 74 61 62 6c 65 20 22 74 33  e" for table "t3
4890: 22 2e 20 20 49 66 0a 23 20 54 33 20 63 68 61 6e  ".  If.# T3 chan
48a0: 67 65 73 20 69 6e 20 61 6e 79 20 77 61 79 2c 20  ges in any way, 
48b0: 74 68 65 20 73 69 67 6e 61 74 75 72 65 20 73 68  the signature sh
48c0: 6f 75 6c 64 20 63 68 61 6e 67 65 2e 20 20 0a 23  ould change.  .#
48d0: 0a 23 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .# This is used 
48e0: 74 6f 20 74 65 73 74 20 52 4f 4c 4c 42 41 43 4b  to test ROLLBACK
48f0: 2e 20 20 57 65 20 67 61 74 68 65 72 20 61 20 73  .  We gather a s
4900: 69 67 6e 61 74 75 72 65 20 66 6f 72 20 74 33 2c  ignature for t3,
4910: 20 74 68 65 6e 0a 23 20 6d 61 6b 65 20 6c 6f 74   then.# make lot
4920: 73 20 6f 66 20 63 68 61 6e 67 65 73 20 74 6f 20  s of changes to 
4930: 74 33 2c 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63  t3, then rollbac
4940: 6b 20 61 6e 64 20 74 61 6b 65 20 61 6e 6f 74 68  k and take anoth
4950: 65 72 20 73 69 67 6e 61 74 75 72 65 2e 0a 23 20  er signature..# 
4960: 54 68 65 20 74 77 6f 20 73 69 67 6e 61 74 75 72  The two signatur
4970: 65 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  es should be the
4980: 20 73 61 6d 65 2e 0a 23 0a 70 72 6f 63 20 73 69   same..#.proc si
4990: 67 6e 61 74 75 72 65 20 7b 7d 20 7b 0a 20 20 72  gnature {} {.  r
49a0: 65 74 75 72 6e 20 5b 64 62 20 65 76 61 6c 20 7b  eturn [db eval {
49b0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c  SELECT count(*),
49c0: 20 6d 64 35 73 75 6d 28 78 29 20 46 52 4f 4d 20   md5sum(x) FROM 
49d0: 74 33 7d 5d 0a 7d 0a 0a 23 20 52 65 70 65 61 74  t3}].}..# Repeat
49e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   the following g
49f0: 72 6f 75 70 20 6f 66 20 74 65 73 74 73 20 32 30  roup of tests 20
4a00: 20 74 69 6d 65 73 20 66 6f 72 20 71 75 69 63 6b   times for quick
4a10: 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 23 20 34   testing and.# 4
4a20: 30 20 74 69 6d 65 73 20 66 6f 72 20 66 75 6c 6c  0 times for full
4a30: 20 74 65 73 74 69 6e 67 2e 20 20 45 61 63 68 20   testing.  Each 
4a40: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
4a50: 20 74 65 73 74 20 6d 61 6b 65 73 20 74 61 62 6c   test makes tabl
4a60: 65 0a 23 20 74 33 20 61 20 6c 69 74 74 6c 65 20  e.# t3 a little 
4a70: 6c 61 72 67 65 72 2c 20 61 6e 64 20 74 68 75 73  larger, and thus
4a80: 20 74 61 6b 65 73 20 61 20 6c 69 74 74 6c 65 20   takes a little 
4a90: 6c 6f 6e 67 65 72 2c 20 73 6f 20 64 6f 69 6e 67  longer, so doing
4aa0: 20 34 30 20 74 65 73 74 73 0a 23 20 69 73 20 6d   40 tests.# is m
4ab0: 6f 72 65 20 74 68 61 6e 20 32 2e 30 20 74 69 6d  ore than 2.0 tim
4ac0: 65 73 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 64  es slower than d
4ad0: 6f 69 6e 67 20 32 30 20 74 65 73 74 73 2e 20 20  oing 20 tests.  
4ae0: 43 6f 6e 73 69 64 65 72 61 62 6c 79 20 6d 6f 72  Considerably mor
4af0: 65 2e 0a 23 0a 69 66 20 7b 5b 69 6e 66 6f 20 65  e..#.if {[info e
4b00: 78 69 73 74 73 20 49 53 51 55 49 43 4b 5d 7d 20  xists ISQUICK]} 
4b10: 7b 0a 20 20 73 65 74 20 6c 69 6d 69 74 20 32 30  {.  set limit 20
4b20: 0a 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f  .} elseif {[info
4b30: 20 65 78 69 73 74 73 20 53 4f 41 4b 54 45 53 54   exists SOAKTEST
4b40: 5d 7d 20 7b 0a 20 20 73 65 74 20 6c 69 6d 69 74  ]} {.  set limit
4b50: 20 31 30 30 0a 7d 20 65 6c 73 65 20 7b 0a 20 20   100.} else {.  
4b60: 73 65 74 20 6c 69 6d 69 74 20 34 30 0a 7d 0a 0a  set limit 40.}..
4b70: 23 20 44 6f 20 72 6f 6c 6c 62 61 63 6b 73 2e 20  # Do rollbacks. 
4b80: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
4b90: 69 67 6e 61 74 75 72 65 20 64 6f 65 73 20 6e 6f  ignature does no
4ba0: 74 20 63 68 61 6e 67 65 2e 0a 23 0a 66 6f 72 20  t change..#.for 
4bb0: 7b 73 65 74 20 69 20 32 7d 20 7b 24 69 3c 3d 24  {set i 2} {$i<=$
4bc0: 6c 69 6d 69 74 7d 20 7b 69 6e 63 72 20 69 7d 20  limit} {incr i} 
4bd0: 7b 0a 20 20 73 65 74 20 3a 3a 73 69 67 20 5b 73  {.  set ::sig [s
4be0: 69 67 6e 61 74 75 72 65 5d 0a 20 20 73 65 74 20  ignature].  set 
4bf0: 63 6e 74 20 5b 6c 69 6e 64 65 78 20 24 3a 3a 73  cnt [lindex $::s
4c00: 69 67 20 30 5d 0a 20 20 69 66 20 7b 24 69 25 32  ig 0].  if {$i%2
4c10: 3d 3d 30 7d 20 7b 0a 20 20 20 20 65 78 65 63 73  ==0} {.    execs
4c20: 71 6c 20 7b 50 52 41 47 4d 41 20 66 75 6c 6c 66  ql {PRAGMA fullf
4c30: 73 79 6e 63 3d 4f 4e 7d 0a 20 20 7d 20 65 6c 73  sync=ON}.  } els
4c40: 65 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  e {.    execsql 
4c50: 7b 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e  {PRAGMA fullfsyn
4c60: 63 3d 4f 46 46 7d 0a 20 20 7d 0a 20 20 73 65 74  c=OFF}.  }.  set
4c70: 20 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75   sqlite_sync_cou
4c80: 6e 74 20 30 0a 20 20 73 65 74 20 73 71 6c 69 74  nt 0.  set sqlit
4c90: 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  e_fullsync_count
4ca0: 20 30 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 61   0.  do_test tra
4cb0: 6e 73 2d 39 2e 24 69 2e 31 2d 24 63 6e 74 20 7b  ns-9.$i.1-$cnt {
4cc0: 0a 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  .     execsql {.
4cd0: 20 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20         BEGIN;.  
4ce0: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
4cf0: 20 74 33 20 57 48 45 52 45 20 72 61 6e 64 6f 6d   t3 WHERE random
4d00: 28 29 25 31 30 21 3d 30 3b 0a 20 20 20 20 20 20  ()%10!=0;.      
4d10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
4d20: 53 45 4c 45 43 54 20 72 61 6e 64 73 74 72 28 31  SELECT randstr(1
4d30: 30 2c 31 30 29 7c 7c 78 20 46 52 4f 4d 20 74 33  0,10)||x FROM t3
4d40: 3b 0a 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  ;.       INSERT 
4d50: 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72  INTO t3 SELECT r
4d60: 61 6e 64 73 74 72 28 31 30 2c 31 30 29 7c 7c 78  andstr(10,10)||x
4d70: 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 20 20   FROM t3;.      
4d80: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20   ROLLBACK;.     
4d90: 7d 0a 20 20 20 20 20 73 69 67 6e 61 74 75 72 65  }.     signature
4da0: 0a 20 20 7d 20 24 73 69 67 0a 20 20 64 6f 5f 74  .  } $sig.  do_t
4db0: 65 73 74 20 74 72 61 6e 73 2d 39 2e 24 69 2e 32  est trans-9.$i.2
4dc0: 2d 24 63 6e 74 20 7b 0a 20 20 20 20 20 65 78 65  -$cnt {.     exe
4dd0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 42 45  csql {.       BE
4de0: 47 49 4e 3b 0a 20 20 20 20 20 20 20 44 45 4c 45  GIN;.       DELE
4df0: 54 45 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45  TE FROM t3 WHERE
4e00: 20 72 61 6e 64 6f 6d 28 29 25 31 30 21 3d 30 3b   random()%10!=0;
4e10: 0a 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  .       INSERT I
4e20: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61  NTO t3 SELECT ra
4e30: 6e 64 73 74 72 28 31 30 2c 31 30 29 7c 7c 78 20  ndstr(10,10)||x 
4e40: 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 20 20 20  FROM t3;.       
4e50: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 33 20 57  DELETE FROM t3 W
4e60: 48 45 52 45 20 72 61 6e 64 6f 6d 28 29 25 31 30  HERE random()%10
4e70: 21 3d 30 3b 0a 20 20 20 20 20 20 20 49 4e 53 45  !=0;.       INSE
4e80: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
4e90: 54 20 72 61 6e 64 73 74 72 28 31 30 2c 31 30 29  T randstr(10,10)
4ea0: 7c 7c 78 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20  ||x FROM t3;.   
4eb0: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
4ec0: 20 20 20 7d 0a 20 20 20 20 20 73 69 67 6e 61 74     }.     signat
4ed0: 75 72 65 0a 20 20 7d 20 24 73 69 67 0a 20 20 69  ure.  } $sig.  i
4ee0: 66 20 7b 24 69 3c 24 6c 69 6d 69 74 7d 20 7b 0a  f {$i<$limit} {.
4ef0: 20 20 20 20 64 6f 5f 74 65 73 74 20 74 72 61 6e      do_test tran
4f00: 73 2d 39 2e 24 69 2e 33 2d 24 63 6e 74 20 7b 0a  s-9.$i.3-$cnt {.
4f10: 20 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b         execsql {
4f20: 0a 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  .         INSERT
4f30: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
4f40: 72 61 6e 64 73 74 72 28 31 30 2c 34 30 30 29 20  randstr(10,400) 
4f50: 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 72 61  FROM t3 WHERE ra
4f60: 6e 64 6f 6d 28 29 25 31 30 3d 3d 30 3b 0a 20 20  ndom()%10==0;.  
4f70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a       }.    } {}.
4f80: 20 20 20 20 69 66 20 7b 24 74 63 6c 5f 70 6c 61      if {$tcl_pla
4f90: 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d  tform(platform)=
4fa0: 3d 22 75 6e 69 78 22 7d 20 7b 0a 20 20 20 20 20  ="unix"} {.     
4fb0: 20 64 6f 5f 74 65 73 74 20 74 72 61 6e 73 2d 39   do_test trans-9
4fc0: 2e 24 69 2e 34 2d 24 63 6e 74 20 7b 0a 20 20 20  .$i.4-$cnt {.   
4fd0: 20 20 20 20 20 20 65 78 70 72 20 7b 24 73 71 6c        expr {$sql
4fe0: 69 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 3e 30  ite_sync_count>0
4ff0: 7d 0a 20 20 20 20 20 20 7d 20 31 0a 20 20 20 20  }.      } 1.    
5000: 20 20 69 66 63 61 70 61 62 6c 65 20 70 61 67 65    ifcapable page
5010: 72 5f 70 72 61 67 6d 61 73 20 7b 0a 20 20 20 20  r_pragmas {.    
5020: 20 20 20 20 64 6f 5f 74 65 73 74 20 74 72 61 6e      do_test tran
5030: 73 2d 39 2e 24 69 2e 35 2d 24 63 6e 74 20 7b 0a  s-9.$i.5-$cnt {.
5040: 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72 20             expr 
5050: 7b 24 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e  {$sqlite_fullsyn
5060: 63 5f 63 6f 75 6e 74 3e 30 7d 0a 20 20 20 20 20  c_count>0}.     
5070: 20 20 20 7d 20 5b 65 78 70 72 20 7b 24 69 25 32     } [expr {$i%2
5080: 3d 3d 30 7d 5d 0a 20 20 20 20 20 20 7d 20 65 6c  ==0}].      } el
5090: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 64 6f 5f  se {.        do_
50a0: 74 65 73 74 20 74 72 61 6e 73 2d 39 2e 24 69 2e  test trans-9.$i.
50b0: 35 2d 24 63 6e 74 20 7b 0a 20 20 20 20 20 20 20  5-$cnt {.       
50c0: 20 20 20 65 78 70 72 20 7b 24 73 71 6c 69 74 65     expr {$sqlite
50d0: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 3d  _fullsync_count=
50e0: 3d 30 7d 0a 20 20 20 20 20 20 20 20 7d 20 7b 31  =0}.        } {1
50f0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
5100: 20 20 7d 0a 20 20 73 65 74 20 3a 3a 70 61 67 65    }.  set ::page
5110: 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74 20 30 0a 7d  r_old_format 0.}
5120: 0a 20 20 20 0a 66 69 6e 69 73 68 5f 74 65 73 74  .   .finish_test
5130: 0a                                               .