/ Hex Artifact Content
Login

Artifact d00fe3f82773266410799aad0080426a6a936170:


0000: 23 20 32 30 30 38 20 44 65 63 65 6d 62 65 72 20  # 2008 December 
0010: 31 35 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f  15.#.# The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61  lace of.# a lega
0060: 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69  l notice, here i
0070: 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a  s a blessing:.#.
0080: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20  #    May you do 
0090: 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69  good and not evi
00a0: 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  l..#    May you 
00b0: 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73  find forgiveness
00c0: 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e   for yourself an
00d0: 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73  d forgive others
00e0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73  ..#    May you s
00f0: 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76  hare freely, nev
0100: 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74  er taking more t
0110: 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a  han you give..#.
0120: 23 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  #***************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 0a 23 0a 23 20 24 49 64  ********.#.# $Id
0170: 3a 20 73 61 76 65 70 6f 69 6e 74 2e 74 65 73 74  : savepoint.test
0180: 2c 76 20 31 2e 34 20 32 30 30 38 2f 31 32 2f 32  ,v 1.4 2008/12/2
0190: 37 20 31 35 3a 32 33 3a 31 33 20 64 61 6e 69 65  7 15:23:13 danie
01a0: 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 0a 73 65  lk1977 Exp $..se
01b0: 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20  t testdir [file 
01c0: 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a  dirname $argv0].
01d0: 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f  source $testdir/
01e0: 74 65 73 74 65 72 2e 74 63 6c 0a 0a 0a 23 2d 2d  tester.tcl...#--
01f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0230: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
0240: 77 69 6e 67 20 74 65 73 74 73 20 2d 20 73 61 76  wing tests - sav
0250: 65 70 6f 69 6e 74 2d 31 2e 2a 20 2d 20 74 65 73  epoint-1.* - tes
0260: 74 20 74 68 61 74 20 74 68 65 20 53 41 56 45 50  t that the SAVEP
0270: 4f 49 4e 54 2c 20 52 45 4c 45 41 53 45 0a 23 20  OINT, RELEASE.# 
0280: 61 6e 64 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  and ROLLBACK TO 
0290: 63 6f 6d 61 6e 64 73 20 61 72 65 20 63 6f 72 72  comands are corr
02a0: 65 63 74 6c 79 20 70 61 72 73 65 64 2c 20 61 6e  ectly parsed, an
02b0: 64 20 74 68 61 74 20 74 68 65 20 61 75 74 6f 2d  d that the auto-
02c0: 63 6f 6d 6d 69 74 0a 23 20 66 6c 61 67 20 69 73  commit.# flag is
02d0: 20 63 6f 72 72 65 63 74 6c 79 20 73 65 74 20 61   correctly set a
02e0: 6e 64 20 75 6e 73 65 74 20 61 73 20 61 20 72 65  nd unset as a re
02f0: 73 75 6c 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  sult..#.do_test 
0300: 73 61 76 65 70 6f 69 6e 74 2d 31 2e 31 20 7b 0a  savepoint-1.1 {.
0310: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0320: 53 41 56 45 50 4f 49 4e 54 20 73 70 31 3b 0a 20  SAVEPOINT sp1;. 
0330: 20 20 20 52 45 4c 45 41 53 45 20 73 70 31 3b 0a     RELEASE sp1;.
0340: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
0350: 20 73 61 76 65 70 6f 69 6e 74 2d 31 2e 32 20 7b   savepoint-1.2 {
0360: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0370: 20 53 41 56 45 50 4f 49 4e 54 20 73 70 31 3b 0a   SAVEPOINT sp1;.
0380: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
0390: 73 70 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  sp1;.  }.} {}.do
03a0: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
03b0: 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.3 {.  execsql 
03c0: 7b 20 53 41 56 45 50 4f 49 4e 54 20 73 70 31 20  { SAVEPOINT sp1 
03d0: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b  }.  db close.} {
03e0: 7d 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73  }.sqlite3 db tes
03f0: 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20 73 61 76  t.db.do_test sav
0400: 65 70 6f 69 6e 74 2d 31 2e 34 2e 31 20 7b 0a 20  epoint-1.4.1 {. 
0410: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
0420: 41 56 45 50 4f 49 4e 54 20 73 70 31 3b 0a 20 20  AVEPOINT sp1;.  
0430: 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 32 3b    SAVEPOINT sp2;
0440: 0a 20 20 20 20 52 45 4c 45 41 53 45 20 73 70 31  .    RELEASE sp1
0450: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
0460: 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 64  get_autocommit d
0470: 62 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  b.} {1}.do_test 
0480: 73 61 76 65 70 6f 69 6e 74 2d 31 2e 34 2e 32 20  savepoint-1.4.2 
0490: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
04a0: 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 31 3b    SAVEPOINT sp1;
04b0: 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73  .    SAVEPOINT s
04c0: 70 32 3b 0a 20 20 20 20 52 45 4c 45 41 53 45 20  p2;.    RELEASE 
04d0: 73 70 32 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  sp2;.  }.  sqlit
04e0: 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
04f0: 74 20 64 62 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65  t db.} {0}.do_te
0500: 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 2e 34  st savepoint-1.4
0510: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
0520: 20 52 45 4c 45 41 53 45 20 73 70 31 20 7d 0a 20   RELEASE sp1 }. 
0530: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
0540: 6f 63 6f 6d 6d 69 74 20 64 62 0a 7d 20 7b 31 7d  ocommit db.} {1}
0550: 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69  .do_test savepoi
0560: 6e 74 2d 31 2e 34 2e 34 20 7b 0a 20 20 65 78 65  nt-1.4.4 {.  exe
0570: 63 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50  csql {.    SAVEP
0580: 4f 49 4e 54 20 73 70 31 3b 0a 20 20 20 20 53 41  OINT sp1;.    SA
0590: 56 45 50 4f 49 4e 54 20 73 70 32 3b 0a 20 20 20  VEPOINT sp2;.   
05a0: 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 31   ROLLBACK TO sp1
05b0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
05c0: 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 64  get_autocommit d
05d0: 62 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  b.} {0}.do_test 
05e0: 73 61 76 65 70 6f 69 6e 74 2d 31 2e 34 2e 35 20  savepoint-1.4.5 
05f0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 52 45  {.  execsql { RE
0600: 4c 45 41 53 45 20 53 41 56 45 50 4f 49 4e 54 20  LEASE SAVEPOINT 
0610: 73 70 31 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  sp1 }.  sqlite3_
0620: 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 64  get_autocommit d
0630: 62 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  b.} {1}.do_test 
0640: 73 61 76 65 70 6f 69 6e 74 2d 31 2e 34 2e 36 20  savepoint-1.4.6 
0650: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
0660: 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 31 3b    SAVEPOINT sp1;
0670: 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73  .    SAVEPOINT s
0680: 70 32 3b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e  p2;.    SAVEPOIN
0690: 54 20 73 70 33 3b 0a 20 20 20 20 52 4f 4c 4c 42  T sp3;.    ROLLB
06a0: 41 43 4b 20 54 4f 20 53 41 56 45 50 4f 49 4e 54  ACK TO SAVEPOINT
06b0: 20 73 70 33 3b 0a 20 20 20 20 52 4f 4c 4c 42 41   sp3;.    ROLLBA
06c0: 43 4b 20 54 52 41 4e 53 41 43 54 49 4f 4e 20 54  CK TRANSACTION T
06d0: 4f 20 73 70 32 3b 0a 20 20 20 20 52 4f 4c 4c 42  O sp2;.    ROLLB
06e0: 41 43 4b 20 54 52 41 4e 53 41 43 54 49 4f 4e 20  ACK TRANSACTION 
06f0: 54 4f 20 53 41 56 45 50 4f 49 4e 54 20 73 70 31  TO SAVEPOINT sp1
0700: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
0710: 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 64  get_autocommit d
0720: 62 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  b.} {0}.do_test 
0730: 73 61 76 65 70 6f 69 6e 74 2d 31 2e 34 2e 37 20  savepoint-1.4.7 
0740: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 52 45  {.  execsql { RE
0750: 4c 45 41 53 45 20 53 41 56 45 50 4f 49 4e 54 20  LEASE SAVEPOINT 
0760: 53 50 31 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  SP1 }.  sqlite3_
0770: 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 64  get_autocommit d
0780: 62 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  b.} {1}.do_test 
0790: 73 61 76 65 70 6f 69 6e 74 2d 31 2e 35 20 7b 0a  savepoint-1.5 {.
07a0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
07b0: 53 41 56 45 50 4f 49 4e 54 20 73 70 31 3b 0a 20  SAVEPOINT sp1;. 
07c0: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73     ROLLBACK TO s
07d0: 70 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  p1;.  }.} {}.do_
07e0: 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31  test savepoint-1
07f0: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43  .6 {.  execsql C
0800: 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d  OMMIT.} {}..#---
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0850: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 73 65 20 74 65  -----.# These te
0860: 73 74 73 20 2d 20 73 61 76 65 70 6f 69 6e 74 2d  sts - savepoint-
0870: 32 2e 2a 20 2d 20 74 65 73 74 20 72 6f 6c 6c 62  2.* - test rollb
0880: 61 63 6b 73 20 61 6e 64 20 72 65 6c 65 61 73 65  acks and release
0890: 73 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 0a  s of savepoints.
08a0: 23 20 77 69 74 68 20 61 20 76 65 72 79 20 73 69  # with a very si
08b0: 6d 70 6c 65 20 64 61 74 61 20 73 65 74 2e 0a 23  mple data set..#
08c0: 20 0a 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70   ..do_test savep
08d0: 6f 69 6e 74 2d 32 2e 31 20 7b 0a 20 20 65 78 65  oint-2.1 {.  exe
08e0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
08f0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c  E TABLE t1(a, b,
0900: 20 63 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   c);.    BEGIN;.
0910: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0920: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  t1 VALUES(1, 2, 
0930: 33 29 3b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e  3);.    SAVEPOIN
0940: 54 20 6f 6e 65 3b 0a 20 20 20 20 55 50 44 41 54  T one;.    UPDAT
0950: 45 20 74 31 20 53 45 54 20 61 20 3d 20 32 2c 20  E t1 SET a = 2, 
0960: 62 20 3d 20 33 2c 20 63 20 3d 20 34 3b 0a 20 20  b = 3, c = 4;.  
0970: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
0980: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
0990: 0a 7d 20 7b 32 20 33 20 34 7d 0a 64 6f 5f 74 65  .} {2 3 4}.do_te
09a0: 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 32 2e 32  st savepoint-2.2
09b0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
09c0: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f     ROLLBACK TO o
09d0: 6e 65 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  ne;.  }.  execsq
09e0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
09f0: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 7d  M t1 }.} {1 2 3}
0a00: 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69  .do_test savepoi
0a10: 6e 74 2d 32 2e 33 20 7b 0a 20 20 65 78 65 63 73  nt-2.3 {.  execs
0a20: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
0a30: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34  INTO t1 VALUES(4
0a40: 2c 20 35 2c 20 36 29 3b 0a 20 20 7d 0a 20 20 65  , 5, 6);.  }.  e
0a50: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
0a60: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
0a70: 20 32 20 33 20 34 20 35 20 36 7d 0a 64 6f 5f 74   2 3 4 5 6}.do_t
0a80: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 32 2e  est savepoint-2.
0a90: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
0aa0: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
0ab0: 6f 6e 65 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73  one;.  }.  execs
0ac0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
0ad0: 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33  OM t1 }.} {1 2 3
0ae0: 7d 0a 0a 0a 64 6f 5f 74 65 73 74 20 73 61 76 65  }...do_test save
0af0: 70 6f 69 6e 74 2d 32 2e 35 20 7b 0a 20 20 65 78  point-2.5 {.  ex
0b00: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
0b10: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0b20: 53 28 37 2c 20 38 2c 20 39 29 3b 0a 20 20 20 20  S(7, 8, 9);.    
0b30: 53 41 56 45 50 4f 49 4e 54 20 74 77 6f 3b 0a 20  SAVEPOINT two;. 
0b40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0b50: 31 20 56 41 4c 55 45 53 28 31 30 2c 20 31 31 2c  1 VALUES(10, 11,
0b60: 20 31 32 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63   12);.  }.  exec
0b70: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
0b80: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20  ROM t1 }.} {1 2 
0b90: 33 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  3 7 8 9 10 11 12
0ba0: 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f  }.do_test savepo
0bb0: 69 6e 74 2d 32 2e 36 20 7b 0a 20 20 65 78 65 63  int-2.6 {.  exec
0bc0: 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41  sql {.    ROLLBA
0bd0: 43 4b 20 54 4f 20 74 77 6f 3b 0a 20 20 7d 0a 20  CK TO two;.  }. 
0be0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
0bf0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  T * FROM t1 }.} 
0c00: 7b 31 20 32 20 33 20 37 20 38 20 39 7d 0a 64 6f  {1 2 3 7 8 9}.do
0c10: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
0c20: 32 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.7 {.  execsql 
0c30: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
0c40: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 30 2c 20  O t1 VALUES(10, 
0c50: 31 31 2c 20 31 32 29 3b 0a 20 20 7d 0a 20 20 65  11, 12);.  }.  e
0c60: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
0c70: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
0c80: 20 32 20 33 20 37 20 38 20 39 20 31 30 20 31 31   2 3 7 8 9 10 11
0c90: 20 31 32 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76   12}.do_test sav
0ca0: 65 70 6f 69 6e 74 2d 32 2e 38 20 7b 0a 20 20 65  epoint-2.8 {.  e
0cb0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c  xecsql {.    ROL
0cc0: 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20  LBACK TO one;.  
0cd0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
0ce0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
0cf0: 0a 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74 65  .} {1 2 3}.do_te
0d00: 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 32 2e 39  st savepoint-2.9
0d10: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0d20: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0d30: 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  1 VALUES('a', 'b
0d40: 27 2c 20 27 63 27 29 3b 0a 20 20 20 20 53 41 56  ', 'c');.    SAV
0d50: 45 50 4f 49 4e 54 20 74 77 6f 3b 0a 20 20 20 20  EPOINT two;.    
0d60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0d70: 41 4c 55 45 53 28 27 64 27 2c 20 27 65 27 2c 20  ALUES('d', 'e', 
0d80: 27 66 27 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63  'f');.  }.  exec
0d90: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
0da0: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20  ROM t1 }.} {1 2 
0db0: 33 20 61 20 62 20 63 20 64 20 65 20 66 7d 0a 64  3 a b c d e f}.d
0dc0: 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74  o_test savepoint
0dd0: 2d 32 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71  -2.10 {.  execsq
0de0: 6c 20 7b 0a 20 20 20 20 52 45 4c 45 41 53 45 20  l {.    RELEASE 
0df0: 74 77 6f 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73  two;.  }.  execs
0e00: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
0e10: 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33  OM t1 }.} {1 2 3
0e20: 20 61 20 62 20 63 20 64 20 65 20 66 7d 0a 64 6f   a b c d e f}.do
0e30: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
0e40: 32 2e 31 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  2.11 {.  execsql
0e50: 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b   {.    ROLLBACK;
0e60: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
0e70: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0e80: 31 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d  1 }.} {}..#-----
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b  ---.# This block
0ee0: 20 6f 66 20 74 65 73 74 73 20 2d 20 73 61 76 65   of tests - save
0ef0: 70 6f 69 6e 74 2d 33 2e 2a 20 2d 20 74 65 73 74  point-3.* - test
0f00: 20 74 68 61 74 20 77 68 65 6e 20 61 20 74 72 61   that when a tra
0f10: 6e 73 61 63 74 69 6f 6e 0a 23 20 73 61 76 65 70  nsaction.# savep
0f20: 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  oint is rolled b
0f30: 61 63 6b 2c 20 6c 6f 63 6b 73 20 61 72 65 20 6e  ack, locks are n
0f40: 6f 74 20 72 65 6c 65 61 73 65 64 20 66 72 6f 6d  ot released from
0f50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
0f60: 0a 23 20 41 6e 64 20 74 68 61 74 20 77 68 65 6e  .# And that when
0f70: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73   a transaction s
0f80: 61 76 65 70 6f 69 6e 74 20 69 73 20 72 65 6c 65  avepoint is rele
0f90: 61 73 65 64 2c 20 74 68 65 79 20 61 72 65 20 72  ased, they are r
0fa0: 65 6c 65 61 73 65 64 2e 0a 23 20 0a 64 6f 5f 74  eleased..# .do_t
0fb0: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 33 2e  est savepoint-3.
0fc0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 {.  execsql { 
0fd0: 53 41 56 45 50 4f 49 4e 54 20 22 74 72 61 6e 73  SAVEPOINT "trans
0fe0: 61 63 74 69 6f 6e 22 20 7d 0a 20 20 65 78 65 63  action" }.  exec
0ff0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63  sql { PRAGMA loc
1000: 6b 5f 73 74 61 74 75 73 20 7d 0a 7d 20 7b 6d 61  k_status }.} {ma
1010: 69 6e 20 75 6e 6c 6f 63 6b 65 64 20 74 65 6d 70  in unlocked temp
1020: 20 63 6c 6f 73 65 64 7d 0a 0a 64 6f 5f 74 65 73   closed}..do_tes
1030: 74 20 73 61 76 65 70 6f 69 6e 74 2d 33 2e 32 20  t savepoint-3.2 
1040: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
1050: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1060: 55 45 53 28 31 2c 20 32 2c 20 33 29 20 7d 0a 20  UES(1, 2, 3) }. 
1070: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
1080: 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d 0a  A lock_status }.
1090: 7d 20 7b 6d 61 69 6e 20 72 65 73 65 72 76 65 64  } {main reserved
10a0: 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a 64   temp closed}..d
10b0: 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74  o_test savepoint
10c0: 2d 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -3.3 {.  execsql
10d0: 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 22   { ROLLBACK TO "
10e0: 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 7d 0a 20  transaction" }. 
10f0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
1100: 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d 0a  A lock_status }.
1110: 7d 20 7b 6d 61 69 6e 20 72 65 73 65 72 76 65 64  } {main reserved
1120: 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a 64   temp closed}..d
1130: 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74  o_test savepoint
1140: 2d 33 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  -3.4 {.  execsql
1150: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
1160: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  1 VALUES(1, 2, 3
1170: 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  ) }.  execsql { 
1180: 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74  PRAGMA lock_stat
1190: 75 73 20 7d 0a 7d 20 7b 6d 61 69 6e 20 72 65 73  us }.} {main res
11a0: 65 72 76 65 64 20 74 65 6d 70 20 63 6c 6f 73 65  erved temp close
11b0: 64 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 61 76 65  d}..do_test save
11c0: 70 6f 69 6e 74 2d 33 2e 35 20 7b 0a 20 20 65 78  point-3.5 {.  ex
11d0: 65 63 73 71 6c 20 7b 20 52 45 4c 45 41 53 45 20  ecsql { RELEASE 
11e0: 22 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 7d 0a  "transaction" }.
11f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
1200: 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d  MA lock_status }
1210: 0a 7d 20 7b 6d 61 69 6e 20 75 6e 6c 6f 63 6b 65  .} {main unlocke
1220: 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a  d temp closed}..
1230: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
1240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
1280: 20 74 68 61 74 20 73 61 76 65 70 6f 69 6e 74 73   that savepoints
1290: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 20 73 63   that include sc
12a0: 68 65 6d 61 20 6d 6f 64 69 66 69 63 61 74 69 6f  hema modificatio
12b0: 6e 73 20 61 72 65 20 68 61 6e 64 6c 65 64 0a 23  ns are handled.#
12c0: 20 63 6f 72 72 65 63 74 6c 79 2e 20 54 65 73 74   correctly. Test
12d0: 20 63 61 73 65 73 20 73 61 76 65 70 6f 69 6e 74   cases savepoint
12e0: 2d 34 2e 2a 2e 0a 23 20 0a 64 6f 5f 74 65 73 74  -4.*..# .do_test
12f0: 20 73 61 76 65 70 6f 69 6e 74 2d 34 2e 31 20 7b   savepoint-4.1 {
1300: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1310: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
1320: 28 64 2c 20 65 2c 20 66 29 3b 0a 20 20 20 20 53  (d, e, f);.    S
1330: 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73  ELECT sql FROM s
1340: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20  qlite_master;.  
1350: 7d 0a 7d 20 7b 7b 43 52 45 41 54 45 20 54 41 42  }.} {{CREATE TAB
1360: 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 29 7d 20  LE t1(a, b, c)} 
1370: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32  {CREATE TABLE t2
1380: 28 64 2c 20 65 2c 20 66 29 7d 7d 0a 64 6f 5f 74  (d, e, f)}}.do_t
1390: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 34 2e  est savepoint-4.
13a0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
13b0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43      BEGIN;.    C
13c0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 67  REATE TABLE t3(g
13d0: 2c 68 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ,h);.    INSERT 
13e0: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27  INTO t3 VALUES('
13f0: 49 27 2c 20 27 49 49 27 29 3b 0a 20 20 20 20 53  I', 'II');.    S
1400: 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20  AVEPOINT one;.  
1410: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 33 3b    DROP TABLE t3;
1420: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
1430: 74 20 73 61 76 65 70 6f 69 6e 74 2d 34 2e 33 20  t savepoint-4.3 
1440: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1450: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1460: 33 28 67 2c 20 68 2c 20 69 29 3b 0a 20 20 20 20  3(g, h, i);.    
1470: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
1480: 41 4c 55 45 53 28 27 49 49 49 27 2c 20 27 49 56  ALUES('III', 'IV
1490: 27 2c 20 27 56 27 29 3b 0a 20 20 7d 0a 20 20 65  ', 'V');.  }.  e
14a0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a  xecsql {SELECT *
14b0: 20 46 52 4f 4d 20 74 33 7d 0a 7d 20 7b 49 49 49   FROM t3}.} {III
14c0: 20 49 56 20 56 7d 0a 64 6f 5f 74 65 73 74 20 73   IV V}.do_test s
14d0: 61 76 65 70 6f 69 6e 74 2d 34 2e 34 20 7b 0a 20  avepoint-4.4 {. 
14e0: 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42   execsql { ROLLB
14f0: 41 43 4b 20 54 4f 20 6f 6e 65 3b 20 7d 0a 20 20  ACK TO one; }.  
1500: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
1510: 2a 20 46 52 4f 4d 20 74 33 7d 0a 7d 20 7b 49 20  * FROM t3}.} {I 
1520: 49 49 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76 65  II}.do_test save
1530: 70 6f 69 6e 74 2d 34 2e 35 20 7b 0a 20 20 65 78  point-4.5 {.  ex
1540: 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c  ecsql {.    ROLL
1550: 42 41 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43 54  BACK;.    SELECT
1560: 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
1570: 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 7b  _master;.  }.} {
1580: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  {CREATE TABLE t1
1590: 28 61 2c 20 62 2c 20 63 29 7d 20 7b 43 52 45 41  (a, b, c)} {CREA
15a0: 54 45 20 54 41 42 4c 45 20 74 32 28 64 2c 20 65  TE TABLE t2(d, e
15b0: 2c 20 66 29 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20  , f)}}..do_test 
15c0: 73 61 76 65 70 6f 69 6e 74 2d 34 2e 36 20 7b 0a  savepoint-4.6 {.
15d0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
15e0: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
15f0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1600: 28 27 6f 27 2c 20 27 74 27 2c 20 27 74 27 29 3b  ('o', 't', 't');
1610: 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73  .    SAVEPOINT s
1620: 70 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  p1;.    CREATE T
1630: 41 42 4c 45 20 74 33 28 61 2c 20 62 2c 20 63 29  ABLE t3(a, b, c)
1640: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1650: 4f 20 74 33 20 56 41 4c 55 45 53 28 27 7a 27 2c  O t3 VALUES('z',
1660: 20 27 79 27 2c 20 27 78 27 29 3b 0a 20 20 7d 0a   'y', 'x');.  }.
1670: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
1680: 54 20 2a 20 46 52 4f 4d 20 74 33 7d 0a 7d 20 7b  T * FROM t3}.} {
1690: 7a 20 79 20 78 7d 0a 64 6f 5f 74 65 73 74 20 73  z y x}.do_test s
16a0: 61 76 65 70 6f 69 6e 74 2d 34 2e 37 20 7b 0a 20  avepoint-4.7 {. 
16b0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 52   execsql {.    R
16c0: 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 31 3b 0a  OLLBACK TO sp1;.
16d0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
16e0: 20 74 33 28 61 29 3b 0a 20 20 20 20 49 4e 53 45   t3(a);.    INSE
16f0: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
1700: 53 28 27 76 61 6c 75 65 27 29 3b 0a 20 20 7d 0a  S('value');.  }.
1710: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
1720: 54 20 2a 20 46 52 4f 4d 20 74 33 7d 0a 7d 20 7b  T * FROM t3}.} {
1730: 76 61 6c 75 65 7d 0a 64 6f 5f 74 65 73 74 20 73  value}.do_test s
1740: 61 76 65 70 6f 69 6e 74 2d 34 2e 38 20 7b 0a 20  avepoint-4.8 {. 
1750: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
1760: 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  } {}..#---------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
17b0: 23 20 54 65 73 74 20 73 6f 6d 65 20 6c 6f 67 69  # Test some logi
17c0: 63 20 65 72 72 6f 72 73 20 74 6f 20 64 6f 20 77  c errors to do w
17d0: 69 74 68 20 74 68 65 20 73 61 76 65 70 6f 69 6e  ith the savepoin
17e0: 74 20 66 65 61 74 75 72 65 2e 0a 23 20 0a 0a 64  t feature..# ..d
17f0: 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74  o_test savepoint
1800: 2d 35 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  -5.1.1 {.  execs
1810: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1820: 54 41 42 4c 45 20 62 6c 6f 62 73 28 78 29 3b 0a  TABLE blobs(x);.
1830: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1840: 62 6c 6f 62 73 20 56 41 4c 55 45 53 28 27 61 20  blobs VALUES('a 
1850: 74 77 65 6e 74 79 65 69 67 68 74 20 63 68 61 72  twentyeight char
1860: 61 63 74 65 72 20 62 6c 6f 62 27 29 3b 0a 20 20  acter blob');.  
1870: 7d 0a 20 20 73 65 74 20 66 64 20 5b 64 62 20 69  }.  set fd [db i
1880: 6e 63 72 62 6c 6f 62 20 62 6c 6f 62 73 20 78 20  ncrblob blobs x 
1890: 31 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77  1].  puts -nonew
18a0: 6c 69 6e 65 20 24 66 64 20 22 68 65 6c 6c 6f 22  line $fd "hello"
18b0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53 41 56  .  catchsql {SAV
18c0: 45 50 4f 49 4e 54 20 61 62 63 7d 0a 7d 20 7b 31  EPOINT abc}.} {1
18d0: 20 7b 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 61   {cannot open sa
18e0: 76 65 70 6f 69 6e 74 20 2d 20 53 51 4c 20 73 74  vepoint - SQL st
18f0: 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67  atements in prog
1900: 72 65 73 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 73  ress}}.do_test s
1910: 61 76 65 70 6f 69 6e 74 2d 35 2e 31 2e 32 20 7b  avepoint-5.1.2 {
1920: 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 63  .  close $fd.  c
1930: 61 74 63 68 73 71 6c 20 7b 53 41 56 45 50 4f 49  atchsql {SAVEPOI
1940: 4e 54 20 61 62 63 7d 0a 7d 20 7b 30 20 7b 7d 7d  NT abc}.} {0 {}}
1950: 0a 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f  ..do_test savepo
1960: 69 6e 74 2d 35 2e 32 20 7b 0a 20 20 65 78 65 63  int-5.2 {.  exec
1970: 73 71 6c 20 20 7b 52 45 4c 45 41 53 45 20 61 62  sql  {RELEASE ab
1980: 63 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 52  c}.  catchsql {R
1990: 45 4c 45 41 53 45 20 61 62 63 7d 0a 7d 20 7b 31  ELEASE abc}.} {1
19a0: 20 7b 6e 6f 20 73 75 63 68 20 73 61 76 65 70 6f   {no such savepo
19b0: 69 6e 74 3a 20 61 62 63 7d 7d 0a 0a 64 6f 5f 74  int: abc}}..do_t
19c0: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 35 2e  est savepoint-5.
19d0: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
19e0: 20 7b 53 41 56 45 50 4f 49 4e 54 20 61 62 63 7d   {SAVEPOINT abc}
19f0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 52 4f 4c  .  catchsql {ROL
1a00: 4c 42 41 43 4b 20 54 4f 20 64 65 66 7d 0a 7d 20  LBACK TO def}.} 
1a10: 7b 31 20 7b 6e 6f 20 73 75 63 68 20 73 61 76 65  {1 {no such save
1a20: 70 6f 69 6e 74 3a 20 64 65 66 7d 7d 0a 64 6f 5f  point: def}}.do_
1a30: 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 35  test savepoint-5
1a40: 2e 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.2 {.  execsql
1a50: 20 20 7b 53 41 56 45 50 4f 49 4e 54 20 64 65 66    {SAVEPOINT def
1a60: 7d 0a 20 20 73 65 74 20 66 64 20 5b 64 62 20 69  }.  set fd [db i
1a70: 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c  ncrblob -readonl
1a80: 79 20 62 6c 6f 62 73 20 78 20 31 5d 0a 20 20 63  y blobs x 1].  c
1a90: 61 74 63 68 73 71 6c 20 7b 52 4f 4c 4c 42 41 43  atchsql {ROLLBAC
1aa0: 4b 20 54 4f 20 64 65 66 7d 0a 7d 20 7b 31 20 7b  K TO def}.} {1 {
1ab0: 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20  cannot rollback 
1ac0: 73 61 76 65 70 6f 69 6e 74 20 2d 20 53 51 4c 20  savepoint - SQL 
1ad0: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72  statements in pr
1ae0: 6f 67 72 65 73 73 7d 7d 0a 64 6f 5f 74 65 73 74  ogress}}.do_test
1af0: 20 73 61 76 65 70 6f 69 6e 74 2d 35 2e 33 2e 33   savepoint-5.3.3
1b00: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 20 7b   {.  catchsql  {
1b10: 52 45 4c 45 41 53 45 20 64 65 66 7d 0a 7d 20 7b  RELEASE def}.} {
1b20: 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 61  0 {}}.do_test sa
1b30: 76 65 70 6f 69 6e 74 2d 35 2e 33 2e 34 20 7b 0a  vepoint-5.3.4 {.
1b40: 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 65 78    close $fd.  ex
1b50: 65 63 73 71 6c 20 20 7b 73 61 76 65 70 6f 69 6e  ecsql  {savepoin
1b60: 74 20 64 65 66 7d 0a 20 20 73 65 74 20 66 64 20  t def}.  set fd 
1b70: 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 62 6c 6f  [db incrblob blo
1b80: 62 73 20 78 20 31 5d 0a 20 20 63 61 74 63 68 73  bs x 1].  catchs
1b90: 71 6c 20 7b 72 65 6c 65 61 73 65 20 64 65 66 7d  ql {release def}
1ba0: 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 72 65  .} {1 {cannot re
1bb0: 6c 65 61 73 65 20 73 61 76 65 70 6f 69 6e 74 20  lease savepoint 
1bc0: 2d 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  - SQL statements
1bd0: 20 69 6e 20 70 72 6f 67 72 65 73 73 7d 7d 0a 64   in progress}}.d
1be0: 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74  o_test savepoint
1bf0: 2d 35 2e 33 2e 35 20 7b 0a 20 20 63 6c 6f 73 65  -5.3.5 {.  close
1c00: 20 24 66 64 0a 20 20 65 78 65 63 73 71 6c 20 7b   $fd.  execsql {
1c10: 72 65 6c 65 61 73 65 20 61 62 63 7d 0a 7d 20 7b  release abc}.} {
1c20: 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70  }..do_test savep
1c30: 6f 69 6e 74 2d 35 2e 34 2e 31 20 7b 0a 20 20 65  oint-5.4.1 {.  e
1c40: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 41 56  xecsql {.    SAV
1c50: 45 50 4f 49 4e 54 20 6d 61 69 6e 3b 0a 20 20 20  EPOINT main;.   
1c60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 6c 6f   INSERT INTO blo
1c70: 62 73 20 56 41 4c 55 45 53 28 27 61 6e 6f 74 68  bs VALUES('anoth
1c80: 65 72 20 62 6c 6f 62 27 29 3b 0a 20 20 7d 0a 7d  er blob');.  }.}
1c90: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76 65   {}.do_test save
1ca0: 70 6f 69 6e 74 2d 35 2e 34 2e 32 20 7b 0a 20 20  point-5.4.2 {.  
1cb0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
1cc0: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  .db.  execsql { 
1cd0: 42 45 47 49 4e 20 3b 20 53 45 4c 45 43 54 20 2a  BEGIN ; SELECT *
1ce0: 20 46 52 4f 4d 20 62 6c 6f 62 73 20 7d 20 64 62   FROM blobs } db
1cf0: 32 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 52  2.  catchsql { R
1d00: 45 4c 45 41 53 45 20 6d 61 69 6e 20 7d 0a 7d 20  ELEASE main }.} 
1d10: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
1d20: 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  locked}}.do_test
1d30: 20 73 61 76 65 70 6f 69 6e 74 2d 35 2e 34 2e 33   savepoint-5.4.3
1d40: 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20   {.  db2 close. 
1d50: 20 63 61 74 63 68 73 71 6c 20 7b 20 52 45 4c 45   catchsql { RELE
1d60: 41 53 45 20 6d 61 69 6e 20 7d 0a 7d 20 7b 30 20  ASE main }.} {0 
1d70: 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76 65  {}}.do_test save
1d80: 70 6f 69 6e 74 2d 35 2e 34 2e 34 20 7b 0a 20 20  point-5.4.4 {.  
1d90: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
1da0: 20 78 20 46 52 4f 4d 20 62 6c 6f 62 73 20 57 48   x FROM blobs WH
1db0: 45 52 45 20 72 6f 77 69 64 20 3d 20 32 20 7d 0a  ERE rowid = 2 }.
1dc0: 7d 20 7b 7b 61 6e 6f 74 68 65 72 20 62 6c 6f 62  } {{another blob
1dd0: 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }}..#-----------
1de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
1e20: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
1e30: 65 73 74 73 2c 20 73 61 76 65 70 6f 69 6e 74 2d  ests, savepoint-
1e40: 36 2e 2a 2c 20 74 65 73 74 20 61 6e 20 69 6e 63  6.*, test an inc
1e50: 72 2d 76 61 63 75 75 6d 20 69 6e 73 69 64 65 20  r-vacuum inside 
1e60: 6f 66 20 61 0a 23 20 63 6f 75 70 6c 65 20 6f 66  of a.# couple of
1e70: 20 6e 65 73 74 65 64 20 73 61 76 65 70 6f 69 6e   nested savepoin
1e80: 74 73 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20  ts..#.ifcapable 
1e90: 7b 61 75 74 6f 76 61 63 75 75 6d 20 26 26 20 70  {autovacuum && p
1ea0: 72 61 67 6d 61 7d 20 7b 0a 20 20 64 62 20 63 6c  ragma} {.  db cl
1eb0: 6f 73 65 0a 20 20 66 69 6c 65 20 64 65 6c 65 74  ose.  file delet
1ec0: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62  e -force test.db
1ed0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
1ee0: 73 74 2e 64 62 0a 0a 20 20 64 6f 5f 74 65 73 74  st.db..  do_test
1ef0: 20 73 61 76 65 70 6f 69 6e 74 2d 36 2e 31 20 7b   savepoint-6.1 {
1f00: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  .    execsql { .
1f10: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 74        PRAGMA aut
1f20: 6f 5f 76 61 63 75 75 6d 20 3d 20 69 6e 63 72 65  o_vacuum = incre
1f30: 6d 65 6e 74 61 6c 3b 0a 20 20 20 20 20 20 43 52  mental;.      CR
1f40: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
1f50: 20 62 2c 20 63 29 3b 0a 20 20 20 20 20 20 43 52   b, c);.      CR
1f60: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
1f70: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
1f80: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
1f90: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1fa0: 55 45 53 28 72 61 6e 64 73 74 72 28 31 30 2c 34  UES(randstr(10,4
1fb0: 30 30 29 2c 72 61 6e 64 73 74 72 28 31 30 2c 34  00),randstr(10,4
1fc0: 30 30 29 2c 72 61 6e 64 73 74 72 28 31 30 2c 34  00),randstr(10,4
1fd0: 30 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  00));.    }.    
1fe0: 73 65 74 20 72 20 22 72 61 6e 64 73 74 72 28 31  set r "randstr(1
1ff0: 30 2c 34 30 30 29 22 0a 20 20 20 20 66 6f 72 20  0,400)".    for 
2000: 7b 73 65 74 20 69 69 20 30 7d 20 7b 24 69 69 20  {set ii 0} {$ii 
2010: 3c 20 31 30 7d 20 7b 69 6e 63 72 20 69 69 7d 20  < 10} {incr ii} 
2020: 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  {.      execsql 
2030: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20  "INSERT INTO t1 
2040: 53 45 4c 45 43 54 20 24 72 2c 20 24 72 2c 20 24  SELECT $r, $r, $
2050: 72 20 46 52 4f 4d 20 74 31 22 0a 20 20 20 20 7d  r FROM t1".    }
2060: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 43  .    execsql { C
2070: 4f 4d 4d 49 54 20 7d 0a 20 20 7d 20 7b 7d 0a 0a  OMMIT }.  } {}..
2080: 20 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63    integrity_chec
2090: 6b 20 73 61 76 65 70 6f 69 6e 74 2d 36 2e 32 0a  k savepoint-6.2.
20a0: 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70  .  do_test savep
20b0: 6f 69 6e 74 2d 36 2e 33 20 7b 0a 20 20 20 20 65  oint-6.3 {.    e
20c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50  xecsql {.      P
20d0: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
20e0: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 42 45 47   = 10;.      BEG
20f0: 49 4e 3b 0a 20 20 20 20 20 20 20 20 55 50 44 41  IN;.        UPDA
2100: 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 72 61  TE t1 SET a = ra
2110: 6e 64 73 74 72 28 31 30 2c 31 30 29 20 57 48 45  ndstr(10,10) WHE
2120: 52 45 20 28 72 6f 77 69 64 25 34 29 3d 3d 30 3b  RE (rowid%4)==0;
2130: 0a 20 20 20 20 20 20 20 20 53 41 56 45 50 4f 49  .        SAVEPOI
2140: 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20  NT one;.        
2150: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
2160: 20 57 48 45 52 45 20 72 6f 77 69 64 25 32 3b 0a   WHERE rowid%2;.
2170: 20 20 20 20 20 20 20 20 20 20 50 52 41 47 4d 41            PRAGMA
2180: 20 69 6e 63 72 5f 76 61 63 75 75 6d 3b 0a 20 20   incr_vacuum;.  
2190: 20 20 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e          SAVEPOIN
21a0: 54 20 74 77 6f 3b 0a 20 20 20 20 20 20 20 20 20  T two;.         
21b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
21c0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 73 74 72  1 SELECT randstr
21d0: 28 31 30 2c 34 30 30 29 2c 20 72 61 6e 64 73 74  (10,400), randst
21e0: 72 28 31 30 2c 34 30 30 29 2c 20 63 20 46 52 4f  r(10,400), c FRO
21f0: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 20 20  M t1;.          
2200: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
2210: 20 57 48 45 52 45 20 72 6f 77 69 64 25 32 3b 0a   WHERE rowid%2;.
2220: 20 20 20 20 20 20 20 20 20 20 20 20 50 52 41 47              PRAG
2230: 4d 41 20 69 6e 63 72 5f 76 61 63 75 75 6d 3b 0a  MA incr_vacuum;.
2240: 20 20 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b          ROLLBACK
2250: 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 20 20 43   TO one;.      C
2260: 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  OMMIT;.    }.  }
2270: 20 7b 7d 0a 0a 20 20 69 6e 74 65 67 72 69 74 79   {}..  integrity
2280: 5f 63 68 65 63 6b 20 73 61 76 65 70 6f 69 6e 74  _check savepoint
2290: 2d 36 2e 34 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  -6.4.}..#-------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22e0: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
22f0: 6e 67 20 74 65 73 74 73 2c 20 73 61 76 65 70 6f  ng tests, savepo
2300: 69 6e 74 2d 37 2e 2a 2c 20 61 74 74 65 6d 70 74  int-7.*, attempt
2310: 20 74 6f 20 62 72 65 61 6b 20 74 68 65 20 6c 6f   to break the lo
2320: 67 69 63 20 0a 23 20 73 75 72 72 6f 75 6e 64 69  gic .# surroundi
2330: 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20 62 79  ng savepoints by
2340: 20 67 72 6f 77 69 6e 67 20 61 6e 64 20 73 68 72   growing and shr
2350: 69 6e 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62  inking the datab
2360: 61 73 65 20 66 69 6c 65 2e 0a 23 0a 64 62 20 63  ase file..#.db c
2370: 6c 6f 73 65 0a 66 69 6c 65 20 64 65 6c 65 74 65  lose.file delete
2380: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 0a   -force test.db.
2390: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
23a0: 64 62 0a 0a 64 6f 5f 74 65 73 74 20 73 61 76 65  db..do_test save
23b0: 70 6f 69 6e 74 2d 37 2e 31 20 7b 0a 20 20 65 78  point-7.1 {.  ex
23c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
23d0: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
23e0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 3b 0a 20 20   incremental;.  
23f0: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
2400: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 42 45  ize = 10;.    BE
2410: 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
2420: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
2430: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20  RY KEY, b);.    
2440: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2450: 28 61 29 20 56 41 4c 55 45 53 28 27 61 6c 6c 69  (a) VALUES('alli
2460: 67 61 74 6f 72 27 29 3b 0a 20 20 20 20 20 20 49  gator');.      I
2470: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61 29  NSERT INTO t1(a)
2480: 20 56 41 4c 55 45 53 28 27 61 6e 67 65 6c 66 69   VALUES('angelfi
2490: 73 68 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  sh');.      INSE
24a0: 52 54 20 49 4e 54 4f 20 74 31 28 61 29 20 56 41  RT INTO t1(a) VA
24b0: 4c 55 45 53 28 27 61 6e 74 27 29 3b 0a 20 20 20  LUES('ant');.   
24c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
24d0: 31 28 61 29 20 56 41 4c 55 45 53 28 27 61 6e 74  1(a) VALUES('ant
24e0: 65 6c 6f 70 65 27 29 3b 0a 20 20 20 20 20 20 49  elope');.      I
24f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61 29  NSERT INTO t1(a)
2500: 20 56 41 4c 55 45 53 28 27 61 70 65 27 29 3b 0a   VALUES('ape');.
2510: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2520: 4f 20 74 31 28 61 29 20 56 41 4c 55 45 53 28 27  O t1(a) VALUES('
2530: 62 61 62 6f 6f 6e 27 29 3b 0a 20 20 20 20 20 20  baboon');.      
2540: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61  INSERT INTO t1(a
2550: 29 20 56 41 4c 55 45 53 28 27 62 61 64 67 65 72  ) VALUES('badger
2560: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
2570: 20 49 4e 54 4f 20 74 31 28 61 29 20 56 41 4c 55   INTO t1(a) VALU
2580: 45 53 28 27 62 65 61 72 27 29 3b 0a 20 20 20 20  ES('bear');.    
2590: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
25a0: 28 61 29 20 56 41 4c 55 45 53 28 27 62 65 65 74  (a) VALUES('beet
25b0: 6c 65 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  le');.      INSE
25c0: 52 54 20 49 4e 54 4f 20 74 31 28 61 29 20 56 41  RT INTO t1(a) VA
25d0: 4c 55 45 53 28 27 62 69 72 64 27 29 3b 0a 20 20  LUES('bird');.  
25e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
25f0: 74 31 28 61 29 20 56 41 4c 55 45 53 28 27 62 69  t1(a) VALUES('bi
2600: 73 6f 6e 27 29 3b 0a 20 20 20 20 20 20 55 50 44  son');.      UPD
2610: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 20  ATE t1 SET b =  
2620: 20 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31    randstr(1000,1
2630: 30 30 30 29 3b 0a 20 20 20 20 20 20 55 50 44 41  000);.      UPDA
2640: 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 62 7c  TE t1 SET b = b|
2650: 7c 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30  |randstr(1000,10
2660: 30 30 29 3b 0a 20 20 20 20 20 20 55 50 44 41 54  00);.      UPDAT
2670: 45 20 74 31 20 53 45 54 20 62 20 3d 20 62 7c 7c  E t1 SET b = b||
2680: 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30  randstr(1000,100
2690: 30 29 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  0);.      UPDATE
26a0: 20 74 31 20 53 45 54 20 62 20 3d 20 62 7c 7c 72   t1 SET b = b||r
26b0: 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29 3b  andstr(10,1000);
26c0: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
26d0: 0a 20 20 65 78 70 72 20 28 5b 65 78 65 63 73 71  .  expr ([execsq
26e0: 6c 20 7b 20 50 52 41 47 4d 41 20 70 61 67 65 5f  l { PRAGMA page_
26f0: 63 6f 75 6e 74 20 7d 5d 20 3e 20 32 30 29 0a 7d  count }] > 20).}
2700: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76   {1}.do_test sav
2710: 65 70 6f 69 6e 74 2d 37 2e 32 2e 31 20 7b 0a 20  epoint-7.2.1 {. 
2720: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
2730: 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41 56 45  EGIN;.      SAVE
2740: 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20  POINT one;.     
2750: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
2760: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e  (a, b);.      IN
2770: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
2780: 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 31  ECT a, b FROM t1
2790: 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b  ;.      ROLLBACK
27a0: 20 54 4f 20 6f 6e 65 3b 0a 20 20 7d 0a 20 20 65   TO one;.  }.  e
27b0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
27c0: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
27d0: 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 7d 0a  eck;.  }.} {ok}.
27e0: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
27f0: 74 2d 37 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63  t-7.2.2 {.  exec
2800: 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54  sql {.    COMMIT
2810: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  ;.    PRAGMA int
2820: 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20  egrity_check;.  
2830: 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 64 6f 5f 74 65 73  }.} {ok}..do_tes
2840: 74 20 73 61 76 65 70 6f 69 6e 74 2d 37 2e 33 2e  t savepoint-7.3.
2850: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
2860: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2870: 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t2(a, b);.    I
2880: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
2890: 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74  LECT a, b FROM t
28a0: 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  1;.  }.} {}.do_t
28b0: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 37 2e  est savepoint-7.
28c0: 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.2 {.  execsql 
28d0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
28e0: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65     SAVEPOINT one
28f0: 3b 0a 20 20 20 20 20 20 20 20 44 45 4c 45 54 45  ;.        DELETE
2900: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20 20   FROM t2;.      
2910: 20 20 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65    PRAGMA increme
2920: 6e 74 61 6c 5f 76 61 63 75 75 6d 3b 0a 20 20 20  ntal_vacuum;.   
2930: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74       SAVEPOINT t
2940: 77 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4e  wo;.          IN
2950: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
2960: 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 31  ECT a, b FROM t1
2970: 3b 0a 20 20 20 20 20 20 20 20 52 4f 4c 4c 42 41  ;.        ROLLBA
2980: 43 4b 20 54 4f 20 74 77 6f 3b 0a 20 20 20 20 43  CK TO two;.    C
2990: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 65 78 65  OMMIT;.  }.  exe
29a0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e  csql { PRAGMA in
29b0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 0a  tegrity_check }.
29c0: 7d 20 7b 6f 6b 7d 0a 0a 64 6f 5f 74 65 73 74 20  } {ok}..do_test 
29d0: 73 61 76 65 70 6f 69 6e 74 2d 37 2e 34 2e 31 20  savepoint-7.4.1 
29e0: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 66  {.  db close.  f
29f0: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
2a00: 65 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69  e test.db.  sqli
2a10: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
2a20: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
2a30: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
2a40: 6d 20 3d 20 69 6e 63 72 65 6d 65 6e 74 61 6c 3b  m = incremental;
2a50: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2a60: 45 20 74 31 28 61 2c 20 62 2c 20 50 52 49 4d 41  E t1(a, b, PRIMA
2a70: 52 59 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a 20  RY KEY(a, b));. 
2a80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2a90: 31 20 56 41 4c 55 45 53 28 72 61 6e 64 73 74 72  1 VALUES(randstr
2aa0: 28 31 30 30 30 2c 31 30 30 30 29 2c 20 72 61 6e  (1000,1000), ran
2ab0: 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 29  dstr(1000,1000))
2ac0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
2ad0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
2ae0: 31 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49  1;.      SAVEPOI
2af0: 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20 50 52  NT one;.      PR
2b00: 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c  AGMA incremental
2b10: 5f 76 61 63 75 75 6d 3b 0a 20 20 20 20 20 20 52  _vacuum;.      R
2b20: 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a  OLLBACK TO one;.
2b30: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
2b40: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
2b50: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
2b60: 65 63 6b 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 0a 0a  eck }.} {ok}....
2b70: 66 69 6e 69 73 68 5f 74 65 73 74 0a 0a           finish_test..