/ Hex Artifact Content
Login

Artifact 004d3b78bffd990741ab50133ed4347c25c172b1:


0000: 23 20 32 30 30 39 20 4a 61 6e 75 61 72 79 20 33  # 2009 January 3
0010: 30 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  0.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an you give..#.#
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66  *******.# This f
0170: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72  ile implements r
0180: 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20  egression tests 
0190: 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61  for SQLite libra
01a0: 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73  ry.  The.# focus
01b0: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 69 73   of this file is
01c0: 20 74 65 73 74 69 6e 67 20 74 68 65 20 73 71 6c   testing the sql
01d0: 69 74 65 33 5f 62 61 63 6b 75 70 5f 58 58 58 20  ite3_backup_XXX 
01e0: 41 50 49 2e 0a 23 0a 23 20 24 49 64 3a 20 62 61  API..#.# $Id: ba
01f0: 63 6b 75 70 2e 74 65 73 74 2c 76 20 31 2e 31 31  ckup.test,v 1.11
0200: 20 32 30 30 39 2f 30 36 2f 30 35 20 31 37 3a 30   2009/06/05 17:0
0210: 39 3a 31 32 20 64 72 68 20 45 78 70 20 24 0a 0a  9:12 drh Exp $..
0220: 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c  set testdir [fil
0230: 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30  e dirname $argv0
0240: 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69  ].source $testdi
0250: 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 64 6f  r/tester.tcl..do
0260: 5f 6e 6f 74 5f 75 73 65 5f 63 6f 64 65 63 0a 0a  _not_use_codec..
0270: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02b0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 6f 72  ------.# Test or
02c0: 67 61 6e 69 7a 61 74 69 6f 6e 3a 0a 23 0a 23 20  ganization:.#.# 
02d0: 62 61 63 6b 75 70 2d 31 2e 2a 3a 20 57 61 72 6d  backup-1.*: Warm
02e0: 2d 62 6f 64 79 20 74 65 73 74 73 2e 0a 23 0a 23  -body tests..#.#
02f0: 20 62 61 63 6b 75 70 2d 32 2e 2a 3a 20 54 65 73   backup-2.*: Tes
0300: 74 20 62 61 63 6b 75 70 20 75 6e 64 65 72 20 76  t backup under v
0310: 61 72 69 6f 75 73 20 63 6f 6e 64 69 74 69 6f 6e  arious condition
0320: 73 2e 20 54 6f 20 61 6e 64 20 66 72 6f 6d 20 69  s. To and from i
0330: 6e 2d 6d 65 6d 6f 72 79 0a 23 20 20 20 20 20 20  n-memory.#      
0340: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 73         databases
0350: 2e 20 54 6f 20 61 6e 64 20 66 72 6f 6d 20 65 6d  . To and from em
0360: 70 74 79 2f 70 6f 70 75 6c 61 74 65 64 20 64 61  pty/populated da
0370: 74 61 62 61 73 65 73 2e 20 65 74 63 2e 0a 23 0a  tabases. etc..#.
0380: 23 20 62 61 63 6b 75 70 2d 33 2e 2a 3a 20 56 65  # backup-3.*: Ve
0390: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 6f  rify that the lo
03a0: 63 6b 69 6e 67 2d 70 61 67 65 20 28 70 65 6e 64  cking-page (pend
03b0: 69 6e 67 20 62 79 74 65 20 70 61 67 65 29 20 69  ing byte page) i
03c0: 73 20 68 61 6e 64 6c 65 64 2e 0a 23 0a 23 20 62  s handled..#.# b
03d0: 61 63 6b 75 70 2d 34 2e 2a 3a 20 54 65 73 74 20  ackup-4.*: Test 
03e0: 76 61 72 69 6f 75 73 20 65 72 72 6f 72 20 63 6f  various error co
03f0: 6e 64 69 74 69 6f 6e 73 2e 0a 23 0a 23 20 62 61  nditions..#.# ba
0400: 63 6b 75 70 2d 35 2e 2a 3a 20 54 65 73 74 20 74  ckup-5.*: Test t
0410: 68 65 20 73 6f 75 72 63 65 20 64 61 74 61 62 61  he source databa
0420: 73 65 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  se being modifie
0430: 64 20 64 75 72 69 6e 67 20 61 20 62 61 63 6b 75  d during a backu
0440: 70 2e 0a 23 0a 23 20 62 61 63 6b 75 70 2d 36 2e  p..#.# backup-6.
0450: 2a 3a 20 54 65 73 74 20 74 68 65 20 62 61 63 6b  *: Test the back
0460: 75 70 5f 72 65 6d 61 69 6e 69 6e 67 28 29 20 61  up_remaining() a
0470: 6e 64 20 62 61 63 6b 75 70 5f 70 61 67 65 63 6f  nd backup_pageco
0480: 75 6e 74 28 29 20 41 50 49 73 2e 0a 23 0a 23 20  unt() APIs..#.# 
0490: 62 61 63 6b 75 70 2d 37 2e 2a 3a 20 54 65 73 74  backup-7.*: Test
04a0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
04b0: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 65   SQLITE_LOCKED e
04c0: 72 72 6f 72 73 2e 0a 23 0a 23 20 62 61 63 6b 75  rrors..#.# backu
04d0: 70 2d 38 2e 2a 3a 20 54 65 73 74 20 6d 75 6c 74  p-8.*: Test mult
04e0: 69 70 6c 65 20 73 69 6d 75 6c 74 61 6e 65 6f 75  iple simultaneou
04f0: 73 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69  s backup operati
0500: 6f 6e 73 2e 0a 23 0a 23 20 62 61 63 6b 75 70 2d  ons..#.# backup-
0510: 39 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 70  9.*: Test that p
0520: 61 73 73 69 6e 67 20 61 20 6e 65 67 61 74 69 76  assing a negativ
0530: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 62 61  e argument to ba
0540: 63 6b 75 70 5f 73 74 65 70 28 29 20 69 73 0a 23  ckup_step() is.#
0550: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
0560: 65 72 70 72 65 74 65 64 20 61 73 20 22 63 6f 70  erpreted as "cop
0570: 79 20 74 68 65 20 77 68 6f 6c 65 20 66 69 6c 65  y the whole file
0580: 22 2e 0a 23 20 0a 23 20 62 61 63 6b 75 70 2d 31  "..# .# backup-1
0590: 30 2e 2a 3a 20 54 65 73 74 20 77 72 69 74 69 6e  0.*: Test writin
05a0: 67 20 74 68 65 20 73 6f 75 72 63 65 20 64 61 74  g the source dat
05b0: 61 62 61 73 65 20 6d 69 64 20 62 61 63 6b 75 70  abase mid backup
05c0: 2e 0a 23 0a 0a 70 72 6f 63 20 64 61 74 61 5f 63  ..#..proc data_c
05d0: 68 65 63 6b 73 75 6d 20 7b 64 62 20 66 69 6c 65  hecksum {db file
05e0: 7d 20 7b 20 24 64 62 20 6f 6e 65 20 22 53 45 4c  } { $db one "SEL
05f0: 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29  ECT md5sum(a, b)
0600: 20 46 52 4f 4d 20 24 7b 66 69 6c 65 7d 2e 74 31   FROM ${file}.t1
0610: 22 20 7d 0a 70 72 6f 63 20 74 65 73 74 5f 63 6f  " }.proc test_co
0620: 6e 74 65 6e 74 73 20 7b 6e 61 6d 65 20 64 62 31  ntents {name db1
0630: 20 66 69 6c 65 31 20 64 62 32 20 66 69 6c 65 32   file1 db2 file2
0640: 7d 20 7b 0a 20 20 24 64 62 32 20 65 76 61 6c 20  } {.  $db2 eval 
0650: 7b 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20 73  {select * from s
0660: 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 0a 20 20  qlite_master}.  
0670: 24 64 62 31 20 65 76 61 6c 20 7b 73 65 6c 65 63  $db1 eval {selec
0680: 74 20 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  t * from sqlite_
0690: 6d 61 73 74 65 72 7d 0a 20 20 73 65 74 20 63 68  master}.  set ch
06a0: 65 63 6b 73 75 6d 20 5b 64 61 74 61 5f 63 68 65  ecksum [data_che
06b0: 63 6b 73 75 6d 20 24 64 62 32 20 24 66 69 6c 65  cksum $db2 $file
06c0: 32 5d 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c 69  2].  uplevel [li
06d0: 73 74 20 64 6f 5f 74 65 73 74 20 24 6e 61 6d 65  st do_test $name
06e0: 20 5b 6c 69 73 74 20 64 61 74 61 5f 63 68 65 63   [list data_chec
06f0: 6b 73 75 6d 20 24 64 62 31 20 24 66 69 6c 65 31  ksum $db1 $file1
0700: 5d 20 24 63 68 65 63 6b 73 75 6d 5d 0a 7d 0a 0a  ] $checksum].}..
0710: 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 31  do_test backup-1
0720: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
0730: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
0740: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0750: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
0760: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
0770: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
0780: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0790: 53 28 31 2c 20 72 61 6e 64 73 74 72 28 31 30 30  S(1, randstr(100
07a0: 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 49 4e  0,1000));.    IN
07b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
07c0: 55 45 53 28 32 2c 20 72 61 6e 64 73 74 72 28 31  UES(2, randstr(1
07d0: 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20  000,1000));.    
07e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
07f0: 41 4c 55 45 53 28 33 2c 20 72 61 6e 64 73 74 72  ALUES(3, randstr
0800: 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20  (1000,1000));.  
0810: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0820: 20 56 41 4c 55 45 53 28 34 2c 20 72 61 6e 64 73   VALUES(4, rands
0830: 74 72 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a  tr(1000,1000));.
0840: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0850: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 72 61 6e  t1 VALUES(5, ran
0860: 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 29  dstr(1000,1000))
0870: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
0880: 7d 0a 7d 20 7b 7d 0a 0a 23 20 53 61 6e 69 74 79  }.} {}..# Sanity
0890: 20 63 68 65 63 6b 20 74 6f 20 76 65 72 69 66 79   check to verify
08a0: 20 74 68 61 74 20 74 68 65 20 5b 74 65 73 74 5f   that the [test_
08b0: 63 6f 6e 74 65 6e 74 73 5d 20 70 72 6f 63 20 77  contents] proc w
08c0: 6f 72 6b 73 2e 0a 23 0a 74 65 73 74 5f 63 6f 6e  orks..#.test_con
08d0: 74 65 6e 74 73 20 62 61 63 6b 75 70 2d 31 2e 32  tents backup-1.2
08e0: 20 64 62 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e   db main db main
08f0: 0a 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 69  ..# Check that i
0900: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
0910: 20 63 72 65 61 74 65 20 61 6e 64 20 66 69 6e 69   create and fini
0920: 73 68 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74  sh backup operat
0930: 69 6f 6e 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ions..#.do_test 
0940: 62 61 63 6b 75 70 2d 31 2e 33 2e 31 20 7b 0a 20  backup-1.3.1 {. 
0950: 20 66 69 6c 65 20 64 65 6c 65 74 65 20 74 65 73   file delete tes
0960: 74 32 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20  t2.db.  sqlite3 
0970: 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 73  db2 test2.db.  s
0980: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20  qlite3_backup B 
0990: 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e  db2 main db main
09a0: 0a 7d 20 7b 42 7d 0a 64 6f 5f 74 65 73 74 20 62  .} {B}.do_test b
09b0: 61 63 6b 75 70 2d 31 2e 33 2e 32 20 7b 0a 20 20  ackup-1.3.2 {.  
09c0: 42 20 66 69 6e 69 73 68 0a 7d 20 7b 53 51 4c 49  B finish.} {SQLI
09d0: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 62  TE_OK}.do_test b
09e0: 61 63 6b 75 70 2d 31 2e 33 2e 33 20 7b 0a 20 20  ackup-1.3.3 {.  
09f0: 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 42 0a  info commands B.
0a00: 7d 20 7b 7d 0a 0a 23 20 53 69 6d 70 6c 65 73 74  } {}..# Simplest
0a10: 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f   backup operatio
0a20: 6e 2e 20 42 61 63 6b 75 70 20 74 65 73 74 2e 64  n. Backup test.d
0a30: 62 20 74 6f 20 74 65 73 74 32 2e 64 62 2e 20 74  b to test2.db. t
0a40: 65 73 74 32 2e 64 62 20 69 73 20 0a 23 20 69 6e  est2.db is .# in
0a50: 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 20 74  itially empty. t
0a60: 65 73 74 2e 64 62 20 75 73 65 73 20 74 68 65 20  est.db uses the 
0a70: 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
0a80: 65 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20 62 61  e..# .do_test ba
0a90: 63 6b 75 70 2d 31 2e 34 2e 31 20 7b 0a 20 20 73  ckup-1.4.1 {.  s
0aa0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20  qlite3_backup B 
0ab0: 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e  db2 main db main
0ac0: 0a 7d 20 7b 42 7d 0a 64 6f 5f 74 65 73 74 20 62  .} {B}.do_test b
0ad0: 61 63 6b 75 70 2d 31 2e 34 2e 32 20 7b 0a 20 20  ackup-1.4.2 {.  
0ae0: 42 20 73 74 65 70 20 32 30 30 0a 7d 20 7b 53 51  B step 200.} {SQ
0af0: 4c 49 54 45 5f 44 4f 4e 45 7d 0a 64 6f 5f 74 65  LITE_DONE}.do_te
0b00: 73 74 20 62 61 63 6b 75 70 2d 31 2e 34 2e 33 20  st backup-1.4.3 
0b10: 7b 0a 20 20 42 20 66 69 6e 69 73 68 0a 7d 20 7b  {.  B finish.} {
0b20: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65  SQLITE_OK}.do_te
0b30: 73 74 20 62 61 63 6b 75 70 2d 31 2e 34 2e 34 20  st backup-1.4.4 
0b40: 7b 0a 20 20 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  {.  info command
0b50: 73 20 42 0a 7d 20 7b 7d 0a 74 65 73 74 5f 63 6f  s B.} {}.test_co
0b60: 6e 74 65 6e 74 73 20 62 61 63 6b 75 70 2d 31 2e  ntents backup-1.
0b70: 34 2e 35 20 64 62 32 20 6d 61 69 6e 20 64 62 20  4.5 db2 main db 
0b80: 6d 61 69 6e 0a 64 62 20 63 6c 6f 73 65 0a 64 62  main.db close.db
0b90: 32 20 63 6c 6f 73 65 0a 23 0a 23 20 45 6e 64 20  2 close.#.# End 
0ba0: 6f 66 20 62 61 63 6b 75 70 2d 31 2e 2a 20 74 65  of backup-1.* te
0bb0: 73 74 73 2e 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  sts..#----------
0bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 0a 23 2d  -----------...#-
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c40: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
0c50: 77 69 6e 67 20 74 65 73 74 73 2c 20 62 61 63 6b  wing tests, back
0c60: 75 70 2d 32 2e 2a 2c 20 61 72 65 20 62 61 73 65  up-2.*, are base
0c70: 64 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d on the followi
0c80: 6e 67 20 70 72 6f 63 65 64 75 72 65 3a 0a 23 0a  ng procedure:.#.
0c90: 23 20 20 20 31 29 20 50 6f 70 75 6c 61 74 65 20  #   1) Populate 
0ca0: 74 68 65 20 73 6f 75 72 63 65 20 64 61 74 61 62  the source datab
0cb0: 61 73 65 2e 0a 23 20 20 20 32 29 20 50 6f 70 75  ase..#   2) Popu
0cc0: 6c 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  late the destina
0cd0: 74 69 6f 6e 20 64 61 74 61 62 61 73 65 2e 0a 23  tion database..#
0ce0: 20 20 20 33 29 20 52 75 6e 20 74 68 65 20 62 61     3) Run the ba
0cf0: 63 6b 75 70 20 74 6f 20 63 6f 6d 70 6c 65 74 69  ckup to completi
0d00: 6f 6e 2e 20 28 62 61 63 6b 75 70 2d 32 2e 2a 2e  on. (backup-2.*.
0d10: 31 29 0a 23 20 20 20 34 29 20 49 6e 74 65 67 72  1).#   4) Integr
0d20: 69 74 79 20 63 68 65 63 6b 20 74 68 65 20 64 65  ity check the de
0d30: 73 74 69 6e 61 74 69 6f 6e 20 64 62 2e 20 28 62  stination db. (b
0d40: 61 63 6b 75 70 2d 32 2e 2a 2e 32 29 0a 23 20 20  ackup-2.*.2).#  
0d50: 20 35 29 20 43 68 65 63 6b 20 74 68 61 74 20 74   5) Check that t
0d60: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
0d70: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 64  he destination d
0d80: 62 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  b is the same as
0d90: 20 74 68 61 74 0a 23 20 20 20 20 20 20 6f 66 20   that.#      of 
0da0: 74 68 65 20 73 6f 75 72 63 65 20 64 62 2e 20 28  the source db. (
0db0: 62 61 63 6b 75 70 2d 32 2e 2a 2e 33 29 0a 23 20  backup-2.*.3).# 
0dc0: 0a 23 20 54 68 65 20 74 65 73 74 20 69 73 20 72  .# The test is r
0dd0: 75 6e 20 77 69 74 68 20 61 6c 6c 20 70 6f 73 73  un with all poss
0de0: 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ible combination
0df0: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
0e00: 6e 67 0a 23 20 69 6e 70 75 74 20 70 61 72 61 6d  ng.# input param
0e10: 65 74 65 72 73 2c 20 65 78 63 65 70 74 20 74 68  eters, except th
0e20: 61 74 20 69 66 20 74 68 65 20 64 65 73 74 69 6e  at if the destin
0e30: 61 74 69 6f 6e 20 69 73 20 61 6e 20 69 6e 2d 6d  ation is an in-m
0e40: 65 6d 6f 72 79 0a 23 20 64 61 74 61 62 61 73 65  emory.# database
0e50: 2c 20 74 68 65 20 6f 6e 6c 79 20 70 61 67 65 20  , the only page 
0e60: 73 69 7a 65 20 74 65 73 74 65 64 20 69 73 20 31  size tested is 1
0e70: 30 32 34 20 62 79 74 65 73 20 28 74 68 65 20 73  024 bytes (the s
0e80: 61 6d 65 20 61 73 20 74 68 65 0a 23 20 73 6f 75  ame as the.# sou
0e90: 72 63 65 20 70 61 67 65 2d 73 69 7a 65 29 2e 0a  rce page-size)..
0ea0: 23 0a 23 20 20 20 2a 20 53 6f 75 72 63 65 20 64  #.#   * Source d
0eb0: 61 74 61 62 61 73 65 20 69 73 20 61 6e 20 69 6e  atabase is an in
0ec0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
0ed0: 2c 20 4f 52 0a 23 20 20 20 2a 20 53 6f 75 72 63  , OR.#   * Sourc
0ee0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
0ef0: 66 69 6c 65 2d 62 61 63 6b 65 64 20 64 61 74 61  file-backed data
0f00: 62 61 73 65 2e 0a 23 0a 23 20 20 20 2a 20 54 61  base..#.#   * Ta
0f10: 72 67 65 74 20 64 61 74 61 62 61 73 65 20 69 73  rget database is
0f20: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
0f30: 74 61 62 61 73 65 2c 20 4f 52 0a 23 20 20 20 2a  tabase, OR.#   *
0f40: 20 54 61 72 67 65 74 20 64 61 74 61 62 61 73 65   Target database
0f50: 20 69 73 20 61 20 66 69 6c 65 2d 62 61 63 6b 65   is a file-backe
0f60: 64 20 64 61 74 61 62 61 73 65 2e 0a 23 0a 23 20  d database..#.# 
0f70: 20 20 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20    * Destination 
0f80: 64 61 74 61 62 61 73 65 20 69 73 20 61 20 6d 61  database is a ma
0f90: 69 6e 20 66 69 6c 65 2c 20 4f 52 0a 23 20 20 20  in file, OR.#   
0fa0: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 64 61  * Destination da
0fb0: 74 61 62 61 73 65 20 69 73 20 61 6e 20 61 74 74  tabase is an att
0fc0: 61 63 68 65 64 20 66 69 6c 65 2c 20 4f 52 0a 23  ached file, OR.#
0fd0: 20 20 20 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e     * Destination
0fe0: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 74   database is a t
0ff0: 65 6d 70 20 64 61 74 61 62 61 73 65 2e 0a 23 0a  emp database..#.
1000: 23 20 20 20 2a 20 54 61 72 67 65 74 20 64 61 74  #   * Target dat
1010: 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20 28  abase is empty (
1020: 7a 65 72 6f 20 62 79 74 65 73 29 2c 20 4f 52 0a  zero bytes), OR.
1030: 23 20 20 20 2a 20 54 61 72 67 65 74 20 64 61 74  #   * Target dat
1040: 61 62 61 73 65 20 69 73 20 6c 61 72 67 65 72 20  abase is larger 
1050: 74 68 61 6e 20 74 68 65 20 73 6f 75 72 63 65 2c  than the source,
1060: 20 4f 52 0a 23 20 20 20 2a 20 54 61 72 67 65 74   OR.#   * Target
1070: 20 64 61 74 61 62 61 73 65 20 69 73 20 73 6d 61   database is sma
1080: 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 73 6f  ller than the so
1090: 75 72 63 65 2e 0a 23 0a 23 20 20 20 2a 20 54 61  urce..#.#   * Ta
10a0: 72 67 65 74 20 64 61 74 61 62 61 73 65 20 70 61  rget database pa
10b0: 67 65 2d 73 69 7a 65 20 69 73 20 74 68 65 20 73  ge-size is the s
10c0: 61 6d 65 20 61 73 20 74 68 65 20 73 6f 75 72 63  ame as the sourc
10d0: 65 2c 20 4f 52 0a 23 20 20 20 2a 20 54 61 72 67  e, OR.#   * Targ
10e0: 65 74 20 64 61 74 61 62 61 73 65 20 70 61 67 65  et database page
10f0: 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20  -size is larger 
1100: 74 68 61 6e 20 74 68 65 20 73 6f 75 72 63 65 2c  than the source,
1110: 20 4f 52 0a 23 20 20 20 2a 20 54 61 72 67 65 74   OR.#   * Target
1120: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d 73   database page-s
1130: 69 7a 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ize is smaller t
1140: 68 61 6e 20 74 68 65 20 73 6f 75 72 63 65 2e 0a  han the source..
1150: 23 0a 23 20 20 20 2a 20 45 61 63 68 20 63 61 6c  #.#   * Each cal
1160: 6c 20 74 6f 20 73 74 65 70 20 63 6f 70 69 65 73  l to step copies
1170: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2c 20   a single page, 
1180: 4f 52 0a 23 20 20 20 2a 20 41 20 73 69 6e 67 6c  OR.#   * A singl
1190: 65 20 63 61 6c 6c 20 74 6f 20 73 74 65 70 20 63  e call to step c
11a0: 6f 70 69 65 73 20 74 68 65 20 65 6e 74 69 72 65  opies the entire
11b0: 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65   source database
11c0: 2e 0a 23 0a 73 65 74 20 69 54 65 73 74 20 31 0a  ..#.set iTest 1.
11d0: 66 6f 72 65 61 63 68 20 7a 53 72 63 46 69 6c 65  foreach zSrcFile
11e0: 20 7b 74 65 73 74 2e 64 62 20 3a 6d 65 6d 6f 72   {test.db :memor
11f0: 79 3a 7d 20 7b 0a 66 6f 72 65 61 63 68 20 7a 44  y:} {.foreach zD
1200: 65 73 74 46 69 6c 65 20 7b 74 65 73 74 32 2e 64  estFile {test2.d
1210: 62 20 3a 6d 65 6d 6f 72 79 3a 7d 20 7b 0a 66 6f  b :memory:} {.fo
1220: 72 65 61 63 68 20 7a 4f 70 65 6e 53 63 72 69 70  reach zOpenScrip
1230: 74 20 5b 6c 69 73 74 20 7b 0a 20 20 73 71 6c 69  t [list {.  sqli
1240: 74 65 33 20 64 62 20 24 7a 53 72 63 46 69 6c 65  te3 db $zSrcFile
1250: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 24  .  sqlite3 db2 $
1260: 7a 53 72 63 46 69 6c 65 0a 20 20 64 62 32 20 65  zSrcFile.  db2 e
1270: 76 61 6c 20 22 41 54 54 41 43 48 20 27 24 7a 44  val "ATTACH '$zD
1280: 65 73 74 46 69 6c 65 27 20 41 53 20 62 61 6b 22  estFile' AS bak"
1290: 0a 20 20 73 65 74 20 64 62 5f 64 65 73 74 20 64  .  set db_dest d
12a0: 62 32 0a 20 20 73 65 74 20 66 69 6c 65 5f 64 65  b2.  set file_de
12b0: 73 74 20 62 61 6b 0a 7d 20 7b 0a 20 20 73 71 6c  st bak.} {.  sql
12c0: 69 74 65 33 20 64 62 20 24 7a 53 72 63 46 69 6c  ite3 db $zSrcFil
12d0: 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  e.  sqlite3 db2 
12e0: 24 7a 44 65 73 74 46 69 6c 65 0a 20 20 73 65 74  $zDestFile.  set
12f0: 20 64 62 5f 64 65 73 74 20 64 62 32 0a 20 20 73   db_dest db2.  s
1300: 65 74 20 66 69 6c 65 5f 64 65 73 74 20 6d 61 69  et file_dest mai
1310: 6e 0a 7d 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  n.} {.  sqlite3 
1320: 64 62 20 24 7a 53 72 63 46 69 6c 65 0a 20 20 73  db $zSrcFile.  s
1330: 71 6c 69 74 65 33 20 64 62 32 20 24 7a 44 65 73  qlite3 db2 $zDes
1340: 74 46 69 6c 65 0a 20 20 73 65 74 20 64 62 5f 64  tFile.  set db_d
1350: 65 73 74 20 64 62 32 0a 20 20 73 65 74 20 66 69  est db2.  set fi
1360: 6c 65 5f 64 65 73 74 20 74 65 6d 70 0a 7d 5d 20  le_dest temp.}] 
1370: 7b 0a 66 6f 72 65 61 63 68 20 72 6f 77 73 5f 64  {.foreach rows_d
1380: 65 73 74 20 7b 30 20 33 20 31 30 7d 20 7b 0a 66  est {0 3 10} {.f
1390: 6f 72 65 61 63 68 20 70 67 73 7a 5f 64 65 73 74  oreach pgsz_dest
13a0: 20 7b 35 31 32 20 31 30 32 34 20 32 30 34 38 7d   {512 1024 2048}
13b0: 20 7b 0a 66 6f 72 65 61 63 68 20 6e 50 61 67 65   {.foreach nPage
13c0: 50 65 72 53 74 65 70 20 7b 31 20 32 30 30 7d 20  PerStep {1 200} 
13d0: 7b 0a 0a 20 20 23 20 4f 70 65 6e 20 74 68 65 20  {..  # Open the 
13e0: 64 61 74 61 62 61 73 65 73 2e 0a 20 20 63 61 74  databases..  cat
13f0: 63 68 20 7b 20 66 69 6c 65 20 64 65 6c 65 74 65  ch { file delete
1400: 20 74 65 73 74 2e 64 62 20 7d 0a 20 20 63 61 74   test.db }.  cat
1410: 63 68 20 7b 20 66 69 6c 65 20 64 65 6c 65 74 65  ch { file delete
1420: 20 74 65 73 74 32 2e 64 62 20 7d 0a 20 20 65 76   test2.db }.  ev
1430: 61 6c 20 24 7a 4f 70 65 6e 53 63 72 69 70 74 0a  al $zOpenScript.
1440: 0a 20 20 23 20 53 65 74 20 74 6f 20 74 72 75 65  .  # Set to true
1450: 20 69 66 20 63 6f 70 79 69 6e 67 20 74 6f 20 61   if copying to a
1460: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 74  n in-memory dest
1470: 69 6e 61 74 69 6f 6e 2e 20 43 6f 70 79 69 6e 67  ination. Copying
1480: 20 74 6f 20 61 6e 20 0a 20 20 23 20 69 6e 2d 6d   to an .  # in-m
1490: 65 6d 6f 72 79 20 64 65 73 74 69 6e 61 74 69 6f  emory destinatio
14a0: 6e 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  n is only possib
14b0: 6c 65 20 69 66 20 74 68 65 20 69 6e 69 74 69 61  le if the initia
14c0: 6c 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20  l destination.  
14d0: 23 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  # page size is t
14e0: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73  he same as the s
14f0: 6f 75 72 63 65 20 70 61 67 65 20 73 69 7a 65 20  ource page size 
1500: 28 69 6e 20 74 68 69 73 20 63 61 73 65 20 31 30  (in this case 10
1510: 32 34 20 62 79 74 65 73 29 2e 0a 20 20 23 0a 20  24 bytes)..  #. 
1520: 20 73 65 74 20 69 73 4d 65 6d 44 65 73 74 20 5b   set isMemDest [
1530: 65 78 70 72 20 7b 0a 20 20 20 20 24 7a 44 65 73  expr {.    $zDes
1540: 74 46 69 6c 65 20 65 71 20 22 3a 6d 65 6d 6f 72  tFile eq ":memor
1550: 79 3a 22 20 7c 7c 20 24 66 69 6c 65 5f 64 65 73  y:" || $file_des
1560: 74 20 65 71 20 22 74 65 6d 70 22 20 26 26 20 24  t eq "temp" && $
1570: 54 45 4d 50 5f 53 54 4f 52 45 3e 3d 32 0a 20 20  TEMP_STORE>=2.  
1580: 7d 5d 0a 0a 20 20 69 66 20 7b 20 24 69 73 4d 65  }]..  if { $isMe
1590: 6d 44 65 73 74 3d 3d 30 20 7c 7c 20 24 70 67 73  mDest==0 || $pgs
15a0: 7a 5f 64 65 73 74 20 3d 3d 20 31 30 32 34 20 7d  z_dest == 1024 }
15b0: 20 7b 0a 20 20 20 20 69 66 20 30 20 7b 0a 20 20   {.    if 0 {.  
15c0: 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c      puts -nonewl
15d0: 69 6e 65 20 22 54 65 73 74 20 24 69 54 65 73 74  ine "Test $iTest
15e0: 3a 20 73 72 63 3d 24 7a 53 72 63 46 69 6c 65 20  : src=$zSrcFile 
15f0: 64 65 73 74 3d 24 7a 44 65 73 74 46 69 6c 65 22  dest=$zDestFile"
1600: 0a 20 20 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e  .      puts -non
1610: 65 77 6c 69 6e 65 20 22 20 28 61 73 20 24 64 62  ewline " (as $db
1620: 5f 64 65 73 74 2e 24 66 69 6c 65 5f 64 65 73 74  _dest.$file_dest
1630: 29 22 0a 20 20 20 20 20 20 70 75 74 73 20 2d 6e  )".      puts -n
1640: 6f 6e 65 77 6c 69 6e 65 20 22 20 72 6f 77 73 5f  onewline " rows_
1650: 64 65 73 74 3d 24 72 6f 77 73 5f 64 65 73 74 20  dest=$rows_dest 
1660: 70 67 73 7a 5f 64 65 73 74 3d 24 70 67 73 7a 5f  pgsz_dest=$pgsz_
1670: 64 65 73 74 22 0a 20 20 20 20 20 20 70 75 74 73  dest".      puts
1680: 20 22 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23   "".    }..    #
1690: 20 53 65 74 20 75 70 20 74 68 65 20 63 6f 6e 74   Set up the cont
16a0: 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63  ent of the sourc
16b0: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
16c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
16d0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
16e0: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20 20 42   = 1024;.      B
16f0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
1700: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
1710: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
1720: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
1730: 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  , b);.      INSE
1740: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1750: 53 28 31 2c 20 72 61 6e 64 73 74 72 28 31 30 30  S(1, randstr(100
1760: 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 20 20  0,1000));.      
1770: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1780: 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 73 74 72  ALUES(2, randstr
1790: 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20  (1000,1000));.  
17a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
17b0: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 72 61 6e  t1 VALUES(3, ran
17c0: 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 29  dstr(1000,1000))
17d0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
17e0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c  NTO t1 VALUES(4,
17f0: 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30   randstr(1000,10
1800: 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  00));.      INSE
1810: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1820: 53 28 35 2c 20 72 61 6e 64 73 74 72 28 31 30 30  S(5, randstr(100
1830: 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 20 20  0,1000));.      
1840: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20  COMMIT;.    }.  
1850: 20 20 0a 20 20 20 20 0a 0a 20 20 20 20 23 20 53    .    ..    # S
1860: 65 74 20 75 70 20 74 68 65 20 63 6f 6e 74 65 6e  et up the conten
1870: 74 20 6f 66 20 74 68 65 20 74 61 72 67 65 74 20  t of the target 
1880: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 65 78  database..    ex
1890: 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 24 7b  ecsql "PRAGMA ${
18a0: 66 69 6c 65 5f 64 65 73 74 7d 2e 70 61 67 65 5f  file_dest}.page_
18b0: 73 69 7a 65 20 3d 20 24 7b 70 67 73 7a 5f 64 65  size = ${pgsz_de
18c0: 73 74 7d 22 20 24 64 62 5f 64 65 73 74 0a 20 20  st}" $db_dest.  
18d0: 20 20 69 66 20 7b 24 72 6f 77 73 5f 64 65 73 74    if {$rows_dest
18e0: 20 21 3d 20 30 7d 20 7b 0a 20 20 20 20 20 20 65   != 0} {.      e
18f0: 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 20  xecsql ".       
1900: 20 42 45 47 49 4e 3b 20 0a 20 20 20 20 20 20 20   BEGIN; .       
1910: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 24 7b   CREATE TABLE ${
1920: 66 69 6c 65 5f 64 65 73 74 7d 2e 74 31 28 61 2c  file_dest}.t1(a,
1930: 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45   b);.        CRE
1940: 41 54 45 20 49 4e 44 45 58 20 24 7b 66 69 6c 65  ATE INDEX ${file
1950: 5f 64 65 73 74 7d 2e 69 31 20 4f 4e 20 74 31 28  _dest}.i1 ON t1(
1960: 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 22 20 24  a, b);.      " $
1970: 64 62 5f 64 65 73 74 0a 20 20 20 20 20 20 66 6f  db_dest.      fo
1980: 72 20 7b 73 65 74 20 69 69 20 30 7d 20 7b 24 69  r {set ii 0} {$i
1990: 69 20 3c 20 24 72 6f 77 73 5f 64 65 73 74 7d 20  i < $rows_dest} 
19a0: 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20 20 20 20  {incr ii} {.    
19b0: 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20      execsql ".  
19c0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
19d0: 4e 54 4f 20 24 7b 66 69 6c 65 5f 64 65 73 74 7d  NTO ${file_dest}
19e0: 2e 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61  .t1 VALUES(1, ra
19f0: 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29  ndstr(1000,1000)
1a00: 29 0a 20 20 20 20 20 20 20 20 22 20 24 64 62 5f  ).        " $db_
1a10: 64 65 73 74 0a 20 20 20 20 20 20 7d 0a 20 20 20  dest.      }.   
1a20: 20 7d 0a 20 20 0a 20 20 20 20 23 20 42 61 63 6b   }.  .    # Back
1a30: 75 70 20 74 68 65 20 73 6f 75 72 63 65 20 64 61  up the source da
1a40: 74 61 62 61 73 65 2e 0a 20 20 20 20 64 6f 5f 74  tabase..    do_t
1a50: 65 73 74 20 62 61 63 6b 75 70 2d 32 2e 24 69 54  est backup-2.$iT
1a60: 65 73 74 2e 31 20 7b 0a 20 20 20 20 20 20 73 71  est.1 {.      sq
1a70: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 24  lite3_backup B $
1a80: 64 62 5f 64 65 73 74 20 24 66 69 6c 65 5f 64 65  db_dest $file_de
1a90: 73 74 20 64 62 20 6d 61 69 6e 0a 20 20 20 20 20  st db main.     
1aa0: 20 77 68 69 6c 65 20 7b 5b 42 20 73 74 65 70 20   while {[B step 
1ab0: 24 6e 50 61 67 65 50 65 72 53 74 65 70 5d 3d 3d  $nPagePerStep]==
1ac0: 22 53 51 4c 49 54 45 5f 4f 4b 22 7d 20 7b 7d 0a  "SQLITE_OK"} {}.
1ad0: 20 20 20 20 20 20 42 20 66 69 6e 69 73 68 0a 20        B finish. 
1ae0: 20 20 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d     } {SQLITE_OK}
1af0: 0a 20 20 20 20 0a 20 20 20 20 23 20 52 75 6e 20  .    .    # Run 
1b00: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20  integrity check 
1b10: 6f 6e 20 74 68 65 20 62 61 63 6b 75 70 2e 0a 20  on the backup.. 
1b20: 20 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 75     do_test backu
1b30: 70 2d 32 2e 24 69 54 65 73 74 2e 32 20 7b 0a 20  p-2.$iTest.2 {. 
1b40: 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52       execsql "PR
1b50: 41 47 4d 41 20 24 7b 66 69 6c 65 5f 64 65 73 74  AGMA ${file_dest
1b60: 7d 2e 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  }.integrity_chec
1b70: 6b 22 20 24 64 62 5f 64 65 73 74 0a 20 20 20 20  k" $db_dest.    
1b80: 7d 20 7b 6f 6b 7d 0a 20 20 0a 20 20 20 20 74 65  } {ok}.  .    te
1b90: 73 74 5f 63 6f 6e 74 65 6e 74 73 20 62 61 63 6b  st_contents back
1ba0: 75 70 2d 32 2e 24 69 54 65 73 74 2e 33 20 64 62  up-2.$iTest.3 db
1bb0: 20 6d 61 69 6e 20 24 64 62 5f 64 65 73 74 20 24   main $db_dest $
1bc0: 66 69 6c 65 5f 64 65 73 74 0a 20 20 0a 20 20 7d  file_dest.  .  }
1bd0: 0a 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63  ..  db close.  c
1be0: 61 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d  atch {db2 close}
1bf0: 0a 20 20 69 6e 63 72 20 69 54 65 73 74 0a 0a 7d  .  incr iTest..}
1c00: 20 7d 20 7d 20 7d 20 7d 20 7d 0a 23 0a 23 20 45   } } } } }.#.# E
1c10: 6e 64 20 6f 66 20 62 61 63 6b 75 70 2d 32 2e 2a  nd of backup-2.*
1c20: 20 74 65 73 74 73 2e 0a 23 2d 2d 2d 2d 2d 2d 2d   tests..#-------
1c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a  --------------..
1c70: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
1c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cb0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 73 65 20 74  ------.# These t
1cc0: 65 73 74 73 2c 20 62 61 63 6b 75 70 2d 33 2e 2a  ests, backup-3.*
1cd0: 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 6e 6f  , ensure that no
1ce0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
1cf0: 20 69 66 20 65 69 74 68 65 72 20 0a 23 20 74 68   if either .# th
1d00: 65 20 73 6f 75 72 63 65 20 6f 72 20 64 65 73 74  e source or dest
1d10: 69 6e 61 74 69 6f 6e 20 64 61 74 61 62 61 73 65  ination database
1d20: 20 61 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67   are large enoug
1d30: 68 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  h to include the
1d40: 0a 23 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 70  .# the locking-p
1d50: 61 67 65 20 28 74 68 65 20 70 61 67 65 20 74 68  age (the page th
1d60: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1d70: 72 61 6e 67 65 20 6f 66 20 62 79 74 65 73 20 74  range of bytes t
1d80: 68 61 74 0a 23 20 74 68 65 20 6c 6f 63 6b 73 20  hat.# the locks 
1d90: 61 72 65 20 61 70 70 6c 69 65 64 20 74 6f 29 2e  are applied to).
1da0: 20 54 68 65 73 65 20 74 65 73 74 73 20 61 73 73   These tests ass
1db0: 75 6d 65 20 74 68 61 74 20 74 68 65 20 70 65 6e  ume that the pen
1dc0: 64 69 6e 67 0a 23 20 62 79 74 65 20 69 73 20 61  ding.# byte is a
1dd0: 74 20 6f 66 66 73 65 74 20 30 78 30 30 30 31 30  t offset 0x00010
1de0: 30 30 30 20 28 36 34 4b 42 20 6f 66 66 73 65 74  000 (64KB offset
1df0: 29 2c 20 61 73 20 73 65 74 20 62 79 20 74 65 73  ), as set by tes
1e00: 74 65 72 2e 74 63 6c 2c 20 0a 23 20 6e 6f 74 20  ter.tcl, .# not 
1e10: 61 74 20 74 68 65 20 31 47 42 20 6f 66 66 73 65  at the 1GB offse
1e20: 74 20 61 73 20 69 74 20 75 73 75 61 6c 6c 79 20  t as it usually 
1e30: 69 73 2e 0a 23 0a 23 20 54 68 65 20 74 65 73 74  is..#.# The test
1e40: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 73   procedure is as
1e50: 20 66 6f 6c 6c 6f 77 73 20 28 73 61 6d 65 20 70   follows (same p
1e60: 72 6f 63 65 64 75 72 65 20 61 73 20 75 73 65 64  rocedure as used
1e70: 20 66 6f 72 20 0a 23 20 74 68 65 20 62 61 63 6b   for .# the back
1e80: 75 70 2d 32 2e 2a 20 74 65 73 74 73 29 3a 0a 23  up-2.* tests):.#
1e90: 0a 23 20 20 20 31 29 20 50 6f 70 75 6c 61 74 65  .#   1) Populate
1ea0: 20 74 68 65 20 73 6f 75 72 63 65 20 64 61 74 61   the source data
1eb0: 62 61 73 65 2e 0a 23 20 20 20 32 29 20 50 6f 70  base..#   2) Pop
1ec0: 75 6c 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  ulate the destin
1ed0: 61 74 69 6f 6e 20 64 61 74 61 62 61 73 65 2e 0a  ation database..
1ee0: 23 20 20 20 33 29 20 52 75 6e 20 74 68 65 20 62  #   3) Run the b
1ef0: 61 63 6b 75 70 20 74 6f 20 63 6f 6d 70 6c 65 74  ackup to complet
1f00: 69 6f 6e 2e 20 28 62 61 63 6b 75 70 2d 33 2e 2a  ion. (backup-3.*
1f10: 2e 31 29 0a 23 20 20 20 34 29 20 49 6e 74 65 67  .1).#   4) Integ
1f20: 72 69 74 79 20 63 68 65 63 6b 20 74 68 65 20 64  rity check the d
1f30: 65 73 74 69 6e 61 74 69 6f 6e 20 64 62 2e 20 28  estination db. (
1f40: 62 61 63 6b 75 70 2d 33 2e 2a 2e 32 29 0a 23 20  backup-3.*.2).# 
1f50: 20 20 35 29 20 43 68 65 63 6b 20 74 68 61 74 20    5) Check that 
1f60: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1f70: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
1f80: 64 62 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  db is the same a
1f90: 73 20 74 68 61 74 0a 23 20 20 20 20 20 20 6f 66  s that.#      of
1fa0: 20 74 68 65 20 73 6f 75 72 63 65 20 64 62 2e 20   the source db. 
1fb0: 28 62 61 63 6b 75 70 2d 33 2e 2a 2e 33 29 0a 23  (backup-3.*.3).#
1fc0: 0a 23 20 54 68 65 20 74 65 73 74 20 70 72 6f 63  .# The test proc
1fd0: 65 64 75 72 65 20 69 73 20 72 75 6e 20 77 69 74  edure is run wit
1fe0: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
1ff0: 70 61 72 61 6d 65 74 65 72 73 20 76 61 72 69 65  parameters varie
2000: 64 3a 20 0a 23 0a 23 20 20 20 2a 20 53 6f 75 72  d: .#.#   * Sour
2010: 63 65 20 64 61 74 61 62 61 73 65 20 69 6e 63 6c  ce database incl
2020: 75 64 65 73 20 70 65 6e 64 69 6e 67 2d 62 79 74  udes pending-byt
2030: 65 20 70 61 67 65 2e 0a 23 20 20 20 2a 20 53 6f  e page..#   * So
2040: 75 72 63 65 20 64 61 74 61 62 61 73 65 20 64 6f  urce database do
2050: 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 70  es not include p
2060: 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65  ending-byte page
2070: 2e 0a 23 0a 23 20 20 20 2a 20 54 61 72 67 65 74  ..#.#   * Target
2080: 20 64 61 74 61 62 61 73 65 20 69 6e 63 6c 75 64   database includ
2090: 65 73 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20  es pending-byte 
20a0: 70 61 67 65 2e 0a 23 20 20 20 2a 20 54 61 72 67  page..#   * Targ
20b0: 65 74 20 64 61 74 61 62 61 73 65 20 64 6f 65 73  et database does
20c0: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 70 65 6e   not include pen
20d0: 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 0a  ding-byte page..
20e0: 23 0a 23 20 20 20 2a 20 54 61 72 67 65 74 20 64  #.#   * Target d
20f0: 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a  atabase page-siz
2100: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
2110: 20 74 68 65 20 73 6f 75 72 63 65 2c 20 4f 52 0a   the source, OR.
2120: 23 20 20 20 2a 20 54 61 72 67 65 74 20 64 61 74  #   * Target dat
2130: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
2140: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
2150: 68 65 20 73 6f 75 72 63 65 2c 20 4f 52 0a 23 20  he source, OR.# 
2160: 20 20 2a 20 54 61 72 67 65 74 20 64 61 74 61 62    * Target datab
2170: 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  ase page-size is
2180: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
2190: 65 20 73 6f 75 72 63 65 2e 0a 23 0a 73 65 74 20  e source..#.set 
21a0: 69 54 65 73 74 20 31 0a 66 6f 72 65 61 63 68 20  iTest 1.foreach 
21b0: 6e 53 72 63 50 67 20 7b 31 30 20 36 34 20 36 35  nSrcPg {10 64 65
21c0: 20 36 36 20 31 30 30 7d 20 7b 0a 66 6f 72 65 61   66 100} {.forea
21d0: 63 68 20 6e 44 65 73 74 52 6f 77 20 7b 31 30 20  ch nDestRow {10 
21e0: 31 30 30 7d 20 7b 0a 66 6f 72 65 61 63 68 20 6e  100} {.foreach n
21f0: 44 65 73 74 50 67 73 7a 20 7b 35 31 32 20 31 30  DestPgsz {512 10
2200: 32 34 20 32 30 34 38 20 34 30 39 36 7d 20 7b 0a  24 2048 4096} {.
2210: 0a 20 20 63 61 74 63 68 20 7b 20 66 69 6c 65 20  .  catch { file 
2220: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20 7d  delete test.db }
2230: 0a 20 20 63 61 74 63 68 20 7b 20 66 69 6c 65 20  .  catch { file 
2240: 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64 62 20  delete test2.db 
2250: 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  }.  sqlite3 db t
2260: 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  est.db.  sqlite3
2270: 20 64 62 32 20 74 65 73 74 32 2e 64 62 0a 0a 20   db2 test2.db.. 
2280: 20 23 20 53 65 74 20 75 70 20 74 68 65 20 63 6f   # Set up the co
2290: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 74 77 6f  ntent of the two
22a0: 20 64 61 74 61 62 61 73 65 73 2e 0a 20 20 23 0a   databases..  #.
22b0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
22c0: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
22d0: 30 32 34 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  024 }.  execsql 
22e0: 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a  "PRAGMA page_siz
22f0: 65 20 3d 20 24 6e 44 65 73 74 50 67 73 7a 22 20  e = $nDestPgsz" 
2300: 64 62 32 0a 20 20 66 6f 72 65 61 63 68 20 64 62  db2.  foreach db
2310: 20 7b 64 62 20 64 62 32 7d 20 7b 0a 20 20 20 20   {db db2} {.    
2320: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
2330: 42 45 47 49 4e 3b 20 0a 20 20 20 20 20 20 43 52  BEGIN; .      CR
2340: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
2350: 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54   b);.      CREAT
2360: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
2370: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 4f  (a, b);.      CO
2380: 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 24 64 62 0a  MMIT;.    } $db.
2390: 20 20 7d 0a 20 20 77 68 69 6c 65 20 7b 5b 66 69    }.  while {[fi
23a0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
23b0: 2f 31 30 32 34 20 3c 20 24 6e 53 72 63 50 67 7d  /1024 < $nSrcPg}
23c0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
23d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
23e0: 56 41 4c 55 45 53 28 24 69 69 2c 20 72 61 6e 64  VALUES($ii, rand
23f0: 73 74 72 28 32 30 30 2c 32 30 30 29 29 20 7d 0a  str(200,200)) }.
2400: 20 20 7d 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20    }..  for {set 
2410: 69 69 20 30 7d 20 7b 24 69 69 20 3c 20 24 6e 44  ii 0} {$ii < $nD
2420: 65 73 74 52 6f 77 7d 20 7b 69 6e 63 72 20 69 69  estRow} {incr ii
2430: 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  } {.    execsql 
2440: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
2450: 20 56 41 4c 55 45 53 28 24 69 69 2c 20 72 61 6e   VALUES($ii, ran
2460: 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 29  dstr(1000,1000))
2470: 20 7d 20 64 62 32 0a 20 20 7d 0a 0a 20 20 23 20   } db2.  }..  # 
2480: 42 61 63 6b 75 70 20 74 68 65 20 73 6f 75 72 63  Backup the sourc
2490: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 64 6f  e database..  do
24a0: 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 33 2e 24  _test backup-3.$
24b0: 69 54 65 73 74 2e 31 20 7b 0a 20 20 20 20 73 71  iTest.1 {.    sq
24c0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64  lite3_backup B d
24d0: 62 20 6d 61 69 6e 20 64 62 32 20 6d 61 69 6e 0a  b main db2 main.
24e0: 20 20 20 20 77 68 69 6c 65 20 7b 5b 42 20 73 74      while {[B st
24f0: 65 70 20 31 30 5d 3d 3d 22 53 51 4c 49 54 45 5f  ep 10]=="SQLITE_
2500: 4f 4b 22 7d 20 7b 7d 0a 20 20 20 20 42 20 66 69  OK"} {}.    B fi
2510: 6e 69 73 68 0a 20 20 7d 20 7b 53 51 4c 49 54 45  nish.  } {SQLITE
2520: 5f 4f 4b 7d 0a 20 20 20 20 0a 20 20 23 20 52 75  _OK}.    .  # Ru
2530: 6e 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63  n integrity chec
2540: 6b 20 6f 6e 20 74 68 65 20 62 61 63 6b 75 70 2e  k on the backup.
2550: 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 75  .  do_test backu
2560: 70 2d 33 2e 24 69 54 65 73 74 2e 32 20 7b 0a 20  p-3.$iTest.2 {. 
2570: 20 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47     execsql "PRAG
2580: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
2590: 63 6b 22 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d  ck" db2.  } {ok}
25a0: 0a 20 20 0a 20 20 74 65 73 74 5f 63 6f 6e 74 65  .  .  test_conte
25b0: 6e 74 73 20 62 61 63 6b 75 70 2d 33 2e 24 69 54  nts backup-3.$iT
25c0: 65 73 74 2e 33 20 64 62 20 6d 61 69 6e 20 64 62  est.3 db main db
25d0: 32 20 6d 61 69 6e 0a 0a 20 20 64 62 20 63 6c 6f  2 main..  db clo
25e0: 73 65 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20  se.  db2 close. 
25f0: 20 69 6e 63 72 20 69 54 65 73 74 0a 7d 0a 7d 0a   incr iTest.}.}.
2600: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
2610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2640: 2d 2d 2d 2d 2d 2d 2d 2d 0a 64 6f 5f 74 65 73 74  --------.do_test
2650: 20 62 61 63 6b 75 70 2d 33 2e 24 69 54 65 73 74   backup-3.$iTest
2660: 2e 31 20 7b 0a 20 20 63 61 74 63 68 20 7b 20 66  .1 {.  catch { f
2670: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
2680: 65 20 74 65 73 74 2e 64 62 20 7d 0a 20 20 63 61  e test.db }.  ca
2690: 74 63 68 20 7b 20 66 69 6c 65 20 64 65 6c 65 74  tch { file delet
26a0: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64  e -force test2.d
26b0: 62 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62  b }.  sqlite3 db
26c0: 20 74 65 73 74 2e 64 62 0a 20 20 73 65 74 20 69   test.db.  set i
26d0: 54 61 62 20 31 0a 0a 20 20 64 62 20 65 76 61 6c  Tab 1..  db eval
26e0: 20 7b 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73   { PRAGMA page_s
26f0: 69 7a 65 20 3d 20 35 31 32 20 7d 0a 20 20 77 68  ize = 512 }.  wh
2700: 69 6c 65 20 7b 5b 66 69 6c 65 20 73 69 7a 65 20  ile {[file size 
2710: 74 65 73 74 2e 64 62 5d 20 3c 3d 20 24 3a 3a 73  test.db] <= $::s
2720: 71 6c 69 74 65 5f 70 65 6e 64 69 6e 67 5f 62 79  qlite_pending_by
2730: 74 65 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61  te} {.    db eva
2740: 6c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  l "CREATE TABLE 
2750: 74 24 7b 69 54 61 62 7d 28 61 2c 20 62 2c 20 63  t${iTab}(a, b, c
2760: 29 22 0a 20 20 20 20 69 6e 63 72 20 69 54 61 62  )".    incr iTab
2770: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 20  .  }..  sqlite3 
2780: 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 64  db2 test2.db.  d
2790: 62 32 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41  b2 eval { PRAGMA
27a0: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39   page_size = 409
27b0: 36 20 7d 0a 20 20 77 68 69 6c 65 20 7b 5b 66 69  6 }.  while {[fi
27c0: 6c 65 20 73 69 7a 65 20 74 65 73 74 32 2e 64 62  le size test2.db
27d0: 5d 20 3c 20 24 3a 3a 73 71 6c 69 74 65 5f 70 65  ] < $::sqlite_pe
27e0: 6e 64 69 6e 67 5f 62 79 74 65 7d 20 7b 0a 20 20  nding_byte} {.  
27f0: 20 20 64 62 32 20 65 76 61 6c 20 22 43 52 45 41    db2 eval "CREA
2800: 54 45 20 54 41 42 4c 45 20 74 24 7b 69 54 61 62  TE TABLE t${iTab
2810: 7d 28 61 2c 20 62 2c 20 63 29 22 0a 20 20 20 20  }(a, b, c)".    
2820: 69 6e 63 72 20 69 54 61 62 0a 20 20 7d 0a 0a 20  incr iTab.  }.. 
2830: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
2840: 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61  B db2 main db ma
2850: 69 6e 0a 20 20 42 20 73 74 65 70 20 2d 31 0a 7d  in.  B step -1.}
2860: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 7d 0a 0a   {SQLITE_DONE}..
2870: 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 33  do_test backup-3
2880: 2e 24 69 54 65 73 74 2e 32 20 7b 0a 20 20 42 20  .$iTest.2 {.  B 
2890: 66 69 6e 69 73 68 0a 7d 20 7b 53 51 4c 49 54 45  finish.} {SQLITE
28a0: 5f 4f 4b 7d 0a 0a 23 0a 23 20 45 6e 64 20 6f 66  _OK}..#.# End of
28b0: 20 62 61 63 6b 75 70 2d 33 2e 2a 20 74 65 73 74   backup-3.* test
28c0: 73 2e 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s..#------------
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 0a 0a 0a 23 2d 2d 2d  ---------...#---
2910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2950: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
2960: 6e 67 20 74 65 73 74 73 2c 20 62 61 63 6b 75 70  ng tests, backup
2970: 2d 34 2e 2a 2c 20 74 65 73 74 20 76 61 72 69 6f  -4.*, test vario
2980: 75 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  us error conditi
2990: 6f 6e 73 3a 0a 23 20 0a 23 20 62 61 63 6b 75 70  ons:.# .# backup
29a0: 2d 34 2e 31 2e 2a 3a 20 54 65 73 74 20 69 6e 76  -4.1.*: Test inv
29b0: 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 6e 61  alid database na
29c0: 6d 65 73 2e 0a 23 0a 23 20 62 61 63 6b 75 70 2d  mes..#.# backup-
29d0: 34 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  4.2.*: Test that
29e0: 20 74 68 65 20 73 6f 75 72 63 65 20 64 61 74 61   the source data
29f0: 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 64  base cannot be d
2a00: 65 74 61 63 68 65 64 20 77 68 69 6c 65 20 0a 23  etached while .#
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
2a20: 20 62 61 63 6b 75 70 20 69 73 20 69 6e 20 70 72   backup is in pr
2a30: 6f 67 72 65 73 73 2e 0a 23 0a 23 20 62 61 63 6b  ogress..#.# back
2a40: 75 70 2d 34 2e 33 2e 2a 3a 20 54 65 73 74 20 74  up-4.3.*: Test t
2a50: 68 61 74 20 74 68 65 20 73 6f 75 72 63 65 20 64  hat the source d
2a60: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 63  atabase handle c
2a70: 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 0a  annot be closed.
2a80: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
2a90: 77 68 69 6c 65 20 61 20 62 61 63 6b 75 70 20 69  while a backup i
2aa0: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 23  s in progress..#
2ab0: 0a 23 20 62 61 63 6b 75 70 2d 34 2e 34 2e 2a 3a  .# backup-4.4.*:
2ac0: 20 54 65 73 74 20 61 6e 20 61 74 74 65 6d 70 74   Test an attempt
2ad0: 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 65 20   to specify the 
2ae0: 73 61 6d 65 20 68 61 6e 64 6c 65 20 66 6f 72 20  same handle for 
2af0: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
2b00: 20 20 20 20 73 6f 75 72 63 65 20 61 6e 64 20 64      source and d
2b10: 65 73 74 69 6e 61 74 69 6f 6e 20 64 61 74 61 62  estination datab
2b20: 61 73 65 73 2e 0a 23 0a 23 20 62 61 63 6b 75 70  ases..#.# backup
2b30: 2d 34 2e 35 2e 2a 3a 20 54 65 73 74 20 74 68 61  -4.5.*: Test tha
2b40: 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
2b50: 65 73 74 69 6e 61 74 69 6f 6e 20 77 69 74 68 20  estination with 
2b60: 61 20 64 69 66 66 65 72 65 6e 74 0a 23 20 20 20  a different.#   
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
2b80: 2d 73 69 7a 65 20 74 6f 20 74 68 65 20 73 6f 75  -size to the sou
2b90: 72 63 65 20 64 61 74 61 62 61 73 65 20 69 73 20  rce database is 
2ba0: 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 73 71 6c 69  an error..#.sqli
2bb0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 73  te3 db test.db.s
2bc0: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 32  qlite3 db2 test2
2bd0: 2e 64 62 0a 0a 64 6f 5f 74 65 73 74 20 62 61 63  .db..do_test bac
2be0: 6b 75 70 2d 34 2e 31 2e 31 20 7b 0a 20 20 63 61  kup-4.1.1 {.  ca
2bf0: 74 63 68 20 7b 20 73 71 6c 69 74 65 33 5f 62 61  tch { sqlite3_ba
2c00: 63 6b 75 70 20 42 20 64 62 20 61 75 78 20 64 62  ckup B db aux db
2c10: 32 20 6d 61 69 6e 20 7d 0a 7d 20 7b 31 7d 0a 64  2 main }.} {1}.d
2c20: 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 34 2e  o_test backup-4.
2c30: 31 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  1.2 {.  sqlite3_
2c40: 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b 75 6e 6b  errmsg db.} {unk
2c50: 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 61 75  nown database au
2c60: 78 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75  x}.do_test backu
2c70: 70 2d 34 2e 31 2e 33 20 7b 0a 20 20 63 61 74 63  p-4.1.3 {.  catc
2c80: 68 20 7b 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  h { sqlite3_back
2c90: 75 70 20 42 20 64 62 20 6d 61 69 6e 20 64 62 32  up B db main db2
2ca0: 20 61 75 78 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f   aux }.} {1}.do_
2cb0: 74 65 73 74 20 62 61 63 6b 75 70 2d 34 2e 31 2e  test backup-4.1.
2cc0: 34 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 72  4 {.  sqlite3_er
2cd0: 72 6d 73 67 20 64 62 0a 7d 20 7b 75 6e 6b 6e 6f  rmsg db.} {unkno
2ce0: 77 6e 20 64 61 74 61 62 61 73 65 20 61 75 78 7d  wn database aux}
2cf0: 0a 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70  ..do_test backup
2d00: 2d 34 2e 32 2e 31 20 7b 0a 20 20 63 61 74 63 68  -4.2.1 {.  catch
2d10: 20 7b 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d   { file delete -
2d20: 66 6f 72 63 65 20 74 65 73 74 33 2e 64 62 20 7d  force test3.db }
2d30: 0a 20 20 63 61 74 63 68 20 7b 20 66 69 6c 65 20  .  catch { file 
2d40: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65  delete -force te
2d50: 73 74 34 2e 64 62 20 7d 0a 20 20 65 78 65 63 73  st4.db }.  execs
2d60: 71 6c 20 7b 20 0a 20 20 20 20 41 54 54 41 43 48  ql { .    ATTACH
2d70: 20 27 74 65 73 74 33 2e 64 62 27 20 41 53 20 61   'test3.db' AS a
2d80: 75 78 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20  ux1;.    CREATE 
2d90: 54 41 42 4c 45 20 61 75 78 31 2e 74 31 28 61 2c  TABLE aux1.t1(a,
2da0: 20 62 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73   b);.  }.  execs
2db0: 71 6c 20 7b 20 0a 20 20 20 20 41 54 54 41 43 48  ql { .    ATTACH
2dc0: 20 27 74 65 73 74 34 2e 64 62 27 20 41 53 20 61   'test4.db' AS a
2dd0: 75 78 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20  ux2;.    CREATE 
2de0: 54 41 42 4c 45 20 61 75 78 32 2e 74 32 28 61 2c  TABLE aux2.t2(a,
2df0: 20 62 29 3b 0a 20 20 7d 20 64 62 32 0a 20 20 73   b);.  } db2.  s
2e00: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20  qlite3_backup B 
2e10: 64 62 20 61 75 78 31 20 64 62 32 20 61 75 78 32  db aux1 db2 aux2
2e20: 0a 7d 20 7b 42 7d 0a 64 6f 5f 74 65 73 74 20 62  .} {B}.do_test b
2e30: 61 63 6b 75 70 2d 34 2e 32 2e 32 20 7b 0a 20 20  ackup-4.2.2 {.  
2e40: 63 61 74 63 68 73 71 6c 20 7b 20 44 45 54 41 43  catchsql { DETAC
2e50: 48 20 61 75 78 32 20 7d 20 64 62 32 0a 7d 20 7b  H aux2 } db2.} {
2e60: 31 20 7b 64 61 74 61 62 61 73 65 20 61 75 78 32  1 {database aux2
2e70: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f   is locked}}.do_
2e80: 74 65 73 74 20 62 61 63 6b 75 70 2d 34 2e 32 2e  test backup-4.2.
2e90: 33 20 7b 0a 20 20 42 20 73 74 65 70 20 35 30 0a  3 {.  B step 50.
2ea0: 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 7d 0a  } {SQLITE_DONE}.
2eb0: 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 34  do_test backup-4
2ec0: 2e 32 2e 34 20 7b 0a 20 20 42 20 66 69 6e 69 73  .2.4 {.  B finis
2ed0: 68 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  h.} {SQLITE_OK}.
2ee0: 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d  .do_test backup-
2ef0: 34 2e 33 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65  4.3.1 {.  sqlite
2f00: 33 5f 62 61 63 6b 75 70 20 42 20 64 62 20 61 75  3_backup B db au
2f10: 78 31 20 64 62 32 20 61 75 78 32 0a 7d 20 7b 42  x1 db2 aux2.} {B
2f20: 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70  }.do_test backup
2f30: 2d 34 2e 33 2e 32 20 7b 0a 20 20 64 62 32 20 63  -4.3.2 {.  db2 c
2f40: 61 63 68 65 20 66 6c 75 73 68 0a 20 20 73 71 6c  ache flush.  sql
2f50: 69 74 65 33 5f 63 6c 6f 73 65 20 64 62 32 0a 7d  ite3_close db2.}
2f60: 20 7b 53 51 4c 49 54 45 5f 42 55 53 59 7d 0a 64   {SQLITE_BUSY}.d
2f70: 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 34 2e  o_test backup-4.
2f80: 33 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  3.3 {.  sqlite3_
2f90: 65 72 72 6d 73 67 20 64 62 32 0a 7d 20 7b 75 6e  errmsg db2.} {un
2fa0: 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75  able to close du
2fb0: 65 20 74 6f 20 75 6e 66 69 6e 69 73 68 65 64 20  e to unfinished 
2fc0: 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e  backup operation
2fd0: 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70  }.do_test backup
2fe0: 2d 34 2e 33 2e 34 20 7b 0a 20 20 42 20 73 74 65  -4.3.4 {.  B ste
2ff0: 70 20 35 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 44  p 50.} {SQLITE_D
3000: 4f 4e 45 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63  ONE}.do_test bac
3010: 6b 75 70 2d 34 2e 33 2e 35 20 7b 0a 20 20 42 20  kup-4.3.5 {.  B 
3020: 66 69 6e 69 73 68 0a 7d 20 7b 53 51 4c 49 54 45  finish.} {SQLITE
3030: 5f 4f 4b 7d 0a 0a 64 6f 5f 74 65 73 74 20 62 61  _OK}..do_test ba
3040: 63 6b 75 70 2d 34 2e 34 2e 31 20 7b 0a 20 20 73  ckup-4.4.1 {.  s
3050: 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 73 71  et rc [catch {sq
3060: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64  lite3_backup B d
3070: 62 20 6d 61 69 6e 20 64 62 20 61 75 78 31 7d 5d  b main db aux1}]
3080: 0a 20 20 6c 69 73 74 20 24 72 63 20 5b 73 71 6c  .  list $rc [sql
3090: 69 74 65 33 5f 65 72 72 63 6f 64 65 20 64 62 5d  ite3_errcode db]
30a0: 20 5b 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   [sqlite3_errmsg
30b0: 20 64 62 5d 0a 7d 20 7b 31 20 53 51 4c 49 54 45   db].} {1 SQLITE
30c0: 5f 45 52 52 4f 52 20 7b 73 6f 75 72 63 65 20 61  _ERROR {source a
30d0: 6e 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d  nd destination m
30e0: 75 73 74 20 62 65 20 64 69 73 74 69 6e 63 74 7d  ust be distinct}
30f0: 7d 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32 20 63  }.db close.db2 c
3100: 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 62 61  lose..do_test ba
3110: 63 6b 75 70 2d 34 2e 35 2e 31 20 7b 0a 20 20 63  ckup-4.5.1 {.  c
3120: 61 74 63 68 20 7b 20 66 69 6c 65 20 64 65 6c 65  atch { file dele
3130: 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64  te -force test.d
3140: 62 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62  b }.  sqlite3 db
3150: 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74   test.db.  sqlit
3160: 65 33 20 64 62 32 20 3a 6d 65 6d 6f 72 79 3a 0a  e3 db2 :memory:.
3170: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3180: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
3190: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
31a0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
31b0: 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 65 78  (1, 2);.  }.  ex
31c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
31d0: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34  MA page_size = 4
31e0: 30 39 36 3b 0a 20 20 20 20 43 52 45 41 54 45 20  096;.    CREATE 
31f0: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a  TABLE t2(a, b);.
3200: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3210: 74 32 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t2 VALUES(3, 4);
3220: 0a 20 20 7d 20 64 62 32 0a 20 20 73 71 6c 69 74  .  } db2.  sqlit
3230: 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20  e3_backup B db2 
3240: 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 7d 20 7b  main db main.} {
3250: 42 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75  B}.do_test backu
3260: 70 2d 34 2e 35 2e 32 20 7b 0a 20 20 42 20 73 74  p-4.5.2 {.  B st
3270: 65 70 20 35 30 30 30 0a 7d 20 7b 53 51 4c 49 54  ep 5000.} {SQLIT
3280: 45 5f 52 45 41 44 4f 4e 4c 59 7d 0a 64 6f 5f 74  E_READONLY}.do_t
3290: 65 73 74 20 62 61 63 6b 75 70 2d 34 2e 35 2e 33  est backup-4.5.3
32a0: 20 7b 0a 20 20 42 20 66 69 6e 69 73 68 0a 7d 20   {.  B finish.} 
32b0: 7b 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  {SQLITE_READONLY
32c0: 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32 20  }..db close.db2 
32d0: 63 6c 6f 73 65 0a 23 0a 23 20 45 6e 64 20 6f 66  close.#.# End of
32e0: 20 62 61 63 6b 75 70 2d 35 2e 2a 20 74 65 73 74   backup-5.* test
32f0: 73 2e 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s..#------------
3300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 2d 2d 2d 2d  ---------..#----
3340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3380: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
3390: 67 20 74 65 73 74 73 2c 20 62 61 63 6b 75 70 2d  g tests, backup-
33a0: 35 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 74  5.*, test that t
33b0: 68 65 20 62 61 63 6b 75 70 20 77 6f 72 6b 73 20  he backup works 
33c0: 70 72 6f 70 65 72 6c 79 0a 23 20 77 68 65 6e 20  properly.# when 
33d0: 74 68 65 20 73 6f 75 72 63 65 20 64 61 74 61 62  the source datab
33e0: 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20  ase is modified 
33f0: 64 75 72 69 6e 67 20 74 68 65 20 62 61 63 6b 75  during the backu
3400: 70 2e 20 54 65 73 74 20 63 61 73 65 73 0a 23 20  p. Test cases.# 
3410: 61 72 65 20 6f 72 67 61 6e 69 7a 65 64 20 61 73  are organized as
3420: 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 62 61   follows:.#.# ba
3430: 63 6b 75 70 2d 35 2e 78 2e 31 2e 2a 3a 20 4e 6f  ckup-5.x.1.*: No
3440: 74 68 69 6e 67 20 73 70 65 63 69 61 6c 2e 20 4d  thing special. M
3450: 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61  odify the databa
3460: 73 65 20 6d 69 64 2d 62 61 63 6b 75 70 2e 0a 23  se mid-backup..#
3470: 0a 23 20 62 61 63 6b 75 70 2d 35 2e 78 2e 32 2e  .# backup-5.x.2.
3480: 2a 3a 20 4d 6f 64 69 66 79 20 74 68 65 20 64 61  *: Modify the da
3490: 74 61 62 61 73 65 20 6d 69 64 2d 62 61 63 6b 75  tabase mid-backu
34a0: 70 20 73 6f 20 74 68 61 74 20 6f 6e 65 20 6f 72  p so that one or
34b0: 20 6d 6f 72 65 0a 23 20 20 20 20 20 20 20 20 20   more.#         
34c0: 20 20 20 20 20 20 20 20 70 61 67 65 73 20 61 72          pages ar
34d0: 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 64 75  e written out du
34e0: 65 20 74 6f 20 63 61 63 68 65 20 73 74 72 65 73  e to cache stres
34f0: 73 2e 20 54 68 65 6e 20 0a 23 20 20 20 20 20 20  s. Then .#      
3500: 20 20 20 20 20 20 20 20 20 20 20 72 6f 6c 6c 62             rollb
3510: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
3520: 69 6f 6e 2e 0a 23 0a 23 20 62 61 63 6b 75 70 2d  ion..#.# backup-
3530: 35 2e 78 2e 33 2e 2a 3a 20 44 61 74 61 62 61 73  5.x.3.*: Databas
3540: 65 20 69 73 20 76 61 63 75 75 6d 65 64 2e 0a 23  e is vacuumed..#
3550: 0a 23 20 62 61 63 6b 75 70 2d 35 2e 78 2e 34 2e  .# backup-5.x.4.
3560: 2a 3a 20 44 61 74 61 62 61 73 65 20 69 73 20 76  *: Database is v
3570: 61 63 75 75 6d 65 64 20 61 6e 64 20 74 68 65 20  acuumed and the 
3580: 70 61 67 65 2d 73 69 7a 65 20 6d 6f 64 69 66 69  page-size modifi
3590: 65 64 2e 0a 23 0a 23 20 62 61 63 6b 75 70 2d 35  ed..#.# backup-5
35a0: 2e 78 2e 35 2e 2a 3a 20 44 61 74 61 62 61 73 65  .x.5.*: Database
35b0: 20 69 73 20 73 68 72 75 6e 6b 20 76 69 61 20 69   is shrunk via i
35c0: 6e 63 72 2d 76 61 63 75 75 6d 2e 0a 23 0a 23 20  ncr-vacuum..#.# 
35d0: 45 61 63 68 20 74 65 73 74 20 69 73 20 72 75 6e  Each test is run
35e0: 20 74 68 72 65 65 20 74 69 6d 65 73 2c 20 69 6e   three times, in
35f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
3600: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 3a 0a 23  onfigurations:.#
3610: 0a 23 20 20 20 31 29 20 42 61 63 6b 69 6e 67 20  .#   1) Backing 
3620: 75 70 20 66 69 6c 65 2d 74 6f 2d 66 69 6c 65 2e  up file-to-file.
3630: 20 54 68 65 20 77 72 69 74 65 72 20 77 72 69 74   The writer writ
3640: 65 73 20 76 69 61 20 61 6e 20 65 78 74 65 72 6e  es via an extern
3650: 61 6c 20 70 61 67 65 72 2e 0a 23 20 20 20 32 29  al pager..#   2)
3660: 20 42 61 63 6b 69 6e 67 20 75 70 20 66 69 6c 65   Backing up file
3670: 2d 74 6f 2d 66 69 6c 65 2e 20 54 68 65 20 77 72  -to-file. The wr
3680: 69 74 65 72 20 77 72 69 74 65 73 20 76 69 61 20  iter writes via 
3690: 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 61  the same pager a
36a0: 73 0a 23 20 20 20 20 20 20 69 73 20 75 73 65 64  s.#      is used
36b0: 20 62 79 20 74 68 65 20 62 61 63 6b 75 70 20 6f   by the backup o
36c0: 70 65 72 61 74 69 6f 6e 2e 0a 23 20 20 20 33 29  peration..#   3)
36d0: 20 42 61 63 6b 69 6e 67 20 75 70 20 6d 65 6d 6f   Backing up memo
36e0: 72 79 2d 74 6f 2d 66 69 6c 65 2e 20 0a 23 0a 73  ry-to-file. .#.s
36f0: 65 74 20 69 54 65 73 74 20 30 0a 66 69 6c 65 20  et iTest 0.file 
3700: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 62 61  delete -force ba
3710: 6b 2e 64 62 2d 77 61 6c 0a 66 6f 72 65 61 63 68  k.db-wal.foreach
3720: 20 7b 77 72 69 74 65 72 20 66 69 6c 65 7d 20 7b   {writer file} {
3730: 64 62 20 74 65 73 74 2e 64 62 20 64 62 33 20 74  db test.db db3 t
3740: 65 73 74 2e 64 62 20 64 62 20 3a 6d 65 6d 6f 72  est.db db :memor
3750: 79 3a 7d 20 7b 0a 20 20 69 6e 63 72 20 69 54 65  y:} {.  incr iTe
3760: 73 74 0a 20 20 63 61 74 63 68 20 7b 20 66 69 6c  st.  catch { fil
3770: 65 20 64 65 6c 65 74 65 20 62 61 6b 2e 64 62 20  e delete bak.db 
3780: 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  }.  sqlite3 db2 
3790: 62 61 6b 2e 64 62 0a 20 20 63 61 74 63 68 20 7b  bak.db.  catch {
37a0: 20 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69   file delete $fi
37b0: 6c 65 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64  le }.  sqlite3 d
37c0: 62 20 24 66 69 6c 65 0a 20 20 73 71 6c 69 74 65  b $file.  sqlite
37d0: 33 20 64 62 33 20 24 66 69 6c 65 0a 0a 20 20 64  3 db3 $file..  d
37e0: 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 35 2e  o_test backup-5.
37f0: 24 69 54 65 73 74 2e 31 2e 31 20 7b 0a 20 20 20  $iTest.1.1 {.   
3800: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
3810: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52   BEGIN;.      CR
3820: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
3830: 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54   b);.      CREAT
3840: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
3850: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e  (a, b);.      IN
3860: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3870: 55 45 53 28 31 2c 20 72 61 6e 64 73 74 72 28 31  UES(1, randstr(1
3880: 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20  000,1000));.    
3890: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
38a0: 20 56 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 73   VALUES(2, rands
38b0: 74 72 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a  tr(1000,1000));.
38c0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
38d0: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 72  O t1 VALUES(3, r
38e0: 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30  andstr(1000,1000
38f0: 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
3900: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
3910: 34 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c  4, randstr(1000,
3920: 31 30 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e  1000));.      IN
3930: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3940: 55 45 53 28 35 2c 20 72 61 6e 64 73 74 72 28 31  UES(5, randstr(1
3950: 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20  000,1000));.    
3960: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a    COMMIT;.    }.
3970: 20 20 20 20 65 78 70 72 20 7b 5b 65 78 65 63 73      expr {[execs
3980: 71 6c 20 7b 50 52 41 47 4d 41 20 70 61 67 65 5f  ql {PRAGMA page_
3990: 63 6f 75 6e 74 7d 5d 20 3e 20 31 30 7d 0a 20 20  count}] > 10}.  
39a0: 7d 20 7b 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20  } {1}.  do_test 
39b0: 62 61 63 6b 75 70 2d 35 2e 24 69 54 65 73 74 2e  backup-5.$iTest.
39c0: 31 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  1.2 {.    sqlite
39d0: 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d  3_backup B db2 m
39e0: 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 20 20  ain db main.    
39f0: 42 20 73 74 65 70 20 35 0a 20 20 7d 20 7b 53 51  B step 5.  } {SQ
3a00: 4c 49 54 45 5f 4f 4b 7d 0a 20 20 64 6f 5f 74 65  LITE_OK}.  do_te
3a10: 73 74 20 62 61 63 6b 75 70 2d 35 2e 24 69 54 65  st backup-5.$iTe
3a20: 73 74 2e 31 2e 33 20 7b 0a 20 20 20 20 65 78 65  st.1.3 {.    exe
3a30: 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 31  csql { UPDATE t1
3a40: 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 20 7d   SET a = a + 1 }
3a50: 20 24 77 72 69 74 65 72 0a 20 20 20 20 42 20 73   $writer.    B s
3a60: 74 65 70 20 35 30 0a 20 20 7d 20 7b 53 51 4c 49  tep 50.  } {SQLI
3a70: 54 45 5f 44 4f 4e 45 7d 0a 20 20 64 6f 5f 74 65  TE_DONE}.  do_te
3a80: 73 74 20 62 61 63 6b 75 70 2d 35 2e 24 69 54 65  st backup-5.$iTe
3a90: 73 74 2e 31 2e 34 20 7b 0a 20 20 20 20 42 20 66  st.1.4 {.    B f
3aa0: 69 6e 69 73 68 0a 20 20 7d 20 7b 53 51 4c 49 54  inish.  } {SQLIT
3ab0: 45 5f 4f 4b 7d 20 0a 20 20 69 6e 74 65 67 72 69  E_OK} .  integri
3ac0: 74 79 5f 63 68 65 63 6b 20 62 61 63 6b 75 70 2d  ty_check backup-
3ad0: 35 2e 24 69 54 65 73 74 2e 31 2e 35 20 64 62 32  5.$iTest.1.5 db2
3ae0: 0a 20 20 74 65 73 74 5f 63 6f 6e 74 65 6e 74 73  .  test_contents
3af0: 20 62 61 63 6b 75 70 2d 35 2e 24 69 54 65 73 74   backup-5.$iTest
3b00: 2e 31 2e 36 20 64 62 20 6d 61 69 6e 20 64 62 32  .1.6 db main db2
3b10: 20 6d 61 69 6e 0a 0a 20 20 64 6f 5f 74 65 73 74   main..  do_test
3b20: 20 62 61 63 6b 75 70 2d 35 2e 24 69 54 65 73 74   backup-5.$iTest
3b30: 2e 32 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73  .2.1 {.    execs
3b40: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
3b50: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
3b60: 30 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a  0;.      BEGIN;.
3b70: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
3b80: 4f 20 74 31 20 53 45 4c 45 43 54 20 27 27 2c 20  O t1 SELECT '', 
3b90: 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30  randstr(1000,100
3ba0: 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
3bb0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3bc0: 20 53 45 4c 45 43 54 20 27 27 2c 20 72 61 6e 64   SELECT '', rand
3bd0: 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 20 46  str(1000,1000) F
3be0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e  ROM t1;.      IN
3bf0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
3c00: 45 43 54 20 27 27 2c 20 72 61 6e 64 73 74 72 28  ECT '', randstr(
3c10: 31 30 30 30 2c 31 30 30 30 29 20 46 52 4f 4d 20  1000,1000) FROM 
3c20: 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t1;.      INSERT
3c30: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
3c40: 27 27 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30  '', randstr(1000
3c50: 2c 31 30 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  ,1000) FROM t1;.
3c60: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
3c70: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
3c80: 74 65 73 74 20 62 61 63 6b 75 70 2d 35 2e 24 69  test backup-5.$i
3c90: 54 65 73 74 2e 32 2e 32 20 7b 0a 20 20 20 20 73  Test.2.2 {.    s
3ca0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20  qlite3_backup B 
3cb0: 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e  db2 main db main
3cc0: 0a 20 20 20 20 42 20 73 74 65 70 20 35 30 0a 20  .    B step 50. 
3cd0: 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 20   } {SQLITE_OK}. 
3ce0: 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d   do_test backup-
3cf0: 35 2e 24 69 54 65 73 74 2e 32 2e 33 20 7b 0a 20  5.$iTest.2.3 {. 
3d00: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20     execsql { .  
3d10: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
3d20: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61   UPDATE t1 SET a
3d30: 20 3d 20 61 20 2b 20 31 3b 0a 20 20 20 20 20 20   = a + 1;.      
3d40: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 7d 20  ROLLBACK;.    } 
3d50: 24 77 72 69 74 65 72 0a 20 20 20 20 42 20 73 74  $writer.    B st
3d60: 65 70 20 35 30 30 30 0a 20 20 7d 20 7b 53 51 4c  ep 5000.  } {SQL
3d70: 49 54 45 5f 44 4f 4e 45 7d 0a 20 20 64 6f 5f 74  ITE_DONE}.  do_t
3d80: 65 73 74 20 62 61 63 6b 75 70 2d 35 2e 24 69 54  est backup-5.$iT
3d90: 65 73 74 2e 32 2e 34 20 7b 0a 20 20 20 20 42 20  est.2.4 {.    B 
3da0: 66 69 6e 69 73 68 0a 20 20 7d 20 7b 53 51 4c 49  finish.  } {SQLI
3db0: 54 45 5f 4f 4b 7d 20 0a 20 20 69 6e 74 65 67 72  TE_OK} .  integr
3dc0: 69 74 79 5f 63 68 65 63 6b 20 62 61 63 6b 75 70  ity_check backup
3dd0: 2d 35 2e 24 69 54 65 73 74 2e 32 2e 35 20 64 62  -5.$iTest.2.5 db
3de0: 32 0a 20 20 74 65 73 74 5f 63 6f 6e 74 65 6e 74  2.  test_content
3df0: 73 20 62 61 63 6b 75 70 2d 35 2e 24 69 54 65 73  s backup-5.$iTes
3e00: 74 2e 32 2e 36 20 64 62 20 6d 61 69 6e 20 64 62  t.2.6 db main db
3e10: 32 20 6d 61 69 6e 0a 0a 20 20 64 6f 5f 74 65 73  2 main..  do_tes
3e20: 74 20 62 61 63 6b 75 70 2d 35 2e 24 69 54 65 73  t backup-5.$iTes
3e30: 74 2e 33 2e 31 20 7b 0a 20 20 20 20 65 78 65 63  t.3.1 {.    exec
3e40: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 31 20  sql { UPDATE t1 
3e50: 53 45 54 20 62 20 3d 20 72 61 6e 64 73 74 72 28  SET b = randstr(
3e60: 31 30 30 30 2c 31 30 30 30 29 20 7d 0a 20 20 7d  1000,1000) }.  }
3e70: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 62 61   {}.  do_test ba
3e80: 63 6b 75 70 2d 35 2e 24 69 54 65 73 74 2e 33 2e  ckup-5.$iTest.3.
3e90: 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  2 {.    sqlite3_
3ea0: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
3eb0: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 20 20 42 20  n db main.    B 
3ec0: 73 74 65 70 20 35 30 0a 20 20 7d 20 7b 53 51 4c  step 50.  } {SQL
3ed0: 49 54 45 5f 4f 4b 7d 0a 20 20 64 6f 5f 74 65 73  ITE_OK}.  do_tes
3ee0: 74 20 62 61 63 6b 75 70 2d 35 2e 24 69 54 65 73  t backup-5.$iTes
3ef0: 74 2e 33 2e 33 20 7b 0a 20 20 20 20 65 78 65 63  t.3.3 {.    exec
3f00: 73 71 6c 20 7b 20 56 41 43 55 55 4d 20 7d 20 24  sql { VACUUM } $
3f10: 77 72 69 74 65 72 0a 20 20 20 20 42 20 73 74 65  writer.    B ste
3f20: 70 20 35 30 30 30 0a 20 20 7d 20 7b 53 51 4c 49  p 5000.  } {SQLI
3f30: 54 45 5f 44 4f 4e 45 7d 0a 20 20 64 6f 5f 74 65  TE_DONE}.  do_te
3f40: 73 74 20 62 61 63 6b 75 70 2d 35 2e 24 69 54 65  st backup-5.$iTe
3f50: 73 74 2e 33 2e 34 20 7b 0a 20 20 20 20 42 20 66  st.3.4 {.    B f
3f60: 69 6e 69 73 68 0a 20 20 7d 20 7b 53 51 4c 49 54  inish.  } {SQLIT
3f70: 45 5f 4f 4b 7d 20 0a 20 20 69 6e 74 65 67 72 69  E_OK} .  integri
3f80: 74 79 5f 63 68 65 63 6b 20 62 61 63 6b 75 70 2d  ty_check backup-
3f90: 35 2e 24 69 54 65 73 74 2e 33 2e 35 20 64 62 32  5.$iTest.3.5 db2
3fa0: 0a 20 20 74 65 73 74 5f 63 6f 6e 74 65 6e 74 73  .  test_contents
3fb0: 20 62 61 63 6b 75 70 2d 35 2e 24 69 54 65 73 74   backup-5.$iTest
3fc0: 2e 33 2e 36 20 64 62 20 6d 61 69 6e 20 64 62 32  .3.6 db main db2
3fd0: 20 6d 61 69 6e 0a 0a 20 20 64 6f 5f 74 65 73 74   main..  do_test
3fe0: 20 62 61 63 6b 75 70 2d 35 2e 24 69 54 65 73 74   backup-5.$iTest
3ff0: 2e 34 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73  .4.1 {.    execs
4000: 71 6c 20 7b 20 55 50 44 41 54 45 20 74 31 20 53  ql { UPDATE t1 S
4010: 45 54 20 62 20 3d 20 72 61 6e 64 73 74 72 28 31  ET b = randstr(1
4020: 30 30 30 2c 31 30 30 30 29 20 7d 0a 20 20 7d 20  000,1000) }.  } 
4030: 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63  {}.  do_test bac
4040: 6b 75 70 2d 35 2e 24 69 54 65 73 74 2e 34 2e 32  kup-5.$iTest.4.2
4050: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62   {.    sqlite3_b
4060: 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e  ackup B db2 main
4070: 20 64 62 20 6d 61 69 6e 0a 20 20 20 20 42 20 73   db main.    B s
4080: 74 65 70 20 35 30 0a 20 20 7d 20 7b 53 51 4c 49  tep 50.  } {SQLI
4090: 54 45 5f 4f 4b 7d 0a 20 20 64 6f 5f 74 65 73 74  TE_OK}.  do_test
40a0: 20 62 61 63 6b 75 70 2d 35 2e 24 69 54 65 73 74   backup-5.$iTest
40b0: 2e 34 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73  .4.3 {.    execs
40c0: 71 6c 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47  ql { .      PRAG
40d0: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 32  MA page_size = 2
40e0: 30 34 38 3b 0a 20 20 20 20 20 20 56 41 43 55 55  048;.      VACUU
40f0: 4d 3b 0a 20 20 20 20 7d 20 24 77 72 69 74 65 72  M;.    } $writer
4100: 0a 20 20 20 20 42 20 73 74 65 70 20 35 30 30 30  .    B step 5000
4110: 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e  .  } {SQLITE_DON
4120: 45 7d 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63  E}.  do_test bac
4130: 6b 75 70 2d 35 2e 24 69 54 65 73 74 2e 34 2e 34  kup-5.$iTest.4.4
4140: 20 7b 0a 20 20 20 20 42 20 66 69 6e 69 73 68 0a   {.    B finish.
4150: 20 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 20    } {SQLITE_OK} 
4160: 0a 20 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  .  integrity_che
4170: 63 6b 20 62 61 63 6b 75 70 2d 35 2e 24 69 54 65  ck backup-5.$iTe
4180: 73 74 2e 34 2e 35 20 64 62 32 0a 20 20 74 65 73  st.4.5 db2.  tes
4190: 74 5f 63 6f 6e 74 65 6e 74 73 20 62 61 63 6b 75  t_contents backu
41a0: 70 2d 35 2e 24 69 54 65 73 74 2e 34 2e 36 20 64  p-5.$iTest.4.6 d
41b0: 62 20 6d 61 69 6e 20 64 62 32 20 6d 61 69 6e 0a  b main db2 main.
41c0: 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f  .  catch {db clo
41d0: 73 65 7d 0a 20 20 63 61 74 63 68 20 7b 64 62 32  se}.  catch {db2
41e0: 20 63 6c 6f 73 65 7d 0a 20 20 63 61 74 63 68 20   close}.  catch 
41f0: 7b 64 62 33 20 63 6c 6f 73 65 7d 0a 20 20 63 61  {db3 close}.  ca
4200: 74 63 68 20 7b 20 66 69 6c 65 20 64 65 6c 65 74  tch { file delet
4210: 65 20 62 61 6b 2e 64 62 20 7d 0a 20 20 73 71 6c  e bak.db }.  sql
4220: 69 74 65 33 20 64 62 32 20 62 61 6b 2e 64 62 0a  ite3 db2 bak.db.
4230: 20 20 63 61 74 63 68 20 7b 20 66 69 6c 65 20 64    catch { file d
4240: 65 6c 65 74 65 20 24 66 69 6c 65 20 7d 0a 20 20  elete $file }.  
4250: 73 71 6c 69 74 65 33 20 64 62 20 24 66 69 6c 65  sqlite3 db $file
4260: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 33 20 24  .  sqlite3 db3 $
4270: 66 69 6c 65 0a 20 20 64 6f 5f 74 65 73 74 20 62  file.  do_test b
4280: 61 63 6b 75 70 2d 35 2e 24 69 54 65 73 74 2e 35  ackup-5.$iTest.5
4290: 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .1 {.    execsql
42a0: 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   {.      PRAGMA 
42b0: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 69 6e  auto_vacuum = in
42c0: 63 72 65 6d 65 6e 74 61 6c 3b 0a 20 20 20 20 20  cremental;.     
42d0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52   BEGIN;.      CR
42e0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
42f0: 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54   b);.      CREAT
4300: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
4310: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e  (a, b);.      IN
4320: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4330: 55 45 53 28 31 2c 20 72 61 6e 64 73 74 72 28 31  UES(1, randstr(1
4340: 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20  000,1000));.    
4350: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4360: 20 56 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 73   VALUES(2, rands
4370: 74 72 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a  tr(1000,1000));.
4380: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4390: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 72  O t1 VALUES(3, r
43a0: 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30  andstr(1000,1000
43b0: 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
43c0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
43d0: 34 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c  4, randstr(1000,
43e0: 31 30 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e  1000));.      IN
43f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4400: 55 45 53 28 35 2c 20 72 61 6e 64 73 74 72 28 31  UES(5, randstr(1
4410: 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20  000,1000));.    
4420: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a    COMMIT;.    }.
4430: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
4440: 20 62 61 63 6b 75 70 2d 35 2e 24 69 54 65 73 74   backup-5.$iTest
4450: 2e 35 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74  .5.2 {.    sqlit
4460: 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20  e3_backup B db2 
4470: 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 20  main db main.   
4480: 20 42 20 73 74 65 70 20 38 0a 20 20 7d 20 7b 53   B step 8.  } {S
4490: 51 4c 49 54 45 5f 4f 4b 7d 0a 20 20 64 6f 5f 74  QLITE_OK}.  do_t
44a0: 65 73 74 20 62 61 63 6b 75 70 2d 35 2e 24 69 54  est backup-5.$iT
44b0: 65 73 74 2e 35 2e 33 20 7b 0a 20 20 20 20 65 78  est.5.3 {.    ex
44c0: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 44  ecsql { .      D
44d0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20  ELETE FROM t1;. 
44e0: 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72       PRAGMA incr
44f0: 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 3b 0a  emental_vacuum;.
4500: 20 20 20 20 7d 20 24 77 72 69 74 65 72 0a 20 20      } $writer.  
4510: 20 20 42 20 73 74 65 70 20 35 30 0a 20 20 7d 20    B step 50.  } 
4520: 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 7d 0a 20 20  {SQLITE_DONE}.  
4530: 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 35  do_test backup-5
4540: 2e 24 69 54 65 73 74 2e 35 2e 34 20 7b 0a 20 20  .$iTest.5.4 {.  
4550: 20 20 42 20 66 69 6e 69 73 68 0a 20 20 7d 20 7b    B finish.  } {
4560: 53 51 4c 49 54 45 5f 4f 4b 7d 20 0a 20 20 69 6e  SQLITE_OK} .  in
4570: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 62 61  tegrity_check ba
4580: 63 6b 75 70 2d 35 2e 24 69 54 65 73 74 2e 35 2e  ckup-5.$iTest.5.
4590: 35 20 64 62 32 0a 20 20 74 65 73 74 5f 63 6f 6e  5 db2.  test_con
45a0: 74 65 6e 74 73 20 62 61 63 6b 75 70 2d 35 2e 24  tents backup-5.$
45b0: 69 54 65 73 74 2e 35 2e 36 20 64 62 20 6d 61 69  iTest.5.6 db mai
45c0: 6e 20 64 62 32 20 6d 61 69 6e 0a 20 20 63 61 74  n db2 main.  cat
45d0: 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20  ch {db close}.  
45e0: 63 61 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65  catch {db2 close
45f0: 7d 0a 20 20 63 61 74 63 68 20 7b 64 62 33 20 63  }.  catch {db3 c
4600: 6c 6f 73 65 7d 0a 7d 0a 23 0a 23 20 45 6e 64 20  lose}.}.#.# End 
4610: 6f 66 20 62 61 63 6b 75 70 2d 35 2e 2a 20 74 65  of backup-5.* te
4620: 73 74 73 2e 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  sts..#----------
4630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 2d 2d  -----------..#--
4670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46b0: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20 73  ---.# Test the s
46c0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 72 65  qlite3_backup_re
46d0: 6d 61 69 6e 69 6e 67 28 29 20 61 6e 64 20 62 61  maining() and ba
46e0: 63 6b 75 70 5f 70 61 67 65 63 6f 75 6e 74 28 29  ckup_pagecount()
46f0: 20 41 50 49 73 2e 0a 23 0a 64 6f 5f 74 65 73 74   APIs..#.do_test
4700: 20 62 61 63 6b 75 70 2d 36 2e 31 20 7b 0a 20 20   backup-6.1 {.  
4710: 63 61 74 63 68 20 7b 20 66 69 6c 65 20 64 65 6c  catch { file del
4720: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e  ete -force test.
4730: 64 62 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 66  db }.  catch { f
4740: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
4750: 65 20 74 65 73 74 32 2e 64 62 20 7d 0a 20 20 73  e test2.db }.  s
4760: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
4770: 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  b.  sqlite3 db2 
4780: 74 65 73 74 32 2e 64 62 0a 20 20 65 78 65 63 73  test2.db.  execs
4790: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
47a0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
47b0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t1(a, b);.    C
47c0: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
47d0: 4e 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  N t1(a, b);.    
47e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
47f0: 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 73 74 72  ALUES(1, randstr
4800: 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20  (1000,1000));.  
4810: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4820: 20 56 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 73   VALUES(2, rands
4830: 74 72 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a  tr(1000,1000));.
4840: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4850: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 72 61 6e  t1 VALUES(3, ran
4860: 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 29  dstr(1000,1000))
4870: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4880: 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20 72  O t1 VALUES(4, r
4890: 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30  andstr(1000,1000
48a0: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
48b0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
48c0: 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30   randstr(1000,10
48d0: 30 30 29 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  00));.    COMMIT
48e0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
48f0: 73 74 20 62 61 63 6b 75 70 2d 36 2e 32 20 7b 0a  st backup-6.2 {.
4900: 20 20 73 65 74 20 6e 54 6f 74 61 6c 20 5b 65 78    set nTotal [ex
4910: 70 72 20 7b 5b 66 69 6c 65 20 73 69 7a 65 20 74  pr {[file size t
4920: 65 73 74 2e 64 62 5d 2f 31 30 32 34 7d 5d 0a 20  est.db]/1024}]. 
4930: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
4940: 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61  B db2 main db ma
4950: 69 6e 0a 20 20 42 20 73 74 65 70 20 31 0a 7d 20  in.  B step 1.} 
4960: 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74  {SQLITE_OK}.do_t
4970: 65 73 74 20 62 61 63 6b 75 70 2d 36 2e 33 20 7b  est backup-6.3 {
4980: 0a 20 20 42 20 70 61 67 65 63 6f 75 6e 74 0a 7d  .  B pagecount.}
4990: 20 24 6e 54 6f 74 61 6c 0a 64 6f 5f 74 65 73 74   $nTotal.do_test
49a0: 20 62 61 63 6b 75 70 2d 36 2e 34 20 7b 0a 20 20   backup-6.4 {.  
49b0: 42 20 72 65 6d 61 69 6e 69 6e 67 0a 7d 20 5b 65  B remaining.} [e
49c0: 78 70 72 20 24 6e 54 6f 74 61 6c 2d 31 5d 0a 64  xpr $nTotal-1].d
49d0: 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 36 2e  o_test backup-6.
49e0: 35 20 7b 0a 20 20 42 20 73 74 65 70 20 35 0a 20  5 {.  B step 5. 
49f0: 20 6c 69 73 74 20 5b 42 20 72 65 6d 61 69 6e 69   list [B remaini
4a00: 6e 67 5d 20 5b 42 20 70 61 67 65 63 6f 75 6e 74  ng] [B pagecount
4a10: 5d 0a 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20  ].} [list [expr 
4a20: 24 6e 54 6f 74 61 6c 2d 36 5d 20 24 6e 54 6f 74  $nTotal-6] $nTot
4a30: 61 6c 5d 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b  al].do_test back
4a40: 75 70 2d 36 2e 36 20 7b 0a 20 20 65 78 65 63 73  up-6.6 {.  execs
4a50: 71 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c  ql { CREATE TABL
4a60: 45 20 74 32 28 61 20 50 52 49 4d 41 52 59 20 4b  E t2(a PRIMARY K
4a70: 45 59 2c 20 62 29 20 7d 0a 20 20 42 20 73 74 65  EY, b) }.  B ste
4a80: 70 20 31 0a 20 20 6c 69 73 74 20 5b 42 20 72 65  p 1.  list [B re
4a90: 6d 61 69 6e 69 6e 67 5d 20 5b 42 20 70 61 67 65  maining] [B page
4aa0: 63 6f 75 6e 74 5d 0a 7d 20 5b 6c 69 73 74 20 5b  count].} [list [
4ab0: 65 78 70 72 20 24 6e 54 6f 74 61 6c 2d 35 5d 20  expr $nTotal-5] 
4ac0: 5b 65 78 70 72 20 24 6e 54 6f 74 61 6c 2b 32 5d  [expr $nTotal+2]
4ad0: 5d 0a 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75  ]..do_test backu
4ae0: 70 2d 36 2e 58 20 7b 0a 20 20 42 20 66 69 6e 69  p-6.X {.  B fini
4af0: 73 68 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d  sh.} {SQLITE_OK}
4b00: 0a 0a 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73  ..catch {db clos
4b10: 65 7d 0a 63 61 74 63 68 20 7b 64 62 32 20 63 6c  e}.catch {db2 cl
4b20: 6f 73 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ose}..#---------
4b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
4b70: 65 73 74 20 63 61 73 65 73 20 62 61 63 6b 75 70  est cases backup
4b80: 2d 37 2e 2a 20 74 65 73 74 20 74 68 61 74 20 53  -7.* test that S
4b90: 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 53  QLITE_BUSY and S
4ba0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 65 72 72  QLITE_LOCKED err
4bb0: 6f 72 73 0a 23 20 61 72 65 20 72 65 74 75 72 6e  ors.# are return
4bc0: 65 64 20 63 6f 72 72 65 63 74 6c 79 3a 0a 23 0a  ed correctly:.#.
4bd0: 23 20 62 61 63 6b 75 70 2d 37 2e 31 2e 2a 3a 20  # backup-7.1.*: 
4be0: 53 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20  Source database 
4bf0: 69 73 20 65 78 74 65 72 6e 61 6c 6c 79 20 6c 6f  is externally lo
4c00: 63 6b 65 64 20 28 72 65 74 75 72 6e 20 53 51 4c  cked (return SQL
4c10: 49 54 45 5f 42 55 53 59 29 2e 0a 23 0a 23 20 62  ITE_BUSY)..#.# b
4c20: 61 63 6b 75 70 2d 37 2e 32 2e 2a 3a 20 41 74 74  ackup-7.2.*: Att
4c30: 65 6d 70 74 20 74 6f 20 73 74 65 70 20 74 68 65  empt to step the
4c40: 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 20   backup process 
4c50: 77 68 69 6c 65 20 61 20 0a 23 20 20 20 20 20 20  while a .#      
4c60: 20 20 20 20 20 20 20 20 20 77 72 69 74 65 2d 74           write-t
4c70: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 6e  ransaction is un
4c80: 64 65 72 77 61 79 20 6f 6e 20 74 68 65 20 73 6f  derway on the so
4c90: 75 72 63 65 20 70 61 67 65 72 20 28 72 65 74 75  urce pager (retu
4ca0: 72 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  rn.#            
4cb0: 20 20 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44     SQLITE_LOCKED
4cc0: 29 2e 0a 23 0a 23 20 62 61 63 6b 75 70 2d 37 2e  )..#.# backup-7.
4cd0: 33 2e 2a 3a 20 44 65 73 74 69 6e 61 74 69 6f 6e  3.*: Destination
4ce0: 20 64 61 74 61 62 61 73 65 20 69 73 20 65 78 74   database is ext
4cf0: 65 72 6e 61 6c 6c 79 20 6c 6f 63 6b 65 64 20 28  ernally locked (
4d00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
4d10: 53 59 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 62  SY)..#.do_test b
4d20: 61 63 6b 75 70 2d 37 2e 30 20 7b 0a 20 20 63 61  ackup-7.0 {.  ca
4d30: 74 63 68 20 7b 20 66 69 6c 65 20 64 65 6c 65 74  tch { file delet
4d40: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62  e -force test.db
4d50: 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 66 69 6c   }.  catch { fil
4d60: 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20  e delete -force 
4d70: 74 65 73 74 32 2e 64 62 20 7d 0a 20 20 73 71 6c  test2.db }.  sql
4d80: 69 74 65 33 20 64 62 32 20 74 65 73 74 32 2e 64  ite3 db2 test2.d
4d90: 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  b.  sqlite3 db t
4da0: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
4db0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
4dc0: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
4dd0: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
4de0: 31 20 4f 4e 20 74 31 28 61 2c 20 62 29 3b 0a 20  1 ON t1(a, b);. 
4df0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4e00: 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64  1 VALUES(1, rand
4e10: 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 29 3b  str(1000,1000));
4e20: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
4e30: 20 74 31 20 53 45 4c 45 43 54 20 61 2b 20 31 2c   t1 SELECT a+ 1,
4e40: 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30   randstr(1000,10
4e50: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
4e60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4e70: 53 45 4c 45 43 54 20 61 2b 20 32 2c 20 72 61 6e  SELECT a+ 2, ran
4e80: 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 20  dstr(1000,1000) 
4e90: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
4ea0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
4eb0: 43 54 20 61 2b 20 34 2c 20 72 61 6e 64 73 74 72  CT a+ 4, randstr
4ec0: 28 31 30 30 30 2c 31 30 30 30 29 20 46 52 4f 4d  (1000,1000) FROM
4ed0: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
4ee0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
4ef0: 2b 20 38 2c 20 72 61 6e 64 73 74 72 28 31 30 30  + 8, randstr(100
4f00: 30 2c 31 30 30 30 29 20 46 52 4f 4d 20 74 31 3b  0,1000) FROM t1;
4f10: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
4f20: 20 74 31 20 53 45 4c 45 43 54 20 61 2b 31 36 2c   t1 SELECT a+16,
4f30: 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30   randstr(1000,10
4f40: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
4f50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4f60: 53 45 4c 45 43 54 20 61 2b 33 32 2c 20 72 61 6e  SELECT a+32, ran
4f70: 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 20  dstr(1000,1000) 
4f80: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
4f90: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
4fa0: 43 54 20 61 2b 36 34 2c 20 72 61 6e 64 73 74 72  CT a+64, randstr
4fb0: 28 31 30 30 30 2c 31 30 30 30 29 20 46 52 4f 4d  (1000,1000) FROM
4fc0: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64   t1;.  }.} {}..d
4fd0: 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 37 2e  o_test backup-7.
4fe0: 31 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  1.1 {.  sqlite3_
4ff0: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
5000: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74  n db main.  B st
5010: 65 70 20 35 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f  ep 5.} {SQLITE_O
5020: 4b 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75  K}.do_test backu
5030: 70 2d 37 2e 31 2e 32 20 7b 0a 20 20 73 71 6c 69  p-7.1.2 {.  sqli
5040: 74 65 33 20 64 62 33 20 74 65 73 74 2e 64 62 0a  te3 db3 test.db.
5050: 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49    execsql { BEGI
5060: 4e 20 45 58 43 4c 55 53 49 56 45 20 7d 20 64 62  N EXCLUSIVE } db
5070: 33 0a 20 20 42 20 73 74 65 70 20 35 0a 7d 20 7b  3.  B step 5.} {
5080: 53 51 4c 49 54 45 5f 42 55 53 59 7d 0a 64 6f 5f  SQLITE_BUSY}.do_
5090: 74 65 73 74 20 62 61 63 6b 75 70 2d 37 2e 31 2e  test backup-7.1.
50a0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
50b0: 52 4f 4c 4c 42 41 43 4b 20 7d 20 64 62 33 0a 20  ROLLBACK } db3. 
50c0: 20 42 20 73 74 65 70 20 35 0a 7d 20 7b 53 51 4c   B step 5.} {SQL
50d0: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
50e0: 62 61 63 6b 75 70 2d 37 2e 32 2e 31 20 7b 0a 20  backup-7.2.1 {. 
50f0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
5100: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
5110: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
5120: 28 31 2c 20 34 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  (1, 4);.  }.} {}
5130: 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d  .do_test backup-
5140: 37 2e 32 2e 32 20 7b 0a 20 20 42 20 73 74 65 70  7.2.2 {.  B step
5150: 20 35 30 30 30 0a 7d 20 7b 53 51 4c 49 54 45 5f   5000.} {SQLITE_
5160: 42 55 53 59 7d 0a 64 6f 5f 74 65 73 74 20 62 61  BUSY}.do_test ba
5170: 63 6b 75 70 2d 37 2e 32 2e 33 20 7b 0a 20 20 65  ckup-7.2.3 {.  e
5180: 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43  xecsql { ROLLBAC
5190: 4b 20 7d 0a 20 20 42 20 73 74 65 70 20 35 30 30  K }.  B step 500
51a0: 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45  0.} {SQLITE_DONE
51b0: 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70  }.do_test backup
51c0: 2d 37 2e 32 2e 34 20 7b 0a 20 20 42 20 66 69 6e  -7.2.4 {.  B fin
51d0: 69 73 68 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b  ish.} {SQLITE_OK
51e0: 7d 0a 74 65 73 74 5f 63 6f 6e 74 65 6e 74 73 20  }.test_contents 
51f0: 62 61 63 6b 75 70 2d 37 2e 32 2e 35 20 64 62 20  backup-7.2.5 db 
5200: 6d 61 69 6e 20 64 62 32 20 6d 61 69 6e 0a 69 6e  main db2 main.in
5210: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 62 61  tegrity_check ba
5220: 63 6b 75 70 2d 37 2e 33 2e 36 20 64 62 32 0a 0a  ckup-7.3.6 db2..
5230: 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 37  do_test backup-7
5240: 2e 33 2e 31 20 7b 0a 20 20 64 62 32 20 63 6c 6f  .3.1 {.  db2 clo
5250: 73 65 0a 20 20 64 62 33 20 63 6c 6f 73 65 0a 20  se.  db3 close. 
5260: 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f   file delete -fo
5270: 72 63 65 20 74 65 73 74 32 2e 64 62 0a 20 20 73  rce test2.db.  s
5280: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 32  qlite3 db2 test2
5290: 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62  .db.  sqlite3 db
52a0: 33 20 74 65 73 74 32 2e 64 62 0a 0a 20 20 73 71  3 test2.db..  sq
52b0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64  lite3_backup B d
52c0: 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a  b2 main db main.
52d0: 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49    execsql { BEGI
52e0: 4e 20 3b 20 43 52 45 41 54 45 20 54 41 42 4c 45  N ; CREATE TABLE
52f0: 20 74 32 28 61 2c 20 62 29 3b 20 7d 20 64 62 33   t2(a, b); } db3
5300: 0a 0a 20 20 42 20 73 74 65 70 20 35 0a 7d 20 7b  ..  B step 5.} {
5310: 53 51 4c 49 54 45 5f 42 55 53 59 7d 0a 64 6f 5f  SQLITE_BUSY}.do_
5320: 74 65 73 74 20 62 61 63 6b 75 70 2d 37 2e 33 2e  test backup-7.3.
5330: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
5340: 43 4f 4d 4d 49 54 20 7d 20 64 62 33 0a 20 20 42  COMMIT } db3.  B
5350: 20 73 74 65 70 20 35 30 30 30 0a 7d 20 7b 53 51   step 5000.} {SQ
5360: 4c 49 54 45 5f 44 4f 4e 45 7d 0a 64 6f 5f 74 65  LITE_DONE}.do_te
5370: 73 74 20 62 61 63 6b 75 70 2d 37 2e 33 2e 33 20  st backup-7.3.3 
5380: 7b 0a 20 20 42 20 66 69 6e 69 73 68 0a 7d 20 7b  {.  B finish.} {
5390: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 74 65 73 74 5f  SQLITE_OK}.test_
53a0: 63 6f 6e 74 65 6e 74 73 20 62 61 63 6b 75 70 2d  contents backup-
53b0: 37 2e 33 2e 34 20 64 62 20 6d 61 69 6e 20 64 62  7.3.4 db main db
53c0: 32 20 6d 61 69 6e 0a 69 6e 74 65 67 72 69 74 79  2 main.integrity
53d0: 5f 63 68 65 63 6b 20 62 61 63 6b 75 70 2d 37 2e  _check backup-7.
53e0: 33 2e 35 20 64 62 32 0a 63 61 74 63 68 20 7b 20  3.5 db2.catch { 
53f0: 64 62 32 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63  db2 close }.catc
5400: 68 20 7b 20 64 62 33 20 63 6c 6f 73 65 20 7d 0a  h { db3 close }.
5410: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
5420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
5460: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c  following tests,
5470: 20 62 61 63 6b 75 70 2d 38 2e 2a 2c 20 74 65 73   backup-8.*, tes
5480: 74 20 61 74 74 61 63 68 69 6e 67 20 6d 75 6c 74  t attaching mult
5490: 69 70 6c 65 20 62 61 63 6b 75 70 0a 23 20 70 72  iple backup.# pr
54a0: 6f 63 65 73 73 65 73 20 74 6f 20 74 68 65 20 73  ocesses to the s
54b0: 61 6d 65 20 73 6f 75 72 63 65 20 64 61 74 61 62  ame source datab
54c0: 61 73 65 2e 20 41 6c 73 6f 2c 20 72 65 61 64 69  ase. Also, readi
54d0: 6e 67 20 66 72 6f 6d 20 74 68 65 20 73 6f 75 72  ng from the sour
54e0: 63 65 0a 23 20 64 61 74 61 62 61 73 65 20 77 68  ce.# database wh
54f0: 69 6c 65 20 61 20 72 65 61 64 20 74 72 61 6e 73  ile a read trans
5500: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
5510: 2e 0a 23 0a 23 20 54 68 65 73 65 20 74 65 73 74  ..#.# These test
5520: 73 20 72 65 75 73 65 20 74 68 65 20 64 61 74 61  s reuse the data
5530: 62 61 73 65 20 22 74 65 73 74 2e 64 62 22 20 6c  base "test.db" l
5540: 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 62 61  eft over from ba
5550: 63 6b 75 70 2d 37 2e 2a 2e 0a 23 0a 64 6f 5f 74  ckup-7.*..#.do_t
5560: 65 73 74 20 62 61 63 6b 75 70 2d 38 2e 31 20 7b  est backup-8.1 {
5570: 0a 20 20 63 61 74 63 68 20 7b 20 66 69 6c 65 20  .  catch { file 
5580: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65  delete -force te
5590: 73 74 32 2e 64 62 20 7d 0a 20 20 63 61 74 63 68  st2.db }.  catch
55a0: 20 7b 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d   { file delete -
55b0: 66 6f 72 63 65 20 74 65 73 74 33 2e 64 62 20 7d  force test3.db }
55c0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
55d0: 65 73 74 32 2e 64 62 0a 20 20 73 71 6c 69 74 65  est2.db.  sqlite
55e0: 33 20 64 62 33 20 74 65 73 74 33 2e 64 62 0a 0a  3 db3 test3.db..
55f0: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
5600: 20 42 32 20 64 62 32 20 6d 61 69 6e 20 64 62 20   B2 db2 main db 
5610: 6d 61 69 6e 0a 20 20 73 71 6c 69 74 65 33 5f 62  main.  sqlite3_b
5620: 61 63 6b 75 70 20 42 33 20 64 62 33 20 6d 61 69  ackup B3 db3 mai
5630: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 6c 69 73 74  n db main.  list
5640: 20 5b 42 32 20 66 69 6e 69 73 68 5d 20 5b 42 33   [B2 finish] [B3
5650: 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49   finish].} {SQLI
5660: 54 45 5f 4f 4b 20 53 51 4c 49 54 45 5f 4f 4b 7d  TE_OK SQLITE_OK}
5670: 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d  .do_test backup-
5680: 38 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  8.2 {.  sqlite3_
5690: 62 61 63 6b 75 70 20 42 33 20 64 62 33 20 6d 61  backup B3 db3 ma
56a0: 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 73 71 6c  in db main.  sql
56b0: 69 74 65 33 5f 62 61 63 6b 75 70 20 42 32 20 64  ite3_backup B2 d
56c0: 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a  b2 main db main.
56d0: 20 20 6c 69 73 74 20 5b 42 32 20 66 69 6e 69 73    list [B2 finis
56e0: 68 5d 20 5b 42 33 20 66 69 6e 69 73 68 5d 0a 7d  h] [B3 finish].}
56f0: 20 7b 53 51 4c 49 54 45 5f 4f 4b 20 53 51 4c 49   {SQLITE_OK SQLI
5700: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 62  TE_OK}.do_test b
5710: 61 63 6b 75 70 2d 38 2e 33 20 7b 0a 20 20 73 71  ackup-8.3 {.  sq
5720: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 32 20  lite3_backup B2 
5730: 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e  db2 main db main
5740: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
5750: 70 20 42 33 20 64 62 33 20 6d 61 69 6e 20 64 62  p B3 db3 main db
5760: 20 6d 61 69 6e 0a 20 20 42 32 20 73 74 65 70 20   main.  B2 step 
5770: 35 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  5.} {SQLITE_OK}.
5780: 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 38  do_test backup-8
5790: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
57a0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
57b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71  SELECT * FROM sq
57c0: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d  lite_master;.  }
57d0: 0a 20 20 42 33 20 73 74 65 70 20 35 0a 7d 20 7b  .  B3 step 5.} {
57e0: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65  SQLITE_OK}.do_te
57f0: 73 74 20 62 61 63 6b 75 70 2d 38 2e 35 20 7b 0a  st backup-8.5 {.
5800: 20 20 6c 69 73 74 20 5b 42 33 20 73 74 65 70 20    list [B3 step 
5810: 35 30 30 30 5d 20 5b 42 33 20 66 69 6e 69 73 68  5000] [B3 finish
5820: 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45  ].} {SQLITE_DONE
5830: 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74   SQLITE_OK}.do_t
5840: 65 73 74 20 62 61 63 6b 75 70 2d 38 2e 36 20 7b  est backup-8.6 {
5850: 0a 20 20 6c 69 73 74 20 5b 42 32 20 73 74 65 70  .  list [B2 step
5860: 20 35 30 30 30 5d 20 5b 42 32 20 66 69 6e 69 73   5000] [B2 finis
5870: 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e  h].} {SQLITE_DON
5880: 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 74 65 73  E SQLITE_OK}.tes
5890: 74 5f 63 6f 6e 74 65 6e 74 73 20 62 61 63 6b 75  t_contents backu
58a0: 70 2d 38 2e 37 20 64 62 20 6d 61 69 6e 20 64 62  p-8.7 db main db
58b0: 32 20 6d 61 69 6e 0a 74 65 73 74 5f 63 6f 6e 74  2 main.test_cont
58c0: 65 6e 74 73 20 62 61 63 6b 75 70 2d 38 2e 38 20  ents backup-8.8 
58d0: 64 62 20 6d 61 69 6e 20 64 62 33 20 6d 61 69 6e  db main db3 main
58e0: 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d  .do_test backup-
58f0: 38 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.9 {.  execsql 
5900: 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74  { PRAGMA lock_st
5910: 61 74 75 73 20 7d 0a 7d 20 7b 6d 61 69 6e 20 73  atus }.} {main s
5920: 68 61 72 65 64 20 74 65 6d 70 20 63 6c 6f 73 65  hared temp close
5930: 64 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75  d}.do_test backu
5940: 70 2d 38 2e 31 30 20 7b 0a 20 20 65 78 65 63 73  p-8.10 {.  execs
5950: 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 63  ql COMMIT.} {}.c
5960: 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73 65  atch { db2 close
5970: 20 7d 0a 63 61 74 63 68 20 7b 20 64 62 33 20 63   }.catch { db3 c
5980: 6c 6f 73 65 20 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  lose }..#-------
5990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59d0: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
59e0: 20 74 65 73 74 73 2c 20 62 61 63 6b 75 70 2d 39   tests, backup-9
59f0: 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 3a 0a 23  .*, test that:.#
5a00: 20 0a 23 20 20 20 2a 20 50 61 73 73 69 6e 67 20   .#   * Passing 
5a10: 30 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  0 as an argument
5a20: 20 74 6f 20 73 71 6c 69 74 65 33 5f 62 61 63 6b   to sqlite3_back
5a30: 75 70 5f 73 74 65 70 28 29 20 6d 65 61 6e 73 20  up_step() means 
5a40: 6e 6f 20 70 61 67 65 73 0a 23 20 20 20 20 20 61  no pages.#     a
5a50: 72 65 20 62 61 63 6b 65 64 20 75 70 20 28 62 61  re backed up (ba
5a60: 63 6b 75 70 2d 39 2e 31 2e 2a 29 2c 20 61 6e 64  ckup-9.1.*), and
5a70: 20 0a 23 20 20 20 2a 20 50 61 73 73 69 6e 67 20   .#   * Passing 
5a80: 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  a negative value
5a90: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
5aa0: 74 6f 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  to sqlite3_backu
5ab0: 70 5f 73 74 65 70 28 29 20 6d 65 61 6e 73 20 0a  p_step() means .
5ac0: 23 20 20 20 20 20 61 6c 6c 20 70 61 67 65 73 20  #     all pages 
5ad0: 61 72 65 20 62 61 63 6b 65 64 20 75 70 20 28 62  are backed up (b
5ae0: 61 63 6b 75 70 2d 39 2e 32 2e 2a 29 2e 0a 23 0a  ackup-9.2.*)..#.
5af0: 23 20 54 68 65 73 65 20 74 65 73 74 73 20 72 65  # These tests re
5b00: 75 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65  use the database
5b10: 20 22 74 65 73 74 2e 64 62 22 20 6c 65 66 74 20   "test.db" left 
5b20: 6f 76 65 72 20 66 72 6f 6d 20 62 61 63 6b 75 70  over from backup
5b30: 2d 37 2e 2a 2e 0a 23 20 0a 64 6f 5f 74 65 73 74  -7.*..# .do_test
5b40: 20 62 61 63 6b 75 70 2d 39 2e 31 2e 31 20 7b 0a   backup-9.1.1 {.
5b50: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
5b60: 73 74 32 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  st2.db.  sqlite3
5b70: 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61  _backup B db2 ma
5b80: 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73  in db main.  B s
5b90: 74 65 70 20 31 0a 7d 20 7b 53 51 4c 49 54 45 5f  tep 1.} {SQLITE_
5ba0: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b  OK}.do_test back
5bb0: 75 70 2d 39 2e 31 2e 32 20 7b 0a 20 20 73 65 74  up-9.1.2 {.  set
5bc0: 20 6e 52 65 6d 61 69 6e 69 6e 67 20 5b 42 20 72   nRemaining [B r
5bd0: 65 6d 61 69 6e 69 6e 67 5d 0a 20 20 65 78 70 72  emaining].  expr
5be0: 20 7b 24 6e 52 65 6d 61 69 6e 69 6e 67 3e 31 30   {$nRemaining>10
5bf0: 30 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74  0}.} {1}.do_test
5c00: 20 62 61 63 6b 75 70 2d 39 2e 31 2e 33 20 7b 0a   backup-9.1.3 {.
5c10: 20 20 42 20 73 74 65 70 20 30 0a 7d 20 7b 53 51    B step 0.} {SQ
5c20: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
5c30: 20 62 61 63 6b 75 70 2d 39 2e 31 2e 34 20 7b 0a   backup-9.1.4 {.
5c40: 20 20 42 20 72 65 6d 61 69 6e 69 6e 67 0a 7d 20    B remaining.} 
5c50: 24 6e 52 65 6d 61 69 6e 69 6e 67 0a 0a 64 6f 5f  $nRemaining..do_
5c60: 74 65 73 74 20 62 61 63 6b 75 70 2d 39 2e 32 2e  test backup-9.2.
5c70: 31 20 7b 0a 20 20 42 20 73 74 65 70 20 2d 31 0a  1 {.  B step -1.
5c80: 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 7d 0a  } {SQLITE_DONE}.
5c90: 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 39  do_test backup-9
5ca0: 2e 32 2e 32 20 7b 0a 20 20 42 20 72 65 6d 61 69  .2.2 {.  B remai
5cb0: 6e 69 6e 67 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65  ning.} {0}.do_te
5cc0: 73 74 20 62 61 63 6b 75 70 2d 39 2e 32 2e 33 20  st backup-9.2.3 
5cd0: 7b 0a 20 20 42 20 66 69 6e 69 73 68 0a 7d 20 7b  {.  B finish.} {
5ce0: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 63 61 74 63 68  SQLITE_OK}.catch
5cf0: 20 7b 64 62 32 20 63 6c 6f 73 65 7d 0a 0a 69 66   {db2 close}..if
5d00: 63 61 70 61 62 6c 65 20 6d 65 6d 6f 72 79 6d 61  capable memoryma
5d10: 6e 61 67 65 20 7b 0a 20 20 64 62 20 63 6c 6f 73  nage {.  db clos
5d20: 65 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20  e.  file delete 
5d30: 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 0a 20  -force test.db. 
5d40: 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f   file delete -fo
5d50: 72 63 65 20 62 61 6b 2e 64 62 0a 0a 20 20 73 71  rce bak.db..  sq
5d60: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
5d70: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
5d80: 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  est.db.  sqlite3
5d90: 20 64 62 33 20 62 61 6b 2e 64 62 0a 0a 20 20 64   db3 bak.db..  d
5da0: 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 31 30  o_test backup-10
5db0: 2e 31 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73  .1.1 {.    execs
5dc0: 71 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e  ql {.      BEGIN
5dd0: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
5de0: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
5df0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5e00: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61   t1 VALUES(1, ra
5e10: 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29  ndstr(1000,1000)
5e20: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
5e30: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
5e40: 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31  , randstr(1000,1
5e50: 30 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53  000));.      INS
5e60: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
5e70: 45 53 28 33 2c 20 72 61 6e 64 73 74 72 28 31 30  ES(3, randstr(10
5e80: 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 20  00,1000));.     
5e90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5ea0: 56 41 4c 55 45 53 28 34 2c 20 72 61 6e 64 73 74  VALUES(4, randst
5eb0: 72 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a 20  r(1000,1000));. 
5ec0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5ed0: 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 72 61   t1 VALUES(5, ra
5ee0: 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29  ndstr(1000,1000)
5ef0: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
5f00: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
5f10: 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d  , b);.      COMM
5f20: 49 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d  IT;.    }.  } {}
5f30: 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 75  .  do_test backu
5f40: 70 2d 31 30 2e 31 2e 32 20 7b 0a 20 20 20 20 73  p-10.1.2 {.    s
5f50: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20  qlite3_backup B 
5f60: 64 62 33 20 6d 61 69 6e 20 64 62 32 20 6d 61 69  db3 main db2 mai
5f70: 6e 0a 20 20 20 20 42 20 73 74 65 70 20 35 0a 20  n.    B step 5. 
5f80: 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 20   } {SQLITE_OK}. 
5f90: 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d   do_test backup-
5fa0: 31 30 2e 31 2e 33 20 7b 0a 20 20 20 20 65 78 65  10.1.3 {.    exe
5fb0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 55 50 44  csql {.      UPD
5fc0: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 72  ATE t1 SET b = r
5fd0: 61 6e 64 73 74 72 28 35 30 30 2c 35 30 30 29 3b  andstr(500,500);
5fe0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20  .    }.  } {}.  
5ff0: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
6000: 6d 65 6d 6f 72 79 20 5b 65 78 70 72 20 31 30 32  memory [expr 102
6010: 34 2a 31 30 32 34 5d 0a 20 20 64 6f 5f 74 65 73  4*1024].  do_tes
6020: 74 20 62 61 63 6b 75 70 2d 31 30 2e 31 2e 33 20  t backup-10.1.3 
6030: 7b 0a 20 20 20 20 42 20 73 74 65 70 20 35 30 0a  {.    B step 50.
6040: 20 20 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45    } {SQLITE_DONE
6050: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b  }.  do_test back
6060: 75 70 2d 31 30 2e 31 2e 34 20 7b 0a 20 20 20 20  up-10.1.4 {.    
6070: 42 20 66 69 6e 69 73 68 0a 20 20 7d 20 7b 53 51  B finish.  } {SQ
6080: 4c 49 54 45 5f 4f 4b 7d 0a 20 20 64 6f 5f 74 65  LITE_OK}.  do_te
6090: 73 74 20 62 61 63 6b 75 70 2d 31 30 2e 31 2e 35  st backup-10.1.5
60a0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
60b0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
60c0: 79 5f 63 68 65 63 6b 20 7d 20 64 62 33 0a 20 20  y_check } db3.  
60d0: 7d 20 7b 6f 6b 7d 0a 0a 20 20 64 62 32 20 63 6c  } {ok}..  db2 cl
60e0: 6f 73 65 0a 20 20 64 62 33 20 63 6c 6f 73 65 0a  ose.  db3 close.
60f0: 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
6140: 65 73 74 20 74 68 61 74 20 69 66 20 74 68 65 20  est that if the 
6150: 64 61 74 61 62 61 73 65 20 69 73 20 77 72 69 74  database is writ
6160: 74 65 6e 20 74 6f 20 76 69 61 20 74 68 65 20 73  ten to via the s
6170: 61 6d 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  ame database han
6180: 64 6c 65 20 62 65 69 6e 67 0a 23 20 75 73 65 64  dle being.# used
6190: 20 61 73 20 74 68 65 20 73 6f 75 72 63 65 20 62   as the source b
61a0: 79 20 61 20 62 61 63 6b 75 70 20 6f 70 65 72 61  y a backup opera
61b0: 74 69 6f 6e 3a 0a 23 0a 23 20 20 20 31 30 2e 31  tion:.#.#   10.1
61c0: 2e 2a 3a 20 49 66 20 74 68 65 20 64 62 20 69 73  .*: If the db is
61d0: 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 20   in-memory, the 
61e0: 62 61 63 6b 75 70 20 69 73 20 72 65 73 74 61 72  backup is restar
61f0: 74 65 64 2e 0a 23 20 20 20 31 30 2e 32 2e 2a 3a  ted..#   10.2.*:
6200: 20 49 66 20 74 68 65 20 64 62 20 69 73 20 61 20   If the db is a 
6210: 66 69 6c 65 2c 20 74 68 65 20 62 61 63 6b 75 70  file, the backup
6220: 20 69 73 20 6e 6f 74 20 72 65 73 74 61 72 74 65   is not restarte
6230: 64 2e 0a 23 0a 64 62 20 63 6c 6f 73 65 0a 66 69  d..#.db close.fi
6240: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
6250: 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
6260: 2d 6a 6f 75 72 6e 61 6c 0a 66 6f 72 65 61 63 68  -journal.foreach
6270: 20 7b 74 6e 20 66 69 6c 65 20 72 63 7d 20 7b 0a   {tn file rc} {.
6280: 20 20 31 20 74 65 73 74 2e 64 62 20 20 53 51 4c    1 test.db  SQL
6290: 49 54 45 5f 44 4f 4e 45 0a 20 20 32 20 3a 6d 65  ITE_DONE.  2 :me
62a0: 6d 6f 72 79 3a 20 53 51 4c 49 54 45 5f 4f 4b 0a  mory: SQLITE_OK.
62b0: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 62 61  } {.  do_test ba
62c0: 63 6b 75 70 2d 31 30 2e 24 74 6e 2e 31 20 7b 0a  ckup-10.$tn.1 {.
62d0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 24      sqlite3 db $
62e0: 66 69 6c 65 0a 20 20 20 20 65 78 65 63 73 71 6c  file.    execsql
62f0: 20 7b 20 0a 20 20 20 20 20 20 43 52 45 41 54 45   { .      CREATE
6300: 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45   TABLE t1(a INTE
6310: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
6320: 20 62 20 42 4c 4f 42 29 3b 0a 20 20 20 20 20 20   b BLOB);.      
6330: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 49  BEGIN;.        I
6340: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6350: 4c 55 45 53 28 4e 55 4c 4c 2c 20 72 61 6e 64 6f  LUES(NULL, rando
6360: 6d 62 6c 6f 62 28 32 30 30 29 29 3b 0a 20 20 20  mblob(200));.   
6370: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
6380: 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t1 SELECT NULL,
6390: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
63a0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
63b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
63c0: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61   SELECT NULL, ra
63d0: 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52  ndomblob(200) FR
63e0: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 49  OM t1;.        I
63f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
6400: 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f  LECT NULL, rando
6410: 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20  mblob(200) FROM 
6420: 74 31 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  t1;.        INSE
6430: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
6440: 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c  T NULL, randombl
6450: 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(200) FROM t1;
6460: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
6470: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e  INTO t1 SELECT N
6480: 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  ULL, randomblob(
6490: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
64a0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
64b0: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
64c0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  , randomblob(200
64d0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  ) FROM t1;.     
64e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
64f0: 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72  1 SELECT NULL, r
6500: 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46  andomblob(200) F
6510: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20  ROM t1;.        
6520: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
6530: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64  ELECT NULL, rand
6540: 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d  omblob(200) FROM
6550: 20 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49   t1;.      COMMI
6560: 54 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  T;.      SELECT 
6570: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
6580: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 32 35 36  ;.    }.  } {256
6590: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63  }..  do_test bac
65a0: 6b 75 70 2d 31 30 2e 24 74 6e 2e 32 20 7b 0a 20  kup-10.$tn.2 {. 
65b0: 20 20 20 73 65 74 20 70 67 73 20 5b 65 78 65 63     set pgs [exec
65c0: 73 71 6c 20 7b 70 72 61 67 6d 61 20 70 61 67 65  sql {pragma page
65d0: 5f 63 6f 75 6e 74 7d 5d 0a 20 20 20 20 65 78 70  _count}].    exp
65e0: 72 20 7b 24 70 67 73 20 3e 20 35 30 20 26 26 20  r {$pgs > 50 && 
65f0: 24 70 67 73 20 3c 20 37 35 7d 0a 20 20 7d 20 7b  $pgs < 75}.  } {
6600: 31 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 62 61  1}..  do_test ba
6610: 63 6b 75 70 2d 31 30 2e 24 74 6e 2e 33 20 7b 0a  ckup-10.$tn.3 {.
6620: 20 20 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20      file delete 
6630: 2d 66 6f 72 63 65 20 62 61 6b 2e 64 62 20 62 61  -force bak.db ba
6640: 6b 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  k.db-journal.   
6650: 20 73 71 6c 69 74 65 33 20 64 62 32 20 62 61 6b   sqlite3 db2 bak
6660: 2e 64 62 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  .db.    sqlite3_
6670: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
6680: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 20 20 42 20  n db main.    B 
6690: 73 74 65 70 20 35 30 0a 20 20 7d 20 7b 53 51 4c  step 50.  } {SQL
66a0: 49 54 45 5f 4f 4b 7d 0a 0a 20 20 64 6f 5f 74 65  ITE_OK}..  do_te
66b0: 73 74 20 62 61 63 6b 75 70 2d 31 30 2e 24 74 6e  st backup-10.$tn
66c0: 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .4 {.    execsql
66d0: 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45 54   { UPDATE t1 SET
66e0: 20 62 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28   b = randomblob(
66f0: 32 30 30 29 20 57 48 45 52 45 20 61 20 49 4e 20  200) WHERE a IN 
6700: 28 31 2c 20 32 35 30 29 20 7d 0a 20 20 7d 20 7b  (1, 250) }.  } {
6710: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63  }..  do_test bac
6720: 6b 75 70 2d 31 30 2e 24 74 6e 2e 35 20 7b 0a 20  kup-10.$tn.5 {. 
6730: 20 20 20 42 20 73 74 65 70 20 35 30 0a 20 20 7d     B step 50.  }
6740: 20 24 72 63 0a 0a 20 20 64 6f 5f 74 65 73 74 20   $rc..  do_test 
6750: 62 61 63 6b 75 70 2d 31 30 2e 24 74 6e 2e 36 20  backup-10.$tn.6 
6760: 7b 0a 20 20 20 20 42 20 66 69 6e 69 73 68 0a 20  {.    B finish. 
6770: 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a   } {SQLITE_OK}..
6780: 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 0a 66    db2 close.}..f
6790: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.