/ Hex Artifact Content
Login

Artifact e575217b07d6a6e895e66f4eda076570815e0027:


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 31 33 20 32 30 30 39 2f 30 37 2f  ,v 1.13 2009/07/
0190: 31 38 20 30 38 3a 33 30 3a 34 35 20 64 61 6e 69  18 08:30:45 dani
01a0: 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 0a 73  elk1977 Exp $..s
01b0: 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65  et testdir [file
01c0: 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d   dirname $argv0]
01d0: 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72  .source $testdir
01e0: 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72  /tester.tcl.sour
01f0: 63 65 20 24 74 65 73 74 64 69 72 2f 6c 6f 63 6b  ce $testdir/lock
0200: 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 73 6f 75 72  _common.tcl.sour
0210: 63 65 20 24 74 65 73 74 64 69 72 2f 6d 61 6c 6c  ce $testdir/mall
0220: 6f 63 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 0a 23  oc_common.tcl..#
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0270: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
0280: 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d 20 73  lowing tests - s
0290: 61 76 65 70 6f 69 6e 74 2d 31 2e 2a 20 2d 20 74  avepoint-1.* - t
02a0: 65 73 74 20 74 68 61 74 20 74 68 65 20 53 41 56  est that the SAV
02b0: 45 50 4f 49 4e 54 2c 20 52 45 4c 45 41 53 45 0a  EPOINT, RELEASE.
02c0: 23 20 61 6e 64 20 52 4f 4c 4c 42 41 43 4b 20 54  # and ROLLBACK T
02d0: 4f 20 63 6f 6d 61 6e 64 73 20 61 72 65 20 63 6f  O comands are co
02e0: 72 72 65 63 74 6c 79 20 70 61 72 73 65 64 2c 20  rrectly parsed, 
02f0: 61 6e 64 20 74 68 61 74 20 74 68 65 20 61 75 74  and that the aut
0300: 6f 2d 63 6f 6d 6d 69 74 0a 23 20 66 6c 61 67 20  o-commit.# flag 
0310: 69 73 20 63 6f 72 72 65 63 74 6c 79 20 73 65 74  is correctly set
0320: 20 61 6e 64 20 75 6e 73 65 74 20 61 73 20 61 20   and unset as a 
0330: 72 65 73 75 6c 74 2e 0a 23 0a 64 6f 5f 74 65 73  result..#.do_tes
0340: 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 2e 31 20  t savepoint-1.1 
0350: 7b 0a 20 20 77 61 6c 5f 73 65 74 5f 6a 6f 75 72  {.  wal_set_jour
0360: 6e 61 6c 5f 6d 6f 64 65 0a 20 20 65 78 65 63 73  nal_mode.  execs
0370: 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49  ql {.    SAVEPOI
0380: 4e 54 20 73 70 31 3b 0a 20 20 20 20 52 45 4c 45  NT sp1;.    RELE
0390: 41 53 45 20 73 70 31 3b 0a 20 20 7d 0a 7d 20 7b  ASE sp1;.  }.} {
03a0: 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f  }.do_test savepo
03b0: 69 6e 74 2d 31 2e 32 20 7b 0a 20 20 65 78 65 63  int-1.2 {.  exec
03c0: 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f  sql {.    SAVEPO
03d0: 49 4e 54 20 73 70 31 3b 0a 20 20 20 20 52 4f 4c  INT sp1;.    ROL
03e0: 4c 42 41 43 4b 20 54 4f 20 73 70 31 3b 0a 20 20  LBACK TO sp1;.  
03f0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73  }.} {}.do_test s
0400: 61 76 65 70 6f 69 6e 74 2d 31 2e 33 20 7b 0a 20  avepoint-1.3 {. 
0410: 20 65 78 65 63 73 71 6c 20 7b 20 53 41 56 45 50   execsql { SAVEP
0420: 4f 49 4e 54 20 73 70 31 20 7d 0a 20 20 64 62 20  OINT sp1 }.  db 
0430: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 73 71 6c 69 74  close.} {}.sqlit
0440: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64 6f  e3 db test.db.do
0450: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
0460: 31 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  1.4.1 {.  execsq
0470: 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e  l {.    SAVEPOIN
0480: 54 20 73 70 31 3b 0a 20 20 20 20 53 41 56 45 50  T sp1;.    SAVEP
0490: 4f 49 4e 54 20 73 70 32 3b 0a 20 20 20 20 52 45  OINT sp2;.    RE
04a0: 4c 45 41 53 45 20 73 70 31 3b 0a 20 20 7d 0a 20  LEASE sp1;.  }. 
04b0: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
04c0: 6f 63 6f 6d 6d 69 74 20 64 62 0a 7d 20 7b 31 7d  ocommit db.} {1}
04d0: 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69  .do_test savepoi
04e0: 6e 74 2d 31 2e 34 2e 32 20 7b 0a 20 20 65 78 65  nt-1.4.2 {.  exe
04f0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50  csql {.    SAVEP
0500: 4f 49 4e 54 20 73 70 31 3b 0a 20 20 20 20 53 41  OINT sp1;.    SA
0510: 56 45 50 4f 49 4e 54 20 73 70 32 3b 0a 20 20 20  VEPOINT sp2;.   
0520: 20 52 45 4c 45 41 53 45 20 73 70 32 3b 0a 20 20   RELEASE sp2;.  
0530: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  }.  sqlite3_get_
0540: 61 75 74 6f 63 6f 6d 6d 69 74 20 64 62 0a 7d 20  autocommit db.} 
0550: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76 65  {0}.do_test save
0560: 70 6f 69 6e 74 2d 31 2e 34 2e 33 20 7b 0a 20 20  point-1.4.3 {.  
0570: 65 78 65 63 73 71 6c 20 7b 20 52 45 4c 45 41 53  execsql { RELEAS
0580: 45 20 73 70 31 20 7d 0a 20 20 73 71 6c 69 74 65  E sp1 }.  sqlite
0590: 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
05a0: 20 64 62 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73   db.} {1}.do_tes
05b0: 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 2e 34 2e  t savepoint-1.4.
05c0: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
05d0: 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70      SAVEPOINT sp
05e0: 31 3b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54  1;.    SAVEPOINT
05f0: 20 73 70 32 3b 0a 20 20 20 20 52 4f 4c 4c 42 41   sp2;.    ROLLBA
0600: 43 4b 20 54 4f 20 73 70 31 3b 0a 20 20 7d 0a 20  CK TO sp1;.  }. 
0610: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
0620: 6f 63 6f 6d 6d 69 74 20 64 62 0a 7d 20 7b 30 7d  ocommit db.} {0}
0630: 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69  .do_test savepoi
0640: 6e 74 2d 31 2e 34 2e 35 20 7b 0a 20 20 65 78 65  nt-1.4.5 {.  exe
0650: 63 73 71 6c 20 7b 20 52 45 4c 45 41 53 45 20 53  csql { RELEASE S
0660: 41 56 45 50 4f 49 4e 54 20 73 70 31 20 7d 0a 20  AVEPOINT sp1 }. 
0670: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
0680: 6f 63 6f 6d 6d 69 74 20 64 62 0a 7d 20 7b 31 7d  ocommit db.} {1}
0690: 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69  .do_test savepoi
06a0: 6e 74 2d 31 2e 34 2e 36 20 7b 0a 20 20 65 78 65  nt-1.4.6 {.  exe
06b0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50  csql {.    SAVEP
06c0: 4f 49 4e 54 20 73 70 31 3b 0a 20 20 20 20 53 41  OINT sp1;.    SA
06d0: 56 45 50 4f 49 4e 54 20 73 70 32 3b 0a 20 20 20  VEPOINT sp2;.   
06e0: 20 53 41 56 45 50 4f 49 4e 54 20 73 70 33 3b 0a   SAVEPOINT sp3;.
06f0: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
0700: 53 41 56 45 50 4f 49 4e 54 20 73 70 33 3b 0a 20  SAVEPOINT sp3;. 
0710: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 52 41 4e     ROLLBACK TRAN
0720: 53 41 43 54 49 4f 4e 20 54 4f 20 73 70 32 3b 0a  SACTION TO sp2;.
0730: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 52 41      ROLLBACK TRA
0740: 4e 53 41 43 54 49 4f 4e 20 54 4f 20 53 41 56 45  NSACTION TO SAVE
0750: 50 4f 49 4e 54 20 73 70 31 3b 0a 20 20 7d 0a 20  POINT sp1;.  }. 
0760: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
0770: 6f 63 6f 6d 6d 69 74 20 64 62 0a 7d 20 7b 30 7d  ocommit db.} {0}
0780: 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69  .do_test savepoi
0790: 6e 74 2d 31 2e 34 2e 37 20 7b 0a 20 20 65 78 65  nt-1.4.7 {.  exe
07a0: 63 73 71 6c 20 7b 20 52 45 4c 45 41 53 45 20 53  csql { RELEASE S
07b0: 41 56 45 50 4f 49 4e 54 20 53 50 31 20 7d 0a 20  AVEPOINT SP1 }. 
07c0: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
07d0: 6f 63 6f 6d 6d 69 74 20 64 62 0a 7d 20 7b 31 7d  ocommit db.} {1}
07e0: 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69  .do_test savepoi
07f0: 6e 74 2d 31 2e 35 20 7b 0a 20 20 65 78 65 63 73  nt-1.5 {.  execs
0800: 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49  ql {.    SAVEPOI
0810: 4e 54 20 73 70 31 3b 0a 20 20 20 20 52 4f 4c 4c  NT sp1;.    ROLL
0820: 42 41 43 4b 20 54 4f 20 73 70 31 3b 0a 20 20 7d  BACK TO sp1;.  }
0830: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 61  .} {}.do_test sa
0840: 76 65 70 6f 69 6e 74 2d 31 2e 36 20 7b 0a 20 20  vepoint-1.6 {.  
0850: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d  execsql COMMIT.}
0860: 20 7b 7d 0a 77 61 6c 5f 63 68 65 63 6b 5f 6a 6f   {}.wal_check_jo
0870: 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 61 76 65 70  urnal_mode savep
0880: 6f 69 6e 74 2d 31 2e 37 0a 0a 23 2d 2d 2d 2d 2d  oint-1.7..#-----
0890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08d0: 2d 2d 2d 0a 23 20 54 68 65 73 65 20 74 65 73 74  ---.# These test
08e0: 73 20 2d 20 73 61 76 65 70 6f 69 6e 74 2d 32 2e  s - savepoint-2.
08f0: 2a 20 2d 20 74 65 73 74 20 72 6f 6c 6c 62 61 63  * - test rollbac
0900: 6b 73 20 61 6e 64 20 72 65 6c 65 61 73 65 73 20  ks and releases 
0910: 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 0a 23 20  of savepoints.# 
0920: 77 69 74 68 20 61 20 76 65 72 79 20 73 69 6d 70  with a very simp
0930: 6c 65 20 64 61 74 61 20 73 65 74 2e 0a 23 20 0a  le data set..# .
0940: 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69  .do_test savepoi
0950: 6e 74 2d 32 2e 31 20 7b 0a 20 20 65 78 65 63 73  nt-2.1 {.  execs
0960: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
0970: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0980: 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
0990: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
09a0: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
09b0: 3b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  ;.    SAVEPOINT 
09c0: 6f 6e 65 3b 0a 20 20 20 20 55 50 44 41 54 45 20  one;.    UPDATE 
09d0: 74 31 20 53 45 54 20 61 20 3d 20 32 2c 20 62 20  t1 SET a = 2, b 
09e0: 3d 20 33 2c 20 63 20 3d 20 34 3b 0a 20 20 7d 0a  = 3, c = 4;.  }.
09f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
0a00: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  CT * FROM t1 }.}
0a10: 20 7b 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74   {2 3 4}.do_test
0a20: 20 73 61 76 65 70 6f 69 6e 74 2d 32 2e 32 20 7b   savepoint-2.2 {
0a30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0a40: 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65   ROLLBACK TO one
0a50: 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ;.  }.  execsql 
0a60: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
0a70: 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 7d 0a 64  t1 }.} {1 2 3}.d
0a80: 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74  o_test savepoint
0a90: 2d 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -2.3 {.  execsql
0aa0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
0ab0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20  TO t1 VALUES(4, 
0ac0: 35 2c 20 36 29 3b 0a 20 20 7d 0a 20 20 65 78 65  5, 6);.  }.  exe
0ad0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
0ae0: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32  FROM t1 }.} {1 2
0af0: 20 33 20 34 20 35 20 36 7d 0a 64 6f 5f 74 65 73   3 4 5 6}.do_tes
0b00: 74 20 73 61 76 65 70 6f 69 6e 74 2d 32 2e 34 20  t savepoint-2.4 
0b10: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
0b20: 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e    ROLLBACK TO on
0b30: 65 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  e;.  }.  execsql
0b40: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
0b50: 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 7d 0a   t1 }.} {1 2 3}.
0b60: 0a 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f  ..do_test savepo
0b70: 69 6e 74 2d 32 2e 35 20 7b 0a 20 20 65 78 65 63  int-2.5 {.  exec
0b80: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
0b90: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0ba0: 37 2c 20 38 2c 20 39 29 3b 0a 20 20 20 20 53 41  7, 8, 9);.    SA
0bb0: 56 45 50 4f 49 4e 54 20 74 77 6f 3b 0a 20 20 20  VEPOINT two;.   
0bc0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0bd0: 56 41 4c 55 45 53 28 31 30 2c 20 31 31 2c 20 31  VALUES(10, 11, 1
0be0: 32 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  2);.  }.  execsq
0bf0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
0c00: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20  M t1 }.} {1 2 3 
0c10: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a  7 8 9 10 11 12}.
0c20: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
0c30: 74 2d 32 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  t-2.6 {.  execsq
0c40: 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  l {.    ROLLBACK
0c50: 20 54 4f 20 74 77 6f 3b 0a 20 20 7d 0a 20 20 65   TO two;.  }.  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 7d 0a 64 6f 5f 74   2 3 7 8 9}.do_t
0c90: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 32 2e  est savepoint-2.
0ca0: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  7 {.  execsql {.
0cb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0cc0: 74 31 20 56 41 4c 55 45 53 28 31 30 2c 20 31 31  t1 VALUES(10, 11
0cd0: 2c 20 31 32 29 3b 0a 20 20 7d 0a 20 20 65 78 65  , 12);.  }.  exe
0ce0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
0cf0: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32  FROM t1 }.} {1 2
0d00: 20 33 20 37 20 38 20 39 20 31 30 20 31 31 20 31   3 7 8 9 10 11 1
0d10: 32 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70  2}.do_test savep
0d20: 6f 69 6e 74 2d 32 2e 38 20 7b 0a 20 20 65 78 65  oint-2.8 {.  exe
0d30: 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42  csql {.    ROLLB
0d40: 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 7d 0a  ACK TO one;.  }.
0d50: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
0d60: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  CT * FROM t1 }.}
0d70: 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74   {1 2 3}.do_test
0d80: 20 73 61 76 65 70 6f 69 6e 74 2d 32 2e 39 20 7b   savepoint-2.9 {
0d90: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0da0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0db0: 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 2c  VALUES('a', 'b',
0dc0: 20 27 63 27 29 3b 0a 20 20 20 20 53 41 56 45 50   'c');.    SAVEP
0dd0: 4f 49 4e 54 20 74 77 6f 3b 0a 20 20 20 20 49 4e  OINT two;.    IN
0de0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0df0: 55 45 53 28 27 64 27 2c 20 27 65 27 2c 20 27 66  UES('d', 'e', 'f
0e00: 27 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  ');.  }.  execsq
0e10: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
0e20: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20  M t1 }.} {1 2 3 
0e30: 61 20 62 20 63 20 64 20 65 20 66 7d 0a 64 6f 5f  a b c d e f}.do_
0e40: 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 32  test savepoint-2
0e50: 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .10 {.  execsql 
0e60: 7b 0a 20 20 20 20 52 45 4c 45 41 53 45 20 74 77  {.    RELEASE tw
0e70: 6f 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  o;.  }.  execsql
0e80: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
0e90: 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20 61   t1 }.} {1 2 3 a
0ea0: 20 62 20 63 20 64 20 65 20 66 7d 0a 64 6f 5f 74   b c d e f}.do_t
0eb0: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 32 2e  est savepoint-2.
0ec0: 31 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  11 {.  execsql {
0ed0: 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20  .    ROLLBACK;. 
0ee0: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   }.  execsql { S
0ef0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0f00: 7d 0a 7d 20 7b 7d 0a 77 61 6c 5f 63 68 65 63 6b  }.} {}.wal_check
0f10: 5f 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 61  _journal_mode sa
0f20: 76 65 70 6f 69 6e 74 2d 32 2e 31 32 0a 0a 23 2d  vepoint-2.12..#-
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62  -------.# This b
0f80: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20  lock of tests - 
0f90: 73 61 76 65 70 6f 69 6e 74 2d 33 2e 2a 20 2d 20  savepoint-3.* - 
0fa0: 74 65 73 74 20 74 68 61 74 20 77 68 65 6e 20 61  test that when a
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20 73   transaction.# s
0fc0: 61 76 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c  avepoint is roll
0fd0: 65 64 20 62 61 63 6b 2c 20 6c 6f 63 6b 73 20 61  ed back, locks a
0fe0: 72 65 20 6e 6f 74 20 72 65 6c 65 61 73 65 64 20  re not released 
0ff0: 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 66 69  from database fi
1000: 6c 65 73 2e 0a 23 20 41 6e 64 20 74 68 61 74 20  les..# And that 
1010: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
1020: 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  on savepoint is 
1030: 72 65 6c 65 61 73 65 64 2c 20 74 68 65 79 20 61  released, they a
1040: 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 23 0a 23  re released..#.#
1050: 20 54 68 65 73 65 20 74 65 73 74 73 20 64 6f 20   These tests do 
1060: 6e 6f 74 20 77 6f 72 6b 20 69 6e 20 57 41 4c 20  not work in WAL 
1070: 6d 6f 64 65 2e 20 57 41 4c 20 6d 6f 64 65 20 64  mode. WAL mode d
1080: 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 52 45 53  oes not take RES
1090: 45 52 56 45 44 0a 23 20 6c 6f 63 6b 73 20 6f 6e  ERVED.# locks on
10a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
10b0: 6c 65 2e 0a 23 20 0a 69 66 20 7b 5b 77 61 6c 5f  le..# .if {[wal_
10c0: 69 73 5f 77 61 6c 5f 6d 6f 64 65 5d 3d 3d 30 7d  is_wal_mode]==0}
10d0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76   {.  do_test sav
10e0: 65 70 6f 69 6e 74 2d 33 2e 31 20 7b 0a 20 20 20  epoint-3.1 {.   
10f0: 20 65 78 65 63 73 71 6c 20 7b 20 53 41 56 45 50   execsql { SAVEP
1100: 4f 49 4e 54 20 22 74 72 61 6e 73 61 63 74 69 6f  OINT "transactio
1110: 6e 22 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c  n" }.    execsql
1120: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73   { PRAGMA lock_s
1130: 74 61 74 75 73 20 7d 0a 20 20 7d 20 7b 6d 61 69  tatus }.  } {mai
1140: 6e 20 75 6e 6c 6f 63 6b 65 64 20 74 65 6d 70 20  n unlocked temp 
1150: 63 6c 6f 73 65 64 7d 0a 20 20 0a 20 20 64 6f 5f  closed}.  .  do_
1160: 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 33  test savepoint-3
1170: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
1180: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
1190: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  1 VALUES(1, 2, 3
11a0: 29 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ) }.    execsql 
11b0: 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74  { PRAGMA lock_st
11c0: 61 74 75 73 20 7d 0a 20 20 7d 20 7b 6d 61 69 6e  atus }.  } {main
11d0: 20 72 65 73 65 72 76 65 64 20 74 65 6d 70 20 63   reserved temp c
11e0: 6c 6f 73 65 64 7d 0a 20 20 0a 20 20 64 6f 5f 74  losed}.  .  do_t
11f0: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 33 2e  est savepoint-3.
1200: 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  3 {.    execsql 
1210: 7b 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 22 74  { ROLLBACK TO "t
1220: 72 61 6e 73 61 63 74 69 6f 6e 22 20 7d 0a 20 20  ransaction" }.  
1230: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
1240: 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d  MA lock_status }
1250: 0a 20 20 7d 20 7b 6d 61 69 6e 20 72 65 73 65 72  .  } {main reser
1260: 76 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d  ved temp closed}
1270: 0a 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 73 61  .  .  do_test sa
1280: 76 65 70 6f 69 6e 74 2d 33 2e 34 20 7b 0a 20 20  vepoint-3.4 {.  
1290: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
12a0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
12b0: 53 28 31 2c 20 32 2c 20 33 29 20 7d 0a 20 20 20  S(1, 2, 3) }.   
12c0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
12d0: 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d 0a  A lock_status }.
12e0: 20 20 7d 20 7b 6d 61 69 6e 20 72 65 73 65 72 76    } {main reserv
12f0: 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a  ed temp closed}.
1300: 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76    .  do_test sav
1310: 65 70 6f 69 6e 74 2d 33 2e 35 20 7b 0a 20 20 20  epoint-3.5 {.   
1320: 20 65 78 65 63 73 71 6c 20 7b 20 52 45 4c 45 41   execsql { RELEA
1330: 53 45 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 22  SE "transaction"
1340: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
1350: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61   PRAGMA lock_sta
1360: 74 75 73 20 7d 0a 20 20 7d 20 7b 6d 61 69 6e 20  tus }.  } {main 
1370: 75 6e 6c 6f 63 6b 65 64 20 74 65 6d 70 20 63 6c  unlocked temp cl
1380: 6f 73 65 64 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  osed}.}..#------
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d0: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 73  --.# Test that s
13e0: 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 69  avepoints that i
13f0: 6e 63 6c 75 64 65 20 73 63 68 65 6d 61 20 6d 6f  nclude schema mo
1400: 64 69 66 69 63 61 74 69 6f 6e 73 20 61 72 65 20  difications are 
1410: 68 61 6e 64 6c 65 64 0a 23 20 63 6f 72 72 65 63  handled.# correc
1420: 74 6c 79 2e 20 54 65 73 74 20 63 61 73 65 73 20  tly. Test cases 
1430: 73 61 76 65 70 6f 69 6e 74 2d 34 2e 2a 2e 0a 23  savepoint-4.*..#
1440: 20 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f   .do_test savepo
1450: 69 6e 74 2d 34 2e 31 20 7b 0a 20 20 65 78 65 63  int-4.1 {.  exec
1460: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
1470: 20 54 41 42 4c 45 20 74 32 28 64 2c 20 65 2c 20   TABLE t2(d, e, 
1480: 66 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 73  f);.    SELECT s
1490: 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
14a0: 61 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 7b 7b 43  aster;.  }.} {{C
14b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
14c0: 2c 20 62 2c 20 63 29 7d 20 7b 43 52 45 41 54 45  , b, c)} {CREATE
14d0: 20 54 41 42 4c 45 20 74 32 28 64 2c 20 65 2c 20   TABLE t2(d, e, 
14e0: 66 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76  f)}}.do_test sav
14f0: 65 70 6f 69 6e 74 2d 34 2e 32 20 7b 0a 20 20 65  epoint-4.2 {.  e
1500: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
1510: 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  IN;.    CREATE T
1520: 41 42 4c 45 20 74 33 28 67 2c 68 29 3b 0a 20 20  ABLE t3(g,h);.  
1530: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
1540: 20 56 41 4c 55 45 53 28 27 49 27 2c 20 27 49 49   VALUES('I', 'II
1550: 27 29 3b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e  ');.    SAVEPOIN
1560: 54 20 6f 6e 65 3b 0a 20 20 20 20 44 52 4f 50 20  T one;.    DROP 
1570: 54 41 42 4c 45 20 74 33 3b 0a 20 20 7d 0a 7d 20  TABLE t3;.  }.} 
1580: 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70  {}.do_test savep
1590: 6f 69 6e 74 2d 34 2e 33 20 7b 0a 20 20 65 78 65  oint-4.3 {.  exe
15a0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
15b0: 45 20 54 41 42 4c 45 20 74 33 28 67 2c 20 68 2c  E TABLE t3(g, h,
15c0: 20 69 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   i);.    INSERT 
15d0: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27  INTO t3 VALUES('
15e0: 49 49 49 27 2c 20 27 49 56 27 2c 20 27 56 27 29  III', 'IV', 'V')
15f0: 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ;.  }.  execsql 
1600: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
1610: 33 7d 0a 7d 20 7b 49 49 49 20 49 56 20 56 7d 0a  3}.} {III IV V}.
1620: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
1630: 74 2d 34 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  t-4.4 {.  execsq
1640: 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  l { ROLLBACK TO 
1650: 6f 6e 65 3b 20 7d 0a 20 20 65 78 65 63 73 71 6c  one; }.  execsql
1660: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
1670: 74 33 7d 0a 7d 20 7b 49 20 49 49 7d 0a 64 6f 5f  t3}.} {I II}.do_
1680: 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 34  test savepoint-4
1690: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
16a0: 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20  .    ROLLBACK;. 
16b0: 20 20 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52     SELECT sql FR
16c0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
16d0: 3b 0a 20 20 7d 0a 7d 20 7b 7b 43 52 45 41 54 45  ;.  }.} {{CREATE
16e0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20   TABLE t1(a, b, 
16f0: 63 29 7d 20 7b 43 52 45 41 54 45 20 54 41 42 4c  c)} {CREATE TABL
1700: 45 20 74 32 28 64 2c 20 65 2c 20 66 29 7d 7d 0a  E t2(d, e, f)}}.
1710: 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69  .do_test savepoi
1720: 6e 74 2d 34 2e 36 20 7b 0a 20 20 65 78 65 63 73  nt-4.6 {.  execs
1730: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
1740: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1750: 74 31 20 56 41 4c 55 45 53 28 27 6f 27 2c 20 27  t1 VALUES('o', '
1760: 74 27 2c 20 27 74 27 29 3b 0a 20 20 20 20 53 41  t', 't');.    SA
1770: 56 45 50 4f 49 4e 54 20 73 70 31 3b 0a 20 20 20  VEPOINT sp1;.   
1780: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
1790: 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 49  (a, b, c);.    I
17a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
17b0: 4c 55 45 53 28 27 7a 27 2c 20 27 79 27 2c 20 27  LUES('z', 'y', '
17c0: 78 27 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73  x');.  }.  execs
17d0: 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  ql {SELECT * FRO
17e0: 4d 20 74 33 7d 0a 7d 20 7b 7a 20 79 20 78 7d 0a  M t3}.} {z y x}.
17f0: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
1800: 74 2d 34 2e 37 20 7b 0a 20 20 65 78 65 63 73 71  t-4.7 {.  execsq
1810: 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  l {.    ROLLBACK
1820: 20 54 4f 20 73 70 31 3b 0a 20 20 20 20 43 52 45   TO sp1;.    CRE
1830: 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 29 3b  ATE TABLE t3(a);
1840: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1850: 20 74 33 20 56 41 4c 55 45 53 28 27 76 61 6c 75   t3 VALUES('valu
1860: 65 27 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73  e');.  }.  execs
1870: 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  ql {SELECT * FRO
1880: 4d 20 74 33 7d 0a 7d 20 7b 76 61 6c 75 65 7d 0a  M t3}.} {value}.
1890: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
18a0: 74 2d 34 2e 38 20 7b 0a 20 20 65 78 65 63 73 71  t-4.8 {.  execsq
18b0: 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 77 61  l COMMIT.} {}.wa
18c0: 6c 5f 63 68 65 63 6b 5f 6a 6f 75 72 6e 61 6c 5f  l_check_journal_
18d0: 6d 6f 64 65 20 73 61 76 65 70 6f 69 6e 74 2d 34  mode savepoint-4
18e0: 2e 39 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .9..#-----------
18f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
1930: 54 65 73 74 20 73 6f 6d 65 20 6c 6f 67 69 63 20  Test some logic 
1940: 65 72 72 6f 72 73 20 74 6f 20 64 6f 20 77 69 74  errors to do wit
1950: 68 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  h the savepoint 
1960: 66 65 61 74 75 72 65 2e 0a 23 20 0a 0a 69 66 63  feature..# ..ifc
1970: 61 70 61 62 6c 65 20 69 6e 63 72 62 6c 6f 62 20  apable incrblob 
1980: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65  {.  do_test save
1990: 70 6f 69 6e 74 2d 35 2e 31 2e 31 20 7b 0a 20 20  point-5.1.1 {.  
19a0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
19b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 62    CREATE TABLE b
19c0: 6c 6f 62 73 28 78 29 3b 0a 20 20 20 20 20 20 49  lobs(x);.      I
19d0: 4e 53 45 52 54 20 49 4e 54 4f 20 62 6c 6f 62 73  NSERT INTO blobs
19e0: 20 56 41 4c 55 45 53 28 27 61 20 74 77 65 6e 74   VALUES('a twent
19f0: 79 65 69 67 68 74 20 63 68 61 72 61 63 74 65 72  yeight character
1a00: 20 62 6c 6f 62 27 29 3b 0a 20 20 20 20 7d 0a 20   blob');.    }. 
1a10: 20 20 20 73 65 74 20 66 64 20 5b 64 62 20 69 6e     set fd [db in
1a20: 63 72 62 6c 6f 62 20 62 6c 6f 62 73 20 78 20 31  crblob blobs x 1
1a30: 5d 0a 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65  ].    puts -none
1a40: 77 6c 69 6e 65 20 24 66 64 20 22 68 65 6c 6c 6f  wline $fd "hello
1a50: 22 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  ".    catchsql {
1a60: 53 41 56 45 50 4f 49 4e 54 20 61 62 63 7d 0a 20  SAVEPOINT abc}. 
1a70: 20 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 6f 70   } {1 {cannot op
1a80: 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 2d 20 53  en savepoint - S
1a90: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  QL statements in
1aa0: 20 70 72 6f 67 72 65 73 73 7d 7d 0a 20 20 64 6f   progress}}.  do
1ab0: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
1ac0: 35 2e 31 2e 32 20 7b 0a 20 20 20 20 63 6c 6f 73  5.1.2 {.    clos
1ad0: 65 20 24 66 64 0a 20 20 20 20 63 61 74 63 68 73  e $fd.    catchs
1ae0: 71 6c 20 7b 53 41 56 45 50 4f 49 4e 54 20 61 62  ql {SAVEPOINT ab
1af0: 63 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20  c}.  } {0 {}}.  
1b00: 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70  .  do_test savep
1b10: 6f 69 6e 74 2d 35 2e 32 20 7b 0a 20 20 20 20 65  oint-5.2 {.    e
1b20: 78 65 63 73 71 6c 20 20 7b 52 45 4c 45 41 53 45  xecsql  {RELEASE
1b30: 20 61 62 63 7d 0a 20 20 20 20 63 61 74 63 68 73   abc}.    catchs
1b40: 71 6c 20 7b 52 45 4c 45 41 53 45 20 61 62 63 7d  ql {RELEASE abc}
1b50: 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68  .  } {1 {no such
1b60: 20 73 61 76 65 70 6f 69 6e 74 3a 20 61 62 63 7d   savepoint: abc}
1b70: 7d 0a 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 73  }.  .  do_test s
1b80: 61 76 65 70 6f 69 6e 74 2d 35 2e 33 2e 31 20 7b  avepoint-5.3.1 {
1b90: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 20 7b 53  .    execsql  {S
1ba0: 41 56 45 50 4f 49 4e 54 20 61 62 63 7d 0a 20 20  AVEPOINT abc}.  
1bb0: 20 20 63 61 74 63 68 73 71 6c 20 7b 52 4f 4c 4c    catchsql {ROLL
1bc0: 42 41 43 4b 20 54 4f 20 64 65 66 7d 0a 20 20 7d  BACK TO def}.  }
1bd0: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 73 61 76   {1 {no such sav
1be0: 65 70 6f 69 6e 74 3a 20 64 65 66 7d 7d 0a 20 20  epoint: def}}.  
1bf0: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
1c00: 74 2d 35 2e 33 2e 32 20 7b 0a 20 20 20 20 65 78  t-5.3.2 {.    ex
1c10: 65 63 73 71 6c 20 20 7b 53 41 56 45 50 4f 49 4e  ecsql  {SAVEPOIN
1c20: 54 20 64 65 66 7d 0a 20 20 20 20 73 65 74 20 66  T def}.    set f
1c30: 64 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 2d  d [db incrblob -
1c40: 72 65 61 64 6f 6e 6c 79 20 62 6c 6f 62 73 20 78  readonly blobs x
1c50: 20 31 5d 0a 20 20 20 20 63 61 74 63 68 73 71 6c   1].    catchsql
1c60: 20 7b 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 64 65   {ROLLBACK TO de
1c70: 66 7d 0a 20 20 7d 20 7b 31 20 7b 63 61 6e 6e 6f  f}.  } {1 {canno
1c80: 74 20 72 6f 6c 6c 62 61 63 6b 20 73 61 76 65 70  t rollback savep
1c90: 6f 69 6e 74 20 2d 20 53 51 4c 20 73 74 61 74 65  oint - SQL state
1ca0: 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73  ments in progres
1cb0: 73 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73 61  s}}.  do_test sa
1cc0: 76 65 70 6f 69 6e 74 2d 35 2e 33 2e 33 20 7b 0a  vepoint-5.3.3 {.
1cd0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 20 7b 52      catchsql  {R
1ce0: 45 4c 45 41 53 45 20 64 65 66 7d 0a 20 20 7d 20  ELEASE def}.  } 
1cf0: 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  {0 {}}.  do_test
1d00: 20 73 61 76 65 70 6f 69 6e 74 2d 35 2e 33 2e 34   savepoint-5.3.4
1d10: 20 7b 0a 20 20 20 20 63 6c 6f 73 65 20 24 66 64   {.    close $fd
1d20: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 20 7b 73  .    execsql  {s
1d30: 61 76 65 70 6f 69 6e 74 20 64 65 66 7d 0a 20 20  avepoint def}.  
1d40: 20 20 73 65 74 20 66 64 20 5b 64 62 20 69 6e 63    set fd [db inc
1d50: 72 62 6c 6f 62 20 62 6c 6f 62 73 20 78 20 31 5d  rblob blobs x 1]
1d60: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 72  .    catchsql {r
1d70: 65 6c 65 61 73 65 20 64 65 66 7d 0a 20 20 7d 20  elease def}.  } 
1d80: 7b 31 20 7b 63 61 6e 6e 6f 74 20 72 65 6c 65 61  {1 {cannot relea
1d90: 73 65 20 73 61 76 65 70 6f 69 6e 74 20 2d 20 53  se savepoint - S
1da0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  QL statements in
1db0: 20 70 72 6f 67 72 65 73 73 7d 7d 0a 20 20 64 6f   progress}}.  do
1dc0: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
1dd0: 35 2e 33 2e 35 20 7b 0a 20 20 20 20 63 6c 6f 73  5.3.5 {.    clos
1de0: 65 20 24 66 64 0a 20 20 20 20 65 78 65 63 73 71  e $fd.    execsq
1df0: 6c 20 7b 72 65 6c 65 61 73 65 20 61 62 63 7d 0a  l {release abc}.
1e00: 20 20 7d 20 7b 7d 0a 20 20 0a 20 20 23 20 52 6f    } {}.  .  # Ro
1e10: 6c 6c 62 61 63 6b 20 6d 6f 64 65 3a 0a 20 20 23  llback mode:.  #
1e20: 0a 20 20 23 20 20 20 4f 70 65 6e 20 61 20 73 61  .  #   Open a sa
1e30: 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74  vepoint transact
1e40: 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 61  ion and insert a
1e50: 20 72 6f 77 20 69 6e 74 6f 20 74 68 65 20 64 61   row into the da
1e60: 74 61 62 61 73 65 2e 20 54 68 65 6e 2c 0a 20 20  tabase. Then,.  
1e70: 23 20 20 20 75 73 69 6e 67 20 61 20 73 65 63 6f  #   using a seco
1e80: 6e 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  nd database hand
1e90: 6c 65 2c 20 6f 70 65 6e 20 61 20 72 65 61 64 2d  le, open a read-
1ea0: 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
1eb0: 20 6f 6e 20 74 68 65 0a 20 20 23 20 20 20 64 61   on the.  #   da
1ec0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 43 68 65  tabase file. Che
1ed0: 63 6b 20 74 68 61 74 20 74 68 65 20 73 61 76 65  ck that the save
1ee0: 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
1ef0: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6d 6d  n cannot be comm
1f00: 69 74 74 65 64 0a 20 20 23 20 20 20 75 6e 74 69  itted.  #   unti
1f10: 6c 20 61 66 74 65 72 20 74 68 65 20 72 65 61 64  l after the read
1f20: 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1f30: 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
1f40: 64 2e 0a 20 20 23 0a 20 20 23 20 57 41 4c 20 6d  d..  #.  # WAL m
1f50: 6f 64 65 3a 0a 20 20 23 20 0a 20 20 23 20 20 20  ode:.  # .  #   
1f60: 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74  As above, except
1f70: 20 74 68 61 74 20 74 68 65 20 73 61 76 65 70 6f   that the savepo
1f80: 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
1f90: 63 61 6e 20 62 65 20 73 75 63 63 65 73 73 66 75  can be successfu
1fa0: 6c 6c 79 0a 20 20 23 20 20 20 63 6f 6d 6d 69 74  lly.  #   commit
1fb0: 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 72  ted before the r
1fc0: 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
1fd0: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c  tion has been cl
1fe0: 6f 73 65 64 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  osed..  #.  do_t
1ff0: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 35 2e  est savepoint-5.
2000: 34 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71  4.1 {.    execsq
2010: 6c 20 7b 0a 20 20 20 20 20 20 53 41 56 45 50 4f  l {.      SAVEPO
2020: 49 4e 54 20 6d 61 69 6e 3b 0a 20 20 20 20 20 20  INT main;.      
2030: 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 6c 6f 62  INSERT INTO blob
2040: 73 20 56 41 4c 55 45 53 28 27 61 6e 6f 74 68 65  s VALUES('anothe
2050: 72 20 62 6c 6f 62 27 29 3b 0a 20 20 20 20 7d 0a  r blob');.    }.
2060: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
2070: 20 73 61 76 65 70 6f 69 6e 74 2d 35 2e 34 2e 32   savepoint-5.4.2
2080: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64   {.    sqlite3 d
2090: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65  b2 test.db.    e
20a0: 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e 20 3b  xecsql { BEGIN ;
20b0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
20c0: 20 46 52 4f 4d 20 62 6c 6f 62 73 20 7d 20 64 62   FROM blobs } db
20d0: 32 0a 20 20 7d 20 7b 31 7d 0a 20 20 69 66 20 7b  2.  } {1}.  if {
20e0: 5b 77 61 6c 5f 69 73 5f 77 61 6c 5f 6d 6f 64 65  [wal_is_wal_mode
20f0: 5d 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74  ]} {.    do_test
2100: 20 73 61 76 65 70 6f 69 6e 74 2d 35 2e 34 2e 33   savepoint-5.4.3
2110: 20 7b 20 63 61 74 63 68 73 71 6c 20 22 52 45 4c   { catchsql "REL
2120: 45 41 53 45 20 6d 61 69 6e 22 20 7d 20 7b 30 20  EASE main" } {0 
2130: 7b 7d 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  {}}.    do_test 
2140: 73 61 76 65 70 6f 69 6e 74 2d 35 2e 34 2e 34 20  savepoint-5.4.4 
2150: 7b 20 64 62 32 20 63 6c 6f 73 65 20 20 20 20 20  { db2 close     
2160: 20 20 20 20 20 20 20 20 20 20 7d 20 7b 7d 0a 20            } {}. 
2170: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 64 6f   } else {.    do
2180: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
2190: 35 2e 34 2e 33 20 7b 0a 20 20 20 20 20 20 63 61  5.4.3 {.      ca
21a0: 74 63 68 73 71 6c 20 7b 20 52 45 4c 45 41 53 45  tchsql { RELEASE
21b0: 20 6d 61 69 6e 20 7d 0a 20 20 20 20 7d 20 7b 31   main }.    } {1
21c0: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
21d0: 63 6b 65 64 7d 7d 0a 20 20 20 20 64 6f 5f 74 65  cked}}.    do_te
21e0: 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 35 2e 34  st savepoint-5.4
21f0: 2e 34 20 7b 0a 20 20 20 20 20 20 64 62 32 20 63  .4 {.      db2 c
2200: 6c 6f 73 65 0a 20 20 20 20 20 20 63 61 74 63 68  lose.      catch
2210: 73 71 6c 20 7b 20 52 45 4c 45 41 53 45 20 6d 61  sql { RELEASE ma
2220: 69 6e 20 7d 0a 20 20 20 20 7d 20 7b 30 20 7b 7d  in }.    } {0 {}
2230: 7d 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20  }.  }.  do_test 
2240: 73 61 76 65 70 6f 69 6e 74 2d 35 2e 34 2e 35 20  savepoint-5.4.5 
2250: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
2260: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 62 6c  SELECT x FROM bl
2270: 6f 62 73 20 57 48 45 52 45 20 72 6f 77 69 64 20  obs WHERE rowid 
2280: 3d 20 32 20 7d 0a 20 20 7d 20 7b 7b 61 6e 6f 74  = 2 }.  } {{anot
2290: 68 65 72 20 62 6c 6f 62 7d 7d 0a 20 20 64 6f 5f  her blob}}.  do_
22a0: 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 35  test savepoint-5
22b0: 2e 34 2e 36 20 7b 0a 20 20 20 20 65 78 65 63 73  .4.6 {.    execs
22c0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  ql { SELECT coun
22d0: 74 28 2a 29 20 46 52 4f 4d 20 62 6c 6f 62 73 20  t(*) FROM blobs 
22e0: 7d 0a 20 20 7d 20 7b 32 7d 0a 7d 0a 77 61 6c 5f  }.  } {2}.}.wal_
22f0: 63 68 65 63 6b 5f 6a 6f 75 72 6e 61 6c 5f 6d 6f  check_journal_mo
2300: 64 65 20 73 61 76 65 70 6f 69 6e 74 2d 35 2e 35  de savepoint-5.5
2310: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
2320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
2360: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
2370: 74 73 2c 20 73 61 76 65 70 6f 69 6e 74 2d 36 2e  ts, savepoint-6.
2380: 2a 2c 20 74 65 73 74 20 61 6e 20 69 6e 63 72 2d  *, test an incr-
2390: 76 61 63 75 75 6d 20 69 6e 73 69 64 65 20 6f 66  vacuum inside of
23a0: 20 61 0a 23 20 63 6f 75 70 6c 65 20 6f 66 20 6e   a.# couple of n
23b0: 65 73 74 65 64 20 73 61 76 65 70 6f 69 6e 74 73  ested savepoints
23c0: 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 7b 61  ..#.ifcapable {a
23d0: 75 74 6f 76 61 63 75 75 6d 20 26 26 20 70 72 61  utovacuum && pra
23e0: 67 6d 61 7d 20 7b 0a 20 20 64 62 20 63 6c 6f 73  gma} {.  db clos
23f0: 65 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20  e.  forcedelete 
2400: 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65  test.db.  sqlite
2410: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 20 20  3 db test.db..  
2420: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
2430: 74 2d 36 2e 31 20 7b 0a 20 20 20 20 65 78 65 63  t-6.1 {.    exec
2440: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 61 75 74  sql { PRAGMA aut
2450: 6f 5f 76 61 63 75 75 6d 20 3d 20 69 6e 63 72 65  o_vacuum = incre
2460: 6d 65 6e 74 61 6c 20 7d 0a 20 20 20 20 77 61 6c  mental }.    wal
2470: 5f 73 65 74 5f 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  _set_journal_mod
2480: 65 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  e.    execsql {.
2490: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
24a0: 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a  LE t1(a, b, c);.
24b0: 20 20 20 20 20 20 43 52 45 41 54 45 20 49 4e 44        CREATE IND
24c0: 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62  EX i1 ON t1(a, b
24d0: 29 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a  );.      BEGIN;.
24e0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
24f0: 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64  O t1 VALUES(rand
2500: 73 74 72 28 31 30 2c 34 30 30 29 2c 72 61 6e 64  str(10,400),rand
2510: 73 74 72 28 31 30 2c 34 30 30 29 2c 72 61 6e 64  str(10,400),rand
2520: 73 74 72 28 31 30 2c 34 30 30 29 29 3b 0a 20 20  str(10,400));.  
2530: 20 20 7d 0a 20 20 20 20 73 65 74 20 72 20 22 72    }.    set r "r
2540: 61 6e 64 73 74 72 28 31 30 2c 34 30 30 29 22 0a  andstr(10,400)".
2550: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20      for {set ii 
2560: 30 7d 20 7b 24 69 69 20 3c 20 31 30 7d 20 7b 69  0} {$ii < 10} {i
2570: 6e 63 72 20 69 69 7d 20 7b 0a 20 20 20 20 20 20  ncr ii} {.      
2580: 65 78 65 63 73 71 6c 20 22 49 4e 53 45 52 54 20  execsql "INSERT 
2590: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 24  INTO t1 SELECT $
25a0: 72 2c 20 24 72 2c 20 24 72 20 46 52 4f 4d 20 74  r, $r, $r FROM t
25b0: 31 22 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65  1".    }.    exe
25c0: 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a  csql { COMMIT }.
25d0: 20 20 7d 20 7b 7d 0a 0a 20 20 69 6e 74 65 67 72    } {}..  integr
25e0: 69 74 79 5f 63 68 65 63 6b 20 73 61 76 65 70 6f  ity_check savepo
25f0: 69 6e 74 2d 36 2e 32 0a 0a 20 20 64 6f 5f 74 65  int-6.2..  do_te
2600: 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 36 2e 33  st savepoint-6.3
2610: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
2620: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61  .      PRAGMA ca
2630: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
2640: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
2650: 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45      UPDATE t1 SE
2660: 54 20 61 20 3d 20 72 61 6e 64 73 74 72 28 31 30  T a = randstr(10
2670: 2c 31 30 29 20 57 48 45 52 45 20 28 72 6f 77 69  ,10) WHERE (rowi
2680: 64 25 34 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  d%4)==0;.       
2690: 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
26a0: 20 20 20 20 20 20 20 20 20 20 44 45 4c 45 54 45            DELETE
26b0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72   FROM t1 WHERE r
26c0: 6f 77 69 64 25 32 3b 0a 20 20 20 20 20 20 20 20  owid%2;.        
26d0: 20 20 50 52 41 47 4d 41 20 69 6e 63 72 5f 76 61    PRAGMA incr_va
26e0: 63 75 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  cuum;.          
26f0: 53 41 56 45 50 4f 49 4e 54 20 74 77 6f 3b 0a 20  SAVEPOINT two;. 
2700: 20 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52             INSER
2710: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
2720: 20 72 61 6e 64 73 74 72 28 31 30 2c 34 30 30 29   randstr(10,400)
2730: 2c 20 72 61 6e 64 73 74 72 28 31 30 2c 34 30 30  , randstr(10,400
2740: 29 2c 20 63 20 46 52 4f 4d 20 74 31 3b 0a 20 20  ), c FROM t1;.  
2750: 20 20 20 20 20 20 20 20 20 20 44 45 4c 45 54 45            DELETE
2760: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72   FROM t1 WHERE r
2770: 6f 77 69 64 25 32 3b 0a 20 20 20 20 20 20 20 20  owid%2;.        
2780: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72 5f      PRAGMA incr_
2790: 76 61 63 75 75 6d 3b 0a 20 20 20 20 20 20 20 20  vacuum;.        
27a0: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b  ROLLBACK TO one;
27b0: 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  .      COMMIT;. 
27c0: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 69     }.  } {}..  i
27d0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 73  ntegrity_check s
27e0: 61 76 65 70 6f 69 6e 74 2d 36 2e 34 0a 0a 20 20  avepoint-6.4..  
27f0: 77 61 6c 5f 63 68 65 63 6b 5f 6a 6f 75 72 6e 61  wal_check_journa
2800: 6c 5f 6d 6f 64 65 20 73 61 76 65 70 6f 69 6e 74  l_mode savepoint
2810: 2d 36 2e 35 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  -6.5.}..#-------
2820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
2870: 6e 67 20 74 65 73 74 73 2c 20 73 61 76 65 70 6f  ng tests, savepo
2880: 69 6e 74 2d 37 2e 2a 2c 20 61 74 74 65 6d 70 74  int-7.*, attempt
2890: 20 74 6f 20 62 72 65 61 6b 20 74 68 65 20 6c 6f   to break the lo
28a0: 67 69 63 20 0a 23 20 73 75 72 72 6f 75 6e 64 69  gic .# surroundi
28b0: 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20 62 79  ng savepoints by
28c0: 20 67 72 6f 77 69 6e 67 20 61 6e 64 20 73 68 72   growing and shr
28d0: 69 6e 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62  inking the datab
28e0: 61 73 65 20 66 69 6c 65 2e 0a 23 0a 64 62 20 63  ase file..#.db c
28f0: 6c 6f 73 65 0a 66 6f 72 63 65 64 65 6c 65 74 65  lose.forcedelete
2900: 20 74 65 73 74 2e 64 62 0a 73 71 6c 69 74 65 33   test.db.sqlite3
2910: 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 64 6f 5f   db test.db..do_
2920: 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 37  test savepoint-7
2930: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
2940: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
2950: 75 75 6d 20 3d 20 69 6e 63 72 65 6d 65 6e 74 61  uum = incrementa
2960: 6c 20 7d 0a 20 20 77 61 6c 5f 73 65 74 5f 6a 6f  l }.  wal_set_jo
2970: 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 65 78 65  urnal_mode.  exe
2980: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
2990: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
29a0: 30 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  0;.    BEGIN;.  
29b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
29c0: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
29d0: 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   b);.      INSER
29e0: 54 20 49 4e 54 4f 20 74 31 28 61 29 20 56 41 4c  T INTO t1(a) VAL
29f0: 55 45 53 28 27 61 6c 6c 69 67 61 74 6f 72 27 29  UES('alligator')
2a00: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2a10: 4e 54 4f 20 74 31 28 61 29 20 56 41 4c 55 45 53  NTO t1(a) VALUES
2a20: 28 27 61 6e 67 65 6c 66 69 73 68 27 29 3b 0a 20  ('angelfish');. 
2a30: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2a40: 20 74 31 28 61 29 20 56 41 4c 55 45 53 28 27 61   t1(a) VALUES('a
2a50: 6e 74 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  nt');.      INSE
2a60: 52 54 20 49 4e 54 4f 20 74 31 28 61 29 20 56 41  RT INTO t1(a) VA
2a70: 4c 55 45 53 28 27 61 6e 74 65 6c 6f 70 65 27 29  LUES('antelope')
2a80: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2a90: 4e 54 4f 20 74 31 28 61 29 20 56 41 4c 55 45 53  NTO t1(a) VALUES
2aa0: 28 27 61 70 65 27 29 3b 0a 20 20 20 20 20 20 49  ('ape');.      I
2ab0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61 29  NSERT INTO t1(a)
2ac0: 20 56 41 4c 55 45 53 28 27 62 61 62 6f 6f 6e 27   VALUES('baboon'
2ad0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
2ae0: 49 4e 54 4f 20 74 31 28 61 29 20 56 41 4c 55 45  INTO t1(a) VALUE
2af0: 53 28 27 62 61 64 67 65 72 27 29 3b 0a 20 20 20  S('badger');.   
2b00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2b10: 31 28 61 29 20 56 41 4c 55 45 53 28 27 62 65 61  1(a) VALUES('bea
2b20: 72 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  r');.      INSER
2b30: 54 20 49 4e 54 4f 20 74 31 28 61 29 20 56 41 4c  T INTO t1(a) VAL
2b40: 55 45 53 28 27 62 65 65 74 6c 65 27 29 3b 0a 20  UES('beetle');. 
2b50: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2b60: 20 74 31 28 61 29 20 56 41 4c 55 45 53 28 27 62   t1(a) VALUES('b
2b70: 69 72 64 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  ird');.      INS
2b80: 45 52 54 20 49 4e 54 4f 20 74 31 28 61 29 20 56  ERT INTO t1(a) V
2b90: 41 4c 55 45 53 28 27 62 69 73 6f 6e 27 29 3b 0a  ALUES('bison');.
2ba0: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20        UPDATE t1 
2bb0: 53 45 54 20 62 20 3d 20 20 20 20 72 61 6e 64 73  SET b =    rands
2bc0: 74 72 28 31 30 30 30 2c 31 30 30 30 29 3b 0a 20  tr(1000,1000);. 
2bd0: 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53       UPDATE t1 S
2be0: 45 54 20 62 20 3d 20 62 7c 7c 72 61 6e 64 73 74  ET b = b||randst
2bf0: 72 28 31 30 30 30 2c 31 30 30 30 29 3b 0a 20 20  r(1000,1000);.  
2c00: 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45      UPDATE t1 SE
2c10: 54 20 62 20 3d 20 62 7c 7c 72 61 6e 64 73 74 72  T b = b||randstr
2c20: 28 31 30 30 30 2c 31 30 30 30 29 3b 0a 20 20 20  (1000,1000);.   
2c30: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
2c40: 20 62 20 3d 20 62 7c 7c 72 61 6e 64 73 74 72 28   b = b||randstr(
2c50: 31 30 2c 31 30 30 30 29 3b 0a 20 20 20 20 43 4f  10,1000);.    CO
2c60: 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 65 78 70 72  MMIT;.  }.  expr
2c70: 20 28 5b 65 78 65 63 73 71 6c 20 7b 20 50 52 41   ([execsql { PRA
2c80: 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74 20 7d  GMA page_count }
2c90: 5d 20 3e 20 32 30 29 0a 7d 20 7b 31 7d 0a 64 6f  ] > 20).} {1}.do
2ca0: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
2cb0: 37 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  7.2.1 {.  execsq
2cc0: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
2cd0: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
2ce0: 6e 65 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  ne;.      CREATE
2cf0: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b   TABLE t2(a, b);
2d00: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
2d10: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61 2c 20  TO t2 SELECT a, 
2d20: 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  b FROM t1;.     
2d30: 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65   ROLLBACK TO one
2d40: 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ;.  }.  execsql 
2d50: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  {.    PRAGMA int
2d60: 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20  egrity_check;.  
2d70: 7d 0a 7d 20 7b 6f 6b 7d 0a 64 6f 5f 74 65 73 74  }.} {ok}.do_test
2d80: 20 73 61 76 65 70 6f 69 6e 74 2d 37 2e 32 2e 32   savepoint-7.2.2
2d90: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2da0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 50     COMMIT;.    P
2db0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
2dc0: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b  check;.  }.} {ok
2dd0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70  }..do_test savep
2de0: 6f 69 6e 74 2d 37 2e 33 2e 31 20 7b 0a 20 20 65  oint-7.3.1 {.  e
2df0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
2e00: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
2e10: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
2e20: 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61 2c  NTO t2 SELECT a,
2e30: 20 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   b FROM t1;.  }.
2e40: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76  } {}.do_test sav
2e50: 65 70 6f 69 6e 74 2d 37 2e 33 2e 32 20 7b 0a 20  epoint-7.3.2 {. 
2e60: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
2e70: 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41 56 45  EGIN;.      SAVE
2e80: 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20  POINT one;.     
2e90: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
2ea0: 32 3b 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d  2;.        PRAGM
2eb0: 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61  A incremental_va
2ec0: 63 75 75 6d 3b 0a 20 20 20 20 20 20 20 20 53 41  cuum;.        SA
2ed0: 56 45 50 4f 49 4e 54 20 74 77 6f 3b 0a 20 20 20  VEPOINT two;.   
2ee0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
2ef0: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61 2c 20  TO t2 SELECT a, 
2f00: 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  b FROM t1;.     
2f10: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 74     ROLLBACK TO t
2f20: 77 6f 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  wo;.    COMMIT;.
2f30: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
2f40: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
2f50: 5f 63 68 65 63 6b 20 7d 0a 7d 20 7b 6f 6b 7d 0a  _check }.} {ok}.
2f60: 77 61 6c 5f 63 68 65 63 6b 5f 6a 6f 75 72 6e 61  wal_check_journa
2f70: 6c 5f 6d 6f 64 65 20 73 61 76 65 70 6f 69 6e 74  l_mode savepoint
2f80: 2d 37 2e 33 2e 33 0a 0a 64 6f 5f 74 65 73 74 20  -7.3.3..do_test 
2f90: 73 61 76 65 70 6f 69 6e 74 2d 37 2e 34 2e 31 20  savepoint-7.4.1 
2fa0: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 66  {.  db close.  f
2fb0: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
2fc0: 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  db.  sqlite3 db 
2fd0: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
2fe0: 6c 20 7b 20 50 52 41 47 4d 41 20 61 75 74 6f 5f  l { PRAGMA auto_
2ff0: 76 61 63 75 75 6d 20 3d 20 69 6e 63 72 65 6d 65  vacuum = increme
3000: 6e 74 61 6c 20 7d 0a 20 20 77 61 6c 5f 73 65 74  ntal }.  wal_set
3010: 5f 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20  _journal_mode.  
3020: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
3030: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
3040: 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   b, PRIMARY KEY(
3050: 61 2c 20 62 29 29 3b 0a 20 20 20 20 49 4e 53 45  a, b));.    INSE
3060: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
3070: 53 28 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31  S(randstr(1000,1
3080: 30 30 30 29 2c 20 72 61 6e 64 73 74 72 28 31 30  000), randstr(10
3090: 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 42  00,1000));.    B
30a0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45  EGIN;.      DELE
30b0: 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  TE FROM t1;.    
30c0: 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
30d0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e  .      PRAGMA in
30e0: 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d  cremental_vacuum
30f0: 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b  ;.      ROLLBACK
3100: 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d   TO one;.    COM
3110: 4d 49 54 3b 0a 20 20 7d 0a 0a 20 20 65 78 65 63  MIT;.  }..  exec
3120: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74  sql { PRAGMA int
3130: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 0a 7d  egrity_check }.}
3140: 20 7b 6f 6b 7d 0a 0a 64 6f 5f 74 65 73 74 20 73   {ok}..do_test s
3150: 61 76 65 70 6f 69 6e 74 2d 37 2e 35 2e 31 20 7b  avepoint-7.5.1 {
3160: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3170: 20 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e   PRAGMA incremen
3180: 74 61 6c 5f 76 61 63 75 75 6d 3b 0a 20 20 20 20  tal_vacuum;.    
3190: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 35 28  CREATE TABLE t5(
31a0: 78 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52  x, y);.    INSER
31b0: 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53  T INTO t5 VALUES
31c0: 28 31 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30  (1, randstr(1000
31d0: 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  ,1000));.    INS
31e0: 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55  ERT INTO t5 VALU
31f0: 45 53 28 32 2c 20 72 61 6e 64 73 74 72 28 31 30  ES(2, randstr(10
3200: 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 49  00,1000));.    I
3210: 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41  NSERT INTO t5 VA
3220: 4c 55 45 53 28 33 2c 20 72 61 6e 64 73 74 72 28  LUES(3, randstr(
3230: 31 30 30 30 2c 31 30 30 30 29 29 3b 0a 0a 20 20  1000,1000));..  
3240: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
3250: 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41  NSERT INTO t5 VA
3260: 4c 55 45 53 28 34 2c 20 72 61 6e 64 73 74 72 28  LUES(4, randstr(
3270: 31 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20  1000,1000));.   
3280: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3290: 35 20 56 41 4c 55 45 53 28 35 2c 20 72 61 6e 64  5 VALUES(5, rand
32a0: 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 29 3b  str(1000,1000));
32b0: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
32c0: 4f 4d 20 74 35 20 57 48 45 52 45 20 78 3d 31 20  OM t5 WHERE x=1 
32d0: 4f 52 20 78 3d 32 3b 0a 20 20 20 20 20 20 53 41  OR x=2;.      SA
32e0: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20  VEPOINT one;.   
32f0: 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72       PRAGMA incr
3300: 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 3b 0a  emental_vacuum;.
3310: 20 20 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e          SAVEPOIN
3320: 54 20 74 77 6f 3b 0a 20 20 20 20 20 20 20 20 20  T two;.         
3330: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20   INSERT INTO t5 
3340: 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 73 74  VALUES(1, randst
3350: 72 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a 20  r(1000,1000));. 
3360: 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20           INSERT 
3370: 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 32  INTO t5 VALUES(2
3380: 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31  , randstr(1000,1
3390: 30 30 30 29 29 3b 0a 20 20 20 20 20 20 20 20 52  000));.        R
33a0: 4f 4c 4c 42 41 43 4b 20 54 4f 20 74 77 6f 3b 0a  OLLBACK TO two;.
33b0: 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54        ROLLBACK T
33c0: 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49  O one;.    COMMI
33d0: 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e  T;.    PRAGMA in
33e0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20  tegrity_check;. 
33f0: 20 7d 0a 7d 20 7b 6f 6b 7d 0a 64 6f 5f 74 65 73   }.} {ok}.do_tes
3400: 74 20 73 61 76 65 70 6f 69 6e 74 2d 37 2e 35 2e  t savepoint-7.5.
3410: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
3420: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
3430: 35 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 77 61 6c 5f  5;.  }.} {}.wal_
3440: 63 68 65 63 6b 5f 6a 6f 75 72 6e 61 6c 5f 6d 6f  check_journal_mo
3450: 64 65 20 73 61 76 65 70 6f 69 6e 74 2d 37 2e 35  de savepoint-7.5
3460: 2e 33 0a 0a 23 20 54 65 73 74 20 6f 64 64 6c 79  .3..# Test oddly
3470: 20 6e 61 6d 65 64 20 61 6e 64 20 71 75 6f 74 65   named and quote
3480: 64 20 73 61 76 65 70 6f 69 6e 74 73 2e 0a 23 0a  d savepoints..#.
3490: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
34a0: 74 2d 38 2d 31 20 7b 0a 20 20 65 78 65 63 73 71  t-8-1 {.  execsq
34b0: 6c 20 7b 20 53 41 56 45 50 4f 49 4e 54 20 22 73  l { SAVEPOINT "s
34c0: 61 76 65 31 22 20 7d 0a 20 20 65 78 65 63 73 71  ave1" }.  execsq
34d0: 6c 20 7b 20 52 45 4c 45 41 53 45 20 73 61 76 65  l { RELEASE save
34e0: 31 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  1 }.} {}.do_test
34f0: 20 73 61 76 65 70 6f 69 6e 74 2d 38 2d 32 20 7b   savepoint-8-2 {
3500: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 41 56  .  execsql { SAV
3510: 45 50 4f 49 4e 54 20 22 49 6e 63 6c 75 64 69 6e  EPOINT "Includin
3520: 67 20 77 68 69 74 65 73 70 61 63 65 20 22 20 7d  g whitespace " }
3530: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 52 45 4c  .  execsql { REL
3540: 45 41 53 45 20 22 69 6e 63 6c 75 64 69 6e 67 20  EASE "including 
3550: 57 68 69 74 65 73 70 61 63 65 20 22 20 7d 0a 7d  Whitespace " }.}
3560: 20 7b 7d 0a 0a 23 20 54 65 73 74 20 74 68 61 74   {}..# Test that
3570: 20 74 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69   the authorizati
3580: 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 6f 72 6b  on callback work
3590: 73 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 61  s..#.ifcapable a
35a0: 75 74 68 20 7b 0a 20 20 70 72 6f 63 20 61 75 74  uth {.  proc aut
35b0: 68 20 7b 61 72 67 73 7d 20 7b 0a 20 20 20 20 65  h {args} {.    e
35c0: 76 61 6c 20 6c 61 70 70 65 6e 64 20 3a 3a 61 75  val lappend ::au
35d0: 74 68 64 61 74 61 20 24 61 72 67 73 0a 20 20 20  thdata $args.   
35e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
35f0: 4b 0a 20 20 7d 0a 20 20 64 62 20 61 75 74 68 20  K.  }.  db auth 
3600: 61 75 74 68 0a 0a 20 20 64 6f 5f 74 65 73 74 20  auth..  do_test 
3610: 73 61 76 65 70 6f 69 6e 74 2d 39 2e 31 20 7b 0a  savepoint-9.1 {.
3620: 20 20 20 20 73 65 74 20 3a 3a 61 75 74 68 64 61      set ::authda
3630: 74 61 20 5b 6c 69 73 74 5d 0a 20 20 20 20 65 78  ta [list].    ex
3640: 65 63 73 71 6c 20 7b 20 53 41 56 45 50 4f 49 4e  ecsql { SAVEPOIN
3650: 54 20 73 70 31 20 7d 0a 20 20 20 20 73 65 74 20  T sp1 }.    set 
3660: 3a 3a 61 75 74 68 64 61 74 61 0a 20 20 7d 20 7b  ::authdata.  } {
3670: 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54  SQLITE_SAVEPOINT
3680: 20 42 45 47 49 4e 20 73 70 31 20 7b 7d 20 7b 7d   BEGIN sp1 {} {}
3690: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65  }.  do_test save
36a0: 70 6f 69 6e 74 2d 39 2e 32 20 7b 0a 20 20 20 20  point-9.2 {.    
36b0: 73 65 74 20 3a 3a 61 75 74 68 64 61 74 61 20 5b  set ::authdata [
36c0: 6c 69 73 74 5d 0a 20 20 20 20 65 78 65 63 73 71  list].    execsq
36d0: 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  l { ROLLBACK TO 
36e0: 73 70 31 20 7d 0a 20 20 20 20 73 65 74 20 3a 3a  sp1 }.    set ::
36f0: 61 75 74 68 64 61 74 61 0a 20 20 7d 20 7b 53 51  authdata.  } {SQ
3700: 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 20 52  LITE_SAVEPOINT R
3710: 4f 4c 4c 42 41 43 4b 20 73 70 31 20 7b 7d 20 7b  OLLBACK sp1 {} {
3720: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76  }}.  do_test sav
3730: 65 70 6f 69 6e 74 2d 39 2e 33 20 7b 0a 20 20 20  epoint-9.3 {.   
3740: 20 73 65 74 20 3a 3a 61 75 74 68 64 61 74 61 20   set ::authdata 
3750: 5b 6c 69 73 74 5d 0a 20 20 20 20 65 78 65 63 73  [list].    execs
3760: 71 6c 20 7b 20 52 45 4c 45 41 53 45 20 73 70 31  ql { RELEASE sp1
3770: 20 7d 0a 20 20 20 20 73 65 74 20 3a 3a 61 75 74   }.    set ::aut
3780: 68 64 61 74 61 0a 20 20 7d 20 7b 53 51 4c 49 54  hdata.  } {SQLIT
3790: 45 5f 53 41 56 45 50 4f 49 4e 54 20 52 45 4c 45  E_SAVEPOINT RELE
37a0: 41 53 45 20 73 70 31 20 7b 7d 20 7b 7d 7d 0a 0a  ASE sp1 {} {}}..
37b0: 20 20 70 72 6f 63 20 61 75 74 68 20 7b 61 72 67    proc auth {arg
37c0: 73 7d 20 7b 0a 20 20 20 20 65 76 61 6c 20 6c 61  s} {.    eval la
37d0: 70 70 65 6e 64 20 3a 3a 61 75 74 68 64 61 74 61  ppend ::authdata
37e0: 20 24 61 72 67 73 0a 20 20 20 20 72 65 74 75 72   $args.    retur
37f0: 6e 20 53 51 4c 49 54 45 5f 44 45 4e 59 0a 20 20  n SQLITE_DENY.  
3800: 7d 0a 20 20 64 62 20 61 75 74 68 20 61 75 74 68  }.  db auth auth
3810: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65  ..  do_test save
3820: 70 6f 69 6e 74 2d 39 2e 34 20 7b 0a 20 20 20 20  point-9.4 {.    
3830: 73 65 74 20 3a 3a 61 75 74 68 64 61 74 61 20 5b  set ::authdata [
3840: 6c 69 73 74 5d 0a 20 20 20 20 73 65 74 20 72 65  list].    set re
3850: 73 20 5b 63 61 74 63 68 73 71 6c 20 7b 20 53 41  s [catchsql { SA
3860: 56 45 50 4f 49 4e 54 20 73 70 31 20 7d 5d 0a 20  VEPOINT sp1 }]. 
3870: 20 20 20 63 6f 6e 63 61 74 20 24 3a 3a 61 75 74     concat $::aut
3880: 68 64 61 74 61 20 24 72 65 73 0a 20 20 7d 20 7b  hdata $res.  } {
3890: 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54  SQLITE_SAVEPOINT
38a0: 20 42 45 47 49 4e 20 73 70 31 20 7b 7d 20 7b 7d   BEGIN sp1 {} {}
38b0: 20 31 20 7b 6e 6f 74 20 61 75 74 68 6f 72 69 7a   1 {not authoriz
38c0: 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73  ed}}.  do_test s
38d0: 61 76 65 70 6f 69 6e 74 2d 39 2e 35 20 7b 0a 20  avepoint-9.5 {. 
38e0: 20 20 20 73 65 74 20 3a 3a 61 75 74 68 64 61 74     set ::authdat
38f0: 61 20 5b 6c 69 73 74 5d 0a 20 20 20 20 73 65 74  a [list].    set
3900: 20 72 65 73 20 5b 63 61 74 63 68 73 71 6c 20 7b   res [catchsql {
3910: 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 31   ROLLBACK TO sp1
3920: 20 7d 5d 0a 20 20 20 20 63 6f 6e 63 61 74 20 24   }].    concat $
3930: 3a 3a 61 75 74 68 64 61 74 61 20 24 72 65 73 0a  ::authdata $res.
3940: 20 20 7d 20 7b 53 51 4c 49 54 45 5f 53 41 56 45    } {SQLITE_SAVE
3950: 50 4f 49 4e 54 20 52 4f 4c 4c 42 41 43 4b 20 73  POINT ROLLBACK s
3960: 70 31 20 7b 7d 20 7b 7d 20 31 20 7b 6e 6f 74 20  p1 {} {} 1 {not 
3970: 61 75 74 68 6f 72 69 7a 65 64 7d 7d 0a 20 20 64  authorized}}.  d
3980: 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74  o_test savepoint
3990: 2d 39 2e 36 20 7b 0a 20 20 20 20 73 65 74 20 3a  -9.6 {.    set :
39a0: 3a 61 75 74 68 64 61 74 61 20 5b 6c 69 73 74 5d  :authdata [list]
39b0: 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b 63 61  .    set res [ca
39c0: 74 63 68 73 71 6c 20 7b 20 52 45 4c 45 41 53 45  tchsql { RELEASE
39d0: 20 73 70 31 20 7d 5d 0a 20 20 20 20 63 6f 6e 63   sp1 }].    conc
39e0: 61 74 20 24 3a 3a 61 75 74 68 64 61 74 61 20 24  at $::authdata $
39f0: 72 65 73 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f  res.  } {SQLITE_
3a00: 53 41 56 45 50 4f 49 4e 54 20 52 45 4c 45 41 53  SAVEPOINT RELEAS
3a10: 45 20 73 70 31 20 7b 7d 20 7b 7d 20 31 20 7b 6e  E sp1 {} {} 1 {n
3a20: 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 7d 7d 0a  ot authorized}}.
3a30: 0a 20 20 63 61 74 63 68 20 7b 20 64 62 20 65 76  .  catch { db ev
3a40: 61 6c 20 52 4f 4c 4c 42 41 43 4b 20 7d 0a 20 20  al ROLLBACK }.  
3a50: 64 62 20 61 75 74 68 20 22 22 0a 7d 0a 0a 23 2d  db auth "".}..#-
3a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
3ab0: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d  ollowing tests -
3ac0: 20 73 61 76 65 70 6f 69 6e 74 2d 31 30 2e 2a 20   savepoint-10.* 
3ad0: 2d 20 74 65 73 74 20 74 68 65 20 69 6e 74 65 72  - test the inter
3ae0: 61 63 74 69 6f 6e 20 6f 66 20 0a 23 20 73 61 76  action of .# sav
3af0: 65 70 6f 69 6e 74 73 20 61 6e 64 20 41 54 54 41  epoints and ATTA
3b00: 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 23  CH statements..#
3b10: 20 0a 0a 23 20 46 69 72 73 74 20 6d 61 6b 65 20   ..# First make 
3b20: 73 75 72 65 20 69 74 20 69 73 20 6e 6f 74 20 70  sure it is not p
3b30: 6f 73 73 69 62 6c 65 20 74 6f 20 61 74 74 61 63  ossible to attac
3b40: 68 20 6f 72 20 64 65 74 61 63 68 20 61 20 64 61  h or detach a da
3b50: 74 61 62 61 73 65 20 77 68 69 6c 65 0a 23 20 61  tabase while.# a
3b60: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 6f 70   savepoint is op
3b70: 65 6e 20 28 69 74 20 69 73 20 6e 6f 74 20 70 6f  en (it is not po
3b80: 73 73 69 62 6c 65 20 69 66 20 61 6e 79 20 74 72  ssible if any tr
3b90: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
3ba0: 6e 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 73 61  n)..#.do_test sa
3bb0: 76 65 70 6f 69 6e 74 2d 31 30 2e 31 2e 31 20 7b  vepoint-10.1.1 {
3bc0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
3bd0: 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
3be0: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
3bf0: 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b 0a 20  t2.db' AS aux;. 
3c00: 20 7d 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20   }.} {1 {cannot 
3c10: 41 54 54 41 43 48 20 64 61 74 61 62 61 73 65 20  ATTACH database 
3c20: 77 69 74 68 69 6e 20 74 72 61 6e 73 61 63 74 69  within transacti
3c30: 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76  on}}.do_test sav
3c40: 65 70 6f 69 6e 74 2d 31 30 2e 31 2e 32 20 7b 0a  epoint-10.1.2 {.
3c50: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3c60: 52 45 4c 45 41 53 45 20 6f 6e 65 3b 0a 20 20 20  RELEASE one;.   
3c70: 20 41 54 54 41 43 48 20 27 74 65 73 74 32 2e 64   ATTACH 'test2.d
3c80: 62 27 20 41 53 20 61 75 78 3b 0a 20 20 7d 0a 20  b' AS aux;.  }. 
3c90: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
3ca0: 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20  SAVEPOINT one;. 
3cb0: 20 20 20 44 45 54 41 43 48 20 61 75 78 3b 0a 20     DETACH aux;. 
3cc0: 20 7d 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20   }.} {1 {cannot 
3cd0: 44 45 54 41 43 48 20 64 61 74 61 62 61 73 65 20  DETACH database 
3ce0: 77 69 74 68 69 6e 20 74 72 61 6e 73 61 63 74 69  within transacti
3cf0: 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76  on}}.do_test sav
3d00: 65 70 6f 69 6e 74 2d 31 30 2e 31 2e 33 20 7b 0a  epoint-10.1.3 {.
3d10: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3d20: 52 45 4c 45 41 53 45 20 6f 6e 65 3b 0a 20 20 20  RELEASE one;.   
3d30: 20 44 45 54 41 43 48 20 61 75 78 3b 0a 20 20 7d   DETACH aux;.  }
3d40: 0a 7d 20 7b 7d 0a 0a 23 20 54 68 65 20 6c 6f 63  .} {}..# The loc
3d50: 6b 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 54  k state of the T
3d60: 45 4d 50 20 64 61 74 61 62 61 73 65 20 63 61 6e  EMP database can
3d70: 20 76 61 72 79 20 69 66 20 53 51 4c 49 54 45 5f   vary if SQLITE_
3d80: 54 45 4d 50 5f 53 54 4f 52 45 3d 33 0a 23 20 41  TEMP_STORE=3.# A
3d90: 6e 64 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nd the following
3da0: 20 73 65 74 20 6f 66 20 74 65 73 74 73 20 69 73   set of tests is
3db0: 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 69 6e 74   only really int
3dc0: 65 72 65 73 74 65 64 20 69 6e 20 74 68 65 20 73  erested in the s
3dd0: 74 61 74 75 73 0a 23 20 6f 66 20 74 68 65 20 61  tatus.# of the a
3de0: 75 78 31 20 61 6e 64 20 61 75 78 32 20 6c 6f 63  ux1 and aux2 loc
3df0: 6b 73 2e 20 20 53 6f 20 72 65 63 6f 72 64 20 74  ks.  So record t
3e00: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
3e10: 73 74 61 74 75 73 20 6f 66 0a 23 20 54 45 4d 50  status of.# TEMP
3e20: 20 66 6f 72 20 75 73 65 20 69 6e 20 74 68 65 20   for use in the 
3e30: 61 6e 73 77 65 72 73 2e 0a 73 65 74 20 74 65 6d  answers..set tem
3e40: 70 6c 6f 63 6b 73 74 61 74 65 20 5b 6c 69 6e 64  plockstate [lind
3e50: 65 78 20 5b 64 62 20 65 76 61 6c 20 7b 50 52 41  ex [db eval {PRA
3e60: 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 7d  GMA lock_status}
3e70: 5d 20 33 5d 0a 0a 0a 69 66 20 7b 5b 77 61 6c 5f  ] 3]...if {[wal_
3e80: 69 73 5f 77 61 6c 5f 6d 6f 64 65 5d 3d 3d 30 7d  is_wal_mode]==0}
3e90: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76   {.  do_test sav
3ea0: 65 70 6f 69 6e 74 2d 31 30 2e 32 2e 31 20 7b 0a  epoint-10.2.1 {.
3eb0: 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20      forcedelete 
3ec0: 74 65 73 74 33 2e 64 62 0a 20 20 20 20 66 6f 72  test3.db.    for
3ed0: 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64  cedelete test2.d
3ee0: 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  b.    execsql {.
3ef0: 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74 65        ATTACH 'te
3f00: 73 74 32 2e 64 62 27 20 41 53 20 61 75 78 31 3b  st2.db' AS aux1;
3f10: 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74  .      ATTACH 't
3f20: 65 73 74 33 2e 64 62 27 20 41 53 20 61 75 78 32  est3.db' AS aux2
3f30: 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42  ;.      DROP TAB
3f40: 4c 45 20 74 31 3b 0a 20 20 20 20 20 20 43 52 45  LE t1;.      CRE
3f50: 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 74  ATE TABLE main.t
3f60: 31 28 78 2c 20 79 29 3b 0a 20 20 20 20 20 20 43  1(x, y);.      C
3f70: 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 31  REATE TABLE aux1
3f80: 2e 74 32 28 78 2c 20 79 29 3b 0a 20 20 20 20 20  .t2(x, y);.     
3f90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75   CREATE TABLE au
3fa0: 78 32 2e 74 33 28 78 2c 20 79 29 3b 0a 20 20 20  x2.t3(x, y);.   
3fb0: 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46     SELECT name F
3fc0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
3fd0: 72 20 0a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e  r .        UNION
3fe0: 20 41 4c 4c 0a 20 20 20 20 20 20 53 45 4c 45 43   ALL.      SELEC
3ff0: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61 75 78 31  T name FROM aux1
4000: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a  .sqlite_master .
4010: 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
4020: 4c 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 6e  L.      SELECT n
4030: 61 6d 65 20 46 52 4f 4d 20 61 75 78 32 2e 73 71  ame FROM aux2.sq
4040: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20  lite_master;.   
4050: 20 7d 0a 20 20 7d 20 7b 74 31 20 74 32 20 74 33   }.  } {t1 t2 t3
4060: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65  }.  do_test save
4070: 70 6f 69 6e 74 2d 31 30 2e 32 2e 32 20 7b 0a 20  point-10.2.2 {. 
4080: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41     execsql { PRA
4090: 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20  GMA lock_status 
40a0: 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 6d 61 69 6e  }.  } [list main
40b0: 20 75 6e 6c 6f 63 6b 65 64 20 74 65 6d 70 20 24   unlocked temp $
40c0: 74 65 6d 70 6c 6f 63 6b 73 74 61 74 65 20 61 75  templockstate au
40d0: 78 31 20 75 6e 6c 6f 63 6b 65 64 20 61 75 78 32  x1 unlocked aux2
40e0: 20 75 6e 6c 6f 63 6b 65 64 5d 0a 20 20 0a 20 20   unlocked].  .  
40f0: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
4100: 74 2d 31 30 2e 32 2e 33 20 7b 0a 20 20 20 20 65  t-10.2.3 {.    e
4110: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
4120: 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20  AVEPOINT one;.  
4130: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4140: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
4150: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f  .      PRAGMA lo
4160: 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20 20 20 7d  ck_status;.    }
4170: 0a 20 20 7d 20 5b 6c 69 73 74 20 6d 61 69 6e 20  .  } [list main 
4180: 72 65 73 65 72 76 65 64 20 74 65 6d 70 20 24 74  reserved temp $t
4190: 65 6d 70 6c 6f 63 6b 73 74 61 74 65 20 61 75 78  emplockstate aux
41a0: 31 20 75 6e 6c 6f 63 6b 65 64 20 61 75 78 32 20  1 unlocked aux2 
41b0: 75 6e 6c 6f 63 6b 65 64 5d 0a 20 20 64 6f 5f 74  unlocked].  do_t
41c0: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 30  est savepoint-10
41d0: 2e 32 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73  .2.4 {.    execs
41e0: 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52  ql {.      INSER
41f0: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
4200: 28 33 2c 20 34 29 3b 0a 20 20 20 20 20 20 50 52  (3, 4);.      PR
4210: 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73  AGMA lock_status
4220: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 6c 69 73  ;.    }.  } [lis
4230: 74 20 6d 61 69 6e 20 72 65 73 65 72 76 65 64 20  t main reserved 
4240: 74 65 6d 70 20 24 74 65 6d 70 6c 6f 63 6b 73 74  temp $templockst
4250: 61 74 65 20 61 75 78 31 20 75 6e 6c 6f 63 6b 65  ate aux1 unlocke
4260: 64 20 61 75 78 32 20 72 65 73 65 72 76 65 64 5d  d aux2 reserved]
4270: 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70  .  do_test savep
4280: 6f 69 6e 74 2d 31 30 2e 32 2e 35 20 7b 0a 20 20  oint-10.2.5 {.  
4290: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
42a0: 20 20 53 41 56 45 50 4f 49 4e 54 20 74 77 6f 3b    SAVEPOINT two;
42b0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
42c0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 35 2c 20  TO t2 VALUES(5, 
42d0: 36 29 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  6);.      PRAGMA
42e0: 20 6c 6f 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20   lock_status;.  
42f0: 20 20 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 6d 61    }.  } [list ma
4300: 69 6e 20 72 65 73 65 72 76 65 64 20 74 65 6d 70  in reserved temp
4310: 20 24 74 65 6d 70 6c 6f 63 6b 73 74 61 74 65 20   $templockstate 
4320: 61 75 78 31 20 72 65 73 65 72 76 65 64 20 61 75  aux1 reserved au
4330: 78 32 20 72 65 73 65 72 76 65 64 5d 0a 20 20 64  x2 reserved].  d
4340: 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74  o_test savepoint
4350: 2d 31 30 2e 32 2e 36 20 7b 0a 20 20 20 20 65 78  -10.2.6 {.    ex
4360: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
4370: 20 46 52 4f 4d 20 74 32 20 7d 0a 20 20 7d 20 7b   FROM t2 }.  } {
4380: 35 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73  5 6}.  do_test s
4390: 61 76 65 70 6f 69 6e 74 2d 31 30 2e 32 2e 37 20  avepoint-10.2.7 
43a0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
43b0: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 74 77 6f 20  ROLLBACK TO two 
43c0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
43d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
43e0: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
43f0: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 30  est savepoint-10
4400: 2e 32 2e 38 20 7b 0a 20 20 20 20 65 78 65 63 73  .2.8 {.    execs
4410: 71 6c 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b  ql { PRAGMA lock
4420: 5f 73 74 61 74 75 73 20 7d 0a 20 20 7d 20 5b 6c  _status }.  } [l
4430: 69 73 74 20 6d 61 69 6e 20 72 65 73 65 72 76 65  ist main reserve
4440: 64 20 74 65 6d 70 20 24 74 65 6d 70 6c 6f 63 6b  d temp $templock
4450: 73 74 61 74 65 20 61 75 78 31 20 72 65 73 65 72  state aux1 reser
4460: 76 65 64 20 61 75 78 32 20 72 65 73 65 72 76 65  ved aux2 reserve
4470: 64 5d 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76  d].  do_test sav
4480: 65 70 6f 69 6e 74 2d 31 30 2e 32 2e 39 20 7b 0a  epoint-10.2.9 {.
4490: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
44a0: 4c 45 43 54 20 27 61 27 2c 20 2a 20 46 52 4f 4d  LECT 'a', * FROM
44b0: 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   t1 UNION ALL SE
44c0: 4c 45 43 54 20 27 62 27 2c 20 2a 20 46 52 4f 4d  LECT 'b', * FROM
44d0: 20 74 33 20 7d 0a 20 20 7d 20 7b 61 20 31 20 32   t3 }.  } {a 1 2
44e0: 20 62 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73   b 3 4}.  do_tes
44f0: 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 30 2e 32  t savepoint-10.2
4500: 2e 39 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .9 {.    execsql
4510: 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20   {.      INSERT 
4520: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 35  INTO t2 VALUES(5
4530: 2c 20 36 29 3b 0a 20 20 20 20 20 20 52 45 4c 45  , 6);.      RELE
4540: 41 53 45 20 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20  ASE one;.    }. 
4550: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20     execsql { .  
4560: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
4570: 4d 20 74 31 3b 0a 20 20 20 20 20 20 53 45 4c 45  M t1;.      SELE
4580: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
4590: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
45a0: 4d 20 74 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t3;.    }.  } 
45b0: 7b 31 20 32 20 35 20 36 20 33 20 34 7d 0a 20 20  {1 2 5 6 3 4}.  
45c0: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
45d0: 74 2d 31 30 2e 32 2e 39 20 7b 0a 20 20 20 20 65  t-10.2.9 {.    e
45e0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
45f0: 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d 0a 20 20  lock_status }.  
4600: 7d 20 5b 6c 69 73 74 20 6d 61 69 6e 20 75 6e 6c  } [list main unl
4610: 6f 63 6b 65 64 20 74 65 6d 70 20 24 74 65 6d 70  ocked temp $temp
4620: 6c 6f 63 6b 73 74 61 74 65 20 61 75 78 31 20 75  lockstate aux1 u
4630: 6e 6c 6f 63 6b 65 64 20 61 75 78 32 20 75 6e 6c  nlocked aux2 unl
4640: 6f 63 6b 65 64 5d 0a 20 20 0a 20 20 64 6f 5f 74  ocked].  .  do_t
4650: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 30  est savepoint-10
4660: 2e 32 2e 31 30 20 7b 0a 20 20 20 20 65 78 65 63  .2.10 {.    exec
4670: 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 53 41 56  sql { .      SAV
4680: 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20  EPOINT one;.    
4690: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
46a0: 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  t1 VALUES('a', '
46b0: 62 27 29 3b 0a 20 20 20 20 20 20 20 20 53 41 56  b');.        SAV
46c0: 45 50 4f 49 4e 54 20 74 77 6f 3b 0a 20 20 20 20  EPOINT two;.    
46d0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
46e0: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 63 27 2c  O t2 VALUES('c',
46f0: 20 27 64 27 29 3b 0a 20 20 20 20 20 20 20 20 20   'd');.         
4700: 20 53 41 56 45 50 4f 49 4e 54 20 74 68 72 65 65   SAVEPOINT three
4710: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e  ;.            IN
4720: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
4730: 55 45 53 28 27 65 27 2c 20 27 66 27 29 3b 0a 20  UES('e', 'f');. 
4740: 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c     }.    execsql
4750: 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54   { .      SELECT
4760: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
4770: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
4780: 74 32 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  t2;.      SELECT
4790: 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20   * FROM t3;.    
47a0: 7d 0a 20 20 7d 20 7b 31 20 32 20 61 20 62 20 35  }.  } {1 2 a b 5
47b0: 20 36 20 63 20 64 20 33 20 34 20 65 20 66 7d 0a   6 c d 3 4 e f}.
47c0: 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f    do_test savepo
47d0: 69 6e 74 2d 31 30 2e 32 2e 31 31 20 7b 0a 20 20  int-10.2.11 {.  
47e0: 20 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c    execsql { ROLL
47f0: 42 41 43 4b 20 54 4f 20 74 77 6f 20 7d 0a 20 20  BACK TO two }.  
4800: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
4810: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
4820: 20 74 31 3b 0a 20 20 20 20 20 20 53 45 4c 45 43   t1;.      SELEC
4830: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  T * FROM t2;.   
4840: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
4850: 20 74 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   t3;.    }.  } {
4860: 31 20 32 20 61 20 62 20 35 20 36 20 33 20 34 7d  1 2 a b 5 6 3 4}
4870: 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70  .  do_test savep
4880: 6f 69 6e 74 2d 31 30 2e 32 2e 31 32 20 7b 0a 20  oint-10.2.12 {. 
4890: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20     execsql { .  
48a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
48b0: 74 33 20 56 41 4c 55 45 53 28 27 67 27 2c 20 27  t3 VALUES('g', '
48c0: 68 27 29 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42  h');.      ROLLB
48d0: 41 43 4b 20 54 4f 20 74 77 6f 3b 0a 20 20 20 20  ACK TO two;.    
48e0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
48f0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
4900: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 53  FROM t1;.      S
4910: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
4920: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
4930: 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 7d 0a 20  FROM t3;.    }. 
4940: 20 7d 20 7b 31 20 32 20 61 20 62 20 35 20 36 20   } {1 2 a b 5 6 
4950: 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73  3 4}.  do_test s
4960: 61 76 65 70 6f 69 6e 74 2d 31 30 2e 32 2e 31 33  avepoint-10.2.13
4970: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
4980: 20 52 4f 4c 4c 42 41 43 4b 20 7d 0a 20 20 20 20   ROLLBACK }.    
4990: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
49a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
49b0: 31 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  1;.      SELECT 
49c0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20  * FROM t2;.     
49d0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
49e0: 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  3;.    }.  } {1 
49f0: 32 20 35 20 36 20 33 20 34 7d 0a 20 20 64 6f 5f  2 5 6 3 4}.  do_
4a00: 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31  test savepoint-1
4a10: 30 2e 32 2e 31 34 20 7b 0a 20 20 20 20 65 78 65  0.2.14 {.    exe
4a20: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6c 6f  csql { PRAGMA lo
4a30: 63 6b 5f 73 74 61 74 75 73 20 7d 0a 20 20 7d 20  ck_status }.  } 
4a40: 5b 6c 69 73 74 20 6d 61 69 6e 20 75 6e 6c 6f 63  [list main unloc
4a50: 6b 65 64 20 74 65 6d 70 20 24 74 65 6d 70 6c 6f  ked temp $templo
4a60: 63 6b 73 74 61 74 65 20 61 75 78 31 20 75 6e 6c  ckstate aux1 unl
4a70: 6f 63 6b 65 64 20 61 75 78 32 20 75 6e 6c 6f 63  ocked aux2 unloc
4a80: 6b 65 64 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  ked].}..#-------
4a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ad0: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
4ae0: 6e 67 20 74 65 73 74 73 20 2d 20 73 61 76 65 70  ng tests - savep
4af0: 6f 69 6e 74 2d 31 31 2e 2a 20 2d 20 74 65 73 74  oint-11.* - test
4b00: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
4b10: 20 6f 66 20 0a 23 20 73 61 76 65 70 6f 69 6e 74   of .# savepoint
4b20: 73 20 61 6e 64 20 63 72 65 61 74 69 6e 67 20 6f  s and creating o
4b30: 72 20 64 72 6f 70 70 69 6e 67 20 74 61 62 6c 65  r dropping table
4b40: 73 20 61 6e 64 20 69 6e 64 65 78 65 73 20 69 6e  s and indexes in
4b50: 20 0a 23 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   .# auto-vacuum 
4b60: 6d 6f 64 65 2e 0a 23 20 0a 64 6f 5f 74 65 73 74  mode..# .do_test
4b70: 20 73 61 76 65 70 6f 69 6e 74 2d 31 31 2e 31 20   savepoint-11.1 
4b80: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 66  {.  db close.  f
4b90: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
4ba0: 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  db.  sqlite3 db 
4bb0: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
4bc0: 6c 20 7b 20 50 52 41 47 4d 41 20 61 75 74 6f 5f  l { PRAGMA auto_
4bd0: 76 61 63 75 75 6d 20 3d 20 66 75 6c 6c 3b 20 7d  vacuum = full; }
4be0: 0a 20 20 77 61 6c 5f 73 65 74 5f 6a 6f 75 72 6e  .  wal_set_journ
4bf0: 61 6c 5f 6d 6f 64 65 0a 20 20 65 78 65 63 73 71  al_mode.  execsq
4c00: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
4c10: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 55 4e  ABLE t1(a, b, UN
4c20: 49 51 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20  IQUE(a, b));.   
4c30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4c40: 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 73 74  VALUES(1, randst
4c50: 72 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a 20  r(1000,1000));. 
4c60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4c70: 31 20 56 41 4c 55 45 53 28 32 2c 20 72 61 6e 64  1 VALUES(2, rand
4c80: 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 29 3b  str(1000,1000));
4c90: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
4ca0: 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 31 2e 32  t savepoint-11.2
4cb0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4cc0: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65     SAVEPOINT one
4cd0: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
4ce0: 41 42 4c 45 20 74 32 28 61 2c 20 62 2c 20 55 4e  ABLE t2(a, b, UN
4cf0: 49 51 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20  IQUE(a, b));.   
4d00: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74 77 6f     SAVEPOINT two
4d10: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
4d20: 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62 2c 20   TABLE t3(a, b, 
4d30: 55 4e 49 51 55 45 28 61 2c 20 62 29 29 3b 0a 20  UNIQUE(a, b));. 
4d40: 20 7d 0a 7d 20 7b 7d 0a 69 6e 74 65 67 72 69 74   }.} {}.integrit
4d50: 79 5f 63 68 65 63 6b 20 73 61 76 65 70 6f 69 6e  y_check savepoin
4d60: 74 2d 31 31 2e 33 0a 64 6f 5f 74 65 73 74 20 73  t-11.3.do_test s
4d70: 61 76 65 70 6f 69 6e 74 2d 31 31 2e 34 20 7b 0a  avepoint-11.4 {.
4d80: 20 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c    execsql { ROLL
4d90: 42 41 43 4b 20 54 4f 20 74 77 6f 20 7d 0a 7d 20  BACK TO two }.} 
4da0: 7b 7d 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65  {}.integrity_che
4db0: 63 6b 20 73 61 76 65 70 6f 69 6e 74 2d 31 31 2e  ck savepoint-11.
4dc0: 35 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f  5.do_test savepo
4dd0: 69 6e 74 2d 31 31 2e 36 20 7b 0a 20 20 65 78 65  int-11.6 {.  exe
4de0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 43 52 45 41  csql { .    CREA
4df0: 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62  TE TABLE t3(a, b
4e00: 2c 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29 3b  , UNIQUE(a, b));
4e10: 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  .    ROLLBACK TO
4e20: 20 6f 6e 65 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 69   one;.  }.} {}.i
4e30: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 73  ntegrity_check s
4e40: 61 76 65 70 6f 69 6e 74 2d 31 31 2e 37 0a 64 6f  avepoint-11.7.do
4e50: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
4e60: 31 31 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c  11.8 {.  execsql
4e70: 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d 0a 20 20   { ROLLBACK }.  
4e80: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
4e90: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
4ea0: 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  }.  file size te
4eb0: 73 74 2e 64 62 0a 7d 20 7b 38 31 39 32 7d 0a 0a  st.db.} {8192}..
4ec0: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
4ed0: 74 2d 31 31 2e 39 20 7b 0a 20 20 65 78 65 63 73  t-11.9 {.  execs
4ee0: 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41  ql {.    DROP TA
4ef0: 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 31  BLE IF EXISTS t1
4f00: 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
4f10: 20 49 46 20 45 58 49 53 54 53 20 74 32 3b 0a 20   IF EXISTS t2;. 
4f20: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46     DROP TABLE IF
4f30: 20 45 58 49 53 54 53 20 74 33 3b 0a 20 20 7d 0a   EXISTS t3;.  }.
4f40: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76  } {}.do_test sav
4f50: 65 70 6f 69 6e 74 2d 31 31 2e 31 30 20 7b 0a 20  epoint-11.10 {. 
4f60: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
4f70: 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
4f80: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
4f90: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
4fa0: 54 41 42 4c 45 20 74 32 28 78 2c 20 79 29 3b 0a  TABLE t2(x, y);.
4fb0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4fc0: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32  O t2 VALUES(1, 2
4fd0: 29 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49  );.      SAVEPOI
4fe0: 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20  NT one;.        
4ff0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
5000: 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 20  ALUES(3, 4);.   
5010: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74       SAVEPOINT t
5020: 77 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 44 52  wo;.          DR
5030: 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 20  OP TABLE t1;.   
5040: 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
5050: 20 74 77 6f 3b 0a 20 20 7d 0a 20 20 65 78 65 63   two;.  }.  exec
5060: 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  sql {SELECT * FR
5070: 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20 32 20 33 20  OM t2}.} {1 2 3 
5080: 34 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70  4}.do_test savep
5090: 6f 69 6e 74 2d 31 31 2e 31 31 20 7b 0a 20 20 65  oint-11.11 {.  e
50a0: 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20  xecsql COMMIT.} 
50b0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70  {}.do_test savep
50c0: 6f 69 6e 74 2d 31 31 2e 31 32 20 7b 0a 20 20 65  oint-11.12 {.  e
50d0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a  xecsql {SELECT *
50e0: 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20 32   FROM t2}.} {1 2
50f0: 20 33 20 34 7d 0a 77 61 6c 5f 63 68 65 63 6b 5f   3 4}.wal_check_
5100: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 61 76  journal_mode sav
5110: 65 70 6f 69 6e 74 2d 31 31 2e 31 33 0a 0a 23 2d  epoint-11.13..#-
5120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5160: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
5170: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d  ollowing tests -
5180: 20 73 61 76 65 70 6f 69 6e 74 2d 31 32 2e 2a 20   savepoint-12.* 
5190: 2d 20 74 65 73 74 20 74 68 65 20 69 6e 74 65 72  - test the inter
51a0: 61 63 74 69 6f 6e 20 6f 66 20 0a 23 20 73 61 76  action of .# sav
51b0: 65 70 6f 69 6e 74 73 20 61 6e 64 20 22 4f 4e 20  epoints and "ON 
51c0: 43 4f 4e 46 4c 49 43 54 20 52 4f 4c 4c 42 41 43  CONFLICT ROLLBAC
51d0: 4b 22 20 63 6c 61 75 73 65 73 2e 0a 23 20 0a 64  K" clauses..# .d
51e0: 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74  o_test savepoint
51f0: 2d 31 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -12.1 {.  execsq
5200: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
5210: 41 42 4c 45 20 74 34 28 61 20 50 52 49 4d 41 52  ABLE t4(a PRIMAR
5220: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 49  Y KEY, b);.    I
5230: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
5240: 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a  LUES(1, 'one');.
5250: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
5260: 20 73 61 76 65 70 6f 69 6e 74 2d 31 32 2e 32 20   savepoint-12.2 
5270: 7b 0a 20 20 23 20 54 68 65 20 66 69 6e 61 6c 20  {.  # The final 
5280: 73 74 61 74 65 6d 65 6e 74 20 6f 66 20 74 68 65  statement of the
5290: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 68   following SQL h
52a0: 69 74 73 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  its a constraint
52b0: 20 77 68 65 6e 20 74 68 65 0a 20 20 23 20 63 6f   when the.  # co
52c0: 6e 66 6c 69 63 74 20 68 61 6e 64 6c 69 6e 67 20  nflict handling 
52d0: 6d 6f 64 65 20 69 73 20 22 4f 52 20 52 4f 4c 4c  mode is "OR ROLL
52e0: 42 41 43 4b 22 20 61 6e 64 20 74 68 65 72 65 20  BACK" and there 
52f0: 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 0a  are a couple of.
5300: 20 20 23 20 6f 70 65 6e 20 73 61 76 65 70 6f 69    # open savepoi
5310: 6e 74 73 2e 20 41 74 20 6f 6e 65 20 70 6f 69 6e  nts. At one poin
5320: 74 20 74 68 69 73 20 77 6f 75 6c 64 20 66 61 69  t this would fai
5330: 6c 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 69  l to clear the i
5340: 6e 74 65 72 6e 61 6c 0a 20 20 23 20 72 65 63 6f  nternal.  # reco
5350: 72 64 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 73  rd of the open s
5360: 61 76 65 70 6f 69 6e 74 73 2c 20 72 65 73 75 6c  avepoints, resul
5370: 74 69 6e 67 20 69 6e 20 61 6e 20 61 73 73 65 72  ting in an asser
5380: 74 28 29 20 66 61 69 6c 75 72 65 20 0a 20 20 23  t() failure .  #
5390: 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 23 20 0a   later on..  # .
53a0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
53b0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
53c0: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
53d0: 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20  UES(2, 'two');. 
53e0: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73       SAVEPOINT s
53f0: 70 31 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  p1;.        INSE
5400: 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45  RT INTO t4 VALUE
5410: 53 28 33 2c 20 27 74 68 72 65 65 27 29 3b 0a 20  S(3, 'three');. 
5420: 20 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54         SAVEPOINT
5430: 20 73 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20   sp2;.          
5440: 49 4e 53 45 52 54 20 4f 52 20 52 4f 4c 4c 42 41  INSERT OR ROLLBA
5450: 43 4b 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45  CK INTO t4 VALUE
5460: 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 7d  S(1, 'one');.  }
5470: 0a 7d 20 7b 31 20 7b 63 6f 6c 75 6d 6e 20 61 20  .} {1 {column a 
5480: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 7d 7d 0a  is not unique}}.
5490: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
54a0: 74 2d 31 32 2e 33 20 7b 0a 20 20 73 71 6c 69 74  t-12.3 {.  sqlit
54b0: 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
54c0: 74 20 64 62 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65  t db.} {1}.do_te
54d0: 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 32 2e  st savepoint-12.
54e0: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  4 {.  execsql { 
54f0: 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 20 7d 0a  SAVEPOINT one }.
5500: 7d 20 7b 7d 0a 77 61 6c 5f 63 68 65 63 6b 5f 6a  } {}.wal_check_j
5510: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 61 76 65  ournal_mode save
5520: 70 6f 69 6e 74 2d 31 32 2e 35 0a 0a 23 2d 2d 2d  point-12.5..#---
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5570: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
5580: 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d 20 73  lowing tests - s
5590: 61 76 65 70 6f 69 6e 74 2d 31 33 2e 2a 20 2d 20  avepoint-13.* - 
55a0: 74 65 73 74 20 74 68 65 20 69 6e 74 65 72 61 63  test the interac
55b0: 74 69 6f 6e 20 6f 66 20 0a 23 20 73 61 76 65 70  tion of .# savep
55c0: 6f 69 6e 74 73 20 61 6e 64 20 22 6a 6f 75 72 6e  oints and "journ
55d0: 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66 22 2e 0a  al_mode = off"..
55e0: 23 20 0a 69 66 20 7b 5b 77 61 6c 5f 69 73 5f 77  # .if {[wal_is_w
55f0: 61 6c 5f 6d 6f 64 65 5d 3d 3d 30 7d 20 7b 0a 20  al_mode]==0} {. 
5600: 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69   do_test savepoi
5610: 6e 74 2d 31 33 2e 31 20 7b 0a 20 20 20 20 64 62  nt-13.1 {.    db
5620: 20 63 6c 6f 73 65 0a 20 20 20 20 63 61 74 63 68   close.    catch
5630: 20 7b 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65   {forcedelete te
5640: 73 74 2e 64 62 7d 0a 20 20 20 20 73 71 6c 69 74  st.db}.    sqlit
5650: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
5660: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5670: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20    BEGIN;.       
5680: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
5690: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
56a0: 62 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  b);.        INSE
56b0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
56c0: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 43  S(1, 2);.      C
56d0: 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 50 52 41  OMMIT;.      PRA
56e0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
56f0: 20 3d 20 6f 66 66 3b 0a 20 20 20 20 7d 0a 20 20   = off;.    }.  
5700: 7d 20 7b 6f 66 66 7d 0a 20 20 64 6f 5f 74 65 73  } {off}.  do_tes
5710: 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 33 2e 32  t savepoint-13.2
5720: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
5730: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
5740: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5750: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t1 VALUES(3, 4);
5760: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
5770: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b 34  TO t1 SELECT a+4
5780: 2c 62 2b 34 20 20 46 52 4f 4d 20 74 31 3b 0a 20  ,b+4  FROM t1;. 
5790: 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20       COMMIT;.   
57a0: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
57b0: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 33  est savepoint-13
57c0: 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .3 {.    execsql
57d0: 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a   {.      BEGIN;.
57e0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
57f0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c  NTO t1 VALUES(9,
5800: 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 53 41   10);.        SA
5810: 56 45 50 4f 49 4e 54 20 73 31 3b 0a 20 20 20 20  VEPOINT s1;.    
5820: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
5830: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 31 2c 20  O t1 VALUES(11, 
5840: 31 32 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49  12);.      COMMI
5850: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  T;.    }.  } {}.
5860: 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f    do_test savepo
5870: 69 6e 74 2d 31 33 2e 34 20 7b 0a 20 20 20 20 65  int-13.4 {.    e
5880: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42  xecsql {.      B
5890: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 49 4e  EGIN;.        IN
58a0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
58b0: 55 45 53 28 31 33 2c 20 31 34 29 3b 0a 20 20 20  UES(13, 14);.   
58c0: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73       SAVEPOINT s
58d0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53  1;.          INS
58e0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
58f0: 45 53 28 31 35 2c 20 31 36 29 3b 0a 20 20 20 20  ES(15, 16);.    
5900: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
5910: 73 31 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41  s1;.      ROLLBA
5920: 43 4b 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  CK;.      SELECT
5930: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
5940: 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35  }.  } {1 2 3 4 5
5950: 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31   6 7 8 9 10 11 1
5960: 32 7d 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 64  2}.}..db close.d
5970: 65 6c 65 74 65 5f 66 69 6c 65 20 74 65 73 74 2e  elete_file test.
5980: 64 62 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e  db.do_multiclien
5990: 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20 64 6f  t_test tn {.  do
59a0: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
59b0: 31 34 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73  14.$tn.1 {.    s
59c0: 71 6c 31 20 7b 0a 20 20 20 20 20 20 43 52 45 41  ql1 {.      CREA
59d0: 54 45 20 54 41 42 4c 45 20 66 6f 6f 28 78 29 3b  TE TABLE foo(x);
59e0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
59f0: 54 4f 20 66 6f 6f 20 56 41 4c 55 45 53 28 31 29  TO foo VALUES(1)
5a00: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
5a10: 4e 54 4f 20 66 6f 6f 20 56 41 4c 55 45 53 28 32  NTO foo VALUES(2
5a20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
5a30: 32 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  2 {.      BEGIN;
5a40: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
5a50: 2a 20 46 52 4f 4d 20 66 6f 6f 3b 0a 20 20 20 20  * FROM foo;.    
5a60: 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20 64 6f  }.  } {1 2}.  do
5a70: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
5a80: 31 34 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73  14.$tn.2 {.    s
5a90: 71 6c 31 20 7b 0a 20 20 20 20 20 20 53 41 56 45  ql1 {.      SAVE
5aa0: 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20  POINT one;.     
5ab0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 6f 6f   INSERT INTO foo
5ac0: 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20   VALUES(1);.    
5ad0: 7d 0a 20 20 20 20 63 73 71 6c 31 20 7b 20 52 45  }.    csql1 { RE
5ae0: 4c 45 41 53 45 20 6f 6e 65 20 7d 0a 20 20 7d 20  LEASE one }.  } 
5af0: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
5b00: 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65  locked}}.  do_te
5b10: 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 34 2e  st savepoint-14.
5b20: 24 74 6e 2e 33 20 7b 0a 20 20 20 20 73 71 6c 31  $tn.3 {.    sql1
5b30: 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f   { ROLLBACK TO o
5b40: 6e 65 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20  ne }.    sql2 { 
5b50: 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 73 71 6c  COMMIT }.    sql
5b60: 31 20 7b 20 52 45 4c 45 41 53 45 20 6f 6e 65 20  1 { RELEASE one 
5b70: 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74  }.  } {}..  do_t
5b80: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 34  est savepoint-14
5b90: 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 73 71 6c  .$tn.4 {.    sql
5ba0: 32 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  2 {.      BEGIN;
5bb0: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
5bc0: 2a 20 46 52 4f 4d 20 66 6f 6f 3b 0a 20 20 20 20  * FROM foo;.    
5bd0: 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20 64 6f  }.  } {1 2}.  do
5be0: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
5bf0: 31 34 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 73  14.$tn.5 {.    s
5c00: 71 6c 31 20 7b 0a 20 20 20 20 20 20 53 41 56 45  ql1 {.      SAVE
5c10: 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20  POINT one;.     
5c20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 6f 6f   INSERT INTO foo
5c30: 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20   VALUES(1);.    
5c40: 7d 0a 20 20 20 20 63 73 71 6c 31 20 7b 20 52 45  }.    csql1 { RE
5c50: 4c 45 41 53 45 20 6f 6e 65 20 7d 0a 20 20 7d 20  LEASE one }.  } 
5c60: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
5c70: 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65  locked}}.  do_te
5c80: 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 34 2e  st savepoint-14.
5c90: 24 74 6e 2e 36 20 7b 0a 20 20 20 20 73 71 6c 32  $tn.6 {.    sql2
5ca0: 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20   { COMMIT }.    
5cb0: 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 52 4f 4c  sql1 {.      ROL
5cc0: 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20  LBACK TO one;.  
5cd0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5ce0: 66 6f 6f 20 56 41 4c 55 45 53 28 33 29 3b 0a 20  foo VALUES(3);. 
5cf0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5d00: 20 66 6f 6f 20 56 41 4c 55 45 53 28 34 29 3b 0a   foo VALUES(4);.
5d10: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
5d20: 4f 20 66 6f 6f 20 56 41 4c 55 45 53 28 35 29 3b  O foo VALUES(5);
5d30: 0a 20 20 20 20 20 20 52 45 4c 45 41 53 45 20 6f  .      RELEASE o
5d40: 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d  ne;.    }.  } {}
5d50: 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70  .  do_test savep
5d60: 6f 69 6e 74 2d 31 34 2e 24 74 6e 2e 37 20 7b 0a  oint-14.$tn.7 {.
5d70: 20 20 20 20 73 71 6c 32 20 7b 20 43 52 45 41 54      sql2 { CREAT
5d80: 45 20 49 4e 44 45 58 20 66 6f 6f 69 64 78 20 4f  E INDEX fooidx O
5d90: 4e 20 66 6f 6f 28 78 29 3b 20 7d 0a 20 20 20 20  N foo(x); }.    
5da0: 73 71 6c 33 20 7b 20 50 52 41 47 4d 41 20 69 6e  sql3 { PRAGMA in
5db0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 0a  tegrity_check }.
5dc0: 20 20 7d 20 7b 6f 6b 7d 0a 7d 0a 0a 64 6f 5f 6d    } {ok}.}..do_m
5dd0: 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20  ulticlient_test 
5de0: 74 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73  tn {.  do_test s
5df0: 61 76 65 70 6f 69 6e 74 2d 31 35 2e 24 74 6e 2e  avepoint-15.$tn.
5e00: 31 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20  1 {.    sql1 {. 
5e10: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
5e20: 45 20 66 6f 6f 28 78 29 3b 0a 20 20 20 20 20 20  E foo(x);.      
5e30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 6f 6f 20  INSERT INTO foo 
5e40: 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 20  VALUES(1);.     
5e50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 6f 6f   INSERT INTO foo
5e60: 20 56 41 4c 55 45 53 28 32 29 3b 0a 20 20 20 20   VALUES(2);.    
5e70: 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47  }.    sql2 { BEG
5e80: 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN; SELECT * FRO
5e90: 4d 20 66 6f 6f 3b 20 7d 0a 20 20 7d 20 7b 31 20  M foo; }.  } {1 
5ea0: 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76  2}.  do_test sav
5eb0: 65 70 6f 69 6e 74 2d 31 35 2e 24 74 6e 2e 32 20  epoint-15.$tn.2 
5ec0: 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20  {.    sql1 {.   
5ed0: 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e     PRAGMA lockin
5ee0: 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53 49  g_mode = EXCLUSI
5ef0: 56 45 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  VE;.      BEGIN;
5f00: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
5f10: 49 4e 54 4f 20 66 6f 6f 20 56 41 4c 55 45 53 28  INTO foo VALUES(
5f20: 33 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 73  3);.    }.    cs
5f30: 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20  ql1 { COMMIT }. 
5f40: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
5f50: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
5f60: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
5f70: 31 35 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 73  15.$tn.3 {.    s
5f80: 71 6c 31 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d  ql1 { ROLLBACK }
5f90: 0a 20 20 20 20 73 71 6c 32 20 7b 20 43 4f 4d 4d  .    sql2 { COMM
5fa0: 49 54 20 7d 0a 20 20 20 20 73 71 6c 31 20 7b 0a  IT }.    sql1 {.
5fb0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
5fc0: 4f 20 66 6f 6f 20 56 41 4c 55 45 53 28 33 29 3b  O foo VALUES(3);
5fd0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f  .      PRAGMA lo
5fe0: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 4e 4f 52  cking_mode = NOR
5ff0: 4d 41 4c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  MAL;.      INSER
6000: 54 20 49 4e 54 4f 20 66 6f 6f 20 56 41 4c 55 45  T INTO foo VALUE
6010: 53 28 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  S(4);.    }.    
6020: 73 71 6c 32 20 7b 20 43 52 45 41 54 45 20 49 4e  sql2 { CREATE IN
6030: 44 45 58 20 66 6f 6f 69 64 78 20 4f 4e 20 66 6f  DEX fooidx ON fo
6040: 6f 28 78 29 3b 20 7d 0a 20 20 20 20 73 71 6c 33  o(x); }.    sql3
6050: 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
6060: 69 74 79 5f 63 68 65 63 6b 20 7d 0a 20 20 7d 20  ity_check }.  } 
6070: 7b 6f 6b 7d 0a 7d 0a 0a 64 6f 5f 6d 75 6c 74 69  {ok}.}..do_multi
6080: 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b  client_test tn {
6090: 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70  .  do_test savep
60a0: 6f 69 6e 74 2d 31 36 2e 24 74 6e 2e 31 20 7b 0a  oint-16.$tn.1 {.
60b0: 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20 20      sql1 {.     
60c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 66 6f   CREATE TABLE fo
60d0: 6f 28 78 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  o(x);.      INSE
60e0: 52 54 20 49 4e 54 4f 20 66 6f 6f 20 56 41 4c 55  RT INTO foo VALU
60f0: 45 53 28 31 29 3b 0a 20 20 20 20 20 20 49 4e 53  ES(1);.      INS
6100: 45 52 54 20 49 4e 54 4f 20 66 6f 6f 20 56 41 4c  ERT INTO foo VAL
6110: 55 45 53 28 32 29 3b 0a 20 20 20 20 7d 0a 20 20  UES(2);.    }.  
6120: 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73  } {}.  do_test s
6130: 61 76 65 70 6f 69 6e 74 2d 31 36 2e 24 74 6e 2e  avepoint-16.$tn.
6140: 32 20 7b 0a 0a 20 20 20 20 64 62 20 65 76 61 6c  2 {..    db eval
6150: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
6160: 66 6f 6f 7d 20 7b 0a 20 20 20 20 20 20 73 71 6c  foo} {.      sql
6170: 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  1 { INSERT INTO 
6180: 66 6f 6f 20 56 41 4c 55 45 53 28 33 29 20 7d 0a  foo VALUES(3) }.
6190: 20 20 20 20 20 20 73 71 6c 32 20 7b 20 53 45 4c        sql2 { SEL
61a0: 45 43 54 20 2a 20 46 52 4f 4d 20 66 6f 6f 20 7d  ECT * FROM foo }
61b0: 0a 20 20 20 20 20 20 73 71 6c 31 20 7b 20 49 4e  .      sql1 { IN
61c0: 53 45 52 54 20 49 4e 54 4f 20 66 6f 6f 20 56 41  SERT INTO foo VA
61d0: 4c 55 45 53 28 34 29 20 7d 0a 20 20 20 20 20 20  LUES(4) }.      
61e0: 62 72 65 61 6b 0a 20 20 20 20 7d 0a 0a 20 20 20  break.    }..   
61f0: 20 73 71 6c 32 20 7b 20 43 52 45 41 54 45 20 49   sql2 { CREATE I
6200: 4e 44 45 58 20 66 6f 6f 69 64 78 20 4f 4e 20 66  NDEX fooidx ON f
6210: 6f 6f 28 78 29 3b 20 7d 0a 20 20 20 20 73 71 6c  oo(x); }.    sql
6220: 33 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67  3 { PRAGMA integ
6230: 72 69 74 79 5f 63 68 65 63 6b 20 7d 0a 20 20 7d  rity_check }.  }
6240: 20 7b 6f 6b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   {ok}.  do_test 
6250: 73 61 76 65 70 6f 69 6e 74 2d 31 36 2e 24 74 6e  savepoint-16.$tn
6260: 2e 33 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20  .3 {.    sql1 { 
6270: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 66 6f  SELECT * FROM fo
6280: 6f 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34  o }.  } {1 2 3 4
6290: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
62a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
62e0: 23 20 54 68 69 73 20 6e 65 78 74 20 62 6c 6f 63  # This next bloc
62f0: 6b 20 6f 66 20 74 65 73 74 73 20 76 65 72 69 66  k of tests verif
6300: 69 65 73 20 74 68 61 74 20 61 20 70 72 6f 62 6c  ies that a probl
6310: 65 6d 20 72 65 70 6f 72 74 65 64 20 6f 6e 20 74  em reported on t
6320: 68 65 20 6d 61 69 6c 69 6e 67 0a 23 20 6c 69 73  he mailing.# lis
6330: 74 20 68 61 73 20 62 65 65 6e 20 72 65 73 6f 6c  t has been resol
6340: 76 65 64 2e 20 41 74 20 6f 6e 65 20 70 6f 69 6e  ved. At one poin
6350: 74 20 74 68 65 20 73 65 63 6f 6e 64 20 22 43 52  t the second "CR
6360: 45 41 54 45 20 54 41 42 4c 45 20 74 36 22 20 77  EATE TABLE t6" w
6370: 6f 75 6c 64 0a 23 20 66 61 69 6c 20 61 73 20 74  ould.# fail as t
6380: 61 62 6c 65 20 74 36 20 73 74 69 6c 6c 20 65 78  able t6 still ex
6390: 69 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 74  isted in the int
63a0: 65 72 6e 61 6c 20 63 61 63 68 65 20 6f 66 20 74  ernal cache of t
63b0: 68 65 20 64 62 20 73 63 68 65 6d 61 0a 23 20 28  he db schema.# (
63c0: 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68  even though it h
63d0: 61 64 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  ad been removed 
63e0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
63f0: 65 20 62 79 20 74 68 65 20 52 4f 4c 4c 42 41 43  e by the ROLLBAC
6400: 4b 20 0a 23 20 63 6f 6d 6d 61 6e 64 29 2e 0a 23  K .# command)..#
6410: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
6420: 2e 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .db.do_execsql_t
6430: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 37  est savepoint-17
6440: 2e 31 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  .1 {.  BEGIN;.  
6450: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
6460: 36 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  6(a, b);.    INS
6470: 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55  ERT INTO t6 VALU
6480: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 53 41  ES(1, 2);.    SA
6490: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20  VEPOINT one;.   
64a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
64b0: 36 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a  6 VALUES(3, 4);.
64c0: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
64d0: 6f 6e 65 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  one;.    SELECT 
64e0: 2a 20 46 52 4f 4d 20 74 36 3b 0a 20 20 52 4f 4c  * FROM t6;.  ROL
64f0: 4c 42 41 43 4b 3b 0a 7d 20 7b 31 20 32 7d 0a 0a  LBACK;.} {1 2}..
6500: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
6510: 73 61 76 65 70 6f 69 6e 74 2d 31 37 2e 32 20 7b  savepoint-17.2 {
6520: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
6530: 74 36 28 61 2c 20 62 29 3b 0a 7d 20 7b 7d 0a 0a  t6(a, b);.} {}..
6540: 66 69 6e 69 73 68 5f 74 65 73 74 0a              finish_test.