/ Hex Artifact Content
Login

Artifact 1f8a6b1aea9a0d05837adc463d4bf47bd9d0f1c842f1c2a9caccd639baf34bf9:


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 2e 31 20 7b 0a 20 20 20 20  t-5.3.2.1 {.    
1c10: 65 78 65 63 73 71 6c 20 20 7b 53 41 56 45 50 4f  execsql  {SAVEPO
1c20: 49 4e 54 20 64 65 66 7d 0a 20 20 20 20 73 65 74  INT def}.    set
1c30: 20 66 64 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62   fd [db incrblob
1c40: 20 2d 72 65 61 64 6f 6e 6c 79 20 62 6c 6f 62 73   -readonly blobs
1c50: 20 78 20 31 5d 0a 20 20 20 20 73 65 74 20 72 63   x 1].    set rc
1c60: 20 5b 63 61 74 63 68 20 7b 73 65 65 6b 20 24 66   [catch {seek $f
1c70: 64 20 30 3b 72 65 61 64 20 24 66 64 7d 20 72 65  d 0;read $fd} re
1c80: 73 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72  s].    lappend r
1c90: 63 20 24 72 65 73 0a 20 20 7d 20 7b 30 20 7b 68  c $res.  } {0 {h
1ca0: 65 6c 6c 6f 6e 74 79 65 69 67 68 74 20 63 68 61  ellontyeight cha
1cb0: 72 61 63 74 65 72 20 62 6c 6f 62 7d 7d 0a 20 20  racter blob}}.  
1cc0: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
1cd0: 74 2d 35 2e 33 2e 32 2e 32 20 7b 0a 20 20 20 20  t-5.3.2.2 {.    
1ce0: 63 61 74 63 68 73 71 6c 20 7b 52 4f 4c 4c 42 41  catchsql {ROLLBA
1cf0: 43 4b 20 54 4f 20 64 65 66 7d 0a 20 20 7d 20 7b  CK TO def}.  } {
1d00: 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  0 {}}.  do_test 
1d10: 73 61 76 65 70 6f 69 6e 74 2d 35 2e 33 2e 32 2e  savepoint-5.3.2.
1d20: 33 20 7b 0a 20 20 20 20 73 65 74 20 72 63 20 5b  3 {.    set rc [
1d30: 63 61 74 63 68 20 7b 73 65 65 6b 20 24 66 64 20  catch {seek $fd 
1d40: 30 3b 20 72 65 61 64 20 24 66 64 7d 20 72 65 73  0; read $fd} res
1d50: 5d 0a 20 20 20 20 73 65 74 20 72 63 0a 20 20 7d  ].    set rc.  }
1d60: 20 7b 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73   {0}.  do_test s
1d70: 61 76 65 70 6f 69 6e 74 2d 35 2e 33 2e 33 20 7b  avepoint-5.3.3 {
1d80: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 20 7b  .    catchsql  {
1d90: 52 45 4c 45 41 53 45 20 64 65 66 7d 0a 20 20 7d  RELEASE def}.  }
1da0: 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73   {0 {}}.  do_tes
1db0: 74 20 73 61 76 65 70 6f 69 6e 74 2d 35 2e 33 2e  t savepoint-5.3.
1dc0: 34 20 7b 0a 20 20 20 20 63 6c 6f 73 65 20 24 66  4 {.    close $f
1dd0: 64 0a 20 20 20 20 65 78 65 63 73 71 6c 20 20 7b  d.    execsql  {
1de0: 73 61 76 65 70 6f 69 6e 74 20 64 65 66 7d 0a 20  savepoint def}. 
1df0: 20 20 20 73 65 74 20 66 64 20 5b 64 62 20 69 6e     set fd [db in
1e00: 63 72 62 6c 6f 62 20 62 6c 6f 62 73 20 78 20 31  crblob blobs x 1
1e10: 5d 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  ].    catchsql {
1e20: 72 65 6c 65 61 73 65 20 64 65 66 7d 0a 20 20 7d  release def}.  }
1e30: 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 72 65 6c 65   {1 {cannot rele
1e40: 61 73 65 20 73 61 76 65 70 6f 69 6e 74 20 2d 20  ase savepoint - 
1e50: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69  SQL statements i
1e60: 6e 20 70 72 6f 67 72 65 73 73 7d 7d 0a 20 20 64  n progress}}.  d
1e70: 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74  o_test savepoint
1e80: 2d 35 2e 33 2e 35 20 7b 0a 20 20 20 20 63 6c 6f  -5.3.5 {.    clo
1e90: 73 65 20 24 66 64 0a 20 20 20 20 65 78 65 63 73  se $fd.    execs
1ea0: 71 6c 20 7b 72 65 6c 65 61 73 65 20 61 62 63 7d  ql {release abc}
1eb0: 0a 20 20 7d 20 7b 7d 0a 20 20 0a 20 20 23 20 52  .  } {}.  .  # R
1ec0: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 3a 0a 20 20  ollback mode:.  
1ed0: 23 0a 20 20 23 20 20 20 4f 70 65 6e 20 61 20 73  #.  #   Open a s
1ee0: 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
1ef0: 74 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20  tion and insert 
1f00: 61 20 72 6f 77 20 69 6e 74 6f 20 74 68 65 20 64  a row into the d
1f10: 61 74 61 62 61 73 65 2e 20 54 68 65 6e 2c 0a 20  atabase. Then,. 
1f20: 20 23 20 20 20 75 73 69 6e 67 20 61 20 73 65 63   #   using a sec
1f30: 6f 6e 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ond database han
1f40: 64 6c 65 2c 20 6f 70 65 6e 20 61 20 72 65 61 64  dle, open a read
1f50: 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1f60: 6e 20 6f 6e 20 74 68 65 0a 20 20 23 20 20 20 64  n on the.  #   d
1f70: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 43 68  atabase file. Ch
1f80: 65 63 6b 20 74 68 61 74 20 74 68 65 20 73 61 76  eck that the sav
1f90: 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
1fa0: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6d  on cannot be com
1fb0: 6d 69 74 74 65 64 0a 20 20 23 20 20 20 75 6e 74  mitted.  #   unt
1fc0: 69 6c 20 61 66 74 65 72 20 74 68 65 20 72 65 61  il after the rea
1fd0: 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1fe0: 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  on has been clos
1ff0: 65 64 2e 0a 20 20 23 0a 20 20 23 20 57 41 4c 20  ed..  #.  # WAL 
2000: 6d 6f 64 65 3a 0a 20 20 23 20 0a 20 20 23 20 20  mode:.  # .  #  
2010: 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70   As above, excep
2020: 74 20 74 68 61 74 20 74 68 65 20 73 61 76 65 70  t that the savep
2030: 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  oint transaction
2040: 20 63 61 6e 20 62 65 20 73 75 63 63 65 73 73 66   can be successf
2050: 75 6c 6c 79 0a 20 20 23 20 20 20 63 6f 6d 6d 69  ully.  #   commi
2060: 74 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  tted before the 
2070: 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
2080: 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
2090: 6c 6f 73 65 64 2e 0a 20 20 23 0a 20 20 64 6f 5f  losed..  #.  do_
20a0: 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 35  test savepoint-5
20b0: 2e 34 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73  .4.1 {.    execs
20c0: 71 6c 20 7b 0a 20 20 20 20 20 20 53 41 56 45 50  ql {.      SAVEP
20d0: 4f 49 4e 54 20 6d 61 69 6e 3b 0a 20 20 20 20 20  OINT main;.     
20e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 6c 6f   INSERT INTO blo
20f0: 62 73 20 56 41 4c 55 45 53 28 27 61 6e 6f 74 68  bs VALUES('anoth
2100: 65 72 20 62 6c 6f 62 27 29 3b 0a 20 20 20 20 7d  er blob');.    }
2110: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
2120: 74 20 73 61 76 65 70 6f 69 6e 74 2d 35 2e 34 2e  t savepoint-5.4.
2130: 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  2 {.    sqlite3 
2140: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20 20  db2 test.db.    
2150: 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e 20  execsql { BEGIN 
2160: 3b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ; SELECT count(*
2170: 29 20 46 52 4f 4d 20 62 6c 6f 62 73 20 7d 20 64  ) FROM blobs } d
2180: 62 32 0a 20 20 7d 20 7b 31 7d 0a 20 20 69 66 20  b2.  } {1}.  if 
2190: 7b 5b 77 61 6c 5f 69 73 5f 77 61 6c 5f 6d 6f 64  {[wal_is_wal_mod
21a0: 65 5d 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73  e]} {.    do_tes
21b0: 74 20 73 61 76 65 70 6f 69 6e 74 2d 35 2e 34 2e  t savepoint-5.4.
21c0: 33 20 7b 20 63 61 74 63 68 73 71 6c 20 22 52 45  3 { catchsql "RE
21d0: 4c 45 41 53 45 20 6d 61 69 6e 22 20 7d 20 7b 30  LEASE main" } {0
21e0: 20 7b 7d 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74   {}}.    do_test
21f0: 20 73 61 76 65 70 6f 69 6e 74 2d 35 2e 34 2e 34   savepoint-5.4.4
2200: 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 20 20 20   { db2 close    
2210: 20 20 20 20 20 20 20 20 20 20 20 7d 20 7b 7d 0a             } {}.
2220: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 64    } else {.    d
2230: 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74  o_test savepoint
2240: 2d 35 2e 34 2e 33 20 7b 0a 20 20 20 20 20 20 63  -5.4.3 {.      c
2250: 61 74 63 68 73 71 6c 20 7b 20 52 45 4c 45 41 53  atchsql { RELEAS
2260: 45 20 6d 61 69 6e 20 7d 0a 20 20 20 20 7d 20 7b  E main }.    } {
2270: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
2280: 6f 63 6b 65 64 7d 7d 0a 20 20 20 20 64 6f 5f 74  ocked}}.    do_t
2290: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 35 2e  est savepoint-5.
22a0: 34 2e 34 20 7b 0a 20 20 20 20 20 20 64 62 32 20  4.4 {.      db2 
22b0: 63 6c 6f 73 65 0a 20 20 20 20 20 20 63 61 74 63  close.      catc
22c0: 68 73 71 6c 20 7b 20 52 45 4c 45 41 53 45 20 6d  hsql { RELEASE m
22d0: 61 69 6e 20 7d 0a 20 20 20 20 7d 20 7b 30 20 7b  ain }.    } {0 {
22e0: 7d 7d 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74  }}.  }.  do_test
22f0: 20 73 61 76 65 70 6f 69 6e 74 2d 35 2e 34 2e 35   savepoint-5.4.5
2300: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
2310: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 62   SELECT x FROM b
2320: 6c 6f 62 73 20 57 48 45 52 45 20 72 6f 77 69 64  lobs WHERE rowid
2330: 20 3d 20 32 20 7d 0a 20 20 7d 20 7b 7b 61 6e 6f   = 2 }.  } {{ano
2340: 74 68 65 72 20 62 6c 6f 62 7d 7d 0a 20 20 64 6f  ther blob}}.  do
2350: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
2360: 35 2e 34 2e 36 20 7b 0a 20 20 20 20 65 78 65 63  5.4.6 {.    exec
2370: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  sql { SELECT cou
2380: 6e 74 28 2a 29 20 46 52 4f 4d 20 62 6c 6f 62 73  nt(*) FROM blobs
2390: 20 7d 0a 20 20 7d 20 7b 32 7d 0a 7d 0a 77 61 6c   }.  } {2}.}.wal
23a0: 5f 63 68 65 63 6b 5f 6a 6f 75 72 6e 61 6c 5f 6d  _check_journal_m
23b0: 6f 64 65 20 73 61 76 65 70 6f 69 6e 74 2d 35 2e  ode savepoint-5.
23c0: 35 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  5..#------------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
2410: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  The following te
2420: 73 74 73 2c 20 73 61 76 65 70 6f 69 6e 74 2d 36  sts, savepoint-6
2430: 2e 2a 2c 20 74 65 73 74 20 61 6e 20 69 6e 63 72  .*, test an incr
2440: 2d 76 61 63 75 75 6d 20 69 6e 73 69 64 65 20 6f  -vacuum inside o
2450: 66 20 61 0a 23 20 63 6f 75 70 6c 65 20 6f 66 20  f a.# couple of 
2460: 6e 65 73 74 65 64 20 73 61 76 65 70 6f 69 6e 74  nested savepoint
2470: 73 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 7b  s..#.ifcapable {
2480: 61 75 74 6f 76 61 63 75 75 6d 20 26 26 20 70 72  autovacuum && pr
2490: 61 67 6d 61 7d 20 7b 0a 20 20 64 62 20 63 6c 6f  agma} {.  db clo
24a0: 73 65 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65  se.  forcedelete
24b0: 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74   test.db.  sqlit
24c0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 20  e3 db test.db.. 
24d0: 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69   do_test savepoi
24e0: 6e 74 2d 36 2e 31 20 7b 0a 20 20 20 20 65 78 65  nt-6.1 {.    exe
24f0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 61 75  csql { PRAGMA au
2500: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 69 6e 63 72  to_vacuum = incr
2510: 65 6d 65 6e 74 61 6c 20 7d 0a 20 20 20 20 77 61  emental }.    wa
2520: 6c 5f 73 65 74 5f 6a 6f 75 72 6e 61 6c 5f 6d 6f  l_set_journal_mo
2530: 64 65 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  de.    execsql {
2540: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
2550: 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 29 3b  BLE t1(a, b, c);
2560: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 49 4e  .      CREATE IN
2570: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20  DEX i1 ON t1(a, 
2580: 62 29 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  b);.      BEGIN;
2590: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
25a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
25b0: 64 73 74 72 28 31 30 2c 34 30 30 29 2c 72 61 6e  dstr(10,400),ran
25c0: 64 73 74 72 28 31 30 2c 34 30 30 29 2c 72 61 6e  dstr(10,400),ran
25d0: 64 73 74 72 28 31 30 2c 34 30 30 29 29 3b 0a 20  dstr(10,400));. 
25e0: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 72 20 22     }.    set r "
25f0: 72 61 6e 64 73 74 72 28 31 30 2c 34 30 30 29 22  randstr(10,400)"
2600: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 69  .    for {set ii
2610: 20 30 7d 20 7b 24 69 69 20 3c 20 31 30 7d 20 7b   0} {$ii < 10} {
2620: 69 6e 63 72 20 69 69 7d 20 7b 0a 20 20 20 20 20  incr ii} {.     
2630: 20 65 78 65 63 73 71 6c 20 22 49 4e 53 45 52 54   execsql "INSERT
2640: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2650: 24 72 2c 20 24 72 2c 20 24 72 20 46 52 4f 4d 20  $r, $r, $r FROM 
2660: 74 31 22 0a 20 20 20 20 7d 0a 20 20 20 20 65 78  t1".    }.    ex
2670: 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d  ecsql { COMMIT }
2680: 0a 20 20 7d 20 7b 7d 0a 0a 20 20 69 6e 74 65 67  .  } {}..  integ
2690: 72 69 74 79 5f 63 68 65 63 6b 20 73 61 76 65 70  rity_check savep
26a0: 6f 69 6e 74 2d 36 2e 32 0a 0a 20 20 64 6f 5f 74  oint-6.2..  do_t
26b0: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 36 2e  est savepoint-6.
26c0: 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  3 {.    execsql 
26d0: 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63  {.      PRAGMA c
26e0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
26f0: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
2700: 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53       UPDATE t1 S
2710: 45 54 20 61 20 3d 20 72 61 6e 64 73 74 72 28 31  ET a = randstr(1
2720: 30 2c 31 30 29 20 57 48 45 52 45 20 28 72 6f 77  0,10) WHERE (row
2730: 69 64 25 34 29 3d 3d 30 3b 0a 20 20 20 20 20 20  id%4)==0;.      
2740: 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
2750: 0a 20 20 20 20 20 20 20 20 20 20 44 45 4c 45 54  .          DELET
2760: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
2770: 72 6f 77 69 64 25 32 3b 0a 20 20 20 20 20 20 20  rowid%2;.       
2780: 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72 5f 76     PRAGMA incr_v
2790: 61 63 75 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  acuum;.         
27a0: 20 53 41 56 45 50 4f 49 4e 54 20 74 77 6f 3b 0a   SAVEPOINT two;.
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 53 45              INSE
27c0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
27d0: 54 20 72 61 6e 64 73 74 72 28 31 30 2c 34 30 30  T randstr(10,400
27e0: 29 2c 20 72 61 6e 64 73 74 72 28 31 30 2c 34 30  ), randstr(10,40
27f0: 30 29 2c 20 63 20 46 52 4f 4d 20 74 31 3b 0a 20  0), c FROM t1;. 
2800: 20 20 20 20 20 20 20 20 20 20 20 44 45 4c 45 54             DELET
2810: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
2820: 72 6f 77 69 64 25 32 3b 0a 20 20 20 20 20 20 20  rowid%2;.       
2830: 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72       PRAGMA incr
2840: 5f 76 61 63 75 75 6d 3b 0a 20 20 20 20 20 20 20  _vacuum;.       
2850: 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65   ROLLBACK TO one
2860: 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ;.      COMMIT;.
2870: 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20      }.  } {}..  
2880: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
2890: 73 61 76 65 70 6f 69 6e 74 2d 36 2e 34 0a 0a 20  savepoint-6.4.. 
28a0: 20 77 61 6c 5f 63 68 65 63 6b 5f 6a 6f 75 72 6e   wal_check_journ
28b0: 61 6c 5f 6d 6f 64 65 20 73 61 76 65 70 6f 69 6e  al_mode savepoin
28c0: 74 2d 36 2e 35 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  t-6.5.}..#------
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2910: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
2920: 69 6e 67 20 74 65 73 74 73 2c 20 73 61 76 65 70  ing tests, savep
2930: 6f 69 6e 74 2d 37 2e 2a 2c 20 61 74 74 65 6d 70  oint-7.*, attemp
2940: 74 20 74 6f 20 62 72 65 61 6b 20 74 68 65 20 6c  t to break the l
2950: 6f 67 69 63 20 0a 23 20 73 75 72 72 6f 75 6e 64  ogic .# surround
2960: 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20 62  ing savepoints b
2970: 79 20 67 72 6f 77 69 6e 67 20 61 6e 64 20 73 68  y growing and sh
2980: 72 69 6e 6b 69 6e 67 20 74 68 65 20 64 61 74 61  rinking the data
2990: 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a 64 62 20  base file..#.db 
29a0: 63 6c 6f 73 65 0a 66 6f 72 63 65 64 65 6c 65 74  close.forcedelet
29b0: 65 20 74 65 73 74 2e 64 62 0a 73 71 6c 69 74 65  e test.db.sqlite
29c0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 64 6f  3 db test.db..do
29d0: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
29e0: 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.1 {.  execsql 
29f0: 7b 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61  { PRAGMA auto_va
2a00: 63 75 75 6d 20 3d 20 69 6e 63 72 65 6d 65 6e 74  cuum = increment
2a10: 61 6c 20 7d 0a 20 20 77 61 6c 5f 73 65 74 5f 6a  al }.  wal_set_j
2a20: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 65 78  ournal_mode.  ex
2a30: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
2a40: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
2a50: 31 30 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  10;.    BEGIN;. 
2a60: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2a70: 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  t1(a PRIMARY KEY
2a80: 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  , b);.      INSE
2a90: 52 54 20 49 4e 54 4f 20 74 31 28 61 29 20 56 41  RT INTO t1(a) VA
2aa0: 4c 55 45 53 28 27 61 6c 6c 69 67 61 74 6f 72 27  LUES('alligator'
2ab0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
2ac0: 49 4e 54 4f 20 74 31 28 61 29 20 56 41 4c 55 45  INTO t1(a) VALUE
2ad0: 53 28 27 61 6e 67 65 6c 66 69 73 68 27 29 3b 0a  S('angelfish');.
2ae0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2af0: 4f 20 74 31 28 61 29 20 56 41 4c 55 45 53 28 27  O t1(a) VALUES('
2b00: 61 6e 74 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  ant');.      INS
2b10: 45 52 54 20 49 4e 54 4f 20 74 31 28 61 29 20 56  ERT INTO t1(a) V
2b20: 41 4c 55 45 53 28 27 61 6e 74 65 6c 6f 70 65 27  ALUES('antelope'
2b30: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
2b40: 49 4e 54 4f 20 74 31 28 61 29 20 56 41 4c 55 45  INTO t1(a) VALUE
2b50: 53 28 27 61 70 65 27 29 3b 0a 20 20 20 20 20 20  S('ape');.      
2b60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61  INSERT INTO t1(a
2b70: 29 20 56 41 4c 55 45 53 28 27 62 61 62 6f 6f 6e  ) VALUES('baboon
2b80: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
2b90: 20 49 4e 54 4f 20 74 31 28 61 29 20 56 41 4c 55   INTO t1(a) VALU
2ba0: 45 53 28 27 62 61 64 67 65 72 27 29 3b 0a 20 20  ES('badger');.  
2bb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2bc0: 74 31 28 61 29 20 56 41 4c 55 45 53 28 27 62 65  t1(a) VALUES('be
2bd0: 61 72 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  ar');.      INSE
2be0: 52 54 20 49 4e 54 4f 20 74 31 28 61 29 20 56 41  RT INTO t1(a) VA
2bf0: 4c 55 45 53 28 27 62 65 65 74 6c 65 27 29 3b 0a  LUES('beetle');.
2c00: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2c10: 4f 20 74 31 28 61 29 20 56 41 4c 55 45 53 28 27  O t1(a) VALUES('
2c20: 62 69 72 64 27 29 3b 0a 20 20 20 20 20 20 49 4e  bird');.      IN
2c30: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61 29 20  SERT INTO t1(a) 
2c40: 56 41 4c 55 45 53 28 27 62 69 73 6f 6e 27 29 3b  VALUES('bison');
2c50: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31  .      UPDATE t1
2c60: 20 53 45 54 20 62 20 3d 20 20 20 20 72 61 6e 64   SET b =    rand
2c70: 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 3b 0a  str(1000,1000);.
2c80: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20        UPDATE t1 
2c90: 53 45 54 20 62 20 3d 20 62 7c 7c 72 61 6e 64 73  SET b = b||rands
2ca0: 74 72 28 31 30 30 30 2c 31 30 30 30 29 3b 0a 20  tr(1000,1000);. 
2cb0: 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53       UPDATE t1 S
2cc0: 45 54 20 62 20 3d 20 62 7c 7c 72 61 6e 64 73 74  ET b = b||randst
2cd0: 72 28 31 30 30 30 2c 31 30 30 30 29 3b 0a 20 20  r(1000,1000);.  
2ce0: 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45      UPDATE t1 SE
2cf0: 54 20 62 20 3d 20 62 7c 7c 72 61 6e 64 73 74 72  T b = b||randstr
2d00: 28 31 30 2c 31 30 30 30 29 3b 0a 20 20 20 20 43  (10,1000);.    C
2d10: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 65 78 70  OMMIT;.  }.  exp
2d20: 72 20 28 5b 65 78 65 63 73 71 6c 20 7b 20 50 52  r ([execsql { PR
2d30: 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74 20  AGMA page_count 
2d40: 7d 5d 20 3e 20 32 30 29 0a 7d 20 7b 31 7d 0a 64  }] > 20).} {1}.d
2d50: 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74  o_test savepoint
2d60: 2d 37 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73  -7.2.1 {.  execs
2d70: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
2d80: 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20        SAVEPOINT 
2d90: 6f 6e 65 3b 0a 20 20 20 20 20 20 43 52 45 41 54  one;.      CREAT
2da0: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  E TABLE t2(a, b)
2db0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2dc0: 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61 2c  NTO t2 SELECT a,
2dd0: 20 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   b FROM t1;.    
2de0: 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e    ROLLBACK TO on
2df0: 65 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  e;.  }.  execsql
2e00: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e   {.    PRAGMA in
2e10: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20  tegrity_check;. 
2e20: 20 7d 0a 7d 20 7b 6f 6b 7d 0a 64 6f 5f 74 65 73   }.} {ok}.do_tes
2e30: 74 20 73 61 76 65 70 6f 69 6e 74 2d 37 2e 32 2e  t savepoint-7.2.
2e40: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
2e50: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
2e60: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
2e70: 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 6f  _check;.  }.} {o
2e80: 6b 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 61 76 65  k}..do_test save
2e90: 70 6f 69 6e 74 2d 37 2e 33 2e 31 20 7b 0a 20 20  point-7.3.1 {.  
2ea0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
2eb0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
2ec0: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
2ed0: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61  INTO t2 SELECT a
2ee0: 2c 20 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  , b FROM t1;.  }
2ef0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 61  .} {}.do_test sa
2f00: 76 65 70 6f 69 6e 74 2d 37 2e 33 2e 32 20 7b 0a  vepoint-7.3.2 {.
2f10: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2f20: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41 56  BEGIN;.      SAV
2f30: 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20  EPOINT one;.    
2f40: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
2f50: 74 32 3b 0a 20 20 20 20 20 20 20 20 50 52 41 47  t2;.        PRAG
2f60: 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76  MA incremental_v
2f70: 61 63 75 75 6d 3b 0a 20 20 20 20 20 20 20 20 53  acuum;.        S
2f80: 41 56 45 50 4f 49 4e 54 20 74 77 6f 3b 0a 20 20  AVEPOINT two;.  
2f90: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2fa0: 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61 2c  NTO t2 SELECT a,
2fb0: 20 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   b FROM t1;.    
2fc0: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
2fd0: 74 77 6f 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  two;.    COMMIT;
2fe0: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
2ff0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
3000: 79 5f 63 68 65 63 6b 20 7d 0a 7d 20 7b 6f 6b 7d  y_check }.} {ok}
3010: 0a 77 61 6c 5f 63 68 65 63 6b 5f 6a 6f 75 72 6e  .wal_check_journ
3020: 61 6c 5f 6d 6f 64 65 20 73 61 76 65 70 6f 69 6e  al_mode savepoin
3030: 74 2d 37 2e 33 2e 33 0a 0a 64 6f 5f 74 65 73 74  t-7.3.3..do_test
3040: 20 73 61 76 65 70 6f 69 6e 74 2d 37 2e 34 2e 31   savepoint-7.4.1
3050: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
3060: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
3070: 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62  .db.  sqlite3 db
3080: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
3090: 71 6c 20 7b 20 50 52 41 47 4d 41 20 61 75 74 6f  ql { PRAGMA auto
30a0: 5f 76 61 63 75 75 6d 20 3d 20 69 6e 63 72 65 6d  _vacuum = increm
30b0: 65 6e 74 61 6c 20 7d 0a 20 20 77 61 6c 5f 73 65  ental }.  wal_se
30c0: 74 5f 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20  t_journal_mode. 
30d0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
30e0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
30f0: 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , b, PRIMARY KEY
3100: 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 49 4e 53  (a, b));.    INS
3110: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
3120: 45 53 28 72 61 6e 64 73 74 72 28 31 30 30 30 2c  ES(randstr(1000,
3130: 31 30 30 30 29 2c 20 72 61 6e 64 73 74 72 28 31  1000), randstr(1
3140: 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20  000,1000));.    
3150: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c  BEGIN;.      DEL
3160: 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  ETE FROM t1;.   
3170: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65     SAVEPOINT one
3180: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 69  ;.      PRAGMA i
3190: 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75  ncremental_vacuu
31a0: 6d 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43  m;.      ROLLBAC
31b0: 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f  K TO one;.    CO
31c0: 4d 4d 49 54 3b 0a 20 20 7d 0a 0a 20 20 65 78 65  MMIT;.  }..  exe
31d0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e  csql { PRAGMA in
31e0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 0a  tegrity_check }.
31f0: 7d 20 7b 6f 6b 7d 0a 0a 64 6f 5f 74 65 73 74 20  } {ok}..do_test 
3200: 73 61 76 65 70 6f 69 6e 74 2d 37 2e 35 2e 31 20  savepoint-7.5.1 
3210: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
3220: 20 20 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65    PRAGMA increme
3230: 6e 74 61 6c 5f 76 61 63 75 75 6d 3b 0a 20 20 20  ntal_vacuum;.   
3240: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 35   CREATE TABLE t5
3250: 28 78 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45  (x, y);.    INSE
3260: 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45  RT INTO t5 VALUE
3270: 53 28 31 2c 20 72 61 6e 64 73 74 72 28 31 30 30  S(1, randstr(100
3280: 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 49 4e  0,1000));.    IN
3290: 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c  SERT INTO t5 VAL
32a0: 55 45 53 28 32 2c 20 72 61 6e 64 73 74 72 28 31  UES(2, randstr(1
32b0: 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20  000,1000));.    
32c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56  INSERT INTO t5 V
32d0: 41 4c 55 45 53 28 33 2c 20 72 61 6e 64 73 74 72  ALUES(3, randstr
32e0: 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a 0a 20  (1000,1000));.. 
32f0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
3300: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56  INSERT INTO t5 V
3310: 41 4c 55 45 53 28 34 2c 20 72 61 6e 64 73 74 72  ALUES(4, randstr
3320: 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20  (1000,1000));.  
3330: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3340: 74 35 20 56 41 4c 55 45 53 28 35 2c 20 72 61 6e  t5 VALUES(5, ran
3350: 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 29  dstr(1000,1000))
3360: 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
3370: 52 4f 4d 20 74 35 20 57 48 45 52 45 20 78 3d 31  ROM t5 WHERE x=1
3380: 20 4f 52 20 78 3d 32 3b 0a 20 20 20 20 20 20 53   OR x=2;.      S
3390: 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20  AVEPOINT one;.  
33a0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e 63        PRAGMA inc
33b0: 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 3b  remental_vacuum;
33c0: 0a 20 20 20 20 20 20 20 20 53 41 56 45 50 4f 49  .        SAVEPOI
33d0: 4e 54 20 74 77 6f 3b 0a 20 20 20 20 20 20 20 20  NT two;.        
33e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35    INSERT INTO t5
33f0: 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 73   VALUES(1, rands
3400: 74 72 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a  tr(1000,1000));.
3410: 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54            INSERT
3420: 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28   INTO t5 VALUES(
3430: 32 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c  2, randstr(1000,
3440: 31 30 30 30 29 29 3b 0a 20 20 20 20 20 20 20 20  1000));.        
3450: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 74 77 6f 3b  ROLLBACK TO two;
3460: 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  .      ROLLBACK 
3470: 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d  TO one;.    COMM
3480: 49 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  IT;.    PRAGMA i
3490: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
34a0: 20 20 7d 0a 7d 20 7b 6f 6b 7d 0a 64 6f 5f 74 65    }.} {ok}.do_te
34b0: 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 37 2e 35  st savepoint-7.5
34c0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
34d0: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
34e0: 74 35 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 77 61 6c  t5;.  }.} {}.wal
34f0: 5f 63 68 65 63 6b 5f 6a 6f 75 72 6e 61 6c 5f 6d  _check_journal_m
3500: 6f 64 65 20 73 61 76 65 70 6f 69 6e 74 2d 37 2e  ode savepoint-7.
3510: 35 2e 33 0a 0a 23 20 54 65 73 74 20 6f 64 64 6c  5.3..# Test oddl
3520: 79 20 6e 61 6d 65 64 20 61 6e 64 20 71 75 6f 74  y named and quot
3530: 65 64 20 73 61 76 65 70 6f 69 6e 74 73 2e 0a 23  ed savepoints..#
3540: 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69  .do_test savepoi
3550: 6e 74 2d 38 2d 31 20 7b 0a 20 20 65 78 65 63 73  nt-8-1 {.  execs
3560: 71 6c 20 7b 20 53 41 56 45 50 4f 49 4e 54 20 22  ql { SAVEPOINT "
3570: 73 61 76 65 31 22 20 7d 0a 20 20 65 78 65 63 73  save1" }.  execs
3580: 71 6c 20 7b 20 52 45 4c 45 41 53 45 20 73 61 76  ql { RELEASE sav
3590: 65 31 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  e1 }.} {}.do_tes
35a0: 74 20 73 61 76 65 70 6f 69 6e 74 2d 38 2d 32 20  t savepoint-8-2 
35b0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 41  {.  execsql { SA
35c0: 56 45 50 4f 49 4e 54 20 22 49 6e 63 6c 75 64 69  VEPOINT "Includi
35d0: 6e 67 20 77 68 69 74 65 73 70 61 63 65 20 22 20  ng whitespace " 
35e0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 52 45  }.  execsql { RE
35f0: 4c 45 41 53 45 20 22 69 6e 63 6c 75 64 69 6e 67  LEASE "including
3600: 20 57 68 69 74 65 73 70 61 63 65 20 22 20 7d 0a   Whitespace " }.
3610: 7d 20 7b 7d 0a 0a 23 20 54 65 73 74 20 74 68 61  } {}..# Test tha
3620: 74 20 74 68 65 20 61 75 74 68 6f 72 69 7a 61 74  t the authorizat
3630: 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 6f 72  ion callback wor
3640: 6b 73 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20  ks..#.ifcapable 
3650: 61 75 74 68 20 7b 0a 20 20 70 72 6f 63 20 61 75  auth {.  proc au
3660: 74 68 20 7b 61 72 67 73 7d 20 7b 0a 20 20 20 20  th {args} {.    
3670: 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 3a 3a 61  eval lappend ::a
3680: 75 74 68 64 61 74 61 20 5b 6c 72 61 6e 67 65 20  uthdata [lrange 
3690: 24 61 72 67 73 20 30 20 34 5d 0a 20 20 20 20 72  $args 0 4].    r
36a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
36b0: 20 20 7d 0a 20 20 64 62 20 61 75 74 68 20 61 75    }.  db auth au
36c0: 74 68 0a 0a 20 20 64 6f 5f 74 65 73 74 20 73 61  th..  do_test sa
36d0: 76 65 70 6f 69 6e 74 2d 39 2e 31 20 7b 0a 20 20  vepoint-9.1 {.  
36e0: 20 20 73 65 74 20 3a 3a 61 75 74 68 64 61 74 61    set ::authdata
36f0: 20 5b 6c 69 73 74 5d 0a 20 20 20 20 65 78 65 63   [list].    exec
3700: 73 71 6c 20 7b 20 53 41 56 45 50 4f 49 4e 54 20  sql { SAVEPOINT 
3710: 73 70 31 20 7d 0a 20 20 20 20 73 65 74 20 3a 3a  sp1 }.    set ::
3720: 61 75 74 68 64 61 74 61 0a 20 20 7d 20 7b 53 51  authdata.  } {SQ
3730: 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 20 42  LITE_SAVEPOINT B
3740: 45 47 49 4e 20 73 70 31 20 7b 7d 20 7b 7d 7d 0a  EGIN sp1 {} {}}.
3750: 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f    do_test savepo
3760: 69 6e 74 2d 39 2e 32 20 7b 0a 20 20 20 20 73 65  int-9.2 {.    se
3770: 74 20 3a 3a 61 75 74 68 64 61 74 61 20 5b 6c 69  t ::authdata [li
3780: 73 74 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  st].    execsql 
3790: 7b 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70  { ROLLBACK TO sp
37a0: 31 20 7d 0a 20 20 20 20 73 65 74 20 3a 3a 61 75  1 }.    set ::au
37b0: 74 68 64 61 74 61 0a 20 20 7d 20 7b 53 51 4c 49  thdata.  } {SQLI
37c0: 54 45 5f 53 41 56 45 50 4f 49 4e 54 20 52 4f 4c  TE_SAVEPOINT ROL
37d0: 4c 42 41 43 4b 20 73 70 31 20 7b 7d 20 7b 7d 7d  LBACK sp1 {} {}}
37e0: 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70  .  do_test savep
37f0: 6f 69 6e 74 2d 39 2e 33 20 7b 0a 20 20 20 20 73  oint-9.3 {.    s
3800: 65 74 20 3a 3a 61 75 74 68 64 61 74 61 20 5b 6c  et ::authdata [l
3810: 69 73 74 5d 0a 20 20 20 20 65 78 65 63 73 71 6c  ist].    execsql
3820: 20 7b 20 52 45 4c 45 41 53 45 20 73 70 31 20 7d   { RELEASE sp1 }
3830: 0a 20 20 20 20 73 65 74 20 3a 3a 61 75 74 68 64  .    set ::authd
3840: 61 74 61 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f  ata.  } {SQLITE_
3850: 53 41 56 45 50 4f 49 4e 54 20 52 45 4c 45 41 53  SAVEPOINT RELEAS
3860: 45 20 73 70 31 20 7b 7d 20 7b 7d 7d 0a 0a 20 20  E sp1 {} {}}..  
3870: 70 72 6f 63 20 61 75 74 68 20 7b 61 72 67 73 7d  proc auth {args}
3880: 20 7b 0a 20 20 20 20 65 76 61 6c 20 6c 61 70 70   {.    eval lapp
3890: 65 6e 64 20 3a 3a 61 75 74 68 64 61 74 61 20 5b  end ::authdata [
38a0: 6c 72 61 6e 67 65 20 24 61 72 67 73 20 30 20 34  lrange $args 0 4
38b0: 5d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ].    return SQL
38c0: 49 54 45 5f 44 45 4e 59 0a 20 20 7d 0a 20 20 64  ITE_DENY.  }.  d
38d0: 62 20 61 75 74 68 20 61 75 74 68 0a 0a 20 20 64  b auth auth..  d
38e0: 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74  o_test savepoint
38f0: 2d 39 2e 34 20 7b 0a 20 20 20 20 73 65 74 20 3a  -9.4 {.    set :
3900: 3a 61 75 74 68 64 61 74 61 20 5b 6c 69 73 74 5d  :authdata [list]
3910: 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b 63 61  .    set res [ca
3920: 74 63 68 73 71 6c 20 7b 20 53 41 56 45 50 4f 49  tchsql { SAVEPOI
3930: 4e 54 20 73 70 31 20 7d 5d 0a 20 20 20 20 63 6f  NT sp1 }].    co
3940: 6e 63 61 74 20 24 3a 3a 61 75 74 68 64 61 74 61  ncat $::authdata
3950: 20 24 72 65 73 0a 20 20 7d 20 7b 53 51 4c 49 54   $res.  } {SQLIT
3960: 45 5f 53 41 56 45 50 4f 49 4e 54 20 42 45 47 49  E_SAVEPOINT BEGI
3970: 4e 20 73 70 31 20 7b 7d 20 7b 7d 20 31 20 7b 6e  N sp1 {} {} 1 {n
3980: 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 7d 7d 0a  ot authorized}}.
3990: 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f    do_test savepo
39a0: 69 6e 74 2d 39 2e 35 20 7b 0a 20 20 20 20 73 65  int-9.5 {.    se
39b0: 74 20 3a 3a 61 75 74 68 64 61 74 61 20 5b 6c 69  t ::authdata [li
39c0: 73 74 5d 0a 20 20 20 20 73 65 74 20 72 65 73 20  st].    set res 
39d0: 5b 63 61 74 63 68 73 71 6c 20 7b 20 52 4f 4c 4c  [catchsql { ROLL
39e0: 42 41 43 4b 20 54 4f 20 73 70 31 20 7d 5d 0a 20  BACK TO sp1 }]. 
39f0: 20 20 20 63 6f 6e 63 61 74 20 24 3a 3a 61 75 74     concat $::aut
3a00: 68 64 61 74 61 20 24 72 65 73 0a 20 20 7d 20 7b  hdata $res.  } {
3a10: 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54  SQLITE_SAVEPOINT
3a20: 20 52 4f 4c 4c 42 41 43 4b 20 73 70 31 20 7b 7d   ROLLBACK sp1 {}
3a30: 20 7b 7d 20 31 20 7b 6e 6f 74 20 61 75 74 68 6f   {} 1 {not autho
3a40: 72 69 7a 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73  rized}}.  do_tes
3a50: 74 20 73 61 76 65 70 6f 69 6e 74 2d 39 2e 36 20  t savepoint-9.6 
3a60: 7b 0a 20 20 20 20 73 65 74 20 3a 3a 61 75 74 68  {.    set ::auth
3a70: 64 61 74 61 20 5b 6c 69 73 74 5d 0a 20 20 20 20  data [list].    
3a80: 73 65 74 20 72 65 73 20 5b 63 61 74 63 68 73 71  set res [catchsq
3a90: 6c 20 7b 20 52 45 4c 45 41 53 45 20 73 70 31 20  l { RELEASE sp1 
3aa0: 7d 5d 0a 20 20 20 20 63 6f 6e 63 61 74 20 24 3a  }].    concat $:
3ab0: 3a 61 75 74 68 64 61 74 61 20 24 72 65 73 0a 20  :authdata $res. 
3ac0: 20 7d 20 7b 53 51 4c 49 54 45 5f 53 41 56 45 50   } {SQLITE_SAVEP
3ad0: 4f 49 4e 54 20 52 45 4c 45 41 53 45 20 73 70 31  OINT RELEASE sp1
3ae0: 20 7b 7d 20 7b 7d 20 31 20 7b 6e 6f 74 20 61 75   {} {} 1 {not au
3af0: 74 68 6f 72 69 7a 65 64 7d 7d 0a 0a 20 20 63 61  thorized}}..  ca
3b00: 74 63 68 20 7b 20 64 62 20 65 76 61 6c 20 52 4f  tch { db eval RO
3b10: 4c 4c 42 41 43 4b 20 7d 0a 20 20 64 62 20 61 75  LLBACK }.  db au
3b20: 74 68 20 22 22 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  th "".}..#------
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b70: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
3b80: 69 6e 67 20 74 65 73 74 73 20 2d 20 73 61 76 65  ing tests - save
3b90: 70 6f 69 6e 74 2d 31 30 2e 2a 20 2d 20 74 65 73  point-10.* - tes
3ba0: 74 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  t the interactio
3bb0: 6e 20 6f 66 20 0a 23 20 73 61 76 65 70 6f 69 6e  n of .# savepoin
3bc0: 74 73 20 61 6e 64 20 41 54 54 41 43 48 20 73 74  ts and ATTACH st
3bd0: 61 74 65 6d 65 6e 74 73 2e 0a 23 20 0a 0a 23 20  atements..# ..# 
3be0: 46 69 72 73 74 20 6d 61 6b 65 20 73 75 72 65 20  First make sure 
3bf0: 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
3c00: 6c 65 20 74 6f 20 61 74 74 61 63 68 20 6f 72 20  le to attach or 
3c10: 64 65 74 61 63 68 20 61 20 64 61 74 61 62 61 73  detach a databas
3c20: 65 20 77 68 69 6c 65 0a 23 20 61 20 73 61 76 65  e while.# a save
3c30: 70 6f 69 6e 74 20 69 73 20 6f 70 65 6e 20 28 69  point is open (i
3c40: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
3c50: 65 20 69 66 20 61 6e 79 20 74 72 61 6e 73 61 63  e if any transac
3c60: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 29 2e 0a 23  tion is open)..#
3c70: 0a 23 20 55 50 44 41 54 45 20 32 30 31 37 2d 30  .# UPDATE 2017-0
3c80: 37 2d 32 36 3a 20 20 49 74 20 69 73 20 6e 6f 74  7-26:  It is not
3c90: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 41 54 54   possible to ATT
3ca0: 41 43 48 20 61 6e 64 20 44 45 54 41 43 48 20 77  ACH and DETACH w
3cb0: 69 74 68 69 6e 20 61 0a 23 20 61 20 74 72 61 6e  ithin a.# a tran
3cc0: 73 61 63 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65  saction..#.do_te
3cd0: 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 30 2e  st savepoint-10.
3ce0: 31 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.1 {.  catchsql
3cf0: 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54   {.    SAVEPOINT
3d00: 20 6f 6e 65 3b 0a 20 20 20 20 41 54 54 41 43 48   one;.    ATTACH
3d10: 20 27 74 65 73 74 32 2e 64 62 27 20 41 53 20 61   'test2.db' AS a
3d20: 75 78 3b 0a 20 20 20 20 44 45 54 41 43 48 20 61  ux;.    DETACH a
3d30: 75 78 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d  ux;.  }.} {0 {}}
3d40: 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69  .do_test savepoi
3d50: 6e 74 2d 31 30 2e 31 2e 32 20 7b 0a 20 20 65 78  nt-10.1.2 {.  ex
3d60: 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 45 4c 45  ecsql {.    RELE
3d70: 41 53 45 20 6f 6e 65 3b 0a 20 20 20 20 41 54 54  ASE one;.    ATT
3d80: 41 43 48 20 27 74 65 73 74 32 2e 64 62 27 20 41  ACH 'test2.db' A
3d90: 53 20 61 75 78 3b 0a 20 20 7d 0a 20 20 63 61 74  S aux;.  }.  cat
3da0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45  chsql {.    SAVE
3db0: 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 44  POINT one;.    D
3dc0: 45 54 41 43 48 20 61 75 78 3b 0a 20 20 20 20 41  ETACH aux;.    A
3dd0: 54 54 41 43 48 20 27 74 65 73 74 32 2e 64 62 27  TTACH 'test2.db'
3de0: 20 41 53 20 61 75 78 3b 0a 20 20 7d 0a 7d 20 7b   AS aux;.  }.} {
3df0: 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 61  0 {}}.do_test sa
3e00: 76 65 70 6f 69 6e 74 2d 31 30 2e 31 2e 33 20 7b  vepoint-10.1.3 {
3e10: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3e20: 20 52 45 4c 45 41 53 45 20 6f 6e 65 3b 0a 20 20   RELEASE one;.  
3e30: 20 20 44 45 54 41 43 48 20 61 75 78 3b 0a 20 20    DETACH aux;.  
3e40: 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 68 65 20 6c 6f  }.} {}..# The lo
3e50: 63 6b 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  ck state of the 
3e60: 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 63 61  TEMP database ca
3e70: 6e 20 76 61 72 79 20 69 66 20 53 51 4c 49 54 45  n vary if SQLITE
3e80: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 33 0a 23 20  _TEMP_STORE=3.# 
3e90: 41 6e 64 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  And the followin
3ea0: 67 20 73 65 74 20 6f 66 20 74 65 73 74 73 20 69  g set of tests i
3eb0: 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 69 6e  s only really in
3ec0: 74 65 72 65 73 74 65 64 20 69 6e 20 74 68 65 20  terested in the 
3ed0: 73 74 61 74 75 73 0a 23 20 6f 66 20 74 68 65 20  status.# of the 
3ee0: 61 75 78 31 20 61 6e 64 20 61 75 78 32 20 6c 6f  aux1 and aux2 lo
3ef0: 63 6b 73 2e 20 20 53 6f 20 72 65 63 6f 72 64 20  cks.  So record 
3f00: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b  the current lock
3f10: 20 73 74 61 74 75 73 20 6f 66 0a 23 20 54 45 4d   status of.# TEM
3f20: 50 20 66 6f 72 20 75 73 65 20 69 6e 20 74 68 65  P for use in the
3f30: 20 61 6e 73 77 65 72 73 2e 0a 73 65 74 20 74 65   answers..set te
3f40: 6d 70 6c 6f 63 6b 73 74 61 74 65 20 5b 6c 69 6e  mplockstate [lin
3f50: 64 65 78 20 5b 64 62 20 65 76 61 6c 20 7b 50 52  dex [db eval {PR
3f60: 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73  AGMA lock_status
3f70: 7d 5d 20 33 5d 0a 0a 0a 69 66 20 7b 5b 77 61 6c  }] 3]...if {[wal
3f80: 5f 69 73 5f 77 61 6c 5f 6d 6f 64 65 5d 3d 3d 30  _is_wal_mode]==0
3f90: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 61  } {.  do_test sa
3fa0: 76 65 70 6f 69 6e 74 2d 31 30 2e 32 2e 31 20 7b  vepoint-10.2.1 {
3fb0: 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65  .    forcedelete
3fc0: 20 74 65 73 74 33 2e 64 62 0a 20 20 20 20 66 6f   test3.db.    fo
3fd0: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e  rcedelete test2.
3fe0: 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  db.    execsql {
3ff0: 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74  .      ATTACH 't
4000: 65 73 74 32 2e 64 62 27 20 41 53 20 61 75 78 31  est2.db' AS aux1
4010: 3b 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 27  ;.      ATTACH '
4020: 74 65 73 74 33 2e 64 62 27 20 41 53 20 61 75 78  test3.db' AS aux
4030: 32 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41  2;.      DROP TA
4040: 42 4c 45 20 74 31 3b 0a 20 20 20 20 20 20 43 52  BLE t1;.      CR
4050: 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e  EATE TABLE main.
4060: 74 31 28 78 2c 20 79 29 3b 0a 20 20 20 20 20 20  t1(x, y);.      
4070: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78  CREATE TABLE aux
4080: 31 2e 74 32 28 78 2c 20 79 29 3b 0a 20 20 20 20  1.t2(x, y);.    
4090: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
40a0: 75 78 32 2e 74 33 28 78 2c 20 79 29 3b 0a 20 20  ux2.t3(x, y);.  
40b0: 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20      SELECT name 
40c0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
40d0: 65 72 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  er;.      SELECT
40e0: 20 6e 61 6d 65 20 46 52 4f 4d 20 61 75 78 31 2e   name FROM aux1.
40f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20  sqlite_master;. 
4100: 20 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65       SELECT name
4110: 20 46 52 4f 4d 20 61 75 78 32 2e 73 71 6c 69 74   FROM aux2.sqlit
4120: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 7d 0a  e_master;.    }.
4130: 20 20 7d 20 7b 74 31 20 74 32 20 74 33 7d 0a 20    } {t1 t2 t3}. 
4140: 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69   do_test savepoi
4150: 6e 74 2d 31 30 2e 32 2e 32 20 7b 0a 20 20 20 20  nt-10.2.2 {.    
4160: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
4170: 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d 0a 20   lock_status }. 
4180: 20 7d 20 5b 6c 69 73 74 20 6d 61 69 6e 20 75 6e   } [list main un
4190: 6c 6f 63 6b 65 64 20 74 65 6d 70 20 24 74 65 6d  locked temp $tem
41a0: 70 6c 6f 63 6b 73 74 61 74 65 20 61 75 78 31 20  plockstate aux1 
41b0: 75 6e 6c 6f 63 6b 65 64 20 61 75 78 32 20 75 6e  unlocked aux2 un
41c0: 6c 6f 63 6b 65 64 5d 0a 20 20 0a 20 20 64 6f 5f  locked].  .  do_
41d0: 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31  test savepoint-1
41e0: 30 2e 32 2e 33 20 7b 0a 20 20 20 20 65 78 65 63  0.2.3 {.    exec
41f0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 41 56 45  sql {.      SAVE
4200: 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20  POINT one;.     
4210: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4220: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
4230: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f      PRAGMA lock_
4240: 73 74 61 74 75 73 3b 0a 20 20 20 20 7d 0a 20 20  status;.    }.  
4250: 7d 20 5b 6c 69 73 74 20 6d 61 69 6e 20 72 65 73  } [list main res
4260: 65 72 76 65 64 20 74 65 6d 70 20 24 74 65 6d 70  erved temp $temp
4270: 6c 6f 63 6b 73 74 61 74 65 20 61 75 78 31 20 75  lockstate aux1 u
4280: 6e 6c 6f 63 6b 65 64 20 61 75 78 32 20 75 6e 6c  nlocked aux2 unl
4290: 6f 63 6b 65 64 5d 0a 20 20 64 6f 5f 74 65 73 74  ocked].  do_test
42a0: 20 73 61 76 65 70 6f 69 6e 74 2d 31 30 2e 32 2e   savepoint-10.2.
42b0: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
42c0: 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  {.      INSERT I
42d0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 33 2c  NTO t3 VALUES(3,
42e0: 20 34 29 3b 0a 20 20 20 20 20 20 50 52 41 47 4d   4);.      PRAGM
42f0: 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 3b 0a 20  A lock_status;. 
4300: 20 20 20 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 6d     }.  } [list m
4310: 61 69 6e 20 72 65 73 65 72 76 65 64 20 74 65 6d  ain reserved tem
4320: 70 20 24 74 65 6d 70 6c 6f 63 6b 73 74 61 74 65  p $templockstate
4330: 20 61 75 78 31 20 75 6e 6c 6f 63 6b 65 64 20 61   aux1 unlocked a
4340: 75 78 32 20 72 65 73 65 72 76 65 64 5d 0a 20 20  ux2 reserved].  
4350: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
4360: 74 2d 31 30 2e 32 2e 35 20 7b 0a 20 20 20 20 65  t-10.2.5 {.    e
4370: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
4380: 41 56 45 50 4f 49 4e 54 20 74 77 6f 3b 0a 20 20  AVEPOINT two;.  
4390: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
43a0: 74 32 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b  t2 VALUES(5, 6);
43b0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f  .      PRAGMA lo
43c0: 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20 20 20 7d  ck_status;.    }
43d0: 0a 20 20 7d 20 5b 6c 69 73 74 20 6d 61 69 6e 20  .  } [list main 
43e0: 72 65 73 65 72 76 65 64 20 74 65 6d 70 20 24 74  reserved temp $t
43f0: 65 6d 70 6c 6f 63 6b 73 74 61 74 65 20 61 75 78  emplockstate aux
4400: 31 20 72 65 73 65 72 76 65 64 20 61 75 78 32 20  1 reserved aux2 
4410: 72 65 73 65 72 76 65 64 5d 0a 20 20 64 6f 5f 74  reserved].  do_t
4420: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 30  est savepoint-10
4430: 2e 32 2e 36 20 7b 0a 20 20 20 20 65 78 65 63 73  .2.6 {.    execs
4440: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
4450: 4f 4d 20 74 32 20 7d 0a 20 20 7d 20 7b 35 20 36  OM t2 }.  } {5 6
4460: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65  }.  do_test save
4470: 70 6f 69 6e 74 2d 31 30 2e 32 2e 37 20 7b 0a 20  point-10.2.7 {. 
4480: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c     execsql { ROL
4490: 4c 42 41 43 4b 20 54 4f 20 74 77 6f 20 7d 0a 20  LBACK TO two }. 
44a0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
44b0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 0a  ECT * FROM t2 }.
44c0: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
44d0: 20 73 61 76 65 70 6f 69 6e 74 2d 31 30 2e 32 2e   savepoint-10.2.
44e0: 38 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  8 {.    execsql 
44f0: 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74  { PRAGMA lock_st
4500: 61 74 75 73 20 7d 0a 20 20 7d 20 5b 6c 69 73 74  atus }.  } [list
4510: 20 6d 61 69 6e 20 72 65 73 65 72 76 65 64 20 74   main reserved t
4520: 65 6d 70 20 24 74 65 6d 70 6c 6f 63 6b 73 74 61  emp $templocksta
4530: 74 65 20 61 75 78 31 20 72 65 73 65 72 76 65 64  te aux1 reserved
4540: 20 61 75 78 32 20 72 65 73 65 72 76 65 64 5d 0a   aux2 reserved].
4550: 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f    do_test savepo
4560: 69 6e 74 2d 31 30 2e 32 2e 39 20 7b 0a 20 20 20  int-10.2.9 {.   
4570: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
4580: 54 20 27 61 27 2c 20 2a 20 46 52 4f 4d 20 74 31  T 'a', * FROM t1
4590: 20 3b 20 53 45 4c 45 43 54 20 27 62 27 2c 20 2a   ; SELECT 'b', *
45a0: 20 46 52 4f 4d 20 74 33 20 7d 0a 20 20 7d 20 7b   FROM t3 }.  } {
45b0: 61 20 31 20 32 20 62 20 33 20 34 7d 0a 20 20 64  a 1 2 b 3 4}.  d
45c0: 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74  o_test savepoint
45d0: 2d 31 30 2e 32 2e 39 20 7b 0a 20 20 20 20 65 78  -10.2.9 {.    ex
45e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e  ecsql {.      IN
45f0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
4600: 55 45 53 28 35 2c 20 36 29 3b 0a 20 20 20 20 20  UES(5, 6);.     
4610: 20 52 45 4c 45 41 53 45 20 6f 6e 65 3b 0a 20 20   RELEASE one;.  
4620: 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
4630: 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  { .      SELECT 
4640: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  * FROM t1;.     
4650: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
4660: 32 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  2;.      SELECT 
4670: 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 7d  * FROM t3;.    }
4680: 0a 20 20 7d 20 7b 31 20 32 20 35 20 36 20 33 20  .  } {1 2 5 6 3 
4690: 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76  4}.  do_test sav
46a0: 65 70 6f 69 6e 74 2d 31 30 2e 32 2e 39 20 7b 0a  epoint-10.2.9 {.
46b0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52      execsql { PR
46c0: 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73  AGMA lock_status
46d0: 20 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 6d 61 69   }.  } [list mai
46e0: 6e 20 75 6e 6c 6f 63 6b 65 64 20 74 65 6d 70 20  n unlocked temp 
46f0: 24 74 65 6d 70 6c 6f 63 6b 73 74 61 74 65 20 61  $templockstate a
4700: 75 78 31 20 75 6e 6c 6f 63 6b 65 64 20 61 75 78  ux1 unlocked aux
4710: 32 20 75 6e 6c 6f 63 6b 65 64 5d 0a 20 20 0a 20  2 unlocked].  . 
4720: 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69   do_test savepoi
4730: 6e 74 2d 31 30 2e 32 2e 31 30 20 7b 0a 20 20 20  nt-10.2.10 {.   
4740: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
4750: 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
4760: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
4770: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
4780: 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 20 20  a', 'b');.      
4790: 20 20 53 41 56 45 50 4f 49 4e 54 20 74 77 6f 3b    SAVEPOINT two;
47a0: 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52  .          INSER
47b0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
47c0: 28 27 63 27 2c 20 27 64 27 29 3b 0a 20 20 20 20  ('c', 'd');.    
47d0: 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20        SAVEPOINT 
47e0: 74 68 72 65 65 3b 0a 20 20 20 20 20 20 20 20 20  three;.         
47f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4800: 33 20 56 41 4c 55 45 53 28 27 65 27 2c 20 27 66  3 VALUES('e', 'f
4810: 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78  ');.    }.    ex
4820: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 53  ecsql { .      S
4830: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
4840: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
4850: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20 20 53  FROM t2;.      S
4860: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
4870: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20  .    }.  } {1 2 
4880: 61 20 62 20 35 20 36 20 63 20 64 20 33 20 34 20  a b 5 6 c d 3 4 
4890: 65 20 66 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73  e f}.  do_test s
48a0: 61 76 65 70 6f 69 6e 74 2d 31 30 2e 32 2e 31 31  avepoint-10.2.11
48b0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
48c0: 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 74 77 6f   ROLLBACK TO two
48d0: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
48e0: 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a   .      SELECT *
48f0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
4900: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
4910: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
4920: 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 7d 0a   FROM t3;.    }.
4930: 20 20 7d 20 7b 31 20 32 20 61 20 62 20 35 20 36    } {1 2 a b 5 6
4940: 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20   3 4}.  do_test 
4950: 73 61 76 65 70 6f 69 6e 74 2d 31 30 2e 32 2e 31  savepoint-10.2.1
4960: 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  2 {.    execsql 
4970: 7b 20 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  { .      INSERT 
4980: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27  INTO t3 VALUES('
4990: 67 27 2c 20 27 68 27 29 3b 0a 20 20 20 20 20 20  g', 'h');.      
49a0: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 74 77 6f 3b  ROLLBACK TO two;
49b0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73  .    }.    execs
49c0: 71 6c 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45  ql { .      SELE
49d0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
49e0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
49f0: 4d 20 74 32 3b 0a 20 20 20 20 20 20 53 45 4c 45  M t2;.      SELE
4a00: 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20  CT * FROM t3;.  
4a10: 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20 61 20 62    }.  } {1 2 a b
4a20: 20 35 20 36 20 33 20 34 7d 0a 20 20 64 6f 5f 74   5 6 3 4}.  do_t
4a30: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 30  est savepoint-10
4a40: 2e 32 2e 31 33 20 7b 0a 20 20 20 20 65 78 65 63  .2.13 {.    exec
4a50: 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d  sql { ROLLBACK }
4a60: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  .    execsql { .
4a70: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
4a80: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 53 45  ROM t1;.      SE
4a90: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
4aa0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
4ab0: 52 4f 4d 20 74 33 3b 0a 20 20 20 20 7d 0a 20 20  ROM t3;.    }.  
4ac0: 7d 20 7b 31 20 32 20 35 20 36 20 33 20 34 7d 0a  } {1 2 5 6 3 4}.
4ad0: 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f    do_test savepo
4ae0: 69 6e 74 2d 31 30 2e 32 2e 31 34 20 7b 0a 20 20  int-10.2.14 {.  
4af0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
4b00: 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d  MA lock_status }
4b10: 0a 20 20 7d 20 5b 6c 69 73 74 20 6d 61 69 6e 20  .  } [list main 
4b20: 75 6e 6c 6f 63 6b 65 64 20 74 65 6d 70 20 24 74  unlocked temp $t
4b30: 65 6d 70 6c 6f 63 6b 73 74 61 74 65 20 61 75 78  emplockstate aux
4b40: 31 20 75 6e 6c 6f 63 6b 65 64 20 61 75 78 32 20  1 unlocked aux2 
4b50: 75 6e 6c 6f 63 6b 65 64 5d 0a 7d 0a 0a 23 2d 2d  unlocked].}..#--
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ba0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
4bb0: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d 20  llowing tests - 
4bc0: 73 61 76 65 70 6f 69 6e 74 2d 31 31 2e 2a 20 2d  savepoint-11.* -
4bd0: 20 74 65 73 74 20 74 68 65 20 69 6e 74 65 72 61   test the intera
4be0: 63 74 69 6f 6e 20 6f 66 20 0a 23 20 73 61 76 65  ction of .# save
4bf0: 70 6f 69 6e 74 73 20 61 6e 64 20 63 72 65 61 74  points and creat
4c00: 69 6e 67 20 6f 72 20 64 72 6f 70 70 69 6e 67 20  ing or dropping 
4c10: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 65 78  tables and index
4c20: 65 73 20 69 6e 20 0a 23 20 61 75 74 6f 2d 76 61  es in .# auto-va
4c30: 63 75 75 6d 20 6d 6f 64 65 2e 0a 23 20 0a 64 6f  cuum mode..# .do
4c40: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
4c50: 31 31 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73  11.1 {.  db clos
4c60: 65 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20  e.  forcedelete 
4c70: 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65  test.db.  sqlite
4c80: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
4c90: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
4ca0: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 66 75  auto_vacuum = fu
4cb0: 6c 6c 3b 20 7d 0a 20 20 77 61 6c 5f 73 65 74 5f  ll; }.  wal_set_
4cc0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 65  journal_mode.  e
4cd0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
4ce0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
4cf0: 62 2c 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29  b, UNIQUE(a, b))
4d00: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4d10: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72  O t1 VALUES(1, r
4d20: 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30  andstr(1000,1000
4d30: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
4d40: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c  NTO t1 VALUES(2,
4d50: 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30   randstr(1000,10
4d60: 30 30 29 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  00));.  }.} {}.d
4d70: 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74  o_test savepoint
4d80: 2d 31 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -11.2 {.  execsq
4d90: 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e  l {.    SAVEPOIN
4da0: 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20 43 52 45  T one;.      CRE
4db0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
4dc0: 62 2c 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29  b, UNIQUE(a, b))
4dd0: 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e  ;.      SAVEPOIN
4de0: 54 20 74 77 6f 3b 0a 20 20 20 20 20 20 20 20 43  T two;.        C
4df0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
4e00: 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c 20 62  , b, UNIQUE(a, b
4e10: 29 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 69 6e 74  ));.  }.} {}.int
4e20: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 73 61 76  egrity_check sav
4e30: 65 70 6f 69 6e 74 2d 31 31 2e 33 0a 64 6f 5f 74  epoint-11.3.do_t
4e40: 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 31  est savepoint-11
4e50: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
4e60: 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 74 77 6f   ROLLBACK TO two
4e70: 20 7d 0a 7d 20 7b 7d 0a 69 6e 74 65 67 72 69 74   }.} {}.integrit
4e80: 79 5f 63 68 65 63 6b 20 73 61 76 65 70 6f 69 6e  y_check savepoin
4e90: 74 2d 31 31 2e 35 0a 64 6f 5f 74 65 73 74 20 73  t-11.5.do_test s
4ea0: 61 76 65 70 6f 69 6e 74 2d 31 31 2e 36 20 7b 0a  avepoint-11.6 {.
4eb0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
4ec0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
4ed0: 28 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c  (a, b, UNIQUE(a,
4ee0: 20 62 29 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41   b));.    ROLLBA
4ef0: 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 7d 0a 7d  CK TO one;.  }.}
4f00: 20 7b 7d 0a 69 6e 74 65 67 72 69 74 79 5f 63 68   {}.integrity_ch
4f10: 65 63 6b 20 73 61 76 65 70 6f 69 6e 74 2d 31 31  eck savepoint-11
4f20: 2e 37 0a 64 6f 5f 74 65 73 74 20 73 61 76 65 70  .7.do_test savep
4f30: 6f 69 6e 74 2d 31 31 2e 38 20 7b 0a 20 20 65 78  oint-11.8 {.  ex
4f40: 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b  ecsql { ROLLBACK
4f50: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   }.  execsql { P
4f60: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
4f70: 6f 69 6e 74 20 7d 0a 20 20 66 69 6c 65 20 73 69  oint }.  file si
4f80: 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 7b 38 31  ze test.db.} {81
4f90: 39 32 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 61 76  92}..do_test sav
4fa0: 65 70 6f 69 6e 74 2d 31 31 2e 39 20 7b 0a 20 20  epoint-11.9 {.  
4fb0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52  execsql {.    DR
4fc0: 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
4fd0: 54 53 20 74 31 3b 0a 20 20 20 20 44 52 4f 50 20  TS t1;.    DROP 
4fe0: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
4ff0: 74 32 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  t2;.    DROP TAB
5000: 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 33 3b  LE IF EXISTS t3;
5010: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
5020: 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 31 2e 31  t savepoint-11.1
5030: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  0 {.  execsql {.
5040: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
5050: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
5060: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52  (a, b);.      CR
5070: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c  EATE TABLE t2(x,
5080: 20 79 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   y);.      INSER
5090: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
50a0: 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 53 41  (1, 2);.      SA
50b0: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20  VEPOINT one;.   
50c0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
50d0: 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t2 VALUES(3, 4)
50e0: 3b 0a 20 20 20 20 20 20 20 20 53 41 56 45 50 4f  ;.        SAVEPO
50f0: 49 4e 54 20 74 77 6f 3b 0a 20 20 20 20 20 20 20  INT two;.       
5100: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31     DROP TABLE t1
5110: 3b 0a 20 20 20 20 20 20 20 20 52 4f 4c 4c 42 41  ;.        ROLLBA
5120: 43 4b 20 54 4f 20 74 77 6f 3b 0a 20 20 7d 0a 20  CK TO two;.  }. 
5130: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
5140: 20 2a 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31   * FROM t2}.} {1
5150: 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20   2 3 4}.do_test 
5160: 73 61 76 65 70 6f 69 6e 74 2d 31 31 2e 31 31 20  savepoint-11.11 
5170: 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d  {.  execsql COMM
5180: 49 54 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  IT.} {}.do_test 
5190: 73 61 76 65 70 6f 69 6e 74 2d 31 31 2e 31 32 20  savepoint-11.12 
51a0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
51b0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 0a 7d  ECT * FROM t2}.}
51c0: 20 7b 31 20 32 20 33 20 34 7d 0a 77 61 6c 5f 63   {1 2 3 4}.wal_c
51d0: 68 65 63 6b 5f 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  heck_journal_mod
51e0: 65 20 73 61 76 65 70 6f 69 6e 74 2d 31 31 2e 31  e savepoint-11.1
51f0: 33 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  3..#------------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
5240: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  The following te
5250: 73 74 73 20 2d 20 73 61 76 65 70 6f 69 6e 74 2d  sts - savepoint-
5260: 31 32 2e 2a 20 2d 20 74 65 73 74 20 74 68 65 20  12.* - test the 
5270: 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 0a  interaction of .
5280: 23 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  # savepoints and
5290: 20 22 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52 4f   "ON CONFLICT RO
52a0: 4c 4c 42 41 43 4b 22 20 63 6c 61 75 73 65 73 2e  LLBACK" clauses.
52b0: 0a 23 20 0a 64 6f 5f 74 65 73 74 20 73 61 76 65  .# .do_test save
52c0: 70 6f 69 6e 74 2d 31 32 2e 31 20 7b 0a 20 20 65  point-12.1 {.  e
52d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
52e0: 41 54 45 20 54 41 42 4c 45 20 74 34 28 61 20 50  ATE TABLE t4(a P
52f0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
5300: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5310: 74 34 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e  t4 VALUES(1, 'on
5320: 65 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  e');.  }.} {}.do
5330: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
5340: 31 32 2e 32 20 7b 0a 20 20 23 20 54 68 65 20 66  12.2 {.  # The f
5350: 69 6e 61 6c 20 73 74 61 74 65 6d 65 6e 74 20 6f  inal statement o
5360: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
5370: 53 51 4c 20 68 69 74 73 20 61 20 63 6f 6e 73 74  SQL hits a const
5380: 72 61 69 6e 74 20 77 68 65 6e 20 74 68 65 0a 20  raint when the. 
5390: 20 23 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64   # conflict hand
53a0: 6c 69 6e 67 20 6d 6f 64 65 20 69 73 20 22 4f 52  ling mode is "OR
53b0: 20 52 4f 4c 4c 42 41 43 4b 22 20 61 6e 64 20 74   ROLLBACK" and t
53c0: 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
53d0: 65 20 6f 66 0a 20 20 23 20 6f 70 65 6e 20 73 61  e of.  # open sa
53e0: 76 65 70 6f 69 6e 74 73 2e 20 41 74 20 6f 6e 65  vepoints. At one
53f0: 20 70 6f 69 6e 74 20 74 68 69 73 20 77 6f 75 6c   point this woul
5400: 64 20 66 61 69 6c 20 74 6f 20 63 6c 65 61 72 20  d fail to clear 
5410: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20 23  the internal.  #
5420: 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6f   record of the o
5430: 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2c 20  pen savepoints, 
5440: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
5450: 61 73 73 65 72 74 28 29 20 66 61 69 6c 75 72 65  assert() failure
5460: 20 0a 20 20 23 20 6c 61 74 65 72 20 6f 6e 2e 0a   .  # later on..
5470: 20 20 23 20 0a 20 20 63 61 74 63 68 73 71 6c 20    # .  catchsql 
5480: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
5490: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
54a0: 34 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f  4 VALUES(2, 'two
54b0: 27 29 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f  ');.      SAVEPO
54c0: 49 4e 54 20 73 70 31 3b 0a 20 20 20 20 20 20 20  INT sp1;.       
54d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
54e0: 56 41 4c 55 45 53 28 33 2c 20 27 74 68 72 65 65  VALUES(3, 'three
54f0: 27 29 3b 0a 20 20 20 20 20 20 20 20 53 41 56 45  ');.        SAVE
5500: 50 4f 49 4e 54 20 73 70 32 3b 0a 20 20 20 20 20  POINT sp2;.     
5510: 20 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20 52       INSERT OR R
5520: 4f 4c 4c 42 41 43 4b 20 49 4e 54 4f 20 74 34 20  OLLBACK INTO t4 
5530: 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29  VALUES(1, 'one')
5540: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 55 4e 49 51  ;.  }.} {1 {UNIQ
5550: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  UE constraint fa
5560: 69 6c 65 64 3a 20 74 34 2e 61 7d 7d 0a 64 6f 5f  iled: t4.a}}.do_
5570: 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31  test savepoint-1
5580: 32 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  2.3 {.  sqlite3_
5590: 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 64  get_autocommit d
55a0: 62 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  b.} {1}.do_test 
55b0: 73 61 76 65 70 6f 69 6e 74 2d 31 32 2e 34 20 7b  savepoint-12.4 {
55c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 41 56  .  execsql { SAV
55d0: 45 50 4f 49 4e 54 20 6f 6e 65 20 7d 0a 7d 20 7b  EPOINT one }.} {
55e0: 7d 0a 77 61 6c 5f 63 68 65 63 6b 5f 6a 6f 75 72  }.wal_check_jour
55f0: 6e 61 6c 5f 6d 6f 64 65 20 73 61 76 65 70 6f 69  nal_mode savepoi
5600: 6e 74 2d 31 32 2e 35 0a 0a 23 2d 2d 2d 2d 2d 2d  nt-12.5..#------
5610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5650: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
5660: 69 6e 67 20 74 65 73 74 73 20 2d 20 73 61 76 65  ing tests - save
5670: 70 6f 69 6e 74 2d 31 33 2e 2a 20 2d 20 74 65 73  point-13.* - tes
5680: 74 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  t the interactio
5690: 6e 20 6f 66 20 0a 23 20 73 61 76 65 70 6f 69 6e  n of .# savepoin
56a0: 74 73 20 61 6e 64 20 22 6a 6f 75 72 6e 61 6c 5f  ts and "journal_
56b0: 6d 6f 64 65 20 3d 20 6f 66 66 22 2e 0a 23 20 0a  mode = off"..# .
56c0: 69 66 20 7b 5b 77 61 6c 5f 69 73 5f 77 61 6c 5f  if {[wal_is_wal_
56d0: 6d 6f 64 65 5d 3d 3d 30 7d 20 7b 0a 20 20 64 6f  mode]==0} {.  do
56e0: 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 2d  _test savepoint-
56f0: 31 33 2e 31 20 7b 0a 20 20 20 20 64 62 20 63 6c  13.1 {.    db cl
5700: 6f 73 65 0a 20 20 20 20 63 61 74 63 68 20 7b 66  ose.    catch {f
5710: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
5720: 64 62 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 20  db}.    sqlite3 
5730: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65  db test.db.    e
5740: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42  xecsql {.      B
5750: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52  EGIN;.        CR
5760: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
5770: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
5780: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
5790: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
57a0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d  , 2);.      COMM
57b0: 49 54 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  IT;.      PRAGMA
57c0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
57d0: 6f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  off;.    }.  } {
57e0: 6f 66 66 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73  off}.  do_test s
57f0: 61 76 65 70 6f 69 6e 74 2d 31 33 2e 32 20 7b 0a  avepoint-13.2 {.
5800: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
5810: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
5820: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5830: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
5840: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5850: 74 31 20 53 45 4c 45 43 54 20 61 2b 34 2c 62 2b  t1 SELECT a+4,b+
5860: 34 20 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  4  FROM t1;.    
5870: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a    COMMIT;.    }.
5880: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
5890: 20 73 61 76 65 70 6f 69 6e 74 2d 31 33 2e 33 20   savepoint-13.3 
58a0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
58b0: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
58c0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
58d0: 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31 30   t1 VALUES(9, 10
58e0: 29 3b 0a 20 20 20 20 20 20 20 20 53 41 56 45 50  );.        SAVEP
58f0: 4f 49 4e 54 20 73 31 3b 0a 20 20 20 20 20 20 20  OINT s1;.       
5900: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5910: 31 20 56 41 4c 55 45 53 28 31 31 2c 20 31 32 29  1 VALUES(11, 12)
5920: 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ;.      COMMIT;.
5930: 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64      }.  } {}.  d
5940: 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74  o_test savepoint
5950: 2d 31 33 2e 34 20 7b 0a 20 20 20 20 65 78 65 63  -13.4 {.    exec
5960: 73 71 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49  sql {.      BEGI
5970: 4e 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  N;.        INSER
5980: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
5990: 28 31 33 2c 20 31 34 29 3b 0a 20 20 20 20 20 20  (13, 14);.      
59a0: 20 20 53 41 56 45 50 4f 49 4e 54 20 73 31 3b 0a    SAVEPOINT s1;.
59b0: 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54            INSERT
59c0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
59d0: 31 35 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  15, 16);.       
59e0: 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 31 3b   ROLLBACK TO s1;
59f0: 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b  .      ROLLBACK;
5a00: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
5a10: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20  FROM t1;.    }. 
5a20: 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20   } {1 2 3 4 5 6 
5a30: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a  7 8 9 10 11 12}.
5a40: 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 64 65 6c 65  }..db close.dele
5a50: 74 65 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 0a  te_file test.db.
5a60: 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74  do_multiclient_t
5a70: 65 73 74 20 74 6e 20 7b 0a 20 20 64 6f 5f 74 65  est tn {.  do_te
5a80: 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 34 2e  st savepoint-14.
5a90: 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73 71 6c 31  $tn.1 {.    sql1
5aa0: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
5ab0: 54 41 42 4c 45 20 66 6f 6f 28 78 29 3b 0a 20 20  TABLE foo(x);.  
5ac0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5ad0: 66 6f 6f 20 56 41 4c 55 45 53 28 31 29 3b 0a 20  foo VALUES(1);. 
5ae0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5af0: 20 66 6f 6f 20 56 41 4c 55 45 53 28 32 29 3b 0a   foo VALUES(2);.
5b00: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b      }.    sql2 {
5b10: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
5b20: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
5b30: 52 4f 4d 20 66 6f 6f 3b 0a 20 20 20 20 7d 0a 20  ROM foo;.    }. 
5b40: 20 7d 20 7b 31 20 32 7d 0a 20 20 64 6f 5f 74 65   } {1 2}.  do_te
5b50: 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 34 2e  st savepoint-14.
5b60: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73 71 6c 31  $tn.2 {.    sql1
5b70: 20 7b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49   {.      SAVEPOI
5b80: 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20 49 4e  NT one;.      IN
5b90: 53 45 52 54 20 49 4e 54 4f 20 66 6f 6f 20 56 41  SERT INTO foo VA
5ba0: 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 7d 0a 20  LUES(1);.    }. 
5bb0: 20 20 20 63 73 71 6c 31 20 7b 20 52 45 4c 45 41     csql1 { RELEA
5bc0: 53 45 20 6f 6e 65 20 7d 0a 20 20 7d 20 7b 31 20  SE one }.  } {1 
5bd0: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
5be0: 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ked}}.  do_test 
5bf0: 73 61 76 65 70 6f 69 6e 74 2d 31 34 2e 24 74 6e  savepoint-14.$tn
5c00: 2e 33 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20  .3 {.    sql1 { 
5c10: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 20  ROLLBACK TO one 
5c20: 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20 43 4f 4d  }.    sql2 { COM
5c30: 4d 49 54 20 7d 0a 20 20 20 20 73 71 6c 31 20 7b  MIT }.    sql1 {
5c40: 20 52 45 4c 45 41 53 45 20 6f 6e 65 20 7d 0a 20   RELEASE one }. 
5c50: 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73 74   } {}..  do_test
5c60: 20 73 61 76 65 70 6f 69 6e 74 2d 31 34 2e 24 74   savepoint-14.$t
5c70: 6e 2e 34 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b  n.4 {.    sql2 {
5c80: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
5c90: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
5ca0: 52 4f 4d 20 66 6f 6f 3b 0a 20 20 20 20 7d 0a 20  ROM foo;.    }. 
5cb0: 20 7d 20 7b 31 20 32 7d 0a 20 20 64 6f 5f 74 65   } {1 2}.  do_te
5cc0: 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 34 2e  st savepoint-14.
5cd0: 24 74 6e 2e 35 20 7b 0a 20 20 20 20 73 71 6c 31  $tn.5 {.    sql1
5ce0: 20 7b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49   {.      SAVEPOI
5cf0: 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20 49 4e  NT one;.      IN
5d00: 53 45 52 54 20 49 4e 54 4f 20 66 6f 6f 20 56 41  SERT INTO foo VA
5d10: 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 7d 0a 20  LUES(1);.    }. 
5d20: 20 20 20 63 73 71 6c 31 20 7b 20 52 45 4c 45 41     csql1 { RELEA
5d30: 53 45 20 6f 6e 65 20 7d 0a 20 20 7d 20 7b 31 20  SE one }.  } {1 
5d40: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
5d50: 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ked}}.  do_test 
5d60: 73 61 76 65 70 6f 69 6e 74 2d 31 34 2e 24 74 6e  savepoint-14.$tn
5d70: 2e 36 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20  .6 {.    sql2 { 
5d80: 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 73 71 6c  COMMIT }.    sql
5d90: 31 20 7b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41  1 {.      ROLLBA
5da0: 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 20  CK TO one;.     
5db0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 6f 6f   INSERT INTO foo
5dc0: 20 56 41 4c 55 45 53 28 33 29 3b 0a 20 20 20 20   VALUES(3);.    
5dd0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 6f    INSERT INTO fo
5de0: 6f 20 56 41 4c 55 45 53 28 34 29 3b 0a 20 20 20  o VALUES(4);.   
5df0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66     INSERT INTO f
5e00: 6f 6f 20 56 41 4c 55 45 53 28 35 29 3b 0a 20 20  oo VALUES(5);.  
5e10: 20 20 20 20 52 45 4c 45 41 53 45 20 6f 6e 65 3b      RELEASE one;
5e20: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20  .    }.  } {}.  
5e30: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
5e40: 74 2d 31 34 2e 24 74 6e 2e 37 20 7b 0a 20 20 20  t-14.$tn.7 {.   
5e50: 20 73 71 6c 32 20 7b 20 43 52 45 41 54 45 20 49   sql2 { CREATE I
5e60: 4e 44 45 58 20 66 6f 6f 69 64 78 20 4f 4e 20 66  NDEX fooidx ON f
5e70: 6f 6f 28 78 29 3b 20 7d 0a 20 20 20 20 73 71 6c  oo(x); }.    sql
5e80: 33 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67  3 { PRAGMA integ
5e90: 72 69 74 79 5f 63 68 65 63 6b 20 7d 0a 20 20 7d  rity_check }.  }
5ea0: 20 7b 6f 6b 7d 0a 7d 0a 0a 64 6f 5f 6d 75 6c 74   {ok}.}..do_mult
5eb0: 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20  iclient_test tn 
5ec0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65  {.  do_test save
5ed0: 70 6f 69 6e 74 2d 31 35 2e 24 74 6e 2e 31 20 7b  point-15.$tn.1 {
5ee0: 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20  .    sql1 {.    
5ef0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 66    CREATE TABLE f
5f00: 6f 6f 28 78 29 3b 0a 20 20 20 20 20 20 49 4e 53  oo(x);.      INS
5f10: 45 52 54 20 49 4e 54 4f 20 66 6f 6f 20 56 41 4c  ERT INTO foo VAL
5f20: 55 45 53 28 31 29 3b 0a 20 20 20 20 20 20 49 4e  UES(1);.      IN
5f30: 53 45 52 54 20 49 4e 54 4f 20 66 6f 6f 20 56 41  SERT INTO foo VA
5f40: 4c 55 45 53 28 32 29 3b 0a 20 20 20 20 7d 0a 20  LUES(2);.    }. 
5f50: 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b     sql2 { BEGIN;
5f60: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 66   SELECT * FROM f
5f70: 6f 6f 3b 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a  oo; }.  } {1 2}.
5f80: 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f    do_test savepo
5f90: 69 6e 74 2d 31 35 2e 24 74 6e 2e 32 20 7b 0a 20  int-15.$tn.2 {. 
5fa0: 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20     sql1 {.      
5fb0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
5fc0: 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56 45 3b  ode = EXCLUSIVE;
5fd0: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
5fe0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
5ff0: 4f 20 66 6f 6f 20 56 41 4c 55 45 53 28 33 29 3b  O foo VALUES(3);
6000: 0a 20 20 20 20 7d 0a 20 20 20 20 63 73 71 6c 31  .    }.    csql1
6010: 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 7d 20   { COMMIT }.  } 
6020: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
6030: 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65  locked}}.  do_te
6040: 73 74 20 73 61 76 65 70 6f 69 6e 74 2d 31 35 2e  st savepoint-15.
6050: 24 74 6e 2e 33 20 7b 0a 20 20 20 20 73 71 6c 31  $tn.3 {.    sql1
6060: 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d 0a 20 20   { ROLLBACK }.  
6070: 20 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20    sql2 { COMMIT 
6080: 7d 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20  }.    sql1 {.   
6090: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66     INSERT INTO f
60a0: 6f 6f 20 56 41 4c 55 45 53 28 33 29 3b 0a 20 20  oo VALUES(3);.  
60b0: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69      PRAGMA locki
60c0: 6e 67 5f 6d 6f 64 65 20 3d 20 4e 4f 52 4d 41 4c  ng_mode = NORMAL
60d0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
60e0: 4e 54 4f 20 66 6f 6f 20 56 41 4c 55 45 53 28 34  NTO foo VALUES(4
60f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
6100: 32 20 7b 20 43 52 45 41 54 45 20 49 4e 44 45 58  2 { CREATE INDEX
6110: 20 66 6f 6f 69 64 78 20 4f 4e 20 66 6f 6f 28 78   fooidx ON foo(x
6120: 29 3b 20 7d 0a 20 20 20 20 73 71 6c 33 20 7b 20  ); }.    sql3 { 
6130: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
6140: 5f 63 68 65 63 6b 20 7d 0a 20 20 7d 20 7b 6f 6b  _check }.  } {ok
6150: 7d 0a 7d 0a 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69  }.}..do_multicli
6160: 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20  ent_test tn {.  
6170: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
6180: 74 2d 31 36 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  t-16.$tn.1 {.   
6190: 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 43 52   sql1 {.      CR
61a0: 45 41 54 45 20 54 41 42 4c 45 20 66 6f 6f 28 78  EATE TABLE foo(x
61b0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
61c0: 49 4e 54 4f 20 66 6f 6f 20 56 41 4c 55 45 53 28  INTO foo VALUES(
61d0: 31 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  1);.      INSERT
61e0: 20 49 4e 54 4f 20 66 6f 6f 20 56 41 4c 55 45 53   INTO foo VALUES
61f0: 28 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  (2);.    }.  } {
6200: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76 65  }.  do_test save
6210: 70 6f 69 6e 74 2d 31 36 2e 24 74 6e 2e 32 20 7b  point-16.$tn.2 {
6220: 0a 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 53  ..    db eval {S
6230: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 66 6f 6f  ELECT * FROM foo
6240: 7d 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20 7b  } {.      sql1 {
6250: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 6f 6f   INSERT INTO foo
6260: 20 56 41 4c 55 45 53 28 33 29 20 7d 0a 20 20 20   VALUES(3) }.   
6270: 20 20 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54     sql2 { SELECT
6280: 20 2a 20 46 52 4f 4d 20 66 6f 6f 20 7d 0a 20 20   * FROM foo }.  
6290: 20 20 20 20 73 71 6c 31 20 7b 20 49 4e 53 45 52      sql1 { INSER
62a0: 54 20 49 4e 54 4f 20 66 6f 6f 20 56 41 4c 55 45  T INTO foo VALUE
62b0: 53 28 34 29 20 7d 0a 20 20 20 20 20 20 62 72 65  S(4) }.      bre
62c0: 61 6b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  ak.    }..    sq
62d0: 6c 32 20 7b 20 43 52 45 41 54 45 20 49 4e 44 45  l2 { CREATE INDE
62e0: 58 20 66 6f 6f 69 64 78 20 4f 4e 20 66 6f 6f 28  X fooidx ON foo(
62f0: 78 29 3b 20 7d 0a 20 20 20 20 73 71 6c 33 20 7b  x); }.    sql3 {
6300: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
6310: 79 5f 63 68 65 63 6b 20 7d 0a 20 20 7d 20 7b 6f  y_check }.  } {o
6320: 6b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73 61 76  k}.  do_test sav
6330: 65 70 6f 69 6e 74 2d 31 36 2e 24 74 6e 2e 33 20  epoint-16.$tn.3 
6340: 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 53 45 4c  {.    sql1 { SEL
6350: 45 43 54 20 2a 20 46 52 4f 4d 20 66 6f 6f 20 7d  ECT * FROM foo }
6360: 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a 7d  .  } {1 2 3 4}.}
6370: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
63c0: 68 69 73 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  his next block o
63d0: 66 20 74 65 73 74 73 20 76 65 72 69 66 69 65 73  f tests verifies
63e0: 20 74 68 61 74 20 61 20 70 72 6f 62 6c 65 6d 20   that a problem 
63f0: 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 20  reported on the 
6400: 6d 61 69 6c 69 6e 67 0a 23 20 6c 69 73 74 20 68  mailing.# list h
6410: 61 73 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  as been resolved
6420: 2e 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  . At one point t
6430: 68 65 20 73 65 63 6f 6e 64 20 22 43 52 45 41 54  he second "CREAT
6440: 45 20 54 41 42 4c 45 20 74 36 22 20 77 6f 75 6c  E TABLE t6" woul
6450: 64 0a 23 20 66 61 69 6c 20 61 73 20 74 61 62 6c  d.# fail as tabl
6460: 65 20 74 36 20 73 74 69 6c 6c 20 65 78 69 73 74  e t6 still exist
6470: 65 64 20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e  ed in the intern
6480: 61 6c 20 63 61 63 68 65 20 6f 66 20 74 68 65 20  al cache of the 
6490: 64 62 20 73 63 68 65 6d 61 0a 23 20 28 65 76 65  db schema.# (eve
64a0: 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61 64 20  n though it had 
64b0: 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f  been removed fro
64c0: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  m the database b
64d0: 79 20 74 68 65 20 52 4f 4c 4c 42 41 43 4b 20 0a  y the ROLLBACK .
64e0: 23 20 63 6f 6d 6d 61 6e 64 29 2e 0a 23 0a 73 71  # command)..#.sq
64f0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
6500: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
6510: 20 73 61 76 65 70 6f 69 6e 74 2d 31 37 2e 31 20   savepoint-17.1 
6520: 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43  {.  BEGIN;.    C
6530: 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61  REATE TABLE t6(a
6540: 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , b);.    INSERT
6550: 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28   INTO t6 VALUES(
6560: 31 2c 20 32 29 3b 0a 20 20 20 20 53 41 56 45 50  1, 2);.    SAVEP
6570: 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20  OINT one;.      
6580: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56  INSERT INTO t6 V
6590: 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 20  ALUES(3, 4);.   
65a0: 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65   ROLLBACK TO one
65b0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
65c0: 52 4f 4d 20 74 36 3b 0a 20 20 52 4f 4c 4c 42 41  ROM t6;.  ROLLBA
65d0: 43 4b 3b 0a 7d 20 7b 31 20 32 7d 0a 0a 64 6f 5f  CK;.} {1 2}..do_
65e0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 73 61 76  execsql_test sav
65f0: 65 70 6f 69 6e 74 2d 31 37 2e 32 20 7b 0a 20 20  epoint-17.2 {.  
6600: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28  CREATE TABLE t6(
6610: 61 2c 20 62 29 3b 0a 7d 20 7b 7d 0a 0a 66 69 6e  a, b);.} {}..fin
6620: 69 73 68 5f 74 65 73 74 0a                       ish_test.