/ Hex Artifact Content
Login

Artifact dd4a5ff756e3df3931dacb1791db0584d4bad989:


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 64 65 6c 65 74 65 5f 66 69 6c 65 20 74 65 73   delete_file 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 20   {512 1024 2048 
13b0: 34 30 39 36 7d 20 7b 0a 66 6f 72 65 61 63 68 20  4096} {.foreach 
13c0: 6e 50 61 67 65 50 65 72 53 74 65 70 20 7b 31 20  nPagePerStep {1 
13d0: 32 30 30 7d 20 7b 0a 0a 20 20 23 20 4f 70 65 6e  200} {..  # Open
13e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2e 0a   the databases..
13f0: 20 20 63 61 74 63 68 20 7b 20 64 65 6c 65 74 65    catch { delete
1400: 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 20 7d 0a  _file test.db }.
1410: 20 20 63 61 74 63 68 20 7b 20 64 65 6c 65 74 65    catch { delete
1420: 5f 66 69 6c 65 20 74 65 73 74 32 2e 64 62 20 7d  _file test2.db }
1430: 0a 20 20 65 76 61 6c 20 24 7a 4f 70 65 6e 53 63  .  eval $zOpenSc
1440: 72 69 70 74 0a 0a 20 20 23 20 53 65 74 20 74 6f  ript..  # Set to
1450: 20 74 72 75 65 20 69 66 20 63 6f 70 79 69 6e 67   true if copying
1460: 20 74 6f 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   to an in-memory
1470: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 20 43 6f   destination. Co
1480: 70 79 69 6e 67 20 74 6f 20 61 6e 20 0a 20 20 23  pying to an .  #
1490: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 74 69   in-memory desti
14a0: 6e 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 70  nation is only p
14b0: 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 69  ossible if the i
14c0: 6e 69 74 69 61 6c 20 64 65 73 74 69 6e 61 74 69  nitial destinati
14d0: 6f 6e 0a 20 20 23 20 70 61 67 65 20 73 69 7a 65  on.  # page size
14e0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
14f0: 74 68 65 20 73 6f 75 72 63 65 20 70 61 67 65 20  the source page 
1500: 73 69 7a 65 20 28 69 6e 20 74 68 69 73 20 63 61  size (in this ca
1510: 73 65 20 31 30 32 34 20 62 79 74 65 73 29 2e 0a  se 1024 bytes)..
1520: 20 20 23 0a 20 20 73 65 74 20 69 73 4d 65 6d 44    #.  set isMemD
1530: 65 73 74 20 5b 65 78 70 72 20 7b 20 24 7a 44 65  est [expr { $zDe
1540: 73 74 46 69 6c 65 20 65 71 20 22 3a 6d 65 6d 6f  stFile eq ":memo
1550: 72 79 3a 22 20 7c 7c 20 24 66 69 6c 65 5f 64 65  ry:" || $file_de
1560: 73 74 20 65 71 20 22 74 65 6d 70 22 20 7d 5d 0a  st eq "temp" }].
1570: 0a 20 20 69 66 20 30 20 7b 0a 20 20 20 20 70 75  .  if 0 {.    pu
1580: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22 54  ts -nonewline "T
1590: 65 73 74 20 24 69 54 65 73 74 3a 20 73 72 63 3d  est $iTest: src=
15a0: 24 7a 53 72 63 46 69 6c 65 20 64 65 73 74 3d 24  $zSrcFile dest=$
15b0: 7a 44 65 73 74 46 69 6c 65 22 0a 20 20 20 20 70  zDestFile".    p
15c0: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22  uts -nonewline "
15d0: 20 28 61 73 20 24 64 62 5f 64 65 73 74 2e 24 66   (as $db_dest.$f
15e0: 69 6c 65 5f 64 65 73 74 29 22 0a 20 20 20 20 70  ile_dest)".    p
15f0: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22  uts -nonewline "
1600: 20 72 6f 77 73 5f 64 65 73 74 3d 24 72 6f 77 73   rows_dest=$rows
1610: 5f 64 65 73 74 20 70 67 73 7a 5f 64 65 73 74 3d  _dest pgsz_dest=
1620: 24 70 67 73 7a 5f 64 65 73 74 22 0a 20 20 20 20  $pgsz_dest".    
1630: 70 75 74 73 20 22 22 0a 20 20 7d 0a 0a 20 20 69  puts "".  }..  i
1640: 66 20 7b 20 24 69 73 4d 65 6d 44 65 73 74 3d 3d  f { $isMemDest==
1650: 30 20 7c 7c 20 24 70 67 73 7a 5f 64 65 73 74 3d  0 || $pgsz_dest=
1660: 3d 31 30 32 34 20 7c 7c 20 24 72 6f 77 73 5f 64  =1024 || $rows_d
1670: 65 73 74 3d 3d 30 20 7d 20 7b 0a 0a 20 20 20 20  est==0 } {..    
1680: 23 20 53 65 74 20 75 70 20 74 68 65 20 63 6f 6e  # Set up the con
1690: 74 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72  tent of the sour
16a0: 63 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ce database..   
16b0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
16c0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
16d0: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20 20  e = 1024;.      
16e0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45  BEGIN;.      CRE
16f0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
1700: 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  b);.      CREATE
1710: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
1720: 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53  a, b);.      INS
1730: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1740: 45 53 28 31 2c 20 72 61 6e 64 73 74 72 28 31 30  ES(1, randstr(10
1750: 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 20  00,1000));.     
1760: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1770: 56 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 73 74  VALUES(2, randst
1780: 72 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a 20  r(1000,1000));. 
1790: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
17a0: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 72 61   t1 VALUES(3, ra
17b0: 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29  ndstr(1000,1000)
17c0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
17d0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34  INTO t1 VALUES(4
17e0: 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31  , randstr(1000,1
17f0: 30 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53  000));.      INS
1800: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1810: 45 53 28 35 2c 20 72 61 6e 64 73 74 72 28 31 30  ES(5, randstr(10
1820: 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 20  00,1000));.     
1830: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20   COMMIT;.    }. 
1840: 20 20 20 0a 20 20 20 20 0a 0a 20 20 20 20 23 20     .    ..    # 
1850: 53 65 74 20 75 70 20 74 68 65 20 63 6f 6e 74 65  Set up the conte
1860: 6e 74 20 6f 66 20 74 68 65 20 74 61 72 67 65 74  nt of the target
1870: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 65   database..    e
1880: 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 24  xecsql "PRAGMA $
1890: 7b 66 69 6c 65 5f 64 65 73 74 7d 2e 70 61 67 65  {file_dest}.page
18a0: 5f 73 69 7a 65 20 3d 20 24 7b 70 67 73 7a 5f 64  _size = ${pgsz_d
18b0: 65 73 74 7d 22 20 24 64 62 5f 64 65 73 74 0a 20  est}" $db_dest. 
18c0: 20 20 20 69 66 20 7b 24 72 6f 77 73 5f 64 65 73     if {$rows_des
18d0: 74 20 21 3d 20 30 7d 20 7b 0a 20 20 20 20 20 20  t != 0} {.      
18e0: 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20  execsql ".      
18f0: 20 20 42 45 47 49 4e 3b 20 0a 20 20 20 20 20 20    BEGIN; .      
1900: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 24    CREATE TABLE $
1910: 7b 66 69 6c 65 5f 64 65 73 74 7d 2e 74 31 28 61  {file_dest}.t1(a
1920: 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52  , b);.        CR
1930: 45 41 54 45 20 49 4e 44 45 58 20 24 7b 66 69 6c  EATE INDEX ${fil
1940: 65 5f 64 65 73 74 7d 2e 69 31 20 4f 4e 20 74 31  e_dest}.i1 ON t1
1950: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 22 20  (a, b);.      " 
1960: 24 64 62 5f 64 65 73 74 0a 20 20 20 20 20 20 66  $db_dest.      f
1970: 6f 72 20 7b 73 65 74 20 69 69 20 30 7d 20 7b 24  or {set ii 0} {$
1980: 69 69 20 3c 20 24 72 6f 77 73 5f 64 65 73 74 7d  ii < $rows_dest}
1990: 20 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20 20 20   {incr ii} {.   
19a0: 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20       execsql ". 
19b0: 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20           INSERT 
19c0: 49 4e 54 4f 20 24 7b 66 69 6c 65 5f 64 65 73 74  INTO ${file_dest
19d0: 7d 2e 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72  }.t1 VALUES(1, r
19e0: 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30  andstr(1000,1000
19f0: 29 29 0a 20 20 20 20 20 20 20 20 22 20 24 64 62  )).        " $db
1a00: 5f 64 65 73 74 0a 20 20 20 20 20 20 7d 0a 20 20  _dest.      }.  
1a10: 20 20 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d      execsql COMM
1a20: 49 54 20 24 64 62 5f 64 65 73 74 0a 20 20 20 20  IT $db_dest.    
1a30: 7d 0a 20 20 0a 20 20 20 20 23 20 42 61 63 6b 75  }.  .    # Backu
1a40: 70 20 74 68 65 20 73 6f 75 72 63 65 20 64 61 74  p the source dat
1a50: 61 62 61 73 65 2e 0a 20 20 20 20 64 6f 5f 74 65  abase..    do_te
1a60: 73 74 20 62 61 63 6b 75 70 2d 32 2e 24 69 54 65  st backup-2.$iTe
1a70: 73 74 2e 31 20 7b 0a 20 20 20 20 20 20 73 71 6c  st.1 {.      sql
1a80: 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 24 64  ite3_backup B $d
1a90: 62 5f 64 65 73 74 20 24 66 69 6c 65 5f 64 65 73  b_dest $file_des
1aa0: 74 20 64 62 20 6d 61 69 6e 0a 20 20 20 20 20 20  t db main.      
1ab0: 77 68 69 6c 65 20 7b 5b 42 20 73 74 65 70 20 24  while {[B step $
1ac0: 6e 50 61 67 65 50 65 72 53 74 65 70 5d 3d 3d 22  nPagePerStep]=="
1ad0: 53 51 4c 49 54 45 5f 4f 4b 22 7d 20 7b 7d 0a 20  SQLITE_OK"} {}. 
1ae0: 20 20 20 20 20 42 20 66 69 6e 69 73 68 0a 20 20       B finish.  
1af0: 20 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a    } {SQLITE_OK}.
1b00: 20 20 20 20 0a 20 20 20 20 23 20 52 75 6e 20 69      .    # Run i
1b10: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f  ntegrity check o
1b20: 6e 20 74 68 65 20 62 61 63 6b 75 70 2e 0a 20 20  n the backup..  
1b30: 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70    do_test backup
1b40: 2d 32 2e 24 69 54 65 73 74 2e 32 20 7b 0a 20 20  -2.$iTest.2 {.  
1b50: 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52 41      execsql "PRA
1b60: 47 4d 41 20 24 7b 66 69 6c 65 5f 64 65 73 74 7d  GMA ${file_dest}
1b70: 2e 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  .integrity_check
1b80: 22 20 24 64 62 5f 64 65 73 74 0a 20 20 20 20 7d  " $db_dest.    }
1b90: 20 7b 6f 6b 7d 0a 20 20 0a 20 20 20 20 74 65 73   {ok}.  .    tes
1ba0: 74 5f 63 6f 6e 74 65 6e 74 73 20 62 61 63 6b 75  t_contents backu
1bb0: 70 2d 32 2e 24 69 54 65 73 74 2e 33 20 64 62 20  p-2.$iTest.3 db 
1bc0: 6d 61 69 6e 20 24 64 62 5f 64 65 73 74 20 24 66  main $db_dest $f
1bd0: 69 6c 65 5f 64 65 73 74 0a 20 20 0a 20 20 7d 0a  ile_dest.  .  }.
1be0: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61  .  db close.  ca
1bf0: 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d 0a  tch {db2 close}.
1c00: 20 20 69 6e 63 72 20 69 54 65 73 74 0a 0a 7d 20    incr iTest..} 
1c10: 7d 20 7d 20 7d 20 7d 20 7d 0a 23 0a 23 20 45 6e  } } } } }.#.# En
1c20: 64 20 6f 66 20 62 61 63 6b 75 70 2d 32 2e 2a 20  d of backup-2.* 
1c30: 74 65 73 74 73 2e 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  tests..#--------
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 2d 2d  ----------------
1c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23  -------------..#
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cc0: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 73 65 20 74 65  -----.# These te
1cd0: 73 74 73 2c 20 62 61 63 6b 75 70 2d 33 2e 2a 2c  sts, backup-3.*,
1ce0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 6e 6f 74   ensure that not
1cf0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
1d00: 69 66 20 65 69 74 68 65 72 20 0a 23 20 74 68 65  if either .# the
1d10: 20 73 6f 75 72 63 65 20 6f 72 20 64 65 73 74 69   source or desti
1d20: 6e 61 74 69 6f 6e 20 64 61 74 61 62 61 73 65 20  nation database 
1d30: 61 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  are large enough
1d40: 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 0a   to include the.
1d50: 23 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 70 61  # the locking-pa
1d60: 67 65 20 28 74 68 65 20 70 61 67 65 20 74 68 61  ge (the page tha
1d70: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  t contains the r
1d80: 61 6e 67 65 20 6f 66 20 62 79 74 65 73 20 74 68  ange of bytes th
1d90: 61 74 0a 23 20 74 68 65 20 6c 6f 63 6b 73 20 61  at.# the locks a
1da0: 72 65 20 61 70 70 6c 69 65 64 20 74 6f 29 2e 20  re applied to). 
1db0: 54 68 65 73 65 20 74 65 73 74 73 20 61 73 73 75  These tests assu
1dc0: 6d 65 20 74 68 61 74 20 74 68 65 20 70 65 6e 64  me that the pend
1dd0: 69 6e 67 0a 23 20 62 79 74 65 20 69 73 20 61 74  ing.# byte is at
1de0: 20 6f 66 66 73 65 74 20 30 78 30 30 30 31 30 30   offset 0x000100
1df0: 30 30 20 28 36 34 4b 42 20 6f 66 66 73 65 74 29  00 (64KB offset)
1e00: 2c 20 61 73 20 73 65 74 20 62 79 20 74 65 73 74  , as set by test
1e10: 65 72 2e 74 63 6c 2c 20 0a 23 20 6e 6f 74 20 61  er.tcl, .# not a
1e20: 74 20 74 68 65 20 31 47 42 20 6f 66 66 73 65 74  t the 1GB offset
1e30: 20 61 73 20 69 74 20 75 73 75 61 6c 6c 79 20 69   as it usually i
1e40: 73 2e 0a 23 0a 23 20 54 68 65 20 74 65 73 74 20  s..#.# The test 
1e50: 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 73 20  procedure is as 
1e60: 66 6f 6c 6c 6f 77 73 20 28 73 61 6d 65 20 70 72  follows (same pr
1e70: 6f 63 65 64 75 72 65 20 61 73 20 75 73 65 64 20  ocedure as used 
1e80: 66 6f 72 20 0a 23 20 74 68 65 20 62 61 63 6b 75  for .# the backu
1e90: 70 2d 32 2e 2a 20 74 65 73 74 73 29 3a 0a 23 0a  p-2.* tests):.#.
1ea0: 23 20 20 20 31 29 20 50 6f 70 75 6c 61 74 65 20  #   1) Populate 
1eb0: 74 68 65 20 73 6f 75 72 63 65 20 64 61 74 61 62  the source datab
1ec0: 61 73 65 2e 0a 23 20 20 20 32 29 20 50 6f 70 75  ase..#   2) Popu
1ed0: 6c 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  late the destina
1ee0: 74 69 6f 6e 20 64 61 74 61 62 61 73 65 2e 0a 23  tion database..#
1ef0: 20 20 20 33 29 20 52 75 6e 20 74 68 65 20 62 61     3) Run the ba
1f00: 63 6b 75 70 20 74 6f 20 63 6f 6d 70 6c 65 74 69  ckup to completi
1f10: 6f 6e 2e 20 28 62 61 63 6b 75 70 2d 33 2e 2a 2e  on. (backup-3.*.
1f20: 31 29 0a 23 20 20 20 34 29 20 49 6e 74 65 67 72  1).#   4) Integr
1f30: 69 74 79 20 63 68 65 63 6b 20 74 68 65 20 64 65  ity check the de
1f40: 73 74 69 6e 61 74 69 6f 6e 20 64 62 2e 20 28 62  stination db. (b
1f50: 61 63 6b 75 70 2d 33 2e 2a 2e 32 29 0a 23 20 20  ackup-3.*.2).#  
1f60: 20 35 29 20 43 68 65 63 6b 20 74 68 61 74 20 74   5) Check that t
1f70: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1f80: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 64  he destination d
1f90: 62 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  b is the same as
1fa0: 20 74 68 61 74 0a 23 20 20 20 20 20 20 6f 66 20   that.#      of 
1fb0: 74 68 65 20 73 6f 75 72 63 65 20 64 62 2e 20 28  the source db. (
1fc0: 62 61 63 6b 75 70 2d 33 2e 2a 2e 33 29 0a 23 0a  backup-3.*.3).#.
1fd0: 23 20 54 68 65 20 74 65 73 74 20 70 72 6f 63 65  # The test proce
1fe0: 64 75 72 65 20 69 73 20 72 75 6e 20 77 69 74 68  dure is run with
1ff0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
2000: 61 72 61 6d 65 74 65 72 73 20 76 61 72 69 65 64  arameters varied
2010: 3a 20 0a 23 0a 23 20 20 20 2a 20 53 6f 75 72 63  : .#.#   * Sourc
2020: 65 20 64 61 74 61 62 61 73 65 20 69 6e 63 6c 75  e database inclu
2030: 64 65 73 20 70 65 6e 64 69 6e 67 2d 62 79 74 65  des pending-byte
2040: 20 70 61 67 65 2e 0a 23 20 20 20 2a 20 53 6f 75   page..#   * Sou
2050: 72 63 65 20 64 61 74 61 62 61 73 65 20 64 6f 65  rce database doe
2060: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 70 65  s not include pe
2070: 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
2080: 0a 23 0a 23 20 20 20 2a 20 54 61 72 67 65 74 20  .#.#   * Target 
2090: 64 61 74 61 62 61 73 65 20 69 6e 63 6c 75 64 65  database include
20a0: 73 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  s pending-byte p
20b0: 61 67 65 2e 0a 23 20 20 20 2a 20 54 61 72 67 65  age..#   * Targe
20c0: 74 20 64 61 74 61 62 61 73 65 20 64 6f 65 73 20  t database does 
20d0: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 70 65 6e 64  not include pend
20e0: 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 0a 23  ing-byte page..#
20f0: 0a 23 20 20 20 2a 20 54 61 72 67 65 74 20 64 61  .#   * Target da
2100: 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65  tabase page-size
2110: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2120: 74 68 65 20 73 6f 75 72 63 65 2c 20 4f 52 0a 23  the source, OR.#
2130: 20 20 20 2a 20 54 61 72 67 65 74 20 64 61 74 61     * Target data
2140: 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69  base page-size i
2150: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
2160: 65 20 73 6f 75 72 63 65 2c 20 4f 52 0a 23 20 20  e source, OR.#  
2170: 20 2a 20 54 61 72 67 65 74 20 64 61 74 61 62 61   * Target databa
2180: 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  se page-size is 
2190: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
21a0: 20 73 6f 75 72 63 65 2e 0a 23 0a 73 65 74 20 69   source..#.set i
21b0: 54 65 73 74 20 31 0a 66 6f 72 65 61 63 68 20 6e  Test 1.foreach n
21c0: 53 72 63 50 67 20 7b 31 30 20 36 34 20 36 35 20  SrcPg {10 64 65 
21d0: 36 36 20 31 30 30 7d 20 7b 0a 66 6f 72 65 61 63  66 100} {.foreac
21e0: 68 20 6e 44 65 73 74 52 6f 77 20 7b 31 30 20 31  h nDestRow {10 1
21f0: 30 30 7d 20 7b 0a 66 6f 72 65 61 63 68 20 6e 44  00} {.foreach nD
2200: 65 73 74 50 67 73 7a 20 7b 35 31 32 20 31 30 32  estPgsz {512 102
2210: 34 20 32 30 34 38 20 34 30 39 36 7d 20 7b 0a 0a  4 2048 4096} {..
2220: 20 20 63 61 74 63 68 20 7b 20 64 65 6c 65 74 65    catch { delete
2230: 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 20 7d 0a  _file test.db }.
2240: 20 20 63 61 74 63 68 20 7b 20 64 65 6c 65 74 65    catch { delete
2250: 5f 66 69 6c 65 20 74 65 73 74 32 2e 64 62 20 7d  _file test2.db }
2260: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
2270: 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20  st.db.  sqlite3 
2280: 64 62 32 20 74 65 73 74 32 2e 64 62 0a 0a 20 20  db2 test2.db..  
2290: 23 20 53 65 74 20 75 70 20 74 68 65 20 63 6f 6e  # Set up the con
22a0: 74 65 6e 74 20 6f 66 20 74 68 65 20 74 77 6f 20  tent of the two 
22b0: 64 61 74 61 62 61 73 65 73 2e 0a 20 20 23 0a 20  databases..  #. 
22c0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
22d0: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
22e0: 32 34 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 22  24 }.  execsql "
22f0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
2300: 20 3d 20 24 6e 44 65 73 74 50 67 73 7a 22 20 64   = $nDestPgsz" d
2310: 62 32 0a 20 20 66 6f 72 65 61 63 68 20 64 62 20  b2.  foreach db 
2320: 7b 64 62 20 64 62 32 7d 20 7b 0a 20 20 20 20 65  {db db2} {.    e
2330: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42  xecsql {.      B
2340: 45 47 49 4e 3b 20 0a 20 20 20 20 20 20 43 52 45  EGIN; .      CRE
2350: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
2360: 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  b);.      CREATE
2370: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
2380: 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 4f 4d  a, b);.      COM
2390: 4d 49 54 3b 0a 20 20 20 20 7d 20 24 64 62 0a 20  MIT;.    } $db. 
23a0: 20 7d 0a 20 20 77 68 69 6c 65 20 7b 5b 66 69 6c   }.  while {[fil
23b0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f  e size test.db]/
23c0: 31 30 32 34 20 3c 20 24 6e 53 72 63 50 67 7d 20  1024 < $nSrcPg} 
23d0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
23e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
23f0: 41 4c 55 45 53 28 24 69 69 2c 20 72 61 6e 64 73  ALUES($ii, rands
2400: 74 72 28 32 30 30 2c 32 30 30 29 29 20 7d 0a 20  tr(200,200)) }. 
2410: 20 7d 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20 69   }..  for {set i
2420: 69 20 30 7d 20 7b 24 69 69 20 3c 20 24 6e 44 65  i 0} {$ii < $nDe
2430: 73 74 52 6f 77 7d 20 7b 69 6e 63 72 20 69 69 7d  stRow} {incr ii}
2440: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
2450: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2460: 56 41 4c 55 45 53 28 24 69 69 2c 20 72 61 6e 64  VALUES($ii, rand
2470: 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 29 20  str(1000,1000)) 
2480: 7d 20 64 62 32 0a 20 20 7d 0a 0a 20 20 23 20 42  } db2.  }..  # B
2490: 61 63 6b 75 70 20 74 68 65 20 73 6f 75 72 63 65  ackup the source
24a0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 64 6f 5f   database..  do_
24b0: 74 65 73 74 20 62 61 63 6b 75 70 2d 33 2e 24 69  test backup-3.$i
24c0: 54 65 73 74 2e 31 20 7b 0a 20 20 20 20 73 71 6c  Test.1 {.    sql
24d0: 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62  ite3_backup B db
24e0: 20 6d 61 69 6e 20 64 62 32 20 6d 61 69 6e 0a 20   main db2 main. 
24f0: 20 20 20 77 68 69 6c 65 20 7b 5b 42 20 73 74 65     while {[B ste
2500: 70 20 31 30 5d 3d 3d 22 53 51 4c 49 54 45 5f 4f  p 10]=="SQLITE_O
2510: 4b 22 7d 20 7b 7d 0a 20 20 20 20 42 20 66 69 6e  K"} {}.    B fin
2520: 69 73 68 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f  ish.  } {SQLITE_
2530: 4f 4b 7d 0a 20 20 20 20 0a 20 20 23 20 52 75 6e  OK}.    .  # Run
2540: 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   integrity check
2550: 20 6f 6e 20 74 68 65 20 62 61 63 6b 75 70 2e 0a   on the backup..
2560: 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70    do_test backup
2570: 2d 33 2e 24 69 54 65 73 74 2e 32 20 7b 0a 20 20  -3.$iTest.2 {.  
2580: 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d    execsql "PRAGM
2590: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
25a0: 6b 22 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a  k" db2.  } {ok}.
25b0: 20 20 0a 20 20 74 65 73 74 5f 63 6f 6e 74 65 6e    .  test_conten
25c0: 74 73 20 62 61 63 6b 75 70 2d 33 2e 24 69 54 65  ts backup-3.$iTe
25d0: 73 74 2e 33 20 64 62 20 6d 61 69 6e 20 64 62 32  st.3 db main db2
25e0: 20 6d 61 69 6e 0a 0a 20 20 64 62 20 63 6c 6f 73   main..  db clos
25f0: 65 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20  e.  db2 close.  
2600: 69 6e 63 72 20 69 54 65 73 74 0a 7d 0a 7d 0a 7d  incr iTest.}.}.}
2610: 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2650: 2d 2d 2d 2d 2d 2d 2d 0a 64 6f 5f 74 65 73 74 20  -------.do_test 
2660: 62 61 63 6b 75 70 2d 33 2e 24 69 54 65 73 74 2e  backup-3.$iTest.
2670: 31 20 7b 0a 20 20 63 61 74 63 68 20 7b 20 66 6f  1 {.  catch { fo
2680: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
2690: 62 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 66 6f  b }.  catch { fo
26a0: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e  rcedelete test2.
26b0: 64 62 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64  db }.  sqlite3 d
26c0: 62 20 74 65 73 74 2e 64 62 0a 20 20 73 65 74 20  b test.db.  set 
26d0: 69 54 61 62 20 31 0a 0a 20 20 64 62 20 65 76 61  iTab 1..  db eva
26e0: 6c 20 7b 20 50 52 41 47 4d 41 20 70 61 67 65 5f  l { PRAGMA page_
26f0: 73 69 7a 65 20 3d 20 35 31 32 20 7d 0a 20 20 77  size = 512 }.  w
2700: 68 69 6c 65 20 7b 5b 66 69 6c 65 20 73 69 7a 65  hile {[file size
2710: 20 74 65 73 74 2e 64 62 5d 20 3c 3d 20 24 3a 3a   test.db] <= $::
2720: 73 71 6c 69 74 65 5f 70 65 6e 64 69 6e 67 5f 62  sqlite_pending_b
2730: 79 74 65 7d 20 7b 0a 20 20 20 20 64 62 20 65 76  yte} {.    db ev
2740: 61 6c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  al "CREATE TABLE
2750: 20 74 24 7b 69 54 61 62 7d 28 61 2c 20 62 2c 20   t${iTab}(a, b, 
2760: 63 29 22 0a 20 20 20 20 69 6e 63 72 20 69 54 61  c)".    incr iTa
2770: 62 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  b.  }..  sqlite3
2780: 20 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20   db2 test2.db.  
2790: 64 62 32 20 65 76 61 6c 20 7b 20 50 52 41 47 4d  db2 eval { PRAGM
27a0: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30  A page_size = 40
27b0: 39 36 20 7d 0a 20 20 77 68 69 6c 65 20 7b 5b 66  96 }.  while {[f
27c0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 32 2e 64  ile size test2.d
27d0: 62 5d 20 3c 20 24 3a 3a 73 71 6c 69 74 65 5f 70  b] < $::sqlite_p
27e0: 65 6e 64 69 6e 67 5f 62 79 74 65 7d 20 7b 0a 20  ending_byte} {. 
27f0: 20 20 20 64 62 32 20 65 76 61 6c 20 22 43 52 45     db2 eval "CRE
2800: 41 54 45 20 54 41 42 4c 45 20 74 24 7b 69 54 61  ATE TABLE t${iTa
2810: 62 7d 28 61 2c 20 62 2c 20 63 29 22 0a 20 20 20  b}(a, b, c)".   
2820: 20 69 6e 63 72 20 69 54 61 62 0a 20 20 7d 0a 0a   incr iTab.  }..
2830: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
2840: 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d   B db2 main db m
2850: 61 69 6e 0a 20 20 42 20 73 74 65 70 20 2d 31 0a  ain.  B step -1.
2860: 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 7d 0a  } {SQLITE_DONE}.
2870: 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d  .do_test backup-
2880: 33 2e 24 69 54 65 73 74 2e 32 20 7b 0a 20 20 42  3.$iTest.2 {.  B
2890: 20 66 69 6e 69 73 68 0a 7d 20 7b 53 51 4c 49 54   finish.} {SQLIT
28a0: 45 5f 4f 4b 7d 0a 0a 23 0a 23 20 45 6e 64 20 6f  E_OK}..#.# End o
28b0: 66 20 62 61 63 6b 75 70 2d 33 2e 2a 20 74 65 73  f backup-3.* tes
28c0: 74 73 2e 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ts..#-----------
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 0a 23 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 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
2960: 69 6e 67 20 74 65 73 74 73 2c 20 62 61 63 6b 75  ing tests, backu
2970: 70 2d 34 2e 2a 2c 20 74 65 73 74 20 76 61 72 69  p-4.*, test vari
2980: 6f 75 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  ous error condit
2990: 69 6f 6e 73 3a 0a 23 20 0a 23 20 62 61 63 6b 75  ions:.# .# backu
29a0: 70 2d 34 2e 31 2e 2a 3a 20 54 65 73 74 20 69 6e  p-4.1.*: Test in
29b0: 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 6e  valid database n
29c0: 61 6d 65 73 2e 0a 23 0a 23 20 62 61 63 6b 75 70  ames..#.# backup
29d0: 2d 34 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 61  -4.2.*: Test tha
29e0: 74 20 74 68 65 20 73 6f 75 72 63 65 20 64 61 74  t the source dat
29f0: 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
2a00: 64 65 74 61 63 68 65 64 20 77 68 69 6c 65 20 0a  detached while .
2a10: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
2a20: 61 20 62 61 63 6b 75 70 20 69 73 20 69 6e 20 70  a backup is in p
2a30: 72 6f 67 72 65 73 73 2e 0a 23 0a 23 20 62 61 63  rogress..#.# bac
2a40: 6b 75 70 2d 34 2e 33 2e 2a 3a 20 54 65 73 74 20  kup-4.3.*: Test 
2a50: 74 68 61 74 20 74 68 65 20 73 6f 75 72 63 65 20  that the source 
2a60: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
2a70: 63 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  cannot be closed
2a80: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
2a90: 20 77 68 69 6c 65 20 61 20 62 61 63 6b 75 70 20   while a backup 
2aa0: 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  is in progress..
2ab0: 23 0a 23 20 62 61 63 6b 75 70 2d 34 2e 34 2e 2a  #.# backup-4.4.*
2ac0: 3a 20 54 65 73 74 20 61 6e 20 61 74 74 65 6d 70  : Test an attemp
2ad0: 74 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 65  t to specify the
2ae0: 20 73 61 6d 65 20 68 61 6e 64 6c 65 20 66 6f 72   same handle for
2af0: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
2b00: 20 20 20 20 20 73 6f 75 72 63 65 20 61 6e 64 20       source and 
2b10: 64 65 73 74 69 6e 61 74 69 6f 6e 20 64 61 74 61  destination data
2b20: 62 61 73 65 73 2e 0a 23 0a 23 20 62 61 63 6b 75  bases..#.# backu
2b30: 70 2d 34 2e 35 2e 2a 3a 20 54 65 73 74 20 74 68  p-4.5.*: Test th
2b40: 61 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  at an in-memory 
2b50: 64 65 73 74 69 6e 61 74 69 6f 6e 20 77 69 74 68  destination with
2b60: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 23 20 20   a different.#  
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
2b80: 65 2d 73 69 7a 65 20 74 6f 20 74 68 65 20 73 6f  e-size to the so
2b90: 75 72 63 65 20 64 61 74 61 62 61 73 65 20 69 73  urce database is
2ba0: 20 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 73 71 6c   an error..#.sql
2bb0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
2bc0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
2bd0: 32 2e 64 62 0a 0a 64 6f 5f 74 65 73 74 20 62 61  2.db..do_test ba
2be0: 63 6b 75 70 2d 34 2e 31 2e 31 20 7b 0a 20 20 63  ckup-4.1.1 {.  c
2bf0: 61 74 63 68 20 7b 20 73 71 6c 69 74 65 33 5f 62  atch { sqlite3_b
2c00: 61 63 6b 75 70 20 42 20 64 62 20 61 75 78 20 64  ackup B db aux d
2c10: 62 32 20 6d 61 69 6e 20 7d 0a 7d 20 7b 31 7d 0a  b2 main }.} {1}.
2c20: 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 34  do_test backup-4
2c30: 2e 31 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33  .1.2 {.  sqlite3
2c40: 5f 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b 75 6e  _errmsg db.} {un
2c50: 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 61  known database a
2c60: 75 78 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b  ux}.do_test back
2c70: 75 70 2d 34 2e 31 2e 33 20 7b 0a 20 20 63 61 74  up-4.1.3 {.  cat
2c80: 63 68 20 7b 20 73 71 6c 69 74 65 33 5f 62 61 63  ch { sqlite3_bac
2c90: 6b 75 70 20 42 20 64 62 20 6d 61 69 6e 20 64 62  kup B db main db
2ca0: 32 20 61 75 78 20 7d 0a 7d 20 7b 31 7d 0a 64 6f  2 aux }.} {1}.do
2cb0: 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 34 2e 31  _test backup-4.1
2cc0: 2e 34 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65  .4 {.  sqlite3_e
2cd0: 72 72 6d 73 67 20 64 62 0a 7d 20 7b 75 6e 6b 6e  rrmsg db.} {unkn
2ce0: 6f 77 6e 20 64 61 74 61 62 61 73 65 20 61 75 78  own database aux
2cf0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75  }..do_test backu
2d00: 70 2d 34 2e 32 2e 31 20 7b 0a 20 20 63 61 74 63  p-4.2.1 {.  catc
2d10: 68 20 7b 20 66 6f 72 63 65 64 65 6c 65 74 65 20  h { forcedelete 
2d20: 74 65 73 74 33 2e 64 62 20 7d 0a 20 20 63 61 74  test3.db }.  cat
2d30: 63 68 20 7b 20 66 6f 72 63 65 64 65 6c 65 74 65  ch { forcedelete
2d40: 20 74 65 73 74 34 2e 64 62 20 7d 0a 20 20 65 78   test4.db }.  ex
2d50: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 41 54 54  ecsql { .    ATT
2d60: 41 43 48 20 27 74 65 73 74 33 2e 64 62 27 20 41  ACH 'test3.db' A
2d70: 53 20 61 75 78 31 3b 0a 20 20 20 20 43 52 45 41  S aux1;.    CREA
2d80: 54 45 20 54 41 42 4c 45 20 61 75 78 31 2e 74 31  TE TABLE aux1.t1
2d90: 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20 65 78  (a, b);.  }.  ex
2da0: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 41 54 54  ecsql { .    ATT
2db0: 41 43 48 20 27 74 65 73 74 34 2e 64 62 27 20 41  ACH 'test4.db' A
2dc0: 53 20 61 75 78 32 3b 0a 20 20 20 20 43 52 45 41  S aux2;.    CREA
2dd0: 54 45 20 54 41 42 4c 45 20 61 75 78 32 2e 74 32  TE TABLE aux2.t2
2de0: 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64 62 32 0a  (a, b);.  } db2.
2df0: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
2e00: 20 42 20 64 62 20 61 75 78 31 20 64 62 32 20 61   B db aux1 db2 a
2e10: 75 78 32 0a 7d 20 7b 42 7d 0a 64 6f 5f 74 65 73  ux2.} {B}.do_tes
2e20: 74 20 62 61 63 6b 75 70 2d 34 2e 32 2e 32 20 7b  t backup-4.2.2 {
2e30: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45  .  catchsql { DE
2e40: 54 41 43 48 20 61 75 78 32 20 7d 20 64 62 32 0a  TACH aux2 } db2.
2e50: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 61  } {1 {database a
2e60: 75 78 32 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ux2 is locked}}.
2e70: 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 34  do_test backup-4
2e80: 2e 32 2e 33 20 7b 0a 20 20 42 20 73 74 65 70 20  .2.3 {.  B step 
2e90: 35 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e  50.} {SQLITE_DON
2ea0: 45 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75  E}.do_test backu
2eb0: 70 2d 34 2e 32 2e 34 20 7b 0a 20 20 42 20 66 69  p-4.2.4 {.  B fi
2ec0: 6e 69 73 68 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f  nish.} {SQLITE_O
2ed0: 4b 7d 0a 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b  K}..do_test back
2ee0: 75 70 2d 34 2e 33 2e 31 20 7b 0a 20 20 73 71 6c  up-4.3.1 {.  sql
2ef0: 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62  ite3_backup B db
2f00: 20 61 75 78 31 20 64 62 32 20 61 75 78 32 0a 7d   aux1 db2 aux2.}
2f10: 20 7b 42 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63   {B}.do_test bac
2f20: 6b 75 70 2d 34 2e 33 2e 32 20 7b 0a 20 20 64 62  kup-4.3.2 {.  db
2f30: 32 20 63 61 63 68 65 20 66 6c 75 73 68 0a 20 20  2 cache flush.  
2f40: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 64 62  sqlite3_close db
2f50: 32 0a 7d 20 7b 53 51 4c 49 54 45 5f 42 55 53 59  2.} {SQLITE_BUSY
2f60: 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70  }.do_test backup
2f70: 2d 34 2e 33 2e 33 20 7b 0a 20 20 73 71 6c 69 74  -4.3.3 {.  sqlit
2f80: 65 33 5f 65 72 72 6d 73 67 20 64 62 32 0a 7d 20  e3_errmsg db2.} 
2f90: 7b 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65  {unable to close
2fa0: 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69   due to unfinali
2fb0: 7a 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  zed statements o
2fc0: 72 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61 63  r unfinished bac
2fd0: 6b 75 70 73 7d 0a 64 6f 5f 74 65 73 74 20 62 61  kups}.do_test ba
2fe0: 63 6b 75 70 2d 34 2e 33 2e 34 20 7b 0a 20 20 42  ckup-4.3.4 {.  B
2ff0: 20 73 74 65 70 20 35 30 0a 7d 20 7b 53 51 4c 49   step 50.} {SQLI
3000: 54 45 5f 44 4f 4e 45 7d 0a 64 6f 5f 74 65 73 74  TE_DONE}.do_test
3010: 20 62 61 63 6b 75 70 2d 34 2e 33 2e 35 20 7b 0a   backup-4.3.5 {.
3020: 20 20 42 20 66 69 6e 69 73 68 0a 7d 20 7b 53 51    B finish.} {SQ
3030: 4c 49 54 45 5f 4f 4b 7d 0a 0a 64 6f 5f 74 65 73  LITE_OK}..do_tes
3040: 74 20 62 61 63 6b 75 70 2d 34 2e 34 2e 31 20 7b  t backup-4.4.1 {
3050: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
3060: 20 7b 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70   {sqlite3_backup
3070: 20 42 20 64 62 20 6d 61 69 6e 20 64 62 20 61 75   B db main db au
3080: 78 31 7d 5d 0a 20 20 6c 69 73 74 20 24 72 63 20  x1}].  list $rc 
3090: 5b 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  [sqlite3_errcode
30a0: 20 64 62 5d 20 5b 73 71 6c 69 74 65 33 5f 65 72   db] [sqlite3_er
30b0: 72 6d 73 67 20 64 62 5d 0a 7d 20 7b 31 20 53 51  rmsg db].} {1 SQ
30c0: 4c 49 54 45 5f 45 52 52 4f 52 20 7b 73 6f 75 72  LITE_ERROR {sour
30d0: 63 65 20 61 6e 64 20 64 65 73 74 69 6e 61 74 69  ce and destinati
30e0: 6f 6e 20 6d 75 73 74 20 62 65 20 64 69 73 74 69  on must be disti
30f0: 6e 63 74 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 64  nct}}.db close.d
3100: 62 32 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73  b2 close..do_tes
3110: 74 20 62 61 63 6b 75 70 2d 34 2e 35 2e 31 20 7b  t backup-4.5.1 {
3120: 0a 20 20 63 61 74 63 68 20 7b 20 66 6f 72 63 65  .  catch { force
3130: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20 7d  delete test.db }
3140: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
3150: 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20  st.db.  sqlite3 
3160: 64 62 32 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 65  db2 :memory:.  e
3170: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
3180: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
3190: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
31a0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
31b0: 20 32 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73   2);.  }.  execs
31c0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
31d0: 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36  page_size = 4096
31e0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
31f0: 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20  LE t2(a, b);.   
3200: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
3210: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
3220: 7d 20 64 62 32 0a 20 20 73 71 6c 69 74 65 33 5f  } db2.  sqlite3_
3230: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
3240: 6e 20 64 62 20 6d 61 69 6e 0a 7d 20 7b 42 7d 0a  n db main.} {B}.
3250: 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 34  do_test backup-4
3260: 2e 35 2e 32 20 7b 0a 20 20 42 20 73 74 65 70 20  .5.2 {.  B step 
3270: 35 30 30 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 52  5000.} {SQLITE_R
3280: 45 41 44 4f 4e 4c 59 7d 0a 64 6f 5f 74 65 73 74  EADONLY}.do_test
3290: 20 62 61 63 6b 75 70 2d 34 2e 35 2e 33 20 7b 0a   backup-4.5.3 {.
32a0: 20 20 42 20 66 69 6e 69 73 68 0a 7d 20 7b 53 51    B finish.} {SQ
32b0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 7d 0a 0a  LITE_READONLY}..
32c0: 64 62 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c 6f  db close.db2 clo
32d0: 73 65 0a 23 0a 23 20 45 6e 64 20 6f 66 20 62 61  se.#.# End of ba
32e0: 63 6b 75 70 2d 34 2e 2a 20 74 65 73 74 73 2e 0a  ckup-4.* tests..
32f0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
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 0a 0a 23 2d 2d 2d 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 0a 23  --------------.#
3380: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
3390: 65 73 74 73 2c 20 62 61 63 6b 75 70 2d 35 2e 2a  ests, backup-5.*
33a0: 2c 20 74 65 73 74 20 74 68 61 74 20 74 68 65 20  , test that the 
33b0: 62 61 63 6b 75 70 20 77 6f 72 6b 73 20 70 72 6f  backup works pro
33c0: 70 65 72 6c 79 0a 23 20 77 68 65 6e 20 74 68 65  perly.# when the
33d0: 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65   source database
33e0: 20 69 73 20 6d 6f 64 69 66 69 65 64 20 64 75 72   is modified dur
33f0: 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 2e 20  ing the backup. 
3400: 54 65 73 74 20 63 61 73 65 73 0a 23 20 61 72 65  Test cases.# are
3410: 20 6f 72 67 61 6e 69 7a 65 64 20 61 73 20 66 6f   organized as fo
3420: 6c 6c 6f 77 73 3a 0a 23 0a 23 20 62 61 63 6b 75  llows:.#.# backu
3430: 70 2d 35 2e 78 2e 31 2e 2a 3a 20 4e 6f 74 68 69  p-5.x.1.*: Nothi
3440: 6e 67 20 73 70 65 63 69 61 6c 2e 20 4d 6f 64 69  ng special. Modi
3450: 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  fy the database 
3460: 6d 69 64 2d 62 61 63 6b 75 70 2e 0a 23 0a 23 20  mid-backup..#.# 
3470: 62 61 63 6b 75 70 2d 35 2e 78 2e 32 2e 2a 3a 20  backup-5.x.2.*: 
3480: 4d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  Modify the datab
3490: 61 73 65 20 6d 69 64 2d 62 61 63 6b 75 70 20 73  ase mid-backup s
34a0: 6f 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 6d 6f  o that one or mo
34b0: 72 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  re.#            
34c0: 20 20 20 20 20 70 61 67 65 73 20 61 72 65 20 77       pages are w
34d0: 72 69 74 74 65 6e 20 6f 75 74 20 64 75 65 20 74  ritten out due t
34e0: 6f 20 63 61 63 68 65 20 73 74 72 65 73 73 2e 20  o cache stress. 
34f0: 54 68 65 6e 20 0a 23 20 20 20 20 20 20 20 20 20  Then .#         
3500: 20 20 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b          rollback
3510: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
3520: 2e 0a 23 0a 23 20 62 61 63 6b 75 70 2d 35 2e 78  ..#.# backup-5.x
3530: 2e 33 2e 2a 3a 20 44 61 74 61 62 61 73 65 20 69  .3.*: Database i
3540: 73 20 76 61 63 75 75 6d 65 64 2e 0a 23 0a 23 20  s vacuumed..#.# 
3550: 62 61 63 6b 75 70 2d 35 2e 78 2e 34 2e 2a 3a 20  backup-5.x.4.*: 
3560: 44 61 74 61 62 61 73 65 20 69 73 20 76 61 63 75  Database is vacu
3570: 75 6d 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  umed and the pag
3580: 65 2d 73 69 7a 65 20 6d 6f 64 69 66 69 65 64 2e  e-size modified.
3590: 0a 23 0a 23 20 62 61 63 6b 75 70 2d 35 2e 78 2e  .#.# backup-5.x.
35a0: 35 2e 2a 3a 20 44 61 74 61 62 61 73 65 20 69 73  5.*: Database is
35b0: 20 73 68 72 75 6e 6b 20 76 69 61 20 69 6e 63 72   shrunk via incr
35c0: 2d 76 61 63 75 75 6d 2e 0a 23 0a 23 20 45 61 63  -vacuum..#.# Eac
35d0: 68 20 74 65 73 74 20 69 73 20 72 75 6e 20 74 68  h test is run th
35e0: 72 65 65 20 74 69 6d 65 73 2c 20 69 6e 20 74 68  ree times, in th
35f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 66  e following conf
3600: 69 67 75 72 61 74 69 6f 6e 73 3a 0a 23 0a 23 20  igurations:.#.# 
3610: 20 20 31 29 20 42 61 63 6b 69 6e 67 20 75 70 20    1) Backing up 
3620: 66 69 6c 65 2d 74 6f 2d 66 69 6c 65 2e 20 54 68  file-to-file. Th
3630: 65 20 77 72 69 74 65 72 20 77 72 69 74 65 73 20  e writer writes 
3640: 76 69 61 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  via an external 
3650: 70 61 67 65 72 2e 0a 23 20 20 20 32 29 20 42 61  pager..#   2) Ba
3660: 63 6b 69 6e 67 20 75 70 20 66 69 6c 65 2d 74 6f  cking up file-to
3670: 2d 66 69 6c 65 2e 20 54 68 65 20 77 72 69 74 65  -file. The write
3680: 72 20 77 72 69 74 65 73 20 76 69 61 20 74 68 65  r writes via the
3690: 20 73 61 6d 65 20 70 61 67 65 72 20 61 73 0a 23   same pager as.#
36a0: 20 20 20 20 20 20 69 73 20 75 73 65 64 20 62 79        is used by
36b0: 20 74 68 65 20 62 61 63 6b 75 70 20 6f 70 65 72   the backup oper
36c0: 61 74 69 6f 6e 2e 0a 23 20 20 20 33 29 20 42 61  ation..#   3) Ba
36d0: 63 6b 69 6e 67 20 75 70 20 6d 65 6d 6f 72 79 2d  cking up memory-
36e0: 74 6f 2d 66 69 6c 65 2e 20 0a 23 0a 73 65 74 20  to-file. .#.set 
36f0: 69 54 65 73 74 20 30 0a 66 6f 72 63 65 64 65 6c  iTest 0.forcedel
3700: 65 74 65 20 62 61 6b 2e 64 62 2d 77 61 6c 0a 66  ete bak.db-wal.f
3710: 6f 72 65 61 63 68 20 7b 77 72 69 74 65 72 20 66  oreach {writer f
3720: 69 6c 65 7d 20 7b 64 62 20 74 65 73 74 2e 64 62  ile} {db test.db
3730: 20 64 62 33 20 74 65 73 74 2e 64 62 20 64 62 20   db3 test.db db 
3740: 3a 6d 65 6d 6f 72 79 3a 7d 20 7b 0a 20 20 69 6e  :memory:} {.  in
3750: 63 72 20 69 54 65 73 74 0a 20 20 63 61 74 63 68  cr iTest.  catch
3760: 20 7b 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 62   { delete_file b
3770: 61 6b 2e 64 62 20 7d 0a 20 20 73 71 6c 69 74 65  ak.db }.  sqlite
3780: 33 20 64 62 32 20 62 61 6b 2e 64 62 0a 20 20 63  3 db2 bak.db.  c
3790: 61 74 63 68 20 7b 20 64 65 6c 65 74 65 5f 66 69  atch { delete_fi
37a0: 6c 65 20 24 66 69 6c 65 20 7d 0a 20 20 73 71 6c  le $file }.  sql
37b0: 69 74 65 33 20 64 62 20 24 66 69 6c 65 0a 20 20  ite3 db $file.  
37c0: 73 71 6c 69 74 65 33 20 64 62 33 20 24 66 69 6c  sqlite3 db3 $fil
37d0: 65 0a 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63  e..  do_test bac
37e0: 6b 75 70 2d 35 2e 24 69 54 65 73 74 2e 31 2e 31  kup-5.$iTest.1.1
37f0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3800: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
3810: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3820: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
3830: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
3840: 20 4f 4e 20 74 31 28 61 2c 20 62 29 3b 0a 20 20   ON t1(a, b);.  
3850: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3860: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e  t1 VALUES(1, ran
3870: 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 29  dstr(1000,1000))
3880: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3890: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c  NTO t1 VALUES(2,
38a0: 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30   randstr(1000,10
38b0: 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  00));.      INSE
38c0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
38d0: 53 28 33 2c 20 72 61 6e 64 73 74 72 28 31 30 30  S(3, randstr(100
38e0: 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 20 20  0,1000));.      
38f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3900: 41 4c 55 45 53 28 34 2c 20 72 61 6e 64 73 74 72  ALUES(4, randstr
3910: 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20  (1000,1000));.  
3920: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3930: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 72 61 6e  t1 VALUES(5, ran
3940: 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 29  dstr(1000,1000))
3950: 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ;.      COMMIT;.
3960: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 20 7b      }.    expr {
3970: 5b 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41  [execsql {PRAGMA
3980: 20 70 61 67 65 5f 63 6f 75 6e 74 7d 5d 20 3e 20   page_count}] > 
3990: 31 30 7d 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 6f  10}.  } {1}.  do
39a0: 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 35 2e 24  _test backup-5.$
39b0: 69 54 65 73 74 2e 31 2e 32 20 7b 0a 20 20 20 20  iTest.1.2 {.    
39c0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42  sqlite3_backup B
39d0: 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69   db2 main db mai
39e0: 6e 0a 20 20 20 20 42 20 73 74 65 70 20 35 0a 20  n.    B step 5. 
39f0: 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 20   } {SQLITE_OK}. 
3a00: 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d   do_test backup-
3a10: 35 2e 24 69 54 65 73 74 2e 31 2e 33 20 7b 0a 20  5.$iTest.1.3 {. 
3a20: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44     execsql { UPD
3a30: 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 61  ATE t1 SET a = a
3a40: 20 2b 20 31 20 7d 20 24 77 72 69 74 65 72 0a 20   + 1 } $writer. 
3a50: 20 20 20 42 20 73 74 65 70 20 35 30 0a 20 20 7d     B step 50.  }
3a60: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 7d 0a 20   {SQLITE_DONE}. 
3a70: 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d   do_test backup-
3a80: 35 2e 24 69 54 65 73 74 2e 31 2e 34 20 7b 0a 20  5.$iTest.1.4 {. 
3a90: 20 20 20 42 20 66 69 6e 69 73 68 0a 20 20 7d 20     B finish.  } 
3aa0: 7b 53 51 4c 49 54 45 5f 4f 4b 7d 20 0a 20 20 69  {SQLITE_OK} .  i
3ab0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 62  ntegrity_check b
3ac0: 61 63 6b 75 70 2d 35 2e 24 69 54 65 73 74 2e 31  ackup-5.$iTest.1
3ad0: 2e 35 20 64 62 32 0a 20 20 74 65 73 74 5f 63 6f  .5 db2.  test_co
3ae0: 6e 74 65 6e 74 73 20 62 61 63 6b 75 70 2d 35 2e  ntents backup-5.
3af0: 24 69 54 65 73 74 2e 31 2e 36 20 64 62 20 6d 61  $iTest.1.6 db ma
3b00: 69 6e 20 64 62 32 20 6d 61 69 6e 0a 0a 20 20 64  in db2 main..  d
3b10: 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 35 2e  o_test backup-5.
3b20: 24 69 54 65 73 74 2e 32 2e 31 20 7b 0a 20 20 20  $iTest.2.1 {.   
3b30: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
3b40: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
3b50: 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 42  ze = 10;.      B
3b60: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
3b70: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
3b80: 54 20 27 27 2c 20 72 61 6e 64 73 74 72 28 31 30  T '', randstr(10
3b90: 30 30 2c 31 30 30 30 29 20 46 52 4f 4d 20 74 31  00,1000) FROM t1
3ba0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3bb0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 27 27  NTO t1 SELECT ''
3bc0: 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31  , randstr(1000,1
3bd0: 30 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  000) FROM t1;.  
3be0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3bf0: 74 31 20 53 45 4c 45 43 54 20 27 27 2c 20 72 61  t1 SELECT '', ra
3c00: 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29  ndstr(1000,1000)
3c10: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
3c20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
3c30: 45 4c 45 43 54 20 27 27 2c 20 72 61 6e 64 73 74  ELECT '', randst
3c40: 72 28 31 30 30 30 2c 31 30 30 30 29 20 46 52 4f  r(1000,1000) FRO
3c50: 4d 20 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d 4d  M t1;.      COMM
3c60: 49 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d  IT;.    }.  } {}
3c70: 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 75  .  do_test backu
3c80: 70 2d 35 2e 24 69 54 65 73 74 2e 32 2e 32 20 7b  p-5.$iTest.2.2 {
3c90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
3ca0: 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64  kup B db2 main d
3cb0: 62 20 6d 61 69 6e 0a 20 20 20 20 42 20 73 74 65  b main.    B ste
3cc0: 70 20 35 30 0a 20 20 7d 20 7b 53 51 4c 49 54 45  p 50.  } {SQLITE
3cd0: 5f 4f 4b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 62  _OK}.  do_test b
3ce0: 61 63 6b 75 70 2d 35 2e 24 69 54 65 73 74 2e 32  ackup-5.$iTest.2
3cf0: 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .3 {.    execsql
3d00: 20 7b 20 0a 20 20 20 20 20 20 42 45 47 49 4e 3b   { .      BEGIN;
3d10: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31  .      UPDATE t1
3d20: 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 3b 0a   SET a = a + 1;.
3d30: 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a        ROLLBACK;.
3d40: 20 20 20 20 7d 20 24 77 72 69 74 65 72 0a 20 20      } $writer.  
3d50: 20 20 42 20 73 74 65 70 20 35 30 30 30 0a 20 20    B step 5000.  
3d60: 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 7d 0a  } {SQLITE_DONE}.
3d70: 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70    do_test backup
3d80: 2d 35 2e 24 69 54 65 73 74 2e 32 2e 34 20 7b 0a  -5.$iTest.2.4 {.
3d90: 20 20 20 20 42 20 66 69 6e 69 73 68 0a 20 20 7d      B finish.  }
3da0: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 20 0a 20 20   {SQLITE_OK} .  
3db0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
3dc0: 62 61 63 6b 75 70 2d 35 2e 24 69 54 65 73 74 2e  backup-5.$iTest.
3dd0: 32 2e 35 20 64 62 32 0a 20 20 74 65 73 74 5f 63  2.5 db2.  test_c
3de0: 6f 6e 74 65 6e 74 73 20 62 61 63 6b 75 70 2d 35  ontents backup-5
3df0: 2e 24 69 54 65 73 74 2e 32 2e 36 20 64 62 20 6d  .$iTest.2.6 db m
3e00: 61 69 6e 20 64 62 32 20 6d 61 69 6e 0a 0a 20 20  ain db2 main..  
3e10: 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 35  do_test backup-5
3e20: 2e 24 69 54 65 73 74 2e 33 2e 31 20 7b 0a 20 20  .$iTest.3.1 {.  
3e30: 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41    execsql { UPDA
3e40: 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 72 61  TE t1 SET b = ra
3e50: 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29  ndstr(1000,1000)
3e60: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
3e70: 65 73 74 20 62 61 63 6b 75 70 2d 35 2e 24 69 54  est backup-5.$iT
3e80: 65 73 74 2e 33 2e 32 20 7b 0a 20 20 20 20 73 71  est.3.2 {.    sq
3e90: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64  lite3_backup B d
3ea0: 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a  b2 main db main.
3eb0: 20 20 20 20 42 20 73 74 65 70 20 35 30 0a 20 20      B step 50.  
3ec0: 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 20 20  } {SQLITE_OK}.  
3ed0: 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 35  do_test backup-5
3ee0: 2e 24 69 54 65 73 74 2e 33 2e 33 20 7b 0a 20 20  .$iTest.3.3 {.  
3ef0: 20 20 65 78 65 63 73 71 6c 20 7b 20 56 41 43 55    execsql { VACU
3f00: 55 4d 20 7d 20 24 77 72 69 74 65 72 0a 20 20 20  UM } $writer.   
3f10: 20 42 20 73 74 65 70 20 35 30 30 30 0a 20 20 7d   B step 5000.  }
3f20: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 7d 0a 20   {SQLITE_DONE}. 
3f30: 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d   do_test backup-
3f40: 35 2e 24 69 54 65 73 74 2e 33 2e 34 20 7b 0a 20  5.$iTest.3.4 {. 
3f50: 20 20 20 42 20 66 69 6e 69 73 68 0a 20 20 7d 20     B finish.  } 
3f60: 7b 53 51 4c 49 54 45 5f 4f 4b 7d 20 0a 20 20 69  {SQLITE_OK} .  i
3f70: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 62  ntegrity_check b
3f80: 61 63 6b 75 70 2d 35 2e 24 69 54 65 73 74 2e 33  ackup-5.$iTest.3
3f90: 2e 35 20 64 62 32 0a 20 20 74 65 73 74 5f 63 6f  .5 db2.  test_co
3fa0: 6e 74 65 6e 74 73 20 62 61 63 6b 75 70 2d 35 2e  ntents backup-5.
3fb0: 24 69 54 65 73 74 2e 33 2e 36 20 64 62 20 6d 61  $iTest.3.6 db ma
3fc0: 69 6e 20 64 62 32 20 6d 61 69 6e 0a 0a 20 20 64  in db2 main..  d
3fd0: 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 35 2e  o_test backup-5.
3fe0: 24 69 54 65 73 74 2e 34 2e 31 20 7b 0a 20 20 20  $iTest.4.1 {.   
3ff0: 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54   execsql { UPDAT
4000: 45 20 74 31 20 53 45 54 20 62 20 3d 20 72 61 6e  E t1 SET b = ran
4010: 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 20  dstr(1000,1000) 
4020: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
4030: 73 74 20 62 61 63 6b 75 70 2d 35 2e 24 69 54 65  st backup-5.$iTe
4040: 73 74 2e 34 2e 32 20 7b 0a 20 20 20 20 73 71 6c  st.4.2 {.    sql
4050: 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62  ite3_backup B db
4060: 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20  2 main db main. 
4070: 20 20 20 42 20 73 74 65 70 20 35 30 0a 20 20 7d     B step 50.  }
4080: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 20 20 64   {SQLITE_OK}.  d
4090: 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 35 2e  o_test backup-5.
40a0: 24 69 54 65 73 74 2e 34 2e 33 20 7b 0a 20 20 20  $iTest.4.3 {.   
40b0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
40c0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
40d0: 7a 65 20 3d 20 32 30 34 38 3b 0a 20 20 20 20 20  ze = 2048;.     
40e0: 20 56 41 43 55 55 4d 3b 0a 20 20 20 20 7d 20 24   VACUUM;.    } $
40f0: 77 72 69 74 65 72 0a 20 20 20 20 42 20 73 74 65  writer.    B ste
4100: 70 20 35 30 30 30 0a 20 20 7d 20 7b 53 51 4c 49  p 5000.  } {SQLI
4110: 54 45 5f 44 4f 4e 45 7d 0a 20 20 64 6f 5f 74 65  TE_DONE}.  do_te
4120: 73 74 20 62 61 63 6b 75 70 2d 35 2e 24 69 54 65  st backup-5.$iTe
4130: 73 74 2e 34 2e 34 20 7b 0a 20 20 20 20 42 20 66  st.4.4 {.    B f
4140: 69 6e 69 73 68 0a 20 20 7d 20 7b 53 51 4c 49 54  inish.  } {SQLIT
4150: 45 5f 4f 4b 7d 20 0a 20 20 69 6e 74 65 67 72 69  E_OK} .  integri
4160: 74 79 5f 63 68 65 63 6b 20 62 61 63 6b 75 70 2d  ty_check backup-
4170: 35 2e 24 69 54 65 73 74 2e 34 2e 35 20 64 62 32  5.$iTest.4.5 db2
4180: 0a 20 20 74 65 73 74 5f 63 6f 6e 74 65 6e 74 73  .  test_contents
4190: 20 62 61 63 6b 75 70 2d 35 2e 24 69 54 65 73 74   backup-5.$iTest
41a0: 2e 34 2e 36 20 64 62 20 6d 61 69 6e 20 64 62 32  .4.6 db main db2
41b0: 20 6d 61 69 6e 0a 0a 20 20 63 61 74 63 68 20 7b   main..  catch {
41c0: 64 62 20 63 6c 6f 73 65 7d 0a 20 20 63 61 74 63  db close}.  catc
41d0: 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d 0a 20 20  h {db2 close}.  
41e0: 63 61 74 63 68 20 7b 64 62 33 20 63 6c 6f 73 65  catch {db3 close
41f0: 7d 0a 20 20 63 61 74 63 68 20 7b 20 64 65 6c 65  }.  catch { dele
4200: 74 65 5f 66 69 6c 65 20 62 61 6b 2e 64 62 20 7d  te_file bak.db }
4210: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 62  .  sqlite3 db2 b
4220: 61 6b 2e 64 62 0a 20 20 63 61 74 63 68 20 7b 20  ak.db.  catch { 
4230: 64 65 6c 65 74 65 5f 66 69 6c 65 20 24 66 69 6c  delete_file $fil
4240: 65 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62  e }.  sqlite3 db
4250: 20 24 66 69 6c 65 0a 20 20 73 71 6c 69 74 65 33   $file.  sqlite3
4260: 20 64 62 33 20 24 66 69 6c 65 0a 20 20 64 6f 5f   db3 $file.  do_
4270: 74 65 73 74 20 62 61 63 6b 75 70 2d 35 2e 24 69  test backup-5.$i
4280: 54 65 73 74 2e 35 2e 31 20 7b 0a 20 20 20 20 65  Test.5.1 {.    e
4290: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50  xecsql {.      P
42a0: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
42b0: 6d 20 3d 20 69 6e 63 72 65 6d 65 6e 74 61 6c 3b  m = incremental;
42c0: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
42d0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
42e0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
42f0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
4300: 20 4f 4e 20 74 31 28 61 2c 20 62 29 3b 0a 20 20   ON t1(a, b);.  
4310: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4320: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e  t1 VALUES(1, ran
4330: 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 29  dstr(1000,1000))
4340: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
4350: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c  NTO t1 VALUES(2,
4360: 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30   randstr(1000,10
4370: 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  00));.      INSE
4380: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
4390: 53 28 33 2c 20 72 61 6e 64 73 74 72 28 31 30 30  S(3, randstr(100
43a0: 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 20 20  0,1000));.      
43b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
43c0: 41 4c 55 45 53 28 34 2c 20 72 61 6e 64 73 74 72  ALUES(4, randstr
43d0: 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20  (1000,1000));.  
43e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
43f0: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 72 61 6e  t1 VALUES(5, ran
4400: 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 29  dstr(1000,1000))
4410: 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ;.      COMMIT;.
4420: 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64      }.  } {}.  d
4430: 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 35 2e  o_test backup-5.
4440: 24 69 54 65 73 74 2e 35 2e 32 20 7b 0a 20 20 20  $iTest.5.2 {.   
4450: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
4460: 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61  B db2 main db ma
4470: 69 6e 0a 20 20 20 20 42 20 73 74 65 70 20 38 0a  in.    B step 8.
4480: 20 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a    } {SQLITE_OK}.
4490: 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70    do_test backup
44a0: 2d 35 2e 24 69 54 65 73 74 2e 35 2e 33 20 7b 0a  -5.$iTest.5.3 {.
44b0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20      execsql { . 
44c0: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
44d0: 20 74 31 3b 0a 20 20 20 20 20 20 50 52 41 47 4d   t1;.      PRAGM
44e0: 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61  A incremental_va
44f0: 63 75 75 6d 3b 0a 20 20 20 20 7d 20 24 77 72 69  cuum;.    } $wri
4500: 74 65 72 0a 20 20 20 20 42 20 73 74 65 70 20 35  ter.    B step 5
4510: 30 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 44 4f  0.  } {SQLITE_DO
4520: 4e 45 7d 0a 20 20 64 6f 5f 74 65 73 74 20 62 61  NE}.  do_test ba
4530: 63 6b 75 70 2d 35 2e 24 69 54 65 73 74 2e 35 2e  ckup-5.$iTest.5.
4540: 34 20 7b 0a 20 20 20 20 42 20 66 69 6e 69 73 68  4 {.    B finish
4550: 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d  .  } {SQLITE_OK}
4560: 20 0a 20 20 69 6e 74 65 67 72 69 74 79 5f 63 68   .  integrity_ch
4570: 65 63 6b 20 62 61 63 6b 75 70 2d 35 2e 24 69 54  eck backup-5.$iT
4580: 65 73 74 2e 35 2e 35 20 64 62 32 0a 20 20 74 65  est.5.5 db2.  te
4590: 73 74 5f 63 6f 6e 74 65 6e 74 73 20 62 61 63 6b  st_contents back
45a0: 75 70 2d 35 2e 24 69 54 65 73 74 2e 35 2e 36 20  up-5.$iTest.5.6 
45b0: 64 62 20 6d 61 69 6e 20 64 62 32 20 6d 61 69 6e  db main db2 main
45c0: 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f  .  catch {db clo
45d0: 73 65 7d 0a 20 20 63 61 74 63 68 20 7b 64 62 32  se}.  catch {db2
45e0: 20 63 6c 6f 73 65 7d 0a 20 20 63 61 74 63 68 20   close}.  catch 
45f0: 7b 64 62 33 20 63 6c 6f 73 65 7d 0a 7d 0a 23 0a  {db3 close}.}.#.
4600: 23 20 45 6e 64 20 6f 66 20 62 61 63 6b 75 70 2d  # End of backup-
4610: 35 2e 2a 20 74 65 73 74 73 2e 0a 23 2d 2d 2d 2d  5.* tests..#----
4620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 23 20 54 65 73 74  ---------.# Test
46b0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 61 63   the sqlite3_bac
46c0: 6b 75 70 5f 72 65 6d 61 69 6e 69 6e 67 28 29 20  kup_remaining() 
46d0: 61 6e 64 20 62 61 63 6b 75 70 5f 70 61 67 65 63  and backup_pagec
46e0: 6f 75 6e 74 28 29 20 41 50 49 73 2e 0a 23 0a 64  ount() APIs..#.d
46f0: 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 36 2e  o_test backup-6.
4700: 31 20 7b 0a 20 20 63 61 74 63 68 20 7b 20 66 6f  1 {.  catch { fo
4710: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
4720: 62 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 66 6f  b }.  catch { fo
4730: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e  rcedelete test2.
4740: 64 62 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64  db }.  sqlite3 d
4750: 62 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69  b test.db.  sqli
4760: 74 65 33 20 64 62 32 20 74 65 73 74 32 2e 64 62  te3 db2 test2.db
4770: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
4780: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
4790: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
47a0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
47b0: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20  DEX i1 ON t1(a, 
47c0: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
47d0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
47e0: 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30   randstr(1000,10
47f0: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
4800: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
4810: 32 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c  2, randstr(1000,
4820: 31 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  1000));.    INSE
4830: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
4840: 53 28 33 2c 20 72 61 6e 64 73 74 72 28 31 30 30  S(3, randstr(100
4850: 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 49 4e  0,1000));.    IN
4860: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4870: 55 45 53 28 34 2c 20 72 61 6e 64 73 74 72 28 31  UES(4, randstr(1
4880: 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20  000,1000));.    
4890: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
48a0: 41 4c 55 45 53 28 35 2c 20 72 61 6e 64 73 74 72  ALUES(5, randstr
48b0: 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20  (1000,1000));.  
48c0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
48d0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75  {}.do_test backu
48e0: 70 2d 36 2e 32 20 7b 0a 20 20 73 65 74 20 6e 54  p-6.2 {.  set nT
48f0: 6f 74 61 6c 20 5b 65 78 70 72 20 7b 5b 66 69 6c  otal [expr {[fil
4900: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f  e size test.db]/
4910: 31 30 32 34 7d 5d 0a 20 20 73 71 6c 69 74 65 33  1024}].  sqlite3
4920: 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61  _backup B db2 ma
4930: 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73  in db main.  B s
4940: 74 65 70 20 31 0a 7d 20 7b 53 51 4c 49 54 45 5f  tep 1.} {SQLITE_
4950: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b  OK}.do_test back
4960: 75 70 2d 36 2e 33 20 7b 0a 20 20 42 20 70 61 67  up-6.3 {.  B pag
4970: 65 63 6f 75 6e 74 0a 7d 20 24 6e 54 6f 74 61 6c  ecount.} $nTotal
4980: 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d  .do_test backup-
4990: 36 2e 34 20 7b 0a 20 20 42 20 72 65 6d 61 69 6e  6.4 {.  B remain
49a0: 69 6e 67 0a 7d 20 5b 65 78 70 72 20 24 6e 54 6f  ing.} [expr $nTo
49b0: 74 61 6c 2d 31 5d 0a 64 6f 5f 74 65 73 74 20 62  tal-1].do_test b
49c0: 61 63 6b 75 70 2d 36 2e 35 20 7b 0a 20 20 42 20  ackup-6.5 {.  B 
49d0: 73 74 65 70 20 35 0a 20 20 6c 69 73 74 20 5b 42  step 5.  list [B
49e0: 20 72 65 6d 61 69 6e 69 6e 67 5d 20 5b 42 20 70   remaining] [B p
49f0: 61 67 65 63 6f 75 6e 74 5d 0a 7d 20 5b 6c 69 73  agecount].} [lis
4a00: 74 20 5b 65 78 70 72 20 24 6e 54 6f 74 61 6c 2d  t [expr $nTotal-
4a10: 36 5d 20 24 6e 54 6f 74 61 6c 5d 0a 64 6f 5f 74  6] $nTotal].do_t
4a20: 65 73 74 20 62 61 63 6b 75 70 2d 36 2e 36 20 7b  est backup-6.6 {
4a30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45  .  execsql { CRE
4a40: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 50  ATE TABLE t2(a P
4a50: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 20 7d  RIMARY KEY, b) }
4a60: 0a 20 20 42 20 73 74 65 70 20 31 0a 20 20 6c 69  .  B step 1.  li
4a70: 73 74 20 5b 42 20 72 65 6d 61 69 6e 69 6e 67 5d  st [B remaining]
4a80: 20 5b 42 20 70 61 67 65 63 6f 75 6e 74 5d 0a 7d   [B pagecount].}
4a90: 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 24 6e 54   [list [expr $nT
4aa0: 6f 74 61 6c 2d 35 5d 20 5b 65 78 70 72 20 24 6e  otal-5] [expr $n
4ab0: 54 6f 74 61 6c 2b 32 5d 5d 0a 0a 64 6f 5f 74 65  Total+2]]..do_te
4ac0: 73 74 20 62 61 63 6b 75 70 2d 36 2e 58 20 7b 0a  st backup-6.X {.
4ad0: 20 20 42 20 66 69 6e 69 73 68 0a 7d 20 7b 53 51    B finish.} {SQ
4ae0: 4c 49 54 45 5f 4f 4b 7d 0a 0a 63 61 74 63 68 20  LITE_OK}..catch 
4af0: 7b 64 62 20 63 6c 6f 73 65 7d 0a 63 61 74 63 68  {db close}.catch
4b00: 20 7b 64 62 32 20 63 6c 6f 73 65 7d 0a 0a 23 2d   {db2 close}..#-
4b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74 20 63 61 73 65  ----.# Test case
4b60: 73 20 62 61 63 6b 75 70 2d 37 2e 2a 20 74 65 73  s backup-7.* tes
4b70: 74 20 74 68 61 74 20 53 51 4c 49 54 45 5f 42 55  t that SQLITE_BU
4b80: 53 59 20 61 6e 64 20 53 51 4c 49 54 45 5f 4c 4f  SY and SQLITE_LO
4b90: 43 4b 45 44 20 65 72 72 6f 72 73 0a 23 20 61 72  CKED errors.# ar
4ba0: 65 20 72 65 74 75 72 6e 65 64 20 63 6f 72 72 65  e returned corre
4bb0: 63 74 6c 79 3a 0a 23 0a 23 20 62 61 63 6b 75 70  ctly:.#.# backup
4bc0: 2d 37 2e 31 2e 2a 3a 20 53 6f 75 72 63 65 20 64  -7.1.*: Source d
4bd0: 61 74 61 62 61 73 65 20 69 73 20 65 78 74 65 72  atabase is exter
4be0: 6e 61 6c 6c 79 20 6c 6f 63 6b 65 64 20 28 72 65  nally locked (re
4bf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
4c00: 29 2e 0a 23 0a 23 20 62 61 63 6b 75 70 2d 37 2e  )..#.# backup-7.
4c10: 32 2e 2a 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  2.*: Attempt to 
4c20: 73 74 65 70 20 74 68 65 20 62 61 63 6b 75 70 20  step the backup 
4c30: 70 72 6f 63 65 73 73 20 77 68 69 6c 65 20 61 20  process while a 
4c40: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
4c50: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
4c60: 6f 6e 20 69 73 20 75 6e 64 65 72 77 61 79 20 6f  on is underway o
4c70: 6e 20 74 68 65 20 73 6f 75 72 63 65 20 70 61 67  n the source pag
4c80: 65 72 20 28 72 65 74 75 72 6e 0a 23 20 20 20 20  er (return.#    
4c90: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
4ca0: 45 5f 4c 4f 43 4b 45 44 29 2e 0a 23 0a 23 20 62  E_LOCKED)..#.# b
4cb0: 61 63 6b 75 70 2d 37 2e 33 2e 2a 3a 20 44 65 73  ackup-7.3.*: Des
4cc0: 74 69 6e 61 74 69 6f 6e 20 64 61 74 61 62 61 73  tination databas
4cd0: 65 20 69 73 20 65 78 74 65 72 6e 61 6c 6c 79 20  e is externally 
4ce0: 6c 6f 63 6b 65 64 20 28 72 65 74 75 72 6e 20 53  locked (return S
4cf0: 51 4c 49 54 45 5f 42 55 53 59 29 2e 0a 23 0a 64  QLITE_BUSY)..#.d
4d00: 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 37 2e  o_test backup-7.
4d10: 30 20 7b 0a 20 20 63 61 74 63 68 20 7b 20 66 6f  0 {.  catch { fo
4d20: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
4d30: 62 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 66 6f  b }.  catch { fo
4d40: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e  rcedelete test2.
4d50: 64 62 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64  db }.  sqlite3 d
4d60: 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 73 71  b2 test2.db.  sq
4d70: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
4d80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
4d90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
4da0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
4db0: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
4dc0: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  1(a, b);.    INS
4dd0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4de0: 45 53 28 31 2c 20 72 61 6e 64 73 74 72 28 31 30  ES(1, randstr(10
4df0: 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 49  00,1000));.    I
4e00: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
4e10: 4c 45 43 54 20 61 2b 20 31 2c 20 72 61 6e 64 73  LECT a+ 1, rands
4e20: 74 72 28 31 30 30 30 2c 31 30 30 30 29 20 46 52  tr(1000,1000) FR
4e30: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
4e40: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
4e50: 20 61 2b 20 32 2c 20 72 61 6e 64 73 74 72 28 31   a+ 2, randstr(1
4e60: 30 30 30 2c 31 30 30 30 29 20 46 52 4f 4d 20 74  000,1000) FROM t
4e70: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
4e80: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b 20  TO t1 SELECT a+ 
4e90: 34 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c  4, randstr(1000,
4ea0: 31 30 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1000) FROM t1;. 
4eb0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4ec0: 31 20 53 45 4c 45 43 54 20 61 2b 20 38 2c 20 72  1 SELECT a+ 8, r
4ed0: 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30  andstr(1000,1000
4ee0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
4ef0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
4f00: 4c 45 43 54 20 61 2b 31 36 2c 20 72 61 6e 64 73  LECT a+16, rands
4f10: 74 72 28 31 30 30 30 2c 31 30 30 30 29 20 46 52  tr(1000,1000) FR
4f20: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
4f30: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
4f40: 20 61 2b 33 32 2c 20 72 61 6e 64 73 74 72 28 31   a+32, randstr(1
4f50: 30 30 30 2c 31 30 30 30 29 20 46 52 4f 4d 20 74  000,1000) FROM t
4f60: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
4f70: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b 36  TO t1 SELECT a+6
4f80: 34 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c  4, randstr(1000,
4f90: 31 30 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1000) FROM t1;. 
4fa0: 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74   }.} {}..do_test
4fb0: 20 62 61 63 6b 75 70 2d 37 2e 31 2e 31 20 7b 0a   backup-7.1.1 {.
4fc0: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
4fd0: 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d   B db2 main db m
4fe0: 61 69 6e 0a 20 20 42 20 73 74 65 70 20 35 0a 7d  ain.  B step 5.}
4ff0: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f   {SQLITE_OK}.do_
5000: 74 65 73 74 20 62 61 63 6b 75 70 2d 37 2e 31 2e  test backup-7.1.
5010: 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  2 {.  sqlite3 db
5020: 33 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  3 test.db.  exec
5030: 73 71 6c 20 7b 20 42 45 47 49 4e 20 45 58 43 4c  sql { BEGIN EXCL
5040: 55 53 49 56 45 20 7d 20 64 62 33 0a 20 20 42 20  USIVE } db3.  B 
5050: 73 74 65 70 20 35 0a 7d 20 7b 53 51 4c 49 54 45  step 5.} {SQLITE
5060: 5f 42 55 53 59 7d 0a 64 6f 5f 74 65 73 74 20 62  _BUSY}.do_test b
5070: 61 63 6b 75 70 2d 37 2e 31 2e 33 20 7b 0a 20 20  ackup-7.1.3 {.  
5080: 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42 41  execsql { ROLLBA
5090: 43 4b 20 7d 20 64 62 33 0a 20 20 42 20 73 74 65  CK } db3.  B ste
50a0: 70 20 35 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b  p 5.} {SQLITE_OK
50b0: 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70  }.do_test backup
50c0: 2d 37 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73  -7.2.1 {.  execs
50d0: 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b  ql { .    BEGIN;
50e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
50f0: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 34 29   t1 VALUES(1, 4)
5100: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
5110: 73 74 20 62 61 63 6b 75 70 2d 37 2e 32 2e 32 20  st backup-7.2.2 
5120: 7b 0a 20 20 42 20 73 74 65 70 20 35 30 30 30 0a  {.  B step 5000.
5130: 7d 20 7b 53 51 4c 49 54 45 5f 42 55 53 59 7d 0a  } {SQLITE_BUSY}.
5140: 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 37  do_test backup-7
5150: 2e 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .2.3 {.  execsql
5160: 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d 0a 20 20   { ROLLBACK }.  
5170: 42 20 73 74 65 70 20 35 30 30 30 0a 7d 20 7b 53  B step 5000.} {S
5180: 51 4c 49 54 45 5f 44 4f 4e 45 7d 0a 64 6f 5f 74  QLITE_DONE}.do_t
5190: 65 73 74 20 62 61 63 6b 75 70 2d 37 2e 32 2e 34  est backup-7.2.4
51a0: 20 7b 0a 20 20 42 20 66 69 6e 69 73 68 0a 7d 20   {.  B finish.} 
51b0: 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 74 65 73 74  {SQLITE_OK}.test
51c0: 5f 63 6f 6e 74 65 6e 74 73 20 62 61 63 6b 75 70  _contents backup
51d0: 2d 37 2e 32 2e 35 20 64 62 20 6d 61 69 6e 20 64  -7.2.5 db main d
51e0: 62 32 20 6d 61 69 6e 0a 69 6e 74 65 67 72 69 74  b2 main.integrit
51f0: 79 5f 63 68 65 63 6b 20 62 61 63 6b 75 70 2d 37  y_check backup-7
5200: 2e 33 2e 36 20 64 62 32 0a 0a 64 6f 5f 74 65 73  .3.6 db2..do_tes
5210: 74 20 62 61 63 6b 75 70 2d 37 2e 33 2e 31 20 7b  t backup-7.3.1 {
5220: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 64  .  db2 close.  d
5230: 62 33 20 63 6c 6f 73 65 0a 20 20 66 6f 72 63 65  b3 close.  force
5240: 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64 62 0a  delete test2.db.
5250: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
5260: 73 74 32 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  st2.db.  sqlite3
5270: 20 64 62 33 20 74 65 73 74 32 2e 64 62 0a 0a 20   db3 test2.db.. 
5280: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
5290: 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61  B db2 main db ma
52a0: 69 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 42  in.  execsql { B
52b0: 45 47 49 4e 20 3b 20 43 52 45 41 54 45 20 54 41  EGIN ; CREATE TA
52c0: 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 20 7d 20  BLE t2(a, b); } 
52d0: 64 62 33 0a 0a 20 20 42 20 73 74 65 70 20 35 0a  db3..  B step 5.
52e0: 7d 20 7b 53 51 4c 49 54 45 5f 42 55 53 59 7d 0a  } {SQLITE_BUSY}.
52f0: 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 37  do_test backup-7
5300: 2e 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.2 {.  execsql
5310: 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 64 62 33 0a   { COMMIT } db3.
5320: 20 20 42 20 73 74 65 70 20 35 30 30 30 0a 7d 20    B step 5000.} 
5330: 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 7d 0a 64 6f  {SQLITE_DONE}.do
5340: 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 37 2e 33  _test backup-7.3
5350: 2e 33 20 7b 0a 20 20 42 20 66 69 6e 69 73 68 0a  .3 {.  B finish.
5360: 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 74 65  } {SQLITE_OK}.te
5370: 73 74 5f 63 6f 6e 74 65 6e 74 73 20 62 61 63 6b  st_contents back
5380: 75 70 2d 37 2e 33 2e 34 20 64 62 20 6d 61 69 6e  up-7.3.4 db main
5390: 20 64 62 32 20 6d 61 69 6e 0a 69 6e 74 65 67 72   db2 main.integr
53a0: 69 74 79 5f 63 68 65 63 6b 20 62 61 63 6b 75 70  ity_check backup
53b0: 2d 37 2e 33 2e 35 20 64 62 32 0a 63 61 74 63 68  -7.3.5 db2.catch
53c0: 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 63   { db2 close }.c
53d0: 61 74 63 68 20 7b 20 64 62 33 20 63 6c 6f 73 65  atch { db3 close
53e0: 20 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   }..#-----------
53f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5410: 2d 2d 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 0a 23 20 54  ------------.# T
5430: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
5440: 74 73 2c 20 62 61 63 6b 75 70 2d 38 2e 2a 2c 20  ts, backup-8.*, 
5450: 74 65 73 74 20 61 74 74 61 63 68 69 6e 67 20 6d  test attaching m
5460: 75 6c 74 69 70 6c 65 20 62 61 63 6b 75 70 0a 23  ultiple backup.#
5470: 20 70 72 6f 63 65 73 73 65 73 20 74 6f 20 74 68   processes to th
5480: 65 20 73 61 6d 65 20 73 6f 75 72 63 65 20 64 61  e same source da
5490: 74 61 62 61 73 65 2e 20 41 6c 73 6f 2c 20 72 65  tabase. Also, re
54a0: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 73  ading from the s
54b0: 6f 75 72 63 65 0a 23 20 64 61 74 61 62 61 73 65  ource.# database
54c0: 20 77 68 69 6c 65 20 61 20 72 65 61 64 20 74 72   while a read tr
54d0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
54e0: 69 76 65 2e 0a 23 0a 23 20 54 68 65 73 65 20 74  ive..#.# These t
54f0: 65 73 74 73 20 72 65 75 73 65 20 74 68 65 20 64  ests reuse the d
5500: 61 74 61 62 61 73 65 20 22 74 65 73 74 2e 64 62  atabase "test.db
5510: 22 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  " left over from
5520: 20 62 61 63 6b 75 70 2d 37 2e 2a 2e 0a 23 0a 64   backup-7.*..#.d
5530: 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 38 2e  o_test backup-8.
5540: 31 20 7b 0a 20 20 63 61 74 63 68 20 7b 20 66 6f  1 {.  catch { fo
5550: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e  rcedelete test2.
5560: 64 62 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 66  db }.  catch { f
5570: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 33  orcedelete test3
5580: 2e 64 62 20 7d 0a 20 20 73 71 6c 69 74 65 33 20  .db }.  sqlite3 
5590: 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 73  db2 test2.db.  s
55a0: 71 6c 69 74 65 33 20 64 62 33 20 74 65 73 74 33  qlite3 db3 test3
55b0: 2e 64 62 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62  .db..  sqlite3_b
55c0: 61 63 6b 75 70 20 42 32 20 64 62 32 20 6d 61 69  ackup B2 db2 mai
55d0: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 73 71 6c 69  n db main.  sqli
55e0: 74 65 33 5f 62 61 63 6b 75 70 20 42 33 20 64 62  te3_backup B3 db
55f0: 33 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20  3 main db main. 
5600: 20 6c 69 73 74 20 5b 42 32 20 66 69 6e 69 73 68   list [B2 finish
5610: 5d 20 5b 42 33 20 66 69 6e 69 73 68 5d 0a 7d 20  ] [B3 finish].} 
5620: 7b 53 51 4c 49 54 45 5f 4f 4b 20 53 51 4c 49 54  {SQLITE_OK SQLIT
5630: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 62 61  E_OK}.do_test ba
5640: 63 6b 75 70 2d 38 2e 32 20 7b 0a 20 20 73 71 6c  ckup-8.2 {.  sql
5650: 69 74 65 33 5f 62 61 63 6b 75 70 20 42 33 20 64  ite3_backup B3 d
5660: 62 33 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a  b3 main db main.
5670: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
5680: 20 42 32 20 64 62 32 20 6d 61 69 6e 20 64 62 20   B2 db2 main db 
5690: 6d 61 69 6e 0a 20 20 6c 69 73 74 20 5b 42 32 20  main.  list [B2 
56a0: 66 69 6e 69 73 68 5d 20 5b 42 33 20 66 69 6e 69  finish] [B3 fini
56b0: 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b  sh].} {SQLITE_OK
56c0: 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74   SQLITE_OK}.do_t
56d0: 65 73 74 20 62 61 63 6b 75 70 2d 38 2e 33 20 7b  est backup-8.3 {
56e0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
56f0: 70 20 42 32 20 64 62 32 20 6d 61 69 6e 20 64 62  p B2 db2 main db
5700: 20 6d 61 69 6e 0a 20 20 73 71 6c 69 74 65 33 5f   main.  sqlite3_
5710: 62 61 63 6b 75 70 20 42 33 20 64 62 33 20 6d 61  backup B3 db3 ma
5720: 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 32 20  in db main.  B2 
5730: 73 74 65 70 20 35 0a 7d 20 7b 53 51 4c 49 54 45  step 5.} {SQLITE
5740: 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63  _OK}.do_test bac
5750: 6b 75 70 2d 38 2e 34 20 7b 0a 20 20 65 78 65 63  kup-8.4 {.  exec
5760: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
5770: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
5780: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
5790: 3b 0a 20 20 7d 0a 20 20 42 33 20 73 74 65 70 20  ;.  }.  B3 step 
57a0: 35 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  5.} {SQLITE_OK}.
57b0: 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 38  do_test backup-8
57c0: 2e 35 20 7b 0a 20 20 6c 69 73 74 20 5b 42 33 20  .5 {.  list [B3 
57d0: 73 74 65 70 20 35 30 30 30 5d 20 5b 42 33 20 66  step 5000] [B3 f
57e0: 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45  inish].} {SQLITE
57f0: 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d  _DONE SQLITE_OK}
5800: 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d  .do_test backup-
5810: 38 2e 36 20 7b 0a 20 20 6c 69 73 74 20 5b 42 32  8.6 {.  list [B2
5820: 20 73 74 65 70 20 35 30 30 30 5d 20 5b 42 32 20   step 5000] [B2 
5830: 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54  finish].} {SQLIT
5840: 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b  E_DONE SQLITE_OK
5850: 7d 0a 74 65 73 74 5f 63 6f 6e 74 65 6e 74 73 20  }.test_contents 
5860: 62 61 63 6b 75 70 2d 38 2e 37 20 64 62 20 6d 61  backup-8.7 db ma
5870: 69 6e 20 64 62 32 20 6d 61 69 6e 0a 74 65 73 74  in db2 main.test
5880: 5f 63 6f 6e 74 65 6e 74 73 20 62 61 63 6b 75 70  _contents backup
5890: 2d 38 2e 38 20 64 62 20 6d 61 69 6e 20 64 62 33  -8.8 db main db3
58a0: 20 6d 61 69 6e 0a 64 6f 5f 74 65 73 74 20 62 61   main.do_test ba
58b0: 63 6b 75 70 2d 38 2e 39 20 7b 0a 20 20 65 78 65  ckup-8.9 {.  exe
58c0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6c 6f  csql { PRAGMA lo
58d0: 63 6b 5f 73 74 61 74 75 73 20 7d 0a 7d 20 7b 6d  ck_status }.} {m
58e0: 61 69 6e 20 73 68 61 72 65 64 20 74 65 6d 70 20  ain shared temp 
58f0: 63 6c 6f 73 65 64 7d 0a 64 6f 5f 74 65 73 74 20  closed}.do_test 
5900: 62 61 63 6b 75 70 2d 38 2e 31 30 20 7b 0a 20 20  backup-8.10 {.  
5910: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d  execsql COMMIT.}
5920: 20 7b 7d 0a 63 61 74 63 68 20 7b 20 64 62 32 20   {}.catch { db2 
5930: 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20 7b 20  close }.catch { 
5940: 64 62 33 20 63 6c 6f 73 65 20 7d 0a 0a 23 2d 2d  db3 close }..#--
5950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5990: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
59a0: 6f 77 69 6e 67 20 74 65 73 74 73 2c 20 62 61 63  owing tests, bac
59b0: 6b 75 70 2d 39 2e 2a 2c 20 74 65 73 74 20 74 68  kup-9.*, test th
59c0: 61 74 3a 0a 23 20 0a 23 20 20 20 2a 20 50 61 73  at:.# .#   * Pas
59d0: 73 69 6e 67 20 30 20 61 73 20 61 6e 20 61 72 67  sing 0 as an arg
59e0: 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33  ument to sqlite3
59f0: 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 29 20 6d  _backup_step() m
5a00: 65 61 6e 73 20 6e 6f 20 70 61 67 65 73 0a 23 20  eans no pages.# 
5a10: 20 20 20 20 61 72 65 20 62 61 63 6b 65 64 20 75      are backed u
5a20: 70 20 28 62 61 63 6b 75 70 2d 39 2e 31 2e 2a 29  p (backup-9.1.*)
5a30: 2c 20 61 6e 64 20 0a 23 20 20 20 2a 20 50 61 73  , and .#   * Pas
5a40: 73 69 6e 67 20 61 20 6e 65 67 61 74 69 76 65 20  sing a negative 
5a50: 76 61 6c 75 65 20 61 73 20 61 6e 20 61 72 67 75  value as an argu
5a60: 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 5f  ment to sqlite3_
5a70: 62 61 63 6b 75 70 5f 73 74 65 70 28 29 20 6d 65  backup_step() me
5a80: 61 6e 73 20 0a 23 20 20 20 20 20 61 6c 6c 20 70  ans .#     all p
5a90: 61 67 65 73 20 61 72 65 20 62 61 63 6b 65 64 20  ages are backed 
5aa0: 75 70 20 28 62 61 63 6b 75 70 2d 39 2e 32 2e 2a  up (backup-9.2.*
5ab0: 29 2e 0a 23 0a 23 20 54 68 65 73 65 20 74 65 73  )..#.# These tes
5ac0: 74 73 20 72 65 75 73 65 20 74 68 65 20 64 61 74  ts reuse the dat
5ad0: 61 62 61 73 65 20 22 74 65 73 74 2e 64 62 22 20  abase "test.db" 
5ae0: 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 62  left over from b
5af0: 61 63 6b 75 70 2d 37 2e 2a 2e 0a 23 20 0a 64 6f  ackup-7.*..# .do
5b00: 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 39 2e 31  _test backup-9.1
5b10: 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  .1 {.  sqlite3 d
5b20: 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 73 71  b2 test2.db.  sq
5b30: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64  lite3_backup B d
5b40: 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a  b2 main db main.
5b50: 20 20 42 20 73 74 65 70 20 31 0a 7d 20 7b 53 51    B step 1.} {SQ
5b60: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
5b70: 20 62 61 63 6b 75 70 2d 39 2e 31 2e 32 20 7b 0a   backup-9.1.2 {.
5b80: 20 20 73 65 74 20 6e 52 65 6d 61 69 6e 69 6e 67    set nRemaining
5b90: 20 5b 42 20 72 65 6d 61 69 6e 69 6e 67 5d 0a 20   [B remaining]. 
5ba0: 20 65 78 70 72 20 7b 24 6e 52 65 6d 61 69 6e 69   expr {$nRemaini
5bb0: 6e 67 3e 31 30 30 7d 0a 7d 20 7b 31 7d 0a 64 6f  ng>100}.} {1}.do
5bc0: 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 39 2e 31  _test backup-9.1
5bd0: 2e 33 20 7b 0a 20 20 42 20 73 74 65 70 20 30 0a  .3 {.  B step 0.
5be0: 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f  } {SQLITE_OK}.do
5bf0: 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 39 2e 31  _test backup-9.1
5c00: 2e 34 20 7b 0a 20 20 42 20 72 65 6d 61 69 6e 69  .4 {.  B remaini
5c10: 6e 67 0a 7d 20 24 6e 52 65 6d 61 69 6e 69 6e 67  ng.} $nRemaining
5c20: 0a 0a 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70  ..do_test backup
5c30: 2d 39 2e 32 2e 31 20 7b 0a 20 20 42 20 73 74 65  -9.2.1 {.  B ste
5c40: 70 20 2d 31 0a 7d 20 7b 53 51 4c 49 54 45 5f 44  p -1.} {SQLITE_D
5c50: 4f 4e 45 7d 0a 64 6f 5f 74 65 73 74 20 62 61 63  ONE}.do_test bac
5c60: 6b 75 70 2d 39 2e 32 2e 32 20 7b 0a 20 20 42 20  kup-9.2.2 {.  B 
5c70: 72 65 6d 61 69 6e 69 6e 67 0a 7d 20 7b 30 7d 0a  remaining.} {0}.
5c80: 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 39  do_test backup-9
5c90: 2e 32 2e 33 20 7b 0a 20 20 42 20 66 69 6e 69 73  .2.3 {.  B finis
5ca0: 68 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  h.} {SQLITE_OK}.
5cb0: 63 61 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65  catch {db2 close
5cc0: 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 6d 65 6d  }..ifcapable mem
5cd0: 6f 72 79 6d 61 6e 61 67 65 20 7b 0a 20 20 64 62  orymanage {.  db
5ce0: 20 63 6c 6f 73 65 0a 20 20 66 6f 72 63 65 64 65   close.  forcede
5cf0: 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 20 20 66  lete test.db.  f
5d00: 6f 72 63 65 64 65 6c 65 74 65 20 62 61 6b 2e 64  orcedelete bak.d
5d10: 62 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  b..  sqlite3 db 
5d20: 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65  test.db.  sqlite
5d30: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
5d40: 73 71 6c 69 74 65 33 20 64 62 33 20 62 61 6b 2e  sqlite3 db3 bak.
5d50: 64 62 0a 0a 20 20 64 6f 5f 74 65 73 74 20 62 61  db..  do_test ba
5d60: 63 6b 75 70 2d 31 30 2e 31 2e 31 20 7b 0a 20 20  ckup-10.1.1 {.  
5d70: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5d80: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43    BEGIN;.      C
5d90: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
5da0: 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  , b);.      INSE
5db0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
5dc0: 53 28 31 2c 20 72 61 6e 64 73 74 72 28 31 30 30  S(1, randstr(100
5dd0: 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 20 20  0,1000));.      
5de0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5df0: 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 73 74 72  ALUES(2, randstr
5e00: 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20  (1000,1000));.  
5e10: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5e20: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 72 61 6e  t1 VALUES(3, ran
5e30: 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29 29  dstr(1000,1000))
5e40: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
5e50: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c  NTO t1 VALUES(4,
5e60: 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30   randstr(1000,10
5e70: 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  00));.      INSE
5e80: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
5e90: 53 28 35 2c 20 72 61 6e 64 73 74 72 28 31 30 30  S(5, randstr(100
5ea0: 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 20 20  0,1000));.      
5eb0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
5ec0: 4f 4e 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  ON t1(a, b);.   
5ed0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
5ee0: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
5ef0: 74 20 62 61 63 6b 75 70 2d 31 30 2e 31 2e 32 20  t backup-10.1.2 
5f00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  {.    sqlite3_ba
5f10: 63 6b 75 70 20 42 20 64 62 33 20 6d 61 69 6e 20  ckup B db3 main 
5f20: 64 62 32 20 6d 61 69 6e 0a 20 20 20 20 42 20 73  db2 main.    B s
5f30: 74 65 70 20 35 0a 20 20 7d 20 7b 53 51 4c 49 54  tep 5.  } {SQLIT
5f40: 45 5f 4f 4b 7d 0a 20 20 64 6f 5f 74 65 73 74 20  E_OK}.  do_test 
5f50: 62 61 63 6b 75 70 2d 31 30 2e 31 2e 33 20 7b 0a  backup-10.1.3 {.
5f60: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
5f70: 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45      UPDATE t1 SE
5f80: 54 20 62 20 3d 20 72 61 6e 64 73 74 72 28 35 30  T b = randstr(50
5f90: 30 2c 35 30 30 29 3b 0a 20 20 20 20 7d 0a 20 20  0,500);.    }.  
5fa0: 7d 20 7b 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  } {}.  sqlite3_r
5fb0: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 5b 65  elease_memory [e
5fc0: 78 70 72 20 31 30 32 34 2a 31 30 32 34 5d 0a 20  xpr 1024*1024]. 
5fd0: 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d   do_test backup-
5fe0: 31 30 2e 31 2e 33 20 7b 0a 20 20 20 20 42 20 73  10.1.3 {.    B s
5ff0: 74 65 70 20 35 30 0a 20 20 7d 20 7b 53 51 4c 49  tep 50.  } {SQLI
6000: 54 45 5f 44 4f 4e 45 7d 0a 20 20 64 6f 5f 74 65  TE_DONE}.  do_te
6010: 73 74 20 62 61 63 6b 75 70 2d 31 30 2e 31 2e 34  st backup-10.1.4
6020: 20 7b 0a 20 20 20 20 42 20 66 69 6e 69 73 68 0a   {.    B finish.
6030: 20 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a    } {SQLITE_OK}.
6040: 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70    do_test backup
6050: 2d 31 30 2e 31 2e 35 20 7b 0a 20 20 20 20 65 78  -10.1.5 {.    ex
6060: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69  ecsql { PRAGMA i
6070: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
6080: 20 64 62 33 0a 20 20 7d 20 7b 6f 6b 7d 0a 0a 20   db3.  } {ok}.. 
6090: 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 64 62 33   db2 close.  db3
60a0: 20 63 6c 6f 73 65 0a 7d 0a 0a 0a 23 2d 2d 2d 2d   close.}...#----
60b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60f0: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
6100: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
6110: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 76 69  is written to vi
6120: 61 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  a the same datab
6130: 61 73 65 20 68 61 6e 64 6c 65 20 62 65 69 6e 67  ase handle being
6140: 0a 23 20 75 73 65 64 20 61 73 20 74 68 65 20 73  .# used as the s
6150: 6f 75 72 63 65 20 62 79 20 61 20 62 61 63 6b 75  ource by a backu
6160: 70 20 6f 70 65 72 61 74 69 6f 6e 3a 0a 23 0a 23  p operation:.#.#
6170: 20 20 20 31 30 2e 31 2e 2a 3a 20 49 66 20 74 68     10.1.*: If th
6180: 65 20 64 62 20 69 73 20 69 6e 2d 6d 65 6d 6f 72  e db is in-memor
6190: 79 2c 20 74 68 65 20 62 61 63 6b 75 70 20 69 73  y, the backup is
61a0: 20 72 65 73 74 61 72 74 65 64 2e 0a 23 20 20 20   restarted..#   
61b0: 31 30 2e 32 2e 2a 3a 20 49 66 20 74 68 65 20 64  10.2.*: If the d
61c0: 62 20 69 73 20 61 20 66 69 6c 65 2c 20 74 68 65  b is a file, the
61d0: 20 62 61 63 6b 75 70 20 69 73 20 6e 6f 74 20 72   backup is not r
61e0: 65 73 74 61 72 74 65 64 2e 0a 23 0a 64 62 20 63  estarted..#.db c
61f0: 6c 6f 73 65 0a 66 6f 72 63 65 64 65 6c 65 74 65  lose.forcedelete
6200: 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
6210: 2d 6a 6f 75 72 6e 61 6c 0a 66 6f 72 65 61 63 68  -journal.foreach
6220: 20 7b 74 6e 20 66 69 6c 65 20 72 63 7d 20 7b 0a   {tn file rc} {.
6230: 20 20 31 20 74 65 73 74 2e 64 62 20 20 53 51 4c    1 test.db  SQL
6240: 49 54 45 5f 44 4f 4e 45 0a 20 20 32 20 3a 6d 65  ITE_DONE.  2 :me
6250: 6d 6f 72 79 3a 20 53 51 4c 49 54 45 5f 4f 4b 0a  mory: SQLITE_OK.
6260: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 62 61  } {.  do_test ba
6270: 63 6b 75 70 2d 31 30 2e 24 74 6e 2e 31 20 7b 0a  ckup-10.$tn.1 {.
6280: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 24      sqlite3 db $
6290: 66 69 6c 65 0a 20 20 20 20 65 78 65 63 73 71 6c  file.    execsql
62a0: 20 7b 20 0a 20 20 20 20 20 20 43 52 45 41 54 45   { .      CREATE
62b0: 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45   TABLE t1(a INTE
62c0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
62d0: 20 62 20 42 4c 4f 42 29 3b 0a 20 20 20 20 20 20   b BLOB);.      
62e0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 49  BEGIN;.        I
62f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6300: 4c 55 45 53 28 4e 55 4c 4c 2c 20 72 61 6e 64 6f  LUES(NULL, rando
6310: 6d 62 6c 6f 62 28 32 30 30 29 29 3b 0a 20 20 20  mblob(200));.   
6320: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
6330: 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t1 SELECT NULL,
6340: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
6350: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
6360: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6370: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61   SELECT NULL, ra
6380: 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52  ndomblob(200) FR
6390: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 49  OM t1;.        I
63a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
63b0: 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f  LECT NULL, rando
63c0: 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20  mblob(200) FROM 
63d0: 74 31 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  t1;.        INSE
63e0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
63f0: 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c  T NULL, randombl
6400: 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(200) FROM t1;
6410: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
6420: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e  INTO t1 SELECT N
6430: 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  ULL, randomblob(
6440: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
6450: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
6460: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
6470: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  , randomblob(200
6480: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  ) FROM t1;.     
6490: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
64a0: 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72  1 SELECT NULL, r
64b0: 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46  andomblob(200) F
64c0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20  ROM t1;.        
64d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
64e0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64  ELECT NULL, rand
64f0: 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d  omblob(200) FROM
6500: 20 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49   t1;.      COMMI
6510: 54 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  T;.      SELECT 
6520: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
6530: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 32 35 36  ;.    }.  } {256
6540: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63  }..  do_test bac
6550: 6b 75 70 2d 31 30 2e 24 74 6e 2e 32 20 7b 0a 20  kup-10.$tn.2 {. 
6560: 20 20 20 73 65 74 20 70 67 73 20 5b 65 78 65 63     set pgs [exec
6570: 73 71 6c 20 7b 70 72 61 67 6d 61 20 70 61 67 65  sql {pragma page
6580: 5f 63 6f 75 6e 74 7d 5d 0a 20 20 20 20 65 78 70  _count}].    exp
6590: 72 20 7b 24 70 67 73 20 3e 20 35 30 20 26 26 20  r {$pgs > 50 && 
65a0: 24 70 67 73 20 3c 20 37 35 7d 0a 20 20 7d 20 7b  $pgs < 75}.  } {
65b0: 31 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 62 61  1}..  do_test ba
65c0: 63 6b 75 70 2d 31 30 2e 24 74 6e 2e 33 20 7b 0a  ckup-10.$tn.3 {.
65d0: 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20      forcedelete 
65e0: 62 61 6b 2e 64 62 20 62 61 6b 2e 64 62 2d 6a 6f  bak.db bak.db-jo
65f0: 75 72 6e 61 6c 0a 20 20 20 20 73 71 6c 69 74 65  urnal.    sqlite
6600: 33 20 64 62 32 20 62 61 6b 2e 64 62 0a 20 20 20  3 db2 bak.db.   
6610: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
6620: 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61  B db2 main db ma
6630: 69 6e 0a 20 20 20 20 42 20 73 74 65 70 20 35 30  in.    B step 50
6640: 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d  .  } {SQLITE_OK}
6650: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b  ..  do_test back
6660: 75 70 2d 31 30 2e 24 74 6e 2e 34 20 7b 0a 20 20  up-10.$tn.4 {.  
6670: 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41    execsql { UPDA
6680: 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 72 61  TE t1 SET b = ra
6690: 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 57 48  ndomblob(200) WH
66a0: 45 52 45 20 61 20 49 4e 20 28 31 2c 20 32 35 30  ERE a IN (1, 250
66b0: 29 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f  ) }.  } {}..  do
66c0: 5f 74 65 73 74 20 62 61 63 6b 75 70 2d 31 30 2e  _test backup-10.
66d0: 24 74 6e 2e 35 20 7b 0a 20 20 20 20 42 20 73 74  $tn.5 {.    B st
66e0: 65 70 20 35 30 0a 20 20 7d 20 24 72 63 0a 0a 20  ep 50.  } $rc.. 
66f0: 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 75 70 2d   do_test backup-
6700: 31 30 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20 42  10.$tn.6 {.    B
6710: 20 66 69 6e 69 73 68 0a 20 20 7d 20 7b 53 51 4c   finish.  } {SQL
6720: 49 54 45 5f 4f 4b 7d 0a 0a 20 20 64 62 32 20 63  ITE_OK}..  db2 c
6730: 6c 6f 73 65 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74  lose.}..finish_t
6740: 65 73 74 0a                                      est.